Skip to content

Design refresh#1095

Open
cjroth wants to merge 28 commits into
mainfrom
design-refresh
Open

Design refresh#1095
cjroth wants to merge 28 commits into
mainfrom
design-refresh

Conversation

@cjroth

@cjroth cjroth commented Jul 17, 2026

Copy link
Copy Markdown
Member

No description provided.

cjroth and others added 14 commits July 16, 2026 18:46
Selective design-only port from the workspaces-rethink branch — no
functional changes (admin panel, team agents, migrations excluded).

- new warm off-white/slate palette and dark theme in index.css, with
  concentric border-radius scale documented in AGENTS.md
- restyled ui/ primitives (switch, select, dropdowns, popovers, inputs)
  and replaced hardcoded indigo accents with theme primary
- sidebar: drop logo/branding, group settings nav (Agents / What agents
  use / Account Settings), restyle back button
- agent dropdown: remove descriptions and Built-in/System/Custom group
  labels, compact rows, flush Add-agent footer, centered on mobile
- composer, message bubbles, chips, and settings pages restyled to the
  new surface colors and radius tiers
- remove borders from the mode and model selector triggers
- make paperclip, mode, model, and submit controls the exact same
  height (--touch-height-control) and nudge the ghost-button cluster
  so glyphs optically align with the composer edge
- lead the composer model selector with its chevron and shrink the
  mode icon to --icon-size-sm, mirroring the mode selector's layout
- hide the send button entirely until there is something to send
- replace the paperclip button with a "+" dropdown (Upload file) that can
  grow more attachment sources later
- move mode/model pickers to the footer's right cluster next to send, via
  a new footerEndElements slot on PromptInput
- always render the send button, disabled when empty, instead of hiding it
- rename "Pin a skill" to "Add a skill"; trigger stays clickable when all
  skills are pinned so the popover can offer New Skill (navigates to a
  blank create form via the '' deep link)
- drop the unused dimmed chip state and inherit DropdownMenu default
  styling in the chip menu

Co-authored-by: Cursor <cursoragent@cursor.com>
- host: false makes Node resolve "localhost" to a nondeterministic
  address family per listen() call, so a .env-triggered restart can flip
  between 127.0.0.1 and ::1 and leave the browser's address unbound

Co-authored-by: Cursor <cursoragent@cursor.com>
- the chip's right-click / long-press menu now reads as a normal menu on
  mobile instead of a modal takeover; the backdrop stays for the reorder
  panel, which is genuinely modal
- remove the SuggestionChip onOpenChange prop that existed only to drive
  the overlay

Co-authored-by: Cursor <cursoragent@cursor.com>
- override Tailwind's shadow-* tokens to ~two-thirds default opacity so
  popovers/menus/dialogs read as gently lifted rather than floating
- route the shadow color through --elevation-* variables because Tailwind
  v4 inlines theme token values at build time — a .dark { --shadow-lg }
  override would never be read
- dark mode raises the opacity (10/18/35%) so shadows still register on
  dark surfaces

Co-authored-by: Cursor <cursoragent@cursor.com>
- New SidebarNavToggle: icon-only segmented pill in the sidebar header,
  centered on the collapse button row; thumb slides via framer layoutId
- Collapsed rail gets a vertical pill variant plus hairline RailDividers
  between sections (labels are hidden there), with a uniform 8px rhythm
- Settings sidebar drops its Back button; chats toggle restores the last
  visited chat instead
- Remove "Search chats" and "Add a skill" hover tooltips (keep the
  pin-cap explanation on the disabled skill button)
- Make collapsed group labels pointer-events-none so their -mt-8 slide
  no longer blocks clicks on the button above

Co-authored-by: Cursor <cursoragent@cursor.com>
- e318e94 switched Tauri desktop to offcanvas collapse, losing the 48px
  icon rail; only mobile uses offcanvas again
- collapsed rail keeps the title-bar strip as a pure drag region that
  blends into the header background, with a curved top-right shoulder
  below the window controls so no seam crosses the traffic lights
- drop the header's redundant re-open button; nudge header content past
  the macOS traffic-light overhang while collapsed

Co-authored-by: Cursor <cursoragent@cursor.com>
- drop the anon+proxy gate (useAgentsSettingsHidden) and its redirect:
  the built-in agent is local-first and custom ACP agents work without a
  real account (iroh targets bypass the proxy entirely), so the page is
  never dead UI
- proxied WebSocket agents still fail honestly for anonymous users via
  the add dialog's connection test; the backend anon rejection for
  proxied WS upgrades is unchanged

Co-authored-by: Cursor <cursoragent@cursor.com>
- replace the settings-page theme picker with a single cycling icon
  button (light → dark → system) next to the sync status
- render the shared header on desktop settings screens so the theme
  and sync controls are always in the top-right
- switch ON state now uses a solid success-green track with a light
  thumb instead of the black-on-black primary look in light mode
- restore dark-mode logo inversion on agent catalog cards (lost in
  the catalog rewrite)
- match the Thunderbolt CLI card spacing to the agent list rhythm
- hide the collapsed-rail divider when there are no chats, drop the
  Expand Sidebar and Sync disabled tooltips, and clear the macOS
  traffic lights with more margin

Co-authored-by: Cursor <cursoragent@cursor.com>
- drop borders from the chat composer, skill chips, + button, error
  bubbles, and the mobile sidebar drawer
- add a subtle zero-offset glow shadow behind the composer (32px) and
  skill chips / + button (16px) so they lift off the page instead
- show the composer border only on focus (transparent otherwise, so no
  layout shift)
- lighten light-mode --color-sidebar to near-white for contrast against
  the page background
- widen the skills bar scrollport padding (cancelled by negative
  margins) so the chip glow isn't clipped by overflow-x-auto

Co-authored-by: Cursor <cursoragent@cursor.com>
- Remove the 3px ring halo from input/textarea focus states
- Lighten --color-ring in dark mode so the border swap stays visible

Co-authored-by: Cursor <cursoragent@cursor.com>
… page

- Relocate the device-local "Use Cloud Proxy" switch from Preferences to
  Developer Settings where the other transport/debug toggles live
- Replace the models page ButtonGroup with plain icon buttons and drop
  the redundant add/enable tooltips in favor of aria-labels
- Rename the "Account Settings" sidebar group to "Settings"

Co-authored-by: Cursor <cursoragent@cursor.com>
- Skills page adopts PageSearch: a search icon left of the create button
  expands/collapses the search input; drop the list/detail divider border
- PageSearch.Button accepts className + aria-label, PageSearch.Input
  accepts wrapperClassName so compact headers can reuse them
- Sidebar chats/settings toggle only swaps the sidebar content; the
  current page stays until the user picks an entry (Tasks still navigates)
- Settings layout keeps the universal header on desktop for routes with
  their own mobile chrome

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown

Semgrep Security Scan

No security issues found.

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown

Preview environment deployed 🚀

Service URL
Marketing / blog / docs https://thunderbolt-pr-1095.preview.thunderbolt.io
App https://app-pr-1095.preview.thunderbolt.io
API https://api-pr-1095.preview.thunderbolt.io
Keycloak https://auth-pr-1095.preview.thunderbolt.io
PowerSync https://powersync-pr-1095.preview.thunderbolt.io

Stack: preview-pr-1095 · Commit: d93ebed9af96553b6aca68f9fd096e21d140d136

Auto-destroys on PR close/merge. Login via the bundled Keycloak realm — demo@thunderbolt.io / demo by default.

@github-actions

github-actions Bot commented Jul 17, 2026

Copy link
Copy Markdown

PR Metrics

Metric Value
Lines changed (prod code) +2052 / -1974
JS bundle size (gzipped) 🟡 639.0 KB → 651.8 KB (+12.8 KB, +2.0%)
Test coverage 🟢 78.08% → 78.36% (+0.3%)
Performance (preview) Preview not ready — Render deploy may have timed out
Accessibility
Best Practices
SEO

Updated Fri, 17 Jul 2026 16:49:15 GMT · run #2331

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔭 thunder-deep-review (advisory)

Reviewed the diff — no issues to report. ✅ Never approves, never requests changes, never gates merge.
head: 6a57557b05b2 · mode: deep · deferred 0 item(s) already reported by other bots (best-effort dedup)

cjroth and others added 4 commits July 17, 2026 00:13
- Drop the feature-selling cards from the modal variant (page keeps them)
- Remove the desktop dialog's 550px min-height so the form doesn't float

Co-authored-by: Cursor <cursoragent@cursor.com>
- Nav toggle is back to a two-way Chats/Settings switch
- Tasks (feature-gated) now lives under New Chat in the chats sidebar
- Tint the chat search button while the search input is expanded

Co-authored-by: Cursor <cursoragent@cursor.com>
- New reusable SlideInPanel; skills detail/create/edit render in it on
  desktop instead of a fixed side-by-side column (list is now full-width)
- Move row actions to the panel: rows keep only the enable switch,
  detail menu drops Add to chat / enable toggle
- Empty-library state moves into the list with a create CTA
- PageSearch button: optional tooltip + active tint while open
- Tasks page: align header buttons, wider gutters

Co-authored-by: Cursor <cursoragent@cursor.com>
- Replace edit/delete buttons on model cards with a vertical ... menu;
  built-in models show an explanatory message instead of actions
- Right-align the enable switch and widen avatar-to-name spacing
- Move the User Experience section below Personalization in preferences

Co-authored-by: Cursor <cursoragent@cursor.com>
cjroth and others added 2 commits July 17, 2026 00:22
- New --color-border-strong: a darker step of the resting border (light
  #bfb4a3, dark reuses the #8a8a88 ring) instead of the near-black ring
- Input, textarea, select and combobox focus borders now use it

Co-authored-by: Cursor <cursoragent@cursor.com>
- Skills title, search and + buttons match PageHeader sizing/weight
- Add desktop top padding so the header starts at the same y-position
- Card-white backgrounds for the skills + button and agents search input

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔭 thunder-deep-review (advisory)

Complements the other bots — surfaces only what they did not flag. Never approves, never requests changes, never gates merge.
head: 729e080c87d8 · mode: deep · deferred 0 item(s) already reported by other bots (best-effort dedup)

Comment thread src/components/chat/message-bubbles.tsx Outdated
Comment thread src/components/chat/chat-prompt-input.tsx Outdated
…row layouts

- render the shared settings Header on Tauri-desktop-narrow so skills clears
  the macOS traffic lights; skills page burger/title/padding now match other
  settings pages
- mobile-layout header always uses the burger icon (sidebar opens as overlay);
  all sidebar/burger toggles use the muted low-contrast color
- desktop app: sidebar toggle sits right of the traffic lights in both
  expanded (sidebar strip) and collapsed (main header) states; nav pill
  right-aligns opposite it
- web: sidebar toggle keeps one fixed left-slot position across
  expand/collapse so the mouse never chases it
- center the mobile-header agent selector under macOS by using padding
  instead of margin for traffic-light clearance
- skill detail closes with an X right of the actions menu on mobile too
- MCP empty state: primary Add Server button, drop the get-started blurb
- light-mode hover contrast: agent selector uses full accent; skill chips,
  their + button, and the composer + use accent/50 like the mode/model pickers

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔭 thunder-deep-review (advisory)

Complements the other bots — surfaces only what they did not flag. Never approves, never requests changes, never gates merge.
head: 30ccaebb8c4b · mode: deep · deferred 0 item(s) already reported by other bots (best-effort dedup)

Comment thread src/lib/theme-provider.tsx Outdated
Comment thread src/components/chat/message-bubbles.tsx Outdated
Comment thread src/components/ui/input.tsx Outdated
…st fixes

- move the Chats/Settings pill into the mobile drawer's footer row (thumb
  reach) next to the account/sign-in button; web sidebar right-aligns it
- footer hover highlight spans the full row width, not just the account button
- absolutely center the mobile-header agent selector so macOS traffic-light
  clearance can't push it off-center
- soften sidebar-foreground a step in both themes so sidebar labels/icons
  read as chrome; mute agent-selector label, skill chips, + button, and
  pill-variant model selector labels to match the mode/model pickers
- full-accent hover on skill chips/+ (softer mixes composite to the page bg
  and vanish); give dark mode a real hover (input/50 matched resting bg)
- mute the mobile header's new-chat icon

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔭 thunder-deep-review (advisory)

Complements the other bots — surfaces only what they did not flag. Never approves, never requests changes, never gates merge.
head: 21c36d4b1a6a · mode: deep · deferred 0 item(s) already reported by other bots (best-effort dedup)

Comment thread src/lib/theme-provider.tsx Outdated
Comment thread src/components/chat/chat-prompt-input.tsx Outdated
@@ -79,7 +79,7 @@ export const MessageBubbles = ({ message, onResendAttachment }: MessageBubblesPr
{message.parts

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 Convention — Hardcoded text-[14px] instead of the responsive font-size token

The house rule is to size text via the responsive theme vars (text-[length:var(--font-size-sm)] for 14px) rather than a hardcoded px value, since the vars step between mobile and desktop. This new text-[14px] on the user message bubble pins it flat across breakpoints. Mind swapping it for text-[length:var(--font-size-sm)]?

Comment thread src/components/ui/page-header.tsx Outdated
// still offers "New Skill". Only the pin cap blocks it: the DAL throws
// PinLimitExceededError on the 11th pin and the catch below would swallow
// it silently, so that case is blocked upstream with explicit copy.
const addDisabled = pinCapReached

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔧 Nit — At the pin cap, the "New Skill" entry point becomes unreachable

The rationale for keeping the + trigger always-clickable is that "the popover still offers New Skill" even when there's nothing left to pin — but addDisabled = pinCapReached disables the trigger at the cap, which also blocks opening the popover, so the New Skill row can't be reached from the bar once 10 skills are pinned. Minor and probably an accepted trade-off (the tooltip explains the cap), but the comment's reasoning and the behavior don't quite line up. If reaching New Skill matters at the cap, the popover could stay openable while just the pin rows are gated.

- Add ContextMenu primitive; right-click/long-press menus on chat threads
  (rename/delete) and skill rows (edit/delete), with row highlight and
  row-top-aligned dots menu
- Replace built-in agent's Zap icon with the app logo (selector + agent row)
- Collapsible search on the agents catalog matching other settings pages
- Align header + buttons with row toggles across settings pages (pr-2)
- Remove "Enable tool use" checkbox from Add Model — always on
- Sign-in modal input/button sizing and radii; hollow sidebar toggle icon
- Subtle border + more bottom space on the skills detail card
- Markdown <hr>s use hairline border tone; composer shadow off in dark mode
- Reset to Default popover button uses primary variant (was invisible)

Co-authored-by: Cursor <cursoragent@cursor.com>

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔭 thunder-deep-review (advisory)

Complements the other bots — surfaces only what they did not flag. Never approves, never requests changes, never gates merge.
head: 4785779b4898 · mode: deep · deferred 0 item(s) already reported by other bots (best-effort dedup)


<div className="flex items-center justify-between">
<div className="flex flex-col gap-1">
<label className="text-sm font-medium">Use Cloud Proxy</label>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 Blocking — "Use Cloud Proxy" moved into a dev-only page — production users lose it

Heads up — the cloud-proxy toggle moved out of Preferences and into Developer Settings, but that route is gated behind import.meta.env.DEV (the component is () => null in production and the route only mounts in dev builds). The comment here describes this control as privacy-on-Tauri vs. CORS-bypass-on-web, so dropping it from production means Tauri end-users can no longer change their proxy transport at all. Is that intended, or should the toggle stay somewhere user-reachable in shipped builds?

Comment thread src/components/chat/message-bubbles.tsx Outdated
Comment thread src/lib/theme-provider.tsx Outdated
Comment thread src/layout/sidebar/chat-list-item.tsx Outdated
- align index.html boot script, theme-provider, and CSS background colors
  so boot, overscroll, and body no longer flash mismatched shades
- route skills edit/create through the dirty-form guard and open the
  detail panel on desktop dependent jumps
- dedupe repeated patterns: isTauriDesktop(), searchable-menu row/footer
  classes, muted icon-button class, shared agent icon helper (also fixes
  selector/settings predicate divergence), chat item menu actions
- remove dead code: button-group component, unused props on
  searchable-menu/select/page-header/page-search/theme-toggle, orphan
  CSS tokens; replace hardcoded shadows and px sizes with theme tokens
- bump dropdown-menu so both menu components share one Radix menu stack
- render skills page under the shared header on mobile to match other
  settings pages
- strengthen tests: models actions menu, skills-view guard/deep-link
  flows, sidebar section hook, nav toggle

Co-authored-by: Cursor <cursoragent@cursor.com>
@cjroth
cjroth deployed to preview July 17, 2026 16:47 — with GitHub Actions Active
cjroth and others added 4 commits July 17, 2026 16:29
- Skills: separate label (Title Case display name) from slug; new label
  column (backend migration 0022) rides the encrypted-columns map. The
  composer inserts /Display Title tokens, normalizes them to slugs at
  send time, hides the "/" glyph everywhere (pure menu trigger), and
  backspace deletes a chip atomically. @ also opens the picker.
- Agents: slide-in detail panel matching the skills page; provenance
  line helper; CLI install becomes an agent row + detail panel; remove
  the installable-agents catalog below the list.
- Brand: new magenta/gold tokens + --gradient-brand drawn from the
  logo; switches use the gradient ON track; sync cloud uses the pink.
- Chrome: transparent floating header with top scrim on all layouts;
  sidebar footer merges account + sync state into one cloud control
  with an inline Cloud Sync toggle in the account menu; theme toggle
  moves to the footer; desktop history back/forward arrows (Tauri
  only); agent selector centered; borderless modals; centered sign-in
  modal on mobile.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Primary Button variant paints the brand gold→pink gradient
- Mobile-only New Chat: floating FAB on non-chat screens plus a gradient
  button in the sidebar footer; desktop keeps the list item
- Footer controls (account, theme, nav pill) unified at touch-height-default
- Composer send button idles low-contrast grey; the gradient appears only
  when the message is submittable

Co-authored-by: Cursor <cursoragent@cursor.com>
- Translucent white input fills and dark:bg-card modal surfaces so dark
  mode inputs/dialogs read against any background
- Dedupe @radix-ui/react-dismissable-layer (fixes stuck pointer-events
  after closing a dialog opened from a menu); defer rename-dialog
  autofocus past menu focus restoration
- Remove ask widget free-text mode (users type in the composer instead)
- New --radius-3xl composer tier and --radius-control for composer
  buttons/selectors; rounder sidebar menu items
- Collapsed rail: draw the 3xl top-right curve as an inverted-corner
  mask so nav-toggle inset matches its side padding
- useMacWindowControlsClearance hook clears traffic lights in the
  content-view header at mobile widths
- Theme toggle group back on Preferences (footer toggle now dev-only);
  gradient primary buttons, secondary connect/delete buttons, weather
  card and C/F toggle contrast, drop New Chat FAB and API-key footer

Co-authored-by: Cursor <cursoragent@cursor.com>
- transparent Tauri window + native windowEffects (hudWindow/sheet),
  material and NSAppearance re-synced to the app theme at runtime so
  app-light + system-dark doesn't render a dark blur behind light glass
- .mac-vibrancy CSS: translucent sidebar surface and ink-over-glass
  tokens; opaque icon rail and drawer; blurred drawer overlay on desktop
- rounded panel-toggle icon; sidebar search input gets an accent fill,
  borderless-until-focus border, and a clipped collapse animation so it
  can't paint over the chat list mid-transition

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant