@tangle-network/starter-foundry 0.1.0 → 0.3.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.
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -1
- package/dist/lib/agent-context.d.ts +43 -0
- package/dist/lib/agent-context.js +63 -0
- package/dist/lib/agent-context.js.map +1 -0
- package/dist/lib/compose-prompt.d.ts +50 -0
- package/dist/lib/compose-prompt.js +68 -0
- package/dist/lib/compose-prompt.js.map +1 -0
- package/dist/lib/compose.js +2 -0
- package/dist/lib/compose.js.map +1 -1
- package/dist/lib/index.d.ts +6 -1
- package/dist/lib/index.js +4 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/industries.d.ts +33 -0
- package/dist/lib/industries.js +52 -0
- package/dist/lib/industries.js.map +1 -0
- package/dist/lib/keywords.d.ts +6 -0
- package/dist/lib/keywords.js +21 -0
- package/dist/lib/keywords.js.map +1 -1
- package/dist/lib/prompt-planner.js +21 -1
- package/dist/lib/prompt-planner.js.map +1 -1
- package/dist/lib/telemetry.d.ts +1 -0
- package/dist/lib/telemetry.js.map +1 -1
- package/package.json +4 -1
- package/registry/layers/capability/layout-landing/files/features-section.tsx +54 -77
- package/registry/layers/capability/layout-landing/files/hero-section.tsx +18 -23
- package/registry/layers/capability/layout-landing/files/landing-page.tsx +25 -63
- package/registry/layers/capability/layout-landing/files/personalize.json +146 -0
- package/registry/layers/capability/layout-landing/files/pricing-section.tsx +45 -94
- package/registry/layers/capability/layout-landing/manifest.json +4 -0
- package/registry/layers/capability/layout-landing/variants/dark-product/features-section.tsx +55 -59
- package/registry/layers/capability/layout-landing/variants/dark-product/hero-section.tsx +83 -55
- package/registry/layers/capability/layout-landing/variants/dark-product/landing-page.tsx +25 -63
- package/registry/layers/capability/layout-landing/variants/dark-product/personalize.json +53 -0
- package/registry/layers/capability/layout-landing/variants/dark-product/pricing-section.tsx +51 -91
- package/registry/layers/capability/layout-landing/variants/default/features-section.tsx +54 -77
- package/registry/layers/capability/layout-landing/variants/default/hero-section.tsx +18 -23
- package/registry/layers/capability/layout-landing/variants/default/landing-page.tsx +25 -63
- package/registry/layers/capability/layout-landing/variants/default/personalize.json +146 -0
- package/registry/layers/capability/layout-landing/variants/default/pricing-section.tsx +45 -94
- package/registry/layers/capability/layout-landing/variants/gradient-hero/features-section.tsx +53 -57
- package/registry/layers/capability/layout-landing/variants/gradient-hero/hero-section.tsx +86 -53
- package/registry/layers/capability/layout-landing/variants/gradient-hero/landing-page.tsx +25 -63
- package/registry/layers/capability/layout-landing/variants/gradient-hero/personalize.json +53 -0
- package/registry/layers/capability/layout-landing/variants/gradient-hero/pricing-section.tsx +49 -88
- package/registry/layers/capability/layout-landing/variants/minimal-clean/features-section.tsx +53 -51
- package/registry/layers/capability/layout-landing/variants/minimal-clean/hero-section.tsx +88 -47
- package/registry/layers/capability/layout-landing/variants/minimal-clean/landing-page.tsx +25 -63
- package/registry/layers/capability/layout-landing/variants/minimal-clean/personalize.json +53 -0
- package/registry/layers/capability/layout-landing/variants/minimal-clean/pricing-section.tsx +51 -87
- package/registry/layers/framework/nextjs-app-router/files/layout.tsx +1 -0
- package/registry/layers/framework/nextjs-app-router/files/personalize.css +1 -0
- package/registry/layers/framework/nextjs-app-router/manifest.json +4 -0
- package/registry/layers/framework/react-vite-ts/files/main.ts +1 -0
- package/registry/layers/framework/react-vite-ts/files/personalize.css +1 -0
- package/registry/layers/framework/react-vite-ts/manifest.json +4 -0
- package/registry/layers/industry/creative/files/personalize.css +11 -0
- package/registry/layers/industry/creative/manifest.json +39 -0
- package/registry/layers/industry/crypto/files/personalize.css +11 -0
- package/registry/layers/industry/crypto/manifest.json +41 -0
- package/registry/layers/industry/ecommerce/files/personalize.css +11 -0
- package/registry/layers/industry/ecommerce/manifest.json +39 -0
- package/registry/layers/industry/education/files/personalize.css +11 -0
- package/registry/layers/industry/education/manifest.json +39 -0
- package/registry/layers/industry/finance/files/personalize.css +11 -0
- package/registry/layers/industry/finance/manifest.json +39 -0
- package/registry/layers/industry/fitness/files/personalize.css +11 -0
- package/registry/layers/industry/fitness/manifest.json +43 -0
- package/registry/layers/industry/gaming/files/personalize.css +11 -0
- package/registry/layers/industry/gaming/manifest.json +39 -0
- package/registry/layers/industry/health/files/personalize.css +11 -0
- package/registry/layers/industry/health/manifest.json +39 -0
- package/registry/layers/industry/restaurant/files/personalize.css +11 -0
- package/registry/layers/industry/restaurant/manifest.json +41 -0
- package/registry/layers/industry/saas/files/personalize.css +11 -0
- package/registry/layers/industry/saas/manifest.json +39 -0
|
@@ -1,71 +1,104 @@
|
|
|
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
|
-
<section className="relative
|
|
8
|
+
<section className="relative overflow-hidden bg-background">
|
|
7
9
|
<div
|
|
8
10
|
aria-hidden="true"
|
|
9
|
-
className="absolute inset-0 -
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
11
|
+
className="pointer-events-none absolute inset-0 bg-[radial-gradient(ellipse_80%_50%_at_50%_-20%,hsl(var(--primary)/0.08),transparent)]"
|
|
12
|
+
/>
|
|
13
|
+
<div
|
|
14
|
+
aria-hidden="true"
|
|
15
|
+
className="pointer-events-none absolute -right-40 -top-40 h-[500px] w-[500px] rounded-full bg-primary/15 blur-3xl"
|
|
16
|
+
/>
|
|
17
|
+
<div
|
|
18
|
+
aria-hidden="true"
|
|
19
|
+
className="pointer-events-none absolute -bottom-40 -left-40 h-[400px] w-[400px] rounded-full bg-chart-2/15 blur-3xl"
|
|
20
|
+
/>
|
|
15
21
|
|
|
16
|
-
<div className="relative
|
|
17
|
-
<div className="
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
<div className="relative mx-auto max-w-6xl px-6 py-28 sm:py-36 lg:px-8 lg:py-44">
|
|
23
|
+
<div className="grid items-center gap-12 lg:grid-cols-2 lg:gap-16">
|
|
24
|
+
<div className="flex flex-col items-center text-center lg:items-start lg:text-left">
|
|
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}
|
|
27
|
+
</div>
|
|
20
28
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
29
|
+
<h1 className="mt-8 text-5xl font-bold tracking-tighter text-foreground sm:text-6xl lg:text-7xl">
|
|
30
|
+
{hero.headline}
|
|
31
|
+
</h1>
|
|
24
32
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
</p>
|
|
33
|
+
<p className="mt-6 max-w-xl text-lg leading-relaxed text-muted-foreground">
|
|
34
|
+
{hero.subheadline}
|
|
35
|
+
</p>
|
|
29
36
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
37
|
+
<div className="mt-10 flex flex-wrap items-center justify-center gap-4 lg:justify-start">
|
|
38
|
+
<Button
|
|
39
|
+
size="lg"
|
|
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"
|
|
41
|
+
>
|
|
42
|
+
{hero.ctaPrimary}
|
|
43
|
+
<ArrowRight className="h-4 w-4" />
|
|
44
|
+
</Button>
|
|
45
|
+
<Button
|
|
46
|
+
size="lg"
|
|
47
|
+
variant="outline"
|
|
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"
|
|
49
|
+
>
|
|
50
|
+
<Play className="h-4 w-4" />
|
|
51
|
+
{hero.ctaSecondary}
|
|
52
|
+
</Button>
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
<div className="mt-12 flex items-center gap-3">
|
|
56
|
+
<div className="flex -space-x-2">
|
|
57
|
+
{['bg-primary', 'bg-chart-1', 'bg-chart-2', 'bg-chart-3', 'bg-chart-4'].map((color, i) => (
|
|
58
|
+
<div
|
|
59
|
+
key={i}
|
|
60
|
+
className={`h-8 w-8 rounded-full border-2 border-background ${color}`}
|
|
61
|
+
/>
|
|
62
|
+
))}
|
|
63
|
+
</div>
|
|
64
|
+
<p className="text-sm font-medium text-muted-foreground">
|
|
65
|
+
{trust.label}
|
|
66
|
+
</p>
|
|
67
|
+
</div>
|
|
68
|
+
</div>
|
|
47
69
|
|
|
48
|
-
|
|
49
|
-
{Array.from({ length: 5 }).map((_, i) => (
|
|
70
|
+
<div className="relative mx-auto w-full max-w-lg lg:mx-0">
|
|
50
71
|
<div
|
|
51
|
-
|
|
52
|
-
className="
|
|
72
|
+
aria-hidden="true"
|
|
73
|
+
className="pointer-events-none absolute -inset-4 rounded-2xl bg-primary/10 blur-2xl"
|
|
53
74
|
/>
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
75
|
+
<div className="relative overflow-hidden rounded-xl border border-border/50 bg-card shadow-2xl shadow-primary/5">
|
|
76
|
+
<div className="flex items-center gap-2 border-b border-border/50 bg-muted/50 px-4 py-3">
|
|
77
|
+
<div className="flex items-center gap-1.5">
|
|
78
|
+
<div className="h-3 w-3 rounded-full bg-red-400/80" />
|
|
79
|
+
<div className="h-3 w-3 rounded-full bg-yellow-400/80" />
|
|
80
|
+
<div className="h-3 w-3 rounded-full bg-green-400/80" />
|
|
81
|
+
</div>
|
|
82
|
+
<div className="ml-3 flex-1 rounded-md bg-background/80 px-3 py-1 text-xs text-muted-foreground">
|
|
83
|
+
{personalize.brand.name.toLowerCase()}.com
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
<div className="relative aspect-[4/3]">
|
|
87
|
+
<img
|
|
88
|
+
src="/images/hero-product.png"
|
|
89
|
+
alt={`${personalize.brand.name} product screenshot`}
|
|
90
|
+
className="h-full w-full object-cover"
|
|
91
|
+
onError={(e) => { e.currentTarget.style.display = 'none' }}
|
|
92
|
+
/>
|
|
93
|
+
<div className="absolute inset-0 flex items-center justify-center bg-gradient-to-br from-primary/10 to-accent/10">
|
|
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>
|
|
98
|
+
</div>
|
|
99
|
+
</div>
|
|
100
|
+
</div>
|
|
65
101
|
</div>
|
|
66
|
-
<p className="text-sm font-medium text-white/70">
|
|
67
|
-
Trusted by <span className="text-white">1,000+</span> teams
|
|
68
|
-
</p>
|
|
69
102
|
</div>
|
|
70
103
|
</div>
|
|
71
104
|
</section>
|
|
@@ -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=
|
|
23
|
+
alt={brand.name}
|
|
57
24
|
className="h-8 w-auto"
|
|
58
25
|
onError={(e) => { e.currentTarget.style.display = 'none' }}
|
|
59
26
|
/>
|
|
60
|
-
<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
|
|
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
|
|
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
|
|
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
|
-
{
|
|
71
|
+
{trust.logoNames.map((name) => (
|
|
106
72
|
<span
|
|
107
73
|
key={name}
|
|
108
|
-
className="text-lg font-semibold tracking-tight text-muted-foreground/30
|
|
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
|
-
<
|
|
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
|
-
<
|
|
128
|
-
<PricingSection />
|
|
129
|
-
</section>
|
|
89
|
+
<PricingSection />
|
|
130
90
|
</main>
|
|
131
91
|
|
|
132
|
-
<footer className="border-t
|
|
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
|
|
135
|
-
|
|
136
|
-
<
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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:
|
|
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
|
-
© {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,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_meta": { "variant": "gradient-hero", "doc": "Bold gradient hero variant" },
|
|
3
|
+
"brand": { "name": "Aurora", "tagline": "Bold by design" },
|
|
4
|
+
"hero": {
|
|
5
|
+
"badge": "JUST LAUNCHED",
|
|
6
|
+
"headline": "Make something bold.",
|
|
7
|
+
"subheadline": "A vibrant, gradient-first design system for products that refuse to blend in.",
|
|
8
|
+
"ctaPrimary": "Start Building",
|
|
9
|
+
"ctaSecondary": "Watch the Demo"
|
|
10
|
+
},
|
|
11
|
+
"trust": {
|
|
12
|
+
"label": "Loved by 2,500+ creators",
|
|
13
|
+
"logoNames": ["Vivid", "Spectrum", "Prism", "Aurora", "Radiance", "Glow"]
|
|
14
|
+
},
|
|
15
|
+
"features": {
|
|
16
|
+
"eyebrow": "Why Aurora",
|
|
17
|
+
"headline": "Designed to stand out",
|
|
18
|
+
"subheadline": "Every detail crafted for impact and conversion.",
|
|
19
|
+
"primary": [
|
|
20
|
+
{ "icon": "Sparkles", "title": "Distinctive design", "description": "Eye-catching gradients and animations that grab attention immediately." },
|
|
21
|
+
{ "icon": "Rocket", "title": "Built for growth", "description": "Conversion-optimized components proven across thousands of launches." },
|
|
22
|
+
{ "icon": "Wand", "title": "Customize everything", "description": "Drop-in components that adapt to your brand without fighting you." }
|
|
23
|
+
],
|
|
24
|
+
"secondary": [
|
|
25
|
+
{ "icon": "Palette", "title": "Theme system", "description": "8 base palettes, infinite custom." },
|
|
26
|
+
{ "icon": "Layers", "title": "Composable", "description": "Mix any sections you need." },
|
|
27
|
+
{ "icon": "Heart", "title": "Crafted with love", "description": "Every pixel intentional." }
|
|
28
|
+
]
|
|
29
|
+
},
|
|
30
|
+
"pricing": {
|
|
31
|
+
"eyebrow": "Pricing",
|
|
32
|
+
"headline": "Fair pricing for builders",
|
|
33
|
+
"subheadline": "Free to start. Upgrade when you ship.",
|
|
34
|
+
"toggleMonthly": "Monthly",
|
|
35
|
+
"toggleYearly": "Yearly",
|
|
36
|
+
"yearlyDiscount": "Save 25%",
|
|
37
|
+
"tiers": [
|
|
38
|
+
{ "name": "Starter", "price": "$0", "period": "/mo", "description": "For solo builders", "features": ["3 projects", "Community support", "Aurora basics"], "cta": "Start free", "highlighted": false, "note": "Free forever" },
|
|
39
|
+
{ "name": "Creator", "price": "$24", "period": "/mo", "description": "For active builders", "features": ["Unlimited projects", "Priority support", "All Aurora themes", "Custom branding", "Export to React"], "cta": "Start trial", "highlighted": true },
|
|
40
|
+
{ "name": "Studio", "price": "$99", "period": "/mo", "description": "For teams and agencies", "features": ["Everything in Creator", "Unlimited team seats", "White-label rights", "Premium support", "Source files"], "cta": "Contact sales", "highlighted": false }
|
|
41
|
+
]
|
|
42
|
+
},
|
|
43
|
+
"footer": {
|
|
44
|
+
"tagline": "Design systems for the bold.",
|
|
45
|
+
"sections": {
|
|
46
|
+
"Product": [{ "label": "Features", "href": "#features" }, { "label": "Pricing", "href": "#pricing" }, { "label": "Showcase", "href": "/showcase" }, { "label": "Templates", "href": "/templates" }],
|
|
47
|
+
"Company": [{ "label": "About", "href": "/about" }, { "label": "Blog", "href": "/blog" }, { "label": "Careers", "href": "/careers" }, { "label": "Press", "href": "/press" }],
|
|
48
|
+
"Resources": [{ "label": "Docs", "href": "/docs" }, { "label": "Changelog", "href": "/changelog" }, { "label": "Community", "href": "/community" }, { "label": "Support", "href": "/support" }],
|
|
49
|
+
"Legal": [{ "label": "Privacy", "href": "/privacy" }, { "label": "Terms", "href": "/terms" }, { "label": "License", "href": "/license" }]
|
|
50
|
+
},
|
|
51
|
+
"copyright": "© 2026 Aurora Studio."
|
|
52
|
+
}
|
|
53
|
+
}
|
package/registry/layers/capability/layout-landing/variants/gradient-hero/pricing-section.tsx
CHANGED
|
@@ -4,137 +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="bg-
|
|
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
|
-
<
|
|
62
|
-
|
|
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-
|
|
65
|
-
|
|
23
|
+
<p className="mt-6 text-lg leading-relaxed text-muted-foreground">
|
|
24
|
+
{pricing.subheadline}
|
|
66
25
|
</p>
|
|
26
|
+
</div>
|
|
67
27
|
|
|
68
|
-
|
|
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">
|
|
69
30
|
<button
|
|
70
31
|
type="button"
|
|
71
32
|
onClick={() => setYearly(false)}
|
|
72
33
|
className={cn(
|
|
73
|
-
'rounded-full px-5 py-2 text-sm font-medium transition-
|
|
74
|
-
!yearly
|
|
75
|
-
? 'bg-gradient-to-r from-violet-600 to-blue-600 text-white shadow-sm'
|
|
76
|
-
: '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',
|
|
77
36
|
)}
|
|
78
37
|
>
|
|
79
|
-
|
|
38
|
+
{pricing.toggleMonthly}
|
|
80
39
|
</button>
|
|
81
40
|
<button
|
|
82
41
|
type="button"
|
|
83
42
|
onClick={() => setYearly(true)}
|
|
84
43
|
className={cn(
|
|
85
|
-
'inline-flex items-center gap-2 rounded-full px-5 py-2 text-sm font-medium transition-
|
|
86
|
-
yearly
|
|
87
|
-
? 'bg-gradient-to-r from-violet-600 to-blue-600 text-white shadow-sm'
|
|
88
|
-
: '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',
|
|
89
46
|
)}
|
|
90
47
|
>
|
|
91
|
-
|
|
92
|
-
{!yearly &&
|
|
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
|
+
)}
|
|
93
54
|
</button>
|
|
94
55
|
</div>
|
|
95
56
|
</div>
|
|
96
57
|
|
|
97
|
-
<div className="
|
|
98
|
-
{tiers.map((tier) => (
|
|
58
|
+
<div className="mt-16 grid gap-8 lg:grid-cols-3 lg:gap-6">
|
|
59
|
+
{pricing.tiers.map((tier) => (
|
|
99
60
|
<div
|
|
100
61
|
key={tier.name}
|
|
101
62
|
className={cn(
|
|
102
|
-
'
|
|
63
|
+
'relative rounded-2xl bg-card p-8 transition-all',
|
|
103
64
|
tier.highlighted
|
|
104
|
-
? '
|
|
105
|
-
: 'border-border/50'
|
|
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',
|
|
106
67
|
)}
|
|
107
68
|
>
|
|
108
69
|
{tier.highlighted && (
|
|
109
|
-
<div className="absolute -top-4 left-1/2 -translate-x-1/2
|
|
110
|
-
|
|
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>
|
|
111
74
|
</div>
|
|
112
75
|
)}
|
|
113
76
|
|
|
114
77
|
<div className="space-y-8">
|
|
115
78
|
<div>
|
|
116
|
-
<h3 className="text-lg font-semibold text-foreground">
|
|
117
|
-
|
|
118
|
-
</h3>
|
|
119
|
-
<p className="mt-1 text-sm text-muted-foreground">
|
|
120
|
-
{tier.description}
|
|
121
|
-
</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>
|
|
122
81
|
</div>
|
|
123
82
|
|
|
124
83
|
<div className="flex items-baseline gap-1">
|
|
125
84
|
<span className="text-5xl font-bold tracking-tight text-foreground">
|
|
126
|
-
{
|
|
85
|
+
{tier.price}
|
|
127
86
|
</span>
|
|
128
|
-
{tier.
|
|
129
|
-
<span className="text-sm text-muted-foreground"
|
|
87
|
+
{tier.period && (
|
|
88
|
+
<span className="text-sm font-medium text-muted-foreground">
|
|
89
|
+
{tier.period}
|
|
90
|
+
</span>
|
|
130
91
|
)}
|
|
131
92
|
</div>
|
|
132
93
|
|
|
133
94
|
<ul className="space-y-4">
|
|
134
95
|
{tier.features.map((feature) => (
|
|
135
|
-
<li key={feature} className="flex items-start gap-
|
|
136
|
-
<
|
|
137
|
-
|
|
96
|
+
<li key={feature} className="flex items-start gap-3">
|
|
97
|
+
<span className="mt-0.5 flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary/10">
|
|
98
|
+
<Check className="h-3 w-3 text-primary" />
|
|
99
|
+
</span>
|
|
100
|
+
<span className="text-sm text-foreground">{feature}</span>
|
|
138
101
|
</li>
|
|
139
102
|
))}
|
|
140
103
|
</ul>
|
|
@@ -143,16 +106,14 @@ export function PricingSection() {
|
|
|
143
106
|
<Button
|
|
144
107
|
variant={tier.highlighted ? 'default' : 'outline'}
|
|
145
108
|
className={cn(
|
|
146
|
-
'h-12 w-full rounded-lg font-medium transition-
|
|
147
|
-
tier.highlighted
|
|
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',
|
|
110
|
+
tier.highlighted ? 'shadow-lg shadow-primary/25' : 'border-2',
|
|
148
111
|
)}
|
|
149
112
|
>
|
|
150
113
|
{tier.cta}
|
|
151
114
|
</Button>
|
|
152
|
-
{tier.
|
|
153
|
-
<p className="mt-3 text-center text-xs text-muted-foreground">
|
|
154
|
-
No credit card required
|
|
155
|
-
</p>
|
|
115
|
+
{tier.note && (
|
|
116
|
+
<p className="mt-3 text-center text-xs text-muted-foreground">{tier.note}</p>
|
|
156
117
|
)}
|
|
157
118
|
</div>
|
|
158
119
|
</div>
|