@contractspec/bundle.marketing 3.7.6 → 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.
Files changed (163) hide show
  1. package/.turbo/turbo-build.log +84 -84
  2. package/AGENTS.md +29 -21
  3. package/README.md +36 -49
  4. package/dist/browser/components/marketing/ChangelogPage.js +8 -8
  5. package/dist/browser/components/marketing/CofounderPage.js +167 -523
  6. package/dist/browser/components/marketing/ContactClient.js +200 -207
  7. package/dist/browser/components/marketing/ContributePage.js +211 -463
  8. package/dist/browser/components/marketing/DesignPartnerPage.js +165 -218
  9. package/dist/browser/components/marketing/LandingPage.js +464 -568
  10. package/dist/browser/components/marketing/PricingClient.js +213 -839
  11. package/dist/browser/components/marketing/ProductClientPage.js +265 -463
  12. package/dist/browser/components/marketing/index.js +2007 -3338
  13. package/dist/browser/components/marketing/pricing-thinking-modal.js +12 -12
  14. package/dist/browser/components/marketing/sections/AudienceSection.js +2 -2
  15. package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
  16. package/dist/browser/components/marketing/sections/CtaSection.js +3 -3
  17. package/dist/browser/components/marketing/sections/FearsSection.js +3 -3
  18. package/dist/browser/components/marketing/sections/HeroMarketingSection.js +6 -6
  19. package/dist/browser/components/marketing/sections/IconGridSection.js +2 -2
  20. package/dist/browser/components/marketing/sections/OutputsSection.js +2 -2
  21. package/dist/browser/components/marketing/sections/ProblemSection.js +2 -2
  22. package/dist/browser/components/marketing/sections/SolutionSection.js +2 -2
  23. package/dist/browser/components/marketing/sections/StepsSection.js +4 -4
  24. package/dist/browser/components/marketing/studio-signup-section.js +25 -41
  25. package/dist/browser/components/templates/TemplatesClientPage.js +2324 -3578
  26. package/dist/browser/components/templates/TemplatesPage.js +1 -1
  27. package/dist/browser/components/templates/TemplatesPreviewModal.js +3 -3
  28. package/dist/browser/components/templates/index.js +2361 -3615
  29. package/dist/browser/index.js +2363 -3617
  30. package/dist/browser/libs/email/client.js +1 -1
  31. package/dist/browser/libs/email/contact.js +1 -1
  32. package/dist/browser/libs/email/newsletter.js +1 -1
  33. package/dist/browser/libs/email/waitlist-application.js +1 -1
  34. package/dist/browser/libs/email/waitlist.js +1 -1
  35. package/dist/browser/registry/engine.js +2003 -3334
  36. package/dist/browser/registry/index.js +2003 -3334
  37. package/dist/browser/registry/registry-docs.js +2 -2
  38. package/dist/browser/registry/registry-landing.js +2007 -3338
  39. package/dist/browser/registry/registry.js +2003 -3334
  40. package/dist/browser/registry/utils.js +2003 -3334
  41. package/dist/components/marketing/ChangelogPage.js +8 -8
  42. package/dist/components/marketing/CofounderPage.js +167 -523
  43. package/dist/components/marketing/ContactClient.js +200 -207
  44. package/dist/components/marketing/ContributePage.d.ts +0 -2
  45. package/dist/components/marketing/ContributePage.js +211 -463
  46. package/dist/components/marketing/DesignPartnerPage.js +165 -218
  47. package/dist/components/marketing/LandingPage.js +464 -568
  48. package/dist/components/marketing/PricingClient.js +213 -839
  49. package/dist/components/marketing/ProductClientPage.js +265 -463
  50. package/dist/components/marketing/index.d.ts +5 -5
  51. package/dist/components/marketing/index.js +2007 -3338
  52. package/dist/components/marketing/pricing-thinking-modal.js +12 -12
  53. package/dist/components/marketing/sections/AudienceSection.js +2 -2
  54. package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
  55. package/dist/components/marketing/sections/CtaSection.js +3 -3
  56. package/dist/components/marketing/sections/FearsSection.js +3 -3
  57. package/dist/components/marketing/sections/HeroMarketingSection.js +6 -6
  58. package/dist/components/marketing/sections/IconGridSection.d.ts +3 -3
  59. package/dist/components/marketing/sections/IconGridSection.js +2 -2
  60. package/dist/components/marketing/sections/OutputsSection.js +2 -2
  61. package/dist/components/marketing/sections/ProblemSection.js +2 -2
  62. package/dist/components/marketing/sections/SolutionSection.js +2 -2
  63. package/dist/components/marketing/sections/StepsSection.js +4 -4
  64. package/dist/components/marketing/studio-signup-section.js +25 -41
  65. package/dist/components/templates/TemplatesClientPage.js +2324 -3578
  66. package/dist/components/templates/TemplatesPage.js +1 -1
  67. package/dist/components/templates/TemplatesPreviewModal.js +3 -3
  68. package/dist/components/templates/index.js +2361 -3615
  69. package/dist/index.js +2363 -3617
  70. package/dist/libs/email/client.js +1 -1
  71. package/dist/libs/email/contact.js +1 -1
  72. package/dist/libs/email/newsletter.js +1 -1
  73. package/dist/libs/email/waitlist-application.js +1 -1
  74. package/dist/libs/email/waitlist.js +1 -1
  75. package/dist/node/components/marketing/ChangelogPage.js +8 -8
  76. package/dist/node/components/marketing/CofounderPage.js +167 -523
  77. package/dist/node/components/marketing/ContactClient.js +200 -207
  78. package/dist/node/components/marketing/ContributePage.js +211 -463
  79. package/dist/node/components/marketing/DesignPartnerPage.js +165 -218
  80. package/dist/node/components/marketing/LandingPage.js +464 -568
  81. package/dist/node/components/marketing/PricingClient.js +213 -839
  82. package/dist/node/components/marketing/ProductClientPage.js +265 -463
  83. package/dist/node/components/marketing/index.js +2007 -3338
  84. package/dist/node/components/marketing/pricing-thinking-modal.js +12 -12
  85. package/dist/node/components/marketing/sections/AudienceSection.js +2 -2
  86. package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
  87. package/dist/node/components/marketing/sections/CtaSection.js +3 -3
  88. package/dist/node/components/marketing/sections/FearsSection.js +3 -3
  89. package/dist/node/components/marketing/sections/HeroMarketingSection.js +6 -6
  90. package/dist/node/components/marketing/sections/IconGridSection.js +2 -2
  91. package/dist/node/components/marketing/sections/OutputsSection.js +2 -2
  92. package/dist/node/components/marketing/sections/ProblemSection.js +2 -2
  93. package/dist/node/components/marketing/sections/SolutionSection.js +2 -2
  94. package/dist/node/components/marketing/sections/StepsSection.js +4 -4
  95. package/dist/node/components/marketing/studio-signup-section.js +25 -41
  96. package/dist/node/components/templates/TemplatesClientPage.js +2324 -3578
  97. package/dist/node/components/templates/TemplatesPage.js +1 -1
  98. package/dist/node/components/templates/TemplatesPreviewModal.js +3 -3
  99. package/dist/node/components/templates/index.js +2361 -3615
  100. package/dist/node/index.js +2363 -3617
  101. package/dist/node/libs/email/client.js +1 -1
  102. package/dist/node/libs/email/contact.js +1 -1
  103. package/dist/node/libs/email/newsletter.js +1 -1
  104. package/dist/node/libs/email/waitlist-application.js +1 -1
  105. package/dist/node/libs/email/waitlist.js +1 -1
  106. package/dist/node/registry/engine.js +2003 -3334
  107. package/dist/node/registry/index.js +2003 -3334
  108. package/dist/node/registry/registry-docs.js +2 -2
  109. package/dist/node/registry/registry-landing.js +2007 -3338
  110. package/dist/node/registry/registry.js +2003 -3334
  111. package/dist/node/registry/utils.js +2003 -3334
  112. package/dist/registry/engine.js +2003 -3334
  113. package/dist/registry/index.js +2003 -3334
  114. package/dist/registry/registry-docs.js +2 -2
  115. package/dist/registry/registry-landing.js +2007 -3338
  116. package/dist/registry/registry.js +2003 -3334
  117. package/dist/registry/utils.js +2003 -3334
  118. package/package.json +22 -22
  119. package/src/bundles/MarketingBundle.ts +273 -273
  120. package/src/components/marketing/ChangelogPage.tsx +72 -100
  121. package/src/components/marketing/CofounderPage.tsx +120 -384
  122. package/src/components/marketing/ContactClient.tsx +164 -154
  123. package/src/components/marketing/ContributePage.tsx +139 -313
  124. package/src/components/marketing/DesignPartnerPage.tsx +133 -171
  125. package/src/components/marketing/LandingPage.tsx +353 -25
  126. package/src/components/marketing/PricingClient.tsx +192 -437
  127. package/src/components/marketing/ProductClientPage.tsx +255 -377
  128. package/src/components/marketing/index.ts +5 -5
  129. package/src/components/marketing/pricing-thinking-modal.tsx +197 -197
  130. package/src/components/marketing/sections/AudienceSection.tsx +55 -56
  131. package/src/components/marketing/sections/CorePositioningSection.tsx +37 -37
  132. package/src/components/marketing/sections/CtaSection.tsx +49 -50
  133. package/src/components/marketing/sections/DevelopersSection.tsx +26 -27
  134. package/src/components/marketing/sections/FearsSection.tsx +36 -37
  135. package/src/components/marketing/sections/HeroMarketingSection.tsx +59 -59
  136. package/src/components/marketing/sections/IconGridSection.tsx +71 -71
  137. package/src/components/marketing/sections/OutputsSection.tsx +51 -52
  138. package/src/components/marketing/sections/ProblemSection.tsx +39 -40
  139. package/src/components/marketing/sections/SolutionSection.tsx +39 -40
  140. package/src/components/marketing/sections/StepsSection.tsx +47 -48
  141. package/src/components/marketing/studio-signup-section.tsx +39 -41
  142. package/src/components/templates/TemplatesClientPage.tsx +727 -685
  143. package/src/components/templates/TemplatesPage.tsx +110 -110
  144. package/src/components/templates/TemplatesPreviewModal.tsx +197 -198
  145. package/src/index.ts +4 -4
  146. package/src/libs/email/client.test.ts +81 -81
  147. package/src/libs/email/client.ts +111 -111
  148. package/src/libs/email/contact.ts +35 -35
  149. package/src/libs/email/newsletter.ts +46 -46
  150. package/src/libs/email/types.ts +29 -29
  151. package/src/libs/email/utils.ts +5 -5
  152. package/src/libs/email/waitlist-application.ts +72 -72
  153. package/src/libs/email/waitlist.ts +46 -46
  154. package/src/libs/pricing-examples.ts +12 -12
  155. package/src/registry/engine.ts +16 -16
  156. package/src/registry/factory.ts +57 -57
  157. package/src/registry/registry-docs.ts +656 -666
  158. package/src/registry/registry-landing.ts +94 -95
  159. package/src/registry/registry.ts +36 -37
  160. package/src/registry/types.ts +2 -2
  161. package/src/registry/utils.ts +56 -56
  162. package/tsconfig.json +11 -11
  163. package/tsdown.config.js +5 -5
@@ -1,30 +1,358 @@
1
1
  'use client';
2
2
 
3
- import { VStack } from '@contractspec/lib.ui-kit-web/ui/stack';
4
- import { HeroMarketingSection } from './sections/HeroMarketingSection';
5
- import { ProblemSection } from './sections/ProblemSection';
6
- import { SolutionSection } from './sections/SolutionSection';
7
- import { FearsSection } from './sections/FearsSection';
8
- import { CorePositioningSection } from './sections/CorePositioningSection';
9
- import { AudienceSection } from './sections/AudienceSection';
10
- import { OutputsSection } from './sections/OutputsSection';
11
- import { StepsSection } from './sections/StepsSection';
12
- import { DevelopersSection } from './sections/DevelopersSection';
13
- import { CtaSection } from './sections/CtaSection';
3
+ import {
4
+ ArrowRight,
5
+ Blocks,
6
+ Bot,
7
+ Braces,
8
+ ChartColumn,
9
+ Database,
10
+ GitBranch,
11
+ ShieldCheck,
12
+ Sparkles,
13
+ Workflow,
14
+ } from 'lucide-react';
15
+ import Link from 'next/link';
16
+
17
+ const failureModes = [
18
+ {
19
+ title: 'Implicit rules drift first',
20
+ description:
21
+ 'Prompt chains and AI edits move faster than the product rules they are supposed to respect.',
22
+ },
23
+ {
24
+ title: 'Surfaces stop agreeing',
25
+ description:
26
+ 'API, UI, database, events, and MCP tools evolve independently unless something explicit keeps them aligned.',
27
+ },
28
+ {
29
+ title: 'Teams lose safe regeneration',
30
+ description:
31
+ 'Without a stable contract layer, every regeneration feels like rewriting production in the dark.',
32
+ },
33
+ ];
34
+
35
+ const systemSurfaces = [
36
+ {
37
+ label: 'Contracts and generation',
38
+ description:
39
+ 'Define the canonical behavior once and derive the implementation surfaces from it.',
40
+ icon: Braces,
41
+ },
42
+ {
43
+ label: 'Runtime adapters',
44
+ description:
45
+ 'Bind the same source of truth to REST, GraphQL, React, MCP, and operational flows.',
46
+ icon: Workflow,
47
+ },
48
+ {
49
+ label: 'Harness and proof',
50
+ description:
51
+ 'Replay, evaluate, inspect, and verify how the system behaves before you trust automation with more.',
52
+ icon: ChartColumn,
53
+ },
54
+ {
55
+ label: 'Studio operating layer',
56
+ description:
57
+ 'Run the opinionated product loop when you want coordination, governance, and a packaged operating surface.',
58
+ icon: Sparkles,
59
+ },
60
+ ];
61
+
62
+ const outputs = [
63
+ {
64
+ title: 'APIs',
65
+ copy: 'Typed endpoints and schemas stay aligned with the same contract language the team edits.',
66
+ icon: GitBranch,
67
+ },
68
+ {
69
+ title: 'Data',
70
+ copy: 'Schema, validation, and migrations are shaped by the same product rules instead of scattered implementations.',
71
+ icon: Database,
72
+ },
73
+ {
74
+ title: 'Interfaces',
75
+ copy: 'Forms, presentations, and client types inherit the same system boundaries instead of drifting from the backend.',
76
+ icon: Blocks,
77
+ },
78
+ {
79
+ title: 'Agents and tools',
80
+ copy: 'MCP tools and agent-facing surfaces are generated from explicit contracts rather than guessed from code.',
81
+ icon: Bot,
82
+ },
83
+ ];
84
+
85
+ const adoptionSteps = [
86
+ 'Start with one module that is already drifting or feels unsafe to regenerate.',
87
+ 'Define explicit contracts, then bring API, UI, data, and tools back into alignment.',
88
+ 'Adopt Studio when the team wants an operating surface on top of the open system.',
89
+ ];
14
90
 
15
91
  export function LandingPage() {
16
- return (
17
- <VStack as="main" gap="none">
18
- <HeroMarketingSection />
19
- <ProblemSection />
20
- <SolutionSection />
21
- <FearsSection />
22
- <CorePositioningSection />
23
- <AudienceSection />
24
- <OutputsSection />
25
- <StepsSection />
26
- <DevelopersSection />
27
- <CtaSection />
28
- </VStack>
29
- );
92
+ return (
93
+ <main>
94
+ <section className="section-padding hero-gradient border-border/70 border-b">
95
+ <div className="editorial-shell">
96
+ <div className="grid gap-10 lg:grid-cols-[1.15fr_0.85fr] lg:items-end">
97
+ <div className="space-y-7">
98
+ <div className="badge">
99
+ <ShieldCheck size={14} />
100
+ Open system, explicit control
101
+ </div>
102
+ <div className="space-y-5">
103
+ <p className="editorial-kicker">
104
+ ContractSpec for AI-native teams
105
+ </p>
106
+ <h1 className="editorial-title max-w-5xl">
107
+ Build and run AI-native systems on explicit contracts.
108
+ </h1>
109
+ <p className="editorial-subtitle">
110
+ ContractSpec gives teams an open spec system for defining
111
+ behavior, aligning every surface, and regenerating safely. The
112
+ OSS foundation stays yours. Studio is the operating layer when
113
+ you want a product on top.
114
+ </p>
115
+ </div>
116
+ <div className="flex flex-col gap-3 sm:flex-row">
117
+ <Link href="/install" className="btn-primary">
118
+ Start with OSS <ArrowRight className="ml-2 h-4 w-4" />
119
+ </Link>
120
+ <Link
121
+ href="https://www.contractspec.studio"
122
+ className="btn-ghost"
123
+ >
124
+ Explore Studio
125
+ </Link>
126
+ <Link href="/product" className="btn-ghost">
127
+ See the architecture
128
+ </Link>
129
+ </div>
130
+ <div className="editorial-proof-strip">
131
+ <div className="editorial-stat">
132
+ <span className="editorial-stat-value">1</span>
133
+ <span className="editorial-label">
134
+ explicit system source
135
+ </span>
136
+ </div>
137
+ <div className="editorial-stat">
138
+ <span className="editorial-stat-value">4+</span>
139
+ <span className="editorial-label">
140
+ aligned surface families
141
+ </span>
142
+ </div>
143
+ <div className="editorial-stat">
144
+ <span className="editorial-stat-value">0</span>
145
+ <span className="editorial-label">required lock-in</span>
146
+ </div>
147
+ </div>
148
+ </div>
149
+
150
+ <div className="editorial-panel space-y-6">
151
+ <p className="editorial-kicker">
152
+ What the site should make clear
153
+ </p>
154
+ <div className="space-y-4">
155
+ <h2 className="editorial-panel-title">
156
+ This is not “yet another AI builder.”
157
+ </h2>
158
+ <p className="editorial-copy text-sm">
159
+ ContractSpec exists for teams that already know AI can write a
160
+ lot of software, but need explicit control over what that
161
+ software is allowed to become over time.
162
+ </p>
163
+ </div>
164
+ <ul className="editorial-list">
165
+ <li>
166
+ <span className="editorial-list-marker" />
167
+ <span>Keep the code and the standards you already use.</span>
168
+ </li>
169
+ <li>
170
+ <span className="editorial-list-marker" />
171
+ <span>
172
+ Stabilize one module at a time instead of rewriting your
173
+ app.
174
+ </span>
175
+ </li>
176
+ <li>
177
+ <span className="editorial-list-marker" />
178
+ <span>
179
+ Move into Studio only when you want the operating product.
180
+ </span>
181
+ </li>
182
+ </ul>
183
+ </div>
184
+ </div>
185
+ </div>
186
+ </section>
187
+
188
+ <section className="editorial-section">
189
+ <div className="editorial-shell space-y-10">
190
+ <div className="max-w-3xl space-y-4">
191
+ <p className="editorial-kicker">Why teams end up here</p>
192
+ <h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
193
+ AI speed is not the problem. Implicit systems are.
194
+ </h2>
195
+ <p className="editorial-copy">
196
+ Once a team depends on prompts, AI edits, and generated code
197
+ across multiple surfaces, the real failure mode is not “AI wrote
198
+ bad code.” It is that nobody can state the system rules precisely
199
+ enough to keep regeneration safe.
200
+ </p>
201
+ </div>
202
+ <div className="editorial-grid xl:grid-cols-3">
203
+ {failureModes.map((item) => (
204
+ <div key={item.title} className="editorial-panel">
205
+ <p className="editorial-kicker">{item.title}</p>
206
+ <p className="mt-4 text-base text-muted-foreground leading-8">
207
+ {item.description}
208
+ </p>
209
+ </div>
210
+ ))}
211
+ </div>
212
+ </div>
213
+ </section>
214
+
215
+ <section className="editorial-section bg-striped">
216
+ <div className="editorial-shell space-y-10">
217
+ <div className="max-w-3xl space-y-4">
218
+ <p className="editorial-kicker">The open system</p>
219
+ <h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
220
+ One explicit layer that keeps the whole stack honest.
221
+ </h2>
222
+ <p className="editorial-copy">
223
+ ContractSpec is broader than generation. It is the contract layer,
224
+ the runtime bridges, the proof surfaces, and the adoption path
225
+ that lets teams move from OSS control to an operating product
226
+ without pretending they are different systems.
227
+ </p>
228
+ </div>
229
+ <div className="editorial-grid">
230
+ {systemSurfaces.map((surface) => (
231
+ <div key={surface.label} className="editorial-panel">
232
+ <surface.icon className="h-5 w-5 text-[color:var(--rust)]" />
233
+ <h3 className="mt-5 font-serif text-2xl tracking-[-0.03em]">
234
+ {surface.label}
235
+ </h3>
236
+ <p className="mt-3 text-muted-foreground text-sm leading-7">
237
+ {surface.description}
238
+ </p>
239
+ </div>
240
+ ))}
241
+ </div>
242
+ </div>
243
+ </section>
244
+
245
+ <section className="editorial-section">
246
+ <div className="editorial-shell grid gap-10 lg:grid-cols-[0.9fr_1.1fr]">
247
+ <div className="space-y-4">
248
+ <p className="editorial-kicker">
249
+ What the OSS layer actually gives you
250
+ </p>
251
+ <h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
252
+ Explicit contracts show up where teams usually lose control.
253
+ </h2>
254
+ <p className="editorial-copy">
255
+ The promise is not magic generation. The promise is that the same
256
+ product rules can shape APIs, data, interfaces, and agent tools
257
+ without each surface inventing its own truth.
258
+ </p>
259
+ </div>
260
+ <div className="grid gap-5 md:grid-cols-2">
261
+ {outputs.map((output) => (
262
+ <div key={output.title} className="editorial-panel">
263
+ <output.icon className="h-5 w-5 text-[color:var(--blue)]" />
264
+ <h3 className="mt-5 font-serif text-2xl tracking-[-0.03em]">
265
+ {output.title}
266
+ </h3>
267
+ <p className="mt-3 text-muted-foreground text-sm leading-7">
268
+ {output.copy}
269
+ </p>
270
+ </div>
271
+ ))}
272
+ </div>
273
+ </div>
274
+ </section>
275
+
276
+ <section className="editorial-section bg-striped">
277
+ <div className="editorial-shell grid gap-8 lg:grid-cols-[1.1fr_0.9fr]">
278
+ <div className="editorial-panel space-y-6">
279
+ <p className="editorial-kicker">Adoption path</p>
280
+ <h2 className="editorial-panel-title">
281
+ Start where the risk is highest, not where the marketing says to
282
+ start.
283
+ </h2>
284
+ <ol className="space-y-4">
285
+ {adoptionSteps.map((step, index) => (
286
+ <li key={step} className="flex gap-4">
287
+ <div className="flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[rgb(162_79_42_/_0.12)] font-mono text-[color:var(--rust)] text-xs">
288
+ 0{index + 1}
289
+ </div>
290
+ <p className="text-muted-foreground text-sm leading-7">
291
+ {step}
292
+ </p>
293
+ </li>
294
+ ))}
295
+ </ol>
296
+ </div>
297
+
298
+ <div className="editorial-panel space-y-6">
299
+ <p className="editorial-kicker">Studio on top</p>
300
+ <h2 className="editorial-panel-title">
301
+ Studio is the operating surface, not a replacement identity.
302
+ </h2>
303
+ <p className="text-muted-foreground text-sm leading-7">
304
+ Use Studio when your team wants a packaged loop for evidence,
305
+ drafting, review, export, and follow-up. The relationship should
306
+ feel like the best application built on top of the same open
307
+ system, not a bait-and-switch away from it.
308
+ </p>
309
+ <div className="editorial-divider" />
310
+ <div className="grid gap-4 text-muted-foreground text-sm">
311
+ <p>
312
+ <span className="font-medium text-foreground">OSS/Core:</span>{' '}
313
+ contracts, generation, runtimes, harnesses, agent tooling.
314
+ </p>
315
+ <p>
316
+ <span className="font-medium text-foreground">Studio:</span> the
317
+ opinionated operating loop when a team wants the product.
318
+ </p>
319
+ </div>
320
+ </div>
321
+ </div>
322
+ </section>
323
+
324
+ <section className="section-padding">
325
+ <div className="editorial-shell">
326
+ <div className="editorial-panel flex flex-col gap-8 rounded-[40px] border-dashed px-6 py-8 md:px-10 md:py-10 lg:flex-row lg:items-end lg:justify-between">
327
+ <div className="max-w-3xl space-y-4">
328
+ <p className="editorial-kicker">Choose your path</p>
329
+ <h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
330
+ Adopt the open system first. Evaluate Studio when the team is
331
+ ready for the operating layer.
332
+ </h2>
333
+ <p className="editorial-copy">
334
+ That is the product story the site should tell everywhere: open
335
+ foundation, explicit contracts, safe regeneration, then an
336
+ opinionated surface on top for teams that want it.
337
+ </p>
338
+ </div>
339
+ <div className="flex flex-col gap-3 sm:flex-row lg:flex-col">
340
+ <Link href="/install" className="btn-primary">
341
+ Start with OSS
342
+ </Link>
343
+ <Link
344
+ href="https://www.contractspec.studio"
345
+ className="btn-ghost"
346
+ >
347
+ Explore Studio
348
+ </Link>
349
+ <Link href="/pricing" className="btn-ghost">
350
+ See packaging
351
+ </Link>
352
+ </div>
353
+ </div>
354
+ </div>
355
+ </section>
356
+ </main>
357
+ );
30
358
  }