Skip to content

feat(contacts): add image carousel and update section description#2171

Merged
ComputelessComputer merged 2 commits intomainfrom
feat/add-image-carousel-contacts
Dec 8, 2025
Merged

feat(contacts): add image carousel and update section description#2171
ComputelessComputer merged 2 commits intomainfrom
feat/add-image-carousel-contacts

Conversation

@ComputelessComputer
Copy link
Collaborator

Description

  • Added image carousel to the contacts section
  • Updated section description for improved clarity and user experience

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 8, 2025

📝 Walkthrough

Walkthrough

Replaces NoteshelfSection with a FoldersSection, converts ContactsSection to an auto-rotating image carousel, adds an AdvancedSearchSection image-swiper with progress-based autoplay and pause-on-hover, standardizes list icons to CheckIcon, and adds "Coming soon" badges and copy updates across the mini-apps page.

Changes

Cohort / File(s) Summary
Folders migration & label updates
apps/web/src/routes/_view/product/mini-apps.tsx
Renamed NoteshelfSection → FoldersSection; updated section IDs, headings, copy, and placeholder imagery to reflect folder terminology.
Icon consolidation
apps/web/src/routes/_view/product/mini-apps.tsx
Replaced previous Icon usage with CheckIcon across CalendarSection, DailyNotesSection and list items for consistent iconography.
Contacts → Carousel
apps/web/src/routes/_view/product/mini-apps.tsx
Converted ContactsSection from static two-column layout to an image carousel with currentImage state and 4s auto-rotation; uses opacity transitions for image visibility.
AdvancedSearch image-swiper
apps/web/src/routes/_view/product/mini-apps.tsx
Added advancedSearchImages and timing constants; implemented per-tab images, per-tab progress tracking, requestAnimationFrame-based autoplay with pause-on-hover, and click-to-switch/reset behavior.
Copy/UI tweaks & hygiene
apps/web/src/routes/_view/product/mini-apps.tsx
Updated CTASection copy to reference folders; added "Coming soon" badges in DailyNotesSection; adjusted wrappers and image source mappings.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

  • Review requestAnimationFrame loop, progress math, and cleanup to avoid RAF leaks or stale closures.
  • Verify pause-on-hover and tab click interactions correctly start/stop/reset autoplay across tabs.
  • Confirm carousel timing (ContactsSection) and opacity transitions are smooth and accessible.
  • Check that CheckIcon replacements preserve semantics/ARIA and visual consistency.
  • Inspect single-file complexity for unintended layout regressions or state interactions.

Possibly related PRs

Suggested reviewers

  • yujonglee

Pre-merge checks and finishing touches

❌ Failed checks (3 warnings)
Check name Status Explanation Resolution
Title check ⚠️ Warning The title focuses on contacts carousel and description updates, but the changeset includes substantial modifications to multiple sections (Folders, Calendar, DailyNotes, AdvancedSearch) beyond just the contacts section. Update the title to reflect the broader scope of changes, such as: 'feat: update mini-apps sections with image carousels and folder support' or provide a more accurate title covering all affected sections.
Description check ⚠️ Warning The description mentions only the contacts section carousel and description updates, but the changeset includes significant changes to NoteshelfSection, AdvancedSearchSection, CalendarSection, DailyNotesSection, and general terminology updates. Expand the description to cover all major changes including folder support, multiple section enhancements, and advanced search carousel with autoplay functionality for complete transparency.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/add-image-carousel-contacts

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.

@netlify
Copy link

netlify bot commented Dec 8, 2025

Deploy Preview for hyprnote ready!

Name Link
🔨 Latest commit 9609825
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote/deploys/6936b831a69cfe000809a6bb
😎 Deploy Preview https://deploy-preview-2171--hyprnote.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify
Copy link

netlify bot commented Dec 8, 2025

Deploy Preview for hyprnote-storybook ready!

Name Link
🔨 Latest commit 9609825
🔍 Latest deploy log https://app.netlify.com/projects/hyprnote-storybook/deploys/6936b831041d5f0008fdcd11
😎 Deploy Preview https://deploy-preview-2171--hyprnote-storybook.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

Copy link
Contributor

@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

Caution

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

⚠️ Outside diff range comments (1)
apps/web/src/routes/_view/product/mini-apps.tsx (1)

77-127: Add accessibility controls for auto-rotating carousel.

The auto-rotating carousel lacks essential accessibility features:

  • No pause/play controls (violates WCAG 2.2.2 - users cannot pause auto-updating content)
  • No keyboard navigation (arrow keys to switch images)
  • No screen reader announcements when images change
  • No visual indicators for current slide position

Consider adding:

  1. Pause/play button for user control
  2. Keyboard event handlers for arrow key navigation
  3. aria-live="polite" region to announce image changes
  4. Visual indicators (dots) showing current position
 function ContactsSection() {
   const [currentImage, setCurrentImage] = useState(0);
+  const [isPaused, setIsPaused] = useState(false);

   const images = [
     "/api/images/hyprnote/mini-apps/contacts-human.jpg",
     "/api/images/hyprnote/mini-apps/contacts-org.jpg",
   ];

   useEffect(() => {
+    if (isPaused) return;
     const interval = setInterval(() => {
       setCurrentImage((prev) => (prev + 1) % images.length);
     }, 4000);

     return () => clearInterval(interval);
-  }, [images.length]);
+  }, [images.length, isPaused]);

Additionally, add pause/play button and keyboard handlers in the JSX.

🧹 Nitpick comments (1)
apps/web/src/routes/_view/product/mini-apps.tsx (1)

536-568: Improve accessibility with proper ARIA tablist pattern.

The tab interface should use the proper ARIA pattern for better screen reader support and keyboard navigation.

Add ARIA attributes and keyboard handlers:

-          <div className="grid md:grid-cols-3 border-y border-neutral-100">
+          <div 
+            className="grid md:grid-cols-3 border-y border-neutral-100"
+            role="tablist"
+            aria-label="Search feature examples"
+          >
             {images.map((image, index) => (
               <button
                 key={image.id}
+                role="tab"
+                aria-selected={selectedImage === image.id}
+                aria-controls={`search-panel-${image.id}`}
                 className={cn([
                   "text-center cursor-pointer transition-colors relative overflow-hidden",
                   index < images.length - 1 && "border-r border-neutral-100",
                 ])}

Also consider adding visual focus indicators for keyboard navigation.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3b11985 and 9860bf5.

📒 Files selected for processing (1)
  • apps/web/src/routes/_view/product/mini-apps.tsx (12 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, use cn (import from @hypr/utils). It is similar to clsx. Always pass an array and split by logical grouping.
Use motion/react instead of framer-motion.

Files:

  • apps/web/src/routes/_view/product/mini-apps.tsx
🧬 Code graph analysis (1)
apps/web/src/routes/_view/product/mini-apps.tsx (1)
packages/utils/src/cn.ts (1)
  • cn (20-22)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: Redirect rules - hyprnote-storybook
  • GitHub Check: Header rules - hyprnote-storybook
  • GitHub Check: Pages changed - hyprnote-storybook
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: fmt
  • GitHub Check: ci
🔇 Additional comments (4)
apps/web/src/routes/_view/product/mini-apps.tsx (4)

142-158: LGTM! CheckIcon updates and "Coming soon" badges improve visual consistency.

The replacement of generic icon components with CheckIcon from lucide-react provides better visual consistency. The addition of "Coming soon" badges in DailyNotesSection clearly communicates feature availability to users.

Also applies to: 210-226, 284-309, 331-356


369-449: LGTM! FoldersSection properly replaces NoteshelfSection.

The section rename and content updates are well-implemented with consistent styling and layout patterns matching other sections.


600-601: LGTM! CTA text updated to reflect folders feature.

The text update correctly mentions folders alongside contacts and calendar, aligning with the new FoldersSection.


3-4: LGTM! Imports and utility usage follow coding guidelines.

The imports are appropriate and the cn utility is correctly used with arrays throughout the file, consistent with the coding guidelines.

Also applies to: 6-6

@ComputelessComputer ComputelessComputer force-pushed the feat/add-image-carousel-contacts branch from 9860bf5 to 9609825 Compare December 8, 2025 11:36
Copy link
Contributor

@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: 0

🧹 Nitpick comments (1)
apps/web/src/routes/_view/product/mini-apps.tsx (1)

80-91: Move images array outside component for consistency.

The images array is defined inside the component, creating a new reference on each render. While images.length as a dependency is stable, this pattern was already fixed in AdvancedSearchSection by moving the array to module scope. Apply the same pattern here for consistency.

+const CONTACTS_IMAGES = [
+  "/api/images/hyprnote/mini-apps/contacts-human.jpg",
+  "/api/images/hyprnote/mini-apps/contacts-org.jpg",
+];
+
 function ContactsSection() {
   const [currentImage, setCurrentImage] = useState(0);

-  const images = [
-    "/api/images/hyprnote/mini-apps/contacts-human.jpg",
-    "/api/images/hyprnote/mini-apps/contacts-org.jpg",
-  ];
-
   useEffect(() => {
     const interval = setInterval(() => {
-      setCurrentImage((prev) => (prev + 1) % images.length);
+      setCurrentImage((prev) => (prev + 1) % CONTACTS_IMAGES.length);
     }, 4000);

     return () => clearInterval(interval);
-  }, [images.length]);
+  }, []);

Then update the images.map call on line 109 to use CONTACTS_IMAGES.map.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9860bf5 and 9609825.

📒 Files selected for processing (1)
  • apps/web/src/routes/_view/product/mini-apps.tsx (11 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx}: Avoid creating a bunch of types/interfaces if they are not shared. Especially for function props, just inline them instead.
Never do manual state management for form/mutation. Use useForm (from tanstack-form) and useQuery/useMutation (from tanstack-query) instead for 99% of cases. Avoid patterns like setError.
If there are many classNames with conditional logic, use cn (import from @hypr/utils). It is similar to clsx. Always pass an array and split by logical grouping.
Use motion/react instead of framer-motion.

Files:

  • apps/web/src/routes/_view/product/mini-apps.tsx
🧬 Code graph analysis (1)
apps/web/src/routes/_view/product/mini-apps.tsx (1)
packages/utils/src/cn.ts (1)
  • cn (20-22)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (8)
  • GitHub Check: Redirect rules - hyprnote-storybook
  • GitHub Check: Header rules - hyprnote-storybook
  • GitHub Check: Pages changed - hyprnote-storybook
  • GitHub Check: Redirect rules - hyprnote
  • GitHub Check: Header rules - hyprnote
  • GitHub Check: Pages changed - hyprnote
  • GitHub Check: ci
  • GitHub Check: fmt
🔇 Additional comments (8)
apps/web/src/routes/_view/product/mini-apps.tsx (8)

1-6: LGTM!

Imports are appropriate for the new carousel functionality and icon standardization.


142-158: LGTM!

Icon standardization to CheckIcon is consistent and properly styled.


284-309: LGTM!

The "Coming soon" badges are appropriately styled and consistently applied across all feature items in both desktop and mobile views.


369-449: LGTM!

Clean section rename from NoteshelfSection to FoldersSection with appropriate content updates and consistent styling.


451-473: Past review feedback addressed.

The advancedSearchImages array and ADVANCED_SEARCH_AUTO_ADVANCE_DURATION constant have been correctly moved to module scope, preventing unnecessary re-renders and animation resets.


481-519: LGTM!

The requestAnimationFrame-based animation with pause/resume support is well-implemented. Using progressRef to preserve progress state across pause cycles is a good pattern.


538-569: LGTM!

The tab rendering with progress overlay and pause-on-hover is well-implemented. The cn usage follows the coding guidelines with array format for logical grouping.


604-605: LGTM!

CTA copy appropriately updated to reflect the new folders terminology.

@ComputelessComputer ComputelessComputer merged commit facd410 into main Dec 8, 2025
13 checks passed
@ComputelessComputer ComputelessComputer deleted the feat/add-image-carousel-contacts branch December 8, 2025 12:57
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