@silurus/ooxml 0.80.3 → 0.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +61 -85
  2. package/dist/assets/render-worker-7-Zr7fSw.js +10 -0
  3. package/dist/assets/render-worker-B5gsW6b5.js +11 -0
  4. package/dist/assets/render-worker-Dw_wQRIh.js +24 -0
  5. package/dist/{canvas-viewer-mechanics-D-r6wHY_.js → canvas-viewer-mechanics-CS_qbr6T.js} +1 -1
  6. package/dist/chart-ex.mjs +1017 -0
  7. package/dist/comment-occurrence-C34fWs_F.js +6 -0
  8. package/dist/comment-ui-runtime-BAe30Ct9.js +112 -0
  9. package/dist/comment-ui-runtime-BUCj4hWn.js +171 -0
  10. package/dist/comment-ui-runtime-F4a3te6p.js +2 -0
  11. package/dist/comments-Cf9W7r3M.js +241 -0
  12. package/dist/{document-pull-client-vxk-Aomu.js → document-pull-client-BCgmytqI.js} +4682 -4541
  13. package/dist/docx-wokGKYfi.js +2162 -0
  14. package/dist/docx.mjs +6 -4
  15. package/dist/docx_parser_bg.wasm +0 -0
  16. package/dist/dom-interaction-boundary-C8F6HO5x.js +119 -0
  17. package/dist/highlight-rect-MaCt0om0.js +13 -0
  18. package/dist/index.mjs +3 -3
  19. package/dist/{line-distribute-Bvtp0Gt6.js → line-distribute-iXsUCIH-.js} +17 -16
  20. package/dist/{line-metrics-DdEJYxjx.js → line-metrics-B3syvDn2.js} +667 -7492
  21. package/dist/math.mjs +2 -2
  22. package/dist/node.mjs +248 -247
  23. package/dist/plot-area-frame-DHV02PJU.js +3670 -0
  24. package/dist/pptx-DU8L8I2T.js +2432 -0
  25. package/dist/pptx.mjs +6 -5
  26. package/dist/pptx_parser_bg.wasm +0 -0
  27. package/dist/read-only-comment-decoration-DcFevX_Q.js +96 -0
  28. package/dist/read-only-comment-margin-Dn2y55W6.js +189 -0
  29. package/dist/region-map.mjs +102 -97
  30. package/dist/{render-CoqMHcbF.js → render-CenWM4g1.js} +1 -1
  31. package/dist/{render-worker-host-IuQFpoJM.js → render-worker-host-BNENN3qP.js} +1 -1
  32. package/dist/{render-worker-host-CYPhmBtX.js → render-worker-host-BmH3kGSj.js} +1 -1
  33. package/dist/{render-worker-host-GlLR1rtF.js → render-worker-host-CmPBviYJ.js} +1 -1
  34. package/dist/renderer-CYr9YTXM.js +5856 -0
  35. package/dist/{renderer-module-contract-BNGz8HvO.js → renderer-module-contract-DLbb7zY0.js} +4 -3
  36. package/dist/{resource-measurement-CgMubiAI.js → resource-measurement-CsW4_eYt.js} +12 -11
  37. package/dist/{session-DkPblDiq.js → session-Cky_swUj.js} +8 -8
  38. package/dist/{slide-pull-client-m2blvngt.js → slide-pull-client-CqTVFb3W.js} +1004 -1091
  39. package/dist/source-key-BklvnEyQ.js +42 -0
  40. package/dist/three-d-7MaVzQuZ.js +1346 -0
  41. package/dist/three-d.mjs +1238 -797
  42. package/dist/types/chart-ex.d.ts +949 -0
  43. package/dist/types/docx.d.ts +497 -28
  44. package/dist/types/index.d.ts +649 -39
  45. package/dist/types/math.d.ts +1 -1
  46. package/dist/types/node.d.ts +385 -22
  47. package/dist/types/pptx.d.ts +435 -24
  48. package/dist/types/region-map.d.ts +318 -6
  49. package/dist/types/three-d.d.ts +318 -6
  50. package/dist/types/xlsx.d.ts +384 -19
  51. package/dist/units-BzZ0gAxs.js +4 -0
  52. package/dist/{worksheet-pull-client-BntP6RiO.js → worksheet-pull-client-CYtwXP5D.js} +19 -19
  53. package/dist/{xlsx-DqMe7J2C.js → xlsx-DlV37-0j.js} +1594 -1349
  54. package/dist/xlsx.mjs +6 -5
  55. package/dist/xlsx_parser_bg.wasm +0 -0
  56. package/package.json +7 -1
  57. package/dist/assets/render-worker-CRaEOHkw.js +0 -9
  58. package/dist/assets/render-worker-DQGLj5Zv.js +0 -22
  59. package/dist/assets/render-worker-rnrSLmqL.js +0 -8
  60. package/dist/chart-number-format-qLhnk6hj.js +0 -475
  61. package/dist/docx-DN0PRx2f.js +0 -1733
  62. package/dist/highlight-rect-BuX5rWP4.js +0 -48
  63. package/dist/pptx-B-Laftl1.js +0 -2134
  64. package/dist/three-d-C28kqDym.js +0 -1086
  65. /package/dist/{mathjax-DgAl7Yi5.js → mathjax-DwIrafQ6.js} +0 -0
  66. /package/dist/{transfer-CKZ79zFw.js → transfer-R6NjgBKD.js} +0 -0
  67. /package/dist/{visible-index-BjesVGhg.js → visible-index-BFE3PWiY.js} +0 -0
package/README.md CHANGED
@@ -46,11 +46,6 @@ npm install @silurus/ooxml
46
46
  pnpm add @silurus/ooxml
47
47
  ```
48
48
 
49
- > Upgrading from v0.76? Review the
50
- > [v0.77 migration guide](https://ooxml.silurus.dev/announcements/v077-migration-guide/)
51
- > for the XLSX selection, selection-context, MCP-tool, option/type, and Viewer
52
- > error-handling changes.
53
-
54
49
  > **Bundler note**: the Rust parsers ship as real `.wasm` asset files next to the
55
50
  > JavaScript, referenced with the standard `new URL('…', import.meta.url)` form
56
51
  > and fetched (streaming-compiled) at load time. Verified to work with zero
@@ -76,39 +71,13 @@ pnpm add @silurus/ooxml
76
71
  > new DocxViewer(canvas, { wasmUrl: 'https://cdn.example.com/docx_parser_bg.wasm' });
77
72
  > ```
78
73
 
79
- > **Bundle size note**: the package is ESM-only (`.mjs`). npm's *Unpacked
80
- > Size* sums every entry bundle **and** the standalone MathJax + STIX Two Math
81
- > asset, so the reported figure is much larger than any single app build. For
82
- > v0.79.0, the complete npm package is approximately 13.0 MB unpacked (4.3 MB
83
- > as the downloaded tarball), while a format-specific application graph is
84
- > approximately:
85
- >
86
- > | Imported entry | Reachable assets | gzip | Includes |
87
- > |---|---:|---:|---|
88
- > | `@silurus/ooxml/docx` | 4.0 MB | 1.2 MB | DOCX renderer, parser WASM, and lazy worker |
89
- > | `@silurus/ooxml/xlsx` | 2.6 MB | 0.82 MB | XLSX renderer, parser WASM, and lazy worker |
90
- > | `@silurus/ooxml/pptx` | 2.5 MB | 0.78 MB | PPTX renderer, parser WASM, and lazy worker |
91
- > | `@silurus/ooxml/math` | 3.1 MB | 1.1 MB | Optional MathJax + STIX Two Math engine |
92
- > | `@silurus/ooxml/three-d` | 92 KB | 27 KB | Optional model-space 3-D chart mesh and camera |
93
- > | `@silurus/ooxml/region-map` | 236 KB | 66 KB | Optional offline Region Map renderer and fixed country geometry |
94
- >
95
- > These are production-artifact estimates, not initial-load figures: each row
96
- > sums all assets reachable from that entry, including parser WASM and worker
97
- > chunks loaded on demand. Exact output varies by bundler and compression. Import
98
- > only the format you need (for example, `@silurus/ooxml/pptx`) so the other
99
- > formats can be tree-shaken. The math engine is a **separate entry** whose
100
- > main-thread chunk is a ~1 KB loader referencing the ~3 MB engine as a
101
- > **sibling file**, not an inline data URL. The engine is fetched lazily, only
102
- > when a document contains equations, and only if you imported
103
- > `@silurus/ooxml/math` and passed it to a viewer (see
104
- > [Rendering equations](#rendering-equations)). Never import the `math` entry
105
- > and the loader chunk never enters your graph at all.
106
- >
107
- > The 3-D chart and Region Map renderers follow the same dependency-injection
108
- > boundary: import and pass only the optional renderer modules an application
109
- > needs. Their implementations are not eagerly loaded or evaluated in main
110
- > mode. Worker mode fetches a self-contained render-worker asset that includes
111
- > the worker-side built-ins, so consumer bundlers can copy it safely.
74
+ > **Bundle size note**: the package is ESM-only (`.mjs`). npm's *Unpacked Size*
75
+ > includes every entry and optional asset, so it is not the size of a
76
+ > format-specific application graph. See the current production measurements on
77
+ > the stable [Bundle size](https://ooxml.silurus.dev/bundle-size/) page. Import
78
+ > only the format and optional renderer entries your application needs. In main
79
+ > mode, MathJax, ChartEx, 3-D and Region Map implementations remain outside the
80
+ > graph unless imported; the separately loaded worker asset is self-contained.
112
81
 
113
82
  ---
114
83
 
@@ -209,22 +178,30 @@ shapes / text boxes the same way.)
209
178
 
210
179
  ### Optional chart renderers
211
180
 
212
- Model-space 3-D charts and offline country-level Region Maps are separate
213
- entries. Inject them once in the same load options object as `math`; omitting a
214
- renderer keeps it out of the ordinary render path. The built-in renderers work
215
- in both main and worker modes. Without `threeD`, 3-D chart groups
181
+ Classic DrawingML 2-D chart families are included in every format entry.
182
+ Microsoft ChartEx, model-space 3-D charts and offline country-level Region Maps
183
+ are separate entries. Inject them once in the same load options object as
184
+ `math`; omitting a renderer keeps it out of the ordinary render path. The
185
+ built-in renderers work in both main and worker modes. Without `chartEx`,
186
+ ChartEx families show the standard unsupported-chart placeholder. Without
187
+ `threeD`, 3-D chart groups
216
188
  fall back to their canonical 2-D family. Without `regionMap`, Region Maps show
217
- the standard unsupported-chart placeholder.
189
+ the standard unsupported-chart placeholder. The code-size boundary applies to
190
+ the default main-mode application graph. The separately loaded render-worker
191
+ asset stays self-contained for broad bundler compatibility and therefore
192
+ contains its built-in optional renderer implementations.
218
193
 
219
194
  ```typescript
220
195
  import { XlsxViewer } from '@silurus/ooxml/xlsx';
221
196
  import { threeD } from '@silurus/ooxml/three-d';
222
197
  import { regionMap } from '@silurus/ooxml/region-map';
198
+ import { chartEx } from '@silurus/ooxml/chart-ex';
223
199
 
224
200
  const container = document.getElementById('xlsx-container') as HTMLElement;
225
201
  const workbookViewer = new XlsxViewer(container, {
226
202
  threeD,
227
203
  regionMap,
204
+ chartEx,
228
205
  mode: 'worker',
229
206
  });
230
207
  await workbookViewer.load('/workbook-with-advanced-charts.xlsx');
@@ -272,10 +249,10 @@ Notes:
272
249
  - The canvas-target methods (`renderSlide(canvas)`, `renderPage(canvas)`,
273
250
  `renderViewport(canvas)`) are unavailable in worker mode — use the `*ToBitmap`
274
251
  variants instead.
275
- - The built-in math, 3-D chart, and Region Map renderers work in both modes
276
- through the same `math`, `threeD`, and `regionMap` options. Custom renderer
277
- objects are main-realm code and therefore use the feature's documented
278
- fallback in `mode: 'worker'`.
252
+ - The built-in math, ChartEx, 3-D chart, and Region Map renderers work in both
253
+ modes through the same `math`, `chartEx`, `threeD`, and `regionMap` options.
254
+ Custom renderer objects are main-realm code and therefore use the feature's
255
+ documented fallback in `mode: 'worker'`.
279
256
  - A DOCX document that requires browser-only OpenType vertical-glyph selection
280
257
  automatically uses effective main mode for correct shaping. Read
281
258
  `document.mode` after loading when your integration needs to observe this
@@ -526,38 +503,33 @@ flowchart TB
526
503
  end
527
504
 
528
505
  subgraph browser["🌐 Runtime (Browser)"]
529
- subgraph core_pkg["@silurus/ooxml-core (shared primitives)"]
530
- CORE["renderChart · resolveFill · applyStroke\nbuildCustomPath · autoResize · shared types"]
531
- end
532
- subgraph docx_pkg["@silurus/ooxml · docx"]
533
- DV["DocxViewer"] --> DD["DocxDocument"]
534
- DD --> DW["worker.ts\n〈Web Worker — parse only〉"]
535
- DD --> DR["renderer.ts\n〈Canvas 2D — main thread〉"]
536
- end
537
- subgraph xlsx_pkg["@silurus/ooxml · xlsx"]
538
- XV["XlsxViewer"] --> XB["XlsxWorkbook"]
539
- XB --> XW["worker.ts\n〈Web Worker — parse only〉"]
540
- XB --> XR["renderer.ts\n〈Canvas 2D — main thread〉"]
541
- end
542
- subgraph pptx_pkg["@silurus/ooxml · pptx"]
543
- PV["PptxViewer"] --> PP["PptxPresentation"]
544
- PP --> PW["worker.ts\n〈Web Worker — parse only〉"]
545
- PP --> PR["renderer.ts\n〈Canvas 2D — main thread〉"]
546
- end
547
- DR -. uses .-> CORE
548
- XR -. uses .-> CORE
549
- PR -. uses .-> CORE
506
+ VIEWER["DOCX / XLSX / PPTX Viewer"] --> ENGINE["format headless engine"]
507
+ ENGINE -->|mode: main| PARSE["parser worker\n〈WASM parse〉"]
508
+ PARSE --> MODEL["validated document model"]
509
+ MODEL --> MAIN["layout + Canvas paint\n〈main thread〉"]
510
+ ENGINE -->|mode: worker| RENDER_WORKER["render-worker.ts\n〈WASM parse + layout + paint〉"]
511
+ RENDER_WORKER --> BITMAP["ImageBitmap"]
512
+ MAIN --> CANVAS["<canvas>"]
513
+ BITMAP --> CANVAS
514
+ CORE["@silurus/ooxml-core\nshared layout and paint primitives"]
515
+ MAIN -. uses .-> CORE
516
+ RENDER_WORKER -. uses .-> CORE
550
517
  end
551
518
 
552
- docx_wasm --> DW
553
- xlsx_wasm --> XW
554
- pptx_wasm --> PW
555
- DR --> canvas["<canvas>"]
556
- XR --> canvas
557
- PR --> canvas
519
+ docx_wasm --> PARSE
520
+ xlsx_wasm --> PARSE
521
+ pptx_wasm --> PARSE
522
+ docx_wasm --> RENDER_WORKER
523
+ xlsx_wasm --> RENDER_WORKER
524
+ pptx_wasm --> RENDER_WORKER
558
525
  ```
559
526
 
560
- All three formats follow the same shape: the worker parses the `.docx` / `.xlsx` / `.pptx` archive via WASM and posts a JSON model back to the main thread, where the renderer draws to the canvas. Rendering stays on the main thread so the canvas shares the document's `FontFaceSet` — an `OffscreenCanvas` in a worker has its own font registry and would silently fall back to a system font, producing subtly different text measurements (and wrap positions) from the installed theme webfonts. `@silurus/ooxml-core` holds the cross-format primitives that the three renderers all depend on: a unified chart renderer (bar / line / area / radar / waterfall), shape helpers (`resolveFill`, `applyStroke`, `buildCustomPath`, `hexToRgba`), the `autoResize` viewer utility, and the shared type definitions.
527
+ All three formats use the same public mode boundary. In the default `main` mode,
528
+ WASM parsing runs in a Worker and the validated model is laid out and painted on
529
+ the main thread. In `worker` mode, parsing, layout and Canvas paint run in a
530
+ render Worker, which returns an `ImageBitmap` for presentation. Built-in optional
531
+ renderers use the same injection options in both modes. `@silurus/ooxml-core`
532
+ owns the layout, paint and type primitives shared by DOCX, XLSX and PPTX.
561
533
 
562
534
  ### Key files
563
535
 
@@ -566,10 +538,11 @@ All three formats follow the same shape: the worker parses the `.docx` / `.xlsx`
566
538
  | `packages/docx/parser/src/lib.rs` | Rust WASM parser — DOCX ZIP → `Document` JSON |
567
539
  | `packages/xlsx/parser/src/lib.rs` | Rust WASM parser — XLSX ZIP → `Workbook` JSON |
568
540
  | `packages/pptx/parser/src/lib.rs` | Rust WASM parser — PPTX ZIP → `Presentation` JSON |
569
- | `packages/docx/src/renderer.ts` | Canvas 2D rendering engine with text layout (main thread) |
570
- | `packages/xlsx/src/renderer.ts` | Canvas 2D rendering engine with virtual scroll (main thread) |
571
- | `packages/pptx/src/renderer.ts` | Canvas 2D rendering engine (main thread) |
572
- | `packages/*/src/worker.ts` | Web Worker: WASM init and parsing only (one per format) |
541
+ | `packages/docx/src/renderer.ts` | DOCX Canvas 2D rendering and text layout |
542
+ | `packages/xlsx/src/renderer.ts` | XLSX Canvas 2D viewport rendering |
543
+ | `packages/pptx/src/renderer.ts` | PPTX Canvas 2D rendering |
544
+ | `packages/*/src/worker.ts` | Main-mode parser Worker entry |
545
+ | `packages/*/src/render-worker.ts` | Worker-mode parser, layout and Canvas paint entry |
573
546
  | `packages/*/src/viewer.ts` | Public Viewer API — canvas lifecycle, navigation |
574
547
  | `packages/core/src/index.ts` | Cross-format primitives — chart renderer, shape helpers, `autoResize`, shared types |
575
548
 
@@ -628,6 +601,7 @@ file without uploading it.
628
601
  | | Table indent (`w:tblInd`, §17.4.50) | ✅ |
629
602
  | | Right-to-left table column order (`w:bidiVisual`, §17.4.1) | ✅ |
630
603
  | | Charts (embedded DrawingML `c:chart` — bar / line / area / pie / doughnut / radar / scatter, via the shared core chart renderer; data labels honour `dLblPos`, §21.2.2.48) | ✅ |
604
+ | | ChartEx (waterfall / histogram / Pareto / funnel / box & whisker / treemap / sunburst) | ✅ opt-in |
631
605
  | | Math equations (OMML `m:oMath` / `m:oMathPara`, rendered via MathJax — opt-in `@silurus/ooxml/math`) | ✅ |
632
606
  | | Images (inline and anchored, with text wrap) | ✅ |
633
607
  | | SVG images (`asvg:svgBlip` MS-2016 extension — vector drawn from the embedded `.svg`, raster fallback) | ✅ |
@@ -639,8 +613,8 @@ file without uploading it.
639
613
  | | Page-number formats (`w:pgNumType` restart / format §17.6.12; PAGE `\*` switches — decimal / roman / letter / hex / ordinal-dash / hebrew2 / koreanLegal, §17.18.59) | ✅ |
640
614
  | | Field date/time pictures (`TIME` / `DATE` field `\@` format, §17.16.5.72 / .16) | ✅ |
641
615
  | | `w:snapToGrid` opt-out of the document grid (§17.3.1.32) | ✅ |
642
- | | Track changes (`w:ins` / `w:del` — author-coloured underline / strikethrough) | ✅ |
643
- | | Comments — author / date / text via the document model (`doc.comments`, §17.13.4; not drawn on the page) | ✅ |
616
+ | | Track changes (§17.13.5 `w:ins` / `w:del` / `w:moveFrom` / `w:moveTo`) body-story revision records are available as data; rendering projects the accepted final state, with deletions and moved-away text hidden | ✅ |
617
+ | | Comments (§17.13.4) opt-in margin balloons (`comments: true`): commented ranges tinted, threaded replies via `commentsExtended.xml`, resolved threads hidden, click-to-select stacking; also available as data (`doc.comments`, `doc.commentAnchorRanges()`) | ✅ |
644
618
  | | Markdown export (`DocxDocument.toMarkdown()` — headings, lists, tables, footnotes / comments) | ✅ |
645
619
  | | Mail merge fields | ❌ Not planned |
646
620
  | **Interaction** | Text selection (transparent overlay, native copy) | ✅ |
@@ -687,6 +661,7 @@ file without uploading it.
687
661
  | | Drawing shapes / text boxes (`xdr:sp`, `xdr:txBody` — 186 preset geometries via the shared engine, with `avLst` adjust handles) | ✅ |
688
662
  | | Math equations in shapes (OMML `m:oMath` / `m:oMathPara` in `xdr:txBody`, incl. `a14:m` / `mc:AlternateContent`; rendered via MathJax — opt-in `@silurus/ooxml/math`) | ✅ |
689
663
  | | Charts (bar, line, area, pie, doughnut, radar, scatter / bubble) | ✅ |
664
+ | | ChartEx (waterfall / histogram / Pareto / funnel / box & whisker / treemap / sunburst) | ✅ opt-in |
690
665
  | | Chart markers (circle / square / diamond / triangle / x / plus / star / dot / dash, per-point `<c:dPt>` overrides; markers-only scatter series draw a marker legend key) | ✅ |
691
666
  | | Chart data labels (`<c:dLbl>` per-point with CELLRANGE / VALUE / SERIESNAME / CATEGORYNAME field references, position `l`/`r`/`t`/`b`/`ctr`/`outEnd`) | ✅ |
692
667
  | | Chart error bars (`<c:errBars>` X/Y direction, `cust` / `fixedVal` / `stdErr` / `stdDev` / `percentage`, dashed/styled lines) | ✅ |
@@ -695,7 +670,7 @@ file without uploading it.
695
670
  | **Advanced** | Conditional formatting (`cellIs`, `colorScale`, `dataBar`, `iconSet`, `top10`, `aboveAverage`) | ✅ |
696
671
  | | Slicers (static, Office 2010 extension) | ✅ |
697
672
  | | Pivot tables (saved worksheet output renders unchanged; read-only metadata is exposed. Refresh, recalculation, filtering, restructuring, and interactivity are unsupported) | ⚠️ Partial |
698
- | | Cell comments / notes (classic `xl/commentsN.xml` + Office-365 threaded comments — red triangle indicator + author / text via the worksheet model, shown in an Excel-style hover popup) | ✅ |
673
+ | | Cell comments / notes (classic `xl/commentsN.xml` + Office-365 threaded comments — red triangle indicator + author / text via the worksheet model; pointer or keyboard users can open the popup, with a polite screen-reader status) | ✅ |
699
674
  | | Data validation (rules via the worksheet model; `list`-type dropdown arrow on the selected cell whose click opens a panel showing the allowed values — read-only) | ✅ |
700
675
  | | Markdown export (`XlsxWorkbook.toMarkdown()` — each sheet as a `## SheetName` pipe table) | ✅ |
701
676
  | **Interaction** | Cell selection (single / range / row / column / all / multiple areas; `setSelection('B2:D5')` or canonical structured state) | ✅ |
@@ -732,12 +707,12 @@ file without uploading it.
732
707
  | | Groups (`grpSp`) with nested transforms | ✅ |
733
708
  | | Connectors (`cxnSp`) | ✅ |
734
709
  | | Tables (`tbl` in `graphicFrame`) | ✅ |
735
- | | Charts (bar, line, area, radar, waterfall) | ✅ |
710
+ | | Charts (bar, line, area, radar) | ✅ |
736
711
  | | Charts (pie, doughnut) | ✅ |
737
712
  | | Charts (scatter — `scatterStyle` marker / line / smooth variants) | ✅ |
738
713
  | | Charts (bubble — `bubbleSize` per-point area scaling) | ✅ |
739
- | | Charts (combo — bar + line with a secondary value axis on the right) | ✅ |
740
- | | Charts (chartEx — funnel / histogram / treemap / sunburst / box &amp; whisker) | ✅ |
714
+ | | Charts (ordered classic combo groups observed bar/line/area, scatter/bubble, and stock/line combinations; unsupported mixes fail closed) | ✅ |
715
+ | | ChartEx (waterfall / histogram / Pareto / funnel / box &amp; whisker / treemap / sunburst) | ✅ opt-in |
741
716
  | | Charts (stock — high / low / close candlesticks) | ✅ |
742
717
  | | SmartArt (renders the PowerPoint-saved drawing layout `dsp:drawing`, or a staged fallback to a text list when no drawing part is present; no native diagram layout engine) | ✅ |
743
718
  | | OLE embedded objects (`p:oleObj` — the baked preview `p:pic` is drawn; the embedded app is not run) | ✅ |
@@ -807,6 +782,7 @@ file without uploading it.
807
782
  | | lumMod / lumOff / alpha transforms | ✅ |
808
783
  | **Interaction** | Text selection (transparent overlay, native copy) | ✅ |
809
784
  | | Bounded text/element selection context (`getSelectionContext()`, element selection, master/layout/slide provenance, main + worker) | ✅ |
785
+ | | Comments — opt-in slide-side cards (`comments: true`), authored target markers and highlights, replies and resolved state; also available per slide through the presentation model | ✅ |
810
786
  | | In-document find (`findText` / `findNext` / `findPrev` / `clearFind` — matches tagged with slide) | ✅ |
811
787
  | | Runtime zoom (`getScale` / `setScale` / `fitWidth` / `fitPage`) | ✅ |
812
788
  | | Clickable hyperlinks (`onHyperlinkClick`; internal slide-jump navigation) | ✅ |