noreflow 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/defaults.ts","../src/boxModel.ts","../src/gridLayout.ts","../src/layout.ts","../src/helpers.ts"],"names":["grid","row","col","h","resolveAlignSelf","pos"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { FlexStyle, ResolvedStyle } from './types.js';\n\n/**\n * CSS spec initial values for all flexbox-related properties.\n * See: https://www.w3.org/TR/css-flexbox-1/\n */\nconst DEFAULTS: ResolvedStyle = {\n display: 'flex',\n position: 'static',\n\n flexDirection: 'row',\n flexWrap: 'nowrap',\n justifyContent: 'flex-start',\n alignItems: 'stretch',\n alignSelf: 'auto',\n alignContent: 'stretch',\n justifyItems: 'stretch',\n justifySelf: 'auto',\n\n gridTemplateColumns: [],\n gridTemplateRows: [],\n gridAutoColumns: 'auto',\n gridAutoRows: 'auto',\n gridAutoFlow: 'row',\n\n gridColumnStart: 'auto',\n gridColumnEnd: 'auto',\n gridRowStart: 'auto',\n gridRowEnd: 'auto',\n\n flexGrow: 0,\n flexShrink: 1,\n flexBasis: 'auto',\n\n width: 'auto',\n height: 'auto',\n minWidth: 0,\n minHeight: 0,\n maxWidth: Infinity,\n maxHeight: Infinity,\n\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto',\n\n zIndex: 0,\n\n aspectRatio: undefined,\n\n paddingTop: 0,\n paddingRight: 0,\n paddingBottom: 0,\n paddingLeft: 0,\n\n marginTop: 0,\n marginRight: 0,\n marginBottom: 0,\n marginLeft: 0,\n\n borderTop: 0,\n borderRight: 0,\n borderBottom: 0,\n borderLeft: 0,\n\n rowGap: 0,\n columnGap: 0,\n\n boxSizing: 'content-box',\n};\n\n/**\n * Merge a partial FlexStyle with defaults to produce a fully resolved style.\n * Shorthand properties (padding, margin, border, gap) expand to their\n * individual edge values.\n */\nexport function resolveStyle(style?: FlexStyle): ResolvedStyle {\n if (!style) return { ...DEFAULTS };\n\n return {\n display: style.display ?? DEFAULTS.display,\n position: style.position ?? DEFAULTS.position,\n\n flexDirection: style.flexDirection ?? DEFAULTS.flexDirection,\n flexWrap: style.flexWrap ?? DEFAULTS.flexWrap,\n justifyContent: style.justifyContent ?? DEFAULTS.justifyContent,\n alignItems: style.alignItems ?? DEFAULTS.alignItems,\n alignSelf: style.alignSelf ?? DEFAULTS.alignSelf,\n alignContent: style.alignContent ?? DEFAULTS.alignContent,\n justifyItems: style.justifyItems ?? DEFAULTS.justifyItems,\n justifySelf: style.justifySelf ?? DEFAULTS.justifySelf,\n\n gridTemplateColumns: style.gridTemplateColumns ?? DEFAULTS.gridTemplateColumns,\n gridTemplateRows: style.gridTemplateRows ?? DEFAULTS.gridTemplateRows,\n gridAutoColumns: style.gridAutoColumns ?? DEFAULTS.gridAutoColumns,\n gridAutoRows: style.gridAutoRows ?? DEFAULTS.gridAutoRows,\n gridAutoFlow: style.gridAutoFlow ?? DEFAULTS.gridAutoFlow,\n\n gridColumnStart: style.gridColumnStart ?? DEFAULTS.gridColumnStart,\n gridColumnEnd: style.gridColumnEnd ?? DEFAULTS.gridColumnEnd,\n gridRowStart: style.gridRowStart ?? DEFAULTS.gridRowStart,\n gridRowEnd: style.gridRowEnd ?? DEFAULTS.gridRowEnd,\n\n flexGrow: style.flexGrow ?? DEFAULTS.flexGrow,\n flexShrink: style.flexShrink ?? DEFAULTS.flexShrink,\n flexBasis: style.flexBasis ?? DEFAULTS.flexBasis,\n\n width: style.width ?? DEFAULTS.width,\n height: style.height ?? DEFAULTS.height,\n minWidth: style.minWidth ?? DEFAULTS.minWidth,\n minHeight: style.minHeight ?? DEFAULTS.minHeight,\n maxWidth: style.maxWidth ?? DEFAULTS.maxWidth,\n maxHeight: style.maxHeight ?? DEFAULTS.maxHeight,\n\n top: style.top ?? DEFAULTS.top,\n right: style.right ?? DEFAULTS.right,\n bottom: style.bottom ?? DEFAULTS.bottom,\n left: style.left ?? DEFAULTS.left,\n\n zIndex: style.zIndex ?? DEFAULTS.zIndex,\n\n aspectRatio: style.aspectRatio ?? DEFAULTS.aspectRatio,\n\n paddingTop: style.paddingTop ?? style.padding ?? DEFAULTS.paddingTop,\n paddingRight: style.paddingRight ?? style.padding ?? DEFAULTS.paddingRight,\n paddingBottom: style.paddingBottom ?? style.padding ?? DEFAULTS.paddingBottom,\n paddingLeft: style.paddingLeft ?? style.padding ?? DEFAULTS.paddingLeft,\n\n marginTop: style.marginTop ?? style.margin ?? DEFAULTS.marginTop,\n marginRight: style.marginRight ?? style.margin ?? DEFAULTS.marginRight,\n marginBottom: style.marginBottom ?? style.margin ?? DEFAULTS.marginBottom,\n marginLeft: style.marginLeft ?? style.margin ?? DEFAULTS.marginLeft,\n\n borderTop: style.borderTop ?? style.border ?? DEFAULTS.borderTop,\n borderRight: style.borderRight ?? style.border ?? DEFAULTS.borderRight,\n borderBottom: style.borderBottom ?? style.border ?? DEFAULTS.borderBottom,\n borderLeft: style.borderLeft ?? style.border ?? DEFAULTS.borderLeft,\n\n rowGap: style.rowGap ?? style.gap ?? DEFAULTS.rowGap,\n columnGap: style.columnGap ?? style.gap ?? DEFAULTS.columnGap,\n\n boxSizing: style.boxSizing ?? DEFAULTS.boxSizing,\n };\n}\n","import type {\n DimensionValue,\n EdgeSizes,\n InsetValue,\n MarginValue,\n ResolvedStyle,\n SizeValue,\n} from './types.js';\n\n/**\n * Parse a percentage string like \"50%\" into the numeric value (50).\n * Returns null for non-percentage values.\n */\nfunction parsePercent(value: string): number | null {\n if (value.endsWith('%')) {\n const n = Number(value.slice(0, -1));\n return Number.isFinite(n) ? n : null;\n }\n return null;\n}\n\n/**\n * Resolve a SizeValue (px, %, or \"auto\") against a reference size.\n * Returns null for \"auto\" (caller must handle auto sizing).\n */\nexport function resolveSize(\n value: SizeValue,\n referenceSize: number,\n): number | null {\n if (value === 'auto') return null;\n if (typeof value === 'number') return value;\n const pct = parsePercent(value);\n if (pct !== null) {\n if (!isFinite(referenceSize)) return 0;\n return (pct / 100) * referenceSize;\n }\n return null;\n}\n\n/**\n * Resolve a DimensionValue (px or %) against a reference size.\n * Used for min/max constraints where \"auto\" is not valid.\n */\nexport function resolveDimension(\n value: DimensionValue,\n referenceSize: number,\n): number {\n if (typeof value === 'number') return value;\n const pct = parsePercent(value);\n if (pct !== null) {\n if (!isFinite(referenceSize)) return 0;\n return (pct / 100) * referenceSize;\n }\n return 0;\n}\n\n/**\n * Resolve a margin value. Returns null for \"auto\" margins\n * (which have special meaning in flex layout for alignment).\n */\nexport function resolveMargin(\n value: MarginValue,\n referenceSize: number,\n): number | null {\n if (value === 'auto') return null;\n if (typeof value === 'number') return value;\n const pct = parsePercent(value);\n if (pct !== null) return (pct / 100) * referenceSize;\n return 0;\n}\n\n/**\n * Resolve an inset value (top/right/bottom/left) against a reference size.\n * Returns null for \"auto\" (meaning the inset is not set).\n */\nexport function resolveInset(\n value: InsetValue,\n referenceSize: number,\n): number | null {\n if (value === 'auto') return null;\n if (typeof value === 'number') return value;\n const pct = parsePercent(value);\n if (pct !== null) return (pct / 100) * referenceSize;\n return null;\n}\n\n/**\n * Resolve all four padding edges to pixel values.\n */\nexport function resolvePadding(\n style: ResolvedStyle,\n): EdgeSizes {\n return {\n top: style.paddingTop,\n right: style.paddingRight,\n bottom: style.paddingBottom,\n left: style.paddingLeft,\n };\n}\n\n/**\n * Resolve all four border edges to pixel values.\n */\nexport function resolveBorder(\n style: ResolvedStyle,\n): EdgeSizes {\n return {\n top: style.borderTop,\n right: style.borderRight,\n bottom: style.borderBottom,\n left: style.borderLeft,\n };\n}\n\n/**\n * Clamp a value between min and max.\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * For border-box sizing, convert a specified size to the content size\n * by subtracting padding and border.\n */\nexport function borderBoxToContentBox(\n specifiedSize: number,\n padding: EdgeSizes,\n border: EdgeSizes,\n isMainHorizontal: boolean,\n): number {\n if (isMainHorizontal) {\n return Math.max(0, specifiedSize - padding.left - padding.right - border.left - border.right);\n }\n return Math.max(0, specifiedSize - padding.top - padding.bottom - border.top - border.bottom);\n}\n\n/**\n * Compute the total horizontal inset (padding + border on left and right).\n */\nexport function horizontalInset(padding: EdgeSizes, border: EdgeSizes): number {\n return padding.left + padding.right + border.left + border.right;\n}\n\n/**\n * Compute the total vertical inset (padding + border on top and bottom).\n */\nexport function verticalInset(padding: EdgeSizes, border: EdgeSizes): number {\n return padding.top + padding.bottom + border.top + border.bottom;\n}\n","import type {\n FlexNode,\n GridLine,\n LayoutResult,\n ResolvedStyle,\n TrackSize,\n JustifyItems,\n} from './types.js';\nimport { resolveStyle } from './defaults.js';\nimport {\n clamp,\n resolveInset,\n resolveBorder,\n resolveDimension,\n resolvePadding,\n resolveSize,\n horizontalInset,\n verticalInset,\n} from './boxModel.js';\n\n// ---------------------------------------------------------------------------\n// Track parsing\n// ---------------------------------------------------------------------------\n\ninterface ResolvedTrack {\n type: 'px' | 'percent' | 'fr' | 'auto';\n value: number;\n}\n\nfunction parseTrackSize(size: TrackSize): ResolvedTrack {\n if (size === 'auto') return { type: 'auto', value: 0 };\n if (typeof size === 'number') return { type: 'px', value: size };\n\n const str = size as string;\n if (str.endsWith('fr')) {\n const n = Number(str.slice(0, -2));\n return { type: 'fr', value: Number.isFinite(n) ? n : 0 };\n }\n if (str.endsWith('%')) {\n const n = Number(str.slice(0, -1));\n return { type: 'percent', value: Number.isFinite(n) ? n : 0 };\n }\n return { type: 'auto', value: 0 };\n}\n\n// ---------------------------------------------------------------------------\n// Grid item placement\n// ---------------------------------------------------------------------------\n\ninterface GridItem {\n node: FlexNode;\n style: ResolvedStyle;\n originalIndex: number;\n\n // Resolved placement (0-based track indices)\n colStart: number;\n colEnd: number;\n rowStart: number;\n rowEnd: number;\n}\n\nfunction resolveGridLine(value: GridLine): number | null {\n if (value === 'auto') return null;\n return value;\n}\n\n/**\n * Place items onto the grid. Items with explicit placement go first,\n * then auto-placed items fill remaining cells.\n */\nfunction placeItems(\n items: GridItem[],\n explicitCols: number,\n explicitRows: number,\n autoFlow: ResolvedStyle['gridAutoFlow'],\n): { totalCols: number; totalRows: number } {\n let maxCol = explicitCols;\n let maxRow = explicitRows;\n\n // Pass 1: resolve explicit placements\n for (const item of items) {\n const cs = resolveGridLine(item.style.gridColumnStart);\n const ce = resolveGridLine(item.style.gridColumnEnd);\n const rs = resolveGridLine(item.style.gridRowStart);\n const re = resolveGridLine(item.style.gridRowEnd);\n\n // Convert 1-based line numbers to 0-based track indices\n if (cs !== null) item.colStart = cs - 1;\n if (ce !== null) item.colEnd = ce - 1;\n if (rs !== null) item.rowStart = rs - 1;\n if (re !== null) item.rowEnd = re - 1;\n\n // If start is set but end is not, span 1\n if (cs !== null && ce === null) item.colEnd = item.colStart + 1;\n if (rs !== null && re === null) item.rowEnd = item.rowStart + 1;\n\n // If end is set but start is not, place one track before end\n if (cs === null && ce !== null) item.colStart = item.colEnd - 1;\n if (rs === null && re !== null) item.rowStart = item.rowEnd - 1;\n\n if (item.colEnd > maxCol) maxCol = item.colEnd;\n if (item.rowEnd > maxRow) maxRow = item.rowEnd;\n }\n\n // Pass 2: auto-place items that have no explicit position\n const isOccupied = (grid: Set<string>, row: number, col: number) =>\n grid.has(`${row},${col}`);\n\n const markOccupied = (grid: Set<string>, item: GridItem) => {\n for (let r = item.rowStart; r < item.rowEnd; r++) {\n for (let c = item.colStart; c < item.colEnd; c++) {\n grid.add(`${r},${c}`);\n }\n }\n };\n\n const occupiedCells = new Set<string>();\n\n // Mark explicitly placed items\n for (const item of items) {\n if (item.colStart >= 0 && item.rowStart >= 0) {\n markOccupied(occupiedCells, item);\n }\n }\n\n // Auto-place remaining items\n let autoRow = 0;\n let autoCol = 0;\n\n for (const item of items) {\n const needsColPlacement = item.colStart < 0;\n const needsRowPlacement = item.rowStart < 0;\n\n if (!needsColPlacement && !needsRowPlacement) continue;\n\n const spanCols = needsColPlacement ? 1 : item.colEnd - item.colStart;\n const spanRows = needsRowPlacement ? 1 : item.rowEnd - item.rowStart;\n\n if (autoFlow === 'row') {\n // Row-major auto-placement\n let placed = false;\n for (let r = needsRowPlacement ? autoRow : item.rowStart; !placed; r++) {\n const startCol = (r === autoRow && needsColPlacement) ? autoCol : 0;\n for (let c = needsColPlacement ? startCol : item.colStart; c <= maxCol - spanCols; c++) {\n let fits = true;\n for (let dr = 0; dr < spanRows && fits; dr++) {\n for (let dc = 0; dc < spanCols && fits; dc++) {\n if (isOccupied(occupiedCells, r + dr, c + dc)) fits = false;\n }\n }\n if (fits) {\n if (needsColPlacement) {\n item.colStart = c;\n item.colEnd = c + spanCols;\n }\n if (needsRowPlacement) {\n item.rowStart = r;\n item.rowEnd = r + spanRows;\n }\n markOccupied(occupiedCells, item);\n autoRow = r;\n autoCol = item.colEnd;\n if (autoCol >= maxCol) {\n autoRow++;\n autoCol = 0;\n }\n placed = true;\n break;\n }\n }\n if (!placed) {\n if (r >= maxRow) maxRow = r + 1;\n autoCol = 0;\n }\n }\n } else {\n // Column-major auto-placement\n let placed = false;\n for (let c = needsColPlacement ? autoCol : item.colStart; !placed; c++) {\n const startRow = (c === autoCol && needsRowPlacement) ? autoRow : 0;\n for (let r = needsRowPlacement ? startRow : item.rowStart; r <= maxRow - spanRows; r++) {\n let fits = true;\n for (let dr = 0; dr < spanRows && fits; dr++) {\n for (let dc = 0; dc < spanCols && fits; dc++) {\n if (isOccupied(occupiedCells, r + dr, c + dc)) fits = false;\n }\n }\n if (fits) {\n if (needsRowPlacement) {\n item.rowStart = r;\n item.rowEnd = r + spanRows;\n }\n if (needsColPlacement) {\n item.colStart = c;\n item.colEnd = c + spanCols;\n }\n markOccupied(occupiedCells, item);\n autoCol = c;\n autoRow = item.rowEnd;\n if (autoRow >= maxRow) {\n autoCol++;\n autoRow = 0;\n }\n placed = true;\n break;\n }\n }\n if (!placed) {\n if (c >= maxCol) maxCol = c + 1;\n autoRow = 0;\n }\n }\n }\n\n if (item.colEnd > maxCol) maxCol = item.colEnd;\n if (item.rowEnd > maxRow) maxRow = item.rowEnd;\n }\n\n return { totalCols: maxCol, totalRows: maxRow };\n}\n\n// ---------------------------------------------------------------------------\n// Track sizing\n// ---------------------------------------------------------------------------\n\nfunction resolveTrackSizes(\n tracks: ResolvedTrack[],\n availableSize: number,\n gap: number,\n items: GridItem[],\n axis: 'col' | 'row',\n layoutFn: (node: FlexNode, w: number, h: number) => LayoutResult,\n): number[] {\n const sizes = new Array<number>(tracks.length).fill(0);\n const totalGap = gap * Math.max(0, tracks.length - 1);\n let remainingSpace = availableSize - totalGap;\n\n // Pass 1: resolve fixed (px) and percent tracks\n const frTracks: number[] = [];\n let totalFr = 0;\n\n for (let i = 0; i < tracks.length; i++) {\n const t = tracks[i]!;\n if (t.type === 'px') {\n sizes[i] = t.value;\n remainingSpace -= t.value;\n } else if (t.type === 'percent') {\n sizes[i] = (t.value / 100) * availableSize;\n remainingSpace -= sizes[i]!;\n } else if (t.type === 'fr') {\n frTracks.push(i);\n totalFr += t.value;\n } else {\n // auto: size to content\n let maxContent = 0;\n for (const item of items) {\n const start = axis === 'col' ? item.colStart : item.rowStart;\n const end = axis === 'col' ? item.colEnd : item.rowEnd;\n if (start === i && end === i + 1) {\n const childStyle = item.style;\n const childPadding = resolvePadding(childStyle);\n const childBorder = resolveBorder(childStyle);\n\n if (axis === 'col') {\n const resolved = resolveSize(childStyle.width, availableSize);\n if (resolved !== null) {\n let w = resolved;\n if (childStyle.boxSizing === 'border-box') {\n w = Math.max(0, w - horizontalInset(childPadding, childBorder));\n }\n maxContent = Math.max(maxContent, w + horizontalInset(childPadding, childBorder));\n } else if (item.node.measure) {\n const measured = item.node.measure(Infinity, Infinity);\n maxContent = Math.max(maxContent, measured.width + horizontalInset(childPadding, childBorder));\n } else if ((item.node.children ?? []).length > 0) {\n const childLayout = layoutFn(item.node, Infinity, Infinity);\n maxContent = Math.max(maxContent, childLayout.width);\n }\n } else {\n const resolved = resolveSize(childStyle.height, availableSize);\n if (resolved !== null) {\n let h = resolved;\n if (childStyle.boxSizing === 'border-box') {\n h = Math.max(0, h - verticalInset(childPadding, childBorder));\n }\n maxContent = Math.max(maxContent, h + verticalInset(childPadding, childBorder));\n } else if (item.node.measure) {\n const measured = item.node.measure(Infinity, Infinity);\n maxContent = Math.max(maxContent, measured.height + verticalInset(childPadding, childBorder));\n } else if ((item.node.children ?? []).length > 0) {\n const childLayout = layoutFn(item.node, Infinity, Infinity);\n maxContent = Math.max(maxContent, childLayout.height);\n }\n }\n }\n }\n sizes[i] = maxContent;\n remainingSpace -= maxContent;\n }\n }\n\n // Pass 2: distribute remaining space to fr tracks\n if (frTracks.length > 0 && totalFr > 0) {\n const frSpace = Math.max(0, remainingSpace);\n for (const idx of frTracks) {\n sizes[idx] = (tracks[idx]!.value / totalFr) * frSpace;\n }\n }\n\n return sizes;\n}\n\n// ---------------------------------------------------------------------------\n// Grid alignment helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveJustifySelf(\n justifySelf: ResolvedStyle['justifySelf'],\n parentJustifyItems: JustifyItems,\n): JustifyItems {\n return justifySelf === 'auto' ? parentJustifyItems : justifySelf;\n}\n\nfunction resolveAlignSelf(\n alignSelf: ResolvedStyle['alignSelf'],\n parentAlignItems: ResolvedStyle['alignItems'],\n): ResolvedStyle['alignItems'] {\n return alignSelf === 'auto' ? parentAlignItems : alignSelf;\n}\n\n// ---------------------------------------------------------------------------\n// layoutGrid — the grid layout entry point\n// ---------------------------------------------------------------------------\n\nexport function layoutGrid(\n node: FlexNode,\n availableWidth: number,\n availableHeight: number,\n layoutNodeFn: (node: FlexNode, w: number, h: number) => LayoutResult,\n): LayoutResult {\n const style = resolveStyle(node.style);\n\n const padding = resolvePadding(style);\n const border = resolveBorder(style);\n const hInset = horizontalInset(padding, border);\n const vInset = verticalInset(padding, border);\n\n // Resolve container size\n let containerWidth = resolveSize(style.width, availableWidth);\n let containerHeight = resolveSize(style.height, availableHeight);\n\n if (style.boxSizing === 'border-box') {\n if (containerWidth !== null) containerWidth = Math.max(0, containerWidth - hInset);\n if (containerHeight !== null) containerHeight = Math.max(0, containerHeight - vInset);\n }\n\n const contentWidth = containerWidth ?? Math.max(0, availableWidth - hInset);\n const contentHeight = containerHeight ?? Math.max(0, availableHeight - vInset);\n\n // Resolve min/max\n const containerMinW = resolveDimension(style.minWidth, availableWidth);\n const containerMaxW = resolveDimension(style.maxWidth, availableWidth);\n const containerMinH = resolveDimension(style.minHeight, availableHeight);\n const containerMaxH = resolveDimension(style.maxHeight, availableHeight);\n\n // ---------------------------------------------------------------------------\n // Build grid items (separate absolute from flow, like flex)\n // ---------------------------------------------------------------------------\n\n const children = node.children ?? [];\n\n interface ChildEntry {\n index: number;\n child: FlexNode;\n style: ResolvedStyle;\n }\n\n const absoluteChildren: ChildEntry[] = [];\n const flowEntries: ChildEntry[] = [];\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!;\n const childStyle = resolveStyle(child.style);\n const entry: ChildEntry = { index: i, child, style: childStyle };\n if (childStyle.position === 'absolute') {\n absoluteChildren.push(entry);\n } else if (childStyle.display !== 'none') {\n flowEntries.push(entry);\n }\n }\n\n // Build grid items with sentinel placements (-1 = needs auto-placement)\n const gridItems: GridItem[] = flowEntries.map((e) => ({\n node: e.child,\n style: e.style,\n originalIndex: e.index,\n colStart: -1,\n colEnd: -1,\n rowStart: -1,\n rowEnd: -1,\n }));\n\n // Parse template definitions\n const colTemplates = style.gridTemplateColumns.map(parseTrackSize);\n const rowTemplates = style.gridTemplateRows.map(parseTrackSize);\n const autoColTrack = parseTrackSize(style.gridAutoColumns);\n const autoRowTrack = parseTrackSize(style.gridAutoRows);\n\n const explicitCols = colTemplates.length;\n const explicitRows = rowTemplates.length;\n\n // Place items and determine final grid size\n const { totalCols, totalRows } = placeItems(\n gridItems,\n Math.max(explicitCols, 1),\n Math.max(explicitRows, 1),\n style.gridAutoFlow,\n );\n\n // Build full track lists (explicit + implicit)\n const allColTracks: ResolvedTrack[] = [];\n for (let i = 0; i < totalCols; i++) {\n allColTracks.push(i < explicitCols ? colTemplates[i]! : autoColTrack);\n }\n\n const allRowTracks: ResolvedTrack[] = [];\n for (let i = 0; i < totalRows; i++) {\n allRowTracks.push(i < explicitRows ? rowTemplates[i]! : autoRowTrack);\n }\n\n // Resolve track sizes\n const colSizes = resolveTrackSizes(\n allColTracks, contentWidth, style.columnGap, gridItems, 'col', layoutNodeFn,\n );\n const rowSizes = resolveTrackSizes(\n allRowTracks, contentHeight, style.rowGap, gridItems, 'row', layoutNodeFn,\n );\n\n // Compute track positions (cumulative offsets including gaps)\n const colPositions = new Array<number>(totalCols);\n let pos = 0;\n for (let i = 0; i < totalCols; i++) {\n colPositions[i] = pos;\n pos += colSizes[i]! + (i < totalCols - 1 ? style.columnGap : 0);\n }\n\n const rowPositions = new Array<number>(totalRows);\n pos = 0;\n for (let i = 0; i < totalRows; i++) {\n rowPositions[i] = pos;\n pos += rowSizes[i]! + (i < totalRows - 1 ? style.rowGap : 0);\n }\n\n // Total content size from tracks\n const tracksWidth = totalCols > 0\n ? colPositions[totalCols - 1]! + colSizes[totalCols - 1]!\n : 0;\n const tracksHeight = totalRows > 0\n ? rowPositions[totalRows - 1]! + rowSizes[totalRows - 1]!\n : 0;\n\n // Final container size\n let finalWidth: number;\n if (containerWidth !== null) {\n finalWidth = containerWidth + hInset;\n } else {\n finalWidth = clamp(tracksWidth + hInset, containerMinW, containerMaxW);\n }\n\n let finalHeight: number;\n if (containerHeight !== null) {\n finalHeight = containerHeight + vInset;\n } else {\n finalHeight = clamp(tracksHeight + vInset, containerMinH, containerMaxH);\n }\n\n // ---------------------------------------------------------------------------\n // Align-content / justify-content: offset all tracks within container\n // ---------------------------------------------------------------------------\n\n const usableWidth = finalWidth - hInset;\n const usableHeight = finalHeight - vInset;\n\n const justifyOffset = computeContentAlignment(\n style.justifyContent, tracksWidth, usableWidth,\n );\n const alignOffset = computeContentAlignment(\n style.alignContent, tracksHeight, usableHeight,\n );\n\n // ---------------------------------------------------------------------------\n // Position each grid item\n // ---------------------------------------------------------------------------\n\n const childLayoutMap = new Map<number, LayoutResult>();\n\n for (const item of gridItems) {\n // Grid area bounds\n let areaX = colPositions[item.colStart]! + justifyOffset;\n let areaY = rowPositions[item.rowStart]! + alignOffset;\n let areaW = 0;\n for (let c = item.colStart; c < item.colEnd; c++) {\n areaW += colSizes[c]!;\n if (c > item.colStart) areaW += style.columnGap;\n }\n let areaH = 0;\n for (let r = item.rowStart; r < item.rowEnd; r++) {\n areaH += rowSizes[r]!;\n if (r > item.rowStart) areaH += style.rowGap;\n }\n\n const childPadding = resolvePadding(item.style);\n const childBorder = resolveBorder(item.style);\n const childHInset = horizontalInset(childPadding, childBorder);\n const childVInset = verticalInset(childPadding, childBorder);\n\n // Resolve item size\n let itemW = resolveSize(item.style.width, contentWidth);\n let itemH = resolveSize(item.style.height, contentHeight);\n\n if (item.style.boxSizing === 'border-box') {\n if (itemW !== null) itemW = Math.max(0, itemW - childHInset);\n if (itemH !== null) itemH = Math.max(0, itemH - childVInset);\n }\n\n // Aspect ratio\n if (item.style.aspectRatio !== undefined) {\n if (itemW !== null && itemH === null) {\n itemH = itemW / item.style.aspectRatio;\n } else if (itemH !== null && itemW === null) {\n itemW = itemH * item.style.aspectRatio;\n }\n }\n\n // Alignment determines whether we stretch to fill the grid area\n const effectiveJustify = resolveJustifySelf(item.style.justifySelf, style.justifyItems);\n const effectiveAlign = resolveAlignSelf(item.style.alignSelf, style.alignItems);\n\n if (itemW === null) {\n if (effectiveJustify === 'stretch') {\n itemW = Math.max(0, areaW - childHInset);\n } else if (item.node.measure) {\n const measured = item.node.measure(areaW, areaH);\n itemW = measured.width;\n } else if ((item.node.children ?? []).length > 0) {\n const childLayout = layoutNodeFn(item.node, areaW, areaH);\n itemW = Math.max(0, childLayout.width - childHInset);\n } else {\n itemW = Math.max(0, areaW - childHInset);\n }\n }\n\n if (itemH === null) {\n if (effectiveAlign === 'stretch') {\n itemH = Math.max(0, areaH - childVInset);\n } else if (item.node.measure) {\n const measured = item.node.measure(itemW + childHInset, areaH);\n itemH = measured.height;\n } else if ((item.node.children ?? []).length > 0) {\n const childLayout = layoutNodeFn(item.node, itemW + childHInset, areaH);\n itemH = Math.max(0, childLayout.height - childVInset);\n } else {\n itemH = Math.max(0, areaH - childVInset);\n }\n }\n\n // Clamp\n const minW = resolveDimension(item.style.minWidth, contentWidth);\n const maxW = resolveDimension(item.style.maxWidth, contentWidth);\n const minH = resolveDimension(item.style.minHeight, contentHeight);\n const maxH = resolveDimension(item.style.maxHeight, contentHeight);\n itemW = clamp(itemW, minW, maxW);\n itemH = clamp(itemH, minH, maxH);\n\n const outerW = itemW + childHInset;\n const outerH = itemH + childVInset;\n\n // Position within grid area based on alignment\n let itemX = padding.left + border.left + areaX;\n let itemY = padding.top + border.top + areaY;\n\n switch (effectiveJustify) {\n case 'start':\n break;\n case 'end':\n itemX += areaW - outerW;\n break;\n case 'center':\n itemX += (areaW - outerW) / 2;\n break;\n case 'stretch':\n break;\n }\n\n switch (effectiveAlign) {\n case 'flex-start':\n break;\n case 'flex-end':\n itemY += areaH - outerH;\n break;\n case 'center':\n itemY += (areaH - outerH) / 2;\n break;\n case 'stretch':\n break;\n }\n\n // Apply relative positioning\n if (item.style.position === 'relative') {\n const insetTop = resolveInset(item.style.top, finalHeight);\n const insetLeft = resolveInset(item.style.left, finalWidth);\n const insetBottom = resolveInset(item.style.bottom, finalHeight);\n const insetRight = resolveInset(item.style.right, finalWidth);\n\n if (insetLeft !== null) itemX += insetLeft;\n else if (insetRight !== null) itemX -= insetRight;\n if (insetTop !== null) itemY += insetTop;\n else if (insetBottom !== null) itemY -= insetBottom;\n }\n\n // Recursively layout children, propagating grid-determined dimensions\n let itemChildLayouts: LayoutResult[] = [];\n if ((item.node.children ?? []).length > 0) {\n const sizedNode: FlexNode = {\n ...item.node,\n style: {\n ...item.node.style,\n width: outerW,\n height: outerH,\n boxSizing: 'border-box' as const,\n },\n };\n const innerLayout = layoutNodeFn(sizedNode, outerW, outerH);\n itemChildLayouts = innerLayout.children;\n }\n\n childLayoutMap.set(item.originalIndex, {\n x: itemX,\n y: itemY,\n width: outerW,\n height: outerH,\n children: itemChildLayouts,\n });\n }\n\n // ---------------------------------------------------------------------------\n // Absolute children (same logic as flex)\n // ---------------------------------------------------------------------------\n\n const cbWidth = finalWidth - border.left - border.right;\n const cbHeight = finalHeight - border.top - border.bottom;\n\n for (const { index, child, style: absStyle } of absoluteChildren) {\n if (absStyle.display === 'none') {\n childLayoutMap.set(index, { x: 0, y: 0, width: 0, height: 0, children: [] });\n continue;\n }\n\n const absPadding = resolvePadding(absStyle);\n const absBorder = resolveBorder(absStyle);\n const absHInset = horizontalInset(absPadding, absBorder);\n const absVInset = verticalInset(absPadding, absBorder);\n\n const insetTop = resolveInset(absStyle.top, cbHeight);\n const insetRight = resolveInset(absStyle.right, cbWidth);\n const insetBottom = resolveInset(absStyle.bottom, cbHeight);\n const insetLeft = resolveInset(absStyle.left, cbWidth);\n\n let absW = resolveSize(absStyle.width, cbWidth);\n let absH = resolveSize(absStyle.height, cbHeight);\n\n if (absStyle.boxSizing === 'border-box') {\n if (absW !== null) absW = Math.max(0, absW - absHInset);\n if (absH !== null) absH = Math.max(0, absH - absVInset);\n }\n\n if (absW === null && insetLeft !== null && insetRight !== null) {\n absW = Math.max(0, cbWidth - insetLeft - insetRight - absHInset);\n }\n if (absH === null && insetTop !== null && insetBottom !== null) {\n absH = Math.max(0, cbHeight - insetTop - insetBottom - absVInset);\n }\n\n if (absStyle.aspectRatio !== undefined) {\n if (absW !== null && absH === null) absH = absW / absStyle.aspectRatio;\n else if (absH !== null && absW === null) absW = absH * absStyle.aspectRatio;\n }\n\n if (absW === null || absH === null) {\n if (child.measure) {\n const measured = child.measure(absW ?? cbWidth, absH ?? cbHeight);\n if (absW === null) absW = measured.width;\n if (absH === null) absH = measured.height;\n } else if ((child.children ?? []).length > 0) {\n const intrinsic = layoutNodeFn(child, absW !== null ? absW + absHInset : cbWidth, absH !== null ? absH + absVInset : cbHeight);\n if (absW === null) absW = Math.max(0, intrinsic.width - absHInset);\n if (absH === null) absH = Math.max(0, intrinsic.height - absVInset);\n } else {\n if (absW === null) absW = 0;\n if (absH === null) absH = 0;\n }\n }\n\n const absMinW = resolveDimension(absStyle.minWidth, cbWidth);\n const absMaxW = resolveDimension(absStyle.maxWidth, cbWidth);\n const absMinH = resolveDimension(absStyle.minHeight, cbHeight);\n const absMaxH = resolveDimension(absStyle.maxHeight, cbHeight);\n absW = clamp(absW, absMinW, absMaxW);\n absH = clamp(absH, absMinH, absMaxH);\n\n const absOuterW = absW + absHInset;\n const absOuterH = absH + absVInset;\n\n let absX = insetLeft !== null ? border.left + insetLeft\n : insetRight !== null ? border.left + cbWidth - insetRight - absOuterW\n : border.left;\n let absY = insetTop !== null ? border.top + insetTop\n : insetBottom !== null ? border.top + cbHeight - insetBottom - absOuterH\n : border.top;\n\n let absChildLayouts: LayoutResult[] = [];\n if ((child.children ?? []).length > 0) {\n const innerLayout = layoutNodeFn(child, absOuterW, absOuterH);\n absChildLayouts = innerLayout.children;\n }\n\n childLayoutMap.set(index, {\n x: absX,\n y: absY,\n width: absOuterW,\n height: absOuterH,\n children: absChildLayouts,\n });\n }\n\n // Hidden children\n for (let i = 0; i < children.length; i++) {\n if (!childLayoutMap.has(i)) {\n const childStyle = resolveStyle(children[i]!.style);\n if (childStyle.display === 'none' && childStyle.position !== 'absolute') {\n childLayoutMap.set(i, { x: 0, y: 0, width: 0, height: 0, children: [] });\n }\n }\n }\n\n // Reassemble in DOM order\n const childLayouts: LayoutResult[] = [];\n for (let i = 0; i < children.length; i++) {\n const layout = childLayoutMap.get(i);\n if (layout) childLayouts.push(layout);\n }\n\n return {\n x: 0,\n y: 0,\n width: finalWidth,\n height: finalHeight,\n children: childLayouts,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Content alignment (justify-content / align-content for grid)\n// ---------------------------------------------------------------------------\n\nfunction computeContentAlignment(\n alignment: ResolvedStyle['justifyContent'] | ResolvedStyle['alignContent'],\n tracksSize: number,\n containerSize: number,\n): number {\n const freeSpace = Math.max(0, containerSize - tracksSize);\n\n switch (alignment) {\n case 'flex-start':\n case 'stretch':\n return 0;\n case 'flex-end':\n return freeSpace;\n case 'center':\n return freeSpace / 2;\n case 'space-between':\n case 'space-around':\n case 'space-evenly':\n return 0;\n }\n}\n","import type {\n AlignItems,\n EdgeSizes,\n FlexNode,\n LayoutResult,\n MeasureFunction,\n ResolvedStyle,\n} from './types.js';\nimport { resolveStyle } from './defaults.js';\nimport {\n clamp,\n resolveInset,\n resolveBorder,\n resolveDimension,\n resolveMargin,\n resolvePadding,\n resolveSize,\n horizontalInset,\n verticalInset,\n} from './boxModel.js';\nimport { layoutGrid } from './gridLayout.js';\n\n// ---------------------------------------------------------------------------\n// Internal item representation used during layout\n// ---------------------------------------------------------------------------\n\ninterface FlexItem {\n node: FlexNode;\n style: ResolvedStyle;\n padding: EdgeSizes;\n border: EdgeSizes;\n\n // Resolved margins (null = auto margin)\n marginTop: number | null;\n marginRight: number | null;\n marginBottom: number | null;\n marginLeft: number | null;\n\n // Sizes computed during layout\n flexBaseSize: number;\n hypotheticalMainSize: number;\n targetMainSize: number;\n usedMainSize: number;\n hypotheticalCrossSize: number;\n usedCrossSize: number;\n\n // Min/max constraints in the main axis (resolved to px)\n minMainSize: number;\n maxMainSize: number;\n minCrossSize: number;\n maxCrossSize: number;\n\n // Position (relative to container's content box)\n mainPos: number;\n crossPos: number;\n\n frozen: boolean;\n\n measure?: MeasureFunction;\n children: FlexNode[];\n}\n\ninterface FlexLine {\n items: FlexItem[];\n crossSize: number;\n crossOffset: number;\n}\n\n// ---------------------------------------------------------------------------\n// Axis helpers\n// ---------------------------------------------------------------------------\n\nfunction isRow(direction: ResolvedStyle['flexDirection']): boolean {\n return direction === 'row' || direction === 'row-reverse';\n}\n\nfunction mainAxisIsHorizontal(direction: ResolvedStyle['flexDirection']): boolean {\n return isRow(direction);\n}\n\n// ---------------------------------------------------------------------------\n// computeLayout — the main entry point\n// ---------------------------------------------------------------------------\n\n// Per-computation cache: avoids redundant recursive layoutNode calls\n// on the same node with the same available dimensions.\nlet layoutCache: Map<FlexNode, Map<string, LayoutResult>> | null = null;\n\nexport function computeLayout(\n node: FlexNode,\n availableWidth: number = Infinity,\n availableHeight: number = Infinity,\n): LayoutResult {\n layoutCache = new Map();\n const result = layoutNode(node, availableWidth, availableHeight);\n layoutCache = null;\n return result;\n}\n\nfunction layoutNode(\n node: FlexNode,\n availableWidth: number,\n availableHeight: number,\n definiteWidth?: number,\n definiteHeight?: number,\n): LayoutResult {\n if (layoutCache) {\n const nodeCache = layoutCache.get(node);\n if (nodeCache) {\n const key = `${availableWidth},${availableHeight},${definiteWidth ?? ''},${definiteHeight ?? ''}`;\n const cached = nodeCache.get(key);\n if (cached) return cached;\n }\n }\n const style = resolveStyle(node.style);\n\n if (style.display === 'none') {\n return { x: 0, y: 0, width: 0, height: 0, children: [] };\n }\n\n if (style.display === 'grid') {\n const gridResult = layoutGrid(node, availableWidth, availableHeight, layoutNode);\n if (layoutCache) {\n let nodeCache = layoutCache.get(node);\n if (!nodeCache) {\n nodeCache = new Map();\n layoutCache.set(node, nodeCache);\n }\n const key = `${availableWidth},${availableHeight},${definiteWidth ?? ''},${definiteHeight ?? ''}`;\n nodeCache.set(key, gridResult);\n }\n return gridResult;\n }\n\n const padding = resolvePadding(style);\n const border = resolveBorder(style);\n const hInset = horizontalInset(padding, border);\n const vInset = verticalInset(padding, border);\n\n // Resolve container's own size\n let containerWidth = resolveSize(style.width, availableWidth);\n let containerHeight = resolveSize(style.height, availableHeight);\n\n // When a parent has determined this node's size (via flex-grow or\n // align-items: stretch), the style may still say 'auto'. Override with the\n // definite outer dimensions so children can stretch / resolve percentages.\n if (containerWidth === null && definiteWidth !== undefined) {\n containerWidth = Math.max(0, definiteWidth - hInset);\n }\n if (containerHeight === null && definiteHeight !== undefined) {\n containerHeight = Math.max(0, definiteHeight - vInset);\n }\n\n // For border-box, the specified size includes padding+border\n if (style.boxSizing === 'border-box') {\n if (containerWidth !== null) containerWidth = Math.max(0, containerWidth - hInset);\n if (containerHeight !== null) containerHeight = Math.max(0, containerHeight - vInset);\n }\n\n const horizontal = mainAxisIsHorizontal(style.flexDirection);\n const mainSize = horizontal ? containerWidth : containerHeight;\n const crossSize = horizontal ? containerHeight : containerWidth;\n\n const availableMainForItems = mainSize ?? (horizontal ? availableWidth - hInset : availableHeight - vInset);\n const availableCrossForItems = crossSize ?? (horizontal ? availableHeight - vInset : availableWidth - hInset);\n\n // Resolve min/max for the container content box\n const containerMinW = resolveDimension(style.minWidth, availableWidth);\n const containerMaxW = resolveDimension(style.maxWidth, availableWidth);\n const containerMinH = resolveDimension(style.minHeight, availableHeight);\n const containerMaxH = resolveDimension(style.maxHeight, availableHeight);\n\n // ---------------------------------------------------------------------------\n // 9.1 — Generate flex items\n // ---------------------------------------------------------------------------\n\n const children = node.children ?? [];\n\n // Track original child indices so we can reassemble the output in DOM order\n interface ChildEntry {\n index: number;\n child: FlexNode;\n style: ResolvedStyle;\n }\n\n const absoluteChildren: ChildEntry[] = [];\n const flowChildren: ChildEntry[] = [];\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]!;\n const childStyle = resolveStyle(child.style);\n const entry: ChildEntry = { index: i, child, style: childStyle };\n if (childStyle.position === 'absolute') {\n absoluteChildren.push(entry);\n } else {\n flowChildren.push(entry);\n }\n }\n\n const items: FlexItem[] = flowChildren.map(({ child, style: childStyle }) => {\n const childPadding = resolvePadding(childStyle);\n const childBorder = resolveBorder(childStyle);\n return {\n node: child,\n style: childStyle,\n padding: childPadding,\n border: childBorder,\n marginTop: resolveMargin(childStyle.marginTop, horizontal ? availableCrossForItems : availableMainForItems),\n marginRight: resolveMargin(childStyle.marginRight, horizontal ? availableMainForItems : availableCrossForItems),\n marginBottom: resolveMargin(childStyle.marginBottom, horizontal ? availableCrossForItems : availableMainForItems),\n marginLeft: resolveMargin(childStyle.marginLeft, horizontal ? availableMainForItems : availableCrossForItems),\n flexBaseSize: 0,\n hypotheticalMainSize: 0,\n targetMainSize: 0,\n usedMainSize: 0,\n hypotheticalCrossSize: 0,\n usedCrossSize: 0,\n minMainSize: horizontal\n ? resolveDimension(childStyle.minWidth, availableMainForItems)\n : resolveDimension(childStyle.minHeight, availableMainForItems),\n maxMainSize: horizontal\n ? resolveDimension(childStyle.maxWidth, availableMainForItems)\n : resolveDimension(childStyle.maxHeight, availableMainForItems),\n minCrossSize: horizontal\n ? resolveDimension(childStyle.minHeight, availableCrossForItems)\n : resolveDimension(childStyle.minWidth, availableCrossForItems),\n maxCrossSize: horizontal\n ? resolveDimension(childStyle.maxHeight, availableCrossForItems)\n : resolveDimension(childStyle.maxWidth, availableCrossForItems),\n mainPos: 0,\n crossPos: 0,\n frozen: false,\n measure: child.measure,\n children: child.children ?? [],\n } satisfies FlexItem;\n });\n\n // Filter out display:none items (but track their indices for output)\n const hiddenFlowIndices: number[] = [];\n const visibleItems: FlexItem[] = [];\n for (let i = 0; i < items.length; i++) {\n if (items[i]!.style.display === 'none') {\n hiddenFlowIndices.push(flowChildren[i]!.index);\n } else {\n visibleItems.push(items[i]!);\n }\n }\n\n // ---------------------------------------------------------------------------\n // 9.2 — Determine flex base size and hypothetical main size\n // ---------------------------------------------------------------------------\n\n for (const item of visibleItems) {\n const childHInset = horizontalInset(item.padding, item.border);\n const childVInset = verticalInset(item.padding, item.border);\n const mainInset = horizontal ? childHInset : childVInset;\n\n let baseSize: number;\n\n if (item.style.flexBasis !== 'auto') {\n // Definite flex-basis\n baseSize = item.style.flexBasis;\n if (item.style.boxSizing === 'border-box') {\n baseSize = Math.max(0, baseSize - mainInset);\n }\n } else {\n // flex-basis: auto → use main size property (width or height)\n const mainSizeValue = horizontal ? item.style.width : item.style.height;\n const resolved = resolveSize(mainSizeValue, availableMainForItems);\n\n if (resolved !== null) {\n baseSize = resolved;\n if (item.style.boxSizing === 'border-box') {\n baseSize = Math.max(0, baseSize - mainInset);\n }\n } else if (item.style.aspectRatio !== undefined) {\n // Aspect ratio: derive main size from cross size if available\n const crossSizeValue = horizontal ? item.style.height : item.style.width;\n const crossInset = horizontal ? childVInset : childHInset;\n const resolvedCross = resolveSize(crossSizeValue, availableCrossForItems);\n if (resolvedCross !== null) {\n let cs = resolvedCross;\n if (item.style.boxSizing === 'border-box') {\n cs = Math.max(0, cs - crossInset);\n }\n baseSize = horizontal\n ? cs * item.style.aspectRatio\n : cs / item.style.aspectRatio;\n } else {\n baseSize = 0;\n }\n } else if (item.measure) {\n // Content-based sizing via measure callback.\n // Pass both axes so text nodes can wrap correctly in column containers\n // (text height depends on available width, even when width is the cross axis).\n const measured = item.measure(\n horizontal ? availableMainForItems : availableCrossForItems,\n horizontal ? availableCrossForItems : availableMainForItems,\n );\n baseSize = horizontal ? measured.width : measured.height;\n } else if (item.children.length > 0 && item.style.display === 'flex') {\n // Nested flex container: compute its layout to get intrinsic size.\n // Give unlimited space on the main axis and available cross space.\n const childLayout = layoutNode(\n item.node,\n horizontal ? Infinity : availableCrossForItems + childHInset,\n horizontal ? availableCrossForItems + childVInset : Infinity,\n );\n baseSize = horizontal\n ? Math.max(0, childLayout.width - childHInset)\n : Math.max(0, childLayout.height - childVInset);\n } else {\n baseSize = 0;\n }\n }\n\n item.flexBaseSize = baseSize;\n\n // Hypothetical main size = flex base size clamped by min/max, floored at 0\n item.hypotheticalMainSize = Math.max(\n 0,\n clamp(baseSize, item.minMainSize, item.maxMainSize),\n );\n }\n\n // ---------------------------------------------------------------------------\n // 9.3 — Collect flex items into flex lines\n // ---------------------------------------------------------------------------\n\n const lines: FlexLine[] = [];\n const mainGap = horizontal ? style.columnGap : style.rowGap;\n const crossGap = horizontal ? style.rowGap : style.columnGap;\n\n if (style.flexWrap === 'nowrap' || visibleItems.length === 0) {\n lines.push({ items: visibleItems, crossSize: 0, crossOffset: 0 });\n } else {\n let currentLine: FlexItem[] = [];\n let lineMainSize = 0;\n\n for (const item of visibleItems) {\n const outerHypo = item.hypotheticalMainSize + outerMainAll(item, horizontal);\n const gapSize = currentLine.length > 0 ? mainGap : 0;\n\n if (currentLine.length > 0 && lineMainSize + gapSize + outerHypo > availableMainForItems) {\n lines.push({ items: currentLine, crossSize: 0, crossOffset: 0 });\n currentLine = [item];\n lineMainSize = outerHypo;\n } else {\n currentLine.push(item);\n lineMainSize += gapSize + outerHypo;\n }\n }\n\n if (currentLine.length > 0) {\n lines.push({ items: currentLine, crossSize: 0, crossOffset: 0 });\n }\n }\n\n // Reverse lines for wrap-reverse\n if (style.flexWrap === 'wrap-reverse') {\n lines.reverse();\n }\n\n // ---------------------------------------------------------------------------\n // 9.3 continued + 9.7 — Resolve flexible lengths for each line\n // ---------------------------------------------------------------------------\n\n for (const line of lines) {\n resolveFlexibleLengths(line.items, availableMainForItems, mainGap, horizontal);\n }\n\n // ---------------------------------------------------------------------------\n // 9.4 — Cross size determination\n // ---------------------------------------------------------------------------\n\n for (const line of lines) {\n for (const item of line.items) {\n const childHInset = horizontalInset(item.padding, item.border);\n const childVInset = verticalInset(item.padding, item.border);\n const crossInset = horizontal ? childVInset : childHInset;\n\n // Determine hypothetical cross size\n const crossSizeValue = horizontal ? item.style.height : item.style.width;\n const resolvedCross = resolveSize(crossSizeValue, availableCrossForItems);\n\n if (resolvedCross !== null) {\n let cs = resolvedCross;\n if (item.style.boxSizing === 'border-box') {\n cs = Math.max(0, cs - crossInset);\n }\n item.hypotheticalCrossSize = cs;\n } else if (item.style.aspectRatio !== undefined) {\n // Derive cross size from the resolved main size via aspect ratio\n item.hypotheticalCrossSize = horizontal\n ? item.usedMainSize / item.style.aspectRatio\n : item.usedMainSize * item.style.aspectRatio;\n } else if (item.measure) {\n const measured = item.measure(\n horizontal ? item.usedMainSize : availableCrossForItems,\n horizontal ? availableCrossForItems : item.usedMainSize,\n );\n item.hypotheticalCrossSize = horizontal ? measured.height : measured.width;\n } else if (item.children.length > 0 && item.style.display === 'flex') {\n const childLayout = layoutNode(\n item.node,\n horizontal ? item.usedMainSize + childHInset : availableCrossForItems + childHInset,\n horizontal ? availableCrossForItems + childVInset : item.usedMainSize + childVInset,\n );\n item.hypotheticalCrossSize = horizontal\n ? Math.max(0, childLayout.height - childVInset)\n : Math.max(0, childLayout.width - childHInset);\n } else {\n item.hypotheticalCrossSize = 0;\n }\n\n item.hypotheticalCrossSize = Math.max(\n 0,\n clamp(item.hypotheticalCrossSize, item.minCrossSize, item.maxCrossSize),\n );\n }\n }\n\n // Calculate cross size of each flex line\n const isSingleLine = style.flexWrap === 'nowrap';\n\n if (isSingleLine && crossSize !== null) {\n // Single-line with definite cross size\n lines[0]!.crossSize = crossSize;\n } else {\n for (const line of lines) {\n let maxCross = 0;\n for (const item of line.items) {\n const outerCross = item.hypotheticalCrossSize + outerCrossAll(item, horizontal);\n if (outerCross > maxCross) maxCross = outerCross;\n }\n line.crossSize = maxCross;\n }\n\n // For single-line, clamp by container min/max cross size\n if (isSingleLine && lines[0]) {\n const minCross = horizontal\n ? Math.max(0, containerMinH - vInset)\n : Math.max(0, containerMinW - hInset);\n const maxCross = horizontal\n ? Math.max(0, containerMaxH - vInset)\n : Math.max(0, containerMaxW - hInset);\n lines[0].crossSize = clamp(lines[0].crossSize, minCross, maxCross);\n }\n }\n\n // Determine used cross size of each item\n for (const line of lines) {\n for (const item of line.items) {\n const effectiveAlign = resolveAlignSelf(item.style.alignSelf, style.alignItems);\n\n if (\n effectiveAlign === 'stretch' &&\n item.style.aspectRatio === undefined &&\n (horizontal ? item.style.height : item.style.width) === 'auto' &&\n item.marginTop !== null &&\n item.marginBottom !== null &&\n (horizontal ? item.marginTop : item.marginLeft) !== null &&\n (horizontal ? item.marginBottom : item.marginRight) !== null\n ) {\n const crossMargin = outerCrossMargin(item, horizontal);\n const crossInset = horizontal\n ? verticalInset(item.padding, item.border)\n : horizontalInset(item.padding, item.border);\n item.usedCrossSize = clamp(\n line.crossSize - crossMargin - crossInset,\n item.minCrossSize,\n item.maxCrossSize,\n );\n } else {\n item.usedCrossSize = item.hypotheticalCrossSize;\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // 9.5 — Main-axis alignment\n // ---------------------------------------------------------------------------\n\n for (const line of lines) {\n alignMainAxis(line.items, availableMainForItems, style.justifyContent, mainGap, horizontal);\n }\n\n // ---------------------------------------------------------------------------\n // 9.6 — Cross-axis alignment\n // ---------------------------------------------------------------------------\n\n // Per-item cross-axis alignment within each line\n for (const line of lines) {\n for (const item of line.items) {\n const effectiveAlign = resolveAlignSelf(item.style.alignSelf, style.alignItems);\n const outerCross = item.usedCrossSize + outerCrossAll(item, horizontal);\n const freeSpace = line.crossSize - outerCross;\n\n // Handle auto cross-axis margins\n const crossStartMarginAuto = horizontal\n ? item.marginTop === null\n : item.marginLeft === null;\n const crossEndMarginAuto = horizontal\n ? item.marginBottom === null\n : item.marginRight === null;\n\n if (crossStartMarginAuto || crossEndMarginAuto) {\n if (crossStartMarginAuto && crossEndMarginAuto) {\n const half = Math.max(0, freeSpace) / 2;\n if (horizontal) {\n item.marginTop = half;\n item.marginBottom = half;\n } else {\n item.marginLeft = half;\n item.marginRight = half;\n }\n } else if (crossStartMarginAuto) {\n if (horizontal) item.marginTop = Math.max(0, freeSpace);\n else item.marginLeft = Math.max(0, freeSpace);\n } else {\n if (horizontal) item.marginBottom = Math.max(0, freeSpace);\n else item.marginRight = Math.max(0, freeSpace);\n }\n // After resolving auto margins, position at cross-start\n item.crossPos = crossStartMarginValue(item, horizontal);\n } else {\n const crossStartM = crossStartMarginValue(item, horizontal);\n switch (effectiveAlign) {\n case 'flex-start':\n item.crossPos = crossStartM;\n break;\n case 'flex-end': {\n const ci = horizontal\n ? verticalInset(item.padding, item.border)\n : horizontalInset(item.padding, item.border);\n item.crossPos = line.crossSize - item.usedCrossSize - ci - crossEndMarginValue(item, horizontal);\n break;\n }\n case 'center': {\n item.crossPos = crossStartM + freeSpace / 2;\n break;\n }\n case 'stretch':\n item.crossPos = crossStartM;\n break;\n }\n }\n }\n }\n\n // Determine container cross size and line offsets\n let totalCrossSize: number;\n if (crossSize !== null) {\n totalCrossSize = crossSize;\n } else {\n totalCrossSize = 0;\n for (let i = 0; i < lines.length; i++) {\n totalCrossSize += lines[i]!.crossSize;\n if (i < lines.length - 1) totalCrossSize += crossGap;\n }\n\n // Clamp by container min/max\n const minCross = horizontal\n ? Math.max(0, containerMinH - vInset)\n : Math.max(0, containerMinW - hInset);\n const maxCross = horizontal\n ? Math.max(0, containerMaxH - vInset)\n : Math.max(0, containerMaxW - hInset);\n totalCrossSize = clamp(totalCrossSize, minCross, maxCross);\n }\n\n // align-content: distribute lines along the cross axis\n alignCrossLines(lines, totalCrossSize, style.alignContent, crossGap);\n\n // ---------------------------------------------------------------------------\n // Compute final container size\n // ---------------------------------------------------------------------------\n\n let usedMainSize: number;\n if (mainSize !== null) {\n usedMainSize = mainSize;\n } else {\n // Auto main size: sum of items on the longest line\n usedMainSize = 0;\n for (const line of lines) {\n let lineSize = 0;\n for (let i = 0; i < line.items.length; i++) {\n const it = line.items[i]!;\n lineSize += it.usedMainSize + outerMainAll(it, horizontal);\n if (i < line.items.length - 1) lineSize += mainGap;\n }\n if (lineSize > usedMainSize) usedMainSize = lineSize;\n }\n }\n\n const contentWidth = horizontal ? usedMainSize : totalCrossSize;\n const contentHeight = horizontal ? totalCrossSize : usedMainSize;\n\n let finalWidth: number;\n let finalHeight: number;\n\n if (containerWidth !== null) {\n finalWidth = containerWidth + hInset;\n } else {\n finalWidth = clamp(contentWidth + hInset, containerMinW, containerMaxW);\n }\n\n if (containerHeight !== null) {\n finalHeight = containerHeight + vInset;\n } else {\n finalHeight = clamp(contentHeight + vInset, containerMinH, containerMaxH);\n }\n\n // ---------------------------------------------------------------------------\n // Convert positions to absolute coordinates and recurse\n // ---------------------------------------------------------------------------\n\n // We collect results indexed by original child position so the output\n // matches DOM order (abspos children interleaved with flow children).\n const childLayoutMap = new Map<number, LayoutResult>();\n\n // Build a map from FlexItem -> original child index\n const itemToOriginalIndex = new Map<FlexItem, number>();\n for (let i = 0; i < items.length; i++) {\n itemToOriginalIndex.set(items[i]!, flowChildren[i]!.index);\n }\n\n // --- Flow children ---\n for (const line of lines) {\n for (const item of line.items) {\n const mainOffset = horizontal ? padding.left + border.left : padding.top + border.top;\n const crossOffset = horizontal ? padding.top + border.top : padding.left + border.left;\n\n let itemX = horizontal\n ? mainOffset + item.mainPos\n : crossOffset + line.crossOffset + item.crossPos;\n let itemY = horizontal\n ? crossOffset + line.crossOffset + item.crossPos\n : mainOffset + item.mainPos;\n\n const itemW = horizontal ? item.usedMainSize : item.usedCrossSize;\n const itemH = horizontal ? item.usedCrossSize : item.usedMainSize;\n\n const itemOuterW = itemW + horizontalInset(item.padding, item.border);\n const itemOuterH = itemH + verticalInset(item.padding, item.border);\n\n // Apply relative positioning offsets\n if (item.style.position === 'relative') {\n const insetTop = resolveInset(item.style.top, finalHeight);\n const insetLeft = resolveInset(item.style.left, finalWidth);\n const insetBottom = resolveInset(item.style.bottom, finalHeight);\n const insetRight = resolveInset(item.style.right, finalWidth);\n\n if (insetLeft !== null) {\n itemX += insetLeft;\n } else if (insetRight !== null) {\n itemX -= insetRight;\n }\n\n if (insetTop !== null) {\n itemY += insetTop;\n } else if (insetBottom !== null) {\n itemY -= insetBottom;\n }\n }\n\n let itemChildLayouts: LayoutResult[] = [];\n if (item.children.length > 0 && item.style.display === 'flex') {\n const innerLayout = layoutNode(item.node, itemOuterW, itemOuterH, itemOuterW, itemOuterH);\n itemChildLayouts = innerLayout.children;\n }\n\n const originalIndex = itemToOriginalIndex.get(item)!;\n childLayoutMap.set(originalIndex, {\n x: itemX,\n y: itemY,\n width: itemOuterW,\n height: itemOuterH,\n children: itemChildLayouts,\n });\n }\n }\n\n // --- Absolute-positioned children ---\n // Containing block = the container's padding box (finalWidth x finalHeight minus border)\n const cbWidth = finalWidth - border.left - border.right;\n const cbHeight = finalHeight - border.top - border.bottom;\n\n for (const { index, child, style: absStyle } of absoluteChildren) {\n if (absStyle.display === 'none') {\n childLayoutMap.set(index, { x: 0, y: 0, width: 0, height: 0, children: [] });\n continue;\n }\n\n const absPadding = resolvePadding(absStyle);\n const absBorder = resolveBorder(absStyle);\n const absHInset = horizontalInset(absPadding, absBorder);\n const absVInset = verticalInset(absPadding, absBorder);\n\n // Resolve insets against the containing block\n const insetTop = resolveInset(absStyle.top, cbHeight);\n const insetRight = resolveInset(absStyle.right, cbWidth);\n const insetBottom = resolveInset(absStyle.bottom, cbHeight);\n const insetLeft = resolveInset(absStyle.left, cbWidth);\n\n // Resolve explicit size\n let absW = resolveSize(absStyle.width, cbWidth);\n let absH = resolveSize(absStyle.height, cbHeight);\n\n if (absStyle.boxSizing === 'border-box') {\n if (absW !== null) absW = Math.max(0, absW - absHInset);\n if (absH !== null) absH = Math.max(0, absH - absVInset);\n }\n\n // If width is auto but both left and right are set, derive width from insets\n if (absW === null && insetLeft !== null && insetRight !== null) {\n absW = Math.max(0, cbWidth - insetLeft - insetRight - absHInset);\n }\n if (absH === null && insetTop !== null && insetBottom !== null) {\n absH = Math.max(0, cbHeight - insetTop - insetBottom - absVInset);\n }\n\n // Apply aspect ratio if one dimension is known and the other is auto\n if (absStyle.aspectRatio !== undefined) {\n if (absW !== null && absH === null) {\n absH = absW / absStyle.aspectRatio;\n } else if (absH !== null && absW === null) {\n absW = absH * absStyle.aspectRatio;\n }\n }\n\n // If still auto, use intrinsic sizing\n if (absW === null || absH === null) {\n if (child.measure) {\n const measured = child.measure(absW ?? cbWidth, absH ?? cbHeight);\n if (absW === null) absW = measured.width;\n if (absH === null) absH = measured.height;\n } else if ((child.children ?? []).length > 0 && absStyle.display === 'flex') {\n const intrinsic = layoutNode(\n child,\n absW !== null ? absW + absHInset : cbWidth,\n absH !== null ? absH + absVInset : cbHeight,\n );\n if (absW === null) absW = Math.max(0, intrinsic.width - absHInset);\n if (absH === null) absH = Math.max(0, intrinsic.height - absVInset);\n } else {\n if (absW === null) absW = 0;\n if (absH === null) absH = 0;\n }\n }\n\n // Clamp by min/max\n const absMinW = resolveDimension(absStyle.minWidth, cbWidth);\n const absMaxW = resolveDimension(absStyle.maxWidth, cbWidth);\n const absMinH = resolveDimension(absStyle.minHeight, cbHeight);\n const absMaxH = resolveDimension(absStyle.maxHeight, cbHeight);\n absW = clamp(absW, absMinW, absMaxW);\n absH = clamp(absH, absMinH, absMaxH);\n\n const absOuterW = absW + absHInset;\n const absOuterH = absH + absVInset;\n\n // Position relative to the padding box (offset by border)\n let absX: number;\n if (insetLeft !== null) {\n absX = border.left + insetLeft;\n } else if (insetRight !== null) {\n absX = border.left + cbWidth - insetRight - absOuterW;\n } else {\n absX = border.left;\n }\n\n let absY: number;\n if (insetTop !== null) {\n absY = border.top + insetTop;\n } else if (insetBottom !== null) {\n absY = border.top + cbHeight - insetBottom - absOuterH;\n } else {\n absY = border.top;\n }\n\n // Recursively layout children\n let absChildLayouts: LayoutResult[] = [];\n if ((child.children ?? []).length > 0 && absStyle.display === 'flex') {\n const innerLayout = layoutNode(child, absOuterW, absOuterH);\n absChildLayouts = innerLayout.children;\n }\n\n childLayoutMap.set(index, {\n x: absX,\n y: absY,\n width: absOuterW,\n height: absOuterH,\n children: absChildLayouts,\n });\n }\n\n // Hidden flow children get zero-size layouts\n for (const hiddenIdx of hiddenFlowIndices) {\n childLayoutMap.set(hiddenIdx, { x: 0, y: 0, width: 0, height: 0, children: [] });\n }\n\n // Reassemble in original child order\n const childLayouts: LayoutResult[] = [];\n for (let i = 0; i < children.length; i++) {\n const layout = childLayoutMap.get(i);\n if (layout) childLayouts.push(layout);\n }\n\n const result: LayoutResult = {\n x: 0,\n y: 0,\n width: finalWidth,\n height: finalHeight,\n children: childLayouts,\n };\n\n if (layoutCache) {\n let nodeCache = layoutCache.get(node);\n if (!nodeCache) {\n nodeCache = new Map();\n layoutCache.set(node, nodeCache);\n }\n nodeCache.set(`${availableWidth},${availableHeight},${definiteWidth ?? ''},${definiteHeight ?? ''}`, result);\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// 9.7 — Resolving Flexible Lengths\n// ---------------------------------------------------------------------------\n\nfunction resolveFlexibleLengths(\n items: FlexItem[],\n availableMain: number,\n gap: number,\n horizontal: boolean,\n): void {\n if (items.length === 0) return;\n\n // When available space is infinite (intrinsic measurement), flex-grow/shrink\n // cannot meaningfully distribute space. Use hypothetical sizes directly.\n if (!isFinite(availableMain)) {\n for (const item of items) {\n item.usedMainSize = Math.max(0, item.hypotheticalMainSize);\n }\n return;\n }\n\n // Total gap space\n const totalGap = gap * (items.length - 1);\n\n // Initialize target main size to flex base size; mark all as unfrozen\n for (const item of items) {\n item.targetMainSize = item.flexBaseSize;\n item.frozen = false;\n }\n\n // Determine used space from outer hypothetical main sizes\n let usedByHypothetical = totalGap;\n for (const item of items) {\n usedByHypothetical += item.hypotheticalMainSize + outerMainAll(item, horizontal);\n }\n\n const growing = usedByHypothetical < availableMain;\n\n // Freeze inflexible items\n for (const item of items) {\n const factor = growing ? item.style.flexGrow : item.style.flexShrink;\n if (factor === 0) {\n item.targetMainSize = item.hypotheticalMainSize;\n item.frozen = true;\n } else if (growing && item.flexBaseSize > item.hypotheticalMainSize) {\n item.targetMainSize = item.hypotheticalMainSize;\n item.frozen = true;\n } else if (!growing && item.flexBaseSize < item.hypotheticalMainSize) {\n item.targetMainSize = item.hypotheticalMainSize;\n item.frozen = true;\n }\n }\n\n // Calculate initial free space\n let initialFreeSpace = availableMain - totalGap;\n for (const item of items) {\n if (item.frozen) {\n initialFreeSpace -= item.targetMainSize + outerMainAll(item, horizontal);\n } else {\n initialFreeSpace -= item.flexBaseSize + outerMainAll(item, horizontal);\n }\n }\n\n // Flex resolution loop\n for (let iteration = 0; iteration < 100; iteration++) {\n // Check if all items are frozen\n const unfrozen = items.filter((i) => !i.frozen);\n if (unfrozen.length === 0) break;\n\n // Calculate remaining free space\n let remainingFreeSpace = availableMain - totalGap;\n for (const item of items) {\n if (item.frozen) {\n remainingFreeSpace -= item.targetMainSize + outerMainAll(item, horizontal);\n } else {\n remainingFreeSpace -= item.flexBaseSize + outerMainAll(item, horizontal);\n }\n }\n\n // If sum of flex factors < 1, scale the free space\n let sumFlexFactors = 0;\n for (const item of unfrozen) {\n sumFlexFactors += growing ? item.style.flexGrow : item.style.flexShrink;\n }\n\n if (sumFlexFactors < 1 && sumFlexFactors > 0) {\n const scaled = initialFreeSpace * sumFlexFactors;\n if (Math.abs(scaled) < Math.abs(remainingFreeSpace)) {\n remainingFreeSpace = scaled;\n }\n }\n\n // Distribute free space\n if (remainingFreeSpace !== 0) {\n if (growing) {\n let totalGrowth = 0;\n for (const item of unfrozen) totalGrowth += item.style.flexGrow;\n\n if (totalGrowth > 0) {\n for (const item of unfrozen) {\n const ratio = item.style.flexGrow / totalGrowth;\n item.targetMainSize = item.flexBaseSize + remainingFreeSpace * ratio;\n }\n }\n } else {\n // Shrink: weighted by flex-shrink * base size\n let totalScaledShrink = 0;\n for (const item of unfrozen) {\n totalScaledShrink += item.style.flexShrink * item.flexBaseSize;\n }\n\n if (totalScaledShrink > 0) {\n for (const item of unfrozen) {\n const scaledFactor = item.style.flexShrink * item.flexBaseSize;\n const ratio = scaledFactor / totalScaledShrink;\n item.targetMainSize =\n item.flexBaseSize - Math.abs(remainingFreeSpace) * ratio;\n }\n }\n }\n }\n\n // Fix min/max violations and freeze\n let totalViolation = 0;\n const violations: Array<{ item: FlexItem; type: 'min' | 'max' | 'none' }> = [];\n\n for (const item of unfrozen) {\n const clamped = Math.max(0, clamp(item.targetMainSize, item.minMainSize, item.maxMainSize));\n const violation = clamped - item.targetMainSize;\n totalViolation += violation;\n\n if (violation > 0) {\n violations.push({ item, type: 'min' });\n } else if (violation < 0) {\n violations.push({ item, type: 'max' });\n } else {\n violations.push({ item, type: 'none' });\n }\n\n item.targetMainSize = clamped;\n }\n\n if (totalViolation === 0) {\n // Freeze all\n for (const item of unfrozen) item.frozen = true;\n } else if (totalViolation > 0) {\n // Freeze min violations\n for (const { item, type } of violations) {\n if (type === 'min') item.frozen = true;\n }\n } else {\n // Freeze max violations\n for (const { item, type } of violations) {\n if (type === 'max') item.frozen = true;\n }\n }\n }\n\n // Set used main size\n for (const item of items) {\n item.usedMainSize = Math.max(0, item.targetMainSize);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Main-axis alignment (justify-content)\n// ---------------------------------------------------------------------------\n\nfunction alignMainAxis(\n items: FlexItem[],\n availableMain: number,\n justifyContent: ResolvedStyle['justifyContent'],\n gap: number,\n horizontal: boolean,\n): void {\n if (items.length === 0) return;\n\n const totalGap = gap * (items.length - 1);\n\n // Check for auto margins on the main axis\n let autoMarginCount = 0;\n for (const item of items) {\n if (horizontal) {\n if (item.marginLeft === null) autoMarginCount++;\n if (item.marginRight === null) autoMarginCount++;\n } else {\n if (item.marginTop === null) autoMarginCount++;\n if (item.marginBottom === null) autoMarginCount++;\n }\n }\n\n let usedSpace = totalGap;\n for (const item of items) {\n usedSpace += item.usedMainSize + outerMainAll(item, horizontal);\n }\n\n const freeSpace = availableMain - usedSpace;\n\n // If there are auto margins, distribute free space to them\n if (autoMarginCount > 0 && freeSpace > 0) {\n const perAutoMargin = freeSpace / autoMarginCount;\n for (const item of items) {\n if (horizontal) {\n if (item.marginLeft === null) item.marginLeft = perAutoMargin;\n if (item.marginRight === null) item.marginRight = perAutoMargin;\n } else {\n if (item.marginTop === null) item.marginTop = perAutoMargin;\n if (item.marginBottom === null) item.marginBottom = perAutoMargin;\n }\n }\n // Recalculate: now just position sequentially\n let pos = 0;\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const mainInset = horizontal\n ? horizontalInset(item.padding, item.border)\n : verticalInset(item.padding, item.border);\n pos += mainStartMarginValue(item, horizontal);\n item.mainPos = pos;\n pos += item.usedMainSize + mainInset + mainEndMarginValue(item, horizontal);\n if (i < items.length - 1) pos += gap;\n }\n return;\n }\n\n // Set any remaining null margins to 0\n for (const item of items) {\n if (horizontal) {\n if (item.marginLeft === null) item.marginLeft = 0;\n if (item.marginRight === null) item.marginRight = 0;\n } else {\n if (item.marginTop === null) item.marginTop = 0;\n if (item.marginBottom === null) item.marginBottom = 0;\n }\n }\n\n // Recalculate used space with resolved margins\n usedSpace = totalGap;\n for (const item of items) {\n usedSpace += item.usedMainSize + outerMainAll(item, horizontal);\n }\n const actualFreeSpace = Math.max(0, availableMain - usedSpace);\n\n let startOffset = 0;\n let betweenSpace = gap;\n\n switch (justifyContent) {\n case 'flex-start':\n startOffset = 0;\n betweenSpace = gap;\n break;\n case 'flex-end':\n startOffset = actualFreeSpace;\n betweenSpace = gap;\n break;\n case 'center':\n startOffset = actualFreeSpace / 2;\n betweenSpace = gap;\n break;\n case 'space-between':\n startOffset = 0;\n betweenSpace = items.length > 1\n ? gap + actualFreeSpace / (items.length - 1)\n : gap;\n break;\n case 'space-around': {\n const perItem = actualFreeSpace / items.length;\n startOffset = perItem / 2;\n betweenSpace = gap + perItem;\n break;\n }\n case 'space-evenly': {\n const perSlot = actualFreeSpace / (items.length + 1);\n startOffset = perSlot;\n betweenSpace = gap + perSlot;\n break;\n }\n }\n\n let pos = startOffset;\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const mainInset = horizontal\n ? horizontalInset(item.padding, item.border)\n : verticalInset(item.padding, item.border);\n pos += mainStartMarginValue(item, horizontal);\n item.mainPos = pos;\n pos += item.usedMainSize + mainInset + mainEndMarginValue(item, horizontal);\n if (i < items.length - 1) pos += betweenSpace;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Cross-axis line alignment (align-content)\n// ---------------------------------------------------------------------------\n\nfunction alignCrossLines(\n lines: FlexLine[],\n totalCrossSize: number,\n alignContent: ResolvedStyle['alignContent'],\n crossGap: number,\n): void {\n if (lines.length === 0) return;\n\n const totalLinesCross =\n lines.reduce((sum, l) => sum + l.crossSize, 0) +\n crossGap * (lines.length - 1);\n const freeSpace = Math.max(0, totalCrossSize - totalLinesCross);\n\n let offset = 0;\n let betweenSpace = crossGap;\n\n switch (alignContent) {\n case 'flex-start':\n offset = 0;\n betweenSpace = crossGap;\n break;\n case 'flex-end':\n offset = freeSpace;\n betweenSpace = crossGap;\n break;\n case 'center':\n offset = freeSpace / 2;\n betweenSpace = crossGap;\n break;\n case 'stretch':\n offset = 0;\n betweenSpace = crossGap;\n if (lines.length > 0) {\n const extra = freeSpace / lines.length;\n for (const line of lines) {\n line.crossSize += extra;\n }\n }\n break;\n case 'space-between':\n offset = 0;\n betweenSpace = lines.length > 1\n ? crossGap + freeSpace / (lines.length - 1)\n : crossGap;\n break;\n case 'space-around': {\n const perLine = freeSpace / lines.length;\n offset = perLine / 2;\n betweenSpace = crossGap + perLine;\n break;\n }\n }\n\n let pos = offset;\n for (const line of lines) {\n line.crossOffset = pos;\n pos += line.crossSize + betweenSpace;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveAlignSelf(\n alignSelf: ResolvedStyle['alignSelf'],\n parentAlignItems: AlignItems,\n): AlignItems {\n return alignSelf === 'auto' ? parentAlignItems : alignSelf;\n}\n\nfunction outerMainMargin(item: FlexItem, horizontal: boolean): number {\n if (horizontal) {\n return (item.marginLeft ?? 0) + (item.marginRight ?? 0);\n }\n return (item.marginTop ?? 0) + (item.marginBottom ?? 0);\n}\n\n/**\n * Total main-axis \"outer\" addition: margin + padding + border.\n * The CSS flex spec requires the outer flex base size (and outer hypothetical\n * main size) to include all three when computing available/free space.\n */\nfunction outerMainAll(item: FlexItem, horizontal: boolean): number {\n const margin = outerMainMargin(item, horizontal);\n const inset = horizontal\n ? horizontalInset(item.padding, item.border)\n : verticalInset(item.padding, item.border);\n return margin + inset;\n}\n\nfunction outerCrossMargin(item: FlexItem, horizontal: boolean): number {\n if (horizontal) {\n return (item.marginTop ?? 0) + (item.marginBottom ?? 0);\n }\n return (item.marginLeft ?? 0) + (item.marginRight ?? 0);\n}\n\nfunction outerCrossAll(item: FlexItem, horizontal: boolean): number {\n const margin = outerCrossMargin(item, horizontal);\n const inset = horizontal\n ? verticalInset(item.padding, item.border)\n : horizontalInset(item.padding, item.border);\n return margin + inset;\n}\n\nfunction mainStartMarginValue(item: FlexItem, horizontal: boolean): number {\n return (horizontal ? item.marginLeft : item.marginTop) ?? 0;\n}\n\nfunction mainEndMarginValue(item: FlexItem, horizontal: boolean): number {\n return (horizontal ? item.marginRight : item.marginBottom) ?? 0;\n}\n\nfunction crossStartMarginValue(item: FlexItem, horizontal: boolean): number {\n return (horizontal ? item.marginTop : item.marginLeft) ?? 0;\n}\n\nfunction crossEndMarginValue(item: FlexItem, horizontal: boolean): number {\n return (horizontal ? item.marginBottom : item.marginRight) ?? 0;\n}\n","import type { FlexNode, FlexStyle } from './types.js';\n\n/**\n * Create a layout node with style applied directly — no `{ style: { ... } }` wrapping.\n *\n * h({ width: 100, height: 50 })\n * h({ flexGrow: 1 }, child1, child2)\n */\nexport function h(style: FlexStyle, ...children: FlexNode[]): FlexNode {\n return children.length > 0 ? { style, children } : { style };\n}\n\n/**\n * Create a row (flex-direction: row) node.\n *\n * row({ gap: 12, padding: 8 }, child1, child2)\n */\nexport function row(style: FlexStyle, ...children: FlexNode[]): FlexNode {\n return h({ flexDirection: 'row', ...style }, ...children);\n}\n\n/**\n * Create a column (flex-direction: column) node.\n *\n * col({ width: 375, height: 667 }, header, content, footer)\n */\nexport function col(style: FlexStyle, ...children: FlexNode[]): FlexNode {\n return h({ flexDirection: 'column', ...style }, ...children);\n}\n\n/**\n * Create a grid container node.\n *\n * grid({ gridTemplateColumns: ['1fr', '1fr'], gap: 8 }, ...items)\n */\nexport function grid(style: FlexStyle, ...children: FlexNode[]): FlexNode {\n return h({ display: 'grid', ...style }, ...children);\n}\n"]}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Size value: a pixel number, a percentage string like "50%", or "auto".
3
+ */
4
+ type SizeValue = number | `${number}%` | 'auto';
5
+ /**
6
+ * Size value that excludes "auto" (for min/max constraints).
7
+ */
8
+ type DimensionValue = number | `${number}%`;
9
+ /**
10
+ * Margin value: pixels, percentage, or "auto" for auto margins.
11
+ */
12
+ type MarginValue = number | `${number}%` | 'auto';
13
+ type FlexDirection = 'row' | 'column' | 'row-reverse' | 'column-reverse';
14
+ type FlexWrap = 'nowrap' | 'wrap' | 'wrap-reverse';
15
+ type JustifyContent = 'flex-start' | 'flex-end' | 'center' | 'space-between' | 'space-around' | 'space-evenly';
16
+ type AlignItems = 'flex-start' | 'flex-end' | 'center' | 'stretch';
17
+ type AlignSelf = 'auto' | AlignItems;
18
+ type AlignContent = 'flex-start' | 'flex-end' | 'center' | 'stretch' | 'space-between' | 'space-around';
19
+ type Display = 'flex' | 'grid' | 'none';
20
+ type Position = 'static' | 'relative' | 'absolute';
21
+ type BoxSizing = 'content-box' | 'border-box';
22
+ /**
23
+ * Inset value for top/right/bottom/left: pixels, percentage, or "auto".
24
+ */
25
+ type InsetValue = number | `${number}%` | 'auto';
26
+ /**
27
+ * A single track size definition.
28
+ * - number: fixed pixels
29
+ * - `${number}%`: percentage of the container's content size
30
+ * - `${number}fr`: flexible fraction of remaining space
31
+ * - 'auto': sized to content (min-content to max-content)
32
+ */
33
+ type TrackSize = number | `${number}%` | `${number}fr` | 'auto';
34
+ type GridAutoFlow = 'row' | 'column';
35
+ /**
36
+ * Grid item placement value: a 1-based line number or 'auto'.
37
+ */
38
+ type GridLine = number | 'auto';
39
+ type JustifyItems = 'start' | 'end' | 'center' | 'stretch';
40
+ type JustifySelf = 'auto' | JustifyItems;
41
+ /**
42
+ * Style properties for a layout node (flex or grid container, or child item).
43
+ * All properties are optional and default to CSS spec initial values.
44
+ */
45
+ interface FlexStyle {
46
+ display?: Display;
47
+ position?: Position;
48
+ flexDirection?: FlexDirection;
49
+ flexWrap?: FlexWrap;
50
+ justifyContent?: JustifyContent;
51
+ alignItems?: AlignItems;
52
+ alignSelf?: AlignSelf;
53
+ alignContent?: AlignContent;
54
+ justifyItems?: JustifyItems;
55
+ justifySelf?: JustifySelf;
56
+ gridTemplateColumns?: TrackSize[];
57
+ gridTemplateRows?: TrackSize[];
58
+ gridAutoColumns?: TrackSize;
59
+ gridAutoRows?: TrackSize;
60
+ gridAutoFlow?: GridAutoFlow;
61
+ gridColumnStart?: GridLine;
62
+ gridColumnEnd?: GridLine;
63
+ gridRowStart?: GridLine;
64
+ gridRowEnd?: GridLine;
65
+ flexGrow?: number;
66
+ flexShrink?: number;
67
+ flexBasis?: number | 'auto';
68
+ width?: SizeValue;
69
+ height?: SizeValue;
70
+ minWidth?: DimensionValue;
71
+ minHeight?: DimensionValue;
72
+ maxWidth?: DimensionValue;
73
+ maxHeight?: DimensionValue;
74
+ top?: InsetValue;
75
+ right?: InsetValue;
76
+ bottom?: InsetValue;
77
+ left?: InsetValue;
78
+ zIndex?: number;
79
+ aspectRatio?: number;
80
+ padding?: number;
81
+ paddingTop?: number;
82
+ paddingRight?: number;
83
+ paddingBottom?: number;
84
+ paddingLeft?: number;
85
+ margin?: MarginValue;
86
+ marginTop?: MarginValue;
87
+ marginRight?: MarginValue;
88
+ marginBottom?: MarginValue;
89
+ marginLeft?: MarginValue;
90
+ border?: number;
91
+ borderTop?: number;
92
+ borderRight?: number;
93
+ borderBottom?: number;
94
+ borderLeft?: number;
95
+ gap?: number;
96
+ rowGap?: number;
97
+ columnGap?: number;
98
+ boxSizing?: BoxSizing;
99
+ }
100
+ /**
101
+ * Callback to measure leaf node content (e.g. text, images).
102
+ * Called by the layout engine when it needs to know the intrinsic
103
+ * size of a node that has no children.
104
+ *
105
+ * @param availableWidth - The width available for the content (may be Infinity)
106
+ * @param availableHeight - The height available for the content (may be Infinity)
107
+ * @returns The measured size of the content
108
+ */
109
+ type MeasureFunction = (availableWidth: number, availableHeight: number) => {
110
+ width: number;
111
+ height: number;
112
+ };
113
+ /**
114
+ * A node in the layout tree. This is the input to computeLayout().
115
+ */
116
+ interface FlexNode {
117
+ style?: FlexStyle;
118
+ children?: FlexNode[];
119
+ measure?: MeasureFunction;
120
+ }
121
+ /**
122
+ * The computed layout for a single node. This is the output of computeLayout().
123
+ * Coordinates are relative to the node's parent.
124
+ */
125
+ interface LayoutResult {
126
+ x: number;
127
+ y: number;
128
+ width: number;
129
+ height: number;
130
+ children: LayoutResult[];
131
+ }
132
+
133
+ declare function computeLayout(node: FlexNode, availableWidth?: number, availableHeight?: number): LayoutResult;
134
+
135
+ /**
136
+ * Create a layout node with style applied directly — no `{ style: { ... } }` wrapping.
137
+ *
138
+ * h({ width: 100, height: 50 })
139
+ * h({ flexGrow: 1 }, child1, child2)
140
+ */
141
+ declare function h(style: FlexStyle, ...children: FlexNode[]): FlexNode;
142
+ /**
143
+ * Create a row (flex-direction: row) node.
144
+ *
145
+ * row({ gap: 12, padding: 8 }, child1, child2)
146
+ */
147
+ declare function row(style: FlexStyle, ...children: FlexNode[]): FlexNode;
148
+ /**
149
+ * Create a column (flex-direction: column) node.
150
+ *
151
+ * col({ width: 375, height: 667 }, header, content, footer)
152
+ */
153
+ declare function col(style: FlexStyle, ...children: FlexNode[]): FlexNode;
154
+ /**
155
+ * Create a grid container node.
156
+ *
157
+ * grid({ gridTemplateColumns: ['1fr', '1fr'], gap: 8 }, ...items)
158
+ */
159
+ declare function grid(style: FlexStyle, ...children: FlexNode[]): FlexNode;
160
+
161
+ export { type AlignContent, type AlignItems, type AlignSelf, type BoxSizing, type DimensionValue, type Display, type FlexDirection, type FlexNode, type FlexStyle, type FlexWrap, type GridAutoFlow, type GridLine, type InsetValue, type JustifyContent, type JustifyItems, type JustifySelf, type LayoutResult, type MarginValue, type MeasureFunction, type Position, type SizeValue, type TrackSize, col, computeLayout, grid, h, row };