@startuml skinparam backgroundColor #FFFFFF skinparam defaultFontName Arial skinparam defaultFontSize 14 skinparam shadowing false title Native input — one VM and one event dispatcher actor User participant TesseraApp as GUI participant "events::Client" as Client participant "API / worker" as Worker participant ReplSession as VM participant event_dispatch as Dispatch participant "refresh / publication" as Refresh User -> GUI : pointer press / release GUI -> GUI : published geometry; matching target GUI -> Client : Input(window, session, layout_version, mount) Client -> Worker : POST /events Worker -> Worker : reject stale source/destination identities Worker -> VM : dispatch_incremental VM -> Dispatch : target Block + optional Mount Dispatch -> Dispatch : capture -> target -> bubble Dispatch -> VM : budgeted handler / onEvent / onClick VM -> Refresh : update related presentations Refresh --> GUI : Frame / DocumentUpdated note over Dispatch Without a Mount, dispatch visits only the target. With a Mount, traversal follows that occurrence. end note @enduml