@p10node/office-engine 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +34 -19
- package/dist/{DocViewer-PJieqbIR.js → DocViewer-CT8VAa1L.js} +67 -20
- package/dist/DocViewer-CT8VAa1L.js.map +1 -0
- package/dist/assets/worker-BEwT3OhG.js.map +1 -0
- package/dist/{collab-BvjXvfJ9.js → collab-Dx00zqXR.js} +215 -175
- package/dist/collab-Dx00zqXR.js.map +1 -0
- package/dist/collab.js +1 -1
- package/dist/core.js +1 -1
- package/dist/{default-worker-DfpaJUjf.js → default-worker-BDj6MNRA.js} +3 -3
- package/dist/default-worker-BDj6MNRA.js.map +1 -0
- package/dist/embed.js +2 -2
- package/dist/index.js +3 -3
- package/dist/office-engine.embed.js +28 -28
- package/dist/office-engine.worker.js +1 -1
- package/dist/types/core/xlsx/workbook.d.ts +2 -1
- package/dist/types/react/common/hooks.d.ts +1 -1
- package/dist/types/react/docx/DocxEditor.d.ts +6 -1
- package/dist/types/react/edit/input.d.ts +12 -0
- package/package.json +2 -1
- package/dist/DocViewer-PJieqbIR.js.map +0 -1
- package/dist/assets/worker-B1gMpGFN.js.map +0 -1
- package/dist/collab-BvjXvfJ9.js.map +0 -1
- package/dist/default-worker-DfpaJUjf.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocViewer-CT8VAa1L.js","names":["colName","_Fragment","SIZES","BLOCK","styleOf","HIGHLIGHTS","_Fragment","mdInline","TableView","GAP","PAD","HANDLES","css","stylesText","EXT","VALIGN","_Fragment","_Fragment","VALIGN","_jsx","colName","_Fragment","HIGHLIGHT","isWebImage","escAttr","escText","DEFAULT_PAGE","tokenize","colName$1","MAX_ROW","writeZip","MAX_COL","colName$2","quoteSheet","DocumentClient","FormulaSyntaxError","cssFont","runsText","publishLocal","getPeers","registerHost","runAt","splitRuns","posFromDom","normalize","RichInput","domFromPos","ordered","opInsertRuns","subscribePeers","opInsert","getSel","startCollab","collapsed","shiftPa","plen","formatRange","Fragment$1","scan","src","e","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","setEl","raf","read","p","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","root","bottom","cssMax","room","label","Fragment","Select","SizeBox","sizes","SIZES$1","setText","inputRef","base","set","done","title","cur","flatten","Children","children","isValidElement","c","signature","ToolbarRow","items","rowRef","widths","fit","setFit","more","setMore","moreRef","measured","cut","layout","ws","total","b","used","avail","cs","relayout","isSep","end","rest","all","m","PALETTE","CUSTOM_KEY","MAX_CUSTOM","HEX6","customColors","customListeners","getCustomColors","addCustomColor","subscribeCustom","ColorBtn","pickerRef","custom","useSyncExternalStore","onPick","openPicker","swatch","FONTS","fontOptions","list","fontName","css","download","blob","Menu","Pop","GridPicker","hover","setHover","pickFiles","input","accept","multiple","resolve","ViewerContext","createContext","useViewer","useContext","useFileOps","slot","ops","EditorBar","bar","createPortal","StatusContext","Status","onStatus","STEPS","ZoomControl","effective","dir","onChange","zoom","ContextMenu","y","onClose","vh","down","key","away","it","MOD","PromptDialog","setV","spec","ConfirmDialog","okRef","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","part","runs","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","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","plain","cellText","docxToText","mdEsc","mdInline$1","core","mark","heading","strike","lead","trail","mdTable","docxToMarkdown","prevList","lvl","bodyText","slidesToText","slides","toCsv","sep","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","HANDLES$1","outlineOf","titleId","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","PageView","format","chars","askAlt","paste","pic","copyCut","cmd","pickImage","imgEl","imageActions","startResize","w0","h0","x0","y0","ptPerPx","sx","sy","move","ev","dy","maxW","ctxItems","ranged","headings","topBlock","activeHeading","gotoBlock","index","editing","hfCtx","header","footer","slice","height","CORE","coreProps","xml","tag","date","DetailsDialog","setCore","closeRef","groups","value","DOCX_MIME","XLSX_MIME","XML","REL","PKG_REL","CT_RELS","rootRels","detectSeparator","ch","tabs","semis","commas","parseCsv","field","quoted","colName","NUMBER","cellXml","decimalComma","rowsToXlsx","len","sheetName","SS","textToParas","escHtml","mdInline","code","markdownToHtml","md","flush","closeList","fence","body","li","HL_NAME","rPrXml","hl","runXml","piece","headingStyles","numberingXml","BULLETS","FORMATS","lvls","fmt","nums","parasToDocx","W","pPr","inner","rels","NS_A","PNS","GRP","ph","type","xfrm","THEME","bullet","blankPptx","master","shapes","center","titleLayout","slide","rel","PML","OFFICE","TABLE","TEXT","MARKDOWN","HTML","OPEN_ACCEPT","fromHtml","importFile","styles_default","ID","injectStyles","host","PRINT_CSS","cssFor","sleep","ms","settle","quiet","mo","urls","loads","RTL","search","ok","fitText","view","cuts","clips","mount","frame","createRoot","disposed","dispose","printing","printDocument","cleanup","esc","toDataUrl","reject","exportHtml","blobs","KIND_LABEL","EXT$1","TEXT_FORMATS","QUICK","useFileActions","busy","setBusy","busyRef","section","fileItems","exec","action","quick","FileMenu","actions","styleOf","toEdit","bulletOf","lvlOf","toTPara","num","PptxEditor","sid","counters","i0","HIGHLIGHTS","SHAPES","LINE_W","DASHES","SPACING","VALIGN$2","PptxToolbar","Presenter","order","setVw","resize","exitFs","go","SlideSlot","poly","pts","adj","def","ellipse","rx","ry","roundRect","regular","rot","star","LINE_GEOMS","geomPath","ss","geom","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","shown","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","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","SIZES","BORDERS","BORDER_STYLES","HALIGN","VALIGN$1","ROTATE","FUNCS","decimals","XlsxToolbar","bColor","setBColor","bStyle","setBStyle","align","valign","known","formats","Axis","max","min","px","fontPx","fitNumber","cw","CHUNK","MAX_PRINT_ROWS","TABLE_ROWS","PORTRAIT_W","LANDSCAPE_W","sheetRows","loading","sheetText","lastR","lastC","VALIGN","sheetPrintable","merges","anchors","covered","across","visibleIn","axis","basePx","tables","trs","inMerge","tds","raw","si","_rot","textAlign","spill","whiteSpace","alignItems","landscape","className","tableStyle","colgroup","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","rotated","JUSTIFY","fc","REF_COLORS","refKey","ARROWS","rectOf","withMerges","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","mergeAt","oneCell","peers","sheetPath","peerSels","setSel","region","rr1","rr0","cc1","cc0","oy","ox","cellEl","wOverride","hOverride","textRotate","justify","ov","merged","filled","overflow","findBoxes","refBoxes","colHeaders","rowHeaders","rh","fr","fw","fh","cellBox","scrollIntoView","cellAt","clientX","clientY","lx","ly","focusGrid","startEdit","begin","initialText","initial","committed","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","pointRange","xf","m0","toggleMerge","merge","freeze","autoFn","sortBy","rowsOp","pasteText","single","onMouseMove","fx","editKeys","arrow","assist","edStyle","hlParts","assistPos","transportIds","nextTransportId","optsKey","useCollab","optsRef","sync","initials","LABEL","CollabBar","pending","setPending","PeerOverlay","marks","setMarks","layer","measure","place","collab","schedule","offChange","pr","EXT","UNTITLED","fmtBytes","DocViewer","setEditing","dirty","setDirtyState","saving","setSaving","barEl","setBarEl","styleTarget","opened","setOpened","renamed","setRenamed","loadName","docName","canEdit","statusEl","setStatusEl","onLoad","error","onError","openedDirty","setDirty","useCallback","onDirtyChange","baseName","fileName","canSave","allowSave","onSave","allowDownload","save","fileOps","api","clearToast","confirm","setConfirm","details","setDetails","replace","canOpen","fileMenu","allowOpen","fileActions","allowEdit","pct","progress","toolbar","toolbarExtra"],"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/file/text.ts","../src/react/docx/render.tsx","../src/react/docx/DocxView.tsx","../src/react/file/DetailsDialog.tsx","../src/core/convert.ts","../src/react/file/importFile.ts","../src/react/styles.css?inline","../src/react/injectStyles.ts","../src/react/file/print.tsx","../src/react/file/FileMenu.tsx","../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/fit.ts","../src/react/xlsx/print.tsx","../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. Follows the element when it mounts after the first render. */\nexport function useScroll(ref: React.RefObject<HTMLElement | null>): { x: number; y: number } {\n const [pos, setPos] = useState({ x: 0, y: 0 })\n const [el, setEl] = useState<HTMLElement | null>(null)\n // a conditionally rendered panel (slide thumbnails) gets its element later than the first effect run\n useIsoLayoutEffect(() => {\n if (ref.current !== el) setEl(ref.current)\n })\n useEffect(() => {\n if (!el) return\n let raf = 0\n const read = () => setPos((p) => (p.x === el.scrollLeft && p.y === el.scrollTop ? p : { x: el.scrollLeft, y: el.scrollTop }))\n const on = () => {\n if (raf) return\n raf = requestAnimationFrame(() => {\n raf = 0\n read()\n })\n }\n read()\n el.addEventListener('scroll', on, { passive: true })\n return () => {\n el.removeEventListener('scroll', on)\n cancelAnimationFrame(raf)\n }\n }, [el])\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 useSyncExternalStore,\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 file: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5\" />,\n open: <path d=\"M4 19V6a1 1 0 0 1 1-1h4l2 2h7a1 1 0 0 1 1 1v2M4 19l2.6-7.2a1 1 0 0 1 .9-.8H20a1 1 0 0 1 1 1.3L18.6 19z\" />,\n print: <path d=\"M7 9V4h10v5M7 17H5a1 1 0 0 1-1-1v-6a1 1 0 0 1 1-1h14a1 1 0 0 1 1 1v6a1 1 0 0 1-1 1h-2M7 14h10v6H7z\" />,\n pdf: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5M8.5 16.5v-4h1.2a1.2 1.2 0 0 1 0 2.4H8.5M13 12.5v4h.8a1.6 1.6 0 0 0 1.6-1.6v-.8a1.6 1.6 0 0 0-1.6-1.6z\" strokeWidth={1.5} />,\n html: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5M10 12l-2 2.5 2 2.5M14 12l2 2.5-2 2.5\" />,\n doc: <path d=\"M14 3H7a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V8zM14 3v5h5M9 13h6M9 17h4\" />,\n slides: <path d=\"M4 5h16v11H4zM12 16v4M8 20h8\" />,\n info: <path d=\"M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18zM12 11v5M12 8h.01\" />,\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 /** group heading above this option */\n head?: string\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 /** extra class of the trigger button */\n className?: string\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 // the viewer clips its content: keep the list above its bottom edge (scrolls when longer)\n const root = el.closest('.de-root')\n const bottom = Math.min(document.documentElement.clientHeight, root ? root.getBoundingClientRect().bottom : Infinity)\n const cssMax = parseFloat(getComputedStyle(el).maxHeight)\n const room = bottom - r.top - 8\n if (room > 0) el.style.maxHeight = `${Math.max(120, Math.min(Number.isFinite(cssMax) ? cssMax : room, room))}px`\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') + (props.className ? ' ' + props.className : '')}\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 {o.head && (\n <div className=\"de-dd-head\" role=\"presentation\">\n {o.head}\n </div>\n )}\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\n// custom colors picked by the user: shared by every color button, kept across sessions\nconst CUSTOM_KEY = 'office-engine:custom-colors'\nconst MAX_CUSTOM = 7\nconst HEX6 = /^#[0-9a-f]{6}$/\nlet customColors: string[] | null = null\nconst customListeners = new Set<() => void>()\n\nfunction getCustomColors(): string[] {\n if (customColors) return customColors\n customColors = []\n try {\n const v: unknown = JSON.parse(localStorage.getItem(CUSTOM_KEY) ?? '[]')\n if (Array.isArray(v)) customColors = v.filter((c): c is string => typeof c === 'string' && HEX6.test(c)).slice(0, MAX_CUSTOM)\n } catch {\n // storage unavailable (private mode, sandbox)\n }\n return customColors\n}\n\nfunction addCustomColor(c: string) {\n customColors = [c, ...getCustomColors().filter((x) => x !== c)].slice(0, MAX_CUSTOM)\n try {\n localStorage.setItem(CUSTOM_KEY, JSON.stringify(customColors))\n } catch {\n // not persisted\n }\n customListeners.forEach((f) => f())\n}\n\nconst subscribeCustom = (f: () => void) => {\n customListeners.add(f)\n return () => {\n customListeners.delete(f)\n }\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 const pickerRef = useRef<HTMLInputElement>(null)\n const custom = useSyncExternalStore(subscribeCustom, getCustomColors, getCustomColors)\n useDismiss(ref, open, () => setOpen(false))\n const onPick = useRef(props.onPick)\n onPick.current = props.onPick\n const cur = props.value?.toLowerCase()\n\n // native 'change' fires once the OS picker is confirmed (React's onChange would fire while dragging)\n useEffect(() => {\n const el = pickerRef.current\n if (!el) return\n const on = () => {\n const c = el.value.toLowerCase()\n if (!HEX6.test(c)) return\n addCustomColor(c)\n onPick.current(c)\n }\n el.addEventListener('change', on)\n return () => el.removeEventListener('change', on)\n }, [])\n\n const openPicker = () => {\n const el = pickerRef.current\n if (!el) return\n el.value = cur && HEX6.test(cur) ? cur : (custom[0] ?? '#000000')\n setOpen(false)\n try {\n el.showPicker()\n } catch {\n el.click()\n }\n }\n const swatch = (c: string) => (\n <button key={c} type=\"button\" title={c} className={cur === c ? 'on' : undefined} style={{ background: c }} onClick={() => (props.onPick(c), setOpen(false))} />\n )\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 {/* kept mounted while the OS picker is open (the popover closes) */}\n <input ref={pickerRef} type=\"color\" className=\"de-tb-native\" tabIndex={-1} aria-hidden />\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\">{(props.palette ?? PALETTE).map(swatch)}</div>\n <div className=\"de-tb-custom\">Custom</div>\n <div className=\"de-tb-grid\">\n {custom.map(swatch)}\n <button type=\"button\" className=\"de-tb-add\" title=\"Custom color…\" aria-label=\"Custom color\" onClick={openPicker}>\n <Icon name=\"plus\" size={14} />\n </button>\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, useEffect, type ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport { ToolbarRow } from '../edit/Toolbar'\nimport type { DocumentClient } from '../../core/worker/client'\nimport type { Printable } from '../file/print'\n\n/** What the active view offers to the File menu. */\nexport interface FileOps {\n /** all pages, for PDF / print and HTML */\n printable(): Promise<Printable>\n /** text formats: 'txt' / 'md' (documents, presentations), 'csv' / 'tsv' (current sheet) */\n text(format: string): Promise<string>\n /** File → Document details: [label, value] rows */\n stats(): [string, string][]\n /** File → Import (spreadsheets): rows into a new sheet */\n importTable?(rows: string[][], name: string): Promise<void>\n}\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 /** whether files may be downloaded to the user's device */\n canDownload: boolean\n client: DocumentClient | null\n /** set by the mounted view (see useFileOps) */\n fileOps: { current: FileOps | null }\n}\n\nexport const ViewerContext = createContext<ViewerApi>({\n bar: null,\n editable: false,\n setDirty: () => {},\n save: async () => {},\n canDownload: true,\n client: null,\n fileOps: { current: null },\n})\n\nexport const useViewer = () => useContext(ViewerContext)\n\n/** Publishes the view's file operations (latest closure each render) to the File menu. */\nexport function useFileOps(ops: FileOps) {\n const slot = useViewer().fileOps\n useEffect(() => {\n slot.current = ops\n })\n useEffect(\n () => () => {\n slot.current = null\n },\n [slot],\n )\n}\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/** Yes / no question (no window.confirm: works in sandboxed / embedded pages). */\nexport function ConfirmDialog(props: { title: string; message: ReactNode; ok: string; onOk: () => void; onClose: () => void }) {\n const okRef = useRef<HTMLButtonElement>(null)\n useEffect(() => okRef.current?.focus(), [])\n return (\n <div\n className=\"de-dialog-back\"\n onMouseDown={(e) => e.target === e.currentTarget && props.onClose()}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n props.onClose()\n }\n }}\n >\n <div className=\"de-dialog\" role=\"alertdialog\" aria-label={props.title}>\n <div className=\"de-dialog-title\">{props.title}</div>\n <div className=\"de-dialog-note\">{props.message}</div>\n <div className=\"de-dialog-btns\">\n <button type=\"button\" className=\"de-btn\" onClick={props.onClose}>\n Cancel\n </button>\n <button\n ref={okRef}\n type=\"button\"\n className=\"de-btn de-btn-primary\"\n onClick={() => {\n props.onClose()\n props.onOk()\n }}\n >\n {props.ok}\n </button>\n </div>\n </div>\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, normalize, plen, runAt, shiftPa, splitRuns, type Pos, 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 /** the whole document: from the first to the last editable top-level paragraph */\n all(): Sel | null {\n let a = -1\n let f = -1\n this.st.blocks.forEach((_, i) => {\n if (!this.para(String(i))) return\n if (a < 0) a = i\n f = i\n })\n if (a < 0) return null\n return { a: { pa: String(a), o: 0 }, f: { pa: String(f), o: plen(this.para(String(f))!.runs as RRun[]) } }\n }\n\n selectAll() {\n this.input.selectAll()\n }\n\n /** Deletes a top-level range that spans tables: the end paragraphs are joined, everything between goes (section breaks stay). */\n deleteAcross(s: Pos, e: Pos): Pos | null {\n const a = path(s.pa)\n const b = path(e.pa)\n if (a.length !== 1 || b.length !== 1 || a[0] >= b[0]) return null\n const first = this.para(s.pa)\n const last = this.para(e.pa)\n if (!first || !last) return null\n // parts of a paragraph split around a page break share its pid: the worker regenerates whole paragraphs only\n const part = (i: number, p: Paragraph) => this.st.blocks[i]?.t === 'p' && (this.st.blocks[i] as Paragraph).pid === p.pid\n if (part(a[0] - 1, first) || part(b[0] + 1, last)) return null\n const runs = normalize([...splitRuns(first.runs as RRun[], s.o)[0], ...splitRuns(last.runs as RRun[], e.o)[1]])\n const keep = this.st.blocks.slice(a[0] + 1, b[0]).filter((x) => x.t === 'sect')\n this.replaceBlocks(a[0], b[0] - a[0] + 1, [this.join(first, last, runs), ...keep], { a: s, f: s })\n return s\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) => {\n if (b.t !== 'tbl') return\n // an original table coming back (undo of its deletion) is regenerated from the model like a new one\n if (b.tid === undefined && !beforeKeys.has(key(b))) this.st.blocks[bi + i] = { ...b, tid: this.nextPid++ }\n this.commitTable(bi + i)\n })\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 /** undefined when downloads are disabled */\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 {image.download && <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 type { Block, Inline, Paragraph, Table } from '../../core/docx/types'\nimport type { SlideModel, TextBody } from '../../core/pptx/types'\n\n// ---------------------------------------------------------------- DOCX\n\nconst plain = (runs: Inline[]) => runs.map((r) => (r.t === 'text' || r.t === 'ref' ? (r.s.vanish ? '' : r.text) : '')).join('')\n\nconst cellText = (blocks: Block[]) =>\n blocks\n .filter((b): b is Paragraph => b.t === 'p')\n .map((p) => plain(p.runs))\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim()\n\n/** Plain text: one line per paragraph, list markers kept, table cells separated by tabs. */\nexport function docxToText(blocks: Block[]): string {\n const out: string[] = []\n for (const b of blocks) {\n if (b.t === 'p') out.push((b.marker ? b.marker.text + (b.marker.tab ? '\\t' : ' ') : '') + plain(b.runs))\n else if (b.t === 'tbl') for (const row of b.rows) out.push(row.cells.map((c) => cellText(c.blocks)).join('\\t'))\n }\n return out.join('\\n') + '\\n'\n}\n\nconst mdEsc = (s: string) => s.replace(/([\\\\`*_[\\]<>])/g, '\\\\$1')\n\n/** `heading`: bold is the heading's own look, not emphasis */\nfunction mdInline(runs: Inline[], heading = false): string {\n let out = ''\n let i = 0\n while (i < runs.length) {\n const r = runs[i]\n if (r.t !== 'text' && r.t !== 'ref') {\n i++\n continue\n }\n if (r.t === 'text' && r.href) {\n // a link spans the consecutive runs with the same target\n let text = ''\n const href = r.href\n while (i < runs.length && runs[i].t === 'text' && (runs[i] as { href?: string }).href === href) text += (runs[i++] as { text: string }).text\n out += `[${mdEsc(text)}](${href.replace(/[()\\s]/g, encodeURIComponent)})`\n continue\n }\n i++\n if (r.s.vanish) continue\n const text = r.text.replace(/\\t/g, ' ').replace(/\\n/g, ' \\n')\n const core = text.trim()\n if (!core) {\n out += text\n continue\n }\n const mark = (r.s.b && !heading ? '**' : '') + (r.s.i && !heading ? '*' : '')\n const strike = r.s.strike ? '~~' : ''\n const lead = text.slice(0, text.indexOf(core[0]))\n const trail = text.slice(text.lastIndexOf(core[core.length - 1]) + 1)\n out += `${lead}${strike}${mark}${mdEsc(core)}${[...mark].reverse().join('')}${strike}${trail}`\n }\n return out.replace(/\\*\\*\\*\\*/g, '')\n}\n\nfunction mdTable(t: Table): string {\n const rows = t.rows.map((r) => r.cells.map((c) => cellText(c.blocks).replace(/\\|/g, '\\\\|') || ' '))\n if (!rows.length) return ''\n const n = Math.max(...rows.map((r) => r.length))\n const line = (r: string[]) => `| ${Array.from({ length: n }, (_, k) => r[k] ?? ' ').join(' | ')} |`\n return [line(rows[0]), `|${' --- |'.repeat(n)}`, ...rows.slice(1).map(line)].join('\\n')\n}\n\n/** Markdown: headings (outline levels), lists, bold / italic / strike, links, tables. */\nexport function docxToMarkdown(blocks: Block[]): string {\n const out: string[] = []\n let prevList = false\n for (const b of blocks) {\n if (b.t === 'tbl') {\n out.push(mdTable(b), '')\n prevList = false\n continue\n }\n if (b.t !== 'p') continue\n const lvl = b.ps.outline\n const heading = lvl !== undefined && lvl < 6\n const text = mdInline(b.runs, heading).trim()\n if (b.marker) {\n const ordered = /^[\\da-zA-Z]{1,4}[.)]$/.test(b.marker.text.trim())\n const depth = Math.max(0, Math.round(((b.ps.indL ?? 36) - 36) / 36))\n if (!prevList && out.length && out[out.length - 1] !== '') out.push('')\n out.push(`${' '.repeat(depth)}${ordered ? '1.' : '-'} ${text}`)\n prevList = true\n continue\n }\n if (prevList) out.push('')\n prevList = false\n if (!text) continue\n out.push(heading ? `${'#'.repeat(lvl + 1)} ${text}` : text, '')\n }\n return out.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim() + '\\n'\n}\n\n// ---------------------------------------------------------------- PPTX\n\nconst bodyText = (t: TextBody | undefined) =>\n t\n ? t.paras\n .map((p) => (p.bullet ? p.bullet.text + ' ' : '') + p.runs.map((r) => (r.br ? '\\n' : r.text)).join(''))\n .filter((l) => l.trim())\n .join('\\n')\n : ''\n\n/** Text of each slide (shapes, tables, speaker notes). */\nexport function slidesToText(slides: SlideModel[]): string {\n const out: string[] = []\n for (const s of slides) {\n out.push(`Slide ${s.index + 1}`, '')\n for (const el of s.els) {\n if (el.t === 'shape') {\n const t = bodyText(el.text)\n if (t) out.push(t, '')\n } else if (el.t === 'table') {\n for (const row of el.rows) out.push(row.cells.filter((c) => !c.hidden).map((c) => bodyText(c.text).replace(/\\s+/g, ' ')).join('\\t'))\n out.push('')\n }\n }\n if (s.notes?.trim()) out.push('Notes:', s.notes.trim(), '')\n out.push('')\n }\n return out.join('\\n').replace(/\\n{3,}/g, '\\n\\n').trim() + '\\n'\n}\n\n// ---------------------------------------------------------------- CSV\n\n/** RFC 4180 output (CRLF; fields with separators, quotes or line breaks are quoted). */\nexport function toCsv(rows: string[][], sep = ','): string {\n const q = (v: string) => (v.includes(sep) || /[\"\\r\\n]/.test(v) || /^\\s|\\s$/.test(v) ? `\"${v.replace(/\"/g, '\"\"')}\"` : v)\n return rows.map((r) => r.map(q).join(sep)).join('\\r\\n') + '\\r\\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 { useFileOps, 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, type ImageActions } from './DocxToolbar'\nimport { FindBar, type Match } from './FindBar'\nimport { docxToMarkdown, docxToText } from '../file/text'\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 // ---- File → Download as / Print: the pages as laid out on screen ----\n useFileOps({\n printable: async () => {\n if (!complete) throw new Error('The document is still loading — try again in a moment')\n return {\n size: `${page.w}pt ${page.h}pt`,\n margin: '0',\n node: pages.map((p, i) => (\n <div key={i} className=\"de-print-page\" style={{ width: `${page.w}pt`, height: `${page.h}pt` }}>\n <PageView index={i} count={pages.length} slice={p} blocks={st.blocks} meta={meta} page={page} top={0} left={0} height={pageH} zoom={1} client={client} docStyle={docStyle} editing={false} />\n </div>\n )),\n }\n },\n text: async (format) => {\n if (!done) throw new Error('The document is still loading — try again in a moment')\n return format === 'md' ? docxToMarkdown(st.blocks) : docxToText(st.blocks)\n },\n stats: () => {\n let chars = 0\n let paras = 0\n const count = (b: Block) => {\n if (b.t === 'p') {\n const t = runsText(b.runs as RRun[])\n chars += t.length\n if (t.trim()) paras++\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 const more = complete ? '' : '+'\n return [\n ['Pages', pages.length.toLocaleString() + more],\n ['Words', words.toLocaleString() + more],\n ['Characters', chars.toLocaleString() + more],\n ['Paragraphs', paras.toLocaleString() + more],\n ['Page size', `${+(page.w / 72).toFixed(2)} × ${+(page.h / 72).toFixed(2)} in`],\n ]\n },\n })\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: 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: !viewer.canDownload\n ? undefined\n : () => {\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 ...(imageActions.download ? [{ label: 'Download image', icon: 'save', run: imageActions.download } as MenuItem] : []),\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: () => editor.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 const mod = (e.metaKey || e.ctrlKey) && !e.altKey\n const k = e.key.toLowerCase()\n if (mod && k === 'f') {\n e.preventDefault()\n setFind((f) => ({ ...f, open: true }))\n } else if (mod && k === 'a' && !e.shiftKey && !isEditing && pagesRef.current) {\n // the document, not the viewer around it (editing: the editor selects every paragraph)\n e.preventDefault()\n getSel(pagesRef.current)?.selectAllChildren(pagesRef.current)\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","import { Fragment, useEffect, useRef, useState } from 'react'\nimport type { DocumentClient } from '../../core/worker/client'\n\nconst CORE: [string, string][] = [\n ['title', 'Title'],\n ['subject', 'Subject'],\n ['creator', 'Author'],\n ['keywords', 'Keywords'],\n ['description', 'Comments'],\n ['lastModifiedBy', 'Last modified by'],\n ['created', 'Created'],\n ['modified', 'Modified'],\n]\n\n/** Core properties (docProps/core.xml) that are set. */\nasync function coreProps(client: DocumentClient): Promise<[string, string][]> {\n const xml = await (await client.call('part', 'docProps/core.xml')).text()\n const doc = new DOMParser().parseFromString(xml, 'application/xml')\n const out: [string, string][] = []\n for (const [tag, label] of CORE) {\n const v = doc.getElementsByTagNameNS('*', tag)[0]?.textContent?.trim()\n if (!v) continue\n const date = tag === 'created' || tag === 'modified' ? new Date(v) : null\n out.push([label, date && !isNaN(date.getTime()) ? date.toLocaleString() : v])\n }\n return out\n}\n\nexport function DetailsDialog(props: { client: DocumentClient; file: [string, string][]; stats: [string, string][]; onClose: () => void }) {\n const [core, setCore] = useState<[string, string][]>([])\n const closeRef = useRef<HTMLButtonElement>(null)\n useEffect(() => {\n closeRef.current?.focus()\n let live = true\n coreProps(props.client).then(\n (c) => live && setCore(c),\n () => {},\n )\n return () => {\n live = false\n }\n }, [props.client])\n const groups = [props.file, core, props.stats].filter((g) => g.length)\n return (\n <div\n className=\"de-dialog-back\"\n onMouseDown={(e) => e.target === e.currentTarget && props.onClose()}\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n e.stopPropagation()\n props.onClose()\n }\n }}\n >\n <div className=\"de-dialog\" role=\"dialog\" aria-label=\"Document details\">\n <div className=\"de-dialog-title\">Document details</div>\n <dl className=\"de-details\">\n {groups.map((g, k) => (\n <Fragment key={k}>\n {k > 0 && <div className=\"de-details-sep\" />}\n {g.map(([label, value]) => (\n <Fragment key={label}>\n <dt>{label}</dt>\n <dd>{value}</dd>\n </Fragment>\n ))}\n </Fragment>\n ))}\n </dl>\n <div className=\"de-dialog-btns\">\n <button ref={closeRef} type=\"button\" className=\"de-btn de-btn-primary\" onClick={props.onClose}>\n Close\n </button>\n </div>\n </div>\n </div>\n )\n}\n","/**\n * Builds new Office files from plain formats (File → Open of CSV / text / Markdown / HTML).\n * DOM-free: HTML is turned into paragraphs on the React side (react/docx/html.ts).\n */\nimport { HIGHLIGHT } from './docx/styles'\nimport type { RunSet } from './docx/types'\nimport { escAttr, escText } from './raw'\nimport { writeZip } from './zipwrite'\n\n// kept local: the writers that also define these are worker-side modules\nconst DOCX_MIME = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'\nconst XLSX_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'\n\nconst XML = '<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n'\nconst REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\nconst PKG_REL = 'http://schemas.openxmlformats.org/package/2006/relationships'\nconst CT_RELS = '<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/>'\n\nconst rootRels = (target: string) =>\n `${XML}<Relationships xmlns=\"${PKG_REL}\"><Relationship Id=\"rId1\" Type=\"${REL}/officeDocument\" Target=\"${target}\"/></Relationships>`\n\n// ---------------------------------------------------------------- CSV → XLSX\n\n/** Separator of a delimited text file: tab, semicolon (European CSV) or comma. */\nexport function detectSeparator(text: string): string {\n const line = text.slice(0, 4096).split(/\\r?\\n/, 1)[0]\n const count = (ch: string) => line.split(ch).length - 1\n const tabs = count('\\t')\n const semis = count(';')\n const commas = count(',')\n if (tabs > 0 && tabs >= semis && tabs >= commas) return '\\t'\n return semis > commas ? ';' : ','\n}\n\n/** RFC 4180 parser (quoted fields, escaped quotes, CRLF / LF, newlines inside quotes). */\nexport function parseCsv(text: string, sep = detectSeparator(text)): string[][] {\n const rows: string[][] = []\n let row: string[] = []\n let field = ''\n let quoted = false\n let i = text.charCodeAt(0) === 0xfeff ? 1 : 0\n const n = text.length\n for (; i < n; i++) {\n const ch = text[i]\n if (quoted) {\n if (ch === '\"') {\n if (text[i + 1] === '\"') {\n field += '\"'\n i++\n } else quoted = false\n } else field += ch\n } else if (ch === '\"' && field === '') quoted = true\n else if (ch === sep) {\n row.push(field)\n field = ''\n } else if (ch === '\\n' || ch === '\\r') {\n if (ch === '\\r' && text[i + 1] === '\\n') i++\n row.push(field)\n rows.push(row)\n row = []\n field = ''\n } else field += ch\n }\n if (field !== '' || row.length) {\n row.push(field)\n rows.push(row)\n }\n return rows\n}\n\nfunction colName(c: number): string {\n let s = ''\n for (let n = c + 1; n > 0; n = Math.floor((n - 1) / 26)) s = String.fromCharCode(65 + ((n - 1) % 26)) + s\n return s\n}\n\nconst NUMBER = /^[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?$/\n\n/** Value written for a CSV field: numbers (but not codes like \"007\") and booleans keep their type. */\nfunction cellXml(ref: string, v: string, decimalComma: boolean): string {\n if (v === '') return ''\n let t = v.trim()\n if (decimalComma && /^[-+]?\\d*,\\d+$/.test(t)) t = t.replace(',', '.')\n if (NUMBER.test(t) && !/^[-+]?0\\d/.test(t) && t.replace(/\\D/g, '').length <= 15) return `<c r=\"${ref}\"><v>${Number(t)}</v></c>`\n if (/^(true|false)$/i.test(t)) return `<c r=\"${ref}\" t=\"b\"><v>${/^true$/i.test(t) ? 1 : 0}</v></c>`\n return `<c r=\"${ref}\" t=\"inlineStr\"><is><t xml:space=\"preserve\">${escText(v)}</t></is></c>`\n}\n\n/**\n * Builds a one-sheet workbook from rows of text.\n * `decimalComma`: \"12,5\" is a number (semicolon-separated files from comma-decimal locales).\n */\nexport function rowsToXlsx(rows: string[][], sheetName = 'Sheet1', decimalComma = false): Promise<Blob> {\n const widths: number[] = []\n let data = ''\n rows.forEach((row, r) => {\n let cells = ''\n row.forEach((v, c) => {\n cells += cellXml(colName(c) + (r + 1), v, decimalComma)\n const len = Math.max(...v.split('\\n').map((l) => l.length))\n if (len > (widths[c] ?? 0)) widths[c] = len\n })\n if (cells) data += `<row r=\"${r + 1}\">${cells}</row>`\n })\n let cols = ''\n widths.forEach((len, c) => {\n if (len > 9) cols += `<col min=\"${c + 1}\" max=\"${c + 1}\" width=\"${Math.min(60, len + 2)}\" customWidth=\"1\"/>`\n })\n const name = sheetName.replace(/[\\\\/?*[\\]:]/g, ' ').slice(0, 31).trim() || 'Sheet1'\n const SS = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main'\n const parts = new Map<string, string>([\n [\n '[Content_Types].xml',\n `${XML}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">${CT_RELS}` +\n '<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>' +\n '<Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>' +\n '<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/></Types>',\n ],\n ['_rels/.rels', rootRels('xl/workbook.xml')],\n [\n 'xl/workbook.xml',\n `${XML}<workbook xmlns=\"${SS}\" xmlns:r=\"${REL}\"><bookViews><workbookView/></bookViews><sheets><sheet name=\"${escAttr(name)}\" sheetId=\"1\" r:id=\"rId1\"/></sheets></workbook>`,\n ],\n [\n 'xl/_rels/workbook.xml.rels',\n `${XML}<Relationships xmlns=\"${PKG_REL}\"><Relationship Id=\"rId1\" Type=\"${REL}/worksheet\" Target=\"worksheets/sheet1.xml\"/><Relationship Id=\"rId2\" Type=\"${REL}/styles\" Target=\"styles.xml\"/></Relationships>`,\n ],\n [\n 'xl/styles.xml',\n `${XML}<styleSheet xmlns=\"${SS}\"><fonts count=\"1\"><font><sz val=\"11\"/><name val=\"Calibri\"/><family val=\"2\"/></font></fonts>` +\n '<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>' +\n '<borders count=\"1\"><border><left/><right/><top/><bottom/><diagonal/></border></borders>' +\n '<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>' +\n '<cellXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/></cellXfs>' +\n '<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles></styleSheet>',\n ],\n [\n 'xl/worksheets/sheet1.xml',\n `${XML}<worksheet xmlns=\"${SS}\" xmlns:r=\"${REL}\"><sheetViews><sheetView workbookViewId=\"0\"/></sheetViews><sheetFormatPr defaultRowHeight=\"15\"/>` +\n `${cols ? `<cols>${cols}</cols>` : ''}<sheetData>${data}</sheetData></worksheet>`,\n ],\n ])\n return writeZip(parts, XLSX_MIME)\n}\n\n// ---------------------------------------------------------------- text / Markdown → DOCX\n\nexport interface ImportRun {\n text: string\n set?: RunSet\n href?: string\n}\n\nexport interface ImportPara {\n runs: ImportRun[]\n /** heading level 1-6 */\n heading?: number\n list?: 'bullet' | 'number'\n}\n\n/** One paragraph per line. */\nexport function textToParas(text: string): ImportPara[] {\n return text\n .replace(/^/, '')\n .split(/\\r\\n|\\r|\\n/)\n .map((line) => ({ runs: line ? [{ text: line }] : [] }))\n}\n\nconst escHtml = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>').replace(/\"/g, '"')\n\n/** inline Markdown: code, links, bold, italic, strikethrough (input already HTML-escaped) */\nfunction mdInline(s: string): string {\n const code: string[] = []\n s = s.replace(/`([^`]+)`/g, (_, c: string) => `\\u0000${code.push(c) - 1}\\u0000`)\n s = s\n .replace(/!\\[([^\\]]*)\\]\\(([^)\\s]+)[^)]*\\)/g, '$1')\n .replace(/\\[([^\\]]+)\\]\\(([^)\\s]+)[^)]*\\)/g, (_, t: string, u: string) => (/^\\s*javascript:/i.test(u) ? t : `<a href=\"${u}\">${t}</a>`))\n .replace(/(\\*\\*|__)(?=\\S)(.+?)(?<=\\S)\\1/g, '<b>$2</b>')\n .replace(/(^|[^*\\w])\\*(?=\\S)(.+?)(?<=\\S)\\*(?!\\*)/g, '$1<i>$2</i>')\n .replace(/(^|[^_\\w])_(?=\\S)(.+?)(?<=\\S)_(?!\\w)/g, '$1<i>$2</i>')\n .replace(/~~(?=\\S)(.+?)(?<=\\S)~~/g, '<s>$1</s>')\n return s.replace(/\\u0000(\\d+)\\u0000/g, (_, i: string) => `<code>${code[Number(i)]}</code>`)\n}\n\n/** Small CommonMark subset → HTML: headings, paragraphs, lists, quotes, code blocks, rules, tables. */\nexport function markdownToHtml(md: string): string {\n const lines = md.replace(/^/, '').split(/\\r\\n|\\r|\\n/)\n const out: string[] = []\n let para: string[] = []\n let list: 'ul' | 'ol' | null = null\n const flush = () => {\n if (para.length) out.push(`<p>${mdInline(escHtml(para.join(' ')))}</p>`)\n para = []\n }\n const closeList = () => {\n if (list) out.push(`</${list}>`)\n list = null\n }\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i]\n const fence = /^\\s*(```|~~~)/.exec(line)\n if (fence) {\n flush()\n closeList()\n const body: string[] = []\n while (++i < lines.length && !lines[i].trimStart().startsWith(fence[1])) body.push(lines[i])\n out.push(`<pre><code>${escHtml(body.join('\\n'))}</code></pre>`)\n continue\n }\n if (!line.trim()) {\n flush()\n closeList()\n continue\n }\n const h = /^\\s{0,3}(#{1,6})\\s+(.*?)\\s*#*\\s*$/.exec(line)\n if (h) {\n flush()\n closeList()\n out.push(`<h${h[1].length}>${mdInline(escHtml(h[2]))}</h${h[1].length}>`)\n continue\n }\n if (/^\\s{0,3}([-*_])(\\s*\\1){2,}\\s*$/.test(line)) {\n flush()\n closeList()\n continue\n }\n // table: header row + separator row\n if (line.includes('|') && /^\\s*\\|?\\s*:?-{3,}:?\\s*(\\|\\s*:?-{3,}:?\\s*)*\\|?\\s*$/.test(lines[i + 1] ?? '')) {\n flush()\n closeList()\n const cells = (l: string) => l.trim().replace(/^\\||\\|$/g, '').split('|').map((c) => mdInline(escHtml(c.trim())))\n const rows = [`<tr>${cells(line).map((c) => `<th><b>${c}</b></th>`).join('')}</tr>`]\n i++\n while (i + 1 < lines.length && lines[i + 1].includes('|') && lines[i + 1].trim()) rows.push(`<tr>${cells(lines[++i]).map((c) => `<td>${c}</td>`).join('')}</tr>`)\n out.push(`<table>${rows.join('')}</table>`)\n continue\n }\n const li = /^\\s*(?:([-*+])|(\\d+)[.)])\\s+(.*)$/.exec(line)\n if (li) {\n flush()\n const kind = li[1] ? 'ul' : 'ol'\n if (list !== kind) {\n closeList()\n out.push(`<${kind}>`)\n list = kind\n }\n out.push(`<li>${mdInline(escHtml(li[3].replace(/^\\[[ xX]\\]\\s+/, (m) => (m[1] === ' ' ? '☐ ' : '☑ '))))}</li>`)\n continue\n }\n const q = /^\\s*>\\s?(.*)$/.exec(line)\n if (q) {\n flush()\n closeList()\n out.push(`<blockquote><i>${mdInline(escHtml(q[1]))}</i></blockquote>`)\n continue\n }\n if (list && /^\\s{2,}\\S/.test(line)) {\n // lazy continuation of the previous item\n out[out.length - 1] = out[out.length - 1].replace(/<\\/li>$/, ` ${mdInline(escHtml(line.trim()))}</li>`)\n continue\n }\n closeList()\n para.push(line.trim())\n }\n flush()\n closeList()\n return out.join('\\n')\n}\n\nconst HL_NAME: Record<string, string> = Object.fromEntries(Object.entries(HIGHLIGHT).map(([k, v]) => [v, k]))\n\nfunction rPrXml(set: RunSet | undefined): string {\n if (!set) return ''\n let x = ''\n if (set.font) x += `<w:rFonts w:ascii=\"${escAttr(set.font)}\" w:hAnsi=\"${escAttr(set.font)}\" w:eastAsia=\"${escAttr(set.font)}\" w:cs=\"${escAttr(set.font)}\"/>`\n if (set.b) x += '<w:b/>'\n if (set.i) x += '<w:i/>'\n if (set.strike) x += '<w:strike/>'\n if (set.color) x += `<w:color w:val=\"${set.color.replace('#', '').toUpperCase()}\"/>`\n if (set.sz) x += `<w:sz w:val=\"${Math.round(set.sz * 2)}\"/><w:szCs w:val=\"${Math.round(set.sz * 2)}\"/>`\n const hl = set.hl ? HL_NAME[set.hl.toLowerCase()] : undefined\n if (hl) x += `<w:highlight w:val=\"${hl}\"/>`\n if (set.u && set.u !== 'none') x += `<w:u w:val=\"${set.u}\"/>`\n if (set.hl && !hl) x += `<w:shd w:val=\"clear\" w:color=\"auto\" w:fill=\"${set.hl.replace('#', '').toUpperCase()}\"/>`\n if (set.va) x += `<w:vertAlign w:val=\"${set.va === 'sup' ? 'superscript' : 'subscript'}\"/>`\n return x ? `<w:rPr>${x}</w:rPr>` : ''\n}\n\nfunction runXml(r: ImportRun): string {\n let body = ''\n for (const piece of r.text.split(/(\\t|\\n)/)) {\n if (!piece) continue\n if (piece === '\\t') body += '<w:tab/>'\n else if (piece === '\\n') body += '<w:br/>'\n else body += `<w:t xml:space=\"preserve\">${escText(piece)}</w:t>`\n }\n return body ? `<w:r>${rPrXml(r.set)}${body}</w:r>` : ''\n}\n\nfunction headingStyles(): string {\n const sizes = [20, 16, 14, 12, 11, 11]\n let x = ''\n sizes.forEach((sz, k) => {\n const n = k + 1\n x +=\n `<w:style w:type=\"paragraph\" w:styleId=\"Heading${n}\"><w:name w:val=\"heading ${n}\"/><w:basedOn w:val=\"Normal\"/><w:next w:val=\"Normal\"/><w:uiPriority w:val=\"9\"/><w:qFormat/>` +\n `<w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before=\"${n <= 2 ? 360 : 240}\" w:after=\"${n <= 2 ? 120 : 80}\"/><w:outlineLvl w:val=\"${k}\"/></w:pPr>` +\n `<w:rPr>${n <= 4 ? '<w:b/>' : ''}${n >= 5 ? '<w:i/>' : ''}<w:color w:val=\"${n <= 2 ? '1F3864' : '2F5496'}\"/><w:sz w:val=\"${sz * 2}\"/><w:szCs w:val=\"${sz * 2}\"/></w:rPr></w:style>`\n })\n return x\n}\n\nfunction numberingXml(nums: ('bullet' | 'number')[]): string {\n const W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n const BULLETS = ['•', '◦', '▪']\n const FORMATS = ['decimal', 'lowerLetter', 'lowerRoman']\n const lvls = (kind: 'bullet' | 'number') =>\n Array.from({ length: 9 }, (_, l) => {\n const fmt = kind === 'bullet' ? 'bullet' : FORMATS[l % 3]\n const text = kind === 'bullet' ? BULLETS[l % 3] : `%${l + 1}.`\n const font = kind === 'bullet' ? '<w:rPr><w:rFonts w:ascii=\"Arial\" w:hAnsi=\"Arial\"/></w:rPr>' : ''\n return `<w:lvl w:ilvl=\"${l}\"><w:start w:val=\"1\"/><w:numFmt w:val=\"${fmt}\"/><w:lvlText w:val=\"${text}\"/><w:lvlJc w:val=\"left\"/><w:pPr><w:ind w:left=\"${720 * (l + 1)}\" w:hanging=\"360\"/></w:pPr>${font}</w:lvl>`\n }).join('')\n let x = `${XML}<w:numbering xmlns:w=\"${W}\">`\n x += `<w:abstractNum w:abstractNumId=\"0\"><w:multiLevelType w:val=\"hybridMultilevel\"/>${lvls('bullet')}</w:abstractNum>`\n x += `<w:abstractNum w:abstractNumId=\"1\"><w:multiLevelType w:val=\"hybridMultilevel\"/>${lvls('number')}</w:abstractNum>`\n // one instance per list, numbered lists restart at 1\n nums.forEach((kind, k) => {\n x += `<w:num w:numId=\"${k + 1}\"><w:abstractNumId w:val=\"${kind === 'bullet' ? 0 : 1}\"/>`\n if (kind === 'number') x += '<w:lvlOverride w:ilvl=\"0\"><w:startOverride w:val=\"1\"/></w:lvlOverride>'\n x += '</w:num>'\n })\n return x + '</w:numbering>'\n}\n\n/** Builds a document (Letter, 1\" margins, Calibri 11) from paragraphs of formatted runs. */\nexport function parasToDocx(paras: ImportPara[]): Promise<Blob> {\n const W = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n const links: string[] = []\n const nums: ('bullet' | 'number')[] = []\n let prevList: 'bullet' | 'number' | undefined\n let body = ''\n for (const p of paras) {\n let pPr = ''\n if (p.heading && p.heading >= 1 && p.heading <= 6) pPr += `<w:pStyle w:val=\"Heading${p.heading}\"/>`\n else if (p.list) pPr += '<w:pStyle w:val=\"ListParagraph\"/>'\n if (p.list) {\n if (p.list !== prevList) nums.push(p.list)\n pPr += `<w:numPr><w:ilvl w:val=\"0\"/><w:numId w:val=\"${nums.length}\"/></w:numPr>`\n }\n prevList = p.list\n let runs = ''\n for (let i = 0; i < p.runs.length; ) {\n const href = p.runs[i].href\n if (!href) {\n runs += runXml(p.runs[i++])\n continue\n }\n let inner = ''\n while (i < p.runs.length && p.runs[i].href === href) inner += runXml(p.runs[i++])\n if (/^\\s*javascript:/i.test(href)) runs += inner\n else {\n links.push(href)\n runs += `<w:hyperlink r:id=\"rIdL${links.length}\" w:history=\"1\">${inner}</w:hyperlink>`\n }\n }\n body += `<w:p>${pPr ? `<w:pPr>${pPr}</w:pPr>` : ''}${runs}</w:p>`\n }\n if (!body) body = '<w:p/>'\n const sect = '<w:sectPr><w:pgSz w:w=\"12240\" w:h=\"15840\"/><w:pgMar w:top=\"1440\" w:right=\"1440\" w:bottom=\"1440\" w:left=\"1440\" w:header=\"720\" w:footer=\"720\" w:gutter=\"0\"/></w:sectPr>'\n const styles =\n `${XML}<w:styles xmlns:w=\"${W}\"><w:docDefaults><w:rPrDefault><w:rPr><w:rFonts w:ascii=\"Calibri\" w:hAnsi=\"Calibri\" w:eastAsia=\"Calibri\" w:cs=\"Calibri\"/><w:sz w:val=\"22\"/><w:szCs w:val=\"22\"/><w:lang w:val=\"en-US\"/></w:rPr></w:rPrDefault>` +\n '<w:pPrDefault><w:pPr><w:spacing w:after=\"160\" w:line=\"259\" w:lineRule=\"auto\"/></w:pPr></w:pPrDefault></w:docDefaults>' +\n '<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style>' +\n headingStyles() +\n '<w:style w:type=\"paragraph\" w:styleId=\"ListParagraph\"><w:name w:val=\"List Paragraph\"/><w:basedOn w:val=\"Normal\"/><w:uiPriority w:val=\"34\"/><w:qFormat/><w:pPr><w:spacing w:after=\"40\"/><w:ind w:left=\"720\"/><w:contextualSpacing/></w:pPr></w:style>' +\n '<w:style w:type=\"character\" w:default=\"1\" w:styleId=\"DefaultParagraphFont\"><w:name w:val=\"Default Paragraph Font\"/><w:uiPriority w:val=\"1\"/><w:semiHidden/></w:style>' +\n '</w:styles>'\n const rels =\n `${XML}<Relationships xmlns=\"${PKG_REL}\"><Relationship Id=\"rId1\" Type=\"${REL}/styles\" Target=\"styles.xml\"/><Relationship Id=\"rId2\" Type=\"${REL}/numbering\" Target=\"numbering.xml\"/>` +\n links.map((u, k) => `<Relationship Id=\"rIdL${k + 1}\" Type=\"${REL}/hyperlink\" Target=\"${escAttr(u)}\" TargetMode=\"External\"/>`).join('') +\n '</Relationships>'\n const parts = new Map<string, string>([\n [\n '[Content_Types].xml',\n `${XML}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">${CT_RELS}` +\n '<Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/>' +\n '<Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/>' +\n '<Override PartName=\"/word/numbering.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml\"/></Types>',\n ],\n ['_rels/.rels', rootRels('word/document.xml')],\n ['word/_rels/document.xml.rels', rels],\n ['word/document.xml', `${XML}<w:document xmlns:w=\"${W}\" xmlns:r=\"${REL}\"><w:body>${body}${sect}</w:body></w:document>`],\n ['word/styles.xml', styles],\n ['word/numbering.xml', numberingXml(nums)],\n ])\n return writeZip(parts, DOCX_MIME)\n}\n\n// ---------------------------------------------------------------- blank presentation\n\nconst NS_A = 'http://schemas.openxmlformats.org/drawingml/2006/main'\nconst NS_P = 'http://schemas.openxmlformats.org/presentationml/2006/main'\nconst PNS = `xmlns:a=\"${NS_A}\" xmlns:r=\"${REL}\" xmlns:p=\"${NS_P}\"`\nconst GRP = '<p:nvGrpSpPr><p:cNvPr id=\"1\" name=\"\"/><p:cNvGrpSpPr/><p:nvPr/></p:nvGrpSpPr><p:grpSpPr><a:xfrm><a:off x=\"0\" y=\"0\"/><a:ext cx=\"0\" cy=\"0\"/><a:chOff x=\"0\" y=\"0\"/><a:chExt cx=\"0\" cy=\"0\"/></a:xfrm></p:grpSpPr>'\n\n/** placeholder shape; `xfrm` [x, y, w, h] in EMU (omitted: inherited), `body` extra txBody content */\nfunction ph(id: number, name: string, type: string | null, idx: number | null, xfrm?: number[], body = '<a:bodyPr/><a:lstStyle/><a:p><a:endParaRPr lang=\"en-US\"/></a:p>'): string {\n const attrs = (type ? ` type=\"${type}\"` : '') + (idx !== null ? ` idx=\"${idx}\"` : '')\n const sp = xfrm ? `<p:spPr><a:xfrm><a:off x=\"${xfrm[0]}\" y=\"${xfrm[1]}\"/><a:ext cx=\"${xfrm[2]}\" cy=\"${xfrm[3]}\"/></a:xfrm></p:spPr>` : '<p:spPr/>'\n return `<p:sp><p:nvSpPr><p:cNvPr id=\"${id}\" name=\"${name}\"/><p:cNvSpPr><a:spLocks noGrp=\"1\"/></p:cNvSpPr><p:nvPr><p:ph${attrs}/></p:nvPr></p:nvSpPr>${sp}<p:txBody>${body}</p:txBody></p:sp>`\n}\n\nconst THEME =\n `${XML}<a:theme xmlns:a=\"${NS_A}\" name=\"Office Theme\"><a:themeElements><a:clrScheme name=\"Office\">` +\n '<a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1><a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>' +\n '<a:dk2><a:srgbClr val=\"44546A\"/></a:dk2><a:lt2><a:srgbClr val=\"E7E6E6\"/></a:lt2><a:accent1><a:srgbClr val=\"4472C4\"/></a:accent1>' +\n '<a:accent2><a:srgbClr val=\"ED7D31\"/></a:accent2><a:accent3><a:srgbClr val=\"A5A5A5\"/></a:accent3><a:accent4><a:srgbClr val=\"FFC000\"/></a:accent4>' +\n '<a:accent5><a:srgbClr val=\"5B9BD5\"/></a:accent5><a:accent6><a:srgbClr val=\"70AD47\"/></a:accent6><a:hlink><a:srgbClr val=\"0563C1\"/></a:hlink>' +\n '<a:folHlink><a:srgbClr val=\"954F72\"/></a:folHlink></a:clrScheme><a:fontScheme name=\"Office\">' +\n '<a:majorFont><a:latin typeface=\"Calibri Light\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:majorFont>' +\n '<a:minorFont><a:latin typeface=\"Calibri\"/><a:ea typeface=\"\"/><a:cs typeface=\"\"/></a:minorFont></a:fontScheme>' +\n '<a:fmtScheme name=\"Office\"><a:fillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"60000\"/></a:schemeClr></a:solidFill>' +\n '<a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"80000\"/></a:schemeClr></a:solidFill></a:fillStyleLst>' +\n '<a:lnStyleLst><a:ln w=\"6350\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln><a:ln w=\"12700\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln>' +\n '<a:ln w=\"19050\"><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill></a:ln></a:lnStyleLst>' +\n '<a:effectStyleLst><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle><a:effectStyle><a:effectLst/></a:effectStyle></a:effectStyleLst>' +\n '<a:bgFillStyleLst><a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill><a:solidFill><a:schemeClr val=\"phClr\"><a:tint val=\"95000\"/></a:schemeClr></a:solidFill>' +\n '<a:solidFill><a:schemeClr val=\"phClr\"><a:shade val=\"90000\"/></a:schemeClr></a:solidFill></a:bgFillStyleLst></a:fmtScheme></a:themeElements></a:theme>'\n\nconst lvl = (n: number, sz: number, bullet: boolean) =>\n `<a:lvl${n}pPr marL=\"${bullet ? 228600 + (n - 1) * 457200 : 0}\" indent=\"${bullet ? -228600 : 0}\" algn=\"l\">` +\n (bullet ? '<a:buFont typeface=\"Arial\"/><a:buChar char=\"•\"/>' : '<a:buNone/>') +\n `<a:defRPr sz=\"${sz}\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mn-lt\"/></a:defRPr></a:lvl${n}pPr>`\n\n/** One empty title slide, 16:9, Office theme; layouts: title, title and content, blank. */\nexport function blankPptx(): Promise<Blob> {\n const W = 12192000\n const H = 6858000\n const master =\n `${XML}<p:sldMaster ${PNS}><p:cSld><p:bg><p:bgRef idx=\"1001\"><a:schemeClr val=\"bg1\"/></p:bgRef></p:bg><p:spTree>${GRP}` +\n ph(2, 'Title Placeholder 1', 'title', null, [838200, 365125, 10515600, 1325563], '<a:bodyPr anchor=\"ctr\"/><a:lstStyle/><a:p><a:endParaRPr lang=\"en-US\"/></a:p>') +\n ph(3, 'Text Placeholder 2', 'body', 1, [838200, 1825625, 10515600, 4351338]) +\n '</p:spTree></p:cSld><p:clrMap bg1=\"lt1\" tx1=\"dk1\" bg2=\"lt2\" tx2=\"dk2\" accent1=\"accent1\" accent2=\"accent2\" accent3=\"accent3\" accent4=\"accent4\" accent5=\"accent5\" accent6=\"accent6\" hlink=\"hlink\" folHlink=\"folHlink\"/>' +\n '<p:sldLayoutIdLst><p:sldLayoutId id=\"2147483649\" r:id=\"rId1\"/><p:sldLayoutId id=\"2147483650\" r:id=\"rId2\"/><p:sldLayoutId id=\"2147483651\" r:id=\"rId3\"/></p:sldLayoutIdLst>' +\n '<p:txStyles><p:titleStyle><a:lvl1pPr algn=\"l\"><a:buNone/><a:defRPr sz=\"4400\" kern=\"1200\"><a:solidFill><a:schemeClr val=\"tx1\"/></a:solidFill><a:latin typeface=\"+mj-lt\"/></a:defRPr></a:lvl1pPr></p:titleStyle>' +\n `<p:bodyStyle>${lvl(1, 2800, true)}${lvl(2, 2400, true)}${lvl(3, 2000, true)}${lvl(4, 1800, true)}${lvl(5, 1800, true)}</p:bodyStyle>` +\n `<p:otherStyle>${lvl(1, 1800, false)}</p:otherStyle></p:txStyles></p:sldMaster>`\n const layout = (type: string, name: string, shapes: string) =>\n `${XML}<p:sldLayout ${PNS} type=\"${type}\" preserve=\"1\"><p:cSld name=\"${name}\"><p:spTree>${GRP}${shapes}</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sldLayout>`\n const center = (sz: number, anchor: string) => `<a:bodyPr anchor=\"${anchor}\"/><a:lstStyle><a:lvl1pPr algn=\"ctr\"><a:buNone/><a:defRPr sz=\"${sz}\"/></a:lvl1pPr></a:lstStyle><a:p><a:endParaRPr lang=\"en-US\"/></a:p>`\n const titleLayout = layout(\n 'title',\n 'Title Slide',\n ph(2, 'Title 1', 'ctrTitle', null, [1524000, 1122363, 9144000, 2387600], center(6000, 'b')) + ph(3, 'Subtitle 2', 'subTitle', 1, [1524000, 3602038, 9144000, 1655762], center(2400, 't')),\n )\n const slide =\n `${XML}<p:sld ${PNS}><p:cSld><p:spTree>${GRP}` +\n ph(2, 'Title 1', 'ctrTitle', null) +\n ph(3, 'Subtitle 2', 'subTitle', 1) +\n '</p:spTree></p:cSld><p:clrMapOvr><a:masterClrMapping/></p:clrMapOvr></p:sld>'\n const rel = (id: number, type: string, target: string) => `<Relationship Id=\"rId${id}\" Type=\"${REL}/${type}\" Target=\"${target}\"/>`\n const rels = (...r: string[]) => `${XML}<Relationships xmlns=\"${PKG_REL}\">${r.join('')}</Relationships>`\n const PML = 'application/vnd.openxmlformats-officedocument.presentationml'\n const parts = new Map<string, string>([\n [\n '[Content_Types].xml',\n `${XML}<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">${CT_RELS}` +\n `<Override PartName=\"/ppt/presentation.xml\" ContentType=\"${PML}.presentation.main+xml\"/>` +\n `<Override PartName=\"/ppt/slideMasters/slideMaster1.xml\" ContentType=\"${PML}.slideMaster+xml\"/>` +\n [1, 2, 3].map((n) => `<Override PartName=\"/ppt/slideLayouts/slideLayout${n}.xml\" ContentType=\"${PML}.slideLayout+xml\"/>`).join('') +\n `<Override PartName=\"/ppt/slides/slide1.xml\" ContentType=\"${PML}.slide+xml\"/>` +\n '<Override PartName=\"/ppt/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/></Types>',\n ],\n ['_rels/.rels', rootRels('ppt/presentation.xml')],\n [\n 'ppt/presentation.xml',\n `${XML}<p:presentation ${PNS} saveSubsetFonts=\"1\"><p:sldMasterIdLst><p:sldMasterId id=\"2147483648\" r:id=\"rId1\"/></p:sldMasterIdLst>` +\n `<p:sldIdLst><p:sldId id=\"256\" r:id=\"rId2\"/></p:sldIdLst><p:sldSz cx=\"${W}\" cy=\"${H}\"/><p:notesSz cx=\"6858000\" cy=\"9144000\"/></p:presentation>`,\n ],\n ['ppt/_rels/presentation.xml.rels', rels(rel(1, 'slideMaster', 'slideMasters/slideMaster1.xml'), rel(2, 'slide', 'slides/slide1.xml'), rel(3, 'theme', 'theme/theme1.xml'))],\n ['ppt/slideMasters/slideMaster1.xml', master],\n [\n 'ppt/slideMasters/_rels/slideMaster1.xml.rels',\n rels(rel(1, 'slideLayout', '../slideLayouts/slideLayout1.xml'), rel(2, 'slideLayout', '../slideLayouts/slideLayout2.xml'), rel(3, 'slideLayout', '../slideLayouts/slideLayout3.xml'), rel(4, 'theme', '../theme/theme1.xml')),\n ],\n ['ppt/slideLayouts/slideLayout1.xml', titleLayout],\n ['ppt/slideLayouts/slideLayout2.xml', layout('obj', 'Title and Content', ph(2, 'Title 1', 'title', null) + ph(3, 'Content Placeholder 2', null, 1))],\n ['ppt/slideLayouts/slideLayout3.xml', layout('blank', 'Blank', '')],\n ...[1, 2, 3].map((n) => [`ppt/slideLayouts/_rels/slideLayout${n}.xml.rels`, rels(rel(1, 'slideMaster', '../slideMasters/slideMaster1.xml'))] as [string, string]),\n ['ppt/slides/slide1.xml', slide],\n ['ppt/slides/_rels/slide1.xml.rels', rels(rel(1, 'slideLayout', '../slideLayouts/slideLayout1.xml'))],\n ['ppt/theme/theme1.xml', THEME],\n ])\n return writeZip(parts, 'application/vnd.openxmlformats-officedocument.presentationml.presentation')\n}\n","import { detectSeparator, markdownToHtml, parasToDocx, parseCsv, rowsToXlsx, textToParas, type ImportPara } from '../../core/convert'\nimport { htmlToParas } from '../docx/html'\n\nconst OFFICE = new Set(['docx', 'dotx', 'xlsx', 'xltx', 'pptx', 'potx'])\nconst TABLE = new Set(['csv', 'tsv', 'tab'])\nconst TEXT = new Set(['txt', 'text', 'log'])\nconst MARKDOWN = new Set(['md', 'markdown'])\nconst HTML = new Set(['html', 'htm', 'xhtml'])\n\n/** `accept` of the File → Open picker */\nexport const OPEN_ACCEPT = [...OFFICE, ...TABLE, ...TEXT, ...MARKDOWN, ...HTML].map((e) => '.' + e).join(',')\n\nexport interface Imported {\n src: Blob\n name: string\n /** built from another format: not saved as an Office file yet */\n converted: boolean\n}\n\nconst fromHtml = (html: string): ImportPara[] =>\n htmlToParas(html).map((p) => ({\n heading: p.heading,\n list: p.list,\n runs: p.runs.flatMap((r) => (r.t === 'text' ? [{ text: r.text, set: r.d, href: r.href }] : [])),\n }))\n\n/** Office files open as they are; CSV / TSV become a workbook, text / Markdown / HTML a document. */\nexport async function importFile(file: File): Promise<Imported> {\n const ext = /\\.([^./\\\\]+)$/.exec(file.name)?.[1].toLowerCase() ?? ''\n const base = file.name.replace(/\\.[^./\\\\]+$/, '') || 'document'\n if (OFFICE.has(ext)) return { src: file, name: file.name, converted: false }\n if (TABLE.has(ext)) {\n const text = await file.text()\n const sep = ext === 'csv' ? detectSeparator(text) : '\\t'\n return { src: await rowsToXlsx(parseCsv(text, sep), base, sep === ';'), name: `${base}.xlsx`, converted: true }\n }\n let paras: ImportPara[] | undefined\n if (TEXT.has(ext)) paras = textToParas(await file.text())\n else if (MARKDOWN.has(ext)) paras = fromHtml(markdownToHtml(await file.text()))\n else if (HTML.has(ext)) paras = fromHtml(await file.text())\n if (paras) return { src: await parasToDocx(paras), name: `${base}.docx`, converted: true }\n // no / unknown extension: an Office package is a ZIP\n const sig = new Uint8Array(await file.slice(0, 4).arrayBuffer())\n if (sig[0] === 0x50 && sig[1] === 0x4b) return { src: file, name: file.name, converted: false }\n throw new Error(`Cannot open “${file.name}”: supported files are Word, Excel, PowerPoint, CSV, text, Markdown and HTML`)\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 /* above the editor bar (20): File menu popup */\n z-index: 21;\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/* empty placeholders while editing (new slides, blank presentations) */\n.de-slide-editable .de-el > .de-txt:empty { outline: 1.5px dashed rgba(60, 64, 67, 0.4); outline-offset: -1px; }\n.de-slide-editable .de-el > .de-txt:empty::after {\n content: 'Click to add text';\n color: #80868b;\n font: 28px/1.2 system-ui, -apple-system, 'Segoe UI', Roboto, Arial, sans-serif;\n text-align: center;\n pointer-events: none;\n}\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.de-dd-head {\n padding: 6px 16px 2px 10px;\n color: var(--de-muted);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n user-select: none;\n}\n.de-dd.de-file { flex: none; padding: 0 4px 0 8px; font-weight: 500; }\n.de-dd.de-file + .de-dd-pop { max-height: 720px; }\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-tb-custom {\n margin: 10px 0 6px;\n color: var(--de-muted);\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n.de-tb-grid button.de-tb-add {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n background: #fff;\n border: 1px dashed #80868b;\n color: #444746;\n}\n.de-tb-native {\n position: absolute;\n left: 0;\n bottom: 0;\n width: 1px;\n height: 1px;\n padding: 0;\n border: 0;\n opacity: 0;\n pointer-events: none;\n}\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-details { display: grid; grid-template-columns: max-content 1fr; gap: 7px 18px; margin: 4px 0; font-size: 13px; }\n.de-details dt { color: var(--de-muted); }\n.de-details dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }\n.de-details-sep { grid-column: 1 / -1; height: 1px; background: #e3e3e3; }\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 type { ReactNode } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { stylesText } from '../injectStyles'\n\n/** Content laid out for paper: PDF / print and standalone HTML. */\nexport interface Printable {\n /** the pages (`.de-print-page` elements) or flowing content */\n node: ReactNode\n /** CSS `@page` size: '612pt 792pt', 'landscape', 'auto' */\n size: string\n /** CSS `@page` margin */\n margin: string\n /** shown to the user (e.g. output was truncated) */\n notice?: string\n}\n\nconst PRINT_CSS = `\nhtml, body { margin: 0; padding: 0; background: #fff; }\n.de-print {\n color: #000;\n font: 13px/1.4 system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n -webkit-print-color-adjust: exact;\n print-color-adjust: exact;\n}\n.de-print *, .de-print *::before, .de-print *::after { box-sizing: border-box; }\n.de-print img { max-width: none; }\n.de-print-page { position: relative; overflow: hidden; background: #fff; break-after: page; }\n.de-print-page:last-child { break-after: auto; }\n.de-print-page > .de-page { left: 0; top: 0; box-shadow: none; }\n/* position: own paint layer, so clipping cells after layout (fitText) stays cheap */\n.de-print-table { position: relative; border-collapse: collapse; table-layout: fixed; }\n.de-print-table td { padding: 0 3px 1px; vertical-align: bottom; white-space: pre; }\n.de-print-table.de-print-grid td { border: 1px solid #e2e4e7; }\n.de-print-grid + .de-print-grid { margin-top: -1px; }\n@media screen {\n body { background: #e9ebee; }\n .de-print { padding: 24px 16px; }\n .de-print-page { margin: 0 auto 24px; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.18); }\n .de-print-sheet { width: max-content; max-width: none; margin: 0 auto; padding: 16px; background: #fff; box-shadow: 0 1px 3px rgba(15, 23, 42, 0.18); }\n}\n@media print {\n .de-print-fit { zoom: var(--de-fit, 1); }\n}\n`\n\nconst cssFor = (p: Printable) => `${stylesText}\\n${PRINT_CSS}\\n@page { size: ${p.size}; margin: ${p.margin}; }\\n`\n\nconst sleep = (ms: number) => new Promise((r) => setTimeout(r, ms))\n\n/** waits until React and async media (slide pictures, fills) stop changing the DOM, then for images and fonts */\nasync function settle(doc: Document, host: HTMLElement) {\n await sleep(0)\n await new Promise<void>((resolve) => {\n let quiet: ReturnType<typeof setTimeout>\n const end = setTimeout(done, 8000)\n const mo = new MutationObserver(() => {\n clearTimeout(quiet)\n quiet = setTimeout(done, 250)\n })\n function done() {\n mo.disconnect()\n clearTimeout(quiet)\n clearTimeout(end)\n resolve()\n }\n mo.observe(host, { subtree: true, childList: true, attributes: true })\n quiet = setTimeout(done, 250)\n })\n const urls = new Set<string>()\n for (const el of host.querySelectorAll<HTMLElement>('[style*=\"url(\"]')) {\n for (const m of el.style.backgroundImage.matchAll(/url\\([\"']?([^\"')]+)[\"']?\\)/g)) urls.add(m[1])\n }\n const loads: Promise<unknown>[] = [...host.querySelectorAll('img')].map((img) =>\n img.complete ? null : new Promise((r) => ((img.onload = r), (img.onerror = r))),\n ) as Promise<unknown>[]\n for (const u of urls) {\n loads.push(\n new Promise((r) => {\n const img = new Image()\n img.onload = img.onerror = r\n img.src = u\n }),\n )\n }\n await Promise.race([Promise.all(loads), sleep(10_000)])\n await Promise.race([doc.fonts?.ready, sleep(3000)])\n}\n\nconst RTL = /[\\u0590-\\u08ff\\ufb1d-\\ufdff\\ufe70-\\ufefc]/\n\n/** first index in [lo, hi) where `ok` holds (`ok` false then true), hi when none */\nfunction search(lo: number, hi: number, ok: (i: number) => boolean) {\n while (lo < hi) {\n const mid = (lo + hi) >> 1\n if (ok(mid)) hi = mid\n else lo = mid + 1\n }\n return lo\n}\n\n/**\n * Cuts the text of the elements marked `data-de-fit` to what fits inside them (\"#\" marks numbers: shown as ###).\n * Cutting, not clipping: a clip (overflow: hidden) per spreadsheet cell makes Chrome's print layout superlinear in\n * their count — a 20,000-row sheet took minutes and crashed the print preview. Wrapped or right-to-left text is clipped.\n */\nfunction fitText(host: HTMLElement) {\n const view = host.ownerDocument.defaultView!\n const range = host.ownerDocument.createRange()\n const box = (text: Text, i: number) => {\n range.setStart(text, i)\n range.setEnd(text, i + 1)\n return range.getBoundingClientRect()\n }\n const cuts: [Text, string][] = []\n const clips: HTMLElement[] = []\n for (const el of host.querySelectorAll<HTMLElement>('[data-de-fit]')) {\n const node = el.firstChild\n if (node?.nodeType !== Node.TEXT_NODE || node.nextSibling) continue\n const text = node as Text\n const s = text.data\n range.selectNodeContents(text)\n const t = range.getBoundingClientRect()\n const b = el.getBoundingClientRect()\n // the padding box: what overflow: hidden would show\n const left = b.left + el.clientLeft - 0.5\n const right = b.left + el.clientLeft + el.clientWidth + 0.5\n if (t.left >= left && t.right <= right) continue\n const cs = view.getComputedStyle(el)\n if (el.dataset.deFit === '#') {\n const room = el.clientWidth - parseFloat(cs.paddingLeft) - parseFloat(cs.paddingRight)\n cuts.push([text, '#'.repeat(Math.max(1, Math.floor(room / (t.width / s.length))))])\n } else if (RTL.test(s) || (cs.whiteSpace !== 'pre' && cs.whiteSpace !== 'nowrap')) {\n // characters out of visual order, or lines wrapped\n clips.push(el)\n } else {\n const lines: string[] = []\n let start = 0\n for (const line of s.split('\\n')) {\n const end = start + line.length\n // a line's characters run left to right: keep those inside the cell\n let i = search(start, end, (k) => box(text, k).left >= left)\n let j = search(i, end, (k) => box(text, k).right > right)\n if (/[\\udc00-\\udfff]/.test(s[i] ?? '')) i++\n if (/[\\ud800-\\udbff]/.test(s[j - 1] ?? '')) j--\n lines.push(s.slice(i, Math.max(i, j)))\n start = end + 1\n }\n cuts.push([text, lines.join('\\n')])\n }\n }\n // writes after all reads: one layout\n for (const [text, s] of cuts) text.data = s\n for (const el of clips) el.style.overflow = 'hidden'\n}\n\ninterface Mounted {\n frame: HTMLIFrameElement\n doc: Document\n host: HTMLElement\n dispose(): void\n}\n\n/** renders the printable into an off-screen same-origin iframe (keeps host page CSS out) */\nasync function mount(p: Printable, title: string): Promise<Mounted> {\n const frame = document.createElement('iframe')\n frame.setAttribute('aria-hidden', 'true')\n frame.tabIndex = -1\n frame.style.cssText = 'position:fixed;left:-20000px;top:0;width:1100px;height:800px;border:0;visibility:hidden'\n document.body.appendChild(frame)\n const doc = frame.contentDocument!\n doc.open()\n doc.write('<!doctype html><html><head><meta charset=\"utf-8\"></head><body></body></html>')\n doc.close()\n doc.title = title\n const style = doc.createElement('style')\n style.textContent = cssFor(p)\n doc.head.appendChild(style)\n const host = doc.createElement('div')\n host.className = 'de-print'\n doc.body.appendChild(host)\n const root = createRoot(host)\n root.render(p.node)\n let disposed = false\n const dispose = () => {\n if (disposed) return\n disposed = true\n root.unmount()\n frame.remove()\n }\n try {\n await settle(doc, host)\n fitText(host)\n } catch (e) {\n dispose()\n throw e\n }\n return { frame, doc, host, dispose }\n}\n\nlet printing: Mounted | null = null\n\n/** Opens the browser print dialog for the content (choose \"Save as PDF\" there). */\nexport async function printDocument(p: Printable, title: string): Promise<void> {\n printing?.dispose()\n const m = await mount(p, title)\n printing = m\n const w = m.frame.contentWindow!\n const cleanup = () => {\n if (printing === m) printing = null\n // give the print pipeline a moment before the frame goes away\n setTimeout(() => m.dispose(), 1000)\n }\n w.addEventListener('afterprint', cleanup, { once: true })\n setTimeout(cleanup, 10 * 60_000)\n // the PDF file name proposed by \"Save as PDF\" comes from the top document's title in some browsers\n const prev = document.title\n document.title = title\n try {\n w.focus()\n // Safari prints the whole page with frame.print(); execCommand prints the frame there\n let ok = false\n try {\n ok = w.document.execCommand('print', false)\n } catch {\n ok = false\n }\n if (!ok) w.print()\n } finally {\n document.title = prev\n }\n}\n\nconst esc = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n\nfunction toDataUrl(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const r = new FileReader()\n r.onload = () => resolve(r.result as string)\n r.onerror = () => reject(r.error)\n r.readAsDataURL(blob)\n })\n}\n\n/** Standalone web page of the content (pictures embedded). */\nexport async function exportHtml(p: Printable, title: string): Promise<Blob> {\n const m = await mount(p, title)\n try {\n let body = m.host.outerHTML.replace(/ contenteditable=\"(?:true|false)\"| data-de-fit=\"#?\"/g, '')\n const blobs = new Set(body.match(/blob:[^\"'()\\s&]+/g) ?? [])\n for (const url of blobs) {\n try {\n const data = await toDataUrl(await (await fetch(url)).blob())\n body = body.split(url).join(data)\n } catch {\n // revoked: the picture is left out\n }\n }\n const html =\n `<!doctype html>\\n<html><head><meta charset=\"utf-8\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">` +\n `<title>${esc(title)}</title><style>${cssFor(p)}</style></head><body>${body}</body></html>\\n`\n return new Blob([html], { type: 'text/html;charset=utf-8' })\n } finally {\n m.dispose()\n }\n}\n","import { useRef, useState } from 'react'\nimport { detectSeparator, parseCsv } from '../../core/convert'\nimport type { DocKind } from '../../core/opc'\nimport { MOD } from '../common/ContextMenu'\nimport type { FileOps } from '../common/Slots'\nimport { download, Dropdown, pickFiles, type DropOption } from '../edit/Toolbar'\nimport { OPEN_ACCEPT } from './importFile'\nimport { exportHtml, printDocument } from './print'\n\nexport const KIND_LABEL: Record<DocKind, string> = {\n docx: 'Word document',\n xlsx: 'Excel workbook',\n pptx: 'PowerPoint presentation',\n}\nconst EXT: Record<DocKind, string> = { docx: '.docx', xlsx: '.xlsx', pptx: '.pptx' }\n\nconst TEXT_FORMATS: Record<DocKind, { id: string; label: string; ext: string; mime: string }[]> = {\n docx: [\n { id: 'txt', label: 'Plain text', ext: '.txt', mime: 'text/plain' },\n { id: 'md', label: 'Markdown', ext: '.md', mime: 'text/markdown' },\n ],\n xlsx: [\n { id: 'csv', label: 'CSV (current sheet)', ext: '.csv', mime: 'text/csv' },\n { id: 'tsv', label: 'TSV (current sheet)', ext: '.tsv', mime: 'text/tab-separated-values' },\n ],\n pptx: [{ id: 'txt', label: 'Plain text', ext: '.txt', mime: 'text/plain' }],\n}\n\n/** Host-provided File menu entry (Share, Version history…). */\nexport interface FileMenuItem {\n label: string\n /** built-in icon name */\n icon?: string\n /** shortcut / note on the right */\n hint?: string\n disabled?: boolean\n onClick: () => void\n}\n\nexport interface FileActionsOptions {\n kind: DocKind | undefined\n /** file name without extension */\n base: string\n /** New / Open (replace the document) */\n canOpen: boolean\n /** Import into the document (spreadsheets) */\n canImport: boolean\n canSave: boolean\n canDownload: boolean\n ops: { current: FileOps | null }\n create: (kind: DocKind) => void\n open: (file: File) => void\n save: () => Promise<void>\n /** the document in its own format */\n downloadOriginal: () => Promise<void>\n rename?: () => void\n details?: () => void\n close?: () => void\n extra: FileMenuItem[]\n notify: (message: string) => void\n}\n\nexport interface FileActions {\n options: DropOption<string>[]\n busy: boolean\n run: (action: string) => void\n}\n\n/** actions that open a picker / dialog right away (no busy state) */\nconst QUICK = /^(new:|open$|import$|rename$|details$|close$|extra:)/\n\n/** File menu entries and their actions (also used by the Ctrl+O / Ctrl+P shortcuts). */\nexport function useFileActions(o: FileActionsOptions): FileActions {\n const [busy, setBusy] = useState(false)\n const busyRef = useRef(false)\n const opts = useRef(o)\n opts.current = o\n const kind = o.kind\n\n const options: DropOption<string>[] = []\n const section = (items: DropOption<string>[]) => {\n if (!items.length) return\n items[0] = { ...items[0], sep: options.length > 0 }\n options.push(...items)\n }\n section(\n o.canOpen\n ? [\n { value: 'new:docx', label: 'Document', icon: 'doc', head: 'New' },\n { value: 'new:xlsx', label: 'Spreadsheet', icon: 'table' },\n { value: 'new:pptx', label: 'Presentation', icon: 'slides' },\n { value: 'open', label: 'Open…', icon: 'open', hint: `${MOD}O`, sep: true },\n ]\n : [],\n )\n if (o.canImport && kind === 'xlsx') options.push({ value: 'import', label: 'Import CSV into new sheet…', icon: 'table', sep: !o.canOpen && options.length > 0 })\n const fileItems: DropOption<string>[] = []\n if (kind && o.canSave) fileItems.push({ value: 'save', label: 'Save', icon: 'save', hint: `${MOD}S` })\n if (kind && o.rename) fileItems.push({ value: 'rename', label: 'Rename…', icon: 'edit' })\n section(fileItems)\n if (o.canDownload && kind) {\n section([\n { value: 'original', label: KIND_LABEL[kind], icon: 'save', hint: EXT[kind], head: 'Download as' },\n { value: 'pdf', label: 'PDF document', icon: 'pdf', hint: '.pdf' },\n { value: 'html', label: 'Web page', icon: 'html', hint: '.html' },\n ...TEXT_FORMATS[kind].map((f) => ({ value: 'text:' + f.id, label: f.label, icon: 'doc', hint: f.ext })),\n ])\n }\n const tail: DropOption<string>[] = []\n if (kind && o.details) tail.push({ value: 'details', label: 'Document details', icon: 'info' })\n if (kind && o.canDownload) tail.push({ value: 'print', label: 'Print', icon: 'print', hint: `${MOD}P` })\n section(tail)\n section(o.extra.map((x, i) => ({ value: `extra:${i}`, label: x.label, icon: x.icon, hint: x.hint, disabled: x.disabled })))\n if (o.close) section([{ value: 'close', label: 'Close', icon: 'close' }])\n\n const exec = async (action: string) => {\n const c = opts.current\n if (action.startsWith('new:')) return c.create(action.slice(4) as DocKind)\n if (action.startsWith('extra:')) return c.extra[Number(action.slice(6))]?.onClick()\n switch (action) {\n case 'open': {\n const [file] = await pickFiles(OPEN_ACCEPT, false)\n if (file) c.open(file)\n return\n }\n case 'rename':\n return c.rename?.()\n case 'details':\n return c.details?.()\n case 'close':\n return c.close?.()\n case 'save':\n return c.save()\n }\n const ops = c.ops.current\n if (action === 'import') {\n const [file] = await pickFiles('.csv,.tsv,.tab,.txt', false)\n if (!file) return\n if (!ops?.importTable) throw new Error('The document is still loading — try again in a moment')\n const text = await file.text()\n const sep = /\\.(tsv|tab)$/i.test(file.name) ? '\\t' : detectSeparator(text)\n await ops.importTable(parseCsv(text, sep), file.name.replace(/\\.[^.]+$/, '').slice(0, 31) || 'Imported')\n return\n }\n if (!c.kind || !c.canDownload) return\n if (action === 'original') return c.downloadOriginal()\n if (!ops) throw new Error('The document is still loading — try again in a moment')\n if (action.startsWith('text:')) {\n const f = TEXT_FORMATS[c.kind].find((x) => 'text:' + x.id === action)\n if (!f) return\n download(new Blob([await ops.text(f.id)], { type: `${f.mime};charset=utf-8` }), c.base + f.ext)\n return\n }\n if (action === 'pdf' || action === 'print' || action === 'html') {\n c.notify(action === 'pdf' ? 'Preparing PDF… choose “Save as PDF” in the print dialog' : 'Preparing…')\n const p = await ops.printable()\n if (p.notice) c.notify(p.notice)\n if (action === 'html') download(await exportHtml(p, c.base), c.base + '.html')\n else await printDocument(p, c.base)\n }\n }\n\n const run = (action: string) => {\n const quick = QUICK.test(action)\n if (busyRef.current && !quick) return\n if (!quick) {\n busyRef.current = true\n setBusy(true)\n }\n Promise.resolve()\n .then(() => exec(action))\n .catch((e: Error) => opts.current.notify(e.message || String(e)))\n .finally(() => {\n if (quick) return\n busyRef.current = false\n setBusy(false)\n })\n }\n\n return { options, busy, run }\n}\n\nexport function FileMenu({ actions }: { actions: FileActions }) {\n if (!actions.options.length) return null\n return <Dropdown title=\"File\" label=\"File\" className=\"de-file\" options={actions.options} onChange={actions.run} menuWidth={280} disabled={actions.busy} />\n}\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 { useFileOps, useViewer } from '../common/Slots'\nimport { slidesToText } from '../file/text'\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 useFileOps({\n printable: async () => {\n const m = client.info.pptx as PresentationMeta\n // hidden flags are known once a slide is parsed: filter on the models\n const all = await Promise.all(m.slides.map((s) => client.call('pptx.slide', s.index)))\n const shown = all.filter((s) => !s.hidden)\n const slides = shown.length ? shown : all\n return {\n size: `${m.w}px ${m.h}px`,\n margin: '0',\n node: slides.map((model) => (\n <div key={model.index} className=\"de-print-page\" style={{ width: m.w, height: m.h }}>\n <SlideView model={{ ...model, hidden: false }} client={client} scale={1} />\n </div>\n )),\n }\n },\n text: async () => {\n const m = client.info.pptx as PresentationMeta\n return slidesToText(await Promise.all(m.slides.map((s) => client.call('pptx.slide', s.index))))\n },\n stats: () => {\n const m = client.info.pptx as PresentationMeta\n return [\n ['Slides', m.count.toLocaleString()],\n ['Slide size', `${+(m.w / 96).toFixed(2)} × ${+(m.h / 96).toFixed(2)} in`],\n ]\n },\n })\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 // the new shape is selected: arrow keys, Delete, ⌘D act on it right away\n scrollRef.current?.focus({ preventScroll: 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","/** px size of a CSS font size ('11pt', px number), `base` when unset */\nexport const 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. */\nexport function 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","import type { CSSProperties, ReactNode } from 'react'\nimport type { DocumentClient } from '../../core/worker/client'\nimport type { CellOut, Merge, WorkbookMeta } from '../../core/xlsx/types'\nimport type { Printable } from '../file/print'\nimport { toCsv } from '../file/text'\nimport type { Axis } from './axis'\nimport { fitNumber, fontPx } from './fit'\n\nexport interface SheetLayout {\n rows: number\n cols: number\n rowAxis: Axis\n colAxis: Axis\n merges: Merge[]\n gridLines: boolean\n done: boolean\n}\n\nconst CHUNK = 2000\nconst MAX_PRINT_ROWS = 20_000\n/** Rows per `<table>`: Chrome paginates one long table in worse than linear time; short tables stay linear. */\nconst TABLE_ROWS = 100\n/** printable width (px) of portrait / landscape paper after margins (A4 and Letter) */\nconst PORTRAIT_W = 700\nconst LANDSCAPE_W = 960\n\nasync function sheetRows(client: DocumentClient, sheet: number, rows: number): Promise<Map<number, CellOut[]>> {\n const out = new Map<number, CellOut[]>()\n for (let r0 = 0; r0 < rows; r0 += CHUNK) {\n const b = await client.call('xlsx.block', sheet, r0, Math.min(rows, r0 + CHUNK))\n for (const row of b.rows) out.set(row.r, row.cells)\n }\n return out\n}\n\nconst loading = () => new Error('The sheet is still loading — try again in a moment')\n\n/** Shown values of the sheet as CSV / TSV (UTF-8 BOM for CSV so Excel reads accents). */\nexport async function sheetText(client: DocumentClient, sheet: number, l: SheetLayout, sep: string): Promise<string> {\n if (!l.done) throw loading()\n const data = await sheetRows(client, sheet, l.rows)\n let lastR = -1\n let lastC = -1\n for (const [r, cells] of data) {\n for (const c of cells) {\n if (c[1] === '') continue\n lastR = Math.max(lastR, r)\n lastC = Math.max(lastC, c[0])\n }\n }\n const rows: string[][] = []\n for (let r = 0; r <= lastR; r++) {\n const line = new Array<string>(lastC + 1).fill('')\n for (const c of data.get(r) ?? []) if (c[0] <= lastC) line[c[0]] = c[1]\n rows.push(line)\n }\n return (sep === ',' ? '' : '') + toCsv(rows, sep)\n}\n\nconst VALIGN: Record<string, CSSProperties['verticalAlign']> = { 'flex-start': 'top', center: 'middle', 'flex-end': 'bottom' }\n\n/** The sheet as a table (used range, hidden rows / columns left out), fitted to the paper width. */\nexport async function sheetPrintable(client: DocumentClient, sheet: number, l: SheetLayout, meta: WorkbookMeta): Promise<Printable> {\n if (!l.done) throw loading()\n const data = await sheetRows(client, sheet, Math.min(l.rows, MAX_PRINT_ROWS))\n let lastR = -1\n let lastC = -1\n for (const [r, cells] of data) {\n for (const c of cells) {\n if (c[1] === '' && !c[2]) continue\n lastR = Math.max(lastR, r)\n lastC = Math.max(lastC, c[0])\n }\n }\n const merges = l.merges.filter((m) => m.r0 <= lastR && m.c0 <= lastC)\n for (const m of merges) {\n lastR = Math.max(lastR, Math.min(m.r1, MAX_PRINT_ROWS - 1))\n lastC = Math.max(lastC, m.c1)\n }\n const cols: number[] = []\n for (let c = 0; c <= lastC; c++) if (l.colAxis.size(c) > 0) cols.push(c)\n const anchors = new Map<number, Merge>()\n const covered = new Set<number>()\n const key = (r: number, c: number) => r * 16384 + c\n // a row may start a new table unless a merge runs across it\n const across = new Int32Array(lastR + 2)\n for (const m of merges) {\n anchors.set(key(m.r0, m.c0), m)\n const r1 = Math.min(m.r1, lastR)\n for (let r = m.r0; r <= r1; r++) for (let c = m.c0; c <= m.c1; c++) if (r !== m.r0 || c !== m.c0) covered.add(key(r, c))\n if (r1 > m.r0) {\n across[m.r0 + 1]++\n across[r1 + 1]--\n }\n }\n const visibleIn = (axis: Axis, a: number, b: number) => {\n let n = 0\n for (let i = a; i <= b; i++) if (axis.size(i) > 0) n++\n return Math.max(1, n)\n }\n\n const basePx = fontPx(meta.baseFont.fontSize, 14.67)\n const tables: ReactNode[][] = []\n let trs: ReactNode[] = []\n let inMerge = 0\n for (let r = 0; r <= lastR; r++) {\n inMerge += across[r]\n if (!inMerge && trs.length >= TABLE_ROWS) {\n tables.push(trs)\n trs = []\n }\n const h = l.rowAxis.size(r)\n if (!h) continue\n const cells = new Map((data.get(r) ?? []).map((c) => [c[0], c]))\n const tds: ReactNode[] = []\n cols.forEach((c, k) => {\n if (covered.has(key(r, c))) return\n const cell = cells.get(c)\n const m = anchors.get(key(r, c))\n const [, raw = '', si = 0, kind = 0, color] = cell ?? []\n const { textAlign, textRotate: _rot, alignItems, whiteSpace, ...rest } = (meta.styles[si] ?? {}) as Record<string, string | number>\n // like the grid: fewer decimals or ### when a number does not fit\n const w = m ? l.colAxis.pos(Math.min(m.c1, lastC) + 1) - l.colAxis.pos(m.c0) : l.colAxis.size(c)\n const text = kind === 1 && raw ? fitNumber(raw, w - 6, fontPx(rest.fontSize, basePx)) : raw\n const align = (textAlign as string) ?? (kind === 1 ? 'right' : kind === 2 ? 'center' : 'left')\n // like the grid: left-aligned text runs over empty neighbours (and past the last column)\n const next = cols[k + 1]\n const spill = !!text && !m && align === 'left' && !whiteSpace && (next === undefined || (!cells.get(next)?.[1] && !covered.has(key(r, next))))\n // only what differs from the `.de-print-table td` defaults (bottom, pre, left): keeps a big sheet's DOM small\n const style = { ...rest } as CSSProperties\n if (align !== 'left') style.textAlign = align as CSSProperties['textAlign']\n const valign = VALIGN[alignItems as string]\n if (valign && valign !== 'bottom') style.verticalAlign = valign\n if (whiteSpace) style.whiteSpace = whiteSpace as CSSProperties['whiteSpace']\n if (color) style.color = color\n tds.push(\n <td\n key={c}\n style={style}\n data-de-fit={text && !spill ? (kind === 1 ? '#' : '') : undefined}\n colSpan={m ? visibleIn(l.colAxis, m.c0, Math.min(m.c1, lastC)) : undefined}\n rowSpan={m ? visibleIn(l.rowAxis, m.r0, Math.min(m.r1, lastR)) : undefined}\n >\n {text}\n </td>,\n )\n })\n trs.push(\n <tr key={r} style={{ height: h }}>\n {tds}\n </tr>,\n )\n }\n if (trs.length || !tables.length) tables.push(trs)\n\n const width = cols.reduce((w, c) => w + l.colAxis.size(c), 0)\n const landscape = width > PORTRAIT_W\n const fit = Math.max(0.35, Math.min(1, (landscape ? LANDSCAPE_W : PORTRAIT_W) / Math.max(1, width)))\n const className = l.gridLines ? 'de-print-table de-print-grid' : 'de-print-table'\n const tableStyle = { width, ...(meta.baseFont as CSSProperties) }\n const colgroup = (\n <colgroup>\n {cols.map((c) => (\n <col key={c} style={{ width: l.colAxis.size(c) }} />\n ))}\n </colgroup>\n )\n const node = (\n <div className=\"de-print-sheet de-print-fit\" style={{ '--de-fit': fit } as CSSProperties}>\n {tables.map((rows, i) => (\n <table key={i} className={className} style={tableStyle}>\n {colgroup}\n <tbody>{rows}</tbody>\n </table>\n ))}\n </div>\n )\n return {\n node,\n size: landscape ? 'landscape' : 'auto',\n margin: '12mm',\n notice: l.rows > MAX_PRINT_ROWS ? `Only the first ${MAX_PRINT_ROWS.toLocaleString()} rows are included` : undefined,\n }\n}\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore, type CSSProperties, type MutableRefObject, type ReactNode } from 'react'\nimport type { BookOp, CellDetail, CellInput, 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 { useFileOps, 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'\nimport { fitNumber, fontPx } from './fit'\nimport { sheetPrintable, sheetText } from './print'\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 useFileOps({\n printable: () => sheetPrintable(client, cur, store.sheet(cur), meta),\n text: (format) => sheetText(client, cur, store.sheet(cur), format === 'tsv' ? '\\t' : ','),\n stats: () => {\n const s = store.sheet(cur)\n return [\n ['Sheets', `${meta.sheets.length}${meta.sheets.some((x) => x.hidden) ? ` (${meta.sheets.filter((x) => x.hidden).length} hidden)` : ''}`],\n ['Current sheet', meta.sheets[cur]?.name ?? ''],\n ['Used range', `${s.rows.toLocaleString()} rows × ${s.cols.toLocaleString()} columns${s.done ? '' : ' (loading)'}`],\n ]\n },\n importTable: async (rows, name) => {\n const res = await client.call('xlsx.bookOp', { op: 'add', name, after: cur })\n store.applied(res, meta)\n viewer.setDirty(true)\n const idx = cur + 1\n setActive(idx)\n // cells can be written once the new sheet is loaded\n await new Promise<void>((resolve, reject) => {\n let off = () => {}\n const check = () => {\n const s = store.sheet(idx)\n if (s.error) reject(new Error(s.error))\n else if (s.done) resolve()\n else return\n off()\n }\n off = store.subscribe(check)\n check()\n })\n const cells: CellInput[] = []\n rows.forEach((row, r) => row.forEach((input, c) => input !== '' && cells.push({ r, c, input })))\n if (cells.length) store.applied(await client.call('xlsx.set', idx, cells), meta)\n bump()\n },\n })\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\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\n/** grows a range until it holds every merged cell it touches (like Excel / Sheets selections) */\nexport function withMerges(r: Range, merges: Merge[]): Range {\n let out = r\n for (let changed = true; changed; ) {\n changed = false\n for (const m of merges) {\n if (m.r1 < out.r0 || m.r0 > out.r1 || m.c1 < out.c0 || m.c0 > out.c1) continue\n if (m.r0 >= out.r0 && m.r1 <= out.r1 && m.c0 >= out.c0 && m.c1 <= out.c1) continue\n out = { r0: Math.min(out.r0, m.r0), c0: Math.min(out.c0, m.c0), r1: Math.max(out.r1, m.r1), c1: Math.max(out.c1, m.c1) }\n changed = true\n }\n }\n return out\n}\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 = withMerges(rectOf(sel), s.merges)\n /** one cell, or exactly one merged cell */\n const oneCell = (rect.r0 === rect.r1 && rect.c0 === rect.c1) || s.merges.some((m) => m.r0 === rect.r0 && m.c0 === rect.c0 && m.r1 === rect.r1 && m.c1 === rect.c1)\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 // a merged cell hides the gridlines inside it (its own right / bottom edge lines stay visible)\n if (merged && !rest.background) style.background = 'linear-gradient(#fff, #fff) 0 0 / calc(100% - 1px) calc(100% - 1px) no-repeat'\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 && !oneCell) {\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 // Enter and the editor's blur can both commit before React re-renders: write once\n const committed = useRef<EditState | null>(null)\n const commit = (move?: [number, number]) => {\n const e = edit\n if (!e || committed.current === e) return\n committed.current = e\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 (mod && k === 'a' && !e.altKey && !e.shiftKey) {\n e.preventDefault()\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 (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 // the selection holds merged cells (it always covers them whole): Unmerge / toggle unmerges them all\n const merged = s.merges.some((m) => m.r0 >= rect.r0 && m.r1 <= rect.r1 && m.c0 >= rect.c0 && 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 (!oneCell) {\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 {!oneCell && `:${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.base ?? 0}|${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, useRef, 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 FileOps, type ViewerApi } from './common/Slots'\nimport { StatusContext } from './common/Status'\nimport { ConfirmDialog, PromptDialog, Toast } from './common/Dialog'\nimport { download, Icon } from './edit/Toolbar'\nimport { DetailsDialog } from './file/DetailsDialog'\nimport { FileMenu, KIND_LABEL, useFileActions, type FileMenuItem } from './file/FileMenu'\nimport { importFile, type Imported } from './file/importFile'\nimport { blankPptx, parasToDocx, rowsToXlsx } from '../core/convert'\nimport type { DocKind } from '../core/opc'\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 /** Show the Save/Download button and enable Ctrl+S. Default true. */\n allowSave?: boolean\n /**\n * Allow downloading files to the user's device (the save fallback without `onSave`, \"Download image\").\n * With `onSave`, saving still works when this is false. Default true.\n */\n allowDownload?: boolean\n /** Show the File menu (new, open, save, rename, download as PDF / HTML / text…, details, print) and its shortcuts. Default true. */\n fileMenu?: boolean\n /** File → New / Open: replace the document with a blank one or a local file (Office, CSV, text, Markdown, HTML). Default true. */\n allowOpen?: boolean\n /** Extra File menu entries (Share, Version history…), shown before Close. */\n fileMenuItems?: FileMenuItem[]\n /** File → Rename: called with the new name (extension included). Rename is shown when `fileMenu` is on. */\n onRename?: (name: string) => void\n /** Adds File → Close. */\n onClose?: () => void\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' }\nconst UNTITLED: Record<DocKind, string> = { docx: 'Untitled document', xlsx: 'Untitled spreadsheet', pptx: 'Untitled presentation' }\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, allowSave = true, allowDownload = true, fileMenu = true, allowOpen = 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 // File → New / Open: a local file shown instead of `src` until the host passes another `src`\n const [opened, setOpened] = useState<Imported | null>(null)\n const [renamed, setRenamed] = useState<string | null>(null)\n useEffect(() => {\n setOpened(null)\n setRenamed(null)\n }, [src])\n const loadName = opened ? opened.name : name\n // the name is part of what is loaded: Rename only changes what is shown and saved\n const { client, error, loading, progress } = useDocument(opened ? opened.src : src, { name: loadName, headers, credentials, worker })\n const docName = renamed ?? loadName\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 // a converted file (CSV → xlsx…) starts unsaved\n const openedDirty = useRef(false)\n useEffect(() => {\n setDirtyState(!!client && openedDirty.current)\n if (client) openedDirty.current = 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 baseName = (renamed ?? (client?.name || docName || 'document')).replace(/\\.[^.]+$/, '')\n const fileName = baseName + (client ? EXT[client.kind] : '')\n // saving without onSave means downloading\n const canSave = allowSave && (!!onSave || allowDownload)\n const save = useCallback(async () => {\n if (!client || saving || !canSave) 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, canSave, onSave, fileName, setDirty, onError])\n const fileOps = useRef<FileOps | null>(null)\n const api = useMemo<ViewerApi>(\n () => ({ bar: barEl, editable: editing && canEdit, setDirty, save, canDownload: allowDownload, client, fileOps }),\n [barEl, editing, canEdit, setDirty, save, allowDownload, client],\n )\n\n // ---- File menu ----\n const [toast, setToast] = useState<string | null>(null)\n const clearToast = useCallback(() => setToast(null), [])\n const [confirm, setConfirm] = useState<{ message: string; run: () => void } | null>(null)\n const [renaming, setRenaming] = useState(false)\n const [details, setDetails] = useState(false)\n /** replaces the document, after confirmation when there are unsaved changes */\n const replace = (message: string, run: () => void) => (dirty ? setConfirm({ message, run }) : run())\n const show = useCallback((doc: Imported, edit = false) => {\n openedDirty.current = doc.converted\n setRenamed(null)\n setOpened(doc)\n if (edit) setEditing(true)\n }, [])\n const canOpen = fileMenu && allowOpen && !props.collab\n const fileActions = useFileActions({\n kind: client?.kind,\n base: baseName,\n canOpen,\n canImport: fileMenu && allowEdit && canEdit,\n canSave: fileMenu && canSave,\n canDownload: fileMenu && allowDownload && !!client,\n ops: fileOps,\n create: (kind: DocKind) =>\n replace(`A new ${UNTITLED[kind].split(' ')[1]} replaces the current document. Your changes are not saved.`, () => {\n const blank = kind === 'docx' ? parasToDocx([]) : kind === 'xlsx' ? rowsToXlsx([], 'Sheet1') : blankPptx()\n blank.then((src) => show({ src, name: UNTITLED[kind] + EXT[kind], converted: false }, allowEdit), (e: Error) => setToast(e.message))\n }),\n open: (file) =>\n replace(`Opening “${file.name}” replaces the current document. Your changes are not saved.`, () => {\n importFile(file).then(show, (e: Error) => setToast(e.message))\n }),\n save,\n downloadOriginal: async () => {\n if (!client) return\n download(await client.call('save'), fileName)\n // without onSave, saving is downloading\n if (!onSave) setDirty(false)\n },\n rename: () => setRenaming(true),\n details: () => setDetails(true),\n close: props.onClose,\n extra: props.fileMenuItems ?? [],\n notify: setToast,\n })\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (!fileMenu || e.defaultPrevented || !(e.metaKey || e.ctrlKey) || e.altKey || e.shiftKey) return\n const k = e.key.toLowerCase()\n if (k === 'p') {\n // with downloads disabled, the browser must not print (save) the page either\n e.preventDefault()\n if (allowDownload) fileActions.run('print')\n } else if (k === 'o' && canOpen) {\n e.preventDefault()\n fileActions.run('open')\n }\n }\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 = renamed ?? client?.name ?? docName ?? (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 || opened ? (\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} onKeyDown={onKeyDown}>\n {toolbar && (\n <div className=\"de-bar\">\n {client && <span className={`de-badge de-badge-${client.kind}`}>{client.kind}</span>}\n {fileMenu && <FileMenu actions={fileActions} />}\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 && canSave && (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 || onSave ? '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 {toast && <Toast text={toast} onDone={clearToast} />}\n {confirm && <ConfirmDialog title=\"Discard unsaved changes?\" message={confirm.message} ok=\"Continue\" onOk={confirm.run} onClose={() => setConfirm(null)} />}\n {renaming && client && (\n <PromptDialog\n spec={{\n title: 'Rename',\n label: 'File name',\n initial: baseName,\n ok: 'Rename',\n onOk: (v) => {\n const next = v.trim().replace(/[\\\\/:*?\"<>|]+/g, ' ').replace(new RegExp(`\\\\${EXT[client.kind]}$`, 'i'), '')\n if (!next) return\n setRenamed(next + EXT[client.kind])\n props.onRename?.(next + EXT[client.kind])\n },\n }}\n onClose={() => setRenaming(false)}\n />\n )}\n {details && client && (\n <DetailsDialog\n client={client}\n file={[\n ['Name', fileName],\n ['Type', KIND_LABEL[client.kind]],\n ...(client.size > 0 ? [['File size', fmtBytes(client.size)] as [string, string]] : []),\n ...(dirty ? [['Status', 'Unsaved changes'] as [string, string]] : []),\n ]}\n stats={fileOps.current?.stats() ?? []}\n onClose={() => setDetails(false)}\n />\n )}\n </div>\n )\n}\n"],"mappings":"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"}
|