feat(web): align pricing cards with subscription page
Bring the public pricing cards in line with the in-app subscription page and
strengthen the CTA:
- Move the "Popüler" badge from 2 Marka to Full Paket (one consistent story
across both surfaces).
- CTA "Başla" -> "Ücretsiz Başla" (leans on the free trial the flow grants).
- Yearly line now uses a consistent ₺ format ("veya ₺2.000,00/yıl") plus a
"· 2 ay bedava" savings cue instead of the bare, differently-formatted
"veya 2.000,00 TL/yıl".
- Plan-decision helper above the grid ("Hangi planı seçmeliyim? …").
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
21
apps/web/src/routes/__tests__/pricing-plans.test.tsx
Normal file
21
apps/web/src/routes/__tests__/pricing-plans.test.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* Guards that the public pricing page emphasises the same plan as the in-app
|
||||
* subscription page. The "Popüler" badge was moved from 2 Marka to Full Paket
|
||||
* so both surfaces tell one story.
|
||||
*/
|
||||
|
||||
import { describe, expect, test } from "vitest";
|
||||
|
||||
import { plans } from "@/routes/pricing";
|
||||
|
||||
describe("pricing plans", () => {
|
||||
test("Full Paket is the only popular plan (aligned with subscription)", () => {
|
||||
expect(plans.find((p) => p.key === "full")?.popular).toBe(true);
|
||||
expect(plans.find((p) => p.key === "brand2")?.popular).toBeFalsy();
|
||||
expect(plans.filter((p) => p.popular).map((p) => p.key)).toEqual(["full"]);
|
||||
});
|
||||
|
||||
test("still lists all four tiers in ascending brand order", () => {
|
||||
expect(plans.map((p) => p.key)).toEqual(["brand1", "brand2", "brand3", "full"]);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user