Skip to content

Move New thread onto the sticky project header (T3 compose pattern) #439

Closed

Description

@currentbits

Problem

Per-project New thread sits under the thread cards (Sidebar.tsx renderGroupCreateActions, after visibleAttention / archived). With a long group you have to scroll past every card to find it. The 11px --text-dim label (Sidebar.module.css .groupNewThread) also disappears into the list.

The sidebar already has a sticky project header (.groupHeaderRow { position: sticky; top: 0 }) and a global + in the brand row (.headerAdd). Neither is where T3 puts compose.

What T3 Code actually does

Read from pingdotgg/t3code main (2026-08-18), not from memory. No T3 code is vendored here; this is the placement model.

Sidebar V2 (current desktop) — apps/web/src/components/Sidebar.tsx

Compose lives in SidebarContent fixedHeader, next to Search, as a SquarePenIcon button. It never scrolls with the list.

  • 1 project, or Shift+click: create immediately in the current project (shouldCreateNewThreadInCurrentProject in Sidebar.logic.ts).
  • Several projects: click opens the command palette on New thread in... (openCommandPalette({ open: "new-thread-in" })).
  • Shortcuts (packages/shared/src/keybindings.ts): mod+n / mod+shift+o → chat.new (picker when multi-project); mod+shift+n → chat.newLocal (current project, no picker).
  • V2 has no per-project New thread under the cards. Project targeting is the filter row + picker.

Legacy sidebar — apps/web/src/components/LegacySidebar.tsx

SquarePen sits on the project header, hover-revealed (environment badge crossfades with it). Still not under the cards. data-testid="new-thread-button".

Chat header — apps/web/src/components/chat/ChatHeader.tsx

The project breadcrumb is "New thread in {project}". Always on screen while a thread is open.

Command palette — apps/web/src/components/CommandPalette.tsx

Two entries: New thread in {active project} and submenu New thread in... (every project). Current project is sorted first.

Drafts — Sidebar.tsx SidebarDraftBlock

Unsent drafts with content sit above pinned threads so an interrupted new thread stays one click away. Separate from the create button, but it is how T3 keeps new work visible in a long list.

Create semantics (do not copy blindly)

chatThreadActions.ts: a new thread inherits project + model/mode. Branch, worktree, and env mode come from configured defaults, not from the viewed thread. Explicit "new thread in this worktree" is a branch-toolbar action.

Recommended Solenta change

Smallest fix that matches the complaint (hard to see when there are many threads):

  1. Move renderGroupCreateActions onto the sticky .groupHeaderRow (always visible, not hover-only — the user already cannot see the control). Keep the caret (worktree / orchestrator / plain) and the issue button.
  2. Leave the empty-group placement as-is (already next to "No threads yet").
  3. Keep the global brand + as the "new thread in the selected / last project" path. Optional follow-up: multi-project click opens a tiny project picker (T3 V2), Shift+click stays current project.
  4. Do not add a command-palette new-thread-in flow or a drafts shelf in this issue.

Files

  • src/components/Sidebar.tsx — renderGroupCreateActions call sites (~2696 empty, ~2808 after cards)
  • src/components/Sidebar.module.css — .groupHeaderRow, .groupNewThread, .headerAdd
  • Tests: test/sidebarWorktreeCreate.test.tsx (queries .groupNewThread)

Out of scope

  • Worktree / orchestrator create semantics
  • T3 draft rows, command palette, mod+n
  • Vendoring any T3 source

Activity

  1. currentbits commented on Aug 18, 2026

    @currentbits
    OwnerAuthor

    Follow-ups from the same T3 compose research (not part of this issue):

    This issue stays the visibility fix: move per-group New thread onto the sticky .groupHeaderRow.

  2. added and removed on Oct 9, 2026
  3. currentbits commented on Oct 9, 2026

    @currentbits
    OwnerAuthor

    Obsolete: the sidebar was rewritten (011a629). Compose is now the fixed header button aimed at the selected project. Closing in the 2026-10-09 board cleanup (#1532).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions