From 6a1528a900ee9ec19ffb341136cc3ab6e80b51df Mon Sep 17 00:00:00 2001 From: noah Date: Tue, 28 Jul 2026 09:38:10 -0400 Subject: [PATCH 1/2] docs(fork): apply review nits from the PR 26/28/29 review pass - fork-sidebar-chrome intent: the gutter giveback paragraph still described the retired token-reading mechanism (--app-scrollbar-width) that the very next paragraph contradicts; it now names the measured --sidebar-list-gutter. - index.css watch comment in the same entry: same stale mechanism; reworded to the real coupling (the token sizes ::-webkit-scrollbar, which sets the gutter useScrollGutterWidth measures). - fork-composer-shell watch comment on ComposerPromptEditor.tsx: now names the max-h-50 / overflow-y-auto scrollport seam the fork moves to the prompt wrapper, so a syncer knows to look at it. - forkSidebarChrome guard: drop the dead negative assertion pinning a spelling that never existed in any revision; the positive measurement assertions above it carry the guard. Co-Authored-By: Claude Fable 5 --- .fork/customizations.yaml | 17 ++++++++++------- .../__fork_guards__/forkSidebarChrome.test.ts | 1 - 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/.fork/customizations.yaml b/.fork/customizations.yaml index 417742ef8faf..29c46bd12b57 100644 --- a/.fork/customizations.yaml +++ b/.fork/customizations.yaml @@ -611,8 +611,9 @@ it shares with these rows spends 8px of air on the left and 8+6 on the right: every card sits visibly off-centre in its own column, and the chrome rows above end 6px past where the cards do. The list's end padding gives - that 6px back — reading --app-scrollbar-width rather than restating 6px, so - the symmetry follows upstream if the scrollbar is ever retuned. The gutter + that 6px back — subtracting the measured --sidebar-list-gutter rather than + restating 6px, so the symmetry follows whatever gutter the browser actually + reserves if the scrollbar is ever retuned. The gutter itself stays: the scrollbar keeps its lane, the cards are 8px from both edges, and the compensation is meaningless without the gutter that causes it, so the two must move together. @@ -682,9 +683,10 @@ - apps/web/src/components/SidebarStageBackdrop.test.tsx - apps/web/src/components/SidebarV2.tsx - apps/web/src/components/sidebar/SidebarChrome.tsx - # Defines --app-scrollbar-width, which the thread list's end padding reads - # to cancel its own scroll gutter. Retiring or renaming that token silently - # returns the list to 8px of air on one side and 14px on the other. + # Sizes ::-webkit-scrollbar from --app-scrollbar-width, which sets the + # gutter useScrollGutterWidth measures for the thread list's end padding. + # Retuning the token moves the measured giveback in step; that is the + # coupling to re-check when this file's scrollbar styling changes. - apps/web/src/index.css verify: - apps/web/src/__fork_guards__/forkSidebarChrome.test.ts @@ -1021,8 +1023,9 @@ # customization switches off. An upstream rework of that paint would leave # the fork disabling rules that no longer exist. - apps/web/src/index.css - # min-h-17.5 on the prompt editor, and the placeholder that has to track the - # prompt's type ramp. + # min-h-17.5 on the prompt editor, the placeholder that has to track the + # prompt's type ramp, and the max-h-50 / overflow-y-auto editor scrollport + # that the fork moves onto the prompt wrapper at >=40rem. - apps/web/src/components/ComposerPromptEditor.tsx verify: - apps/web/src/__fork_guards__/forkComposerShell.test.ts diff --git a/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts b/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts index 7edc5687cc5e..4bf4466f2e17 100644 --- a/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts +++ b/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts @@ -182,7 +182,6 @@ describe("fork guard: fork-sidebar-chrome", () => { const gutter = readSibling("../custom/useScrollGutterWidth.ts"); expect(gutter).toContain("offsetWidth - node.clientWidth"); expect(sidebarV2).toContain("ref={listScrollGutterRef}"); - expect(sidebarV2).not.toContain("calc(0.5rem-var(--app-scrollbar-width))"); }); it("puts the brand on the header's trailing edge", () => { From 984152c292a1c641e323740861c9510a77bca112 Mon Sep 17 00:00:00 2001 From: noah Date: Tue, 28 Jul 2026 11:01:33 -0400 Subject: [PATCH 2/2] =?UTF-8?q?docs(fork):=20address=20review=20=E2=80=94?= =?UTF-8?q?=20restore=20the=20gutter=20negative=20as=20a=20bounded=20regex?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The deleted assertion was not dead: pe-[calc(0.5rem-var(--app-scrollbar-width))] was this file's own giveback before 56954bc8 replaced it with the measured gutter, making it the likeliest content a revert or wrong-side conflict resolution puts back. Restored generalized — not.toMatch(/pe-\[[^\]]*--app-scrollbar-width/u) — which also catches the keep-both-terms merge outcome and re-spellings the exact literal missed, and the comment above it names the real history instead of the wrong file's justification. Also taken from the review: - intent ¶1 states the geometry only; the mechanism belongs to ¶2, which earns it (and the paragraph is reflowed) - the index.css watch comment names the actual failure (the ::-webkit-scrollbar rule disappearing or gaining scrollbar-width handling) instead of the retune non-event - the composer watch comment says the cap is re-homed by overriding; the max-h-50 classes themselves stay on the editor Co-Authored-By: Claude Fable 5 --- .fork/customizations.yaml | 24 +++++++++---------- .../__fork_guards__/forkSidebarChrome.test.ts | 10 ++++++++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/.fork/customizations.yaml b/.fork/customizations.yaml index 29c46bd12b57..914a2fe8df11 100644 --- a/.fork/customizations.yaml +++ b/.fork/customizations.yaml @@ -611,12 +611,9 @@ it shares with these rows spends 8px of air on the left and 8+6 on the right: every card sits visibly off-centre in its own column, and the chrome rows above end 6px past where the cards do. The list's end padding gives - that 6px back — subtracting the measured --sidebar-list-gutter rather than - restating 6px, so the symmetry follows whatever gutter the browser actually - reserves if the scrollbar is ever retuned. The gutter - itself stays: the scrollbar keeps its lane, the cards are 8px from both - edges, and the compensation is meaningless without the gutter that causes - it, so the two must move together. + that 6px back. The gutter itself stays: the scrollbar keeps its lane, the + cards are 8px from both edges, and the compensation is meaningless without + the gutter that causes it, so the two must move together. The width given back is measured, not assumed. --app-scrollbar-width is only true where ::-webkit-scrollbar applies: Firefox sets no scrollbar-width, so @@ -683,10 +680,12 @@ - apps/web/src/components/SidebarStageBackdrop.test.tsx - apps/web/src/components/SidebarV2.tsx - apps/web/src/components/sidebar/SidebarChrome.tsx - # Sizes ::-webkit-scrollbar from --app-scrollbar-width, which sets the - # gutter useScrollGutterWidth measures for the thread list's end padding. - # Retuning the token moves the measured giveback in step; that is the - # coupling to re-check when this file's scrollbar styling changes. + # Styles ::-webkit-scrollbar { width: var(--app-scrollbar-width) }, which + # is what makes the thread list's reserved lane a styled 6px at all — and + # what the intent's cross-engine argument is anchored to. A retune the + # measurement absorbs; the failure is this rule disappearing or gaining + # scrollbar-width/appearance handling, which hands the lane to the UA + # default width the drawn 6px gutter does not assume. - apps/web/src/index.css verify: - apps/web/src/__fork_guards__/forkSidebarChrome.test.ts @@ -1024,8 +1023,9 @@ # the fork disabling rules that no longer exist. - apps/web/src/index.css # min-h-17.5 on the prompt editor, the placeholder that has to track the - # prompt's type ramp, and the max-h-50 / overflow-y-auto editor scrollport - # that the fork moves onto the prompt wrapper at >=40rem. + # prompt's type ramp, and the max-h-50 / overflow-y-auto cap the fork + # re-homes on the prompt wrapper at >=40rem by overriding — the classes + # themselves stay on the editor here. - apps/web/src/components/ComposerPromptEditor.tsx verify: - apps/web/src/__fork_guards__/forkComposerShell.test.ts diff --git a/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts b/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts index 4bf4466f2e17..a598dea175a6 100644 --- a/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts +++ b/apps/web/src/__fork_guards__/forkSidebarChrome.test.ts @@ -182,6 +182,16 @@ describe("fork guard: fork-sidebar-chrome", () => { const gutter = readSibling("../custom/useScrollGutterWidth.ts"); expect(gutter).toContain("offsetWidth - node.clientWidth"); expect(sidebarV2).toContain("ref={listScrollGutterRef}"); + // The token-based giveback is this file's own prior implementation — + // pe-[calc(0.5rem-var(--app-scrollbar-width))], replaced by the measured + // gutter in 56954bc8 — which makes it the likeliest thing a revert or a + // wrong-side conflict resolution puts back, including *alongside* the + // measured term, where the containment checks above stay green and the + // last pe-* wins. Bounded to a pe-* utility so prose about the token + // cannot trip it, and looser than the old exact literal so a re-spelling + // like pe-[calc(var(--sidebar-list-pad)-var(--app-scrollbar-width))] + // cannot sail past. + expect(sidebarV2).not.toMatch(/pe-\[[^\]]*--app-scrollbar-width/u); }); it("puts the brand on the header's trailing edge", () => {