* fix(web): style Resources accordion native scrollbars to match Mantine (#1466) The per-section accordion panels (from #1462) scroll with a native scrollbar, which looked inconsistent with the Mantine ScrollArea used elsewhere. Style it to match: thin, rounded, translucent thumb on a transparent track, via a new `--inspector-scrollbar-thumb` token (rgba(0,0,0,.4) light / rgba(255,255,255,.4) dark, mirroring Mantine's thumb), `scrollbar-width: thin` + `scrollbar-color` (Firefox) and `::-webkit-scrollbar` rules (Chromium/WebKit). A Mantine ScrollArea *component* can't be used here: its viewport has no intrinsic height, which would collapse the panel's content-based flex-basis that #1462's per-section sizing depends on (the sections would stop sizing to their content). Documented inline. Verified in a real browser that the per-section sizing/pinned-headers behavior is unchanged and the scrollbar is now thin + themed in both color schemes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(web): assert themed scrollbar-color on the accordion panel (#1473 review) Guard the per-section scrollbar's themed thumb against regressions, per review — `scrollbar-color` resolves to an rgba value (the --inspector-scrollbar-thumb token) vs a transparent track. WebKit pseudo-element styles aren't queryable, so this is the assertable proxy. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
d525fc9f54
commit
bef8b84ee8
2 changed files with 42 additions and 2 deletions
|
|
@ -36,6 +36,11 @@
|
||||||
--inspector-border-default: var(--mantine-color-default-border);
|
--inspector-border-default: var(--mantine-color-default-border);
|
||||||
--inspector-border-subtle: var(--mantine-color-gray-3);
|
--inspector-border-subtle: var(--mantine-color-gray-3);
|
||||||
|
|
||||||
|
/* ── Scrollbar ─────────────────────────────────────────── */
|
||||||
|
/* Matches Mantine ScrollArea's thumb so native scrollbars (used where a
|
||||||
|
ScrollArea would break flex sizing, e.g. the Resources accordion) blend in. */
|
||||||
|
--inspector-scrollbar-thumb: rgba(0, 0, 0, 0.4);
|
||||||
|
|
||||||
/* ── Connection status ─────────────────────────────────── */
|
/* ── Connection status ─────────────────────────────────── */
|
||||||
--inspector-status-connected: var(--mantine-color-green-6);
|
--inspector-status-connected: var(--mantine-color-green-6);
|
||||||
--inspector-status-connecting: var(--mantine-color-yellow-6);
|
--inspector-status-connecting: var(--mantine-color-yellow-6);
|
||||||
|
|
@ -73,6 +78,7 @@
|
||||||
--inspector-surface-code: var(--mantine-color-dark-9);
|
--inspector-surface-code: var(--mantine-color-dark-9);
|
||||||
--inspector-border-subtle: var(--mantine-color-gray-4);
|
--inspector-border-subtle: var(--mantine-color-gray-4);
|
||||||
--inspector-input-background: var(--mantine-color-dark-9);
|
--inspector-input-background: var(--mantine-color-dark-9);
|
||||||
|
--inspector-scrollbar-thumb: rgba(255, 255, 255, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Animations ──────────────────────────────────────────── */
|
/* ── Animations ──────────────────────────────────────────── */
|
||||||
|
|
@ -212,7 +218,13 @@
|
||||||
* (set in ResourceControls) hands space from long sections to short ones. With
|
* (set in ResourceControls) hands space from long sections to short ones. With
|
||||||
* `flex-grow: 0`, nothing expands or scrolls until the combined content
|
* `flex-grow: 0`, nothing expands or scrolls until the combined content
|
||||||
* overflows the panel, so sections never scroll while the panel has free space
|
* overflows the panel, so sections never scroll while the panel has free space
|
||||||
* (issue #1462). Closed sections collapse to their header height. */
|
* (issue #1462). Closed sections collapse to their header height.
|
||||||
|
*
|
||||||
|
* The per-section scroll uses a NATIVE scrollbar, styled below to match
|
||||||
|
* Mantine's ScrollArea thumb (#1466). A Mantine `ScrollArea` component can't be
|
||||||
|
* used here: its viewport has no intrinsic height, which would collapse the
|
||||||
|
* panel's content-based `flex-basis` that the per-section sizing above depends
|
||||||
|
* on, so the sections would no longer size to their content. */
|
||||||
|
|
||||||
.disclosure-sections {
|
.disclosure-sections {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
@ -236,6 +248,27 @@
|
||||||
flex: 1 1 auto;
|
flex: 1 1 auto;
|
||||||
min-height: 0;
|
min-height: 0;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
scrollbar-width: thin;
|
||||||
|
scrollbar-color: var(--inspector-scrollbar-thumb) transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.disclosure-sections
|
||||||
|
> .mantine-Accordion-item[data-active]
|
||||||
|
.mantine-Accordion-panel::-webkit-scrollbar {
|
||||||
|
width: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.disclosure-sections
|
||||||
|
> .mantine-Accordion-item[data-active]
|
||||||
|
.mantine-Accordion-panel::-webkit-scrollbar-thumb {
|
||||||
|
background-color: var(--inspector-scrollbar-thumb);
|
||||||
|
border-radius: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.disclosure-sections
|
||||||
|
> .mantine-Accordion-item[data-active]
|
||||||
|
.mantine-Accordion-panel::-webkit-scrollbar-track {
|
||||||
|
background: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── List item hover ────────────────────────────────────── */
|
/* ── List item hover ────────────────────────────────────── */
|
||||||
|
|
|
||||||
|
|
@ -256,7 +256,8 @@ export const ManyResources: Story = {
|
||||||
expect(tops[0]).toBeLessThan(tops[1]);
|
expect(tops[0]).toBeLessThan(tops[1]);
|
||||||
expect(tops[1]).toBeLessThan(tops[2]);
|
expect(tops[1]).toBeLessThan(tops[2]);
|
||||||
|
|
||||||
// The long URIs section scrolls within its own panel.
|
// The long URIs section scrolls within its own panel, with a thin styled
|
||||||
|
// scrollbar matching the Mantine ScrollArea look (#1466).
|
||||||
const urisPanel = canvasElement.querySelector(
|
const urisPanel = canvasElement.querySelector(
|
||||||
".disclosure-sections .mantine-Accordion-panel",
|
".disclosure-sections .mantine-Accordion-panel",
|
||||||
);
|
);
|
||||||
|
|
@ -264,6 +265,12 @@ export const ManyResources: Story = {
|
||||||
throw new Error("URIs panel not found");
|
throw new Error("URIs panel not found");
|
||||||
}
|
}
|
||||||
expect(urisPanel.scrollHeight).toBeGreaterThan(urisPanel.clientHeight);
|
expect(urisPanel.scrollHeight).toBeGreaterThan(urisPanel.clientHeight);
|
||||||
|
const panelStyle = getComputedStyle(urisPanel);
|
||||||
|
expect(panelStyle.scrollbarWidth).toBe("thin");
|
||||||
|
// The themed translucent thumb resolves (the `--inspector-scrollbar-thumb`
|
||||||
|
// token, an rgba value, vs. a transparent track). WebKit pseudo-element
|
||||||
|
// styles aren't queryable, so `scrollbar-color` is the assertable proxy.
|
||||||
|
expect(panelStyle.scrollbarColor).toContain("rgba");
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue