docxodus 9.1.0 → 9.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.
package/README.md CHANGED
@@ -41,31 +41,41 @@ a 346-block, 94-footnote filing template. `save()` returns lossless bytes.
41
41
 
42
42
  ![The in-browser DOCX editor](https://raw.githubusercontent.com/JSv4/Docxodus/main/docs/images/editor/editor-overview.png)
43
43
 
44
+ Two layers, so you can take as much UI as you want:
45
+
44
46
  ```ts
47
+ // The engine, with no chrome — bring your own UI.
45
48
  import { DocxEditor } from 'docxodus';
46
49
  const editor = DocxEditor.open(container, docxBytes, exports);
50
+
51
+ // Or the whole surface: tabbed ribbon, anchor rail, table picker, loading overlay.
52
+ import { mountRibbon } from 'docxodus';
53
+ const ribbon = mountRibbon(container, { exports });
54
+ ribbon.open(docxBytes, 'contract.docx');
47
55
  ```
48
56
 
49
- See [`examples/editor.html`](https://github.com/JSv4/Docxodus/blob/main/npm/examples/editor.html) for
50
- a complete ribbon implementation.
57
+ The ribbon picks its layout from the width of the element you give it, so the same call serves a
58
+ full-page editor and a narrow embedded panel. [`examples/editor.html`](https://github.com/JSv4/Docxodus/blob/main/npm/examples/editor.html)
59
+ is a host for it in ~60 lines.
51
60
 
52
61
  ## Embed it with one script tag
53
62
 
54
- The `embed` entry packages the viewer and editor behind two one-call factories, with the WASM
63
+ The `embed` entry packages the viewer and editor behind one-call factories, with the WASM
55
64
  runtime location auto-detected — no build step, no configuration:
56
65
 
57
66
  ```html
58
- <div id="doc"></div>
67
+ <div id="doc" style="height: 100dvh"></div>
59
68
  <script type="module">
60
- import { createEditor } from 'https://cdn.jsdelivr.net/npm/docxodus@9.1.0/dist/embed.bundle.js';
61
- const editor = await createEditor('#doc', './contract.docx'); // or bytes / Blob / File
62
- // ...later: const editedBytes = editor.save();
69
+ import { createRibbonEditor } from 'https://cdn.jsdelivr.net/npm/docxodus@9.2.0/dist/embed.bundle.js';
70
+ const ribbon = await createRibbonEditor('#doc', './contract.docx'); // or bytes / Blob / File
71
+ // ...later: const editedBytes = ribbon.save();
63
72
  </script>
64
73
  ```
65
74
 
66
- `createViewer('#doc', source, options?)` is the read-only counterpart. Bundler users get the same
67
- API from `docxodus/embed`; classic-script pages can load `dist/embed.iife.js` for a global
68
- `Docxodus`. See [Embedding via CDN](#embedding-via-cdn) below.
75
+ That gives you the full editor UI. `createEditor('#doc', source, options?)` is the same document
76
+ without the chrome, and `createViewer('#doc', source, options?)` is the read-only counterpart.
77
+ Bundler users get the same API from `docxodus/embed`; classic-script pages can load
78
+ `dist/embed.iife.js` for a global `Docxodus`. See [Embedding via CDN](#embedding-via-cdn) below.
69
79
 
70
80
  ## Project it for an LLM
71
81
 
@@ -427,31 +437,42 @@ so a page can embed a full viewer or editor without hosting anything itself.
427
437
  ```html
428
438
  <div id="viewer"></div>
429
439
  <div id="editor"></div>
440
+ <div id="app" style="height: 100dvh"></div>
430
441
  <script type="module">
431
- import { createViewer, createEditor }
432
- from 'https://cdn.jsdelivr.net/npm/docxodus@9.1.0/dist/embed.bundle.js';
442
+ import { createViewer, createEditor, createRibbonEditor }
443
+ from 'https://cdn.jsdelivr.net/npm/docxodus@9.2.0/dist/embed.bundle.js';
433
444
 
434
- // Choose either factory, or render both into separate containers as shown.
445
+ // Choose a factory, or render several into separate containers as shown.
435
446
  // Source may be a URL, Uint8Array, ArrayBuffer, Blob, or File.
436
447
  const viewer = await createViewer('#viewer', './contract.docx');
437
448
 
438
449
  // No source opens a blank "New document"; returns a DocxEditor.
439
450
  const editor = await createEditor('#editor', './contract.docx', { paginated: false });
440
451
  const bytes = editor.save(); // lossless DOCX bytes
452
+
453
+ // The whole editor UI in one call — ribbon, rail, table picker, loading overlay.
454
+ // Density follows the CONTAINER's width, so this is also the mobile answer.
455
+ const ribbon = await createRibbonEditor('#app', './contract.docx', {
456
+ chrome: 'auto', // 'full' | 'compact' | 'auto' (default)
457
+ rail: true, // the live kind:scope:unid / session / last-op readout
458
+ hint: true, // the editing hint above the document
459
+ loader: true, // the staged loading overlay; false removes it
460
+ });
441
461
  </script>
442
462
  ```
443
463
 
444
464
  `dist/embed.bundle.js` is a self-contained ESM bundle re-exporting the entire main API
445
- (convert, compare, diff, sessions, annotations) plus `createViewer`/`createEditor`/`DocxEditor`,
446
- so it also works as a no-build way to use any other function.
465
+ (convert, compare, diff, sessions, annotations) plus
466
+ `createViewer`/`createEditor`/`createRibbonEditor`/`mountRibbon`/`DocxEditor`, so it also works as
467
+ a no-build way to use any other function.
447
468
 
448
469
  For pages that can't use modules, `dist/embed.iife.js` exposes the same surface as a global:
449
470
 
450
471
  ```html
451
472
  <div id="doc"></div>
452
- <script src="https://cdn.jsdelivr.net/npm/docxodus@9.1.0/dist/embed.iife.js"></script>
473
+ <script src="https://cdn.jsdelivr.net/npm/docxodus@9.2.0/dist/embed.iife.js"></script>
453
474
  <script>
454
- Docxodus.createEditor('#doc').then((editor) => { /* ... */ });
475
+ Docxodus.createRibbonEditor('#doc').then((ribbon) => { /* ... */ });
455
476
  </script>
456
477
  ```
457
478
 
@@ -465,7 +486,7 @@ first `<bundle dir>/wasm/`, then `<bundle dir>/` as a fallback. On a CDN that re
465
486
 
466
487
  ### CDN caveats
467
488
 
468
- - **Pin an exact version in production** (`docxodus@9.1.0`, not `@latest`) — CDN responses are
489
+ - **Pin an exact version in production** (`docxodus@9.2.0`, not `@latest`) — CDN responses are
469
490
  cached as immutable, and the wire shapes between the JS wrappers and the WASM assemblies must
470
491
  come from the same release.
471
492
  - The build patches the .NET loader to fetch with `credentials: "omit"` — required because the
@@ -1 +1 @@
1
- {"version":3,"file":"editor-reconcile.d.ts","sourceRoot":"","sources":["../src/editor-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;kBAKkB;AAClB,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;oFAEoF;AACpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEhD;AAED,oFAAoF;AACpF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,uEAAuE;IACvE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,qEAAqE;IACrE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;OAKG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,6DAA6D;AAC7D,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,QAAQ,CA8D9E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,SAAK,GACb,OAAO,CAWT"}
1
+ {"version":3,"file":"editor-reconcile.d.ts","sourceRoot":"","sources":["../src/editor-reconcile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;kBAKkB;AAClB,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;oFAEoF;AACpF,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAEhD;AAED,oFAAoF;AACpF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,SAAS,EAAE,UAAU,EAAE,CAAC;IACxB,QAAQ,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,QAAQ;IACvB,uEAAuE;IACvE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,qEAAqE;IACrE,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;;OAKG;IACH,WAAW,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5D;AAED,6DAA6D;AAC7D,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,QAAQ,CAyF9E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,SAAK,GACb,OAAO,CAWT"}
@@ -63,8 +63,38 @@ export function diffUnits(oldUnids, newUnits) {
63
63
  removed.push(i++);
64
64
  while (j < m)
65
65
  added.push(j++);
66
- // Substitutions: an added index and a removed index with the same number of
67
- // kept units before theman in-place change of one unit.
66
+ // Substitutions: an added index and a removed index that are an IN-PLACE change
67
+ // of one unit. Paired by UNID first a block whose content changed keeps its
68
+ // unid (unids are sticky in-session; only the content signature part of the
69
+ // token moves), so an equal-unid add/remove pair is that block re-rendering in
70
+ // place regardless of how many other units changed around it. Position-based
71
+ // (kept-count) pairing is the fallback for genuine replacements; unid pairing
72
+ // must run first or several same-position changes mispair, e.g. binding an
73
+ // edited paragraph's fresh render to a NEIGHBOR's border-wrapped node — which
74
+ // the DOM patcher can only resolve by bailing to a full remount.
75
+ const bareUnid = (token) => {
76
+ const bar = token.indexOf("|");
77
+ return bar < 0 ? token : token.slice(0, bar);
78
+ };
79
+ const substituted = [];
80
+ const usedRemoved = new Set();
81
+ const removedByUnid = new Map();
82
+ for (const oi of removed) {
83
+ const u = bareUnid(oldUnids[oi]);
84
+ (removedByUnid.get(u) ?? removedByUnid.set(u, []).get(u)).push(oi);
85
+ }
86
+ const unmatchedAdded = [];
87
+ for (const nj of added) {
88
+ const candidates = removedByUnid.get(bareUnid(newUnids[nj]));
89
+ const oi = candidates?.find((i) => !usedRemoved.has(i));
90
+ if (oi !== undefined) {
91
+ substituted.push({ oldIndex: oi, newIndex: nj });
92
+ usedRemoved.add(oi);
93
+ }
94
+ else {
95
+ unmatchedAdded.push(nj);
96
+ }
97
+ }
68
98
  const keptBeforeOld = (oi) => {
69
99
  let c = 0;
70
100
  for (const v of keep.values())
@@ -79,9 +109,7 @@ export function diffUnits(oldUnids, newUnits) {
79
109
  c++;
80
110
  return c;
81
111
  };
82
- const substituted = [];
83
- const usedRemoved = new Set();
84
- for (const nj of added) {
112
+ for (const nj of unmatchedAdded) {
85
113
  const target = keptBeforeNew(nj);
86
114
  for (const oi of removed) {
87
115
  if (usedRemoved.has(oi))
@@ -1 +1 @@
1
- {"version":3,"file":"editor-reconcile.js","sourceRoot":"","sources":["../src/editor-reconcile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editor-reconcile.js","sourceRoot":"","sources":["../src/editor-reconcile.ts"],"names":[],"mappings":"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"}