From 887853d90e3c128028514e1c5e28014519795c1f Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Fri, 13 Mar 2026 16:39:29 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=A4=96=20fix:=20restyle=20section=20h?= =?UTF-8?q?eaders=20and=20rename=20section=20chat=20copy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/ProjectSidebar/ProjectSidebar.tsx | 2 +- .../components/SectionHeader/SectionHeader.tsx | 16 ++++++---------- .../stories/App.phoneViewports.stories.tsx | 2 +- tests/ui/chat/sections.test.ts | 4 +--- 4 files changed, 9 insertions(+), 15 deletions(-) diff --git a/src/browser/components/ProjectSidebar/ProjectSidebar.tsx b/src/browser/components/ProjectSidebar/ProjectSidebar.tsx index df48a5a3d1..7645337e23 100644 --- a/src/browser/components/ProjectSidebar/ProjectSidebar.tsx +++ b/src/browser/components/ProjectSidebar/ProjectSidebar.tsx @@ -1920,7 +1920,7 @@ const ProjectSidebarInner: React.FC = ({ ) ) : sectionDrafts.length === 0 ? (
- No workspaces in this section + No chats in this section
) : null} diff --git a/src/browser/components/SectionHeader/SectionHeader.tsx b/src/browser/components/SectionHeader/SectionHeader.tsx index 1833200948..2e9a738210 100644 --- a/src/browser/components/SectionHeader/SectionHeader.tsx +++ b/src/browser/components/SectionHeader/SectionHeader.tsx @@ -72,12 +72,7 @@ export const SectionHeader: React.FC = ({ return (
{/* Expand/Collapse Button */} @@ -116,7 +111,8 @@ export const SectionHeader: React.FC = ({
- {/* Add Workspace — always visible on touch devices */} + {/* Add Chat — always visible on touch devices */} - New workspace + New chat ); diff --git a/src/browser/stories/App.phoneViewports.stories.tsx b/src/browser/stories/App.phoneViewports.stories.tsx index 15504da0b1..0f54df180f 100644 --- a/src/browser/stories/App.phoneViewports.stories.tsx +++ b/src/browser/stories/App.phoneViewports.stories.tsx @@ -319,7 +319,7 @@ export const IPhone16eSidebarWithSections: AppStory = { // The actual visibility assertion (opacity via CSS media query) is // validated by the Chromatic snapshot in touch mode — the Storybook // test runner doesn't emulate pointer:coarse media queries. - within(sectionHeader as HTMLElement).getByLabelText("New workspace in section"); + within(sectionHeader as HTMLElement).getByLabelText("New chat in section"); }, { timeout: 10_000 } ); diff --git a/tests/ui/chat/sections.test.ts b/tests/ui/chat/sections.test.ts index 3ebe9533ea..f10ac65143 100644 --- a/tests/ui/chat/sections.test.ts +++ b/tests/ui/chat/sections.test.ts @@ -265,9 +265,7 @@ describeIntegration("Workspace Sections", () => { const sectionHeader = view.container.querySelector(`[data-section-id="${sectionId}"]`); expect(sectionHeader).not.toBeNull(); - const addButton = sectionHeader!.querySelector( - 'button[aria-label="New workspace in section"]' - ); + const addButton = sectionHeader!.querySelector('button[aria-label="New chat in section"]'); expect(addButton).not.toBeNull(); // Click the add button - this should navigate to create page with section context From c114a8e8486e2c9f17629687a5e0661874226bdd Mon Sep 17 00:00:00 2001 From: Jaayden Halko Date: Wed, 18 Mar 2026 21:54:18 +0700 Subject: [PATCH 2/3] chore: style updates --- .../AddSectionButton/AddSectionButton.tsx | 7 ++---- .../AgentListItem/AgentListItem.tsx | 25 ++++++++++++++----- .../ProjectSidebar/ProjectSidebar.tsx | 25 +++++++++++-------- .../SectionHeader/SectionHeader.tsx | 5 ++-- src/browser/styles/globals.css | 6 ++++- 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/browser/components/AddSectionButton/AddSectionButton.tsx b/src/browser/components/AddSectionButton/AddSectionButton.tsx index 0a8248027a..beff820652 100644 --- a/src/browser/components/AddSectionButton/AddSectionButton.tsx +++ b/src/browser/components/AddSectionButton/AddSectionButton.tsx @@ -28,10 +28,7 @@ export const AddSectionButton: React.FC = ({ onCreateSect if (isCreating) { return ( -
-
- -
+
= ({ onCreateSect }} placeholder="Section name..." data-testid="add-section-input" - className="bg-background/50 text-foreground min-w-0 flex-1 rounded border border-white/20 px-1.5 py-0.5 text-[11px] outline-none select-text" + className="bg-background/50 text-foreground ml-6 min-w-0 flex-1 rounded border border-white/20 px-1.5 py-0.5 text-[11px] outline-none select-text" />
); diff --git a/src/browser/components/AgentListItem/AgentListItem.tsx b/src/browser/components/AgentListItem/AgentListItem.tsx index a5b6fd7f7d..2718307494 100644 --- a/src/browser/components/AgentListItem/AgentListItem.tsx +++ b/src/browser/components/AgentListItem/AgentListItem.tsx @@ -74,6 +74,7 @@ interface AgentListItemBaseProps { projectPath: string; isSelected: boolean; depth?: number; + sectionId?: string; } /** Props for regular (persisted) workspace items */ @@ -122,7 +123,7 @@ const SHOW_INLINE_ACTIONS_ON_WIDE_TOUCH = /** Calculate left padding based on nesting depth */ function getItemPaddingLeft(depth?: number): number { const safeDepth = typeof depth === "number" && Number.isFinite(depth) ? Math.max(0, depth) : 0; - return 12 + Math.min(32, safeDepth) * 12; + return 8 + Math.min(32, safeDepth) * 12; } type VisualState = "active" | "idle" | "seen" | "hidden" | "error" | "question"; @@ -255,7 +256,7 @@ function ActionButtonWrapper(props: { children: React.ReactNode }) { return (
{/* Keep the kebab trigger aligned with the title row. */} @@ -269,9 +270,19 @@ function ActionButtonWrapper(props: { children: React.ReactNode }) { // ───────────────────────────────────────────────────────────────────────────── function DraftAgentListItemInner(props: DraftAgentListItemProps) { - const { projectPath, isSelected, depth, draft } = props; + const { projectPath, isSelected, depth, sectionId, draft } = props; const paddingLeft = getItemPaddingLeft(depth); const hasPromptPreview = draft.promptPreview.length > 0; + const draftBorderStyle: React.CSSProperties = { + backgroundImage: [ + "repeating-linear-gradient(to right, var(--color-border) 0 8px, transparent 8px 14px)", + "repeating-linear-gradient(to right, var(--color-border) 0 8px, transparent 8px 14px)", + "repeating-linear-gradient(to bottom, var(--color-border) 0 8px, transparent 8px 14px)", + ].join(", "), + backgroundSize: "100% 1.5px, 100% 1.5px, 1.5px 100%", + backgroundPosition: "left top, left bottom, left top", + backgroundRepeat: "no-repeat", + }; const ctxMenu = useContextMenuPosition({ longPress: true }); @@ -279,10 +290,11 @@ function DraftAgentListItemInner(props: DraftAgentListItemProps) {
{ if (ctxMenu.suppressClickIfLongPress()) return; draft.onOpen(); @@ -602,7 +614,7 @@ function RegularAgentListItemInner(props: AgentListItemProps) { !isSelected && visualState === "idle" ? "text-content-primary" : !isSelected && visualState === "seen" - ? "text-content-secondary" + ? "text-content-tertiary" : "text-content-primary"; const paddingLeft = getItemPaddingLeft(depth); @@ -640,6 +652,7 @@ function RegularAgentListItemInner(props: AgentListItemProps) { className={cn( LIST_ITEM_BASE_CLASSES, "group/row", + sectionId != null ? "ml-8" : "ml-6.5", isDragging && "opacity-50", isRemoving && "opacity-70", // Keep hover styles enabled for initializing workspaces so the row feels interactive. diff --git a/src/browser/components/ProjectSidebar/ProjectSidebar.tsx b/src/browser/components/ProjectSidebar/ProjectSidebar.tsx index bd6df93efb..8bfa6abc2e 100644 --- a/src/browser/components/ProjectSidebar/ProjectSidebar.tsx +++ b/src/browser/components/ProjectSidebar/ProjectSidebar.tsx @@ -259,6 +259,7 @@ interface DraftAgentListItemWrapperProps { draftId: string; draftNumber: number; isSelected: boolean; + sectionId?: string; onOpen: () => void; onDelete: () => void; } @@ -295,6 +296,7 @@ function DraftAgentListItemWrapper(props: DraftAgentListItemWrapperProps) { variant="draft" projectPath={props.projectPath} isSelected={props.isSelected} + sectionId={props.sectionId} draft={{ draftId: props.draftId, draftNumber: props.draftNumber, @@ -356,7 +358,7 @@ const ProjectDragLayer: React.FC = () => {
- +
{basename} @@ -1337,7 +1339,7 @@ const ProjectSidebarInner: React.FC = ({ className="flex-1 overflow-x-hidden overflow-y-auto" > {multiProjectWorkspaces.length > 0 && ( -
+
@@ -1574,8 +1574,12 @@ const ProjectSidebarInner: React.FC = ({ id={workspaceListId} role="region" aria-label={`Workspaces for ${projectName}`} - className="pt-1" + className="relative pt-1" > +