Repo-wide UI restyle: fintech-dashboard aesthetic - #185
Conversation
…hrome flip - A1: soft-gray canvas + white card tokens, Inter font, new success/warning/sidebar tokens, purple focus ring, 12px radius, softer shadows; globals.css surgery (tokenized Quill colors, stable .chat-bubble selector, narrowed transitions); removed dead recharts dep - A2: all 29 ui primitives to pills/rounded-2xl/soft-focus; migrated switch/checkbox/ slider off magenta; sonner follows theme; deleted .dark bg-secondary hack - A3: StatCard/StatusDot/PageShell/EmptyState/AnimatedNumber + STYLE-GUIDE.md - A4: workspace chrome flipped purple -> white with primary active pill
…auth - Dashboard: PageShell canvas, StatCard tiles, greeting, Card-recipe widgets - Reports: smooth bezier line/pill tooltips/dashed gridlines charts; KPIs on StatCard + AnimatedNumber; token palette - Manage: PageShell + pill tabs + rounded-2xl panels, soft status badges - Chat core: pill channel tabs, editor input recipe, CSS-only typing indicator - Board kanban: soft-gray column wells, white rounded-2xl cards, tokenized priority ramp - Auth: soft-gray canvas + white cards, token radii, magenta links -> primary - foundation FCR: removed dead .edit-mode-button / .widget-title-icon CSS
…atures, board gantt/drawer, assistant - Usage+Billing: PageShell, StatCard tiles, soft status badges, dropped gradients - Tasks+Calendar: PageShell, priority ramp aligned w/ board, paper calendar grid, pill controls - List pages (issues/outbox/threads/meeting-notes) + ai-notemaker: unified card recipe, EmptyState, pill search - Message features: white thread panel, floating pill toolbars, magenta -> primary - Board gantt+drawer: tokenized bars/grid, mermaid themed via CSS vars, pill selects - Assistant: token send button, rounded-2xl tool cards, dropped gradients/blur - foundation FCR: removed dead .chat-send-button CSS
…marketing, meet - Projects: pill nav tabs, rounded-2xl sprint/milestone cards, tokenized status, fixed roadmap magenta-misuse - Canvas/Notes/Live: wrapper chrome to tokens (editor internals untouched), dropped blur, neutral tags - Members+modals+pickers+audio+presence: white profile panel, token status dots, soft badges - Marketing home: dropped hero gradient/header blur, card-recipe sections, quiet motion - Marketing subpages: pricing 31 gray-* tokenized, blur-blobs removed, comparison on Table primitive - Meet: dark room harmonized to 4-shade palette + pill controls + primary accents
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Important Review skippedToo many files! This PR contains 232 files, which is 82 over the limit of 150. To get a review, narrow the scope: Upgrade to a paid plan to raise the limit. ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (232)
You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
|
Overall Grade |
Security Reliability Complexity Hygiene |
Code Review Summary
| Analyzer | Status | Updated (UTC) | Details |
|---|---|---|---|
| JavaScript | Jul 11, 2026 5:16p.m. | Review ↗ |
Important
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
Not up to standards ⛔🔴 Issues
|
| Category | Results |
|---|---|
| ErrorProne | 27 medium 2 high |
| Security | 11 high |
🟢 Metrics 198 complexity · -24 duplication
Metric Results Complexity 198 Duplication -24
AI Reviewer: first review requested successfully. AI can make mistakes. Always validate suggestions.
TIP This summary will be updated as you push new changes.
There was a problem hiding this comment.
Pull Request Overview
This PR implements a significant UI overhaul to a 'fintech-dashboard' aesthetic, but several implementation details undermine the stability and consistency of the application. Most importantly, two logic bugs require immediate attention: the line chart component will fail for single-point datasets due to a division-by-zero error, and the new meeting modal uses an asynchronous pattern that will trigger browser popup blockers.
From a quality and architectural standpoint, Codacy results are not up to standards. There are multiple instances where the new 'never raw hex' rule in the STYLE-GUIDE.md is ignored in favor of hardcoded values, particularly in the 'Meet' feature. Additionally, the intent to remove fragile CSS overrides was only partially achieved, as new '!important' HSL hacks were introduced in the global styles. These issues, along with the maintainability concerns raised regarding the Sonner component's theme detection and missing forwardRef support in shared components, should be resolved before approval.
About this PR
- New !important overrides using raw HSL values rather than tokens were added to globals.css and editor components, continuing the pattern of fragile CSS hacks that the PR description intended to eliminate.
- The PR introduces multiple hardcoded hex values (e.g., in the 'Meet' feature), which directly contradicts the 'never raw hex' rule established in the new STYLE-GUIDE.md. These should be migrated to tokens.
Test suggestions
- Missing: Verify getDeltaVisual logic correctly maps positive values to 'success' and negative values to 'destructive' tones with corresponding icons.
- Missing: Verify AnimatedNumber component respects the useReducedMotion hook by rendering the final value statically.
- Missing: Verify NewMeetingModal correctly differentiates between 'channel' and 'person' targets to generate valid meeting URLs with appropriate query params.
- Missing: Verify password strength color mapping (SCORE_BAR_COLORS) aligns with the new success/warning/destructive design tokens.
- Missing: Verify PageShell component correctly enforces the max-w-[1400px] constraint except when the maxWidth prop is set to 'full'.
Prompt proposal for missing tests
Consider implementing these tests if applicable:
1. Missing: Verify getDeltaVisual logic correctly maps positive values to 'success' and negative values to 'destructive' tones with corresponding icons.
2. Missing: Verify AnimatedNumber component respects the useReducedMotion hook by rendering the final value statically.
3. Missing: Verify NewMeetingModal correctly differentiates between 'channel' and 'person' targets to generate valid meeting URLs with appropriate query params.
4. Missing: Verify password strength color mapping (SCORE_BAR_COLORS) aligns with the new success/warning/destructive design tokens.
5. Missing: Verify PageShell component correctly enforces the max-w-[1400px] constraint except when the maxWidth prop is set to 'full'.
Low confidence findings
- The modification to Sonner using a manual MutationObserver on the document root bypasses the standard next-themes implementation. This creates a risk of state desync or race conditions during theme transitions.
TIP Improve review quality by adding custom instructions
TIP How was this review? Give us feedback
| <span className="w-3 h-3 rounded-full bg-blue-200 dark:bg-blue-800 flex items-center justify-center text-[7px] font-black text-blue-800 dark:text-blue-200"> | ||
| <span className="inline-flex items-center gap-1 text-[10px] font-bold bg-muted text-foreground px-2 py-0.5 rounded-full"> | ||
| <span className="size-3 rounded-full bg-primary/15 flex items-center justify-center text-[7px] font-black text-primary"> | ||
| {assignee[0]?.toUpperCase()} |
There was a problem hiding this comment.
🔴 HIGH RISK
The optional chaining operator here is unnecessary because 'assignee' is already confirmed to be a truthy string. This might be a simple fix:
| {assignee[0]?.toUpperCase()} | |
| {assignee[0].toUpperCase()} |
|
|
||
| const points = data.map((item, index) => { | ||
| const points: ChartPoint[] = data.map((item, index) => { | ||
| const x = chartMargin + (index / (data.length - 1)) * chartWidth; |
There was a problem hiding this comment.
🔴 HIGH RISK
This calculation will result in NaN or Infinity if data.length is 1, which will cause the SVG path to fail and render an empty chart. Since single-point datasets are valid for short-term reports, add a guard to handle the case where the denominator is zero.
| }); | ||
| } | ||
|
|
||
| window.open(meetUrl, "_blank", "noopener,noreferrer"); |
There was a problem hiding this comment.
🔴 HIGH RISK
Browser popup blockers will likely block this window because window.open is called after asynchronous network requests (await createMessage). To ensure the meeting opens reliably across all browsers, you should open the window immediately with a placeholder (about:blank) and set its location.href once the async tasks complete, or use a current-tab redirect.
| <Search className="size-4 absolute left-3.5 top-1/2 -translate-y-1/2 text-muted-foreground" /> | ||
| <Input | ||
| className="rounded-full border-border bg-muted/50 pl-10 focus:bg-card" | ||
| onChange={(e) => setSearchQuery(e.target.value)} |
There was a problem hiding this comment.
🟡 MEDIUM RISK
Returning a void expression from an arrow function shorthand is forbidden. Please add braces to the arrow function block. This might be a simple fix:
| onChange={(e) => setSearchQuery(e.target.value)} | |
| onChange={(e) => { setSearchQuery(e.target.value); }} |
| attributes: true, | ||
| }); | ||
|
|
||
| return () => observer.disconnect(); |
There was a problem hiding this comment.
🟡 MEDIUM RISK
Returning a void expression from an arrow function shorthand is discouraged in effect cleanups to prevent accidental return value confusion. This might be a simple fix:
| return () => observer.disconnect(); | |
| return () => { observer.disconnect(); }; |
| @@ -322,7 +322,7 @@ export default function MeetingPage({ | |||
| <div className="relative flex h-screen w-full bg-[#1c1e21] overflow-hidden text-white font-sans flex-col"> | |||
There was a problem hiding this comment.
🟡 MEDIUM RISK
Raw hex code used for background violates the requirement to use tokens only. Consider using --background or a specific --meet-background token.
| <button | ||
| aria-pressed={isRecording} | ||
| className={`flex items-center gap-2 px-4 h-11 rounded-full transition-all text-sm font-medium ${isRecording ? "bg-red-500 hover:bg-red-600 text-white shadow-lg shadow-red-500/20" : "bg-[#232529] hover:bg-[#2a2c32] text-white"}`} | ||
| className={`flex items-center gap-2 px-4 h-11 rounded-full transition-all text-sm font-medium ${isRecording ? "bg-red-500 hover:bg-red-600 text-white shadow-lg shadow-red-500/20" : "bg-[#26282c] hover:bg-[#2f3136] text-white"}`} |
There was a problem hiding this comment.
🟡 MEDIUM RISK
Hardcoded hex values used here violate the project's new Style Guide. These should be converted to CSS tokens or mapped in the 'dark' theme block in globals.css.
| > | ||
| <ProgressPrimitiveIndicator | ||
| className="h-full w-full flex-1 bg-secondary transition-all data-[state=indeterminate]:animate-pulse motion-reduce:data-[state=indeterminate]:animate-none" | ||
| className="size-full flex-1 bg-secondary transition-all data-[state=indeterminate]:animate-pulse motion-reduce:data-[state=indeterminate]:animate-none" |
There was a problem hiding this comment.
🟡 MEDIUM RISK
Suggestion: Using the bg-secondary (magenta) token for a generic progress bar indicator violates the project's new style guide (STYLE-GUIDE.md), which specifies that magenta is reserved for AI-accent and marketing garnish only. This should use bg-primary or success-based tokens.
|
|
||
| // Fintech-style stat tile: label + big numeral + optional delta chip. Renders | ||
| // on a white card so delta chips keep AA contrast against the tint. | ||
| export const StatCard = ({ |
There was a problem hiding this comment.
⚪ LOW RISK
Suggestion: StatCard is not a forwardRef component, which prevents it from being used directly as a trigger for tooltips or popovers (e.g., using TooltipTrigger asChild). Refactoring it to support refs would improve reusability across the dashboard.
…er nav - Move UserButton from top-right toolbar to the sidebar footer (bottom-left) as a full account row (avatar + name + email); self-handles the ?openUserSettings deep link so the toolbar wiring is dropped - Fix workspace-switcher clipping: remove mt-5 that overflowed the fixed-height header and clipped the top - Section headers read as quiet group labels (tighter padding, muted icons), distinct from nav pills - Default-expand Planning/Messages/Settings so their links are visible without an extra click; add top breathing room to the scroll area
|
|
Overall Grade |
Security Reliability Complexity Hygiene |
Code Review Summary
| Analyzer | Status | Updated (UTC) | Details |
|---|---|---|---|
| JavaScript | Jul 11, 2026 7:50p.m. | Review ↗ |
Important
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
What
Restyles the entire Proddy frontend to a clean fintech-dashboard aesthetic (à la the Fundora/Finexy reference dashboards): soft-gray app canvas, white rounded-2xl cards with 1px borders + soft shadows, pill controls, stat tiles with delta chips, clean roomy tables, and quiet CSS-first micro-animations — keeping the existing primary purple (
#4A0D68) as the single interactive accent.Delivered via a foundation phase + 19 file-disjoint restyle packages across 3 waves, each gated with
bun run type+biome check+next build.Foundation (
STYLE-GUIDE.mdis the contract)--background, white--card, new--success/--warning/--sidebar*, purple focus--ring, 12px radius, softer shadows; coherent.darkremap (light-first).next/font(Poppins was referenced but never loaded).ui/*→ pills,rounded-2xlcards (+interactivehover-lift), soft-focusbg-cardinputs, soft-tint badges, roomy tables; switch/checkbox/slider off magenta.StatCard/getDeltaVisual,StatusDot,PageShell,EmptyState,AnimatedNumber.!importantdark-mode hacks (bg-secondary,edit-mode-button,chat-send-button,widget-title-icon), the never-usedrechartsdep, and glassmorphism utilities.Surface coverage (all 19 packages)
Dashboard · Reports (charts + sections) · Manage · Usage + Billing · Tasks + Calendar · Issues/Outbox/Threads/Meeting-notes · Chat core + message features · Board (kanban + gantt + drawer) · Projects (sprints/roadmap) · Canvas/Notes/Live (wrapper chrome only — editor internals untouched) · Assistant · Members + modals + pickers + audio · Auth + profile · Marketing home + subpages (pricing
gray-*cleanup) · Meet (kept dark, harmonized to a tokenized palette + pill controls).--secondary(magenta) is demoted to an AI-accent/marketing garnish. Third-party editors (Quill/BlockNote/Excalidraw/Stream) are themed via documented props/CSS-vars only.Design notes / judgment calls worth a look
bg-muted+ purple Connect buttons — easily reverted if you want Slack/Linear/etc. recognizability back.Verification
bun run type,bun run check,bun run buildall green at every wave.Frontend-only;
convex/**untouched.