Skip to content

improve background colour and overall visual heirerchy of dashboard…#66

Merged
nitinmohan18 merged 3 commits into
mainfrom
dashboard-ref
Jul 7, 2026
Merged

improve background colour and overall visual heirerchy of dashboard…#66
nitinmohan18 merged 3 commits into
mainfrom
dashboard-ref

Conversation

@nitinmohan18

@nitinmohan18 nitinmohan18 commented Jul 7, 2026

Copy link
Copy Markdown
Collaborator

Pull Request

Summary

Upgraded the dashboard cards (QuickActionCard, RecentActivityCard, and Welcome Banner) to a premium SaaS aesthetic. This completely resolves the "flat" feeling in light mode and introduces an authentic, contact-section-inspired glassmorphism in dark mode.


Related Issue

Closes #


Type of Change

  • Feature
  • Bug Fix
  • Documentation
  • Refactor
  • Performance Improvement
  • CI / Build
  • UI/UX Improvement

What Changed?

  • Dark Mode Glassmorphism: Replaced flat backgrounds with a highly translucent bg-slate-900/60 and backdrop-blur-2xl effect, paired with a glowing blue-tinted border (border-blue-400/15) to perfectly match the premium contact page vibe.
  • Light Mode Elevation: Fixed the washed-out flatness by restoring a crisp, opaque bg-white base and adding a much deeper, diffuse drop shadow (0 8px 24px rgba(149,157,165,0.15)), giving the cards actual physical depth over the wavy background.
  • Interactive Hover States: Upgraded hover states across all cards so that they gently lift while the borders and drop shadows smoothly transition to a soft blue tint.

Screenshots (UI Changes Only)

(Attach before/after screenshots of the dashboard in both Light Mode and Dark Mode here)


Testing

  • Verified all UI states (idle, hover, active) in Light Mode to ensure cards are properly elevated off the wavy background.
  • Verified Dark Mode glassmorphism rendering on Chrome, Safari, and Firefox.
  • Ensured perfect legibility of typography against the new translucent and solid backgrounds.

Checklist

Before requesting a review, confirm the following:

  • My branch is up to date with the latest main.
  • My code follows the project's coding standards.
  • I have formatted the modified files (npx prettier --write <file>).
  • npm run format:check passes.
  • npm run lint passes.
  • npm run typecheck passes.
  • npm run build passes.
  • I have updated documentation if required.
  • I have tested my changes locally.
  • This Pull Request focuses on a single feature or fix.

Additional Notes

These changes heavily leverage Tailwind's arbitrary values for precise box-shadows and border opacities to achieve a tier-1 SaaS aesthetic similar to Vercel and Linear.

Summary by CodeRabbit

  • New Features

    • Updated the dashboard with a refreshed welcome banner, animated background effects, and a more polished quick-actions layout.
    • Learning progress cards now show clearer completion details, including percentage progress and themed status indicators.
  • Bug Fixes

    • Improved topic and module rendering so content works whether topic entries are stored as simple IDs or full objects.
  • Style

    • Refined card and banner styling across the dashboard for better visual consistency, including dark-mode enhancements and new animations.

@vercel

vercel Bot commented Jul 7, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
hyper-learning-tech Ready Ready Preview, Comment Jul 7, 2026 12:08pm

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@nitinmohan18, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 54 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: fc5708e5-18c8-40a6-bcb9-d8fc76f32fdc

📥 Commits

Reviewing files that changed from the base of the PR and between 0b97c54 and 53b886f.

📒 Files selected for processing (4)
  • components/dashboard/quick-action-card.tsx
  • components/dashboard/recent-activity-card.tsx
  • components/syllabus/module-card.tsx
  • lib/content/index.ts
📝 Walkthrough

Walkthrough

The dashboard page, quick-action card, and recent-activity card components were restyled with new visual elements (animated background, glow effects, progress bars) and updated props. A CSS pulse-line animation was added. Separately, module card and content lookup logic were updated to support topics represented as strings or objects.

Changes

Dashboard UI Redesign

Layer / File(s) Summary
Dashboard banner and layout rework
app/dashboard/page.tsx
Top wrapper adds an animated SVG background layer, welcome banner copy changes to "Welcome Back, Alex" with a waving emoji, dark-mode ambient glow and "Workspace Active" pulse element are added, and the Quick Actions grid switches to sm:grid-cols-2.
Recent activity card progress rendering
components/dashboard/recent-activity-card.tsx, app/dashboard/page.tsx
statusColor becomes optional; new progressValue and theme props drive a progress bar, knob position, and theme-colored status dot; dashboard page renders two cards with the new props.
Quick action card visual redesign
components/dashboard/quick-action-card.tsx
Style variant map is reduced to wrapper/iconBox fragments; JSX adds a conditional glow and gradient overlay, restyles the icon box, and removes the prior arrow/badge UI.
Pulse-line animation utility
app/globals.css
Adds @keyframes pulse-line and .animate-pulse-line utility for animated stroke-dashoffset effects.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Topic Entry Format Compatibility

Layer / File(s) Summary
String/object topic handling
components/syllabus/module-card.tsx, lib/content/index.ts
Topic list rendering and getTopicById lookup are updated to handle topics that may be either plain strings or objects, deriving id/title accordingly.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

  • imuniqueshiv/HyperLearningTech#11: Both PRs modify the dashboard's app/dashboard/page.tsx UI layout including welcome banner and quick actions/continue-learning cards.

Suggested reviewers: imuniqueshiv

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main dashboard UI focus on background color and visual hierarchy improvements.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dashboard-ref

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
lib/content/index.ts (1)

68-74: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix no-explicit-any by widening SyllabusModule.topics type instead of casting.

CI is failing (@typescript-eslint/no-explicit-any) at Line 105. SyllabusModule.topics (Line 73) is still typed as Topic[], forcing the (item as any).id cast. Widening to Array<Topic | string> lets the typeof check narrow naturally, matching how getTopicById's downstream consumer (lib/ai/topic-service.ts) and ModuleCard both need to handle mixed string/object topics.

🔧 Proposed fix
-  topics?: Topic[];
+  topics?: Array<Topic | string>;
-    const topic = topics.find((item) => {
-      if (typeof item === "string") {
-        return item === topicId;
-      }
-      return (item as any).id === topicId;
-    });
+    const topic = topics.find((item) =>
+      typeof item === "string" ? item === topicId : item.id === topicId
+    );

Also applies to: 101-115

Sources: Linters/SAST tools, Pipeline failures

components/syllabus/module-card.tsx (1)

23-32: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix no-explicit-any by widening the topics type instead of casting.

CI is failing (@typescript-eslint/no-explicit-any) at Line 109 and Line 112. The root cause is that ModuleCardProps.module.topics is still typed as Topic[] (Line 29) even though the code now expects entries that can be strings. Widening the type lets typeof topic === "string" narrow naturally without any casts.

🔧 Proposed fix
-    topics?: Topic[];
+    topics?: Array<Topic | string>;
-          {(module.topics || []).map((topic, index) => {
-            const isString = typeof topic === "string";
-            const topicId = isString ? (topic as string) : (topic as any).id;
-            const topicTitle = isString
-              ? (topic as string)
-              : (topic as any).title;
+          {(module.topics || []).map((topic, index) => {
+            const topicId = typeof topic === "string" ? topic : topic.id;
+            const topicTitle = typeof topic === "string" ? topic : topic.title;

Note: this same Topic[] typing exists on SyllabusModule.topics in lib/content/index.ts (the upstream data contract), so consider updating both consistently.

Also applies to: 107-126

🤖 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 `@components/syllabus/module-card.tsx` around lines 23 - 32, The
`ModuleCardProps.module.topics` type is too narrow and is forcing `any` casts in
`ModuleCard`, so widen the `topics` element type to allow both strings and topic
objects and let the `typeof topic === "string"` check narrow it naturally.
Update the `ModuleCardProps` definition and keep the upstream
`SyllabusModule.topics` contract in `lib/content/index.ts` consistent with the
same union type so the render logic at `ModuleCard` can stop using `any` at the
topic access sites.

Sources: Linters/SAST tools, Pipeline failures

🧹 Nitpick comments (2)
components/dashboard/quick-action-card.tsx (1)

22-38: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

colorVariant names don't match their rendered colors.

"indigo" renders purple-500 classes and "purple" renders amber-500 classes (wrapper, iconBox, and glow). Consumers picking colorVariant="purple" for the AI Tutor card will get amber, not purple — confusing given the type name ColorVariant.

🎨 Proposed fix to align names with colors
     indigo: {
-      wrapper: "hover:border-purple-500/30 focus-visible:ring-purple-500",
-      iconBox: "bg-purple-500/10 text-purple-400 border-purple-500/20",
+      wrapper: "hover:border-indigo-500/30 focus-visible:ring-indigo-500",
+      iconBox: "bg-indigo-500/10 text-indigo-400 border-indigo-500/20",
     },
     emerald: {
       wrapper: "hover:border-emerald-500/30 focus-visible:ring-emerald-500",
       iconBox: "bg-emerald-500/10 text-emerald-400 border-emerald-500/20",
     },
     purple: {
-      wrapper: "hover:border-amber-500/30 focus-visible:ring-amber-500",
-      iconBox: "bg-amber-500/10 text-amber-400 border-amber-500/20",
+      wrapper: "hover:border-purple-500/30 focus-visible:ring-purple-500",
+      iconBox: "bg-purple-500/10 text-purple-400 border-purple-500/20",
     },

and update the glow color ternary (lines 50-57) accordingly.

Also applies to: 49-58

🤖 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 `@components/dashboard/quick-action-card.tsx` around lines 22 - 38, The
ColorVariant mappings in quick-action-card are mismatched, so the variant names
do not match the colors they render. Update the indigo and purple entries in the
variant map used by QuickActionCard so each name consistently uses the expected
Tailwind color classes for wrapper, iconBox, and glow. Also adjust the glow
color ternary in QuickActionCard to follow the same corrected naming, ensuring
consumers of colorVariant receive the intended color.
components/syllabus/module-card.tsx (1)

116-119: 🎯 Functional Correctness | 🔵 Trivial | 💤 Low value

Potential undefined in URL if object topic lacks id.

If an object-shaped topic entry is missing id, topicId is undefined, and encodeURIComponent(topicId) produces the literal string "undefined" in the href, silently breaking the link. Low risk given current data but worth a defensive check given the newly-loosened topic shape.

🤖 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 `@components/syllabus/module-card.tsx` around lines 116 - 119, The topic link
built in module-card.tsx can generate a broken URL when an object-shaped topic
has no id, because encodeURIComponent(topicId) turns undefined into the literal
string "undefined". Update the href logic in the topic rendering path to handle
a missing topicId defensively in the same area as the key={topicId ||
`topic-${index}`} usage, either by omitting the query parameter or falling back
to a safe value before building the /rgpv/.../ai link.
🤖 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 `@components/dashboard/recent-activity-card.tsx`:
- Around line 30-43: The theme-specific class variables in RecentActivityCard
are computed but not applied, so the `theme` prop does not fully affect the card
styling. Update the `RecentActivityCard` render to use `glowBorderClass`,
`iconBgClass`, and `trackBgClass` on the appropriate wrapper, icon, and progress
track elements, and keep the existing `barBgClass`, `dotClass`, and
`statusDotClass` usage aligned with the same theme logic.

---

Outside diff comments:
In `@components/syllabus/module-card.tsx`:
- Around line 23-32: The `ModuleCardProps.module.topics` type is too narrow and
is forcing `any` casts in `ModuleCard`, so widen the `topics` element type to
allow both strings and topic objects and let the `typeof topic === "string"`
check narrow it naturally. Update the `ModuleCardProps` definition and keep the
upstream `SyllabusModule.topics` contract in `lib/content/index.ts` consistent
with the same union type so the render logic at `ModuleCard` can stop using
`any` at the topic access sites.

---

Nitpick comments:
In `@components/dashboard/quick-action-card.tsx`:
- Around line 22-38: The ColorVariant mappings in quick-action-card are
mismatched, so the variant names do not match the colors they render. Update the
indigo and purple entries in the variant map used by QuickActionCard so each
name consistently uses the expected Tailwind color classes for wrapper, iconBox,
and glow. Also adjust the glow color ternary in QuickActionCard to follow the
same corrected naming, ensuring consumers of colorVariant receive the intended
color.

In `@components/syllabus/module-card.tsx`:
- Around line 116-119: The topic link built in module-card.tsx can generate a
broken URL when an object-shaped topic has no id, because
encodeURIComponent(topicId) turns undefined into the literal string "undefined".
Update the href logic in the topic rendering path to handle a missing topicId
defensively in the same area as the key={topicId || `topic-${index}`} usage,
either by omitting the query parameter or falling back to a safe value before
building the /rgpv/.../ai link.
🪄 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: 3f777459-a26c-4d45-8eb3-28c7d598e014

📥 Commits

Reviewing files that changed from the base of the PR and between 45f4c8e and 0b97c54.

📒 Files selected for processing (6)
  • app/dashboard/page.tsx
  • app/globals.css
  • components/dashboard/quick-action-card.tsx
  • components/dashboard/recent-activity-card.tsx
  • components/syllabus/module-card.tsx
  • lib/content/index.ts

Comment on lines +30 to +43
const glowBorderClass = isCyan
? "group-hover:border-cyan-500/30"
: "group-hover:border-orange-500/30";
const iconBgClass = isCyan
? "bg-cyan-500/10 text-cyan-400 border-cyan-500/20"
: "bg-orange-500/10 text-orange-400 border-orange-500/20";
const trackBgClass = "bg-zinc-800/50";
const barBgClass = isCyan
? "bg-cyan-400 shadow-[0_0_15px_rgba(34,211,238,0.56)]"
: "bg-orange-400 shadow-[0_0_15px_rgba(251,146,60,0.56)]";
const dotClass = isCyan
? "bg-white shadow-[0_0_10px_rgba(34,211,238,1)]"
: "bg-white shadow-[0_0_10px_rgba(251,146,60,1)]";
const statusDotClass = isCyan ? "bg-cyan-400" : "bg-orange-400";

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Unused theme classes leave styling incomplete.

Static analysis flags glowBorderClass, iconBgClass, and trackBgClass as unused — they're computed but never applied, so the icon background/border and hover glow-border don't actually reflect the theme prop; only the progress bar/dot/status-dot do.

🎨 Proposed fix to apply the unused classes
       className={`group relative flex flex-col justify-between overflow-hidden rounded-[20px] border border-zinc-200/80 bg-white p-5 shadow-[0_8px_24px_rgba(149,157,165,0.15)] hover:border-blue-200 hover:shadow-[0_8px_24px_rgba(96,165,250,0.2)] hover:-translate-y-1 transition-all duration-300 dark:bg-slate-900/60 dark:border-blue-400/15 dark:bg-gradient-to-b dark:from-white/[0.02] dark:to-transparent dark:shadow-[0_8px_32px_0_rgba(0,0,0,0.2)] dark:hover:shadow-[0_15px_40px_rgba(0,0,0,0.4)] dark:hover:border-blue-400/30 focus-visible:outline-none focus-visible:ring-2 flex-1 h-full ${glowBorderClass}`}
             <div
-              className={`flex h-[42px] w-[42px] shrink-0 items-center justify-center rounded-[12px] border border-zinc-200 bg-zinc-50 dark:border-white/[0.08] dark:bg-[`#0c1017`] dark:shadow-inner transition-colors ${isCyan ? "text-cyan-600 dark:text-cyan-400" : "text-orange-600 dark:text-orange-400"}`}
+              className={`flex h-[42px] w-[42px] shrink-0 items-center justify-center rounded-[12px] border dark:shadow-inner transition-colors ${iconBgClass}`}

Also applies to: 54-56, 84-84

🧰 Tools
🪛 GitHub Actions: CI Pipeline / 0_Format · Lint · Typecheck · Build.txt

[warning] 30-9: ESLint @typescript-eslint/no-unused-vars: 'glowBorderClass' is assigned a value but never used.


[warning] 33-9: ESLint @typescript-eslint/no-unused-vars: 'iconBgClass' is assigned a value but never used.


[warning] 36-9: ESLint @typescript-eslint/no-unused-vars: 'trackBgClass' is assigned a value but never used.

🪛 GitHub Actions: CI Pipeline / Format · Lint · Typecheck · Build

[warning] 30-9: ESLint @typescript-eslint/no-unused-vars: 'glowBorderClass' is assigned a value but never used.


[warning] 33-9: ESLint @typescript-eslint/no-unused-vars: 'iconBgClass' is assigned a value but never used.


[warning] 36-9: ESLint @typescript-eslint/no-unused-vars: 'trackBgClass' is assigned a value but never used.

🪛 GitHub Check: Format · Lint · Typecheck · Build

[warning] 36-36:
'trackBgClass' is assigned a value but never used


[warning] 33-33:
'iconBgClass' is assigned a value but never used


[warning] 30-30:
'glowBorderClass' is assigned a value but never used

🤖 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 `@components/dashboard/recent-activity-card.tsx` around lines 30 - 43, The
theme-specific class variables in RecentActivityCard are computed but not
applied, so the `theme` prop does not fully affect the card styling. Update the
`RecentActivityCard` render to use `glowBorderClass`, `iconBgClass`, and
`trackBgClass` on the appropriate wrapper, icon, and progress track elements,
and keep the existing `barBgClass`, `dotClass`, and `statusDotClass` usage
aligned with the same theme logic.

Source: Linters/SAST tools

@nitinmohan18 nitinmohan18 merged commit c198dfa into main Jul 7, 2026
4 checks passed
@nitinmohan18 nitinmohan18 deleted the dashboard-ref branch July 7, 2026 12:10
@github-actions

github-actions Bot commented Jul 7, 2026

Copy link
Copy Markdown

🎉 Congratulations @nitinmohan18!

Thank you for contributing to HyperLearningTech.

Your pull request has been successfully merged into main.

📦 Merge Summary

🚀 Keep Contributing

  • Follow the CONTRIBUTING.md guidelines.
  • Keep each Pull Request focused on a single feature or fix.
  • Run formatting, linting, type checking, and a production build before opening a PR.

Thank you for helping make HyperLearningTech better.

Happy Coding! 🚀

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