authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-09-22 12:22:17-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-22 12:22:17-07:00
log016cdb9622359967afe80a27c538056ef1e7b857
tree64f034f4220057fe0548556890bb04f5360f62ac
parentda89e102f80b7ef6c8166d41cc202035f6ad75a4
signature Signed by PGP key B5690EEEBB952194

refactor(web): stacked sidebar groups share one inset (#13037)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

5 files changed, 13 insertions(+), 11 deletions(-)

apps/web/src/components/LegacySidebar.tsx+4-5
......@@ -2673,7 +2673,7 @@ function LocalSecondaryStatus() {
26732673 }
26742674
26752675 return (
2676 <SidebarGroup className="px-2 pt-2 pb-0">
2676 <SidebarGroup>
26772677 {connecting.length > 0 ? (
26782678 <Alert
26792679 variant="default"
......@@ -2966,11 +2966,10 @@ const SidebarProjectsContent = memo(function SidebarProjectsContent(
29662966
29672967 return (
29682968 <SidebarContent
2969 className="gap-0"
29702969 fixedHeader={
29712970 // Lifted above the stage backdrop, whose fade bleeds below the
29722971 // header and would otherwise paint across the search row's outline.
2973 <SidebarGroup className="relative z-[1] px-2 pt-2 pb-1">
2972 <SidebarGroup className="z-[1]">
29742973 <SidebarMenu>
29752974 <SidebarMenuItem>
29762975 <CommandDialogTrigger
......@@ -2995,7 +2994,7 @@ const SidebarProjectsContent = memo(function SidebarProjectsContent(
29952994 }
29962995 >
29972996 {showArm64IntelBuildWarning && arm64IntelBuildWarningDescription ? (
2998 <SidebarGroup className="px-2 pt-2 pb-0">
2997 <SidebarGroup>
29992998 <Alert variant="warning" className="rounded-2xl border-warning/40 bg-warning/8">
30002999 <TriangleAlertIcon />
30013000 <AlertTitle>Intel build on Apple Silicon</AlertTitle>
......@@ -3018,7 +3017,7 @@ const SidebarProjectsContent = memo(function SidebarProjectsContent(
30183017 </SidebarGroup>
30193018 ) : null}
30203019 <LocalSecondaryStatus />
3021 <SidebarGroup className="px-2 py-2">
3020 <SidebarGroup>
30223021 <div className="mb-1 flex items-center justify-between pl-2 pr-1.5">
30233022 <span className="text-xs font-medium text-sidebar-muted-foreground/80">Projects</span>
30243023 <div className="flex items-center gap-1">
apps/web/src/components/Sidebar.tsx+3-3
......@@ -4391,11 +4391,11 @@ export default function Sidebar() {
43914391 <>
43924392 <SidebarChromeHeader isElectron={isElectron} />
43934393 <SidebarContent
4394 className="gap-0 min-h-full"
4394 className="min-h-full"
43954395 fixedHeader={
43964396 // Lifted above the stage backdrop, whose fade bleeds below the
43974397 // header and would otherwise paint across the search row's outline.
4398 <SidebarGroup className="relative z-[1] p-[var(--sidebar-content-inset)] pt-1">
4398 <SidebarGroup className="z-[1]">
43994399 <SidebarThreadHeader
44004400 searchFieldRef={headerSearchRef}
44014401 hasProjects={projectGroups.length > 0}
......@@ -4554,7 +4554,7 @@ export default function Sidebar() {
45544554 </SidebarGroup>
45554555 }
45564556 >
4557 <SidebarGroup className="ps-[calc(var(--sidebar-content-inset)+1px)] pe-[var(--sidebar-content-inset)] pb-1 pt-0 flex-1">
4557 <SidebarGroup className="flex-1 ps-[calc(var(--sidebar-content-inset)+1px)]">
45584558 {isSearchingThreads ? (
45594559 threadSearchResults.length > 0 ? (
45604560 <TooltipProvider
apps/web/src/components/settings/SettingsSidebarNav.tsx+1-1
......@@ -234,7 +234,7 @@ export function SettingsSidebarNav({ pathname }: { pathname: string }) {
234234 return (
235235 <>
236236 <SidebarContent className="overflow-x-hidden">
237 <SidebarGroup className="gap-2 p-[var(--sidebar-content-inset)]">
237 <SidebarGroup className="gap-2">
238238 <div className="flex h-8 items-center gap-2 rounded-md px-2 py-1.5 text-sm font-medium text-sidebar-muted-foreground hover:bg-sidebar-row-hover hover:text-sidebar-foreground">
239239 <SearchIcon className="size-4 shrink-0 text-sidebar-muted-foreground/80" />
240240 <SidebarInput
apps/web/src/components/ui/sidebar.tsx+4-1
......@@ -602,7 +602,10 @@ function SidebarContent({
602602 <div
603603 // Reordered rows must not pull the viewport to their new position.
604604 className={cn(
605 "flex w-full min-w-0 flex-col gap-2 [overflow-anchor:none] group-data-[collapsible=icon]:overflow-hidden",
605 // Stacked groups share one inset between them instead of doubling
606 // it, including across the fixed header's boundary.
607 "flex w-full min-w-0 flex-col [overflow-anchor:none] group-data-[collapsible=icon]:overflow-hidden [&>[data-sidebar=group]+[data-sidebar=group]]:pt-0",
608 fixedHeader && "[&>[data-sidebar=group]:first-child]:pt-0",
606609 className,
607610 )}
608611 data-sidebar="content"
scripts/lint-restyle-ceiling.ts+1-1
......@@ -8,7 +8,7 @@ import * as NodeURL from "node:url";
88// components/ui exports are migrated to variants (see vite.config.ts). This gate keeps the
99// count from growing: CI fails when findings exceed the ceiling. Lower the ceiling when you
1010// migrate a file, and delete this script when the rule becomes an error.
11export const RESTYLE_CEILING = 812;
11export const RESTYLE_CEILING = 793;
1212
1313const RULE = "shadcn(no-restyle)";
1414