Skip to content

feat(web): redesign signals page list items#267

Merged
pedroscosta merged 2 commits into
mainfrom
feat/signals-page-items-redesign
May 11, 2026
Merged

feat(web): redesign signals page list items#267
pedroscosta merged 2 commits into
mainfrom
feat/signals-page-items-redesign

Conversation

@pedroscosta
Copy link
Copy Markdown
Collaborator

@pedroscosta pedroscosta commented May 10, 2026

Summary

Redesigns the Signals page list: refreshed action rows, chips, and list layout; adds a greeting header on the route.

Changes

  • Action rows — Updated styling and structure in action-row and row variants.
  • Chips — Extended with CVA variants via class-variance-authority.
  • Signals route — Wires in the new greeting component and adjusted page composition.
  • Depsclass-variance-authority added to apps/web.

Test plan

  • Open Signals in the app and confirm list readability, spacing, and chip appearance.
  • Smoke-check hover/focus on row actions if applicable.

Made with Cursor


Summary by cubic

Redesigned the Signals list with a cleaner row layout and improved chips, plus a time-based greeting at the top. The greeting now handles empty names and uses better time ranges.

  • New Features

    • Action rows: new header with thread context and reason, actions moved to a footer bar, and inline dismiss; skeleton updated to match.
    • List: removed Card/Separator wrappers in favor of a simple vertical layout with spacing; refreshed attention count text.
    • Chips: ThreadChip now supports a variant prop (chip | unstyled) and disabled, with size adapting in unstyled mode; built with CVA via class-variance-authority.
  • Bug Fixes

    • Greeting: gracefully falls back to “there” when the user name is empty; refined time windows (“Working late”, morning, afternoon, evening).

Written for commit 434865f. Summary will update on new commits.

Summary by CodeRabbit

  • New Features

    • Added time-based personalized greeting to the Signals page.
  • UI Improvements

    • Reorganized signal action row layouts for clearer hierarchy and header-based controls.
    • Simplified action list presentation with a cleaner gap-based list and improved loading state.
    • Enhanced chip styling with a variant-driven system and adjusted avatar sizing.

Review Change Stack

Review Change Stack

Refresh action rows, chips, and list layout; add greeting header.
Adds class-variance-authority for chip variants.

Co-authored-by: Cursor <cursoragent@cursor.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 10, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4e4114a1-d6b2-4889-b845-9463e228d52e

📥 Commits

Reviewing files that changed from the base of the PR and between 83fd694 and 434865f.

📒 Files selected for processing (2)
  • apps/web/src/components/signals/action-row/rows.tsx
  • apps/web/src/components/signals/greeting.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • apps/web/src/components/signals/greeting.tsx
  • apps/web/src/components/signals/action-row/rows.tsx

📝 Walkthrough

Walkthrough

This PR refactors the Signals page UI by introducing class-variance-authority for variant-driven chip styling, restructuring ActionRow components to use flex-based layouts, updating five signal action row renderers to use a new ThreadRef helper with unstyled variants, simplifying the action list layout, and adding a time-aware Greeting component that replaces LeverageReport on the Signals route.

Changes

Signals UI Refactor with Variant Styling & Layout Restructuring

Layer / File(s) Summary
Dependency & Styling Foundation
apps/web/package.json, apps/web/src/components/chips.tsx
Add class-variance-authority ^0.7.1 dependency. Define threadChipVariants cva configuration supporting variant ("chip", "unstyled") and disabled states with styled classNames for each combination.
Chip Component Variants
apps/web/src/components/chips.tsx
Update BaseThreadChip to accept variant prop and compute className via cn(threadChipVariants(...), className); conditionally set Avatar size based on variant. Update ThreadChip to accept and forward variant to BaseThreadChip; adjust thread prop type to require assignedUser user data.
Action Row Component Structure
apps/web/src/components/signals/action-row/action-row.tsx
Refactor Root to use flex-column layout with secondary background instead of grid; update Header, Title, Reason, and Actions subcomponents to flex-based styling with adjusted colors, borders, and spacing; expose ActionRow.Header export; update ActionRowSkeleton to match new structure.
Thread Reference Helper & Row Renderers
apps/web/src/components/signals/action-row/rows.tsx
Introduce ThreadRef helper accepting optional variant to render ThreadChip. Restructure all five row types (Status, Duplicate, LinkedPr, PendingReply, LoopToClose) to render unstyled thread reference in header, move TitleLabel and metadata into reason section, move dismiss control into header, and remove relative-time/meta display.
Action List Layout Simplification
apps/web/src/components/signals/action-list.tsx
Update imports to make schema type-only; remove Card/Separator components. Render loading state as plain flex container with three skeleton rows. Replace singular/plural "attention" header with new message; render list as gap-based column without explicit separators or Fragment wrappers.
Greeting Component
apps/web/src/components/signals/greeting.tsx
Add Greeting component accepting userName, deriving firstName by trimming and taking first whitespace-delimited token. Render greeting text determined by greetingFor() helper, which selects time-of-day string (pre-5, pre-12, pre-18, else) based on current hour.
Signal Route Integration
apps/web/src/routes/app/_workspace/_main/signal/index.tsx
Import and render Greeting component; comment out LeverageReport import and rendered block; update CardContent layout className.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested reviewers

  • danielmoural
  • cubic-dev-ai

Poem

🐰 Hop, hop, a tiny cheer,
Variants stitched and chips appear,
Greeting greets by hour and name,
Rows reflow tidy — not the same.
Signals brighter — hop, hooray!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main change: a redesign of the Signals page list items, which is reflected across all modified files including action rows, chips, and the overall page layout.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/signals-page-items-redesign

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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 and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (2)
apps/web/src/routes/app/_workspace/_main/signal/index.tsx (1)

53-59: 💤 Low value

Consider removing commented code.

The commented LeverageReport block can be removed since it's replaced by the Greeting component. Git history preserves the original implementation if needed later.

🧹 Cleanup suggestion
  <Greeting userName={user.name} />
- {/* <LeverageReport
-   organizationId={currentOrg.id}
-   organizationCreatedAt={orgCreatedAt}
-   userId={user.id}
-   userName={user.name}
-   posthog={posthog ?? null}
- /> */}
  <ActionList
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/routes/app/_workspace/_main/signal/index.tsx` around lines 53 -
59, Remove the dead commented JSX for LeverageReport: delete the commented block
that references LeverageReport (including props organizationId,
organizationCreatedAt, userId, userName, posthog) since Greeting replaces it;
ensure no other references to LeverageReport remain in the component and run a
quick compile to confirm no unused-import errors for LeverageReport remain.
apps/web/src/components/chips.tsx (1)

58-58: 💤 Low value

Remove redundant nullish coalescing.

Since disabled already defaults to false at line 43, the nullish coalescing operator here is unnecessary.

♻️ Suggested simplification
-      disabled={disabled ?? false}
+      disabled={disabled}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/components/chips.tsx` at line 58, The prop binding uses
redundant nullish coalescing: remove "?? false" from the JSX so the prop passes
the existing defaulted variable directly; update the usage of disabled in the
component (the variable named disabled that is already defaulted in the
component's props or state) to simply be disabled={disabled} (locate the JSX in
chips.tsx where disabled is set and the props default near the component's props
definition).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/components/signals/greeting.tsx`:
- Line 7: The current extraction of firstName from userName can produce an empty
string for whitespace-only input, so update the logic around userName and
firstName to guard against that: compute a trimmed value (e.g., const trimmed =
userName.trim()), then set firstName to trimmed ? trimmed.split(/\s+/)[0] :
undefined (or a sensible fallback like "there"), and use that fallback when
rendering the greeting; this ensures firstName is never the empty string and
avoids the awkward "Good morning, .".

---

Nitpick comments:
In `@apps/web/src/components/chips.tsx`:
- Line 58: The prop binding uses redundant nullish coalescing: remove "?? false"
from the JSX so the prop passes the existing defaulted variable directly; update
the usage of disabled in the component (the variable named disabled that is
already defaulted in the component's props or state) to simply be
disabled={disabled} (locate the JSX in chips.tsx where disabled is set and the
props default near the component's props definition).

In `@apps/web/src/routes/app/_workspace/_main/signal/index.tsx`:
- Around line 53-59: Remove the dead commented JSX for LeverageReport: delete
the commented block that references LeverageReport (including props
organizationId, organizationCreatedAt, userId, userName, posthog) since Greeting
replaces it; ensure no other references to LeverageReport remain in the
component and run a quick compile to confirm no unused-import errors for
LeverageReport remain.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 7f106da6-4ede-4b15-b2ed-79ce16325915

📥 Commits

Reviewing files that changed from the base of the PR and between 3779541 and 83fd694.

⛔ Files ignored due to path filters (1)
  • bun.lock is excluded by !**/*.lock
📒 Files selected for processing (7)
  • apps/web/package.json
  • apps/web/src/components/chips.tsx
  • apps/web/src/components/signals/action-list.tsx
  • apps/web/src/components/signals/action-row/action-row.tsx
  • apps/web/src/components/signals/action-row/rows.tsx
  • apps/web/src/components/signals/greeting.tsx
  • apps/web/src/routes/app/_workspace/_main/signal/index.tsx

Comment thread apps/web/src/components/signals/greeting.tsx Outdated
Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

2 issues found across 8 files

Confidence score: 4/5

  • This PR looks safe to merge with minimal risk: both findings are moderate/low severity and appear to affect display text quality rather than core app flow.
  • The most impactful issue is in apps/web/src/components/signals/greeting.tsx, where ?? does not handle empty/whitespace-only userName, so the greeting can render a blank or awkward first-name segment for some users.
  • apps/web/src/components/signals/action-row/rows.tsx may render an incomplete duplicate message ("is a duplicate of ...") when the source thread is missing because the fallback reason is skipped.
  • Pay close attention to apps/web/src/components/signals/greeting.tsx and apps/web/src/components/signals/action-row/rows.tsx - user-facing text can become blank or incomplete in edge cases.
Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="apps/web/src/components/signals/action-row/rows.tsx">

<violation number="1" location="apps/web/src/components/signals/action-row/rows.tsx:137">
P2: `DuplicateActionRow` now skips the fallback reason when the source thread is missing, which can render an incomplete message (`"is a duplicate of ..."`) with no source thread label.</violation>
</file>

<file name="apps/web/src/components/signals/greeting.tsx">

<violation number="1" location="apps/web/src/components/signals/greeting.tsx:7">
P2: The nullish coalescing operator (`??`) doesn't guard against empty strings — it only triggers on `null`/`undefined`. When `userName` is empty or whitespace-only, `trim().split(/\s+/)[0]` yields `""` (not `null`), so the fallback never fires and the greeting renders as "Good morning, ." with no name.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Comment thread apps/web/src/components/signals/action-row/rows.tsx Outdated
Comment thread apps/web/src/components/signals/greeting.tsx Outdated
Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

0 issues found across 2 files (changes from recent commits).

Requires human review: This PR restructures UI components and comments out the LeverageReport feature without mention, which requires a human to verify intent and ensure no unintended removal.

@pedroscosta pedroscosta merged commit a9919d8 into main May 11, 2026
4 checks passed
@pedroscosta pedroscosta deleted the feat/signals-page-items-redesign branch May 11, 2026 17:45
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.

1 participant