diff --git a/site/src/components/ScrollArea/ScrollArea.stories.tsx b/site/src/components/ScrollArea/ScrollArea.stories.tsx
index 44e82a14d7..2546719e8f 100644
--- a/site/src/components/ScrollArea/ScrollArea.stories.tsx
+++ b/site/src/components/ScrollArea/ScrollArea.stories.tsx
@@ -104,3 +104,74 @@ export const Accessibility: Story = {
).toBeGreaterThanOrEqual(3);
},
};
+
+// type="always" forces the thumb to render so its `::before` hit-target
+// pseudo-element is measurable.
+export const ThumbHitAreaOverride: Story = {
+ render: () => (
+
+ ),
+ play: async ({ canvasElement }) => {
+ const getThumb = (
+ testid: string,
+ orientation: "vertical" | "horizontal",
+ ) => {
+ const area = canvasElement.querySelector(`[data-testid='${testid}']`);
+ return area?.querySelector(`[data-orientation="${orientation}"]`)
+ ?.firstElementChild as HTMLElement | null | undefined;
+ };
+
+ await waitFor(() => {
+ expect(getThumb("default-area", "vertical")).toBeTruthy();
+ expect(getThumb("override-area", "vertical")).toBeTruthy();
+ expect(getThumb("override-area", "horizontal")).toBeTruthy();
+ });
+
+ const defaultThumb = getThumb("default-area", "vertical");
+ const overrideThumb = getThumb("override-area", "vertical");
+ const overrideHorizontalThumb = getThumb("override-area", "horizontal");
+ if (!defaultThumb || !overrideThumb || !overrideHorizontalThumb) {
+ throw new Error("scrollbar thumbs not found");
+ }
+
+ const defaultBefore = getComputedStyle(defaultThumb, "::before");
+ await expect(defaultBefore.display).not.toBe("none");
+ await expect(Number.parseFloat(defaultBefore.width)).toBeGreaterThanOrEqual(
+ 24,
+ );
+
+ await expect(getComputedStyle(overrideThumb, "::before").display).toBe(
+ "none",
+ );
+ await expect(
+ getComputedStyle(overrideHorizontalThumb, "::before").display,
+ ).toBe("none");
+ await expect(overrideThumb.getBoundingClientRect().width).toBeGreaterThan(
+ 0,
+ );
+ },
+};
diff --git a/site/src/components/ScrollArea/ScrollArea.tsx b/site/src/components/ScrollArea/ScrollArea.tsx
index c20fabd541..dbb0721a19 100644
--- a/site/src/components/ScrollArea/ScrollArea.tsx
+++ b/site/src/components/ScrollArea/ScrollArea.tsx
@@ -10,6 +10,8 @@ interface ScrollAreaProps
extends React.ComponentPropsWithRef {
scrollBarClassName?: string;
horizontalScrollBarClassName?: string;
+ /** Extra thumb classes; also reaches the thumb's `::before` hit-target. */
+ scrollThumbClassName?: string;
viewportClassName?: string;
viewportTabIndex?: number;
/** Which scrollbar(s) to show. Defaults to "vertical". */
@@ -20,6 +22,7 @@ export const ScrollArea: React.FC = ({
className,
scrollBarClassName,
horizontalScrollBarClassName,
+ scrollThumbClassName,
viewportClassName,
viewportTabIndex,
orientation = "vertical",
@@ -61,6 +64,7 @@ export const ScrollArea: React.FC = ({
)}
{(orientation === "horizontal" || orientation === "both") && (
@@ -72,6 +76,7 @@ export const ScrollArea: React.FC = ({
? horizontalScrollBarClassName
: (horizontalScrollBarClassName ?? scrollBarClassName),
)}
+ thumbClassName={scrollThumbClassName}
/>
)}
@@ -80,8 +85,12 @@ export const ScrollArea: React.FC = ({
};
export const ScrollBar: React.FC<
- React.ComponentPropsWithRef
-> = ({ className, orientation = "vertical", ...props }) => {
+ React.ComponentPropsWithRef<
+ typeof ScrollAreaPrimitive.ScrollAreaScrollbar
+ > & {
+ thumbClassName?: string;
+ }
+> = ({ className, orientation = "vertical", thumbClassName, ...props }) => {
return (
diff --git a/site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx b/site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
index 8bdadc5a44..2eb4b4d1da 100644
--- a/site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
+++ b/site/src/pages/AgentsPage/components/ChatsSidebar/chats/ChatsPanel.tsx
@@ -447,6 +447,10 @@ export const ChatsPanel: FC = ({