@p10node/office-engine 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"DocViewer-Co7q5D2H.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","left","atEnd","count","bi","blocks","nt","j","pas","opts","lastB","lastN","now","selBefore","near","pid","pids","specs","idx","still","anchor","structural","want","sent","op","res","pi","old","touched","locs","paras","l","loc","empty","pasAfter","pasNow","pd","patch","optimistic","kind","nr","nc","method","nextKeys","beforeKeys","anchorP","added","removed","beforeObj","history","after","nextBlock","runs","files","ext","dims","imageSize","scale","href","lk","style","fn","b2","data","links","lines","headingId","img","nw","nh","alt","file","run","rs","HIGHLIGHTS$1","LINE_SPACING","CANON","SYMBOLS","stylePreview","DocxToolbar","setSt","editor","font","dis","sz","line","styleOpts","styles","hint","look","styleValue","image","FindBar","rep","setRep","showRep","setShowRep","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, plen, runAt, shiftPa, splitRuns, type RRun, type Sel } from '../edit/rich'\n\nexport interface DocState {\n blocks: Block[]\n heights: WeakMap<Block, number>\n dirty: Set<Block>\n /** leading blocks measured at least once */\n frontier: number\n}\n\ninterface Entry {\n pas: string[]\n before: Paragraph[]\n after: Paragraph[]\n /** top-level block replacement (tables) */\n blocks?: { bi: number; before: Block[]; after: Block[] }\n selBefore: Sel\n selAfter: Sel\n label: string\n t: number\n}\n\nexport interface FormatState {\n b: boolean\n i: boolean\n u: boolean\n strike: boolean\n color?: string\n hl?: string\n sz?: number\n font?: string\n align?: string\n style?: string\n lst?: 'bullet' | 'number'\n line?: number\n va?: 'sup' | 'sub'\n link?: string\n /** caret inside a table cell */\n inTable: boolean\n /** a single image is selected */\n img?: { w: number; h: number; alt?: string; target: string; pa: string; o: number }\n canUndo: boolean\n canRedo: boolean\n}\n\nconst path = (pa: string) => pa.split('.').map(Number)\n\n/** selection recorded around address `from`, re-based onto `to` (same container) */\nfunction moveSel(sel: Sel, from: string, to: string): Sel {\n if (from === to) return sel\n const dir = (pa: string) => pa.replace(/\\.?\\d+$/, '')\n const d = Number(to.split('.').pop()) - Number(from.split('.').pop())\n const mv = (p: Sel['a']) => (dir(p.pa) === dir(from) ? { ...p, pa: dir(to) ? `${dir(to)}.${Number(p.pa.split('.').pop()) + d}` : String(Number(p.pa.split('.').pop()) + d) } : p)\n return { a: mv(sel.a), f: mv(sel.f) }\n}\n\n/** a model change: contiguous paragraphs replaced, or top-level blocks replaced */\nexport type DocxCommit = { kind: 'paras'; before: Paragraph[]; next: Paragraph[] } | { kind: 'blocks'; bi: number; before: Block[]; next: Block[] }\n\nexport class DocxEditor implements RichHost<Paragraph> {\n readonly input: RichInput\n pendingSel: Sel | null = null\n styles: StyleInfo[] = []\n private history: Entry[] = []\n private future: Entry[] = []\n private pend: { s: Partial<RunStyle>; d: RunSet; at: { pa: string; o: number } } | null = null\n /** next id for new paragraphs / tables (a collaboration session gives each client its own range) */\n nextPid = 1_000_000_000\n private inflight = 0\n onState?: (s: FormatState | null) => void\n /** image selection changed (overlay with resize handles) */\n onImage?: (img: FormatState['img'] | null) => void\n /** style list changed (a built-in style was added to the document) */\n onStyles?: (styles: StyleInfo[]) => void\n shortcut?: (e: KeyboardEvent) => boolean\n onDirty?: () => void\n /** paint format: run formatting copied from the caret, applied to the next selection */\n painter: RunSet | null = null\n onPainter?: (on: boolean) => void\n /** every model change, after it was mirrored to the worker (collaboration hook) */\n onCommit?: (c: DocxCommit) => void\n\n constructor(\n private client: DocumentClient,\n private st: DocState,\n private changed: () => void,\n ) {\n this.input = new RichInput(this)\n }\n\n // ---------------------------------------------------------------- addressing\n\n private container(pa: string): { list: Block[]; at: number; cell?: [number, number, number] } | undefined {\n const p = path(pa)\n if (p.length === 1) return { list: this.st.blocks, at: p[0] }\n const t = this.st.blocks[p[0]]\n if (t?.t !== 'tbl') return undefined\n const cell = t.rows[p[1]]?.cells[p[2]]\n return cell ? { list: cell.blocks, at: p[3], cell: [p[0], p[1], p[2]] } : undefined\n }\n\n para(pa: string): Paragraph | undefined {\n const c = this.container(pa)\n const b = c?.list[c.at]\n return b && b.t === 'p' && b.pid !== undefined && !b.ro ? b : undefined\n }\n\n span(a: string, b: string): string[] | null {\n const pa = path(a)\n const pb = path(b)\n if (pa.length !== pb.length || pa.slice(0, -1).join('.') !== pb.slice(0, -1).join('.')) return null\n const out: string[] = []\n for (let i = pa[pa.length - 1]; i <= pb[pb.length - 1]; i++) {\n const addr = shiftPa(a, i - pa[pa.length - 1])\n if (!this.para(addr)) return null\n out.push(addr)\n }\n return out\n }\n\n prev(pa: string) {\n const at = path(pa).pop()!\n const q = shiftPa(pa, -1)\n return at > 0 && this.para(q) ? q : undefined\n }\n\n next(pa: string) {\n const q = shiftPa(pa, 1)\n return this.para(q) ? q : undefined\n }\n\n cmp(a: string, b: string): number {\n const x = path(a)\n const y = path(b)\n for (let i = 0; i < Math.min(x.length, y.length); i++) if (x[i] !== y[i]) return x[i] - y[i]\n return x.length - y.length\n }\n\n // ---------------------------------------------------------------- paragraph factories\n\n withRuns(p: Paragraph, runs: RRun[]): Paragraph {\n return { ...p, runs: runs as Inline[], edited: true }\n }\n\n private origOf(p: Paragraph): number[] {\n return p.orig ?? (p.pid === (p.from ?? p.pid) ? [p.pid!] : [])\n }\n\n defaultRun(p: Paragraph): Partial<RRun> | undefined {\n if (p.caret) return { ...(p.caret as RRun), text: '' }\n const last = [...p.runs].reverse().find((r) => r.t === 'text') as RRun | undefined\n if (last) return { ...last, text: '' }\n return { t: 'text', s: { sz: p.markSz, font: p.markFont } } as Partial<RRun>\n }\n\n split(p: Paragraph, left: RRun[], right: RRun[], atEnd: boolean): [Paragraph, Paragraph] {\n const keep = p.keepSect ?? p.pid === (p.from ?? p.pid)\n const a: Paragraph = { ...p, runs: left as Inline[], edited: true, keepSect: false }\n const b: Paragraph = {\n ...p,\n runs: right as Inline[],\n pid: this.nextPid++,\n from: p.from ?? p.pid,\n orig: [],\n edited: true,\n keepSect: keep,\n pb: false,\n ver: 0,\n caret: right.length ? undefined : ((runAt(left, plen(left)) as Inline | undefined) ?? p.caret),\n }\n if (atEnd) {\n const next = this.styles.find((s) => s.id === p.sid)?.next\n if (next && next !== p.sid) {\n b.pd = { ...(b.pd ?? {}), style: next }\n b.sid = next\n }\n }\n return [a, b]\n }\n\n join(a: Paragraph, b: Paragraph, runs: RRun[]): Paragraph {\n return { ...a, runs: runs as Inline[], edited: true, orig: [...this.origOf(a), ...this.origOf(b)], keepSect: (a.keepSect ?? a.pid === (a.from ?? a.pid)) || (b.keepSect ?? b.pid === (b.from ?? b.pid)) }\n }\n\n // ---------------------------------------------------------------- mutation core\n\n private splice(pa: string, count: number, next: Block[]): Block[] {\n const c = this.container(pa)!\n if (!c.cell) {\n this.st.blocks.splice(c.at, count, ...next)\n return this.st.blocks\n }\n const [bi, ri, ci] = c.cell\n const t = this.st.blocks[bi] as Table\n const blocks = [...c.list]\n blocks.splice(c.at, count, ...next)\n const nt: Table = { ...t, rows: t.rows.map((r, i) => (i !== ri ? r : { ...r, cells: r.cells.map((cell, j) => (j !== ci ? cell : { ...cell, blocks })) })) }\n this.st.heights.set(nt, this.st.heights.get(t) ?? 0)\n this.st.dirty.add(nt)\n this.st.blocks[bi] = nt\n return blocks\n }\n\n replace(pas: string[], next: Paragraph[], sel: Sel, opts: ReplaceOpts & { history?: boolean; want?: boolean } = {}): void {\n const before = pas.map((pa) => this.para(pa)!)\n if (before.some((b) => !b)) return\n if (opts.remount) next = next.map((p) => ({ ...p, ver: (p.ver ?? 0) + 1 }))\n const c = this.container(pas[0])!\n const at = c.at\n const list = this.splice(pas[0], pas.length, next)\n // split paragraphs: trailing page-break parts follow the paragraph that now ends the range\n const lastB = before[before.length - 1]\n const lastN = next[next.length - 1]\n if (lastN && lastB.pid !== lastN.pid) {\n for (let k = at + next.length; k < list.length; k++) {\n const b = list[k]\n if (b.t !== 'p' || b.pid !== lastB.pid || !b.pb) break\n list[k] = { ...b, pid: lastN.pid, from: lastN.from ?? lastN.pid, edited: true }\n }\n }\n // heights: estimate from what was there, remeasure soon\n if (!c.cell) {\n next.forEach((p, i) => {\n this.st.heights.set(p, this.st.heights.get(before[i] ?? before[0]) ?? 0)\n this.st.dirty.add(p)\n })\n for (const k of [at - 1, at + next.length]) if (list[k]) this.st.dirty.add(list[k])\n if (at < this.st.frontier) this.st.frontier = Math.max(0, this.st.frontier + next.length - pas.length)\n }\n if (opts.history !== false) {\n const now = Date.now()\n const last = this.history[this.history.length - 1]\n const label = opts.label ?? 'edit'\n const selBefore = this.input.lastSel ?? sel\n if (label === 'type' && last?.label === 'type' && pas.length === 1 && next.length === 1 && last.after.length === 1 && last.pas[0] === pas[0] && now - last.t < 1500) {\n last.after = next\n last.selAfter = sel\n last.t = now\n } else {\n this.history.push({ pas, before, after: next, selBefore, selAfter: sel, label, t: now })\n if (this.history.length > 500) this.history.shift()\n }\n this.future = []\n }\n this.commit(pas[0], before, next, opts.want)\n this.onCommit?.({ kind: 'paras', before, next })\n this.pendingSel = sel\n this.onDirty?.()\n this.changed()\n // the caret may not move (formatting): refresh the toolbar from the new runs\n this.emitState(sel)\n }\n\n /** contiguous blocks sharing `pid` around index `near` */\n private partsOf(list: Block[], pid: number, near: number): Paragraph[] {\n let i = near\n while (i > 0 && (list[i - 1] as Paragraph).pid === pid && list[i - 1].t === 'p') i--\n const out: Paragraph[] = []\n for (; i < list.length && list[i].t === 'p' && (list[i] as Paragraph).pid === pid; i++) out.push(list[i] as Paragraph)\n return out\n }\n\n private commit(pa: string, before: Paragraph[], next: Paragraph[], want?: boolean) {\n const c = this.container(pa)!\n if (c.cell && (this.st.blocks[c.cell[0]] as Table).tid !== undefined) {\n this.commitTable(c.cell[0])\n return\n }\n const list = c.list\n const pids: number[] = []\n next.forEach((p) => p.pid !== undefined && !pids.includes(p.pid) && pids.push(p.pid))\n const specs = pids.map((pid) => {\n const idx = c.at + next.findIndex((p) => p.pid === pid)\n return paraSpec(this.partsOf(list, pid, idx))\n })\n const remove: number[] = []\n for (const b of before) {\n if (b.pid === undefined || pids.includes(b.pid) || remove.includes(b.pid)) continue\n const still = list.findIndex((x) => x.t === 'p' && (x as Paragraph).pid === b.pid)\n if (still >= 0) specs.push(paraSpec(this.partsOf(list, b.pid, still)))\n else remove.push(b.pid)\n }\n const anchor = before[0].pid!\n const structural = want || next.some((p) => p.pd !== before.find((b) => b.pid === p.pid)?.pd)\n const sent = new Set<Paragraph>(next)\n const op: EditOp = { anchor, list: specs, remove, want: structural }\n this.inflight++\n this.client\n .call('docx.edit', op)\n .then((res) => this.applyResult(res, sent))\n .catch((e) => console.error('[office-engine] edit failed', e))\n .finally(() => this.inflight--)\n }\n\n get busy() {\n return this.inflight > 0\n }\n\n private locate(pid: number): { list: Block[]; index: number; pa: string }[] {\n const out: { list: Block[]; index: number; pa: string }[] = []\n this.st.blocks.forEach((b, bi) => {\n if (b.t === 'p' && b.pid === pid) out.push({ list: this.st.blocks, index: bi, pa: String(bi) })\n else if (b.t === 'tbl')\n b.rows.forEach((r, ri) =>\n r.cells.forEach((cell, ci) =>\n cell.blocks.forEach((x, pi) => {\n if (x.t === 'p' && x.pid === pid) out.push({ list: cell.blocks, index: pi, pa: `${bi}.${ri}.${ci}.${pi}` })\n }),\n ),\n )\n })\n return out\n }\n\n private put(pa: string, p: Paragraph) {\n const c = this.container(pa)\n if (!c) return\n const old = c.list[c.at]\n this.splice(pa, 1, [p])\n if (!c.cell) {\n this.st.heights.set(p, this.st.heights.get(old) ?? 0)\n this.st.dirty.add(p)\n }\n }\n\n private applyResult(res: EditResult, sent: Set<Paragraph>) {\n if (this.input.isComposing) return\n let touched = false\n // re-converted paragraphs (style / list changes): only if not edited again meanwhile\n for (const [k, blocks] of Object.entries(res.blocks)) {\n const locs = this.locate(Number(k))\n const paras = blocks.filter((b): b is Paragraph => b.t === 'p')\n if (!locs.length || paras.length !== locs.length) continue\n if (!locs.every((l) => sent.has(l.list[l.index] as Paragraph))) continue\n locs.forEach((l, i) => {\n const cur = l.list[l.index] as Paragraph\n this.put(l.pa, { ...paras[i], from: cur.from, orig: cur.orig, pd: cur.pd, edited: cur.edited, keepSect: cur.keepSect, ver: cur.ver, pb: cur.pb })\n })\n touched = true\n }\n // list numbering changes anywhere in the document\n for (const [k, m] of Object.entries(res.markers)) {\n for (const loc of this.locate(Number(k))) {\n const p = loc.list[loc.index] as Paragraph\n if ((loc.list[loc.index - 1] as Paragraph | undefined)?.pid === p.pid) continue\n this.put(loc.pa, { ...p, marker: m ? { text: m.text, s: m.s, tab: m.tab } : undefined, lst: m?.lst })\n touched = true\n }\n }\n if (touched) this.changed()\n }\n\n // ---------------------------------------------------------------- history\n\n /** current address of the first block of `list` (paragraphs by pid, tables by identity), `empty` for an empty list; undefined when gone */\n private whereNow(list: Block[], empty: string): string | undefined {\n const b = list[0]\n if (!b) return empty\n if (b.t === 'p') return b.pid !== undefined ? this.locate(b.pid)[0]?.pa : undefined\n if (b.t === 'tbl') {\n const i = this.st.blocks.findIndex((x) => x.t === 'tbl' && ((b.tid !== undefined && x.tid === b.tid) || (b.item !== undefined && x.item === b.item)))\n return i >= 0 ? String(i) : undefined\n }\n return empty\n }\n\n /** table undo / redo: paragraphs still in place keep their current text (edited since, maybe by collaborators) */\n private keepCurrent(list: Block[], bi: number, count: number): Block[] {\n const cur = new Map(this.st.blocks.slice(bi, bi + count).flatMap((b) => (b.t === 'p' && b.pid !== undefined ? [[b.pid, b] as const] : [])))\n return list.map((b) => (b.t === 'p' && b.pid !== undefined && cur.has(b.pid) ? cur.get(b.pid)! : b))\n }\n\n undo() {\n const e = this.history.pop()\n if (!e) return\n if (e.blocks) {\n const bi = this.whereNow(e.blocks.after, String(e.blocks.bi))\n // the blocks were removed by a collaborator: nothing left to undo\n if (bi === undefined) return\n this.replaceBlocks(Number(bi), e.blocks.after.length, this.keepCurrent(e.blocks.before, Number(bi), e.blocks.after.length), e.selBefore, false)\n this.future.push(e)\n return\n }\n const at = this.whereNow(e.after, e.pas[0])\n if (at === undefined) return\n const pasAfter = e.after.map((_, i) => shiftPa(at, i))\n // a collaborator changed these paragraphs' structure meanwhile: drop the entry\n if (pasAfter.some((pa, i) => this.para(pa)?.pid !== e.after[i].pid)) return\n this.replace(pasAfter.length ? pasAfter : [at], e.before, moveSel(e.selBefore, e.pas[0], at), { history: false, label: 'undo', want: true })\n this.future.push(e)\n }\n\n redo() {\n const e = this.future.pop()\n if (!e) return\n if (e.blocks) {\n const bi = this.whereNow(e.blocks.before, String(e.blocks.bi))\n if (bi === undefined) return\n this.replaceBlocks(Number(bi), e.blocks.before.length, this.keepCurrent(e.blocks.after, Number(bi), e.blocks.before.length), e.selAfter, false)\n this.history.push(e)\n return\n }\n const at = this.whereNow(e.before, e.pas[0])\n if (at === undefined) return\n const pasNow = e.before.map((_, i) => shiftPa(at, i))\n if (pasNow.some((pa, i) => this.para(pa)?.pid !== e.before[i].pid)) return\n this.replace(pasNow, e.after, moveSel(e.selAfter, e.pas[0], at), { history: false, label: 'redo', want: true })\n this.history.push(e)\n }\n\n get canUndo() {\n return this.history.length > 0\n }\n get canRedo() {\n return this.future.length > 0\n }\n\n // ---------------------------------------------------------------- formatting\n\n pendingStyle(): Partial<RRun> | undefined {\n return this.pend ? ({ s: this.pend.s, d: this.pend.d } as Partial<RRun>) : undefined\n }\n\n clearPending() {\n this.pend = null\n }\n\n private selectedParas(sel: Sel): { pas: string[]; s: { pa: string; o: number }; e: { pa: string; o: number } } | null {\n const [s, e] = ordered(this, sel)\n const pas = s.pa === e.pa ? (this.para(s.pa) ? [s.pa] : null) : this.span(s.pa, e.pa)\n return pas ? { pas, s, e } : null\n }\n\n format(s: Partial<RunStyle>, d: RunSet, opts: { want?: boolean } = {}) {\n const sel = this.input.sel()\n if (!sel) return\n if (collapsed(sel)) {\n this.pend = { s: { ...(this.pend?.s ?? {}), ...s }, d: { ...(this.pend?.d ?? {}), ...d }, at: sel.a }\n this.input.restore(sel)\n this.emitState(sel)\n return\n }\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa, i) => {\n const p = this.para(pa)!\n const a = i === 0 ? r.s.o : 0\n const b = i === r.pas.length - 1 ? r.e.o : plen(p.runs as RRun[])\n return this.withRuns(p, formatRange(p.runs as RRun[], a, b, s, d))\n })\n this.replace(r.pas, next, sel, { label: 'format', want: opts.want })\n }\n\n toggle(key: 'b' | 'i' | 'u' | 'strike') {\n const st = this.state()\n const on = !(st && st[key])\n if (key === 'u') this.format({ u: on ? 'single' : 'none' }, { u: on ? 'single' : 'none' })\n else this.format({ [key]: on }, { [key]: on })\n }\n\n setFont(name: string) {\n this.format({ font: cssFont(name) }, { font: name })\n }\n\n setSize(sz: number) {\n this.format({ sz }, { sz })\n }\n\n setColor(c: string | null) {\n this.format({ color: c ?? undefined }, { color: c })\n }\n\n setHighlight(c: string | null) {\n this.format({ hl: c ?? undefined, shd: undefined }, { hl: c })\n }\n\n clearFormat() {\n this.format({ b: false, i: false, u: 'none', strike: false, hl: undefined }, { b: false, i: false, u: 'none', strike: false, color: null, hl: null, va: null }, { want: true })\n }\n\n setPara(patch: ParaDirty, optimistic: Partial<ParaStyle> = {}, sel = this.input.sel()) {\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa) => {\n const p = this.para(pa)!\n const pd = { ...(p.pd ?? {}), ...patch }\n return { ...p, pd, ps: { ...p.ps, ...optimistic }, edited: true, sid: patch.style ?? p.sid }\n })\n this.replace(r.pas, next, sel, { label: 'para', want: true })\n }\n\n toggleList(kind: 'bullet' | 'number') {\n const sel = this.input.sel()\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const all = r.pas.every((pa) => this.para(pa)?.lst === kind)\n this.setPara({ list: all ? 'none' : kind, ilvl: all ? undefined : 0 }, {}, sel)\n }\n\n indent(dir: 1 | -1, sel = this.input.sel()) {\n if (!sel) return\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa) => {\n const p = this.para(pa)!\n const pd: ParaDirty = { ...(p.pd ?? {}) }\n if (p.lst) pd.ilvl = Math.max(0, Math.min(8, (p.ilvl ?? 0) + dir))\n else pd.indL = Math.max(0, (p.ps.indL ?? 0) + dir * 36)\n return { ...p, pd, ps: p.lst ? p.ps : { ...p.ps, indL: pd.indL }, edited: true }\n })\n this.replace(r.pas, next, sel, { label: 'para', want: true })\n }\n\n tab(sel: Sel, shift: boolean): boolean {\n if (sel.f.pa.includes('.')) {\n // move between table cells (Tab on the last cell adds a row)\n const [bi, ri, ci] = sel.f.pa.split('.').map(Number)\n const t = this.st.blocks[bi] as Table\n const cells = t.rows.flatMap((r, i) => r.cells.map((_, j) => [i, j] as [number, number]))\n const k = cells.findIndex(([i, j]) => i === ri && j === ci) + (shift ? -1 : 1)\n if (k >= cells.length && !shift) {\n this.tableOp('rowBelow')\n return true\n }\n const [nr, nc] = cells[Math.max(0, k)]\n const pa = `${bi}.${nr}.${nc}.0`\n const p = this.para(pa)\n this.input.restore({ a: { pa, o: 0 }, f: { pa, o: p ? plen(p.runs as RRun[]) : 0 } })\n return true\n }\n const p = this.para(sel.a.pa)\n if (!p?.lst) return false\n this.indent(shift ? -1 : 1, sel)\n return true\n }\n\n backspaceAtStart(pa: string, p: Paragraph): boolean {\n if (!p.lst) return false\n this.setPara({ list: 'none' }, {}, { a: { pa, o: 0 }, f: { pa, o: 0 } })\n return true\n }\n\n // ---------------------------------------------------------------- blocks (tables)\n\n /** content width (pt) of the page, for sizing new tables / images */\n contentW = 468\n /** document default font (CSS) / size, shown when a run inherits them */\n defaultFont?: string\n defaultSz?: number\n\n private prevParaPid(bi: number): number | undefined {\n for (let i = bi - 1; i >= 0; i--) {\n const b = this.st.blocks[i]\n if (b.t === 'p' && b.pid !== undefined) return b.pid\n }\n return undefined\n }\n\n private tableSpec(t: Table): TableSpec {\n return {\n tid: t.tid!,\n item: t.item,\n cols: t.cols,\n rows: t.rows.map((r) => ({\n src: r.src,\n cells: r.cells.map((c) => ({\n src: c.src,\n colSpan: c.colSpan,\n rowSpan: c.rowSpan,\n paras: c.blocks.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined).map((p) => paraSpec([p])),\n })),\n })),\n }\n }\n\n private commitTable(bi: number) {\n const t = this.st.blocks[bi] as Table\n if (t?.t !== 'tbl' || t.tid === undefined) return\n this.send('docx.table', { tid: t.tid, item: t.item, anchor: t.item === undefined ? this.prevParaPid(bi) : undefined, spec: this.tableSpec(t) })\n }\n\n private send(method: 'docx.table' | 'docx.edit', op: unknown) {\n this.inflight++\n ;(this.client.call as (m: string, ...a: unknown[]) => Promise<unknown>)(method, op)\n .then((res) => method === 'docx.edit' && this.applyResult(res as EditResult, new Set()))\n .catch((e) => console.error('[office-engine] edit failed', e))\n .finally(() => this.inflight--)\n }\n\n /** Replaces top-level blocks (table insert/delete/restructure) with history + write-back. */\n replaceBlocks(bi: number, count: number, next: Block[], sel: Sel | null, history = true) {\n const before = this.st.blocks.slice(bi, bi + count)\n this.st.blocks.splice(bi, count, ...next)\n next.forEach((b, i) => {\n this.st.heights.set(b, this.st.heights.get(before[i] ?? before[0]) ?? 0)\n this.st.dirty.add(b)\n })\n if (bi < this.st.frontier) this.st.frontier = Math.max(0, this.st.frontier + next.length - count)\n const key = (b: Block) => (b.t === 'tbl' ? `t${b.tid ?? 'i' + b.item}` : b.t === 'p' ? `p${b.pid}` : '')\n const nextKeys = new Set(next.map(key))\n const beforeKeys = new Set(before.map(key))\n // paragraphs that appear / disappear\n const anchorP = [...before, ...next].find((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && beforeKeys.has(key(b)) && nextKeys.has(key(b)))\n const added = next.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && !beforeKeys.has(key(b)))\n const removed = before.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined && !nextKeys.has(key(b)))\n // paragraphs kept but replaced by another version (undo, collaborators) must reach the worker too\n const beforeObj = new Map(before.map((b) => [key(b), b]))\n const changed = next.some((b) => b.t === 'p' && b.pid !== undefined && beforeObj.has(key(b)) && beforeObj.get(key(b)) !== b)\n if (anchorP && (added.length || removed.length || changed)) {\n const list = next.filter((b): b is Paragraph => b.t === 'p' && b.pid !== undefined)\n this.send('docx.edit', { anchor: anchorP.pid, list: list.map((p) => paraSpec([p])), remove: removed.map((p) => p.pid) } as EditOp)\n }\n for (const b of before) if (b.t === 'tbl' && !nextKeys.has(key(b)) && (b.tid !== undefined || b.item !== undefined)) this.send('docx.table', { tid: b.tid ?? -1, item: b.item, spec: null })\n next.forEach((b, i) => b.t === 'tbl' && b.tid !== undefined && this.commitTable(bi + i))\n this.onCommit?.({ kind: 'blocks', bi, before, next })\n if (history) {\n const s = sel ?? this.input.lastSel ?? { a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } }\n this.history.push({ pas: [], before: [], after: [], blocks: { bi, before, after: next }, selBefore: this.input.lastSel ?? s, selAfter: s, label: 'table', t: Date.now() })\n this.future = []\n }\n if (sel) this.pendingSel = sel\n this.onDirty?.()\n this.changed()\n }\n\n private emptyPara(tpl: Paragraph): Paragraph {\n return {\n t: 'p', ps: { ...tpl.ps, indFirst: undefined, indL: undefined }, runs: [], markSz: tpl.markSz, markFont: tpl.markFont,\n pid: this.nextPid++, from: tpl.from ?? tpl.pid, orig: [], edited: true, keepSect: false, pd: { style: '', list: 'none' }, sid: undefined,\n }\n }\n\n insertTable(rowsN: number, colsN: number) {\n const sel = this.input.sel()\n const bi = sel ? Number(sel.f.pa.split('.')[0]) : -1\n const p = this.st.blocks[bi]\n if (!sel || sel.f.pa.includes('.') || p?.t !== 'p' || p.pid === undefined) return\n const t: Table = { ...newTable(rowsN, colsN, this.contentW, () => this.emptyPara(p)), tid: this.nextPid++ }\n const after: Block[] = [p, t]\n const nextBlock = this.st.blocks[bi + 1]\n if (!nextBlock || nextBlock.t !== 'p') after.push(this.emptyPara(p))\n this.replaceBlocks(bi, 1, after, { a: { pa: `${bi + 1}.0.0.0`, o: 0 }, f: { pa: `${bi + 1}.0.0.0`, o: 0 } })\n }\n\n /** Structural table edit at the caret's cell. */\n tableOp(kind: 'rowAbove' | 'rowBelow' | 'colLeft' | 'colRight' | 'delRow' | 'delCol' | 'delTable') {\n const sel = this.input.sel()\n if (!sel || !sel.f.pa.includes('.')) return\n const [bi, ri, ci] = sel.f.pa.split('.').map(Number)\n const t = this.st.blocks[bi] as Table\n if (t?.t !== 'tbl') return\n const g = gridOf(t).cells.find((c) => c.ri === ri && c.ci === ci)?.g ?? 0\n const mk = (tpl: { blocks: Block[] }) => {\n const p = tpl.blocks.find((b): b is Paragraph => b.t === 'p') ?? (this.st.blocks.find((b) => b.t === 'p' && b.pid !== undefined) as Paragraph)\n return { ...this.emptyPara(p), pd: {}, ps: p.ps, sid: p.sid }\n }\n let next: Table | null = t\n let caret = `${bi}.${ri}.${ci}.0`\n switch (kind) {\n case 'rowAbove':\n next = insertRow(t, ri, false, mk)\n caret = `${bi}.${ri}.0.0`\n break\n case 'rowBelow':\n next = insertRow(t, ri, true, mk)\n caret = `${bi}.${ri + 1}.0.0`\n break\n case 'colLeft':\n next = insertCol(t, g, false, mk)\n break\n case 'colRight':\n next = insertCol(t, g, true, mk)\n caret = `${bi}.${ri}.${ci + 1}.0`\n break\n case 'delRow':\n next = deleteRow(t, ri)\n caret = `${bi}.${Math.max(0, Math.min(ri, (next?.rows.length ?? 1) - 1))}.0.0`\n break\n case 'delCol':\n next = deleteCol(t, g)\n caret = `${bi}.${ri}.${Math.max(0, ci - 1)}.0`\n break\n case 'delTable':\n next = null\n break\n }\n if (!next) {\n const after = this.st.blocks[bi + 1]\n this.replaceBlocks(bi, 1, [], after?.t === 'p' ? { a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } } : null)\n return\n }\n next = { ...next, tid: t.tid ?? this.nextPid++ }\n this.replaceBlocks(bi, 1, [next], { a: { pa: caret, o: 0 }, f: { pa: caret, o: 0 } })\n }\n\n // ---------------------------------------------------------------- inserts\n\n async insertImages(files: Blob[], at?: Sel) {\n const sel = at ?? this.input.sel()\n if (!sel) return\n const runs: Inline[] = []\n for (const f of files) {\n const ext = (f.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg').replace('jpeg', 'jpg')\n const { rid, path } = await this.client.call('docx.image', await f.arrayBuffer(), ext)\n const dims = await imageSize(f)\n const scale = Math.min(1, this.contentW / Math.max(1, dims.w * 0.75))\n runs.push({ t: 'img', target: path, w: +(dims.w * 0.75 * scale).toFixed(1), h: +(dims.h * 0.75 * scale).toFixed(1), rid })\n }\n opInsertRuns(this, sel, [runs as RRun[]], { label: 'image' })\n }\n\n async setLink(url: string | null) {\n const sel = this.input.sel()\n if (!sel) return\n if (!url) {\n this.patchRuns(sel, (r) => ({ ...r, href: undefined, lk: undefined }))\n return\n }\n const href = /^[a-z][\\w+.-]*:/i.test(url) || url.startsWith('#') ? url : 'https://' + url\n const lk = await this.client.call('docx.link', href)\n const style = { color: '#0563c1', u: 'single' }\n if (collapsed(sel)) {\n opInsertRuns(this, sel, [[{ t: 'text', text: url, href, lk, s: { ...(runAt(this.para(sel.a.pa)?.runs as RRun[] ?? [], sel.a.o)?.s ?? {}), ...style }, d: style } as RRun]], { label: 'link' })\n return\n }\n this.patchRuns(sel, (r) => ({ ...r, href, lk, s: { ...(r.s ?? {}), ...style }, d: { ...(r.d ?? {}), ...style } }))\n }\n\n /** applies `fn` to the text runs inside the selection */\n private patchRuns(sel: Sel, fn: (r: RRun) => RRun) {\n const r = this.selectedParas(sel)\n if (!r) return\n const next = r.pas.map((pa, i) => {\n const p = this.para(pa)!\n const a = i === 0 ? r.s.o : 0\n const b = i === r.pas.length - 1 ? r.e.o : plen(p.runs as RRun[])\n const [left, rest] = splitRuns(p.runs as RRun[], a)\n const [mid, right] = splitRuns(rest, b - a)\n return this.withRuns(p, [...left, ...mid.map((x) => (x.t === 'text' ? fn(x) : x)), ...right])\n })\n this.replace(r.pas, next, sel, { label: 'format' })\n }\n\n insertPageBreak() {\n const sel = this.input.sel()\n if (!sel) return\n const p = this.para(sel.f.pa)\n if (!p || sel.f.pa.includes('.')) return\n const [l, r] = splitRuns(p.runs as RRun[], sel.f.o)\n const [a, b] = this.split(p, l, r, false)\n const b2 = { ...b, pb: true, pd: { ...(b.pd ?? {}), pageBreak: true } }\n this.replace([sel.f.pa], [a, b2], { a: { pa: shiftPa(sel.f.pa, 1), o: 0 }, f: { pa: shiftPa(sel.f.pa, 1), o: 0 } }, { label: 'pagebreak', want: true })\n }\n\n /** scales the selected image (factor) or fits it to the page width */\n resizeImage(f: number | 'fit') {\n const sel = this.input.sel()\n if (!sel) return\n const [s] = ordered(this, sel)\n this.patchObjects(sel, (x) => {\n if (x.t !== 'img') return x\n const k = f === 'fit' ? this.contentW / x.w : f\n return { ...x, w: +(x.w * k).toFixed(1), h: +(x.h * k).toFixed(1), resized: true }\n })\n this.pendingSel = { a: s, f: { ...s, o: s.o + 1 } }\n }\n\n private patchObjects(sel: Sel, fn: (x: Inline) => Inline) {\n const [s, e] = ordered(this, sel)\n const p = this.para(s.pa)\n if (!p || s.pa !== e.pa) return\n const [left, rest] = splitRuns(p.runs as RRun[], s.o)\n const [mid, right] = splitRuns(rest, e.o - s.o)\n this.replace([s.pa], [this.withRuns(p, [...left, ...(mid as Inline[]).map(fn), ...right] as RRun[])], sel, { label: 'image' })\n }\n\n pasteRich(sel: Sel, data: DataTransfer): boolean {\n const files = Array.from(data.files ?? []).filter((f) => f.type.startsWith('image/'))\n if (files.length) {\n void this.insertImages(files, sel)\n return true\n }\n const html = data.getData('text/html')\n if (!html) return false\n const paras = htmlToParas(html)\n if (!paras.length) return false\n void (async () => {\n const links = new Map<string, string>()\n for (const p of paras) for (const r of p.runs) if (r.t === 'text' && r.href && !links.has(r.href)) links.set(r.href, await this.client.call('docx.link', r.href))\n const lines = paras.map((p) => p.runs.map((r) => (r.t === 'text' && r.href ? { ...r, lk: links.get(r.href) } : r)) as RRun[])\n const headingId = (n: number) => this.styles.find((s) => s.name.toLowerCase() === `heading ${n}`)?.id\n const props = paras.map((p) => {\n if (!p.heading && !p.list) return undefined\n return (q: Paragraph) => {\n const pd: ParaDirty = { ...(q.pd ?? {}) }\n const h = p.heading ? headingId(p.heading) : undefined\n if (h) pd.style = h\n if (p.list) pd.list = p.list\n return { ...q, pd, sid: h ?? q.sid, edited: true }\n }\n })\n opInsertRuns(this, sel, lines, { label: 'paste' }, props as unknown as ((p: RichParaLike) => RichParaLike)[])\n })()\n return true\n }\n\n // ---------------------------------------------------------------- styles\n\n /** applies a built-in style (Title, Heading 1…), creating it in the document when missing */\n async applyCanon(kind: CanonStyle) {\n const sel = this.input.sel()\n if (!sel) return\n let id = this.styles.find((s) => s.canon === kind)?.id\n if (!id) {\n const r = await this.client.call('docx.style', kind)\n this.styles = r.styles\n this.onStyles?.(r.styles)\n id = r.id\n }\n if (id) this.setPara({ style: id }, {}, sel)\n }\n\n // ---------------------------------------------------------------- images\n\n /** selects the inline object at (pa, o) */\n selectObject(pa: string, o: number) {\n const sel = { a: { pa, o }, f: { pa, o: o + 1 } }\n this.input.restore(sel)\n this.onSelection(sel)\n }\n\n private imageSel(): Sel | null {\n const sel = this.input.sel()\n const img = sel && this.state(sel)?.img\n return img ? { a: { pa: img.pa, o: img.o }, f: { pa: img.pa, o: img.o + 1 } } : null\n }\n\n private patchImage(fn: (x: Inline & { t: 'img' }) => Inline) {\n const sel = this.imageSel()\n if (!sel) return\n this.patchObjects(sel, (x) => (x.t === 'img' ? fn(x) : x))\n this.pendingSel = sel\n }\n\n /** exact size in pt */\n setImageSize(w: number, h: number) {\n this.patchImage((x) => ({ ...x, w: +Math.max(4, w).toFixed(1), h: +Math.max(4, h).toFixed(1), resized: true }))\n }\n\n /** natural pixel size of the picture → pt, limited to the text width */\n imageOriginal(nw: number, nh: number) {\n const k = Math.min(1, this.contentW / Math.max(1, nw * 0.75))\n this.setImageSize(nw * 0.75 * k, nh * 0.75 * k)\n }\n\n setAltText(alt: string) {\n this.patchImage((x) => ({ ...x, alt: alt || undefined, altSet: true }))\n }\n\n async replaceImage(file: Blob) {\n const sel = this.imageSel()\n if (!sel) return\n const ext = (file.type.split('/')[1] ?? 'png').replace('svg+xml', 'svg').replace('jpeg', 'jpg')\n const { rid, path } = await this.client.call('docx.image', await file.arrayBuffer(), ext)\n const dims = await imageSize(file)\n this.input.restore(sel)\n this.patchImage((x) => {\n // keep the current width, follow the new picture's proportions\n const h = +(x.w * (dims.h / Math.max(1, dims.w))).toFixed(1)\n return { ...x, target: path, rid, repl: !!x.src, h, resized: true }\n })\n }\n\n /** deletes the selection (or the selected object) */\n deleteSelection() {\n const sel = this.input.sel()\n if (sel && !collapsed(sel)) opInsert(this, sel, '')\n }\n\n insertText(text: string) {\n const sel = this.input.sel()\n if (sel) opInsert(this, sel, text)\n }\n\n // ---------------------------------------------------------------- paint format\n\n /** copies the caret's character formatting; the next selection receives it */\n copyFormat() {\n if (this.painter) {\n this.painter = null\n this.onPainter?.(false)\n return\n }\n const st = this.state()\n if (!st) return\n this.painter = {\n b: st.b,\n i: st.i,\n u: st.u ? 'single' : 'none',\n strike: st.strike,\n color: st.color ?? null,\n hl: st.hl ?? null,\n va: st.va ?? null,\n sz: st.sz,\n font: st.font ? (/^\\s*\"?([^\",]+)/.exec(st.font)?.[1] ?? st.font) : undefined,\n } as RunSet\n this.onPainter?.(true)\n }\n\n /** applies the copied formatting to the current selection (after the mouse is released) */\n applyPainter(): boolean {\n const set = this.painter\n const sel = this.input.readSel()\n if (!set || !sel || collapsed(sel)) return false\n this.painter = null\n this.onPainter?.(false)\n const s: Partial<RunStyle> = {}\n for (const [k, v] of Object.entries(set)) {\n if (k === 'font') (s as Record<string, unknown>).font = v ? cssFont(v as string) : undefined\n else if (k === 'u') (s as Record<string, unknown>).u = v\n else (s as Record<string, unknown>)[k] = v === null ? undefined : v\n }\n this.format(s, set)\n return true\n }\n\n // ---------------------------------------------------------------- toolbar state\n\n state(sel = this.input.sel()): FormatState | null {\n if (!sel) return null\n const [s] = ordered(this, sel)\n const p = this.para(s.pa)\n if (!p) return null\n const run = runAt(p.runs as RRun[], collapsed(sel) ? s.o : s.o + (plen(p.runs as RRun[]) > s.o ? 1 : 0)) as (Inline & { t: 'text' }) | undefined\n const rs: RunStyle = { ...(run?.s ?? {}), ...(collapsed(sel) ? this.pend?.s ?? {} : {}) }\n const [, e] = ordered(this, sel)\n let img: FormatState['img']\n if (s.pa === e.pa && e.o === s.o + 1) {\n const [, right] = splitRuns(p.runs as RRun[], s.o)\n const x = right[0] as Inline | undefined\n if (x?.t === 'img') img = { w: x.w, h: x.h, alt: x.alt, target: x.target, pa: s.pa, o: s.o }\n }\n return {\n line: p.pd?.line ?? (p.ps.lineRule === 'auto' || !p.ps.lineRule ? p.ps.line : undefined),\n va: rs.va,\n link: (run as { href?: string } | undefined)?.href,\n inTable: s.pa.includes('.'),\n img,\n b: !!rs.b,\n i: !!rs.i,\n u: !!rs.u && rs.u !== 'none',\n strike: !!rs.strike,\n color: rs.color,\n hl: rs.hl,\n sz: rs.sz ?? p.markSz ?? this.defaultSz,\n font: rs.font ?? p.markFont ?? this.defaultFont,\n align: p.ps.align ?? 'left',\n style: p.sid,\n lst: p.lst,\n canUndo: this.canUndo,\n canRedo: this.canRedo,\n }\n }\n\n private emitState(sel: Sel | null) {\n const st = sel ? this.state(sel) : null\n this.onState?.(st)\n this.onImage?.(st?.img ?? null)\n }\n\n onSelection(sel: Sel | null) {\n if (sel && this.pend && (sel.a.pa !== this.pend.at.pa || sel.a.o !== this.pend.at.o)) this.pend = null\n this.emitState(sel)\n }\n}\n\ntype RichParaLike = Parameters<NonNullable<Parameters<typeof opInsertRuns>[4]>[number]>[0]\n\nfunction imageSize(blob: Blob): Promise<{ w: number; h: number }> {\n return new Promise((resolve) => {\n const url = URL.createObjectURL(blob)\n const img = new Image()\n img.onload = () => {\n resolve({ w: img.naturalWidth || 300, h: img.naturalHeight || 200 })\n URL.revokeObjectURL(url)\n }\n img.onerror = () => {\n resolve({ w: 300, h: 200 })\n URL.revokeObjectURL(url)\n }\n img.src = url\n })\n}\n","import { useEffect, useState, type CSSProperties } from 'react'\nimport type { CanonStyle, StyleInfo } from '../../core/docx/types'\nimport { MOD } from '../common/ContextMenu'\nimport { EditorBar } from '../common/Slots'\nimport { Btn, ColorBtn, Dropdown, fontName, fontOptions, GridPicker, Menu, pickFiles, Pop, Select, Sep, SizeBox, type DropOption } from '../edit/Toolbar'\nimport type { DocxEditor, FormatState } from './DocxEditor'\n\nconst HIGHLIGHTS = ['#ffff00', '#00ff00', '#00ffff', '#ff00ff', '#0000ff', '#ff0000', '#000080', '#008080', '#008000', '#800080', '#800000', '#808000', '#808080', '#c0c0c0', '#000000']\n\nconst LINE_SPACING = [\n { value: 1, label: 'Single' },\n { value: 1.15, label: '1.15' },\n { value: 1.5, label: '1.5' },\n { value: 2, label: 'Double' },\n { value: 2.5, label: '2.5' },\n { value: 3, label: 'Triple' },\n]\n\n/** built-in styles always offered (created in the document on first use) */\nconst CANON: { k: CanonStyle; label: string; look: CSSProperties }[] = [\n { k: 'normal', label: 'Normal text', look: {} },\n { k: 'title', label: 'Title', look: { fontSize: 22 } },\n { k: 'subtitle', label: 'Subtitle', look: { fontSize: 15, color: '#5a5a5a' } },\n { k: 'h1', label: 'Heading 1', look: { fontSize: 18, color: '#2f5496' } },\n { k: 'h2', label: 'Heading 2', look: { fontSize: 16, color: '#2f5496' } },\n { k: 'h3', label: 'Heading 3', look: { fontSize: 14, color: '#1f3763' } },\n { k: 'h4', label: 'Heading 4', look: { fontSize: 13, color: '#2f5496', fontStyle: 'italic' } },\n { k: 'h5', label: 'Heading 5', look: { fontSize: 13, color: '#2f5496' } },\n { k: 'h6', label: 'Heading 6', look: { fontSize: 13, color: '#1f3763', fontStyle: 'italic' } },\n]\n\nconst SYMBOLS = [\n '©', '®', '™', '§', '¶', '†', '‡', '•', '…', '–', '—', '‰',\n '€', '£', '¥', '¢', '₫', '$', '°', '±', '×', '÷', '≈', '≠',\n '≤', '≥', '∞', '√', '∑', '∏', '∫', 'π', 'µ', 'Ω', 'α', 'β',\n '←', '→', '↑', '↓', '↔', '⇒', '✓', '✗', '★', '☆', '♥', '♦',\n '«', '»', '“', '”', '‘', '’', '¼', '½', '¾', '¹', '²', '³',\n]\n\n/** how a style looks in the picker (size clamped to fit the menu) */\nfunction stylePreview(s: StyleInfo | undefined): CSSProperties | undefined {\n const p = s?.preview\n if (!p) return undefined\n return {\n fontSize: p.sz ? Math.max(12, Math.min(22, p.sz)) : undefined,\n fontWeight: p.b ? 700 : undefined,\n fontStyle: p.i ? 'italic' : undefined,\n color: p.color && !/^#?f{6}$/i.test(p.color.replace('#', '')) ? p.color : undefined,\n fontFamily: p.font,\n lineHeight: 1.25,\n }\n}\n\nexport interface ImageActions {\n original: () => void\n replace: () => void\n alt: () => void\n /** 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: () => document.execCommand('selectAll') },\n )\n return items\n }\n\n // ---- outline ----\n const titleId = meta?.styles?.find((x) => x.canon === 'title')?.id\n const headings = useMemo(\n () => (outline ? outlineOf(st.blocks, titleId) : []),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [outline, version, titleId],\n )\n const topBlock = pages[Math.max(0, cur - 1)]?.start ?? 0\n const activeHeading = headings.reduce((acc, h, i) => (h.bi <= Math.max(topBlock, caretBi) ? i : acc), -1)\n const gotoBlock = (bi: number) => {\n const sc = scrollRef.current\n const pi = pages.findIndex((p) => bi >= p.start && bi < p.end)\n if (!sc || pi < 0) return\n sc.scrollTop = Math.max(0, tops[pi] - 16)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n const el = pagesRef.current?.querySelector(`[data-pa=\"${bi}\"]`)\n if (el) sc.scrollTop += el.getBoundingClientRect().top - sc.getBoundingClientRect().top - 24\n if (isEditing) editor.input.restore({ a: { pa: String(bi), o: 0 }, f: { pa: String(bi), o: 0 } })\n }),\n )\n }\n\n return (\n <div style={{ position: 'relative', flex: 1, minWidth: 0, display: 'flex' }}>\n <div\n ref={scrollRef}\n className=\"de-scroll\"\n tabIndex={-1}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'f') {\n e.preventDefault()\n setFind((f) => ({ ...f, open: true }))\n }\n }}\n >\n {meta && queue.length > 0 && (\n <div ref={measureRef} className=\"de-measure de-doc\" style={{ ...docStyle, width: `${contentW}pt` }}>\n {queue.map(({ b, i }) => (\n <BlockView key={i} block={b} ctx={measureCtx} sp={contextual(b, st.blocks[i - 1], st.blocks[i + 1])} />\n ))}\n </div>\n )}\n <div\n ref={pagesRef}\n className={isEditing ? 'de-pages de-editing' : 'de-pages'}\n style={{ height: totalH, width: totalW }}\n contentEditable={isEditing || undefined}\n suppressContentEditableWarning\n spellCheck={false}\n onMouseDown={(e) => {\n if (!isEditing) return\n // clicking a picture selects it (resize handles, image tools)\n const t = e.target as HTMLElement\n const obj = t.tagName === 'IMG' ? t.closest<HTMLElement>('[data-obj]') : null\n const pos = obj && pagesRef.current ? posFromDom(pagesRef.current, obj, 0) : null\n if (pos) {\n e.preventDefault()\n editor.selectObject(pos.pa, pos.o)\n }\n }}\n onMouseUp={() => {\n if (editor.painter) setTimeout(() => editor.applyPainter(), 0)\n }}\n onContextMenu={(e) => {\n if (!isEditing) return\n e.preventDefault()\n setCtxMenu({ x: e.clientX, y: e.clientY })\n }}\n >\n {pages.map((p, i) =>\n (i < first || i > last) && i !== caretPage ? null : (\n <PageView\n key={i}\n index={i}\n count={pageCount}\n slice={p}\n blocks={st.blocks}\n meta={meta}\n page={page}\n top={tops[i]}\n left={left}\n height={pageHeights[i]}\n zoom={z}\n client={client}\n docStyle={docStyle}\n editing={isEditing}\n />\n ),\n )}\n {skeleton > 0 && <div className=\"de-page-skeleton\" contentEditable={false} style={{ top: acc, left, width: pageW * z, height: pageH * z }} />}\n </div>\n {imgBox && (\n <div className=\"de-img-sel\" style={{ left: imgBox.x, top: imgBox.y, width: imgBox.w, height: imgBox.h }}>\n {HANDLES.map((d) => (\n <span key={d} className={`de-img-h de-img-${d}`} onMouseDown={(e) => startResize(d, e)} />\n ))}\n {resizeRatio.current && (\n <span className=\"de-img-size\">\n {Math.round(imgBox.w * resizeRatio.current)} × {Math.round(imgBox.h * resizeRatio.current)} pt\n </span>\n )}\n </div>\n )}\n </div>\n {outline && (\n <nav className=\"de-outline\" aria-label=\"Document outline\">\n <div className=\"de-outline-head\">\n <span>Outline</span>\n <button type=\"button\" className=\"de-tb\" title=\"Close outline\" aria-label=\"Close outline\" onClick={() => setOutline(false)}>\n ×\n </button>\n </div>\n {headings.length ? (\n headings.map((h, i) => (\n <button key={h.bi} type=\"button\" className={i === activeHeading ? 'de-outline-item on' : 'de-outline-item'} style={{ paddingLeft: 10 + h.lvl * 14 }} onClick={() => gotoBlock(h.bi)}>\n {h.text}\n </button>\n ))\n ) : (\n <div className=\"de-outline-empty\">Headings you add to the document will appear here.</div>\n )}\n </nav>\n )}\n {find.open && (\n <FindBar\n query={find.q}\n index={find.idx}\n count={matches.length}\n editable={isEditing}\n onQuery={(q) => setFind({ open: true, q, idx: 0 })}\n onNav={(d) => matches.length && gotoMatch((find.idx + d + matches.length) % matches.length)}\n onClose={() => setFind({ open: false, q: find.q, idx: 0 })}\n onReplace={(text, all) => {\n if (!matches.length) return\n if (all) [...matches].reverse().forEach((m) => replaceMatch(m, text))\n else replaceMatch(matches[Math.min(find.idx, matches.length - 1)], text)\n }}\n />\n )}\n {isEditing && (\n <DocxToolbar\n editor={editor}\n styles={meta?.styles ?? []}\n onFind={() => setFind((f) => ({ ...f, open: true }))}\n outline={outline}\n onOutline={() => setOutline((o) => !o)}\n painter={painter}\n onLink={askLink}\n image={imageActions}\n />\n )}\n {!isEditing && done && (\n <button type=\"button\" className={outline ? 'de-outline-toggle on' : 'de-outline-toggle'} title=\"Document outline\" onClick={() => setOutline((o) => !o)}>\n ☰\n </button>\n )}\n {ctxMenu && <ContextMenu x={ctxMenu.x} y={ctxMenu.y} items={ctxItems()} onClose={() => setCtxMenu(null)} />}\n {prompt && <PromptDialog spec={prompt} onClose={() => setPrompt(null)} />}\n {toast && <Toast text={toast} onDone={() => setToast(null)} />}\n <ZoomControl zoom={zoom} effective={z} onChange={setZoom} />\n <Status text={status} onStatus={onStatus} />\n </div>\n )\n}\n\ninterface PageViewProps {\n index: number\n count: number\n slice: PageSlice\n blocks: Block[]\n meta: DocxMeta | null\n page: PageSetup\n top: number\n left: number\n height: number\n zoom: number\n client: DocumentClient\n docStyle: CSSProperties\n editing: boolean\n}\n\nfunction PageView({ index, count, slice, blocks, meta, page, top, left, height, zoom, client, docStyle, editing }: PageViewProps) {\n const ctx = useMemo<RenderCtx>(() => ({ client, page: index, pages: count, measuring: false, editable: editing }), [client, index, count, editing])\n const hfCtx = useMemo<RenderCtx>(() => ({ ...ctx, editable: false }), [ctx])\n const first = index === 0 && meta?.titlePg\n const header = first ? meta?.firstHeader : meta?.header\n const footer = first ? meta?.firstFooter : meta?.footer\n const items = []\n for (let i = slice.start; i < slice.end; i++) {\n const b = blocks[i]\n items.push(\n <BlockView\n key={`${i}:${b.t === 'p' ? b.ver ?? 0 : 0}`}\n block={b}\n ctx={ctx}\n pa={editable(b) || b.t === 'tbl' ? String(i) : undefined}\n sp={contextual(b, blocks[i - 1], blocks[i + 1])}\n />,\n )\n }\n return (\n <div className=\"de-page\" style={{ top, left, width: page.w * PX * zoom, height }} data-page={index + 1}>\n <div className=\"de-page-inner de-doc\" style={{ ...docStyle, width: `${page.w}pt`, height: height / zoom, zoom }}>\n {header && (\n <div className=\"de-hf\" contentEditable={editing ? false : undefined} style={{ top: `${page.header}pt`, padding: `0 ${page.mr}pt 0 ${page.ml}pt` }}>\n {header.map((b, i) => (\n <BlockView key={i} block={b} ctx={hfCtx} />\n ))}\n </div>\n )}\n <div style={{ position: 'absolute', top: `${page.mt}pt`, left: `${page.ml}pt`, width: `${page.w - page.ml - page.mr}pt` }}>{items}</div>\n {footer && (\n <div className=\"de-hf\" contentEditable={editing ? false : undefined} style={{ bottom: `${page.footer}pt`, padding: `0 ${page.mr}pt 0 ${page.ml}pt` }}>\n {footer.map((b, i) => (\n <BlockView key={i} block={b} ctx={hfCtx} />\n ))}\n </div>\n )}\n </div>\n </div>\n )\n}\n","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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\"/g, '&quot;')\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, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\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 (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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"}