Skip to content

Refresh Maple pricing page design - #601

Merged
AnthonyRonning merged 1 commit into
masterfrom
codex-maple-pricing-design-maple
Jul 5, 2026
Merged

Refresh Maple pricing page design#601
AnthonyRonning merged 1 commit into
masterfrom
codex-maple-pricing-design-maple

Conversation

@AnthonyRonning

@AnthonyRonning AnthonyRonning commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

Summary

  • refresh the pricing page visual design to match the current Maple brand system
  • remove the outdated pricing header while preserving the live footer
  • add a compact arrow return control that reads Home when signed out and Chat when signed in
  • update pricing plan affordances, cards, FAQ, and status states without changing pricing or checkout behavior

Validation

  • visually inspected http://127.0.0.1:35432/pricing in Chrome using Computer Use
  • nix develop -c bash -c 'cd frontend && bunx prettier --check src/routes/pricing.tsx src/config/pricingConfig.tsx && git diff --check'\n- nix develop -c just lint (passes with 13 existing warnings outside this change)\n- nix develop -c just build

Open in Devin Review

Summary by CodeRabbit

  • UI Improvements

    • Refreshed the pricing page layout with a new hero area, return button, and cleaner overall page chrome.
    • Updated pricing plan cards, badges, pricing display, and action buttons for a more polished look.
    • Restyled the discount/promotion, payment status, and guest warning banners.
  • Bug Fixes

    • Improved loading and error states on the pricing page for a more consistent experience.
    • Reworked the FAQ section into a cleaner, more reusable layout.

@coderabbitai

coderabbitai Bot commented Jul 5, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Updates pricing plan feature icon styling to maple-success/maple-error classes in pricingConfig.tsx, and refactors pricing.tsx's page layout, introducing hero/FAQ/skeleton subcomponents, restyled loading/error states, payment banners, promotion banner, pricing cards, price display, and CTA/bottom controls.

Changes

Pricing page and config restyle

Layer / File(s) Summary
Feature icon color updates
frontend/src/config/pricingConfig.tsx
Included/excluded feature icons across Free, Starter, Pro, Max, and Team plans switch to text-maple-success/text-maple-error classes with reformatted multiline objects.
Imports and page wrapper setup
frontend/src/routes/pricing.tsx
Reorganizes lucide icon imports, adds ReactNode/cn usage, and defines pricingPageClassName.
Hero, return button, and FAQ refactor
frontend/src/routes/pricing.tsx
Introduces PricingSkeletonCard, PricingHero, PricingReturnButton, and FAQItem, replacing <details>-based FAQ entries.
Loading and error state layouts
frontend/src/routes/pricing.tsx
Loading and error views now render via FullPageMain with the new hero/return button and updated card/button styling, replacing prior TopNav/MarketingHeader.
Payment and promotion banners
frontend/src/routes/pricing.tsx
Success/canceled payment callback banners and the active promotion banner adopt maple theme styling.
Pricing card grid, badges, and price display
frontend/src/routes/pricing.tsx
Grid spacing, card wrapper/badge rendering, and price block (discount/yearly/monthly/free) are restructured with cn(...)-based classes.
CTA button and bottom controls styling
frontend/src/routes/pricing.tsx
CTA button className computed via cn(...) for popular/current/disabled states; pass code link, Bitcoin toggle, and guest warning restyled.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

  • OpenSecretCloud/Maple#4: Both touch pricing.tsx's price-block rendering including Bitcoin yearly-billing logic.
  • OpenSecretCloud/Maple#16: Both modify pricing.tsx's badge/price rendering including bitcoin and promo discount conditions.
  • OpenSecretCloud/Maple#110: Both modify pricingConfig.tsx's features entries, one changing icon styling and the other adding a feature flag.

Poem

A rabbit hopped through pricing lanes,
Painted checks green, X's in reds' domains,
New hero cards and FAQs unfold,
Bitcoin toggles shine like gold. 🐇
Hop, hop, ship it — the pricing page's told!

🚥 Pre-merge checks | ✅ 4
✅ 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 clearly summarizes the main change: a design refresh of the Maple pricing page.
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
  • Commit unit tests in branch codex-maple-pricing-design-maple

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

@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying maple with  Cloudflare Pages  Cloudflare Pages

Latest commit: 136b293
Status: ✅  Deploy successful!
Preview URL: https://056984ef.maple-ca8.pages.dev
Branch Preview URL: https://codex-maple-pricing-design-m.maple-ca8.pages.dev

View logs

@devin-ai-integration devin-ai-integration 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.

Devin Review found 1 potential issue.

Open in Devin Review

Comment thread frontend/src/routes/pricing.tsx

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
frontend/src/routes/pricing.tsx (1)

855-859: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Minor: use cn() for consistency with other dynamic classNames.

This is the only dynamic className built with a template literal instead of cn(...), which is used elsewhere in this same file for conditional classes (e.g. lines 930-937, 1085-1089).

♻️ Optional refactor
-            <div
-              className={`mx-auto grid w-full max-w-7xl grid-cols-1 ${gridColumns} gap-5 px-4 pt-6 sm:px-6 lg:px-8`}
-            >
+            <div
+              className={cn(
+                "mx-auto grid w-full max-w-7xl grid-cols-1 gap-5 px-4 pt-6 sm:px-6 lg:px-8",
+                gridColumns
+              )}
+            >
🤖 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 `@frontend/src/routes/pricing.tsx` around lines 855 - 859, The dynamic
className in the pricing route is built with a template literal instead of the
shared cn() helper, unlike the other conditional className usages in this file.
Update the JSX in the relevant pricing layout block to use cn() for composing
the static classes with gridColumns so the pattern stays consistent with the
other dynamic className expressions in pricing.tsx.
🤖 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 `@frontend/src/routes/pricing.tsx`:
- Around line 726-730: The pricing loading skeleton and the loaded grid switch
to different column counts at different breakpoints, causing a layout shift
between the placeholder and real content. Update the skeleton grid in the
pricing route so its responsive column classes match the same breakpoint logic
used by the loaded plans grid via gridColumns in the pricing page, keeping the
4-column switch aligned at lg instead of md. Verify the responsive classes
around FullPageMain and the pricing plans container use the same behavior for
all viewport sizes.

---

Nitpick comments:
In `@frontend/src/routes/pricing.tsx`:
- Around line 855-859: The dynamic className in the pricing route is built with
a template literal instead of the shared cn() helper, unlike the other
conditional className usages in this file. Update the JSX in the relevant
pricing layout block to use cn() for composing the static classes with
gridColumns so the pattern stays consistent with the other dynamic className
expressions in pricing.tsx.
🪄 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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9b38841a-c170-45e9-89b1-e2cf75b936a9

📥 Commits

Reviewing files that changed from the base of the PR and between d8bbd51 and 136b293.

📒 Files selected for processing (2)
  • frontend/src/config/pricingConfig.tsx
  • frontend/src/routes/pricing.tsx

Comment on lines +726 to +730
<FullPageMain className={pricingPageClassName}>
<PricingReturnButton isLoggedIn={isLoggedIn} onClick={() => navigate({ to: "/" })} />
<PricingHero />

<div className="pt-8 w-full max-w-7xl mx-auto grid grid-cols-1 md:grid-cols-4 gap-4 md:gap-4 lg:gap-6 px-4 sm:px-6 lg:px-8">
<div className="mx-auto grid w-full max-w-7xl grid-cols-1 gap-5 px-4 pt-6 sm:px-6 md:grid-cols-4 lg:px-8">

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Skeleton and real grid switch to 4 columns at different breakpoints.

Loading skeleton uses md:grid-cols-4 (line 730), but the actual pricing grid uses gridColumns from filteredPlans.length === 4 ? "lg:grid-cols-4" : "lg:grid-cols-3" (line 858) — switching at lg, not md. Between 768px and 1024px viewport widths, the skeleton will render 4 columns while the loaded content collapses to 1 column, causing a visible layout shift when data arrives.

🔧 Proposed fix: align skeleton breakpoint with real grid
-          <div className="mx-auto grid w-full max-w-7xl grid-cols-1 gap-5 px-4 pt-6 sm:px-6 md:grid-cols-4 lg:px-8">
+          <div className="mx-auto grid w-full max-w-7xl grid-cols-1 gap-5 px-4 pt-6 sm:px-6 lg:grid-cols-4 lg:px-8">

Also applies to: 858-858

🤖 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 `@frontend/src/routes/pricing.tsx` around lines 726 - 730, The pricing loading
skeleton and the loaded grid switch to different column counts at different
breakpoints, causing a layout shift between the placeholder and real content.
Update the skeleton grid in the pricing route so its responsive column classes
match the same breakpoint logic used by the loaded plans grid via gridColumns in
the pricing page, keeping the 4-column switch aligned at lg instead of md.
Verify the responsive classes around FullPageMain and the pricing plans
container use the same behavior for all viewport sizes.

@AnthonyRonning
AnthonyRonning merged commit 0353465 into master Jul 5, 2026
18 checks passed
@AnthonyRonning
AnthonyRonning deleted the codex-maple-pricing-design-maple branch July 5, 2026 19:36
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