@particle-academy/last-word-ui 0.1.1 → 0.2.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 +1 @@
1
- {"version":3,"sources":["../src/footnotes.ts","../src/geometry.ts","../src/table-grid.ts","../src/measure.ts","../src/paginate.ts","../src/fields.ts","../src/image-size.ts","../src/links.ts","../src/style.ts","../src/render.tsx","../src/viewer-css.ts","../src/DocViewer.tsx","../src/from-reader.ts"],"names":["height","notes","h","finite","createContext","useContext","jsx","jsxs","Fragment","Text","Heading","Separator","ImageViewer","Table","useMemo","useRef","useState","useLayoutEffect","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Block, Doc, Footnote, ListItem, Run } from \"./types\";\n\nexport interface FootnoteNumbering {\n /** Run object -> its mark number. Keyed by identity, so the Doc must not be cloned between numbering and render. */\n marks: Map<Run, number>;\n /** Every footnote in mark order. */\n notes: Array<{ id: number; footnote: Footnote }>;\n}\n\n/**\n * Number the document's footnote marks 1, 2, 3 in reading order, as Word does\n * (last-word 0.15.0 carries no number in the model).\n *\n * Walks the BODY only. A footnote in a header or footer, or inside another\n * footnote, is something Word cannot hold and last-word's repairer drops; if\n * one arrives anyway it is not numbered and renders no mark.\n */\nexport function numberFootnotes(doc: Doc): FootnoteNumbering {\n const marks = new Map<Run, number>();\n const notes: FootnoteNumbering[\"notes\"] = [];\n\n const runs = (list: unknown): void => {\n if (!Array.isArray(list)) return;\n for (const run of list as Run[]) {\n const fn = run?.footnote;\n if (fn && typeof fn === \"object\" && Array.isArray(fn.blocks)) {\n const id = notes.length + 1;\n marks.set(run, id);\n notes.push({ id, footnote: fn });\n }\n }\n };\n const items = (list: unknown): void => {\n if (!Array.isArray(list)) return;\n for (const item of list as ListItem[]) {\n runs(item?.runs);\n items(item?.children);\n }\n };\n const blocks = (list: unknown): void => {\n if (!Array.isArray(list)) return;\n for (const block of list as Block[]) {\n switch (block?.type) {\n case \"heading\":\n case \"paragraph\":\n runs(block.runs);\n break;\n case \"list\":\n items(block.items);\n break;\n case \"quote\":\n blocks(block.blocks);\n break;\n case \"table\":\n for (const row of Array.isArray(block.rows) ? block.rows : []) {\n for (const cell of Array.isArray(row?.cells) ? row.cells : []) blocks(cell?.blocks);\n }\n break;\n default:\n break;\n }\n }\n };\n\n blocks(doc.blocks);\n return { marks, notes };\n}\n","import type { Doc, Orientation, PageSize } from \"./types\";\n\n/**\n * Paper sizes in points, portrait. A4 is 11906 x 16838 twips, which is what\n * every last-word writer emits and every reader matches against.\n */\nexport const PAGE_SIZES_PT: Record<PageSize, readonly [number, number]> = {\n letter: [612, 792],\n legal: [612, 1008],\n a4: [595.3, 841.9],\n};\n\n/** One inch a side, as every last-word writer emits unasked. */\nexport const PAGE_MARGIN_DEFAULT = 72;\n/** Half an inch from the page edge to the header and to the footer (Word's default). */\nexport const PAGE_BAND_DISTANCE_DEFAULT = 36;\n\n/** CSS pixels per point (96 dpi). */\nexport const PX_PER_PT = 96 / 72;\n\nexport interface ResolvedMargins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n /** Points from the top page edge to the top of the header. */\n header: number;\n /** Points from the bottom page edge to the bottom of the footer. */\n footer: number;\n}\n\nexport interface PageGeometry {\n size: PageSize;\n orientation: Orientation;\n /** Points, orientation applied. */\n width: number;\n height: number;\n margins: ResolvedMargins;\n /** The text column, in points. */\n contentWidth: number;\n}\n\nexport interface BodyBox {\n /** Points from the top page edge to the top of the body. */\n top: number;\n /** Points from the bottom page edge to the bottom of the body. */\n bottom: number;\n /** The body's height in points. */\n height: number;\n}\n\nconst finite = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\n\n/**\n * Every page margin and both header/footer distances, defaults filled in.\n *\n * This is the ONE place the defaults are applied, mirroring PHP last-word's\n * `Schema::pageMargins()` (0.15.0): a reader omits any value equal to its\n * default -- DocxReader drops a side of exactly 1440 twips -- so a missing\n * value means the default, never zero. `page.margins.header` / `.footer` are\n * the distances the reference leg added in 0.15.0; until the JS reader returns\n * them they are absent and resolve to Word's half inch.\n */\nexport function pageMargins(doc: Doc): ResolvedMargins {\n const m = (doc.page && typeof doc.page.margins === \"object\" && doc.page.margins) || {};\n const value = (key: keyof ResolvedMargins, fallback: number): number => {\n const v = (m as Record<string, unknown>)[key];\n return finite(v) ? v : fallback;\n };\n return {\n top: value(\"top\", PAGE_MARGIN_DEFAULT),\n right: value(\"right\", PAGE_MARGIN_DEFAULT),\n bottom: value(\"bottom\", PAGE_MARGIN_DEFAULT),\n left: value(\"left\", PAGE_MARGIN_DEFAULT),\n header: value(\"header\", PAGE_BAND_DISTANCE_DEFAULT),\n footer: value(\"footer\", PAGE_BAND_DISTANCE_DEFAULT),\n };\n}\n\n/** The page a Doc lays out on: paper, orientation, margins and text column. */\nexport function pageGeometry(doc: Doc): PageGeometry {\n const page = doc.page ?? {};\n const size: PageSize =\n typeof page.size === \"string\" && page.size in PAGE_SIZES_PT ? (page.size as PageSize) : \"letter\";\n const orientation: Orientation = page.orientation === \"landscape\" ? \"landscape\" : \"portrait\";\n const [w, h] = PAGE_SIZES_PT[size];\n const [width, height] = orientation === \"landscape\" ? [h, w] : [w, h];\n const margins = pageMargins(doc);\n return {\n size,\n orientation,\n width,\n height,\n margins,\n contentWidth: Math.max(1, width - margins.left - margins.right),\n };\n}\n\n/**\n * The body box once the header and footer have been measured (points).\n *\n * Word moves the body down when the header, set at its distance from the top\n * edge, is taller than the top margin leaves room for -- and up, for a footer.\n * A letterhead with a logo is the usual case.\n */\nexport function bodyBox(g: PageGeometry, headerHeight: number, footerHeight: number): BodyBox {\n const top = Math.max(g.margins.top, headerHeight > 0 ? g.margins.header + headerHeight : 0);\n const bottom = Math.max(g.margins.bottom, footerHeight > 0 ? g.margins.footer + footerHeight : 0);\n return { top, bottom, height: Math.max(1, g.height - top - bottom) };\n}\n","import type { TableRow } from \"./types\";\n\nexport interface GridCell {\n /** Row index. */\n row: number;\n /** Index of the cell within its row's `cells`. */\n cell: number;\n /** First grid column the cell occupies. */\n col: number;\n colSpan: number;\n /** Clamped to the rows that exist. */\n rowSpan: number;\n}\n\nexport interface TableGrid {\n colCount: number;\n rows: GridCell[][];\n /** True for a row a row span from above reaches into: no page break before it. */\n joinPrevious: boolean[];\n /** The leading run of `header: true` rows -- the rows Word repeats on each page. */\n headerRows: number;\n}\n\nconst span = (v: unknown): number => (typeof v === \"number\" && Number.isInteger(v) && v > 1 ? v : 1);\n\n/**\n * Where each cell sits on the column grid. Spans are HTML-style (the cell\n * appears once; the rows it covers list only their remaining cells), so a slot\n * a row span from above occupies is skipped when placing a row's cells.\n */\nexport function tableGrid(rows: TableRow[]): TableGrid {\n const occupied: Array<Set<number>> = rows.map(() => new Set<number>());\n const joinPrevious = rows.map(() => false);\n let colCount = 0;\n\n const out = rows.map((row, r) => {\n const placed: GridCell[] = [];\n let col = 0;\n (Array.isArray(row?.cells) ? row.cells : []).forEach((cell, c) => {\n while (occupied[r]!.has(col)) col++;\n const colSpan = span(cell?.colSpan);\n const rowSpan = Math.min(span(cell?.rowSpan), rows.length - r);\n for (let dr = 0; dr < rowSpan; dr++) {\n for (let dc = 0; dc < colSpan; dc++) occupied[r + dr]!.add(col + dc);\n if (dr > 0) joinPrevious[r + dr] = true;\n }\n placed.push({ row: r, cell: c, col, colSpan, rowSpan });\n col += colSpan;\n });\n return placed;\n });\n\n for (const set of occupied) for (const c of set) colCount = Math.max(colCount, c + 1);\n\n let headerRows = 0;\n while (headerRows < rows.length && rows[headerRows]?.header === true) headerRows++;\n\n return { colCount: Math.max(1, colCount), rows: out, joinPrevious, headerRows };\n}\n\n/**\n * Column widths as percentages of the table. The weights are relative and\n * apply only when there is one per column; otherwise the columns are equal --\n * the writer's own rule, so the preview matches the file.\n */\nexport function columnPercents(colCount: number, widths?: number[]): number[] {\n const n = Math.max(1, colCount);\n const even = Array.from({ length: n }, () => 100 / n);\n if (!Array.isArray(widths) || widths.length !== n) return even;\n const w = widths.map((x) => (typeof x === \"number\" && Number.isFinite(x) && x > 0 ? x : 0));\n const total = w.reduce((a, b) => a + b, 0);\n if (total <= 0) return even;\n return w.map((x) => Math.round((x / total) * 100 * 1e6) / 1e6);\n}\n","import { tableGrid } from \"./table-grid\";\nimport type { PackItem } from \"./paginate\";\nimport type { Block } from \"./types\";\n\n/**\n * DOM measurement: rendered blocks in, packer items out.\n *\n * Every block is rendered once into a hidden container at the page's text\n * width, with the same typography the pages use; this reads that container.\n * It is the only part of pagination that needs a browser, and it does nothing\n * but read rectangles -- every decision about where a page ends is made by the\n * pure `paginate()`.\n */\n\n/** Blocks whose text may be cut between lines. */\nconst SPLITTABLE = new Set([\"paragraph\", \"heading\", \"list\", \"quote\", \"code\"]);\n\nexport const blockId = (index: number): string => `b${index}`;\n\nfunction height(el: Element | null | undefined): number {\n return el ? el.getBoundingClientRect().height : 0;\n}\n\n/**\n * Offsets (from the element's top) of the bottom of every text line but the\n * last: the places a page may cut the block without slicing a line. Lines are\n * found by merging the vertical extents of every text fragment's client rects,\n * so a line holding mixed sizes is still one line, and a cut can only fall\n * where NO text crosses -- inside a quote holding a table, too.\n */\nexport function lineBreakpoints(el: HTMLElement): number[] {\n if (typeof document === \"undefined\" || typeof document.createRange !== \"function\") return [];\n const top = el.getBoundingClientRect().top;\n const total = el.getBoundingClientRect().height;\n const range = document.createRange();\n if (typeof range.getClientRects !== \"function\") return [];\n const spans: Array<[number, number]> = [];\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (!node.nodeValue) continue;\n range.selectNodeContents(node);\n for (const r of Array.from(range.getClientRects())) {\n if (r.height > 0) spans.push([r.top - top, r.bottom - top]);\n }\n }\n spans.sort((a, b) => a[0] - b[0]);\n const lines: Array<[number, number]> = [];\n for (const s of spans) {\n const last = lines[lines.length - 1];\n if (last && s[0] < last[1] - 0.5) last[1] = Math.max(last[1], s[1]);\n else lines.push([s[0], s[1]]);\n }\n return lines\n .slice(0, -1)\n .map((l) => l[1])\n .filter((b) => b > 0 && b < total - 0.5);\n}\n\nexport interface Measured {\n items: PackItem[];\n /** px */\n headerHeight: number;\n /** px */\n footerHeight: number;\n /** px */\n footnoteSeparator: number;\n}\n\n/**\n * Read the measuring container `root`. It holds `[data-lw-measure-block=i]`\n * per block, `[data-lw-measure-footnote=id]` per note, and the header, footer\n * and separator under their own `data-lw-measure-*` keys.\n */\nexport function measure(root: HTMLElement, blocks: Block[]): Measured {\n const noteHeights = new Map<number, number>();\n root.querySelectorAll<HTMLElement>(\"[data-lw-measure-footnote]\").forEach((el) => {\n noteHeights.set(Number(el.dataset.lwMeasureFootnote), height(el));\n });\n const marksIn = (el: Element) =>\n Array.from(el.querySelectorAll<HTMLElement>(\"[data-lw-footnote-ref]\")).map((m) => {\n const id = Number(m.dataset.lwFootnoteRef);\n return { id, el: m, height: noteHeights.get(id) ?? 0 };\n });\n\n const items: PackItem[] = blocks.map((block, i): PackItem => {\n if (block?.type === \"pageBreak\") return { type: \"break\" };\n const wrap = root.querySelector<HTMLElement>(`[data-lw-measure-block=\"${i}\"]`);\n if (!wrap) return { type: \"block\", id: blockId(i), height: 0 };\n\n if (block.type === \"table\") {\n const grid = tableGrid(Array.isArray(block.rows) ? block.rows : []);\n const rows = Array.from(wrap.querySelectorAll<HTMLElement>(\"tr[data-lw-row]\")).map((tr) => {\n const r = Number(tr.dataset.lwRow);\n const notes = marksIn(tr).map(({ id, height: h }) => ({ id, height: h }));\n return {\n height: height(tr),\n ...(grid.joinPrevious[r] ? { joinPrevious: true } : {}),\n ...(notes.length ? { footnotes: notes } : {}),\n };\n });\n return { type: \"table\", id: blockId(i), rows, headerRows: grid.headerRows };\n }\n\n const top = wrap.getBoundingClientRect().top;\n const h = height(wrap);\n let breakpoints = SPLITTABLE.has(block.type) ? lineBreakpoints(wrap) : [];\n // Widow and orphan control, as Word's default: never leave one line of a\n // paragraph alone at the foot or the head of a page.\n if (block.type === \"paragraph\" || block.type === \"heading\") breakpoints = breakpoints.slice(1, -1);\n // A mark belongs to the line it sits on: take its vertical centre, which\n // stays inside that line even though the superscript rises above it.\n const notes = marksIn(wrap).map(({ id, el, height: nh }) => {\n const r = el.getBoundingClientRect();\n return { id, at: Math.min(h, Math.max(0, (r.top + r.bottom) / 2 - top)), height: nh };\n });\n const keepNext = block.type === \"heading\" || (block as { keepNext?: unknown }).keepNext === true;\n return {\n type: \"block\",\n id: blockId(i),\n height: h,\n ...(breakpoints.length ? { breakpoints } : {}),\n ...(keepNext ? { keepNext: true } : {}),\n ...(notes.length ? { footnotes: notes } : {}),\n };\n });\n\n return {\n items,\n headerHeight: height(root.querySelector(\"[data-lw-measure-header]\")),\n footerHeight: height(root.querySelector(\"[data-lw-measure-footer]\")),\n footnoteSeparator: height(root.querySelector(\"[data-lw-measure-separator]\")),\n };\n}\n","/**\n * The page packer: measured heights in, page assignments out.\n *\n * Pure and deterministic -- no DOM, no React -- so every pagination rule is a\n * unit test rather than a screenshot. `measure.ts` turns rendered blocks into\n * these items; `DocViewer` renders the pages this returns. All lengths are in\n * one unit (the viewer uses CSS px); the packer never converts.\n *\n * What it splits, and where:\n * - a block with `breakpoints` (the bottoms of its text lines) at the deepest\n * breakpoint that fits -- paragraphs, headings, lists, quotes and code;\n * - a table between rows, repeating its leading header rows on every\n * continuation page, and never inside a row span (`joinPrevious`);\n * - anything else, only when it is taller than a whole page, by cutting it at\n * the page height (`forced: true`). A forced cut can fall through a line of\n * text or an image; it is the alternative to losing content, not a layout.\n * It never splits a table ROW: a row taller than a page is placed alone and\n * flagged `overflow`.\n */\n\n/** A footnote mark inside a block: `at` is its offset from the block's top. */\nexport interface FootnoteMark {\n id: number;\n at: number;\n /** The rendered height of the note itself. */\n height: number;\n}\n\nexport interface BlockItem {\n type: \"block\";\n id: string;\n height: number;\n /** Offsets from the block's top where a cut is allowed, ascending. */\n breakpoints?: number[];\n /** Keep on the same page as (the first piece of) the next item. */\n keepNext?: boolean;\n footnotes?: FootnoteMark[];\n}\n\nexport interface TableRowItem {\n height: number;\n /** A row span from above reaches this row: no break before it. */\n joinPrevious?: boolean;\n footnotes?: Array<{ id: number; height: number }>;\n}\n\nexport interface TableItem {\n type: \"table\";\n id: string;\n rows: TableRowItem[];\n /** How many leading rows are header rows (repeated on each page). */\n headerRows?: number;\n}\n\nexport interface BreakItem {\n type: \"break\";\n}\n\nexport type PackItem = BlockItem | TableItem | BreakItem;\n\nexport interface PackOptions {\n /** The body height available on every page. */\n pageHeight: number;\n /**\n * Height of the separator rule above a page's footnotes, reserved once on\n * any page that holds at least one note. 0 when absent.\n */\n footnoteSeparator?: number;\n}\n\nexport interface BlockFragment {\n type: \"block\";\n id: string;\n /** Index into the items array. */\n item: number;\n /** Offsets within the block: the window [start, end) shown on this page. */\n start: number;\n end: number;\n /** Cut at the page height because the block is taller than a page and had no breakpoint that fit. */\n forced?: boolean;\n}\n\nexport interface TableFragment {\n type: \"table\";\n id: string;\n item: number;\n /** Row indices to draw, header rows first. */\n rows: number[];\n /** True on a continuation page, where the header rows are a repeat. */\n repeatedHeader: boolean;\n /** A row taller than the page was placed anyway. */\n overflow?: boolean;\n}\n\nexport type Fragment = BlockFragment | TableFragment;\n\nexport interface PageLayout {\n /** 0-based. */\n index: number;\n fragments: Fragment[];\n /** Footnote ids whose marks are on this page, in order. */\n footnotes: number[];\n /** Body height used, footnotes and separator included. */\n used: number;\n}\n\nconst EPS = 1e-6;\n\nexport function paginate(items: PackItem[], options: PackOptions): PageLayout[] {\n const cap = Math.max(1, options.pageHeight);\n const sep = Math.max(0, options.footnoteSeparator ?? 0);\n const pages: PageLayout[] = [];\n\n // Current page state.\n let page!: PageLayout;\n let content = 0; // body content height placed (no notes)\n let noteHeights = 0; // sum of note heights on the page\n\n const newPage = (): void => {\n page = { index: pages.length, fragments: [], footnotes: [], used: 0 };\n pages.push(page);\n content = 0;\n noteHeights = 0;\n };\n const noteCost = (extraCount: number, extraHeight: number): number => {\n const count = page.footnotes.length + extraCount;\n return count > 0 ? noteHeights + extraHeight + sep : 0;\n };\n const fits = (h: number, notes: Array<{ height: number }>): boolean =>\n content + h + noteCost(notes.length, sum(notes)) <= cap + EPS;\n const commit = (h: number, notes: Array<{ id: number; height: number }>): void => {\n content += h;\n for (const n of notes) {\n page.footnotes.push(n.id);\n noteHeights += n.height;\n }\n page.used = content + noteCost(0, 0);\n };\n const empty = (): boolean => page.fragments.length === 0;\n\n newPage();\n\n items.forEach((item, index) => {\n if (item.type === \"break\") {\n newPage();\n return;\n }\n if (item.type === \"table\") {\n placeTable(item, index);\n return;\n }\n placeBlock(item, index);\n });\n\n return pages;\n\n function notesIn(item: BlockItem, start: number, end: number, last: boolean): FootnoteMark[] {\n // Clamped into the block: a superscript mark on the first line measures a\n // little ABOVE the block's top, and a mark must never fall between\n // fragments -- every note lands on exactly one page.\n const h = Math.max(0, item.height);\n return (item.footnotes ?? []).filter((n) => {\n const at = Math.min(h, Math.max(0, n.at));\n return at >= start - EPS && (last ? at <= end + EPS : at < end - EPS);\n });\n }\n\n /** Height of an item's first unbreakable piece -- what a keep-with-next needs on the page. */\n function firstPiece(item: PackItem | undefined): number {\n if (!item || item.type === \"break\") return 0;\n if (item.type === \"block\") {\n const bp = (item.breakpoints ?? []).find((b) => b > EPS && b < item.height - EPS);\n return bp ?? item.height;\n }\n const header = item.rows.slice(0, headerCount(item)).reduce((a, r) => a + r.height, 0);\n const units = tableUnits(item);\n return header + (units[0] ? units[0].height : 0);\n }\n\n function keepChainHeight(from: number): number {\n // Every keepNext block in the chain whole, then the first piece of the item after it.\n let total = 0;\n let i = from;\n while (i < items.length) {\n const it = items[i]!;\n if (it.type === \"block\" && it.keepNext) {\n total += it.height;\n i++;\n continue;\n }\n total += firstPiece(it);\n break;\n }\n return total;\n }\n\n function placeBlock(item: BlockItem, index: number): void {\n const height = Math.max(0, item.height);\n\n if (item.keepNext && !empty()) {\n const chain = keepChainHeight(index);\n const next = items[index + 1];\n const meaningful = next !== undefined && next.type !== \"break\";\n if (meaningful && chain <= cap + EPS && !fits(chain, notesIn(item, 0, height, true))) newPage();\n }\n\n let start = 0;\n for (let guard = 0; guard < 100000; guard++) {\n const restNotes = notesIn(item, start, height, true);\n if (fits(height - start, restNotes)) {\n page.fragments.push({ type: \"block\", id: item.id, item: index, start, end: height });\n commit(height - start, restNotes);\n return;\n }\n\n // The deepest breakpoint that fits, with the notes its fragment carries.\n const bps = (item.breakpoints ?? []).filter((b) => b > start + EPS && b < height - EPS).sort((a, b) => b - a);\n let cut: number | undefined;\n for (const bp of bps) {\n if (fits(bp - start, notesIn(item, start, bp, false))) {\n cut = bp;\n break;\n }\n }\n if (cut !== undefined) {\n page.fragments.push({ type: \"block\", id: item.id, item: index, start, end: cut });\n commit(cut - start, notesIn(item, start, cut, false));\n newPage();\n start = cut;\n continue;\n }\n\n if (!empty()) {\n newPage();\n continue;\n }\n\n // Alone on an empty page and still too tall: cut at what the page holds.\n let room = cap;\n let end = Math.min(height, start + room);\n let notes = notesIn(item, start, end, false);\n room = cap - noteCost(notes.length, sum(notes));\n if (room <= EPS) room = cap; // notes taller than a page: place them, the page overflows\n end = Math.min(height, start + room);\n notes = notesIn(item, start, end, end >= height - EPS);\n const forced = end < height - EPS;\n page.fragments.push({ type: \"block\", id: item.id, item: index, start, end, ...(forced ? { forced: true } : {}) });\n commit(end - start, notes);\n if (!forced) return;\n newPage();\n start = end;\n }\n }\n\n function headerCount(item: TableItem): number {\n return Math.max(0, Math.min(item.headerRows ?? 0, item.rows.length));\n }\n\n /** Body rows grouped so no group starts at a row a span reaches into. */\n function tableUnits(item: TableItem): Array<{ rows: number[]; height: number; notes: Array<{ id: number; height: number }> }> {\n const units: Array<{ rows: number[]; height: number; notes: Array<{ id: number; height: number }> }> = [];\n for (let r = headerCount(item); r < item.rows.length; r++) {\n const row = item.rows[r]!;\n const last = units[units.length - 1];\n if (row.joinPrevious && last) {\n last.rows.push(r);\n last.height += row.height;\n last.notes.push(...(row.footnotes ?? []));\n } else {\n units.push({ rows: [r], height: row.height, notes: [...(row.footnotes ?? [])] });\n }\n }\n return units;\n }\n\n function placeTable(item: TableItem, index: number): void {\n const h = headerCount(item);\n const headerIdx = Array.from({ length: h }, (_, i) => i);\n const headerHeight = item.rows.slice(0, h).reduce((a, r) => a + r.height, 0);\n const headerNotes = item.rows.slice(0, h).flatMap((r) => r.footnotes ?? []);\n const units = tableUnits(item);\n if (units.length === 0 && h === 0) return;\n if (units.length === 0) units.push({ rows: [], height: 0, notes: [] });\n\n let frag: TableFragment | null = null;\n let first = true;\n\n for (let u = 0; u < units.length; ) {\n const unit = units[u]!;\n if (frag === null) {\n // A fragment opens with the header rows: never a header alone at the foot.\n const notes = first ? [...headerNotes, ...unit.notes] : unit.notes;\n const need = headerHeight + unit.height;\n if (!fits(need, notes) && !empty()) {\n newPage();\n continue;\n }\n const overflow = !fits(need, notes);\n frag = {\n type: \"table\",\n id: item.id,\n item: index,\n rows: [...headerIdx, ...unit.rows],\n repeatedHeader: !first && h > 0,\n ...(overflow ? { overflow: true } : {}),\n };\n page.fragments.push(frag);\n commit(need, notes);\n first = false;\n u++;\n continue;\n }\n if (fits(unit.height, unit.notes)) {\n frag.rows.push(...unit.rows);\n commit(unit.height, unit.notes);\n u++;\n continue;\n }\n newPage();\n frag = null;\n }\n }\n}\n\nfunction sum(notes: Array<{ height: number }>): number {\n return notes.reduce((a, n) => a + n.height, 0);\n}\n","/** The live values a header or footer's `{page}` / `{pages}` fields take on one page. */\nexport interface PageFields {\n /** 1-based. */\n page: number;\n pages: number;\n}\n\nconst FIELD = /\\{page\\}|\\{pages\\}/g;\n\n/**\n * Text with `{page}` and `{pages}` replaced by this page's numbers -- the PAGE\n * and NUMPAGES fields last-word writes into a band. Only in bands: in the body\n * the same characters are literal text, as they are in the written file.\n */\nexport function substituteFields(text: string, fields: PageFields): string {\n return text.replace(FIELD, (m) => String(m === \"{page}\" ? fields.page : fields.pages));\n}\n","export interface Size {\n width: number;\n height: number;\n}\n\nconst DATA_URL = /^data:image\\/(png|jpe?g);base64,([A-Za-z0-9+/=\\s]+)$/i;\n\nfunction decodeHead(b64: string, bytes: number): Uint8Array | null {\n try {\n // Enough base64 for `bytes` bytes, rounded to a whole quantum.\n const take = Math.ceil(bytes / 3) * 4;\n const bin = atob(b64.replace(/\\s+/g, \"\").slice(0, take));\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n } catch {\n return null;\n }\n}\n\nfunction pngSize(b: Uint8Array): Size | null {\n if (b.length < 24 || b[0] !== 0x89 || b[1] !== 0x50 || b[2] !== 0x4e || b[3] !== 0x47) return null;\n const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);\n const width = dv.getUint32(16);\n const height = dv.getUint32(20);\n return width > 0 && height > 0 ? { width, height } : null;\n}\n\nfunction jpegSize(b: Uint8Array): Size | null {\n if (b.length < 4 || b[0] !== 0xff || b[1] !== 0xd8) return null;\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) return null;\n const marker = b[i + 1]!;\n const len = (b[i + 2]! << 8) | b[i + 3]!;\n // SOF0..SOF15, less DHT (C4), JPG (C8) and DAC (CC).\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n const height = (b[i + 5]! << 8) | b[i + 6]!;\n const width = (b[i + 7]! << 8) | b[i + 8]!;\n return width > 0 && height > 0 ? { width, height } : null;\n }\n i += 2 + len;\n }\n return null;\n}\n\n/**\n * The intrinsic pixel size of a PNG or JPEG data URL, read from its header, or\n * null. Read synchronously so a page can be laid out before the image decodes:\n * pagination must not change when an image finishes loading.\n */\nexport function imageSizeFromDataUrl(src: string): Size | null {\n const m = DATA_URL.exec(src);\n if (!m) return null;\n const isPng = m[1]!.toLowerCase() === \"png\";\n // A JPEG's SOF can sit behind EXIF; 64 KiB covers every real header.\n const head = decodeHead(m[2]!, isPng ? 32 : 65536);\n if (!head) return null;\n return isPng ? pngSize(head) : jpegSize(head);\n}\n\n/**\n * The size an image block is drawn at, in CSS px -- the writer's rules\n * (last-word `resolveImageSize`), capped at the text column instead of the\n * writer's fixed maximum so a narrow page does not overflow.\n */\nexport function resolveImageSize(\n block: { src: string; widthPx?: number; heightPx?: number },\n maxWidthPx: number,\n): Size {\n const intrinsic = imageSizeFromDataUrl(block.src);\n const given = (v: unknown): number | undefined => (typeof v === \"number\" && Number.isFinite(v) && v > 0 ? v : undefined);\n let width = given(block.widthPx);\n let height = given(block.heightPx);\n const aspect = intrinsic ? intrinsic.width / intrinsic.height : 1.5;\n\n if (width === undefined && height === undefined) {\n width = intrinsic?.width ?? 300;\n height = intrinsic?.height ?? 200;\n } else if (width === undefined) {\n width = height! * aspect;\n } else if (height === undefined) {\n height = width / aspect;\n }\n\n if (width! > maxWidthPx) {\n height = (height! * maxWidthPx) / width!;\n width = maxWidthPx;\n }\n return { width: Math.max(1, Math.round(width!)), height: Math.max(1, Math.round(height!)) };\n}\n","const ALLOWED = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\"]);\n\n/**\n * A run's `link`, or undefined when it is not safe to put in an href.\n *\n * A Doc is untrusted input -- it comes from a file somebody else wrote, or an\n * agent -- and this viewer renders it inside the host's origin, so a\n * `javascript:` link would be script in the host page. Only absolute http(s),\n * mailto and tel URLs, and in-document `#anchors`, are kept. The protocol is\n * read by the URL parser, not a regex, so case, leading spaces and embedded\n * tabs (which the parser strips, exactly as a browser would) cannot smuggle a\n * scheme past the check.\n */\nexport function safeHref(url: unknown): string | undefined {\n if (typeof url !== \"string\" || url === \"\") return undefined;\n if (/^#[^\\s]*$/.test(url)) return url;\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return undefined;\n }\n return ALLOWED.has(parsed.protocol) ? url : undefined;\n}\n","import type { CSSProperties } from \"react\";\nimport type { Border, BoxBorders, ParagraphProps } from \"./types\";\n\n/** A length in points, as CSS. The page is laid out in pt so it matches the file 1:1. */\nexport const pt = (n: number): string => `${Math.round(n * 1000) / 1000}pt`;\nexport const px = (n: number): string => `${Math.round(n * 1000) / 1000}px`;\n\n/**\n * Word's single line spacing for a body font is about 1.17 of its size; a\n * last-word `lineHeight` is a multiple of that. 259/240 is the writer's\n * default (\"1.08 auto\").\n */\nexport const SINGLE_LINE = 1.17;\nexport const DEFAULT_LINE_MULTIPLE = 259 / 240;\n/** The writer's paragraph spacing after, unasked: 160 twips. */\nexport const DEFAULT_SPACE_AFTER = 8;\nexport const DEFAULT_FONT = \"Calibri\";\nexport const DEFAULT_SIZE = 11;\nexport const HEADING_SIZES = [20, 16, 14, 13, 12, 11] as const;\nexport const HEADER_FILL = \"#E7E7E7\";\nexport const CODE_FILL = \"#F2F2F2\";\nexport const LINK_COLOR = \"#0563C1\";\nexport const QUOTE_COLOR = \"#595959\";\nexport const BAND_SIZE = 9;\nexport const BAND_COLOR = \"#6B7280\";\nexport const FOOTNOTE_SIZE = 10;\n/** The rule above a page's footnotes, and the space it takes. */\nexport const FOOTNOTE_SEPARATOR_PT = 12;\n\n/** #RRGGBB or undefined. Doc values are untrusted: only a hex colour reaches a style. */\nexport function hex(v: unknown): string | undefined {\n return typeof v === \"string\" && /^#[0-9a-fA-F]{6}$/.test(v) ? v : undefined;\n}\n\nconst finite = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\nexport const num = (v: unknown, fallback: number): number => (finite(v) ? v : fallback);\n\n/** Metric-compatible open fallbacks first, so line breaks match Word's as closely as possible. */\nconst FALLBACKS: Record<string, string> = {\n calibri: 'Carlito, \"Segoe UI\", Arial, sans-serif',\n cambria: 'Caladea, Georgia, serif',\n arial: '\"Liberation Sans\", Arimo, Helvetica, sans-serif',\n \"times new roman\": '\"Liberation Serif\", Tinos, Times, serif',\n \"courier new\": '\"Liberation Mono\", Cousine, monospace',\n consolas: '\"Liberation Mono\", Menlo, monospace',\n};\n\n/** A font-family stack. The name is untrusted, so it is reduced to safe characters and quoted. */\nexport function fontStack(name: unknown): string {\n const clean = typeof name === \"string\" ? name.replace(/[^A-Za-z0-9 _-]/g, \"\").trim() : \"\";\n const font = clean === \"\" ? DEFAULT_FONT : clean;\n const fallback = FALLBACKS[font.toLowerCase()] ?? 'Carlito, \"Segoe UI\", Arial, sans-serif';\n return `\"${font}\", ${fallback}`;\n}\n\nexport const MONO = fontStack(\"Consolas\");\n\nconst CSS_STYLE: Record<string, string> = {\n single: \"solid\",\n double: \"double\",\n dashed: \"dashed\",\n dotted: \"dotted\",\n};\n\n/** One border edge as CSS; `none`, absent or unknown draws nothing. */\nexport function borderCss(b: Border | undefined): string | undefined {\n if (!b || typeof b !== \"object\") return undefined;\n const style = CSS_STYLE[b.style ?? \"single\"];\n if (!style) return \"none\";\n // A double rule needs room for two lines and a gap to be visible at all.\n const width = Math.max(style === \"double\" ? 2.25 : 0.25, num(b.width, 0.5));\n return `${pt(width)} ${style} ${hex(b.color) ?? \"#000000\"}`;\n}\n\n/** The paragraph box: indents, alignment, shading, borders and line height. */\nexport function paragraphStyle(p: ParagraphProps, size: number): CSSProperties {\n const s: CSSProperties = {\n margin: 0,\n marginLeft: pt(num(p.indentLeft, 0)),\n marginRight: pt(num(p.indentRight, 0)),\n fontSize: pt(size),\n lineHeight: num(p.lineHeight, DEFAULT_LINE_MULTIPLE) * SINGLE_LINE,\n color: \"inherit\",\n fontWeight: \"inherit\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n };\n if (p.align === \"left\" || p.align === \"center\" || p.align === \"right\" || p.align === \"justify\") s.textAlign = p.align;\n const fill = hex(p.shading);\n if (fill) s.backgroundColor = fill;\n Object.assign(s, boxBorders(p.borders));\n return s;\n}\n\n/** Paragraph borders: the edge, plus a little padding so text does not touch the rule. */\nexport function boxBorders(b: BoxBorders | undefined): CSSProperties {\n if (!b || typeof b !== \"object\") return {};\n const s: CSSProperties = {};\n const top = borderCss(b.top);\n const right = borderCss(b.right);\n const bottom = borderCss(b.bottom);\n const left = borderCss(b.left);\n if (top) {\n s.borderTop = top;\n if (top !== \"none\") s.paddingTop = pt(1);\n }\n if (bottom) {\n s.borderBottom = bottom;\n if (bottom !== \"none\") s.paddingBottom = pt(1);\n }\n if (left) {\n s.borderLeft = left;\n if (left !== \"none\") s.paddingLeft = pt(4);\n }\n if (right) {\n s.borderRight = right;\n if (right !== \"none\") s.paddingRight = pt(4);\n }\n return s;\n}\n\n/** The space a paragraph-shaped block takes above and below its box. */\nexport function spacingStyle(p: ParagraphProps, defaultAfter: number, defaultBefore = 0): CSSProperties {\n return {\n display: \"flow-root\",\n paddingTop: pt(Math.max(0, num(p.spaceBefore, defaultBefore))),\n paddingBottom: pt(Math.max(0, num(p.spaceAfter, defaultAfter))),\n };\n}\n","import { createContext, useContext, type CSSProperties, type ReactNode } from \"react\";\nimport { Heading, ImageViewer, Separator, Table, Text } from \"@particle-academy/react-fancy\";\nimport { substituteFields, type PageFields } from \"./fields\";\nimport { resolveImageSize } from \"./image-size\";\nimport { safeHref } from \"./links\";\nimport { PX_PER_PT } from \"./geometry\";\nimport {\n BAND_COLOR,\n BAND_SIZE,\n CODE_FILL,\n DEFAULT_SPACE_AFTER,\n FOOTNOTE_SIZE,\n HEADER_FILL,\n HEADING_SIZES,\n LINK_COLOR,\n MONO,\n QUOTE_COLOR,\n SINGLE_LINE,\n borderCss,\n fontStack,\n hex,\n num,\n paragraphStyle,\n pt,\n spacingStyle,\n} from \"./style\";\nimport { columnPercents, tableGrid } from \"./table-grid\";\nimport type {\n Band,\n Block,\n BlocksBand,\n Border,\n BoxSides,\n ChartBlock,\n Footnote,\n ImageBlock,\n ListItem,\n Run,\n TableBlock,\n TableBorders,\n} from \"./types\";\n\n/** What a block needs from where it is drawn. */\nexport interface RenderContext {\n /** Footnote numbering for the body; empty in bands and in the notes themselves. */\n marks: Map<Run, number>;\n /** Set in headers and footers: `{page}` / `{pages}` become these numbers. */\n fields?: PageFields;\n /** Point size a paragraph inherits. */\n size: number;\n /** Space after a paragraph that does not say. */\n spaceAfter: number;\n /** Text column in points. */\n contentWidth: number;\n /** Runs draw bold (a table header row). */\n bold?: boolean;\n}\n\nconst EMPTY_MARKS = new Map<Run, number>();\nconst ZWSP = String.fromCharCode(0x200b);\n\nexport const RenderCtx = createContext<RenderContext>({\n marks: EMPTY_MARKS,\n size: 11,\n spaceAfter: DEFAULT_SPACE_AFTER,\n contentWidth: 468,\n});\n\nexport function WithContext({ value, children }: { value: Partial<RenderContext>; children: ReactNode }) {\n const parent = useContext(RenderCtx);\n return <RenderCtx.Provider value={{ ...parent, ...value }}>{children}</RenderCtx.Provider>;\n}\n\n// ── Runs ───────────────────────────────────────────────────────────────────\n\nfunction RunView({ run }: { run: Run }) {\n const ctx = useContext(RenderCtx);\n const mark = ctx.marks.get(run);\n let text = typeof run.text === \"string\" ? run.text : \"\";\n if (ctx.fields) text = substituteFields(text, ctx.fields);\n\n const s: CSSProperties = {};\n if (run.bold || ctx.bold) s.fontWeight = 700;\n if (run.italic) s.fontStyle = \"italic\";\n const deco = [run.underline ? \"underline\" : \"\", run.strike ? \"line-through\" : \"\"].filter(Boolean).join(\" \");\n if (run.smallCaps) s.fontVariant = \"small-caps\";\n if (typeof run.size === \"number\" && run.size > 0) s.fontSize = pt(run.size);\n if (typeof run.font === \"string\" && run.font !== \"\") s.fontFamily = fontStack(run.font);\n if (typeof run.letterSpacing === \"number\" && Number.isFinite(run.letterSpacing)) s.letterSpacing = pt(run.letterSpacing);\n if (run.code) {\n s.fontFamily = MONO;\n s.backgroundColor = CODE_FILL;\n }\n const highlight = hex(run.highlight);\n if (highlight) s.backgroundColor = highlight;\n const color = hex(run.color);\n if (color) s.color = color;\n\n const href = safeHref(run.link);\n let body: ReactNode = text;\n if (href) {\n body = (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: color ?? LINK_COLOR, textDecoration: \"underline\" }}\n >\n {text}\n </a>\n );\n } else if (deco) {\n s.textDecoration = deco;\n }\n if (href && deco.includes(\"line-through\")) s.textDecoration = \"line-through\";\n\n return (\n <>\n {text !== \"\" && <span style={s}>{body}</span>}\n {mark !== undefined && (\n <sup data-lw-footnote-ref={mark} style={{ fontSize: \"0.65em\", lineHeight: 0 }}>\n {mark}\n </sup>\n )}\n </>\n );\n}\n\nexport function Runs({ runs }: { runs: unknown }) {\n const list = Array.isArray(runs) ? (runs as Run[]) : [];\n const visible = list.some((r) => (typeof r?.text === \"string\" && r.text !== \"\") || r?.footnote);\n return (\n <>\n {list.map((run, i) => (run && typeof run === \"object\" ? <RunView key={i} run={run} /> : null))}\n {!visible && ZWSP}\n </>\n );\n}\n\n// ── Blocks ─────────────────────────────────────────────────────────────────\n\nexport function BlockView({ block }: { block: Block }) {\n const ctx = useContext(RenderCtx);\n switch (block?.type) {\n case \"paragraph\":\n return (\n <div data-lw-kind=\"paragraph\" style={spacingStyle(block, ctx.spaceAfter)}>\n <Text as=\"p\" style={paragraphStyle(block, ctx.size)}>\n <Runs runs={block.runs} />\n </Text>\n </div>\n );\n case \"heading\": {\n const level = [1, 2, 3, 4, 5, 6].includes(block.level) ? block.level : 1;\n const Tag = `h${level}` as \"h1\";\n return (\n <div data-lw-kind=\"heading\" style={spacingStyle(block, 6, 12)}>\n <Heading as={Tag} weight=\"bold\" style={{ ...paragraphStyle(block, HEADING_SIZES[level - 1]!), fontWeight: 700 }}>\n <Runs runs={block.runs} />\n </Heading>\n </div>\n );\n }\n case \"list\":\n return (\n <div data-lw-kind=\"list\" style={{ display: \"flow-root\" }}>\n <ListLevel items={block.items} ordered={block.ordered === true} />\n </div>\n );\n case \"table\":\n return <TableView block={block} />;\n case \"code\":\n return (\n <div data-lw-kind=\"code\" style={{ display: \"flow-root\" }}>\n <Text\n as=\"div\"\n style={{\n margin: 0,\n fontFamily: MONO,\n fontSize: pt(10),\n lineHeight: SINGLE_LINE,\n backgroundColor: CODE_FILL,\n color: \"inherit\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n }}\n >\n {typeof block.text === \"string\" && block.text !== \"\" ? block.text : ZWSP}\n </Text>\n </div>\n );\n case \"quote\":\n return (\n <div data-lw-kind=\"quote\" style={{ display: \"flow-root\", marginLeft: pt(36), fontStyle: \"italic\", color: QUOTE_COLOR }}>\n <WithContext value={{ contentWidth: ctx.contentWidth - 36 }}>\n {(Array.isArray(block.blocks) ? block.blocks : []).map((b, i) => (\n <BlockView key={i} block={b} />\n ))}\n </WithContext>\n </div>\n );\n case \"image\":\n return <ImageView block={block} />;\n case \"chart\":\n return <ChartPlaceholder block={block} />;\n case \"hr\":\n return (\n <div data-lw-kind=\"hr\" style={{ display: \"flow-root\", paddingBottom: pt(ctx.spaceAfter) }}>\n <div style={{ height: pt(ctx.size * SINGLE_LINE), display: \"flex\", alignItems: \"flex-end\" }}>\n <Separator className=\"w-full\" />\n </div>\n </div>\n );\n case \"pageBreak\":\n return null;\n default:\n return null;\n }\n}\n\nfunction ListLevel({ items, ordered }: { items: unknown; ordered: boolean }) {\n const ctx = useContext(RenderCtx);\n const list = Array.isArray(items) ? (items as ListItem[]) : [];\n const style: CSSProperties = {\n margin: 0,\n paddingLeft: pt(36),\n listStyleType: ordered ? \"decimal\" : \"disc\",\n fontSize: pt(ctx.size),\n };\n const children = list.map((item, i) => (\n <li key={i} style={{ paddingLeft: pt(0) }}>\n <div style={spacingStyle(item, ctx.spaceAfter)}>\n <Text as=\"div\" style={paragraphStyle({ ...item, indentLeft: 0 }, ctx.size)}>\n <Runs runs={item?.runs} />\n </Text>\n </div>\n {Array.isArray(item?.children) && item.children.length > 0 && <ListLevel items={item.children} ordered={ordered} />}\n </li>\n ));\n return ordered ? <ol style={style}>{children}</ol> : <ul style={style}>{children}</ul>;\n}\n\nconst IMAGE_SRC = /^data:image\\/(png|jpe?g|gif|webp|bmp);base64,/i;\n\nfunction ImageView({ block }: { block: ImageBlock }) {\n const ctx = useContext(RenderCtx);\n const maxPx = ctx.contentWidth * PX_PER_PT;\n const size = resolveImageSize({ src: String(block.src ?? \"\"), widthPx: block.widthPx, heightPx: block.heightPx }, maxPx);\n // Only an embedded image is drawn. A remote URL in an untrusted document is\n // a request the reader never agreed to make (a tracking pixel).\n const src = typeof block.src === \"string\" && IMAGE_SRC.test(block.src) ? block.src : null;\n return (\n <div data-lw-kind=\"image\" style={{ display: \"flow-root\", paddingBottom: pt(ctx.spaceAfter) }}>\n {src ? (\n <ImageViewer\n src={src}\n alt={typeof block.alt === \"string\" ? block.alt : \"\"}\n fit=\"contain\"\n zoomable={false}\n pannable={false}\n controls={false}\n checkerboard={false}\n className=\"rounded-none bg-transparent dark:bg-transparent\"\n style={{ width: size.width, height: size.height, background: \"transparent\", borderRadius: 0 }}\n />\n ) : (\n <div\n data-lw-image-missing=\"\"\n style={{ width: size.width, height: size.height, border: \"0.75pt dashed #9CA3AF\", color: \"#6B7280\", fontSize: pt(9), padding: pt(4), boxSizing: \"border-box\" }}\n >\n {typeof block.alt === \"string\" && block.alt !== \"\" ? block.alt : \"Image\"}\n </div>\n )}\n </div>\n );\n}\n\nfunction ChartPlaceholder({ block }: { block: ChartBlock }) {\n const ctx = useContext(RenderCtx);\n const maxPx = ctx.contentWidth * PX_PER_PT;\n const width = Math.min(\n maxPx,\n num(block.widthPx, typeof block.width === \"number\" && block.width > 0 ? (maxPx * Math.min(100, block.width)) / 100 : maxPx),\n );\n const height = num(block.heightPx, width * 0.6);\n const option = (block.option ?? {}) as { title?: unknown };\n const title =\n typeof option.title === \"string\"\n ? option.title\n : option.title && typeof (option.title as { text?: unknown }).text === \"string\"\n ? ((option.title as { text: string }).text)\n : typeof block.alt === \"string\"\n ? block.alt\n : \"\";\n return (\n <div data-lw-kind=\"chart\" style={{ display: \"flow-root\", paddingBottom: pt(ctx.spaceAfter) }}>\n <div\n data-lw-chart-placeholder=\"\"\n style={{\n width,\n height,\n border: \"0.75pt dashed #9CA3AF\",\n color: \"#6B7280\",\n fontSize: pt(9),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxSizing: \"border-box\",\n }}\n >\n {title ? `Chart: ${title}` : \"Chart\"}\n </div>\n </div>\n );\n}\n\n// ── Tables ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_TABLE_BORDER: Border = { style: \"single\", width: 0.5 };\nconst DEFAULT_CELL_PADDING = { top: 3, right: 5.4, bottom: 3, left: 5.4 };\n/** Word's own cell margins, for the sides a table's `cellPadding` leaves out. */\nconst WORD_CELL_PADDING = { top: 0, right: 5.4, bottom: 0, left: 5.4 };\n\nfunction sides(base: Required<BoxSides>, over: unknown): Required<BoxSides> {\n if (!over || typeof over !== \"object\") return base;\n const o = over as BoxSides;\n return {\n top: num(o.top, base.top),\n right: num(o.right, base.right),\n bottom: num(o.bottom, base.bottom),\n left: num(o.left, base.left),\n };\n}\n\n/**\n * A table, or the rows of it one page shows. `rows` lists the row indices to\n * draw (header rows first on a continuation page); absent means every row.\n */\nexport function TableView({ block, rows }: { block: TableBlock; rows?: number[] }) {\n const ctx = useContext(RenderCtx);\n const all = Array.isArray(block.rows) ? block.rows : [];\n const grid = tableGrid(all);\n const pct = columnPercents(grid.colCount, block.widths);\n const tb: TableBorders =\n block.borders && typeof block.borders === \"object\"\n ? block.borders\n : {\n top: DEFAULT_TABLE_BORDER,\n right: DEFAULT_TABLE_BORDER,\n bottom: DEFAULT_TABLE_BORDER,\n left: DEFAULT_TABLE_BORDER,\n insideH: DEFAULT_TABLE_BORDER,\n insideV: DEFAULT_TABLE_BORDER,\n };\n const basePad =\n block.cellPadding && typeof block.cellPadding === \"object\" ? sides(WORD_CELL_PADDING, block.cellPadding) : DEFAULT_CELL_PADDING;\n const widthPct = typeof block.width === \"number\" && block.width > 0 ? Math.min(100, block.width) : 100;\n const show = rows ?? all.map((_, i) => i);\n\n return (\n <div\n data-lw-kind=\"table\"\n style={{\n width: `${widthPct}%`,\n marginLeft: block.align === \"center\" || block.align === \"right\" ? \"auto\" : undefined,\n marginRight: block.align === \"center\" ? \"auto\" : undefined,\n }}\n >\n <Table data-lw-table=\"\" className=\"rounded-none border-0 overflow-visible\">\n <Table.Body className=\"divide-y-0\">\n <tr data-lw-sizer=\"\" aria-hidden=\"true\">\n {pct.map((p, i) => (\n <td key={i} style={{ width: `${p}%`, padding: 0, border: \"none\", height: 0 }} />\n ))}\n </tr>\n {show.map((r) => {\n const row = all[r];\n if (!row) return null;\n const header = row.header === true;\n return (\n <Table.Row key={r} data-lw-row={r} className=\"hover:bg-transparent dark:hover:bg-transparent\">\n {(grid.rows[r] ?? []).map((gc) => {\n const cell = row.cells[gc.cell]!;\n const cb = cell.borders && typeof cell.borders === \"object\" ? cell.borders : {};\n const edge = (own: Border | undefined, outer: Border | undefined, inner: Border | undefined, isOuter: boolean) =>\n borderCss(own ?? (isOuter ? outer : inner)) ?? \"none\";\n const pad = sides(basePad, cell.padding);\n const fill = hex(cell.shading) ?? (header ? HEADER_FILL : undefined);\n const style: CSSProperties = {\n borderTop: edge(cb.top, tb.top, tb.insideH, gc.row === 0),\n borderBottom: edge(cb.bottom, tb.bottom, tb.insideH, gc.row + gc.rowSpan >= all.length),\n borderLeft: edge(cb.left, tb.left, tb.insideV, gc.col === 0),\n borderRight: edge(cb.right, tb.right, tb.insideV, gc.col + gc.colSpan >= grid.colCount),\n padding: `${pt(pad.top)} ${pt(pad.right)} ${pt(pad.bottom)} ${pt(pad.left)}`,\n verticalAlign: cell.valign === \"center\" ? \"middle\" : cell.valign === \"bottom\" ? \"bottom\" : \"top\",\n backgroundColor: fill ?? \"transparent\",\n color: \"inherit\",\n fontSize: \"inherit\",\n fontWeight: \"inherit\",\n textAlign: \"left\",\n overflowWrap: \"break-word\",\n };\n return (\n <Table.Cell\n key={gc.cell}\n header={header}\n colSpan={gc.colSpan > 1 ? gc.colSpan : undefined}\n rowSpan={gc.rowSpan > 1 ? gc.rowSpan : undefined}\n data-lw-cell={`${r}:${gc.cell}`}\n style={style}\n >\n <WithContext\n value={{\n bold: header || ctx.bold,\n contentWidth: (ctx.contentWidth * widthPct * (pct.slice(gc.col, gc.col + gc.colSpan).reduce((a, b) => a + b, 0) / 100)) / 100,\n }}\n >\n {(Array.isArray(cell.blocks) ? cell.blocks : []).map((b, i) => (\n <BlockView key={i} block={b} />\n ))}\n </WithContext>\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n })}\n </Table.Body>\n </Table>\n </div>\n );\n}\n\n// ── Bands + footnotes ──────────────────────────────────────────────────────\n\nexport function isBlocksBand(band: unknown): band is BlocksBand {\n return !!band && typeof band === \"object\" && Array.isArray((band as BlocksBand).blocks);\n}\n\nexport function hasBand(band: unknown): band is Band | BlocksBand {\n if (isBlocksBand(band)) return band.blocks.length > 0;\n if (!band || typeof band !== \"object\") return false;\n const b = band as Band;\n return [b.left, b.center, b.right].some((s) => typeof s === \"string\" && s !== \"\");\n}\n\n/** A header or footer: a one-line band on Word's centre and right tab stops, or blocks. */\nexport function BandView({ band }: { band: Band | BlocksBand }) {\n const ctx = useContext(RenderCtx);\n if (isBlocksBand(band)) {\n return (\n <WithContext value={{ marks: EMPTY_MARKS }}>\n {band.blocks.map((b, i) => (b?.type === \"pageBreak\" || b?.type === \"chart\" ? null : <BlockView key={i} block={b} />))}\n </WithContext>\n );\n }\n const slot = (v: unknown): string => (typeof v === \"string\" ? (ctx.fields ? substituteFields(v, ctx.fields) : v) : \"\");\n return (\n <Text\n as=\"div\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr auto 1fr\",\n fontSize: pt(num(band.size, BAND_SIZE)),\n lineHeight: SINGLE_LINE,\n color: hex(band.color) ?? BAND_COLOR,\n whiteSpace: \"pre\",\n }}\n >\n <span data-lw-slot=\"left\" style={{ textAlign: \"left\" }}>{slot(band.left)}</span>\n <span data-lw-slot=\"center\" style={{ textAlign: \"center\" }}>{slot(band.center)}</span>\n <span data-lw-slot=\"right\" style={{ textAlign: \"right\", justifySelf: \"end\" }}>{slot(band.right)}</span>\n </Text>\n );\n}\n\n/** One footnote as it sits at the foot of a page: its number, then its blocks at 10pt. */\nexport function FootnoteView({ id, footnote }: { id: number; footnote: Footnote }) {\n return (\n <div data-footnote={id} style={{ display: \"flex\", gap: pt(3) }}>\n <sup style={{ fontSize: pt(FOOTNOTE_SIZE * 0.65), lineHeight: 1, paddingTop: pt(2) }}>{id}</sup>\n <div style={{ flex: 1, minWidth: 0 }}>\n <WithContext value={{ marks: EMPTY_MARKS, size: FOOTNOTE_SIZE, spaceAfter: 0 }}>\n {(Array.isArray(footnote.blocks) ? footnote.blocks : []).map((b, i) => (\n <BlockView key={i} block={b} />\n ))}\n </WithContext>\n </div>\n </div>\n );\n}\n\n/** The short rule above a page's footnotes; its box is FOOTNOTE_SEPARATOR_PT tall. */\nexport function FootnoteSeparator({ height }: { height: string }) {\n return (\n <div data-lw-footnote-separator=\"\" style={{ height, display: \"flex\", alignItems: \"center\" }}>\n <div style={{ width: pt(144), borderTop: `${pt(0.5)} solid #000000` }} />\n </div>\n );\n}\n","/**\n * The few rules inline styles cannot reach: react-fancy's Table renders its own\n * <table>, and Separator renders an <hr> with no style prop. Kept identical to\n * styles.css (tests/styles.test.ts checks), which is the CSP-strict route.\n * Every rule is scoped to the viewer and low-specificity.\n */\nexport const VIEWER_CSS = `\n:where([data-lw-viewer]) [data-lw-table] > table { width: 100%; border-collapse: collapse; table-layout: fixed; }\n:where([data-lw-viewer]) [data-lw-table] { border: 0; border-radius: 0; overflow: visible; }\n:where([data-lw-viewer]) [data-lw-sizer] > td { height: 0; padding: 0; border: none; }\n:where([data-lw-viewer]) hr[data-react-fancy-separator] { margin: 0; width: 100%; border: 0; border-top: 0.75pt solid #000000; }\n:where([data-lw-viewer]) [data-lw-sheet] p, :where([data-lw-viewer]) [data-lw-measure] p { margin-top: 0; margin-bottom: 0; }\n`.trim();\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { numberFootnotes, type FootnoteNumbering } from \"./footnotes\";\nimport { PX_PER_PT, bodyBox, pageGeometry, type BodyBox, type PageGeometry } from \"./geometry\";\nimport { blockId, measure } from \"./measure\";\nimport { paginate, type Fragment, type PageLayout } from \"./paginate\";\nimport {\n BandView,\n BlockView,\n FootnoteSeparator,\n FootnoteView,\n RenderCtx,\n TableView,\n hasBand,\n type RenderContext,\n} from \"./render\";\nimport { DEFAULT_SIZE, DEFAULT_SPACE_AFTER, FOOTNOTE_SEPARATOR_PT, SINGLE_LINE, fontStack, num, pt, px } from \"./style\";\nimport { VIEWER_CSS } from \"./viewer-css\";\nimport type { Band, Block, BlocksBand, Doc, TableBlock } from \"./types\";\n\nexport interface DocViewerLayout {\n /** Number of pages the document laid out to. */\n pages: number;\n /** Page size in points, orientation applied. */\n pageWidth: number;\n pageHeight: number;\n /** The scale the pages are drawn at. */\n scale: number;\n}\n\nexport interface DocViewerProps {\n /** The document: last-word JSON, e.g. `new DocxReader().read(bytes)`. */\n doc: Doc;\n /**\n * `\"width\"` (default) scales each page down to the viewer's width -- a\n * narrow preview panel shows whole pages, never reflowed text. `\"none\"`\n * draws pages at 100%.\n */\n fit?: \"width\" | \"none\";\n /** A fixed scale (1 = 100%). Overrides `fit`. */\n scale?: number;\n /** The largest scale `fit: \"width\"` will use. Default 1, so a wide panel does not enlarge the page. */\n maxScale?: number;\n /** Space between pages, in CSS px. Default 16. */\n gap?: number;\n /** Called after every layout with JSON-serializable facts about it. */\n onLayout?: (layout: DocViewerLayout) => void;\n /**\n * Render the viewer's small stylesheet as a React 19 hoisted `<style>`.\n * Default true. Set false under a strict CSP and import\n * `@particle-academy/last-word-ui/styles.css` instead.\n */\n injectStyles?: boolean;\n id?: string;\n className?: string;\n style?: CSSProperties;\n}\n\ninterface Layout {\n pages: PageLayout[];\n box: BodyBox;\n /** Measured block heights (px), by item index, to tell a whole block from a fragment. */\n heights: number[];\n}\n\n/**\n * A read-only, paged view of a last-word Doc: every page at its paper size,\n * broken by content height, with the header and footer at their distances,\n * live page numbers and footnotes at the foot of the page that holds the mark.\n *\n * Stable handles: the root carries `data-lw-viewer`; each page `data-page`\n * (1-based); each block or fragment of one `data-block` (`b0`, `b1`, ... in\n * document order); each footnote `data-footnote`; bands `data-lw-band`.\n */\nexport function DocViewer({\n doc,\n fit = \"width\",\n scale: fixedScale,\n maxScale = 1,\n gap = 16,\n onLayout,\n injectStyles = true,\n id,\n className,\n style,\n}: DocViewerProps) {\n const geometry = useMemo(() => pageGeometry(doc), [doc]);\n const numbering = useMemo(() => numberFootnotes(doc), [doc]);\n const blocks: Block[] = useMemo(() => (Array.isArray(doc?.blocks) ? doc.blocks : []), [doc]);\n const header = hasBand(doc?.page?.header) ? doc.page!.header! : null;\n const footer = hasBand(doc?.page?.footer) ? doc.page!.footer! : null;\n\n const rootRef = useRef<HTMLDivElement>(null);\n const measureRef = useRef<HTMLDivElement>(null);\n const [layout, setLayout] = useState<Layout | null>(null);\n const [fontEpoch, setFontEpoch] = useState(0);\n const [width, setWidth] = useState<number | null>(null);\n\n const ctx: RenderContext = useMemo(\n () => ({\n marks: numbering.marks,\n size: num(doc?.defaultSize, DEFAULT_SIZE),\n spaceAfter: DEFAULT_SPACE_AFTER,\n contentWidth: geometry.contentWidth,\n }),\n [numbering, doc, geometry],\n );\n\n useLayoutEffect(() => {\n const el = measureRef.current;\n if (!el) return;\n const m = measure(el, blocks);\n const box = bodyBox(geometry, m.headerHeight / PX_PER_PT, m.footerHeight / PX_PER_PT);\n const pages = paginate(m.items, { pageHeight: box.height * PX_PER_PT, footnoteSeparator: m.footnoteSeparator });\n const heights = m.items.map((it) => (it.type === \"block\" ? it.height : 0));\n setLayout({ pages, box, heights });\n }, [blocks, geometry, numbering, fontEpoch, header, footer]);\n\n // Web fonts change line breaks; lay out again once they have loaded.\n useEffect(() => {\n const fonts = typeof document !== \"undefined\" ? document.fonts : undefined;\n let live = true;\n fonts?.ready?.then(() => live && setFontEpoch((e) => e + 1)).catch(() => undefined);\n return () => {\n live = false;\n };\n }, []);\n\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n setWidth(el.clientWidth || null);\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width;\n if (w) setWidth(w);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const pageWpx = geometry.width * PX_PER_PT;\n const scale =\n typeof fixedScale === \"number\" && fixedScale > 0\n ? fixedScale\n : fit === \"none\" || !width\n ? 1\n : Math.min(maxScale, width / pageWpx);\n\n const pageCount = layout?.pages.length ?? 0;\n useEffect(() => {\n if (layout) onLayout?.({ pages: layout.pages.length, pageWidth: geometry.width, pageHeight: geometry.height, scale });\n }, [layout, geometry, scale, onLayout]);\n\n const typography: CSSProperties = {\n fontFamily: fontStack(doc?.defaultFont),\n fontSize: pt(ctx.size),\n lineHeight: SINGLE_LINE,\n color: \"#000000\",\n textAlign: \"left\",\n };\n\n return (\n <div\n ref={rootRef}\n id={id}\n data-lw-viewer=\"\"\n data-lw-pages={pageCount || undefined}\n className={className}\n style={{ position: \"relative\", ...style }}\n >\n {injectStyles && (\n <style href=\"particle-academy-last-word-ui\" precedence=\"default\">\n {VIEWER_CSS}\n </style>\n )}\n\n {/* Hidden measuring copy at the text width: the packer's only input. */}\n <div\n ref={measureRef}\n aria-hidden=\"true\"\n data-lw-measure=\"\"\n style={{\n ...typography,\n position: \"absolute\",\n visibility: \"hidden\",\n pointerEvents: \"none\",\n left: -100000,\n top: 0,\n width: pt(geometry.contentWidth),\n }}\n >\n <RenderCtx.Provider value={ctx}>\n {header && (\n <div data-lw-measure-header=\"\">\n <RenderCtx.Provider value={{ ...ctx, fields: { page: 1, pages: 1 } }}>\n <BandView band={header} />\n </RenderCtx.Provider>\n </div>\n )}\n {footer && (\n <div data-lw-measure-footer=\"\">\n <RenderCtx.Provider value={{ ...ctx, fields: { page: 1, pages: 1 } }}>\n <BandView band={footer} />\n </RenderCtx.Provider>\n </div>\n )}\n {blocks.map((b, i) => (\n <div key={i} data-lw-measure-block={i} style={{ display: \"flow-root\" }}>\n <BlockView block={b} />\n </div>\n ))}\n {numbering.notes.map((n) => (\n <div key={n.id} data-lw-measure-footnote={n.id}>\n <FootnoteView id={n.id} footnote={n.footnote} />\n </div>\n ))}\n {numbering.notes.length > 0 && (\n <div data-lw-measure-separator=\"\">\n <FootnoteSeparator height={pt(FOOTNOTE_SEPARATOR_PT)} />\n </div>\n )}\n </RenderCtx.Provider>\n </div>\n\n {layout && (\n <div data-lw-page-stack=\"\" style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap }}>\n {layout.pages.map((page) => (\n <PageView\n key={page.index}\n page={page}\n pages={layout.pages.length}\n geometry={geometry}\n box={layout.box}\n scale={scale}\n typography={typography}\n ctx={ctx}\n header={header}\n footer={footer}\n numbering={numbering}\n blocks={blocks}\n heights={layout.heights}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface PageViewProps {\n page: PageLayout;\n pages: number;\n geometry: PageGeometry;\n box: BodyBox;\n scale: number;\n typography: CSSProperties;\n ctx: RenderContext;\n header: Band | BlocksBand | null;\n footer: Band | BlocksBand | null;\n numbering: FootnoteNumbering;\n blocks: Block[];\n heights: number[];\n}\n\nfunction PageView({ page, pages, geometry, box, scale, typography, ctx, header, footer, numbering, blocks, heights }: PageViewProps) {\n const n = page.index + 1;\n const g = geometry;\n const bandCtx = { ...ctx, fields: { page: n, pages } };\n const notes = page.footnotes\n .map((fid) => numbering.notes.find((x) => x.id === fid))\n .filter((x): x is FootnoteNumbering[\"notes\"][number] => !!x);\n return (\n <div\n data-page={n}\n data-lw-page-of={pages}\n style={{ width: px(g.width * PX_PER_PT * scale), height: px(g.height * PX_PER_PT * scale), flex: \"none\" }}\n >\n <div\n data-lw-sheet=\"\"\n style={{\n ...typography,\n position: \"relative\",\n width: pt(g.width),\n height: pt(g.height),\n transform: scale === 1 ? undefined : `scale(${scale})`,\n transformOrigin: \"top left\",\n backgroundColor: \"#FFFFFF\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.18), 0 0 0 0.5px rgba(0,0,0,0.08)\",\n overflow: \"hidden\",\n }}\n >\n {header && (\n <div\n data-lw-band=\"header\"\n style={{ position: \"absolute\", top: pt(g.margins.header), left: pt(g.margins.left), width: pt(g.contentWidth) }}\n >\n <RenderCtx.Provider value={bandCtx}>\n <BandView band={header} />\n </RenderCtx.Provider>\n </div>\n )}\n\n <div\n data-lw-body=\"\"\n style={{\n position: \"absolute\",\n top: pt(box.top),\n left: pt(g.margins.left),\n width: pt(g.contentWidth),\n height: pt(box.height),\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <RenderCtx.Provider value={ctx}>\n <div data-lw-content=\"\">\n {page.fragments.map((f, i) => (\n <FragmentView key={i} fragment={f} block={blocks[f.item]!} whole={heights[f.item] ?? 0} />\n ))}\n </div>\n {notes.length > 0 && (\n <div data-lw-footnotes=\"\" style={{ marginTop: \"auto\" }}>\n <FootnoteSeparator height={pt(FOOTNOTE_SEPARATOR_PT)} />\n {notes.map((x) => (\n <FootnoteView key={x.id} id={x.id} footnote={x.footnote} />\n ))}\n </div>\n )}\n </RenderCtx.Provider>\n </div>\n\n {footer && (\n <div\n data-lw-band=\"footer\"\n style={{ position: \"absolute\", bottom: pt(g.margins.footer), left: pt(g.margins.left), width: pt(g.contentWidth) }}\n >\n <RenderCtx.Provider value={bandCtx}>\n <BandView band={footer} />\n </RenderCtx.Provider>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction FragmentView({ fragment, block, whole }: { fragment: Fragment; block: Block; whole: number }): ReactNode {\n const id = blockId(fragment.item);\n if (fragment.type === \"table\") {\n return (\n <div\n data-block={id}\n data-lw-rows={fragment.rows.join(\",\")}\n data-lw-repeated-header={fragment.repeatedHeader ? \"\" : undefined}\n data-lw-overflow={fragment.overflow ? \"\" : undefined}\n >\n <TableView block={block as TableBlock} rows={fragment.rows} />\n </div>\n );\n }\n const isWhole = fragment.start <= 0.001 && fragment.end >= whole - 0.001;\n if (isWhole) {\n return (\n <div data-block={id} style={{ display: \"flow-root\" }}>\n <BlockView block={block} />\n </div>\n );\n }\n // A piece of a block split across pages: the whole block, windowed.\n return (\n <div\n data-block={id}\n data-lw-fragment={`${Math.round(fragment.start)}-${Math.round(fragment.end)}`}\n data-lw-forced={fragment.forced ? \"\" : undefined}\n style={{ height: px(fragment.end - fragment.start), overflow: \"hidden\" }}\n >\n <div style={{ display: \"flow-root\", marginTop: px(-fragment.start) }}>\n <BlockView block={block} />\n </div>\n </div>\n );\n}\n","import type { Doc } from \"./types\";\n\n/**\n * A Doc from what a last-word reader returned -- `new DocxReader().read(bytes)`\n * in `@particle-academy/last-word`, or the same JSON from PHP or Python over\n * the wire (a string is parsed).\n *\n * This package does not depend on last-word at runtime, so it does not read\n * bytes itself: read on the server or with last-word-js, then hand the result\n * here. It returns the SAME object (footnote numbering is keyed by run\n * identity, so the viewer must render the object it was given), and throws a\n * TypeError naming the problem rather than rendering a blank page.\n */\nexport function docFromReader(output: unknown): Doc {\n let value = output;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n throw new TypeError(\"last-word-ui: reader output is a string but not JSON\");\n }\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(\"last-word-ui: reader output must be a Doc object\");\n }\n if (!Array.isArray((value as Doc).blocks)) {\n throw new TypeError(\"last-word-ui: reader output has no `blocks` array\");\n }\n return value as Doc;\n}\n"]}
1
+ {"version":3,"sources":["../src/geometry.ts","../src/fields.ts","../src/image-size.ts","../src/links.ts","../src/style.ts","../src/table-grid.ts","../src/render.tsx","../src/bands.ts","../src/footnotes.ts","../src/measure.ts","../src/paginate.ts","../src/viewer-css.ts","../src/DocViewer.tsx","../src/from-reader.ts"],"names":["height","finite","createContext","useContext","jsx","jsxs","Fragment","Text","Heading","Separator","ImageViewer","Table","notes","h","useMemo","useRef","useState","useLayoutEffect","useEffect"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Doc, Orientation, PageSize } from \"./types\";\n\n/**\n * Paper sizes in points, portrait. A4 is 11906 x 16838 twips, which is what\n * every last-word writer emits and every reader matches against.\n */\nexport const PAGE_SIZES_PT: Record<PageSize, readonly [number, number]> = {\n letter: [612, 792],\n legal: [612, 1008],\n a4: [595.3, 841.9],\n};\n\n/** One inch a side, as every last-word writer emits unasked. */\nexport const PAGE_MARGIN_DEFAULT = 72;\n/** Half an inch from the page edge to the header and to the footer (Word's default). */\nexport const PAGE_BAND_DISTANCE_DEFAULT = 36;\n\n/** CSS pixels per point (96 dpi). */\nexport const PX_PER_PT = 96 / 72;\n\nexport interface ResolvedMargins {\n top: number;\n right: number;\n bottom: number;\n left: number;\n /** Points from the top page edge to the top of the header. */\n header: number;\n /** Points from the bottom page edge to the bottom of the footer. */\n footer: number;\n}\n\nexport interface PageGeometry {\n size: PageSize;\n orientation: Orientation;\n /** Points, orientation applied. */\n width: number;\n height: number;\n margins: ResolvedMargins;\n /** The text column, in points. */\n contentWidth: number;\n}\n\nexport interface BodyBox {\n /** Points from the top page edge to the top of the body. */\n top: number;\n /** Points from the bottom page edge to the bottom of the body. */\n bottom: number;\n /** The body's height in points. */\n height: number;\n}\n\nconst finite = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\n\n/**\n * Every page margin and both header/footer distances, defaults filled in.\n *\n * This is the ONE place the defaults are applied, mirroring PHP last-word's\n * `Schema::pageMargins()` (0.15.0): a reader omits any value equal to its\n * default -- DocxReader drops a side of exactly 1440 twips -- so a missing\n * value means the default, never zero. `page.margins.header` / `.footer` are\n * the distances the reference leg added in 0.15.0; until the JS reader returns\n * them they are absent and resolve to Word's half inch.\n */\nexport function pageMargins(doc: Doc): ResolvedMargins {\n const m = (doc.page && typeof doc.page.margins === \"object\" && doc.page.margins) || {};\n const value = (key: keyof ResolvedMargins, fallback: number): number => {\n const v = (m as Record<string, unknown>)[key];\n return finite(v) ? v : fallback;\n };\n return {\n top: value(\"top\", PAGE_MARGIN_DEFAULT),\n right: value(\"right\", PAGE_MARGIN_DEFAULT),\n bottom: value(\"bottom\", PAGE_MARGIN_DEFAULT),\n left: value(\"left\", PAGE_MARGIN_DEFAULT),\n header: value(\"header\", PAGE_BAND_DISTANCE_DEFAULT),\n footer: value(\"footer\", PAGE_BAND_DISTANCE_DEFAULT),\n };\n}\n\n/** The page a Doc lays out on: paper, orientation, margins and text column. */\nexport function pageGeometry(doc: Doc): PageGeometry {\n const page = doc.page ?? {};\n const size: PageSize =\n typeof page.size === \"string\" && page.size in PAGE_SIZES_PT ? (page.size as PageSize) : \"letter\";\n const orientation: Orientation = page.orientation === \"landscape\" ? \"landscape\" : \"portrait\";\n const [w, h] = PAGE_SIZES_PT[size];\n const [width, height] = orientation === \"landscape\" ? [h, w] : [w, h];\n const margins = pageMargins(doc);\n return {\n size,\n orientation,\n width,\n height,\n margins,\n contentWidth: Math.max(1, width - margins.left - margins.right),\n };\n}\n\n/**\n * The body box once the header and footer have been measured (points).\n *\n * Word moves the body down when the header, set at its distance from the top\n * edge, is taller than the top margin leaves room for -- and up, for a footer.\n * A letterhead with a logo is the usual case.\n */\nexport function bodyBox(g: PageGeometry, headerHeight: number, footerHeight: number): BodyBox {\n const top = Math.max(g.margins.top, headerHeight > 0 ? g.margins.header + headerHeight : 0);\n const bottom = Math.max(g.margins.bottom, footerHeight > 0 ? g.margins.footer + footerHeight : 0);\n return { top, bottom, height: Math.max(1, g.height - top - bottom) };\n}\n","/**\n * The live values a header or footer's field tokens take on one page.\n *\n * Only `page` and `pages` are required, so a 0.1.x caller of\n * `substituteFields(text, { page, pages })` is unchanged; every other value\n * has a documented fallback.\n */\nexport interface PageFields {\n /** 1-based. */\n page: number;\n pages: number;\n /**\n * `{section}`. A last-word Doc is ONE section, so this is 1 unless a caller\n * says otherwise.\n */\n section?: number;\n /** `{sectionpages}`. The Doc is one section, so the page total when absent. */\n sectionPages?: number;\n /** `{author}`: `doc.meta.author`. Empty when absent. */\n author?: string;\n /** `{title}`: the top-level `doc.title` (there is deliberately no `meta.title`). Empty when absent. */\n title?: string;\n /** `{filename}`: the viewer cannot know it, so it is a prop. Empty when absent. */\n filename?: string;\n /** `{date}` / `{time}` are \"as of\" this moment. The current time when absent. */\n now?: Date;\n}\n\n/**\n * The token grammar, matching PHP last-word 0.16.0's `Schema::FIELD_TOKEN`:\n * lower-case names, exact; `{date}` / `{time}` may take `:FORMAT`, one or\n * more characters that are not a brace, a double quote or a backslash.\n * Anything else in braces is literal text.\n */\nconst FIELD = /\\{(?:(page|pages|section|sectionpages|author|title|filename)|(date|time)(?::([^{}\"\\\\]+))?)\\}/g;\n\nconst str = (v: unknown): string => (typeof v === \"string\" ? v : \"\");\n\n/**\n * Text with its field tokens replaced by this page's values -- the PAGE,\n * NUMPAGES, SECTION, SECTIONPAGES, AUTHOR, TITLE, FILENAME, DATE and TIME\n * fields last-word writes into a band. Only in bands: in the body the same\n * characters are literal text, as they are in the written file.\n *\n * Returns a plain string; the caller renders it as a React text node, so a\n * value full of markup (an untrusted author) stays text.\n */\nexport function substituteFields(text: string, fields: PageFields): string {\n return text.replace(FIELD, (_m, name: string | undefined, dt: string | undefined, format: string | undefined) => {\n switch (name) {\n case \"page\":\n return String(fields.page);\n case \"pages\":\n return String(fields.pages);\n case \"section\":\n return String(fields.section ?? 1);\n case \"sectionpages\":\n return String(fields.sectionPages ?? fields.pages);\n case \"author\":\n return str(fields.author);\n case \"title\":\n return str(fields.title);\n case \"filename\":\n return str(fields.filename);\n }\n const now = fields.now instanceof Date && Number.isFinite(fields.now.getTime()) ? fields.now : new Date();\n if (format !== undefined) return formatDatePicture(now, format);\n return dt === \"time\" ? now.toLocaleTimeString() : now.toLocaleDateString();\n });\n}\n\n/**\n * The `now` prop as a Date: a Date or an ISO-8601 string (JSON-friendly). A\n * missing or unparseable value is the current time.\n */\nexport function resolveNow(now: Date | string | undefined | null): Date {\n if (now instanceof Date) return Number.isFinite(now.getTime()) ? new Date(now.getTime()) : new Date();\n if (typeof now === \"string\") {\n const d = new Date(now);\n if (Number.isFinite(d.getTime())) return d;\n }\n return new Date();\n}\n\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\nconst DAYS = [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"];\n\n/** Longest first, so `dddd` wins over `d` and `am/pm` over `m`. Case-sensitive: M is month, m minute. */\nconst PICTURE = [\n \"AM/PM\",\n \"am/pm\",\n \"dddd\",\n \"MMMM\",\n \"yyyy\",\n \"ddd\",\n \"MMM\",\n \"dd\",\n \"MM\",\n \"yy\",\n \"HH\",\n \"hh\",\n \"mm\",\n \"ss\",\n \"d\",\n \"M\",\n \"H\",\n \"h\",\n \"m\",\n \"s\",\n] as const;\n\nconst two = (n: number): string => String(n).padStart(2, \"0\");\n\n/**\n * A Word date-time picture, formatted in LOCAL time: d dd ddd dddd, M MM MMM\n * MMMM, yy yyyy, h hh (12-hour), H HH (24-hour), m mm, s ss, am/pm, AM/PM.\n * Text in single quotes is literal (an unterminated quote runs to the end);\n * every other character is literal. Names are English, as Word writes them\n * for an English document. Pure string work: no third-party code, no eval.\n */\nexport function formatDatePicture(date: Date, picture: string): string {\n const h12 = date.getHours() % 12 === 0 ? 12 : date.getHours() % 12;\n const value = (token: (typeof PICTURE)[number]): string => {\n switch (token) {\n case \"d\":\n return String(date.getDate());\n case \"dd\":\n return two(date.getDate());\n case \"ddd\":\n return DAYS[date.getDay()]!.slice(0, 3);\n case \"dddd\":\n return DAYS[date.getDay()]!;\n case \"M\":\n return String(date.getMonth() + 1);\n case \"MM\":\n return two(date.getMonth() + 1);\n case \"MMM\":\n return MONTHS[date.getMonth()]!.slice(0, 3);\n case \"MMMM\":\n return MONTHS[date.getMonth()]!;\n case \"yy\":\n return two(date.getFullYear() % 100);\n case \"yyyy\":\n return String(date.getFullYear()).padStart(4, \"0\");\n case \"h\":\n return String(h12);\n case \"hh\":\n return two(h12);\n case \"H\":\n return String(date.getHours());\n case \"HH\":\n return two(date.getHours());\n case \"m\":\n return String(date.getMinutes());\n case \"mm\":\n return two(date.getMinutes());\n case \"s\":\n return String(date.getSeconds());\n case \"ss\":\n return two(date.getSeconds());\n case \"am/pm\":\n return date.getHours() < 12 ? \"am\" : \"pm\";\n case \"AM/PM\":\n return date.getHours() < 12 ? \"AM\" : \"PM\";\n }\n };\n\n let out = \"\";\n let i = 0;\n while (i < picture.length) {\n if (picture[i] === \"'\") {\n const end = picture.indexOf(\"'\", i + 1);\n if (end < 0) {\n out += picture.slice(i + 1);\n break;\n }\n out += picture.slice(i + 1, end);\n i = end + 1;\n continue;\n }\n const token = PICTURE.find((t) => picture.startsWith(t, i));\n if (token) {\n out += value(token);\n i += token.length;\n continue;\n }\n out += picture[i];\n i++;\n }\n return out;\n}\n","export interface Size {\n width: number;\n height: number;\n}\n\nconst DATA_URL = /^data:image\\/(png|jpe?g);base64,([A-Za-z0-9+/=\\s]+)$/i;\n\nfunction decodeHead(b64: string, bytes: number): Uint8Array | null {\n try {\n // Enough base64 for `bytes` bytes, rounded to a whole quantum.\n const take = Math.ceil(bytes / 3) * 4;\n const bin = atob(b64.replace(/\\s+/g, \"\").slice(0, take));\n const out = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\n return out;\n } catch {\n return null;\n }\n}\n\nfunction pngSize(b: Uint8Array): Size | null {\n if (b.length < 24 || b[0] !== 0x89 || b[1] !== 0x50 || b[2] !== 0x4e || b[3] !== 0x47) return null;\n const dv = new DataView(b.buffer, b.byteOffset, b.byteLength);\n const width = dv.getUint32(16);\n const height = dv.getUint32(20);\n return width > 0 && height > 0 ? { width, height } : null;\n}\n\nfunction jpegSize(b: Uint8Array): Size | null {\n if (b.length < 4 || b[0] !== 0xff || b[1] !== 0xd8) return null;\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) return null;\n const marker = b[i + 1]!;\n const len = (b[i + 2]! << 8) | b[i + 3]!;\n // SOF0..SOF15, less DHT (C4), JPG (C8) and DAC (CC).\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n const height = (b[i + 5]! << 8) | b[i + 6]!;\n const width = (b[i + 7]! << 8) | b[i + 8]!;\n return width > 0 && height > 0 ? { width, height } : null;\n }\n i += 2 + len;\n }\n return null;\n}\n\n/**\n * The intrinsic pixel size of a PNG or JPEG data URL, read from its header, or\n * null. Read synchronously so a page can be laid out before the image decodes:\n * pagination must not change when an image finishes loading.\n */\nexport function imageSizeFromDataUrl(src: string): Size | null {\n const m = DATA_URL.exec(src);\n if (!m) return null;\n const isPng = m[1]!.toLowerCase() === \"png\";\n // A JPEG's SOF can sit behind EXIF; 64 KiB covers every real header.\n const head = decodeHead(m[2]!, isPng ? 32 : 65536);\n if (!head) return null;\n return isPng ? pngSize(head) : jpegSize(head);\n}\n\n/**\n * The size an image block is drawn at, in CSS px -- the writer's rules\n * (last-word `resolveImageSize`), capped at the text column instead of the\n * writer's fixed maximum so a narrow page does not overflow.\n */\nexport function resolveImageSize(\n block: { src: string; widthPx?: number; heightPx?: number },\n maxWidthPx: number,\n): Size {\n const intrinsic = imageSizeFromDataUrl(block.src);\n const given = (v: unknown): number | undefined => (typeof v === \"number\" && Number.isFinite(v) && v > 0 ? v : undefined);\n let width = given(block.widthPx);\n let height = given(block.heightPx);\n const aspect = intrinsic ? intrinsic.width / intrinsic.height : 1.5;\n\n if (width === undefined && height === undefined) {\n width = intrinsic?.width ?? 300;\n height = intrinsic?.height ?? 200;\n } else if (width === undefined) {\n width = height! * aspect;\n } else if (height === undefined) {\n height = width / aspect;\n }\n\n if (width! > maxWidthPx) {\n height = (height! * maxWidthPx) / width!;\n width = maxWidthPx;\n }\n return { width: Math.max(1, Math.round(width!)), height: Math.max(1, Math.round(height!)) };\n}\n","const ALLOWED = new Set([\"http:\", \"https:\", \"mailto:\", \"tel:\"]);\n\n/**\n * A run's `link`, or undefined when it is not safe to put in an href.\n *\n * A Doc is untrusted input -- it comes from a file somebody else wrote, or an\n * agent -- and this viewer renders it inside the host's origin, so a\n * `javascript:` link would be script in the host page. Only absolute http(s),\n * mailto and tel URLs, and in-document `#anchors`, are kept. The protocol is\n * read by the URL parser, not a regex, so case, leading spaces and embedded\n * tabs (which the parser strips, exactly as a browser would) cannot smuggle a\n * scheme past the check.\n */\nexport function safeHref(url: unknown): string | undefined {\n if (typeof url !== \"string\" || url === \"\") return undefined;\n if (/^#[^\\s]*$/.test(url)) return url;\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n return undefined;\n }\n return ALLOWED.has(parsed.protocol) ? url : undefined;\n}\n","import type { CSSProperties } from \"react\";\nimport type { Border, BoxBorders, ParagraphProps } from \"./types\";\n\n/** A length in points, as CSS. The page is laid out in pt so it matches the file 1:1. */\nexport const pt = (n: number): string => `${Math.round(n * 1000) / 1000}pt`;\nexport const px = (n: number): string => `${Math.round(n * 1000) / 1000}px`;\n\n/**\n * Word's single line spacing for a body font is about 1.17 of its size; a\n * last-word `lineHeight` is a multiple of that. 259/240 is the writer's\n * default (\"1.08 auto\").\n */\nexport const SINGLE_LINE = 1.17;\nexport const DEFAULT_LINE_MULTIPLE = 259 / 240;\n/** The writer's paragraph spacing after, unasked: 160 twips. */\nexport const DEFAULT_SPACE_AFTER = 8;\nexport const DEFAULT_FONT = \"Calibri\";\nexport const DEFAULT_SIZE = 11;\nexport const HEADING_SIZES = [20, 16, 14, 13, 12, 11] as const;\nexport const HEADER_FILL = \"#E7E7E7\";\nexport const CODE_FILL = \"#F2F2F2\";\nexport const LINK_COLOR = \"#0563C1\";\nexport const QUOTE_COLOR = \"#595959\";\nexport const BAND_SIZE = 9;\nexport const BAND_COLOR = \"#6B7280\";\nexport const FOOTNOTE_SIZE = 10;\n/** The rule above a page's footnotes, and the space it takes. */\nexport const FOOTNOTE_SEPARATOR_PT = 12;\n\n/** #RRGGBB or undefined. Doc values are untrusted: only a hex colour reaches a style. */\nexport function hex(v: unknown): string | undefined {\n return typeof v === \"string\" && /^#[0-9a-fA-F]{6}$/.test(v) ? v : undefined;\n}\n\nconst finite = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v);\nexport const num = (v: unknown, fallback: number): number => (finite(v) ? v : fallback);\n\n/** Metric-compatible open fallbacks first, so line breaks match Word's as closely as possible. */\nconst FALLBACKS: Record<string, string> = {\n calibri: 'Carlito, \"Segoe UI\", Arial, sans-serif',\n cambria: 'Caladea, Georgia, serif',\n arial: '\"Liberation Sans\", Arimo, Helvetica, sans-serif',\n \"times new roman\": '\"Liberation Serif\", Tinos, Times, serif',\n \"courier new\": '\"Liberation Mono\", Cousine, monospace',\n consolas: '\"Liberation Mono\", Menlo, monospace',\n};\n\n/** A font-family stack. The name is untrusted, so it is reduced to safe characters and quoted. */\nexport function fontStack(name: unknown): string {\n const clean = typeof name === \"string\" ? name.replace(/[^A-Za-z0-9 _-]/g, \"\").trim() : \"\";\n const font = clean === \"\" ? DEFAULT_FONT : clean;\n const fallback = FALLBACKS[font.toLowerCase()] ?? 'Carlito, \"Segoe UI\", Arial, sans-serif';\n return `\"${font}\", ${fallback}`;\n}\n\nexport const MONO = fontStack(\"Consolas\");\n\nconst CSS_STYLE: Record<string, string> = {\n single: \"solid\",\n double: \"double\",\n dashed: \"dashed\",\n dotted: \"dotted\",\n};\n\n/** One border edge as CSS; `none`, absent or unknown draws nothing. */\nexport function borderCss(b: Border | undefined): string | undefined {\n if (!b || typeof b !== \"object\") return undefined;\n const style = CSS_STYLE[b.style ?? \"single\"];\n if (!style) return \"none\";\n // A double rule needs room for two lines and a gap to be visible at all.\n const width = Math.max(style === \"double\" ? 2.25 : 0.25, num(b.width, 0.5));\n return `${pt(width)} ${style} ${hex(b.color) ?? \"#000000\"}`;\n}\n\n/** The paragraph box: indents, alignment, shading, borders and line height. */\nexport function paragraphStyle(p: ParagraphProps, size: number): CSSProperties {\n const s: CSSProperties = {\n margin: 0,\n marginLeft: pt(num(p.indentLeft, 0)),\n marginRight: pt(num(p.indentRight, 0)),\n fontSize: pt(size),\n lineHeight: num(p.lineHeight, DEFAULT_LINE_MULTIPLE) * SINGLE_LINE,\n color: \"inherit\",\n fontWeight: \"inherit\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n };\n if (p.align === \"left\" || p.align === \"center\" || p.align === \"right\" || p.align === \"justify\") s.textAlign = p.align;\n const fill = hex(p.shading);\n if (fill) s.backgroundColor = fill;\n Object.assign(s, boxBorders(p.borders));\n return s;\n}\n\n/** Paragraph borders: the edge, plus a little padding so text does not touch the rule. */\nexport function boxBorders(b: BoxBorders | undefined): CSSProperties {\n if (!b || typeof b !== \"object\") return {};\n const s: CSSProperties = {};\n const top = borderCss(b.top);\n const right = borderCss(b.right);\n const bottom = borderCss(b.bottom);\n const left = borderCss(b.left);\n if (top) {\n s.borderTop = top;\n if (top !== \"none\") s.paddingTop = pt(1);\n }\n if (bottom) {\n s.borderBottom = bottom;\n if (bottom !== \"none\") s.paddingBottom = pt(1);\n }\n if (left) {\n s.borderLeft = left;\n if (left !== \"none\") s.paddingLeft = pt(4);\n }\n if (right) {\n s.borderRight = right;\n if (right !== \"none\") s.paddingRight = pt(4);\n }\n return s;\n}\n\n/** The space a paragraph-shaped block takes above and below its box. */\nexport function spacingStyle(p: ParagraphProps, defaultAfter: number, defaultBefore = 0): CSSProperties {\n return {\n display: \"flow-root\",\n paddingTop: pt(Math.max(0, num(p.spaceBefore, defaultBefore))),\n paddingBottom: pt(Math.max(0, num(p.spaceAfter, defaultAfter))),\n };\n}\n","import type { TableRow } from \"./types\";\n\nexport interface GridCell {\n /** Row index. */\n row: number;\n /** Index of the cell within its row's `cells`. */\n cell: number;\n /** First grid column the cell occupies. */\n col: number;\n colSpan: number;\n /** Clamped to the rows that exist. */\n rowSpan: number;\n}\n\nexport interface TableGrid {\n colCount: number;\n rows: GridCell[][];\n /** True for a row a row span from above reaches into: no page break before it. */\n joinPrevious: boolean[];\n /** The leading run of `header: true` rows -- the rows Word repeats on each page. */\n headerRows: number;\n}\n\nconst span = (v: unknown): number => (typeof v === \"number\" && Number.isInteger(v) && v > 1 ? v : 1);\n\n/**\n * Where each cell sits on the column grid. Spans are HTML-style (the cell\n * appears once; the rows it covers list only their remaining cells), so a slot\n * a row span from above occupies is skipped when placing a row's cells.\n */\nexport function tableGrid(rows: TableRow[]): TableGrid {\n const occupied: Array<Set<number>> = rows.map(() => new Set<number>());\n const joinPrevious = rows.map(() => false);\n let colCount = 0;\n\n const out = rows.map((row, r) => {\n const placed: GridCell[] = [];\n let col = 0;\n (Array.isArray(row?.cells) ? row.cells : []).forEach((cell, c) => {\n while (occupied[r]!.has(col)) col++;\n const colSpan = span(cell?.colSpan);\n const rowSpan = Math.min(span(cell?.rowSpan), rows.length - r);\n for (let dr = 0; dr < rowSpan; dr++) {\n for (let dc = 0; dc < colSpan; dc++) occupied[r + dr]!.add(col + dc);\n if (dr > 0) joinPrevious[r + dr] = true;\n }\n placed.push({ row: r, cell: c, col, colSpan, rowSpan });\n col += colSpan;\n });\n return placed;\n });\n\n for (const set of occupied) for (const c of set) colCount = Math.max(colCount, c + 1);\n\n let headerRows = 0;\n while (headerRows < rows.length && rows[headerRows]?.header === true) headerRows++;\n\n return { colCount: Math.max(1, colCount), rows: out, joinPrevious, headerRows };\n}\n\n/**\n * Column widths as percentages of the table. The weights are relative and\n * apply only when there is one per column; otherwise the columns are equal --\n * the writer's own rule, so the preview matches the file.\n */\nexport function columnPercents(colCount: number, widths?: number[]): number[] {\n const n = Math.max(1, colCount);\n const even = Array.from({ length: n }, () => 100 / n);\n if (!Array.isArray(widths) || widths.length !== n) return even;\n const w = widths.map((x) => (typeof x === \"number\" && Number.isFinite(x) && x > 0 ? x : 0));\n const total = w.reduce((a, b) => a + b, 0);\n if (total <= 0) return even;\n return w.map((x) => Math.round((x / total) * 100 * 1e6) / 1e6);\n}\n","import { createContext, useContext, type CSSProperties, type ReactNode } from \"react\";\nimport { Heading, ImageViewer, Separator, Table, Text } from \"@particle-academy/react-fancy\";\nimport { substituteFields, type PageFields } from \"./fields\";\nimport { resolveImageSize } from \"./image-size\";\nimport { safeHref } from \"./links\";\nimport { PX_PER_PT } from \"./geometry\";\nimport {\n BAND_COLOR,\n BAND_SIZE,\n CODE_FILL,\n DEFAULT_SPACE_AFTER,\n FOOTNOTE_SIZE,\n HEADER_FILL,\n HEADING_SIZES,\n LINK_COLOR,\n MONO,\n QUOTE_COLOR,\n SINGLE_LINE,\n borderCss,\n fontStack,\n hex,\n num,\n paragraphStyle,\n pt,\n spacingStyle,\n} from \"./style\";\nimport { columnPercents, tableGrid } from \"./table-grid\";\nimport type {\n Band,\n Block,\n BlocksBand,\n Border,\n BoxSides,\n ChartBlock,\n Footnote,\n ImageBlock,\n ListItem,\n Run,\n TableBlock,\n TableBorders,\n} from \"./types\";\n\n/** What a block needs from where it is drawn. */\nexport interface RenderContext {\n /** Footnote numbering for the body; empty in bands and in the notes themselves. */\n marks: Map<Run, number>;\n /** Set in headers and footers: `{page}` / `{pages}` become these numbers. */\n fields?: PageFields;\n /** Point size a paragraph inherits. */\n size: number;\n /** Space after a paragraph that does not say. */\n spaceAfter: number;\n /** Text column in points. */\n contentWidth: number;\n /** Runs draw bold (a table header row). */\n bold?: boolean;\n}\n\nconst EMPTY_MARKS = new Map<Run, number>();\nconst ZWSP = String.fromCharCode(0x200b);\n\nexport const RenderCtx = createContext<RenderContext>({\n marks: EMPTY_MARKS,\n size: 11,\n spaceAfter: DEFAULT_SPACE_AFTER,\n contentWidth: 468,\n});\n\nexport function WithContext({ value, children }: { value: Partial<RenderContext>; children: ReactNode }) {\n const parent = useContext(RenderCtx);\n return <RenderCtx.Provider value={{ ...parent, ...value }}>{children}</RenderCtx.Provider>;\n}\n\n// ── Runs ───────────────────────────────────────────────────────────────────\n\nfunction RunView({ run }: { run: Run }) {\n const ctx = useContext(RenderCtx);\n const mark = ctx.marks.get(run);\n let text = typeof run.text === \"string\" ? run.text : \"\";\n if (ctx.fields) text = substituteFields(text, ctx.fields);\n\n const s: CSSProperties = {};\n if (run.bold || ctx.bold) s.fontWeight = 700;\n if (run.italic) s.fontStyle = \"italic\";\n const deco = [run.underline ? \"underline\" : \"\", run.strike ? \"line-through\" : \"\"].filter(Boolean).join(\" \");\n if (run.smallCaps) s.fontVariant = \"small-caps\";\n if (typeof run.size === \"number\" && run.size > 0) s.fontSize = pt(run.size);\n if (typeof run.font === \"string\" && run.font !== \"\") s.fontFamily = fontStack(run.font);\n if (typeof run.letterSpacing === \"number\" && Number.isFinite(run.letterSpacing)) s.letterSpacing = pt(run.letterSpacing);\n if (run.code) {\n s.fontFamily = MONO;\n s.backgroundColor = CODE_FILL;\n }\n const highlight = hex(run.highlight);\n if (highlight) s.backgroundColor = highlight;\n const color = hex(run.color);\n if (color) s.color = color;\n\n const href = safeHref(run.link);\n let body: ReactNode = text;\n if (href) {\n body = (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: color ?? LINK_COLOR, textDecoration: \"underline\" }}\n >\n {text}\n </a>\n );\n } else if (deco) {\n s.textDecoration = deco;\n }\n if (href && deco.includes(\"line-through\")) s.textDecoration = \"line-through\";\n\n return (\n <>\n {text !== \"\" && <span style={s}>{body}</span>}\n {mark !== undefined && (\n <sup data-lw-footnote-ref={mark} style={{ fontSize: \"0.65em\", lineHeight: 0 }}>\n {mark}\n </sup>\n )}\n </>\n );\n}\n\nexport function Runs({ runs }: { runs: unknown }) {\n const list = Array.isArray(runs) ? (runs as Run[]) : [];\n const visible = list.some((r) => (typeof r?.text === \"string\" && r.text !== \"\") || r?.footnote);\n return (\n <>\n {list.map((run, i) => (run && typeof run === \"object\" ? <RunView key={i} run={run} /> : null))}\n {!visible && ZWSP}\n </>\n );\n}\n\n// ── Blocks ─────────────────────────────────────────────────────────────────\n\nexport function BlockView({ block }: { block: Block }) {\n const ctx = useContext(RenderCtx);\n switch (block?.type) {\n case \"paragraph\":\n return (\n <div data-lw-kind=\"paragraph\" style={spacingStyle(block, ctx.spaceAfter)}>\n <Text as=\"p\" style={paragraphStyle(block, ctx.size)}>\n <Runs runs={block.runs} />\n </Text>\n </div>\n );\n case \"heading\": {\n const level = [1, 2, 3, 4, 5, 6].includes(block.level) ? block.level : 1;\n const Tag = `h${level}` as \"h1\";\n return (\n <div data-lw-kind=\"heading\" style={spacingStyle(block, 6, 12)}>\n <Heading as={Tag} weight=\"bold\" style={{ ...paragraphStyle(block, HEADING_SIZES[level - 1]!), fontWeight: 700 }}>\n <Runs runs={block.runs} />\n </Heading>\n </div>\n );\n }\n case \"list\":\n return (\n <div data-lw-kind=\"list\" style={{ display: \"flow-root\" }}>\n <ListLevel items={block.items} ordered={block.ordered === true} />\n </div>\n );\n case \"table\":\n return <TableView block={block} />;\n case \"code\":\n return (\n <div data-lw-kind=\"code\" style={{ display: \"flow-root\" }}>\n <Text\n as=\"div\"\n style={{\n margin: 0,\n fontFamily: MONO,\n fontSize: pt(10),\n lineHeight: SINGLE_LINE,\n backgroundColor: CODE_FILL,\n color: \"inherit\",\n whiteSpace: \"pre-wrap\",\n overflowWrap: \"break-word\",\n }}\n >\n {typeof block.text === \"string\" && block.text !== \"\" ? block.text : ZWSP}\n </Text>\n </div>\n );\n case \"quote\":\n return (\n <div data-lw-kind=\"quote\" style={{ display: \"flow-root\", marginLeft: pt(36), fontStyle: \"italic\", color: QUOTE_COLOR }}>\n <WithContext value={{ contentWidth: ctx.contentWidth - 36 }}>\n {(Array.isArray(block.blocks) ? block.blocks : []).map((b, i) => (\n <BlockView key={i} block={b} />\n ))}\n </WithContext>\n </div>\n );\n case \"image\":\n return <ImageView block={block} />;\n case \"chart\":\n return <ChartPlaceholder block={block} />;\n case \"hr\":\n return (\n <div data-lw-kind=\"hr\" style={{ display: \"flow-root\", paddingBottom: pt(ctx.spaceAfter) }}>\n <div style={{ height: pt(ctx.size * SINGLE_LINE), display: \"flex\", alignItems: \"flex-end\" }}>\n <Separator className=\"w-full\" />\n </div>\n </div>\n );\n case \"pageBreak\":\n return null;\n default:\n return null;\n }\n}\n\nfunction ListLevel({ items, ordered }: { items: unknown; ordered: boolean }) {\n const ctx = useContext(RenderCtx);\n const list = Array.isArray(items) ? (items as ListItem[]) : [];\n const style: CSSProperties = {\n margin: 0,\n paddingLeft: pt(36),\n listStyleType: ordered ? \"decimal\" : \"disc\",\n fontSize: pt(ctx.size),\n };\n const children = list.map((item, i) => (\n <li key={i} style={{ paddingLeft: pt(0) }}>\n <div style={spacingStyle(item, ctx.spaceAfter)}>\n <Text as=\"div\" style={paragraphStyle({ ...item, indentLeft: 0 }, ctx.size)}>\n <Runs runs={item?.runs} />\n </Text>\n </div>\n {Array.isArray(item?.children) && item.children.length > 0 && <ListLevel items={item.children} ordered={ordered} />}\n </li>\n ));\n return ordered ? <ol style={style}>{children}</ol> : <ul style={style}>{children}</ul>;\n}\n\nconst IMAGE_SRC = /^data:image\\/(png|jpe?g|gif|webp|bmp);base64,/i;\n\nfunction ImageView({ block }: { block: ImageBlock }) {\n const ctx = useContext(RenderCtx);\n const maxPx = ctx.contentWidth * PX_PER_PT;\n const size = resolveImageSize({ src: String(block.src ?? \"\"), widthPx: block.widthPx, heightPx: block.heightPx }, maxPx);\n // Only an embedded image is drawn. A remote URL in an untrusted document is\n // a request the reader never agreed to make (a tracking pixel).\n const src = typeof block.src === \"string\" && IMAGE_SRC.test(block.src) ? block.src : null;\n return (\n <div data-lw-kind=\"image\" style={{ display: \"flow-root\", paddingBottom: pt(ctx.spaceAfter) }}>\n {src ? (\n <ImageViewer\n src={src}\n alt={typeof block.alt === \"string\" ? block.alt : \"\"}\n fit=\"contain\"\n zoomable={false}\n pannable={false}\n controls={false}\n checkerboard={false}\n className=\"rounded-none bg-transparent dark:bg-transparent\"\n style={{ width: size.width, height: size.height, background: \"transparent\", borderRadius: 0 }}\n />\n ) : (\n <div\n data-lw-image-missing=\"\"\n style={{ width: size.width, height: size.height, border: \"0.75pt dashed #9CA3AF\", color: \"#6B7280\", fontSize: pt(9), padding: pt(4), boxSizing: \"border-box\" }}\n >\n {typeof block.alt === \"string\" && block.alt !== \"\" ? block.alt : \"Image\"}\n </div>\n )}\n </div>\n );\n}\n\nfunction ChartPlaceholder({ block }: { block: ChartBlock }) {\n const ctx = useContext(RenderCtx);\n const maxPx = ctx.contentWidth * PX_PER_PT;\n const width = Math.min(\n maxPx,\n num(block.widthPx, typeof block.width === \"number\" && block.width > 0 ? (maxPx * Math.min(100, block.width)) / 100 : maxPx),\n );\n const height = num(block.heightPx, width * 0.6);\n const option = (block.option ?? {}) as { title?: unknown };\n const title =\n typeof option.title === \"string\"\n ? option.title\n : option.title && typeof (option.title as { text?: unknown }).text === \"string\"\n ? ((option.title as { text: string }).text)\n : typeof block.alt === \"string\"\n ? block.alt\n : \"\";\n return (\n <div data-lw-kind=\"chart\" style={{ display: \"flow-root\", paddingBottom: pt(ctx.spaceAfter) }}>\n <div\n data-lw-chart-placeholder=\"\"\n style={{\n width,\n height,\n border: \"0.75pt dashed #9CA3AF\",\n color: \"#6B7280\",\n fontSize: pt(9),\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n boxSizing: \"border-box\",\n }}\n >\n {title ? `Chart: ${title}` : \"Chart\"}\n </div>\n </div>\n );\n}\n\n// ── Tables ─────────────────────────────────────────────────────────────────\n\nconst DEFAULT_TABLE_BORDER: Border = { style: \"single\", width: 0.5 };\nconst DEFAULT_CELL_PADDING = { top: 3, right: 5.4, bottom: 3, left: 5.4 };\n/** Word's own cell margins, for the sides a table's `cellPadding` leaves out. */\nconst WORD_CELL_PADDING = { top: 0, right: 5.4, bottom: 0, left: 5.4 };\n\nfunction sides(base: Required<BoxSides>, over: unknown): Required<BoxSides> {\n if (!over || typeof over !== \"object\") return base;\n const o = over as BoxSides;\n return {\n top: num(o.top, base.top),\n right: num(o.right, base.right),\n bottom: num(o.bottom, base.bottom),\n left: num(o.left, base.left),\n };\n}\n\n/**\n * A table, or the rows of it one page shows. `rows` lists the row indices to\n * draw (header rows first on a continuation page); absent means every row.\n */\nexport function TableView({ block, rows }: { block: TableBlock; rows?: number[] }) {\n const ctx = useContext(RenderCtx);\n const all = Array.isArray(block.rows) ? block.rows : [];\n const grid = tableGrid(all);\n const pct = columnPercents(grid.colCount, block.widths);\n const tb: TableBorders =\n block.borders && typeof block.borders === \"object\"\n ? block.borders\n : {\n top: DEFAULT_TABLE_BORDER,\n right: DEFAULT_TABLE_BORDER,\n bottom: DEFAULT_TABLE_BORDER,\n left: DEFAULT_TABLE_BORDER,\n insideH: DEFAULT_TABLE_BORDER,\n insideV: DEFAULT_TABLE_BORDER,\n };\n const basePad =\n block.cellPadding && typeof block.cellPadding === \"object\" ? sides(WORD_CELL_PADDING, block.cellPadding) : DEFAULT_CELL_PADDING;\n const widthPct = typeof block.width === \"number\" && block.width > 0 ? Math.min(100, block.width) : 100;\n const show = rows ?? all.map((_, i) => i);\n\n return (\n <div\n data-lw-kind=\"table\"\n style={{\n width: `${widthPct}%`,\n marginLeft: block.align === \"center\" || block.align === \"right\" ? \"auto\" : undefined,\n marginRight: block.align === \"center\" ? \"auto\" : undefined,\n }}\n >\n <Table data-lw-table=\"\" className=\"rounded-none border-0 overflow-visible\">\n <Table.Body className=\"divide-y-0\">\n <tr data-lw-sizer=\"\" aria-hidden=\"true\">\n {pct.map((p, i) => (\n <td key={i} style={{ width: `${p}%`, padding: 0, border: \"none\", height: 0 }} />\n ))}\n </tr>\n {show.map((r) => {\n const row = all[r];\n if (!row) return null;\n const header = row.header === true;\n return (\n <Table.Row key={r} data-lw-row={r} className=\"hover:bg-transparent dark:hover:bg-transparent\">\n {(grid.rows[r] ?? []).map((gc) => {\n const cell = row.cells[gc.cell]!;\n const cb = cell.borders && typeof cell.borders === \"object\" ? cell.borders : {};\n const edge = (own: Border | undefined, outer: Border | undefined, inner: Border | undefined, isOuter: boolean) =>\n borderCss(own ?? (isOuter ? outer : inner)) ?? \"none\";\n const pad = sides(basePad, cell.padding);\n const fill = hex(cell.shading) ?? (header ? HEADER_FILL : undefined);\n const style: CSSProperties = {\n borderTop: edge(cb.top, tb.top, tb.insideH, gc.row === 0),\n borderBottom: edge(cb.bottom, tb.bottom, tb.insideH, gc.row + gc.rowSpan >= all.length),\n borderLeft: edge(cb.left, tb.left, tb.insideV, gc.col === 0),\n borderRight: edge(cb.right, tb.right, tb.insideV, gc.col + gc.colSpan >= grid.colCount),\n padding: `${pt(pad.top)} ${pt(pad.right)} ${pt(pad.bottom)} ${pt(pad.left)}`,\n verticalAlign: cell.valign === \"center\" ? \"middle\" : cell.valign === \"bottom\" ? \"bottom\" : \"top\",\n backgroundColor: fill ?? \"transparent\",\n color: \"inherit\",\n fontSize: \"inherit\",\n fontWeight: \"inherit\",\n textAlign: \"left\",\n overflowWrap: \"break-word\",\n };\n return (\n <Table.Cell\n key={gc.cell}\n header={header}\n colSpan={gc.colSpan > 1 ? gc.colSpan : undefined}\n rowSpan={gc.rowSpan > 1 ? gc.rowSpan : undefined}\n data-lw-cell={`${r}:${gc.cell}`}\n style={style}\n >\n <WithContext\n value={{\n bold: header || ctx.bold,\n contentWidth: (ctx.contentWidth * widthPct * (pct.slice(gc.col, gc.col + gc.colSpan).reduce((a, b) => a + b, 0) / 100)) / 100,\n }}\n >\n {(Array.isArray(cell.blocks) ? cell.blocks : []).map((b, i) => (\n <BlockView key={i} block={b} />\n ))}\n </WithContext>\n </Table.Cell>\n );\n })}\n </Table.Row>\n );\n })}\n </Table.Body>\n </Table>\n </div>\n );\n}\n\n// ── Bands + footnotes ──────────────────────────────────────────────────────\n\nexport function isBlocksBand(band: unknown): band is BlocksBand {\n return !!band && typeof band === \"object\" && Array.isArray((band as BlocksBand).blocks);\n}\n\nexport function hasBand(band: unknown): band is Band | BlocksBand {\n if (isBlocksBand(band)) return band.blocks.length > 0;\n if (!band || typeof band !== \"object\") return false;\n const b = band as Band;\n return [b.left, b.center, b.right].some((s) => typeof s === \"string\" && s !== \"\");\n}\n\n/** A header or footer: a one-line band on Word's centre and right tab stops, or blocks. */\nexport function BandView({ band }: { band: Band | BlocksBand }) {\n const ctx = useContext(RenderCtx);\n if (isBlocksBand(band)) {\n return (\n <WithContext value={{ marks: EMPTY_MARKS }}>\n {band.blocks.map((b, i) => (b?.type === \"pageBreak\" || b?.type === \"chart\" ? null : <BlockView key={i} block={b} />))}\n </WithContext>\n );\n }\n const slot = (v: unknown): string => (typeof v === \"string\" ? (ctx.fields ? substituteFields(v, ctx.fields) : v) : \"\");\n return (\n <Text\n as=\"div\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"1fr auto 1fr\",\n fontSize: pt(num(band.size, BAND_SIZE)),\n lineHeight: SINGLE_LINE,\n color: hex(band.color) ?? BAND_COLOR,\n whiteSpace: \"pre\",\n }}\n >\n <span data-lw-slot=\"left\" style={{ textAlign: \"left\" }}>{slot(band.left)}</span>\n <span data-lw-slot=\"center\" style={{ textAlign: \"center\" }}>{slot(band.center)}</span>\n <span data-lw-slot=\"right\" style={{ textAlign: \"right\", justifySelf: \"end\" }}>{slot(band.right)}</span>\n </Text>\n );\n}\n\n/** One footnote as it sits at the foot of a page: its number, then its blocks at 10pt. */\nexport function FootnoteView({ id, footnote }: { id: number; footnote: Footnote }) {\n return (\n <div data-footnote={id} style={{ display: \"flex\", gap: pt(3) }}>\n <sup style={{ fontSize: pt(FOOTNOTE_SIZE * 0.65), lineHeight: 1, paddingTop: pt(2) }}>{id}</sup>\n <div style={{ flex: 1, minWidth: 0 }}>\n <WithContext value={{ marks: EMPTY_MARKS, size: FOOTNOTE_SIZE, spaceAfter: 0 }}>\n {(Array.isArray(footnote.blocks) ? footnote.blocks : []).map((b, i) => (\n <BlockView key={i} block={b} />\n ))}\n </WithContext>\n </div>\n </div>\n );\n}\n\n/** The short rule above a page's footnotes; its box is FOOTNOTE_SEPARATOR_PT tall. */\nexport function FootnoteSeparator({ height }: { height: string }) {\n return (\n <div data-lw-footnote-separator=\"\" style={{ height, display: \"flex\", alignItems: \"center\" }}>\n <div style={{ width: pt(144), borderTop: `${pt(0.5)} solid #000000` }} />\n </div>\n );\n}\n","import { bodyBox, type BodyBox, type PageGeometry } from \"./geometry\";\nimport { hasBand } from \"./render\";\nimport type { Band, BlocksBand, Page } from \"./types\";\n\n/**\n * Which header and footer each page draws (last-word 0.16.0).\n *\n * `page.header` / `page.footer` are the defaults. Beside them:\n * - `firstHeader` / `firstFooter`: page 1 only (Word's \"Different first page\");\n * - `evenHeader` / `evenFooter`: pages 2, 4, ... (Word's \"Different odd and\n * even pages\"), the default then being the odd pages'.\n * A kind with no variant shows its default on those pages too. A variant of\n * `{\"blocks\": []}` (or a one-line band with no text) is present but empty, so\n * it BLANKS that page's band rather than falling back.\n *\n * So pages fall in three classes -- page 1, even pages, other odd pages --\n * and every page of a class draws the same bands, at the same heights. The\n * packer takes one body height per class (`PackOptions.firstPageHeight` /\n * `evenPageHeight` / `pageHeight`) and `pageBodyBoxes` derives them.\n */\n\nexport type BandKind = \"header\" | \"footer\";\n/** Which of a kind's bands applies: the default, the first-page or the even-page one. */\nexport type BandSlot = \"default\" | \"first\" | \"even\";\n/** Page 1, an even page, or an odd page after the first. */\nexport type PageClass = \"first\" | \"even\" | \"odd\";\n\n/** Measured band heights per kind and slot, in any one unit; 0 when absent or blank. */\nexport type BandHeights = Record<BandKind, Record<BandSlot, number>>;\n\nexport const BAND_SLOTS: readonly BandSlot[] = [\"default\", \"first\", \"even\"];\n\nconst VARIANT_KEY: Record<BandKind, Record<Exclude<BandSlot, \"default\">, keyof Page>> = {\n header: { first: \"firstHeader\", even: \"evenHeader\" },\n footer: { first: \"firstFooter\", even: \"evenFooter\" },\n};\n\n/** The class of the page at 0-based `index`. */\nexport function pageClass(index: number): PageClass {\n if (index === 0) return \"first\";\n return index % 2 === 1 ? \"even\" : \"odd\";\n}\n\nconst isBandObject = (v: unknown): v is Band | BlocksBand => !!v && typeof v === \"object\" && !Array.isArray(v);\n\n/** The raw band stored in a slot, or undefined when the slot is not set (a non-object counts as unset). */\nexport function slotBand(page: Page | undefined, kind: BandKind, slot: BandSlot): Band | BlocksBand | undefined {\n if (!page || typeof page !== \"object\") return undefined;\n const key = slot === \"default\" ? kind : VARIANT_KEY[kind][slot];\n const v = (page as Record<string, unknown>)[key];\n return isBandObject(v) ? v : undefined;\n}\n\n/** The slot a page class draws for one kind: its variant when that is set, else the default. */\nexport function bandSlot(page: Page | undefined, kind: BandKind, cls: PageClass): BandSlot {\n if (cls === \"first\" && slotBand(page, kind, \"first\") !== undefined) return \"first\";\n if (cls === \"even\" && slotBand(page, kind, \"even\") !== undefined) return \"even\";\n return \"default\";\n}\n\n/**\n * The band the page at 0-based `index` draws for `kind`, or null when it\n * draws none (no band, or a blank variant).\n */\nexport function pageBand(page: Page | undefined, kind: BandKind, index: number): Band | BlocksBand | null {\n const band = slotBand(page, kind, bandSlot(page, kind, pageClass(index)));\n return hasBand(band) ? band : null;\n}\n\n/**\n * The body box of each page class from the measured band heights (points):\n * each class uses the header and footer it actually draws, so a tall\n * first-page letterhead moves only page 1's body down.\n */\nexport function pageBodyBoxes(g: PageGeometry, page: Page | undefined, heights: BandHeights): Record<PageClass, BodyBox> {\n const height = (kind: BandKind, cls: PageClass): number => {\n const slot = bandSlot(page, kind, cls);\n return hasBand(slotBand(page, kind, slot)) ? Math.max(0, heights[kind][slot] || 0) : 0;\n };\n const box = (cls: PageClass) => bodyBox(g, height(\"header\", cls), height(\"footer\", cls));\n return { first: box(\"first\"), even: box(\"even\"), odd: box(\"odd\") };\n}\n","import type { Block, Doc, Footnote, ListItem, Run } from \"./types\";\n\nexport interface FootnoteNumbering {\n /** Run object -> its mark number. Keyed by identity, so the Doc must not be cloned between numbering and render. */\n marks: Map<Run, number>;\n /** Every footnote in mark order. */\n notes: Array<{ id: number; footnote: Footnote }>;\n}\n\n/**\n * Number the document's footnote marks 1, 2, 3 in reading order, as Word does\n * (last-word 0.15.0 carries no number in the model).\n *\n * Walks the BODY only. A footnote in a header or footer, or inside another\n * footnote, is something Word cannot hold and last-word's repairer drops; if\n * one arrives anyway it is not numbered and renders no mark.\n */\nexport function numberFootnotes(doc: Doc): FootnoteNumbering {\n const marks = new Map<Run, number>();\n const notes: FootnoteNumbering[\"notes\"] = [];\n\n const runs = (list: unknown): void => {\n if (!Array.isArray(list)) return;\n for (const run of list as Run[]) {\n const fn = run?.footnote;\n if (fn && typeof fn === \"object\" && Array.isArray(fn.blocks)) {\n const id = notes.length + 1;\n marks.set(run, id);\n notes.push({ id, footnote: fn });\n }\n }\n };\n const items = (list: unknown): void => {\n if (!Array.isArray(list)) return;\n for (const item of list as ListItem[]) {\n runs(item?.runs);\n items(item?.children);\n }\n };\n const blocks = (list: unknown): void => {\n if (!Array.isArray(list)) return;\n for (const block of list as Block[]) {\n switch (block?.type) {\n case \"heading\":\n case \"paragraph\":\n runs(block.runs);\n break;\n case \"list\":\n items(block.items);\n break;\n case \"quote\":\n blocks(block.blocks);\n break;\n case \"table\":\n for (const row of Array.isArray(block.rows) ? block.rows : []) {\n for (const cell of Array.isArray(row?.cells) ? row.cells : []) blocks(cell?.blocks);\n }\n break;\n default:\n break;\n }\n }\n };\n\n blocks(doc.blocks);\n return { marks, notes };\n}\n","import { BAND_SLOTS, type BandHeights } from \"./bands\";\nimport { tableGrid } from \"./table-grid\";\nimport type { PackItem } from \"./paginate\";\nimport type { Block } from \"./types\";\n\n/**\n * DOM measurement: rendered blocks in, packer items out.\n *\n * Every block is rendered once into a hidden container at the page's text\n * width, with the same typography the pages use; this reads that container.\n * It is the only part of pagination that needs a browser, and it does nothing\n * but read rectangles -- every decision about where a page ends is made by the\n * pure `paginate()`.\n */\n\n/** Blocks whose text may be cut between lines. */\nconst SPLITTABLE = new Set([\"paragraph\", \"heading\", \"list\", \"quote\", \"code\"]);\n\nexport const blockId = (index: number): string => `b${index}`;\n\nfunction height(el: Element | null | undefined): number {\n return el ? el.getBoundingClientRect().height : 0;\n}\n\n/**\n * Offsets (from the element's top) of the bottom of every text line but the\n * last: the places a page may cut the block without slicing a line. Lines are\n * found by merging the vertical extents of every text fragment's client rects,\n * so a line holding mixed sizes is still one line, and a cut can only fall\n * where NO text crosses -- inside a quote holding a table, too.\n */\nexport function lineBreakpoints(el: HTMLElement): number[] {\n if (typeof document === \"undefined\" || typeof document.createRange !== \"function\") return [];\n const top = el.getBoundingClientRect().top;\n const total = el.getBoundingClientRect().height;\n const range = document.createRange();\n if (typeof range.getClientRects !== \"function\") return [];\n const spans: Array<[number, number]> = [];\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n if (!node.nodeValue) continue;\n range.selectNodeContents(node);\n for (const r of Array.from(range.getClientRects())) {\n if (r.height > 0) spans.push([r.top - top, r.bottom - top]);\n }\n }\n spans.sort((a, b) => a[0] - b[0]);\n const lines: Array<[number, number]> = [];\n for (const s of spans) {\n const last = lines[lines.length - 1];\n if (last && s[0] < last[1] - 0.5) last[1] = Math.max(last[1], s[1]);\n else lines.push([s[0], s[1]]);\n }\n return lines\n .slice(0, -1)\n .map((l) => l[1])\n .filter((b) => b > 0 && b < total - 0.5);\n}\n\nexport interface Measured {\n items: PackItem[];\n /** px: the default header (`bands.header.default`). */\n headerHeight: number;\n /** px: the default footer (`bands.footer.default`). */\n footerHeight: number;\n /** px, every header and footer slot; 0 for one not drawn. */\n bands: BandHeights;\n /** px */\n footnoteSeparator: number;\n}\n\n/**\n * Read the measuring container `root`. It holds `[data-lw-measure-block=i]`\n * per block, `[data-lw-measure-footnote=id]` per note,\n * `[data-lw-measure-band=\"header:first\"]` (kind:slot) per drawn band, and the\n * separator under `data-lw-measure-separator`.\n */\nexport function measure(root: HTMLElement, blocks: Block[]): Measured {\n const noteHeights = new Map<number, number>();\n root.querySelectorAll<HTMLElement>(\"[data-lw-measure-footnote]\").forEach((el) => {\n noteHeights.set(Number(el.dataset.lwMeasureFootnote), height(el));\n });\n const marksIn = (el: Element) =>\n Array.from(el.querySelectorAll<HTMLElement>(\"[data-lw-footnote-ref]\")).map((m) => {\n const id = Number(m.dataset.lwFootnoteRef);\n return { id, el: m, height: noteHeights.get(id) ?? 0 };\n });\n\n const items: PackItem[] = blocks.map((block, i): PackItem => {\n if (block?.type === \"pageBreak\") return { type: \"break\" };\n const wrap = root.querySelector<HTMLElement>(`[data-lw-measure-block=\"${i}\"]`);\n if (!wrap) return { type: \"block\", id: blockId(i), height: 0 };\n\n if (block.type === \"table\") {\n const grid = tableGrid(Array.isArray(block.rows) ? block.rows : []);\n const rows = Array.from(wrap.querySelectorAll<HTMLElement>(\"tr[data-lw-row]\")).map((tr) => {\n const r = Number(tr.dataset.lwRow);\n const notes = marksIn(tr).map(({ id, height: h }) => ({ id, height: h }));\n return {\n height: height(tr),\n ...(grid.joinPrevious[r] ? { joinPrevious: true } : {}),\n ...(notes.length ? { footnotes: notes } : {}),\n };\n });\n return { type: \"table\", id: blockId(i), rows, headerRows: grid.headerRows };\n }\n\n const top = wrap.getBoundingClientRect().top;\n const h = height(wrap);\n let breakpoints = SPLITTABLE.has(block.type) ? lineBreakpoints(wrap) : [];\n // Widow and orphan control, as Word's default: never leave one line of a\n // paragraph alone at the foot or the head of a page.\n if (block.type === \"paragraph\" || block.type === \"heading\") breakpoints = breakpoints.slice(1, -1);\n // A mark belongs to the line it sits on: take its vertical centre, which\n // stays inside that line even though the superscript rises above it.\n const notes = marksIn(wrap).map(({ id, el, height: nh }) => {\n const r = el.getBoundingClientRect();\n return { id, at: Math.min(h, Math.max(0, (r.top + r.bottom) / 2 - top)), height: nh };\n });\n const keepNext = block.type === \"heading\" || (block as { keepNext?: unknown }).keepNext === true;\n return {\n type: \"block\",\n id: blockId(i),\n height: h,\n ...(breakpoints.length ? { breakpoints } : {}),\n ...(keepNext ? { keepNext: true } : {}),\n ...(notes.length ? { footnotes: notes } : {}),\n };\n });\n\n const bands = { header: {}, footer: {} } as BandHeights;\n for (const kind of [\"header\", \"footer\"] as const) {\n for (const slot of BAND_SLOTS) {\n bands[kind][slot] = height(root.querySelector(`[data-lw-measure-band=\"${kind}:${slot}\"]`));\n }\n }\n\n return {\n items,\n headerHeight: bands.header.default,\n footerHeight: bands.footer.default,\n bands,\n footnoteSeparator: height(root.querySelector(\"[data-lw-measure-separator]\")),\n };\n}\n","/**\n * The page packer: measured heights in, page assignments out.\n *\n * Pure and deterministic -- no DOM, no React -- so every pagination rule is a\n * unit test rather than a screenshot. `measure.ts` turns rendered blocks into\n * these items; `DocViewer` renders the pages this returns. All lengths are in\n * one unit (the viewer uses CSS px); the packer never converts.\n *\n * What it splits, and where:\n * - a block with `breakpoints` (the bottoms of its text lines) at the deepest\n * breakpoint that fits -- paragraphs, headings, lists, quotes and code;\n * - a table between rows, repeating its leading header rows on every\n * continuation page, and never inside a row span (`joinPrevious`);\n * - anything else, only when it is taller than a whole page, by cutting it at\n * the page height (`forced: true`). A forced cut can fall through a line of\n * text or an image; it is the alternative to losing content, not a layout.\n * It never splits a table ROW: a row taller than a page is placed alone and\n * flagged `overflow`.\n */\n\n/** A footnote mark inside a block: `at` is its offset from the block's top. */\nexport interface FootnoteMark {\n id: number;\n at: number;\n /** The rendered height of the note itself. */\n height: number;\n}\n\nexport interface BlockItem {\n type: \"block\";\n id: string;\n height: number;\n /** Offsets from the block's top where a cut is allowed, ascending. */\n breakpoints?: number[];\n /** Keep on the same page as (the first piece of) the next item. */\n keepNext?: boolean;\n footnotes?: FootnoteMark[];\n}\n\nexport interface TableRowItem {\n height: number;\n /** A row span from above reaches this row: no break before it. */\n joinPrevious?: boolean;\n footnotes?: Array<{ id: number; height: number }>;\n}\n\nexport interface TableItem {\n type: \"table\";\n id: string;\n rows: TableRowItem[];\n /** How many leading rows are header rows (repeated on each page). */\n headerRows?: number;\n}\n\nexport interface BreakItem {\n type: \"break\";\n}\n\nexport type PackItem = BlockItem | TableItem | BreakItem;\n\nexport interface PackOptions {\n /**\n * The body height available on a page no variant below covers: every page\n * when neither is given, else the odd pages after the first.\n */\n pageHeight: number;\n /**\n * The body height of page 1, when its header or footer differs from the\n * rest (a first-page letterhead). `pageHeight` when absent.\n */\n firstPageHeight?: number;\n /**\n * The body height of the even pages (2, 4, ...), when their bands differ.\n * `pageHeight` when absent. Page 1 is odd, so it never takes this.\n */\n evenPageHeight?: number;\n /**\n * Height of the separator rule above a page's footnotes, reserved once on\n * any page that holds at least one note. 0 when absent.\n */\n footnoteSeparator?: number;\n}\n\nexport interface BlockFragment {\n type: \"block\";\n id: string;\n /** Index into the items array. */\n item: number;\n /** Offsets within the block: the window [start, end) shown on this page. */\n start: number;\n end: number;\n /** Cut at the page height because the block is taller than a page and had no breakpoint that fit. */\n forced?: boolean;\n}\n\nexport interface TableFragment {\n type: \"table\";\n id: string;\n item: number;\n /** Row indices to draw, header rows first. */\n rows: number[];\n /** True on a continuation page, where the header rows are a repeat. */\n repeatedHeader: boolean;\n /** A row taller than the page was placed anyway. */\n overflow?: boolean;\n}\n\nexport type Fragment = BlockFragment | TableFragment;\n\nexport interface PageLayout {\n /** 0-based. */\n index: number;\n fragments: Fragment[];\n /** Footnote ids whose marks are on this page, in order. */\n footnotes: number[];\n /** Body height used, footnotes and separator included. */\n used: number;\n /** The body height this page had to fill (`pageCapacity()` for its index). */\n capacity: number;\n}\n\nconst EPS = 1e-6;\n\nconst positive = (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v) && v > 0;\n\n/**\n * The body height of the page at 0-based `index`: page 1 takes\n * `firstPageHeight`, even pages (odd indices) `evenPageHeight`, the rest\n * `pageHeight`. A variant that is absent, non-finite or not positive falls\n * back to `pageHeight`. At least 1, so a page always makes progress.\n */\nexport function pageCapacity(options: PackOptions, index: number): number {\n const base = Math.max(1, positive(options.pageHeight) ? options.pageHeight : 1);\n if (index === 0) return positive(options.firstPageHeight) ? Math.max(1, options.firstPageHeight) : base;\n if (index % 2 === 1) return positive(options.evenPageHeight) ? Math.max(1, options.evenPageHeight) : base;\n return base;\n}\n\nexport function paginate(items: PackItem[], options: PackOptions): PageLayout[] {\n // Every rule below works at the capacity of the page it is filling; `cap`\n // is re-read on each new page.\n let cap = pageCapacity(options, 0);\n const sep = Math.max(0, options.footnoteSeparator ?? 0);\n const pages: PageLayout[] = [];\n\n // Current page state.\n let page!: PageLayout;\n let content = 0; // body content height placed (no notes)\n let noteHeights = 0; // sum of note heights on the page\n\n const newPage = (): void => {\n cap = pageCapacity(options, pages.length);\n page = { index: pages.length, fragments: [], footnotes: [], used: 0, capacity: cap };\n pages.push(page);\n content = 0;\n noteHeights = 0;\n };\n const noteCost = (extraCount: number, extraHeight: number): number => {\n const count = page.footnotes.length + extraCount;\n return count > 0 ? noteHeights + extraHeight + sep : 0;\n };\n const fits = (h: number, notes: Array<{ height: number }>): boolean =>\n content + h + noteCost(notes.length, sum(notes)) <= cap + EPS;\n const commit = (h: number, notes: Array<{ id: number; height: number }>): void => {\n content += h;\n for (const n of notes) {\n page.footnotes.push(n.id);\n noteHeights += n.height;\n }\n page.used = content + noteCost(0, 0);\n };\n const empty = (): boolean => page.fragments.length === 0;\n\n newPage();\n\n items.forEach((item, index) => {\n if (item.type === \"break\") {\n newPage();\n return;\n }\n if (item.type === \"table\") {\n placeTable(item, index);\n return;\n }\n placeBlock(item, index);\n });\n\n return pages;\n\n function notesIn(item: BlockItem, start: number, end: number, last: boolean): FootnoteMark[] {\n // Clamped into the block: a superscript mark on the first line measures a\n // little ABOVE the block's top, and a mark must never fall between\n // fragments -- every note lands on exactly one page.\n const h = Math.max(0, item.height);\n return (item.footnotes ?? []).filter((n) => {\n const at = Math.min(h, Math.max(0, n.at));\n return at >= start - EPS && (last ? at <= end + EPS : at < end - EPS);\n });\n }\n\n /** Height of an item's first unbreakable piece -- what a keep-with-next needs on the page. */\n function firstPiece(item: PackItem | undefined): number {\n if (!item || item.type === \"break\") return 0;\n if (item.type === \"block\") {\n const bp = (item.breakpoints ?? []).find((b) => b > EPS && b < item.height - EPS);\n return bp ?? item.height;\n }\n const header = item.rows.slice(0, headerCount(item)).reduce((a, r) => a + r.height, 0);\n const units = tableUnits(item);\n return header + (units[0] ? units[0].height : 0);\n }\n\n function keepChainHeight(from: number): number {\n // Every keepNext block in the chain whole, then the first piece of the item after it.\n let total = 0;\n let i = from;\n while (i < items.length) {\n const it = items[i]!;\n if (it.type === \"block\" && it.keepNext) {\n total += it.height;\n i++;\n continue;\n }\n total += firstPiece(it);\n break;\n }\n return total;\n }\n\n function placeBlock(item: BlockItem, index: number): void {\n const height = Math.max(0, item.height);\n\n if (item.keepNext && !empty()) {\n const chain = keepChainHeight(index);\n const next = items[index + 1];\n const meaningful = next !== undefined && next.type !== \"break\";\n // Move the chain only if the page it would move to can hold it.\n const nextCap = pageCapacity(options, page.index + 1);\n if (meaningful && chain <= nextCap + EPS && !fits(chain, notesIn(item, 0, height, true))) newPage();\n }\n\n let start = 0;\n for (let guard = 0; guard < 100000; guard++) {\n const restNotes = notesIn(item, start, height, true);\n if (fits(height - start, restNotes)) {\n page.fragments.push({ type: \"block\", id: item.id, item: index, start, end: height });\n commit(height - start, restNotes);\n return;\n }\n\n // The deepest breakpoint that fits, with the notes its fragment carries.\n const bps = (item.breakpoints ?? []).filter((b) => b > start + EPS && b < height - EPS).sort((a, b) => b - a);\n let cut: number | undefined;\n for (const bp of bps) {\n if (fits(bp - start, notesIn(item, start, bp, false))) {\n cut = bp;\n break;\n }\n }\n if (cut !== undefined) {\n page.fragments.push({ type: \"block\", id: item.id, item: index, start, end: cut });\n commit(cut - start, notesIn(item, start, cut, false));\n newPage();\n start = cut;\n continue;\n }\n\n if (!empty()) {\n newPage();\n continue;\n }\n\n // Alone on an empty page and still too tall: cut at what the page holds.\n let room = cap;\n let end = Math.min(height, start + room);\n let notes = notesIn(item, start, end, false);\n room = cap - noteCost(notes.length, sum(notes));\n if (room <= EPS) room = cap; // notes taller than a page: place them, the page overflows\n end = Math.min(height, start + room);\n notes = notesIn(item, start, end, end >= height - EPS);\n const forced = end < height - EPS;\n page.fragments.push({ type: \"block\", id: item.id, item: index, start, end, ...(forced ? { forced: true } : {}) });\n commit(end - start, notes);\n if (!forced) return;\n newPage();\n start = end;\n }\n }\n\n function headerCount(item: TableItem): number {\n return Math.max(0, Math.min(item.headerRows ?? 0, item.rows.length));\n }\n\n /** Body rows grouped so no group starts at a row a span reaches into. */\n function tableUnits(item: TableItem): Array<{ rows: number[]; height: number; notes: Array<{ id: number; height: number }> }> {\n const units: Array<{ rows: number[]; height: number; notes: Array<{ id: number; height: number }> }> = [];\n for (let r = headerCount(item); r < item.rows.length; r++) {\n const row = item.rows[r]!;\n const last = units[units.length - 1];\n if (row.joinPrevious && last) {\n last.rows.push(r);\n last.height += row.height;\n last.notes.push(...(row.footnotes ?? []));\n } else {\n units.push({ rows: [r], height: row.height, notes: [...(row.footnotes ?? [])] });\n }\n }\n return units;\n }\n\n function placeTable(item: TableItem, index: number): void {\n const h = headerCount(item);\n const headerIdx = Array.from({ length: h }, (_, i) => i);\n const headerHeight = item.rows.slice(0, h).reduce((a, r) => a + r.height, 0);\n const headerNotes = item.rows.slice(0, h).flatMap((r) => r.footnotes ?? []);\n const units = tableUnits(item);\n if (units.length === 0 && h === 0) return;\n if (units.length === 0) units.push({ rows: [], height: 0, notes: [] });\n\n let frag: TableFragment | null = null;\n let first = true;\n\n for (let u = 0; u < units.length; ) {\n const unit = units[u]!;\n if (frag === null) {\n // A fragment opens with the header rows: never a header alone at the foot.\n const notes = first ? [...headerNotes, ...unit.notes] : unit.notes;\n const need = headerHeight + unit.height;\n if (!fits(need, notes) && !empty()) {\n newPage();\n continue;\n }\n const overflow = !fits(need, notes);\n frag = {\n type: \"table\",\n id: item.id,\n item: index,\n rows: [...headerIdx, ...unit.rows],\n repeatedHeader: !first && h > 0,\n ...(overflow ? { overflow: true } : {}),\n };\n page.fragments.push(frag);\n commit(need, notes);\n first = false;\n u++;\n continue;\n }\n if (fits(unit.height, unit.notes)) {\n frag.rows.push(...unit.rows);\n commit(unit.height, unit.notes);\n u++;\n continue;\n }\n newPage();\n frag = null;\n }\n }\n}\n\nfunction sum(notes: Array<{ height: number }>): number {\n return notes.reduce((a, n) => a + n.height, 0);\n}\n","/**\n * The few rules inline styles cannot reach: react-fancy's Table renders its own\n * <table>, and Separator renders an <hr> with no style prop. Kept identical to\n * styles.css (tests/styles.test.ts checks), which is the CSP-strict route.\n * Every rule is scoped to the viewer and low-specificity.\n */\nexport const VIEWER_CSS = `\n:where([data-lw-viewer]) [data-lw-table] > table { width: 100%; border-collapse: collapse; table-layout: fixed; }\n:where([data-lw-viewer]) [data-lw-table] { border: 0; border-radius: 0; overflow: visible; }\n:where([data-lw-viewer]) [data-lw-sizer] > td { height: 0; padding: 0; border: none; }\n:where([data-lw-viewer]) hr[data-react-fancy-separator] { margin: 0; width: 100%; border: 0; border-top: 0.75pt solid #000000; }\n:where([data-lw-viewer]) [data-lw-sheet] p, :where([data-lw-viewer]) [data-lw-measure] p { margin-top: 0; margin-bottom: 0; }\n`.trim();\n","import { useEffect, useLayoutEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { BAND_SLOTS, bandSlot, pageBand, pageBodyBoxes, pageClass, slotBand, type BandKind, type BandSlot, type PageClass } from \"./bands\";\nimport { resolveNow, type PageFields } from \"./fields\";\nimport { numberFootnotes, type FootnoteNumbering } from \"./footnotes\";\nimport { PX_PER_PT, pageGeometry, type BodyBox, type PageGeometry } from \"./geometry\";\nimport { blockId, measure } from \"./measure\";\nimport { paginate, type Fragment, type PageLayout } from \"./paginate\";\nimport {\n BandView,\n BlockView,\n FootnoteSeparator,\n FootnoteView,\n RenderCtx,\n TableView,\n hasBand,\n type RenderContext,\n} from \"./render\";\nimport { DEFAULT_SIZE, DEFAULT_SPACE_AFTER, FOOTNOTE_SEPARATOR_PT, SINGLE_LINE, fontStack, num, pt, px } from \"./style\";\nimport { VIEWER_CSS } from \"./viewer-css\";\nimport type { Block, Doc, Page, TableBlock } from \"./types\";\n\nexport interface DocViewerLayout {\n /** Number of pages the document laid out to. */\n pages: number;\n /** Page size in points, orientation applied. */\n pageWidth: number;\n pageHeight: number;\n /** The scale the pages are drawn at. */\n scale: number;\n}\n\nexport interface DocViewerProps {\n /** The document: last-word JSON, e.g. `new DocxReader().read(bytes)`. */\n doc: Doc;\n /**\n * `\"width\"` (default) scales each page down to the viewer's width -- a\n * narrow preview panel shows whole pages, never reflowed text. `\"none\"`\n * draws pages at 100%.\n */\n fit?: \"width\" | \"none\";\n /** A fixed scale (1 = 100%). Overrides `fit`. */\n scale?: number;\n /** The largest scale `fit: \"width\"` will use. Default 1, so a wide panel does not enlarge the page. */\n maxScale?: number;\n /** Space between pages, in CSS px. Default 16. */\n gap?: number;\n /**\n * What a `{filename}` field in a header or footer shows. The viewer cannot\n * know the file's name, so it is empty unless given.\n */\n filename?: string;\n /**\n * The moment `{date}` / `{time}` fields show: a Date or an ISO-8601 string\n * (JSON-friendly). Default: the time of the first render. Pass it for\n * deterministic output (tests, agents, a print preview \"as of\" a date).\n */\n now?: Date | string;\n /** Called after every layout with JSON-serializable facts about it. */\n onLayout?: (layout: DocViewerLayout) => void;\n /**\n * Render the viewer's small stylesheet as a React 19 hoisted `<style>`.\n * Default true. Set false under a strict CSP and import\n * `@particle-academy/last-word-ui/styles.css` instead.\n */\n injectStyles?: boolean;\n id?: string;\n className?: string;\n style?: CSSProperties;\n}\n\ninterface Layout {\n pages: PageLayout[];\n /** The body box of each page class: its bands can differ, so its body can too. */\n boxes: Record<PageClass, BodyBox>;\n /** Measured block heights (px), by item index, to tell a whole block from a fragment. */\n heights: number[];\n}\n\n/**\n * A read-only, paged view of a last-word Doc: every page at its paper size,\n * broken by content height, with the header and footer at their distances,\n * live page numbers and footnotes at the foot of the page that holds the mark.\n *\n * Stable handles: the root carries `data-lw-viewer`; each page `data-page`\n * (1-based); each block or fragment of one `data-block` (`b0`, `b1`, ... in\n * document order); each footnote `data-footnote`; bands `data-lw-band`, with\n * `data-lw-band-variant` naming the one drawn (`default`, `first`, `even`).\n *\n * Header and footer text takes field tokens -- `{page}`, `{pages}`,\n * `{section}`, `{sectionpages}`, `{author}`, `{title}`, `{filename}`, `{date}`,\n * `{time}`, `{date:FORMAT}`, `{time:FORMAT}` -- drawn as plain text. In the\n * body they stay literal.\n */\nexport function DocViewer({\n doc,\n fit = \"width\",\n scale: fixedScale,\n maxScale = 1,\n gap = 16,\n filename,\n now,\n onLayout,\n injectStyles = true,\n id,\n className,\n style,\n}: DocViewerProps) {\n const geometry = useMemo(() => pageGeometry(doc), [doc]);\n const numbering = useMemo(() => numberFootnotes(doc), [doc]);\n const blocks: Block[] = useMemo(() => (Array.isArray(doc?.blocks) ? doc.blocks : []), [doc]);\n const page: Page | undefined = doc?.page && typeof doc.page === \"object\" ? doc.page : undefined;\n // Keyed by value, so a parent passing a fresh Date each render does not re-lay out.\n const nowKey = now instanceof Date ? now.getTime() : now;\n const nowDate = useMemo(() => resolveNow(nowKey === undefined ? undefined : typeof nowKey === \"number\" ? new Date(nowKey) : nowKey), [nowKey]);\n const author = doc?.meta && typeof doc.meta === \"object\" ? doc.meta.author : undefined;\n const title = doc?.title;\n // Everything a band field shows except the page numbers. Shared by the\n // measuring copy and the pages, so both render the same text.\n const docFields: Omit<PageFields, \"page\" | \"pages\"> = useMemo(\n () => ({\n section: 1,\n ...(typeof author === \"string\" ? { author } : {}),\n ...(typeof title === \"string\" ? { title } : {}),\n ...(typeof filename === \"string\" ? { filename } : {}),\n now: nowDate,\n }),\n [author, title, filename, nowDate],\n );\n\n const rootRef = useRef<HTMLDivElement>(null);\n const measureRef = useRef<HTMLDivElement>(null);\n const [layout, setLayout] = useState<Layout | null>(null);\n const [fontEpoch, setFontEpoch] = useState(0);\n const [width, setWidth] = useState<number | null>(null);\n\n const ctx: RenderContext = useMemo(\n () => ({\n marks: numbering.marks,\n size: num(doc?.defaultSize, DEFAULT_SIZE),\n spaceAfter: DEFAULT_SPACE_AFTER,\n contentWidth: geometry.contentWidth,\n }),\n [numbering, doc, geometry],\n );\n\n useLayoutEffect(() => {\n const el = measureRef.current;\n if (!el) return;\n const m = measure(el, blocks);\n const toPt = (h: Record<BandSlot, number>): Record<BandSlot, number> => ({\n default: h.default / PX_PER_PT,\n first: h.first / PX_PER_PT,\n even: h.even / PX_PER_PT,\n });\n // One body box per page class, from the bands that class actually draws.\n const boxes = pageBodyBoxes(geometry, page, { header: toPt(m.bands.header), footer: toPt(m.bands.footer) });\n const pages = paginate(m.items, {\n pageHeight: boxes.odd.height * PX_PER_PT,\n firstPageHeight: boxes.first.height * PX_PER_PT,\n evenPageHeight: boxes.even.height * PX_PER_PT,\n footnoteSeparator: m.footnoteSeparator,\n });\n const heights = m.items.map((it) => (it.type === \"block\" ? it.height : 0));\n setLayout({ pages, boxes, heights });\n }, [blocks, geometry, numbering, fontEpoch, page, docFields]);\n\n // Web fonts change line breaks; lay out again once they have loaded.\n useEffect(() => {\n const fonts = typeof document !== \"undefined\" ? document.fonts : undefined;\n let live = true;\n fonts?.ready?.then(() => live && setFontEpoch((e) => e + 1)).catch(() => undefined);\n return () => {\n live = false;\n };\n }, []);\n\n useLayoutEffect(() => {\n const el = rootRef.current;\n if (!el) return;\n setWidth(el.clientWidth || null);\n if (typeof ResizeObserver === \"undefined\") return;\n const ro = new ResizeObserver((entries) => {\n const w = entries[0]?.contentRect.width;\n if (w) setWidth(w);\n });\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const pageWpx = geometry.width * PX_PER_PT;\n const scale =\n typeof fixedScale === \"number\" && fixedScale > 0\n ? fixedScale\n : fit === \"none\" || !width\n ? 1\n : Math.min(maxScale, width / pageWpx);\n\n const pageCount = layout?.pages.length ?? 0;\n useEffect(() => {\n if (layout) onLayout?.({ pages: layout.pages.length, pageWidth: geometry.width, pageHeight: geometry.height, scale });\n }, [layout, geometry, scale, onLayout]);\n\n const typography: CSSProperties = {\n fontFamily: fontStack(doc?.defaultFont),\n fontSize: pt(ctx.size),\n lineHeight: SINGLE_LINE,\n color: \"#000000\",\n textAlign: \"left\",\n };\n\n return (\n <div\n ref={rootRef}\n id={id}\n data-lw-viewer=\"\"\n data-lw-pages={pageCount || undefined}\n className={className}\n style={{ position: \"relative\", ...style }}\n >\n {injectStyles && (\n <style href=\"particle-academy-last-word-ui\" precedence=\"default\">\n {VIEWER_CSS}\n </style>\n )}\n\n {/* Hidden measuring copy at the text width: the packer's only input. */}\n <div\n ref={measureRef}\n aria-hidden=\"true\"\n data-lw-measure=\"\"\n style={{\n ...typography,\n position: \"absolute\",\n visibility: \"hidden\",\n pointerEvents: \"none\",\n left: -100000,\n top: 0,\n width: pt(geometry.contentWidth),\n }}\n >\n <RenderCtx.Provider value={ctx}>\n {([\"header\", \"footer\"] as const).flatMap((kind) =>\n BAND_SLOTS.map((slot) => {\n const band = slotBand(page, kind, slot);\n if (!hasBand(band)) return null;\n // Measured as a page of its class draws it: page 1, or page 2 for an even band.\n const n = slot === \"even\" ? 2 : 1;\n return (\n <div key={`${kind}:${slot}`} data-lw-measure-band={`${kind}:${slot}`}>\n <RenderCtx.Provider value={{ ...ctx, fields: { ...docFields, page: n, pages: n } }}>\n <BandView band={band} />\n </RenderCtx.Provider>\n </div>\n );\n }),\n )}\n {blocks.map((b, i) => (\n <div key={i} data-lw-measure-block={i} style={{ display: \"flow-root\" }}>\n <BlockView block={b} />\n </div>\n ))}\n {numbering.notes.map((n) => (\n <div key={n.id} data-lw-measure-footnote={n.id}>\n <FootnoteView id={n.id} footnote={n.footnote} />\n </div>\n ))}\n {numbering.notes.length > 0 && (\n <div data-lw-measure-separator=\"\">\n <FootnoteSeparator height={pt(FOOTNOTE_SEPARATOR_PT)} />\n </div>\n )}\n </RenderCtx.Provider>\n </div>\n\n {layout && (\n <div data-lw-page-stack=\"\" style={{ display: \"flex\", flexDirection: \"column\", alignItems: \"center\", gap }}>\n {layout.pages.map((p) => (\n <PageView\n key={p.index}\n page={p}\n pages={layout.pages.length}\n geometry={geometry}\n box={layout.boxes[pageClass(p.index)]}\n scale={scale}\n typography={typography}\n ctx={ctx}\n docPage={page}\n docFields={docFields}\n numbering={numbering}\n blocks={blocks}\n heights={layout.heights}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\ninterface PageViewProps {\n page: PageLayout;\n pages: number;\n geometry: PageGeometry;\n box: BodyBox;\n scale: number;\n typography: CSSProperties;\n ctx: RenderContext;\n docPage: Page | undefined;\n docFields: Omit<PageFields, \"page\" | \"pages\">;\n numbering: FootnoteNumbering;\n blocks: Block[];\n heights: number[];\n}\n\nfunction PageView({ page, pages, geometry, box, scale, typography, ctx, docPage, docFields, numbering, blocks, heights }: PageViewProps) {\n const n = page.index + 1;\n const g = geometry;\n const bandCtx = { ...ctx, fields: { ...docFields, page: n, pages, sectionPages: pages } };\n const cls = pageClass(page.index);\n const header = pageBand(docPage, \"header\", page.index);\n const footer = pageBand(docPage, \"footer\", page.index);\n const variant = (kind: BandKind) => bandSlot(docPage, kind, cls);\n const notes = page.footnotes\n .map((fid) => numbering.notes.find((x) => x.id === fid))\n .filter((x): x is FootnoteNumbering[\"notes\"][number] => !!x);\n return (\n <div\n data-page={n}\n data-lw-page-of={pages}\n style={{ width: px(g.width * PX_PER_PT * scale), height: px(g.height * PX_PER_PT * scale), flex: \"none\" }}\n >\n <div\n data-lw-sheet=\"\"\n style={{\n ...typography,\n position: \"relative\",\n width: pt(g.width),\n height: pt(g.height),\n transform: scale === 1 ? undefined : `scale(${scale})`,\n transformOrigin: \"top left\",\n backgroundColor: \"#FFFFFF\",\n boxShadow: \"0 1px 3px rgba(0,0,0,0.18), 0 0 0 0.5px rgba(0,0,0,0.08)\",\n overflow: \"hidden\",\n }}\n >\n {header && (\n <div\n data-lw-band=\"header\"\n data-lw-band-variant={variant(\"header\")}\n style={{ position: \"absolute\", top: pt(g.margins.header), left: pt(g.margins.left), width: pt(g.contentWidth) }}\n >\n <RenderCtx.Provider value={bandCtx}>\n <BandView band={header} />\n </RenderCtx.Provider>\n </div>\n )}\n\n <div\n data-lw-body=\"\"\n style={{\n position: \"absolute\",\n top: pt(box.top),\n left: pt(g.margins.left),\n width: pt(g.contentWidth),\n height: pt(box.height),\n display: \"flex\",\n flexDirection: \"column\",\n }}\n >\n <RenderCtx.Provider value={ctx}>\n <div data-lw-content=\"\">\n {page.fragments.map((f, i) => (\n <FragmentView key={i} fragment={f} block={blocks[f.item]!} whole={heights[f.item] ?? 0} />\n ))}\n </div>\n {notes.length > 0 && (\n <div data-lw-footnotes=\"\" style={{ marginTop: \"auto\" }}>\n <FootnoteSeparator height={pt(FOOTNOTE_SEPARATOR_PT)} />\n {notes.map((x) => (\n <FootnoteView key={x.id} id={x.id} footnote={x.footnote} />\n ))}\n </div>\n )}\n </RenderCtx.Provider>\n </div>\n\n {footer && (\n <div\n data-lw-band=\"footer\"\n data-lw-band-variant={variant(\"footer\")}\n style={{ position: \"absolute\", bottom: pt(g.margins.footer), left: pt(g.margins.left), width: pt(g.contentWidth) }}\n >\n <RenderCtx.Provider value={bandCtx}>\n <BandView band={footer} />\n </RenderCtx.Provider>\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction FragmentView({ fragment, block, whole }: { fragment: Fragment; block: Block; whole: number }): ReactNode {\n const id = blockId(fragment.item);\n if (fragment.type === \"table\") {\n return (\n <div\n data-block={id}\n data-lw-rows={fragment.rows.join(\",\")}\n data-lw-repeated-header={fragment.repeatedHeader ? \"\" : undefined}\n data-lw-overflow={fragment.overflow ? \"\" : undefined}\n >\n <TableView block={block as TableBlock} rows={fragment.rows} />\n </div>\n );\n }\n const isWhole = fragment.start <= 0.001 && fragment.end >= whole - 0.001;\n if (isWhole) {\n return (\n <div data-block={id} style={{ display: \"flow-root\" }}>\n <BlockView block={block} />\n </div>\n );\n }\n // A piece of a block split across pages: the whole block, windowed.\n return (\n <div\n data-block={id}\n data-lw-fragment={`${Math.round(fragment.start)}-${Math.round(fragment.end)}`}\n data-lw-forced={fragment.forced ? \"\" : undefined}\n style={{ height: px(fragment.end - fragment.start), overflow: \"hidden\" }}\n >\n <div style={{ display: \"flow-root\", marginTop: px(-fragment.start) }}>\n <BlockView block={block} />\n </div>\n </div>\n );\n}\n","import type { Doc } from \"./types\";\n\n/**\n * A Doc from what a last-word reader returned -- `new DocxReader().read(bytes)`\n * in `@particle-academy/last-word`, or the same JSON from PHP or Python over\n * the wire (a string is parsed).\n *\n * This package does not depend on last-word at runtime, so it does not read\n * bytes itself: read on the server or with last-word-js, then hand the result\n * here. It returns the SAME object (footnote numbering is keyed by run\n * identity, so the viewer must render the object it was given), and throws a\n * TypeError naming the problem rather than rendering a blank page.\n */\nexport function docFromReader(output: unknown): Doc {\n let value = output;\n if (typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n throw new TypeError(\"last-word-ui: reader output is a string but not JSON\");\n }\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(\"last-word-ui: reader output must be a Doc object\");\n }\n if (!Array.isArray((value as Doc).blocks)) {\n throw new TypeError(\"last-word-ui: reader output has no `blocks` array\");\n }\n return value as Doc;\n}\n"]}