Skip to content

UI/UX Overhaul – Premium AlignUI-Inspired Experience#294

Open
RishiGoswami-code wants to merge 3 commits intoAOSSIE-Org:mainfrom
RishiGoswami-code:NewUpdate
Open

UI/UX Overhaul – Premium AlignUI-Inspired Experience#294
RishiGoswami-code wants to merge 3 commits intoAOSSIE-Org:mainfrom
RishiGoswami-code:NewUpdate

Conversation

@RishiGoswami-code
Copy link

@RishiGoswami-code RishiGoswami-code commented Feb 4, 2026

Premium UI / UX Overhaul (AlignUI-Inspired)

Overview

This PR introduces a comprehensive UI/UX upgrade to elevate the product to a premium, modern SaaS experience inspired by AlignUI design principles while preserving the existing brand colors and identity.

The focus is on:

  • Strong visual structure (grids, borders, rulers)
  • Subtle motion and glow effects
  • Improved typography and spacing
  • Consistent, high-quality interaction patterns

Typography

  • Upgraded project font to a premium sans-serif
    • Plus Jakarta Sans / Outfit
  • Improved heading/body hierarchy and spacing
  • Verified font rendering and fallbacks across browsers

Layout, Grid & Borders

  • Increased brightness and opacity of grid and border lines
  • Implemented AlignUI-style Features Grid with internal borders
  • Added bold + glowing grid lines for better visual guidance
  • Introduced LayoutFrame component with fixed overlay ruler lines
  • Improved overall layout rhythm and alignment

Motion & Visual Effects

Hero

  • Added Typewriter animation to headline:
    • “Creator Collaboration Hub”
  • Fixed Brave browser visibility issue for “Creator Collaboration”
    • Robust gradient handling + fallback color

Glow & Scroll

  • Added Glowing Border beam effect to Features Grid
  • Implemented Glow-on-Scroll logic (dynamic opacity & shadow)
  • Increased visibility and glow of grid and timeline lines

Navigation

Navbar

  • Refactored to Floating Island style
    • Centered
    • Rounded
    • Detached from layout
  • Connected Navbar buttons to page sections (Features, Resources, etc.)
  • Removed duplicate Navbar/Footer from Landing.tsx
  • Verified scrolling and interaction behavior

Section Redesigns

Features

  • AlignUI-style grid layout
  • Internal borders with glow effects
  • Improved card consistency and spacing

How It Works

  • Redesigned as a Vertical Timeline with alternating layout
  • Added Glowing Scroll Beam effect
  • Timeline improvements:
    • Compact cards
    • Reduced vertical spacing
    • Increased width
    • Brighter and bolder central line
  • Added background animation
  • Verified layout and animations

Community

  • Designed new Premium Community section
  • Added social cards:
    • Discord
    • GitHub
    • Twitter
  • Implemented bold, glowing connector lines
  • Verified responsiveness and visual consistency

Integrations

  • Refactored Integrations section UI
  • Replaced social icons with Lucide icons
  • Unified card style with overall design
  • Added “Connect” CTA button with interaction states
  • Enhanced visuals with optional glow/animated borders

Waitlist (“Join the Revolution”)

  • Enhanced with premium background and typography
  • Created ShootingStars background component
  • Integrated animation into Waitlist section
  • Verified performance and readability

Refactors & Cleanup

  • Refactored Footer to Tailwind-only
    • Removed MUI dependency
    • Matched new font and theme
  • Improved spacing and margins across sections
  • Ensured consistency in cards, borders, and motion
  • Final UI polish and layout verification

Verification Checklist

  • Typography verified across browsers
  • Brave browser text visibility fixed
  • Grid borders and glow effects visible
  • Floating Navbar scrolling verified
  • Timeline layout and animations verified
  • Integrations interactions verified
  • Community section verified
  • Waitlist animations verified
  • Duplicate Navbar/Footer removed
  • Final browser verification complete

Result

The application now presents a founder-grade, premium SaaS interface with improved clarity, structure, and engagement—aligned with modern design systems while remaining uniquely branded.

Summary by CodeRabbit

  • New Features

    • Redesigned landing with typewriter headline, layered visuals, shooting stars, glowing beams, features grid, enhanced waitlist CTA and form
    • Community section with social cards; new responsive navbar with mobile menu and search
    • Animated timeline for How It Works and interactive Integrations cards
  • Refactor

    • Global layout and routing reworked with persistent header/footer and scroll-to-top behavior
  • Style

    • Footer redesign, Plus Jakarta Sans typography, scroll-reactive decorative frame, and restyled Privacy/Legal pages
  • Chores

    • Updated site title, favicon placeholder, and bootstrap script tag in landing HTML

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 4, 2026

📝 Walkthrough

Walkthrough

Overhauls the landing site: updates HTML title and entry script; replaces route rendering with a composed App layout (Navbar, LayoutFrame, ScrollToTop, Footer); and adds multiple new UI/visual components and rewrites Landing, HowItWorks, Integrations, Privacy, and Legal pages.

Changes

Cohort / File(s) Summary
HTML & entry
LandingPage/index.html
Title changed to "InPactAI", favicon link commented out, added module script for /src/main.tsx.
App shell & routing
LandingPage/src/App.tsx
Switched to composed layout (Navbar, LayoutFrame, ScrollToTop, Footer) around routes; privacy/legal paths renamed; removed Lenis and prior Toaster/router structure.
Landing page
LandingPage/src/Pages/Landing.tsx
Major rewrite: layered hero, Typewriter headline, GlowingBeam, RulerMarks, Threads background, ShootingStars, features grid, Community section, updated animations and CTAs.
New components
LandingPage/src/components/Navbar.tsx, .../LayoutFrame.tsx, .../ShootingStars.tsx, .../Community.tsx, .../ScrollToTop.tsx
Adds Navbar (responsive/mobile menu, scroll-aware styling), LayoutFrame (scroll-driven glow), canvas ShootingStars, Community social cards, and ScrollToTop route helper.
Content sections rewritten
LandingPage/src/components/howitworks.tsx, LandingPage/src/components/integration.tsx
HowItWorks rebuilt with floating logos and scroll-driven timeline; Integrations refactored with per-card connect state, gradients, and animated Connect/Connected UI.
Pages restyled
LandingPage/src/Pages/Privacy.tsx, LandingPage/src/Pages/Legal.tsx
Privacy and Terms pages reimplemented with decorative rulers, GlowingBeam, new layout and typography, updated titles and content structure.
Footer & styles
LandingPage/src/components/Footer.tsx, LandingPage/src/index.css
Replaced MUI footer with Tailwind multi-column footer; added Google Font (Plus Jakarta Sans) and custom scrollbar styles.
Exports & signatures
LandingPage/src/...
Multiple default-export React components added; no breaking changes to existing public API signatures detected.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

enhancement, frontend

Suggested reviewers

  • Saahi30

Poem

🐇 I hop through code and stitch a glow,
Typewriter whispers, shooting stars show,
Navbar guards the path I tread,
LayoutFrame hums where lights are spread,
Hooray—InPactAI blooms as I go ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 20.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ 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 'UI/UX Overhaul – Premium AlignUI-Inspired Experience' directly and comprehensively describes the main objective of the changeset: a complete visual and user experience redesign. It accurately reflects the primary focus of the PR across all modified components.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

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

🤖 Fix all issues with AI agents
In `@LandingPage/index.html`:
- Around line 5-8: Uncomment and restore the favicon link in
LandingPage/index.html by re-enabling the commented <link rel="icon" ...>
element, update its href to point to your actual favicon asset (e.g.,
/favicon.ico or /assets/favicon.svg) and ensure the type attribute matches the
file (image/x-icon for .ico or image/svg+xml for .svg) so browsers display your
branded icon instead of a generic one.

In `@LandingPage/src/App.tsx`:
- Around line 1-13: The app currently never exposes the standalone compliance
pages (Privacy.tsx and Legal.tsx) and Footer links are placeholders; fix by
wiring proper routes and matching Footer links or by turning Footer links into
in-page anchors. Specifically, update the App component (function App) to wrap
the app in a router (e.g., BrowserRouter) and add Routes/Route entries that
import and render the Privacy and Legal components (Privacy and Legal/Terms) at
paths like "/privacy" and "/terms", and update Footer to use Link/NavLink or
hrefs that point to those routes; alternatively, if you want inline anchors,
modify Footer to use fragment IDs that match anchors in Landing or LayoutFrame
and add those anchors to the pages. Ensure imports for Privacy and Legal are
added and that Footer's link targets match the chosen approach.

In `@LandingPage/src/components/Footer.tsx`:
- Around line 60-61: The Footer component contains misspelled brand casing
"InpactAI"; update every occurrence to "InPactAI" (e.g., the span with className
"text-lg font-bold text-white tracking-tight" and the other brand instances in
the same Footer component) so the displayed brand matches site title/PR
branding, ensuring exact capitalization is "InPactAI".
- Around line 65-68: The social icon links in the Footer component are missing
accessible names; update the three anchor elements that wrap <Twitter />,
<Github />, and <Linkedin /> inside Footer.tsx to include descriptive aria-label
attributes (e.g., "Follow on Twitter", "View GitHub profile", "Connect on
LinkedIn") so screen readers can identify each link; ensure the aria-label text
clearly matches the action and target for each icon.

In `@LandingPage/src/components/howitworks.tsx`:
- Around line 51-53: The component copies use the incorrect brand casing
"Inpact"; update all occurrences in this component (e.g., the description string
in the AI-Powered Matching step and the other strings around lines referenced)
to the correct brand "InPactAI" so the header and each step copy use consistent
casing—search for the literal "Inpact" in howitworks.tsx (including the
title/description objects shown and the strings at the other referenced block)
and replace with "InPactAI".

In `@LandingPage/src/components/Navbar.tsx`:
- Around line 76-82: The useEffect that adds the scroll listener (the
handleScroll function which calls setIsScrolled) doesn't initialize isScrolled
on mount; after registering the listener in the effect, invoke handleScroll()
once to sync state with the current window.scrollY so the Navbar renders
correctly when the page loads scrolled (e.g., via hash navigation). Locate the
useEffect containing handleScroll, window.addEventListener('scroll',
handleScroll) and setIsScrolled, and add a single call to handleScroll()
immediately after adding the listener, keeping the existing cleanup that removes
the listener.

In `@LandingPage/src/components/ShootingStars.tsx`:
- Around line 69-139: The animate loop currently calls requestAnimationFrame
recursively but only the first returned id (animationId) is stored, so
subsequent frames can't be cancelled; introduce a mutable frame id variable
(e.g., let frameId) and an active flag (e.g., let isActive = true) at the top of
the effect, update frameId = requestAnimationFrame(animate) each time you
schedule a frame inside animate, and early-return from animate when !isActive;
in the cleanup set isActive = false and call cancelAnimationFrame(frameId) (and
still removeEventListener('resize', handleResize)). This ensures the animate
function and its recursive frames (requestAnimationFrame) are stopped and
cancelled on unmount.

In `@LandingPage/src/Pages/Landing.tsx`:
- Around line 312-321: The Tailwind class in the motion.div inside the
features.map render is misspelled: replace the invalid "transaction-colors" with
the correct "transition-colors" in the className string so the hover color
transition works; locate the motion.div used in the features.map callback (the
element with key={index}, initial/whileInView props) and update its className to
use "transition-colors" instead.
- Around line 47-65: The Typewriter effect currently creates an interval inside
the setTimeout callback that isn’t cleared by the outer effect cleanup; update
the useEffect in the Typewriter component so the interval ID is accessible to
the effect scope (e.g., declare let intervalId or useRef before setTimeout),
start the interval inside the timeout as you do now, and ensure the effect’s
cleanup function clears both the timeout and the interval (clearTimeout(timeout)
and clearInterval(intervalId)) so the typing interval stops when the component
unmounts or dependencies change.
🧹 Nitpick comments (4)
LandingPage/src/components/Community.tsx (1)

57-60: Use a stable key for social cards.

Index keys can cause subtle animation/state glitches if the list order changes. The name is already unique.

🔧 Suggested tweak
-                    {socials.map((social, index) => (
+                    {socials.map((social, index) => (
                         <motion.a
-                            key={index}
+                            key={social.name}
                             href={social.href}
LandingPage/src/components/LayoutFrame.tsx (1)

1-10: Remove the no-op useEffect to avoid empty-hook lint warnings.

If there’s no immediate resize logic, drop the hook now and reintroduce it when needed.

🧹 Suggested cleanup
-import { useEffect } from 'react';
...
-  useEffect(() => {
-    // Optional: could use window height for dynamic ruler calculation
-  }, []);
LandingPage/src/components/integration.tsx (1)

9-14: Use functional state updates in toggleConnect.

This avoids stale state when React batches updates.

🔁 Suggested change
-    const toggleConnect = (index: number) => {
-        if (connected.includes(index)) {
-            setConnected(connected.filter(i => i !== index));
-        } else {
-            setConnected([...connected, index]);
-        }
-    };
+    const toggleConnect = (index: number) => {
+        setConnected((prev) =>
+            prev.includes(index) ? prev.filter(i => i !== index) : [...prev, index]
+        );
+    };
LandingPage/src/components/howitworks.tsx (1)

12-32: Tighten FloatingLogo’s y type for consistent animation

y is typed as number | string, but the animation path only handles numeric values. If percent-based placement isn’t needed, constrain y to number and simplify the motion values to avoid unit jumps.

♻️ Suggested tweak
-const FloatingLogo = ({ d, className, delay, x, y }: { d: string, className?: string, delay: number, x: number | string, y: number | string }) => (
+const FloatingLogo = ({ d, className, delay, x, y }: { d: string, className?: string, delay: number, x: number | string, y: number }) => (
     <motion.div
         className={`absolute opacity-20 pointer-events-none ${className}`}
         initial={{ x, y }}
         animate={{
-            y: [typeof y === 'number' ? y : 0, typeof y === 'number' ? y - 40 : -40, typeof y === 'number' ? y : 0],
+            y: [y, y - 40, y],
             rotate: [0, 10, -10, 0]
         }}

Comment on lines +5 to +8
<!-- <link rel="icon" type="image/svg+xml" href="/" /> -->
<script src="https://cdn.tailwindcss.com"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
<title>InPactAI</title>
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

Consider restoring a real favicon link.

With the favicon commented out, browsers will show a generic icon. If you have an asset, wire it back in for polish.

💡 Example fix (adjust the path to your actual asset)
-    <!-- <link rel="icon" type="image/svg+xml" href="/" /> -->
+    <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
📝 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
<!-- <link rel="icon" type="image/svg+xml" href="/" /> -->
<script src="https://cdn.tailwindcss.com"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React + TS</title>
<title>InPactAI</title>
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<script src="https://cdn.tailwindcss.com"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>InPactAI</title>
🤖 Prompt for AI Agents
In `@LandingPage/index.html` around lines 5 - 8, Uncomment and restore the favicon
link in LandingPage/index.html by re-enabling the commented <link rel="icon"
...> element, update its href to point to your actual favicon asset (e.g.,
/favicon.ico or /assets/favicon.svg) and ensure the type attribute matches the
file (image/x-icon for .ico or image/svg+xml for .svg) so browsers display your
branded icon instead of a generic one.

Comment on lines +51 to +53
title: "AI-Powered Matching",
description: "Inpact uses AI to suggest ideal brand-creator collaborations based on past work.",
icon: <SparklesIcon className="w-5 h-5" />,
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

Check brand casing (“InpactAI”) for consistency

If the official name is “InPactAI,” update the header and step copy to match the brand styling throughout the site.

✏️ Suggested copy tweak
-            description: "Inpact uses AI to suggest ideal brand-creator collaborations based on past work.",
+            description: "InPactAI uses AI to suggest ideal brand-creator collaborations based on past work.",
...
-                        How InpactAI works
+                        How InPactAI works

Also applies to: 119-123

🤖 Prompt for AI Agents
In `@LandingPage/src/components/howitworks.tsx` around lines 51 - 53, The
component copies use the incorrect brand casing "Inpact"; update all occurrences
in this component (e.g., the description string in the AI-Powered Matching step
and the other strings around lines referenced) to the correct brand "InPactAI"
so the header and each step copy use consistent casing—search for the literal
"Inpact" in howitworks.tsx (including the title/description objects shown and
the strings at the other referenced block) and replace with "InPactAI".

Comment on lines 47 to 65
const Typewriter = ({ text, delay = 0, className }: { text: string; delay?: number; className?: string }) => {
const [displayedText, setDisplayedText] = useState('');

useEffect(() => {
const timeout = setTimeout(() => {
let currentIndex = 0;
const interval = setInterval(() => {
if (currentIndex <= text.length) {
setDisplayedText(text.slice(0, currentIndex));
currentIndex++;
} else {
clearInterval(interval);
}
}, 50); // Typing speed
return () => clearInterval(interval);
}, delay * 1000);

return () => clearTimeout(timeout);
}, [text, delay]);
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

🏁 Script executed:

find . -name "Landing.tsx" -type f

Repository: AOSSIE-Org/InPactAI

Length of output: 98


🏁 Script executed:

cat -n ./LandingPage/src/Pages/Landing.tsx | sed -n '40,70p'

Repository: AOSSIE-Org/InPactAI

Length of output: 1265


Clear the typing interval in the effect cleanup function

The interval created inside setTimeout is not properly cleaned up when the effect unmounts or dependencies change. Line 61's return statement is inside the setTimeout callback and has no effect on cleanup. The actual cleanup function (line 64) only clears the timeout, leaving the interval running if the component unmounts or dependencies change after the initial delay.

🧹 Suggested fix
   useEffect(() => {
+    let interval: ReturnType<typeof setInterval> | undefined;
     const timeout = setTimeout(() => {
       let currentIndex = 0;
-      const interval = setInterval(() => {
+      interval = setInterval(() => {
         if (currentIndex <= text.length) {
           setDisplayedText(text.slice(0, currentIndex));
           currentIndex++;
         } else {
           clearInterval(interval);
         }
       }, 50); // Typing speed
-      return () => clearInterval(interval);
     }, delay * 1000);
 
-    return () => clearTimeout(timeout);
+    return () => {
+      clearTimeout(timeout);
+      if (interval) clearInterval(interval);
+    };
   }, [text, delay]);
🤖 Prompt for AI Agents
In `@LandingPage/src/Pages/Landing.tsx` around lines 47 - 65, The Typewriter
effect currently creates an interval inside the setTimeout callback that isn’t
cleared by the outer effect cleanup; update the useEffect in the Typewriter
component so the interval ID is accessible to the effect scope (e.g., declare
let intervalId or useRef before setTimeout), start the interval inside the
timeout as you do now, and ensure the effect’s cleanup function clears both the
timeout and the interval (clearTimeout(timeout) and clearInterval(intervalId))
so the typing interval stops when the component unmounts or dependencies change.

@RishiGoswami-code
Copy link
Author

See these Image for the references


Hero Section

image

About Section

image

How It Works Section

image

Integration Section

image

Community Section

image

CTA Section

image

Footer Section

image

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

🤖 Fix all issues with AI agents
In `@LandingPage/src/components/ShootingStars.tsx`:
- Around line 92-131: The loop mutates shootingStars with splice(index, 1)
inside shootingStars.forEach, which can skip elements; instead build a new array
of surviving stars (or reassign shootingStars = shootingStars.filter(...)) using
the same removal conditions (x > canvas.width + 100 || y > canvas.height + 100
|| opacity <= 0) so drawing still uses each star's updated x,y,opacity; locate
the shootingStars.forEach block in ShootingStars.tsx and replace the
splice-based removal with a filter or a push-to-new-array approach to preserve
iteration correctness.

In `@LandingPage/src/Pages/Landing.tsx`:
- Around line 304-306: Update the displayed brand casing from "InpactAI" to
"InPactAI" wherever the literal appears in this component; specifically change
the text content inside the <h2> element ("What's inside InpactAI?") and the
other heading/label occurrences referenced (around the other instance at lines
~415-417) to "InPactAI" so the site title and headings match the correct brand
casing.

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