feat(design): redesign part 6#1145
Conversation
- unify mobile drawer, keyboard, focus, and long-press interactions - refine skills, sidebar, sources, and task workflows across breakpoints - align settings surfaces, device cards, and signup layouts Co-authored-by: Cursor <cursoragent@cursor.com>
- Consolidate the identical vertical-axis dnd-kit modifiers from reorder-panel and tasks into src/lib/dnd.ts with a single test - Extract the repeated onOpenAutoFocus + collapse-selection wrapper (dialog, alert-dialog, sheet, responsive-modal) into withCollapsedAutoFocusSelection in src/lib/focus.ts - Share one CreateItemLoadingPanel between the create-item host's Suspense fallback and the skill panel's edit-loading state, and source the Edit Skill title from a single constant - Hoist the duplicated RenameChatDialog and menu open-change handler out of ChatListItem's mobile/desktop branches and drop the dead !isMobile guards inside the desktop-only return - Extract DeviceBadge and an isMutatingDevice helper in devices settings to remove repeated pill markup and per-device pending checks - Replace the duplicated settings-list body offset class string with settingsListBodyRowsClass (models list, agents page) - Inline the trivial handleSignInClick wrapper in the sidebar footer Co-authored-by: Cursor <cursoragent@cursor.com>
Make the skill list the only scrollable region and collapse redundant safe-area padding while the software keyboard is visible. Co-authored-by: Cursor <cursoragent@cursor.com>
Semgrep Security ScanNo security issues found. |
|
Preview environment destroyed 🧹 Stack |
PR Metrics
Updated Sun, 26 Jul 2026 04:32:09 GMT · run #2457 |
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: 1b74c101738b · mode: deep · deferred 0 item(s) already reported by other bots (best-effort dedup)
| {...mobileLongPressHandlers} | ||
| data-long-press="" | ||
| onClick={() => { | ||
| if (longPressFiredRef.current) { |
There was a problem hiding this comment.
🚫 Blocking — The long-press "ghost click" guard can get stuck and swallow the next real tap
Heads up — the mobile row sets longPressFiredRef.current = true when the long-press fires, and the only place it gets reset back to false is inside the row's own onClick. That assumes a synthetic click always lands on the row right after the long press. But once the long press opens the MobileCardMenu drawer over the row, the follow-up click may hit the drawer/backdrop instead (and on platforms that emit contextmenu the click can be suppressed entirely). If that click never reaches the row, the ref stays true, so the next genuine tap on that chat is swallowed and the chat won't open until the user taps a second time. Could we clear the flag on a more reliable signal (e.g. when the menu opens/closes, or via a short timeout) rather than relying on a ghost click reaching the trigger?
| ref={ref} | ||
| value={displayValue} | ||
| className={cn('text-sm', showIcon ? 'pl-9' : '', hasValue ? 'pr-9' : '', className)} | ||
| className={cn(showIcon ? 'pl-9' : '', hasValue ? 'pr-9' : '', className)} |
There was a problem hiding this comment.
📐 Convention — Dropping text-sm changes the font size of every SearchInput, not just the skills bar
I noticed this hunk removes the hard-coded text-sm from the shared SearchInput. The base Input falls back to text-[length:var(--font-size-body)], so this quietly bumps the font size up on all five call sites — the sidebar chat search, the Tasks/PageSearch input, and the skills-bar search — not only the skills popover this PR is reworking. If the intent was just to let the skills-bar search use the mobile touch size, that broader shift on desktop search fields might be unintended. Worth a quick confirm that growing every search input to body size is what you want here.
No description provided.