BibleWeb needs a clear, honest pricing presentation that explains the three-tier model (Free / Pro / Premium), makes the current plan obvious, and builds confidence for eventual paid subscriptions. The page is marketing material as much as a functional UI.
user.currentTier) is highlighted with a "Current plan" badge./settings is shown on the Free card.✓, —, a number (e.g., 5), or "Unlimited" (for null). Positive values are highlighted in gold (--color-jesus-words); negative in muted grey.Feature matrix (from code):
| Feature | Free | Pro | Premium |
|---|---|---|---|
| Notes | 5 | Unlimited | Unlimited |
| Dutch translation | ✓ | ✓ | ✓ |
| Parallel Gospel | ✓ | ✓ | ✓ |
| Interlinear | — | ✓ | ✓ |
| Commentaries | — | ✓ | ✓ |
| Cross-ref graph | — | ✓ | ✓ |
| Offline download | — | ✓ | ✓ |
| Note cross-linking | — | ✓ | ✓ |
| Note export | — | — | ✓ |
| AI chat | — | — | ✓ |
| Personal translation | — | — | ✓ |
56rem, centered, 2rem/4rem padding top/bottom.repeat(auto-fit, minmax(14rem, 1fr)). Pro card has a gold border (--color-jesus-words) as the featured option.pricing.*); supports both English and Dutch.Route: apps/web/src/routes/(app)/pricing/+page.svelte
+page.server.ts) — tier data comes from the reactive user store.TierFeatures type imported from $lib/tier.js — same type used by the backend, ensuring parity.FeatureRow[] mapping i18n label keys to TierFeatures keys; adding a new feature row is a one-line change.Dependencies:
$lib/stores/user.svelte.js — provides user.currentTier$lib/tier.js — TierFeatures type$lib/i18n/index.js — t() translation functionUI is fully implemented and correctly reflects the tier feature matrix. Stripe checkout integration is not yet built — all paid plan CTAs show "Coming soon". The page is ready to receive live upgrade links once payment is wired up.