Skip to content

Add website logos#435

Merged
Kitenite merged 3 commits intomainfrom
quick-website-updates
Dec 19, 2025
Merged

Add website logos#435
Kitenite merged 3 commits intomainfrom
quick-website-updates

Conversation

@Kitenite
Copy link
Copy Markdown
Collaborator

@Kitenite Kitenite commented Dec 19, 2025

Description

Related Issues

Type of Change

  • Bug fix
  • New feature
  • Documentation
  • Refactor
  • Other (please describe):

Testing

Screenshots (if applicable)

Additional Notes

Summary by CodeRabbit

  • Refactor

    • Refined trusted brands section with improved marquee-based logo carousel
    • Enhanced logo rendering with image optimization and flexible styling options
  • Chores

    • Reorganized development environment scripts

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

Kitenite and others added 2 commits December 19, 2025 10:47
- Change `bun dev` to run desktop, api, and web apps instead of just desktop
- Remove redundant `dev:app` script

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Dec 19, 2025

Walkthrough

The PR removes the ClientLogosSection component and its associated CLIENT_LOGOS constant from the marketing app folder, while updating TrustedBySection to use a Marquee-based logo rendering with an expanded data structure. Development scripts in package.json were restructured to apply Turbo filters across api, web, and desktop instead of desktop only, with added marketing-specific script.

Changes

Cohort / File(s) Change Summary
ClientLogosSection removal
apps/marketing/src/app/components/ClientLogosSection/ClientLogosSection.tsx, apps/marketing/src/app/components/ClientLogosSection/constants.ts, apps/marketing/src/app/components/ClientLogosSection/index.ts
Entire ClientLogosSection component deleted, including its framer-motion-based marquee implementation, CLIENT_LOGOS constant definition, and public export
TrustedBySection refactor
apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
Replaced static triple-logo loop with Marquee component; transitioned from LOGO_SETS structure to CLIENT_LOGOS-based rendering; integrated Next.js Image with per-item styling (height, borderRadius, marginTop); updated imports and hover/opacity styling
Development scripts update
package.json
Broadened dev script to include api and web filters alongside desktop; removed dev:app, dev:blog, dev:website scripts; added dev:marketing script

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • TrustedBySection.tsx: Verify that CLIENT_LOGOS data is now accessible (check import source after removal from constants.ts)
  • Component logic: Confirm Marquee behavior matches intended infinite scroll and that styling transitions (opacity, cursor) function correctly
  • package.json: Validate Turbo filter syntax and ensure dev:marketing script uses correct package identifier

Possibly related PRs

Poem

🐰 From marketing to trusted fields we hop,
Logos dance in endless marquee loop,
Old LOGO_SETS fade, new data props,
Image by image, in every group—
The scroll continues, sweet and true,
Scripts now swirl through turbo's flow anew! ✨

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning The pull request description is completely empty and consists only of the template placeholders without any actual content provided by the author. Fill in the description template with details about what was changed (component restructuring, logo data migration, dev script updates), why these changes were made, and the impact of these changes.
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.
Title check ❓ Inconclusive The title 'Add website logos' is vague and does not clearly describe the main changes, which involve restructuring logo components and refactoring dev scripts. Consider a more specific title that captures the primary change, such as 'Refactor ClientLogosSection component and update dev scripts' or 'Replace ClientLogosSection with TrustedBySection marquee implementation'.
✨ 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 quick-website-updates

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.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Dec 19, 2025

🚀 Preview Deployment

🔗 Preview Links

Service Status Link
Neon Database (Neon) View Branch
Vercel API (Vercel) Open Preview
Vercel Web (Vercel) Open Preview
Vercel Marketing (Vercel) Open Preview
Vercel Admin (Vercel) Open Preview
Vercel Docs (Vercel) Open Preview

Preview updates automatically with new commits

@Kitenite Kitenite merged commit 7c8fa8b into main Dec 19, 2025
10 checks passed
Copy link
Copy Markdown
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

🧹 Nitpick comments (2)
apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx (2)

7-31: Extract the logo type definition for better maintainability.

The inline type assertion makes the code harder to maintain. Consider extracting the type to a separate definition at the file or module level.

🔎 Proposed refactor
+type ClientLogo = {
+	name: string;
+	logo: string;
+	height: number;
+	marginTop?: number;
+	borderRadius?: number;
+	text?: string;
+};
+
-const CLIENT_LOGOS = [
+const CLIENT_LOGOS: ClientLogo[] = [
 	{ name: "cadra", logo: "/logos/cadra.png", height: 38, text: "Cadra" },
 	{ name: "onlook", logo: "/logos/onlook.svg", height: 38 },
 	{ name: "ycombinator", logo: "/logos/yc.png", height: 44 },
 	{ name: "scribe", logo: "/logos/scribe.svg", height: 38 },
 	{ name: "adamcad", logo: "/logos/adam.svg", height: 32, marginTop: -5 },
 	{ name: "amazon", logo: "/logos/amazon.png", height: 32, marginTop: 20 },
 	{ name: "google", logo: "/logos/google.svg", height: 32, marginTop: 10 },
 	{ name: "servicenow", logo: "/logos/servicenow.svg", height: 24 },
 	{ name: "mastra", logo: "/logos/mastra.svg", height: 28, text: "Mastra" },
 	{
 		name: "trainloop",
 		logo: "/logos/trainloop.jpeg",
 		height: 38,
 		borderRadius: 10,
 		text: "Trainloop",
 	},
-] as {
-	name: string;
-	logo: string;
-	height: number;
-	marginTop?: number;
-	borderRadius?: number;
-	text?: string;
-}[];
+];

74-78: Remove unnecessary optional chaining.

The optional chaining operator on client?.borderRadius and client?.marginTop is unnecessary since client is guaranteed to exist within the map callback.

🔎 Proposed fix
 style={{
 	height: client.height,
-	borderRadius: client?.borderRadius ?? 0,
-	marginTop: client?.marginTop ?? 0,
+	borderRadius: client.borderRadius ?? 0,
+	marginTop: client.marginTop ?? 0,
 }}
📜 Review details

Configuration used: defaults

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ca75863 and 762a2bb.

⛔ Files ignored due to path filters (11)
  • apps/marketing/public/logos/adam.png is excluded by !**/*.png
  • apps/marketing/public/logos/adam.svg is excluded by !**/*.svg
  • apps/marketing/public/logos/amazon.png is excluded by !**/*.png
  • apps/marketing/public/logos/cadra.png is excluded by !**/*.png
  • apps/marketing/public/logos/google.svg is excluded by !**/*.svg
  • apps/marketing/public/logos/mastra.svg is excluded by !**/*.svg
  • apps/marketing/public/logos/onlook.svg is excluded by !**/*.svg
  • apps/marketing/public/logos/scribe.svg is excluded by !**/*.svg
  • apps/marketing/public/logos/servicenow.svg is excluded by !**/*.svg
  • apps/marketing/public/logos/trainloop.jpeg is excluded by !**/*.jpeg
  • apps/marketing/public/logos/yc.png is excluded by !**/*.png
📒 Files selected for processing (5)
  • apps/marketing/src/app/components/ClientLogosSection/ClientLogosSection.tsx (0 hunks)
  • apps/marketing/src/app/components/ClientLogosSection/constants.ts (0 hunks)
  • apps/marketing/src/app/components/ClientLogosSection/index.ts (0 hunks)
  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx (2 hunks)
  • package.json (1 hunks)
💤 Files with no reviewable changes (3)
  • apps/marketing/src/app/components/ClientLogosSection/index.ts
  • apps/marketing/src/app/components/ClientLogosSection/ClientLogosSection.tsx
  • apps/marketing/src/app/components/ClientLogosSection/constants.ts
🧰 Additional context used
📓 Path-based instructions (6)
**/*.{ts,tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Avoid using any type in TypeScript - maintain type safety unless absolutely necessary

Files:

  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (AGENTS.md)

Run Biome for formatting, linting, import organization, and safe fixes at the root level using bun run lint:fix

Files:

  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
**/{components,features}/**/[!.]*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

Organize project structure with one folder per component: ComponentName/ComponentName.tsx with index.ts barrel export

Files:

  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
**/{components,features}/**/*.{ts,tsx,test.ts,test.tsx,stories.tsx}

📄 CodeRabbit inference engine (AGENTS.md)

Co-locate component dependencies (utils, hooks, constants, config, tests, stories) next to the file using them

Files:

  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
**/*.{tsx,css}

📄 CodeRabbit inference engine (AGENTS.md)

Use React + TailwindCSS v4 + shadcn/ui for UI development

Files:

  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
**/{components,features}/**/*.tsx

📄 CodeRabbit inference engine (AGENTS.md)

**/{components,features}/**/*.tsx: Nest components in parent's components/ folder if used only once, promote to highest shared parent's components/ if used 2+ times
Use one component per file - do not combine multiple components in a single file

Files:

  • apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (6)
  • GitHub Check: Deploy Marketing
  • GitHub Check: Deploy Admin
  • GitHub Check: Deploy Docs
  • GitHub Check: Deploy API
  • GitHub Check: Deploy Web
  • GitHub Check: Build
🔇 Additional comments (4)
package.json (1)

18-22: LGTM! Improved developer experience.

The expanded dev script now runs API, web, and desktop together, streamlining the development workflow. The new dev:marketing script enables isolated marketing app development, which is helpful for focused work on that package.

apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx (3)

33-54: LGTM! Well-structured component layout.

The motion wrapper and section structure follow good practices with appropriate animation timing and viewport detection.


71-72: Verify aspect ratios with fixed width.

Setting a fixed width={160} while heights vary (24-44px) may cause aspect ratio distortion if the original logos don't match these dimensions. Next.js Image will maintain aspect ratio with object-contain, but verify visually that logos aren't stretched or compressed.

Consider using only the height prop and letting Next.js calculate the width automatically to preserve natural aspect ratios:

 <Image
 	src={client.logo}
 	alt={client.name}
-	width={160}
-	height={client.height}
+	height={client.height}
+	width={0}
 	className="object-contain w-auto"
 	style={{
 		height: client.height,
 		borderRadius: client.borderRadius ?? 0,
 		marginTop: client.marginTop ?? 0,
 	}}
 />

Or remove both width and height from props and control via CSS only if the images are static assets that Next.js can analyze at build time.


4-5: All dependencies and logo assets are present. The react-fast-marquee package (v^1.6.5) is installed, and all 10 logo files are present in the public/logos directory.

key={setId}
className="flex gap-12 sm:gap-16 md:gap-24 items-center"
key={client.name}
className="flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity cursor-pointer whitespace-nowrap h-14 gap-2"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Remove misleading cursor-pointer class.

The cursor-pointer class suggests interactivity, but there's no click handler attached to these logo elements. This creates a misleading user experience.

🔎 Proposed fix
 <div
 	key={client.name}
-	className="flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity cursor-pointer whitespace-nowrap h-14 gap-2"
+	className="flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity whitespace-nowrap h-14 gap-2"
 >
📝 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
className="flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity cursor-pointer whitespace-nowrap h-14 gap-2"
<div
key={client.name}
className="flex items-center justify-center opacity-60 hover:opacity-100 transition-opacity whitespace-nowrap h-14 gap-2"
>
🤖 Prompt for AI Agents
In apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
around line 66, the element includes the CSS class "cursor-pointer" which
falsely indicates interactive behavior; remove "cursor-pointer" from the
className string (or if these logos should be interactive, add an appropriate
click handler and keyboard accessibility attributes instead). Update the
className to drop only "cursor-pointer" and run a quick visual/accessibility
check to confirm cursor and focus behavior are now correct.

Comment on lines +68 to +73
<Image
src={client.logo}
alt={client.name}
width={160}
height={client.height}
className="object-contain w-auto"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Improve alt text for better accessibility.

The alt text currently uses lowercase identifiers (e.g., "cadra", "onlook") which are not descriptive for screen readers. Consider using more descriptive text like "Cadra logo" or storing a proper display name in the CLIENT_LOGOS array.

🔎 Proposed fix

Option 1: Add displayName to CLIENT_LOGOS and use it for alt text:

 const CLIENT_LOGOS: ClientLogo[] = [
-	{ name: "cadra", logo: "/logos/cadra.png", height: 38, text: "Cadra" },
+	{ name: "cadra", displayName: "Cadra", logo: "/logos/cadra.png", height: 38, text: "Cadra" },
 	// ... update other entries
 ];

 <Image
 	src={client.logo}
-	alt={client.name}
+	alt={`${client.displayName} logo`}
 	width={160}
 	height={client.height}
 	className="object-contain w-auto"
 	style={{
 		height: client.height,
 		borderRadius: client.borderRadius ?? 0,
 		marginTop: client.marginTop ?? 0,
 	}}
 />

Option 2: Use text field if available, fallback to formatted name:

 <Image
 	src={client.logo}
-	alt={client.name}
+	alt={`${client.text || client.name.charAt(0).toUpperCase() + client.name.slice(1)} logo`}
 	width={160}
 	height={client.height}
 	className="object-contain w-auto"
 	style={{
 		height: client.height,
 		borderRadius: client.borderRadius ?? 0,
 		marginTop: client.marginTop ?? 0,
 	}}
 />
📝 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
<Image
src={client.logo}
alt={client.name}
width={160}
height={client.height}
className="object-contain w-auto"
<Image
src={client.logo}
alt={`${client.text || client.name.charAt(0).toUpperCase() + client.name.slice(1)} logo`}
width={160}
height={client.height}
className="object-contain w-auto"
🤖 Prompt for AI Agents
In apps/marketing/src/app/components/TrustedBySection/TrustedBySection.tsx
around lines 68 to 73, the Image alt prop uses raw lowercase identifiers
(client.name) which are not descriptive for screen readers; update alt text to a
human-friendly label by using a displayName property on each CLIENT_LOGOS entry
(e.g., "Cadra logo") or, if no displayName exists, derive a fallback like
`${client.name} logo` with proper capitalization; change the data source or
construct the formatted string at render time and ensure all CLIENT_LOGOS
entries include the displayName to keep alt text consistent and accessible.

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