feat(ui): revamp corporate supporters carousel (Infinite Marquee + Dark Mode fix)#3837
Conversation
Summary by CodeRabbit
WalkthroughReworks LogoCarousel rendering and animation timing, replaces Next/Image fill usage with explicit width/height and class-based styling, duplicates sponsor tracks with deterministic keys, updates Tailwind marquee keyframes/duration, and adjusts Jest Image mock and unit tests to match the new DOM and timing. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
No actionable comments were generated in the recent review. 🎉 🧹 Recent nitpick comments
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@frontend/src/components/LogoCarousel.tsx`:
- Around line 22-36: The sponsor card in LogoCarousel currently renders an empty
span when both sponsor.imageUrl and sponsor.name are falsy; update the render
logic in the LogoCarousel component (the block using Link, Image and the
fallback span) to detect when both are empty and either (a) render a generic
accessible placeholder label like "Sponsor" inside the span (e.g., fallback text
and an aria-label) or (b) skip rendering the card entirely for that sponsor;
ensure the chosen approach sets visible text or an aria-label so the card is not
blank and remains accessible.
🧹 Nitpick comments (2)
frontend/__tests__/unit/components/LogoCarousel.test.tsx (2)
126-132: Test name is misleading: "renders empty div" → actually renders a fallback text span.The test body correctly asserts 0 images and 4 links, but the
it(...)description says "renders empty div when imageUrl is not provided." The component actually renders<span className="text-sm text-gray-400">{sponsor.name}</span>. Consider updating the description to match:- it('renders empty div when imageUrl is not provided', () => { + it('renders fallback text when imageUrl is not provided', () => {
341-356: Duplicate tests: "renders sponsor names correctly in alt attributes" and "renders image alt text correctly" are identical.Both tests render the same data and assert the exact same alt text values on the same elements. Consider removing one.
|
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #3837 +/- ##
=======================================
Coverage 90.24% 90.24%
=======================================
Files 463 463
Lines 14416 14416
Branches 1937 1937
=======================================
Hits 13009 13009
Misses 988 988
Partials 419 419
Flags with carried forward coverage won't be shown. Click here to find out more.
Continue to review full report in Codecov by Sentry.
🚀 New features to boost your workflow:
|
kasya
left a comment
There was a problem hiding this comment.
@CYBORG-YASHRAJ Thanks for working on this!
The change looks good 👍🏼 I was thinking bout making the dark theme background less contrasting, but some of the sponsor images have white background. So let's keep it this way 👌🏼
One note though, make sure you run make check-test before requesting a review, not just check that off in the PR template. The checks were failing in multiple places.
I fixed those issues and pushed changes.
|
@kasya Thanks for the review! My bad on the checks earlier—you’re right, I should’ve run make check-test locally before requesting the review instead of just ticking it off in the PR. I’ve fixed the issues and pushed the updated changes. Thanks for pointing it out and for taking the time to review this 🙏 |
* Run make update * Clean up snapshot generated videos * Update backend/data/nest.dump * feat(ui): revamp corporate supporters carousel (Infinite Marquee + Dark Mode fix) (#3837) * feat(ui): revamp corporate supporters carousel (Infinite Marquee + Dark Mode fix) * fix: resolve failing test case * fix: add fallback text for unnamed sponsors * docs: add docstrings to satisfy coverage requirements * Run make check and fix tests. --------- Co-authored-by: Kate <kate@kgthreads.com> * Fix/redundant typescript assertion (#3834) * Fix Sonar S4325 by narrowing session user fields instead of casting * Fix unused ExtendedSession in mentorship page * fix: redundant-typescript-assertion * Fix stale latest date displayed in Project Health Dashboard metrics (#3842) * Fixed latest date in proejct health dashboard * updated order * Update code * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> * feat: improve backend test coverage to 96% (#3840) * feat: improve backend test coverage to 96% * fix comments * fix issues * fix issue * fix cubic-dev-ai comments * Update code * Fix tests --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> * Fix: merge consecutive RUN instructions in frontend Dockerfile (#3644) * Fix: merge consecutive RUN instructions in frontend Dockerfile * fix: comment Dockerfile note to prevent syntax error * Update code * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> * Fix 'is_merged' not being available on the Issue (#3843) * Fix 'is_merged' not being available on the Issue * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> * CI: Add ansible-lint workflow for Ansible playbooks (#3796) * ci: add ansible-lint workflow Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * Update .github/workflows/lint-ansible.yaml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * ci: add ansible-lint make target and workflow Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * ci: add ansible-lint pre-commit hook Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * fix: whitespace & version Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * Update Makefile Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> * ci: enable ansible-lint scanning and add requirements.yml Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * chore(ansible):align linting and module usage Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * ci(ansible): install collections before deploy playbooks Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * Update code * Update code * Update .github/workflows/run-ci-cd.yaml --------- Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> * Fix ElevenLabs API error (#3861) * use default liam voice * bump speed by 0.10 --------- Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> * Add Ime Iyonsi to MENTORS.md (#3866) * Add mentor profile for Ime Iyonsi Added Ime Iyonsi's mentor profile. * Fix GitHub link for Ime Iyonsi Corrected GitHub link for Ime Iyonsi. * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> * Update MENTORS.md * Enabled Strict Mode (#3776) * Enabled Strict Mode * fixed ai review * fix * fixed review * fix * update test * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> * Resolve case-sensitivity in QueryParser to support Chapters/Members search (#3844) * resolve query parser blocker * use case_sensitive flag in QueryParser * feat: add case_sensitive option to QueryParser and update tests * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> * Update dependencies (#3874) * Update dependencies * Bump django-ninja version * fix(proxy): pin nginx and certbot images (#3848) * fix(proxy): pin nginx and certbot images Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> * fix stable verssions Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> --------- Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> * Update docker-compose/proxy/compose.yaml * Update backend/pyproject.toml * Update ansible lint configuration (#3880) * Update .github/ansible/.ansible-lint.yaml * Improve frontend test coverage above 80% and add missing test files (#3864) * Imrove test coverage to 80% and added test * Fixed coderabbit review * update code * fixed coderabbit ai * fixed soanrqube warning * fixed review * update * fixed aloglia cache_key (#3825) * fixed aloglia cache_key * change separator val to be semicolon (;) * Update code * add tests + use json filters * add trailing newline * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> * fix: remove unused className prop from AnchorTitle component (#3822) * fix: remove unused className prop from AnchorTitle component Fixes #3805 The className prop was defined in AnchorTitleProps but never used in the component implementation. Removing it resolves Sonar rule typescript:S6767 and improves code maintainability. * fix: use className prop instead of removing it - Added className back to AnchorTitleProps interface - Accept className parameter in component - Apply className to root div element - Resolves reviewer feedback on PR #3822 * Update code --------- Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> --------- Signed-off-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> Co-authored-by: Arkadii Yakovets <arkadii.yakovets@owasp.org> Co-authored-by: Yashraj Pahuja <yashrajpahuja9999@gmail.com> Co-authored-by: Kate <kate@kgthreads.com> Co-authored-by: CodeAritraDhank <aritradhank21@gmail.com> Co-authored-by: Anurag Yadav <143180737+anurag2787@users.noreply.github.com> Co-authored-by: Harshit Verma <harshit1092004@gmail.com> Co-authored-by: Arkadii Yakovets <2201626+arkid15r@users.noreply.github.com> Co-authored-by: Shuban Mutagi <shubanmutagi55@gmail.com> Co-authored-by: Muhammad Hassaan Saleem <iamhassaans@gmail.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com> Co-authored-by: emaybu <152900874+emaybu@users.noreply.github.com> Co-authored-by: sai chethana <saichethanavesireddy@gmail.com> Co-authored-by: Rahul Paul <179798584+Mr-Rahul-Paul@users.noreply.github.com> Co-authored-by: Lavanya <lavanyayadawad30@gmail.com>



Proposed change
Resolves #3800
This PR completely revamps the Corporate Supporters Carousel to address UI regressions in Dark Mode, normalize logo sizing, and implement a high-performance Infinite Scrolling Marquee as requested by @arkid15r.
🔧 Key Changes
🌙 Dark Mode & UI Visibility (LogoCarousel.tsx)
The Issue: Transparent PNG logos were invisible against the dark background in Dark Mode.
The Fix: Wrapped each logo in a standardized White Card container (bg-white rounded-lg shadow-md).
Optimization: Reduced internal padding from p-5 to px-3 py-1. This maximizes the render area, ensuring wider logos are displayed at a legible size without excessive whitespace.
🔄 Infinite Marquee Animation (tailwind.config.mjs)
Math Fix: Changed translateX(-500%) to translateX(-50%).
Reasoning: We render the logo list exactly twice. Translating by 50% of the total width moves the strip by exactly one full set length, creating a seamless mathematical loop.
UX Improvement: Added group-hover:paused so users can pause the scrolling to click a sponsor link.
Pacing: Adjusted animation duration multiplier (from 2s to 3s per item) for a smoother, less dizzying scroll speed.
📐 Layout & Normalization
Sizing: Switched from absolute positioning (layout="fill") to explicit dimensions (width={168} height={72}) with object-fit: contain. This prevents layout shifts and ensures consistent aspect ratios across all sponsors.
Container: Changed the scroll container from w-full to w-max. This allows the flex container to expand to its natural width (2x the logos), ensuring the animation logic holds true on all screen sizes.
🧪 Tests (LogoCarousel.test.tsx)
Updated all unit tests to match the new DOM structure (checking for .bg-white wrappers instead of relative divs).
Updated duration assertions to match the new 3s multiplier.
Screen.Recording.2026-02-07.232504.mp4
[x] Required: I followed the (https://github.com/OWASP/Nest/blob/main/CONTRIBUTING.md#contributing-workflow)
[x] Required: I verified that my code works as intended and resolves the issue as described
[x] Required: I ran make check-test locally: all warnings addressed, tests passed
[x] I used AI for code, documentation, tests, or communication related to this PR