Commit Graph
179 Commits
Author SHA1 Message Date
SGavrl 706e110a24 render: preserve forced line break geometry 2026-07-23 21:07:10 +00:00
SGavrl 15d67b0a18 render: derive normal line height from font metrics 2026-07-23 20:46:26 +00:00
SGavrl 94897724d8 render: resolve CSS round length math 2026-07-23 20:09:19 +00:00
SGavrl e90ea7eacc test: gate BFC float continuation 2026-07-23 19:56:32 +00:00
SGavrl fa471bce43 render: propagate float bands through blocks 2026-07-23 19:56:24 +00:00
SGavrl 3ea5ea0b2b test: gate constrained replaced geometry 2026-07-23 19:23:31 +00:00
SGavrl 07d2c6691f render: clamp intrinsic replaced sizing 2026-07-23 19:22:27 +00:00
SGavrl 436b69f50f test: gate right-float navigation geometry 2026-07-23 19:01:54 +00:00
SGavrl 4b4d7007d9 render: place right-float navigation bands 2026-07-23 19:01:50 +00:00
SGavrl 567ba48649 test: gate list and mixed float geometry 2026-07-23 18:42:21 +00:00
SGavrl eff74fc38c render: correct list and mixed float geometry 2026-07-23 18:42:15 +00:00
SGavrl 3863833ca4 test: gate legacy center geometry 2026-07-23 18:06:03 +00:00
SGavrl 8422cfccd0 render: honor legacy center layout 2026-07-23 18:05:41 +00:00
SGavrl 20d31938a1 test: gate absolute static position 2026-07-23 17:30:49 +00:00
SGavrl f6484f51c8 render: preserve absolute static position 2026-07-23 17:30:43 +00:00
SGavrl fb87e87849 test: gate content alignment 2026-07-23 16:57:28 +00:00
SGavrl ca685813de render: honor content alignment 2026-07-23 16:57:24 +00:00
SGavrl 4887e95f52 test: gate container item alignment 2026-07-23 16:49:27 +00:00
SGavrl 051e8e956e render: honor container item alignment 2026-07-23 16:49:22 +00:00
SGavrl 1387e7ffe4 test: gate item self alignment 2026-07-23 16:42:31 +00:00
SGavrl ba92928ff5 render: honor item self alignment 2026-07-23 16:42:19 +00:00
SGavrl c333619703 test: gate inline block flex geometry 2026-07-23 16:24:17 +00:00
SGavrl 2d1f84a29d render: preserve inline block inner flow 2026-07-23 16:24:13 +00:00
SGavrl 5b602259c6 test: gate flex text alignment geometry 2026-07-23 15:58:37 +00:00
SGavrl bd9c161f55 render: separate text and item alignment 2026-07-23 15:58:37 +00:00
SGavrl 201c5f6c6f render: reset omitted background layers 2026-07-23 15:43:24 +00:00
SGavrl ea3ff7ca4f test: gate replaced wrapper geometry 2026-07-23 15:35:02 +00:00
SGavrl f83bdd36cf render: contain responsive replaced wrappers 2026-07-23 15:34:57 +00:00
SGavrl 6c77eb2383 render: preserve block fill beside floats 2026-07-23 15:13:40 +00:00
SGavrl bbdb779de9 test: gate opposing float geometry 2026-07-23 15:04:03 +00:00
SGavrl 85613b741d render: place opposing floats in one band 2026-07-23 15:03:50 +00:00
SGavrl c7438370db test: gate replaced grid geometry 2026-07-23 14:48:36 +00:00
SGavrl 9471591c6c render: preserve responsive image grid geometry 2026-07-23 14:48:27 +00:00
SGavrl da5cc2cc2a render: honor font shorthand 2026-07-23 14:25:09 +00:00
SGavrl 944db4b104 test: gate float flow geometry 2026-07-23 14:10:02 +00:00
SGavrl 735375ee33 render: preserve float flow bands 2026-07-23 14:09:57 +00:00
SGavrl 1f85dfce6b test: gate flex item geometry 2026-07-23 13:34:19 +00:00
SGavrl 64b628404b render: ignore non-items in flex layout 2026-07-23 13:34:09 +00:00
SGavrl 29628df548 render: resolve contextual CSS math 2026-07-23 12:53:11 +00:00
SGavrl df9359ec87 render: honor responsive grid track syntax 2026-07-23 12:41:56 +00:00
SGavrl b13a1e5e71 render: resolve relative box edge lengths 2026-07-23 12:30:44 +00:00
SGavrl b39ada2fc0 render: resolve block auto margins 2026-07-23 12:19:29 +00:00
SGavrl 7827a6a788 render: honor modern containing-block triggers
Track transform, filter, backdrop-filter, perspective, containment,
will-change, and content-visibility triggers independently. Use the combined
state for absolute and fixed containing-block ancestry.
2026-07-23 12:02:55 +00:00
SGavrl bbeceb97ad render: honor transform containing blocks
Track every non-none transform as a containing-block trigger, including
unsupported visual transforms. Keep separate nearest-ancestor maps so
positioned boxes capture absolute descendants while only transforms capture
fixed descendants.
2026-07-23 11:47:00 +00:00
SGavrl 6ea1739121 render: position inset boxes against CSS containers
Reparent inset-positioned absolute boxes to the nearest non-static ancestor
and fixed boxes to the initial containing block. Keep auto-axis boxes on the
existing static-position path, distinguish fixed from absolute, and blockify
positioned inline boxes and floats.
2026-07-23 11:34:23 +00:00
SGavrl 4979606a2f render: respect CSS box sizing 2026-07-23 10:06:55 +00:00
SGavrl 3d7a8e2582 render: honor important cascade priority 2026-07-22 12:59:55 +00:00
SGavrl 22f33e4dec render: z-index paint layers and clear ending float zones
Paint order was pure tree order, so a dropdown/overlay declared before a
later sibling lost to it and a z:-1 decorative backdrop covered its own
content. A positioned element with a non-zero z-index now lifts its
whole subtree into a separate paint layer: negative layers under the
normal flow, positive above it, each sorted ascending with tree order
preserved within equal z. Nested z roots paint inside their ancestor
root's subtree in tree order, the pragmatic core of CSS stacking
contexts.

clear (left/right/both, previously unparsed) now ends the float zone,
so a clearfix element drops below the float at full width instead of
joining the flow column beside it.

Repro-verified: an earlier z:10 overlay paints over a later sibling, a
later z:-1 backdrop paints under earlier content, and the clear repro
matches Chromium within 3px on every measure. Spot set unchanged or
slightly improved; obstacle course 33/33.
2026-07-16 13:10:28 +00:00
SGavrl 953292563d render: table vertical-align and specified column/row sizing
Cells now vertical-align the way tables actually do: middle by default
(the effective UA behavior), with author top/middle/bottom parsed and
applied to whichever shape the cell took: main-axis alignment on the
flex-column stand-in, line alignment on a promoted inline context, or a
pinned-origin offset for the pure-text leaf path where the shaped text
height is known at finalize.

Specified column widths finally apply. <col>/<colgroup> widths (style
or attribute, with span) and colspan-1 cell widths are recorded per
column at build time and pinned inside the column-balancing pass: px
directly, percent against the table's content width, with each column's
content min-content still flooring it. The cell's own width is
neutralized once it has fed the column, so the cell box fills its grid
area instead of shrinking to a fraction of its own already-sized track
(a width:50% cell previously ended up at 25 percent). Unspecified
columns keep content sizing but stretch to fill a definite table width
instead of leaving a dead strip of table background. Row and cell
heights act as row minimums.

Verified against Chromium on a 5-case repro (column from cell width,
row backgrounds, vertical alignment, col element width, percent cell in
a fixed table): all match. Wikipedia and the prose spot set unchanged;
obstacle course 33/33.
2026-07-16 12:47:47 +00:00
SGavrl 1d96c316ca render: clip image rasters to their visible bound, browser-like alt fallback
paint_image clipped an object-fit:cover overflow to the element box but
ignored the ancestor overflow:hidden clip entirely, so a partially
visible image (a half-scrolled carousel slide, a hero cropped by its
section) painted its full raster past the viewport edge. Pass the
already clip-intersected visible rect down and mask against it whenever
the destination exceeds it on any side.

Broken images now fall back the way browsers do: a non-empty alt renders
as text in place of the image with no placeholder box, alt="" renders
nothing (declared decorative), and only a missing alt keeps the neutral
grey placeholder.

Verified with a repro covering the half-clipped cover slide and all
three alt variants; no movement on the image-heavy spot set; obstacle
course 33/33.
2026-07-16 12:23:17 +00:00