Reversed when half open
Reverse on the first frame when the panel is at least 50% open (50 ms, 60% position). Three runs at 1280 px and one at 375 px; between-run variation was no more than one percentage point.
Chromium 154 (Playwright, headless), 60 Hz, 2026-10-01, 1280×900 and 375×900
| Variant | First frame after reversal | Largest wrong-way step | Starts closing | Final state |
|---|
| A · Keyframes | +16 % | +40 % | 33 ms | closed |
|---|
| B · Kunci input | +12 % | +12 % | never | open, 1 input ignored |
|---|
| C · Transition | −22 % | 0 % | 17 ms | closed |
|---|
Keyframes jumped 40 percentage points (from 60% to 100%) in one frame and began closing only 33 ms later. Input locking discarded the close command, letting the panel finish opening. The transition reversed on the next frame without moving the wrong way.
Reversed at 50% of duration
Reverse on the first frame after 150 ms. At that point the panel is already 96–98% open.
Chromium 154 (Playwright, headless), 60 Hz, 2026-10-01, 1280×900 and 375×900
| Variant | First frame after reversal | Largest wrong-way step | Starts closing | Final state |
|---|
| A · Keyframes | −20 % | +2–4 % | 17 ms | closed |
|---|
| B · Kunci input | +1 % | +1 % | never | open, 1 input ignored |
|---|
| C · Transition | −24 % | 0 % | 17 ms | closed |
|---|
Because ease-out had already covered almost all the distance, the keyframes jump was only 2–4 percentage points and barely noticeable. Input locking still discarded the last command.
Reduced motion
Repeat the same trial with prefers-reduced-motion: reduce emulated.
Chromium 154 (Playwright, headless), 60 Hz, 2026-10-01, 1280×900
| Variant | Duration | Starts closing | Final state |
|---|
| A · Keyframes | 0 ms | 0 ms | closed |
|---|
| B · Kunci input | 0 ms | 0 ms | closed |
|---|
| C · Transition | 0 ms | 0 ms | closed |
|---|
With a duration of 0, all three variants behaved identically: there was no motion to interrupt, and the input lock no longer blocked commands because motion finished instantly.
Cross-browser replication: both reversal points
Run the same Measure instrument through Playwright: open the demo, measure actual rAF interval across 60 frames, click Measure, and read the result table. Three trials at 1280 px and one at 375 px per engine; tabulated ranges include both engines and all trials. rAF intervals were 16.66–16.95 ms (approximately 60 Hz).
Firefox 155 and WebKit 26.6 (Playwright, headless), 60 Hz, 2026-10-03, 1280×900 and 375×900
| Reversal point | Variant | First frame after reversal | Largest wrong-way step | Starts closing | Final state |
|---|
| Half open | A · Keyframes | +16–17 % | +40 % | 33–34 ms | closed |
|---|
| Half open | B · Kunci input | +12 % | +12 % | never | open, 1 input ignored |
|---|
| Half open | C · Transition | −21–23 % | 0–1 % | 16–18 ms | closed |
|---|
| 50% duration | A · Keyframes | −19–23 % | +2–4 % | 16–18 ms | closed |
|---|
| 50% duration | B · Kunci input | +1–2 % | +1 % | never | open, 1 input ignored |
|---|
| 50% duration | C · Transition | −23–25 % | 0 % | 16–18 ms | closed |
|---|
Chromium's pattern replicated in both engines: keyframes jumped 40 percentage points when half-open and 2–4 points at 50% duration; input locking always dropped the close command; transitions reversed on the next frame. Two small deviations (C +1% in one Firefox run; B +2% in one WebKit run) were within the original ±1-point between-trial tolerance.
Cross-browser replication: reduced motion
Repeat the experiment with prefers-reduced-motion: reduce emulated, one run per engine at 1280 px.
Firefox 155 and WebKit 26.6 (Playwright, headless), 60 Hz, 2026-10-03, 1280×900, reduced motion
| Variant | Duration | Starts closing | Final state |
|---|
| A · Keyframes | 0 ms | 0 ms | closed |
|---|
| B · Kunci input | 0 ms | 0 ms | closed |
|---|
| C · Transition | 0 ms | 0 ms | closed |
|---|
Both engines matched Chromium: with duration 0, all variants were immediate and there was no motion to interrupt.