@tangle-network/starter-foundry 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/lib/compose.js +2 -0
  2. package/dist/lib/compose.js.map +1 -1
  3. package/dist/lib/index.d.ts +3 -1
  4. package/dist/lib/index.js +2 -1
  5. package/dist/lib/index.js.map +1 -1
  6. package/dist/lib/industries.d.ts +33 -0
  7. package/dist/lib/industries.js +52 -0
  8. package/dist/lib/industries.js.map +1 -0
  9. package/dist/lib/keywords.d.ts +6 -0
  10. package/dist/lib/keywords.js +21 -0
  11. package/dist/lib/keywords.js.map +1 -1
  12. package/dist/lib/prompt-planner.js +5 -1
  13. package/dist/lib/prompt-planner.js.map +1 -1
  14. package/dist/lib/telemetry.d.ts +1 -0
  15. package/dist/lib/telemetry.js.map +1 -1
  16. package/package.json +1 -1
  17. package/registry/layers/capability/layout-landing/files/features-section.tsx +54 -77
  18. package/registry/layers/capability/layout-landing/files/hero-section.tsx +18 -23
  19. package/registry/layers/capability/layout-landing/files/landing-page.tsx +25 -63
  20. package/registry/layers/capability/layout-landing/files/personalize.json +146 -0
  21. package/registry/layers/capability/layout-landing/files/pricing-section.tsx +45 -94
  22. package/registry/layers/capability/layout-landing/manifest.json +4 -0
  23. package/registry/layers/capability/layout-landing/variants/dark-product/features-section.tsx +55 -59
  24. package/registry/layers/capability/layout-landing/variants/dark-product/hero-section.tsx +83 -55
  25. package/registry/layers/capability/layout-landing/variants/dark-product/landing-page.tsx +25 -63
  26. package/registry/layers/capability/layout-landing/variants/dark-product/personalize.json +53 -0
  27. package/registry/layers/capability/layout-landing/variants/dark-product/pricing-section.tsx +51 -91
  28. package/registry/layers/capability/layout-landing/variants/default/features-section.tsx +54 -77
  29. package/registry/layers/capability/layout-landing/variants/default/hero-section.tsx +18 -23
  30. package/registry/layers/capability/layout-landing/variants/default/landing-page.tsx +25 -63
  31. package/registry/layers/capability/layout-landing/variants/default/personalize.json +146 -0
  32. package/registry/layers/capability/layout-landing/variants/default/pricing-section.tsx +45 -94
  33. package/registry/layers/capability/layout-landing/variants/gradient-hero/features-section.tsx +53 -57
  34. package/registry/layers/capability/layout-landing/variants/gradient-hero/hero-section.tsx +86 -53
  35. package/registry/layers/capability/layout-landing/variants/gradient-hero/landing-page.tsx +25 -63
  36. package/registry/layers/capability/layout-landing/variants/gradient-hero/personalize.json +53 -0
  37. package/registry/layers/capability/layout-landing/variants/gradient-hero/pricing-section.tsx +49 -88
  38. package/registry/layers/capability/layout-landing/variants/minimal-clean/features-section.tsx +53 -51
  39. package/registry/layers/capability/layout-landing/variants/minimal-clean/hero-section.tsx +88 -47
  40. package/registry/layers/capability/layout-landing/variants/minimal-clean/landing-page.tsx +25 -63
  41. package/registry/layers/capability/layout-landing/variants/minimal-clean/personalize.json +53 -0
  42. package/registry/layers/capability/layout-landing/variants/minimal-clean/pricing-section.tsx +51 -87
  43. package/registry/layers/framework/nextjs-app-router/files/layout.tsx +1 -0
  44. package/registry/layers/framework/nextjs-app-router/files/personalize.css +1 -0
  45. package/registry/layers/framework/nextjs-app-router/manifest.json +4 -0
  46. package/registry/layers/framework/react-vite-ts/files/main.ts +1 -0
  47. package/registry/layers/framework/react-vite-ts/files/personalize.css +1 -0
  48. package/registry/layers/framework/react-vite-ts/manifest.json +4 -0
  49. package/registry/layers/industry/creative/files/personalize.css +11 -0
  50. package/registry/layers/industry/creative/manifest.json +39 -0
  51. package/registry/layers/industry/crypto/files/personalize.css +11 -0
  52. package/registry/layers/industry/crypto/manifest.json +41 -0
  53. package/registry/layers/industry/ecommerce/files/personalize.css +11 -0
  54. package/registry/layers/industry/ecommerce/manifest.json +39 -0
  55. package/registry/layers/industry/education/files/personalize.css +11 -0
  56. package/registry/layers/industry/education/manifest.json +39 -0
  57. package/registry/layers/industry/finance/files/personalize.css +11 -0
  58. package/registry/layers/industry/finance/manifest.json +39 -0
  59. package/registry/layers/industry/fitness/files/personalize.css +11 -0
  60. package/registry/layers/industry/fitness/manifest.json +43 -0
  61. package/registry/layers/industry/gaming/files/personalize.css +11 -0
  62. package/registry/layers/industry/gaming/manifest.json +39 -0
  63. package/registry/layers/industry/health/files/personalize.css +11 -0
  64. package/registry/layers/industry/health/manifest.json +39 -0
  65. package/registry/layers/industry/restaurant/files/personalize.css +11 -0
  66. package/registry/layers/industry/restaurant/manifest.json +41 -0
  67. package/registry/layers/industry/saas/files/personalize.css +11 -0
  68. package/registry/layers/industry/saas/manifest.json +39 -0
@@ -1,16 +1,15 @@
1
1
  import { Button } from '@/components/ui/button'
2
2
  import { ArrowRight, Play } from 'lucide-react'
3
+ import personalize from '@/personalize.json'
3
4
 
4
5
  export function HeroSection() {
6
+ const { hero, trust } = personalize
5
7
  return (
6
8
  <section className="relative overflow-hidden bg-background">
7
- {/* Radial gradient backdrop */}
8
9
  <div
9
10
  aria-hidden="true"
10
11
  className="pointer-events-none absolute inset-0 bg-[radial-gradient(ellipse_80%_50%_at_50%_-20%,hsl(var(--primary)/0.08),transparent)]"
11
12
  />
12
-
13
- {/* Decorative blur orbs */}
14
13
  <div
15
14
  aria-hidden="true"
16
15
  className="pointer-events-none absolute -right-40 -top-40 h-[500px] w-[500px] rounded-full bg-primary/15 blur-3xl"
@@ -22,27 +21,25 @@ export function HeroSection() {
22
21
 
23
22
  <div className="relative mx-auto max-w-6xl px-6 py-28 sm:py-36 lg:px-8 lg:py-44">
24
23
  <div className="grid items-center gap-12 lg:grid-cols-2 lg:gap-16">
25
- {/* Left column — text content */}
26
24
  <div className="flex flex-col items-center text-center lg:items-start lg:text-left">
27
- <div className="rounded-full border border-white/20 bg-white/10 px-4 py-1.5 text-xs font-medium tracking-wider text-muted-foreground backdrop-blur-sm">
28
- NOW IN BETA — GET EARLY ACCESS
25
+ <div className="rounded-full border border-border/40 bg-muted/50 px-4 py-1.5 text-xs font-medium tracking-wider text-muted-foreground backdrop-blur-sm">
26
+ {hero.badge}
29
27
  </div>
30
28
 
31
29
  <h1 className="mt-8 text-5xl font-bold tracking-tighter text-foreground sm:text-6xl lg:text-7xl">
32
- {'{{headline}}'}
30
+ {hero.headline}
33
31
  </h1>
34
32
 
35
33
  <p className="mt-6 max-w-xl text-lg leading-relaxed text-muted-foreground">
36
- Build faster, ship sooner, and scale with confidence. The modern platform
37
- that gives your team everything it needs to go from idea to production.
34
+ {hero.subheadline}
38
35
  </p>
39
36
 
40
- <div className="mt-10 flex items-center gap-4">
37
+ <div className="mt-10 flex flex-wrap items-center justify-center gap-4 lg:justify-start">
41
38
  <Button
42
39
  size="lg"
43
40
  className="h-12 gap-2 rounded-lg px-8 font-medium shadow-lg shadow-primary/25 transition-transform hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2"
44
41
  >
45
- Get Started
42
+ {hero.ctaPrimary}
46
43
  <ArrowRight className="h-4 w-4" />
47
44
  </Button>
48
45
  <Button
@@ -51,11 +48,11 @@ export function HeroSection() {
51
48
  className="h-12 gap-2 rounded-lg border-2 px-8 font-medium transition-transform hover:scale-105 active:scale-95 focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2"
52
49
  >
53
50
  <Play className="h-4 w-4" />
54
- See a Demo
51
+ {hero.ctaSecondary}
55
52
  </Button>
56
53
  </div>
57
54
 
58
- <div className="mt-10 flex items-center gap-3">
55
+ <div className="mt-12 flex items-center gap-3">
59
56
  <div className="flex -space-x-2">
60
57
  {['bg-primary', 'bg-chart-1', 'bg-chart-2', 'bg-chart-3', 'bg-chart-4'].map((color, i) => (
61
58
  <div
@@ -65,20 +62,17 @@ export function HeroSection() {
65
62
  ))}
66
63
  </div>
67
64
  <p className="text-sm font-medium text-muted-foreground">
68
- Trusted by <span className="text-foreground">1,000+</span> teams
65
+ {trust.label}
69
66
  </p>
70
67
  </div>
71
68
  </div>
72
69
 
73
- {/* Right column — product mockup */}
74
70
  <div className="relative mx-auto w-full max-w-lg lg:mx-0">
75
- {/* Glow behind mockup */}
76
71
  <div
77
72
  aria-hidden="true"
78
73
  className="pointer-events-none absolute -inset-4 rounded-2xl bg-primary/10 blur-2xl"
79
74
  />
80
- <div className="relative rounded-xl border border-border/50 bg-card shadow-2xl shadow-primary/5 overflow-hidden">
81
- {/* Browser toolbar */}
75
+ <div className="relative overflow-hidden rounded-xl border border-border/50 bg-card shadow-2xl shadow-primary/5">
82
76
  <div className="flex items-center gap-2 border-b border-border/50 bg-muted/50 px-4 py-3">
83
77
  <div className="flex items-center gap-1.5">
84
78
  <div className="h-3 w-3 rounded-full bg-red-400/80" />
@@ -86,20 +80,21 @@ export function HeroSection() {
86
80
  <div className="h-3 w-3 rounded-full bg-green-400/80" />
87
81
  </div>
88
82
  <div className="ml-3 flex-1 rounded-md bg-background/80 px-3 py-1 text-xs text-muted-foreground">
89
- yourapp.com
83
+ {personalize.brand.name.toLowerCase()}.com
90
84
  </div>
91
85
  </div>
92
- {/* Content area */}
93
86
  <div className="relative aspect-[4/3]">
94
87
  <img
95
88
  src="/images/hero-product.png"
96
- alt="Product screenshot"
89
+ alt={`${personalize.brand.name} product screenshot`}
97
90
  className="h-full w-full object-cover"
98
91
  onError={(e) => { e.currentTarget.style.display = 'none' }}
99
92
  />
100
- {/* Gradient fallback shown when image hasn't been generated yet */}
101
93
  <div className="absolute inset-0 flex items-center justify-center bg-gradient-to-br from-primary/10 to-accent/10">
102
- <span className="text-sm text-muted-foreground">Generate with: media-manifest.json</span>
94
+ <div className="text-center">
95
+ <p className="text-sm font-medium text-foreground">{personalize.brand.name}</p>
96
+ <p className="mt-1 text-xs text-muted-foreground">{personalize.brand.tagline}</p>
97
+ </div>
103
98
  </div>
104
99
  </div>
105
100
  </div>
@@ -2,43 +2,10 @@ import { Button } from '@/components/ui/button'
2
2
  import { HeroSection } from '@/components/landing/hero-section'
3
3
  import { FeaturesSection } from '@/components/landing/features-section'
4
4
  import { PricingSection } from '@/components/landing/pricing-section'
5
-
6
- const footerLinks = {
7
- Product: [
8
- { label: 'Features', href: '#features' },
9
- { label: 'Pricing', href: '#pricing' },
10
- { label: 'Changelog', href: '/changelog' },
11
- { label: 'Docs', href: '/docs' },
12
- ],
13
- Company: [
14
- { label: 'About', href: '/about' },
15
- { label: 'Blog', href: '/blog' },
16
- { label: 'Careers', href: '/careers' },
17
- { label: 'Contact', href: '/contact' },
18
- ],
19
- Resources: [
20
- { label: 'Documentation', href: '/docs' },
21
- { label: 'API Reference', href: '/docs/api' },
22
- { label: 'Status', href: '/status' },
23
- { label: 'Support', href: '/support' },
24
- ],
25
- Legal: [
26
- { label: 'Privacy', href: '/privacy' },
27
- { label: 'Terms', href: '/terms' },
28
- { label: 'Security', href: '/security' },
29
- ],
30
- }
31
-
32
- const trustLogos = [
33
- 'Acme Corp',
34
- 'TechFlow',
35
- 'Quantum',
36
- 'NovaSoft',
37
- 'BuildStack',
38
- 'DataPipe',
39
- ]
5
+ import personalize from '@/personalize.json'
40
6
 
41
7
  export default function LandingPage() {
8
+ const { brand, trust, footer } = personalize
42
9
  return (
43
10
  <div className="min-h-screen scroll-smooth bg-background text-foreground">
44
11
  <a
@@ -53,28 +20,28 @@ export default function LandingPage() {
53
20
  <span className="flex items-center gap-2 text-lg font-semibold tracking-tight">
54
21
  <img
55
22
  src="/images/logo.svg"
56
- alt="{{headline}}"
23
+ alt={brand.name}
57
24
  className="h-8 w-auto"
58
25
  onError={(e) => { e.currentTarget.style.display = 'none' }}
59
26
  />
60
- <span>{'{{headline}}'}</span>
27
+ <span>{brand.name}</span>
61
28
  </span>
62
29
  <nav className="hidden items-center gap-8 text-sm md:flex">
63
30
  <a
64
31
  href="#features"
65
- className="font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:rounded"
32
+ className="font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2"
66
33
  >
67
34
  Features
68
35
  </a>
69
36
  <a
70
37
  href="#pricing"
71
- className="font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:rounded"
38
+ className="font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2"
72
39
  >
73
40
  Pricing
74
41
  </a>
75
42
  <a
76
43
  href="/sign-in"
77
- className="font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:rounded"
44
+ className="font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2"
78
45
  >
79
46
  Sign in
80
47
  </a>
@@ -95,17 +62,16 @@ export default function LandingPage() {
95
62
  <main id="main">
96
63
  <HeroSection />
97
64
 
98
- {/* Trust section */}
99
65
  <section className="border-y border-border/50 bg-muted/20 py-12 dark:bg-muted/5">
100
66
  <div className="mx-auto max-w-6xl px-6 lg:px-8">
101
67
  <p className="mb-8 text-center text-xs font-medium uppercase tracking-widest text-muted-foreground">
102
68
  Trusted by teams at
103
69
  </p>
104
70
  <div className="flex flex-wrap items-center justify-center gap-x-10 gap-y-4 lg:gap-x-16">
105
- {trustLogos.map((name) => (
71
+ {trust.logoNames.map((name) => (
106
72
  <span
107
73
  key={name}
108
- className="text-lg font-semibold tracking-tight text-muted-foreground/30 select-none"
74
+ className="select-none text-lg font-semibold tracking-tight text-muted-foreground/30"
109
75
  >
110
76
  {name}
111
77
  </span>
@@ -114,35 +80,33 @@ export default function LandingPage() {
114
80
  </div>
115
81
  </section>
116
82
 
117
- {/* Gradient divider */}
118
83
  <div aria-hidden="true" className="h-px bg-gradient-to-r from-transparent via-border to-transparent" />
119
84
 
120
- <section id="features">
121
- <FeaturesSection />
122
- </section>
85
+ <FeaturesSection />
123
86
 
124
- {/* Gradient divider */}
125
87
  <div aria-hidden="true" className="h-px bg-gradient-to-r from-transparent via-border to-transparent" />
126
88
 
127
- <section id="pricing">
128
- <PricingSection />
129
- </section>
89
+ <PricingSection />
130
90
  </main>
131
91
 
132
- <footer className="border-t bg-muted/30 dark:bg-muted/10">
92
+ <footer className="border-t border-border/50 bg-muted/10">
133
93
  <div className="mx-auto max-w-6xl px-6 py-16 lg:px-8">
134
- <div className="grid gap-8 sm:grid-cols-2 lg:grid-cols-4 lg:gap-12">
135
- {Object.entries(footerLinks).map(([category, links]) => (
136
- <div key={category}>
137
- <h4 className="text-sm font-semibold text-foreground">
138
- {category}
139
- </h4>
94
+ <div className="grid gap-8 lg:grid-cols-5 lg:gap-12">
95
+ <div className="lg:col-span-1">
96
+ <span className="text-lg font-semibold tracking-tight">{brand.name}</span>
97
+ <p className="mt-3 text-sm leading-relaxed text-muted-foreground">
98
+ {footer.tagline}
99
+ </p>
100
+ </div>
101
+ {Object.entries(footer.sections).map(([title, links]) => (
102
+ <div key={title}>
103
+ <h4 className="text-sm font-semibold text-foreground">{title}</h4>
140
104
  <ul className="mt-4 space-y-3">
141
105
  {links.map((link) => (
142
106
  <li key={link.label}>
143
107
  <a
144
108
  href={link.href}
145
- className="text-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:rounded"
109
+ className="text-sm text-muted-foreground transition-colors hover:text-foreground focus-visible:rounded focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2"
146
110
  >
147
111
  {link.label}
148
112
  </a>
@@ -152,10 +116,8 @@ export default function LandingPage() {
152
116
  </div>
153
117
  ))}
154
118
  </div>
155
- <div className="mt-12 border-t pt-8">
156
- <p className="text-sm text-muted-foreground">
157
- &copy; {new Date().getFullYear()} {'{{headline}}'}. All rights reserved.
158
- </p>
119
+ <div className="mt-12 border-t border-border/50 pt-8">
120
+ <p className="text-sm text-muted-foreground">{footer.copyright}</p>
159
121
  </div>
160
122
  </div>
161
123
  </footer>
@@ -0,0 +1,146 @@
1
+ {
2
+ "_meta": {
3
+ "doc": "Edit this file to customize ALL copy, branding, and content on the landing page. Components read from this at build time. Agents personalizing scaffolds should rewrite this file based on the user's actual product.",
4
+ "version": 1
5
+ },
6
+ "brand": {
7
+ "name": "Acme",
8
+ "tagline": "The platform for shipping fast"
9
+ },
10
+ "hero": {
11
+ "badge": "NOW IN BETA — GET EARLY ACCESS",
12
+ "headline": "Build something people want.",
13
+ "subheadline": "The modern platform that gives your team everything it needs to go from idea to production.",
14
+ "ctaPrimary": "Get Started",
15
+ "ctaSecondary": "See a Demo"
16
+ },
17
+ "trust": {
18
+ "label": "Trusted by 1,000+ teams worldwide",
19
+ "logoNames": ["Acme Corp", "TechFlow", "Quantum", "NovaSoft", "BuildStack", "DataPipe"]
20
+ },
21
+ "features": {
22
+ "eyebrow": "Features",
23
+ "headline": "Everything you need, nothing you don't",
24
+ "subheadline": "Built for teams who care about craft and ship fast.",
25
+ "primary": [
26
+ {
27
+ "icon": "Zap",
28
+ "title": "Lightning fast",
29
+ "description": "Optimized for speed at every layer. Sub-second cold starts, instant hot reload."
30
+ },
31
+ {
32
+ "icon": "Shield",
33
+ "title": "Secure by default",
34
+ "description": "Authentication, authorization, and encryption built in. SOC 2 ready out of the box."
35
+ },
36
+ {
37
+ "icon": "BarChart3",
38
+ "title": "Built-in analytics",
39
+ "description": "Real-time metrics, custom dashboards, and automatic alerting on what matters."
40
+ }
41
+ ],
42
+ "secondary": [
43
+ {
44
+ "icon": "Layers",
45
+ "title": "Composable architecture",
46
+ "description": "Mix and match the pieces you need."
47
+ },
48
+ {
49
+ "icon": "Globe",
50
+ "title": "Global by default",
51
+ "description": "Edge-deployed across 200+ regions."
52
+ },
53
+ {
54
+ "icon": "Lock",
55
+ "title": "Privacy-first",
56
+ "description": "Your data stays yours. No tracking, no telemetry."
57
+ }
58
+ ]
59
+ },
60
+ "pricing": {
61
+ "eyebrow": "Pricing",
62
+ "headline": "Simple, transparent pricing",
63
+ "subheadline": "Start free. Upgrade when you're ready. Cancel anytime.",
64
+ "toggleMonthly": "Monthly",
65
+ "toggleYearly": "Yearly",
66
+ "yearlyDiscount": "Save 20%",
67
+ "tiers": [
68
+ {
69
+ "name": "Free",
70
+ "price": "$0",
71
+ "period": "/mo",
72
+ "description": "For side projects and exploration",
73
+ "features": [
74
+ "Up to 3 projects",
75
+ "Community support",
76
+ "Basic analytics",
77
+ "1 team member"
78
+ ],
79
+ "cta": "Start for free",
80
+ "highlighted": false,
81
+ "note": "No credit card required"
82
+ },
83
+ {
84
+ "name": "Pro",
85
+ "price": "$29",
86
+ "period": "/mo",
87
+ "description": "For growing teams shipping in production",
88
+ "features": [
89
+ "Unlimited projects",
90
+ "Priority support",
91
+ "Advanced analytics",
92
+ "Up to 10 team members",
93
+ "Custom integrations",
94
+ "API access"
95
+ ],
96
+ "cta": "Start free trial",
97
+ "highlighted": true
98
+ },
99
+ {
100
+ "name": "Enterprise",
101
+ "price": "Custom",
102
+ "period": "",
103
+ "description": "For organizations with custom needs",
104
+ "features": [
105
+ "Everything in Pro",
106
+ "Unlimited team members",
107
+ "Dedicated support",
108
+ "Custom SLAs",
109
+ "SSO and SAML",
110
+ "On-premise deployment"
111
+ ],
112
+ "cta": "Contact sales",
113
+ "highlighted": false
114
+ }
115
+ ]
116
+ },
117
+ "footer": {
118
+ "tagline": "Built with care by people who give a damn.",
119
+ "sections": {
120
+ "Product": [
121
+ { "label": "Features", "href": "#features" },
122
+ { "label": "Pricing", "href": "#pricing" },
123
+ { "label": "Changelog", "href": "/changelog" },
124
+ { "label": "Docs", "href": "/docs" }
125
+ ],
126
+ "Company": [
127
+ { "label": "About", "href": "/about" },
128
+ { "label": "Blog", "href": "/blog" },
129
+ { "label": "Careers", "href": "/careers" },
130
+ { "label": "Contact", "href": "/contact" }
131
+ ],
132
+ "Resources": [
133
+ { "label": "Documentation", "href": "/docs" },
134
+ { "label": "API Reference", "href": "/docs/api" },
135
+ { "label": "Status", "href": "/status" },
136
+ { "label": "Support", "href": "/support" }
137
+ ],
138
+ "Legal": [
139
+ { "label": "Privacy", "href": "/privacy" },
140
+ { "label": "Terms", "href": "/terms" },
141
+ { "label": "Security", "href": "/security" }
142
+ ]
143
+ },
144
+ "copyright": "© 2026 Acme. All rights reserved."
145
+ }
146
+ }
@@ -4,147 +4,100 @@ import * as React from 'react'
4
4
  import { Button } from '@/components/ui/button'
5
5
  import { Check } from 'lucide-react'
6
6
  import { cn } from '@/lib/utils'
7
-
8
- const tiers = [
9
- {
10
- name: 'Free',
11
- price: { monthly: '$0', yearly: '$0' },
12
- description: 'For side projects and experimentation.',
13
- features: [
14
- 'Up to 3 projects',
15
- '1 GB storage',
16
- 'Community support',
17
- 'Basic analytics',
18
- ],
19
- cta: 'Get Started',
20
- highlighted: false,
21
- },
22
- {
23
- name: 'Pro',
24
- price: { monthly: '$29', yearly: '$24' },
25
- description: 'For growing teams that need more power.',
26
- features: [
27
- 'Unlimited projects',
28
- '100 GB storage',
29
- 'Priority support',
30
- 'Advanced analytics',
31
- 'Custom domains',
32
- 'Team roles',
33
- ],
34
- cta: 'Start Free Trial',
35
- highlighted: true,
36
- },
37
- {
38
- name: 'Enterprise',
39
- price: { monthly: 'Custom', yearly: 'Custom' },
40
- description: 'For organizations with advanced needs.',
41
- features: [
42
- 'Everything in Pro',
43
- 'Unlimited storage',
44
- 'Dedicated support engineer',
45
- 'SSO / SAML',
46
- 'SLA guarantees',
47
- 'Audit logs',
48
- ],
49
- cta: 'Contact Sales',
50
- highlighted: false,
51
- },
52
- ]
7
+ import personalize from '@/personalize.json'
53
8
 
54
9
  export function PricingSection() {
55
10
  const [yearly, setYearly] = React.useState(false)
11
+ const { pricing } = personalize
56
12
 
57
13
  return (
58
- <section className="py-24 sm:py-32">
14
+ <section id="pricing" className="relative bg-background py-24 sm:py-32">
59
15
  <div className="mx-auto max-w-6xl px-6 lg:px-8">
60
16
  <div className="mx-auto max-w-2xl text-center">
61
- <h2 className="text-3xl font-semibold tracking-tight text-foreground sm:text-4xl">
62
- Simple, transparent pricing
17
+ <p className="text-sm font-semibold uppercase tracking-wider text-primary">
18
+ {pricing.eyebrow}
19
+ </p>
20
+ <h2 className="mt-3 text-4xl font-bold tracking-tight text-foreground sm:text-5xl">
21
+ {pricing.headline}
63
22
  </h2>
64
- <p className="mt-4 text-lg leading-relaxed text-muted-foreground">
65
- Choose your plan. Start free, upgrade when you are ready.
23
+ <p className="mt-6 text-lg leading-relaxed text-muted-foreground">
24
+ {pricing.subheadline}
66
25
  </p>
26
+ </div>
67
27
 
68
- {/* Pill toggle */}
69
- <div className="relative mt-8 inline-flex items-center rounded-full border bg-muted/50 p-1 dark:bg-muted/20">
70
- {/* Sliding indicator */}
71
- <div
72
- className={cn(
73
- 'absolute inset-y-1 w-[calc(50%-4px)] rounded-full bg-primary shadow-sm transition-transform duration-200 ease-out',
74
- yearly ? 'translate-x-[calc(100%+4px)]' : 'translate-x-0.5'
75
- )}
76
- />
28
+ <div className="mt-12 flex justify-center">
29
+ <div className="inline-flex items-center rounded-full border border-border/50 bg-muted/50 p-1 shadow-sm">
77
30
  <button
78
31
  type="button"
79
32
  onClick={() => setYearly(false)}
80
33
  className={cn(
81
- 'relative z-10 rounded-full px-5 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',
82
- !yearly
83
- ? 'text-primary-foreground'
84
- : 'text-muted-foreground hover:text-foreground'
34
+ 'rounded-full px-5 py-2 text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',
35
+ !yearly ? 'bg-primary text-primary-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground',
85
36
  )}
86
37
  >
87
- Monthly
38
+ {pricing.toggleMonthly}
88
39
  </button>
89
40
  <button
90
41
  type="button"
91
42
  onClick={() => setYearly(true)}
92
43
  className={cn(
93
- 'relative z-10 inline-flex items-center gap-2 rounded-full px-5 py-2 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',
94
- yearly
95
- ? 'text-primary-foreground'
96
- : 'text-muted-foreground hover:text-foreground'
44
+ 'inline-flex items-center gap-2 rounded-full px-5 py-2 text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',
45
+ yearly ? 'bg-primary text-primary-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground',
97
46
  )}
98
47
  >
99
- Yearly
100
- {!yearly && <span className="text-xs font-medium text-primary">Save 20%</span>}
48
+ {pricing.toggleYearly}
49
+ {!yearly && (
50
+ <span className="rounded-full bg-primary/10 px-2 py-0.5 text-xs font-semibold text-primary">
51
+ {pricing.yearlyDiscount}
52
+ </span>
53
+ )}
101
54
  </button>
102
55
  </div>
103
56
  </div>
104
57
 
105
- <div className="mx-auto mt-16 grid max-w-5xl items-start gap-8 lg:grid-cols-3">
106
- {tiers.map((tier) => (
58
+ <div className="mt-16 grid gap-8 lg:grid-cols-3 lg:gap-6">
59
+ {pricing.tiers.map((tier) => (
107
60
  <div
108
61
  key={tier.name}
109
62
  className={cn(
110
- 'flex flex-col rounded-xl border p-8',
63
+ 'relative rounded-2xl bg-card p-8 transition-all',
111
64
  tier.highlighted
112
- ? 'relative z-10 border-2 border-primary bg-gradient-to-b from-primary/5 to-transparent shadow-2xl shadow-primary/10 ring-1 ring-primary/20 lg:scale-105'
113
- : 'border-border/50 bg-card shadow-sm'
65
+ ? 'border-2 border-primary bg-gradient-to-b from-primary/5 to-transparent shadow-2xl shadow-primary/10 ring-1 ring-primary/20 lg:scale-105'
66
+ : 'border border-border/50 shadow-sm hover:shadow-md',
114
67
  )}
115
68
  >
116
69
  {tier.highlighted && (
117
- <div className="absolute -top-4 left-1/2 -translate-x-1/2 rounded-full bg-primary px-4 py-1 text-xs font-medium text-primary-foreground">
118
- Most Popular
70
+ <div className="absolute -top-4 left-1/2 -translate-x-1/2">
71
+ <span className="rounded-full bg-primary px-4 py-1 text-xs font-semibold uppercase tracking-wider text-primary-foreground shadow-md">
72
+ Most Popular
73
+ </span>
119
74
  </div>
120
75
  )}
121
76
 
122
77
  <div className="space-y-8">
123
78
  <div>
124
- <h3 className="text-lg font-semibold text-foreground">
125
- {tier.name}
126
- </h3>
127
- <p className="mt-1 text-sm text-muted-foreground">
128
- {tier.description}
129
- </p>
79
+ <h3 className="text-lg font-semibold text-foreground">{tier.name}</h3>
80
+ <p className="mt-2 text-sm text-muted-foreground">{tier.description}</p>
130
81
  </div>
131
82
 
132
83
  <div className="flex items-baseline gap-1">
133
84
  <span className="text-5xl font-bold tracking-tight text-foreground">
134
- {yearly ? tier.price.yearly : tier.price.monthly}
85
+ {tier.price}
135
86
  </span>
136
- {tier.price.monthly !== 'Custom' && (
137
- <span className="text-sm text-muted-foreground">/mo</span>
87
+ {tier.period && (
88
+ <span className="text-sm font-medium text-muted-foreground">
89
+ {tier.period}
90
+ </span>
138
91
  )}
139
92
  </div>
140
93
 
141
94
  <ul className="space-y-4">
142
95
  {tier.features.map((feature) => (
143
- <li key={feature} className="flex items-start gap-2.5 text-sm">
96
+ <li key={feature} className="flex items-start gap-3">
144
97
  <span className="mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary/10">
145
98
  <Check className="h-3 w-3 text-primary" />
146
99
  </span>
147
- <span className="text-muted-foreground">{feature}</span>
100
+ <span className="text-sm text-foreground">{feature}</span>
148
101
  </li>
149
102
  ))}
150
103
  </ul>
@@ -154,15 +107,13 @@ export function PricingSection() {
154
107
  variant={tier.highlighted ? 'default' : 'outline'}
155
108
  className={cn(
156
109
  'h-12 w-full rounded-lg font-medium transition-transform hover:scale-[1.02] active:scale-[0.98] focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',
157
- tier.highlighted && 'shadow-lg shadow-primary/25'
110
+ tier.highlighted ? 'shadow-lg shadow-primary/25' : 'border-2',
158
111
  )}
159
112
  >
160
113
  {tier.cta}
161
114
  </Button>
162
- {tier.name === 'Free' && (
163
- <p className="mt-3 text-center text-xs text-muted-foreground">
164
- No credit card required
165
- </p>
115
+ {tier.note && (
116
+ <p className="mt-3 text-center text-xs text-muted-foreground">{tier.note}</p>
166
117
  )}
167
118
  </div>
168
119
  </div>