@beyondwork/docx-react-component 1.0.36 → 1.0.38
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 +103 -13
- package/package.json +1 -1
- package/src/api/package-version.ts +13 -0
- package/src/api/public-types.ts +402 -1
- package/src/core/commands/index.ts +18 -1
- package/src/core/commands/section-layout-commands.ts +58 -0
- package/src/core/commands/table-grid.ts +431 -0
- package/src/core/commands/table-structure-commands.ts +815 -55
- package/src/core/selection/mapping.ts +6 -0
- package/src/io/docx-session.ts +24 -9
- package/src/io/export/build-app-properties-xml.ts +88 -0
- package/src/io/export/serialize-comments.ts +6 -1
- package/src/io/export/serialize-footnotes.ts +10 -9
- package/src/io/export/serialize-headers-footers.ts +11 -10
- package/src/io/export/serialize-main-document.ts +328 -50
- package/src/io/export/serialize-numbering.ts +114 -24
- package/src/io/export/serialize-tables.ts +87 -11
- package/src/io/export/table-properties-xml.ts +174 -20
- package/src/io/export/twip.ts +66 -0
- package/src/io/normalize/normalize-text.ts +20 -0
- package/src/io/ooxml/parse-footnotes.ts +62 -1
- package/src/io/ooxml/parse-headers-footers.ts +62 -1
- package/src/io/ooxml/parse-main-document.ts +158 -1
- package/src/io/ooxml/parse-tables.ts +249 -0
- package/src/legal/bookmarks.ts +78 -0
- package/src/model/canonical-document.ts +45 -0
- package/src/review/store/scope-tag-diff.ts +130 -0
- package/src/runtime/document-layout.ts +4 -2
- package/src/runtime/document-navigation.ts +2 -306
- package/src/runtime/document-runtime.ts +287 -11
- package/src/runtime/layout/default-page-format.ts +96 -0
- package/src/runtime/layout/docx-font-loader.ts +143 -0
- package/src/runtime/layout/index.ts +233 -0
- package/src/runtime/layout/inert-layout-facet.ts +59 -0
- package/src/runtime/layout/layout-engine-instance.ts +628 -0
- package/src/runtime/layout/layout-invalidation.ts +257 -0
- package/src/runtime/layout/layout-measurement-provider.ts +175 -0
- package/src/runtime/layout/margin-preset-catalog.ts +178 -0
- package/src/runtime/layout/measurement-backend-canvas.ts +307 -0
- package/src/runtime/layout/measurement-backend-empirical.ts +208 -0
- package/src/runtime/layout/page-format-catalog.ts +233 -0
- package/src/runtime/layout/page-fragment-mapper.ts +179 -0
- package/src/runtime/layout/page-graph.ts +452 -0
- package/src/runtime/layout/page-layout-snapshot-adapter.ts +70 -0
- package/src/runtime/layout/page-story-resolver.ts +195 -0
- package/src/runtime/layout/paginated-layout-engine.ts +921 -0
- package/src/runtime/layout/project-block-fragments.ts +91 -0
- package/src/runtime/layout/public-facet.ts +1398 -0
- package/src/runtime/layout/resolved-formatting-document.ts +317 -0
- package/src/runtime/layout/resolved-formatting-state.ts +430 -0
- package/src/runtime/layout/table-render-plan.ts +229 -0
- package/src/runtime/render/block-fragment-projection.ts +35 -0
- package/src/runtime/render/decoration-resolver.ts +189 -0
- package/src/runtime/render/index.ts +57 -0
- package/src/runtime/render/pending-op-delta-reader.ts +129 -0
- package/src/runtime/render/render-frame-types.ts +317 -0
- package/src/runtime/render/render-kernel.ts +755 -0
- package/src/runtime/scope-tag-registry.ts +95 -0
- package/src/runtime/surface-projection.ts +1 -0
- package/src/runtime/text-ack-range.ts +49 -0
- package/src/runtime/view-state.ts +67 -0
- package/src/runtime/workflow-markup.ts +1 -5
- package/src/runtime/workflow-rail-segments.ts +280 -0
- package/src/ui/WordReviewEditor.tsx +99 -15
- package/src/ui/editor-runtime-boundary.ts +10 -1
- package/src/ui/editor-shell-view.tsx +6 -0
- package/src/ui/editor-surface-controller.tsx +3 -0
- package/src/ui/headless/chrome-registry.ts +501 -0
- package/src/ui/headless/scoped-chrome-policy.ts +183 -0
- package/src/ui/headless/selection-tool-context.ts +2 -0
- package/src/ui/headless/selection-tool-resolver.ts +36 -17
- package/src/ui/headless/selection-tool-types.ts +10 -0
- package/src/ui-tailwind/chrome/chrome-preset-model.ts +23 -2
- package/src/ui-tailwind/chrome/role-action-sets.ts +74 -0
- package/src/ui-tailwind/chrome/tw-detach-handle.tsx +147 -0
- package/src/ui-tailwind/chrome/tw-selection-anchor-resolver.ts +163 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +57 -92
- package/src/ui-tailwind/chrome/tw-selection-tool-placement.ts +149 -0
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +15 -4
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +274 -138
- package/src/ui-tailwind/chrome-overlay/chrome-overlay-projector.ts +90 -0
- package/src/ui-tailwind/chrome-overlay/index.ts +22 -0
- package/src/ui-tailwind/chrome-overlay/tw-chrome-overlay.tsx +86 -0
- package/src/ui-tailwind/chrome-overlay/tw-scope-rail-layer.tsx +178 -0
- package/src/ui-tailwind/chrome-overlay/tw-workspace-view-switcher.tsx +95 -0
- package/src/ui-tailwind/editor-surface/fast-text-edit-lane.ts +337 -0
- package/src/ui-tailwind/editor-surface/local-edit-session-state.ts +100 -0
- package/src/ui-tailwind/editor-surface/perf-probe.ts +27 -1
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +20 -2
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +93 -23
- package/src/ui-tailwind/editor-surface/predicted-position-map.ts +78 -0
- package/src/ui-tailwind/editor-surface/predicted-tag-preflight.ts +63 -0
- package/src/ui-tailwind/editor-surface/predicted-tx-gate.ts +39 -0
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +176 -6
- package/src/ui-tailwind/index.ts +33 -0
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +2 -2
- package/src/ui-tailwind/review/tw-rail-card.tsx +150 -0
- package/src/ui-tailwind/review/tw-review-rail-footer.tsx +52 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +166 -11
- package/src/ui-tailwind/review/tw-workflow-tab.tsx +108 -0
- package/src/ui-tailwind/theme/editor-theme.css +505 -144
- package/src/ui-tailwind/toolbar/tw-role-action-region.tsx +559 -0
- package/src/ui-tailwind/toolbar/tw-scope-posture-menu.tsx +182 -0
- package/src/ui-tailwind/toolbar/tw-shell-header.tsx +162 -0
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +2 -2
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +304 -166
- package/src/ui-tailwind/tw-review-workspace.tsx +163 -2
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project surface blocks → per-page RuntimeBlockFragments (P4).
|
|
3
|
+
*
|
|
4
|
+
* The pagination engine produces `DocumentPageSnapshot[]` keyed by offset
|
|
5
|
+
* ranges, but for render-kernel consumers to get per-block geometry (and
|
|
6
|
+
* for the chrome to anchor tables, images, etc.) we need one block
|
|
7
|
+
* fragment per top-level surface block, assigned to the page that contains
|
|
8
|
+
* its offset range.
|
|
9
|
+
*
|
|
10
|
+
* Today the engine does not split tables across pages, so this emission
|
|
11
|
+
* pass treats each top-level SurfaceBlockSnapshot as an atomic fragment
|
|
12
|
+
* with `pageIndex` resolved from `pages[i].startOffset..endOffset`. Row-
|
|
13
|
+
* level splitting (for header-row repeat + per-row cantSplit) will refine
|
|
14
|
+
* this to multiple fragments per block.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
DocumentPageSnapshot,
|
|
19
|
+
EditorSurfaceSnapshot,
|
|
20
|
+
SurfaceBlockSnapshot,
|
|
21
|
+
} from "../../api/public-types";
|
|
22
|
+
import type { RuntimeBlockFragment } from "./page-graph.ts";
|
|
23
|
+
|
|
24
|
+
type FragmentWithoutPageId = Omit<RuntimeBlockFragment, "pageId">;
|
|
25
|
+
|
|
26
|
+
export function projectSurfaceBlocksToPageFragments(
|
|
27
|
+
surface: EditorSurfaceSnapshot,
|
|
28
|
+
pages: readonly DocumentPageSnapshot[],
|
|
29
|
+
): Map<number, FragmentWithoutPageId[]> {
|
|
30
|
+
const byPage = new Map<number, FragmentWithoutPageId[]>();
|
|
31
|
+
const perPageCounter = new Map<number, number>();
|
|
32
|
+
|
|
33
|
+
for (const block of surface.blocks) {
|
|
34
|
+
const pageIndex = findPageIndexForOffset(pages, block.from);
|
|
35
|
+
if (pageIndex === null) continue;
|
|
36
|
+
const orderInRegion = perPageCounter.get(pageIndex) ?? 0;
|
|
37
|
+
perPageCounter.set(pageIndex, orderInRegion + 1);
|
|
38
|
+
|
|
39
|
+
const fragment: FragmentWithoutPageId = {
|
|
40
|
+
fragmentId: `fragment-${block.blockId}`,
|
|
41
|
+
blockId: block.blockId,
|
|
42
|
+
orderInRegion,
|
|
43
|
+
regionKind: "body",
|
|
44
|
+
from: block.from,
|
|
45
|
+
to: block.to,
|
|
46
|
+
// Height is not recomputed here — the pagination engine already
|
|
47
|
+
// measured the block to assign it to this page. Chrome surfaces
|
|
48
|
+
// that need precise heights can consult layout facet measurements.
|
|
49
|
+
heightTwips: estimateBlockHeightFromSpan(block),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
const existing = byPage.get(pageIndex);
|
|
53
|
+
if (existing) {
|
|
54
|
+
existing.push(fragment);
|
|
55
|
+
} else {
|
|
56
|
+
byPage.set(pageIndex, [fragment]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return byPage;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function findPageIndexForOffset(
|
|
64
|
+
pages: readonly DocumentPageSnapshot[],
|
|
65
|
+
offset: number,
|
|
66
|
+
): number | null {
|
|
67
|
+
for (let i = 0; i < pages.length; i += 1) {
|
|
68
|
+
const page = pages[i]!;
|
|
69
|
+
if (offset >= page.startOffset && offset < page.endOffset) {
|
|
70
|
+
return page.pageIndex;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Fall back to the last page for offsets that equal storySize.
|
|
74
|
+
const last = pages[pages.length - 1];
|
|
75
|
+
if (last && offset >= last.startOffset && offset <= last.endOffset) {
|
|
76
|
+
return last.pageIndex;
|
|
77
|
+
}
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Rough height estimate from the block's offset span. Only used as a
|
|
83
|
+
* fallback when the caller did not pre-measure. Chrome consumers that
|
|
84
|
+
* need accurate heights should read `facet.getMeasurement(blockId)`.
|
|
85
|
+
*/
|
|
86
|
+
function estimateBlockHeightFromSpan(block: SurfaceBlockSnapshot): number {
|
|
87
|
+
// 240 twips per line; approximate 80 chars per line for paragraphs.
|
|
88
|
+
const span = Math.max(0, block.to - block.from);
|
|
89
|
+
const lines = Math.max(1, Math.ceil(span / 80));
|
|
90
|
+
return lines * 240;
|
|
91
|
+
}
|