Kaanixir
06/08/2026, 4:36 AMCanvas vs HTML DOMKonstantin Tskhovrebov
06/08/2026, 7:20 AMKaanixir
06/08/2026, 7:38 AMKaanixir
06/08/2026, 7:49 AMLazyColumn
I'm testing if background image I'm displaying could be causing this scroll/fling velocity cap to the scrolling , I'll also test moving scroll to .bodyKaanixir
06/08/2026, 8:35 AMWheelEvent.deltaY * modeScale * gain -> external Compose state -> LazyListState.scrollBy(delta)
This strongly suggests the fix belongs in the Compose/Wasm scroll input pipeline rather than in app layout/rendering. Heavy content can amplify bad feel, but it was not the root cause of the capped max velocity.
// wasm entrypoint
var wheelScrollPx by remember { mutableStateOf(0f) }
DisposableEffect(Unit) {
val target = document.getElementById("dashboard") ?: document
val listener = { event: Event ->
val wheel = event as? WheelEvent
if (wheel != null && !wheel.ctrlKey) {
event.preventDefault()
event.stopPropagation()
val modeScale = when (wheel.deltaMode.toInt()) {
1 -> 16.0
2 -> window.innerHeight.toDouble()
else -> 1.0
}
wheelScrollPx += (wheel.deltaY * modeScale * 1.35).toFloat()
}
}
target.addEventListener("wheel", listener, true)
onDispose { target.removeEventListener("wheel", listener, true) }
}
DashboardApp(externalScrollPx = wheelScrollPx)
// shared dashboard root
fun DashboardApp(externalScrollPx: Float = 0f) {
var handledExternalScrollPx by remember { mutableStateOf(externalScrollPx) }
val listState = rememberLazyListState()
LaunchedEffect(externalScrollPx) {
val delta = externalScrollPx - handledExternalScrollPx
handledExternalScrollPx = externalScrollPx
if (delta != 0f) listState.scrollBy(delta)
}
LazyColumn(state = listState) {
// dashboard content
}
}Konstantin Tskhovrebov
06/08/2026, 8:43 AMKaanixir
06/08/2026, 11:51 PMKaanixir
06/09/2026, 12:21 AMKaanixir
06/09/2026, 1:57 AMWheelEvent.DOM_DELTA_PIXEL events are treated as precise wheel input, so high-resolution Chrome/macOS trackpad deltas bypass the common mouse-wheel smoothing path instead of being capped
by the initial 6.dp threshold.
The regression failed before the patch with Expected <200>, actual <12> and now passes on both JS and Wasm browser targets.Konstantin Tskhovrebov
06/09/2026, 8:11 AMursus
06/14/2026, 2:29 PMursus
06/14/2026, 3:18 PM