Skip to content

amank55 Changed the download Section Home section and the navbar#491

Closed
amank55 wants to merge 1 commit intoAOSSIE-Org:mainfrom
amank55:main
Closed

amank55 Changed the download Section Home section and the navbar#491
amank55 wants to merge 1 commit intoAOSSIE-Org:mainfrom
amank55:main

Conversation

@amank55
Copy link

@amank55 amank55 commented Aug 30, 2025

-Changed the download section and the home section
-Change the theme toggling

  • Created package.json with necessary dependencies for the web UI, including libraries for React, Tailwind CSS, and Three.js.
  • Added styles.css to implement custom scrollbar styles for better UI experience.

Summary by CodeRabbit

  • New Features

    • Introduced a React-based web UI with a landing page, navbar, home sections, interactive demo marquee, features grid, how-it-works, FAQ, and footer.
    • Added dark mode support, animated backgrounds, download CTAs, smooth scrolling, and reusable UI components (buttons, cards, inputs).
    • Enabled client-side routing and theme toggling.
  • Style

    • Set up Tailwind with custom theme tokens, animations, and a custom scrollbar.
  • Chores

    • Added build tooling (Vite, TypeScript, ESLint, PostCSS), path aliases, dependencies, and gitignore rules.
  • Documentation

    • Added READMEs for the web UI and frontend.

- Created package.json with necessary dependencies for the web UI, including libraries for React, Tailwind CSS, and Three.js.
- Added styles.css to implement custom scrollbar styles for better UI experience.
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 30, 2025

Walkthrough

Introduces a new React + TypeScript + Vite frontend under web-ui/frontend with Tailwind, ESLint, and Shadcn setup. Adds app bootstrap, routing shell, theme context, multiple landing/FAQ/demo UI pages, reusable UI primitives, utilities, and global styles. Includes project/package configs, build tsconfigs, and .gitignore entries.

Changes

Cohort / File(s) Summary
Repo housekeeping
web-ui/.gitignore, web-ui/frontend/.gitignore
New ignore files to exclude node_modules and dist (via ESLint ignore).
Docs
web-ui/README.md, web-ui/frontend/README.md
Adds basic readme for web-ui and Vite React template guidance for frontend with ESLint type-aware setup notes.
Frontend scaffolding and config
web-ui/frontend/index.html, web-ui/frontend/package.json, web-ui/frontend/vite.config.ts, web-ui/frontend/tsconfig.json, web-ui/frontend/tsconfig.app.json, web-ui/frontend/tsconfig.node.json, web-ui/frontend/tsconfig.app.tsbuildinfo, web-ui/frontend/tsconfig.node.tsbuildinfo, web-ui/frontend/src/vite-env.d.ts, web-ui/frontend/components.json
Adds Vite app entry, package scripts/deps, aliasing, TypeScript project refs/configs, build info artifacts, Vite types, and Shadcn components config.
Lint, PostCSS, Tailwind
web-ui/frontend/eslint.config.js, web-ui/frontend/postcss.config.js, web-ui/frontend/tailwind.config.js
Introduces ESLint config (TS, react-hooks, react-refresh), PostCSS with Tailwind/Autoprefixer, and Tailwind setup with tokens, animations, and dark mode via class.
Global styles
web-ui/frontend/src/index.css, web-ui/frontend/src/App.css, web-ui/styles.css
Adds Tailwind base/themes, animations, starry background, custom scrollbar utilities, button/input states, and typing indicator styles.
App bootstrap
web-ui/frontend/src/main.tsx, web-ui/frontend/src/App.tsx
React 18 root render and App shell with ThemeProvider, Router, Navbar, and route for composed landing HomePage sections.
Theme context
web-ui/frontend/src/context/theme-provider.tsx
Adds ThemeOptions enum, ThemeContext, and ThemeProvider with localStorage/system preference, body dark class toggling, and toggle function.
Pages and layout
web-ui/frontend/src/Pages/Landing page/Navbar.tsx, .../Landing page/Home1.tsx, .../pictopy-landing.tsx, .../HowItWorks/HowItWorks.tsx, .../FaqPage/FAQ.tsx, .../Demo/marqu.tsx, .../Footer/Footer.tsx
Adds responsive Navbar with dark-mode enforcement, animated hero grid, landing hero with downloads, features grid, animated FAQ accordion with dark sync, scrolling marquee, and footer.
UI components/primitives
web-ui/frontend/src/components/ui/button.tsx, .../card.tsx, .../input.tsx, .../label.tsx, .../Bouncy Card Features.tsx, .../Features.tsx, .../SmoothScroll.tsx, .../ScrollProgress.tsx
Adds cva-based Button, Card suite, Input, Radix Label, animated feature cards sections, smooth-scroll container, and an empty ScrollProgress stub.
Utilities
web-ui/frontend/src/lib/utils.ts
Adds cn helper combining clsx and tailwind-merge.
Root web-ui package
web-ui/package.json
Adds UI/3D/animation dependencies for the web-ui package.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor User
  participant Browser
  participant main.tsx
  participant App
  participant ThemeProvider
  participant Router
  participant Navbar
  participant HomePage

  User->>Browser: Load / (index.html)
  Browser->>main.tsx: Execute module
  main.tsx->>App: render(<App/>)
  App->>ThemeProvider: Initialize context
  ThemeProvider-->>App: {theme, toggleTheme}
  App->>Router: Mount routes
  Router->>Navbar: Render
  Router->>HomePage: Render composed sections
  Note over ThemeProvider,App: Body "dark" class toggled on theme changes
Loading
sequenceDiagram
  autonumber
  participant Navbar
  participant Document
  participant Window
  participant FAQ
  participant ThemeProvider

  Navbar->>Document: Force dark classes/data-theme
  Navbar->>Window: dispatchEvent('themeChanged')
  Note over Document: MutationObserver detects class/data-theme changes
  FAQ->>Document: Observe mutations
  FAQ-->>FAQ: setDarkMode(true/false)
  ThemeProvider-->>Document: Toggles body "dark" on context theme change
  Window-->>FAQ: 'themeChanged' event (sync UI state)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

GSoC 2025

Poem

A rabbit taps keys with a gentle thrum,
Vite winds up, Tailwind starts to hum.
Stars drift by in a midnight sky,
FAQ whispers, nav says “dark, aye.”
Cards bounce, grids shuffle with glee—
PictoPy’s meadow is ready. Whee! 🐇✨

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • 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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore or @coderabbit ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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

🧹 Nitpick comments (47)
web-ui/frontend/.gitignore (1)

1-1: Broaden ignores and use directory form; consider deduping with parent .gitignore.

  • Prefer node_modules/ (trailing slash) and add common Vite/React artifacts (dist, coverage, logs, .env* with an allowlisted example).
  • Since web-ui/.gitignore exists and applies to this subpackage, this file is optional; keeping a single source of truth reduces drift.

Apply:

-node_modules
+node_modules/
+dist/
+coverage/
+.eslintcache
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+.DS_Store
+.env*
+!.env.example
web-ui/.gitignore (1)

1-2: Expand ignore set to cover typical build/test/secrets artifacts for the whole web-ui package.

This parent .gitignore cascades to subfolders (including frontend), so it can be your single authoritative list.

Apply:

-node_modules
+node_modules/
+dist/
+coverage/
+.eslintcache
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+.DS_Store
+.env*
+!.env.example

Note: keep lockfiles (package-lock.json/yarn.lock/pnpm-lock.yaml) committed.

web-ui/frontend/tsconfig.node.json (1)

2-20: Add Node types for Vite/Node config files

Without Node types, vite.config.ts may lack process, __dirname, etc. typings.

   "compilerOptions": {
     "target": "ES2022",
     "lib": ["ES2023"],
     "module": "ESNext",
     "skipLibCheck": true,
+    "types": ["node"],
web-ui/frontend/tsconfig.app.json (2)

15-16: Add Vite client types for asset/env imports in app code

Improves TS support for import.meta.env, SVG/asset imports, etc.

   "noEmit": true,
-  "jsx": "react-jsx",
+  "jsx": "react-jsx",
+  "types": ["vite/client"],

23-29: Align path aliases with project usage and root tsconfig

Add @pages/* here too (and ensure lowercase path) so app sources resolve consistently.

   "baseUrl": ".",
   "paths": {
-    "@/*": [
-      "./src/*"
-    ]
+    "@/*": ["./src/*"],
+    "@pages/*": ["./src/pages/*"]
   }
web-ui/frontend/src/components/ui/SmoothScroll.tsx (4)

11-16: Only auto-scroll when user is near the bottom; use smooth scroll API

Avoid yanking the viewport if the user scrolled up; also prefer scrollTo with behavior.

-  useEffect(() => {
-    if (scrollAreaRef.current) {
-      scrollAreaRef.current.scrollTop = scrollAreaRef.current.scrollHeight;
-    }
-  }, [children]);  // Triggered when children change (i.e., new messages)
+  useEffect(() => {
+    const el = scrollAreaRef.current;
+    if (!el) return;
+    const threshold = 48; // px
+    const nearBottom = el.scrollHeight - el.scrollTop - el.clientHeight < threshold;
+    if (nearBottom) {
+      el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });
+    }
+  }, [children]); // scroll only when near bottom

20-24: Apply custom scrollbar utility class

Leverage the new .custom-scrollbar so visuals match the rest of the UI.

-      className="flex-grow p-6 overflow-auto"
+      className="flex-grow p-6 overflow-auto custom-scrollbar"

1-1: Update header comment to actual path

File path in the header comment is inaccurate.

-// src/components/SmoothScroll.tsx
+// src/components/ui/SmoothScroll.tsx

23-23: Avoid magic number for maxHeight

Consider a prop (e.g., maxHeight) or a responsive Tailwind class instead of a hard-coded 200px.

web-ui/styles.css (2)

1-19: Deduplicate scrollbar styles to a single source

A similar .custom-scrollbar reportedly exists in frontend/src/App.css. Keep one definition to avoid drift.


2-19: Add dark/HC variants for accessibility

Ensure thumb/track remain legible in dark mode and high-contrast mode.

 .custom-scrollbar {
   scrollbar-width: thin;
   scrollbar-color: #888 #f1f1f1; /* Dark thumb, light track */
 }
 
 .custom-scrollbar::-webkit-scrollbar {
   width: 8px;
 }
 
 .custom-scrollbar::-webkit-scrollbar-thumb {
   background-color: #888;
   border-radius: 10px;
   border: 2px solid #f1f1f1;
 }
 
 .custom-scrollbar::-webkit-scrollbar-track {
   background: #f1f1f1;
 }
+
+/* Dark mode */
+:root.dark .custom-scrollbar {
+  scrollbar-color: #aaa #1f2937;
+}
+:root.dark .custom-scrollbar::-webkit-scrollbar-thumb {
+  background-color: #aaa;
+  border-color: #1f2937;
+}
+:root.dark .custom-scrollbar::-webkit-scrollbar-track {
+  background: #1f2937;
+}
+
+/* High contrast */
+@media (forced-colors: active) {
+  .custom-scrollbar {
+    scrollbar-color: ButtonText ButtonFace;
+  }
+  .custom-scrollbar::-webkit-scrollbar-thumb {
+    border: 1px solid ButtonText;
+    background-color: ButtonText;
+  }
+  .custom-scrollbar::-webkit-scrollbar-track {
+    background: ButtonFace;
+  }
+}
web-ui/frontend/package.json (5)

6-11: Make the TypeScript check explicit and avoid tsc -b unless using project refs

tsc -b requires "composite": true and project references. If not configured, use a plain noEmit check.

   "scripts": {
     "dev": "vite",
-    "build": "tsc -b && vite build",
+    "build": "tsc --noEmit && vite build",
     "lint": "eslint .",
     "preview": "vite preview"
   },

27-27: Prefer react-helmet-async over react-helmet

react-helmet is effectively in maintenance; async variant is recommended for SSR/concurrent features.

-    "react-helmet": "^6.1.0",
+    "react-helmet-async": "^2.0.5",

35-46: Heavy infra toolchain in frontend devDependencies

aws-cdk*, constructs, and Amplify backend CLI will slow installs and enlarge the attack surface. Move to a separate infra workspace or the repo root where needed.


1-11: Declare Node engine to match ESLint 9/Vite 5 requirements

Set a minimum Node version so installs don’t silently break on older Node.

 {
   "name": "PictoPy",
   "private": true,
   "version": "0.0.0",
   "type": "module",
+  "engines": {
+    "node": ">=18.18"
+  },
   "scripts": {

46-47: Trim unused tooling (optional)

esbuild and tsx aren’t referenced in scripts; consider removing to reduce maintenance.

Also applies to: 53-56

web-ui/frontend/src/Pages/Footer/Footer.tsx (2)

18-26: Improve link accessibility and destination

Add an aria-label and hide the icon from screen readers. Also, consider switching from a private channel URL to a public invite (discord.gg/…) so non-members can join.

-            <a 
-              href="https://discord.com/channels/1022871757289422898/1311271974630330388" 
-              target="_blank" 
-              rel="noopener noreferrer" 
+            <a
+              href="https://discord.gg/your-invite-code" 
+              target="_blank"
+              rel="noopener noreferrer"
+              aria-label="Join the AOSSIE community on Discord"
               className="text-sm font-medium text-transparent bg-clip-text bg-gradient-to-r from-yellow-400 to-green-400 hover:bg-gradient-to-r hover:from-yellow-500 hover:to-green-500 transition duration-300 ease-in-out"
             >
-              <FaDiscord className="inline-block mr-2 text-yellow-400 hover:text-green-400 transition duration-300 ease-in-out transform scale-150" /> {/* Scale it to 1.5x */}
+              <FaDiscord aria-hidden="true" className="inline-block mr-2 text-yellow-400 hover:text-green-400 transition duration-300 ease-in-out transform scale-150" />
               <span>Made with love by AOSSIE team</span>
             </a>

24-24: Remove inline comment in JSX

The scale note is self-evident from the class; drop the comment.

web-ui/frontend/README.md (1)

36-41: Prefer auto-detecting React version in ESLint config snippet.

Hardcoding '18.3' will drift. Use 'detect' so the plugin reads the installed version.

 export default tseslint.config({
-  // Set the react version
-  settings: { react: { version: '18.3' } },
+  // Auto-detect the installed React version
+  settings: { react: { version: 'detect' } },
web-ui/frontend/src/context/theme-provider.tsx (1)

48-56: Toggle the dark class on for broader Tailwind/CSS var compatibility.

Applying to body can miss root-scoped variables. Use documentElement.

-        const bodyElement = document.body;
+        const root = document.documentElement;
@@
-            localStorage.setItem("Theme", String(ThemeOptions.Light));
-            bodyElement.classList.remove("dark");
+            localStorage.setItem("Theme", String(ThemeOptions.Light));
+            root.classList.remove("dark");
@@
-            localStorage.setItem("Theme", String(ThemeOptions.Dark));
-            bodyElement.classList.add("dark");
+            localStorage.setItem("Theme", String(ThemeOptions.Dark));
+            root.classList.add("dark");
web-ui/frontend/src/Pages/HowItWorks/HowItWorks.tsx (1)

1-1: Animate exit or drop the unused exit prop.

Framer Motion’s exit requires AnimatePresence. Either wrap details with it or remove exit.

Option A (enable exit):

-import { motion } from "framer-motion";
+import { motion, AnimatePresence } from "framer-motion";
@@
-                  {/* Expandable Step Details */}
-                  {activeStep === index && (
-                    <motion.div
+                  {/* Expandable Step Details */}
+                  <AnimatePresence initial={false}>
+                  {activeStep === index && (
+                    <motion.div
                       initial={{ opacity: 0, height: 0 }}
                       animate={{ opacity: 1, height: "auto" }}
                       exit={{ opacity: 0, height: 0 }}
                       transition={{ duration: 0.3 }}
-                      className="border-t border-gray-200 dark:border-gray-700 pt-4 mt-4"
+                      className="border-t border-gray-200 dark:border-gray-700 pt-4 mt-4"
+                      id={`details-${index}`}
                     >
                       <p className="text-sm text-gray-500 dark:text-gray-400">
                         {step.details}
                       </p>
                     </motion.div>
-                  )}
+                  )}
+                  </AnimatePresence>

Option B (simpler: drop exit):

-                      exit={{ opacity: 0, height: 0 }}

Also applies to: 85-97

web-ui/frontend/tailwind.config.js (1)

1-52: Dark mode and CSS vars setup looks solid. One alignment nit.

Given ThemeProvider now toggles the class on , no Tailwind change is required, but ensure your CSS variables are declared on :root and overridden under .dark to avoid scope mismatch.

web-ui/frontend/src/components/ui/Bouncy Card Features.tsx (3)

73-81: Prevent overlay from intercepting pointer events (future-proof).

Add pointer-events-none so the animated overlay doesn’t block clicks if cards become interactive.

-                <div 
+                <div 
+                  style={{ pointerEvents: 'none' }}
                   className={`absolute bottom-0 left-4 right-4 top-32 translate-y-8 
                     rounded-t-2xl bg-gradient-to-br ${feature.gradient} 
                     p-4 transition-transform duration-[250ms] 
                     group-hover:translate-y-4 group-hover:rotate-[2deg]`}
                 >

96-107: Cursor suggests click but no action provided.

Either wire an onClick/Link or drop cursor-pointer for accurate affordance.

-      className={`group relative min-h-[300px] cursor-pointer 
+      className={`group relative min-h-[300px]
         overflow-hidden rounded-2xl 

12-38: Hoist static features array to module scope.

Avoid re-allocating on each render; also enables memoization/testing.

-export const BouncyCardsFeatures = () => {
-  const features = [
+const FEATURES = [
     { /* ... */ }
   ];
+export const BouncyCardsFeatures = () => {
+  const features = FEATURES;
web-ui/frontend/src/Pages/FaqPage/FAQ.tsx (3)

47-50: Tighten custom event typing and avoid effect churn.

Type the CustomEvent wrapper and make the effect depend only on isClient; use a ref for dark state in the interval to avoid re-subscribing.

-  const [darkMode, setDarkMode] = useState<boolean>(false);
+  const [darkMode, setDarkMode] = useState<boolean>(false);
+  const darkRef = useRef(false);

   useEffect(() => {
     if (!isClient) return;

-    const handleThemeChange = (event: CustomEvent) => {
+    const handleThemeChange = (event: CustomEvent<{ darkMode: boolean }>) => {
       setDarkMode(event.detail.darkMode);
     };
+    const onThemeChanged = (e: Event) => handleThemeChange(e as CustomEvent<{ darkMode: boolean }>);

     const initializeDarkMode = () => {
       try {
         // ...
         setDarkMode(prefersDarkMode);
       } catch (error) {
         console.warn("Error loading dark mode in FAQ:", error);
         setDarkMode(false);
       }
     };

     // Initialize
     initializeDarkMode();

     // Listen for custom theme change events
-    window.addEventListener('themeChanged', handleThemeChange as EventListener);
+    window.addEventListener('themeChanged', onThemeChanged);

     // Enhanced MutationObserver for better mobile support
     const observer = new MutationObserver((mutations) => {
       mutations.forEach((mutation) => {
         if (mutation.type === 'attributes' && 
             (mutation.attributeName === 'class' || mutation.attributeName === 'data-theme')) {
           const isDark = document.documentElement.classList.contains('dark');
           setDarkMode(isDark);
         }
       });
     });

     // Additional check for mobile browsers that might not trigger MutationObserver
-    const intervalCheck = setInterval(() => {
-      const currentDark = document.documentElement.classList.contains('dark');
-      if (currentDark !== darkMode) {
-        setDarkMode(currentDark);
-      }
-    }, 500);
+    const intervalCheck = setInterval(() => {
+      const currentDark = document.documentElement.classList.contains('dark');
+      if (currentDark !== darkRef.current) {
+        darkRef.current = currentDark;
+        setDarkMode(currentDark);
+      }
+    }, 500);

     return () => {
-      window.removeEventListener('themeChanged', handleThemeChange as EventListener);
+      window.removeEventListener('themeChanged', onThemeChanged);
       observer.disconnect();
       clearInterval(intervalCheck);
     };
-  }, [isClient, darkMode]);
+  }, [isClient]);

Also applies to: 83-84, 109-113, 114-114


137-147: Use a stable key.

Keys based on index can cause UI glitches. Use question.

-            <FAQItem
-              key={index}
+            <FAQItem
+              key={faq.question}

176-186: Link button and panel for a11y.

Add aria-controls on the button and id on the content container.

-      <button
+      <button
         className="flex justify-between items-center w-full text-left p-6 group touch-manipulation
         active:bg-gray-50 dark:active:bg-gray-900 transition-colors duration-150"
         onClick={onClick}
-        aria-expanded={isOpen}
+        aria-expanded={isOpen}
+        aria-controls={`faq-panel-${index}`}
         style={{ 
           WebkitTapHighlightColor: 'transparent',
           WebkitTouchCallout: 'none',
           WebkitUserSelect: 'none'
         }}
       >
...
-          <motion.div
+          <motion.div
             initial={{ opacity: 0, height: 0 }}
             animate={{ opacity: 1, height: contentRef.current?.scrollHeight || "auto" }}
             exit={{ opacity: 0, height: 0 }}
             transition={{ duration: 0.3, ease: "easeInOut" }}
-            className="overflow-hidden"
+            className="overflow-hidden"
+            id={`faq-panel-${index}`}
           >

Also applies to: 203-216

web-ui/frontend/src/App.css (2)

7-25: Add dark-mode scrollbar styles.

Improve contrast in dark mode.

 .custom-scrollbar {
   scrollbar-width: thin;
   scrollbar-color: #000000 #ffffff; /* Black thumb, white track */
 }
+
+.dark .custom-scrollbar {
+  scrollbar-color: #9ca3af #0b0f19; /* Gray thumb, dark track */
+}
 
 /* Webkit browsers (Chrome, Safari) */
 .custom-scrollbar::-webkit-scrollbar {
   width: 8px;  /* Adjust width */
 }
 
 .custom-scrollbar::-webkit-scrollbar-thumb {
   background-color: #000000;  /* Black thumb */
   border-radius: 10px;
   border: 2px solid #ffffff;  /* White border */
 }
 
 .custom-scrollbar::-webkit-scrollbar-track {
   background-color: #ffffff;  /* White track */
 }
+
+.dark .custom-scrollbar::-webkit-scrollbar-thumb {
+  background-color: #9ca3af;
+  border: 2px solid #0b0f19;
+}
+.dark .custom-scrollbar::-webkit-scrollbar-track {
+  background-color: #0b0f19;
+}

34-41: Global button/input rules may fight Tailwind/shadcn styles.

Prefer Tailwind utility classes or wrap these in @layer components and scope to a class to avoid unintended overrides.

-/* Refined button styling */
-button:hover {
+@layer components {
+/* Refined button styling (scoped) */
+.ui-base button:hover {
   transition: background-color 0.3s ease, transform 0.2s ease;
-}
-
-button:active {
+}
+.ui-base button:active {
   transform: scale(0.98);
-}
-
-/* Input box styling */
-input:focus {
+}
+/* Input box styling */
+.ui-base input:focus {
   outline: none;
   border-color: #4A90E2;
   box-shadow: 0 0 5px rgba(74, 144, 226, 0.5);
 }
+}

Also applies to: 43-48

web-ui/frontend/src/main.tsx (1)

1-10: Guard root lookup instead of non-null assertion.

Safer in non-standard hosts.

- createRoot(document.getElementById('root')!).render(
+ const rootEl = document.getElementById('root');
+ if (!rootEl) throw new Error('Root element #root not found');
+ createRoot(rootEl).render(
web-ui/frontend/index.html (1)

7-9: Optional: advertise dark mode to UA.

Add color-scheme meta for better native form rendering.

     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+    <meta name="color-scheme" content="light dark" />
web-ui/frontend/components.json (1)

20-20: Add a trailing newline

Keeps diffs cleaner across tools/editors.

   }
-}
+}
+
web-ui/frontend/src/lib/utils.ts (1)

1-6: Prefer spreading args into clsx

Minor cleanup; matches upstream shadcn snippet and avoids nesting.

 export function cn(...inputs: ClassValue[]) {
-  return twMerge(clsx(inputs))
+  return twMerge(clsx(...inputs))
 }
web-ui/frontend/src/App.tsx (1)

1-60: Align dark-mode target and eventing across the app (ThemeProvider vs FAQ)

FAQ observes documentElement.classList and a custom 'themeChanged' event, while ThemeProvider toggles body and no event is dispatched. Standardize on document.documentElement for the 'dark' class and dispatch a 'themeChanged' CustomEvent from ThemeProvider to keep listeners in sync.

web-ui/frontend/src/components/ui/input.tsx (1)

8-22: Solid input wrapper; consider defaulting type to "text"

Ensures consistent behavior when type is omitted.

-        type={type}
+        type={type ?? "text"}
web-ui/frontend/src/Pages/Demo/marqu.tsx (1)

43-46: Use stable keys instead of array index.

Index keys hurt reconciliation during dynamic re-renders. Use a stable composite key.

-        {[...technologies, ...technologies, ...technologies].map((tech, index) => (
+        {[...technologies, ...technologies, ...technologies].map((tech, index) => (
           <div
-            key={index}
+            key={`${tech.text}-${index}`}
web-ui/frontend/src/Pages/Landing page/Home1.tsx (3)

69-84: Avoid in-place mutation in shuffle to keep data immutable.

Mutating squareData can lead to subtle bugs and harder reasoning. Return a shuffled copy.

-const shuffle = (array: (typeof squareData)[0][]) => {
-  let currentIndex = array.length,
-    randomIndex;
-
-  while (currentIndex != 0) {
-    randomIndex = Math.floor(Math.random() * currentIndex);
-    currentIndex--;
-
-    [array[currentIndex], array[randomIndex]] = [
-      array[randomIndex],
-      array[currentIndex],
-    ];
-  }
-
-  return array;
-};
+const shuffle = <T,>(array: T[]): T[] => {
+  const copy = array.slice();
+  let currentIndex = copy.length;
+  while (currentIndex !== 0) {
+    const randomIndex = Math.floor(Math.random() * currentIndex);
+    currentIndex--;
+    [copy[currentIndex], copy[randomIndex]] = [
+      copy[randomIndex],
+      copy[currentIndex],
+    ];
+  }
+  return copy;
+};

153-168: Minor: compute from a copy, no behavior change.

-const generateSquares = () => {
-  return shuffle(squareData).map((sq) => (
+const generateSquares = () => {
+  return shuffle([...squareData]).map((sq) => (

171-178: Type the timeout ref precisely to avoid Node/browser TS mismatch.

-  const timeoutRef = useRef<any>(null);
+  const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);
web-ui/frontend/src/Pages/Landing page/Navbar.tsx (2)

160-169: Move viewport meta management to index.html.

Creating meta viewport from a component risks duplication and surprises. Put it in public/index.html.

-  useEffect(() => {
-    const viewport = document.querySelector('meta[name="viewport"]');
-    if (!viewport) {
-      const meta = document.createElement('meta');
-      meta.name = 'viewport';
-      meta.content = 'width=device-width, initial-scale=1.0, user-scalable=yes';
-      document.getElementsByTagName('head')[0].appendChild(meta);
-    }
-  }, []);
+  // Viewport meta is managed in index.html

225-244: Add basic a11y wiring for mobile menu (aria-expanded/controls).

Expose state to assistive tech and tie the button to the menu container.

-              <button
+              <button
                 onClick={() => setIsOpen(!isOpen)}
                 className="p-3 rounded-full text-gray-300 
                 hover:text-white
                 bg-black/80 backdrop-blur-sm
                 hover:bg-gray-800
                 border border-gray-700
                 shadow-sm hover:shadow-md
                 transition-all duration-300 touch-manipulation
                 active:scale-95"
                 type="button"
                 aria-label="Toggle menu"
+                aria-expanded={isOpen}
+                aria-controls="mobile-menu"
@@
-        <div
+        <div
+          id="mobile-menu"
           className={`md:hidden fixed inset-0 z-50 
           bg-black
           transform transition-transform duration-300 ease-in-out 
           ${isOpen ? "translate-x-0" : "-translate-x-full"}`}

Also applies to: 249-256

web-ui/frontend/src/Pages/pictopy-landing.tsx (2)

29-55: Remove no-op MutationObserver for dark mode.

checkDarkMode does nothing; the observer adds cost without benefit.

-  // Read dark mode from the HTML element (set by navbar)
-  useEffect(() => {
-    const checkDarkMode = () => {
-  // Theme is controlled globally by Tailwind's dark class on <html>
-  // No need to set local state, theme is controlled globally
-    };
-    // Initial check
-    checkDarkMode();
-    // Watch for changes to the dark class
-    const observer = new MutationObserver((mutations) => {
-      mutations.forEach((mutation) => {
-        if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
-          checkDarkMode();
-        }
-      });
-    });
-    observer.observe(document.documentElement, {
-      attributes: true,
-      attributeFilter: ['class']
-    });
-    return () => observer.disconnect();
-  }, []);
+  // Theme is controlled globally by Tailwind's `dark` class on <html>.

61-68: Use smooth scrolling to the main download CTA.

-  const scrollToMainDownload = () => {
+  const scrollToMainDownload = () => {
     const btn = document.getElementById('main-download');
     if (btn) {
-      const targetY = btn.getBoundingClientRect().top + window.scrollY - 180;
-      window.scrollTo({ top: targetY, behavior: 'auto' });
+      const targetY = btn.getBoundingClientRect().top + window.scrollY - 180;
+      window.scrollTo({ top: targetY, behavior: 'smooth' });
     }
   };
web-ui/frontend/src/index.css (1)

76-86: Animate the star field via background-position, not transform.

Transforming a fixed, full-viewport layer risks edge gaps/flicker. Animate the tiled background instead.

 .starry-background {
   position: fixed;
   top: 0;
   left: 0;
   width: 100%;
   height: 100%;
   background: url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20256%20256%22%3E%3Ccircle%20cx%3D%22100%25%22%20cy%3D%22100%25%22%20r%3D%222%22%20fill%3D%22%23ffffff%22%20opacity%3D%22.4%22%20%2F%3E%3C%2Fsvg%3E') repeat scroll 0% 0%;
-    animation: stars 200s linear infinite;
+    animation: stars 200s linear infinite;
     z-index: -1;
 }
 
 @keyframes stars {
-  from {
-    transform: translateY(0);
-  }
-  to {
-    transform: translateY(-100%);
-  }
+  from { background-position: 0 0; }
+  to   { background-position: 0 -256px; } /* matches tile size */
 }

Also applies to: 89-96

web-ui/frontend/src/components/ui/card.tsx (1)

5-5: Tone down informal comments.

Comments like “fancy div” are noisy in a shared UI lib. Prefer short, neutral docstrings.

web-ui/frontend/src/components/ui/button.tsx (1)

44-51: Default type to “button” to prevent accidental form submits.

In forms, defaults to submit; this often causes unintended navigations.

-    const Comp = asChild ? Slot : "button"
+    const Comp = asChild ? Slot : "button"
     return (
       <Comp
-        className={cn(buttonVariants({ variant, size, className }))}
+        className={cn(buttonVariants({ variant, size, className }))}
+        {...(!asChild && { type: (props as React.ButtonHTMLAttributes<HTMLButtonElement>).type ?? "button" })}
         ref={ref}
         {...props}
       />
     )

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 6ec18af and 92a2114.

⛔ Files ignored due to path filters (14)
  • web-ui/frontend/dist/PictoPy_Logo.png is excluded by !**/dist/**, !**/*.png
  • web-ui/frontend/dist/assets/38881995-N4pCjCwb.png is excluded by !**/dist/**, !**/*.png
  • web-ui/frontend/dist/assets/index-4LOwtzgi.css is excluded by !**/dist/**
  • web-ui/frontend/dist/assets/index-CQUCmgbV.js is excluded by !**/dist/**
  • web-ui/frontend/dist/index.html is excluded by !**/dist/**
  • web-ui/frontend/dist/vite.svg is excluded by !**/dist/**, !**/*.svg
  • web-ui/frontend/package-lock.json is excluded by !**/package-lock.json
  • web-ui/frontend/public/Linux-logo.jpg is excluded by !**/*.jpg
  • web-ui/frontend/public/PictoPy_Logo.png is excluded by !**/*.png
  • web-ui/frontend/public/mac.logo.png is excluded by !**/*.png
  • web-ui/frontend/public/vite.svg is excluded by !**/*.svg
  • web-ui/frontend/public/windows.png is excluded by !**/*.png
  • web-ui/frontend/src/assets/38881995.png is excluded by !**/*.png
  • web-ui/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (40)
  • web-ui/.gitignore (1 hunks)
  • web-ui/README.md (1 hunks)
  • web-ui/frontend/.gitignore (1 hunks)
  • web-ui/frontend/README.md (1 hunks)
  • web-ui/frontend/components.json (1 hunks)
  • web-ui/frontend/eslint.config.js (1 hunks)
  • web-ui/frontend/index.html (1 hunks)
  • web-ui/frontend/package.json (1 hunks)
  • web-ui/frontend/postcss.config.js (1 hunks)
  • web-ui/frontend/src/App.css (1 hunks)
  • web-ui/frontend/src/App.tsx (1 hunks)
  • web-ui/frontend/src/Pages/Demo/marqu.tsx (1 hunks)
  • web-ui/frontend/src/Pages/FaqPage/FAQ.tsx (1 hunks)
  • web-ui/frontend/src/Pages/Footer/Footer.tsx (1 hunks)
  • web-ui/frontend/src/Pages/HowItWorks/HowItWorks.tsx (1 hunks)
  • web-ui/frontend/src/Pages/Landing page/Home1.tsx (1 hunks)
  • web-ui/frontend/src/Pages/Landing page/Navbar.tsx (1 hunks)
  • web-ui/frontend/src/Pages/pictopy-landing.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/Bouncy Card Features.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/Features.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/ScrollProgress.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/SmoothScroll.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/button.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/card.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/input.tsx (1 hunks)
  • web-ui/frontend/src/components/ui/label.tsx (1 hunks)
  • web-ui/frontend/src/context/theme-provider.tsx (1 hunks)
  • web-ui/frontend/src/index.css (1 hunks)
  • web-ui/frontend/src/lib/utils.ts (1 hunks)
  • web-ui/frontend/src/main.tsx (1 hunks)
  • web-ui/frontend/src/vite-env.d.ts (1 hunks)
  • web-ui/frontend/tailwind.config.js (1 hunks)
  • web-ui/frontend/tsconfig.app.json (1 hunks)
  • web-ui/frontend/tsconfig.app.tsbuildinfo (1 hunks)
  • web-ui/frontend/tsconfig.json (1 hunks)
  • web-ui/frontend/tsconfig.node.json (1 hunks)
  • web-ui/frontend/tsconfig.node.tsbuildinfo (1 hunks)
  • web-ui/frontend/vite.config.ts (1 hunks)
  • web-ui/package.json (1 hunks)
  • web-ui/styles.css (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (6)
web-ui/frontend/src/Pages/Landing page/Navbar.tsx (3)
web-ui/frontend/dist/assets/index-CQUCmgbV.js (16)
  • e (40-40)
  • e (58-58)
  • e (58-58)
  • e (58-58)
  • e (58-58)
  • e (162-162)
  • e (162-162)
  • e (167-167)
  • e (197-197)
  • e (197-197)
  • e (197-197)
  • e (197-197)
  • e (209-209)
  • e (214-214)
  • e (214-214)
  • e (220-220)
frontend/src/components/Navigation/Navbar/Navbar.tsx (1)
  • Navbar (17-139)
web-ui/frontend/src/components/ui/button.tsx (1)
  • Button (57-57)
web-ui/frontend/src/components/ui/label.tsx (1)
web-ui/frontend/src/lib/utils.ts (1)
  • cn (4-6)
web-ui/frontend/src/components/ui/input.tsx (1)
web-ui/frontend/src/lib/utils.ts (1)
  • cn (4-6)
web-ui/frontend/src/components/ui/Bouncy Card Features.tsx (1)
web-ui/frontend/src/components/ui/card.tsx (1)
  • CardTitle (53-53)
web-ui/frontend/src/App.tsx (4)
web-ui/frontend/src/components/ui/Bouncy Card Features.tsx (1)
  • BouncyCardsFeatures (12-89)
web-ui/frontend/src/Pages/FaqPage/FAQ.tsx (1)
  • FAQ (33-152)
web-ui/frontend/src/context/theme-provider.tsx (2)
  • ThemeContext (19-19)
  • ThemeProvider (44-68)
frontend/src/components/Navigation/Navbar/Navbar.tsx (1)
  • Navbar (17-139)
web-ui/frontend/src/components/ui/button.tsx (1)
web-ui/frontend/src/lib/utils.ts (1)
  • cn (4-6)
🔇 Additional comments (17)
web-ui/frontend/src/components/ui/ScrollProgress.tsx (1)

1-1: Remove unused ScrollProgress component
No references to ScrollProgress were found in web-ui/frontend after searching (rg -nP "ScrollProgress"). Delete web-ui/frontend/src/components/ui/ScrollProgress.tsx if it’s not needed, or implement and integrate it where intended.

web-ui/frontend/src/vite-env.d.ts (1)

1-1: LGTM — brings in Vite client types

Correct placement and content.

web-ui/frontend/postcss.config.js (1)

1-6: No changes needed for ESM syntax in postcss.config.js
package.json declares "type": "module", so export default is valid.

web-ui/package.json (1)

1-14: Clarify package boundary in monorepo structure
Repository contains both web-ui/package.json (only deps) and web-ui/frontend/package.json. This risks duplicate installs and tooling confusion—pick one of:

  • Option A: convert web-ui/package.json into a workspace root ("name": "web-ui", "private": true, "workspaces": ["frontend"]) and move all dependencies into web-ui/frontend/package.json.
  • Option B: delete web-ui/package.json and consolidate into the single package.json under web-ui/frontend/.
web-ui/frontend/vite.config.ts (1)

11-11: Alias '@pages' matches the actual ‘src/Pages’ directory case—no cross-OS import issues detected.

web-ui/frontend/package.json (1)

12-33: No Vite config detected under web-ui/frontend/vite.config.*. Please verify that your Vite setup’s config file (e.g. vite.config.ts or vite.config.js) resides in web-ui/frontend/ and includes matching alias entries for "@/*": ["src/*"] and "@pages/*": ["src/Pages/*"]. If it’s located elsewhere or named differently, update the paths or aliases accordingly before approving.

web-ui/frontend/src/Pages/Footer/Footer.tsx (1)

6-34: Footer structure looks good

Semantic footer, responsive layout, external-link hygiene (noopener) all LGTM.

web-ui/frontend/src/main.tsx (1)

1-10: Bootstrap looks solid.

StrictMode + single import path is clean.

web-ui/frontend/index.html (1)

6-6: Favicon path /PictoPy_Logo.png correctly served in Vite build
PictoPy_Logo.png is present under web-ui/frontend/public and is included in the dist output, so the /PictoPy_Logo.png href will resolve.

web-ui/frontend/components.json (1)

1-20: Shadcn config looks good

Aliases, Tailwind hooks, and schema align with typical shadcn/ui setup.

web-ui/frontend/src/lib/utils.ts (1)

1-1: clsx v2+ installed confirmed web-ui/frontend/package.json declares "clsx": "^2.1.1", so named import support is safe.

web-ui/frontend/src/App.tsx (1)

5-5: Import path './Pages/Demo/marqu' is correct The file marqu.tsx exists at web-ui/frontend/src/Pages/Demo and exports a default React component; no changes required.

web-ui/frontend/src/components/ui/input.tsx (1)

1-26: LGTM

ForwardRef usage, props typing, and cn merge align with the project pattern.

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

7-22: LGTM

Radix wrapper with CVA + cn is clean and idiomatic.

web-ui/frontend/src/Pages/Landing page/Navbar.tsx (1)

261-266: Verify presence of section IDs for smooth-scroll links
No elements with id="features" or id="about" were found in the Landing page—ensure those section IDs exist or update the links accordingly.

web-ui/frontend/src/Pages/pictopy-landing.tsx (1)

10-16: All logo asset paths verified
PictoPy_Logo.png, mac.logo.png, windows.png, and Linux-logo.jpg are all present under web-ui/frontend/public.

web-ui/frontend/src/components/ui/button.tsx (1)

7-35: Variants look solid.

Good coverage of variant/size combos with sensible defaults; aligns with Tailwind tokens.

Comment on lines +1 to +28
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'

export default tseslint.config(
{ ignores: ['dist'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
)
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Enable React plugin and type-aware rules to catch more issues.

Add eslint-plugin-react with auto version detection and switch to TypeScript type-checked presets with project-aware parserOptions.

 import js from '@eslint/js'
 import globals from 'globals'
 import reactHooks from 'eslint-plugin-react-hooks'
 import reactRefresh from 'eslint-plugin-react-refresh'
 import tseslint from 'typescript-eslint'
+import react from 'eslint-plugin-react'
 
 export default tseslint.config(
-  { ignores: ['dist'] },
+  { ignores: ['dist', 'node_modules'] },
   {
-    extends: [js.configs.recommended, ...tseslint.configs.recommended],
+    extends: [
+      js.configs.recommended,
+      ...tseslint.configs.recommendedTypeChecked,
+      // Optional: stricter typing
+      // ...tseslint.configs.strictTypeChecked,
+    ],
     files: ['**/*.{ts,tsx}'],
     languageOptions: {
-      ecmaVersion: 2020,
+      ecmaVersion: 'latest',
       globals: globals.browser,
+      parserOptions: {
+        project: ['./tsconfig.node.json', './tsconfig.app.json', './tsconfig.json'],
+        tsconfigRootDir: import.meta.dirname,
+        ecmaFeatures: { jsx: true },
+      },
     },
+    settings: { react: { version: 'detect' } },
     plugins: {
       'react-hooks': reactHooks,
       'react-refresh': reactRefresh,
+      'react': react,
     },
     rules: {
       ...reactHooks.configs.recommended.rules,
+      ...react.configs.recommended.rules,
+      ...react.configs['jsx-runtime'].rules,
       'react-refresh/only-export-components': [
         'warn',
         { allowConstantExport: true },
       ],
     },
   },
 )
📝 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
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
export default tseslint.config(
{ ignores: ['dist'] },
{
extends: [js.configs.recommended, ...tseslint.configs.recommended],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
},
rules: {
...reactHooks.configs.recommended.rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
)
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import react from 'eslint-plugin-react'
export default tseslint.config(
{ ignores: ['dist', 'node_modules'] },
{
extends: [
js.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
// Optional: stricter typing
// ...tseslint.configs.strictTypeChecked,
],
files: ['**/*.{ts,tsx}'],
languageOptions: {
ecmaVersion: 'latest',
globals: globals.browser,
parserOptions: {
project: [
'./tsconfig.node.json',
'./tsconfig.app.json',
'./tsconfig.json',
],
tsconfigRootDir: import.meta.dirname,
ecmaFeatures: { jsx: true },
},
},
settings: {
react: { version: 'detect' },
},
plugins: {
'react-hooks': reactHooks,
'react-refresh': reactRefresh,
react,
},
rules: {
...reactHooks.configs.recommended.rules,
...react.configs.recommended.rules,
...react.configs['jsx-runtime'].rules,
'react-refresh/only-export-components': [
'warn',
{ allowConstantExport: true },
],
},
},
)
🤖 Prompt for AI Agents
In web-ui/frontend/eslint.config.js around lines 1 to 28, the config lacks
eslint-plugin-react and type-aware TypeScript rules; update it to add the
"react" plugin with settings.react.version set to "detect", include
"plugin:react/recommended" in extends, and enable type-checked presets by adding
"plugin:@typescript-eslint/recommended-requiring-type-checking" and using
@typescript-eslint's project-aware parserOptions (set parser to
"@typescript-eslint/parser" and parserOptions.project to your tsconfig path,
e.g., "./tsconfig.json"); also ensure the plugins list includes "react" and keep
react-hooks/react-refresh entries intact so the linter runs with type-aware
React rules.

Comment on lines +12 to +33
"dependencies": {
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"constants": "^0.0.2",
"install": "^0.13.0",
"lottie": "^0.0.1",
"lottie-react": "^2.4.1",
"lucide-react": "^0.446.0",
"motion": "^12.0.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-helmet": "^6.1.0",
"react-icons": "^5.4.0",
"react-just-parallax": "^3.1.16",
"react-router-dom": "^6.28.2",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7"
},
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Remove likely-unintentional runtime deps (supply-chain/bloat risk)

constants, install, and lottie (0.0.1) are red flags. Keep lottie-react (which pulls lottie-web) and drop these.

   "dependencies": {
@@
-    "constants": "^0.0.2",
-    "install": "^0.13.0",
-    "lottie": "^0.0.1",
     "lottie-react": "^2.4.1",
📝 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
"dependencies": {
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"constants": "^0.0.2",
"install": "^0.13.0",
"lottie": "^0.0.1",
"lottie-react": "^2.4.1",
"lucide-react": "^0.446.0",
"motion": "^12.0.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-helmet": "^6.1.0",
"react-icons": "^5.4.0",
"react-just-parallax": "^3.1.16",
"react-router-dom": "^6.28.2",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7"
},
"dependencies": {
"@radix-ui/react-icons": "^1.3.0",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-separator": "^1.1.0",
"@radix-ui/react-slot": "^1.1.1",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lottie-react": "^2.4.1",
"lucide-react": "^0.446.0",
"motion": "^12.0.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-helmet": "^6.1.0",
"react-icons": "^5.4.0",
"react-just-parallax": "^3.1.16",
"react-router-dom": "^6.28.2",
"tailwind-merge": "^2.6.0",
"tailwindcss-animate": "^1.0.7"
},
🤖 Prompt for AI Agents
In web-ui/frontend/package.json around lines 12 to 33, the dependencies include
likely-unintentional or unsafe runtime packages ("constants", "install", and
"lottie" v0.0.1) that bloat the supply chain; remove these three entries from
the "dependencies" block and run npm/yarn install to update lockfile; ensure
lottie-react remains (it pulls lottie-web) and confirm no code imports the
removed packages—if any imports exist, replace them with lottie-react or
appropriate stable libs before removing.

Comment on lines +1 to +3
@tailwind base;
@tailwind components;
@tailwind utilities;
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Ensure Tailwind directives aren’t duplicated across CSS files.

If index.css already includes @tailwind base/components/utilities, having them here can conflict. Either import this file instead of index.css or remove these three lines.

Run:


🏁 Script executed:

#!/bin/bash
rg -n "@tailwind base|@tailwind components|@tailwind utilities" web-ui/frontend/src
rg -n "App\\.css" web-ui/frontend

Length of output: 424


Remove duplicate Tailwind directives from App.css
Index.css already includes the three @tailwind directives, so delete lines 1–3 in web-ui/frontend/src/App.css to avoid conflicting duplicates.

🤖 Prompt for AI Agents
In web-ui/frontend/src/App.css lines 1 to 3, the file contains duplicate
Tailwind directives that conflict with Index.css; remove the three lines
"@tailwind base;", "@tailwind components;", and "@tailwind utilities;" from
App.css so that Tailwind is only imported once via Index.css, leaving App.css
for component-specific styles.

import { useContext, useEffect } from "react";
import { ThemeProvider, ThemeContext, ThemeOptions } from "./context/theme-provider";
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import Navbar from "./Pages/Landing page/Navbar";
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

Navbar import is broken (wrong path and default vs named export)

Navbar is exported as a named function in components/Navigation. Fix the path and switch to named import.

-import Navbar from "./Pages/Landing page/Navbar";
+import { Navbar } from "./components/Navigation/Navbar/Navbar";
📝 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
import Navbar from "./Pages/Landing page/Navbar";
import { Navbar } from "./components/Navigation/Navbar/Navbar";
🤖 Prompt for AI Agents
In web-ui/frontend/src/App.tsx around line 4, the import statement uses the
wrong path and assumes a default export (`import Navbar from "./Pages/Landing
page/Navbar";`) while the Navbar is actually a named export from
components/Navigation; update the import to point to the correct module path
(components/Navigation) and change it to a named import (e.g., import { Navbar }
from '...') so it matches the exported symbol.

import HowItWorks from "./Pages/HowItWorks/HowItWorks";
import Footer from "./Pages/Footer/Footer";
import PictopyLanding from "./Pages/pictopy-landing";
import BouncyCardsFeatures from "./components/ui/Bouncy Card Features";
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

BouncyCardsFeatures import mismatch (named export, file name has spaces)

The component is a named export; current default import fails. Also consider renaming the file to remove spaces for cross-platform tooling.

-import BouncyCardsFeatures from "./components/ui/Bouncy Card Features";
+import { BouncyCardsFeatures } from "./components/ui/Bouncy Card Features";

Optional: rename file to BouncyCardFeatures.tsx and adjust import accordingly.

📝 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
import BouncyCardsFeatures from "./components/ui/Bouncy Card Features";
import { BouncyCardsFeatures } from "./components/ui/Bouncy Card Features";
🤖 Prompt for AI Agents
In web-ui/frontend/src/App.tsx around line 13, the import uses a default import
from a filename containing spaces and does not match the component's named
export; change the import to use the named export (e.g., import {
BouncyCardsFeatures } from "...") and update the path to the actual file name
without spaces, or rename the file to a normalized name like
BouncyCardFeatures.tsx and update the import to match that new filename and
named export.

@@ -0,0 +1 @@
{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/pages/pictopy-landing.tsx","./src/pages/demo/marqu.tsx","./src/pages/faqpage/faq.tsx","./src/pages/footer/footer.tsx","./src/pages/howitworks/howitworks.tsx","./src/pages/landing page/home1.tsx","./src/pages/landing page/navbar.tsx","./src/components/ui/bouncy card features.tsx","./src/components/ui/features.tsx","./src/components/ui/scrollprogress.tsx","./src/components/ui/smoothscroll.tsx","./src/components/ui/button.tsx","./src/components/ui/card.tsx","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/context/theme-provider.tsx","./src/lib/utils.ts"],"version":"5.7.3"} No newline at end of file
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

Do not commit TS build artifacts

.tsbuildinfo should be ignored to avoid churn/merge noise.

Add to the repo’s .gitignore:

+*.tsbuildinfo
📝 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
{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/pages/pictopy-landing.tsx","./src/pages/demo/marqu.tsx","./src/pages/faqpage/faq.tsx","./src/pages/footer/footer.tsx","./src/pages/howitworks/howitworks.tsx","./src/pages/landing page/home1.tsx","./src/pages/landing page/navbar.tsx","./src/components/ui/bouncy card features.tsx","./src/components/ui/features.tsx","./src/components/ui/scrollprogress.tsx","./src/components/ui/smoothscroll.tsx","./src/components/ui/button.tsx","./src/components/ui/card.tsx","./src/components/ui/input.tsx","./src/components/ui/label.tsx","./src/context/theme-provider.tsx","./src/lib/utils.ts"],"version":"5.7.3"}
# Ignore TypeScript build info files
*.tsbuildinfo
🤖 Prompt for AI Agents
In web-ui/frontend/tsconfig.app.tsbuildinfo around lines 1-1, the TypeScript
build artifact (.tsbuildinfo) was committed and should be ignored; update the
repository by adding a rule to the project .gitignore (or creating one in
web-ui/frontend if it’s per-package) to ignore *.tsbuildinfo or specifically
tsconfig*.tsbuildinfo, then remove the already committed file from the index
using git rm --cached web-ui/frontend/tsconfig.app.tsbuildinfo and commit the
change so the artifact is no longer tracked.

💡 Verification agent

🧩 Analysis chain

Spaces and inconsistent casing in paths will cause cross‑platform issues

Entries like src/pages/landing page/... and components/ui/bouncy card features.tsx include spaces; aliasing shows both Pages and pages. This invites import mistakes and case-sensitive FS breakage.


🏁 Script executed:

#!/bin/bash
# List files/dirs with spaces and mixed-case "Pages/pages"
fd -H ' ' -t f -t d
rg -nP 'from\s+[\'"][^\'"]*(Pages|pages)[^\'"]*[\'"]' -g '!**/node_modules/**' -S

Length of output: 459


Rename directories/files to remove spaces & unify casing

  • src/Pages/Landing page/src/pages/landing-page/
  • src/components/ui/Bouncy Card Features.tsxsrc/components/ui/BouncyCardFeatures.tsx
    Standardize all directory names to lowercase and eliminate spaces to avoid case-sensitive FS and import errors.

Comment on lines +5 to +7
"@/*": ["src/*"],
"@pages/*": ["src/Pages/*"]
}
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

Fix alias case: maps to non-existent 'src/Pages'

Project files live under src/pages/** (lowercase). This alias will fail on case-sensitive systems.

   "paths": {
     "@/*": ["src/*"],
-    "@pages/*": ["src/Pages/*"]
+    "@pages/*": ["src/pages/*"]
   }
📝 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
"@/*": ["src/*"],
"@pages/*": ["src/Pages/*"]
}
"paths": {
"@/*": ["src/*"],
"@pages/*": ["src/pages/*"]
}
🤖 Prompt for AI Agents
In web-ui/frontend/tsconfig.json around lines 5 to 7 the path alias "@pages/*"
points to "src/Pages/*" which does not exist on disk (actual folder is
"src/pages"); update the alias to "@pages/*": ["src/pages/*"] so it matches the
real directory name, then run a full TypeScript/IDE restart or rebuild to ensure
imports resolve and fix any broken import paths that used the wrong case.

@@ -0,0 +1 @@
{"root":["./vite.config.ts"],"version":"5.7.3"} No newline at end of file
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

Do not commit TypeScript .tsbuildinfo artifacts

This is a compiler cache; committing it causes churn and merge noise. Remove and ignore.

Add to a .gitignore:

+# Ignore TS build info caches
+**/*.tsbuildinfo

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In web-ui/frontend/tsconfig.node.tsbuildinfo around line 1, the committed
TypeScript .tsbuildinfo compiler cache should be removed and ignored; delete the
file from the repo (git rm --cached or remove and commit) and add an ignore rule
such as *.tsbuildinfo or /web-ui/frontend/tsconfig*.tsbuildinfo to the project
.gitignore (or the web-ui/frontend/.gitignore) so the artifact is not tracked
going forward, then commit the updated .gitignore and the removal.

Comment on lines +1 to +3
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react-swc';
import path from 'path';
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

Fix ESM __dirname usage in Vite config

In an ESM project ("type": "module"), __dirname is undefined. Use fileURLToPath/new URL and prefer node: specifiers.

-import { defineConfig } from 'vite';
-import react from '@vitejs/plugin-react-swc';
-import path from 'path';
+import { defineConfig } from 'vite';
+import react from '@vitejs/plugin-react-swc';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const rootDir = fileURLToPath(new URL('.', import.meta.url));

 // Vite config
 export default defineConfig({
   plugins: [react()],
   resolve: {
     alias: {
-      '@': path.resolve(__dirname, 'src'),  // Maps `@` to `src` folder
-      '@pages': path.resolve(__dirname, 'src/Pages'), // Maps `@pages` to `src/Pages` folder
+      '@': path.resolve(rootDir, 'src'),  // Maps `@` to `src` folder
+      '@pages': path.resolve(rootDir, 'src/Pages'), // Maps `@pages` to `src/Pages` folder
     },
   },
 });

Also applies to: 10-12

🤖 Prompt for AI Agents
In web-ui/frontend/vite.config.ts around lines 1-3 (and also adjust lines
10-12), the config currently assumes CommonJS __dirname which is undefined in
ESM; replace usage by importing node specifiers and deriving dirname via
fileURLToPath(import.meta.url): import from 'node:path' and 'node:url', call
fileURLToPath(new URL(import.meta.url)) to get __filename and use
path.dirname(__filename) for __dirname, then update any path.resolve or
__dirname usages to use that derived value.

@rahulharpal1603
Copy link
Contributor

Hi @amank55,
Please resolve the conflicts and send the latest deployed link here.

@rahulharpal1603
Copy link
Contributor

Hi @amank55,
Any updates?

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.

2 participants