Skip to content

Repo-wide UI restyle: fintech-dashboard aesthetic - #185

Merged
george-bobby merged 7 commits into
mainfrom
restyle/fintech-dashboard
Jul 11, 2026
Merged

Repo-wide UI restyle: fintech-dashboard aesthetic#185
george-bobby merged 7 commits into
mainfrom
restyle/fintech-dashboard

Conversation

@george-bobby

Copy link
Copy Markdown
Member

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.md is the contract)

  • Tokens: soft-gray --background, white --card, new --success/--warning/--sidebar*, purple focus --ring, 12px radius, softer shadows; coherent .dark remap (light-first).
  • Font: Inter via next/font (Poppins was referenced but never loaded).
  • Primitives: all 29 ui/* → pills, rounded-2xl cards (+interactive hover-lift), soft-focus bg-card inputs, soft-tint badges, roomy tables; switch/checkbox/slider off magenta.
  • Shared components: StatCard/getDeltaVisual, StatusDot, PageShell, EmptyState, AnimatedNumber.
  • Chrome flip: workspace sidebar + topbar from solid purple → white with a primary-purple active pill.
  • Removed the fragile !important dark-mode hacks (bg-secondary, edit-mode-button, chat-send-button, widget-title-icon), the never-used recharts dep, 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

  • Integration cards (Manage): third-party brand colors neutralized to bg-muted + purple Connect buttons — easily reverted if you want Slack/Linear/etc. recognizability back.
  • Tag chips (notes): per-tag rainbow collapsed to neutral pills (loses color-coding).
  • Marketing category legends (features/use-cases): kept their 4-color coding (intentional legend, not converted to single-accent).
  • Hero product-demo image is a static marketing asset (still shows old chrome).

Verification

  • bun run type, bun run check, bun run build all green at every wave.
  • Visual smoke on public routes (home/auth/pricing) confirms the new look renders cleanly, no console render errors.
  • Token contrast values chosen for WCAG AA (muted-foreground 42% → 5.17:1 on the gray canvas).

Frontend-only; convex/** untouched.

…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
Copilot AI review requested due to automatic review settings July 11, 2026 17:16
@vercel

vercel Bot commented Jul 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
proddy-platform Canceled Canceled Jul 11, 2026 7:52pm

@coderabbitai

coderabbitai Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Too many files!

This PR contains 232 files, which is 82 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: b306c52b-7875-4b47-9f86-54a5cefb050c

📥 Commits

Reviewing files that changed from the base of the PR and between 9751d6b and 370f9be.

📒 Files selected for processing (232)
  • .codacy/codacy.config.json
  • .impeccable/critique/2026-07-06T14-48-44Z__src-features-board.md
  • .impeccable/critique/2026-07-06T14-48-44Z__src-features-calendar.md
  • .impeccable/critique/2026-07-06T14-48-44Z__src-features-canvas.md
  • .impeccable/critique/2026-07-06T14-48-44Z__src-features-messages.md
  • .impeccable/critique/2026-07-06T14-48-44Z__src-features-tasks.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-app.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-components-3pc.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-components-ui.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-features-auth.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-features-billing.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-features-landing.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-features-live.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-features-notes.md
  • .impeccable/critique/2026-07-06T14-48-45Z__src-features-reports.md
  • STYLE-GUIDE.md
  • package.json
  • public/manifest.json
  • src/app/about/page.tsx
  • src/app/auth/forgot-password/page.tsx
  • src/app/auth/join/[workspaceId]/page.tsx
  • src/app/auth/reset-password/page.tsx
  • src/app/auth/signin/page.tsx
  • src/app/auth/signup/page.tsx
  • src/app/contact/page.tsx
  • src/app/features/page.tsx
  • src/app/globals.css
  • src/app/layout.tsx
  • src/app/meet/[meetingId]/meeting-components.tsx
  • src/app/meet/[meetingId]/page.tsx
  • src/app/offline/page.tsx
  • src/app/pricing/page.tsx
  • src/app/workspace/[workspaceId]/billing/page.tsx
  • src/app/workspace/[workspaceId]/calendar/page.tsx
  • src/app/workspace/[workspaceId]/channel/[channelId]/board/page.tsx
  • src/app/workspace/[workspaceId]/channel/[channelId]/canvas/page.tsx
  • src/app/workspace/[workspaceId]/channel/[channelId]/layout.tsx
  • src/app/workspace/[workspaceId]/channel/[channelId]/notes/notes-content.tsx
  • src/app/workspace/[workspaceId]/channel/[channelId]/notes/page.tsx
  • src/app/workspace/[workspaceId]/channel/[channelId]/topbar.tsx
  • src/app/workspace/[workspaceId]/dashboard/dashboard-content.tsx
  • src/app/workspace/[workspaceId]/header.tsx
  • src/app/workspace/[workspaceId]/issues/page.tsx
  • src/app/workspace/[workspaceId]/layout.tsx
  • src/app/workspace/[workspaceId]/manage/page.tsx
  • src/app/workspace/[workspaceId]/meeting-notes/page.tsx
  • src/app/workspace/[workspaceId]/meetings/page.tsx
  • src/app/workspace/[workspaceId]/member/[memberId]/page.tsx
  • src/app/workspace/[workspaceId]/mobile-footer.tsx
  • src/app/workspace/[workspaceId]/options.tsx
  • src/app/workspace/[workspaceId]/outbox/page.tsx
  • src/app/workspace/[workspaceId]/project/[projectId]/roadmap/page.tsx
  • src/app/workspace/[workspaceId]/project/[projectId]/sprints/page.tsx
  • src/app/workspace/[workspaceId]/reports/page.tsx
  • src/app/workspace/[workspaceId]/sidebar.tsx
  • src/app/workspace/[workspaceId]/tasks/page.tsx
  • src/app/workspace/[workspaceId]/threads/page.tsx
  • src/app/workspace/[workspaceId]/toolbar.tsx
  • src/app/workspace/[workspaceId]/usage/page.tsx
  • src/app/workspace/[workspaceId]/workspace-title-context.tsx
  • src/components/3pc/notifications/push-notification-prompt.tsx
  • src/components/animated-number.tsx
  • src/components/empty-state.tsx
  • src/components/limit-indicator.tsx
  • src/components/mentions-notification-dialog.tsx
  • src/components/messaging/channel-hero.tsx
  • src/components/messaging/conversation-hero.tsx
  • src/components/messaging/editor.tsx
  • src/components/messaging/message-list.tsx
  • src/components/messaging/reactions.tsx
  • src/components/messaging/thread-bar.tsx
  • src/components/messaging/typing-indicator.tsx
  • src/components/page-shell.tsx
  • src/components/pickers/calendar-picker.tsx
  • src/components/pickers/channel-picker.tsx
  • src/components/pickers/label-input.tsx
  • src/components/pickers/member-selector.tsx
  • src/components/pickers/mention-picker.tsx
  • src/components/stat-card.tsx
  • src/components/status-dot.tsx
  • src/components/theme-toggle.tsx
  • src/components/ui/alert-dialog.tsx
  • src/components/ui/avatar.tsx
  • src/components/ui/badge.tsx
  • src/components/ui/button.tsx
  • src/components/ui/calendar.tsx
  • src/components/ui/card.tsx
  • src/components/ui/checkbox.tsx
  • src/components/ui/command.tsx
  • src/components/ui/dialog.tsx
  • src/components/ui/dropdown-menu.tsx
  • src/components/ui/input-otp.tsx
  • src/components/ui/input.tsx
  • src/components/ui/popover.tsx
  • src/components/ui/progress.tsx
  • src/components/ui/scroll-area.tsx
  • src/components/ui/select.tsx
  • src/components/ui/sheet.tsx
  • src/components/ui/skeleton.tsx
  • src/components/ui/slider.tsx
  • src/components/ui/sonner.tsx
  • src/components/ui/switch.tsx
  • src/components/ui/table.tsx
  • src/components/ui/tabs.tsx
  • src/components/ui/textarea.tsx
  • src/components/ui/tooltip.tsx
  • src/features/ai-notemaker/components/ai-notemaker.tsx
  • src/features/audio/components/audio-control-button.tsx
  • src/features/audio/components/meeting-notes-panel.tsx
  • src/features/audio/components/new-meeting-modal.tsx
  • src/features/audio/components/notes-audio-controls.tsx
  • src/features/audio/components/start-meeting-modal.tsx
  • src/features/audio/components/stream-audio-room.tsx
  • src/features/audio/components/upload-recording-button.tsx
  • src/features/auth/components/otp-verification-card.tsx
  • src/features/auth/components/password-change-form.tsx
  • src/features/auth/components/password-strength-indicator.tsx
  • src/features/auth/components/sign-in-card.tsx
  • src/features/auth/components/sign-up-card.tsx
  • src/features/auth/components/user-button.tsx
  • src/features/auth/components/user-profile-modal.tsx
  • src/features/billing/components/billing-section.tsx
  • src/features/billing/components/upgrade-modal.tsx
  • src/features/board/components/assigned-issues-list.tsx
  • src/features/board/components/board-card-edit-dialog.tsx
  • src/features/board/components/board-gantt-view.tsx
  • src/features/board/components/board-header.tsx
  • src/features/board/components/board-issue-drawer.tsx
  • src/features/board/components/board-issue-row.tsx
  • src/features/board/components/board-kanban-view.tsx
  • src/features/board/components/board-linkage-diagram.tsx
  • src/features/board/components/board-page-content.tsx
  • src/features/board/components/board-status-column.tsx
  • src/features/calendar/components/calendar-filter.tsx
  • src/features/calendar/components/calendar-header.tsx
  • src/features/canvas/components/excalidraw-canvas.tsx
  • src/features/canvas/components/mermaid.tsx
  • src/features/canvas/components/note.tsx
  • src/features/canvas/components/saved-dropdown.tsx
  • src/features/canvas/components/text.tsx
  • src/features/channels/components/create-channel-modal.tsx
  • src/features/chats/components/compact-message.tsx
  • src/features/chats/components/full-message.tsx
  • src/features/chats/components/message-content.tsx
  • src/features/chats/components/message-context-menu.tsx
  • src/features/chats/components/selection-modal.tsx
  • src/features/chats/components/task-creation-modal.tsx
  • src/features/dashboard/components/dashboard-chatbot.tsx
  • src/features/dashboard/components/dashboard-widgets.tsx
  • src/features/dashboard/components/shared/relative-time.tsx
  • src/features/dashboard/components/shared/widget-card.tsx
  • src/features/dashboard/components/shared/widget-empty-state.tsx
  • src/features/dashboard/components/shared/widget-header.tsx
  • src/features/dashboard/components/shared/widget-loading.tsx
  • src/features/dashboard/components/widgets/assigned-cards-widget.tsx
  • src/features/dashboard/components/widgets/calendar-preview-widget.tsx
  • src/features/dashboard/components/widgets/canvas-widget.tsx
  • src/features/dashboard/components/widgets/mentions-widget.tsx
  • src/features/dashboard/components/widgets/notes-widget.tsx
  • src/features/dashboard/components/widgets/stress-widget.tsx
  • src/features/dashboard/components/widgets/tasks-widget.tsx
  • src/features/dashboard/components/widgets/team-status-widget.tsx
  • src/features/dashboard/components/widgets/thread-replies-widget.tsx
  • src/features/landing/assistant/faq-section.tsx
  • src/features/landing/assistant/features-section.tsx
  • src/features/landing/assistant/hero-section.tsx
  • src/features/landing/assistant/use-cases-section.tsx
  • src/features/landing/components/cta-section.tsx
  • src/features/landing/components/footer.tsx
  • src/features/landing/components/header.tsx
  • src/features/landing/features/features-data.tsx
  • src/features/landing/home/ai-features-section.tsx
  • src/features/landing/home/comparison-section.tsx
  • src/features/landing/home/feature-section.tsx
  • src/features/landing/home/hero-section.tsx
  • src/features/landing/home/replacement-section.tsx
  • src/features/live/components/live-cursor.tsx
  • src/features/live/components/live-header.tsx
  • src/features/live/components/live-participants.tsx
  • src/features/live/components/live-sidebar.tsx
  • src/features/manage/components/channels-management.tsx
  • src/features/manage/components/import-data-management.tsx
  • src/features/manage/components/integrations-management.tsx
  • src/features/manage/components/members-management.tsx
  • src/features/manage/components/service-integration-card.tsx
  • src/features/manage/components/workspace-management.tsx
  • src/features/members/components/invite-member-modal.tsx
  • src/features/members/components/profile.tsx
  • src/features/messages/components/thread-modal.tsx
  • src/features/messages/components/thread.tsx
  • src/features/messages/components/unified-message.tsx
  • src/features/notes/components/ai-actions-toolbar.tsx
  • src/features/notes/components/blocknote-editor.tsx
  • src/features/notes/components/export-note-dialog.tsx
  • src/features/notes/components/note-editor-error-boundary.tsx
  • src/features/notes/components/notes-room.tsx
  • src/features/notes/components/tag-input.tsx
  • src/features/pomodoro/components/pomodoro-timer.tsx
  • src/features/preferences/components/notification-settings.tsx
  • src/features/preferences/components/status-selector.tsx
  • src/features/preferences/components/status-tracking-settings.tsx
  • src/features/presence/components/presence-indicator.tsx
  • src/features/projects/components/project-nav-tabs.tsx
  • src/features/reports/components/channel-activity-dashboard.tsx
  • src/features/reports/components/charts/bar-chart.tsx
  • src/features/reports/components/charts/colors.ts
  • src/features/reports/components/charts/horizontal-bar-chart.tsx
  • src/features/reports/components/charts/line-chart.tsx
  • src/features/reports/components/charts/pie-chart.tsx
  • src/features/reports/components/content-analysis-dashboard.tsx
  • src/features/reports/components/overview-dashboard.tsx
  • src/features/reports/components/performance-metrics-dashboard.tsx
  • src/features/reports/components/user-activity-dashboard.tsx
  • src/features/roadmap/components/milestone-card.tsx
  • src/features/roadmap/components/milestone-detail.tsx
  • src/features/roadmap/components/roadmap-panel.tsx
  • src/features/smart/components/daily-recap-modal.tsx
  • src/features/smart/components/suggestions.tsx
  • src/features/smart/components/summary-modal.tsx
  • src/features/sprints/components/sprint-card.tsx
  • src/features/sprints/components/sprint-detail.tsx
  • src/features/sprints/components/sprints-panel.tsx
  • src/features/tasks/components/task-category-selector.tsx
  • src/features/tasks/components/task-create-form.tsx
  • src/features/tasks/components/task-edit-form.tsx
  • src/features/tasks/components/task-filter.tsx
  • src/features/tasks/components/task-item.tsx
  • src/features/tasks/components/task-sidebar.tsx
  • src/features/tasks/components/task-toggle-view.tsx
  • src/features/usage/components/usage-dashboard.tsx
  • src/features/workspaces/hooks/use-sidebar-width.ts
  • tailwind.config.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch restyle/fintech-dashboard

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@deepsource-io

deepsource-io Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

DeepSource Code Review

We reviewed changes in 9751d6b...6244bc0 on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.

See full review on DeepSource ↗

PR Report Card

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.

@codacy-production

codacy-production Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

Not up to standards ⛔

🔴 Issues 13 high · 27 medium

Alerts:
⚠ 40 issues (≤ 0 issues of at least minor severity)

Results:
40 new issues

Category Results
ErrorProne 27 medium
2 high
Security 11 high

View in Codacy

🟢 Metrics 198 complexity · -24 duplication

Metric Results
Complexity 198
Duplication -24

View in Codacy

AI Reviewer: first review requested successfully. AI can make mistakes. Always validate suggestions.

Run reviewer

TIP This summary will be updated as you push new changes.

@codacy-production codacy-production 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.

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()}

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.

🔴 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:

Suggested change
{assignee[0]?.toUpperCase()}
{assignee[0].toUpperCase()}

See Issue in Codacy


const points = data.map((item, index) => {
const points: ChartPoint[] = data.map((item, index) => {
const x = chartMargin + (index / (data.length - 1)) * chartWidth;

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.

🔴 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");

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.

🔴 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)}

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 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:

Suggested change
onChange={(e) => setSearchQuery(e.target.value)}
onChange={(e) => { setSearchQuery(e.target.value); }}

See Issue in Codacy

attributes: true,
});

return () => observer.disconnect();

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 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:

Suggested change
return () => observer.disconnect();
return () => { observer.disconnect(); };

See Issue in Codacy

@@ -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">

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 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"}`}

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 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"

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 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 = ({

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.

⚪ 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
Copilot AI review requested due to automatic review settings July 11, 2026 19:11

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@deepsource-io

deepsource-io Bot commented Jul 11, 2026

Copy link
Copy Markdown
Contributor

DeepSource Code Review

We reviewed changes in 9751d6b...370f9be on this pull request. Below is the summary for the review, and you can see the individual issues we found as inline review comments.

See full review on DeepSource ↗

Important

Some issues found as part of this review are outside of the diff in this pull request and aren't shown in the inline review comments due to GitHub's API limitations. You can see those issues on the DeepSource dashboard.

PR Report Card

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.

Copilot AI review requested due to automatic review settings July 11, 2026 19:50

Copilot AI 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.

Copilot wasn't able to review this pull request because it exceeds the maximum number of lines (20,000). Try reducing the number of changed lines and requesting a review from Copilot again.

@george-bobby
george-bobby merged commit 58e1e8c into main Jul 11, 2026
2 of 7 checks passed
@george-bobby
george-bobby deleted the restyle/fintech-dashboard branch July 11, 2026 19:52
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.

3 participants