Design refresh#1095
Conversation
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>
Semgrep Security ScanNo security issues found. |
|
Preview environment deployed 🚀
Stack: Auto-destroys on PR close/merge. Login via the bundled Keycloak realm — |
PR Metrics
Updated Fri, 17 Jul 2026 16:49:15 GMT · run #2331 |
- 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>
- 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>
There was a problem hiding this comment.
🔭 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)
…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>
There was a problem hiding this comment.
🔭 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)
…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>
There was a problem hiding this comment.
🔭 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)
| @@ -79,7 +79,7 @@ export const MessageBubbles = ({ message, onResendAttachment }: MessageBubblesPr | |||
| {message.parts | |||
There was a problem hiding this comment.
📐 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)]?
| // 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 |
There was a problem hiding this comment.
🔧 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>
There was a problem hiding this comment.
🔭 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> |
There was a problem hiding this comment.
🚫 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?
- 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>
- 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>
No description provided.