Describe the bug
In the alert detail side panel, the Timeline section is clipped to 500px but cannot be scrolled with the mouse wheel or trackpad, so entries below the fold are unreachable. On my instance 658px out of 1158px of timeline content was hidden.
The container itself is fine: setting scrollTop programmatically works and sticks. The problem is that the wheel gesture never reaches it.
Root cause
react-chrono renders a large number of nested scroll containers (overflow: auto / overflow: hidden) that have zero scroll extent — including TimelineContentDetailsWrapper, which is the element directly under the cursor. Chrome latches the wheel gesture onto the nearest scroll container from the hit test; since that container and everything above it up to the card have no scrollable extent, the gesture is consumed and never chains to the tremor-Card-root that actually has the 658px of extent.
Measurements taken on a live instance (Chrome DevTools + scripted wheel events):
card.scrollTop = 300 → sticks (still 300 after 150ms and after 1.65s), so the card is scrollable
- Card computed style:
max-height: 500px, overflow-y: auto; content height 1158px → 658px hidden
- Real wheel over the Timeline: the event is delivered (
deltaY: 300) but with cancelable: false, and no element in the document emits a scroll event
- No
preventDefault() anywhere in the ancestor chain (defaultPrevented: false at every level)
scrollIntoView and scrollTo patched on Element.prototype: never called
- Element under the cursor:
TimelineContentDetailsWrapper, overflow-y: auto, real max scroll extent 0. Roughly 428 such zero-extent scroll containers exist inside the card
- Wheel with the cursor outside the chrono subtree (e.g. over
Description) scrolls the side panel normally to its full extent (728px)
Confirmed by inverting it: forcing overflow: visible on those wrappers makes wheel scrolling work immediately (scrollTop observed going 0 → 400 → 658).
Note: removing max-h-[500px] from the Card alone does not fix it. I tested that — the card then grows to its full height and the side panel gains 2043px of scroll extent, but the gesture is still swallowed inside the react-chrono subtree.
To Reproduce
- Have an alert with enough timeline entries to exceed 500px of height (a handful of workflow enrichment entries is enough)
- Click the alert in the feed to open the detail side panel
- Put the cursor over the
Timeline area and scroll with a mouse wheel or trackpad
- Nothing scrolls; the entries below the fold cannot be reached
Expected behavior
Wheel/trackpad over the Timeline should scroll the timeline, or chain to the side panel.
Screenshots
Screen recording attached below.
Workaround
div[class*="TimelineContentDetailsWrapper"],
div[class*="TimelineMainWrapper"] { overflow: visible !important; }
Suggested fix
Give react-chrono a bounded height so that its own scroll container owns the overflow, instead of clipping it from the outside with the card's max-height. Alternatively, remove the zero-extent overflow from the chrono wrappers so the gesture can chain to the card.
Additional context
Secondary issue, only visible once scrolling works: the periodic alert refresh resets scrollTop to 0, so the reading position is lost mid-scroll.
Related: #4618 reports the same class of problem on the incident timeline (closed without a fix). Interestingly the bot reply there already pointed at the max-h-[500px] overflow-y-auto card, which matches what I measured.
Environment
- Keep 0.54.2, self-hosted on Kubernetes via the
keephq/keep Helm chart (chart version 0.1.96)
- Chrome on macOS
Describe the bug
In the alert detail side panel, the
Timelinesection is clipped to 500px but cannot be scrolled with the mouse wheel or trackpad, so entries below the fold are unreachable. On my instance 658px out of 1158px of timeline content was hidden.The container itself is fine: setting
scrollTopprogrammatically works and sticks. The problem is that the wheel gesture never reaches it.Root cause
react-chronorenders a large number of nested scroll containers (overflow: auto/overflow: hidden) that have zero scroll extent — includingTimelineContentDetailsWrapper, which is the element directly under the cursor. Chrome latches the wheel gesture onto the nearest scroll container from the hit test; since that container and everything above it up to the card have no scrollable extent, the gesture is consumed and never chains to thetremor-Card-rootthat actually has the 658px of extent.Measurements taken on a live instance (Chrome DevTools + scripted wheel events):
card.scrollTop = 300→ sticks (still 300 after 150ms and after 1.65s), so the card is scrollablemax-height: 500px,overflow-y: auto; content height 1158px → 658px hiddendeltaY: 300) but withcancelable: false, and no element in the document emits ascrolleventpreventDefault()anywhere in the ancestor chain (defaultPrevented: falseat every level)scrollIntoViewandscrollTopatched onElement.prototype: never calledTimelineContentDetailsWrapper,overflow-y: auto, real max scroll extent0. Roughly 428 such zero-extent scroll containers exist inside the cardDescription) scrolls the side panel normally to its full extent (728px)Confirmed by inverting it: forcing
overflow: visibleon those wrappers makes wheel scrolling work immediately (scrollTopobserved going 0 → 400 → 658).Note: removing
max-h-[500px]from theCardalone does not fix it. I tested that — the card then grows to its full height and the side panel gains 2043px of scroll extent, but the gesture is still swallowed inside thereact-chronosubtree.To Reproduce
Timelinearea and scroll with a mouse wheel or trackpadExpected behavior
Wheel/trackpad over the Timeline should scroll the timeline, or chain to the side panel.
Screenshots
Screen recording attached below.
Workaround
Suggested fix
Give
react-chronoa bounded height so that its own scroll container owns the overflow, instead of clipping it from the outside with the card'smax-height. Alternatively, remove the zero-extentoverflowfrom the chrono wrappers so the gesture can chain to the card.Additional context
Secondary issue, only visible once scrolling works: the periodic alert refresh resets
scrollTopto 0, so the reading position is lost mid-scroll.Related: #4618 reports the same class of problem on the incident timeline (closed without a fix). Interestingly the bot reply there already pointed at the
max-h-[500px] overflow-y-autocard, which matches what I measured.Environment
keephq/keepHelm chart (chart version0.1.96)