Skip to content

Conversation

devin-ai-integration[bot]
Copy link
Contributor

@devin-ai-integration devin-ai-integration bot commented Aug 24, 2025

Description

This PR implements a configurable component system to eliminate content bleeding between feature pages. Previously, changes intended for one feature page (like /features/ai) would affect other pages because they shared hardcoded components.

Key Changes:

  • Refactored 4 shared components to accept content props with fallbacks to preserve existing functionality
  • Created content management system with TypeScript interfaces for page-specific content
  • Added 4 new feature pages: /features/ai, /features/builder, /features/prototype, /features/design-system
  • Extracted content from 5 PRs into dedicated content files

Implementation Strategy:

  • Components now accept optional props (e.g., HeroContent, BenefitItem[])
  • Fallback to original hardcoded content when no props provided
  • Page-specific content objects imported and passed to components
  • Original /features page remains unchanged

Related Issues

Addresses content bleeding issue where changes from these PRs affected unintended pages:

Type of Change

  • Bug fix
  • New feature
  • Refactor

Testing

⚠️ Limited Testing: Could not test locally due to missing environment variables (CSB_API_KEY, SUPABASE_DATABASE_URL, etc.). The implementation needs browser testing to verify:

Critical Test Cases:

  1. Original functionality preserved: /features page loads with original content
  2. No content bleeding: Each new page shows only its intended content
  3. All pages functional: /features/ai, /features/builder, /features/prototype, /features/design-system load correctly
  4. TypeScript compilation: All interfaces work correctly with components
  5. Responsive design: All pages work on mobile/desktop

Recommended Testing Steps:

bun run dev
# Test each page:
# - http://localhost:3000/features (original)
# - http://localhost:3000/features/ai
# - http://localhost:3000/features/builder  
# - http://localhost:3000/features/prototype
# - http://localhost:3000/features/design-system

Human Review Checklist

High Priority:

  • Verify content files match original PR requirements
  • Test all 5 pages load without errors
  • Confirm no content bleeding between pages
  • Validate original /features page unchanged
  • Check TypeScript compilation passes

Medium Priority:

  • Review component prop interfaces for correctness
  • Verify fallback logic works as expected
  • Check metadata and routing for new pages
  • Validate responsive design on all pages

Additional Notes

Content Sources:

Architecture:

  • Backward compatible - existing code unchanged
  • Scalable - easy to add new feature pages
  • Maintainable - centralized content management

Link to Devin run: https://app.devin.ai/sessions/098e28935512421cbda5ef3406b94679
Requested by: @itsNintu


Important

Introduces configurable components to prevent content bleeding across feature pages and adds new feature pages with dedicated content files.

  • Behavior:
    • Refactored shared components in features-hero.tsx, benefits-section.tsx, and features-grid-section.tsx to accept content props with fallbacks.
    • Added new feature pages: /features/ai, /features/builder, /features/prototype, /features/design-system.
    • Extracted content from previous PRs into dedicated content files in src/content/.
  • Implementation:
    • Components use optional props for content, defaulting to original hardcoded content if not provided.
    • Page-specific content objects are imported and passed to components.
  • Testing:
    • Limited testing due to missing environment variables; browser testing recommended to verify functionality and responsiveness.

This description was created by Ellipsis for edaae97. You can customize this summary. It will automatically update as commits are pushed.

- Refactor shared components (FeaturesHero, BenefitsSection, FeaturesGridSection, FeaturesIntroSection) to accept content props with fallbacks
- Create content management system with TypeScript interfaces for page-specific content
- Add new feature pages: /features/ai, /features/builder, /features/prototype, /features/design-system
- Extract content from PRs #2742, #2743, #2744, #2746, #2747 into dedicated content files
- Preserve original /features page functionality unchanged
- Eliminate content bleeding between feature pages while maintaining design consistency

Fixes content bleeding issue where changes intended for one feature page affected others due to shared hardcoded components.

Co-Authored-By: [email protected] <[email protected]>
Copy link
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

Copy link

supabase bot commented Aug 24, 2025

This pull request has been ignored for the connected project wowaemfasoptxrdjhilu because there are no changes detected in apps/backend/supabase directory. You can change this behaviour in Project Integrations Settings ↗︎.


Preview Branches by Supabase.
Learn more about Supabase Branching ↗︎.

Copy link

vercel bot commented Aug 24, 2025

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

Project Deployment Preview Comments Updated (UTC)
web Error Error Aug 24, 2025 5:05pm
1 Skipped Deployment
Project Deployment Preview Comments Updated (UTC)
docs Skipped Skipped Aug 24, 2025 5:05pm

Copy link

coderabbitai bot commented Aug 24, 2025

Important

Review skipped

Bot user detected.

To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch devin/1756054396-fix-feature-pages-content-bleeding

🪧 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 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.

@@ -158,17 +158,17 @@ var Mr = hl((k5, Lf) => {
m = !0;
if (typeof l != 'function') throw new TypeError(jc);
if (((i = Gf(i) || 0), Wc(t)))
(h = !!t.leading),
((h = !!t.leading),
Copy link
Contributor

Choose a reason for hiding this comment

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

The diff introduces a pattern where multiple expressions are combined using the comma operator inside extra parentheses (e.g. "return ((r = n = void 0), b);"). Although this is functionally equivalent, it considerably reduces readability and maintainability. Consider splitting such expressions into separate statements.

{
subtitle: "Version History",
title: "Auto save, history and version control",
description: "Roll-back anytime! Onlook automatically saves project snapshots so you can experiment with confidence."
Copy link
Contributor

Choose a reason for hiding this comment

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

Typo: Consider changing "Roll-back" to "Rollback" in the description for Version History.

@@ -2827,7 +2832,7 @@ function G0(l) {
(g.parseRulePrelude = 'parseRulePrelude' in h ? Boolean(h.parseRulePrelude) : !0),
(g.parseValue = 'parseValue' in h ? Boolean(h.parseValue) : !0),
(g.parseCustomProperty =
'parseCustomProperty' in h ? Boolean(h.parseCustomProperty) : !1);
'parseCustomProperty' in h ? Boolean(h.parseCustomProperty) : !1));
Copy link
Contributor

Choose a reason for hiding this comment

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

There is an extra closing parenthesis at the end of the assignment to g.parseCustomProperty on this line. Please remove the additional ')' so that the parenthesis correctly matches the opening parenthesis from the start of the expression.

@@ -2937,7 +2942,7 @@ jl.prototype.applySourceMap = function l(i, t, r) {
if (o != null) n = bl.relative(o, n);
var b = new er(),
g = new er();
this._mappings.unsortedForEach(function (e) {
(this._mappings.unsortedForEach(function (e) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Typographical issue: There's an extra opening parenthesis before this._mappings.unsortedForEach. This appears to be unintended and should be removed for correct syntax.

@@ -9604,7 +9618,7 @@ function ih(l) {
let i = document.createElement('div'),
t = window.getComputedStyle(l),
r = l.className;
(i.id = 'onlook-drag-stub'),
((i.id = 'onlook-drag-stub'),
Copy link
Contributor

Choose a reason for hiding this comment

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

There's an extra opening parenthesis in the assignment segment. The line starts with ((i.id = 'onlook-drag-stub'), which seems unintended and results in unbalanced parentheses. Consider removing the extra '(' for clarity.

@@ -10961,7 +10976,7 @@ class Gl extends E {
exact: !1,
message: n.message,
}),
t.dirty();
t.dirty());
Copy link
Contributor

Choose a reason for hiding this comment

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

There appears to be an extra closing parenthesis. The code currently reads t.dirty()); but likely it should be t.dirty();. Please verify and correct the extra parenthesis.

@@ -11494,37 +11509,37 @@ class pi extends E {
for (let n of this._def.checks)
if (n.kind === 'min') {
if (n.inclusive ? l.data < n.value : l.data <= n.value)
(t = this._getOrReturnCtx(l, t)),
((t = this._getOrReturnCtx(l, t)),
Copy link
Contributor

Choose a reason for hiding this comment

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

There appears to be an extra opening parenthesis in this expression. The assignment part now begins with "((t = this._getOrReturnCtx(l, t))," which likely should only have a single opening parenthesis. Please adjust to ensure proper grouping.

} else if (n.kind === 'max') {
if (n.inclusive ? l.data > n.value : l.data >= n.value)
(t = this._getOrReturnCtx(l, t)),
((t = this._getOrReturnCtx(l, t)),
Copy link
Contributor

Choose a reason for hiding this comment

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

Typographical issue: The expression ((t = this._getOrReturnCtx(l, t)) starts with redundant opening parentheses. Consider removing the extra parenthesis to match the intended syntax.

@@ -12889,7 +12913,7 @@ function sh(l, i = {}, t) {
var K4 = { object: tl.lazycreate },
W;
(function (l) {
(l.ZodString = 'ZodString'),
((l.ZodString = 'ZodString'),
Copy link
Contributor

Choose a reason for hiding this comment

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

Typographical error: There appears to be an extra opening parenthesis on this line. The expression starts with ((l.ZodString = 'ZodString') which likely should be (l.ZodString = 'ZodString') to maintain proper parenthesis balance.

@@ -12924,7 +12948,7 @@ var K4 = { object: tl.lazycreate },
(l.ZodPromise = 'ZodPromise'),
(l.ZodBranded = 'ZodBranded'),
(l.ZodPipeline = 'ZodPipeline'),
(l.ZodReadonly = 'ZodReadonly');
(l.ZodReadonly = 'ZodReadonly'));
Copy link
Contributor

Choose a reason for hiding this comment

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

Typographical error: There appears to be an extra closing parenthesis in the assignment to ZodReadonly. It currently reads (l.ZodReadonly = 'ZodReadonly')); but likely should be (l.ZodReadonly = 'ZodReadonly');.

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.

0 participants