@contractspec/bundle.marketing 3.7.5 → 3.7.7
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/.turbo/turbo-build.log +84 -84
- package/AGENTS.md +29 -21
- package/CHANGELOG.md +27 -0
- package/README.md +36 -49
- package/dist/browser/components/marketing/ChangelogPage.js +8 -8
- package/dist/browser/components/marketing/CofounderPage.js +167 -523
- package/dist/browser/components/marketing/ContactClient.js +200 -207
- package/dist/browser/components/marketing/ContributePage.js +211 -463
- package/dist/browser/components/marketing/DesignPartnerPage.js +165 -218
- package/dist/browser/components/marketing/LandingPage.js +464 -568
- package/dist/browser/components/marketing/PricingClient.js +213 -839
- package/dist/browser/components/marketing/ProductClientPage.js +265 -463
- package/dist/browser/components/marketing/index.js +2007 -3338
- package/dist/browser/components/marketing/pricing-thinking-modal.js +12 -12
- package/dist/browser/components/marketing/sections/AudienceSection.js +2 -2
- package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/browser/components/marketing/sections/CtaSection.js +3 -3
- package/dist/browser/components/marketing/sections/FearsSection.js +3 -3
- package/dist/browser/components/marketing/sections/HeroMarketingSection.js +6 -6
- package/dist/browser/components/marketing/sections/IconGridSection.js +2 -2
- package/dist/browser/components/marketing/sections/OutputsSection.js +2 -2
- package/dist/browser/components/marketing/sections/ProblemSection.js +2 -2
- package/dist/browser/components/marketing/sections/SolutionSection.js +2 -2
- package/dist/browser/components/marketing/sections/StepsSection.js +4 -4
- package/dist/browser/components/marketing/studio-signup-section.js +25 -41
- package/dist/browser/components/templates/TemplatesClientPage.js +2324 -3578
- package/dist/browser/components/templates/TemplatesPage.js +1 -1
- package/dist/browser/components/templates/TemplatesPreviewModal.js +3 -3
- package/dist/browser/components/templates/index.js +2361 -3615
- package/dist/browser/index.js +2363 -3617
- package/dist/browser/libs/email/client.js +1 -1
- package/dist/browser/libs/email/contact.js +1 -1
- package/dist/browser/libs/email/newsletter.js +1 -1
- package/dist/browser/libs/email/waitlist-application.js +1 -1
- package/dist/browser/libs/email/waitlist.js +1 -1
- package/dist/browser/registry/engine.js +2003 -3334
- package/dist/browser/registry/index.js +2003 -3334
- package/dist/browser/registry/registry-docs.js +2 -2
- package/dist/browser/registry/registry-landing.js +2007 -3338
- package/dist/browser/registry/registry.js +2003 -3334
- package/dist/browser/registry/utils.js +2003 -3334
- package/dist/components/marketing/ChangelogPage.js +8 -8
- package/dist/components/marketing/CofounderPage.js +167 -523
- package/dist/components/marketing/ContactClient.js +200 -207
- package/dist/components/marketing/ContributePage.d.ts +0 -2
- package/dist/components/marketing/ContributePage.js +211 -463
- package/dist/components/marketing/DesignPartnerPage.js +165 -218
- package/dist/components/marketing/LandingPage.js +464 -568
- package/dist/components/marketing/PricingClient.js +213 -839
- package/dist/components/marketing/ProductClientPage.js +265 -463
- package/dist/components/marketing/index.d.ts +5 -5
- package/dist/components/marketing/index.js +2007 -3338
- package/dist/components/marketing/pricing-thinking-modal.js +12 -12
- package/dist/components/marketing/sections/AudienceSection.js +2 -2
- package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/components/marketing/sections/CtaSection.js +3 -3
- package/dist/components/marketing/sections/FearsSection.js +3 -3
- package/dist/components/marketing/sections/HeroMarketingSection.js +6 -6
- package/dist/components/marketing/sections/IconGridSection.d.ts +3 -3
- package/dist/components/marketing/sections/IconGridSection.js +2 -2
- package/dist/components/marketing/sections/OutputsSection.js +2 -2
- package/dist/components/marketing/sections/ProblemSection.js +2 -2
- package/dist/components/marketing/sections/SolutionSection.js +2 -2
- package/dist/components/marketing/sections/StepsSection.js +4 -4
- package/dist/components/marketing/studio-signup-section.js +25 -41
- package/dist/components/templates/TemplatesClientPage.js +2324 -3578
- package/dist/components/templates/TemplatesPage.js +1 -1
- package/dist/components/templates/TemplatesPreviewModal.js +3 -3
- package/dist/components/templates/index.js +2361 -3615
- package/dist/index.js +2363 -3617
- package/dist/libs/email/client.js +1 -1
- package/dist/libs/email/contact.js +1 -1
- package/dist/libs/email/newsletter.js +1 -1
- package/dist/libs/email/waitlist-application.js +1 -1
- package/dist/libs/email/waitlist.js +1 -1
- package/dist/node/components/marketing/ChangelogPage.js +8 -8
- package/dist/node/components/marketing/CofounderPage.js +167 -523
- package/dist/node/components/marketing/ContactClient.js +200 -207
- package/dist/node/components/marketing/ContributePage.js +211 -463
- package/dist/node/components/marketing/DesignPartnerPage.js +165 -218
- package/dist/node/components/marketing/LandingPage.js +464 -568
- package/dist/node/components/marketing/PricingClient.js +213 -839
- package/dist/node/components/marketing/ProductClientPage.js +265 -463
- package/dist/node/components/marketing/index.js +2007 -3338
- package/dist/node/components/marketing/pricing-thinking-modal.js +12 -12
- package/dist/node/components/marketing/sections/AudienceSection.js +2 -2
- package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/node/components/marketing/sections/CtaSection.js +3 -3
- package/dist/node/components/marketing/sections/FearsSection.js +3 -3
- package/dist/node/components/marketing/sections/HeroMarketingSection.js +6 -6
- package/dist/node/components/marketing/sections/IconGridSection.js +2 -2
- package/dist/node/components/marketing/sections/OutputsSection.js +2 -2
- package/dist/node/components/marketing/sections/ProblemSection.js +2 -2
- package/dist/node/components/marketing/sections/SolutionSection.js +2 -2
- package/dist/node/components/marketing/sections/StepsSection.js +4 -4
- package/dist/node/components/marketing/studio-signup-section.js +25 -41
- package/dist/node/components/templates/TemplatesClientPage.js +2324 -3578
- package/dist/node/components/templates/TemplatesPage.js +1 -1
- package/dist/node/components/templates/TemplatesPreviewModal.js +3 -3
- package/dist/node/components/templates/index.js +2361 -3615
- package/dist/node/index.js +2363 -3617
- package/dist/node/libs/email/client.js +1 -1
- package/dist/node/libs/email/contact.js +1 -1
- package/dist/node/libs/email/newsletter.js +1 -1
- package/dist/node/libs/email/waitlist-application.js +1 -1
- package/dist/node/libs/email/waitlist.js +1 -1
- package/dist/node/registry/engine.js +2003 -3334
- package/dist/node/registry/index.js +2003 -3334
- package/dist/node/registry/registry-docs.js +2 -2
- package/dist/node/registry/registry-landing.js +2007 -3338
- package/dist/node/registry/registry.js +2003 -3334
- package/dist/node/registry/utils.js +2003 -3334
- package/dist/registry/engine.js +2003 -3334
- package/dist/registry/index.js +2003 -3334
- package/dist/registry/registry-docs.js +2 -2
- package/dist/registry/registry-landing.js +2007 -3338
- package/dist/registry/registry.js +2003 -3334
- package/dist/registry/utils.js +2003 -3334
- package/package.json +29 -29
- package/src/bundles/MarketingBundle.ts +273 -273
- package/src/components/marketing/ChangelogPage.tsx +72 -100
- package/src/components/marketing/CofounderPage.tsx +120 -384
- package/src/components/marketing/ContactClient.tsx +164 -154
- package/src/components/marketing/ContributePage.tsx +139 -313
- package/src/components/marketing/DesignPartnerPage.tsx +133 -171
- package/src/components/marketing/LandingPage.tsx +353 -25
- package/src/components/marketing/PricingClient.tsx +192 -437
- package/src/components/marketing/ProductClientPage.tsx +255 -377
- package/src/components/marketing/index.ts +5 -5
- package/src/components/marketing/pricing-thinking-modal.tsx +197 -197
- package/src/components/marketing/sections/AudienceSection.tsx +55 -56
- package/src/components/marketing/sections/CorePositioningSection.tsx +37 -37
- package/src/components/marketing/sections/CtaSection.tsx +49 -50
- package/src/components/marketing/sections/DevelopersSection.tsx +26 -27
- package/src/components/marketing/sections/FearsSection.tsx +36 -37
- package/src/components/marketing/sections/HeroMarketingSection.tsx +59 -59
- package/src/components/marketing/sections/IconGridSection.tsx +71 -71
- package/src/components/marketing/sections/OutputsSection.tsx +51 -52
- package/src/components/marketing/sections/ProblemSection.tsx +39 -40
- package/src/components/marketing/sections/SolutionSection.tsx +39 -40
- package/src/components/marketing/sections/StepsSection.tsx +47 -48
- package/src/components/marketing/studio-signup-section.tsx +39 -41
- package/src/components/templates/TemplatesClientPage.tsx +727 -685
- package/src/components/templates/TemplatesPage.tsx +110 -110
- package/src/components/templates/TemplatesPreviewModal.tsx +197 -198
- package/src/index.ts +4 -4
- package/src/libs/email/client.test.ts +81 -81
- package/src/libs/email/client.ts +111 -111
- package/src/libs/email/contact.ts +35 -35
- package/src/libs/email/newsletter.ts +46 -46
- package/src/libs/email/types.ts +29 -29
- package/src/libs/email/utils.ts +5 -5
- package/src/libs/email/waitlist-application.ts +72 -72
- package/src/libs/email/waitlist.ts +46 -46
- package/src/libs/pricing-examples.ts +12 -12
- package/src/registry/engine.ts +16 -16
- package/src/registry/factory.ts +57 -57
- package/src/registry/registry-docs.ts +656 -666
- package/src/registry/registry-landing.ts +94 -95
- package/src/registry/registry.ts +36 -37
- package/src/registry/types.ts +2 -2
- package/src/registry/utils.ts +56 -56
- package/tsconfig.json +11 -11
- package/tsdown.config.js +5 -5
|
@@ -1,447 +1,202 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { ChevronDown, ChevronRight } from 'lucide-react';
|
|
4
4
|
import Link from 'next/link';
|
|
5
|
-
import {
|
|
6
|
-
|
|
5
|
+
import { useState } from 'react';
|
|
7
6
|
import { StudioSignupSection } from './studio-signup-section';
|
|
8
|
-
import { PricingThinkingModal } from './pricing-thinking-modal';
|
|
9
7
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
8
|
+
const faqs = [
|
|
9
|
+
{
|
|
10
|
+
question: 'What stays free?',
|
|
11
|
+
answer:
|
|
12
|
+
'The OSS foundation stays free. Teams can adopt contracts, generation, runtime adapters, and the core package ecosystem without crossing into a paid product loop.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'What is Studio charging for?',
|
|
16
|
+
answer:
|
|
17
|
+
'Studio is the operating layer: the packaged workflow for evidence, drafts, review, export, and follow-up on top of the same open system.',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
question: 'Why not price the OSS layer?',
|
|
21
|
+
answer:
|
|
22
|
+
'The GTM works better when technical adopters can prove the foundation in the open, keep their leverage, and only pay when the operating product removes enough operational work.',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
question: 'Who should talk to you now?',
|
|
26
|
+
answer:
|
|
27
|
+
'Teams already running AI-heavy product or ops workflows, especially those who feel drift, unsafe regeneration, or coordination pain across multiple surfaces.',
|
|
28
|
+
},
|
|
29
|
+
];
|
|
14
30
|
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
const packages = [
|
|
32
|
+
{
|
|
33
|
+
name: 'OSS/Core',
|
|
34
|
+
subtitle: 'Free and open',
|
|
35
|
+
description:
|
|
36
|
+
'Use the open system when you want explicit contracts, safe regeneration, and standard outputs the team owns.',
|
|
37
|
+
items: [
|
|
38
|
+
'Contracts, generation, runtime adapters, harnesses, and agent tooling',
|
|
39
|
+
'Incremental adoption inside existing codebases',
|
|
40
|
+
'Local and CI-friendly workflows',
|
|
41
|
+
'No forced hosted runtime or locked delivery path',
|
|
42
|
+
],
|
|
43
|
+
cta: {
|
|
44
|
+
label: 'Start with OSS',
|
|
45
|
+
href: '/install',
|
|
46
|
+
className: 'btn-primary',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'Studio',
|
|
51
|
+
subtitle: 'Operating product',
|
|
52
|
+
description:
|
|
53
|
+
'Use Studio when you want the product layer for evidence, drafting, review, exports, and follow-up.',
|
|
54
|
+
items: [
|
|
55
|
+
'Packaged operating loop on top of the same open system',
|
|
56
|
+
'Opinionated team workflows and governance surfaces',
|
|
57
|
+
'Faster coordination for teams running real product or ops loops',
|
|
58
|
+
'Design partner and rollout paths for teams with live complexity',
|
|
59
|
+
],
|
|
60
|
+
cta: {
|
|
61
|
+
label: 'Explore Studio',
|
|
62
|
+
href: 'https://www.contractspec.studio',
|
|
63
|
+
className: 'btn-ghost',
|
|
64
|
+
},
|
|
65
|
+
},
|
|
36
66
|
];
|
|
37
67
|
|
|
38
68
|
export function PricingClient() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
<CheckCircle
|
|
173
|
-
size={16}
|
|
174
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
175
|
-
/>
|
|
176
|
-
Unlimited local regenerations
|
|
177
|
-
</li>
|
|
178
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
179
|
-
<CheckCircle
|
|
180
|
-
size={16}
|
|
181
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
182
|
-
/>
|
|
183
|
-
All standard generators included
|
|
184
|
-
</li>
|
|
185
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
186
|
-
<CheckCircle
|
|
187
|
-
size={16}
|
|
188
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
189
|
-
/>
|
|
190
|
-
Run in your own CI/CD
|
|
191
|
-
</li>
|
|
192
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
193
|
-
<CheckCircle
|
|
194
|
-
size={16}
|
|
195
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
196
|
-
/>
|
|
197
|
-
Community support
|
|
198
|
-
</li>
|
|
199
|
-
</ul>
|
|
200
|
-
</div>
|
|
201
|
-
<Link href="/install" className="btn-ghost w-full">
|
|
202
|
-
Install now
|
|
203
|
-
</Link>
|
|
204
|
-
</div>
|
|
205
|
-
|
|
206
|
-
{/* Design Partner (Current) */}
|
|
207
|
-
<div className="card-subtle relative space-y-6 bg-violet-500/5 p-6 ring-2 ring-violet-500">
|
|
208
|
-
<div className="absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-violet-500 px-3 py-1 text-xs font-medium text-white">
|
|
209
|
-
Live program
|
|
210
|
-
</div>
|
|
211
|
-
<div className="space-y-2">
|
|
212
|
-
<h2 className="text-2xl font-bold">Design Partner</h2>
|
|
213
|
-
<div className="space-y-1">
|
|
214
|
-
<div className="text-2xl font-bold">Invite-based</div>
|
|
215
|
-
<p className="text-muted-foreground text-xs">
|
|
216
|
-
Built for teams shaping the next Studio capabilities
|
|
217
|
-
</p>
|
|
218
|
-
</div>
|
|
219
|
-
</div>
|
|
220
|
-
<ul className="space-y-3">
|
|
221
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
222
|
-
<CheckCircle
|
|
223
|
-
size={16}
|
|
224
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
225
|
-
/>
|
|
226
|
-
Use ContractSpec Studio for real projects
|
|
227
|
-
</li>
|
|
228
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
229
|
-
<CheckCircle
|
|
230
|
-
size={16}
|
|
231
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
232
|
-
/>
|
|
233
|
-
Work directly with the team on architecture and workflow
|
|
234
|
-
design
|
|
235
|
-
</li>
|
|
236
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
237
|
-
<CheckCircle
|
|
238
|
-
size={16}
|
|
239
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
240
|
-
/>
|
|
241
|
-
Access to partner-only previews and feedback loops
|
|
242
|
-
</li>
|
|
243
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
244
|
-
<CheckCircle
|
|
245
|
-
size={16}
|
|
246
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
247
|
-
/>
|
|
248
|
-
Priority support and roadmap influence
|
|
249
|
-
</li>
|
|
250
|
-
</ul>
|
|
251
|
-
<Link href="/design-partner" className="btn-primary w-full">
|
|
252
|
-
Apply as a design partner
|
|
253
|
-
</Link>
|
|
254
|
-
</div>
|
|
255
|
-
|
|
256
|
-
{/* Builder (Coming Soon) */}
|
|
257
|
-
<div className="card-subtle relative space-y-6 p-6">
|
|
258
|
-
<div className="bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium">
|
|
259
|
-
Coming soon
|
|
260
|
-
</div>
|
|
261
|
-
<div className="space-y-2">
|
|
262
|
-
<h2 className="text-2xl font-bold">Builder</h2>
|
|
263
|
-
<div className="space-y-1">
|
|
264
|
-
<div className="text-2xl font-bold">
|
|
265
|
-
Usage-based, for solo builders and small teams
|
|
266
|
-
</div>
|
|
267
|
-
</div>
|
|
268
|
-
</div>
|
|
269
|
-
<p className="text-muted-foreground text-sm">
|
|
270
|
-
Pay only for what you regenerate and the AI you consume. No
|
|
271
|
-
seat-based pricing, and a generous free tier for experiments.
|
|
272
|
-
</p>
|
|
273
|
-
<ul className="space-y-2">
|
|
274
|
-
<li className="text-muted-foreground text-sm">1–3 projects</li>
|
|
275
|
-
<li className="text-muted-foreground text-sm">
|
|
276
|
-
Generous monthly free regenerations
|
|
277
|
-
</li>
|
|
278
|
-
<li className="text-muted-foreground text-sm">
|
|
279
|
-
Pay-as-you-go beyond the free tier
|
|
280
|
-
</li>
|
|
281
|
-
</ul>
|
|
282
|
-
<button
|
|
283
|
-
disabled
|
|
284
|
-
className="btn-ghost w-full cursor-not-allowed opacity-50"
|
|
285
|
-
>
|
|
286
|
-
Available after pricing rollout
|
|
287
|
-
</button>
|
|
288
|
-
</div>
|
|
289
|
-
|
|
290
|
-
{/* Team / Enterprise (Coming Soon) */}
|
|
291
|
-
<div className="card-subtle relative space-y-6 p-6">
|
|
292
|
-
<div className="bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium">
|
|
293
|
-
Coming soon
|
|
294
|
-
</div>
|
|
295
|
-
<div className="space-y-2">
|
|
296
|
-
<h2 className="text-2xl font-bold">Team & Platform</h2>
|
|
297
|
-
<div className="space-y-1">
|
|
298
|
-
<div className="text-2xl font-bold">
|
|
299
|
-
Custom, for teams standardizing on ContractSpec
|
|
300
|
-
</div>
|
|
301
|
-
</div>
|
|
302
|
-
</div>
|
|
303
|
-
<p className="text-muted-foreground text-sm">
|
|
304
|
-
For teams running multiple apps or platforms on ContractSpec,
|
|
305
|
-
with stricter governance, data, and compliance needs.
|
|
306
|
-
</p>
|
|
307
|
-
<ul className="space-y-3">
|
|
308
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
309
|
-
<CheckCircle
|
|
310
|
-
size={16}
|
|
311
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
312
|
-
/>
|
|
313
|
-
Multiple projects and environments
|
|
314
|
-
</li>
|
|
315
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
316
|
-
<CheckCircle
|
|
317
|
-
size={16}
|
|
318
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
319
|
-
/>
|
|
320
|
-
Advanced RBAC and policy packs
|
|
321
|
-
</li>
|
|
322
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
323
|
-
<CheckCircle
|
|
324
|
-
size={16}
|
|
325
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
326
|
-
/>
|
|
327
|
-
SSO, audit trails, and longer retention
|
|
328
|
-
</li>
|
|
329
|
-
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
330
|
-
<CheckCircle
|
|
331
|
-
size={16}
|
|
332
|
-
className="mt-0.5 shrink-0 text-violet-400"
|
|
333
|
-
/>
|
|
334
|
-
Priority support & SLAs
|
|
335
|
-
</li>
|
|
336
|
-
</ul>
|
|
337
|
-
<Link href="/contact" className="btn-ghost w-full">
|
|
338
|
-
Talk to us
|
|
339
|
-
</Link>
|
|
340
|
-
</div>
|
|
341
|
-
</div>
|
|
342
|
-
</div>
|
|
343
|
-
</section>
|
|
344
|
-
|
|
345
|
-
{/* How Pricing Will Work */}
|
|
346
|
-
<section className="section-padding border-border bg-muted/20 border-b">
|
|
347
|
-
<div className="mx-auto max-w-4xl space-y-8">
|
|
348
|
-
<div className="space-y-4 text-center">
|
|
349
|
-
<h2 className="text-3xl font-bold">
|
|
350
|
-
How ContractSpec pricing works now and next
|
|
351
|
-
</h2>
|
|
352
|
-
<p className="text-muted-foreground mx-auto max-w-2xl text-lg">
|
|
353
|
-
We charge based on how much of your stack we help you maintain,
|
|
354
|
-
not how many people click around in the UI.
|
|
355
|
-
</p>
|
|
356
|
-
</div>
|
|
357
|
-
<div className="grid gap-6 md:grid-cols-3">
|
|
358
|
-
<div className="card-subtle space-y-3 p-6">
|
|
359
|
-
<h3 className="font-bold">Generous free tier</h3>
|
|
360
|
-
<p className="text-muted-foreground text-sm">
|
|
361
|
-
One serious project, small spec, and enough monthly
|
|
362
|
-
regenerations to ship something real.
|
|
363
|
-
</p>
|
|
364
|
-
</div>
|
|
365
|
-
<div className="card-subtle space-y-3 p-6">
|
|
366
|
-
<h3 className="font-bold">Usage-based beyond free</h3>
|
|
367
|
-
<p className="text-muted-foreground text-sm">
|
|
368
|
-
You pay for regenerations and AI agent actions, not per-seat.
|
|
369
|
-
The more your system evolves via ContractSpec, the more you pay.
|
|
370
|
-
</p>
|
|
371
|
-
</div>
|
|
372
|
-
<div className="card-subtle space-y-3 p-6">
|
|
373
|
-
<h3 className="font-bold">No lock-in</h3>
|
|
374
|
-
<p className="text-muted-foreground text-sm">
|
|
375
|
-
Generated code is standard, readable, and exportable. If you
|
|
376
|
-
leave, your app keeps running.
|
|
377
|
-
</p>
|
|
378
|
-
</div>
|
|
379
|
-
</div>
|
|
380
|
-
<div className="pt-6 text-center">
|
|
381
|
-
<button
|
|
382
|
-
onClick={() => setPricingModalOpen(true)}
|
|
383
|
-
className="btn-ghost"
|
|
384
|
-
>
|
|
385
|
-
View our tentative pricing model
|
|
386
|
-
</button>
|
|
387
|
-
</div>
|
|
388
|
-
</div>
|
|
389
|
-
</section>
|
|
390
|
-
|
|
391
|
-
{/* FAQ */}
|
|
392
|
-
<section className="section-padding border-border border-b">
|
|
393
|
-
<div className="mx-auto max-w-3xl space-y-8">
|
|
394
|
-
<h2 className="text-center text-3xl font-bold">
|
|
395
|
-
Frequently asked questions
|
|
396
|
-
</h2>
|
|
397
|
-
<div className="space-y-4">
|
|
398
|
-
{faqs.map((faq, i) => (
|
|
399
|
-
<div key={i} className="card-subtle overflow-hidden">
|
|
400
|
-
<button
|
|
401
|
-
onClick={() => setOpenFaq(openFaq === i ? null : i)}
|
|
402
|
-
className="flex w-full items-center justify-between p-6 text-left"
|
|
403
|
-
>
|
|
404
|
-
<span className="font-medium">{faq.question}</span>
|
|
405
|
-
<ChevronDown
|
|
406
|
-
size={20}
|
|
407
|
-
className={`text-muted-foreground transition-transform ${
|
|
408
|
-
openFaq === i ? 'rotate-180' : ''
|
|
409
|
-
}`}
|
|
410
|
-
/>
|
|
411
|
-
</button>
|
|
412
|
-
{openFaq === i && (
|
|
413
|
-
<div className="text-muted-foreground px-6 pb-6 text-sm">
|
|
414
|
-
{faq.answer}
|
|
415
|
-
</div>
|
|
416
|
-
)}
|
|
417
|
-
</div>
|
|
418
|
-
))}
|
|
419
|
-
</div>
|
|
420
|
-
<div className="pt-4 text-center">
|
|
421
|
-
<p className="text-muted-foreground mb-2 text-sm">Still unsure?</p>
|
|
422
|
-
<Link
|
|
423
|
-
href="/contact"
|
|
424
|
-
className="text-sm font-medium text-violet-400 hover:text-violet-300"
|
|
425
|
-
>
|
|
426
|
-
Contact us →
|
|
427
|
-
</Link>
|
|
428
|
-
</div>
|
|
429
|
-
</div>
|
|
430
|
-
</section>
|
|
431
|
-
|
|
432
|
-
{/* Studio Signup Section */}
|
|
433
|
-
<section className="section-padding hero-gradient">
|
|
434
|
-
<div className="mx-auto max-w-4xl">
|
|
435
|
-
<StudioSignupSection />
|
|
436
|
-
</div>
|
|
437
|
-
</section>
|
|
438
|
-
|
|
439
|
-
{/* Pricing Thinking Modal */}
|
|
440
|
-
<PricingThinkingModal
|
|
441
|
-
open={pricingModalOpen}
|
|
442
|
-
onOpenChange={setPricingModalOpen}
|
|
443
|
-
onApplyClick={openStudio}
|
|
444
|
-
/>
|
|
445
|
-
</main>
|
|
446
|
-
);
|
|
69
|
+
const [openFaq, setOpenFaq] = useState<number | null>(0);
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<main>
|
|
73
|
+
<section className="section-padding hero-gradient border-border/70 border-b">
|
|
74
|
+
<div className="editorial-shell grid gap-8 lg:grid-cols-[1.05fr_0.95fr]">
|
|
75
|
+
<div className="space-y-6">
|
|
76
|
+
<p className="editorial-kicker">Packaging, not upsell fog</p>
|
|
77
|
+
<h1 className="editorial-title max-w-4xl">
|
|
78
|
+
The open system is how teams start. Studio is how some teams
|
|
79
|
+
operate.
|
|
80
|
+
</h1>
|
|
81
|
+
<p className="editorial-subtitle">
|
|
82
|
+
Pricing should reflect the product split honestly. The OSS layer
|
|
83
|
+
is the open foundation. Studio is the paid operating surface when
|
|
84
|
+
the team wants a packaged workflow on top.
|
|
85
|
+
</p>
|
|
86
|
+
<div className="flex flex-col gap-3 sm:flex-row">
|
|
87
|
+
<Link href="/install" className="btn-primary">
|
|
88
|
+
Start with OSS <ChevronRight className="ml-2 h-4 w-4" />
|
|
89
|
+
</Link>
|
|
90
|
+
<Link
|
|
91
|
+
href="https://www.contractspec.studio"
|
|
92
|
+
className="btn-ghost"
|
|
93
|
+
>
|
|
94
|
+
Explore Studio
|
|
95
|
+
</Link>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
<div className="editorial-panel space-y-5">
|
|
99
|
+
<p className="editorial-kicker">Current GTM</p>
|
|
100
|
+
<h2 className="editorial-panel-title">
|
|
101
|
+
Earn trust in the open, then earn the right to sell the operating
|
|
102
|
+
product.
|
|
103
|
+
</h2>
|
|
104
|
+
<p className="text-muted-foreground text-sm leading-7">
|
|
105
|
+
This page should make the ladder clear: prove the OSS foundation
|
|
106
|
+
first, then package the workflow that removes operational drag for
|
|
107
|
+
teams that need more.
|
|
108
|
+
</p>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
</section>
|
|
112
|
+
|
|
113
|
+
<section className="editorial-section">
|
|
114
|
+
<div className="editorial-shell grid gap-6 lg:grid-cols-2">
|
|
115
|
+
{packages.map((pkg) => (
|
|
116
|
+
<div key={pkg.name} className="editorial-panel space-y-6">
|
|
117
|
+
<div className="space-y-3">
|
|
118
|
+
<p className="editorial-kicker">{pkg.subtitle}</p>
|
|
119
|
+
<h2 className="font-serif text-4xl tracking-[-0.04em]">
|
|
120
|
+
{pkg.name}
|
|
121
|
+
</h2>
|
|
122
|
+
<p className="text-muted-foreground text-sm leading-7">
|
|
123
|
+
{pkg.description}
|
|
124
|
+
</p>
|
|
125
|
+
</div>
|
|
126
|
+
<ul className="editorial-list">
|
|
127
|
+
{pkg.items.map((item) => (
|
|
128
|
+
<li key={item}>
|
|
129
|
+
<span className="editorial-list-marker" />
|
|
130
|
+
<span>{item}</span>
|
|
131
|
+
</li>
|
|
132
|
+
))}
|
|
133
|
+
</ul>
|
|
134
|
+
<Link href={pkg.cta.href} className={pkg.cta.className}>
|
|
135
|
+
{pkg.cta.label}
|
|
136
|
+
</Link>
|
|
137
|
+
</div>
|
|
138
|
+
))}
|
|
139
|
+
</div>
|
|
140
|
+
</section>
|
|
141
|
+
|
|
142
|
+
<section className="editorial-section bg-striped">
|
|
143
|
+
<div className="editorial-shell grid gap-8 lg:grid-cols-[0.95fr_1.05fr]">
|
|
144
|
+
<div className="space-y-4">
|
|
145
|
+
<p className="editorial-kicker">Design partner path</p>
|
|
146
|
+
<h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
|
|
147
|
+
For teams already carrying real AI-native complexity.
|
|
148
|
+
</h2>
|
|
149
|
+
<p className="editorial-copy">
|
|
150
|
+
The design partner path exists for teams that need the operating
|
|
151
|
+
layer now and are willing to shape it with us. That is not
|
|
152
|
+
“enterprise later” positioning. It is a practical way to learn
|
|
153
|
+
from the hardest live workflows first.
|
|
154
|
+
</p>
|
|
155
|
+
<Link href="/design-partner" className="btn-primary">
|
|
156
|
+
Apply as a design partner
|
|
157
|
+
</Link>
|
|
158
|
+
</div>
|
|
159
|
+
<StudioSignupSection />
|
|
160
|
+
</div>
|
|
161
|
+
</section>
|
|
162
|
+
|
|
163
|
+
<section className="editorial-section">
|
|
164
|
+
<div className="editorial-shell grid gap-8 lg:grid-cols-[0.9fr_1.1fr]">
|
|
165
|
+
<div className="space-y-4">
|
|
166
|
+
<p className="editorial-kicker">FAQ</p>
|
|
167
|
+
<h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
|
|
168
|
+
Questions teams usually ask before they pick a side.
|
|
169
|
+
</h2>
|
|
170
|
+
</div>
|
|
171
|
+
<div className="space-y-3">
|
|
172
|
+
{faqs.map((faq, index) => {
|
|
173
|
+
const isOpen = openFaq === index;
|
|
174
|
+
|
|
175
|
+
return (
|
|
176
|
+
<div key={faq.question} className="editorial-panel p-5">
|
|
177
|
+
<button
|
|
178
|
+
type="button"
|
|
179
|
+
onClick={() => setOpenFaq(isOpen ? null : index)}
|
|
180
|
+
className="flex w-full items-center justify-between gap-4 text-left"
|
|
181
|
+
>
|
|
182
|
+
<span className="font-medium text-lg">{faq.question}</span>
|
|
183
|
+
<ChevronDown
|
|
184
|
+
className={`h-4 w-4 shrink-0 text-muted-foreground transition-transform ${
|
|
185
|
+
isOpen ? 'rotate-180' : ''
|
|
186
|
+
}`}
|
|
187
|
+
/>
|
|
188
|
+
</button>
|
|
189
|
+
{isOpen ? (
|
|
190
|
+
<p className="mt-4 text-muted-foreground text-sm leading-7">
|
|
191
|
+
{faq.answer}
|
|
192
|
+
</p>
|
|
193
|
+
) : null}
|
|
194
|
+
</div>
|
|
195
|
+
);
|
|
196
|
+
})}
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
</section>
|
|
200
|
+
</main>
|
|
201
|
+
);
|
|
447
202
|
}
|