Skip to content

Commit 032d4c1

Browse files
authored
[2/16] refactor(layout): lift fragment metadata into resolved paint items (#2811)
* refactor(layout): lift page metadata into ResolvedPage * refactor(layout): lift fragment metadata into resolved paint items Add pmStart, pmEnd, continuesFromPrev, continuesOnNext, markerWidth, and metadata fields to resolved paint item types. Populate them in the resolvers and update the painter to prefer resolved item data over legacy Fragment reads with fallbacks. * fix(layout): use resolved continuation state for paragraph first-line width
1 parent c3b2cef commit 032d4c1

8 files changed

Lines changed: 555 additions & 39 deletions

File tree

packages/layout-engine/contracts/src/resolved-layout.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {
33
FlowMode,
44
Fragment,
55
ImageBlock,
6+
ImageFragmentMetadata,
67
Line,
78
PageMargins,
89
SectionVerticalAlign,
@@ -105,6 +106,16 @@ export type ResolvedFragmentItem = {
105106
blockId: string;
106107
/** Index within page.fragments — bridge to legacy content rendering. */
107108
fragmentIndex: number;
109+
/** ProseMirror start position for click-to-position mapping. */
110+
pmStart?: number;
111+
/** ProseMirror end position for click-to-position mapping. */
112+
pmEnd?: number;
113+
/** Whether this fragment continues from a previous page. */
114+
continuesFromPrev?: boolean;
115+
/** Whether this fragment continues on the next page. */
116+
continuesOnNext?: boolean;
117+
/** List marker box width in pixels (para/list-item only). */
118+
markerWidth?: number;
108119
/** Pre-resolved paragraph content for non-table paragraph fragments. */
109120
content?: ResolvedParagraphContent;
110121
};
@@ -205,6 +216,14 @@ export type ResolvedTableItem = {
205216
blockId: string;
206217
/** Index within page.fragments — bridge to legacy rendering. */
207218
fragmentIndex: number;
219+
/** ProseMirror start position for click-to-position mapping. */
220+
pmStart?: number;
221+
/** ProseMirror end position for click-to-position mapping. */
222+
pmEnd?: number;
223+
/** Whether this table fragment continues from a previous page. */
224+
continuesFromPrev?: boolean;
225+
/** Whether this table fragment continues on the next page. */
226+
continuesOnNext?: boolean;
208227
/** Pre-extracted TableBlock (replaces blockLookup.get()). */
209228
block: TableBlock;
210229
/** Pre-extracted TableMeasure (replaces blockLookup.get()). */
@@ -241,8 +260,14 @@ export type ResolvedImageItem = {
241260
blockId: string;
242261
/** Index within page.fragments — bridge to legacy rendering. */
243262
fragmentIndex: number;
263+
/** ProseMirror start position for click-to-position mapping. */
264+
pmStart?: number;
265+
/** ProseMirror end position for click-to-position mapping. */
266+
pmEnd?: number;
244267
/** Pre-extracted ImageBlock (replaces blockLookup.get()). */
245268
block: ImageBlock;
269+
/** Image metadata for interactive resizing (original dimensions, aspect ratio). */
270+
metadata?: ImageFragmentMetadata;
246271
};
247272

248273
/**
@@ -271,6 +296,10 @@ export type ResolvedDrawingItem = {
271296
blockId: string;
272297
/** Index within page.fragments — bridge to legacy rendering. */
273298
fragmentIndex: number;
299+
/** ProseMirror start position for click-to-position mapping. */
300+
pmStart?: number;
301+
/** ProseMirror end position for click-to-position mapping. */
302+
pmEnd?: number;
274303
/** Pre-extracted DrawingBlock (replaces blockLookup.get()). */
275304
block: DrawingBlock;
276305
};

packages/layout-engine/layout-resolved/src/resolveDrawing.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function resolveDrawingItem(
1717
): ResolvedDrawingItem {
1818
const { block } = requireResolvedBlockAndMeasure(blockMap, fragment.blockId, 'drawing', 'drawing', 'drawing');
1919

20-
return {
20+
const item: ResolvedDrawingItem = {
2121
kind: 'fragment',
2222
fragmentKind: 'drawing',
2323
id: resolveDrawingFragmentId(fragment),
@@ -31,4 +31,7 @@ export function resolveDrawingItem(
3131
fragmentIndex,
3232
block,
3333
};
34+
if (fragment.pmStart != null) item.pmStart = fragment.pmStart;
35+
if (fragment.pmEnd != null) item.pmEnd = fragment.pmEnd;
36+
return item;
3437
}

packages/layout-engine/layout-resolved/src/resolveImage.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ export function resolveImageItem(
1717
): ResolvedImageItem {
1818
const { block } = requireResolvedBlockAndMeasure(blockMap, fragment.blockId, 'image', 'image', 'image');
1919

20-
return {
20+
const item: ResolvedImageItem = {
2121
kind: 'fragment',
2222
fragmentKind: 'image',
2323
id: resolveImageFragmentId(fragment),
@@ -31,4 +31,8 @@ export function resolveImageItem(
3131
fragmentIndex,
3232
block,
3333
};
34+
if (fragment.pmStart != null) item.pmStart = fragment.pmStart;
35+
if (fragment.pmEnd != null) item.pmEnd = fragment.pmEnd;
36+
if (fragment.metadata != null) item.metadata = fragment.metadata;
37+
return item;
3438
}

0 commit comments

Comments
 (0)