@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.
- package/dist/lib/compose.js +2 -0
- package/dist/lib/compose.js.map +1 -1
- package/dist/lib/index.d.ts +3 -1
- package/dist/lib/index.js +2 -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 +5 -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 +1 -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
|
@@ -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
|
-
<
|
|
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
|
-
|
|
69
|
-
<div className="
|
|
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
|
-
'
|
|
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
|
-
|
|
38
|
+
{pricing.toggleMonthly}
|
|
88
39
|
</button>
|
|
89
40
|
<button
|
|
90
41
|
type="button"
|
|
91
42
|
onClick={() => setYearly(true)}
|
|
92
43
|
className={cn(
|
|
93
|
-
'
|
|
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
|
-
|
|
100
|
-
{!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
|
+
)}
|
|
101
54
|
</button>
|
|
102
55
|
</div>
|
|
103
56
|
</div>
|
|
104
57
|
|
|
105
|
-
<div className="
|
|
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
|
-
'
|
|
63
|
+
'relative rounded-2xl bg-card p-8 transition-all',
|
|
111
64
|
tier.highlighted
|
|
112
|
-
? '
|
|
113
|
-
: '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',
|
|
114
67
|
)}
|
|
115
68
|
>
|
|
116
69
|
{tier.highlighted && (
|
|
117
|
-
<div className="absolute -top-4 left-1/2 -translate-x-1/2
|
|
118
|
-
|
|
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
|
-
|
|
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
|
-
{
|
|
85
|
+
{tier.price}
|
|
135
86
|
</span>
|
|
136
|
-
{tier.
|
|
137
|
-
<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>
|
|
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-
|
|
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-
|
|
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
|
|
110
|
+
tier.highlighted ? 'shadow-lg shadow-primary/25' : 'border-2',
|
|
158
111
|
)}
|
|
159
112
|
>
|
|
160
113
|
{tier.cta}
|
|
161
114
|
</Button>
|
|
162
|
-
{tier.
|
|
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>
|
package/registry/layers/capability/layout-landing/variants/dark-product/features-section.tsx
CHANGED
|
@@ -1,79 +1,75 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as Icons from 'lucide-react'
|
|
2
|
+
import type { LucideIcon } from 'lucide-react'
|
|
3
|
+
import personalize from '@/personalize.json'
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
description:
|
|
8
|
-
'Optimized for speed with edge-first architecture. Sub-second response times out of the box with automatic CDN distribution.',
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
icon: Shield,
|
|
12
|
-
title: 'Secure by Default',
|
|
13
|
-
description:
|
|
14
|
-
'Enterprise-grade security with end-to-end encryption, SOC 2 compliance, and role-based access controls baked into every layer.',
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
icon: BarChart3,
|
|
18
|
-
title: 'Built-in Analytics',
|
|
19
|
-
description:
|
|
20
|
-
'Real-time dashboards and custom reports so you always know what is working. Track every metric that matters to your business.',
|
|
21
|
-
},
|
|
22
|
-
]
|
|
23
|
-
|
|
24
|
-
const secondaryFeatures = [
|
|
25
|
-
{ icon: Layers, label: 'Composable modules — pick only the pieces you need' },
|
|
26
|
-
{ icon: Globe, label: 'Deploy to 30+ regions with a single command' },
|
|
27
|
-
{ icon: Lock, label: 'SSO, SAML, and audit logs for compliance' },
|
|
28
|
-
]
|
|
5
|
+
function getIcon(name: string): LucideIcon {
|
|
6
|
+
const Icon = (Icons as unknown as Record<string, LucideIcon>)[name]
|
|
7
|
+
return Icon ?? Icons.Sparkles
|
|
8
|
+
}
|
|
29
9
|
|
|
30
10
|
export function FeaturesSection() {
|
|
11
|
+
const { features } = personalize
|
|
31
12
|
return (
|
|
32
|
-
<section className="bg-
|
|
13
|
+
<section id="features" className="relative bg-background py-24 sm:py-32">
|
|
33
14
|
<div className="mx-auto max-w-6xl px-6 lg:px-8">
|
|
34
15
|
<div className="mx-auto max-w-2xl text-center">
|
|
35
|
-
<
|
|
36
|
-
|
|
16
|
+
<p className="text-sm font-semibold uppercase tracking-wider text-primary">
|
|
17
|
+
{features.eyebrow}
|
|
18
|
+
</p>
|
|
19
|
+
<h2 className="mt-3 text-4xl font-bold tracking-tight text-foreground sm:text-5xl">
|
|
20
|
+
{features.headline}
|
|
37
21
|
</h2>
|
|
38
|
-
<p className="mt-
|
|
39
|
-
|
|
22
|
+
<p className="mt-6 text-lg leading-relaxed text-muted-foreground">
|
|
23
|
+
{features.subheadline}
|
|
40
24
|
</p>
|
|
41
25
|
</div>
|
|
42
26
|
|
|
43
|
-
<div className="
|
|
44
|
-
{
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
27
|
+
<div className="mt-20 grid gap-6 sm:grid-cols-2 lg:grid-cols-3">
|
|
28
|
+
{features.primary.map((feature, i) => {
|
|
29
|
+
const Icon = getIcon(feature.icon)
|
|
30
|
+
return (
|
|
31
|
+
<div
|
|
32
|
+
key={feature.title}
|
|
33
|
+
className="group relative overflow-hidden rounded-xl border border-border/50 bg-card p-8 shadow-sm transition-all duration-200 hover:border-border hover:shadow-md"
|
|
34
|
+
style={{ animation: `fadeInUp 0.6s ease ${i * 0.15}s both` }}
|
|
35
|
+
>
|
|
36
|
+
<div className="absolute inset-x-0 top-0 h-px bg-gradient-to-r from-transparent via-primary/50 to-transparent" />
|
|
37
|
+
<div className="flex h-11 w-11 items-center justify-center rounded-lg bg-gradient-to-br from-primary/20 to-primary/5 text-primary">
|
|
38
|
+
<Icon className="h-5 w-5" />
|
|
39
|
+
</div>
|
|
40
|
+
<h3 className="mt-6 text-lg font-semibold text-foreground">{feature.title}</h3>
|
|
41
|
+
<p className="mt-3 text-sm leading-relaxed text-muted-foreground">
|
|
42
|
+
{feature.description}
|
|
43
|
+
</p>
|
|
51
44
|
</div>
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
</h3>
|
|
55
|
-
<p className="mt-2 text-sm leading-relaxed text-zinc-400">
|
|
56
|
-
{feature.description}
|
|
57
|
-
</p>
|
|
58
|
-
</div>
|
|
59
|
-
))}
|
|
45
|
+
)
|
|
46
|
+
})}
|
|
60
47
|
</div>
|
|
61
48
|
|
|
62
|
-
<div className="
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
49
|
+
<div className="mt-16 grid gap-8 border-t border-border/50 pt-16 sm:grid-cols-3">
|
|
50
|
+
{features.secondary.map((feature) => {
|
|
51
|
+
const Icon = getIcon(feature.icon)
|
|
52
|
+
return (
|
|
53
|
+
<div key={feature.title} className="flex gap-4">
|
|
54
|
+
<div className="flex h-10 w-10 shrink-0 items-center justify-center rounded-lg bg-muted text-foreground">
|
|
55
|
+
<Icon className="h-4 w-4" />
|
|
56
|
+
</div>
|
|
57
|
+
<div>
|
|
58
|
+
<h4 className="text-sm font-semibold text-foreground">{feature.title}</h4>
|
|
59
|
+
<p className="mt-1 text-sm text-muted-foreground">{feature.description}</p>
|
|
68
60
|
</div>
|
|
69
|
-
<p className="text-sm leading-snug text-zinc-400">
|
|
70
|
-
{feature.label}
|
|
71
|
-
</p>
|
|
72
61
|
</div>
|
|
73
|
-
)
|
|
74
|
-
|
|
62
|
+
)
|
|
63
|
+
})}
|
|
75
64
|
</div>
|
|
76
65
|
</div>
|
|
66
|
+
|
|
67
|
+
<style>{`
|
|
68
|
+
@keyframes fadeInUp {
|
|
69
|
+
from { opacity: 0; transform: translateY(20px); }
|
|
70
|
+
to { opacity: 1; transform: translateY(0); }
|
|
71
|
+
}
|
|
72
|
+
`}</style>
|
|
77
73
|
</section>
|
|
78
74
|
)
|
|
79
75
|
}
|
|
@@ -1,78 +1,106 @@
|
|
|
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 overflow-hidden bg-
|
|
8
|
+
<section className="relative overflow-hidden bg-background">
|
|
7
9
|
<div
|
|
8
10
|
aria-hidden="true"
|
|
9
|
-
className="absolute inset-0 bg-[
|
|
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"
|
|
10
20
|
/>
|
|
11
21
|
|
|
12
|
-
<div className="relative
|
|
13
|
-
<div className="
|
|
14
|
-
<div className="
|
|
15
|
-
|
|
16
|
-
|
|
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>
|
|
17
28
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
29
|
+
<h1 className="mt-8 text-5xl font-bold tracking-tighter text-foreground sm:text-6xl lg:text-7xl">
|
|
30
|
+
{hero.headline}
|
|
31
|
+
</h1>
|
|
21
32
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
</p>
|
|
33
|
+
<p className="mt-6 max-w-xl text-lg leading-relaxed text-muted-foreground">
|
|
34
|
+
{hero.subheadline}
|
|
35
|
+
</p>
|
|
26
36
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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>
|
|
44
54
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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>
|
|
52
68
|
</div>
|
|
53
69
|
|
|
54
|
-
<div className="
|
|
55
|
-
<div
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
70
|
+
<div className="relative mx-auto w-full max-w-lg lg:mx-0">
|
|
71
|
+
<div
|
|
72
|
+
aria-hidden="true"
|
|
73
|
+
className="pointer-events-none absolute -inset-4 rounded-2xl bg-primary/10 blur-2xl"
|
|
74
|
+
/>
|
|
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' }}
|
|
60
92
|
/>
|
|
61
|
-
|
|
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>
|
|
62
100
|
</div>
|
|
63
|
-
<p className="text-sm font-medium text-zinc-500">
|
|
64
|
-
Trusted by <span className="text-zinc-300">1,000+</span> teams
|
|
65
|
-
</p>
|
|
66
101
|
</div>
|
|
67
102
|
</div>
|
|
68
103
|
</div>
|
|
69
|
-
|
|
70
|
-
<div
|
|
71
|
-
aria-hidden="true"
|
|
72
|
-
className="absolute inset-x-0 -top-40 -z-10 transform-gpu overflow-hidden blur-3xl sm:-top-80"
|
|
73
|
-
>
|
|
74
|
-
<div className="relative left-[calc(50%-11rem)] aspect-[1155/678] w-[36.125rem] -translate-x-1/2 rotate-[30deg] bg-gradient-to-tr from-emerald-500 to-emerald-500/30 opacity-10 sm:left-[calc(50%-30rem)] sm:w-[72.1875rem]" />
|
|
75
|
-
</div>
|
|
76
104
|
</section>
|
|
77
105
|
)
|
|
78
106
|
}
|