@contractspec/bundle.marketing 3.7.6 → 3.7.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/.turbo/turbo-build.log +84 -84
  2. package/AGENTS.md +29 -21
  3. package/README.md +36 -49
  4. package/dist/browser/components/marketing/ChangelogPage.js +8 -8
  5. package/dist/browser/components/marketing/CofounderPage.js +167 -523
  6. package/dist/browser/components/marketing/ContactClient.js +200 -207
  7. package/dist/browser/components/marketing/ContributePage.js +211 -463
  8. package/dist/browser/components/marketing/DesignPartnerPage.js +165 -218
  9. package/dist/browser/components/marketing/LandingPage.js +464 -568
  10. package/dist/browser/components/marketing/PricingClient.js +213 -839
  11. package/dist/browser/components/marketing/ProductClientPage.js +265 -463
  12. package/dist/browser/components/marketing/index.js +2007 -3338
  13. package/dist/browser/components/marketing/pricing-thinking-modal.js +12 -12
  14. package/dist/browser/components/marketing/sections/AudienceSection.js +2 -2
  15. package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
  16. package/dist/browser/components/marketing/sections/CtaSection.js +3 -3
  17. package/dist/browser/components/marketing/sections/FearsSection.js +3 -3
  18. package/dist/browser/components/marketing/sections/HeroMarketingSection.js +6 -6
  19. package/dist/browser/components/marketing/sections/IconGridSection.js +2 -2
  20. package/dist/browser/components/marketing/sections/OutputsSection.js +2 -2
  21. package/dist/browser/components/marketing/sections/ProblemSection.js +2 -2
  22. package/dist/browser/components/marketing/sections/SolutionSection.js +2 -2
  23. package/dist/browser/components/marketing/sections/StepsSection.js +4 -4
  24. package/dist/browser/components/marketing/studio-signup-section.js +25 -41
  25. package/dist/browser/components/templates/TemplatesClientPage.js +2324 -3578
  26. package/dist/browser/components/templates/TemplatesPage.js +1 -1
  27. package/dist/browser/components/templates/TemplatesPreviewModal.js +3 -3
  28. package/dist/browser/components/templates/index.js +2361 -3615
  29. package/dist/browser/index.js +2363 -3617
  30. package/dist/browser/libs/email/client.js +1 -1
  31. package/dist/browser/libs/email/contact.js +1 -1
  32. package/dist/browser/libs/email/newsletter.js +1 -1
  33. package/dist/browser/libs/email/waitlist-application.js +1 -1
  34. package/dist/browser/libs/email/waitlist.js +1 -1
  35. package/dist/browser/registry/engine.js +2003 -3334
  36. package/dist/browser/registry/index.js +2003 -3334
  37. package/dist/browser/registry/registry-docs.js +2 -2
  38. package/dist/browser/registry/registry-landing.js +2007 -3338
  39. package/dist/browser/registry/registry.js +2003 -3334
  40. package/dist/browser/registry/utils.js +2003 -3334
  41. package/dist/components/marketing/ChangelogPage.js +8 -8
  42. package/dist/components/marketing/CofounderPage.js +167 -523
  43. package/dist/components/marketing/ContactClient.js +200 -207
  44. package/dist/components/marketing/ContributePage.d.ts +0 -2
  45. package/dist/components/marketing/ContributePage.js +211 -463
  46. package/dist/components/marketing/DesignPartnerPage.js +165 -218
  47. package/dist/components/marketing/LandingPage.js +464 -568
  48. package/dist/components/marketing/PricingClient.js +213 -839
  49. package/dist/components/marketing/ProductClientPage.js +265 -463
  50. package/dist/components/marketing/index.d.ts +5 -5
  51. package/dist/components/marketing/index.js +2007 -3338
  52. package/dist/components/marketing/pricing-thinking-modal.js +12 -12
  53. package/dist/components/marketing/sections/AudienceSection.js +2 -2
  54. package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
  55. package/dist/components/marketing/sections/CtaSection.js +3 -3
  56. package/dist/components/marketing/sections/FearsSection.js +3 -3
  57. package/dist/components/marketing/sections/HeroMarketingSection.js +6 -6
  58. package/dist/components/marketing/sections/IconGridSection.d.ts +3 -3
  59. package/dist/components/marketing/sections/IconGridSection.js +2 -2
  60. package/dist/components/marketing/sections/OutputsSection.js +2 -2
  61. package/dist/components/marketing/sections/ProblemSection.js +2 -2
  62. package/dist/components/marketing/sections/SolutionSection.js +2 -2
  63. package/dist/components/marketing/sections/StepsSection.js +4 -4
  64. package/dist/components/marketing/studio-signup-section.js +25 -41
  65. package/dist/components/templates/TemplatesClientPage.js +2324 -3578
  66. package/dist/components/templates/TemplatesPage.js +1 -1
  67. package/dist/components/templates/TemplatesPreviewModal.js +3 -3
  68. package/dist/components/templates/index.js +2361 -3615
  69. package/dist/index.js +2363 -3617
  70. package/dist/libs/email/client.js +1 -1
  71. package/dist/libs/email/contact.js +1 -1
  72. package/dist/libs/email/newsletter.js +1 -1
  73. package/dist/libs/email/waitlist-application.js +1 -1
  74. package/dist/libs/email/waitlist.js +1 -1
  75. package/dist/node/components/marketing/ChangelogPage.js +8 -8
  76. package/dist/node/components/marketing/CofounderPage.js +167 -523
  77. package/dist/node/components/marketing/ContactClient.js +200 -207
  78. package/dist/node/components/marketing/ContributePage.js +211 -463
  79. package/dist/node/components/marketing/DesignPartnerPage.js +165 -218
  80. package/dist/node/components/marketing/LandingPage.js +464 -568
  81. package/dist/node/components/marketing/PricingClient.js +213 -839
  82. package/dist/node/components/marketing/ProductClientPage.js +265 -463
  83. package/dist/node/components/marketing/index.js +2007 -3338
  84. package/dist/node/components/marketing/pricing-thinking-modal.js +12 -12
  85. package/dist/node/components/marketing/sections/AudienceSection.js +2 -2
  86. package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
  87. package/dist/node/components/marketing/sections/CtaSection.js +3 -3
  88. package/dist/node/components/marketing/sections/FearsSection.js +3 -3
  89. package/dist/node/components/marketing/sections/HeroMarketingSection.js +6 -6
  90. package/dist/node/components/marketing/sections/IconGridSection.js +2 -2
  91. package/dist/node/components/marketing/sections/OutputsSection.js +2 -2
  92. package/dist/node/components/marketing/sections/ProblemSection.js +2 -2
  93. package/dist/node/components/marketing/sections/SolutionSection.js +2 -2
  94. package/dist/node/components/marketing/sections/StepsSection.js +4 -4
  95. package/dist/node/components/marketing/studio-signup-section.js +25 -41
  96. package/dist/node/components/templates/TemplatesClientPage.js +2324 -3578
  97. package/dist/node/components/templates/TemplatesPage.js +1 -1
  98. package/dist/node/components/templates/TemplatesPreviewModal.js +3 -3
  99. package/dist/node/components/templates/index.js +2361 -3615
  100. package/dist/node/index.js +2363 -3617
  101. package/dist/node/libs/email/client.js +1 -1
  102. package/dist/node/libs/email/contact.js +1 -1
  103. package/dist/node/libs/email/newsletter.js +1 -1
  104. package/dist/node/libs/email/waitlist-application.js +1 -1
  105. package/dist/node/libs/email/waitlist.js +1 -1
  106. package/dist/node/registry/engine.js +2003 -3334
  107. package/dist/node/registry/index.js +2003 -3334
  108. package/dist/node/registry/registry-docs.js +2 -2
  109. package/dist/node/registry/registry-landing.js +2007 -3338
  110. package/dist/node/registry/registry.js +2003 -3334
  111. package/dist/node/registry/utils.js +2003 -3334
  112. package/dist/registry/engine.js +2003 -3334
  113. package/dist/registry/index.js +2003 -3334
  114. package/dist/registry/registry-docs.js +2 -2
  115. package/dist/registry/registry-landing.js +2007 -3338
  116. package/dist/registry/registry.js +2003 -3334
  117. package/dist/registry/utils.js +2003 -3334
  118. package/package.json +22 -22
  119. package/src/bundles/MarketingBundle.ts +273 -273
  120. package/src/components/marketing/ChangelogPage.tsx +72 -100
  121. package/src/components/marketing/CofounderPage.tsx +120 -384
  122. package/src/components/marketing/ContactClient.tsx +164 -154
  123. package/src/components/marketing/ContributePage.tsx +139 -313
  124. package/src/components/marketing/DesignPartnerPage.tsx +133 -171
  125. package/src/components/marketing/LandingPage.tsx +353 -25
  126. package/src/components/marketing/PricingClient.tsx +192 -437
  127. package/src/components/marketing/ProductClientPage.tsx +255 -377
  128. package/src/components/marketing/index.ts +5 -5
  129. package/src/components/marketing/pricing-thinking-modal.tsx +197 -197
  130. package/src/components/marketing/sections/AudienceSection.tsx +55 -56
  131. package/src/components/marketing/sections/CorePositioningSection.tsx +37 -37
  132. package/src/components/marketing/sections/CtaSection.tsx +49 -50
  133. package/src/components/marketing/sections/DevelopersSection.tsx +26 -27
  134. package/src/components/marketing/sections/FearsSection.tsx +36 -37
  135. package/src/components/marketing/sections/HeroMarketingSection.tsx +59 -59
  136. package/src/components/marketing/sections/IconGridSection.tsx +71 -71
  137. package/src/components/marketing/sections/OutputsSection.tsx +51 -52
  138. package/src/components/marketing/sections/ProblemSection.tsx +39 -40
  139. package/src/components/marketing/sections/SolutionSection.tsx +39 -40
  140. package/src/components/marketing/sections/StepsSection.tsx +47 -48
  141. package/src/components/marketing/studio-signup-section.tsx +39 -41
  142. package/src/components/templates/TemplatesClientPage.tsx +727 -685
  143. package/src/components/templates/TemplatesPage.tsx +110 -110
  144. package/src/components/templates/TemplatesPreviewModal.tsx +197 -198
  145. package/src/index.ts +4 -4
  146. package/src/libs/email/client.test.ts +81 -81
  147. package/src/libs/email/client.ts +111 -111
  148. package/src/libs/email/contact.ts +35 -35
  149. package/src/libs/email/newsletter.ts +46 -46
  150. package/src/libs/email/types.ts +29 -29
  151. package/src/libs/email/utils.ts +5 -5
  152. package/src/libs/email/waitlist-application.ts +72 -72
  153. package/src/libs/email/waitlist.ts +46 -46
  154. package/src/libs/pricing-examples.ts +12 -12
  155. package/src/registry/engine.ts +16 -16
  156. package/src/registry/factory.ts +57 -57
  157. package/src/registry/registry-docs.ts +656 -666
  158. package/src/registry/registry-landing.ts +94 -95
  159. package/src/registry/registry.ts +36 -37
  160. package/src/registry/types.ts +2 -2
  161. package/src/registry/utils.ts +56 -56
  162. package/tsconfig.json +11 -11
  163. package/tsdown.config.js +5 -5
@@ -2,268 +2,184 @@
2
2
  var __require = import.meta.require;
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 \u201Ccompiler\u201D 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);