Skip to content

Redesign landing page#18

Open
jnahian wants to merge 5 commits intomainfrom
redesign-landing-page
Open

Redesign landing page#18
jnahian wants to merge 5 commits intomainfrom
redesign-landing-page

Conversation

@jnahian
Copy link
Owner

@jnahian jnahian commented Dec 2, 2025

Description

Please provide a brief description of the changes in this PR.

Type of Change

Please check the relevant option(s):

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update
  • Code refactoring (no functional changes)
  • Performance improvement
  • Test coverage improvement
  • Build/CI configuration change

Related Issues

Link to related issues:

Fixes #(issue number)
Closes #(issue number)
Related to #(issue number)

Changes Made

Please describe the changes in detail:

  • Change 1
  • Change 2
  • Change 3

Testing

Describe the tests you ran to verify your changes:

  • Unit tests added/updated
  • Integration tests added/updated
  • Manual testing performed
  • All existing tests pass

Test Coverage:

  • Test files added/modified:
  • Coverage change:

Manual Testing Steps:

  1. Step 1
  2. Step 2
  3. Step 3

Screenshots (if applicable)

Add screenshots to demonstrate the changes (especially for UI changes):

Checklist

Please check all that apply:

  • My code follows the project's code style
  • I have performed a self-review of my own code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings or errors
  • I have added tests that prove my fix is effective or that my feature works
  • New and existing unit tests pass locally with my changes
  • Any dependent changes have been merged and published

Documentation

Have you updated the relevant documentation?

  • README.md updated (if needed)
  • CHANGELOG.md updated
  • JSDoc comments added/updated
  • User-facing documentation updated (if needed)

Breaking Changes

If this is a breaking change, please describe the impact and migration path:

Performance Impact

Describe any performance implications of these changes:

Additional Notes

Any additional information that reviewers should know:

Summary by CodeRabbit

Release Notes

  • New Features

    • Added interactive visual comparison demonstrating code clarity improvements
    • Implemented smooth in-page navigation with anchor scrolling to key sections
  • UI Improvements

    • Enhanced landing page with fluid animations and improved visual hierarchy
    • Updated color palette to neutral grayscale scheme
    • Added decorative patterns, gradients, and visual elements
    • Introduced new form interaction components (Label, Switch)

✏️ Tip: You can customize this high-level summary in your review settings.

@jnahian jnahian self-assigned this Dec 2, 2025
@vercel
Copy link

vercel bot commented Dec 2, 2025

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

Project Deployment Preview Comments Updated (UTC)
code-context-notes Ready Ready Preview Comment Dec 2, 2025 4:47pm

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 2, 2025

Walkthrough

This PR introduces a comprehensive landing page redesign featuring new Radix UI component wrappers (Label, Switch), extensive framer-motion animation integration across all major sections, four new visual components (HeroVisual, ComparisonVisual, ProblemVisual, SolutionVisual), restructured section layouts with animated Bento-style grids, navigation refactored to in-page smooth-scroll anchors, a grayscale color scheme overhaul, and UI framework configuration via components.json.

Changes

Cohort / File(s) Summary
Configuration
web/components.json, web/tailwind.config.js
Added UI framework configuration with style, RSC, TSX, Tailwind, and icon library settings. Extended Tailwind with new brand and chart color tokens.
Dependencies
web/package.json
Added @radix-ui/react-label, @radix-ui/react-slot, @radix-ui/react-switch, class-variance-authority, clsx, framer-motion, lucide-react, tailwind-merge. Added @types/express to devDependencies.
UI Components
web/src/components/ui/label.tsx, web/src/components/ui/switch.tsx
New Radix UI wrapper components with class-variance-authority styling and forwarded refs.
New Visual Components
web/src/components/landing/HeroVisual.tsx, web/src/components/landing/ComparisonVisual.tsx, web/src/components/landing/ProblemVisual.tsx, web/src/components/landing/SolutionVisual.tsx
Four new animated visual components rendering mock code editors, comparison toggles, and visual demonstrations with framer-motion.
Hero & CTA Sections
web/src/components/landing/HeroSection.tsx, web/src/components/landing/CTASection.tsx
Rewrote HeroSection with two-column grid layout, animated content, and HeroVisual delegate. Replaced AnimatedSection in CTASection with framer-motion, added gradient backgrounds and decorative blobs.
Feature & Problem Sections
web/src/components/landing/FeaturesSection.tsx, web/src/components/landing/ProblemSolutionSection.tsx
Redesigned FeaturesSection to Bento-like animated grid with new features and decorative elements. Restructured ProblemSolutionSection to integrate ComparisonVisual and animated benefits grid.
Quick Start & Stats
web/src/components/landing/QuickStartSection.tsx, web/src/components/landing/StatsSection.tsx
Rebuilt QuickStartSection with step visualizations and motion animations. Migrated StatsSection from AnimatedSection to framer-motion with updated styling.
Navigation & Utils
web/src/components/Navigation.tsx, web/src/lib/utils.ts
Updated Navigation to in-page anchor links with smooth-scroll behavior. Reordered imports in utils.ts.
Global Styling
web/src/index.css
Replaced color tokens with grayscale scheme (light/dark modes), introduced gradient utilities (.bg-gradient-brand, .bg-gradient-dark), grid pattern backgrounds, and updated shadow utilities.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

  • FeaturesSection, QuickStartSection, HeroSection, ProblemSolutionSection: Major section rewrites with animation logic, grid layouts, and new component integrations—verify visual consistency, animation correctness, and responsive behavior across all breakpoints.
  • New visual components (HeroVisual, ComparisonVisual, ProblemVisual, SolutionVisual): Validate framer-motion animation sequences, edge case handling for conditional renders, and accessibility of interactive elements.
  • Global color scheme overhaul in index.css: Confirm all grayscale tokens propagate correctly across light/dark modes and no regressions in previously styled elements; verify new gradient and pattern utilities render correctly.
  • Navigation anchor behavior: Test smooth-scroll functionality in context of page layout and verify fallback behavior when not on root path.
  • Dependency additions: Verify all new packages (radix-ui, framer-motion, class-variance-authority) are correctly integrated and no version conflicts exist.

Poem

🐰 A landing page hops into view,
With motion and animation brand-new!
Smooth scrolls and gradients blend,
Radix UI is now our friend,
The UI transforms—a visual debut! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
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.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Redesign landing page' is clear, concise, and directly related to the main objective of this changeset, which involves comprehensive redesign of multiple landing page components, UI updates, styling changes, and new animations.
✨ 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 redesign-landing-page

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.

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: 5

🧹 Nitpick comments (9)
web/src/components/landing/ProblemVisual.tsx (1)

45-45: Biome lint warnings are false positives for intentional code comment text.

The static analysis flags these lines because they contain // patterns. However, these are intentionally rendered text showing "polluted" code comments as part of the visual demonstration—not actual JSX comments. You can safely ignore or suppress these warnings with inline comments if desired.

{/* biome-ignore lint/suspicious/noCommentText: Intentional code comment display */}
<span className="...">// TODO: Refactor this later...</span>

Also applies to: 63-63, 73-73

web/tailwind.config.js (1)

54-58: Brand colors use hardcoded hex values while other tokens use CSS variables.

This is a minor inconsistency — brand colors are hardcoded hex values, while semantic colors (primary, secondary, etc.) reference CSS variables. Consider using CSS variables for brand colors too if you want to support theme switching.

 brand: {
-  orange: '#FF8A3D',
-  navy: '#0B1220',
-  warm: '#F4F1E9',
+  orange: 'hsl(var(--brand-orange))',
+  navy: 'hsl(var(--brand-navy))',
+  warm: 'hsl(var(--brand-warm))',
 },
web/src/components/ui/label.tsx (2)

1-1: The "use client" directive is unnecessary in a Vite project.

This directive is specific to Next.js App Router. In a Vite-based React project (as indicated by package.json), it has no effect and can be safely removed.

-"use client"
-
 import * as React from "react"

9-11: CVA setup is extensible but currently has no variants.

The labelVariants uses cva with only base styles and no variants defined. This is fine if you plan to add variants later, but if not, you could simplify to just use the className string directly.

web/src/components/Navigation.tsx (1)

22-57: Extract duplicated smooth-scroll logic into a reusable handler.

The onClick logic is repeated three times with only the element ID changing. Consider extracting this into a helper function.

 export function Navigation() {
   const location = useLocation()
+  
+  const handleSectionClick = (e: React.MouseEvent, sectionId: string) => {
+    if (location.pathname === '/') {
+      e.preventDefault();
+      document.getElementById(sectionId)?.scrollIntoView({ behavior: 'smooth' });
+    }
+  };

   return (
     // ...
           <Link
             to="/#problem"
-            onClick={(e) => {
-              if (location.pathname === '/') {
-                e.preventDefault();
-                document.getElementById('problem')?.scrollIntoView({ behavior: 'smooth' });
-              }
-            }}
+            onClick={(e) => handleSectionClick(e, 'problem')}
             className="text-sm font-medium text-muted-foreground transition-colors hover:text-primary"
           >
web/src/components/landing/HeroVisual.tsx (1)

44-61: Consider accessibility for the animated note.

The animated note appears after a 1.5s delay. Screen reader users may not be aware of this delayed content. Consider adding aria-live="polite" to announce the note when it appears, or ensure the note content is available in the DOM from the start (just visually hidden initially).

web/src/components/landing/FeaturesSection.tsx (1)

86-100: Consider will-change or reduced motion for infinite animations.

These three infinite animations run continuously and may consume GPU resources on low-end devices. Consider:

  1. Adding will-change: transform to optimize compositing
  2. Respecting prefers-reduced-motion media query to pause animations for users who prefer reduced motion

You could wrap these in a reduced-motion check:

const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
// Then conditionally set animate prop to undefined when reduced motion is preferred
web/src/components/landing/ComparisonVisual.tsx (2)

80-115: Consider extracting the clutter comment block into a reusable component.

The two AnimatePresence blocks (lines 81-94 and 102-115) are nearly identical, violating the DRY principle. Extract this pattern into a reusable component.

Apply this refactor:

+function ClutterComment({ isClean, comment }: { isClean: boolean; comment: string }) {
+  return (
+    <AnimatePresence>
+      {!isClean && (
+        <motion.div
+          initial={{ opacity: 0, height: 0 }}
+          animate={{ opacity: 1, height: "auto" }}
+          exit={{ opacity: 0, height: 0 }}
+          className="overflow-hidden"
+        >
+          <div className="pl-4 py-1 text-slate-500 italic flex items-center bg-red-500/5 border-l-2 border-red-500/30 my-1">
+            {comment}
+          </div>
+        </motion.div>
+      )}
+    </AnimatePresence>
+  );
+}

 // In the main component, replace both blocks:
-<AnimatePresence>
-  {!isClean && (
-    <motion.div
-      initial={{ opacity: 0, height: 0 }}
-      animate={{ opacity: 1, height: "auto" }}
-      exit={{ opacity: 0, height: 0 }}
-      className="overflow-hidden"
-    >
-      <div className="pl-4 py-1 text-slate-500 italic flex items-center bg-red-500/5 border-l-2 border-red-500/30 my-1">
-        <span>// TODO: This timeout logic is flaky on weekends. Needs fix.</span>
-      </div>
-    </motion.div>
-  )}
-</AnimatePresence>
+<ClutterComment isClean={isClean} comment="// TODO: This timeout logic is flaky on weekends. Needs fix." />

194-214: Consider a more maintainable syntax highlighting approach.

The current implementation hardcodes keywords and identifiers (e.g., "gateway", "timeout" at line 207), making it brittle and difficult to extend. For a demo component this works, but consider using a lightweight syntax highlighting library like prism-react-renderer if this pattern expands.

Alternative approach using a library:

import Highlight, { defaultProps } from "prism-react-renderer";

function CodeLine({ line, indent = 0 }: { line: string; indent?: number }) {
  return (
    <div style={{ paddingLeft: `${indent * 1.5}rem` }}>
      <Highlight {...defaultProps} code={line} language="typescript">
        {({ tokens, getLineProps, getTokenProps }) => (
          <div {...getLineProps({ line: tokens[0] })}>
            {tokens[0].map((token, key) => (
              <span {...getTokenProps({ token, key })} />
            ))}
          </div>
        )}
      </Highlight>
    </div>
  );
}
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e1a7e45 and bb587a5.

⛔ Files ignored due to path filters (1)
  • web/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (18)
  • web/components.json (1 hunks)
  • web/package.json (2 hunks)
  • web/src/components/Navigation.tsx (2 hunks)
  • web/src/components/landing/CTASection.tsx (4 hunks)
  • web/src/components/landing/ComparisonVisual.tsx (1 hunks)
  • web/src/components/landing/FeaturesSection.tsx (1 hunks)
  • web/src/components/landing/HeroSection.tsx (1 hunks)
  • web/src/components/landing/HeroVisual.tsx (1 hunks)
  • web/src/components/landing/ProblemSolutionSection.tsx (1 hunks)
  • web/src/components/landing/ProblemVisual.tsx (1 hunks)
  • web/src/components/landing/QuickStartSection.tsx (2 hunks)
  • web/src/components/landing/SolutionVisual.tsx (1 hunks)
  • web/src/components/landing/StatsSection.tsx (2 hunks)
  • web/src/components/ui/label.tsx (1 hunks)
  • web/src/components/ui/switch.tsx (1 hunks)
  • web/src/index.css (3 hunks)
  • web/src/lib/utils.ts (1 hunks)
  • web/tailwind.config.js (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (9)
web/src/components/landing/FeaturesSection.tsx (1)
web/src/components/landing/index.ts (1)
  • FeaturesSection (3-3)
web/src/components/ui/label.tsx (1)
web/src/lib/utils.ts (1)
  • cn (4-6)
web/src/components/landing/ComparisonVisual.tsx (1)
web/src/lib/utils.ts (1)
  • cn (4-6)
web/src/components/landing/StatsSection.tsx (1)
web/src/components/ui/card.tsx (2)
  • Card (75-75)
  • CardContent (75-75)
web/src/components/landing/QuickStartSection.tsx (1)
web/src/components/landing/index.ts (1)
  • QuickStartSection (4-4)
web/src/components/landing/ProblemSolutionSection.tsx (3)
web/src/components/landing/index.ts (1)
  • ProblemSolutionSection (2-2)
web/src/components/landing/ComparisonVisual.tsx (1)
  • ComparisonVisual (7-192)
web/src/components/ui/card.tsx (4)
  • Card (75-75)
  • CardHeader (75-75)
  • CardTitle (75-75)
  • CardContent (75-75)
web/src/components/landing/HeroSection.tsx (1)
web/src/components/landing/HeroVisual.tsx (1)
  • HeroVisual (4-74)
web/src/components/landing/CTASection.tsx (2)
web/src/components/landing/index.ts (1)
  • CTASection (6-6)
web/src/components/ui/button.tsx (1)
  • Button (56-56)
web/src/components/ui/switch.tsx (1)
web/src/lib/utils.ts (1)
  • cn (4-6)
🪛 Biome (2.1.2)
web/src/components/landing/HeroVisual.tsx

[error] 68-68: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)

web/src/components/landing/ProblemVisual.tsx

[error] 45-45: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)


[error] 63-63: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)


[error] 73-73: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)

web/src/components/landing/ComparisonVisual.tsx

[error] 90-90: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)


[error] 111-111: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)

🔇 Additional comments (29)
web/src/components/landing/ProblemVisual.tsx (1)

4-97: LGTM!

The component is well-structured with appropriate Framer Motion animations. Good use of viewport={{ once: true }} to prevent re-triggering animations, and the staggered delays create a nice progressive reveal effect. Dark mode support is properly implemented.

web/src/components/landing/QuickStartSection.tsx (2)

150-157: Using array index as key is acceptable for static data.

The key={index} usage is fine here since steps is a static array that never changes during the component's lifecycle. No reordering or dynamic additions occur, so index-based keys won't cause reconciliation issues.


119-122: Verify that bg-grid-pattern class is defined.

The section uses bg-grid-pattern which should be defined in your CSS. Based on the changes in index.css, this class is being added as part of this PR.

web/src/index.css (2)

162-173: Grid pattern implementation looks good.

The bg-grid-pattern class is well-implemented with:

  • Appropriate 40px grid size
  • Subtle orange-tinted grid lines using brand color
  • Fade-out mask for smooth edge transition
  • Reduced opacity in dark mode for better visual balance
  • Vendor prefix (-webkit-mask-image) for Safari support

236-251: Good accessibility handling for reduced motion preferences.

The prefers-reduced-motion media query properly disables animations and transitions for users who prefer reduced motion. This is an important accessibility consideration.

web/src/lib/utils.ts (1)

1-6: LGTM!

Import reordering and trailing newline addition. No functional changes.

web/components.json (1)

14-20: Path aliases are correctly configured.

The @/* path alias in web/tsconfig.json ("@/*": ["./src/*"]) properly supports all aliases defined in components.json. No action needed.

web/tailwind.config.js (1)

1-96: Configuration follows the shadcn/ui pattern correctly.

The color tokens, border radius, and accordion animations are properly structured for Radix UI integration.

web/src/components/ui/switch.tsx (1)

6-27: Well-structured Switch component following shadcn/ui conventions.

The component properly forwards refs, merges classNames, includes focus-visible states for accessibility, and sets displayName for DevTools. The thumb translation math is correct for the switch dimensions.

web/src/components/ui/label.tsx (1)

13-26: Label component implementation is correct.

Properly forwards refs, merges classNames, and sets displayName. The peer-disabled styling enables nice form integration patterns.

web/src/components/Navigation.tsx (2)

22-57: Hash navigation from other pages won't trigger smooth scroll.

When a user navigates from /docs to /#features, the page will navigate but the smooth scroll won't apply — the browser will jump directly to the hash anchor. If smooth scrolling is important in this scenario, consider using a useEffect to detect hash changes and scroll smoothly after navigation.


58-71: Documentation and Changelog links are correctly preserved.

Standard routing for these pages with proper active state highlighting.

web/src/components/landing/HeroVisual.tsx (1)

1-3: LGTM!

Imports are clean and minimal - only pulling in what's needed from framer-motion and lucide-react.

web/src/components/landing/SolutionVisual.tsx (2)

1-2: LGTM!

Imports are appropriate for the component's needs.


74-98: LGTM!

The external note window panel is well-structured with good visual hierarchy. The skewed rotation effect creates a nice "sticky note" aesthetic. The animation timing with the 0.2s delay creates a pleasant staggered entrance.

web/src/components/landing/ProblemSolutionSection.tsx (3)

1-5: LGTM!

Clean imports with clear separation of UI components, icons, animation library, and local component.


8-24: LGTM!

The benefits data structure is clean and well-organized. Each benefit has an icon component reference, title, and description - good pattern for rendering dynamic content.


66-91: LGTM!

The benefits grid implementation is solid:

  • Responsive 3-column layout
  • Proper use of index as key (acceptable for static data)
  • Well-orchestrated staggered animations with progressive delays
  • Good hover interactions on cards
web/src/components/landing/FeaturesSection.tsx (2)

1-12: LGTM!

Imports are well-organized with icons grouped together and motion imported separately.


122-148: LGTM!

The Bento grid implementation is clean:

  • Responsive breakpoints (1 → 2 → 3 columns)
  • Unique keys with feat-${index} prefix
  • Smooth hover transitions with appropriate duration
  • Good use of group-hover for coordinated child animations
web/src/components/landing/CTASection.tsx (3)

1-3: LGTM!

Clean imports with proper module paths.


38-72: LGTM!

The button group is well-implemented:

  • External links correctly use target="_blank" with rel="noopener noreferrer" for security
  • Primary CTA has distinct styling with brand colors
  • Secondary buttons have consistent outline styling
  • Accessible with descriptive link text and icons

7-13: LGTM!

Good use of decorative background layers with proper pointer-events-none to prevent interaction issues. The gradient blob positioning with transforms is clean.

web/src/components/landing/ComparisonVisual.tsx (1)

7-8: LGTM!

The state management approach is clean and appropriate for toggling between the two visual modes.

web/src/components/landing/StatsSection.tsx (2)

11-11: LGTM!

The migration to framer-motion is clean and well-structured. Using viewport={{ once: true }} prevents animation re-triggers on scroll, which is good for performance. The new background styling aligns well with the overall landing page redesign.

Also applies to: 60-82


84-143: LGTM!

The staggered animation pattern (index * 0.1 delays) creates an appealing cascading effect. The animation properties are consistent across similar elements, and the use of viewport={{ once: true }} ensures good performance by preventing re-animations.

web/src/components/landing/HeroSection.tsx (3)

5-6: LGTM!

The component structure is well-organized with proper layering and z-index management. The responsive grid layout and decorative background elements create a visually appealing hero section.

Also applies to: 10-19


22-107: LGTM!

The staggered animation sequence (0s → 0.1s → 0.2s → 0.3s → 0.4s) creates a smooth, professional entrance effect. The consistent use of initial, animate, and transition props across all motion elements demonstrates good practice.


110-113: LGTM!

The HeroVisual integration is clean and properly centered. The fixed height on large screens (lg:h-[600px]) ensures consistent visual balance with the content column.

Comment on lines 17 to +28
"dependencies": {
"@radix-ui/react-label": "^2.1.8",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-switch": "^1.2.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"framer-motion": "^12.23.24",
"lucide-react": "^0.294.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-router-dom": "^6.20.1",
"@radix-ui/react-slot": "^1.0.2",
"class-variance-authority": "^0.7.0",
"clsx": "^2.0.0",
"lucide-react": "^0.294.0",
"tailwind-merge": "^2.0.0"
"tailwind-merge": "^2.6.0"
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🌐 Web query:

latest version framer-motion npm package 2025

💡 Result:

The latest framer-motion npm version is 12.23.24 (published Oct 10, 2025). [1][2]

Sources:
[1] Release history for framer-motion (release dates). [2] Package info summary (framer-motion — latest version 12.23.24).


🌐 Web query:

latest version lucide-react npm package 2025

💡 Result:

Latest lucide-react on npm: 0.542.0 (published Nov 21, 2025). [1]

Install: npm i lucide-react@0.542.0.

Sources:
[1] npm package page — lucide-react (shows version 0.542.0).


Update lucide-react to the latest version.

framer-motion at ^12.23.24 is current, but lucide-react at ^0.294.0 is significantly outdated. The latest version is 0.542.0 (published Nov 21, 2025). Upgrade to lucide-react@^0.542.0 to get bug fixes and new features.

The other dependencies—Radix UI components, clsx, tailwind-merge, and class-variance-authority—are appropriate for the UI redesign, and the clsx + tailwind-merge pattern via a cn utility is standard practice.

🤖 Prompt for AI Agents
In web/package.json around lines 17 to 28, the lucide-react dependency is
outdated (currently "^0.294.0"); update the version string to "^0.542.0" in the
dependencies block, then run your package manager (npm install or yarn
install/pnpm install) to update node_modules and regenerate the lockfile
(package-lock.json/yarn.lock/pnpm-lock.yaml) so the new version is pinned;
verify the app builds and run tests to ensure no breaking API changes need code
updates.

className="overflow-hidden"
>
<div className="pl-4 py-1 text-slate-500 italic flex items-center bg-red-500/5 border-l-2 border-red-500/30 my-1">
<span>// TODO: This timeout logic is flaky on weekends. Needs fix.</span>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Wrap comment-like strings in JSX braces.

Lines 90 and 111 contain comment-like strings that should be wrapped in braces per React best practices. While functional, this improves clarity and avoids potential JSX parsing ambiguity.

Apply this diff:

-<span>// TODO: This timeout logic is flaky on weekends. Needs fix.</span>
+{`// TODO: This timeout logic is flaky on weekends. Needs fix.`}
-<span>// FIXME: Legacy API endpoint. Migration planned for Q4.</span>
+{`// FIXME: Legacy API endpoint. Migration planned for Q4.`}

Also applies to: 111-111

🧰 Tools
🪛 Biome (2.1.2)

[error] 90-90: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)

🤖 Prompt for AI Agents
In web/src/components/landing/ComparisonVisual.tsx around lines 90 and 111, the
span elements contain comment-like string literals (e.g. "// TODO: ...") which
should be wrapped in JSX braces to avoid parsing ambiguity; replace those
literal children with JSX expressions like {"// TODO: This timeout logic is
flaky on weekends. Needs fix."} (or {'// TODO: ...'}) for both occurrences so
the text is rendered as a plain string expression rather than a raw JSX-like
token.

Comment on lines +66 to +69
<div className="flex">
<span className="text-slate-600 w-8 select-none">5</span>
<span className="text-slate-500">// End of file</span>
</div>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Wrap the comment text in a JSX expression.

The // End of file text on line 68 is rendered as plain text inside JSX children. While this works in practice, Biome flags it because leading // can be confusing and may cause issues with certain JSX parsers. Wrap comments in braces for clarity.

                     <div className="flex">
                         <span className="text-slate-600 w-8 select-none">4</span>
                     </div>
                     <div className="flex">
                         <span className="text-slate-600 w-8 select-none">5</span>
-                        <span className="text-slate-500">// End of file</span>
+                        <span className="text-slate-500">{`// End of file`}</span>
                     </div>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<div className="flex">
<span className="text-slate-600 w-8 select-none">5</span>
<span className="text-slate-500">// End of file</span>
</div>
<div className="flex">
<span className="text-slate-600 w-8 select-none">5</span>
<span className="text-slate-500">{`// End of file`}</span>
</div>
🧰 Tools
🪛 Biome (2.1.2)

[error] 68-68: Wrap comments inside children within braces.

Unsafe fix: Wrap the comments with braces

(lint/suspicious/noCommentText)

🤖 Prompt for AI Agents
In web/src/components/landing/HeroVisual.tsx around lines 66 to 69, the literal
comment text "// End of file" is being rendered directly as JSX children; update
that child to be a JSX expression containing the same string (i.e., put the
comment text inside braces as a string) so the text is rendered via an
expression rather than raw leading-slash text, resolving the Biome warning.

Comment on lines +66 to +72
>
<div className="h-px w-8 bg-brand-orange/30 dashed" />
<div className="p-1.5 rounded-full bg-brand-orange/10 border border-brand-orange/30">
<ArrowRight className="w-4 h-4" />
</div>
<div className="h-px w-8 bg-brand-orange/30 dashed" />
</motion.div>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Invalid Tailwind class dashed - lines will appear solid.

The dashed class on lines 67 and 71 is not a valid Tailwind utility. The lines will render as solid instead of dashed. If you intended dashed lines, you need border properties instead, or use a custom class.

              <motion.div
                  className="hidden md:flex flex-col items-center justify-center text-brand-orange"
                  initial={{ opacity: 0, scale: 0 }}
                  whileInView={{ opacity: 1, scale: 1 }}
                  viewport={{ once: true }}
                  transition={{ delay: 0.4 }}
              >
-                 <div className="h-px w-8 bg-brand-orange/30 dashed" />
+                 <div className="h-px w-8 border-t border-dashed border-brand-orange/30" />
                  <div className="p-1.5 rounded-full bg-brand-orange/10 border border-brand-orange/30">
                      <ArrowRight className="w-4 h-4" />
                  </div>
-                 <div className="h-px w-8 bg-brand-orange/30 dashed" />
+                 <div className="h-px w-8 border-t border-dashed border-brand-orange/30" />
              </motion.div>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
>
<div className="h-px w-8 bg-brand-orange/30 dashed" />
<div className="p-1.5 rounded-full bg-brand-orange/10 border border-brand-orange/30">
<ArrowRight className="w-4 h-4" />
</div>
<div className="h-px w-8 bg-brand-orange/30 dashed" />
</motion.div>
>
<div className="h-px w-8 border-t border-dashed border-brand-orange/30" />
<div className="p-1.5 rounded-full bg-brand-orange/10 border border-brand-orange/30">
<ArrowRight className="w-4 h-4" />
</div>
<div className="h-px w-8 border-t border-dashed border-brand-orange/30" />
</motion.div>
🤖 Prompt for AI Agents
In web/src/components/landing/SolutionVisual.tsx around lines 66–72 the divs
intended as dashed connector lines use the invalid Tailwind class "dashed", so
they render solid; remove "dashed" and replace it with proper Tailwind border
utilities (e.g. use a zero-height element with a top border and the
"border-dashed" utility plus the desired border color/width) or apply a custom
CSS class that sets border-style: dashed; ensure the width, thickness and color
match the original intent.

Comment on lines +7 to +48
--background: 0 0% 100%;
/* F4F1E9 - Pin & Note base (warm white) */
--foreground: 215 85% 9%;
--foreground: 0 0% 3.9%;
/* 0B1220 - Navy (braces & note lines) */
--card: 42 33% 95%;
--card: 0 0% 100%;
/* F4F1E9 - Pin & Note base (warm white) */
--card-foreground: 215 85% 9%;
--card-foreground: 0 0% 3.9%;
/* 0B1220 - Navy */
--popover: 42 33% 95%;
--popover: 0 0% 100%;
/* F4F1E9 */
--popover-foreground: 215 85% 9%;
--popover-foreground: 0 0% 3.9%;
/* 0B1220 */
--primary: 22 100% 61%;
--primary: 0 0% 9%;
/* FF8A3D - Primary Orange */
--primary-foreground: 0 0% 100%;
--primary-foreground: 0 0% 98%;
/* FFFFFF - Pin highlight */
--secondary: 215 85% 9%;
--secondary: 0 0% 96.1%;
/* 0B1220 - Navy */
--secondary-foreground: 42 33% 95%;
--secondary-foreground: 0 0% 9%;
/* F4F1E9 */
--muted: 215 43% 13%;
--muted: 0 0% 96.1%;
/* 142036 - Navy soft (inner shadow) */
--muted-foreground: 215 43% 35%;
--muted-foreground: 0 0% 45.1%;
/* Lighter navy for better contrast on light backgrounds */
--accent: 22 100% 70%;
--accent: 0 0% 96.1%;
/* FFA766 - Orange highlight */
--accent-foreground: 215 85% 9%;
--accent-foreground: 0 0% 9%;
/* 0B1220 */
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
--border: 22 100% 70%;
--destructive-foreground: 0 0% 98%;
--border: 0 0% 89.8%;
/* FFA766 - Orange highlight */
--input: 215 43% 13%;
--input: 0 0% 89.8%;
/* 142036 */
--ring: 22 100% 61%;
--ring: 0 0% 3.9%;
/* FF8A3D - Primary Orange */
--radius: 0.5rem;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Comments are misleading—they reference brand colors that no longer match the values.

The inline comments reference specific brand colors (e.g., FF8A3D - Primary Orange, 0B1220 - Navy) but the actual CSS variable values are now grayscale (0 0% 9%, 0 0% 98%, etc.). This creates confusion for future maintainers who may expect the described colors.

Either update the comments to reflect the new grayscale scheme or remove them.

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