Skip to content

Improving chat input aesthetics#2561

Merged
wwwillchen merged 4 commits into
dyad-sh:mainfrom
azizmejri1:improve-chat-input-ui
Feb 12, 2026
Merged

Improving chat input aesthetics#2561
wwwillchen merged 4 commits into
dyad-sh:mainfrom
azizmejri1:improve-chat-input-ui

Conversation

@azizmejri1

@azizmejri1 azizmejri1 commented Feb 8, 2026

Copy link
Copy Markdown
Collaborator

Open with Devin

Summary by cubic

Refreshes the chat input UI for a cleaner look and consistent controls, adding per‑mode icons and clearer visual states across inputs, pickers, and actions. Also updates the git workflow with a rebase tip for React wrapper class conflicts.

  • UI Improvements
    • Unified control sizing (h-7, text-xs, rounded‑lg); vertical align center; input row aligns to end; removed spacer divs.
    • Borderless triggers for Mode/Model/Tools/Pro with subtle hover; smaller icons; mode chips show icons for all modes; Ask/Plan get color accents.
    • Input boxes rounded‑2xl with focus‑within ring; home input gets hover border; context banner rounded‑t‑2xl.
    • Send/Cancel use text‑color hovers with clearer disabled; Cancel turns destructive on hover; Auxiliary Actions is circular with gentle hover scale.
    • Increased input padding and 15px text with repositioned placeholder; trimmed outer and MessagesList padding for tighter alignment; home send icon switched to SendHorizontal.

Written for commit d99bf48. Summary will update on new commits.

@wwwillchen

Copy link
Copy Markdown
Collaborator

@BugBot run

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @azizmejri1, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request significantly enhances the user interface and experience of the chat input area by applying a series of aesthetic improvements. The changes aim to create a more polished, modern, and consistent look and feel across various interactive elements, improving visual harmony and user feedback without altering core functionality.

Highlights

  • Unified Spacing and Layout: Refactored component spacing by replacing individual div elements with gap properties and adjusting padding, leading to a cleaner and more consistent layout across chat input controls.
  • Enhanced Visual Aesthetics: Updated numerous Tailwind CSS classes to refine the appearance of buttons, selectors, and input fields. This includes changes to border-radius (e.g., rounded-lg to rounded-2xl or rounded-full), border styles, background colors, text colors, and hover/focus states for a more modern and cohesive look.
  • Improved Interactive Feedback: Implemented new focus-within styles for the main chat input container and refined hover/disabled states for send and cancel buttons, providing clearer visual feedback during user interaction.
  • Icon and Text Adjustments: Modified icon sizes (e.g., Wrench icon) and updated the send icon from SendIcon to SendHorizontalIcon for a subtle visual refresh. Text sizes and colors were also adjusted in several components for better readability and aesthetic alignment.
Changelog
  • src/components/ChatInputControls.tsx
    • Refactored spacing by removing redundant div elements and utilizing the gap utility.
    • Applied items-center to align controls vertically.
  • src/components/ChatModeSelector.tsx
    • Updated MiniSelectTrigger styling: adjusted height, padding, font size, removed border, and refined background/text colors for different states.
  • src/components/McpToolsPicker.tsx
    • Modified PopoverTrigger styling: changed rounding to rounded-lg, removed border, set transparent background, adjusted text color, hover states, height, padding, and reduced Wrench icon size.
  • src/components/ModelPicker.tsx
    • Updated DropdownMenuTrigger styling: changed rounding to rounded-lg, removed border, set transparent background, adjusted text color, hover states, height, padding, and gap.
    • Adjusted text color for the 'Model:' span.
  • src/components/ProModeSelector.tsx
    • Applied new styling to PopoverTrigger: changed rounding to rounded-lg, removed border, set transparent background, adjusted text color, hover states, height, padding, and reduced Sparkles icon size.
  • src/components/chat/AuxiliaryActionsMenu.tsx
    • Changed DropdownMenuTrigger rounding from rounded-xl to rounded-full.
    • Added transition-all duration-200 and hover:scale-105 for smoother interaction.
  • src/components/chat/ChatInput.tsx
    • Imported cn utility for conditional class merging.
    • Updated the main input container's div styling: changed rounded-lg to rounded-2xl, added transition-colors duration-200, and focus-within styles for border and ring.
    • Adjusted spacing for the input and button section from space-x-2 to gap-1 and alignment from items-start to items-end.
    • Modified cancel and send button styles: adjusted vertical margin (mb-0.5), text colors, hover effects, and disabled states.
    • Adjusted padding for the bottom control bar (pl-3 pr-2 pb-2.5 pt-0.5).
  • src/components/chat/ContextLimitBanner.tsx
    • Updated the top border-radius of the banner from rounded-t-md to rounded-t-2xl.
  • src/components/chat/HomeChatInput.tsx
    • Replaced SendIcon with SendHorizontalIcon.
    • Imported cn utility for conditional class merging.
    • Updated the main input container's div styling: changed rounded-lg to rounded-2xl, added transition-colors duration-200, hover:border-primary/30, and focus-within styles for border and ring.
    • Adjusted spacing for the input and button section from space-x-2 to gap-1 and alignment from items-start to items-end.
    • Modified cancel and send button styles: adjusted vertical margin (mb-0.5), text colors, hover effects, and disabled states.
    • Adjusted padding for the bottom control bar (pl-3 pr-2 pb-2.5 pt-0.5).
  • src/components/chat/LexicalChatInput.tsx
    • Adjusted padding (px-3 pt-3 pb-2), min-height (44px), and font-size (text-[15px]) for the ContentEditable area and its placeholder.
Activity
  • No specific activity (comments, reviews, or progress updates) has been recorded for this pull request yet.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request introduces a series of aesthetic improvements to the chat input and related components, resulting in a cleaner and more consistent user interface. The changes effectively refactor CSS classes using cn, standardize spacing with gap, and update component styles for better visual harmony.

I've identified a minor but important issue with invalid Tailwind CSS syntax for an arbitrary background color value in both ChatInput.tsx and HomeChatInput.tsx. I've left specific comments with suggestions to correct this, which will improve the code's robustness and prevent potential issues with future Tailwind versions or tooling.

isDraggingOver ? "ring-2 ring-blue-500 border-blue-500" : ""
} ${showBanner ? "rounded-t-none border-t-0" : ""}`}
className={cn(
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The Tailwind CSS class bg-(--background-lighter) uses invalid syntax for arbitrary values. It should be bg-[--background-lighter] to correctly reference the CSS variable. This will ensure it's parsed correctly by Tailwind and avoid potential issues with tooling or future updates.

Suggested change
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
"relative flex flex-col border border-border rounded-2xl bg-[--background-lighter] transition-colors duration-200",

isDraggingOver ? "ring-2 ring-blue-500 border-blue-500" : ""
}`}
className={cn(
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

medium

The Tailwind CSS class bg-(--background-lighter) uses invalid syntax for arbitrary values. It should be bg-[--background-lighter] to correctly reference the CSS variable. This will ensure it's parsed correctly by Tailwind and avoid potential issues with tooling or future updates.

Suggested change
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
"relative flex flex-col border border-border rounded-2xl bg-[--background-lighter] transition-colors duration-200",

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No issues found across 10 files

@greptile-apps

greptile-apps Bot commented Feb 8, 2026

Copy link
Copy Markdown
Contributor

Greptile Overview

Greptile Summary

Polished the chat input UI for a cleaner, more modern appearance with consistent visual hierarchy.

Key improvements:

  • Unified control sizing across all pickers (h-7, text-xs, rounded-lg) with borderless triggers and subtle hover states
  • Added per-mode icons (Hammer, Bot, MessageCircle, Lightbulb) with color accents for Ask (purple) and Plan (blue) modes
  • Enhanced input container with rounded-2xl borders, focus-within ring effects, and improved button hover states
  • Refined spacing throughout: reduced outer padding, replaced space-x-2 with gap-1, removed unnecessary spacer divs
  • Increased input text size to 15px with adjusted padding for better readability
  • Switched home send icon from SendIcon to SendHorizontalIcon for visual consistency
  • Made Cancel button turn destructive red on hover, circular Auxiliary Actions button with scale animation

All changes are purely visual/CSS updates with no logic modifications.

Confidence Score: 5/5

  • This PR is safe to merge with minimal risk
  • All changes are purely cosmetic (CSS class adjustments, icon imports, and styling updates) with no behavioral or logic modifications. The changes follow consistent patterns across components and align with the stated goal of improving chat input aesthetics.
  • No files require special attention

Important Files Changed

Filename Overview
src/components/ChatModeSelector.tsx Major visual refresh: added mode icons, color accents for Ask/Plan modes, borderless trigger with hover states
src/components/ModelPicker.tsx Unified styling with borderless trigger, reduced size (h-7), muted "Model:" label text
src/components/ProModeSelector.tsx Updated to borderless style with smaller icon (3.5), consistent h-7 height and hover states
src/components/chat/ChatInput.tsx Enhanced input aesthetics: rounded-2xl border, focus-within ring, improved button hover states with destructive Cancel button
src/components/chat/HomeChatInput.tsx Applied same styling updates as ChatInput, switched send icon to SendHorizontalIcon
src/components/chat/LexicalChatInput.tsx Increased input padding and text size to 15px, repositioned placeholder to match

Sequence Diagram

sequenceDiagram
    participant User
    participant ChatInput
    participant Controls as ChatInputControls
    participant ModeSelector as ChatModeSelector
    participant ModelPicker
    participant ProSelector as ProModeSelector
    participant McpPicker as McpToolsPicker
    participant LexicalInput as LexicalChatInput
    
    User->>ChatInput: Focus input
    ChatInput->>ChatInput: Apply focus-within ring
    ChatInput->>LexicalInput: Render text editor (15px text)
    
    User->>Controls: View control bar
    Controls->>ModeSelector: Render mode selector
    ModeSelector->>ModeSelector: Show icon + mode name
    Note over ModeSelector: Purple accent for Ask<br/>Blue accent for Plan
    
    Controls->>ModelPicker: Render model picker
    ModelPicker->>ModelPicker: Show "Model: Auto" (muted)
    
    Controls->>ProSelector: Render Pro selector
    ProSelector->>ProSelector: Show Sparkles icon + "Pro"
    
    alt MCP enabled in Build mode
        Controls->>McpPicker: Render MCP tools picker
        McpPicker->>McpPicker: Show Wrench icon (size 3.5)
    end
    
    User->>ModeSelector: Click mode selector
    ModeSelector->>ModeSelector: Show dropdown with icons
    User->>ModeSelector: Select new mode
    ModeSelector->>ModeSelector: Update with new icon/color
    
    User->>ChatInput: Hover send button
    ChatInput->>ChatInput: Change to primary color
    
    User->>ChatInput: Click send
    ChatInput->>ChatInput: Submit message
Loading

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no bugs or issues to report.

Open in Devin Review

@github-actions

github-actions Bot commented Feb 8, 2026

Copy link
Copy Markdown
Contributor

🔍 Multi-Agent Code Review

Found 3 new issue(s) flagged by 3 independent reviewers (consensus voting).

Summary

Severity Count
🔴 HIGH 0
🟡 MEDIUM 3
🟢 LOW 2

Issues to Address

Severity File Issue
🟡 MEDIUM src/components/chat/ChatInput.tsx:432 CSS specificity conflict: focus-within ring vs drag-over ring
🟡 MEDIUM src/components/chat/AuxiliaryActionsMenu.tsx:135 hover:scale-105 causes layout jank and ignores prefers-reduced-motion
🟡 MEDIUM src/components/ProModeSelector.tsx:68 Pro selector lost distinctive visual treatment, reducing discoverability
🟢 Low Priority Issues (2 items)
  • Tight spacing between interactive controls - src/components/ChatInputControls.tsx:16gap-0.5 (2px) is well below the old 6px spacers and may cause touch target issues
  • Inconsistent hover styling - src/components/chat/HomeChatInput.tsx:83 — HomeChatInput has hover:border-primary/30 but ChatInput does not

See inline comments for details on MEDIUM issues.

Generated by multi-agent consensus review (3 agents, 2+ agreement threshold)

Comment on lines +430 to +435
className={cn(
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
"focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20",
isDraggingOver && "ring-2 ring-blue-500 border-blue-500",
showBanner && "rounded-t-none border-t-0",
)}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM — CSS specificity conflict: focus-within ring vs drag-over ring

2/3 agents flagged this (both MEDIUM)

When isDraggingOver is true, ring-2 ring-blue-500 border-blue-500 is applied alongside the always-present focus-within:ring-1 focus-within:ring-primary/20. If the user is typing (input focused) and drags a file over, both ring styles activate simultaneously. The focus-within ring color (ring-primary/20) may bleed through or conflict with the drag-over blue ring, producing an inconsistent visual.

The same pattern exists in HomeChatInput.tsx.

Suggested fix: Conditionally omit the focus-within ring when dragging:

Suggested change
className={cn(
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
"focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20",
isDraggingOver && "ring-2 ring-blue-500 border-blue-500",
showBanner && "rounded-t-none border-t-0",
)}
className={cn(
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
!isDraggingOver && "focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20",
isDraggingOver && "ring-2 ring-blue-500 border-blue-500",
showBanner && "rounded-t-none border-t-0",
)}

<DropdownMenu open={isOpen} onOpenChange={setIsOpen}>
<DropdownMenuTrigger
className="inline-flex items-center justify-center whitespace-nowrap rounded-xl text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 hover:bg-muted bg-primary/10 text-primary cursor-pointer h-8 px-2"
className="inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 hover:bg-primary/20 hover:scale-105 bg-primary/10 text-primary cursor-pointer h-8 w-8"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUMhover:scale-105 causes layout jank and ignores prefers-reduced-motion

3/3 agents flagged this (1 MEDIUM, 2 LOW)

hover:scale-105 on a flex-child button can cause visual jitter in adjacent elements. Additionally, transition-all duration-200 animates all CSS properties (including layout properties like width/height), which can cause unwanted animation when the dropdown opens/closes.

More importantly, this scale animation doesn't respect prefers-reduced-motion, which is an accessibility concern.

Suggested fix:

Suggested change
className="inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 hover:bg-primary/20 hover:scale-105 bg-primary/10 text-primary cursor-pointer h-8 w-8"
className="inline-flex items-center justify-center whitespace-nowrap rounded-full text-sm font-medium transition-colors duration-200 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 hover:bg-primary/20 motion-safe:hover:scale-105 bg-primary/10 text-primary cursor-pointer h-8 w-8"

Use transition-colors instead of transition-all, and prefix scale with motion-safe: to respect accessibility preferences.

Comment thread src/components/ProModeSelector.tsx Outdated
Comment on lines 68 to 73
<PopoverTrigger className="inline-flex items-center justify-center whitespace-nowrap rounded-lg text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-50 border-none bg-transparent shadow-none text-primary/80 hover:text-primary hover:bg-primary/10 h-7 px-2 gap-1 cursor-pointer" />
}
>
<Sparkles className="h-4 w-4 text-primary" />
<span className="text-primary font-medium text-xs-sm">Pro</span>
<Sparkles className="h-3.5 w-3.5" />
<span className="font-medium">Pro</span>
</TooltipTrigger>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM — Pro selector lost distinctive visual treatment, reducing discoverability

2/3 agents flagged this (1 MEDIUM, 1 LOW)

The old ProModeSelector had a visible border (border border-primary/50), shadow (shadow-sm shadow-primary/10), and hover shadow effect that made it stand out as a premium feature. The new version uses border-none bg-transparent shadow-none, making it visually identical to the ModelPicker and McpToolsPicker.

Additionally, the Sparkles icon lost its explicit text-primary class and the "Pro" span lost text-primary — they now inherit from the parent's text-primary/80, making the branding subtly dimmer.

If the intent is to de-emphasize Pro, this is fine. But if Pro should remain visually distinctive for discoverability/conversion, consider keeping some visual differentiation (e.g., a subtle background tint or retaining the explicit text-primary on the icon and label).

@wwwillchen wwwillchen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

feedback from mtg: every mode should have an icon. for non-agent/build mode, they should get a distinct color so that users are aware they are in a non-standard mode.

@wwwillchen

Copy link
Copy Markdown
Collaborator

@BugBot run

1 similar comment
@wwwillchen

Copy link
Copy Markdown
Collaborator

@BugBot run

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Dyadbot Code Review Summary

Verdict: ✅ YES - Ready to merge

Reviewed by 3 specialized agents: Correctness Expert, Code Health Expert, UX Wizard.

Issues Summary

# Severity File Issue Found By Endorsed By
1 🟡 MEDIUM src/components/ChatInputControls.tsx:27 Leftover spacer div inconsistent with new gap approach All 3 reviewers Unanimous
2 🟡 MEDIUM src/components/chat/ChatInput.tsx:596 + HomeChatInput.tsx:137 disabled:opacity-30 may fail WCAG 2.1 contrast requirements UX, Correctness Code Health
🟢 Low Priority Notes (3 items)
  • Input container className duplication - ChatInput.tsx and HomeChatInput.tsx share nearly identical cn(...) blocks for the input container. Acceptable for now (only 2 usages), but watch for drift. (Code Health, downgraded after discussion)
  • Send/cancel button className duplication - Same long Tailwind class strings copy-pasted between both input components. (Code Health, downgraded after discussion)
  • hover:border-primary/30 only on HomeChatInput - Home input has hover border effect but active chat input does not. May be intentional (invite interaction on home page) but creates a subtle inconsistency. (UX)

Generated by Dyadbot swarm code review (3 agents, with cross-review discussion)

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Dyadbot swarm review: 2 MEDIUM issue(s) found

<div className="flex items-center gap-0.5">
<ChatModeSelector />
{showMcpToolsPicker && (
<>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM | consistency / dead-code | Found by: All 3 reviewers (unanimous)

Leftover spacer div inconsistent with new gap approach

The PR adds gap-0.5 to the parent flex container and removes several spacer <div> elements, but leaves one <div className="w-1.5"></div> between the MCP tools section and ModelPicker. This spacer now stacks with the gap, producing inconsistent spacing: gap-0.5 (2px) between most items, but gap-0.5 + w-1.5 (2px + 6px = 8px) between McpToolsPicker and ModelPicker.

💡 Suggestion: Remove the remaining spacer div and let gap-0.5 handle all spacing uniformly (or increase gap if more spacing is desired between all items).

}
aria-label={t("sendMessage")}
className="px-2 py-2 mt-1 mr-1 hover:bg-(--background-darkest) text-(--sidebar-accent-fg) rounded-lg disabled:opacity-50"
className="px-2 py-2 mb-0.5 mr-1 text-muted-foreground hover:text-primary rounded-lg transition-colors duration-150 disabled:opacity-30 disabled:hover:text-muted-foreground cursor-pointer disabled:cursor-default"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM | accessibility | Found by: UX Wizard, Endorsed by: Correctness, Code Health

disabled:opacity-30 may fail WCAG 2.1 contrast requirements

The disabled send button uses disabled:opacity-30 (down from disabled:opacity-50). Combined with the already-muted text-muted-foreground color, the resulting contrast ratio likely falls below the WCAG 2.1 SC 1.4.11 minimum of 3:1 for non-text UI components. Users may not realize the send button exists when disabled.

The same pattern appears in HomeChatInput.tsx.

💡 Suggestion: Use disabled:opacity-40 or disabled:opacity-50 to maintain sufficient visibility. Test contrast against WCAG 3:1 minimum on both light and dark themes.

@wwwillchen

Copy link
Copy Markdown
Collaborator

@BugBot run

@azizmejri1

Copy link
Copy Markdown
Collaborator Author

feedback from mtg: every mode should have an icon. for non-agent/build mode, they should get a distinct color so that users are aware they are in a non-standard mode.

@wwwillchen done

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Dyadbot Code Review Summary

Verdict: 🤔 NOT SURE - Potential issues

Reviewed by 3 specialized agents: Correctness Expert, Code Health Expert, UX Wizard.

Issues Summary

# Severity File Issue Found By Endorsed By
1 🟡 MEDIUM src/components/ChatModeSelector.tsx Brittle ml-[22px] magic number repeated 5x for description indent Code Health UX, Correctness
2 🟡 MEDIUM src/components/chat/HomeChatInput.tsx:78-88 space-y-2 removed without replacement — may collapse spacing between input sections Correctness UX
🟢 Low Priority Notes (2 items)
  • getModeIcon recreates JSX on every rendersrc/components/ChatModeSelector.tsx — Could memoize or define icons as a static map, but impact is negligible for this component size. (Code Health)
  • Nested ternary in mode selector classNamesrc/components/ChatModeSelector.tsx:128-138 — Four-level ternary is readable enough given it's just CSS class selection, but a Record<ChatMode, string> map would be cleaner. (Code Health)
✅ Already Flagged by Other Reviewers (7 items)

These issues were already identified by other review bots and confirmed by our reviewers:

  1. bg-(--background-lighter) invalid Tailwind syntax — ChatInput.tsx, HomeChatInput.tsx (gemini-code-assist)
  2. CSS specificity conflict: focus-within ring vs drag-over ring — ChatInput.tsx (github-actions)
  3. hover:scale-105 layout jank + missing prefers-reduced-motion — AuxiliaryActionsMenu.tsx (github-actions)
  4. Pro selector lost distinctive visual treatment — ProModeSelector.tsx (github-actions)
  5. Leftover spacer div inconsistent with gap approach — ChatInputControls.tsx (github-actions)
  6. disabled:opacity-30 may fail WCAG contrast — ChatInput.tsx, HomeChatInput.tsx (github-actions)
  7. Focus-within ring conflicts with drag-over ring in HomeChatInput — Same pattern as Infinite Loop: Checking Node.js setup... #2 (github-actions)

Generated by Dyadbot code review

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Swarm review: 2 new issue(s) found (7 previously flagged issues confirmed)

<span className="text-xs text-muted-foreground ml-[22px]">
Better at bigger tasks and debugging
</span>
</div>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM | consistency / maintainability | Found by: Code Health, Endorsed by: UX, Correctness

Brittle ml-[22px] magic number repeated 5 times

The description text uses ml-[22px] to indent below the icon+label row. This hardcoded pixel value appears 5 times and is tightly coupled to the icon size (14px) + gap (1.5 = 6px) + some rounding. If the icon size or gap changes, all 5 instances must be updated manually.

💡 Suggestion: Use pl-[calc(14px+0.375rem)] to make the coupling explicit, or better yet, wrap each item's layout in a shared component/pattern that handles the indent structurally (e.g., using a grid or a shared padding class).

Comment on lines 78 to 88
<>
<div className="p-4" data-testid="home-chat-input-container">
<div
className={`relative flex flex-col space-y-2 border border-border rounded-lg bg-(--background-lighter) shadow-sm ${
isDraggingOver ? "ring-2 ring-blue-500 border-blue-500" : ""
}`}
className={cn(
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
"hover:border-primary/30",
"focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20",
isDraggingOver && "ring-2 ring-blue-500 border-blue-500",
)}
onDragOver={handleDragOver}
onDragLeave={handleDragLeave}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM | correctness / visual regression | Found by: Correctness, Endorsed by: UX

space-y-2 removed without replacement

The old code used space-y-2 on the input container to create vertical spacing between the text area row and the controls row. The new code removes it without adding an equivalent gap, relying solely on the children's own padding. Verify this doesn't collapse the spacing between the input area and the controls bar — the ChatInput.tsx version doesn't have this issue because it never had space-y-2.

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Dyadbot Code Review Summary (Corrected)

This supersedes the earlier incomplete review summary posted above.

Verdict: 🤔 NOT SURE - Potential issues

Reviewed by 3 specialized agents: Correctness Expert, Code Health Expert, UX Wizard.

New Issues (not previously flagged)

# Severity File Issue Found By Endorsed By
1 🟡 MEDIUM src/components/chat/HomeChatInput.tsx:83 hover:border-primary/30 on HomeChatInput but not ChatInput — inconsistent hover behavior Code Health UX
2 🟡 MEDIUM src/components/ChatModeSelector.tsx:128-137 Build/Agent modes visually indistinguishable from Model/Tools pickers; nested ternary for mode styling Code Health, UX
3 🟡 MEDIUM src/components/chat/AuxiliaryActionsMenu.tsx:135 Circular h-8 w-8 button (32px) below recommended touch target minimum; reduced click area UX Correctness
4 🟡 MEDIUM src/components/chat/ChatInput.tsx:561 items-end alignment change — verify send button aligns with text baseline on single-line input UX Correctness
🟢 Low Priority Notes (4 items)
  • ml-[22px] magic number repeated 5 timessrc/components/ChatModeSelector.tsx — Hardcoded indent for description text is fragile and coupled to icon size + gap. Consider a shared ModeOption sub-component. (Code Health, UX)
  • Send/Cancel button classes duplicated between ChatInput and HomeChatInput — Long identical class strings copy-pasted between files. Consider extracting shared constants. (Code Health)
  • Toolbar trigger base classes repeated across ModelPicker, McpToolsPicker, ProModeSelector — Nearly identical long class strings in 3 components. Borderline for extraction. (Code Health)
  • text-muted-foreground/70 on Model label — 70% opacity on an already-muted color may push below WCAG AA contrast for legibility. (UX)
✅ Already Flagged by Other Reviewers (7 items — all confirmed)

These issues were already identified by other review bots and confirmed by our review team:

  1. bg-(--background-lighter) invalid Tailwind syntax — ChatInput.tsx, HomeChatInput.tsx (gemini-code-assist) — Confirmed by all 3 reviewers
  2. CSS specificity conflict: focus-within ring vs drag-over ring — ChatInput.tsx, HomeChatInput.tsx (github-actions) — Confirmed by Correctness, with specific fix suggestion
  3. hover:scale-105 layout jank + missing prefers-reduced-motion — AuxiliaryActionsMenu.tsx (github-actions) — Confirmed by all 3 reviewers
  4. Pro selector lost distinctive visual treatment — ProModeSelector.tsx (github-actions) — Confirmed by UX
  5. Leftover spacer div inconsistent with gap approach — ChatInputControls.tsx (github-actions) — Confirmed by all 3 reviewers; noted 2 spacer divs remain, not just 1
  6. disabled:opacity-30 may fail WCAG contrast — ChatInput.tsx, HomeChatInput.tsx (github-actions) — Confirmed by UX
  7. Removed space-y-2 may affect spacing — HomeChatInput.tsx — Flagged by Correctness; low risk since children define own padding

Generated by Dyadbot swarm code review (3 agents: Correctness, Code Health, UX)

@wwwillchen

Copy link
Copy Markdown
Collaborator

@BugBot run

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Multi-Agent Code Review

Found 1 new consensus issue flagged by 3 independent reviewers (consensus voting, 2+ agreement threshold).
(25 issue(s) identified individually, but only consensus items with at least MEDIUM severity are reported below.)
(All previously flagged issues were confirmed by our reviewers — see "Already Flagged" section.)

Summary

Severity Count
🔴 HIGH 0
🟡 MEDIUM 1
🟢 LOW 0

Issues to Address

Severity File Issue
🟡 MEDIUM src/components/chat/ContextLimitBanner.tsx:53 + ChatInput.tsx:437 ContextLimitBanner width constraint mismatches ChatInput container
🟢 Low Priority Issues (2 items — 2+ agents agreed but all LOW severity)
  • getModeIcon default case is unreachable dead codesrc/components/ChatModeSelector.tsx:100-113 — The default branch is identical to build/agent and unreachable since selectedMode is already normalized. Consider a TypeScript exhaustiveness check instead. (Correctness + Code Health)
  • Disabled cancel button on home page is confusingsrc/components/chat/HomeChatInput.tsx:128-143 — A permanently disabled cancel button with tooltip "Cancel generation (unavailable here)" is confusing UX. Either hide it entirely or explain why cancellation is unavailable. (Code Health + UX)
✅ Already Flagged by Other Reviewers (13 items — all confirmed)

All 13 previously identified issues were confirmed by at least 2 of our 3 reviewers:

  1. bg-(--background-lighter) invalid Tailwind syntax — ChatInput.tsx, HomeChatInput.tsx
  2. CSS specificity conflict: focus-within ring vs drag-over ring
  3. hover:scale-105 layout jank + missing prefers-reduced-motion
  4. Pro selector lost distinctive visual treatment
  5. Leftover spacer div inconsistent with gap approach
  6. disabled:opacity-30 may fail WCAG contrast
  7. space-y-2 removed without replacement
  8. hover:border-primary/30 present on HomeChatInput but not ChatInput
  9. Build/Agent modes visually blend into toolbar; nested ternary
  10. Circular h-8 w-8 button below touch target minimum
  11. items-end alignment — verify with single-line text
  12. ml-[22px] magic number repeated 5 times
  13. text-muted-foreground/70 contrast concerns

See inline comment for details on the MEDIUM issue.

Generated by multi-agent consensus review (3 agents, 2+ agreement threshold)

return (
<div
className="mx-auto max-w-3xl px-3 py-1.5 rounded-t-md border-t border-l border-r border-amber-500/30 bg-amber-500/10 flex items-center justify-between gap-3 text-xs text-amber-600 dark:text-amber-500"
className="mx-auto max-w-3xl px-3 py-1.5 rounded-t-2xl border-t border-l border-r border-amber-500/30 bg-amber-500/10 flex items-center justify-between gap-3 text-xs text-amber-600 dark:text-amber-500"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM | visual / layout | Found by: Correctness Expert, Endorsed by: UX Wizard

ContextLimitBanner width constraint mismatches ChatInput container

2/3 agents flagged this (1 MEDIUM, 1 LOW)

The ContextLimitBanner uses max-w-3xl mx-auto (768px, centered), but the ChatInput wrapper div below it has no max-w-3xl constraint. When the banner is shown, the ChatInput applies rounded-t-none border-t-0 to visually join with the banner above. However, if the parent container is wider than 768px, the banner will be narrower and centered while the input stretches full width — the side borders won't align, breaking the seamless visual connection.

The previous rounded-t-md had the same structural issue, but the larger rounded-t-2xl radius makes the misalignment more noticeable.

Additionally, the focus-within:ring-1 on the ChatInput will still render on the top edge even when border-t-0 is set, creating a subtle colored line where the banner and input should seamlessly join.

💡 Suggestion: Either add max-w-3xl mx-auto to the ChatInput wrapper when the banner is shown, or remove it from the ContextLimitBanner. Also consider conditionally disabling the focus-within ring on the top edge when showBanner is true.

@wwwillchen

Copy link
Copy Markdown
Collaborator

@BugBot run

@wwwillchen wwwillchen left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

thanks! looks a lot better.
i made a couple tweaks around spacing and making the color a little darker. appreciate the change!

@wwwillchen

Copy link
Copy Markdown
Collaborator

@BugBot run

@wwwillchen wwwillchen merged commit 065bab9 into dyad-sh:main Feb 12, 2026
6 of 8 checks passed

@devin-ai-integration devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Devin Review found 1 new potential issue.

View 11 additional findings in Devin Review.

Open in Devin Review

Comment on lines +438 to +441
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
"focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20",
isDraggingOver && "ring-2 ring-blue-500 border-blue-500",
showBanner && "rounded-t-none border-t-0",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 CSS specificity: focus-within ring overrides drag-over ring indicator

When the chat input is focused (which is nearly always the case) and a user drags a file over the input, the drag-and-drop visual indicator (blue ring-2 + border-blue-500) is overridden by the focus-within ring styles because pseudo-class variants have higher CSS specificity than plain utility classes.

Root Cause

The new classes focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20 are always active when the text input has focus. The drag indicator classes ring-2 ring-blue-500 border-blue-500 are conditionally applied when isDraggingOver is true. Because :focus-within pseudo-class variants have higher CSS specificity than bare utilities, focus-within:ring-1 wins over ring-2, and focus-within:border-primary/30 wins over border-blue-500.

The same issue exists in src/components/chat/HomeChatInput.tsx:89-93.

Previously (before this PR), there were no focus-within ring styles on the container, so the drag-over blue ring always displayed correctly.

Actual: During drag-over while focused, user sees a subtle 1px primary-colored ring instead of the intended prominent 2px blue ring.

Expected: The drag-over indicator (2px blue ring/border) should always be visible regardless of focus state, as it's a temporary high-priority visual signal.

Impact: Drag-and-drop file attachment visual feedback is degraded in the most common scenario (input is focused), making it harder for users to see the drop target.

Suggested change
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
"focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20",
isDraggingOver && "ring-2 ring-blue-500 border-blue-500",
showBanner && "rounded-t-none border-t-0",
"relative flex flex-col border border-border rounded-2xl bg-(--background-lighter) transition-colors duration-200",
!isDraggingOver && "focus-within:border-primary/30 focus-within:ring-1 focus-within:ring-primary/20",
isDraggingOver && "ring-2 ring-blue-500 border-blue-500",
showBanner && "rounded-t-none border-t-0",
Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

@github-actions

Copy link
Copy Markdown
Contributor

🔍 Dyadbot Code Review Summary

3 independent reviewers analyzed this PR. Found 2 new issue(s) after consensus voting.
(12 issue(s) skipped — already commented or no multi-agent consensus)

Methodology

  • Correctness Expert: Found 0 issues (all changes are CSS-only, no logic bugs)
  • Code Health Expert: Found 7 issues (4 MEDIUM, 3 LOW)
  • UX Wizard: Found 9 issues (3 MEDIUM, 6 LOW)
  • Consensus filter: Only issues flagged by 2+ agents with at least one MEDIUM rating are reported

New Issues

Severity File Issue
🟡 MEDIUM src/components/ChatModeSelector.tsx:100 Icon-to-mode mapping duplicated between getModeIcon and SelectItems
🟡 MEDIUM src/components/chat/MessagesList.tsx:350-397 Inconsistent padding/margin across 4 render paths
🟢 Low Priority Issues (not consensus — mentioned by single agent only)
  • Fixed text-[15px] doesn't respect user font-size prefssrc/components/chat/LexicalChatInput.tsx:453
  • Model: prefix at muted-foreground/70 may fail dark-mode contrastsrc/components/ModelPicker.tsx:176
  • MCP tools button lacks aria-labelsrc/components/McpToolsPicker.tsx:28
  • Controls bar vertical padding (2px) feels crampedsrc/components/chat/ChatInput.tsx:621
  • MiniSelectTrigger h-7 (28px) is small for click targetssrc/components/ui/select.tsx:70

See inline comments for details on the 2 consensus issues.

Generated by Dyadbot multi-agent code review (3x Claude Opus)

Comment on lines +100 to +113
const getModeIcon = (mode: ChatMode) => {
switch (mode) {
case "build":
case "agent":
return <Hammer size={14} />;
case "ask":
return <MessageCircle size={14} />;
case "local-agent":
return <Bot size={14} />;
case "plan":
return <Lightbulb size={14} />;
default:
return <Hammer size={14} />;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM | consistency / maintainability | Found by: Code Health, UX Wizard

getModeIcon duplicates the icon-to-mode mapping that's repeated in each SelectItem below

The icon for each mode is defined in two places:

  1. getModeIcon (lines 100–113) — used in the trigger
  2. Each SelectItem (lines 155–220) — with additional color classes

If a mode's icon changes, both must be updated. The default case also silently returns <Hammer />, masking any missing mapping for future modes.

Suggestion: Extract a single modeConfig record mapping each mode to { icon, displayName, color } and derive both the trigger icon and the dropdown items from it. For the default case, consider returning a generic icon so unknown modes are visually distinct.

Comment on lines 350 to +397
@@ -357,7 +357,7 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
}
return (
<div
className="absolute inset-0 overflow-y-auto p-4"
className="absolute inset-0 overflow-y-auto p-4 pb-0 pr-0"
ref={ref}
data-testid="messages-list"
>
@@ -375,7 +375,7 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(
if (isTestMode) {
return (
<div
className="absolute inset-0 p-4 overflow-y-auto"
className="absolute inset-0 p-4 pb-0 pr-0 overflow-y-auto"
ref={ref}
data-testid="messages-list"
>
@@ -394,7 +394,7 @@ export const MessagesList = forwardRef<HTMLDivElement, MessagesListProps>(

return (
<div
className="absolute inset-0 overflow-y-auto p-4"
className="absolute inset-0 overflow-y-auto p-4 pb-0 mb-2 pr-0"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 MEDIUM | consistency / duplication | Found by: Code Health, UX Wizard

Messages list wrapper div class duplicated 4 times with inconsistent variance

Four render paths use nearly identical class strings:

  • Line 350: "absolute inset-0 overflow-y-auto p-4 pb-0 pr-0"
  • Line 360: "absolute inset-0 overflow-y-auto p-4 pb-0 pr-0"
  • Line 378: "absolute inset-0 p-4 pb-0 pr-0 overflow-y-auto" (different class order)
  • Line 397: "absolute inset-0 overflow-y-auto p-4 pb-0 mb-2 pr-0" (adds mb-2)

The mb-2 is only on the Virtuoso path, which is likely intentional, but the duplication makes it easy for these to drift. The pr-0 removal also means content will extend to the right edge of the container, which may look cramped on platforms with always-visible scrollbars (Windows/Linux).

Suggestion: Extract a shared constant like:

const messagesListBaseClass = "absolute inset-0 overflow-y-auto p-4 pb-0 pr-0";

and use cn(messagesListBaseClass, isVirtualized && "mb-2") for the variant.

@github-actions

Copy link
Copy Markdown
Contributor

🎭 Playwright Test Results

❌ Some tests failed

OS Passed Failed Flaky Skipped
🍎 macOS 345 3 5 111
🪟 Windows 347 0 7 111

Summary: 692 passed, 3 failed, 12 flaky, 222 skipped

Failed Tests

🍎 macOS

  • problems.spec.ts > problems - fix all
    • Error: expect(locator).toBeVisible() failed
  • problems.spec.ts > problems - select specific problems and fix
    • Error: expect(locator).toBeVisible() failed
  • security_review.spec.ts > security review - edit and use knowledge
    • Error: expect(string).toMatchSnapshot(expected) failed

📋 Re-run Failing Tests (macOS)

Copy and paste to re-run all failing spec files locally:

npm run e2e \
  e2e-tests/problems.spec.ts \
  e2e-tests/security_review.spec.ts

⚠️ Flaky Tests

🍎 macOS

  • chat_input.spec.ts > send button disabled during pending proposal - reject (passed after 1 retry)
  • engine.spec.ts > regular auto should send message to engine (passed after 1 retry)
  • mcp.spec.ts > mcp - call calculator (passed after 1 retry)
  • problems.spec.ts > problems auto-fix - enabled (passed after 1 retry)
  • setup_flow.spec.ts > Setup Flow > setup banner shows correct state when node.js is installed (passed after 1 retry)

🪟 Windows

  • chat_history.spec.ts > should open, navigate, and select from history menu (passed after 1 retry)
  • chat_input.spec.ts > send button disabled during pending proposal - reject (passed after 1 retry)
  • chat_mode.spec.ts > chat mode selector - ask mode (passed after 1 retry)
  • context_manage.spec.ts > manage context - smart context - auto-includes only (passed after 1 retry)
  • edit_code.spec.ts > edit code (passed after 2 retries)
  • partial_response.spec.ts > partial message is resumed (passed after 1 retry)
  • setup_flow.spec.ts > Setup Flow > setup banner shows correct state when node.js is installed (passed after 1 retry)

📊 View full report

azizmejri1 added a commit to azizmejri1/dyad that referenced this pull request Feb 12, 2026
<!-- devin-review-badge-begin -->

---

<a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2561"
target="_blank">
  <picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
<img
src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
alt="Open with Devin">
  </picture>
</a>
<!-- devin-review-badge-end -->

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Refreshes the chat input UI for a cleaner look and consistent controls.
Adds per‑mode icons and clearer visual states across inputs, pickers,
and actions.

- **UI Improvements**
- Unified control sizing (h-7, text-xs, rounded-lg); vertical align
center; input row aligns to end; removed spacer divs.
- Borderless triggers for Mode/Model/Tools/Pro with subtle hover;
smaller icons; muted “Model:”; mode chips show icons for all modes;
Ask/Plan get color accents.
- Input boxes rounded-2xl with focus-within ring; home input gets hover
border; context banner rounded-t-2xl.
- Send/Cancel use text-color hovers with clearer disabled; Cancel turns
destructive on hover; Auxiliary Actions is circular with gentle hover
scale.
- Increased input padding and 15px text with repositioned placeholder;
trimmed outer and MessagesList padding for tighter alignment; home send
icon switched to SendHorizontal.

<sup>Written for commit 301875e.
Summary will update on new commits.</sup>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Will Chen <willchen90@gmail.com>
azizmejri1 added a commit to azizmejri1/dyad that referenced this pull request Feb 12, 2026
<!-- devin-review-badge-begin -->

---

<a href="https://app.devin.ai/review/dyad-sh/dyad/pull/2561"
target="_blank">
  <picture>
<source media="(prefers-color-scheme: dark)"
srcset="https://static.devin.ai/assets/gh-open-in-devin-review-dark.svg?v=1">
<img
src="https://static.devin.ai/assets/gh-open-in-devin-review-light.svg?v=1"
alt="Open with Devin">
  </picture>
</a>
<!-- devin-review-badge-end -->

<!-- This is an auto-generated description by cubic. -->
---
## Summary by cubic
Refreshes the chat input UI for a cleaner look and consistent controls.
Adds per‑mode icons and clearer visual states across inputs, pickers,
and actions.

- **UI Improvements**
- Unified control sizing (h-7, text-xs, rounded-lg); vertical align
center; input row aligns to end; removed spacer divs.
- Borderless triggers for Mode/Model/Tools/Pro with subtle hover;
smaller icons; muted “Model:”; mode chips show icons for all modes;
Ask/Plan get color accents.
- Input boxes rounded-2xl with focus-within ring; home input gets hover
border; context banner rounded-t-2xl.
- Send/Cancel use text-color hovers with clearer disabled; Cancel turns
destructive on hover; Auxiliary Actions is circular with gentle hover
scale.
- Increased input padding and 15px text with repositioned placeholder;
trimmed outer and MessagesList padding for tighter alignment; home send
icon switched to SendHorizontal.

<sup>Written for commit 301875e.
Summary will update on new commits.</sup>

<!-- End of auto-generated description by cubic. -->

---------

Co-authored-by: Will Chen <willchen90@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-human:review-issue ai agent flagged an issue that requires human review

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants