diff --git a/src/app/globals.css b/src/app/globals.css index 4c778e61..7ce19af5 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -155,6 +155,59 @@ body { animation: fadeUp 0.7s ease-out; } +/* ───────────────────────────────────────── + MICRO-ANIMATION UTILITIES + ───────────────────────────────────────── */ + +/* Staggered animation delays for child elements */ +.stagger-children > *:nth-child(1) { animation-delay: 0ms; } +.stagger-children > *:nth-child(2) { animation-delay: 50ms; } +.stagger-children > *:nth-child(3) { animation-delay: 100ms; } +.stagger-children > *:nth-child(4) { animation-delay: 150ms; } +.stagger-children > *:nth-child(5) { animation-delay: 200ms; } +.stagger-children > *:nth-child(6) { animation-delay: 250ms; } +.stagger-children > *:nth-child(7) { animation-delay: 300ms; } +.stagger-children > *:nth-child(8) { animation-delay: 350ms; } +.stagger-children > *:nth-child(9) { animation-delay: 400ms; } +.stagger-children > *:nth-child(10) { animation-delay: 450ms; } + +/* Shimmer skeleton loading effect */ +.skeleton-shimmer { + background: linear-gradient( + 90deg, + var(--card-muted) 0%, + color-mix(in srgb, var(--card-muted) 60%, var(--border) 40%) 50%, + var(--card-muted) 100% + ); + background-size: 200% 100%; + animation: shimmer 1.8s ease-in-out infinite; +} + +/* Interactive stat cell — hover lift + glow */ +.stat-cell { + transition: transform 200ms ease, box-shadow 200ms ease, background-color 200ms ease, border-color 200ms ease; +} +.stat-cell:hover { + transform: translateY(-2px); + box-shadow: 0 4px 16px -4px rgba(96, 165, 250, 0.15); +} + +/* Interactive list item — subtle left-border reveal + slide */ +.list-item-hover { + transition: transform 200ms ease, background-color 200ms ease, box-shadow 200ms ease, border-color 200ms ease; + border-left: 3px solid transparent; +} +.list-item-hover:hover { + transform: translateX(4px); + border-left-color: var(--accent); + box-shadow: 0 2px 8px -2px rgba(96, 165, 250, 0.1); +} + +/* Progress bar animated fill */ +.progress-fill { + transition: width 600ms cubic-bezier(0.4, 0, 0.2, 1); +} + /* ───────────────────────────────────────── DARK MODE GLOBAL TYPOGRAPHY ───────────────────────────────────────── */ diff --git a/src/components/AIMentorWidget.tsx b/src/components/AIMentorWidget.tsx index 28fe8b3c..9e360a73 100644 --- a/src/components/AIMentorWidget.tsx +++ b/src/components/AIMentorWidget.tsx @@ -39,7 +39,7 @@ function SkeletonCard() { role="status" aria-busy="true" aria-live="polite" - className="rounded-xl border border-[var(--border)] bg-[var(--card)] p-6 shadow-sm animate-pulse" + className="rounded-xl border border-[var(--border)] bg-[var(--card)] p-6 shadow-sm animate-pulse transition-all duration-300 hover:shadow-md hover:-translate-y-1" > Loading AI Mentor insights
{error}
{code}
diff --git a/src/components/CIAnalytics.tsx b/src/components/CIAnalytics.tsx
index 6b908401..80894dcf 100644
--- a/src/components/CIAnalytics.tsx
+++ b/src/components/CIAnalytics.tsx
@@ -104,7 +104,7 @@ export default function CIAnalytics() {
: "Refresh";
return (
- Flakiest workflow
diff --git a/src/components/CodingActivityInsightsCard.tsx b/src/components/CodingActivityInsightsCard.tsx index f3d6375b..176384b7 100644 --- a/src/components/CodingActivityInsightsCard.tsx +++ b/src/components/CodingActivityInsightsCard.tsx @@ -229,7 +229,7 @@ export default function CodingActivityInsightsCard() { : `${dataWindowLabel} · Commits by hour · Local timezone`; return ( -