Repository navigation
FORM-a 3/3: input[type=range] as Chrome's UA shadow tree, CSS-painted, with the slider pseudo-elements cascaded per part - #79
Open
thejackshelton wants to merge 482 commits into
Open
thejackshelton wants to merge 482 commits into
thejackshelton wants to merge 482 commits into
Conversation
This was referenced Oct 4, 2026
…loor-merge.ts, merge=dragon-floor) takes the larger count and the union of names, refusing anything else; pnpm setup:git and the landing driver register it
… twin around the shared collectNodes; the identity keeps master's IDENTITY_NEW (SELD-R1b and PNT2 transform fixtures) beside MQ-R0's IDENTITY_LATER and IDENTITY_RULED
Commands: pnpm regen
… runtime animator and the hit table; the block button's context - flex.ts (Medium 1): a column flex item's content size suggestion measures a control with its own height treated as auto (columnIntrinsicBlockSize, master's T128 path), as it does a plain box; it kept the control's specified height before. - rt-animator.ts (Medium 2): lengthBase and patchInput walk into form controls and their contents, so a length animation on a control, or on a box inside one, is read and written instead of dropped. - rt-hit.ts (Medium 3): the hit table lists a control and its contents as the boxes they are laid out as (indexZoomed, fragmentOrders, boxNodes), so a tap on a button or on its text hits the button, and on an element inside it that element. - block.ts (Low): the block button's formatting-context rule now cites layout_block_flow_hot.cc:38-45 (LayoutBlockFlow::CreatesNewFormattingContext: align-content other than normal); ports.json swaps the box_fragment_builder.cc entry for it. - compare.ts (Low): anonymous boxes inside a control (a button's text wrapper) are Dragon's own, as elsewhere. - validate.ts (Low): a slider thumb whose parent is not a block container is refused (only block flow moves it). - capture-form-data.ts: a button-contexts capture (14 cases, ltr and rtl): a block button in block flow (auto and fixed margins, a sibling's collapsing margin, a child's margin held by the button's formatting context, centring) and as a short column flex item (content size suggestion, flex-shrink 0, min-height 0, a specified height below the content). Tests: controls.test compares every context case with Chrome at 0 LU (fails without the flex fix on c8-c10, and without the formatting-context rule on c5); rt-animator.test reads and patches a control's and an inner box's lengths; rt-hit.test hits a button, its label text, an inner element, and activates the button, in block and flex parents; compare-controls.test passes a button's anonymous text box on its compared lines; the validator refuses a thumb in a flex track or directly in the range.
… (node --conditions=dragon-internal scripts/capture-form-data.ts, the MANUAL forms capture; every other forms output byte-identical)
…TING (generated outputs under the merge driver); generated outputs are rebuilt by regen-on-ci
Floor and pin files merge structurally (git merge driver dragon-floor)
…p + rename) and restored before a text merge on refusal; two insertions at one place of an ordered list are refused
…ength animation on an img was dropped on native rt-animator.ts lengthBase (findBox) and patchInput (patchBox) walked only box children, so an img or iframe, a replaced leaf since REPL-a (#72), was neither read for its length endpoints nor written with the frame's lengths: a width, height, margin or padding transition on an img ran in the web output and silently did nothing on iOS and Android. findStyle and patchChild now treat a replaced leaf's style as a box's (the same shape as FORM-a's control fix in #77, 5077d8b, which is not on master yet). rt-hit.ts already lists a replaced leaf as its own target (replacedNode, rt-hit.test "hitTableOf hit-tests a replaced element as a childless box"); no change there. Test: rt-animator.test reads an img's width and margin-left and patches its width (fails without the fix).
Commands: pnpm regen
…ws they prove link to passing cases
…two runs never blame each other's writes on their own steps
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: cbfa388 Run: https://github.com/compiled-run/dragoncss/actions/runs/37341041399
…e the alias as written - analysis/animations.ts longhandsNamed resolves a legacy alias, as css_animations.cc CalculateTransitionUpdateForStandardProperty does (ResolveCSSPropertyID), so transition: -webkit-logical-width 1s lists width instead of warning. - Declaration.alias records the written alias; parse, keyframe, profile (set by ...), unproven-context and var() substitution messages name it. - aliases.ts records the css_properties.json5 path, tag, sha256 and line ranges.
floor-merge: never-lower for pins, whole-file replace, no guessing in ordered lists
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: 205bbd9 Run: https://github.com/compiled-run/dragoncss/actions/runs/37342842729
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: f24f174 Run: https://github.com/compiled-run/dragoncss/actions/runs/37342969009
…erated) into form-a3-v2. Conflicts: ios-layout.ts lowerBox keeps GRID's gridParent and grid styles and FORM-a3's ControlBox return (a button lowered as a grid item keeps its placement); the root check keeps FORM-a3's control-box refusal; fixtures.ts GROUPS keeps controls and master's ctx-proof, display-legacy, env; p1-floor.json takes the larger counts (form-a-v2's)
Commands: pnpm regen
…a4-v2. Conflicts: master's interaction states (SELD-R2) meet FORM-a4's range parts: cascadeElement takes both the range part and the interaction state, and partSelectorMatches passes the state on, so input:hover::-webkit-slider-thumb is probed and resolved per state; web-css emits a part's state diffs as .dgN::<pseudo> state rules beside the element's own; capture.ts keeps master's collectNodes and transform twin and FORM-a4's range-part capture; p1-floor.json takes the larger counts
…es per interaction state and is emitted as a :root:has(.dgN:hover) .dgN::-webkit-slider-thumb state rule (fails without passing the state to partSelectorMatches)
…ted and floor tests): chrome-ports-floor.json css-escapes-floor.json p1-floor.json; every change is a gain
…in/master 2c48409): pnpm regen
…tputs rebuilt by pnpm regen
…ted and floor tests): packages/translate/test/p1-floor.json
Commands: pnpm regen; pnpm run parity:devices; pnpm regen
…in/master 2c48409): pnpm regen
…ted and floor tests): packages/translate/test/p1-floor.json
INL1a 5/5 (C2): lowering inline boxes and <br>s, native runtime emit, 7 inline fixtures and lanes
…o form-a-v2. Conflicts: a ControlBox now carries a strut like LayoutBox and holds the same children (boxes, controls, replaced leaves, inline content); every walk over box children (layout, environment, validator, animator, hit testing, harness decoder, expected dumps, native Swift/Kotlin walks, parity walkers) visits controls and INL1a's inline boxes and <br>s; the validator checks control fields with the strut and keeps the slider-thumb and in-control abspos rules
…ted and floor tests): paint-seams-floor.json p1-floor.json; every change is a gain
…es a strut, validates and is laid out as a block-flow and as a flex child, and without its strut is refused (fails if block flow or flex item collection skips control boxes)
…1a C2) into form-a3-v2. Conflicts: ios-layout.ts lowerBox takes INL1a's Lowerer and inline runs and still returns a block <button> as a ControlBox, with the strut INL1a gives a box (a control child is not inline content); computed-checks.ts runs INL1a's checkInline on buttons too, beside checkButton, and keeps the button walk state
…nto form-a4-v2. Conflicts: resolve.ts visit keeps the range part argument and the UA shadow parts and then INL1a's pending inline boxes; ios-layout.ts gives every control box (button, range, thumb) INL1a's strut; computed-checks.ts keeps the per-tag control checks and runs INL1a's checkInline on every non-replaced element
…in/master d938618): pnpm regen
…ted and floor tests): packages/translate/test/p1-floor.json
…tputs rebuilt by pnpm regen
…in/master d938618): pnpm regen
…ted and floor tests): packages/translate/test/p1-floor.json
This branch has not been deployed
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.
FORM-a part 3 of 3 (T052, A4 in notes/T052J-form-a.md):
input[type=range]as Chrome's UA shadow tree, CSS-painted. It is stacked on FORM-a part 2 (#78), an existing stack draining under the no-stacks rule. For review, its base isreview/form-a3-v2, part 2's head c201360; it retargets to master after #78 lands.What changed
<input>::container,::trackand::thumb, styled by FORM-0's captured UA shadow rules (forms/ua-shadow.generated.ts). An unexpected rule in that data throws.rangecontrol. Its default track length is FORM-0's captured width (129 px). The thumb lowers to aslider-thumbcontrol, whose ratio comes from FORM-0's Decimal model of min, max, value and step.::-webkit-slider-thumband::-webkit-slider-runnable-trackare handled at the end of a top-level selector, counted as a type selector.::-webkit-slider-container.block.tshunk; the new fixtures confirm it, and turning it off fails them.::-webkit-slider-runnable-trackand::-webkit-slider-thumbrules on the input's class. Each part has its own band diffs under@media.type="RANGE"is a range.appearance: none(FORM-b);lowerBoxis listed as a reference ofrange_input_type.cc: a range lowers to a flex container, as CreateLayoutObject makes it.display: block), each in ltr and rtl;What passed (host, at the head of this PR)
pnpm regenis at a fixed point: "fixed point after 1 passes, 19 steps run", no files changed. Generated outputs are in their own commits, each naming its command.pnpm typecheckpasses.pnpm test(full suite): 161 of 166 files pass, and 3736 tests pass with 1 skipped.packages/parity/out/lanes.jsonis host-only; the train's device run for this position commits it.<input>element error (1 → 0) and its::-webkit-slider-thumbselector error (1 → 0) all clear;.track, so it is refused once per target, naming RF-INL (T053).grid-align-baseline-nested-intrinsic-sizing-001's not-runnable reason changes. Its input is now resolved, so it is refused at display: grid. Its status is unchanged.Changed tests and checks, with reasons
::-webkit-slider-container.Selector.pseudoElementfield, which every selector there carries at its default, null. This is the same treatment as the earlier added fields.rangePartOffrom analysis/resolve.ts. It is a fact of the resolved tree; the emitter still matches no selector and reads no lowering.Catch-up onto master (2026-10-05)
Merged form-a3-v2 after its catch-up (#72's last review head, then origin/master f50b6ad with HOTSPOT-SPLIT #137/#138). Regenerated in fd19b55 (
pnpm regen). The "What passed" section above was measured at the earlier head.packages/dragon/src/emit/web-css.ts: master's per-element animation lines and its inherited colour under an animating element (T065 R9, R15) now apply to the range's pseudo-element rules. A part's declarations and band diffs take its input's under-a-source flag, and the walk still skips range parts.computed-checks.ts: both sides' imports.block.ts: the range joins the button in the fit-content auto width, against master's stretched size.p1-floor.json(DRAGON_FLOOR_WRITE=1). No glyph-clearance pin changed. No hot-spot edits under HOTSPOT-SPLIT: the range fixtures are in thecontrolsgroup's own file.Passed at 255456a (no local full test, per the lane contract):
pnpm typecheck; targeted tests (this stack's tests, the layout package, parity, values, replaced-identity, controls-identity, pixel-reference, web-css, animations, chrome-ports, css-escapes, seams, s4b, paint-seams, registry-claims, diagnostics, animation-kinds, regen and corpus-dpr): 65 of 65 files, 2021 tests passed, 2 skipped.Reviewed size: about 82 KB (31 files) against part 2.
🤖 Generated with Claude Code