From 701516bc8ba2d4a8018a9ab0cdc50603ef03dfce Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alejandro=20Guti=C3=A9rrez?=
<35082514+alezmad@users.noreply.github.com>
Date: Sun, 5 Apr 2026 22:01:06 +0100
Subject: [PATCH] fix(web): mesh-stream wheel-scroll trap on landing page
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The demo-dashboard embedded MeshStream with a fixed min-h-[480px] grid
+ overflow-y-auto on the message
. Browsers capture every wheel
event that fires over a scrollable container — so hovering the demo
section froze page scroll until the user moved the cursor off.
Landing demo has only 6 messages, never needs internal scroll. The
fixed viewport only makes sense in the live dashboard where envelope
count can exceed the box.
Added `scrollable?: boolean` prop to MeshStream (default false).
- demo-dashboard (landing): no prop → intrinsic height, no overflow,
wheel events propagate to the page
- live-stream-panel (/dashboard/meshes/[id]/live): scrollable → keeps
the chat-style fixed viewport with scroll
Co-Authored-By: Claude Opus 4.6 (1M context)
---
.../modules/marketing/home/mesh-stream.tsx | 22 +++++++++++++++++--
.../src/modules/mesh/live-stream-panel.tsx | 1 +
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/apps/web/src/modules/marketing/home/mesh-stream.tsx b/apps/web/src/modules/marketing/home/mesh-stream.tsx
index 1a1e21b..55d0402 100644
--- a/apps/web/src/modules/marketing/home/mesh-stream.tsx
+++ b/apps/web/src/modules/marketing/home/mesh-stream.tsx
@@ -121,6 +121,13 @@ export interface MeshStreamProps {
emptyLabel?: string;
/** footer content (stats / progress bar / timers) */
footer?: React.ReactNode;
+ /**
+ * When true (live dashboard), the message list gets a fixed viewport
+ * with overflow-y-auto — standard chat UI. When false (landing demo),
+ * the list grows intrinsically so wheel events pass through to the
+ * page scroll instead of being captured by the list.
+ */
+ scrollable?: boolean;
}
export const MeshStream = ({
@@ -130,6 +137,7 @@ export const MeshStream = ({
peersHint,
emptyLabel = "Waiting for messages…",
footer,
+ scrollable = false,
}: MeshStreamProps) => {
const [focusedPeer, setFocusedPeer] = useState(null);
const [hoveredKey, setHoveredKey] = useState(null);
@@ -140,7 +148,12 @@ export const MeshStream = ({
: messages;
return (
-
+
-
+
{filtered.length === 0 && (
- {
channelLabel="live-stream"
emptyLabel={emptyLabel}
footer={footer}
+ scrollable
/>
);