@contractspec/bundle.marketing 3.7.6 → 3.8.2

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 +87 -87
  2. package/AGENTS.md +29 -21
  3. package/CHANGELOG.md +59 -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 +2374 -3571
  27. package/dist/browser/components/templates/TemplatesPage.js +1 -1
  28. package/dist/browser/components/templates/TemplatesPreviewModal.js +27 -3
  29. package/dist/browser/components/templates/index.js +2412 -3609
  30. package/dist/browser/index.js +2415 -3612
  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 +2374 -3571
  67. package/dist/components/templates/TemplatesPage.js +1 -1
  68. package/dist/components/templates/TemplatesPreviewModal.js +27 -3
  69. package/dist/components/templates/index.js +2412 -3609
  70. package/dist/index.js +2415 -3612
  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 +2374 -3571
  98. package/dist/node/components/templates/TemplatesPage.js +1 -1
  99. package/dist/node/components/templates/TemplatesPreviewModal.js +27 -3
  100. package/dist/node/components/templates/index.js +2412 -3609
  101. package/dist/node/index.js +2415 -3612
  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 +31 -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 +763 -685
  144. package/src/components/templates/TemplatesPage.tsx +110 -110
  145. package/src/components/templates/TemplatesPreviewModal.tsx +251 -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
@@ -7,268 +7,184 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
7
7
  });
8
8
 
9
9
  // src/components/marketing/ProductClientPage.tsx
10
- import Link from "@contractspec/lib.ui-link";
11
10
  import {
12
11
  analyticsEventNames,
13
12
  captureAnalyticsEvent
14
13
  } from "@contractspec/bundle.library/libs/posthog/client";
15
14
  import {
16
- CheckCircle,
17
- ChevronRight,
18
- Database,
19
- FileCode,
20
- GitBranch,
21
- Layers,
22
- RefreshCw,
23
- Shield,
24
- Unlock,
25
- Zap
15
+ ArrowRight,
16
+ Blocks,
17
+ Bot,
18
+ Braces,
19
+ Captions,
20
+ CheckCircle2,
21
+ ClipboardCheck,
22
+ Layers3,
23
+ ShieldCheck,
24
+ Sparkles
26
25
  } from "lucide-react";
26
+ import Link from "next/link";
27
27
  import { jsxDEV } from "react/jsx-dev-runtime";
28
28
  "use client";
29
+ var layers = [
30
+ {
31
+ name: "Contracts and specs",
32
+ copy: "The canonical product rules your team wants the system to keep respecting over time.",
33
+ icon: Braces
34
+ },
35
+ {
36
+ name: "Generation and runtime bridges",
37
+ copy: "The adapters that turn those rules into API, UI, data, event, MCP, and client-facing surfaces.",
38
+ icon: Layers3
39
+ },
40
+ {
41
+ name: "Harness and proof workflows",
42
+ copy: "The inspection, replay, evaluation, and evidence surfaces that tell you whether automation is safe.",
43
+ icon: ClipboardCheck
44
+ },
45
+ {
46
+ name: "Studio operating product",
47
+ copy: "The opinionated team workflow for running evidence, drafts, review, exports, and checks on top of the same foundation.",
48
+ icon: Sparkles
49
+ }
50
+ ];
51
+ var comparison = [
52
+ {
53
+ label: "OSS/Core",
54
+ points: [
55
+ "You want explicit contracts, safe regeneration, and standards-first outputs.",
56
+ "You need to stabilize an existing product incrementally.",
57
+ "You want the foundation without being forced into a hosted product loop."
58
+ ]
59
+ },
60
+ {
61
+ label: "Studio",
62
+ points: [
63
+ "You want the operating surface for evidence, drafts, review, exports, and follow-up.",
64
+ "You want packaged workflows and coordination on top of the same contract system.",
65
+ "You want the product that absorbs more operational complexity for the team."
66
+ ]
67
+ }
68
+ ];
69
+ var proofs = [
70
+ {
71
+ label: "Explicit contracts, not inferred conventions",
72
+ icon: ShieldCheck
73
+ },
74
+ {
75
+ label: "Standard outputs the team can own and change",
76
+ icon: Bot
77
+ },
78
+ {
79
+ label: "Multi-surface consistency across API, UI, data, and tools",
80
+ icon: Blocks
81
+ },
82
+ {
83
+ label: "Incremental adoption instead of rewrite-only adoption",
84
+ icon: Captions
85
+ }
86
+ ];
87
+ function trackInstall() {
88
+ captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, {
89
+ surface: "product-hero"
90
+ });
91
+ }
92
+ function trackStudio() {
93
+ captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
94
+ surface: "product-hero"
95
+ });
96
+ }
29
97
  var ProductClientPage = () => /* @__PURE__ */ jsxDEV("main", {
30
- className: "",
31
98
  children: [
32
99
  /* @__PURE__ */ jsxDEV("section", {
33
- className: "section-padding hero-gradient relative",
100
+ className: "section-padding hero-gradient border-border/70 border-b",
34
101
  children: /* @__PURE__ */ jsxDEV("div", {
35
- className: "mx-auto max-w-4xl space-y-6 text-center",
102
+ className: "editorial-shell grid gap-10 lg:grid-cols-[1.05fr_0.95fr]",
36
103
  children: [
37
- /* @__PURE__ */ jsxDEV("h1", {
38
- className: "text-5xl leading-tight font-bold md:text-6xl",
39
- children: "Compiler for AI-coded systems"
40
- }, undefined, false, undefined, this),
41
- /* @__PURE__ */ jsxDEV("p", {
42
- className: "text-muted-foreground mx-auto max-w-2xl text-lg",
43
- children: "Define contracts once. Generate consistent code across API, DB, UI, and events. Regenerate safely anytime. No lock-in."
44
- }, undefined, false, undefined, this),
45
104
  /* @__PURE__ */ jsxDEV("div", {
46
- className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
47
- children: [
48
- /* @__PURE__ */ jsxDEV(Link, {
49
- href: "/install",
50
- onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, {
51
- surface: "product-hero"
52
- }),
53
- className: "btn-primary inline-flex items-center gap-2",
54
- children: [
55
- "Install OSS Core ",
56
- /* @__PURE__ */ jsxDEV(ChevronRight, {
57
- size: 16
58
- }, undefined, false, undefined, this)
59
- ]
60
- }, undefined, true, undefined, this),
61
- /* @__PURE__ */ jsxDEV(Link, {
62
- href: "/pricing",
63
- className: "btn-ghost",
64
- children: "View pricing"
65
- }, undefined, false, undefined, this)
66
- ]
67
- }, undefined, true, undefined, this)
68
- ]
69
- }, undefined, true, undefined, this)
70
- }, undefined, false, undefined, this),
71
- /* @__PURE__ */ jsxDEV("section", {
72
- className: "section-padding border-border border-b",
73
- children: /* @__PURE__ */ jsxDEV("div", {
74
- className: "mx-auto max-w-4xl space-y-8",
75
- children: [
76
- /* @__PURE__ */ jsxDEV("div", {
77
- className: "space-y-4",
105
+ className: "space-y-6",
78
106
  children: [
107
+ /* @__PURE__ */ jsxDEV("p", {
108
+ className: "editorial-kicker",
109
+ children: "Product overview"
110
+ }, undefined, false, undefined, this),
111
+ /* @__PURE__ */ jsxDEV("h1", {
112
+ className: "editorial-title max-w-4xl",
113
+ children: "An open system for keeping AI-native products coherent."
114
+ }, undefined, false, undefined, this),
115
+ /* @__PURE__ */ jsxDEV("p", {
116
+ className: "editorial-subtitle",
117
+ children: "ContractSpec is not one narrow generator. It is the explicit layer that lets teams define system behavior, keep multiple surfaces aligned, regenerate safely, and move into Studio when they want the operating product."
118
+ }, undefined, false, undefined, this),
79
119
  /* @__PURE__ */ jsxDEV("div", {
80
- className: "inline-flex items-center gap-2 rounded-full border border-blue-500/20 bg-blue-500/10 px-3 py-1",
120
+ className: "flex flex-col gap-3 sm:flex-row",
81
121
  children: [
82
- /* @__PURE__ */ jsxDEV(Layers, {
83
- size: 16,
84
- className: "text-blue-400"
85
- }, undefined, false, undefined, this),
86
- /* @__PURE__ */ jsxDEV("span", {
87
- className: "text-sm font-medium text-blue-300",
88
- children: "Multi-Surface Consistency"
122
+ /* @__PURE__ */ jsxDEV(Link, {
123
+ href: "/install",
124
+ className: "btn-primary",
125
+ onClick: trackInstall,
126
+ children: [
127
+ "Start with OSS ",
128
+ /* @__PURE__ */ jsxDEV(ArrowRight, {
129
+ className: "ml-2 h-4 w-4"
130
+ }, undefined, false, undefined, this)
131
+ ]
132
+ }, undefined, true, undefined, this),
133
+ /* @__PURE__ */ jsxDEV(Link, {
134
+ href: "https://www.contractspec.studio",
135
+ className: "btn-ghost",
136
+ onClick: trackStudio,
137
+ children: "Explore Studio"
89
138
  }, undefined, false, undefined, this)
90
139
  ]
91
- }, undefined, true, undefined, this),
92
- /* @__PURE__ */ jsxDEV("h2", {
93
- className: "text-3xl font-bold md:text-4xl",
94
- children: "One contract, all surfaces in sync"
95
- }, undefined, false, undefined, this),
96
- /* @__PURE__ */ jsxDEV("p", {
97
- className: "text-muted-foreground text-lg",
98
- children: "Stop chasing drift between your API, database, UI, and events. One spec generates all outputs, guaranteed to stay consistent."
99
- }, undefined, false, undefined, this)
140
+ }, undefined, true, undefined, this)
100
141
  ]
101
142
  }, undefined, true, undefined, this),
102
143
  /* @__PURE__ */ jsxDEV("div", {
103
- className: "grid gap-6 md:grid-cols-2",
144
+ className: "editorial-panel space-y-5",
104
145
  children: [
105
- {
106
- title: "REST & GraphQL API",
107
- description: "Type-safe endpoints with validation. Standard Express, Hono, Elysia, or Apollo handlers.",
108
- icon: Zap
109
- },
110
- {
111
- title: "Database Schema",
112
- description: "Prisma migrations and types generated from the same spec. Always in sync with your API.",
113
- icon: Database
114
- },
115
- {
116
- title: "UI Components",
117
- description: "React forms and views derived from specs. Validation and types flow through automatically.",
118
- icon: FileCode
119
- },
120
- {
121
- title: "MCP Tools & Events",
122
- description: "AI agent tool definitions and event schemas. Same contract, different surfaces.",
123
- icon: GitBranch
124
- }
125
- ].map((item, i) => /* @__PURE__ */ jsxDEV("div", {
126
- className: "card-subtle space-y-4 p-6",
127
- children: [
128
- /* @__PURE__ */ jsxDEV(item.icon, {
129
- className: "text-blue-400",
130
- size: 24
131
- }, undefined, false, undefined, this),
132
- /* @__PURE__ */ jsxDEV("h3", {
133
- className: "text-lg font-bold",
134
- children: item.title
135
- }, undefined, false, undefined, this),
136
- /* @__PURE__ */ jsxDEV("p", {
137
- className: "text-muted-foreground text-sm",
138
- children: item.description
139
- }, undefined, false, undefined, this)
140
- ]
141
- }, i, true, undefined, this))
142
- }, undefined, false, undefined, this)
143
- ]
144
- }, undefined, true, undefined, this)
145
- }, undefined, false, undefined, this),
146
- /* @__PURE__ */ jsxDEV("section", {
147
- className: "section-padding border-border bg-muted/20 border-b",
148
- children: /* @__PURE__ */ jsxDEV("div", {
149
- className: "mx-auto max-w-4xl space-y-8",
150
- children: [
151
- /* @__PURE__ */ jsxDEV("div", {
152
- className: "space-y-4",
153
- children: [
154
- /* @__PURE__ */ jsxDEV("div", {
155
- className: "inline-flex items-center gap-2 rounded-full border border-emerald-500/20 bg-emerald-500/10 px-3 py-1",
156
- children: [
157
- /* @__PURE__ */ jsxDEV(RefreshCw, {
158
- size: 16,
159
- className: "text-emerald-400"
160
- }, undefined, false, undefined, this),
161
- /* @__PURE__ */ jsxDEV("span", {
162
- className: "text-sm font-medium text-emerald-300",
163
- children: "Safe Regeneration"
164
- }, undefined, false, undefined, this)
165
- ]
166
- }, undefined, true, undefined, this),
146
+ /* @__PURE__ */ jsxDEV("p", {
147
+ className: "editorial-kicker",
148
+ children: "What the category really is"
149
+ }, undefined, false, undefined, this),
167
150
  /* @__PURE__ */ jsxDEV("h2", {
168
- className: "text-3xl font-bold md:text-4xl",
169
- children: "Regenerate anytime without fear"
151
+ className: "editorial-panel-title",
152
+ children: "Lead with the system, not just the generation step."
170
153
  }, undefined, false, undefined, this),
171
154
  /* @__PURE__ */ jsxDEV("p", {
172
- className: "text-muted-foreground text-lg",
173
- children: "Contracts enforce invariants. Breaking changes are caught at compile time, not production. Regenerate with confidence."
174
- }, undefined, false, undefined, this)
175
- ]
176
- }, undefined, true, undefined, this),
177
- /* @__PURE__ */ jsxDEV("div", {
178
- className: "grid gap-6 md:grid-cols-2",
179
- children: [
155
+ className: "text-muted-foreground text-sm leading-7",
156
+ children: "Generation matters, but it is not the whole story. The real value is that contracts, runtime adapters, proof surfaces, and the Studio operating loop all remain legible as parts of the same product system."
157
+ }, undefined, false, undefined, this),
180
158
  /* @__PURE__ */ jsxDEV("div", {
181
- className: "card-subtle space-y-4 p-6",
159
+ className: "editorial-divider"
160
+ }, undefined, false, undefined, this),
161
+ /* @__PURE__ */ jsxDEV("div", {
162
+ className: "grid gap-4 md:grid-cols-2",
182
163
  children: [
183
- /* @__PURE__ */ jsxDEV("h3", {
184
- className: "font-bold",
185
- children: "Spec-First Safety"
186
- }, undefined, false, undefined, this),
187
- /* @__PURE__ */ jsxDEV("p", {
188
- className: "text-muted-foreground text-sm",
189
- children: "AI agents read specs, not implementations. Generated code that violates contracts gets flagged automatically."
190
- }, undefined, false, undefined, this),
191
- /* @__PURE__ */ jsxDEV("ul", {
192
- className: "text-muted-foreground space-y-2 text-sm",
164
+ /* @__PURE__ */ jsxDEV("div", {
165
+ className: "rounded-[24px] border border-border/70 bg-muted/45 p-4",
193
166
  children: [
194
- /* @__PURE__ */ jsxDEV("li", {
195
- className: "flex gap-3",
196
- children: [
197
- /* @__PURE__ */ jsxDEV(CheckCircle, {
198
- size: 16,
199
- className: "mt-0.5 flex-shrink-0 text-emerald-400"
200
- }, undefined, false, undefined, this),
201
- "Type-safe from spec to runtime"
202
- ]
203
- }, undefined, true, undefined, this),
204
- /* @__PURE__ */ jsxDEV("li", {
205
- className: "flex gap-3",
206
- children: [
207
- /* @__PURE__ */ jsxDEV(CheckCircle, {
208
- size: 16,
209
- className: "mt-0.5 flex-shrink-0 text-emerald-400"
210
- }, undefined, false, undefined, this),
211
- "Invariants enforced at compile time"
212
- ]
213
- }, undefined, true, undefined, this),
214
- /* @__PURE__ */ jsxDEV("li", {
215
- className: "flex gap-3",
216
- children: [
217
- /* @__PURE__ */ jsxDEV(CheckCircle, {
218
- size: 16,
219
- className: "mt-0.5 flex-shrink-0 text-emerald-400"
220
- }, undefined, false, undefined, this),
221
- "Breaking changes detected early"
222
- ]
223
- }, undefined, true, undefined, this)
167
+ /* @__PURE__ */ jsxDEV("p", {
168
+ className: "editorial-label",
169
+ children: "Better umbrella"
170
+ }, undefined, false, undefined, this),
171
+ /* @__PURE__ */ jsxDEV("p", {
172
+ className: "mt-2 font-medium text-sm",
173
+ children: "Open spec system for AI-native software"
174
+ }, undefined, false, undefined, this)
224
175
  ]
225
- }, undefined, true, undefined, this)
226
- ]
227
- }, undefined, true, undefined, this),
228
- /* @__PURE__ */ jsxDEV("div", {
229
- className: "card-subtle space-y-4 p-6",
230
- children: [
231
- /* @__PURE__ */ jsxDEV("h3", {
232
- className: "font-bold",
233
- children: "Version Control Built-in"
234
- }, undefined, false, undefined, this),
235
- /* @__PURE__ */ jsxDEV("p", {
236
- className: "text-muted-foreground text-sm",
237
- children: "Every spec change is tracked. Roll back to any previous version. Migrations are explicit and reversible."
238
- }, undefined, false, undefined, this),
239
- /* @__PURE__ */ jsxDEV("ul", {
240
- className: "text-muted-foreground space-y-2 text-sm",
176
+ }, undefined, true, undefined, this),
177
+ /* @__PURE__ */ jsxDEV("div", {
178
+ className: "rounded-[24px] border border-border/70 bg-muted/45 p-4",
241
179
  children: [
242
- /* @__PURE__ */ jsxDEV("li", {
243
- className: "flex gap-3",
244
- children: [
245
- /* @__PURE__ */ jsxDEV(CheckCircle, {
246
- size: 16,
247
- className: "mt-0.5 flex-shrink-0 text-emerald-400"
248
- }, undefined, false, undefined, this),
249
- "Git-native spec history"
250
- ]
251
- }, undefined, true, undefined, this),
252
- /* @__PURE__ */ jsxDEV("li", {
253
- className: "flex gap-3",
254
- children: [
255
- /* @__PURE__ */ jsxDEV(CheckCircle, {
256
- size: 16,
257
- className: "mt-0.5 flex-shrink-0 text-emerald-400"
258
- }, undefined, false, undefined, this),
259
- "Explicit migration paths"
260
- ]
261
- }, undefined, true, undefined, this),
262
- /* @__PURE__ */ jsxDEV("li", {
263
- className: "flex gap-3",
264
- children: [
265
- /* @__PURE__ */ jsxDEV(CheckCircle, {
266
- size: 16,
267
- className: "mt-0.5 flex-shrink-0 text-emerald-400"
268
- }, undefined, false, undefined, this),
269
- "One-click rollback"
270
- ]
271
- }, undefined, true, undefined, this)
180
+ /* @__PURE__ */ jsxDEV("p", {
181
+ className: "editorial-label",
182
+ children: "Where “compiler” belongs"
183
+ }, undefined, false, undefined, this),
184
+ /* @__PURE__ */ jsxDEV("p", {
185
+ className: "mt-2 font-medium text-sm",
186
+ children: "Inside the technical proof, not as the whole company category"
187
+ }, undefined, false, undefined, this)
272
188
  ]
273
189
  }, undefined, true, undefined, this)
274
190
  ]
@@ -279,282 +195,168 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV("main", {
279
195
  }, undefined, true, undefined, this)
280
196
  }, undefined, false, undefined, this),
281
197
  /* @__PURE__ */ jsxDEV("section", {
282
- className: "section-padding border-border border-b",
198
+ className: "editorial-section",
283
199
  children: /* @__PURE__ */ jsxDEV("div", {
284
- className: "mx-auto max-w-4xl space-y-8",
200
+ className: "editorial-shell space-y-8",
285
201
  children: [
286
202
  /* @__PURE__ */ jsxDEV("div", {
287
- className: "space-y-4",
203
+ className: "max-w-3xl space-y-4",
288
204
  children: [
289
- /* @__PURE__ */ jsxDEV("div", {
290
- className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
291
- children: [
292
- /* @__PURE__ */ jsxDEV(Shield, {
293
- size: 16,
294
- className: "text-violet-400"
295
- }, undefined, false, undefined, this),
296
- /* @__PURE__ */ jsxDEV("span", {
297
- className: "text-sm font-medium text-violet-300",
298
- children: "Contract Enforcement"
299
- }, undefined, false, undefined, this)
300
- ]
301
- }, undefined, true, undefined, this),
205
+ /* @__PURE__ */ jsxDEV("p", {
206
+ className: "editorial-kicker",
207
+ children: "Architecture by layer"
208
+ }, undefined, false, undefined, this),
302
209
  /* @__PURE__ */ jsxDEV("h2", {
303
- className: "text-3xl font-bold md:text-4xl",
304
- children: "AI governance that actually works"
210
+ className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
211
+ children: "Each layer exists to keep the next one from drifting."
305
212
  }, undefined, false, undefined, this),
306
213
  /* @__PURE__ */ jsxDEV("p", {
307
- className: "text-muted-foreground text-lg",
308
- children: "Constrain what AI agents can change. Enforce contracts they must respect. No more hallucinated refactors breaking your system."
214
+ className: "editorial-copy",
215
+ children: "The repo structure already tells the right story: lower layers define explicit behavior, higher layers compose that behavior into working surfaces, and apps stay thin."
309
216
  }, undefined, false, undefined, this)
310
217
  ]
311
218
  }, undefined, true, undefined, this),
312
219
  /* @__PURE__ */ jsxDEV("div", {
313
- className: "card-subtle space-y-6 p-6",
314
- children: [
315
- /* @__PURE__ */ jsxDEV("div", {
316
- className: "space-y-4",
220
+ className: "grid gap-5 md:grid-cols-2 xl:grid-cols-4",
221
+ children: layers.map((layer) => /* @__PURE__ */ jsxDEV("div", {
222
+ className: "editorial-panel",
223
+ children: [
224
+ /* @__PURE__ */ jsxDEV(layer.icon, {
225
+ className: "h-5 w-5 text-[color:var(--rust)]"
226
+ }, undefined, false, undefined, this),
227
+ /* @__PURE__ */ jsxDEV("h3", {
228
+ className: "mt-5 font-serif text-2xl tracking-[-0.03em]",
229
+ children: layer.name
230
+ }, undefined, false, undefined, this),
231
+ /* @__PURE__ */ jsxDEV("p", {
232
+ className: "mt-3 text-muted-foreground text-sm leading-7",
233
+ children: layer.copy
234
+ }, undefined, false, undefined, this)
235
+ ]
236
+ }, layer.name, true, undefined, this))
237
+ }, undefined, false, undefined, this)
238
+ ]
239
+ }, undefined, true, undefined, this)
240
+ }, undefined, false, undefined, this),
241
+ /* @__PURE__ */ jsxDEV("section", {
242
+ className: "editorial-section bg-striped",
243
+ children: /* @__PURE__ */ jsxDEV("div", {
244
+ className: "editorial-shell grid gap-8 lg:grid-cols-2",
245
+ children: comparison.map((column) => /* @__PURE__ */ jsxDEV("div", {
246
+ className: "editorial-panel",
247
+ children: [
248
+ /* @__PURE__ */ jsxDEV("p", {
249
+ className: "editorial-kicker",
250
+ children: column.label
251
+ }, undefined, false, undefined, this),
252
+ /* @__PURE__ */ jsxDEV("h2", {
253
+ className: "mt-3 font-serif text-3xl tracking-[-0.04em]",
254
+ children: column.label === "OSS/Core" ? "Adopt the open foundation first" : "Add the operating product when the team is ready"
255
+ }, undefined, false, undefined, this),
256
+ /* @__PURE__ */ jsxDEV("ul", {
257
+ className: "editorial-list mt-6",
258
+ children: column.points.map((point) => /* @__PURE__ */ jsxDEV("li", {
317
259
  children: [
318
- /* @__PURE__ */ jsxDEV("h3", {
319
- className: "font-bold",
320
- children: "How contract enforcement works"
260
+ /* @__PURE__ */ jsxDEV(CheckCircle2, {
261
+ className: "mt-1.5 h-4 w-4 shrink-0 text-[color:var(--success)]"
321
262
  }, undefined, false, undefined, this),
322
- /* @__PURE__ */ jsxDEV("p", {
323
- className: "text-muted-foreground text-sm",
324
- children: "Contracts define what the system should do. AI-generated code that violates these contracts is automatically flagged and rejected before it can cause damage."
263
+ /* @__PURE__ */ jsxDEV("span", {
264
+ children: point
325
265
  }, undefined, false, undefined, this)
326
266
  ]
327
- }, undefined, true, undefined, this),
328
- /* @__PURE__ */ jsxDEV("div", {
329
- className: "grid gap-4 md:grid-cols-3",
330
- children: [
331
- {
332
- title: "Define",
333
- description: "Write specs in TypeScript. Define inputs, outputs, and invariants."
334
- },
335
- {
336
- title: "Generate",
337
- description: "ContractSpec generates code across all surfaces from your specs."
338
- },
339
- {
340
- title: "Enforce",
341
- description: "Any code that violates specs is flagged. AI agents can't break contracts."
342
- }
343
- ].map((step, i) => /* @__PURE__ */ jsxDEV("div", {
344
- className: "space-y-2",
345
- children: [
346
- /* @__PURE__ */ jsxDEV("div", {
347
- className: "flex h-8 w-8 items-center justify-center rounded-lg bg-violet-500/20",
348
- children: /* @__PURE__ */ jsxDEV("div", {
349
- className: "text-sm font-bold text-violet-400",
350
- children: i + 1
351
- }, undefined, false, undefined, this)
352
- }, undefined, false, undefined, this),
353
- /* @__PURE__ */ jsxDEV("h4", {
354
- className: "text-sm font-bold",
355
- children: step.title
356
- }, undefined, false, undefined, this),
357
- /* @__PURE__ */ jsxDEV("p", {
358
- className: "text-muted-foreground text-xs",
359
- children: step.description
360
- }, undefined, false, undefined, this)
361
- ]
362
- }, i, true, undefined, this))
363
- }, undefined, false, undefined, this)
364
- ]
365
- }, undefined, true, undefined, this)
366
- ]
367
- }, undefined, true, undefined, this)
267
+ }, point, true, undefined, this))
268
+ }, undefined, false, undefined, this)
269
+ ]
270
+ }, column.label, true, undefined, this))
271
+ }, undefined, false, undefined, this)
368
272
  }, undefined, false, undefined, this),
369
273
  /* @__PURE__ */ jsxDEV("section", {
370
- className: "section-padding border-border border-b bg-gradient-to-br from-violet-500/10 via-indigo-500/5 to-blue-500/5",
274
+ className: "editorial-section",
371
275
  children: /* @__PURE__ */ jsxDEV("div", {
372
- className: "mx-auto max-w-4xl space-y-8",
276
+ className: "editorial-shell grid gap-10 lg:grid-cols-[0.9fr_1.1fr]",
373
277
  children: [
374
278
  /* @__PURE__ */ jsxDEV("div", {
375
279
  className: "space-y-4",
376
280
  children: [
377
- /* @__PURE__ */ jsxDEV("div", {
378
- className: "inline-flex items-center gap-2 rounded-full border border-pink-500/20 bg-pink-500/10 px-3 py-1",
379
- children: [
380
- /* @__PURE__ */ jsxDEV(Unlock, {
381
- size: 16,
382
- className: "text-pink-400"
383
- }, undefined, false, undefined, this),
384
- /* @__PURE__ */ jsxDEV("span", {
385
- className: "text-sm font-medium text-pink-300",
386
- children: "No Lock-in"
387
- }, undefined, false, undefined, this)
388
- ]
389
- }, undefined, true, undefined, this),
281
+ /* @__PURE__ */ jsxDEV("p", {
282
+ className: "editorial-kicker",
283
+ children: "Proof points"
284
+ }, undefined, false, undefined, this),
390
285
  /* @__PURE__ */ jsxDEV("h2", {
391
- className: "text-3xl font-bold md:text-4xl",
392
- children: "You own everything. Eject anytime."
286
+ className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
287
+ children: "What should feel different after adoption."
393
288
  }, undefined, false, undefined, this),
394
289
  /* @__PURE__ */ jsxDEV("p", {
395
- className: "text-muted-foreground text-lg",
396
- children: "ContractSpec is a compiler, not a prison. The generated code is yours: standard TypeScript, standard SQL, standard GraphQL."
290
+ className: "editorial-copy",
291
+ children: "The point is not just faster output. The point is that regeneration, refactoring, and agent behavior stop feeling opaque because the team has an explicit layer it can inspect and trust."
397
292
  }, undefined, false, undefined, this)
398
293
  ]
399
294
  }, undefined, true, undefined, this),
400
295
  /* @__PURE__ */ jsxDEV("div", {
401
- className: "grid gap-6 md:grid-cols-2",
402
- children: [
403
- /* @__PURE__ */ jsxDEV("div", {
404
- className: "card-subtle space-y-4 p-6",
296
+ className: "grid gap-5 md:grid-cols-2",
297
+ children: proofs.map((proof) => {
298
+ const Icon = proof.icon;
299
+ return /* @__PURE__ */ jsxDEV("div", {
300
+ className: "editorial-panel",
405
301
  children: [
406
- /* @__PURE__ */ jsxDEV("h3", {
407
- className: "text-lg font-bold",
408
- children: "Standard Tech Output"
302
+ /* @__PURE__ */ jsxDEV(Icon, {
303
+ className: "h-5 w-5 text-[color:var(--blue)]"
409
304
  }, undefined, false, undefined, this),
410
- /* @__PURE__ */ jsxDEV("ul", {
411
- className: "text-muted-foreground space-y-3 text-sm",
412
- children: [
413
- "TypeScript you can read and modify",
414
- "Prisma migrations you can run manually",
415
- "GraphQL schemas you can serve anywhere",
416
- "React components with no magic",
417
- "REST handlers that work with any framework"
418
- ].map((item, i) => /* @__PURE__ */ jsxDEV("li", {
419
- className: "flex gap-3",
420
- children: [
421
- /* @__PURE__ */ jsxDEV(CheckCircle, {
422
- size: 16,
423
- className: "mt-0.5 flex-shrink-0 text-pink-400"
424
- }, undefined, false, undefined, this),
425
- item
426
- ]
427
- }, i, true, undefined, this))
428
- }, undefined, false, undefined, this)
429
- ]
430
- }, undefined, true, undefined, this),
431
- /* @__PURE__ */ jsxDEV("div", {
432
- className: "card-subtle space-y-4 p-6",
433
- children: [
434
- /* @__PURE__ */ jsxDEV("h3", {
435
- className: "text-lg font-bold",
436
- children: "No Proprietary Dependencies"
437
- }, undefined, false, undefined, this),
438
- /* @__PURE__ */ jsxDEV("ul", {
439
- className: "text-muted-foreground space-y-3 text-sm",
440
- children: [
441
- "No runtime library required",
442
- "No vendor-specific abstractions",
443
- "Works with your existing CI/CD",
444
- "Eject anytime, keep everything",
445
- "Open spec format"
446
- ].map((item, i) => /* @__PURE__ */ jsxDEV("li", {
447
- className: "flex gap-3",
448
- children: [
449
- /* @__PURE__ */ jsxDEV(CheckCircle, {
450
- size: 16,
451
- className: "mt-0.5 flex-shrink-0 text-pink-400"
452
- }, undefined, false, undefined, this),
453
- item
454
- ]
455
- }, i, true, undefined, this))
305
+ /* @__PURE__ */ jsxDEV("p", {
306
+ className: "mt-5 font-medium text-lg",
307
+ children: proof.label
456
308
  }, undefined, false, undefined, this)
457
309
  ]
458
- }, undefined, true, undefined, this)
459
- ]
460
- }, undefined, true, undefined, this),
461
- /* @__PURE__ */ jsxDEV("div", {
462
- className: "pt-4 text-center",
463
- children: /* @__PURE__ */ jsxDEV("p", {
464
- className: "text-muted-foreground mb-4 text-sm",
465
- children: [
466
- "Like TypeScript compiles to JavaScript, ContractSpec compiles to standard code.",
467
- /* @__PURE__ */ jsxDEV("br", {}, undefined, false, undefined, this),
468
- /* @__PURE__ */ jsxDEV("span", {
469
- className: "font-medium text-violet-400",
470
- children: "We're the compiler, not the prison."
471
- }, undefined, false, undefined, this)
472
- ]
473
- }, undefined, true, undefined, this)
310
+ }, proof.label, true, undefined, this);
311
+ })
474
312
  }, undefined, false, undefined, this)
475
313
  ]
476
314
  }, undefined, true, undefined, this)
477
315
  }, undefined, false, undefined, this),
478
316
  /* @__PURE__ */ jsxDEV("section", {
479
- className: "section-padding border-border border-b",
317
+ className: "section-padding",
480
318
  children: /* @__PURE__ */ jsxDEV("div", {
481
- className: "mx-auto max-w-4xl space-y-8",
482
- children: [
483
- /* @__PURE__ */ jsxDEV("h2", {
484
- className: "text-center text-3xl font-bold md:text-4xl",
485
- children: "Start small. Expand gradually."
486
- }, undefined, false, undefined, this),
487
- /* @__PURE__ */ jsxDEV("p", {
488
- className: "text-muted-foreground mx-auto max-w-2xl text-center text-lg",
489
- children: "You don't rewrite your app. You stabilize one module at a time. Start with one endpoint, prove value, then expand."
490
- }, undefined, false, undefined, this),
491
- /* @__PURE__ */ jsxDEV("div", {
492
- className: "grid gap-6 md:grid-cols-3",
493
- children: [
494
- {
495
- title: "Day 1",
496
- description: "Pick one API endpoint. Write a spec. See what gets generated."
497
- },
498
- {
499
- title: "Week 1",
500
- description: "Add a few more specs. Compare generated code to existing code."
501
- },
502
- {
503
- title: "Month 1",
504
- description: "Migrate a full module. Enjoy multi-surface consistency."
505
- }
506
- ].map((item, i) => /* @__PURE__ */ jsxDEV("div", {
507
- className: "card-subtle space-y-4 p-6 text-center",
319
+ className: "editorial-shell",
320
+ children: /* @__PURE__ */ jsxDEV("div", {
321
+ className: "editorial-panel flex flex-col gap-8 rounded-[38px] border-dashed md:flex-row md:items-end md:justify-between",
322
+ children: [
323
+ /* @__PURE__ */ jsxDEV("div", {
324
+ className: "max-w-3xl space-y-4",
508
325
  children: [
509
- /* @__PURE__ */ jsxDEV("div", {
510
- className: "text-2xl font-bold text-violet-400",
511
- children: item.title
326
+ /* @__PURE__ */ jsxDEV("p", {
327
+ className: "editorial-kicker",
328
+ children: "Next step"
329
+ }, undefined, false, undefined, this),
330
+ /* @__PURE__ */ jsxDEV("h2", {
331
+ className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
332
+ children: "Use the OSS layer when you want control. Use Studio when you want the operating loop."
512
333
  }, undefined, false, undefined, this),
513
334
  /* @__PURE__ */ jsxDEV("p", {
514
- className: "text-muted-foreground text-sm",
515
- children: item.description
335
+ className: "editorial-copy",
336
+ children: "That is the cleanest product split for both technical adopters and teams buying the packaged surface later."
516
337
  }, undefined, false, undefined, this)
517
338
  ]
518
- }, i, true, undefined, this))
519
- }, undefined, false, undefined, this)
520
- ]
521
- }, undefined, true, undefined, this)
522
- }, undefined, false, undefined, this),
523
- /* @__PURE__ */ jsxDEV("section", {
524
- className: "section-padding hero-gradient",
525
- children: /* @__PURE__ */ jsxDEV("div", {
526
- className: "mx-auto max-w-4xl space-y-6 text-center",
527
- children: [
528
- /* @__PURE__ */ jsxDEV("h2", {
529
- className: "text-3xl font-bold md:text-4xl",
530
- children: "Ready to stabilize your AI-generated code?"
531
- }, undefined, false, undefined, this),
532
- /* @__PURE__ */ jsxDEV("p", {
533
- className: "text-muted-foreground text-lg",
534
- children: "Start with one module. No big-bang migration. No lock-in."
535
- }, undefined, false, undefined, this),
536
- /* @__PURE__ */ jsxDEV("div", {
537
- className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
538
- children: [
539
- /* @__PURE__ */ jsxDEV(Link, {
540
- href: "/install",
541
- className: "btn-primary inline-flex items-center gap-2",
542
- children: [
543
- "Install OSS Core ",
544
- /* @__PURE__ */ jsxDEV(ChevronRight, {
545
- size: 16
546
- }, undefined, false, undefined, this)
547
- ]
548
- }, undefined, true, undefined, this),
549
- /* @__PURE__ */ jsxDEV(Link, {
550
- href: "https://www.contractspec.studio",
551
- className: "btn-ghost",
552
- children: "Try Studio"
553
- }, undefined, false, undefined, this)
554
- ]
555
- }, undefined, true, undefined, this)
556
- ]
557
- }, undefined, true, undefined, this)
339
+ }, undefined, true, undefined, this),
340
+ /* @__PURE__ */ jsxDEV("div", {
341
+ className: "flex flex-col gap-3 sm:flex-row md:flex-col",
342
+ children: [
343
+ /* @__PURE__ */ jsxDEV(Link, {
344
+ href: "/install",
345
+ className: "btn-primary",
346
+ onClick: trackInstall,
347
+ children: "Start with OSS"
348
+ }, undefined, false, undefined, this),
349
+ /* @__PURE__ */ jsxDEV(Link, {
350
+ href: "https://www.contractspec.studio",
351
+ className: "btn-ghost",
352
+ onClick: trackStudio,
353
+ children: "Explore Studio"
354
+ }, undefined, false, undefined, this)
355
+ ]
356
+ }, undefined, true, undefined, this)
357
+ ]
358
+ }, undefined, true, undefined, this)
359
+ }, undefined, false, undefined, this)
558
360
  }, undefined, false, undefined, this)
559
361
  ]
560
362
  }, undefined, true, undefined, this);