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