@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.
Files changed (164) hide show
  1. package/.turbo/turbo-build.log +84 -84
  2. package/AGENTS.md +29 -21
  3. package/CHANGELOG.md +27 -0
  4. package/README.md +36 -49
  5. package/dist/browser/components/marketing/ChangelogPage.js +8 -8
  6. package/dist/browser/components/marketing/CofounderPage.js +167 -523
  7. package/dist/browser/components/marketing/ContactClient.js +200 -207
  8. package/dist/browser/components/marketing/ContributePage.js +211 -463
  9. package/dist/browser/components/marketing/DesignPartnerPage.js +165 -218
  10. package/dist/browser/components/marketing/LandingPage.js +464 -568
  11. package/dist/browser/components/marketing/PricingClient.js +213 -839
  12. package/dist/browser/components/marketing/ProductClientPage.js +265 -463
  13. package/dist/browser/components/marketing/index.js +2007 -3338
  14. package/dist/browser/components/marketing/pricing-thinking-modal.js +12 -12
  15. package/dist/browser/components/marketing/sections/AudienceSection.js +2 -2
  16. package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
  17. package/dist/browser/components/marketing/sections/CtaSection.js +3 -3
  18. package/dist/browser/components/marketing/sections/FearsSection.js +3 -3
  19. package/dist/browser/components/marketing/sections/HeroMarketingSection.js +6 -6
  20. package/dist/browser/components/marketing/sections/IconGridSection.js +2 -2
  21. package/dist/browser/components/marketing/sections/OutputsSection.js +2 -2
  22. package/dist/browser/components/marketing/sections/ProblemSection.js +2 -2
  23. package/dist/browser/components/marketing/sections/SolutionSection.js +2 -2
  24. package/dist/browser/components/marketing/sections/StepsSection.js +4 -4
  25. package/dist/browser/components/marketing/studio-signup-section.js +25 -41
  26. package/dist/browser/components/templates/TemplatesClientPage.js +2324 -3578
  27. package/dist/browser/components/templates/TemplatesPage.js +1 -1
  28. package/dist/browser/components/templates/TemplatesPreviewModal.js +3 -3
  29. package/dist/browser/components/templates/index.js +2361 -3615
  30. package/dist/browser/index.js +2363 -3617
  31. package/dist/browser/libs/email/client.js +1 -1
  32. package/dist/browser/libs/email/contact.js +1 -1
  33. package/dist/browser/libs/email/newsletter.js +1 -1
  34. package/dist/browser/libs/email/waitlist-application.js +1 -1
  35. package/dist/browser/libs/email/waitlist.js +1 -1
  36. package/dist/browser/registry/engine.js +2003 -3334
  37. package/dist/browser/registry/index.js +2003 -3334
  38. package/dist/browser/registry/registry-docs.js +2 -2
  39. package/dist/browser/registry/registry-landing.js +2007 -3338
  40. package/dist/browser/registry/registry.js +2003 -3334
  41. package/dist/browser/registry/utils.js +2003 -3334
  42. package/dist/components/marketing/ChangelogPage.js +8 -8
  43. package/dist/components/marketing/CofounderPage.js +167 -523
  44. package/dist/components/marketing/ContactClient.js +200 -207
  45. package/dist/components/marketing/ContributePage.d.ts +0 -2
  46. package/dist/components/marketing/ContributePage.js +211 -463
  47. package/dist/components/marketing/DesignPartnerPage.js +165 -218
  48. package/dist/components/marketing/LandingPage.js +464 -568
  49. package/dist/components/marketing/PricingClient.js +213 -839
  50. package/dist/components/marketing/ProductClientPage.js +265 -463
  51. package/dist/components/marketing/index.d.ts +5 -5
  52. package/dist/components/marketing/index.js +2007 -3338
  53. package/dist/components/marketing/pricing-thinking-modal.js +12 -12
  54. package/dist/components/marketing/sections/AudienceSection.js +2 -2
  55. package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
  56. package/dist/components/marketing/sections/CtaSection.js +3 -3
  57. package/dist/components/marketing/sections/FearsSection.js +3 -3
  58. package/dist/components/marketing/sections/HeroMarketingSection.js +6 -6
  59. package/dist/components/marketing/sections/IconGridSection.d.ts +3 -3
  60. package/dist/components/marketing/sections/IconGridSection.js +2 -2
  61. package/dist/components/marketing/sections/OutputsSection.js +2 -2
  62. package/dist/components/marketing/sections/ProblemSection.js +2 -2
  63. package/dist/components/marketing/sections/SolutionSection.js +2 -2
  64. package/dist/components/marketing/sections/StepsSection.js +4 -4
  65. package/dist/components/marketing/studio-signup-section.js +25 -41
  66. package/dist/components/templates/TemplatesClientPage.js +2324 -3578
  67. package/dist/components/templates/TemplatesPage.js +1 -1
  68. package/dist/components/templates/TemplatesPreviewModal.js +3 -3
  69. package/dist/components/templates/index.js +2361 -3615
  70. package/dist/index.js +2363 -3617
  71. package/dist/libs/email/client.js +1 -1
  72. package/dist/libs/email/contact.js +1 -1
  73. package/dist/libs/email/newsletter.js +1 -1
  74. package/dist/libs/email/waitlist-application.js +1 -1
  75. package/dist/libs/email/waitlist.js +1 -1
  76. package/dist/node/components/marketing/ChangelogPage.js +8 -8
  77. package/dist/node/components/marketing/CofounderPage.js +167 -523
  78. package/dist/node/components/marketing/ContactClient.js +200 -207
  79. package/dist/node/components/marketing/ContributePage.js +211 -463
  80. package/dist/node/components/marketing/DesignPartnerPage.js +165 -218
  81. package/dist/node/components/marketing/LandingPage.js +464 -568
  82. package/dist/node/components/marketing/PricingClient.js +213 -839
  83. package/dist/node/components/marketing/ProductClientPage.js +265 -463
  84. package/dist/node/components/marketing/index.js +2007 -3338
  85. package/dist/node/components/marketing/pricing-thinking-modal.js +12 -12
  86. package/dist/node/components/marketing/sections/AudienceSection.js +2 -2
  87. package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
  88. package/dist/node/components/marketing/sections/CtaSection.js +3 -3
  89. package/dist/node/components/marketing/sections/FearsSection.js +3 -3
  90. package/dist/node/components/marketing/sections/HeroMarketingSection.js +6 -6
  91. package/dist/node/components/marketing/sections/IconGridSection.js +2 -2
  92. package/dist/node/components/marketing/sections/OutputsSection.js +2 -2
  93. package/dist/node/components/marketing/sections/ProblemSection.js +2 -2
  94. package/dist/node/components/marketing/sections/SolutionSection.js +2 -2
  95. package/dist/node/components/marketing/sections/StepsSection.js +4 -4
  96. package/dist/node/components/marketing/studio-signup-section.js +25 -41
  97. package/dist/node/components/templates/TemplatesClientPage.js +2324 -3578
  98. package/dist/node/components/templates/TemplatesPage.js +1 -1
  99. package/dist/node/components/templates/TemplatesPreviewModal.js +3 -3
  100. package/dist/node/components/templates/index.js +2361 -3615
  101. package/dist/node/index.js +2363 -3617
  102. package/dist/node/libs/email/client.js +1 -1
  103. package/dist/node/libs/email/contact.js +1 -1
  104. package/dist/node/libs/email/newsletter.js +1 -1
  105. package/dist/node/libs/email/waitlist-application.js +1 -1
  106. package/dist/node/libs/email/waitlist.js +1 -1
  107. package/dist/node/registry/engine.js +2003 -3334
  108. package/dist/node/registry/index.js +2003 -3334
  109. package/dist/node/registry/registry-docs.js +2 -2
  110. package/dist/node/registry/registry-landing.js +2007 -3338
  111. package/dist/node/registry/registry.js +2003 -3334
  112. package/dist/node/registry/utils.js +2003 -3334
  113. package/dist/registry/engine.js +2003 -3334
  114. package/dist/registry/index.js +2003 -3334
  115. package/dist/registry/registry-docs.js +2 -2
  116. package/dist/registry/registry-landing.js +2007 -3338
  117. package/dist/registry/registry.js +2003 -3334
  118. package/dist/registry/utils.js +2003 -3334
  119. package/package.json +29 -29
  120. package/src/bundles/MarketingBundle.ts +273 -273
  121. package/src/components/marketing/ChangelogPage.tsx +72 -100
  122. package/src/components/marketing/CofounderPage.tsx +120 -384
  123. package/src/components/marketing/ContactClient.tsx +164 -154
  124. package/src/components/marketing/ContributePage.tsx +139 -313
  125. package/src/components/marketing/DesignPartnerPage.tsx +133 -171
  126. package/src/components/marketing/LandingPage.tsx +353 -25
  127. package/src/components/marketing/PricingClient.tsx +192 -437
  128. package/src/components/marketing/ProductClientPage.tsx +255 -377
  129. package/src/components/marketing/index.ts +5 -5
  130. package/src/components/marketing/pricing-thinking-modal.tsx +197 -197
  131. package/src/components/marketing/sections/AudienceSection.tsx +55 -56
  132. package/src/components/marketing/sections/CorePositioningSection.tsx +37 -37
  133. package/src/components/marketing/sections/CtaSection.tsx +49 -50
  134. package/src/components/marketing/sections/DevelopersSection.tsx +26 -27
  135. package/src/components/marketing/sections/FearsSection.tsx +36 -37
  136. package/src/components/marketing/sections/HeroMarketingSection.tsx +59 -59
  137. package/src/components/marketing/sections/IconGridSection.tsx +71 -71
  138. package/src/components/marketing/sections/OutputsSection.tsx +51 -52
  139. package/src/components/marketing/sections/ProblemSection.tsx +39 -40
  140. package/src/components/marketing/sections/SolutionSection.tsx +39 -40
  141. package/src/components/marketing/sections/StepsSection.tsx +47 -48
  142. package/src/components/marketing/studio-signup-section.tsx +39 -41
  143. package/src/components/templates/TemplatesClientPage.tsx +727 -685
  144. package/src/components/templates/TemplatesPage.tsx +110 -110
  145. package/src/components/templates/TemplatesPreviewModal.tsx +197 -198
  146. package/src/index.ts +4 -4
  147. package/src/libs/email/client.test.ts +81 -81
  148. package/src/libs/email/client.ts +111 -111
  149. package/src/libs/email/contact.ts +35 -35
  150. package/src/libs/email/newsletter.ts +46 -46
  151. package/src/libs/email/types.ts +29 -29
  152. package/src/libs/email/utils.ts +5 -5
  153. package/src/libs/email/waitlist-application.ts +72 -72
  154. package/src/libs/email/waitlist.ts +46 -46
  155. package/src/libs/pricing-examples.ts +12 -12
  156. package/src/registry/engine.ts +16 -16
  157. package/src/registry/factory.ts +57 -57
  158. package/src/registry/registry-docs.ts +656 -666
  159. package/src/registry/registry-landing.ts +94 -95
  160. package/src/registry/registry.ts +36 -37
  161. package/src/registry/types.ts +2 -2
  162. package/src/registry/utils.ts +56 -56
  163. package/tsconfig.json +11 -11
  164. package/tsdown.config.js +5 -5
@@ -1,391 +1,269 @@
1
1
  'use client';
2
2
 
3
- import Link from '@contractspec/lib.ui-link';
4
3
  import {
5
- analyticsEventNames,
6
- captureAnalyticsEvent,
4
+ analyticsEventNames,
5
+ captureAnalyticsEvent,
7
6
  } from '@contractspec/bundle.library/libs/posthog/client';
8
7
  import {
9
- CheckCircle,
10
- ChevronRight,
11
- Database,
12
- FileCode,
13
- GitBranch,
14
- Layers,
15
- RefreshCw,
16
- Shield,
17
- Unlock,
18
- Zap,
8
+ ArrowRight,
9
+ Blocks,
10
+ Bot,
11
+ Braces,
12
+ Captions,
13
+ CheckCircle2,
14
+ ClipboardCheck,
15
+ Layers3,
16
+ ShieldCheck,
17
+ Sparkles,
19
18
  } from 'lucide-react';
19
+ import Link from 'next/link';
20
20
 
21
- export const ProductClientPage = () => (
22
- <main className="">
23
- {/* Hero */}
24
- <section className="section-padding hero-gradient relative">
25
- <div className="mx-auto max-w-4xl space-y-6 text-center">
26
- <h1 className="text-5xl leading-tight font-bold md:text-6xl">
27
- Compiler for AI-coded systems
28
- </h1>
29
- <p className="text-muted-foreground mx-auto max-w-2xl text-lg">
30
- Define contracts once. Generate consistent code across API, DB, UI,
31
- and events. Regenerate safely anytime. No lock-in.
32
- </p>
33
- <div className="flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row">
34
- <Link
35
- href="/install"
36
- onClick={() =>
37
- captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, {
38
- surface: 'product-hero',
39
- })
40
- }
41
- className="btn-primary inline-flex items-center gap-2"
42
- >
43
- Install OSS Core <ChevronRight size={16} />
44
- </Link>
45
- <Link href="/pricing" className="btn-ghost">
46
- View pricing
47
- </Link>
48
- </div>
49
- </div>
50
- </section>
21
+ const layers = [
22
+ {
23
+ name: 'Contracts and specs',
24
+ copy: 'The canonical product rules your team wants the system to keep respecting over time.',
25
+ icon: Braces,
26
+ },
27
+ {
28
+ name: 'Generation and runtime bridges',
29
+ copy: 'The adapters that turn those rules into API, UI, data, event, MCP, and client-facing surfaces.',
30
+ icon: Layers3,
31
+ },
32
+ {
33
+ name: 'Harness and proof workflows',
34
+ copy: 'The inspection, replay, evaluation, and evidence surfaces that tell you whether automation is safe.',
35
+ icon: ClipboardCheck,
36
+ },
37
+ {
38
+ name: 'Studio operating product',
39
+ copy: 'The opinionated team workflow for running evidence, drafts, review, exports, and checks on top of the same foundation.',
40
+ icon: Sparkles,
41
+ },
42
+ ];
43
+
44
+ const comparison = [
45
+ {
46
+ label: 'OSS/Core',
47
+ points: [
48
+ 'You want explicit contracts, safe regeneration, and standards-first outputs.',
49
+ 'You need to stabilize an existing product incrementally.',
50
+ 'You want the foundation without being forced into a hosted product loop.',
51
+ ],
52
+ },
53
+ {
54
+ label: 'Studio',
55
+ points: [
56
+ 'You want the operating surface for evidence, drafts, review, exports, and follow-up.',
57
+ 'You want packaged workflows and coordination on top of the same contract system.',
58
+ 'You want the product that absorbs more operational complexity for the team.',
59
+ ],
60
+ },
61
+ ];
62
+
63
+ const proofs = [
64
+ {
65
+ label: 'Explicit contracts, not inferred conventions',
66
+ icon: ShieldCheck,
67
+ },
68
+ {
69
+ label: 'Standard outputs the team can own and change',
70
+ icon: Bot,
71
+ },
72
+ {
73
+ label: 'Multi-surface consistency across API, UI, data, and tools',
74
+ icon: Blocks,
75
+ },
76
+ {
77
+ label: 'Incremental adoption instead of rewrite-only adoption',
78
+ icon: Captions,
79
+ },
80
+ ];
51
81
 
52
- {/* Multi-Surface Consistency */}
53
- <section className="section-padding border-border border-b">
54
- <div className="mx-auto max-w-4xl space-y-8">
55
- <div className="space-y-4">
56
- <div className="inline-flex items-center gap-2 rounded-full border border-blue-500/20 bg-blue-500/10 px-3 py-1">
57
- <Layers size={16} className="text-blue-400" />
58
- <span className="text-sm font-medium text-blue-300">
59
- Multi-Surface Consistency
60
- </span>
61
- </div>
62
- <h2 className="text-3xl font-bold md:text-4xl">
63
- One contract, all surfaces in sync
64
- </h2>
65
- <p className="text-muted-foreground text-lg">
66
- Stop chasing drift between your API, database, UI, and events. One
67
- spec generates all outputs, guaranteed to stay consistent.
68
- </p>
69
- </div>
70
- <div className="grid gap-6 md:grid-cols-2">
71
- {[
72
- {
73
- title: 'REST & GraphQL API',
74
- description:
75
- 'Type-safe endpoints with validation. Standard Express, Hono, Elysia, or Apollo handlers.',
76
- icon: Zap,
77
- },
78
- {
79
- title: 'Database Schema',
80
- description:
81
- 'Prisma migrations and types generated from the same spec. Always in sync with your API.',
82
- icon: Database,
83
- },
84
- {
85
- title: 'UI Components',
86
- description:
87
- 'React forms and views derived from specs. Validation and types flow through automatically.',
88
- icon: FileCode,
89
- },
90
- {
91
- title: 'MCP Tools & Events',
92
- description:
93
- 'AI agent tool definitions and event schemas. Same contract, different surfaces.',
94
- icon: GitBranch,
95
- },
96
- ].map((item, i) => (
97
- <div key={i} className="card-subtle space-y-4 p-6">
98
- <item.icon className="text-blue-400" size={24} />
99
- <h3 className="text-lg font-bold">{item.title}</h3>
100
- <p className="text-muted-foreground text-sm">
101
- {item.description}
102
- </p>
103
- </div>
104
- ))}
105
- </div>
106
- </div>
107
- </section>
82
+ function trackInstall() {
83
+ captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, {
84
+ surface: 'product-hero',
85
+ });
86
+ }
108
87
 
109
- {/* Safe Regeneration */}
110
- <section className="section-padding border-border bg-muted/20 border-b">
111
- <div className="mx-auto max-w-4xl space-y-8">
112
- <div className="space-y-4">
113
- <div className="inline-flex items-center gap-2 rounded-full border border-emerald-500/20 bg-emerald-500/10 px-3 py-1">
114
- <RefreshCw size={16} className="text-emerald-400" />
115
- <span className="text-sm font-medium text-emerald-300">
116
- Safe Regeneration
117
- </span>
118
- </div>
119
- <h2 className="text-3xl font-bold md:text-4xl">
120
- Regenerate anytime without fear
121
- </h2>
122
- <p className="text-muted-foreground text-lg">
123
- Contracts enforce invariants. Breaking changes are caught at compile
124
- time, not production. Regenerate with confidence.
125
- </p>
126
- </div>
127
- <div className="grid gap-6 md:grid-cols-2">
128
- <div className="card-subtle space-y-4 p-6">
129
- <h3 className="font-bold">Spec-First Safety</h3>
130
- <p className="text-muted-foreground text-sm">
131
- AI agents read specs, not implementations. Generated code that
132
- violates contracts gets flagged automatically.
133
- </p>
134
- <ul className="text-muted-foreground space-y-2 text-sm">
135
- <li className="flex gap-3">
136
- <CheckCircle
137
- size={16}
138
- className="mt-0.5 flex-shrink-0 text-emerald-400"
139
- />
140
- Type-safe from spec to runtime
141
- </li>
142
- <li className="flex gap-3">
143
- <CheckCircle
144
- size={16}
145
- className="mt-0.5 flex-shrink-0 text-emerald-400"
146
- />
147
- Invariants enforced at compile time
148
- </li>
149
- <li className="flex gap-3">
150
- <CheckCircle
151
- size={16}
152
- className="mt-0.5 flex-shrink-0 text-emerald-400"
153
- />
154
- Breaking changes detected early
155
- </li>
156
- </ul>
157
- </div>
158
- <div className="card-subtle space-y-4 p-6">
159
- <h3 className="font-bold">Version Control Built-in</h3>
160
- <p className="text-muted-foreground text-sm">
161
- Every spec change is tracked. Roll back to any previous version.
162
- Migrations are explicit and reversible.
163
- </p>
164
- <ul className="text-muted-foreground space-y-2 text-sm">
165
- <li className="flex gap-3">
166
- <CheckCircle
167
- size={16}
168
- className="mt-0.5 flex-shrink-0 text-emerald-400"
169
- />
170
- Git-native spec history
171
- </li>
172
- <li className="flex gap-3">
173
- <CheckCircle
174
- size={16}
175
- className="mt-0.5 flex-shrink-0 text-emerald-400"
176
- />
177
- Explicit migration paths
178
- </li>
179
- <li className="flex gap-3">
180
- <CheckCircle
181
- size={16}
182
- className="mt-0.5 flex-shrink-0 text-emerald-400"
183
- />
184
- One-click rollback
185
- </li>
186
- </ul>
187
- </div>
188
- </div>
189
- </div>
190
- </section>
88
+ function trackStudio() {
89
+ captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
90
+ surface: 'product-hero',
91
+ });
92
+ }
93
+
94
+ export const ProductClientPage = () => (
95
+ <main>
96
+ <section className="section-padding hero-gradient border-border/70 border-b">
97
+ <div className="editorial-shell grid gap-10 lg:grid-cols-[1.05fr_0.95fr]">
98
+ <div className="space-y-6">
99
+ <p className="editorial-kicker">Product overview</p>
100
+ <h1 className="editorial-title max-w-4xl">
101
+ An open system for keeping AI-native products coherent.
102
+ </h1>
103
+ <p className="editorial-subtitle">
104
+ ContractSpec is not one narrow generator. It is the explicit layer
105
+ that lets teams define system behavior, keep multiple surfaces
106
+ aligned, regenerate safely, and move into Studio when they want the
107
+ operating product.
108
+ </p>
109
+ <div className="flex flex-col gap-3 sm:flex-row">
110
+ <Link
111
+ href="/install"
112
+ className="btn-primary"
113
+ onClick={trackInstall}
114
+ >
115
+ Start with OSS <ArrowRight className="ml-2 h-4 w-4" />
116
+ </Link>
117
+ <Link
118
+ href="https://www.contractspec.studio"
119
+ className="btn-ghost"
120
+ onClick={trackStudio}
121
+ >
122
+ Explore Studio
123
+ </Link>
124
+ </div>
125
+ </div>
126
+ <div className="editorial-panel space-y-5">
127
+ <p className="editorial-kicker">What the category really is</p>
128
+ <h2 className="editorial-panel-title">
129
+ Lead with the system, not just the generation step.
130
+ </h2>
131
+ <p className="text-muted-foreground text-sm leading-7">
132
+ Generation matters, but it is not the whole story. The real value is
133
+ that contracts, runtime adapters, proof surfaces, and the Studio
134
+ operating loop all remain legible as parts of the same product
135
+ system.
136
+ </p>
137
+ <div className="editorial-divider" />
138
+ <div className="grid gap-4 md:grid-cols-2">
139
+ <div className="rounded-[24px] border border-border/70 bg-muted/45 p-4">
140
+ <p className="editorial-label">Better umbrella</p>
141
+ <p className="mt-2 font-medium text-sm">
142
+ Open spec system for AI-native software
143
+ </p>
144
+ </div>
145
+ <div className="rounded-[24px] border border-border/70 bg-muted/45 p-4">
146
+ <p className="editorial-label">Where “compiler” belongs</p>
147
+ <p className="mt-2 font-medium text-sm">
148
+ Inside the technical proof, not as the whole company category
149
+ </p>
150
+ </div>
151
+ </div>
152
+ </div>
153
+ </div>
154
+ </section>
191
155
 
192
- {/* Contract Enforcement */}
193
- <section className="section-padding border-border border-b">
194
- <div className="mx-auto max-w-4xl space-y-8">
195
- <div className="space-y-4">
196
- <div className="inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1">
197
- <Shield size={16} className="text-violet-400" />
198
- <span className="text-sm font-medium text-violet-300">
199
- Contract Enforcement
200
- </span>
201
- </div>
202
- <h2 className="text-3xl font-bold md:text-4xl">
203
- AI governance that actually works
204
- </h2>
205
- <p className="text-muted-foreground text-lg">
206
- Constrain what AI agents can change. Enforce contracts they must
207
- respect. No more hallucinated refactors breaking your system.
208
- </p>
209
- </div>
210
- <div className="card-subtle space-y-6 p-6">
211
- <div className="space-y-4">
212
- <h3 className="font-bold">How contract enforcement works</h3>
213
- <p className="text-muted-foreground text-sm">
214
- Contracts define what the system should do. AI-generated code that
215
- violates these contracts is automatically flagged and rejected
216
- before it can cause damage.
217
- </p>
218
- </div>
219
- <div className="grid gap-4 md:grid-cols-3">
220
- {[
221
- {
222
- title: 'Define',
223
- description:
224
- 'Write specs in TypeScript. Define inputs, outputs, and invariants.',
225
- },
226
- {
227
- title: 'Generate',
228
- description:
229
- 'ContractSpec generates code across all surfaces from your specs.',
230
- },
231
- {
232
- title: 'Enforce',
233
- description:
234
- "Any code that violates specs is flagged. AI agents can't break contracts.",
235
- },
236
- ].map((step, i) => (
237
- <div key={i} className="space-y-2">
238
- <div className="flex h-8 w-8 items-center justify-center rounded-lg bg-violet-500/20">
239
- <div className="text-sm font-bold text-violet-400">
240
- {i + 1}
241
- </div>
242
- </div>
243
- <h4 className="text-sm font-bold">{step.title}</h4>
244
- <p className="text-muted-foreground text-xs">
245
- {step.description}
246
- </p>
247
- </div>
248
- ))}
249
- </div>
250
- </div>
251
- </div>
252
- </section>
156
+ <section className="editorial-section">
157
+ <div className="editorial-shell space-y-8">
158
+ <div className="max-w-3xl space-y-4">
159
+ <p className="editorial-kicker">Architecture by layer</p>
160
+ <h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
161
+ Each layer exists to keep the next one from drifting.
162
+ </h2>
163
+ <p className="editorial-copy">
164
+ The repo structure already tells the right story: lower layers
165
+ define explicit behavior, higher layers compose that behavior into
166
+ working surfaces, and apps stay thin.
167
+ </p>
168
+ </div>
169
+ <div className="grid gap-5 md:grid-cols-2 xl:grid-cols-4">
170
+ {layers.map((layer) => (
171
+ <div key={layer.name} className="editorial-panel">
172
+ <layer.icon className="h-5 w-5 text-[color:var(--rust)]" />
173
+ <h3 className="mt-5 font-serif text-2xl tracking-[-0.03em]">
174
+ {layer.name}
175
+ </h3>
176
+ <p className="mt-3 text-muted-foreground text-sm leading-7">
177
+ {layer.copy}
178
+ </p>
179
+ </div>
180
+ ))}
181
+ </div>
182
+ </div>
183
+ </section>
253
184
 
254
- {/* No Lock-in */}
255
- <section className="section-padding border-border border-b bg-gradient-to-br from-violet-500/10 via-indigo-500/5 to-blue-500/5">
256
- <div className="mx-auto max-w-4xl space-y-8">
257
- <div className="space-y-4">
258
- <div className="inline-flex items-center gap-2 rounded-full border border-pink-500/20 bg-pink-500/10 px-3 py-1">
259
- <Unlock size={16} className="text-pink-400" />
260
- <span className="text-sm font-medium text-pink-300">
261
- No Lock-in
262
- </span>
263
- </div>
264
- <h2 className="text-3xl font-bold md:text-4xl">
265
- You own everything. Eject anytime.
266
- </h2>
267
- <p className="text-muted-foreground text-lg">
268
- ContractSpec is a compiler, not a prison. The generated code is
269
- yours: standard TypeScript, standard SQL, standard GraphQL.
270
- </p>
271
- </div>
272
- <div className="grid gap-6 md:grid-cols-2">
273
- <div className="card-subtle space-y-4 p-6">
274
- <h3 className="text-lg font-bold">Standard Tech Output</h3>
275
- <ul className="text-muted-foreground space-y-3 text-sm">
276
- {[
277
- 'TypeScript you can read and modify',
278
- 'Prisma migrations you can run manually',
279
- 'GraphQL schemas you can serve anywhere',
280
- 'React components with no magic',
281
- 'REST handlers that work with any framework',
282
- ].map((item, i) => (
283
- <li key={i} className="flex gap-3">
284
- <CheckCircle
285
- size={16}
286
- className="mt-0.5 flex-shrink-0 text-pink-400"
287
- />
288
- {item}
289
- </li>
290
- ))}
291
- </ul>
292
- </div>
293
- <div className="card-subtle space-y-4 p-6">
294
- <h3 className="text-lg font-bold">No Proprietary Dependencies</h3>
295
- <ul className="text-muted-foreground space-y-3 text-sm">
296
- {[
297
- 'No runtime library required',
298
- 'No vendor-specific abstractions',
299
- 'Works with your existing CI/CD',
300
- 'Eject anytime, keep everything',
301
- 'Open spec format',
302
- ].map((item, i) => (
303
- <li key={i} className="flex gap-3">
304
- <CheckCircle
305
- size={16}
306
- className="mt-0.5 flex-shrink-0 text-pink-400"
307
- />
308
- {item}
309
- </li>
310
- ))}
311
- </ul>
312
- </div>
313
- </div>
314
- <div className="pt-4 text-center">
315
- <p className="text-muted-foreground mb-4 text-sm">
316
- Like TypeScript compiles to JavaScript, ContractSpec compiles to
317
- standard code.
318
- <br />
319
- <span className="font-medium text-violet-400">
320
- We're the compiler, not the prison.
321
- </span>
322
- </p>
323
- </div>
324
- </div>
325
- </section>
185
+ <section className="editorial-section bg-striped">
186
+ <div className="editorial-shell grid gap-8 lg:grid-cols-2">
187
+ {comparison.map((column) => (
188
+ <div key={column.label} className="editorial-panel">
189
+ <p className="editorial-kicker">{column.label}</p>
190
+ <h2 className="mt-3 font-serif text-3xl tracking-[-0.04em]">
191
+ {column.label === 'OSS/Core'
192
+ ? 'Adopt the open foundation first'
193
+ : 'Add the operating product when the team is ready'}
194
+ </h2>
195
+ <ul className="editorial-list mt-6">
196
+ {column.points.map((point) => (
197
+ <li key={point}>
198
+ <CheckCircle2 className="mt-1.5 h-4 w-4 shrink-0 text-[color:var(--success)]" />
199
+ <span>{point}</span>
200
+ </li>
201
+ ))}
202
+ </ul>
203
+ </div>
204
+ ))}
205
+ </div>
206
+ </section>
326
207
 
327
- {/* Incremental Adoption */}
328
- <section className="section-padding border-border border-b">
329
- <div className="mx-auto max-w-4xl space-y-8">
330
- <h2 className="text-center text-3xl font-bold md:text-4xl">
331
- Start small. Expand gradually.
332
- </h2>
333
- <p className="text-muted-foreground mx-auto max-w-2xl text-center text-lg">
334
- You don't rewrite your app. You stabilize one module at a time. Start
335
- with one endpoint, prove value, then expand.
336
- </p>
337
- <div className="grid gap-6 md:grid-cols-3">
338
- {[
339
- {
340
- title: 'Day 1',
341
- description:
342
- 'Pick one API endpoint. Write a spec. See what gets generated.',
343
- },
344
- {
345
- title: 'Week 1',
346
- description:
347
- 'Add a few more specs. Compare generated code to existing code.',
348
- },
349
- {
350
- title: 'Month 1',
351
- description:
352
- 'Migrate a full module. Enjoy multi-surface consistency.',
353
- },
354
- ].map((item, i) => (
355
- <div key={i} className="card-subtle space-y-4 p-6 text-center">
356
- <div className="text-2xl font-bold text-violet-400">
357
- {item.title}
358
- </div>
359
- <p className="text-muted-foreground text-sm">
360
- {item.description}
361
- </p>
362
- </div>
363
- ))}
364
- </div>
365
- </div>
366
- </section>
208
+ <section className="editorial-section">
209
+ <div className="editorial-shell grid gap-10 lg:grid-cols-[0.9fr_1.1fr]">
210
+ <div className="space-y-4">
211
+ <p className="editorial-kicker">Proof points</p>
212
+ <h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
213
+ What should feel different after adoption.
214
+ </h2>
215
+ <p className="editorial-copy">
216
+ The point is not just faster output. The point is that regeneration,
217
+ refactoring, and agent behavior stop feeling opaque because the team
218
+ has an explicit layer it can inspect and trust.
219
+ </p>
220
+ </div>
221
+ <div className="grid gap-5 md:grid-cols-2">
222
+ {proofs.map((proof) => {
223
+ const Icon = proof.icon;
224
+ return (
225
+ <div key={proof.label} className="editorial-panel">
226
+ <Icon className="h-5 w-5 text-[color:var(--blue)]" />
227
+ <p className="mt-5 font-medium text-lg">{proof.label}</p>
228
+ </div>
229
+ );
230
+ })}
231
+ </div>
232
+ </div>
233
+ </section>
367
234
 
368
- {/* CTA */}
369
- <section className="section-padding hero-gradient">
370
- <div className="mx-auto max-w-4xl space-y-6 text-center">
371
- <h2 className="text-3xl font-bold md:text-4xl">
372
- Ready to stabilize your AI-generated code?
373
- </h2>
374
- <p className="text-muted-foreground text-lg">
375
- Start with one module. No big-bang migration. No lock-in.
376
- </p>
377
- <div className="flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row">
378
- <Link
379
- href="/install"
380
- className="btn-primary inline-flex items-center gap-2"
381
- >
382
- Install OSS Core <ChevronRight size={16} />
383
- </Link>
384
- <Link href="https://www.contractspec.studio" className="btn-ghost">
385
- Try Studio
386
- </Link>
387
- </div>
388
- </div>
389
- </section>
390
- </main>
235
+ <section className="section-padding">
236
+ <div className="editorial-shell">
237
+ <div className="editorial-panel flex flex-col gap-8 rounded-[38px] border-dashed md:flex-row md:items-end md:justify-between">
238
+ <div className="max-w-3xl space-y-4">
239
+ <p className="editorial-kicker">Next step</p>
240
+ <h2 className="font-serif text-4xl tracking-[-0.04em] md:text-5xl">
241
+ Use the OSS layer when you want control. Use Studio when you want
242
+ the operating loop.
243
+ </h2>
244
+ <p className="editorial-copy">
245
+ That is the cleanest product split for both technical adopters and
246
+ teams buying the packaged surface later.
247
+ </p>
248
+ </div>
249
+ <div className="flex flex-col gap-3 sm:flex-row md:flex-col">
250
+ <Link
251
+ href="/install"
252
+ className="btn-primary"
253
+ onClick={trackInstall}
254
+ >
255
+ Start with OSS
256
+ </Link>
257
+ <Link
258
+ href="https://www.contractspec.studio"
259
+ className="btn-ghost"
260
+ onClick={trackStudio}
261
+ >
262
+ Explore Studio
263
+ </Link>
264
+ </div>
265
+ </div>
266
+ </div>
267
+ </section>
268
+ </main>
391
269
  );