This document captures the expected interaction semantics for high-traffic widgets and shared input paths.
- Pointer press targets the topmost clickable, visible, enabled widget under the cursor.
- Pointer release emits release events for the originally pressed widget.
- Release does not retarget to a different widget if the pointer ends outside the original hit rectangle.
- Scroll inertia can continue after release if drag velocity exceeds the configured threshold.
- Two pointer click cycles on the same widget within the configured pointer double-click window emit
DoubleClicked.
Selecttoggles open/closed state on the focused dropdown.- While open,
UpandDowncycle selection. Backcloses the focused open dropdown before emitting a global back event.- Opening and closing emit
OpenedandClosedevents respectively.
Selectemits the standard activation path (Pressed,Clicked,Activate) for the focused widget.- Two
Selectactivations on the same focused widget within the configured double-select window emitDoubleClickedafter the second activation. - If the double-select window expires, the next
Selectstarts a new click sequence.
- Widgets can opt into raw key semantics via per-widget key input policy.
- With
raw_selectenabled:SelectPressedemitsPressedwithout immediate activation.SelectReleasedemitsReleased, then runs the standard select activation path.
- With
raw_backenabled:BackPressedemitsPressed.BackReleasedemitsReleased, then runs normal back behavior (including dropdown close-on-back).
- Widgets can override
SelectandBackkey behavior independently. - Each key supports:
Default: preserve normal behaviorIgnore: consume key without actionActivate: run focused activation pathBack: run back action path
- Backspace/delete and insertion mutations emit
TextInputandValueChanged. - No-op edit attempts do not emit mutation events.
- Example: backspace at cursor 0 with no selection.
- Example: delete-forward at end of text with no selection.
- Selection replacement semantics apply before insertion and deletion.
- Read-only textareas ignore mutation requests.
Render-time visual state selection uses this priority:
Pressedwhen a pointer press is actively held on a widget.Focusedwhen the widget currently owns focus.Disabledwhen the widget or an ancestor is disabled.Normalotherwise.