Repository navigation
PNT1-radius: border-radius, its corner longhands and -webkit-border-radius drawn natively on iOS and Android (supersedes #80, #81) - #198
Merged
Conversation
…der-radius on iOS and Android, rebuilt from #80/#81 on master Carries the radius half of #80 (paint-radius.ts, its harness cases, vectors input generator and host plumbing) and #81 (parsing, computed values, lowering, emission, rounded background, border and clip stages, the radius-square plant, the pnt1-radius proofs and fixtures) onto master's per-feature registries, and adds -webkit-border-radius with Chrome's legacy two-value parsing, the radius-longhands fixture, and native refusals for rounded html, body and replaced elements.
…does not model rounded corners yet), the identity check strips the corner radii added since its base, and pnt1-radius covers radius-longhands
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated to a fixed point, then pnpm regen --only tw-sweep (macos-26). Base: 61f24f0 Run: https://github.com/compiled-run/dragoncss/actions/runs/37382572332
…mily registers between pointer-events and transform, and a rounded box leaves the hit facts unchanged (the hit lane refuses rounded cases by name)
…a corner longhand is refused by name
# Conflicts: # packages/parity/src/hit-capture.ts
Commands: pnpm regen --skip lanes-host --skip tw-sweep (macos-26) and pnpm regen --only lanes-host (xcode-27), alternated to a fixed point, then pnpm regen --only tw-sweep (macos-26). Base: 4094fb1 Run: https://github.com/compiled-run/dragoncss/actions/runs/37389802133
Contributor
Author
|
Landing stopped at step Fix the cause, then hand #198 back to the landing queue with the new clean head. |
# Conflicts: # packages/layout/test/paint-seams.test.ts # packages/translate/harness/harness.ts
…orthands/radius.ts cites css_parsing_utils.cc ConsumeRadii); no uncited replaced_painter.cc reference
…job.sh pnpm regen: fixed point after 3 passes, 27 steps)
…acy shorthand (PNT1-radius), so it leaves the still-refused list
…rget, as Chrome drops it; any other encoding, form or position is refused - css/at-rules/charset.ts: the handler, one line in AT_RULE_HANDLERS, and a 'drop' AtRuleOutcome the driver skips; the at-rule context carries its source text and whether it starts the sheet. - Fixture group charset: charset-utf8 and charset-utf8-upper must render as charset-none in Chrome (dragon/test/charset.test.ts), and three rejects (another encoding, not at the start, single quotes). - seams.test.ts: charset leaves the refused list with its own handler; the byte-identical pin is the base's hash without it.
Contributor
Author
|
Catch-up after queue 54's merge conflict:
Passed:
🤖 Generated with Claude Code |
…t-regen2: pnpm regen, fixed point): the charset fixtures' captures, emitted CSS, vectors and break vectors, the profiles (proof cases added, no row or status changed), the native lanes record, the hit facts and the translate corpus
Contributor
Author
|
Landing stopped at step Fix the cause, then hand #198 back to the landing queue with the new clean head. |
…eeps -webkit-keyframes and charsetAtRule; the seams pin drops both from its list, and master gives the same hash for that list (bb433400…)
…, fixed point)
…test/hit-refusals-radius.ts), as SVG-a1 keeps its svg list; lanes.test admits them
…job.sh pnpm regen)
Contributor
Author
|
Landing stopped at step Fix the cause, then hand #198 back to the landing queue with the new clean head. |
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…into svg-a1. Conflicts: hit-capture.ts hitRefusal refuses transforms, then an <svg> by name (SVG-a2), then a rounded corner (PNT1), then INL1a's inline box; withoutPointerEvents uses master's KEYS_SINCE_BASE, which now lists the svg family (fill, stroke, stroke-width) beside the radii, with a new hit-capture-identity case; hit-report.test.ts and lanes.test.ts judge the exact union of the four named refusals (transform, radius, inline, svg) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…-opacity-z # Conflicts, each resolved keeping both sides: # packages/dragon/src/css/stylesheet.ts: opacity and z-index register in #198's PAINT_VALUE_PARSERS hook (paint-parsers.ts) # packages/dragon/test/expected-dump.test.ts, packages/parity/src/native-host.ts: ExpectedEngine has opacityAlpha8 and paint.roundedShape # packages/dragon/test/pointer-events.test.ts: radius, then effects, then transform after pointer-events # packages/parity/src/device-run.ts: radius-square, alpha-ignored and order-swap plants, in registry order # packages/parity/src/hit-capture.ts: the stacking-context and border-radius hit refusals both # packages/parity/test/hit-report.test.ts, packages/parity/test/lanes.test.ts: the union of transform, stacking, radius and inline refusals # packages/parity/test/p6a-dash-oracle.test.ts: skips both an opacity group's borders and a rounded box's # scripts/gen-css-grammar.ts: both EFFECTS_LONGHANDS and RADIUS_LONGHANDS # After the merge: EFFECTS_VALUES and STACKING_VALUES gain #198's check field (null: their refusals are lane-gated in project.ts), # the NodeGeometry literals in paint-opacity and paint-stacking tests gain #198's size field, and hit-report.test pins that the # stacking and radius refusals each fire with the other present or absent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…s check field and NodeGeometry size, and the radius facts pin EFFECTS_VALUES and STACKING_VALUES gain #198's check field, null: the fractional-opacity and stacking clip refusals are lane-gated in project.ts. The paint-opacity and paint-stacking applied-value calls pass #198's NodeGeometry size. paint-radius.test: a rounded box also carries PNT1's stacking facts (on every box, rt-hit reads them), so the pin checks a's radius facts and that b has only stacking, as paint-transform.test does. hit-report.test: the stacking and radius hit refusals each fire with the other present or absent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
seams.test.ts conflicted: the refused list now excludes media, both keyframes names, supports, property and charset; the handler check expects charsetAtRule and propertyAtRule; @layer stays the enclosing at-rule. The byte-identity pin is master's list minus property, re-pinned to 1397573c…, which master 508db67 gives for the same list (checked in a temporary detached worktree). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…-b-longhands. Conflicts in hit-capture.ts and hit-capture-identity.test.ts, both sides kept: withoutPointerEvents removes PNT1's KEYS_SINCE_BASE (pointer-events and the corner radii, any value) and then GEN-b's four longhands at their neutral values only; both unit tests stay. Generated files (grammar.generated.ts, profiles, UA datasets, lanes.json) keep this side until the CI regen Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
state.ts conflict: the box background write keeps master's dragonBackground paint writer (rounded fill) and feeds it this side's animated frame colour, as the Kotlin side already merged; anim-runtime.test pins both on both backends.
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…into ovfl-b
Conflicts, each resolved keeping both sides:
- emit/expected-dump.ts: ExpectedEngine has both scrollRanges (OVFL-B) and paint (PNT1); NodeGeometry has both size and
scroll; each node's geometry carries both, and the scroll-range refusal check stays.
- emit/native-support.ts (Swift and Kotlin): DragonBoxShape takes master's size argument, and the scroll range and refusal
are still set on every box before the after-layout hooks.
- test/expected-dump.test.ts and parity/src/native-host.ts: the engine passes both scrollRanges and paint: { roundedShape }.
- test/paint-radius.test.ts (master's, no conflict): its NodeGeometry literal gains scroll: null, the field OVFL-B adds.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
#198's rounded overflow clip masks the clip view in its own coordinates (iOS layer mask, Android outline or overlay mask), and a DragonScrollView moves those with its scroll offset; no fixture compares a rounded scroll container with Chrome. checkRoundedScrollContainer refuses a rounded corner on an auto or scroll container on ios and android (DRAGON_UNPROVEN_CONTEXT at the radius). overflow.test.ts pins it, that it fires beside the start-overflow background refusal, and that rounded hidden boxes and square scroll containers still compile. Every layout fixture still lowers on native (649 cases). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…flicts Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…and counts the effects fixtures as new hit-capture-identity.test failed on the merged tree: every emitted rule gained opacity: 1 and z-index: auto with PNT1, so 2471 base files no longer hashed to the identity base. As #198 did for its corner radii, KEYS_SINCE_BASE gains opacity and z-index (the base files must still differ only by those keys and pointer-events), and IDENTITY_NEW gains the effects group's opacity-* and stacking-* fixtures (none is in the base manifest). The test fails without this and passes with it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
This was referenced Oct 9, 2026
Merged
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…er with #101, #210, #208, #198, #216, #218) into txt1a-1-v2 (prep, no PR changes until #102 merges). Conflicts: ios-layout's Lowerer carries both TXT1a-1's lowering mode and master's propagated viewport-overflow element, and lowerTree passes both; project.ts checkCases takes master's @Property registrations and checkComputed faults argument and keeps TXT1a-1's font deferrals beside master's native-scroll check; the band passes pass both the shared font deferrals and the registrations; native lowering runs master's per-band loop in native mode, then TXT1a-1's engine-mode lowering of the native band's cases. Generated outputs: this side's, regenerated after #102 merges. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
#203) into grid-g1a-engine-v2. Conflict: rt-hit.ts imports keep GRID's NO_GRID_FAULTS and OVFL's isScrollContainer beside resolveBorder. Master's grid input (input.ts, validate.ts) is unchanged here; the engine reads it as is. Generated files keep the merge result until the CI regen Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
#203) into form-a-v2 Conflicts, both sides kept: - rt-hit.ts: master's isScrollContainer import beside FORM-a's controlAsBox. - validate.ts: FORM-a's checkControl and master's OVFL clipsOnly, both whole. - expected-dump.test.ts, pixel-reference.ts: the union of both sides' imports. - p1-floor.json (structural): the union of the extended names (engine-inline, engine-overflow) and the larger count of each; nothing lowered. Semantic: master's overflow.ts (OVFL scrollMetrics) skipped ControlBox children silently. It now refuses a form control with an OverflowRefusal (overflow.test.ts pins it; it fails without the refusal), since its scrollable overflow has no Chrome proof. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…, #208, #200) into mq-r1-runtime Conflicts, both sides kept: - emit/runtime/state.ts: the machine takes MQ-R1's viewport, band and initial band and ANIM-b1's anim tables (last, defaulted); input() lays out at the live viewport and patches the animator's frame lengths; startAnimator resolves its inputs at the current viewport; the mount sizes its media root and takes the band before starting the animator and the first render, renders into the media root, and keeps master's shown/stale/display driver; scripts run on the mount, advancing through machine.advance. A program with animation tables and a band or a resize step is refused at emit (the animator resolves its inputs once), with a test. - emit/runtime/index.ts: media module registered first so the support order ends clock, state, anim as before. - parity/src/native-host.ts: state emits are stateEmits, frameEmits, resizeEmits, envEmits. - dragon/test/state-program.test.ts: master's ANIM-b1 setter/onChange/shown patterns with MQ-R1's media root and m.machine.set; anim-runtime.test.ts's advance pattern retargeted to m.machine.advance (scripts run on the mount). Generated files keep the auto-merge until the CI regen. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WSkSiXMPXTAsNpS9BD9LDR
thejackshelton
pushed a commit
that referenced
this pull request
Oct 9, 2026
…#216/#102) into ANIM-b1 part 2 Conflicts: state.ts keeps this branch's hooks-only form (the adapter in anim.ts draws the background through dragonBackground); anim-runtime.test keeps the hooks test and carries master's check that the frame colour never goes straight to the platform property; device-jobs.ts imports both ANIM_LANE and isBlockReason.
This was referenced Oct 9, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PNT1-radius (coverage-rank lane 4):
border-radius, its four corner longhands and-webkit-border-radius, parsed and computed as Chrome 145 does and drawn by Dragon on iOS and Android.Supersedes #80 and #81 (PNT1 1-2/8). Those were stacked and 820 commits behind master. This PR carries their radius content onto current
origin/masteras one branch, adapted to master's per-feature registries. Nothing here is stacked: the base ismaster.The branch is
pnt1-radius-native. The namepnt1-radiusis still #81's head branch, and reusing it would need a force-push over #81.What changed
Engine (from #80, radius half only)
packages/layout/src/paint-radius.ts: border-radius geometry as Blink 145 paints it.layout/test/paint-radius.test.ts, and its harness cases (paint:radius:*intranslate/harness/harness.ts).scripts/gen-paint-inputs-radius.ts. That is a new regen step inscripts/regen-steps/pnt1.ts, placed beforepaint-vectors, with its.gitattributesline.docs/ports.jsonregisters the citedcontoured_border_geometry.ccrange (PixelSnappedContouredBorder) and thebox_border_painter.ccreference.PaintEngine(roundedShape);NodeGeometryandSampleBox.Compiler and native (from #81)
css/properties/radius.ts,shorthands/radius.tsandcss/paint-parsers.tsare called fromstylesheet.tsand do Chrome's checks beyond the grammar:analysis/paint-values/radius.ts:border-radiuswrite per rounded box (lower/paint/radius.ts), with radius facts.emit/paint/radius.ts) on both backends:dragonSetRadii;paint-radius.ts, through theroundedPathhook;emit/paint/background.ts), and draws solid borders between the rounded outer and inner paths, using Blink's edge quads (emit/paint/border.ts).radius-squareraster plant. ItsPLANT_CASESentry isradius-basicand itsPLANT_RULESentry isradius:.animation-kinds/radius.ts: the corners interpolate in Chrome, so they areUNADMITTED(there is no state writer yet).New in this PR
-webkit-border-radiusis a radius-family shorthand with Chrome's legacy parsing (ConsumeRadiiwithuse_legacy_parsing): exactly two values and no/mean one horizontal and one vertical radius for every corner. ALIAS (ALIAS: legacy -webkit- aliases of supported properties resolve as in Chrome (44 aliases) #172) leaves this alias to the radius lane. The per-corner-webkit-border-*-radiusaliases are plainalias_forentries, so they can join ALIAS's registry once this lands.htmlorbody, at the radius declaration, withDRAGON_UNSUPPORTED_VALUE. Their background paints the canvas, which is not rounded.img,iframe). Blink clips replaced content to the rounded content box, and Dragon's image and web-view stages draw it square.hitRefusal) refuses a case with a rounded box by name, just as it refuses a transformed case. Blink clips a hit to the rounded border, andrt-hit.tsdoes not model that yet.radius-longhands(ltr and rtl). It covers each corner longhand on its own (px, em, rem, %, pairs), and-webkit-border-radiuswith 1, 2 (legacy), 3 and 4 values and the slash form, cascading both ways againstborder-radiusand the longhands.Left out of #80: the shadow engine (
paint-shadow.ts,paint-aa.ts's A8 additions,gen-paint-inputs-shadow.ts, the Adobe notice) andcheck-pnt1-additive.ts. Radius uses none of them. The shadow engine depends onpaint-radius.ts, so it belongs to PNT1-shadow once this lands. The identity check below covers what the additive tool proved.Rows promoted
Profiles from the CI regen after the catch-up merge (
0d8d045414):exacton web;caveaton iOS and Android, with chrome-dual computed-value proofs from the six radius fixtures, until the driver's device run adds the paint proofs.DRAGON_UNSUPPORTED_PROPERTY, as wereborder-radiusand-webkit-border-radius.north-star-check.json): 199 → 205 declarations compile on both native targets (68.9% → 70.9%)..library-song imgis refused on native (rounded replaced element).*::-webkit-scrollbar-thumbis still refused by its selector.Changed tests (reasons)
pointer-events.test:hitRefusalandhit-report.test.properties.tshas always placed it.hit-report.test: the refused cases are exactly those that write a transform or a border radius. Each is refused with its own reason, and there are some of each.hit-capture-identity(withoutPointerEvents): the identity base predates PNT1, so every base capture and emitted rule now also gains the four corner keys.device-run.ts/device-lanes.test:radius-squarejoinsPLANT_CASESandPLANT_RULESin registry order, and gains a plant-verdict test.layout/test/paint-seams.test: radius is a filled seam, with its twoindex.tslines.s4b.test: the corner longhands get two radius values for the paint-never-reaches-layout check (colours are invalid for them).samples,paint-seams(parity),native-compare,pnt2-samplestests: theirSampleBoxliterals gain the requiredsize.expected-dump.test: the engine gainspaint: { roundedShape }.native-backends,state-program,p6a-dash-oracle,seamstests: as in PNT1 2/8: border-radius, parsed as Chrome 145 and drawn natively on iOS and Android #81. The background is written throughdragonBackgroundon both backends.border-radiusin a state program is refused by name. A rounded box's border is drawn by the rounded painter, so the side-painter oracle skips it. Thebordershorthand sets no radius.Outside the spec
packages/parity/src/hit-capture.ts:hitRefusal, pluswithoutPointerEvents/IDENTITY_NEW(above).packages/dragon/src/css/stylesheet.ts: env() in a paint value property gets the specific env() refusal.packages/dragon/src/emit/runtime/state.ts: the Swift state record writes the background throughdragonBackground, as Kotlin already did. The background's after-layout sync would otherwise overwrite a state write.packages/dragon/src/analysis/paint-values/transform.ts:check: null, needed by the paint-values type now that it hascheck.What passed
pnpm typecheck: clean.8c3a713153;origin/master(GitHub reported a conflict inhit-capture.ts; master'sIDENTITY_RULEDis kept beside this PR's keys), run 37389802133: commit0d8d045414, fixed point.0d8d045414(after the merge and regen): 87 files, 2098 passed, 2 skipped.packages/dragon/test, all files. The two pointer-events pins were retargeted in130716bbfc.layout/test/paint-radiusandlayout/test/paint-seams.pnt1-radius(the paint model at every radius, clip and base point equals the committed Chrome pixels for all six fixtures, both directions, every DPR),pnt1-radius-edges,native-compare,samples,paint-seams,device-run,device-lanes,pnt2-samples,pnt2-plants,hit-report,hit-capture-identity,regen,registry-claims,css-escapes,p6a-dash-oracle,paint-vectors-cli,fixture-reader,values, the threenorth-star-*files,gallery,fonts-fixturesandscript-conditions.pnpm native:build(at8c3a713153): passes for iOS (swiftc, iOS 15 availability), for Android (kotlinc, d8, API floor 31: 0 references above it), and for the iOSradius-squareplant build.layout-vectors-hostpasses on both targets, including the radius paint vectors, TS = Swift = Kotlin.pnpm test, which the landing driver runs. Device lanes are "device step pending":lanes.jsonis host-only after the regen.Reviewed diff (outside
.macroscope/ignore.md): about 198 KB over 62 files. Splitting it would leave one PR stacked on the other, because the compiler half needs the engine half, so it ships as one.Catch-up (2026-10-06): merged origin/master 2c48409, regenerated
packages/parity/test/hit-refusals-radius.tslists the 12 radius-* cases (RADIUS_OUT) and their reason (RADIUS_REASON), the same pattern as SVG-a1: inline <svg> (path, rect, circle; fill, stroke, stroke-width) on web, proven by a strict outline differential against Chrome; native refused as SVG-a2 #206'shit-refusals-svg.ts, so either PR merges onto the other as a union of the two lists.hit-report.testnow checks that the refused cases are exactly the transform cases plusRADIUS_OUT, each with its own reason. That is stricter than before: a new rounded fixture has to be named in the list.lanes.testdevice-hit test (retargeted). It required every refused id to match^transform-, which fails once the radius cases are refused. It now requires everyRADIUS_OUTcase to be refused withRADIUS_REASON, and every other refusal to be atransform-case with the transform reason. The intent is unchanged: device-hit runs exactly the cases the hit lane does not refuse.s4b.test. The radius value pair moved from thepairliteral into thepair[p] ??fallback, with the same values and the same check.pnpm typecheck;native:buildfor ios and android (591 cases each, API floors pass); vitest over 24 files (chrome-ports, both registry-claims, profile-index, android-target, native-backends, not-applicable-native, s4b, aliases, paint-radius, pointer-events, seams, state-program, hit-report, hit-capture-identity, lanes, device-lanes, native-compare, p6a-dash-oracle, paint-seams, pnt1-radius-edges, pnt1-radius, pnt2-samples, samples): 1250 passed, 1 failed. The failure is device step pending: lanes.test "every device lane ran" reports ios layout-vectors-device as not run.🤖 Generated with Claude Code
Catch-up (2026-10-08): merged #194 (ovfl-a) and #200 (casc-supports), regenerated
landing-failedcomment was a merge conflict inpackages/dragon/src/analysis/computed-checks.tsonto 27712c4 (OVFL A: scroll containers (overflow auto, scroll, clip), viewport propagation and Chrome scroll metrics, rebuilt on master (supersedes #96/#97) #194).4e0723868bmerges origin/master 7a7ba63 and resolves it.computed-checks.tswas resolved. Both sides changed the end ofcheckComputed'swalk. This PR added the paint modules' refusals (if (!here) for (const m of PAINT_VALUES) m.check?.(...)). OVFL A: scroll containers (overflow auto, scroll, clip), viewport propagation and Chrome scroll metrics, rebuilt on master (supersedes #96/#97) #194 added thescrollerargument (the nearest scroll container, used by the OVFL-p check), passed to children throughown/inner. The merge keeps both, in that order: the PAINT_VALUES checks run first, then the walk descends withwalk(c, here, inner).checkOverflowone-axis clip,checkNativeScrollOVFL-B,checkPercentRelativeOVFL-p,propagatedFrom) and this PR'scheckRoundedElement(html/body, replaced, PNT1b border styles) are all unchanged.dragon/test/paint-radius.test.ts. It covers one compile of a rounded, dashed-borderoverflow: hiddenbox with aposition: relative; top: 10%child, so both sides' refusals run in the same walk. It asserts the exact PNT1b refusal for ios and android at6px, and the exact OVFL-p refusal for android, ios and web. I checked that it fails without each half of the resolution:nullinstead ofinner, the OVFL-p refusal is gone.6279b61fe4. CASC 1: @supports decided at build time as Chrome 145 decides it; revert and revert-layer; CSS-wide keyword rows #200 landed during the first regen and made the PR conflict again. The merge of origin/master 9b32f10 had no conflicts (stylesheet.ts,seams.test.tsandfixtures.tsmerged automatically). Generated files kept this side, and regen rebuilt them.What passed (head
b8e462fe86a4b9fc1dac3a3afd312854eeea1cb5)06ad7bd871, regen commit7d162742b9(superseded by the CASC 1: @supports decided at build time as Chrome 145 decides it; revert and revert-layer; CSS-wide keyword rows #200 catch-up);6279b61fe4, regen commitb8e462fe86.pnpm typecheck: passes onb8e462fe86.dragon/test: aliases, casc, cascade-var, expected-dump, initial-line-width, interaction, media-wiring, overflow, paint-radius, pointer-events, profile-index, registry-claims, s4a, s4b, s5, seams, state-program;layout/test: overflow, paint-radius, paint-seams, rt-hit.tested b8e462fe86a4b9fc1dac3a3afd312854eeea1cb5, 24 files:lanes.test: 349 passed, 1 failed. The failure is device step pending: "every device lane ran" reports ios layout-vectors-device as not run.pnpm pr:review 198 --once: exit 0 onb8e462fe86. It is UNREVIEWED (Macroscope at its spending limit), CIcheckspassed, and there are 0 unanswered findings.🤖 Generated with Claude Code
Generated by Claude Code