From a75c3be9e0b2f59acbee7fd8c868a41d0caff660 Mon Sep 17 00:00:00 2001 From: John Dvorak Date: Thu, 21 May 2026 13:20:57 -0700 Subject: [PATCH] feat: parse CSS contain values in geometry normalization - Add CONTAIN_MAP with bitfield flags matching CDP extractor schema (layout=1, paint=2, size=4, style=8, strict=15, content=7, inline-size=16) - Parse space-separated contain keywords in normalizeStyles() - Replace containFlags[i]=0 TODO with actual value lookup - Unknown contain keywords map to 0 gracefully --- packages/imhotep-geometry/src/normalize.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/imhotep-geometry/src/normalize.ts b/packages/imhotep-geometry/src/normalize.ts index 06ecf19..3412aea 100644 --- a/packages/imhotep-geometry/src/normalize.ts +++ b/packages/imhotep-geometry/src/normalize.ts @@ -322,6 +322,16 @@ const VISIBILITY_MAP: Record = { collapse: VisibilityValue.Collapse, } +const CONTAIN_MAP: Record = { + none: 0, + layout: 1, + paint: 2, + size: 4, + style: 8, + strict: 15, + content: 7, + 'inline-size': 16, +} const CLIP_KIND_MAP: Record = { overflow: ClipKind.Overflow, clipPath: ClipKind.ClipPath, @@ -648,7 +658,11 @@ export function normalizeStyles(raw: RawStyle[], strings: StringTable): Styles { overflowY[i] = OVERFLOW_MAP[s.overflowY] ?? OverflowValue.Visible opacity[i] = s.opacity visibility[i] = VISIBILITY_MAP[s.visibility] ?? VisibilityValue.Visible - containFlags[i] = 0 // TODO: parse contain values + if (s.contain) { + for (const part of s.contain.split(/\s+/)) { + containFlags[i] |= CONTAIN_MAP[part.toLowerCase()] ?? 0 + } + } pointerEvents[i] = internString(strings, s.pointerEvents) lineHeight[i] = s.lineHeight fontFamilyStringId[i] = internString(strings, s.fontFamily)