Skip to content

PNT1-radius: border-radius, its corner longhands and -webkit-border-radius drawn natively on iOS and Android (supersedes #80, #81) - #198

Merged
thejackshelton merged 41 commits into
masterfrom
pnt1-radius-native
Oct 9, 2026
Merged

thejackshelton merged 41 commits into
masterfrom
pnt1-radius-native

Conversation

@thejackshelton

@thejackshelton thejackshelton commented Oct 5, 2026 •

Copy link
Copy Markdown
Contributor

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/master as one branch, adapted to master's per-feature registries. Nothing here is stacked: the base is master.

The branch is pnt1-radius-native. The name pnt1-radius is 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.
    • CalcRadiiFor against the layout border box.
    • gfx::SizeF's clamp, then ConstrainRadii.
    • The padding-edge radii.
  • Its suite, layout/test/paint-radius.test.ts, and its harness cases (paint:radius:* in translate/harness/harness.ts).
  • Its vector inputs come from scripts/gen-paint-inputs-radius.ts. That is a new regen step in scripts/regen-steps/pnt1.ts, placed before paint-vectors, with its .gitattributes line.
  • docs/ports.json registers the cited contoured_border_geometry.cc range (PixelSnappedContouredBorder) and the box_border_painter.cc reference.
  • Host plumbing:
    • the expected dump's PaintEngine (roundedShape);
    • the layout border-box size in NodeGeometry and SampleBox.

Compiler and native (from #81)

  • The radius family and the paint value hook. css/properties/radius.ts, shorthands/radius.ts and css/paint-parsers.ts are called from stylesheet.ts and do Chrome's checks beyond the grammar:
    • a negative radius is invalid;
    • a calculation, a viewport unit and a font-metric unit are refused.
  • Computed values in analysis/paint-values/radius.ts:
    • em and rem become px;
    • percentages are kept;
    • a corner with two equal components is written as one value.
  • One border-radius write per rounded box (lower/paint/radius.ts), with radius facts.
  • The emitter (emit/paint/radius.ts) on both backends:
    • dragonSetRadii;
    • a rounded border-box path from the translated paint-radius.ts, through the roundedPath hook;
    • the rounded overflow clip.
  • A rounded box paints its own background colour in the background stage (emit/paint/background.ts), and draws solid borders between the rounded outer and inner paths, using Blink's edge quads (emit/paint/border.ts).
  • The radius-square raster plant. Its PLANT_CASES entry is radius-basic and its PLANT_RULES entry is radius:.
  • animation-kinds/radius.ts: the corners interpolate in Chrome, so they are UNADMITTED (there is no state writer yet).

New in this PR

  • -webkit-border-radius is a radius-family shorthand with Chrome's legacy parsing (ConsumeRadii with use_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-*-radius aliases are plain alias_for entries, so they can join ALIAS's registry once this lands.
  • The native targets refuse a rounded html or body, at the radius declaration, with DRAGON_UNSUPPORTED_VALUE. Their background paints the canvas, which is not rounded.
  • They also refuse a rounded replaced element (img, iframe). Blink clips replaced content to the rounded content box, and Dragon's image and web-view stages draw it square.
  • These two refusals sit beside the existing refusal for rounded dashed, dotted and double borders (PNT1b). The web target is unaffected.
  • The hit lane (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, and rt-hit.ts does not model that yet.
  • New fixture radius-longhands (ltr and rtl). It covers each corner longhand on its own (px, em, rem, %, pairs), and -webkit-border-radius with 1, 2 (legacy), 3 and 4 values and the slash form, cascading both ways against border-radius and 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) and check-pnt1-additive.ts. Radius uses none of them. The shadow engine depends on paint-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):

  • 58 radius rows (the 4 corners × px, em, rem, %, pair, inherit, initial (+ unset on one), × ltr and rtl):
    • exact on web;
    • caveat on iOS and Android, with chrome-dual computed-value proofs from the six radius fixtures, until the driver's device run adds the paint proofs.
  • Before this PR all of these were DRAGON_UNSUPPORTED_PROPERTY, as were border-radius and -webkit-border-radius.
  • Tailwind sweep: borders go from 75 to 156 of 250 supported on every target. Overall, web goes 4176 → 4257, and iOS and Android 4157 → 4238.
  • Music player (north-star-check.json): 199 → 205 declarations compile on both native targets (68.9% → 70.9%).
    • Six of the eight radius declarations now compile.
    • .library-song img is refused on native (rounded replaced element).
    • *::-webkit-scrollbar-thumb is still refused by its selector.

Changed tests (reasons)

  • pointer-events.test:
    • "keeps border-radius refused" becomes "compiles border-radius and leaves the hit facts unchanged". The guard it stood for, that no rounded box reaches a hit table unmodelled, moves to hitRefusal and hit-report.test.
    • The registry order check now expects the radius family between pointer-events and transform. That is where properties.ts has 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.
    • The check strips exactly those four keys alongside pointer-events. Base files must still differ by nothing else.
    • A new case proves that other radius-like keys and changed values still differ.
    • The alternative was rewriting the manifest against a hand-built base without pointer-events (the MANUAL command), which proves less.
  • device-run.ts / device-lanes.test: radius-square joins PLANT_CASES and PLANT_RULES in registry order, and gains a plant-verdict test.
  • layout/test/paint-seams.test: radius is a filled seam, with its two index.ts lines.
  • 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-samples tests: their SampleBox literals gain the required size.
  • expected-dump.test: the engine gains paint: { roundedShape }.
  • native-backends, state-program, p6a-dash-oracle, seams tests: as in PNT1 2/8: border-radius, parsed as Chrome 145 and drawn natively on iOS and Android #81. The background is written through dragonBackground on both backends. border-radius in 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. The border shorthand sets no radius.
  • Floors: no floor or pin file changed. The derived pins took the new longhands as appended names.

Outside the spec

  • packages/parity/src/hit-capture.ts: hitRefusal, plus withoutPointerEvents / 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 through dragonBackground, 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 has check.

What passed

  • pnpm typecheck: clean.
  • Regen on CI:
    • run 37382572332: commit 8c3a713153;
    • after merging origin/master (GitHub reported a conflict in hit-capture.ts; master's IDENTITY_RULED is kept beside this PR's keys), run 37389802133: commit 0d8d045414, fixed point.
  • Targeted vitest runs at 0d8d045414 (after the merge and regen): 87 files, 2098 passed, 2 skipped.
    • packages/dragon/test, all files. The two pointer-events pins were retargeted in 130716bbfc.
    • layout/test/paint-radius and layout/test/paint-seams.
    • 25 parity files: 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 three north-star-* files, gallery, fonts-fixtures and script-conditions.
  • pnpm native:build (at 8c3a713153): passes for iOS (swiftc, iOS 15 availability), for Android (kotlinc, d8, API floor 31: 0 references above it), and for the iOS radius-square plant build.
  • Host lanes: layout-vectors-host passes on both targets, including the radius paint vectors, TS = Swift = Kotlin.
  • Not run locally: the full pnpm test, which the landing driver runs. Device lanes are "device step pending": lanes.json is 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

  • Hit-lane refusals are a named list. The new packages/parity/test/hit-refusals-radius.ts lists 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's hit-refusals-svg.ts, so either PR merges onto the other as a union of the two lists. hit-report.test now checks that the refused cases are exactly the transform cases plus RADIUS_OUT, each with its own reason. That is stricter than before: a new rounded fixture has to be named in the list.
  • lanes.test device-hit test (retargeted). It required every refused id to match ^transform-, which fails once the radius cases are refused. It now requires every RADIUS_OUT case to be refused with RADIUS_REASON, and every other refusal to be a transform- 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 the pair literal into the pair[p] ?? fallback, with the same values and the same check.
  • Passed: pnpm typecheck; native:build for 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

What passed (head b8e462fe86a4b9fc1dac3a3afd312854eeea1cb5)

  • Regen on CI:
  • pnpm typecheck: passes on b8e462fe86.
  • Platform-free, local, 21 files, 347 passed:
    • 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.
  • Chrome and native, ci:test-files run https://github.com/compiled-run/dragoncss/actions/runs/37855173626, tested b8e462fe86a4b9fc1dac3a3afd312854eeea1cb5, 24 files:
    • all pass: android-profile, casc (parity), chrome-ports, device-lanes, fixture-reader, hit-capture-identity, hit-report, native-compare, ovfl-metrics, p6a-dash-oracle, paint-seams (parity), pnt1-radius-edges, pnt1-radius, pnt2-samples, registry-claims (parity), replaced-identity, samples, supports-parse, corpus-dpr, native-backends, native-dpr-kotlin, native-dpr-swift, paint-roots;
    • 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 on b8e462fe86. It is UNREVIEWED (Macroscope at its spending limit), CI checks passed, and there are 0 unanswered findings.

🤖 Generated with Claude Code


Generated by Claude Code

thejackshelton and others added 8 commits October 5, 2026 17:23
…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)
# 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
@thejackshelton thejackshelton added the landing-failed The landing driver stopped this PR; see its comment label Oct 6, 2026
@thejackshelton

Copy link
Copy Markdown
Contributor Author

Landing stopped at step merge (pnpm land)

merge-train: merging pnt1-radius-native onto e2e965b0d560b75555171262e8200cde4f48e6c2 failed; conflicts in packages/layout/test/paint-seams.test.ts, packages/translate/harness/harness.ts

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.
@thejackshelton

Copy link
Copy Markdown
Contributor Author

Catch-up after queue 54's merge conflict:

  • c0e92b60d7 merges origin/master and keeps both sides.
  • d1d479d9ea: fixes three chrome-ports.test failures from this PR, so the ports registry follows the code.
    • The box_border_painter.cc entry names checkRoundedElement.
    • css/shorthands/radius.ts is listed under css_parsing_utils.cc.
    • An uncited replaced_painter.cc mention is gone from the radius checks.
  • 85ae72f79f: pnpm regen through /tmp/job.sh, fixed point after 3 passes.
  • 34270076ae: aliases.test (from ALIAS ALIAS: legacy -webkit- aliases of supported properties resolve as in Chrome (44 aliases) #172) no longer lists -webkit-border-radius as refused, because this PR parses it as the radius family's legacy shorthand. The test now asserts -webkit-border-radius: 4px 8px parses clean.

Passed:

  • typecheck;
  • 81 test files: packages/dragon/test, layout paint-seams and paint-radius, translate/test/paint-roots, and parity chrome-ports, pnt1-radius(-edges), native-compare, samples, paint-seams, device-run, device-lanes, hit-report, hit-capture-identity, regen, registry-claims, css-escapes, pnt2-samples, pnt2-plants, north-star-accounting and bg2-gradient. 1707 passed, 2 skipped; the one failure was the aliases pin above, fixed in 34270076ae.

pr:review --conflicts-ok exits 0 at 3427007; it is UNREVIEWED (Macroscope at its spending limit).

🤖 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
@thejackshelton

Copy link
Copy Markdown
Contributor Author

Landing stopped at step merge (pnpm land)

merge-train: merging pnt1-radius-native onto 3195d55ee655701ffcd2021a632eb16300b096ae failed; conflicts in packages/dragon/test/s4b.test.ts, packages/parity/src/hit-capture.ts, packages/parity/test/hit-report.test.ts

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…)
thejackshelton added a commit that referenced this pull request Oct 6, 2026
land: report a parallel build's ejections as they happen (queue 58: #91 and #198 failed with no FAILED line)
@thejackshelton

Copy link
Copy Markdown
Contributor Author

Landing stopped at step merge (pnpm land)

merge-train: merging pnt1-radius-native onto 24a602b8e5a0bfa37235154f77bcca3c42bac175 failed; conflicts in packages/dragon/src/analysis/computed-checks.ts, packages/parity/src/cli/native-devices.ts, packages/parity/src/device-run.ts, packages/parity/src/hit-capture.ts, packages/parity/test/hit-report.test.ts, packages/parity/test/lanes.test.ts

Fix the cause, then hand #198 back to the landing queue with the new clean head.

@thejackshelton
thejackshelton merged commit 508db67 into master Oct 9, 2026
4 checks passed
@thejackshelton
thejackshelton deleted the pnt1-radius-native branch October 9, 2026 01:35
@thejackshelton thejackshelton removed the land-ready Reviewed clean; the Mac landing driver takes it label Oct 9, 2026
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
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants