Skip to content

feat: revamp pricing page + add 4-year Pro plan#414

Merged
apsinghdev merged 14 commits into
apsinghdev:mainfrom
MistakenPirate:feat/revamp-pricing-page
Jun 26, 2026
Merged

feat: revamp pricing page + add 4-year Pro plan#414
apsinghdev merged 14 commits into
apsinghdev:mainfrom
MistakenPirate:feat/revamp-pricing-page

Conversation

@MistakenPirate

@MistakenPirate MistakenPirate commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Summary by CodeRabbit

  • New Features

    • Pricing page now presents a tier-based comparison (free plus paid tiers) with clear plan selection actions.
    • Plans now support configurable multi-month durations, seeded for both standard and longer-duration test plans.
  • Bug Fixes

    • Subscription end dates are now calculated from the selected plan’s month duration, including correct handling for month-end start dates.
    • Feature image mockups/previews better recover when a new image is selected or when loading fails.
  • Chores

    • Updated database schema and seed scripts to include the new plan duration field and align seeded plan setup.

@vercel

vercel Bot commented Jun 21, 2026

Copy link
Copy Markdown

@MistakenPirate is attempting to deploy a commit to the AJEET PRATAP SINGH's projects Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds durationMonths to Plan, updates plan seeds and subscription end-date logic to use plan duration, rewrites the pricing page around tier comparison UI, and adjusts explore-features image handling and dashboard navigation.

Changes

Plan Duration, Pricing, and Explore Features

Layer / File(s) Summary
Plan duration schema and seeds
apps/api/prisma/schema.prisma, apps/api/prisma/migrations/20260621140000_add_plan_duration_months/migration.sql, apps/api/prisma/seed.ts, apps/api/scripts/seed-pro-modules.ts
Plan gains durationMonths, the migration adds the column with a default of 12, and seed scripts write yearly test plans plus the Pro dev seed with explicit duration values.
Subscription end-date calculation
apps/api/src/services/payment.service.ts
resolvePlanDurationMonths resolves plan length from durationMonths or interval, and createSubscription computes endDate by month offset with month-end clamping.
Pricing tier data model
apps/web/src/app/(main)/(landing)/pricing/page.tsx
The pricing page adds tier and comparison data types, builds the tiers array for free, pro1, and pro4, and reads paid plan ids from environment variables.
Pricing page layout and comparison
apps/web/src/app/(main)/(landing)/pricing/page.tsx
The page replaces the previous landing content with a new hero, comparison section, features, testimonials, and contact/footer layout, and introduces the comparison table rendering with tier headers, feature cells, and PaymentFlow or dashboard navigation per tier.
Feature image fallback handling
apps/web/src/components/features/explore-features-browser-mockup.tsx, apps/web/src/components/features/explore-features-image-preview.tsx
The browser mockup and image preview reset image error state when imageSrc changes; the browser mockup switches to surface-token styling, and the image preview removes priority and sets unoptimized.
Dashboard CTA routing
apps/web/src/components/features/explore-features-dashboard.tsx
The Invest Now button uses useRouter and router.push("/pricing") instead of a Next.js Link.

Sequence Diagram(s)

sequenceDiagram
  participant PricingPage
  participant PricingComparison
  participant PlanColumnHeader
  participant PaymentFlow
  participant Router
  PricingPage->>PricingComparison: render tiers and comparison rows
  PricingComparison->>PlanColumnHeader: render each tier column
  PlanColumnHeader->>Router: route free tier to /dashboard/home
  PlanColumnHeader->>PaymentFlow: mount paid tier checkout when planId is available
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

Poem

I hop through plans with monthy cheer,
And pricing tiers now line up clear.
My carrot pouch goes click and glow,
While fallback images come and go. 🐇

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: a pricing page redesign and addition of a 4-year Pro plan.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@MistakenPirate

Copy link
Copy Markdown
Contributor Author

#409 mentioning this

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 3

🧹 Nitpick comments (3)
apps/web/src/app/(main)/(landing)/pricing/page.tsx (1)

375-381: ⚡ Quick win

Replace invisible spacer with proper CSS spacing.

The transparent paragraph <p className="text-sm text-transparent select-none">.</p> is a layout hack that maintains vertical alignment. This breaks semantic HTML and may be announced by screen readers.

♻️ Use min-height instead
-{isPaid && publicPlan ? (
-  <p className="text-sm text-text-tertiary">
-    {formatApproxPlanPrice(publicPlan.price, publicPlan.currency)}
-  </p>
-) : (
-  <p className="text-sm text-transparent select-none">.</p>
-)}
+<p className="text-sm min-h-[1.25rem] text-text-tertiary">
+  {isPaid && publicPlan
+    ? formatApproxPlanPrice(publicPlan.price, publicPlan.currency)
+    : null}
+</p>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx around lines 375 - 381,
The else branch containing the paragraph with text-transparent and select-none
classes is a layout hack that serves as an invisible spacer to maintain vertical
alignment. Remove this paragraph element entirely and instead add proper CSS
spacing using min-height on the parent container or wrapper element that holds
both the paid plan price display and the empty state. This will maintain the
vertical alignment without relying on semantic HTML violations that can confuse
screen readers.
apps/api/prisma/seed.ts (1)

79-99: ⚡ Quick win

Seed subscription bypasses plan.durationMonths.

The subscription end-date is hardcoded to Date.now() + MILLIS_PER_YEAR, which ignores the plan's durationMonths field. While this happens to match the test plan (12 months), it creates a discrepancy with the payment service logic (which respects durationMonths) and would break if a different plan is used.

♻️ Align seed logic with payment service
+// helper to match payment service logic
+function computeSubscriptionEndDate(plan: { durationMonths: number }, startDate: Date): Date {
+  const endDate = new Date(startDate);
+  endDate.setMonth(endDate.getMonth() + plan.durationMonths);
+  return endDate;
+}
+
 const premiumSubscription = existingSubscription
   ? await prisma.subscription.update({
       where: { id: existingSubscription.id },
       data: {
         planId: testPlan.id,
         status: 'active',
         startDate: new Date(),
-        endDate: new Date(Date.now() + MILLIS_PER_YEAR), // 1 year from now
+        endDate: computeSubscriptionEndDate(testPlan, new Date()),
         autoRenew: true,
       },
     })
   : await prisma.subscription.create({
       data: {
         userId: premiumUser.id,
         planId: testPlan.id,
         status: 'active',
         startDate: new Date(),
-        endDate: new Date(Date.now() + MILLIS_PER_YEAR), // 1 year from now
+        endDate: computeSubscriptionEndDate(testPlan, new Date()),
         autoRenew: true,
       },
     });

Note: If you adopt the date-fns fix from the payment service review, use that same approach here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/api/prisma/seed.ts` around lines 79 - 99, The endDate calculation in
both the prisma.subscription.update and prisma.subscription.create calls is
hardcoded to MILLIS_PER_YEAR, which ignores the testPlan.durationMonths field
and creates a discrepancy with payment service logic. Replace the hardcoded
Date.now() + MILLIS_PER_YEAR calculation with a dynamic calculation based on
testPlan.durationMonths, converting the plan's duration in months to
milliseconds and adding it to the current date. This ensures the seed data
respects the plan's configured duration and remains consistent with the payment
service behavior.
apps/api/scripts/seed-pro-modules.ts (1)

114-118: ⚡ Quick win

Dev seed subscription bypasses plan.durationMonths.

Similar to the main seed, this subscription creation hardcodes a 1-year duration (setFullYear(+1)) instead of reading plan.durationMonths. While it matches the current plan, it creates a discrepancy with the payment service and reduces seed fidelity.

♻️ Use plan's durationMonths
 if (!activeSub) {
+  const startDate = new Date();
   const endDate = new Date();
-  endDate.setFullYear(endDate.getFullYear() + 1);
+  endDate.setMonth(endDate.getMonth() + plan.durationMonths);
   await prisma.subscription.create({
-    data: { userId: user.id, planId: plan.id, status: "active", endDate },
+    data: { userId: user.id, planId: plan.id, status: "active", startDate, endDate },
   });

Note: If you adopt the date-fns fix from the payment service review, use that same approach here.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/api/scripts/seed-pro-modules.ts` around lines 114 - 118, The
subscription creation in the prisma.subscription.create call is hardcoding a
1-year duration by using setFullYear(endDate.getFullYear() + 1) instead of
respecting the plan's durationMonths property. Replace the hardcoded 1-year
calculation with logic that calculates the endDate by adding plan.durationMonths
to the current date. If date-fns is available and used elsewhere in the
codebase, use the same date manipulation approach for consistency.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/api/src/services/payment.service.ts`:
- Around line 311-318: The endDate calculation uses setMonth() which causes date
overflow when subscriptions start on month-end days (e.g., Jan 31 + 1 month
becomes Mar 2 instead of Feb 28/29). Replace the
endDate.setMonth(endDate.getMonth() + durationMonths) logic with proper date
arithmetic that accounts for year wraparound and clamps the day to the last
valid day of the target month. Specifically, calculate the target year and month
by dividing the total months by 12 to handle year overflow, normalize the month
value using modulo arithmetic, set the full year/month/day on endDate, then
check if the resulting month differs from the expected month and call setDate(0)
to clamp to the last day of the previous month if needed.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx:
- Around line 308-428: Replace all hardcoded hex color values in the PlanCard
component with Tailwind design tokens. Specifically, update the gradient colors
in the badge element (from-[`#7150E7`] to-[`#432ba0`]), the shineColor array prop
passed to the ShineBorder component (which contains `#7150E7`, `#C89BFF`, `#432BA0`),
and the shadow value in the main div's className (rgba(113,80,231,0.55)).
Consult your design token system or Tailwind configuration to identify the
correct semantic color classes or CSS custom properties that correspond to these
purple and violet tones, then replace each hardcoded value with its appropriate
token equivalent.
- Around line 147-298: Replace all hardcoded hex color values in the pricing
page component with Tailwind design tokens. Specifically: replace all instances
of `#252525` border colors with the `border-border` or `border-border-DEFAULT`
token; for the purple gradient colors (`#a472ea` and `#432ba0` used in the h1
element's span, and the Link components), and the glow color (`#7150E7`), first
verify if these are intentional brand colors and add them to design-tokens.ts if
needed, otherwise replace them with the existing official brand purple tokens;
ensure no hardcoded hex values remain in className attributes and instead use
semantic Tailwind color classes throughout the entire component structure.

---

Nitpick comments:
In `@apps/api/prisma/seed.ts`:
- Around line 79-99: The endDate calculation in both the
prisma.subscription.update and prisma.subscription.create calls is hardcoded to
MILLIS_PER_YEAR, which ignores the testPlan.durationMonths field and creates a
discrepancy with payment service logic. Replace the hardcoded Date.now() +
MILLIS_PER_YEAR calculation with a dynamic calculation based on
testPlan.durationMonths, converting the plan's duration in months to
milliseconds and adding it to the current date. This ensures the seed data
respects the plan's configured duration and remains consistent with the payment
service behavior.

In `@apps/api/scripts/seed-pro-modules.ts`:
- Around line 114-118: The subscription creation in the
prisma.subscription.create call is hardcoding a 1-year duration by using
setFullYear(endDate.getFullYear() + 1) instead of respecting the plan's
durationMonths property. Replace the hardcoded 1-year calculation with logic
that calculates the endDate by adding plan.durationMonths to the current date.
If date-fns is available and used elsewhere in the codebase, use the same date
manipulation approach for consistency.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx:
- Around line 375-381: The else branch containing the paragraph with
text-transparent and select-none classes is a layout hack that serves as an
invisible spacer to maintain vertical alignment. Remove this paragraph element
entirely and instead add proper CSS spacing using min-height on the parent
container or wrapper element that holds both the paid plan price display and the
empty state. This will maintain the vertical alignment without relying on
semantic HTML violations that can confuse screen readers.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 016084e6-28c3-4e73-a9e9-04fa9ebdf71c

📥 Commits

Reviewing files that changed from the base of the PR and between 54a802b and f49b637.

⛔ Files ignored due to path filters (1)
  • apps/web/public/assets/jackedaj.jpg is excluded by !**/*.jpg
📒 Files selected for processing (6)
  • apps/api/prisma/migrations/20260621140000_add_plan_duration_months/migration.sql
  • apps/api/prisma/schema.prisma
  • apps/api/prisma/seed.ts
  • apps/api/scripts/seed-pro-modules.ts
  • apps/api/src/services/payment.service.ts
  • apps/web/src/app/(main)/(landing)/pricing/page.tsx

Comment thread apps/api/src/services/payment.service.ts Outdated
Comment thread apps/web/src/app/(main)/(landing)/pricing/page.tsx
Comment thread apps/web/src/app/(main)/(landing)/pricing/page.tsx Outdated
@apsinghdev

Copy link
Copy Markdown
Owner

@MistakenPirate nice work!

some feedbacks:

pricing cards should be like this

Screenshot 2026-06-22 at 2 33 18 PM

also the 99 card should have all the features of 49 mentioned and those two extra (49 one should have red cross sign before those two) and same for the free card.

  1. These edges should blend a bit
Screenshot 2026-06-22 at 2 39 22 PM

as it's more of the ui work @Aryan-205 you can take over from here

@Aryan-205

Copy link
Copy Markdown
Contributor
  • About the first section, I personally think a better approach instead of the pre-mentioned would be to have more content like how we have in the current section as its not a home page and more like a why you should buy our service, So I think we could keep the big text centered and add the latest added features component with something like why this added on why you should buy but if you still want me to try with your approach I would continue
Screenshot 2026-06-22 at 4 39 35 PM
  • So there are 3 ways of handling the pricing cards cuz the problem as for now is the listing for pro is too long and very small for the rest two as we just say everything from the last is included so here are the approaches
  1. simple approach
image 2.This approach makes more sense when we wanna show comparability of a lot of features image 3. In this the cards are of the same height but the content are overflow-hidden with a blur that tell the user to scroll
Screen.Recording.2026-06-22.at.4.42.05.PM.mov
  • Do you want me to create like a fake discount as it's also a common practise in these things, like we would mention the 49 pro version as 60, cut a line over it and then mention the original price
  • I have named the 4 year pro as pro plus, you can tell me if you want it to be called something else

Please give your feedback on which method you prefer and if you want me to explore the designing more

@apsinghdev

Copy link
Copy Markdown
Owner
  • About the first section, I personally think a better approach instead of the pre-mentioned would be to have more content like how we have in the current section as its not a home page and more like a why you should buy our service, So I think we could keep the big text centered and add the latest added features component with something like why this added on why you should buy but if you still want me to try with your approach I would continue
Screenshot 2026-06-22 at 4 39 35 PM * So there are 3 ways of handling the pricing cards cuz the problem as for now is the listing for pro is too long and very small for the rest two as we just say everything from the last is included so here are the approaches
  1. simple approach

image 2.This approach makes more sense when we wanna show comparability of a lot of features image 3. In this the cards are of the same height but the content are overflow-hidden with a blur that tell the user to scroll
Screen.Recording.2026-06-22.at.4.42.05.PM.mov

  • Do you want me to create like a fake discount as it's also a common practise in these things, like we would mention the 49 pro version as 60, cut a line over it and then mention the original price
  • I have named the 4 year pro as pro plus, you can tell me if you want it to be called something else

Please give your feedback on which method you prefer and if you want me to explore the designing more

  • for the first section, i think sam has already changed it and currently it's minimum and simple. so we can keep that.
  • for the pricing cards, second one looks a really great idea.
  • yes we wanna create discounts and tbh they're not fake. the estimated prices are ($89 and $149) so you can use these to show discounts
  • damn. i was going to ask you to name it pro+

@MistakenPirate

Copy link
Copy Markdown
Contributor Author

damn @Aryan-205 i was banging my head thinking how to fit such a long copy in the plan layout. lol just had to add a scroll. funny how you miss the simple stuff so easily. I've got much to learn about design

@Aryan-205

Copy link
Copy Markdown
Contributor
  • About the first section, I personally think a better approach instead of the pre-mentioned would be to have more content like how we have in the current section as its not a home page and more like a why you should buy our service, So I think we could keep the big text centered and add the latest added features component with something like why this added on why you should buy but if you still want me to try with your approach I would continue
Screenshot 2026-06-22 at 4 39 35 PM * So there are 3 ways of handling the pricing cards cuz the problem as for now is the listing for pro is too long and very small for the rest two as we just say everything from the last is included so here are the approaches
  1. simple approach

image 2.This approach makes more sense when we wanna show comparability of a lot of features image 3. In this the cards are of the same height but the content are overflow-hidden with a blur that tell the user to scroll
Screen.Recording.2026-06-22.at.4.42.05.PM.mov

  • Do you want me to create like a fake discount as it's also a common practise in these things, like we would mention the 49 pro version as 60, cut a line over it and then mention the original price
  • I have named the 4 year pro as pro plus, you can tell me if you want it to be called something else

Please give your feedback on which method you prefer and if you want me to explore the designing more

  • for the first section, i think sam has already changed it and currently it's minimum and simple. so we can keep that.
  • for the pricing cards, second one looks a really great idea.
  • yes we wanna create discounts and tbh they're not fake. the estimated prices are ($89 and $149) so you can use these to show discounts
  • damn. i was going to ask you to name it pro+

just to be clearify once, "for the pricing cards, second one looks a really great idea." you meant the second approach right, the one with pricing table right

@apsinghdev

Copy link
Copy Markdown
Owner

@Aryan-205 yes the one with table with opensox theme and colors

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/components/features/explore-features-browser-mockup.tsx`:
- Around line 27-79: The BrowserMockup component is using hardcoded hex colors
instead of design tokens, which breaks the shared styling contract. Update the
color classes in explore-features-browser-mockup.tsx to use tailwind
semantic/design-token classes for the browser chrome, window buttons, address
bar, body background, borders, and overlay accents. Keep the existing structure
in the component and replace the direct hex values near FeatureIcon, the browser
header/body wrappers, and the fallback illustration elements with token-based
classes only.
- Around line 21-23: The fallback state in explore-features-browser-mockup is
getting stuck because imageError is never cleared when imageSrc changes. Update
the component’s useState/useEffect logic in the explore-features-browser-mockup
component so that whenever imageSrc changes, imageError is reset to false before
rendering or loading the next image. Use the existing imageError, showFallback,
and setImageError symbols to locate and adjust the behavior.

In `@apps/web/src/components/features/explore-features-dashboard.tsx`:
- Around line 172-177: The pricing CTA in explore-features-dashboard is nesting
PrimaryButton (a real button from custom-button) inside Link, which creates
invalid interactive markup; update the CTA to use router-based navigation in the
client component instead of wrapping the button with Link. Locate the
explore-features-dashboard component and replace the nested Link/PrimaryButton
pattern with a click handler that uses the Next.js router push for "/pricing",
keeping PrimaryButton as the only interactive element.

In `@apps/web/src/components/features/explore-features-image-preview.tsx`:
- Around line 37-45: The preview image is being marked with unconditional
priority inside the rotating explore-feature image component, which can
over-prioritize non-critical assets; update the Image usage in
explore-features-image-preview’s image-rendering path to remove the always-on
priority flag and only enable it for truly critical/LCP cases if needed. Keep
the existing Image props and error handling intact, but make priority
conditional or omit it for the auto-advancing preview state.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 36444529-ef6b-4056-95b8-03760ea4bf7b

📥 Commits

Reviewing files that changed from the base of the PR and between b72a7e1 and fa08d62.

⛔ Files ignored due to path filters (13)
  • apps/web/public/assets/features/10updates-n-opportunities.png is excluded by !**/*.png
  • apps/web/public/assets/features/11prorefs.png is excluded by !**/*.png
  • apps/web/public/assets/features/1onboardingcall.png is excluded by !**/*.png
  • apps/web/public/assets/features/2community.png is excluded by !**/*.png
  • apps/web/public/assets/features/3weeklysessions.png is excluded by !**/*.png
  • apps/web/public/assets/features/4unlimitedqna.png is excluded by !**/*.png
  • apps/web/public/assets/features/5promodules.png is excluded by !**/*.png
  • apps/web/public/assets/features/6weeklycontests.png is excluded by !**/*.png
  • apps/web/public/assets/features/7hand-pickedossprojects.png is excluded by !**/*.png
  • apps/web/public/assets/features/8prorecordings.png is excluded by !**/*.png
  • apps/web/public/assets/features/9pvtthreads.png is excluded by !**/*.png
  • apps/web/public/assets/features/pro-preview.svg is excluded by !**/*.svg
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (6)
  • apps/web/src/app/(main)/(landing)/pricing/page.tsx
  • apps/web/src/components/features/explore-features-browser-mockup.tsx
  • apps/web/src/components/features/explore-features-dashboard.tsx
  • apps/web/src/components/features/explore-features-data.ts
  • apps/web/src/components/features/explore-features-image-preview.tsx
  • apps/web/src/components/features/features.tsx
✅ Files skipped from review due to trivial changes (1)
  • apps/web/src/components/features/features.tsx
🚧 Files skipped from review as they are similar to previous changes (1)
  • apps/web/src/app/(main)/(landing)/pricing/page.tsx

Comment thread apps/web/src/components/features/explore-features-browser-mockup.tsx Outdated
Comment thread apps/web/src/components/features/explore-features-dashboard.tsx Outdated
Comment thread apps/web/src/components/features/explore-features-image-preview.tsx

@coderabbitai coderabbitai Bot left a comment

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.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
apps/web/src/app/(main)/(landing)/pricing/page.tsx (2)

3-13: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

remove the unused pricing imports.

trpc and formatApproxPlanPrice are no longer referenced after the pricing query was removed, so these imports should be deleted.

proposed cleanup
-import { trpc } from "`@/lib/trpc`";
-import { formatApproxPlanPrice } from "`@/lib/format-plan-price`";

As per coding guidelines, “Remove unused imports”.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx around lines 3 - 13,
Remove the unused pricing imports from the pricing page module. In the
`page.tsx` import block, delete the references to `trpc` and
`formatApproxPlanPrice` since they are no longer used after the pricing query
removal; keep the remaining imports in place and ensure no other identifiers in
`PricingPage` or related hooks/components are affected.

Source: Coding guidelines


132-137: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

update the stale pricing source-of-truth comment.

The page no longer calls getPublicPlan or renders the ≈ ₹… line, so this comment now describes behavior that is not present. Either remove it or replace it with the current contract: display labels are local, while checkout charges by planId.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx around lines 132 - 137,
The pricing page comment is stale because it still references getPublicPlan and
the “≈ ₹…” line, which are no longer part of this flow. Update or remove the
note in pricing/page.tsx near the pricing card content so it matches the current
contract: the displayed price labels are local copy, and the actual checkout
amount is determined by planId during checkout.

Source: Coding guidelines

🧹 Nitpick comments (1)
apps/web/src/app/(main)/(landing)/pricing/page.tsx (1)

196-200: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

move the mask and blur styling into tailwind utilities.

This inline style block violates the app-level rule to style html elements with Tailwind classes instead of inline CSS.

As per coding guidelines, “Always use Tailwind classes for styling HTML elements; avoid using CSS or style tags”.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx around lines 196 - 200,
Move the inline mask and blur styling in the pricing page component into
Tailwind utility classes instead of the current style object. Update the
relevant JSX in the landing pricing page so the element using the mask/blur
effect is styled through Tailwind classes only, preserving the same visual
effect while removing the inline CSS from the component.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx:
- Around line 346-352: The unavailable-feature icon in the pricing page still
uses the muted text color, but it should use the project’s semantic
danger/destructive token instead. Update the `X` icon styling in the pricing UI
rendering logic so excluded features render with the requested red cross
indicator, keeping the existing `value === false` branch and replacing the
current muted gray Tailwind class with the appropriate destructive color token.
- Around line 480-523: The pricing comparison is currently built from generic
divs, so assistive technologies cannot reliably map each feature to its plan
column and row. Update the comparison section in the pricing page to use
semantic table markup (table, thead, tbody, tr, th, td) or equivalent table
roles, and ensure the feature names and plan headers are exposed as labeled
row/column headers so FeatureCell entries are associated with the correct plan;
keep the existing comparisonFeatures rendering but move it into the semantic
table structure around PlanColumns, PlanColumnHeader, and FeatureCell.
- Around line 156-158: The pricing copy for the 4-year plan is using the wrong
label and comparison price. Update the plan entry in the pricing page data so
the Pro Plus tier matches the agreed `Pro+` naming and uses `$149` as
`originalPrice`, and verify any rendering logic that displays this plan reads
from that same plan object.
- Around line 416-417: The checkout flow is hardcoding the same plan name for
both paid tiers, which causes Pro+ to be mislabeled. Update the pricing page
checkout props so the selected tier’s actual name is passed through instead of a
fixed "Opensox Pro" value, using the relevant tier data in the pricing component
that renders the checkout action. Make sure the planName sent alongside planId
reflects the chosen tier in all paid-tier cases.

---

Outside diff comments:
In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx:
- Around line 3-13: Remove the unused pricing imports from the pricing page
module. In the `page.tsx` import block, delete the references to `trpc` and
`formatApproxPlanPrice` since they are no longer used after the pricing query
removal; keep the remaining imports in place and ensure no other identifiers in
`PricingPage` or related hooks/components are affected.
- Around line 132-137: The pricing page comment is stale because it still
references getPublicPlan and the “≈ ₹…” line, which are no longer part of this
flow. Update or remove the note in pricing/page.tsx near the pricing card
content so it matches the current contract: the displayed price labels are local
copy, and the actual checkout amount is determined by planId during checkout.

---

Nitpick comments:
In `@apps/web/src/app/`(main)/(landing)/pricing/page.tsx:
- Around line 196-200: Move the inline mask and blur styling in the pricing page
component into Tailwind utility classes instead of the current style object.
Update the relevant JSX in the landing pricing page so the element using the
mask/blur effect is styled through Tailwind classes only, preserving the same
visual effect while removing the inline CSS from the component.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c5664c44-5c2b-4a25-a597-2e1c258ae035

📥 Commits

Reviewing files that changed from the base of the PR and between 7bc9a79 and decc1b9.

📒 Files selected for processing (3)
  • apps/web/src/app/(main)/(landing)/pricing/page.tsx
  • apps/web/src/components/ui/custom-button.tsx
  • apps/web/tailwind.config.ts
✅ Files skipped from review due to trivial changes (2)
  • apps/web/tailwind.config.ts
  • apps/web/src/components/ui/custom-button.tsx

Comment thread apps/web/src/app/(main)/(landing)/pricing/page.tsx Outdated
Comment thread apps/web/src/app/(main)/(landing)/pricing/page.tsx
Comment thread apps/web/src/app/(main)/(landing)/pricing/page.tsx Outdated
Comment thread apps/web/src/app/(main)/(landing)/pricing/page.tsx
@apsinghdev
apsinghdev force-pushed the feat/revamp-pricing-page branch from 3c365a9 to 2c5f32c Compare June 26, 2026 08:53
@vercel

vercel Bot commented Jun 26, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
opensox-website Ready Ready Preview, Comment Jun 26, 2026 9:00am

@apsinghdev
apsinghdev merged commit a0be894 into apsinghdev:main Jun 26, 2026
3 checks passed
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.

3 participants