-
Notifications
You must be signed in to change notification settings - Fork 69
β¨ feat: add shimmer animation for enhanced UI effects #441
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weβll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -9,9 +9,11 @@ import { | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| PageActions, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| } from "../../../components/index"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import { useTranslations } from "next-intl"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| import { useState } from "react"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| export default function MaintainerLadderPage() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const t = useTranslations("ladderPage"); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const [hoveredLevel, setHoveredLevel] = useState<number | null>(null); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| const levels = [ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -259,185 +261,227 @@ export default function MaintainerLadderPage() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| <section className="py-8 sm:py-12 md:py-16 lg:py-20"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* Mobile Layout */} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="lg:hidden"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="lg:hidden space-y-6"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| {levels.map((level, index) => ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div key={level.id} className="mb-4"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* Level Card */} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="bg-gray-800/40 backdrop-blur-md rounded-lg p-6 border border-white/10 relative"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* Level Number */} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div className="absolute -top-6 left-1/2 transform -translate-x-1/2"> | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| key={level.id} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| className="relative group" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| onMouseEnter={() => setHoveredLevel(level.id)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| onMouseLeave={() => setHoveredLevel(null)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| > | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| {/* Glowing border effect */} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| <div | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
| className={`absolute -inset-[2px] bg-gradient-to-r ${level.gradient} rounded-xl opacity-0 group-hover:opacity-70 blur-sm transition-opacity duration-500`} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
| className={`absolute -inset-[2px] bg-gradient-to-r ${level.gradient} rounded-xl opacity-0 group-hover:opacity-70 blur-sm transition-opacity duration-500`} | |
| className={`absolute -inset-[2px] bg-gradient-to-r ${level.gradient} rounded-xl opacity-0 group-hover:opacity-70 blur-lg transition-opacity duration-500`} |
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Performance concern: Each level item creates multiple animated blur effects that render on hover. With multiple levels on the page, this could cause performance issues, especially on lower-end devices. Consider using CSS containment properties or will-change hints to optimize rendering performance.
| ></div> | |
| <div className="relative bg-gradient-to-br from-gray-900/90 to-gray-800/90 backdrop-blur-xl rounded-xl p-5 border border-white/5 overflow-hidden"> | |
| {/* Animated background particles */} | |
| <div className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-700"> | |
| <div | |
| className={`absolute top-0 left-0 w-32 h-32 bg-gradient-to-br ${level.gradient} rounded-full blur-3xl opacity-20`} | |
| ></div> | |
| <div | |
| className={`absolute bottom-0 right-0 w-32 h-32 bg-gradient-to-tl ${level.gradient} rounded-full blur-3xl opacity-20`} | |
| style={{ willChange: "opacity" }} | |
| ></div> | |
| <div className="relative bg-gradient-to-br from-gray-900/90 to-gray-800/90 backdrop-blur-xl rounded-xl p-5 border border-white/5 overflow-hidden"> | |
| {/* Animated background particles */} | |
| <div | |
| className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-700" | |
| style={{ contain: "paint" }} | |
| > | |
| <div | |
| className={`absolute top-0 left-0 w-32 h-32 bg-gradient-to-br ${level.gradient} rounded-full blur-3xl opacity-20`} | |
| style={{ willChange: "opacity" }} | |
| ></div> | |
| <div | |
| className={`absolute bottom-0 right-0 w-32 h-32 bg-gradient-to-tl ${level.gradient} rounded-full blur-3xl opacity-20`} | |
| style={{ willChange: "opacity" }} |
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The shimmer and animation effects lack accessibility considerations. Users with vestibular disorders or motion sensitivity may experience discomfort. Consider adding a check for the prefers-reduced-motion media query to disable or reduce animations for users who have enabled this setting in their system preferences.
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The text truncation with line-clamp-2 on the description may hide important information without providing a way to expand or view the full content. Consider adding a tooltip or expandable section to ensure all content remains accessible to users.
| <p className="text-gray-400 text-sm mb-3 line-clamp-2"> | |
| <p | |
| className="text-gray-400 text-sm mb-3 line-clamp-2" | |
| title={level.description} | |
| > |
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The text is truncated with line-clamp-1 which may hide important requirement details. Consider removing the truncation or providing a way to view the complete text to ensure all information is accessible.
| <p className="text-xs text-gray-400 line-clamp-1"> | |
| <p | |
| className="text-xs text-gray-400 line-clamp-1" | |
| title={req} | |
| aria-label={req} | |
| > |
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The requirements are truncated to show only the first 2 items with a "+X more" indicator. This hides potentially critical information from users. Consider showing all requirements or providing an interactive way to expand and view the complete list.
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The animate-pulse effect on the central ladder line runs continuously, which could be distracting and may cause issues for users with motion sensitivity. Consider making this animation respect the prefers-reduced-motion setting.
| <div className="absolute inset-0 bg-gradient-to-b from-blue-400 via-purple-400 to-red-400 animate-pulse opacity-50"></div> | |
| <div className="absolute inset-0 bg-gradient-to-b from-blue-400 via-purple-400 to-red-400 animate-pulse motion-reduce:animate-none opacity-50"></div> |
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Same accessibility issue with keyboard navigation. The hover effects triggered by onMouseEnter and onMouseLeave are not accessible to keyboard users. Add onFocus and onBlur handlers and ensure keyboard accessibility.
| className="relative z-20 mb-8" | |
| onMouseEnter={() => setHoveredLevel(level.id)} | |
| onMouseLeave={() => setHoveredLevel(null)} | |
| className="relative z-20 mb-8" | |
| tabIndex={0} | |
| onMouseEnter={() => setHoveredLevel(level.id)} | |
| onMouseLeave={() => setHoveredLevel(null)} | |
| onFocus={() => setHoveredLevel(level.id)} | |
| onBlur={() => setHoveredLevel(null)} |
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Duplicate code pattern: The glowing border effect and animated background particles are duplicated between mobile (lines 273-286) and desktop (lines 388-398) layouts. Consider extracting this into a reusable component to improve maintainability and reduce code duplication.
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The nested group classes (group and group/item) create a nested hover state system. However, the group-hover/item:scale-150 transition on the bullet point may be too aggressive and could cause layout shifts. Consider using a more subtle scale value like scale-125 to prevent visual jumping.
| className={`w-1.5 h-1.5 rounded-full bg-gradient-to-r ${level.gradient} mt-1.5 flex-shrink-0 group-hover/item:scale-150 transition-transform duration-200`} | |
| className={`w-1.5 h-1.5 rounded-full bg-gradient-to-r ${level.gradient} mt-1.5 flex-shrink-0 group-hover/item:scale-125 transition-transform duration-200`} |
Copilot
AI
Jan 14, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The animate-ping effect continuously animates, which could be distracting and cause performance issues. Additionally, this animation should respect the prefers-reduced-motion setting for users with motion sensitivity. Consider conditionally rendering this effect or using CSS to disable it based on the media query.
| className={`absolute inset-0 rounded-full bg-gradient-to-br ${level.gradient} animate-ping opacity-75`} | |
| className={`absolute inset-0 rounded-full bg-gradient-to-br ${level.gradient} motion-safe:animate-ping opacity-75`} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The hover effects with onMouseEnter and onMouseLeave are not keyboard accessible. Users navigating with keyboard or screen readers won't be able to trigger these effects. Consider adding onFocus and onBlur event handlers, and ensuring the elements are keyboard-focusable with appropriate tabIndex values.