@contractspec/bundle.marketing 1.12.0 → 1.13.0

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 (262) hide show
  1. package/.turbo/turbo-build.log +146 -175
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +29 -0
  4. package/dist/browser/components/marketing/ChangelogPage.js +92 -0
  5. package/dist/browser/components/marketing/CofounderPage.js +581 -0
  6. package/dist/browser/components/marketing/ContactClient.js +1379 -0
  7. package/dist/browser/components/marketing/ContributePage.js +487 -0
  8. package/dist/browser/components/marketing/DesignPartnerPage.js +272 -0
  9. package/dist/browser/components/marketing/LandingPage.js +629 -0
  10. package/dist/browser/components/marketing/PricingClient.js +1972 -0
  11. package/dist/browser/components/marketing/ProductClientPage.js +563 -0
  12. package/dist/browser/components/marketing/index.js +4818 -0
  13. package/dist/browser/components/marketing/pricing-thinking-modal.js +258 -0
  14. package/dist/browser/components/marketing/sections/AudienceSection.js +90 -0
  15. package/dist/browser/components/marketing/sections/CorePositioningSection.js +72 -0
  16. package/dist/browser/components/marketing/sections/CtaSection.js +67 -0
  17. package/dist/browser/components/marketing/sections/DevelopersSection.js +50 -0
  18. package/dist/browser/components/marketing/sections/FearsSection.js +105 -0
  19. package/dist/browser/components/marketing/sections/HeroMarketingSection.js +93 -0
  20. package/dist/browser/components/marketing/sections/IconGridSection.js +63 -0
  21. package/dist/browser/components/marketing/sections/OutputsSection.js +116 -0
  22. package/dist/browser/components/marketing/sections/ProblemSection.js +103 -0
  23. package/dist/browser/components/marketing/sections/SolutionSection.js +103 -0
  24. package/dist/browser/components/marketing/sections/StepsSection.js +109 -0
  25. package/dist/browser/components/marketing/waitlist-section.js +1104 -0
  26. package/dist/browser/components/templates/TemplatesClientPage.js +5662 -0
  27. package/dist/browser/components/templates/TemplatesPage.js +177 -0
  28. package/dist/browser/components/templates/TemplatesPreviewModal.js +124 -0
  29. package/dist/browser/components/templates/index.js +5831 -0
  30. package/dist/browser/index.js +6485 -0
  31. package/dist/browser/libs/email/client.js +122 -0
  32. package/dist/browser/libs/email/contact.js +190 -0
  33. package/dist/browser/libs/email/newsletter.js +215 -0
  34. package/dist/browser/libs/email/types.js +2 -0
  35. package/dist/browser/libs/email/utils.js +16 -0
  36. package/dist/browser/libs/email/waitlist-application.js +295 -0
  37. package/dist/browser/libs/email/waitlist.js +225 -0
  38. package/dist/browser/libs/pricing-examples.js +26 -0
  39. package/dist/browser/registry/engine.js +5293 -0
  40. package/dist/browser/registry/factory.js +52 -0
  41. package/dist/browser/registry/index.js +5358 -0
  42. package/dist/browser/registry/registry-docs.js +343 -0
  43. package/dist/browser/registry/registry-landing.js +4937 -0
  44. package/dist/browser/registry/registry.js +5279 -0
  45. package/dist/browser/registry/types.js +0 -0
  46. package/dist/browser/registry/utils.js +5340 -0
  47. package/dist/components/marketing/ChangelogPage.d.ts +11 -17
  48. package/dist/components/marketing/ChangelogPage.d.ts.map +1 -1
  49. package/dist/components/marketing/ChangelogPage.js +84 -62
  50. package/dist/components/marketing/CofounderPage.d.ts +1 -6
  51. package/dist/components/marketing/CofounderPage.d.ts.map +1 -1
  52. package/dist/components/marketing/CofounderPage.js +544 -436
  53. package/dist/components/marketing/ContactClient.d.ts +1 -6
  54. package/dist/components/marketing/ContactClient.d.ts.map +1 -1
  55. package/dist/components/marketing/ContactClient.js +1371 -155
  56. package/dist/components/marketing/ContributePage.d.ts +3 -8
  57. package/dist/components/marketing/ContributePage.d.ts.map +1 -1
  58. package/dist/components/marketing/ContributePage.js +478 -358
  59. package/dist/components/marketing/DesignPartnerPage.d.ts +3 -8
  60. package/dist/components/marketing/DesignPartnerPage.d.ts.map +1 -1
  61. package/dist/components/marketing/DesignPartnerPage.js +263 -211
  62. package/dist/components/marketing/LandingPage.d.ts +1 -6
  63. package/dist/components/marketing/LandingPage.d.ts.map +1 -1
  64. package/dist/components/marketing/LandingPage.js +623 -37
  65. package/dist/components/marketing/PricingClient.d.ts +1 -6
  66. package/dist/components/marketing/PricingClient.d.ts.map +1 -1
  67. package/dist/components/marketing/PricingClient.js +1962 -516
  68. package/dist/components/marketing/ProductClientPage.d.ts +1 -6
  69. package/dist/components/marketing/ProductClientPage.d.ts.map +1 -1
  70. package/dist/components/marketing/ProductClientPage.js +556 -458
  71. package/dist/components/marketing/index.d.ts +11 -11
  72. package/dist/components/marketing/index.d.ts.map +1 -0
  73. package/dist/components/marketing/index.js +4813 -12
  74. package/dist/components/marketing/pricing-thinking-modal.d.ts +5 -13
  75. package/dist/components/marketing/pricing-thinking-modal.d.ts.map +1 -1
  76. package/dist/components/marketing/pricing-thinking-modal.js +248 -197
  77. package/dist/components/marketing/sections/AudienceSection.d.ts +1 -6
  78. package/dist/components/marketing/sections/AudienceSection.d.ts.map +1 -1
  79. package/dist/components/marketing/sections/AudienceSection.js +80 -63
  80. package/dist/components/marketing/sections/CorePositioningSection.d.ts +1 -6
  81. package/dist/components/marketing/sections/CorePositioningSection.d.ts.map +1 -1
  82. package/dist/components/marketing/sections/CorePositioningSection.js +62 -54
  83. package/dist/components/marketing/sections/CtaSection.d.ts +1 -6
  84. package/dist/components/marketing/sections/CtaSection.d.ts.map +1 -1
  85. package/dist/components/marketing/sections/CtaSection.js +58 -50
  86. package/dist/components/marketing/sections/DevelopersSection.d.ts +1 -6
  87. package/dist/components/marketing/sections/DevelopersSection.d.ts.map +1 -1
  88. package/dist/components/marketing/sections/DevelopersSection.js +40 -40
  89. package/dist/components/marketing/sections/FearsSection.d.ts +1 -6
  90. package/dist/components/marketing/sections/FearsSection.d.ts.map +1 -1
  91. package/dist/components/marketing/sections/FearsSection.js +96 -44
  92. package/dist/components/marketing/sections/HeroMarketingSection.d.ts +1 -6
  93. package/dist/components/marketing/sections/HeroMarketingSection.d.ts.map +1 -1
  94. package/dist/components/marketing/sections/HeroMarketingSection.js +82 -71
  95. package/dist/components/marketing/sections/IconGridSection.d.ts +25 -39
  96. package/dist/components/marketing/sections/IconGridSection.d.ts.map +1 -1
  97. package/dist/components/marketing/sections/IconGridSection.js +55 -41
  98. package/dist/components/marketing/sections/OutputsSection.d.ts +1 -6
  99. package/dist/components/marketing/sections/OutputsSection.d.ts.map +1 -1
  100. package/dist/components/marketing/sections/OutputsSection.js +107 -55
  101. package/dist/components/marketing/sections/ProblemSection.d.ts +1 -6
  102. package/dist/components/marketing/sections/ProblemSection.d.ts.map +1 -1
  103. package/dist/components/marketing/sections/ProblemSection.js +94 -42
  104. package/dist/components/marketing/sections/SolutionSection.d.ts +1 -6
  105. package/dist/components/marketing/sections/SolutionSection.d.ts.map +1 -1
  106. package/dist/components/marketing/sections/SolutionSection.js +94 -42
  107. package/dist/components/marketing/sections/StepsSection.d.ts +1 -6
  108. package/dist/components/marketing/sections/StepsSection.d.ts.map +1 -1
  109. package/dist/components/marketing/sections/StepsSection.js +100 -48
  110. package/dist/components/marketing/waitlist-section.d.ts +5 -12
  111. package/dist/components/marketing/waitlist-section.d.ts.map +1 -1
  112. package/dist/components/marketing/waitlist-section.js +1089 -568
  113. package/dist/components/templates/TemplatesClientPage.d.ts +1 -6
  114. package/dist/components/templates/TemplatesClientPage.d.ts.map +1 -1
  115. package/dist/components/templates/TemplatesClientPage.js +5649 -617
  116. package/dist/components/templates/TemplatesPage.d.ts +1 -6
  117. package/dist/components/templates/TemplatesPage.d.ts.map +1 -1
  118. package/dist/components/templates/TemplatesPage.js +163 -116
  119. package/dist/components/templates/TemplatesPreviewModal.d.ts +5 -12
  120. package/dist/components/templates/TemplatesPreviewModal.d.ts.map +1 -1
  121. package/dist/components/templates/TemplatesPreviewModal.js +113 -131
  122. package/dist/components/templates/index.d.ts +4 -4
  123. package/dist/components/templates/index.d.ts.map +1 -0
  124. package/dist/components/templates/index.js +5825 -4
  125. package/dist/index.d.ts +9 -29
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +6480 -28
  128. package/dist/libs/email/client.d.ts +9 -12
  129. package/dist/libs/email/client.d.ts.map +1 -1
  130. package/dist/libs/email/client.js +109 -105
  131. package/dist/libs/email/client.test.d.ts +2 -0
  132. package/dist/libs/email/client.test.d.ts.map +1 -0
  133. package/dist/libs/email/contact.d.ts +2 -6
  134. package/dist/libs/email/contact.d.ts.map +1 -1
  135. package/dist/libs/email/contact.js +155 -41
  136. package/dist/libs/email/newsletter.d.ts +2 -6
  137. package/dist/libs/email/newsletter.d.ts.map +1 -1
  138. package/dist/libs/email/newsletter.js +169 -54
  139. package/dist/libs/email/types.d.ts +48 -52
  140. package/dist/libs/email/types.d.ts.map +1 -1
  141. package/dist/libs/email/types.js +3 -1
  142. package/dist/libs/email/utils.d.ts +2 -5
  143. package/dist/libs/email/utils.d.ts.map +1 -1
  144. package/dist/libs/email/utils.js +10 -6
  145. package/dist/libs/email/waitlist-application.d.ts +2 -6
  146. package/dist/libs/email/waitlist-application.d.ts.map +1 -1
  147. package/dist/libs/email/waitlist-application.js +191 -71
  148. package/dist/libs/email/waitlist.d.ts +2 -6
  149. package/dist/libs/email/waitlist.d.ts.map +1 -1
  150. package/dist/libs/email/waitlist.js +171 -56
  151. package/dist/libs/pricing-examples.d.ts +13 -16
  152. package/dist/libs/pricing-examples.d.ts.map +1 -1
  153. package/dist/libs/pricing-examples.js +20 -20
  154. package/dist/node/components/marketing/ChangelogPage.js +87 -0
  155. package/dist/node/components/marketing/CofounderPage.js +576 -0
  156. package/dist/node/components/marketing/ContactClient.js +1374 -0
  157. package/dist/node/components/marketing/ContributePage.js +482 -0
  158. package/dist/node/components/marketing/DesignPartnerPage.js +267 -0
  159. package/dist/node/components/marketing/LandingPage.js +624 -0
  160. package/dist/node/components/marketing/PricingClient.js +1967 -0
  161. package/dist/node/components/marketing/ProductClientPage.js +558 -0
  162. package/dist/node/components/marketing/index.js +4813 -0
  163. package/dist/node/components/marketing/pricing-thinking-modal.js +253 -0
  164. package/dist/node/components/marketing/sections/AudienceSection.js +85 -0
  165. package/dist/node/components/marketing/sections/CorePositioningSection.js +67 -0
  166. package/dist/node/components/marketing/sections/CtaSection.js +62 -0
  167. package/dist/node/components/marketing/sections/DevelopersSection.js +45 -0
  168. package/dist/node/components/marketing/sections/FearsSection.js +100 -0
  169. package/dist/node/components/marketing/sections/HeroMarketingSection.js +88 -0
  170. package/dist/node/components/marketing/sections/IconGridSection.js +58 -0
  171. package/dist/node/components/marketing/sections/OutputsSection.js +111 -0
  172. package/dist/node/components/marketing/sections/ProblemSection.js +98 -0
  173. package/dist/node/components/marketing/sections/SolutionSection.js +98 -0
  174. package/dist/node/components/marketing/sections/StepsSection.js +104 -0
  175. package/dist/node/components/marketing/waitlist-section.js +1099 -0
  176. package/dist/node/components/templates/TemplatesClientPage.js +5657 -0
  177. package/dist/node/components/templates/TemplatesPage.js +172 -0
  178. package/dist/node/components/templates/TemplatesPreviewModal.js +119 -0
  179. package/dist/node/components/templates/index.js +5826 -0
  180. package/dist/node/index.js +6480 -0
  181. package/dist/node/libs/email/client.js +117 -0
  182. package/dist/node/libs/email/contact.js +185 -0
  183. package/dist/node/libs/email/newsletter.js +210 -0
  184. package/dist/node/libs/email/types.js +2 -0
  185. package/dist/node/libs/email/utils.js +11 -0
  186. package/dist/node/libs/email/waitlist-application.js +290 -0
  187. package/dist/node/libs/email/waitlist.js +220 -0
  188. package/dist/node/libs/pricing-examples.js +21 -0
  189. package/dist/node/registry/engine.js +5288 -0
  190. package/dist/node/registry/factory.js +47 -0
  191. package/dist/node/registry/index.js +5353 -0
  192. package/dist/node/registry/registry-docs.js +338 -0
  193. package/dist/node/registry/registry-landing.js +4932 -0
  194. package/dist/node/registry/registry.js +5274 -0
  195. package/dist/node/registry/types.js +0 -0
  196. package/dist/node/registry/utils.js +5335 -0
  197. package/dist/registry/engine.d.ts +4 -8
  198. package/dist/registry/engine.d.ts.map +1 -1
  199. package/dist/registry/engine.js +5287 -23
  200. package/dist/registry/factory.d.ts +30 -34
  201. package/dist/registry/factory.d.ts.map +1 -1
  202. package/dist/registry/factory.js +42 -56
  203. package/dist/registry/index.d.ts +8 -8
  204. package/dist/registry/index.d.ts.map +1 -0
  205. package/dist/registry/index.js +5353 -8
  206. package/dist/registry/registry-docs.d.ts +4 -8
  207. package/dist/registry/registry-docs.d.ts.map +1 -1
  208. package/dist/registry/registry-docs.js +242 -209
  209. package/dist/registry/registry-landing.d.ts +5 -9
  210. package/dist/registry/registry-landing.d.ts.map +1 -1
  211. package/dist/registry/registry-landing.js +4930 -93
  212. package/dist/registry/registry.d.ts +7 -11
  213. package/dist/registry/registry.d.ts.map +1 -1
  214. package/dist/registry/registry.js +5262 -49
  215. package/dist/registry/types.d.ts +6 -10
  216. package/dist/registry/types.d.ts.map +1 -1
  217. package/dist/registry/types.js +1 -0
  218. package/dist/registry/utils.d.ts +10 -14
  219. package/dist/registry/utils.d.ts.map +1 -1
  220. package/dist/registry/utils.js +5330 -49
  221. package/package.json +355 -73
  222. package/tsdown.config.js +1 -2
  223. package/.turbo/turbo-build$colon$types.log +0 -1
  224. package/.turbo/turbo-lint.log +0 -3
  225. package/dist/components/marketing/ChangelogPage.js.map +0 -1
  226. package/dist/components/marketing/CofounderPage.js.map +0 -1
  227. package/dist/components/marketing/ContactClient.js.map +0 -1
  228. package/dist/components/marketing/ContributePage.js.map +0 -1
  229. package/dist/components/marketing/DesignPartnerPage.js.map +0 -1
  230. package/dist/components/marketing/LandingPage.js.map +0 -1
  231. package/dist/components/marketing/PricingClient.js.map +0 -1
  232. package/dist/components/marketing/ProductClientPage.js.map +0 -1
  233. package/dist/components/marketing/pricing-thinking-modal.js.map +0 -1
  234. package/dist/components/marketing/sections/AudienceSection.js.map +0 -1
  235. package/dist/components/marketing/sections/CorePositioningSection.js.map +0 -1
  236. package/dist/components/marketing/sections/CtaSection.js.map +0 -1
  237. package/dist/components/marketing/sections/DevelopersSection.js.map +0 -1
  238. package/dist/components/marketing/sections/FearsSection.js.map +0 -1
  239. package/dist/components/marketing/sections/HeroMarketingSection.js.map +0 -1
  240. package/dist/components/marketing/sections/IconGridSection.js.map +0 -1
  241. package/dist/components/marketing/sections/OutputsSection.js.map +0 -1
  242. package/dist/components/marketing/sections/ProblemSection.js.map +0 -1
  243. package/dist/components/marketing/sections/SolutionSection.js.map +0 -1
  244. package/dist/components/marketing/sections/StepsSection.js.map +0 -1
  245. package/dist/components/marketing/waitlist-section.js.map +0 -1
  246. package/dist/components/templates/TemplatesClientPage.js.map +0 -1
  247. package/dist/components/templates/TemplatesPage.js.map +0 -1
  248. package/dist/components/templates/TemplatesPreviewModal.js.map +0 -1
  249. package/dist/libs/email/client.js.map +0 -1
  250. package/dist/libs/email/contact.js.map +0 -1
  251. package/dist/libs/email/newsletter.js.map +0 -1
  252. package/dist/libs/email/utils.js.map +0 -1
  253. package/dist/libs/email/waitlist-application.js.map +0 -1
  254. package/dist/libs/email/waitlist.js.map +0 -1
  255. package/dist/libs/pricing-examples.js.map +0 -1
  256. package/dist/registry/engine.js.map +0 -1
  257. package/dist/registry/factory.js.map +0 -1
  258. package/dist/registry/registry-docs.js.map +0 -1
  259. package/dist/registry/registry-landing.js.map +0 -1
  260. package/dist/registry/registry.js.map +0 -1
  261. package/dist/registry/utils.js.map +0 -1
  262. package/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,4813 @@
1
+ import { createRequire } from "node:module";
2
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
3
+
4
+ // src/components/marketing/ChangelogPage.tsx
5
+ import { jsxDEV } from "react/jsx-dev-runtime";
6
+ function ChangelogPage({ entries }) {
7
+ return /* @__PURE__ */ jsxDEV("main", {
8
+ children: [
9
+ /* @__PURE__ */ jsxDEV("section", {
10
+ className: "section-padding hero-gradient border-border relative border-b",
11
+ children: /* @__PURE__ */ jsxDEV("div", {
12
+ className: "mx-auto max-w-4xl space-y-6 text-center",
13
+ children: [
14
+ /* @__PURE__ */ jsxDEV("h1", {
15
+ className: "text-5xl leading-tight font-bold md:text-6xl",
16
+ children: "Changelog"
17
+ }, undefined, false, undefined, this),
18
+ /* @__PURE__ */ jsxDEV("p", {
19
+ className: "text-muted-foreground text-lg",
20
+ children: "Latest releases and improvements to ContractSpec."
21
+ }, undefined, false, undefined, this)
22
+ ]
23
+ }, undefined, true, undefined, this)
24
+ }, undefined, false, undefined, this),
25
+ /* @__PURE__ */ jsxDEV("section", {
26
+ className: "section-padding",
27
+ children: /* @__PURE__ */ jsxDEV("div", {
28
+ className: "mx-auto max-w-3xl space-y-8",
29
+ children: entries.map((entry, i) => /* @__PURE__ */ jsxDEV("div", {
30
+ className: "card-subtle flex flex-col gap-6 p-8 md:flex-row md:items-start",
31
+ children: [
32
+ /* @__PURE__ */ jsxDEV("div", {
33
+ className: "md:w-48 md:flex-shrink-0",
34
+ children: /* @__PURE__ */ jsxDEV("div", {
35
+ className: "sticky top-24",
36
+ children: [
37
+ /* @__PURE__ */ jsxDEV("h3", {
38
+ className: "text-2xl font-bold tracking-tight",
39
+ children: entry.version
40
+ }, undefined, false, undefined, this),
41
+ /* @__PURE__ */ jsxDEV("time", {
42
+ className: "text-muted-foreground mt-1 block text-sm font-medium",
43
+ children: entry.date
44
+ }, undefined, false, undefined, this),
45
+ entry.isBreaking && /* @__PURE__ */ jsxDEV("span", {
46
+ className: "mt-2 inline-flex items-center rounded-full border border-red-500/50 bg-red-500/10 px-2.5 py-0.5 text-xs font-semibold text-red-500",
47
+ children: "Breaking Change"
48
+ }, undefined, false, undefined, this)
49
+ ]
50
+ }, undefined, true, undefined, this)
51
+ }, undefined, false, undefined, this),
52
+ /* @__PURE__ */ jsxDEV("div", {
53
+ className: "flex-1 space-y-6",
54
+ children: entry.packages.map((pkg, j) => /* @__PURE__ */ jsxDEV("div", {
55
+ className: "space-y-3",
56
+ children: [
57
+ /* @__PURE__ */ jsxDEV("h4", {
58
+ className: "font-mono text-sm font-semibold text-violet-400",
59
+ children: pkg.name
60
+ }, undefined, false, undefined, this),
61
+ /* @__PURE__ */ jsxDEV("ul", {
62
+ className: "space-y-2",
63
+ children: pkg.changes.map((change, k) => /* @__PURE__ */ jsxDEV("li", {
64
+ className: "text-muted-foreground flex items-start gap-3 text-base leading-relaxed",
65
+ children: [
66
+ /* @__PURE__ */ jsxDEV("span", {
67
+ className: "mt-1.5 h-1.5 w-1.5 flex-shrink-0 rounded-full bg-violet-500/50"
68
+ }, undefined, false, undefined, this),
69
+ /* @__PURE__ */ jsxDEV("span", {
70
+ children: change
71
+ }, undefined, false, undefined, this)
72
+ ]
73
+ }, k, true, undefined, this))
74
+ }, undefined, false, undefined, this)
75
+ ]
76
+ }, j, true, undefined, this))
77
+ }, undefined, false, undefined, this)
78
+ ]
79
+ }, i, true, undefined, this))
80
+ }, undefined, false, undefined, this)
81
+ }, undefined, false, undefined, this)
82
+ ]
83
+ }, undefined, true, undefined, this);
84
+ }
85
+
86
+ // src/components/marketing/CofounderPage.tsx
87
+ import { ButtonLink, MarketingSection } from "@contractspec/lib.design-system";
88
+ import { Box, HStack, VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
89
+ import {
90
+ H1,
91
+ H2,
92
+ H3,
93
+ Lead,
94
+ Muted,
95
+ Small
96
+ } from "@contractspec/lib.ui-kit-web/ui/typography";
97
+ import {
98
+ Check,
99
+ Clock,
100
+ MapPin,
101
+ MessageSquare,
102
+ Percent,
103
+ Rocket,
104
+ Target,
105
+ Users,
106
+ X
107
+ } from "lucide-react";
108
+ import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
109
+ "use client";
110
+ var COFOUNDER_EMAIL = "tboutron@contractspec.io";
111
+ var APPLY_SUBJECT = "Co-founder application: ContractSpec";
112
+ var APPLY_BODY = `Hi Theo,
113
+
114
+ I am reaching out about co-founding ContractSpec.
115
+
116
+ LinkedIn: [your link]
117
+ Proof of work #1: [link]
118
+ Proof of work #2: [link]
119
+
120
+ Why ContractSpec:
121
+ [your answer]
122
+
123
+ What I would own in the first 90 days:
124
+ [your answer]
125
+ `;
126
+ var mailtoLink = `mailto:${COFOUNDER_EMAIL}?subject=${encodeURIComponent(APPLY_SUBJECT)}&body=${encodeURIComponent(APPLY_BODY)}`;
127
+ function HeroSection() {
128
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
129
+ tone: "gradient",
130
+ padding: "spacious",
131
+ align: "center",
132
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
133
+ gap: "lg",
134
+ align: "center",
135
+ className: "text-center",
136
+ children: [
137
+ /* @__PURE__ */ jsxDEV2(H1, {
138
+ className: "text-4xl leading-tight font-bold text-balance md:text-5xl",
139
+ children: "Co-founder wanted"
140
+ }, undefined, false, undefined, this),
141
+ /* @__PURE__ */ jsxDEV2(Lead, {
142
+ className: "text-muted-foreground max-w-2xl text-lg text-balance md:text-xl",
143
+ children: "ContractSpec is a contract-first compiler for AI-generated code. Define specs, enforce policies, regenerate safely. Pre-PMF. Building in public."
144
+ }, undefined, false, undefined, this),
145
+ /* @__PURE__ */ jsxDEV2(HStack, {
146
+ gap: "md",
147
+ justify: "center",
148
+ wrap: "wrap",
149
+ className: "pt-2",
150
+ children: [
151
+ /* @__PURE__ */ jsxDEV2(ButtonLink, {
152
+ href: mailtoLink,
153
+ children: "Talk about co-founding"
154
+ }, undefined, false, undefined, this),
155
+ /* @__PURE__ */ jsxDEV2(ButtonLink, {
156
+ variant: "ghost",
157
+ href: "/contact",
158
+ children: "Become a design partner"
159
+ }, undefined, false, undefined, this)
160
+ ]
161
+ }, undefined, true, undefined, this)
162
+ ]
163
+ }, undefined, true, undefined, this)
164
+ }, undefined, false, undefined, this);
165
+ }
166
+ function WhatExistsSection() {
167
+ const realNow = [
168
+ "ContractSpec Core: open-source spec compiler",
169
+ "Working CLI and TypeScript runtime",
170
+ "Design partner pipeline open",
171
+ "Solo founder, bootstrapped"
172
+ ];
173
+ const planned = [
174
+ "Visual studio for specs",
175
+ "Auto-evolution engine",
176
+ "Multi-tenant SaaS",
177
+ "Integration marketplace"
178
+ ];
179
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
180
+ padding: "comfortable",
181
+ align: "center",
182
+ maxWidth: "lg",
183
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
184
+ gap: "lg",
185
+ children: [
186
+ /* @__PURE__ */ jsxDEV2(H2, {
187
+ className: "text-3xl font-bold",
188
+ children: "What exists today"
189
+ }, undefined, false, undefined, this),
190
+ /* @__PURE__ */ jsxDEV2("div", {
191
+ className: "grid w-full gap-8 md:grid-cols-2",
192
+ children: [
193
+ /* @__PURE__ */ jsxDEV2(VStack, {
194
+ gap: "sm",
195
+ align: "start",
196
+ children: [
197
+ /* @__PURE__ */ jsxDEV2(H3, {
198
+ className: "text-lg font-semibold text-emerald-400",
199
+ children: "Real now"
200
+ }, undefined, false, undefined, this),
201
+ /* @__PURE__ */ jsxDEV2("ul", {
202
+ className: "space-y-2",
203
+ children: realNow.map((item) => /* @__PURE__ */ jsxDEV2("li", {
204
+ className: "flex items-start gap-2",
205
+ children: [
206
+ /* @__PURE__ */ jsxDEV2(Check, {
207
+ size: 16,
208
+ className: "mt-1 shrink-0 text-emerald-400"
209
+ }, undefined, false, undefined, this),
210
+ /* @__PURE__ */ jsxDEV2(Small, {
211
+ children: item
212
+ }, undefined, false, undefined, this)
213
+ ]
214
+ }, item, true, undefined, this))
215
+ }, undefined, false, undefined, this)
216
+ ]
217
+ }, undefined, true, undefined, this),
218
+ /* @__PURE__ */ jsxDEV2(VStack, {
219
+ gap: "sm",
220
+ align: "start",
221
+ children: [
222
+ /* @__PURE__ */ jsxDEV2(H3, {
223
+ className: "text-lg font-semibold text-blue-400",
224
+ children: "Planned"
225
+ }, undefined, false, undefined, this),
226
+ /* @__PURE__ */ jsxDEV2("ul", {
227
+ className: "space-y-2",
228
+ children: planned.map((item) => /* @__PURE__ */ jsxDEV2("li", {
229
+ className: "flex items-start gap-2",
230
+ children: [
231
+ /* @__PURE__ */ jsxDEV2(Target, {
232
+ size: 16,
233
+ className: "mt-1 shrink-0 text-blue-400"
234
+ }, undefined, false, undefined, this),
235
+ /* @__PURE__ */ jsxDEV2(Small, {
236
+ children: item
237
+ }, undefined, false, undefined, this)
238
+ ]
239
+ }, item, true, undefined, this))
240
+ }, undefined, false, undefined, this)
241
+ ]
242
+ }, undefined, true, undefined, this)
243
+ ]
244
+ }, undefined, true, undefined, this)
245
+ ]
246
+ }, undefined, true, undefined, this)
247
+ }, undefined, false, undefined, this);
248
+ }
249
+ function RoleSection() {
250
+ const gtmDeliverables = [
251
+ "Run 5+ sales conversations per week",
252
+ "Own the design partner pipeline end-to-end",
253
+ "Write positioning copy that ships",
254
+ "Build and maintain partnership channels",
255
+ "Turn user feedback into roadmap signal"
256
+ ];
257
+ const productDeliverables = [
258
+ "Ship UI/UX improvements weekly",
259
+ "Define specs based on user research",
260
+ "Own the studio experience",
261
+ "Collaborate on architecture decisions"
262
+ ];
263
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
264
+ padding: "comfortable",
265
+ align: "center",
266
+ maxWidth: "lg",
267
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
268
+ gap: "lg",
269
+ children: [
270
+ /* @__PURE__ */ jsxDEV2(H2, {
271
+ className: "text-3xl font-bold",
272
+ children: "The role"
273
+ }, undefined, false, undefined, this),
274
+ /* @__PURE__ */ jsxDEV2(VStack, {
275
+ gap: "md",
276
+ align: "start",
277
+ className: "w-full",
278
+ children: [
279
+ /* @__PURE__ */ jsxDEV2(H3, {
280
+ className: "text-xl font-semibold",
281
+ children: "Option A: GTM / Sales / Partnerships"
282
+ }, undefined, false, undefined, this),
283
+ /* @__PURE__ */ jsxDEV2(Muted, {
284
+ children: "Weekly deliverables, not vague traits:"
285
+ }, undefined, false, undefined, this),
286
+ /* @__PURE__ */ jsxDEV2("ul", {
287
+ className: "space-y-2",
288
+ children: gtmDeliverables.map((item) => /* @__PURE__ */ jsxDEV2("li", {
289
+ className: "flex items-start gap-2",
290
+ children: [
291
+ /* @__PURE__ */ jsxDEV2(Rocket, {
292
+ size: 16,
293
+ className: "mt-1 shrink-0 text-amber-400"
294
+ }, undefined, false, undefined, this),
295
+ /* @__PURE__ */ jsxDEV2(Small, {
296
+ children: item
297
+ }, undefined, false, undefined, this)
298
+ ]
299
+ }, item, true, undefined, this))
300
+ }, undefined, false, undefined, this)
301
+ ]
302
+ }, undefined, true, undefined, this),
303
+ /* @__PURE__ */ jsxDEV2(VStack, {
304
+ gap: "md",
305
+ align: "start",
306
+ className: "w-full pt-4",
307
+ children: [
308
+ /* @__PURE__ */ jsxDEV2(H3, {
309
+ className: "text-xl font-semibold",
310
+ children: "Option B: Product / Design"
311
+ }, undefined, false, undefined, this),
312
+ /* @__PURE__ */ jsxDEV2(Muted, {
313
+ children: "If this is your strength:"
314
+ }, undefined, false, undefined, this),
315
+ /* @__PURE__ */ jsxDEV2("ul", {
316
+ className: "space-y-2",
317
+ children: productDeliverables.map((item) => /* @__PURE__ */ jsxDEV2("li", {
318
+ className: "flex items-start gap-2",
319
+ children: [
320
+ /* @__PURE__ */ jsxDEV2(Rocket, {
321
+ size: 16,
322
+ className: "mt-1 shrink-0 text-purple-400"
323
+ }, undefined, false, undefined, this),
324
+ /* @__PURE__ */ jsxDEV2(Small, {
325
+ children: item
326
+ }, undefined, false, undefined, this)
327
+ ]
328
+ }, item, true, undefined, this))
329
+ }, undefined, false, undefined, this)
330
+ ]
331
+ }, undefined, true, undefined, this)
332
+ ]
333
+ }, undefined, true, undefined, this)
334
+ }, undefined, false, undefined, this);
335
+ }
336
+ function IdealCofounderSection() {
337
+ const qualities = [
338
+ "You have shipped products people paid for — links or it didn't happen",
339
+ "You have sold something (product, consulting, yourself)",
340
+ "You write clearly and fast — emails, docs, copy",
341
+ "You have taste: you know good UX when you see it",
342
+ "You can work 6+ months without a salary",
343
+ "You are allergic to meetings that could be docs",
344
+ "You have built in public or contributed to open source",
345
+ "You are based in Europe or overlap significantly with CET"
346
+ ];
347
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
348
+ padding: "comfortable",
349
+ align: "center",
350
+ maxWidth: "lg",
351
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
352
+ gap: "lg",
353
+ children: [
354
+ /* @__PURE__ */ jsxDEV2(H2, {
355
+ className: "text-3xl font-bold",
356
+ children: "The ideal co-founder"
357
+ }, undefined, false, undefined, this),
358
+ /* @__PURE__ */ jsxDEV2("ul", {
359
+ className: "space-y-3",
360
+ children: qualities.map((item) => /* @__PURE__ */ jsxDEV2("li", {
361
+ className: "flex items-start gap-2",
362
+ children: [
363
+ /* @__PURE__ */ jsxDEV2(Check, {
364
+ size: 16,
365
+ className: "mt-1 shrink-0 text-emerald-400"
366
+ }, undefined, false, undefined, this),
367
+ /* @__PURE__ */ jsxDEV2(Small, {
368
+ children: item
369
+ }, undefined, false, undefined, this)
370
+ ]
371
+ }, item, true, undefined, this))
372
+ }, undefined, false, undefined, this),
373
+ /* @__PURE__ */ jsxDEV2(Box, {
374
+ className: "border-border mt-4 rounded-lg border p-4",
375
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
376
+ gap: "sm",
377
+ align: "start",
378
+ children: [
379
+ /* @__PURE__ */ jsxDEV2(H3, {
380
+ className: "text-lg font-semibold",
381
+ children: "Proof of work examples"
382
+ }, undefined, false, undefined, this),
383
+ /* @__PURE__ */ jsxDEV2(Muted, {
384
+ className: "text-sm",
385
+ children: "GitHub profile, shipped product, writing (blog/Twitter/essays), revenue screenshot, open-source contributions, or anything that shows you execute."
386
+ }, undefined, false, undefined, this)
387
+ ]
388
+ }, undefined, true, undefined, this)
389
+ }, undefined, false, undefined, this)
390
+ ]
391
+ }, undefined, true, undefined, this)
392
+ }, undefined, false, undefined, this);
393
+ }
394
+ function WhatYouGetSection() {
395
+ const benefits = [
396
+ {
397
+ icon: /* @__PURE__ */ jsxDEV2(Percent, {
398
+ size: 20,
399
+ className: "text-emerald-400"
400
+ }, undefined, false, undefined, this),
401
+ title: "Equity-first",
402
+ desc: "Meaningful co-founder equity. Salary is minimal/zero until revenue covers it."
403
+ },
404
+ {
405
+ icon: /* @__PURE__ */ jsxDEV2(Users, {
406
+ size: 20,
407
+ className: "text-blue-400"
408
+ }, undefined, false, undefined, this),
409
+ title: "Real ownership",
410
+ desc: "You own your domain. No permission-seeking. Ship and iterate."
411
+ },
412
+ {
413
+ icon: /* @__PURE__ */ jsxDEV2(MessageSquare, {
414
+ size: 20,
415
+ className: "text-amber-400"
416
+ }, undefined, false, undefined, this),
417
+ title: "Written-first decisions",
418
+ desc: "We default to async, docs, and fast decisions. Meetings are last resort."
419
+ }
420
+ ];
421
+ const values = [
422
+ "Contracts over conventions",
423
+ "Clarity over cleverness",
424
+ "Safety over speed (in code)",
425
+ "Leverage over labor"
426
+ ];
427
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
428
+ padding: "comfortable",
429
+ align: "center",
430
+ maxWidth: "lg",
431
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
432
+ gap: "lg",
433
+ children: [
434
+ /* @__PURE__ */ jsxDEV2(H2, {
435
+ className: "text-3xl font-bold",
436
+ children: "What you get"
437
+ }, undefined, false, undefined, this),
438
+ /* @__PURE__ */ jsxDEV2("div", {
439
+ className: "grid w-full gap-6 md:grid-cols-3",
440
+ children: benefits.map((b) => /* @__PURE__ */ jsxDEV2(VStack, {
441
+ gap: "sm",
442
+ align: "start",
443
+ className: "border-border rounded-lg border p-4",
444
+ children: [
445
+ b.icon,
446
+ /* @__PURE__ */ jsxDEV2(H3, {
447
+ className: "text-lg font-semibold",
448
+ children: b.title
449
+ }, undefined, false, undefined, this),
450
+ /* @__PURE__ */ jsxDEV2(Muted, {
451
+ className: "text-sm",
452
+ children: b.desc
453
+ }, undefined, false, undefined, this)
454
+ ]
455
+ }, b.title, true, undefined, this))
456
+ }, undefined, false, undefined, this),
457
+ /* @__PURE__ */ jsxDEV2(VStack, {
458
+ gap: "sm",
459
+ align: "start",
460
+ className: "w-full pt-4",
461
+ children: [
462
+ /* @__PURE__ */ jsxDEV2(H3, {
463
+ className: "text-lg font-semibold",
464
+ children: "Our values"
465
+ }, undefined, false, undefined, this),
466
+ /* @__PURE__ */ jsxDEV2(HStack, {
467
+ gap: "sm",
468
+ wrap: "wrap",
469
+ children: values.map((v) => /* @__PURE__ */ jsxDEV2(Box, {
470
+ className: "border-border rounded-full border px-3 py-1 text-sm",
471
+ children: v
472
+ }, v, false, undefined, this))
473
+ }, undefined, false, undefined, this)
474
+ ]
475
+ }, undefined, true, undefined, this)
476
+ ]
477
+ }, undefined, true, undefined, this)
478
+ }, undefined, false, undefined, this);
479
+ }
480
+ function RedFlagsSection() {
481
+ const redFlags = [
482
+ "Needs a big salary now",
483
+ "Hates selling or talking to users",
484
+ "Vague about past execution",
485
+ 'Wants to "advise" instead of build',
486
+ "Needs a big team to feel productive",
487
+ "Cannot write clearly"
488
+ ];
489
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
490
+ padding: "comfortable",
491
+ align: "center",
492
+ maxWidth: "lg",
493
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
494
+ gap: "lg",
495
+ children: [
496
+ /* @__PURE__ */ jsxDEV2(H2, {
497
+ className: "text-3xl font-bold",
498
+ children: "Non-negotiables / red flags"
499
+ }, undefined, false, undefined, this),
500
+ /* @__PURE__ */ jsxDEV2(Muted, {
501
+ children: "If any of these apply, this is not the right fit:"
502
+ }, undefined, false, undefined, this),
503
+ /* @__PURE__ */ jsxDEV2("ul", {
504
+ className: "space-y-2",
505
+ children: redFlags.map((item) => /* @__PURE__ */ jsxDEV2("li", {
506
+ className: "flex items-start gap-2",
507
+ children: [
508
+ /* @__PURE__ */ jsxDEV2(X, {
509
+ size: 16,
510
+ className: "mt-1 shrink-0 text-red-400"
511
+ }, undefined, false, undefined, this),
512
+ /* @__PURE__ */ jsxDEV2(Small, {
513
+ children: item
514
+ }, undefined, false, undefined, this)
515
+ ]
516
+ }, item, true, undefined, this))
517
+ }, undefined, false, undefined, this)
518
+ ]
519
+ }, undefined, true, undefined, this)
520
+ }, undefined, false, undefined, this);
521
+ }
522
+ function FAQSection() {
523
+ const faqs = [
524
+ {
525
+ icon: /* @__PURE__ */ jsxDEV2(Users, {
526
+ size: 18
527
+ }, undefined, false, undefined, this),
528
+ q: "Why co-founder instead of hiring?",
529
+ a: "I need a partner who thinks like an owner, not an employee. Someone who will stay when things get hard and share in the upside when they don't."
530
+ },
531
+ {
532
+ icon: /* @__PURE__ */ jsxDEV2(Clock, {
533
+ size: 18
534
+ }, undefined, false, undefined, this),
535
+ q: "What is the timeline to revenue?",
536
+ a: "Design partners are converting now. Goal: paying customers in 2025. But this is startup life — timelines are best guesses."
537
+ },
538
+ {
539
+ icon: /* @__PURE__ */ jsxDEV2(MapPin, {
540
+ size: 18
541
+ }, undefined, false, undefined, this),
542
+ q: "Is this remote?",
543
+ a: "Yes. Async-first. Occasional in-person (Paris-based) for planning. Europe timezone overlap strongly preferred."
544
+ },
545
+ {
546
+ icon: /* @__PURE__ */ jsxDEV2(Percent, {
547
+ size: 18
548
+ }, undefined, false, undefined, this),
549
+ q: "How much equity?",
550
+ a: "Depends on what you bring, when you join, and how much you can commit. Expect meaningful co-founder equity with 4-year vesting. We will discuss specifics in person."
551
+ }
552
+ ];
553
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
554
+ padding: "comfortable",
555
+ align: "center",
556
+ maxWidth: "lg",
557
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
558
+ gap: "lg",
559
+ children: [
560
+ /* @__PURE__ */ jsxDEV2(H2, {
561
+ className: "text-3xl font-bold",
562
+ children: "FAQ"
563
+ }, undefined, false, undefined, this),
564
+ /* @__PURE__ */ jsxDEV2(VStack, {
565
+ gap: "md",
566
+ className: "w-full",
567
+ children: faqs.map((faq) => /* @__PURE__ */ jsxDEV2(VStack, {
568
+ gap: "xs",
569
+ align: "start",
570
+ className: "border-border w-full rounded-lg border p-4",
571
+ children: [
572
+ /* @__PURE__ */ jsxDEV2(HStack, {
573
+ gap: "sm",
574
+ align: "center",
575
+ children: [
576
+ /* @__PURE__ */ jsxDEV2("span", {
577
+ className: "text-muted-foreground",
578
+ children: faq.icon
579
+ }, undefined, false, undefined, this),
580
+ /* @__PURE__ */ jsxDEV2(H3, {
581
+ className: "text-lg font-semibold",
582
+ children: faq.q
583
+ }, undefined, false, undefined, this)
584
+ ]
585
+ }, undefined, true, undefined, this),
586
+ /* @__PURE__ */ jsxDEV2(Muted, {
587
+ children: faq.a
588
+ }, undefined, false, undefined, this)
589
+ ]
590
+ }, faq.q, true, undefined, this))
591
+ }, undefined, false, undefined, this)
592
+ ]
593
+ }, undefined, true, undefined, this)
594
+ }, undefined, false, undefined, this);
595
+ }
596
+ function FinalCtaSection() {
597
+ return /* @__PURE__ */ jsxDEV2(MarketingSection, {
598
+ tone: "gradient",
599
+ padding: "comfortable",
600
+ align: "center",
601
+ maxWidth: "lg",
602
+ children: /* @__PURE__ */ jsxDEV2(VStack, {
603
+ gap: "md",
604
+ align: "center",
605
+ className: "text-center",
606
+ children: [
607
+ /* @__PURE__ */ jsxDEV2(H2, {
608
+ className: "text-3xl font-bold md:text-4xl",
609
+ children: "Ready to talk?"
610
+ }, undefined, false, undefined, this),
611
+ /* @__PURE__ */ jsxDEV2(Lead, {
612
+ className: "text-muted-foreground max-w-xl",
613
+ children: "Send an email with: your LinkedIn, 2 proof-of-work links, why ContractSpec, and what you would own in the first 90 days."
614
+ }, undefined, false, undefined, this),
615
+ /* @__PURE__ */ jsxDEV2(HStack, {
616
+ gap: "md",
617
+ justify: "center",
618
+ wrap: "wrap",
619
+ className: "pt-2",
620
+ children: [
621
+ /* @__PURE__ */ jsxDEV2(ButtonLink, {
622
+ href: mailtoLink,
623
+ children: "Talk about co-founding"
624
+ }, undefined, false, undefined, this),
625
+ /* @__PURE__ */ jsxDEV2(ButtonLink, {
626
+ variant: "ghost",
627
+ href: "/contact",
628
+ children: "Become a design partner"
629
+ }, undefined, false, undefined, this)
630
+ ]
631
+ }, undefined, true, undefined, this),
632
+ /* @__PURE__ */ jsxDEV2(Muted, {
633
+ className: "pt-4 text-sm",
634
+ children: "CHAMAN VENTURES, SASU · RCS Paris · SIREN 989 498 902 · 229 rue Saint-Honoré, 75001 Paris"
635
+ }, undefined, false, undefined, this)
636
+ ]
637
+ }, undefined, true, undefined, this)
638
+ }, undefined, false, undefined, this);
639
+ }
640
+ function CofounderPage() {
641
+ return /* @__PURE__ */ jsxDEV2(VStack, {
642
+ as: "main",
643
+ gap: "none",
644
+ children: [
645
+ /* @__PURE__ */ jsxDEV2(HeroSection, {}, undefined, false, undefined, this),
646
+ /* @__PURE__ */ jsxDEV2(WhatExistsSection, {}, undefined, false, undefined, this),
647
+ /* @__PURE__ */ jsxDEV2(RoleSection, {}, undefined, false, undefined, this),
648
+ /* @__PURE__ */ jsxDEV2(IdealCofounderSection, {}, undefined, false, undefined, this),
649
+ /* @__PURE__ */ jsxDEV2(WhatYouGetSection, {}, undefined, false, undefined, this),
650
+ /* @__PURE__ */ jsxDEV2(RedFlagsSection, {}, undefined, false, undefined, this),
651
+ /* @__PURE__ */ jsxDEV2(FAQSection, {}, undefined, false, undefined, this),
652
+ /* @__PURE__ */ jsxDEV2(FinalCtaSection, {}, undefined, false, undefined, this)
653
+ ]
654
+ }, undefined, true, undefined, this);
655
+ }
656
+
657
+ // src/libs/email/client.ts
658
+ import { createClient, Temv1alpha1 } from "@scaleway/sdk";
659
+ import { Logger } from "@contractspec/lib.logger";
660
+ var DEFAULT_FROM = {
661
+ email: "noreply@transactional.contractspec.io",
662
+ name: "ContractSpec"
663
+ };
664
+ var DEFAULT_TEAM_INBOX = {
665
+ email: "contact@contractspec.io",
666
+ name: "ContractSpec Team"
667
+ };
668
+ var DEFAULT_REGION = "fr-par";
669
+ var cachedConfig = null;
670
+ var cachedClient = null;
671
+ var apiFactory = (client) => new Temv1alpha1.API(client);
672
+ var mapRegion = (value) => {
673
+ const normalized = value?.trim().toLowerCase();
674
+ if (normalized === "par" || normalized === "fr-par")
675
+ return "fr-par";
676
+ if (normalized === "ams" || normalized === "nl-ams")
677
+ return "nl-ams";
678
+ if (normalized === "waw" || normalized === "pl-waw")
679
+ return "pl-waw";
680
+ return DEFAULT_REGION;
681
+ };
682
+ var getEmailConfig = () => {
683
+ if (cachedConfig) {
684
+ return { ok: true, config: cachedConfig };
685
+ }
686
+ const accessKey = process.env.SCALEWAY_ACCESS_KEY || process.env.SCALEWAY_ACCESS_KEY_QUEUE;
687
+ const secretKey = process.env.SCALEWAY_SECRET_KEY || process.env.SCALEWAY_SECRET_KEY_QUEUE;
688
+ const projectId = process.env.SCALEWAY_PROJECT_ID;
689
+ if (!accessKey || !secretKey || !projectId) {
690
+ return {
691
+ ok: false,
692
+ errorMessage: "Email service is not configured. Please contact us directly at contact@contractspec.io."
693
+ };
694
+ }
695
+ const region = mapRegion(process.env.SCALEWAY_REGION);
696
+ cachedConfig = {
697
+ accessKey,
698
+ secretKey,
699
+ projectId,
700
+ region,
701
+ defaultZone: `${region}-1`,
702
+ from: {
703
+ email: process.env.SCALEWAY_EMAIL_FROM_EMAIL ?? DEFAULT_FROM.email,
704
+ name: process.env.SCALEWAY_EMAIL_FROM_NAME ?? DEFAULT_FROM.name
705
+ },
706
+ teamInbox: {
707
+ email: process.env.SCALEWAY_EMAIL_TEAM_EMAIL ?? DEFAULT_TEAM_INBOX.email,
708
+ name: process.env.SCALEWAY_EMAIL_TEAM_NAME ?? DEFAULT_TEAM_INBOX.name
709
+ }
710
+ };
711
+ return { ok: true, config: cachedConfig };
712
+ };
713
+ var getTemClient = (config) => {
714
+ if (cachedClient) {
715
+ return cachedClient;
716
+ }
717
+ const client = createClient({
718
+ accessKey: config.accessKey,
719
+ secretKey: config.secretKey,
720
+ defaultProjectId: config.projectId,
721
+ defaultRegion: config.region,
722
+ defaultZone: config.defaultZone
723
+ });
724
+ cachedClient = apiFactory(client);
725
+ return cachedClient;
726
+ };
727
+ var sendEmail = async (config, request) => {
728
+ try {
729
+ const client = getTemClient(config);
730
+ await client.createEmail({
731
+ region: config.region,
732
+ projectId: config.projectId,
733
+ from: config.from,
734
+ to: request.to,
735
+ subject: request.subject,
736
+ text: request.text,
737
+ html: request.html || request.text,
738
+ additionalHeaders: request.replyTo ? [{ key: "Reply-To", value: request.replyTo }] : undefined
739
+ });
740
+ return { success: true };
741
+ } catch (error) {
742
+ new Logger().error("scaleway_tem_email_send_failed", {
743
+ context: request.context ?? "email",
744
+ error: error instanceof Error ? error.message : error
745
+ });
746
+ return {
747
+ success: false,
748
+ error,
749
+ errorMessage: "Failed to send email via Scaleway."
750
+ };
751
+ }
752
+ };
753
+ var __internal = {
754
+ resetCaches() {
755
+ cachedClient = null;
756
+ cachedConfig = null;
757
+ apiFactory = (client) => new Temv1alpha1.API(client);
758
+ },
759
+ setApiFactory(factory) {
760
+ apiFactory = factory;
761
+ },
762
+ setClient(client) {
763
+ cachedClient = client;
764
+ }
765
+ };
766
+
767
+ // src/libs/email/utils.ts
768
+ var escapeHtml = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
769
+ var formatMultilineHtml = (value) => escapeHtml(value).replaceAll(`
770
+ `, "<br />");
771
+
772
+ // src/libs/email/contact.ts
773
+ "use server";
774
+ var CONTACT_MISSING_CONFIG = "Email service is not configured. Please contact us directly at contact@contractspec.io.";
775
+ var CONTACT_SEND_ERROR = "Failed to send message. Please contact us directly at contact@contractspec.io.";
776
+ var submitContactForm = async (formData) => {
777
+ const name = (formData.get("name") ?? "").toString().trim();
778
+ const email = (formData.get("email") ?? "").toString().trim();
779
+ const message = (formData.get("message") ?? "").toString().trim();
780
+ if (!email) {
781
+ return {
782
+ success: false,
783
+ text: "Please fill in all required fields."
784
+ };
785
+ }
786
+ const configResult = getEmailConfig();
787
+ if (!configResult.ok || !configResult.config) {
788
+ return {
789
+ success: false,
790
+ text: configResult.errorMessage ?? CONTACT_MISSING_CONFIG
791
+ };
792
+ }
793
+ const senderName = name || email;
794
+ const emailContentText = `
795
+ New contact form submission from ${senderName}
796
+
797
+ Contact Information:
798
+ - Name: ${name || "Not provided"}
799
+ - Email: ${email}
800
+
801
+ Message:
802
+ ${message || "No message provided"}
803
+
804
+ ---
805
+ Submitted via ContractSpec contact form
806
+ `.trim();
807
+ const emailContentHtml = `
808
+ <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
809
+ <h1 style="color: #8b5cf6; margin-bottom: 12px;">New contact form submission</h1>
810
+ <p style="margin: 0 0 12px;">From ${escapeHtml(senderName)}</p>
811
+ <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Contact Information</h2>
812
+ <ul style="padding-left: 16px; line-height: 1.6; margin: 0 0 16px;">
813
+ <li>Name: ${escapeHtml(name || "Not provided")}</li>
814
+ <li>Email: ${escapeHtml(email)}</li>
815
+ </ul>
816
+ <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Message</h2>
817
+ <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
818
+ ${message ? formatMultilineHtml(message) : "No message provided"}
819
+ </div>
820
+ <p style="color: #6b7280; font-size: 12px; margin-top: 20px;">Submitted via ContractSpec contact form</p>
821
+ </div>
822
+ `;
823
+ const sendResult = await sendEmail(configResult.config, {
824
+ to: [configResult.config.teamInbox],
825
+ subject: `New Contact Form Message from ${senderName}`,
826
+ text: emailContentText,
827
+ html: emailContentHtml,
828
+ replyTo: email,
829
+ context: "contact-form"
830
+ });
831
+ if (!sendResult.success) {
832
+ return { success: false, text: CONTACT_SEND_ERROR };
833
+ }
834
+ return { success: true, text: "Message sent successfully!" };
835
+ };
836
+
837
+ // src/libs/email/waitlist.ts
838
+ "use server";
839
+ var WAITLIST_MISSING_CONFIG = "Waitlist service is not configured. Please try again later.";
840
+ var WAITLIST_SEND_ERROR = "Failed to join waitlist. Please try again later or contact us directly.";
841
+ var joinWaitlist = async (formData) => {
842
+ const email = (formData.get("email") ?? "").toString().trim();
843
+ if (!email || !email.includes("@")) {
844
+ return {
845
+ success: false,
846
+ text: "Please enter a valid email address."
847
+ };
848
+ }
849
+ const configResult = getEmailConfig();
850
+ if (!configResult.ok || !configResult.config) {
851
+ return {
852
+ success: false,
853
+ text: configResult.errorMessage ?? WAITLIST_MISSING_CONFIG
854
+ };
855
+ }
856
+ const waitlistText = `
857
+ You're on the waitlist!
858
+
859
+ Thanks for joining the ContractSpec waitlist. You're now in line for early access to:
860
+
861
+ • Stabilize your AI-generated code with ContractSpec
862
+ • Multi-surface consistency (API, DB, UI, events)
863
+ • Safe regeneration without breaking changes
864
+ • AI governance and contract enforcement
865
+
866
+ We'll notify you as soon as early access is available. In the meantime, you can:
867
+
868
+ • Check out our docs: https://contractspec.io/docs
869
+ • Follow our progress on GitHub
870
+ • Book a demo call to see ContractSpec in action
871
+
872
+ We're excited to have you on board!
873
+
874
+ ---
875
+ ContractSpec Team
876
+ https://contractspec.io
877
+
878
+ To remove yourself from the waitlist, reply to this email with "remove"
879
+ `.trim();
880
+ const waitlistHtml = `
881
+ <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
882
+ <h1 style="color: #8b5cf6;">You're on the waitlist!</h1>
883
+ <p>Thanks for joining the ContractSpec waitlist. You're now in line for early access to:</p>
884
+ <ul style="line-height: 1.8;">
885
+ <li>Stabilize your AI-generated code with ContractSpec</li>
886
+ <li>Multi-surface consistency (API, DB, UI, events)</li>
887
+ <li>Safe regeneration without breaking changes</li>
888
+ <li>AI governance and contract enforcement</li>
889
+ </ul>
890
+ <p>We'll notify you as soon as early access is available. In the meantime, you can:</p>
891
+ <ul style="line-height: 1.8;">
892
+ <li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
893
+ <li>Follow our progress on GitHub</li>
894
+ <li>Book a demo call to see ContractSpec in action</li>
895
+ </ul>
896
+ <p>We're excited to have you on board!</p>
897
+ <hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
898
+ <p style="color: #6b7280; font-size: 14px;">
899
+ ContractSpec Team<br />
900
+ <a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
901
+ </p>
902
+ <p style="color: #9ca3af; font-size: 12px;">
903
+ To remove yourself from the waitlist, reply to this email with "remove"
904
+ </p>
905
+ </div>
906
+ `;
907
+ const userSend = await sendEmail(configResult.config, {
908
+ to: [{ email }],
909
+ subject: "You're on the ContractSpec waitlist!",
910
+ text: waitlistText,
911
+ html: waitlistHtml,
912
+ context: "waitlist-welcome"
913
+ });
914
+ if (!userSend.success) {
915
+ return { success: false, text: WAITLIST_SEND_ERROR };
916
+ }
917
+ const teamNotificationText = `New waitlist signup from: ${email}`;
918
+ const teamNotificationHtml = `
919
+ <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
920
+ <p style="margin: 0 0 8px;">New waitlist signup</p>
921
+ <p style="margin: 0;"><strong>Email:</strong> ${formatMultilineHtml(email)}</p>
922
+ </div>
923
+ `;
924
+ const teamSend = await sendEmail(configResult.config, {
925
+ to: [configResult.config.teamInbox],
926
+ subject: `New Waitlist Signup: ${email}`,
927
+ text: teamNotificationText,
928
+ html: teamNotificationHtml,
929
+ context: "waitlist-team-notification"
930
+ });
931
+ if (!teamSend.success) {
932
+ return { success: false, text: WAITLIST_SEND_ERROR };
933
+ }
934
+ return { success: true, text: "Successfully joined waitlist!" };
935
+ };
936
+
937
+ // src/libs/email/waitlist-application.ts
938
+ "use server";
939
+ var APPLICATION_MISSING_CONFIG = "Waitlist application service is not configured. Please try again later.";
940
+ var APPLICATION_SEND_ERROR = "Failed to submit application. Please try again later or contact us directly.";
941
+ var submitWaitlistApplication = async (formData) => {
942
+ const email = (formData.get("email") ?? "").toString().trim();
943
+ const name = (formData.get("name") ?? "").toString().trim();
944
+ const company = (formData.get("company") ?? "").toString().trim();
945
+ const role = (formData.get("role") ?? "").toString().trim();
946
+ const useCase = (formData.get("useCase") ?? "").toString().trim();
947
+ const currentStack = (formData.get("currentStack") ?? "").toString().trim();
948
+ const whatBuilding = (formData.get("whatBuilding") ?? "").toString().trim();
949
+ const whatSolving = (formData.get("whatSolving") ?? "").toString().trim();
950
+ const teamSize = (formData.get("teamSize") ?? "").toString().trim();
951
+ const timeline = (formData.get("timeline") ?? "").toString().trim();
952
+ const openToSessions = formData.get("openToSessions") === "on";
953
+ const okayWithCaseStudies = formData.get("okayWithCaseStudies") === "on";
954
+ if (!email || !email.includes("@")) {
955
+ return {
956
+ success: false,
957
+ text: "Please enter a valid email address."
958
+ };
959
+ }
960
+ if (!name || !whatBuilding || !whatSolving) {
961
+ return {
962
+ success: false,
963
+ text: "Please fill in all required fields."
964
+ };
965
+ }
966
+ const configResult = getEmailConfig();
967
+ if (!configResult.ok || !configResult.config) {
968
+ return {
969
+ success: false,
970
+ text: configResult.errorMessage ?? APPLICATION_MISSING_CONFIG
971
+ };
972
+ }
973
+ const applicantText = `
974
+ You're on the list.
975
+
976
+ Thanks for applying to the ContractSpec design partner program. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally.
977
+
978
+ What happens next:
979
+ • We review applications weekly
980
+ • If selected, we'll reach out via email to schedule an intro call
981
+ • During early access, you'll get hands-on support and influence over the roadmap
982
+
983
+ In the meantime:
984
+ • Check out our docs: https://contractspec.io/docs
985
+ • Book a demo call: https://contractspec.io/contact
986
+
987
+ We're excited about the possibility of working together!
988
+
989
+ ---
990
+ ContractSpec Team
991
+ https://contractspec.io
992
+ `.trim();
993
+ const applicantHtml = `
994
+ <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
995
+ <h1 style="color: #8b5cf6;">You're on the list.</h1>
996
+ <p>Thanks for applying to the ContractSpec design partner program. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally.</p>
997
+ <h2 style="color: #8b5cf6; margin-top: 24px;">What happens next:</h2>
998
+ <ul style="line-height: 1.8;">
999
+ <li>We review applications weekly</li>
1000
+ <li>If selected, we'll reach out via email to schedule an intro call</li>
1001
+ <li>During early access, you'll get hands-on support and influence over the roadmap</li>
1002
+ </ul>
1003
+ <h2 style="color: #8b5cf6; margin-top: 24px;">In the meantime:</h2>
1004
+ <ul style="line-height: 1.8;">
1005
+ <li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
1006
+ <li>Book a demo call: <a href="https://contractspec.io/contact" style="color: #8b5cf6;">contractspec.io/contact</a></li>
1007
+ </ul>
1008
+ <p>We're excited about the possibility of working together!</p>
1009
+ <hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
1010
+ <p style="color: #6b7280; font-size: 14px;">
1011
+ ContractSpec Team<br />
1012
+ <a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
1013
+ </p>
1014
+ </div>
1015
+ `;
1016
+ const applicantSend = await sendEmail(configResult.config, {
1017
+ to: [{ email }],
1018
+ subject: "You're on the ContractSpec design partner waitlist!",
1019
+ text: applicantText,
1020
+ html: applicantHtml,
1021
+ context: "waitlist-application-welcome"
1022
+ });
1023
+ if (!applicantSend.success) {
1024
+ return { success: false, text: APPLICATION_SEND_ERROR };
1025
+ }
1026
+ const preferencesText = `
1027
+ Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
1028
+ Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
1029
+ `.trim();
1030
+ const teamEmailText = `
1031
+ New Design Partner Waitlist Application
1032
+
1033
+ Contact Information:
1034
+ - Name: ${name}
1035
+ - Email: ${email}
1036
+ ${company ? `- Company/Project: ${company}` : ""}
1037
+ ${role ? `- Role: ${role}` : ""}
1038
+
1039
+ Application Details:
1040
+ - What are you building with AI today?
1041
+ ${whatBuilding}
1042
+
1043
+ - What do you hope ContractSpec will solve for you?
1044
+ ${whatSolving}
1045
+
1046
+ - Primary use case: ${useCase || "Not specified"}
1047
+ - Current stack: ${currentStack || "Not specified"}
1048
+ - Team Size: ${teamSize || "Not specified"}
1049
+ - Timeline: ${timeline || "Not specified"}
1050
+
1051
+ Preferences:
1052
+ - Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
1053
+ - Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
1054
+
1055
+ ---
1056
+ Submitted via ContractSpec waitlist application form
1057
+ `.trim();
1058
+ const teamEmailHtml = `
1059
+ <div style="font-family: sans-serif; max-width: 720px; margin: 0 auto;">
1060
+ <h1 style="color: #8b5cf6;">New Design Partner Waitlist Application</h1>
1061
+ <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Contact Information</h2>
1062
+ <ul style="padding-left: 16px; line-height: 1.6; margin: 0 0 16px;">
1063
+ <li>Name: ${escapeHtml(name)}</li>
1064
+ <li>Email: ${escapeHtml(email)}</li>
1065
+ ${company ? `<li>Company/Project: ${escapeHtml(company)}</li>` : ""}
1066
+ ${role ? `<li>Role: ${escapeHtml(role)}</li>` : ""}
1067
+ </ul>
1068
+ <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Application Details</h2>
1069
+ <p style="margin: 0 0 8px; font-weight: 600;">What are you building with AI today?</p>
1070
+ <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
1071
+ ${formatMultilineHtml(whatBuilding)}
1072
+ </div>
1073
+ <p style="margin: 16px 0 8px; font-weight: 600;">What do you hope ContractSpec will solve for you?</p>
1074
+ <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
1075
+ ${formatMultilineHtml(whatSolving)}
1076
+ </div>
1077
+ <ul style="padding-left: 16px; line-height: 1.6; margin: 16px 0;">
1078
+ <li>Primary use case: ${escapeHtml(useCase || "Not specified")}</li>
1079
+ <li>Current stack: ${escapeHtml(currentStack || "Not specified")}</li>
1080
+ <li>Team Size: ${escapeHtml(teamSize || "Not specified")}</li>
1081
+ <li>Timeline: ${escapeHtml(timeline || "Not specified")}</li>
1082
+ </ul>
1083
+ <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Preferences</h2>
1084
+ <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; line-height: 1.6;">
1085
+ ${formatMultilineHtml(preferencesText)}
1086
+ </div>
1087
+ <p style="color: #6b7280; font-size: 12px; margin-top: 20px;">Submitted via ContractSpec waitlist application form</p>
1088
+ </div>
1089
+ `;
1090
+ const teamSend = await sendEmail(configResult.config, {
1091
+ to: [configResult.config.teamInbox],
1092
+ subject: `New Design Partner Application: ${name} (${email})`,
1093
+ text: teamEmailText,
1094
+ html: teamEmailHtml,
1095
+ replyTo: email,
1096
+ context: "waitlist-application-team-notification"
1097
+ });
1098
+ if (!teamSend.success) {
1099
+ return { success: false, text: APPLICATION_SEND_ERROR };
1100
+ }
1101
+ return {
1102
+ success: true,
1103
+ text: "Application submitted successfully!"
1104
+ };
1105
+ };
1106
+
1107
+ // src/components/marketing/waitlist-section.tsx
1108
+ import { useEffect, useState } from "react";
1109
+ import { useForm } from "react-hook-form";
1110
+ import { zodResolver } from "@hookform/resolvers/zod";
1111
+ import z from "zod";
1112
+ import { AlertCircle, CheckCircle } from "lucide-react";
1113
+ import { Button } from "@contractspec/lib.design-system";
1114
+ import { Textarea } from "@contractspec/lib.design-system";
1115
+ import { Label } from "@contractspec/lib.ui-kit-web/ui/label";
1116
+ import {
1117
+ Select,
1118
+ SelectContent,
1119
+ SelectItem,
1120
+ SelectTrigger,
1121
+ SelectValue
1122
+ } from "@contractspec/lib.ui-kit-web/ui/select";
1123
+ import { Checkbox } from "@contractspec/lib.ui-kit-web/ui/checkbox";
1124
+ import { Switch } from "@contractspec/lib.ui-kit-web/ui/switch";
1125
+ import { Input } from "@contractspec/lib.design-system";
1126
+ import { jsxDEV as jsxDEV3, Fragment } from "react/jsx-dev-runtime";
1127
+ "use client";
1128
+ var simpleWaitlistSchema = z.object({
1129
+ email: z.email("Please enter a valid email address")
1130
+ });
1131
+ var designPartnerSchema = z.object({
1132
+ name: z.string().min(1, "Name is required"),
1133
+ email: z.email("Please enter a valid email address"),
1134
+ company: z.string().optional(),
1135
+ role: z.string().optional(),
1136
+ useCase: z.string().optional(),
1137
+ currentStack: z.string().optional(),
1138
+ whatBuilding: z.string().min(1, "Please tell us what you are building"),
1139
+ whatSolving: z.string().min(1, "Please tell us what ContractSpec will solve for you"),
1140
+ teamSize: z.string().optional(),
1141
+ timeline: z.string().optional(),
1142
+ openToSessions: z.boolean().default(false),
1143
+ okayWithCaseStudies: z.boolean().default(false)
1144
+ });
1145
+ function WaitlistSection({
1146
+ variant = "default",
1147
+ context = "pricing"
1148
+ }) {
1149
+ const [isDesignPartner, setIsDesignPartner] = useState(false);
1150
+ const [submitResult, setSubmitResult] = useState(null);
1151
+ const [isPending, setIsPending] = useState(false);
1152
+ const simpleForm = useForm({
1153
+ resolver: zodResolver(simpleWaitlistSchema),
1154
+ defaultValues: {
1155
+ email: ""
1156
+ }
1157
+ });
1158
+ const designPartnerForm = useForm({
1159
+ resolver: zodResolver(designPartnerSchema),
1160
+ defaultValues: {
1161
+ name: "",
1162
+ email: "",
1163
+ company: "",
1164
+ role: "",
1165
+ useCase: "",
1166
+ currentStack: "",
1167
+ whatBuilding: "",
1168
+ whatSolving: "",
1169
+ teamSize: "",
1170
+ timeline: "",
1171
+ openToSessions: false,
1172
+ okayWithCaseStudies: false
1173
+ }
1174
+ });
1175
+ const simpleEmail = simpleForm.watch("email");
1176
+ const designPartnerEmail = designPartnerForm.watch("email");
1177
+ useEffect(() => {
1178
+ const currentDesignPartnerEmail = designPartnerForm.getValues("email");
1179
+ if (simpleEmail && simpleEmail !== currentDesignPartnerEmail) {
1180
+ designPartnerForm.setValue("email", simpleEmail, { shouldDirty: false });
1181
+ }
1182
+ }, [simpleEmail, designPartnerForm]);
1183
+ useEffect(() => {
1184
+ const currentSimpleEmail = simpleForm.getValues("email");
1185
+ if (designPartnerEmail && designPartnerEmail !== currentSimpleEmail) {
1186
+ simpleForm.setValue("email", designPartnerEmail, { shouldDirty: false });
1187
+ }
1188
+ }, [designPartnerEmail, simpleForm]);
1189
+ const handleSimpleSubmit = async (data) => {
1190
+ setIsPending(true);
1191
+ setSubmitResult(null);
1192
+ try {
1193
+ const formData = new FormData;
1194
+ formData.set("email", data.email);
1195
+ const result = await joinWaitlist(formData);
1196
+ if (result.success) {
1197
+ setSubmitResult({
1198
+ success: true,
1199
+ text: "Thanks for joining the waitlist! Check your inbox for a confirmation."
1200
+ });
1201
+ simpleForm.reset();
1202
+ } else {
1203
+ setSubmitResult({
1204
+ success: false,
1205
+ text: result.text || "Failed to join waitlist. Please try again."
1206
+ });
1207
+ }
1208
+ } catch (_error) {
1209
+ setSubmitResult({
1210
+ success: false,
1211
+ text: "Failed to join waitlist. Please try again."
1212
+ });
1213
+ } finally {
1214
+ setIsPending(false);
1215
+ }
1216
+ };
1217
+ const handleDesignPartnerSubmit = async (data) => {
1218
+ setIsPending(true);
1219
+ setSubmitResult(null);
1220
+ try {
1221
+ const formData = new FormData;
1222
+ formData.set("email", data.email);
1223
+ formData.set("name", data.name);
1224
+ if (data.company)
1225
+ formData.set("company", data.company);
1226
+ if (data.role)
1227
+ formData.set("role", data.role);
1228
+ if (data.useCase)
1229
+ formData.set("useCase", data.useCase);
1230
+ if (data.currentStack)
1231
+ formData.set("currentStack", data.currentStack);
1232
+ formData.set("whatBuilding", data.whatBuilding);
1233
+ formData.set("whatSolving", data.whatSolving);
1234
+ if (data.teamSize)
1235
+ formData.set("teamSize", data.teamSize);
1236
+ if (data.timeline)
1237
+ formData.set("timeline", data.timeline);
1238
+ if (data.openToSessions)
1239
+ formData.set("openToSessions", "on");
1240
+ if (data.okayWithCaseStudies)
1241
+ formData.set("okayWithCaseStudies", "on");
1242
+ const result = await submitWaitlistApplication(formData);
1243
+ if (result.success) {
1244
+ setSubmitResult({
1245
+ success: true,
1246
+ text: "You're on the list. Thanks for applying. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally."
1247
+ });
1248
+ designPartnerForm.reset();
1249
+ } else {
1250
+ setSubmitResult({
1251
+ success: false,
1252
+ text: result.text || "Failed to submit application. Please try again."
1253
+ });
1254
+ }
1255
+ } catch (_error) {
1256
+ setSubmitResult({
1257
+ success: false,
1258
+ text: "Failed to submit application. Please try again."
1259
+ });
1260
+ } finally {
1261
+ setIsPending(false);
1262
+ }
1263
+ };
1264
+ const onSubmit = isDesignPartner ? designPartnerForm.handleSubmit(handleDesignPartnerSubmit) : simpleForm.handleSubmit(handleSimpleSubmit);
1265
+ const isCompact = variant === "compact";
1266
+ return /* @__PURE__ */ jsxDEV3("div", {
1267
+ id: "waitlist",
1268
+ className: isCompact ? "space-y-4" : "card-subtle space-y-6 p-8",
1269
+ children: [
1270
+ !isCompact && /* @__PURE__ */ jsxDEV3("div", {
1271
+ className: "space-y-4",
1272
+ children: [
1273
+ /* @__PURE__ */ jsxDEV3("div", {
1274
+ className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
1275
+ children: /* @__PURE__ */ jsxDEV3("span", {
1276
+ className: "text-sm font-medium text-violet-300",
1277
+ children: isDesignPartner ? "Design Partner Waitlist" : "Join the Waitlist"
1278
+ }, undefined, false, undefined, this)
1279
+ }, undefined, false, undefined, this),
1280
+ /* @__PURE__ */ jsxDEV3("h2", {
1281
+ className: "text-2xl font-bold",
1282
+ children: isDesignPartner ? "Apply for early access to ContractSpec" : "Get early access to ContractSpec"
1283
+ }, undefined, false, undefined, this),
1284
+ /* @__PURE__ */ jsxDEV3("p", {
1285
+ className: "text-muted-foreground text-sm",
1286
+ children: isDesignPartner ? "Tell us what you're building. We'll prioritize teams where ContractSpec can have a big impact, and where we can learn the most." : "Join the waitlist to be notified when ContractSpec becomes available."
1287
+ }, undefined, false, undefined, this)
1288
+ ]
1289
+ }, undefined, true, undefined, this),
1290
+ !isCompact && /* @__PURE__ */ jsxDEV3("div", {
1291
+ className: "border-border bg-muted/20 flex items-center justify-between gap-4 rounded-lg border p-4",
1292
+ children: [
1293
+ /* @__PURE__ */ jsxDEV3("div", {
1294
+ className: "space-y-1",
1295
+ children: [
1296
+ /* @__PURE__ */ jsxDEV3(Label, {
1297
+ htmlFor: "design-partner-toggle",
1298
+ className: "text-sm font-medium",
1299
+ children: "Apply as a design partner"
1300
+ }, undefined, false, undefined, this),
1301
+ /* @__PURE__ */ jsxDEV3("p", {
1302
+ className: "text-muted-foreground text-xs",
1303
+ children: isDesignPartner ? "Get hands-on support, influence the roadmap, and founding discount" : "Get priority access, 1:1 onboarding, and help shape ContractSpec"
1304
+ }, undefined, false, undefined, this)
1305
+ ]
1306
+ }, undefined, true, undefined, this),
1307
+ /* @__PURE__ */ jsxDEV3(Switch, {
1308
+ id: "design-partner-toggle",
1309
+ checked: isDesignPartner,
1310
+ onCheckedChange: setIsDesignPartner,
1311
+ disabled: isPending || submitResult?.success
1312
+ }, undefined, false, undefined, this)
1313
+ ]
1314
+ }, undefined, true, undefined, this),
1315
+ !isCompact && isDesignPartner && /* @__PURE__ */ jsxDEV3("div", {
1316
+ className: "space-y-2",
1317
+ children: [
1318
+ /* @__PURE__ */ jsxDEV3("p", {
1319
+ className: "text-sm font-medium",
1320
+ children: "Benefits:"
1321
+ }, undefined, false, undefined, this),
1322
+ /* @__PURE__ */ jsxDEV3("ul", {
1323
+ className: "text-muted-foreground space-y-1 text-sm",
1324
+ children: [
1325
+ /* @__PURE__ */ jsxDEV3("li", {
1326
+ children: "• Early access to ContractSpec Studio"
1327
+ }, undefined, false, undefined, this),
1328
+ /* @__PURE__ */ jsxDEV3("li", {
1329
+ children: "• 1:1 onboarding and architecture sessions"
1330
+ }, undefined, false, undefined, this),
1331
+ /* @__PURE__ */ jsxDEV3("li", {
1332
+ children: "• Priority support via direct channels"
1333
+ }, undefined, false, undefined, this),
1334
+ /* @__PURE__ */ jsxDEV3("li", {
1335
+ children: "• Influence over roadmap and features"
1336
+ }, undefined, false, undefined, this),
1337
+ /* @__PURE__ */ jsxDEV3("li", {
1338
+ children: "• Founding discount when paid plans launch"
1339
+ }, undefined, false, undefined, this)
1340
+ ]
1341
+ }, undefined, true, undefined, this)
1342
+ ]
1343
+ }, undefined, true, undefined, this),
1344
+ /* @__PURE__ */ jsxDEV3("form", {
1345
+ onSubmit,
1346
+ className: "space-y-4",
1347
+ children: [
1348
+ isDesignPartner ? /* @__PURE__ */ jsxDEV3(Fragment, {
1349
+ children: [
1350
+ /* @__PURE__ */ jsxDEV3("div", {
1351
+ className: "grid gap-4 md:grid-cols-2",
1352
+ children: [
1353
+ /* @__PURE__ */ jsxDEV3("div", {
1354
+ className: "space-y-2",
1355
+ children: [
1356
+ /* @__PURE__ */ jsxDEV3(Label, {
1357
+ htmlFor: "waitlist-name",
1358
+ className: "text-sm font-medium",
1359
+ children: [
1360
+ "Name ",
1361
+ /* @__PURE__ */ jsxDEV3("span", {
1362
+ className: "text-red-400",
1363
+ children: "*"
1364
+ }, undefined, false, undefined, this)
1365
+ ]
1366
+ }, undefined, true, undefined, this),
1367
+ /* @__PURE__ */ jsxDEV3(Input, {
1368
+ id: "waitlist-name",
1369
+ ...designPartnerForm.register("name"),
1370
+ type: "text",
1371
+ placeholder: "Your name",
1372
+ disabled: isPending || submitResult?.success
1373
+ }, undefined, false, undefined, this),
1374
+ designPartnerForm.formState.errors.name && /* @__PURE__ */ jsxDEV3("p", {
1375
+ className: "text-xs text-red-400",
1376
+ children: designPartnerForm.formState.errors.name.message
1377
+ }, undefined, false, undefined, this)
1378
+ ]
1379
+ }, undefined, true, undefined, this),
1380
+ /* @__PURE__ */ jsxDEV3("div", {
1381
+ className: "space-y-2",
1382
+ children: [
1383
+ /* @__PURE__ */ jsxDEV3(Label, {
1384
+ htmlFor: "waitlist-email",
1385
+ className: "text-sm font-medium",
1386
+ children: [
1387
+ "Email ",
1388
+ /* @__PURE__ */ jsxDEV3("span", {
1389
+ className: "text-red-400",
1390
+ children: "*"
1391
+ }, undefined, false, undefined, this)
1392
+ ]
1393
+ }, undefined, true, undefined, this),
1394
+ /* @__PURE__ */ jsxDEV3(Input, {
1395
+ id: "waitlist-email",
1396
+ ...designPartnerForm.register("email"),
1397
+ type: "email",
1398
+ placeholder: "your@email.com",
1399
+ disabled: isPending || submitResult?.success
1400
+ }, undefined, false, undefined, this),
1401
+ designPartnerForm.formState.errors.email && /* @__PURE__ */ jsxDEV3("p", {
1402
+ className: "text-xs text-red-400",
1403
+ children: designPartnerForm.formState.errors.email.message
1404
+ }, undefined, false, undefined, this)
1405
+ ]
1406
+ }, undefined, true, undefined, this)
1407
+ ]
1408
+ }, undefined, true, undefined, this),
1409
+ /* @__PURE__ */ jsxDEV3("div", {
1410
+ className: "grid gap-4 md:grid-cols-2",
1411
+ children: [
1412
+ /* @__PURE__ */ jsxDEV3("div", {
1413
+ className: "space-y-2",
1414
+ children: [
1415
+ /* @__PURE__ */ jsxDEV3(Label, {
1416
+ htmlFor: "waitlist-company",
1417
+ className: "text-sm font-medium",
1418
+ children: "Company / Project Name"
1419
+ }, undefined, false, undefined, this),
1420
+ /* @__PURE__ */ jsxDEV3(Input, {
1421
+ id: "waitlist-company",
1422
+ ...designPartnerForm.register("company"),
1423
+ type: "text",
1424
+ placeholder: "Your company or project",
1425
+ disabled: isPending || submitResult?.success
1426
+ }, undefined, false, undefined, this)
1427
+ ]
1428
+ }, undefined, true, undefined, this),
1429
+ /* @__PURE__ */ jsxDEV3("div", {
1430
+ className: "space-y-2",
1431
+ children: [
1432
+ /* @__PURE__ */ jsxDEV3(Label, {
1433
+ htmlFor: "waitlist-role",
1434
+ className: "text-sm font-medium",
1435
+ children: "Role"
1436
+ }, undefined, false, undefined, this),
1437
+ /* @__PURE__ */ jsxDEV3(Select, {
1438
+ value: designPartnerForm.watch("role") || "",
1439
+ onValueChange: (value) => designPartnerForm.setValue("role", value),
1440
+ disabled: isPending || submitResult?.success,
1441
+ children: [
1442
+ /* @__PURE__ */ jsxDEV3(SelectTrigger, {
1443
+ id: "waitlist-role",
1444
+ className: "w-full",
1445
+ children: /* @__PURE__ */ jsxDEV3(SelectValue, {
1446
+ placeholder: "Select your role"
1447
+ }, undefined, false, undefined, this)
1448
+ }, undefined, false, undefined, this),
1449
+ /* @__PURE__ */ jsxDEV3(SelectContent, {
1450
+ children: [
1451
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1452
+ value: "founder",
1453
+ children: "Founder"
1454
+ }, undefined, false, undefined, this),
1455
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1456
+ value: "cto",
1457
+ children: "CTO"
1458
+ }, undefined, false, undefined, this),
1459
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1460
+ value: "lead-engineer",
1461
+ children: "Lead Engineer"
1462
+ }, undefined, false, undefined, this),
1463
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1464
+ value: "engineer",
1465
+ children: "Engineer"
1466
+ }, undefined, false, undefined, this),
1467
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1468
+ value: "product-manager",
1469
+ children: "Product Manager"
1470
+ }, undefined, false, undefined, this),
1471
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1472
+ value: "other",
1473
+ children: "Other"
1474
+ }, undefined, false, undefined, this)
1475
+ ]
1476
+ }, undefined, true, undefined, this)
1477
+ ]
1478
+ }, undefined, true, undefined, this)
1479
+ ]
1480
+ }, undefined, true, undefined, this)
1481
+ ]
1482
+ }, undefined, true, undefined, this),
1483
+ /* @__PURE__ */ jsxDEV3("div", {
1484
+ className: "grid gap-4 md:grid-cols-2",
1485
+ children: [
1486
+ /* @__PURE__ */ jsxDEV3("div", {
1487
+ className: "space-y-2",
1488
+ children: [
1489
+ /* @__PURE__ */ jsxDEV3(Label, {
1490
+ htmlFor: "waitlist-use-case",
1491
+ className: "text-sm font-medium",
1492
+ children: "Primary use case"
1493
+ }, undefined, false, undefined, this),
1494
+ /* @__PURE__ */ jsxDEV3(Select, {
1495
+ value: designPartnerForm.watch("useCase") || "",
1496
+ onValueChange: (value) => designPartnerForm.setValue("useCase", value),
1497
+ disabled: isPending || submitResult?.success,
1498
+ children: [
1499
+ /* @__PURE__ */ jsxDEV3(SelectTrigger, {
1500
+ id: "waitlist-use-case",
1501
+ className: "w-full",
1502
+ children: /* @__PURE__ */ jsxDEV3(SelectValue, {
1503
+ placeholder: "Select a use case"
1504
+ }, undefined, false, undefined, this)
1505
+ }, undefined, false, undefined, this),
1506
+ /* @__PURE__ */ jsxDEV3(SelectContent, {
1507
+ children: [
1508
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1509
+ value: "api-platform",
1510
+ children: "API platform"
1511
+ }, undefined, false, undefined, this),
1512
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1513
+ value: "ai-ops",
1514
+ children: "AI operations"
1515
+ }, undefined, false, undefined, this),
1516
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1517
+ value: "integration-hub",
1518
+ children: "Integration hub"
1519
+ }, undefined, false, undefined, this),
1520
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1521
+ value: "internal-tools",
1522
+ children: "Internal tools"
1523
+ }, undefined, false, undefined, this),
1524
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1525
+ value: "data-pipelines",
1526
+ children: "Data pipelines"
1527
+ }, undefined, false, undefined, this),
1528
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1529
+ value: "other",
1530
+ children: "Other"
1531
+ }, undefined, false, undefined, this)
1532
+ ]
1533
+ }, undefined, true, undefined, this)
1534
+ ]
1535
+ }, undefined, true, undefined, this)
1536
+ ]
1537
+ }, undefined, true, undefined, this),
1538
+ /* @__PURE__ */ jsxDEV3("div", {
1539
+ className: "space-y-2",
1540
+ children: [
1541
+ /* @__PURE__ */ jsxDEV3(Label, {
1542
+ htmlFor: "waitlist-current-stack",
1543
+ className: "text-sm font-medium",
1544
+ children: "Current stack"
1545
+ }, undefined, false, undefined, this),
1546
+ /* @__PURE__ */ jsxDEV3(Input, {
1547
+ id: "waitlist-current-stack",
1548
+ ...designPartnerForm.register("currentStack"),
1549
+ type: "text",
1550
+ placeholder: "e.g. Next.js, Postgres, OpenAPI",
1551
+ disabled: isPending || submitResult?.success
1552
+ }, undefined, false, undefined, this)
1553
+ ]
1554
+ }, undefined, true, undefined, this)
1555
+ ]
1556
+ }, undefined, true, undefined, this),
1557
+ /* @__PURE__ */ jsxDEV3("div", {
1558
+ className: "space-y-2",
1559
+ children: [
1560
+ /* @__PURE__ */ jsxDEV3(Label, {
1561
+ htmlFor: "waitlist-what-building",
1562
+ className: "text-sm font-medium",
1563
+ children: [
1564
+ "What are you building with AI today?",
1565
+ " ",
1566
+ /* @__PURE__ */ jsxDEV3("span", {
1567
+ className: "text-red-400",
1568
+ children: "*"
1569
+ }, undefined, false, undefined, this)
1570
+ ]
1571
+ }, undefined, true, undefined, this),
1572
+ /* @__PURE__ */ jsxDEV3(Textarea, {
1573
+ id: "waitlist-what-building",
1574
+ ...designPartnerForm.register("whatBuilding"),
1575
+ placeholder: "Tell us about your project...",
1576
+ disabled: isPending || submitResult?.success,
1577
+ rows: 4
1578
+ }, undefined, false, undefined, this),
1579
+ designPartnerForm.formState.errors.whatBuilding && /* @__PURE__ */ jsxDEV3("p", {
1580
+ className: "text-xs text-red-400",
1581
+ children: designPartnerForm.formState.errors.whatBuilding.message
1582
+ }, undefined, false, undefined, this)
1583
+ ]
1584
+ }, undefined, true, undefined, this),
1585
+ /* @__PURE__ */ jsxDEV3("div", {
1586
+ className: "space-y-2",
1587
+ children: [
1588
+ /* @__PURE__ */ jsxDEV3(Label, {
1589
+ htmlFor: "waitlist-what-solving",
1590
+ className: "text-sm font-medium",
1591
+ children: [
1592
+ "What do you hope ContractSpec will solve for you?",
1593
+ " ",
1594
+ /* @__PURE__ */ jsxDEV3("span", {
1595
+ className: "text-red-400",
1596
+ children: "*"
1597
+ }, undefined, false, undefined, this)
1598
+ ]
1599
+ }, undefined, true, undefined, this),
1600
+ /* @__PURE__ */ jsxDEV3(Textarea, {
1601
+ id: "waitlist-what-solving",
1602
+ ...designPartnerForm.register("whatSolving"),
1603
+ placeholder: "What problems are you trying to solve?",
1604
+ disabled: isPending || submitResult?.success,
1605
+ rows: 4
1606
+ }, undefined, false, undefined, this),
1607
+ designPartnerForm.formState.errors.whatSolving && /* @__PURE__ */ jsxDEV3("p", {
1608
+ className: "text-xs text-red-400",
1609
+ children: designPartnerForm.formState.errors.whatSolving.message
1610
+ }, undefined, false, undefined, this)
1611
+ ]
1612
+ }, undefined, true, undefined, this),
1613
+ /* @__PURE__ */ jsxDEV3("div", {
1614
+ className: "grid gap-4 md:grid-cols-2",
1615
+ children: [
1616
+ /* @__PURE__ */ jsxDEV3("div", {
1617
+ className: "space-y-2",
1618
+ children: [
1619
+ /* @__PURE__ */ jsxDEV3(Label, {
1620
+ htmlFor: "waitlist-team-size",
1621
+ className: "text-sm font-medium",
1622
+ children: "Team Size"
1623
+ }, undefined, false, undefined, this),
1624
+ /* @__PURE__ */ jsxDEV3(Select, {
1625
+ value: designPartnerForm.watch("teamSize") || "",
1626
+ onValueChange: (value) => designPartnerForm.setValue("teamSize", value),
1627
+ disabled: isPending || submitResult?.success,
1628
+ children: [
1629
+ /* @__PURE__ */ jsxDEV3(SelectTrigger, {
1630
+ id: "waitlist-team-size",
1631
+ className: "w-full",
1632
+ children: /* @__PURE__ */ jsxDEV3(SelectValue, {
1633
+ placeholder: "Select team size"
1634
+ }, undefined, false, undefined, this)
1635
+ }, undefined, false, undefined, this),
1636
+ /* @__PURE__ */ jsxDEV3(SelectContent, {
1637
+ children: [
1638
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1639
+ value: "solo",
1640
+ children: "Solo"
1641
+ }, undefined, false, undefined, this),
1642
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1643
+ value: "2-5",
1644
+ children: "2-5"
1645
+ }, undefined, false, undefined, this),
1646
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1647
+ value: "6-20",
1648
+ children: "6-20"
1649
+ }, undefined, false, undefined, this),
1650
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1651
+ value: "20+",
1652
+ children: "20+"
1653
+ }, undefined, false, undefined, this)
1654
+ ]
1655
+ }, undefined, true, undefined, this)
1656
+ ]
1657
+ }, undefined, true, undefined, this)
1658
+ ]
1659
+ }, undefined, true, undefined, this),
1660
+ /* @__PURE__ */ jsxDEV3("div", {
1661
+ className: "space-y-2",
1662
+ children: [
1663
+ /* @__PURE__ */ jsxDEV3(Label, {
1664
+ htmlFor: "waitlist-timeline",
1665
+ className: "text-sm font-medium",
1666
+ children: "Timeline"
1667
+ }, undefined, false, undefined, this),
1668
+ /* @__PURE__ */ jsxDEV3(Select, {
1669
+ value: designPartnerForm.watch("timeline") || "",
1670
+ onValueChange: (value) => designPartnerForm.setValue("timeline", value),
1671
+ disabled: isPending || submitResult?.success,
1672
+ children: [
1673
+ /* @__PURE__ */ jsxDEV3(SelectTrigger, {
1674
+ id: "waitlist-timeline",
1675
+ className: "w-full",
1676
+ children: /* @__PURE__ */ jsxDEV3(SelectValue, {
1677
+ placeholder: "Select timeline"
1678
+ }, undefined, false, undefined, this)
1679
+ }, undefined, false, undefined, this),
1680
+ /* @__PURE__ */ jsxDEV3(SelectContent, {
1681
+ children: [
1682
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1683
+ value: "now",
1684
+ children: "Now"
1685
+ }, undefined, false, undefined, this),
1686
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1687
+ value: "1-3-months",
1688
+ children: "1-3 months"
1689
+ }, undefined, false, undefined, this),
1690
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1691
+ value: "3-6-months",
1692
+ children: "3-6 months"
1693
+ }, undefined, false, undefined, this),
1694
+ /* @__PURE__ */ jsxDEV3(SelectItem, {
1695
+ value: "exploring",
1696
+ children: "Exploring"
1697
+ }, undefined, false, undefined, this)
1698
+ ]
1699
+ }, undefined, true, undefined, this)
1700
+ ]
1701
+ }, undefined, true, undefined, this)
1702
+ ]
1703
+ }, undefined, true, undefined, this)
1704
+ ]
1705
+ }, undefined, true, undefined, this),
1706
+ /* @__PURE__ */ jsxDEV3("div", {
1707
+ className: "space-y-3",
1708
+ children: [
1709
+ /* @__PURE__ */ jsxDEV3("div", {
1710
+ className: "flex items-start gap-3",
1711
+ children: [
1712
+ /* @__PURE__ */ jsxDEV3(Checkbox, {
1713
+ id: "waitlist-open-to-sessions",
1714
+ checked: designPartnerForm.watch("openToSessions"),
1715
+ onCheckedChange: (checked) => designPartnerForm.setValue("openToSessions", checked === true),
1716
+ disabled: isPending || submitResult?.success
1717
+ }, undefined, false, undefined, this),
1718
+ /* @__PURE__ */ jsxDEV3(Label, {
1719
+ htmlFor: "waitlist-open-to-sessions",
1720
+ className: "cursor-pointer text-sm leading-relaxed",
1721
+ children: "I'm open to 1:1 product/design sessions"
1722
+ }, undefined, false, undefined, this)
1723
+ ]
1724
+ }, undefined, true, undefined, this),
1725
+ /* @__PURE__ */ jsxDEV3("div", {
1726
+ className: "flex items-start gap-3",
1727
+ children: [
1728
+ /* @__PURE__ */ jsxDEV3(Checkbox, {
1729
+ id: "waitlist-case-studies",
1730
+ checked: designPartnerForm.watch("okayWithCaseStudies"),
1731
+ onCheckedChange: (checked) => designPartnerForm.setValue("okayWithCaseStudies", checked === true),
1732
+ disabled: isPending || submitResult?.success
1733
+ }, undefined, false, undefined, this),
1734
+ /* @__PURE__ */ jsxDEV3(Label, {
1735
+ htmlFor: "waitlist-case-studies",
1736
+ className: "cursor-pointer text-sm leading-relaxed",
1737
+ children: "I'm okay with anonymized case studies about our usage"
1738
+ }, undefined, false, undefined, this)
1739
+ ]
1740
+ }, undefined, true, undefined, this)
1741
+ ]
1742
+ }, undefined, true, undefined, this)
1743
+ ]
1744
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV3("div", {
1745
+ className: "space-y-2",
1746
+ children: [
1747
+ /* @__PURE__ */ jsxDEV3(Label, {
1748
+ htmlFor: "waitlist-email",
1749
+ className: "text-sm font-medium",
1750
+ children: [
1751
+ "Email ",
1752
+ /* @__PURE__ */ jsxDEV3("span", {
1753
+ className: "text-red-400",
1754
+ children: "*"
1755
+ }, undefined, false, undefined, this)
1756
+ ]
1757
+ }, undefined, true, undefined, this),
1758
+ /* @__PURE__ */ jsxDEV3(Input, {
1759
+ id: "waitlist-email",
1760
+ ...simpleForm.register("email"),
1761
+ type: "email",
1762
+ placeholder: "your@email.com",
1763
+ disabled: isPending || submitResult?.success
1764
+ }, undefined, false, undefined, this),
1765
+ simpleForm.formState.errors.email && /* @__PURE__ */ jsxDEV3("p", {
1766
+ className: "text-xs text-red-400",
1767
+ children: simpleForm.formState.errors.email.message
1768
+ }, undefined, false, undefined, this)
1769
+ ]
1770
+ }, undefined, true, undefined, this),
1771
+ submitResult && !isPending && /* @__PURE__ */ jsxDEV3("div", {
1772
+ className: `flex items-start gap-2 rounded-lg p-4 text-sm ${submitResult.success ? "border border-green-500/20 bg-green-500/10 text-green-400" : "border border-red-500/20 bg-red-500/10 text-red-400"}`,
1773
+ children: [
1774
+ submitResult.success ? /* @__PURE__ */ jsxDEV3(CheckCircle, {
1775
+ size: 20,
1776
+ className: "mt-0.5 shrink-0"
1777
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV3(AlertCircle, {
1778
+ size: 20,
1779
+ className: "mt-0.5 shrink-0"
1780
+ }, undefined, false, undefined, this),
1781
+ /* @__PURE__ */ jsxDEV3("div", {
1782
+ className: "flex-1",
1783
+ children: submitResult.success ? /* @__PURE__ */ jsxDEV3(Fragment, {
1784
+ children: [
1785
+ /* @__PURE__ */ jsxDEV3("p", {
1786
+ className: "mb-1 font-semibold",
1787
+ children: "You're on the list."
1788
+ }, undefined, false, undefined, this),
1789
+ /* @__PURE__ */ jsxDEV3("p", {
1790
+ className: "text-sm",
1791
+ children: submitResult.text
1792
+ }, undefined, false, undefined, this)
1793
+ ]
1794
+ }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV3("p", {
1795
+ children: submitResult.text
1796
+ }, undefined, false, undefined, this)
1797
+ }, undefined, false, undefined, this)
1798
+ ]
1799
+ }, undefined, true, undefined, this),
1800
+ /* @__PURE__ */ jsxDEV3(Button, {
1801
+ type: "submit",
1802
+ disabled: isPending || submitResult?.success,
1803
+ className: "w-full",
1804
+ children: isPending ? "Submitting..." : isDesignPartner ? "Apply to the waitlist" : "Join waitlist"
1805
+ }, undefined, false, undefined, this),
1806
+ /* @__PURE__ */ jsxDEV3("p", {
1807
+ className: "text-muted-foreground text-center text-xs",
1808
+ children: "No spam. We'll only email you about ContractSpec and your application."
1809
+ }, undefined, false, undefined, this)
1810
+ ]
1811
+ }, undefined, true, undefined, this)
1812
+ ]
1813
+ }, undefined, true, undefined, this);
1814
+ }
1815
+
1816
+ // src/components/marketing/ContactClient.tsx
1817
+ import { useActionState } from "react";
1818
+ import {
1819
+ Calendar,
1820
+ MessageSquare as MessageSquare2,
1821
+ CheckCircle as CheckCircle2,
1822
+ AlertCircle as AlertCircle2
1823
+ } from "lucide-react";
1824
+ import {
1825
+ ActionForm,
1826
+ Button as Button2,
1827
+ Input as Input2,
1828
+ Textarea as Textarea2
1829
+ } from "@contractspec/lib.design-system";
1830
+ import { VStack as VStack2, HStack as HStack2 } from "@contractspec/lib.ui-kit-web/ui/stack";
1831
+ import {
1832
+ H2 as H22,
1833
+ H1 as H12,
1834
+ Small as Small2,
1835
+ Muted as Muted2
1836
+ } from "@contractspec/lib.ui-kit-web/ui/typography";
1837
+ import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
1838
+ "use client";
1839
+ function ContactClient() {
1840
+ const handleContactSubmit = async (_prevState, formData) => {
1841
+ const result = await submitContactForm(formData);
1842
+ if (result.success) {
1843
+ return {
1844
+ success: true,
1845
+ text: "Message sent successfully! We'll get back to you soon."
1846
+ };
1847
+ } else {
1848
+ return {
1849
+ success: false,
1850
+ text: result.text || "Failed to send message. Please try again."
1851
+ };
1852
+ }
1853
+ };
1854
+ const [contactResult, contactAction, contactPending] = useActionState(handleContactSubmit, null);
1855
+ return /* @__PURE__ */ jsxDEV4("section", {
1856
+ className: "section-padding hero-gradient w-full",
1857
+ children: /* @__PURE__ */ jsxDEV4(VStack2, {
1858
+ className: "mx-auto max-w-4xl gap-16",
1859
+ children: [
1860
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1861
+ className: "gap-4 text-center",
1862
+ children: [
1863
+ /* @__PURE__ */ jsxDEV4(H12, {
1864
+ className: "text-5xl font-bold",
1865
+ children: "Get in touch"
1866
+ }, undefined, false, undefined, this),
1867
+ /* @__PURE__ */ jsxDEV4(Muted2, {
1868
+ className: "text-lg",
1869
+ children: "Choose how you'd like to connect with us"
1870
+ }, undefined, false, undefined, this)
1871
+ ]
1872
+ }, undefined, true, undefined, this),
1873
+ /* @__PURE__ */ jsxDEV4(WaitlistSection, {
1874
+ context: "contact"
1875
+ }, undefined, false, undefined, this),
1876
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1877
+ className: "card-subtle gap-6 p-8",
1878
+ id: "call",
1879
+ children: [
1880
+ /* @__PURE__ */ jsxDEV4(HStack2, {
1881
+ className: "items-center gap-3",
1882
+ children: [
1883
+ /* @__PURE__ */ jsxDEV4(Calendar, {
1884
+ className: "text-blue-400",
1885
+ size: 24
1886
+ }, undefined, false, undefined, this),
1887
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1888
+ className: "items-start gap-1",
1889
+ children: [
1890
+ /* @__PURE__ */ jsxDEV4(H22, {
1891
+ className: "text-2xl font-bold",
1892
+ children: "Book a 20-min call"
1893
+ }, undefined, false, undefined, this),
1894
+ /* @__PURE__ */ jsxDEV4(Muted2, {
1895
+ className: "text-sm",
1896
+ children: "Schedule a walkthrough with our team to see ContractSpec in action"
1897
+ }, undefined, false, undefined, this)
1898
+ ]
1899
+ }, undefined, true, undefined, this)
1900
+ ]
1901
+ }, undefined, true, undefined, this),
1902
+ /* @__PURE__ */ jsxDEV4("div", {
1903
+ className: "border-border overflow-hidden rounded-lg border",
1904
+ children: /* @__PURE__ */ jsxDEV4("object", {
1905
+ data: "https://meet.reclaimai.com/e/f863cb29-caac-44b6-972b-1407dd9545a3",
1906
+ width: "100%",
1907
+ height: "700px",
1908
+ style: { outline: "none" },
1909
+ "aria-label": "Calendar booking widget"
1910
+ }, undefined, false, undefined, this)
1911
+ }, undefined, false, undefined, this)
1912
+ ]
1913
+ }, undefined, true, undefined, this),
1914
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1915
+ className: "card-subtle gap-6 p-8",
1916
+ id: "message",
1917
+ children: [
1918
+ /* @__PURE__ */ jsxDEV4(HStack2, {
1919
+ className: "items-center gap-3",
1920
+ children: [
1921
+ /* @__PURE__ */ jsxDEV4(MessageSquare2, {
1922
+ className: "text-emerald-400",
1923
+ size: 24
1924
+ }, undefined, false, undefined, this),
1925
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1926
+ className: "items-start gap-1",
1927
+ children: [
1928
+ /* @__PURE__ */ jsxDEV4(H22, {
1929
+ className: "text-2xl font-bold",
1930
+ children: "Send us a message"
1931
+ }, undefined, false, undefined, this),
1932
+ /* @__PURE__ */ jsxDEV4(Muted2, {
1933
+ className: "text-sm",
1934
+ children: "Have questions or feedback? We'd love to hear from you"
1935
+ }, undefined, false, undefined, this)
1936
+ ]
1937
+ }, undefined, true, undefined, this)
1938
+ ]
1939
+ }, undefined, true, undefined, this),
1940
+ /* @__PURE__ */ jsxDEV4(ActionForm, {
1941
+ action: contactAction,
1942
+ children: /* @__PURE__ */ jsxDEV4(VStack2, {
1943
+ className: "gap-4",
1944
+ children: [
1945
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1946
+ className: "gap-2",
1947
+ children: [
1948
+ /* @__PURE__ */ jsxDEV4(Small2, {
1949
+ className: "text-sm font-medium",
1950
+ children: "Name"
1951
+ }, undefined, false, undefined, this),
1952
+ /* @__PURE__ */ jsxDEV4(Input2, {
1953
+ id: "contact-name",
1954
+ name: "name",
1955
+ type: "text",
1956
+ placeholder: "Your name",
1957
+ disabled: contactPending || contactResult?.success,
1958
+ required: true
1959
+ }, undefined, false, undefined, this)
1960
+ ]
1961
+ }, undefined, true, undefined, this),
1962
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1963
+ className: "gap-2",
1964
+ children: [
1965
+ /* @__PURE__ */ jsxDEV4(Small2, {
1966
+ className: "text-sm font-medium",
1967
+ children: "Email"
1968
+ }, undefined, false, undefined, this),
1969
+ /* @__PURE__ */ jsxDEV4(Input2, {
1970
+ id: "contact-email",
1971
+ name: "email",
1972
+ type: "email",
1973
+ keyboard: { kind: "email" },
1974
+ placeholder: "your@email.com",
1975
+ disabled: contactPending || contactResult?.success,
1976
+ required: true
1977
+ }, undefined, false, undefined, this)
1978
+ ]
1979
+ }, undefined, true, undefined, this),
1980
+ /* @__PURE__ */ jsxDEV4(VStack2, {
1981
+ className: "gap-2",
1982
+ children: [
1983
+ /* @__PURE__ */ jsxDEV4(Small2, {
1984
+ className: "text-sm font-medium",
1985
+ children: "Message"
1986
+ }, undefined, false, undefined, this),
1987
+ /* @__PURE__ */ jsxDEV4(Textarea2, {
1988
+ id: "contact-message",
1989
+ name: "message",
1990
+ placeholder: "Tell us what's on your mind...",
1991
+ disabled: contactPending || contactResult?.success,
1992
+ rows: 6,
1993
+ required: true
1994
+ }, undefined, false, undefined, this)
1995
+ ]
1996
+ }, undefined, true, undefined, this),
1997
+ contactResult && !contactPending && /* @__PURE__ */ jsxDEV4(HStack2, {
1998
+ className: `items-center gap-2 rounded-lg p-3 text-sm ${contactResult.success ? "border border-green-500/20 bg-green-500/10 text-green-400" : "border border-red-500/20 bg-red-500/10 text-red-400"}`,
1999
+ children: [
2000
+ contactResult.success ? /* @__PURE__ */ jsxDEV4(CheckCircle2, {
2001
+ size: 16
2002
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV4(AlertCircle2, {
2003
+ size: 16
2004
+ }, undefined, false, undefined, this),
2005
+ /* @__PURE__ */ jsxDEV4(Small2, {
2006
+ children: contactResult.text
2007
+ }, undefined, false, undefined, this)
2008
+ ]
2009
+ }, undefined, true, undefined, this),
2010
+ /* @__PURE__ */ jsxDEV4(Button2, {
2011
+ type: "submit",
2012
+ disabled: contactPending || contactResult?.success,
2013
+ className: "w-full",
2014
+ children: contactPending ? "Sending..." : "Send message"
2015
+ }, undefined, false, undefined, this)
2016
+ ]
2017
+ }, undefined, true, undefined, this)
2018
+ }, undefined, false, undefined, this)
2019
+ ]
2020
+ }, undefined, true, undefined, this)
2021
+ ]
2022
+ }, undefined, true, undefined, this)
2023
+ }, undefined, false, undefined, this);
2024
+ }
2025
+
2026
+ // src/components/marketing/ContributePage.tsx
2027
+ import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
2028
+ var metadata = {
2029
+ title: "Contribute to ContractSpec",
2030
+ description: "Join the ContractSpec open-source community. Report issues, improve docs, build integrations, and help shape the future of spec-first development.",
2031
+ openGraph: {
2032
+ title: "Contribute to ContractSpec",
2033
+ description: "Get started contributing in under 3 minutes. Docs, examples, integrations, and more.",
2034
+ url: "https://contractspec.io/contribute"
2035
+ },
2036
+ alternates: {
2037
+ canonical: "https://contractspec.io/contribute"
2038
+ }
2039
+ };
2040
+ function ContributePage() {
2041
+ return /* @__PURE__ */ jsxDEV5("main", {
2042
+ className: "flex grow flex-col items-center justify-center",
2043
+ children: /* @__PURE__ */ jsxDEV5("section", {
2044
+ className: "section-padding",
2045
+ children: /* @__PURE__ */ jsxDEV5("div", {
2046
+ className: "prose prose-invert mx-auto max-w-2xl",
2047
+ children: [
2048
+ /* @__PURE__ */ jsxDEV5("h1", {
2049
+ className: "mb-8 text-4xl font-bold",
2050
+ children: "Contribute to ContractSpec"
2051
+ }, undefined, false, undefined, this),
2052
+ /* @__PURE__ */ jsxDEV5("div", {
2053
+ className: "not-prose border-border bg-muted/30 mb-12 rounded-lg border p-6",
2054
+ children: [
2055
+ /* @__PURE__ */ jsxDEV5("h2", {
2056
+ className: "text-foreground mb-4 text-xl font-bold",
2057
+ children: "⚡ Quick Start — 3 Minutes to Your First Contribution"
2058
+ }, undefined, false, undefined, this),
2059
+ /* @__PURE__ */ jsxDEV5("ol", {
2060
+ className: "text-muted-foreground list-inside list-decimal space-y-2",
2061
+ children: [
2062
+ /* @__PURE__ */ jsxDEV5("li", {
2063
+ children: [
2064
+ "Read the",
2065
+ " ",
2066
+ /* @__PURE__ */ jsxDEV5("a", {
2067
+ href: "https://github.com/contractspec/contractspec/blob/main/CONTRIBUTING.md",
2068
+ className: "text-primary hover:underline",
2069
+ target: "_blank",
2070
+ rel: "noopener noreferrer",
2071
+ children: "CONTRIBUTING guide"
2072
+ }, undefined, false, undefined, this)
2073
+ ]
2074
+ }, undefined, true, undefined, this),
2075
+ /* @__PURE__ */ jsxDEV5("li", {
2076
+ children: [
2077
+ "Pick a",
2078
+ " ",
2079
+ /* @__PURE__ */ jsxDEV5("a", {
2080
+ href: "https://github.com/contractspec/contractspec/labels/good%20first%20issue",
2081
+ className: "text-primary hover:underline",
2082
+ target: "_blank",
2083
+ rel: "noopener noreferrer",
2084
+ children: "good first issue"
2085
+ }, undefined, false, undefined, this),
2086
+ " ",
2087
+ "or",
2088
+ " ",
2089
+ /* @__PURE__ */ jsxDEV5("a", {
2090
+ href: "https://github.com/contractspec/contractspec/labels/help%20wanted",
2091
+ className: "text-primary hover:underline",
2092
+ target: "_blank",
2093
+ rel: "noopener noreferrer",
2094
+ children: "help wanted"
2095
+ }, undefined, false, undefined, this),
2096
+ " ",
2097
+ "label"
2098
+ ]
2099
+ }, undefined, true, undefined, this),
2100
+ /* @__PURE__ */ jsxDEV5("li", {
2101
+ children: "Open a draft PR early — we'll guide you from there"
2102
+ }, undefined, false, undefined, this)
2103
+ ]
2104
+ }, undefined, true, undefined, this)
2105
+ ]
2106
+ }, undefined, true, undefined, this),
2107
+ /* @__PURE__ */ jsxDEV5("section", {
2108
+ className: "mb-10 space-y-4",
2109
+ children: [
2110
+ /* @__PURE__ */ jsxDEV5("h2", {
2111
+ className: "text-foreground text-2xl font-bold",
2112
+ children: "Why Open Source?"
2113
+ }, undefined, false, undefined, this),
2114
+ /* @__PURE__ */ jsxDEV5("ul", {
2115
+ className: "text-muted-foreground list-inside list-disc space-y-2",
2116
+ children: [
2117
+ /* @__PURE__ */ jsxDEV5("li", {
2118
+ children: [
2119
+ /* @__PURE__ */ jsxDEV5("strong", {
2120
+ children: "Transparency:"
2121
+ }, undefined, false, undefined, this),
2122
+ " You can see exactly how your code is compiled and deployed"
2123
+ ]
2124
+ }, undefined, true, undefined, this),
2125
+ /* @__PURE__ */ jsxDEV5("li", {
2126
+ children: [
2127
+ /* @__PURE__ */ jsxDEV5("strong", {
2128
+ children: "Trust:"
2129
+ }, undefined, false, undefined, this),
2130
+ " No black boxes — audit the compiler that shapes your AI-generated code"
2131
+ ]
2132
+ }, undefined, true, undefined, this),
2133
+ /* @__PURE__ */ jsxDEV5("li", {
2134
+ children: [
2135
+ /* @__PURE__ */ jsxDEV5("strong", {
2136
+ children: "Faster ecosystem:"
2137
+ }, undefined, false, undefined, this),
2138
+ " Community contributions accelerate adoption and surface real-world edge cases"
2139
+ ]
2140
+ }, undefined, true, undefined, this),
2141
+ /* @__PURE__ */ jsxDEV5("li", {
2142
+ children: [
2143
+ /* @__PURE__ */ jsxDEV5("strong", {
2144
+ children: "Community review:"
2145
+ }, undefined, false, undefined, this),
2146
+ " More eyes catch more bugs, and better patterns emerge"
2147
+ ]
2148
+ }, undefined, true, undefined, this),
2149
+ /* @__PURE__ */ jsxDEV5("li", {
2150
+ children: [
2151
+ /* @__PURE__ */ jsxDEV5("strong", {
2152
+ children: "No lock-in:"
2153
+ }, undefined, false, undefined, this),
2154
+ " You own your code. The spec is portable."
2155
+ ]
2156
+ }, undefined, true, undefined, this)
2157
+ ]
2158
+ }, undefined, true, undefined, this)
2159
+ ]
2160
+ }, undefined, true, undefined, this),
2161
+ /* @__PURE__ */ jsxDEV5("section", {
2162
+ className: "mb-10 space-y-4",
2163
+ children: [
2164
+ /* @__PURE__ */ jsxDEV5("h2", {
2165
+ className: "text-foreground text-2xl font-bold",
2166
+ children: "Where to Contribute"
2167
+ }, undefined, false, undefined, this),
2168
+ /* @__PURE__ */ jsxDEV5("ul", {
2169
+ className: "text-muted-foreground list-inside list-disc space-y-2",
2170
+ children: [
2171
+ /* @__PURE__ */ jsxDEV5("li", {
2172
+ children: [
2173
+ /* @__PURE__ */ jsxDEV5("a", {
2174
+ href: "https://github.com/contractspec",
2175
+ className: "text-primary hover:underline",
2176
+ target: "_blank",
2177
+ rel: "noopener noreferrer",
2178
+ children: "GitHub Organization"
2179
+ }, undefined, false, undefined, this),
2180
+ " ",
2181
+ "— All repos live here"
2182
+ ]
2183
+ }, undefined, true, undefined, this),
2184
+ /* @__PURE__ */ jsxDEV5("li", {
2185
+ children: [
2186
+ /* @__PURE__ */ jsxDEV5("a", {
2187
+ href: "https://github.com/contractspec/contractspec",
2188
+ className: "text-primary hover:underline",
2189
+ target: "_blank",
2190
+ rel: "noopener noreferrer",
2191
+ children: "Main Repository"
2192
+ }, undefined, false, undefined, this),
2193
+ " ",
2194
+ "— Core compiler and specs"
2195
+ ]
2196
+ }, undefined, true, undefined, this),
2197
+ /* @__PURE__ */ jsxDEV5("li", {
2198
+ children: [
2199
+ /* @__PURE__ */ jsxDEV5("a", {
2200
+ href: "https://github.com/contractspec/contractspec/discussions",
2201
+ className: "text-primary hover:underline",
2202
+ target: "_blank",
2203
+ rel: "noopener noreferrer",
2204
+ children: "Discussions"
2205
+ }, undefined, false, undefined, this),
2206
+ " ",
2207
+ "— Questions, ideas, and RFCs"
2208
+ ]
2209
+ }, undefined, true, undefined, this)
2210
+ ]
2211
+ }, undefined, true, undefined, this)
2212
+ ]
2213
+ }, undefined, true, undefined, this),
2214
+ /* @__PURE__ */ jsxDEV5("section", {
2215
+ className: "mb-10 space-y-4",
2216
+ children: [
2217
+ /* @__PURE__ */ jsxDEV5("h2", {
2218
+ className: "text-foreground text-2xl font-bold",
2219
+ children: "Ways to Contribute"
2220
+ }, undefined, false, undefined, this),
2221
+ /* @__PURE__ */ jsxDEV5("div", {
2222
+ className: "text-muted-foreground space-y-3",
2223
+ children: [
2224
+ /* @__PURE__ */ jsxDEV5("p", {
2225
+ children: [
2226
+ /* @__PURE__ */ jsxDEV5("strong", {
2227
+ className: "text-foreground",
2228
+ children: "\uD83D\uDCC4 Documentation:"
2229
+ }, undefined, false, undefined, this),
2230
+ " ",
2231
+ "Fix typos, improve explanations, add missing guides"
2232
+ ]
2233
+ }, undefined, true, undefined, this),
2234
+ /* @__PURE__ */ jsxDEV5("p", {
2235
+ children: [
2236
+ /* @__PURE__ */ jsxDEV5("strong", {
2237
+ className: "text-foreground",
2238
+ children: "\uD83D\uDCE6 Examples & Templates:"
2239
+ }, undefined, false, undefined, this),
2240
+ " ",
2241
+ "Build real-world specs for common use cases"
2242
+ ]
2243
+ }, undefined, true, undefined, this),
2244
+ /* @__PURE__ */ jsxDEV5("p", {
2245
+ children: [
2246
+ /* @__PURE__ */ jsxDEV5("strong", {
2247
+ className: "text-foreground",
2248
+ children: "\uD83D\uDD0C Integrations & Adapters:"
2249
+ }, undefined, false, undefined, this),
2250
+ " ",
2251
+ "Connect ContractSpec to frameworks, databases, and tools"
2252
+ ]
2253
+ }, undefined, true, undefined, this),
2254
+ /* @__PURE__ */ jsxDEV5("p", {
2255
+ children: [
2256
+ /* @__PURE__ */ jsxDEV5("strong", {
2257
+ className: "text-foreground",
2258
+ children: "\uD83D\uDC1B Bug Reports:"
2259
+ }, undefined, false, undefined, this),
2260
+ " ",
2261
+ "File issues with clear reproduction steps — minimal cases help the most"
2262
+ ]
2263
+ }, undefined, true, undefined, this),
2264
+ /* @__PURE__ */ jsxDEV5("p", {
2265
+ children: [
2266
+ /* @__PURE__ */ jsxDEV5("strong", {
2267
+ className: "text-foreground",
2268
+ children: "\uD83D\uDD12 Security Reports:"
2269
+ }, undefined, false, undefined, this),
2270
+ " ",
2271
+ "Found a vulnerability? See",
2272
+ " ",
2273
+ /* @__PURE__ */ jsxDEV5("a", {
2274
+ href: "#security",
2275
+ className: "text-primary hover:underline",
2276
+ children: "Security"
2277
+ }, undefined, false, undefined, this),
2278
+ " ",
2279
+ "below"
2280
+ ]
2281
+ }, undefined, true, undefined, this)
2282
+ ]
2283
+ }, undefined, true, undefined, this)
2284
+ ]
2285
+ }, undefined, true, undefined, this),
2286
+ /* @__PURE__ */ jsxDEV5("section", {
2287
+ className: "mb-10 space-y-4",
2288
+ children: [
2289
+ /* @__PURE__ */ jsxDEV5("h2", {
2290
+ className: "text-foreground text-2xl font-bold",
2291
+ children: "Quality Bar"
2292
+ }, undefined, false, undefined, this),
2293
+ /* @__PURE__ */ jsxDEV5("p", {
2294
+ className: "text-muted-foreground",
2295
+ children: "We keep the bar high so the codebase stays maintainable. Every PR should:"
2296
+ }, undefined, false, undefined, this),
2297
+ /* @__PURE__ */ jsxDEV5("ul", {
2298
+ className: "text-muted-foreground list-inside list-disc space-y-2",
2299
+ children: [
2300
+ /* @__PURE__ */ jsxDEV5("li", {
2301
+ children: [
2302
+ /* @__PURE__ */ jsxDEV5("strong", {
2303
+ children: "Include tests"
2304
+ }, undefined, false, undefined, this),
2305
+ " — Unit tests for logic, integration tests for adapters"
2306
+ ]
2307
+ }, undefined, true, undefined, this),
2308
+ /* @__PURE__ */ jsxDEV5("li", {
2309
+ children: [
2310
+ /* @__PURE__ */ jsxDEV5("strong", {
2311
+ children: "Be fully typed"
2312
+ }, undefined, false, undefined, this),
2313
+ " — No ",
2314
+ /* @__PURE__ */ jsxDEV5("code", {
2315
+ children: "any"
2316
+ }, undefined, false, undefined, this),
2317
+ ". Strict TypeScript only."
2318
+ ]
2319
+ }, undefined, true, undefined, this),
2320
+ /* @__PURE__ */ jsxDEV5("li", {
2321
+ children: [
2322
+ /* @__PURE__ */ jsxDEV5("strong", {
2323
+ children: "Stay small"
2324
+ }, undefined, false, undefined, this),
2325
+ " — One concern per PR. Easier to review, faster to merge."
2326
+ ]
2327
+ }, undefined, true, undefined, this),
2328
+ /* @__PURE__ */ jsxDEV5("li", {
2329
+ children: [
2330
+ /* @__PURE__ */ jsxDEV5("strong", {
2331
+ children: "Use clear commit messages"
2332
+ }, undefined, false, undefined, this),
2333
+ " — Describe _what_ and _why_, not just _how_"
2334
+ ]
2335
+ }, undefined, true, undefined, this)
2336
+ ]
2337
+ }, undefined, true, undefined, this),
2338
+ /* @__PURE__ */ jsxDEV5("div", {
2339
+ className: "bg-muted/20 mt-4 rounded-md p-4",
2340
+ children: [
2341
+ /* @__PURE__ */ jsxDEV5("h3", {
2342
+ className: "text-foreground mb-2 font-semibold",
2343
+ children: "Spec-First Mindset"
2344
+ }, undefined, false, undefined, this),
2345
+ /* @__PURE__ */ jsxDEV5("p", {
2346
+ className: "text-muted-foreground text-sm",
2347
+ children: "ContractSpec exists to enforce contracts between humans, AI, and code. When contributing, think spec-first: define the behavior before the implementation. A well-defined spec makes changes safe to regenerate and easy to validate."
2348
+ }, undefined, false, undefined, this)
2349
+ ]
2350
+ }, undefined, true, undefined, this)
2351
+ ]
2352
+ }, undefined, true, undefined, this),
2353
+ /* @__PURE__ */ jsxDEV5("section", {
2354
+ className: "mb-10 space-y-4",
2355
+ children: [
2356
+ /* @__PURE__ */ jsxDEV5("h2", {
2357
+ className: "text-foreground text-2xl font-bold",
2358
+ children: "Governance & Decision Making"
2359
+ }, undefined, false, undefined, this),
2360
+ /* @__PURE__ */ jsxDEV5("p", {
2361
+ className: "text-muted-foreground",
2362
+ children: [
2363
+ "ContractSpec uses a",
2364
+ " ",
2365
+ /* @__PURE__ */ jsxDEV5("strong", {
2366
+ className: "text-foreground",
2367
+ children: "founder-led maintainer model"
2368
+ }, undefined, false, undefined, this),
2369
+ ":"
2370
+ ]
2371
+ }, undefined, true, undefined, this),
2372
+ /* @__PURE__ */ jsxDEV5("ul", {
2373
+ className: "text-muted-foreground list-inside list-disc space-y-2",
2374
+ children: [
2375
+ /* @__PURE__ */ jsxDEV5("li", {
2376
+ children: "The founder has final say on significant decisions — for now"
2377
+ }, undefined, false, undefined, this),
2378
+ /* @__PURE__ */ jsxDEV5("li", {
2379
+ children: "All reasoning is shared publicly in issues or PRs"
2380
+ }, undefined, false, undefined, this),
2381
+ /* @__PURE__ */ jsxDEV5("li", {
2382
+ children: "Community input shapes direction; we don't merge in silence"
2383
+ }, undefined, false, undefined, this),
2384
+ /* @__PURE__ */ jsxDEV5("li", {
2385
+ children: "This model may evolve as the project matures and trusted maintainers emerge"
2386
+ }, undefined, false, undefined, this)
2387
+ ]
2388
+ }, undefined, true, undefined, this)
2389
+ ]
2390
+ }, undefined, true, undefined, this),
2391
+ /* @__PURE__ */ jsxDEV5("section", {
2392
+ className: "mb-10 space-y-4",
2393
+ id: "security",
2394
+ children: [
2395
+ /* @__PURE__ */ jsxDEV5("h2", {
2396
+ className: "text-foreground text-2xl font-bold",
2397
+ children: "Security"
2398
+ }, undefined, false, undefined, this),
2399
+ /* @__PURE__ */ jsxDEV5("p", {
2400
+ className: "text-muted-foreground",
2401
+ children: [
2402
+ "If you discover a security vulnerability, please",
2403
+ " ",
2404
+ /* @__PURE__ */ jsxDEV5("strong", {
2405
+ className: "text-foreground",
2406
+ children: "do not"
2407
+ }, undefined, false, undefined, this),
2408
+ " open a public issue."
2409
+ ]
2410
+ }, undefined, true, undefined, this),
2411
+ /* @__PURE__ */ jsxDEV5("p", {
2412
+ className: "text-muted-foreground",
2413
+ children: [
2414
+ "Instead, email us at",
2415
+ " ",
2416
+ /* @__PURE__ */ jsxDEV5("a", {
2417
+ href: "mailto:security@contractspec.io",
2418
+ className: "text-primary hover:underline",
2419
+ children: "security@contractspec.io"
2420
+ }, undefined, false, undefined, this),
2421
+ " ",
2422
+ "with:"
2423
+ ]
2424
+ }, undefined, true, undefined, this),
2425
+ /* @__PURE__ */ jsxDEV5("ul", {
2426
+ className: "text-muted-foreground list-inside list-disc space-y-2",
2427
+ children: [
2428
+ /* @__PURE__ */ jsxDEV5("li", {
2429
+ children: "A clear description of the vulnerability"
2430
+ }, undefined, false, undefined, this),
2431
+ /* @__PURE__ */ jsxDEV5("li", {
2432
+ children: "Steps to reproduce"
2433
+ }, undefined, false, undefined, this),
2434
+ /* @__PURE__ */ jsxDEV5("li", {
2435
+ children: "Potential impact"
2436
+ }, undefined, false, undefined, this)
2437
+ ]
2438
+ }, undefined, true, undefined, this),
2439
+ /* @__PURE__ */ jsxDEV5("p", {
2440
+ className: "text-muted-foreground",
2441
+ children: "We'll acknowledge within 48 hours and work with you to coordinate disclosure."
2442
+ }, undefined, false, undefined, this)
2443
+ ]
2444
+ }, undefined, true, undefined, this),
2445
+ /* @__PURE__ */ jsxDEV5("section", {
2446
+ className: "mb-10 space-y-4",
2447
+ children: [
2448
+ /* @__PURE__ */ jsxDEV5("h2", {
2449
+ className: "text-foreground text-2xl font-bold",
2450
+ children: "Code of Conduct"
2451
+ }, undefined, false, undefined, this),
2452
+ /* @__PURE__ */ jsxDEV5("p", {
2453
+ className: "text-muted-foreground",
2454
+ children: [
2455
+ "We expect all contributors to follow our",
2456
+ " ",
2457
+ /* @__PURE__ */ jsxDEV5("a", {
2458
+ href: "https://github.com/contractspec/contractspec/blob/main/CODE_OF_CONDUCT.md",
2459
+ className: "text-primary hover:underline",
2460
+ target: "_blank",
2461
+ rel: "noopener noreferrer",
2462
+ children: "Code of Conduct"
2463
+ }, undefined, false, undefined, this),
2464
+ ". Be respectful, constructive, and assume good intent."
2465
+ ]
2466
+ }, undefined, true, undefined, this)
2467
+ ]
2468
+ }, undefined, true, undefined, this),
2469
+ /* @__PURE__ */ jsxDEV5("section", {
2470
+ className: "border-border mt-12 space-y-4 border-t pt-8",
2471
+ children: [
2472
+ /* @__PURE__ */ jsxDEV5("h2", {
2473
+ className: "text-foreground text-2xl font-bold",
2474
+ children: "Want to Go Deeper?"
2475
+ }, undefined, false, undefined, this),
2476
+ /* @__PURE__ */ jsxDEV5("p", {
2477
+ className: "text-muted-foreground",
2478
+ children: "If you're considering a long-term commitment to ContractSpec — reviewing PRs regularly, shaping roadmap, mentoring new contributors — we'd love to talk."
2479
+ }, undefined, false, undefined, this),
2480
+ /* @__PURE__ */ jsxDEV5("p", {
2481
+ className: "text-muted-foreground",
2482
+ children: [
2483
+ "This isn't a job offer. It's an invitation to help build something meaningful together. Reach out at",
2484
+ " ",
2485
+ /* @__PURE__ */ jsxDEV5("a", {
2486
+ href: "mailto:maintainers@contractspec.io",
2487
+ className: "text-primary hover:underline",
2488
+ children: "maintainers@contractspec.io"
2489
+ }, undefined, false, undefined, this),
2490
+ " ",
2491
+ "and tell us what you'd bring to the table."
2492
+ ]
2493
+ }, undefined, true, undefined, this)
2494
+ ]
2495
+ }, undefined, true, undefined, this)
2496
+ ]
2497
+ }, undefined, true, undefined, this)
2498
+ }, undefined, false, undefined, this)
2499
+ }, undefined, false, undefined, this);
2500
+ }
2501
+
2502
+ // src/components/marketing/DesignPartnerPage.tsx
2503
+ import Link from "next/link";
2504
+ import { Button as Button3 } from "@contractspec/lib.design-system";
2505
+ import {
2506
+ ArrowRight,
2507
+ BookOpen,
2508
+ MessageSquare as MessageSquare3,
2509
+ Rocket as Rocket2,
2510
+ Users as Users2
2511
+ } from "lucide-react";
2512
+ import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
2513
+ var metadata2 = {
2514
+ title: "Design Partner Getting Started | ContractSpec",
2515
+ description: "Onboarding and resources for ContractSpec Design Partners."
2516
+ };
2517
+ function DesignPartnerPage() {
2518
+ return /* @__PURE__ */ jsxDEV6("main", {
2519
+ className: "flex grow flex-col",
2520
+ children: [
2521
+ /* @__PURE__ */ jsxDEV6("section", {
2522
+ className: "section-padding relative overflow-hidden",
2523
+ children: /* @__PURE__ */ jsxDEV6("div", {
2524
+ className: "container mx-auto max-w-5xl",
2525
+ children: /* @__PURE__ */ jsxDEV6("div", {
2526
+ className: "mb-12 max-w-3xl",
2527
+ children: [
2528
+ /* @__PURE__ */ jsxDEV6("h1", {
2529
+ className: "mb-6 text-4xl font-bold tracking-tight sm:text-5xl",
2530
+ children: "Welcome, Design Partner"
2531
+ }, undefined, false, undefined, this),
2532
+ /* @__PURE__ */ jsxDEV6("p", {
2533
+ className: "text-muted-foreground text-xl leading-relaxed",
2534
+ children: "We're thrilled to have you on board. As a Design Partner, you play a critical role in shaping the future of ContractSpec. This hub contains everything you need to get started, collaborate with us, and build your first specifications."
2535
+ }, undefined, false, undefined, this)
2536
+ ]
2537
+ }, undefined, true, undefined, this)
2538
+ }, undefined, false, undefined, this)
2539
+ }, undefined, false, undefined, this),
2540
+ /* @__PURE__ */ jsxDEV6("section", {
2541
+ className: "section-padding bg-white/5",
2542
+ children: /* @__PURE__ */ jsxDEV6("div", {
2543
+ className: "container mx-auto max-w-5xl",
2544
+ children: [
2545
+ /* @__PURE__ */ jsxDEV6("h2", {
2546
+ className: "mb-12 text-3xl font-bold",
2547
+ children: "Getting Started"
2548
+ }, undefined, false, undefined, this),
2549
+ /* @__PURE__ */ jsxDEV6("div", {
2550
+ className: "grid gap-12 md:grid-cols-2",
2551
+ children: [
2552
+ /* @__PURE__ */ jsxDEV6("div", {
2553
+ className: "space-y-4",
2554
+ children: [
2555
+ /* @__PURE__ */ jsxDEV6("div", {
2556
+ className: "border-primary/20 bg-primary/10 flex h-12 w-12 items-center justify-center rounded-lg border",
2557
+ children: /* @__PURE__ */ jsxDEV6(Rocket2, {
2558
+ className: "text-primary h-6 w-6"
2559
+ }, undefined, false, undefined, this)
2560
+ }, undefined, false, undefined, this),
2561
+ /* @__PURE__ */ jsxDEV6("h3", {
2562
+ className: "text-xl font-semibold",
2563
+ children: "1. Access the Studio"
2564
+ }, undefined, false, undefined, this),
2565
+ /* @__PURE__ */ jsxDEV6("p", {
2566
+ className: "text-muted-foreground",
2567
+ children: "Your account has been enabled with Design Partner privileges. Log in to the Studio to start exploring the latest features before they're public."
2568
+ }, undefined, false, undefined, this),
2569
+ /* @__PURE__ */ jsxDEV6("div", {
2570
+ className: "pt-2",
2571
+ children: /* @__PURE__ */ jsxDEV6(Button3, {
2572
+ asChild: true,
2573
+ variant: "outline",
2574
+ children: /* @__PURE__ */ jsxDEV6(Link, {
2575
+ href: "https://www.contractspec.studio",
2576
+ children: [
2577
+ "Launch Studio ",
2578
+ /* @__PURE__ */ jsxDEV6(ArrowRight, {
2579
+ className: "ml-2 h-4 w-4"
2580
+ }, undefined, false, undefined, this)
2581
+ ]
2582
+ }, undefined, true, undefined, this)
2583
+ }, undefined, false, undefined, this)
2584
+ }, undefined, false, undefined, this)
2585
+ ]
2586
+ }, undefined, true, undefined, this),
2587
+ /* @__PURE__ */ jsxDEV6("div", {
2588
+ className: "space-y-4",
2589
+ children: [
2590
+ /* @__PURE__ */ jsxDEV6("div", {
2591
+ className: "border-primary/20 bg-primary/10 flex h-12 w-12 items-center justify-center rounded-lg border",
2592
+ children: /* @__PURE__ */ jsxDEV6(MessageSquare3, {
2593
+ className: "text-primary h-6 w-6"
2594
+ }, undefined, false, undefined, this)
2595
+ }, undefined, false, undefined, this),
2596
+ /* @__PURE__ */ jsxDEV6("h3", {
2597
+ className: "text-xl font-semibold",
2598
+ children: "2. Join the Conversation"
2599
+ }, undefined, false, undefined, this),
2600
+ /* @__PURE__ */ jsxDEV6("p", {
2601
+ className: "text-muted-foreground",
2602
+ children: "We've set up a dedicated private channel for real-time feedback and support. Connect with our engineering team and other partners."
2603
+ }, undefined, false, undefined, this),
2604
+ /* @__PURE__ */ jsxDEV6("div", {
2605
+ className: "pt-2",
2606
+ children: /* @__PURE__ */ jsxDEV6(Button3, {
2607
+ asChild: true,
2608
+ variant: "outline",
2609
+ children: /* @__PURE__ */ jsxDEV6(Link, {
2610
+ href: "mailto:partners@contractspec.io",
2611
+ children: [
2612
+ "Contact Partner Success",
2613
+ " ",
2614
+ /* @__PURE__ */ jsxDEV6(ArrowRight, {
2615
+ className: "ml-2 h-4 w-4"
2616
+ }, undefined, false, undefined, this)
2617
+ ]
2618
+ }, undefined, true, undefined, this)
2619
+ }, undefined, false, undefined, this)
2620
+ }, undefined, false, undefined, this)
2621
+ ]
2622
+ }, undefined, true, undefined, this),
2623
+ /* @__PURE__ */ jsxDEV6("div", {
2624
+ className: "space-y-4",
2625
+ children: [
2626
+ /* @__PURE__ */ jsxDEV6("div", {
2627
+ className: "border-primary/20 bg-primary/10 flex h-12 w-12 items-center justify-center rounded-lg border",
2628
+ children: /* @__PURE__ */ jsxDEV6(BookOpen, {
2629
+ className: "text-primary h-6 w-6"
2630
+ }, undefined, false, undefined, this)
2631
+ }, undefined, false, undefined, this),
2632
+ /* @__PURE__ */ jsxDEV6("h3", {
2633
+ className: "text-xl font-semibold",
2634
+ children: "3. Explore Documentation"
2635
+ }, undefined, false, undefined, this),
2636
+ /* @__PURE__ */ jsxDEV6("p", {
2637
+ className: "text-muted-foreground",
2638
+ children: "Dive deep into the core concepts, API references, and architecture guides. Our docs are evolving, and your feedback helps us improve them."
2639
+ }, undefined, false, undefined, this),
2640
+ /* @__PURE__ */ jsxDEV6("div", {
2641
+ className: "pt-2",
2642
+ children: /* @__PURE__ */ jsxDEV6(Button3, {
2643
+ asChild: true,
2644
+ variant: "outline",
2645
+ children: /* @__PURE__ */ jsxDEV6(Link, {
2646
+ href: "/docs",
2647
+ children: [
2648
+ "Read the Docs ",
2649
+ /* @__PURE__ */ jsxDEV6(ArrowRight, {
2650
+ className: "ml-2 h-4 w-4"
2651
+ }, undefined, false, undefined, this)
2652
+ ]
2653
+ }, undefined, true, undefined, this)
2654
+ }, undefined, false, undefined, this)
2655
+ }, undefined, false, undefined, this)
2656
+ ]
2657
+ }, undefined, true, undefined, this),
2658
+ /* @__PURE__ */ jsxDEV6("div", {
2659
+ className: "space-y-4",
2660
+ children: [
2661
+ /* @__PURE__ */ jsxDEV6("div", {
2662
+ className: "border-primary/20 bg-primary/10 flex h-12 w-12 items-center justify-center rounded-lg border",
2663
+ children: /* @__PURE__ */ jsxDEV6(Users2, {
2664
+ className: "text-primary h-6 w-6"
2665
+ }, undefined, false, undefined, this)
2666
+ }, undefined, false, undefined, this),
2667
+ /* @__PURE__ */ jsxDEV6("h3", {
2668
+ className: "text-xl font-semibold",
2669
+ children: "4. Partner Syncs"
2670
+ }, undefined, false, undefined, this),
2671
+ /* @__PURE__ */ jsxDEV6("p", {
2672
+ className: "text-muted-foreground",
2673
+ children: "We schedule bi-weekly syncs to review your progress, blockers, and feature requests. Check your calendar invite for the next session."
2674
+ }, undefined, false, undefined, this)
2675
+ ]
2676
+ }, undefined, true, undefined, this)
2677
+ ]
2678
+ }, undefined, true, undefined, this)
2679
+ ]
2680
+ }, undefined, true, undefined, this)
2681
+ }, undefined, false, undefined, this),
2682
+ /* @__PURE__ */ jsxDEV6("section", {
2683
+ className: "section-padding",
2684
+ children: /* @__PURE__ */ jsxDEV6("div", {
2685
+ className: "container mx-auto max-w-3xl",
2686
+ children: [
2687
+ /* @__PURE__ */ jsxDEV6("h2", {
2688
+ className: "mb-8 text-3xl font-bold",
2689
+ children: "What to Expect"
2690
+ }, undefined, false, undefined, this),
2691
+ /* @__PURE__ */ jsxDEV6("div", {
2692
+ className: "space-y-8",
2693
+ children: [
2694
+ /* @__PURE__ */ jsxDEV6("div", {
2695
+ children: [
2696
+ /* @__PURE__ */ jsxDEV6("h3", {
2697
+ className: "mb-2 text-xl font-semibold",
2698
+ children: "Fast Iteration Cycles"
2699
+ }, undefined, false, undefined, this),
2700
+ /* @__PURE__ */ jsxDEV6("p", {
2701
+ className: "text-muted-foreground",
2702
+ children: "We ship updates frequently. You might see UI changes or new capabilities appear weekly. We'll do our best to communicate breaking changes in advance."
2703
+ }, undefined, false, undefined, this)
2704
+ ]
2705
+ }, undefined, true, undefined, this),
2706
+ /* @__PURE__ */ jsxDEV6("div", {
2707
+ children: [
2708
+ /* @__PURE__ */ jsxDEV6("h3", {
2709
+ className: "mb-2 text-xl font-semibold",
2710
+ children: "Direct Engineering Access"
2711
+ }, undefined, false, undefined, this),
2712
+ /* @__PURE__ */ jsxDEV6("p", {
2713
+ className: "text-muted-foreground",
2714
+ children: "You're not talking to support agents; you're talking to the builders. Your feedback goes directly into the issue tracker."
2715
+ }, undefined, false, undefined, this)
2716
+ ]
2717
+ }, undefined, true, undefined, this),
2718
+ /* @__PURE__ */ jsxDEV6("div", {
2719
+ children: [
2720
+ /* @__PURE__ */ jsxDEV6("h3", {
2721
+ className: "mb-2 text-xl font-semibold",
2722
+ children: "Input on Roadmap"
2723
+ }, undefined, false, undefined, this),
2724
+ /* @__PURE__ */ jsxDEV6("p", {
2725
+ className: "text-muted-foreground",
2726
+ children: "Design Partners influence priority. If a feature enables a critical use case for you, let us know—we often reshuffle our sprint to accommodate partner needs."
2727
+ }, undefined, false, undefined, this)
2728
+ ]
2729
+ }, undefined, true, undefined, this)
2730
+ ]
2731
+ }, undefined, true, undefined, this)
2732
+ ]
2733
+ }, undefined, true, undefined, this)
2734
+ }, undefined, false, undefined, this),
2735
+ /* @__PURE__ */ jsxDEV6("section", {
2736
+ className: "section-padding border-t border-white/10",
2737
+ children: /* @__PURE__ */ jsxDEV6("div", {
2738
+ className: "container mx-auto max-w-3xl text-center",
2739
+ children: [
2740
+ /* @__PURE__ */ jsxDEV6("h2", {
2741
+ className: "mb-4 text-3xl font-bold",
2742
+ children: "Have a question right now?"
2743
+ }, undefined, false, undefined, this),
2744
+ /* @__PURE__ */ jsxDEV6("p", {
2745
+ className: "text-muted-foreground mb-8",
2746
+ children: "Don't hesitate to reach out. We are here to help you succeed."
2747
+ }, undefined, false, undefined, this),
2748
+ /* @__PURE__ */ jsxDEV6(Button3, {
2749
+ asChild: true,
2750
+ size: "lg",
2751
+ children: /* @__PURE__ */ jsxDEV6(Link, {
2752
+ href: "mailto:partners@contractspec.io",
2753
+ children: "Email the Founders"
2754
+ }, undefined, false, undefined, this)
2755
+ }, undefined, false, undefined, this)
2756
+ ]
2757
+ }, undefined, true, undefined, this)
2758
+ }, undefined, false, undefined, this)
2759
+ ]
2760
+ }, undefined, true, undefined, this);
2761
+ }
2762
+
2763
+ // src/components/marketing/sections/HeroMarketingSection.tsx
2764
+ import { ButtonLink as ButtonLink2, MarketingSection as MarketingSection2 } from "@contractspec/lib.design-system";
2765
+ import {
2766
+ analyticsEventNames,
2767
+ captureAnalyticsEvent
2768
+ } from "@contractspec/bundle.library/libs/posthog/client";
2769
+ import { Box as Box2, HStack as HStack3, VStack as VStack3 } from "@contractspec/lib.ui-kit-web/ui/stack";
2770
+ import { H1 as H13, Lead as Lead2, Small as Small3 } from "@contractspec/lib.ui-kit-web/ui/typography";
2771
+ import { ChevronRight } from "lucide-react";
2772
+ import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
2773
+ "use client";
2774
+ var heroChips = ["Multi-Surface Sync", "No Lock-in", "Standard Tech"];
2775
+ function HeroMarketingSection() {
2776
+ return /* @__PURE__ */ jsxDEV7(MarketingSection2, {
2777
+ tone: "gradient",
2778
+ padding: "spacious",
2779
+ align: "center",
2780
+ children: /* @__PURE__ */ jsxDEV7(VStack3, {
2781
+ gap: "lg",
2782
+ align: "center",
2783
+ className: "text-center",
2784
+ children: [
2785
+ /* @__PURE__ */ jsxDEV7(Box2, {
2786
+ as: "div",
2787
+ role: "presentation",
2788
+ className: "bg-muted text-muted-foreground inline-flex items-center rounded-full px-3 py-1 text-xs font-medium tracking-wider uppercase",
2789
+ children: "Open Source Core"
2790
+ }, undefined, false, undefined, this),
2791
+ /* @__PURE__ */ jsxDEV7(H13, {
2792
+ className: "text-4xl leading-tight font-bold text-balance md:text-5xl",
2793
+ children: "Stabilize your AI-generated code"
2794
+ }, undefined, false, undefined, this),
2795
+ /* @__PURE__ */ jsxDEV7(Lead2, {
2796
+ className: "text-muted-foreground text-lg text-balance md:text-xl",
2797
+ children: "ContractSpec is the compiler that keeps AI-written software coherent, safe, and regenerable. You keep your app. You own the code. One module at a time."
2798
+ }, undefined, false, undefined, this),
2799
+ /* @__PURE__ */ jsxDEV7(HStack3, {
2800
+ gap: "md",
2801
+ justify: "center",
2802
+ wrap: "wrap",
2803
+ children: [
2804
+ /* @__PURE__ */ jsxDEV7(ButtonLink2, {
2805
+ href: "/install",
2806
+ onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, {
2807
+ surface: "hero"
2808
+ }),
2809
+ children: [
2810
+ "Install OSS ",
2811
+ /* @__PURE__ */ jsxDEV7(ChevronRight, {
2812
+ size: 16
2813
+ }, undefined, false, undefined, this)
2814
+ ]
2815
+ }, undefined, true, undefined, this),
2816
+ /* @__PURE__ */ jsxDEV7(ButtonLink2, {
2817
+ variant: "ghost",
2818
+ href: "/contact#waitlist",
2819
+ onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
2820
+ surface: "hero"
2821
+ }),
2822
+ children: "Join Studio Waitlist"
2823
+ }, undefined, false, undefined, this)
2824
+ ]
2825
+ }, undefined, true, undefined, this),
2826
+ /* @__PURE__ */ jsxDEV7(HStack3, {
2827
+ gap: "sm",
2828
+ justify: "center",
2829
+ wrap: "wrap",
2830
+ className: "pt-2",
2831
+ children: heroChips.map((chip) => /* @__PURE__ */ jsxDEV7(Box2, {
2832
+ as: "div",
2833
+ role: "presentation",
2834
+ className: "border-border text-foreground inline-flex items-center rounded-full border px-3 py-1 text-sm",
2835
+ children: /* @__PURE__ */ jsxDEV7(Small3, {
2836
+ className: "font-medium",
2837
+ children: chip
2838
+ }, undefined, false, undefined, this)
2839
+ }, chip, false, undefined, this))
2840
+ }, undefined, false, undefined, this)
2841
+ ]
2842
+ }, undefined, true, undefined, this)
2843
+ }, undefined, false, undefined, this);
2844
+ }
2845
+
2846
+ // src/components/marketing/sections/IconGridSection.tsx
2847
+ import { cva } from "class-variance-authority";
2848
+ import {
2849
+ MarketingCardsSection,
2850
+ MarketingIconCard
2851
+ } from "@contractspec/lib.design-system";
2852
+ import { Muted as Muted3 } from "@contractspec/lib.ui-kit-web/ui/typography";
2853
+ import { jsxDEV as jsxDEV8 } from "react/jsx-dev-runtime";
2854
+ var itemVariants = cva("", {
2855
+ variants: {
2856
+ iconRole: {
2857
+ iconFirst: "",
2858
+ listing: "items-start",
2859
+ support: "items-start"
2860
+ }
2861
+ },
2862
+ defaultVariants: { iconRole: "iconFirst" }
2863
+ });
2864
+ function IconGridSection({
2865
+ eyebrow,
2866
+ title,
2867
+ subtitle,
2868
+ items,
2869
+ tone = "default",
2870
+ padding,
2871
+ columns = 3,
2872
+ iconRole = "iconFirst"
2873
+ }) {
2874
+ return /* @__PURE__ */ jsxDEV8(MarketingCardsSection, {
2875
+ tone,
2876
+ padding,
2877
+ eyebrow: eyebrow ? /* @__PURE__ */ jsxDEV8(Muted3, {
2878
+ className: "text-xs font-semibold tracking-[0.2em] uppercase",
2879
+ children: eyebrow
2880
+ }, undefined, false, undefined, this) : null,
2881
+ title,
2882
+ subtitle: subtitle ? /* @__PURE__ */ jsxDEV8(Muted3, {
2883
+ className: "text-lg",
2884
+ children: subtitle
2885
+ }, undefined, false, undefined, this) : null,
2886
+ columns,
2887
+ children: items.map((card) => /* @__PURE__ */ jsxDEV8(MarketingIconCard, {
2888
+ icon: card.icon,
2889
+ title: card.title,
2890
+ description: card.description,
2891
+ tone: card.tone,
2892
+ iconClassName: card.iconClassName,
2893
+ variant: iconRole === "listing" ? "listing" : iconRole === "support" ? "support" : "iconFirst",
2894
+ className: itemVariants({ iconRole })
2895
+ }, card.title, false, undefined, this))
2896
+ }, undefined, false, undefined, this);
2897
+ }
2898
+
2899
+ // src/components/marketing/sections/ProblemSection.tsx
2900
+ import { AlertTriangle, Layers, RefreshCw, XCircle } from "lucide-react";
2901
+ import { jsxDEV as jsxDEV9 } from "react/jsx-dev-runtime";
2902
+ var problemItems = [
2903
+ {
2904
+ icon: AlertTriangle,
2905
+ title: "Can't enforce invariants",
2906
+ description: "AI-generated code drifts from business rules over time. No source of truth means no safety.",
2907
+ iconClassName: "text-red-400"
2908
+ },
2909
+ {
2910
+ icon: Layers,
2911
+ title: "Multi-surface chaos",
2912
+ description: "API, DB, UI, and events get out of sync. One change breaks three surfaces.",
2913
+ iconClassName: "text-orange-400"
2914
+ },
2915
+ {
2916
+ icon: RefreshCw,
2917
+ title: "Hallucinated refactors",
2918
+ description: 'AI "improvements" introduce subtle bugs and break contracts you didn’t know existed.',
2919
+ iconClassName: "text-amber-400"
2920
+ },
2921
+ {
2922
+ icon: XCircle,
2923
+ title: "Unmaintainable spaghetti",
2924
+ description: "Teams ship fast initially, then spend months untangling AI-generated chaos.",
2925
+ iconClassName: "text-red-400"
2926
+ }
2927
+ ];
2928
+ function ProblemSection() {
2929
+ return /* @__PURE__ */ jsxDEV9(IconGridSection, {
2930
+ tone: "muted",
2931
+ columns: 4,
2932
+ eyebrow: "The Problem",
2933
+ title: "AI agents write code fast. Then the chaos begins.",
2934
+ subtitle: 'In 2025, "vibe coding" and AI agents generate enormous amounts of code. But they have critical limitations that destroy long-term maintainability.',
2935
+ items: problemItems
2936
+ }, undefined, false, undefined, this);
2937
+ }
2938
+
2939
+ // src/components/marketing/sections/SolutionSection.tsx
2940
+ import { FileCode, Layers as Layers2, RefreshCw as RefreshCw2, Shield } from "lucide-react";
2941
+ import { jsxDEV as jsxDEV10 } from "react/jsx-dev-runtime";
2942
+ var solutionItems = [
2943
+ {
2944
+ icon: FileCode,
2945
+ title: "Canonical Source of Truth",
2946
+ description: "Contracts define what the system should do, not just what it does. AI agents read specs, not implementations.",
2947
+ iconClassName: "text-emerald-400"
2948
+ },
2949
+ {
2950
+ icon: Layers2,
2951
+ title: "Multi-Surface Consistency",
2952
+ description: "One spec generates API, DB, UI, events, and MCP tools. All surfaces stay in sync because they share the same source.",
2953
+ iconClassName: "text-blue-400"
2954
+ },
2955
+ {
2956
+ icon: RefreshCw2,
2957
+ title: "Safe Regeneration",
2958
+ description: "Regenerate code anytime without fear. Specs enforce invariants. Breaking changes caught at compile time.",
2959
+ iconClassName: "text-violet-400"
2960
+ },
2961
+ {
2962
+ icon: Shield,
2963
+ title: "AI Governance",
2964
+ description: "Constrain what AI agents can change. Enforce contracts they must respect. Flag violations automatically.",
2965
+ iconClassName: "text-pink-400"
2966
+ }
2967
+ ];
2968
+ function SolutionSection() {
2969
+ return /* @__PURE__ */ jsxDEV10(IconGridSection, {
2970
+ tone: "default",
2971
+ columns: 4,
2972
+ eyebrow: "The Solution",
2973
+ title: "ContractSpec: The safety layer for AI-coded systems",
2974
+ subtitle: "Define contracts once. Generate consistent code across all surfaces. Regenerate safely anytime. No lock-in.",
2975
+ items: solutionItems
2976
+ }, undefined, false, undefined, this);
2977
+ }
2978
+
2979
+ // src/components/marketing/sections/FearsSection.tsx
2980
+ import { CheckCircle as CheckCircle3, Code, Unlock, Zap } from "lucide-react";
2981
+ import { jsxDEV as jsxDEV11 } from "react/jsx-dev-runtime";
2982
+ var fears = [
2983
+ {
2984
+ title: '"I already have an app"',
2985
+ body: "ContractSpec works with existing codebases. You don't start over — you stabilize incrementally, one module at a time. Start with one API endpoint, one data model, one contract.",
2986
+ icon: CheckCircle3
2987
+ },
2988
+ {
2989
+ title: '"Vendor lock-in / losing ownership"',
2990
+ body: "You own the generated code. It's standard TypeScript, standard SQL, standard GraphQL. ContractSpec is a compiler — like TypeScript itself. You can eject anytime.",
2991
+ icon: Unlock
2992
+ },
2993
+ {
2994
+ title: '"Adoption cost / learning curve"',
2995
+ body: "Specs are just TypeScript. If you can write z.object({ name: z.string() }), you can write a ContractSpec. No new language, no magic DSL, no YAML.",
2996
+ icon: Code
2997
+ },
2998
+ {
2999
+ title: '"Forced migrations / magical runtime"',
3000
+ body: "ContractSpec generates plain code you can read, debug, and modify. There's no proprietary runtime. Migrations are explicit, reversible, and in your control.",
3001
+ icon: Zap
3002
+ }
3003
+ ];
3004
+ function FearsSection() {
3005
+ return /* @__PURE__ */ jsxDEV11(IconGridSection, {
3006
+ tone: "muted",
3007
+ columns: 2,
3008
+ eyebrow: "We Get It",
3009
+ title: "Your fears, addressed",
3010
+ subtitle: "We know what you're thinking. Here's why those concerns don't apply to ContractSpec.",
3011
+ iconRole: "support",
3012
+ items: fears.map((item) => ({
3013
+ icon: item.icon,
3014
+ title: item.title,
3015
+ description: item.body,
3016
+ iconClassName: "text-violet-400"
3017
+ }))
3018
+ }, undefined, false, undefined, this);
3019
+ }
3020
+
3021
+ // src/components/marketing/sections/CorePositioningSection.tsx
3022
+ import { MarketingSection as MarketingSection3, ButtonLink as ButtonLink3 } from "@contractspec/lib.design-system";
3023
+ import { VStack as VStack4 } from "@contractspec/lib.ui-kit-web/ui/stack";
3024
+ import { H2 as H23, Lead as Lead3, Small as Small4 } from "@contractspec/lib.ui-kit-web/ui/typography";
3025
+ import { ChevronRight as ChevronRight2 } from "lucide-react";
3026
+ import { jsxDEV as jsxDEV12 } from "react/jsx-dev-runtime";
3027
+ function CorePositioningSection() {
3028
+ return /* @__PURE__ */ jsxDEV12(MarketingSection3, {
3029
+ tone: "gradient",
3030
+ padding: "comfortable",
3031
+ align: "center",
3032
+ maxWidth: "lg",
3033
+ children: /* @__PURE__ */ jsxDEV12(VStack4, {
3034
+ gap: "md",
3035
+ align: "center",
3036
+ children: [
3037
+ /* @__PURE__ */ jsxDEV12(H23, {
3038
+ className: "text-center text-3xl font-bold md:text-4xl",
3039
+ children: [
3040
+ "You keep your app.",
3041
+ /* @__PURE__ */ jsxDEV12("br", {}, undefined, false, undefined, this),
3042
+ "We stabilize it, one module at a time."
3043
+ ]
3044
+ }, undefined, true, undefined, this),
3045
+ /* @__PURE__ */ jsxDEV12(Lead3, {
3046
+ className: "text-center",
3047
+ children: [
3048
+ "You own the code. It's standard tech.",
3049
+ /* @__PURE__ */ jsxDEV12("br", {}, undefined, false, undefined, this),
3050
+ /* @__PURE__ */ jsxDEV12(Small4, {
3051
+ className: "font-semibold text-violet-400",
3052
+ children: "We're the compiler, not the prison."
3053
+ }, undefined, false, undefined, this)
3054
+ ]
3055
+ }, undefined, true, undefined, this),
3056
+ /* @__PURE__ */ jsxDEV12(VStack4, {
3057
+ as: "div",
3058
+ gap: "sm",
3059
+ align: "center",
3060
+ className: "pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center",
3061
+ children: [
3062
+ /* @__PURE__ */ jsxDEV12(ButtonLink3, {
3063
+ href: "/pricing#waitlist",
3064
+ children: [
3065
+ "Join waitlist ",
3066
+ /* @__PURE__ */ jsxDEV12(ChevronRight2, {
3067
+ size: 16
3068
+ }, undefined, false, undefined, this)
3069
+ ]
3070
+ }, undefined, true, undefined, this),
3071
+ /* @__PURE__ */ jsxDEV12(ButtonLink3, {
3072
+ variant: "ghost",
3073
+ href: "/contact",
3074
+ children: "Book a call"
3075
+ }, undefined, false, undefined, this)
3076
+ ]
3077
+ }, undefined, true, undefined, this)
3078
+ ]
3079
+ }, undefined, true, undefined, this)
3080
+ }, undefined, false, undefined, this);
3081
+ }
3082
+
3083
+ // src/components/marketing/sections/AudienceSection.tsx
3084
+ import {
3085
+ MarketingCard,
3086
+ MarketingCardContent,
3087
+ MarketingCardHeader,
3088
+ MarketingCardTitle,
3089
+ MarketingCardsSection as MarketingCardsSection2
3090
+ } from "@contractspec/lib.design-system";
3091
+ import { VStack as VStack5 } from "@contractspec/lib.ui-kit-web/ui/stack";
3092
+ import { Muted as Muted4, Small as Small5 } from "@contractspec/lib.ui-kit-web/ui/typography";
3093
+ import { jsxDEV as jsxDEV13 } from "react/jsx-dev-runtime";
3094
+ var audiences = [
3095
+ {
3096
+ tier: "Tier 1: Priority",
3097
+ title: "AI-Native Startups & Technical Founders",
3098
+ body: "Solo founders or small teams using Cursor, Copilot, Claude, or AI agents heavily. Messy AI-generated backends and frontends, inconsistent APIs, code that is hard to refactor.",
3099
+ need: "Need: A way to stabilize AI-generated code without rewriting it."
3100
+ },
3101
+ {
3102
+ tier: "Tier 1: Priority",
3103
+ title: "Small Teams with AI-Generated Chaos",
3104
+ body: "2-10 person teams that shipped fast with AI and now have tech debt. Multiple surfaces out of sync, no source of truth, afraid to touch AI-generated code.",
3105
+ need: "Need: Incremental stabilization, safe regeneration, contracts as guardrails."
3106
+ },
3107
+ {
3108
+ tier: "Tier 2: Growth",
3109
+ title: "AI Dev Agencies",
3110
+ body: "Agencies building many projects for clients using AI-assisted development. Repeating the same patterns, inconsistent quality across projects, handoff nightmares.",
3111
+ need: "Need: Reusable templates, consistent contracts, professional handoff artifacts."
3112
+ },
3113
+ {
3114
+ tier: "Tier 2: Growth",
3115
+ title: "Scaleups with Compliance Needs",
3116
+ body: "Growing companies that need audit trails, API governance, or regulatory compliance. AI-generated code doesn't meet compliance requirements.",
3117
+ need: "Need: Governance layer, change tracking, contract enforcement."
3118
+ }
3119
+ ];
3120
+ function AudienceSection() {
3121
+ return /* @__PURE__ */ jsxDEV13(MarketingCardsSection2, {
3122
+ tone: "default",
3123
+ columns: 2,
3124
+ eyebrow: "Who It's For",
3125
+ title: "Built for teams drowning in AI-generated code",
3126
+ maxWidth: "xl",
3127
+ children: audiences.map((item) => /* @__PURE__ */ jsxDEV13(MarketingCard, {
3128
+ tone: "muted",
3129
+ children: [
3130
+ /* @__PURE__ */ jsxDEV13(MarketingCardHeader, {
3131
+ className: "space-y-2",
3132
+ children: [
3133
+ /* @__PURE__ */ jsxDEV13(Small5, {
3134
+ className: "font-semibold text-blue-400",
3135
+ children: item.tier
3136
+ }, undefined, false, undefined, this),
3137
+ /* @__PURE__ */ jsxDEV13(MarketingCardTitle, {
3138
+ className: "text-xl",
3139
+ children: item.title
3140
+ }, undefined, false, undefined, this)
3141
+ ]
3142
+ }, undefined, true, undefined, this),
3143
+ /* @__PURE__ */ jsxDEV13(MarketingCardContent, {
3144
+ children: /* @__PURE__ */ jsxDEV13(VStack5, {
3145
+ gap: "sm",
3146
+ children: [
3147
+ /* @__PURE__ */ jsxDEV13(Muted4, {
3148
+ className: "text-sm leading-relaxed",
3149
+ children: item.body
3150
+ }, undefined, false, undefined, this),
3151
+ /* @__PURE__ */ jsxDEV13(Small5, {
3152
+ className: "font-medium text-violet-400",
3153
+ children: item.need
3154
+ }, undefined, false, undefined, this)
3155
+ ]
3156
+ }, undefined, true, undefined, this)
3157
+ }, undefined, false, undefined, this)
3158
+ ]
3159
+ }, item.title, true, undefined, this))
3160
+ }, undefined, false, undefined, this);
3161
+ }
3162
+
3163
+ // src/components/marketing/sections/OutputsSection.tsx
3164
+ import { jsxDEV as jsxDEV14 } from "react/jsx-dev-runtime";
3165
+ var outputs = [
3166
+ {
3167
+ title: "REST API",
3168
+ description: "Type-safe endpoints with validation. Standard Express/Hono/Elysia handlers.",
3169
+ icon: "\uD83D\uDD0C"
3170
+ },
3171
+ {
3172
+ title: "GraphQL Schema",
3173
+ description: "Automatically generated resolvers. Standard Pothos/Apollo output.",
3174
+ icon: "\uD83D\uDCCA"
3175
+ },
3176
+ {
3177
+ title: "Database Schema",
3178
+ description: "Prisma migrations and types. Standard SQL underneath.",
3179
+ icon: "\uD83D\uDDC4️"
3180
+ },
3181
+ {
3182
+ title: "MCP Tools",
3183
+ description: "AI agent tool definitions. Works with Claude, GPT, and any MCP client.",
3184
+ icon: "\uD83E\uDD16"
3185
+ },
3186
+ {
3187
+ title: "Client SDKs",
3188
+ description: "Type-safe API clients. Standard fetch/axios underneath.",
3189
+ icon: "\uD83D\uDCE6"
3190
+ },
3191
+ {
3192
+ title: "UI Components",
3193
+ description: "React forms and views from specs. Standard JSX output.",
3194
+ icon: "\uD83C\uDFA8"
3195
+ }
3196
+ ];
3197
+ function OutputsSection() {
3198
+ return /* @__PURE__ */ jsxDEV14(IconGridSection, {
3199
+ tone: "muted",
3200
+ columns: 3,
3201
+ title: "What ContractSpec generates",
3202
+ subtitle: "One contract, multiple outputs. All in sync. All standard tech.",
3203
+ iconRole: "iconFirst",
3204
+ items: outputs.map((item) => ({
3205
+ icon: () => /* @__PURE__ */ jsxDEV14("span", {
3206
+ "aria-hidden": true,
3207
+ className: "text-3xl",
3208
+ children: item.icon
3209
+ }, undefined, false, undefined, this),
3210
+ title: item.title,
3211
+ description: item.description
3212
+ }))
3213
+ }, undefined, false, undefined, this);
3214
+ }
3215
+
3216
+ // src/components/marketing/sections/StepsSection.tsx
3217
+ import { jsxDEV as jsxDEV15 } from "react/jsx-dev-runtime";
3218
+ var steps = [
3219
+ {
3220
+ step: 1,
3221
+ title: "Pick one module",
3222
+ description: "Start with one API endpoint, one entity, one surface. No big-bang migration."
3223
+ },
3224
+ {
3225
+ step: 2,
3226
+ title: "Define the contract",
3227
+ description: "Write a spec in TypeScript. Just types and Zod schemas you already know."
3228
+ },
3229
+ {
3230
+ step: 3,
3231
+ title: "Generate & compare",
3232
+ description: "See what ContractSpec generates. Compare to your existing code. Keep what works."
3233
+ },
3234
+ {
3235
+ step: 4,
3236
+ title: "Expand gradually",
3237
+ description: "Add more contracts as you see value. No pressure. No lock-in. Your pace."
3238
+ }
3239
+ ];
3240
+ function StepsSection() {
3241
+ return /* @__PURE__ */ jsxDEV15(IconGridSection, {
3242
+ tone: "default",
3243
+ columns: 4,
3244
+ title: "How incremental adoption works",
3245
+ padding: "comfortable",
3246
+ iconRole: "listing",
3247
+ items: steps.map((item) => ({
3248
+ icon: ({ className }) => /* @__PURE__ */ jsxDEV15("div", {
3249
+ className: `bg-primary/15 flex h-10 w-10 items-center justify-center rounded-lg ${className ?? ""}`,
3250
+ children: /* @__PURE__ */ jsxDEV15("span", {
3251
+ className: "text-primary text-sm font-semibold",
3252
+ children: item.step
3253
+ }, undefined, false, undefined, this)
3254
+ }, undefined, false, undefined, this),
3255
+ title: item.title,
3256
+ description: item.description,
3257
+ tone: "muted"
3258
+ }))
3259
+ }, undefined, false, undefined, this);
3260
+ }
3261
+
3262
+ // src/components/marketing/sections/DevelopersSection.tsx
3263
+ import {
3264
+ ButtonLink as ButtonLink4,
3265
+ MarketingComparisonSection
3266
+ } from "@contractspec/lib.design-system";
3267
+ import { jsxDEV as jsxDEV16 } from "react/jsx-dev-runtime";
3268
+ var standardTech = [
3269
+ "TypeScript & Zod — schemas you already know",
3270
+ "Prisma — standard database access",
3271
+ "GraphQL or REST — your choice",
3272
+ "React or any UI framework",
3273
+ "Bun, Node, Deno — all supported"
3274
+ ];
3275
+ var noMagic = [
3276
+ "Generated code is readable & modifiable",
3277
+ "No proprietary runtime dependencies",
3278
+ "Eject anytime, keep everything",
3279
+ "Works with your existing CI/CD",
3280
+ "Open spec format"
3281
+ ];
3282
+ function DevelopersSection() {
3283
+ return /* @__PURE__ */ jsxDEV16(MarketingComparisonSection, {
3284
+ tone: "muted",
3285
+ title: "Built for developers",
3286
+ padding: "comfortable",
3287
+ left: { title: "Standard Tech Stack", items: standardTech },
3288
+ right: { title: "No Magic, No Lock-in", items: noMagic },
3289
+ subtitle: /* @__PURE__ */ jsxDEV16(ButtonLink4, {
3290
+ href: "/docs",
3291
+ children: [
3292
+ "Read the docs ",
3293
+ /* @__PURE__ */ jsxDEV16("span", {
3294
+ "aria-hidden": true,
3295
+ children: "→"
3296
+ }, undefined, false, undefined, this)
3297
+ ]
3298
+ }, undefined, true, undefined, this)
3299
+ }, undefined, false, undefined, this);
3300
+ }
3301
+
3302
+ // src/components/marketing/sections/CtaSection.tsx
3303
+ import { MarketingSection as MarketingSection4, ButtonLink as ButtonLink5 } from "@contractspec/lib.design-system";
3304
+ import {
3305
+ analyticsEventNames as analyticsEventNames2,
3306
+ captureAnalyticsEvent as captureAnalyticsEvent2
3307
+ } from "@contractspec/bundle.library/libs/posthog/client";
3308
+ import { VStack as VStack6 } from "@contractspec/lib.ui-kit-web/ui/stack";
3309
+ import { H2 as H24, Lead as Lead4 } from "@contractspec/lib.ui-kit-web/ui/typography";
3310
+ import { jsxDEV as jsxDEV17 } from "react/jsx-dev-runtime";
3311
+ function CtaSection() {
3312
+ return /* @__PURE__ */ jsxDEV17(MarketingSection4, {
3313
+ tone: "gradient",
3314
+ padding: "comfortable",
3315
+ align: "center",
3316
+ maxWidth: "lg",
3317
+ children: /* @__PURE__ */ jsxDEV17(VStack6, {
3318
+ gap: "md",
3319
+ align: "center",
3320
+ className: "text-center",
3321
+ children: [
3322
+ /* @__PURE__ */ jsxDEV17(H24, {
3323
+ className: "text-4xl font-bold md:text-5xl",
3324
+ children: "Ready to stabilize your codebase?"
3325
+ }, undefined, false, undefined, this),
3326
+ /* @__PURE__ */ jsxDEV17(Lead4, {
3327
+ className: "text-muted-foreground text-lg",
3328
+ children: "Start with one module. See the difference. Expand at your own pace."
3329
+ }, undefined, false, undefined, this),
3330
+ /* @__PURE__ */ jsxDEV17(VStack6, {
3331
+ as: "div",
3332
+ gap: "sm",
3333
+ align: "center",
3334
+ className: "pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center",
3335
+ children: [
3336
+ /* @__PURE__ */ jsxDEV17(ButtonLink5, {
3337
+ href: "/pricing#waitlist",
3338
+ onClick: () => captureAnalyticsEvent2(analyticsEventNames2.CTA_STUDIO_CLICK, {
3339
+ surface: "cta-section"
3340
+ }),
3341
+ children: "Join waitlist"
3342
+ }, undefined, false, undefined, this),
3343
+ /* @__PURE__ */ jsxDEV17(ButtonLink5, {
3344
+ variant: "ghost",
3345
+ href: "/contact",
3346
+ onClick: () => captureAnalyticsEvent2(analyticsEventNames2.CTA_STUDIO_CLICK, {
3347
+ surface: "cta-section",
3348
+ variant: "contact"
3349
+ }),
3350
+ children: "Book a call"
3351
+ }, undefined, false, undefined, this)
3352
+ ]
3353
+ }, undefined, true, undefined, this)
3354
+ ]
3355
+ }, undefined, true, undefined, this)
3356
+ }, undefined, false, undefined, this);
3357
+ }
3358
+
3359
+ // src/components/marketing/LandingPage.tsx
3360
+ import { VStack as VStack7 } from "@contractspec/lib.ui-kit-web/ui/stack";
3361
+ import { jsxDEV as jsxDEV18 } from "react/jsx-dev-runtime";
3362
+ "use client";
3363
+ function LandingPage() {
3364
+ return /* @__PURE__ */ jsxDEV18(VStack7, {
3365
+ as: "main",
3366
+ gap: "none",
3367
+ children: [
3368
+ /* @__PURE__ */ jsxDEV18(HeroMarketingSection, {}, undefined, false, undefined, this),
3369
+ /* @__PURE__ */ jsxDEV18(ProblemSection, {}, undefined, false, undefined, this),
3370
+ /* @__PURE__ */ jsxDEV18(SolutionSection, {}, undefined, false, undefined, this),
3371
+ /* @__PURE__ */ jsxDEV18(FearsSection, {}, undefined, false, undefined, this),
3372
+ /* @__PURE__ */ jsxDEV18(CorePositioningSection, {}, undefined, false, undefined, this),
3373
+ /* @__PURE__ */ jsxDEV18(AudienceSection, {}, undefined, false, undefined, this),
3374
+ /* @__PURE__ */ jsxDEV18(OutputsSection, {}, undefined, false, undefined, this),
3375
+ /* @__PURE__ */ jsxDEV18(StepsSection, {}, undefined, false, undefined, this),
3376
+ /* @__PURE__ */ jsxDEV18(DevelopersSection, {}, undefined, false, undefined, this),
3377
+ /* @__PURE__ */ jsxDEV18(CtaSection, {}, undefined, false, undefined, this)
3378
+ ]
3379
+ }, undefined, true, undefined, this);
3380
+ }
3381
+
3382
+ // src/libs/pricing-examples.ts
3383
+ var PRICING_EXAMPLES = {
3384
+ free: {
3385
+ regenerationsPerMonth: 200,
3386
+ aiActionsPerMonth: 100,
3387
+ projects: 1
3388
+ },
3389
+ builder: {
3390
+ regenerationsPerMonthHint: "1,000–2,000+",
3391
+ aiActionsPerMonthHint: "1,000+"
3392
+ },
3393
+ team: {
3394
+ description: "Higher limits + cheaper per-regen at scale"
3395
+ }
3396
+ };
3397
+
3398
+ // src/components/marketing/pricing-thinking-modal.tsx
3399
+ import { CheckCircle as CheckCircle4 } from "lucide-react";
3400
+ import {
3401
+ Dialog,
3402
+ DialogContent,
3403
+ DialogDescription,
3404
+ DialogHeader,
3405
+ DialogTitle
3406
+ } from "@contractspec/lib.ui-kit-web/ui/dialog";
3407
+ import { Button as Button4 } from "@contractspec/lib.design-system";
3408
+ import { jsxDEV as jsxDEV19 } from "react/jsx-dev-runtime";
3409
+ "use client";
3410
+ var pricingTiers = [
3411
+ {
3412
+ tag: "Planned",
3413
+ title: "Free",
3414
+ priceLine: "For hobbyists and pre-PMF teams",
3415
+ bullets: [
3416
+ "1 active project",
3417
+ "Small spec size",
3418
+ `Example: ~${PRICING_EXAMPLES.free.regenerationsPerMonth} free regenerations per month`,
3419
+ `Example: ~${PRICING_EXAMPLES.free.aiActionsPerMonth} free AI agent actions per month`,
3420
+ "Unlimited collaborators"
3421
+ ],
3422
+ note: "Good enough to build and launch a real product before paying."
3423
+ },
3424
+ {
3425
+ tag: "Planned",
3426
+ title: "Builder",
3427
+ priceLine: "Usage-based, for solo builders and small teams",
3428
+ bullets: [
3429
+ "More projects",
3430
+ `More monthly regenerations included (e.g. ${PRICING_EXAMPLES.builder.regenerationsPerMonthHint})`,
3431
+ `More AI agent actions included (e.g. ${PRICING_EXAMPLES.builder.aiActionsPerMonthHint})`,
3432
+ "Pay-as-you-go for extra regenerations and AI",
3433
+ "Basic environments (dev / prod)"
3434
+ ],
3435
+ note: "Pay for how fast and how often you evolve your system, not for seats."
3436
+ },
3437
+ {
3438
+ tag: "Planned",
3439
+ title: "Team & Platform",
3440
+ priceLine: "For teams standardizing on ContractSpec",
3441
+ bullets: [
3442
+ "Multiple projects and environments",
3443
+ "Higher regeneration and AI action limits",
3444
+ "Cheaper overages as you scale",
3445
+ "Advanced RBAC and governance",
3446
+ "SSO, audit trails, and longer retention"
3447
+ ],
3448
+ note: "For platform teams using ContractSpec as infra for multiple apps."
3449
+ }
3450
+ ];
3451
+ var usageMetrics = [
3452
+ {
3453
+ name: "Regenerations",
3454
+ freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.regenerationsPerMonth} regenerations / month`,
3455
+ beyond: "Beyond: pay per additional regeneration, with volume discounts."
3456
+ },
3457
+ {
3458
+ name: "AI agent actions",
3459
+ freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.aiActionsPerMonth} AI agent actions / month`,
3460
+ beyond: "Beyond: pay-as-you-go for extra AI usage."
3461
+ },
3462
+ {
3463
+ name: "Projects",
3464
+ freeTier: `Free tier: ${PRICING_EXAMPLES.free.projects} project`,
3465
+ beyond: "Builder / Team: more projects included; extra projects available as you scale."
3466
+ }
3467
+ ];
3468
+ function PricingThinkingModal({
3469
+ open,
3470
+ onOpenChange,
3471
+ onApplyClick
3472
+ }) {
3473
+ return /* @__PURE__ */ jsxDEV19(Dialog, {
3474
+ open,
3475
+ onOpenChange,
3476
+ children: /* @__PURE__ */ jsxDEV19(DialogContent, {
3477
+ className: "max-h-[90vh] w-full overflow-y-auto md:max-w-5xl",
3478
+ children: [
3479
+ /* @__PURE__ */ jsxDEV19(DialogHeader, {
3480
+ children: [
3481
+ /* @__PURE__ */ jsxDEV19(DialogTitle, {
3482
+ children: "Tentative pricing (work in progress)"
3483
+ }, undefined, false, undefined, this),
3484
+ /* @__PURE__ */ jsxDEV19(DialogDescription, {
3485
+ children: "We're still in design-partner mode. This is a draft of how we expect pricing to look once we open public access."
3486
+ }, undefined, false, undefined, this)
3487
+ ]
3488
+ }, undefined, true, undefined, this),
3489
+ /* @__PURE__ */ jsxDEV19("div", {
3490
+ className: "space-y-8",
3491
+ children: [
3492
+ /* @__PURE__ */ jsxDEV19("div", {
3493
+ className: "space-y-4",
3494
+ children: [
3495
+ /* @__PURE__ */ jsxDEV19("div", {
3496
+ className: "flex items-center gap-2",
3497
+ children: [
3498
+ /* @__PURE__ */ jsxDEV19("span", {
3499
+ className: "text-muted-foreground text-xs font-medium",
3500
+ children: "Draft"
3501
+ }, undefined, false, undefined, this),
3502
+ /* @__PURE__ */ jsxDEV19("span", {
3503
+ className: "text-muted-foreground text-xs",
3504
+ children: "•"
3505
+ }, undefined, false, undefined, this),
3506
+ /* @__PURE__ */ jsxDEV19("span", {
3507
+ className: "text-muted-foreground text-xs",
3508
+ children: "Subject to change"
3509
+ }, undefined, false, undefined, this)
3510
+ ]
3511
+ }, undefined, true, undefined, this),
3512
+ /* @__PURE__ */ jsxDEV19("div", {
3513
+ className: "grid gap-4 md:grid-cols-3",
3514
+ children: pricingTiers.map((tier) => /* @__PURE__ */ jsxDEV19("div", {
3515
+ className: "card-subtle relative space-y-4 p-6",
3516
+ children: [
3517
+ /* @__PURE__ */ jsxDEV19("div", {
3518
+ className: "bg-muted border-border absolute -top-2 left-1/2 -translate-x-1/2 rounded-full border px-2 py-0.5 text-xs font-medium",
3519
+ children: tier.tag
3520
+ }, undefined, false, undefined, this),
3521
+ /* @__PURE__ */ jsxDEV19("div", {
3522
+ className: "space-y-2 pt-2",
3523
+ children: [
3524
+ /* @__PURE__ */ jsxDEV19("h3", {
3525
+ className: "text-xl font-bold",
3526
+ children: tier.title
3527
+ }, undefined, false, undefined, this),
3528
+ /* @__PURE__ */ jsxDEV19("p", {
3529
+ className: "text-muted-foreground text-sm",
3530
+ children: tier.priceLine
3531
+ }, undefined, false, undefined, this)
3532
+ ]
3533
+ }, undefined, true, undefined, this),
3534
+ /* @__PURE__ */ jsxDEV19("ul", {
3535
+ className: "space-y-2",
3536
+ children: tier.bullets.map((bullet, i) => /* @__PURE__ */ jsxDEV19("li", {
3537
+ className: "text-muted-foreground flex gap-2 text-sm",
3538
+ children: [
3539
+ /* @__PURE__ */ jsxDEV19(CheckCircle4, {
3540
+ size: 14,
3541
+ className: "mt-0.5 shrink-0 text-violet-400"
3542
+ }, undefined, false, undefined, this),
3543
+ bullet
3544
+ ]
3545
+ }, i, true, undefined, this))
3546
+ }, undefined, false, undefined, this),
3547
+ /* @__PURE__ */ jsxDEV19("p", {
3548
+ className: "text-muted-foreground text-xs italic",
3549
+ children: tier.note
3550
+ }, undefined, false, undefined, this)
3551
+ ]
3552
+ }, tier.title, true, undefined, this))
3553
+ }, undefined, false, undefined, this)
3554
+ ]
3555
+ }, undefined, true, undefined, this),
3556
+ /* @__PURE__ */ jsxDEV19("div", {
3557
+ className: "border-border space-y-4 border-t pt-6",
3558
+ children: [
3559
+ /* @__PURE__ */ jsxDEV19("div", {
3560
+ children: [
3561
+ /* @__PURE__ */ jsxDEV19("h3", {
3562
+ className: "text-lg font-bold",
3563
+ children: "Usage-based, with a generous free tier"
3564
+ }, undefined, false, undefined, this),
3565
+ /* @__PURE__ */ jsxDEV19("p", {
3566
+ className: "text-muted-foreground mt-2 text-sm",
3567
+ children: "Inspired by products like PostHog, we plan to keep a generous free tier on all plans, then charge based on actual usage: regenerations, AI agent actions, and the number of projects you run on ContractSpec."
3568
+ }, undefined, false, undefined, this),
3569
+ /* @__PURE__ */ jsxDEV19("p", {
3570
+ className: "text-muted-foreground mt-3 text-xs italic",
3571
+ children: "Free tier limits are intentionally small but useful: enough to try the agent and regenerate a real project, not enough to run a full team's workload for free."
3572
+ }, undefined, false, undefined, this)
3573
+ ]
3574
+ }, undefined, true, undefined, this),
3575
+ /* @__PURE__ */ jsxDEV19("div", {
3576
+ className: "grid gap-4 md:grid-cols-3",
3577
+ children: usageMetrics.map((metric) => /* @__PURE__ */ jsxDEV19("div", {
3578
+ className: "card-subtle space-y-2 p-4",
3579
+ children: [
3580
+ /* @__PURE__ */ jsxDEV19("h4", {
3581
+ className: "text-sm font-semibold",
3582
+ children: metric.name
3583
+ }, undefined, false, undefined, this),
3584
+ /* @__PURE__ */ jsxDEV19("p", {
3585
+ className: "text-muted-foreground text-xs",
3586
+ children: metric.freeTier
3587
+ }, undefined, false, undefined, this),
3588
+ /* @__PURE__ */ jsxDEV19("p", {
3589
+ className: "text-muted-foreground text-xs",
3590
+ children: metric.beyond
3591
+ }, undefined, false, undefined, this)
3592
+ ]
3593
+ }, metric.name, true, undefined, this))
3594
+ }, undefined, false, undefined, this)
3595
+ ]
3596
+ }, undefined, true, undefined, this),
3597
+ /* @__PURE__ */ jsxDEV19("div", {
3598
+ className: "border-border space-y-4 border-t pt-6",
3599
+ children: [
3600
+ /* @__PURE__ */ jsxDEV19("p", {
3601
+ className: "text-muted-foreground text-xs",
3602
+ children: "These numbers are examples only. Final pricing and limits will evolve as we learn from design partners."
3603
+ }, undefined, false, undefined, this),
3604
+ /* @__PURE__ */ jsxDEV19("p", {
3605
+ className: "text-muted-foreground text-xs",
3606
+ children: "This is a tentative pricing model. We're pre-PMF and pricing is still in draft, subject to change based on what we learn."
3607
+ }, undefined, false, undefined, this),
3608
+ /* @__PURE__ */ jsxDEV19("p", {
3609
+ className: "text-muted-foreground text-xs",
3610
+ children: "Design partners get early access and a founding discount when paid plans launch."
3611
+ }, undefined, false, undefined, this),
3612
+ onApplyClick && /* @__PURE__ */ jsxDEV19(Button4, {
3613
+ onClick: () => {
3614
+ onOpenChange(false);
3615
+ onApplyClick();
3616
+ },
3617
+ className: "w-full",
3618
+ variant: "outline",
3619
+ children: "Apply as a design partner"
3620
+ }, undefined, false, undefined, this)
3621
+ ]
3622
+ }, undefined, true, undefined, this)
3623
+ ]
3624
+ }, undefined, true, undefined, this)
3625
+ ]
3626
+ }, undefined, true, undefined, this)
3627
+ }, undefined, false, undefined, this);
3628
+ }
3629
+
3630
+ // src/components/marketing/PricingClient.tsx
3631
+ import { useState as useState2 } from "react";
3632
+ import Link2 from "next/link";
3633
+ import { CheckCircle as CheckCircle5, ChevronDown, ChevronRight as ChevronRight3 } from "lucide-react";
3634
+ import { jsxDEV as jsxDEV20 } from "react/jsx-dev-runtime";
3635
+ "use client";
3636
+ var faqs = [
3637
+ {
3638
+ question: "Can I pay for ContractSpec today?",
3639
+ answer: "Not yet. We're pre-PMF and working closely with a small set of design partners. They get full access during early access and will be first to move onto paid plans once we're confident in the value and stability."
3640
+ },
3641
+ {
3642
+ question: "What will you charge for later?",
3643
+ answer: "Our plan is to charge based on usage: regenerations, AI agent actions, and number of active projects. A generous free tier will stay available so smaller teams and experiments can thrive."
3644
+ },
3645
+ {
3646
+ question: "What do I get as a design partner?",
3647
+ answer: "Direct collaboration on features, priority onboarding, and a founding discount when paid plans launch. You also shape how ContractSpec works for teams like yours."
3648
+ },
3649
+ {
3650
+ question: "Will you ever charge per seat?",
3651
+ answer: "No. We want everyone in your team to use ContractSpec without friction. Pricing is tied to how much of your system we help you maintain, not how many teammates you invite."
3652
+ }
3653
+ ];
3654
+ function PricingClient() {
3655
+ const [openFaq, setOpenFaq] = useState2(null);
3656
+ const [pricingModalOpen, setPricingModalOpen] = useState2(false);
3657
+ const scrollToWaitlist = () => {
3658
+ const waitlistElement = document.getElementById("waitlist");
3659
+ if (waitlistElement) {
3660
+ waitlistElement.scrollIntoView({ behavior: "smooth", block: "start" });
3661
+ }
3662
+ };
3663
+ return /* @__PURE__ */ jsxDEV20("main", {
3664
+ className: "",
3665
+ children: [
3666
+ /* @__PURE__ */ jsxDEV20("section", {
3667
+ className: "section-padding hero-gradient relative",
3668
+ children: /* @__PURE__ */ jsxDEV20("div", {
3669
+ className: "mx-auto max-w-4xl space-y-6 text-center",
3670
+ children: [
3671
+ /* @__PURE__ */ jsxDEV20("h1", {
3672
+ className: "text-5xl leading-tight font-bold md:text-6xl",
3673
+ children: "Transparent, usage-based pricing – after we earn it."
3674
+ }, undefined, false, undefined, this),
3675
+ /* @__PURE__ */ jsxDEV20("p", {
3676
+ className: "text-muted-foreground mx-auto max-w-2xl text-lg",
3677
+ children: "ContractSpec Core (the OSS compiler) is and always will be free. ContractSpec Studio (the managed platform) is in early access."
3678
+ }, undefined, false, undefined, this),
3679
+ /* @__PURE__ */ jsxDEV20("div", {
3680
+ className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
3681
+ children: [
3682
+ /* @__PURE__ */ jsxDEV20(Link2, {
3683
+ href: "/install",
3684
+ className: "btn-primary inline-flex items-center gap-2",
3685
+ children: [
3686
+ "Install OSS Core ",
3687
+ /* @__PURE__ */ jsxDEV20(ChevronRight3, {
3688
+ size: 16
3689
+ }, undefined, false, undefined, this)
3690
+ ]
3691
+ }, undefined, true, undefined, this),
3692
+ /* @__PURE__ */ jsxDEV20("button", {
3693
+ onClick: scrollToWaitlist,
3694
+ className: "btn-ghost inline-flex items-center gap-2",
3695
+ children: "Join Studio waitlist"
3696
+ }, undefined, false, undefined, this)
3697
+ ]
3698
+ }, undefined, true, undefined, this)
3699
+ ]
3700
+ }, undefined, true, undefined, this)
3701
+ }, undefined, false, undefined, this),
3702
+ /* @__PURE__ */ jsxDEV20("section", {
3703
+ className: "section-padding border-border border-b",
3704
+ children: /* @__PURE__ */ jsxDEV20("div", {
3705
+ className: "mx-auto max-w-6xl",
3706
+ children: /* @__PURE__ */ jsxDEV20("div", {
3707
+ className: "card-subtle flex flex-col gap-6 p-8 md:flex-row md:items-center",
3708
+ children: [
3709
+ /* @__PURE__ */ jsxDEV20("div", {
3710
+ className: "flex-1 space-y-4",
3711
+ children: [
3712
+ /* @__PURE__ */ jsxDEV20("div", {
3713
+ className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
3714
+ children: /* @__PURE__ */ jsxDEV20("span", {
3715
+ className: "text-sm font-medium text-violet-300",
3716
+ children: "Now accepting design partners"
3717
+ }, undefined, false, undefined, this)
3718
+ }, undefined, false, undefined, this),
3719
+ /* @__PURE__ */ jsxDEV20("h2", {
3720
+ className: "text-2xl font-bold",
3721
+ children: "Help us design the compiler for AI-native software."
3722
+ }, undefined, false, undefined, this),
3723
+ /* @__PURE__ */ jsxDEV20("p", {
3724
+ className: "text-muted-foreground text-sm",
3725
+ children: "We work closely with a small group of teams building serious products with AI. You bring real-world complexity, we bring the spec-first engine and a lot of attention."
3726
+ }, undefined, false, undefined, this)
3727
+ ]
3728
+ }, undefined, true, undefined, this),
3729
+ /* @__PURE__ */ jsxDEV20("div", {
3730
+ className: "flex-1 space-y-4",
3731
+ children: [
3732
+ /* @__PURE__ */ jsxDEV20("ul", {
3733
+ className: "text-muted-foreground space-y-2 text-sm",
3734
+ children: [
3735
+ /* @__PURE__ */ jsxDEV20("li", {
3736
+ className: "flex gap-2",
3737
+ children: [
3738
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3739
+ size: 16,
3740
+ className: "mt-0.5 shrink-0 text-violet-400"
3741
+ }, undefined, false, undefined, this),
3742
+ "Early access to ContractSpec Studio"
3743
+ ]
3744
+ }, undefined, true, undefined, this),
3745
+ /* @__PURE__ */ jsxDEV20("li", {
3746
+ className: "flex gap-2",
3747
+ children: [
3748
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3749
+ size: 16,
3750
+ className: "mt-0.5 shrink-0 text-violet-400"
3751
+ }, undefined, false, undefined, this),
3752
+ "Hands-on onboarding and architecture help"
3753
+ ]
3754
+ }, undefined, true, undefined, this),
3755
+ /* @__PURE__ */ jsxDEV20("li", {
3756
+ className: "flex gap-2",
3757
+ children: [
3758
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3759
+ size: 16,
3760
+ className: "mt-0.5 shrink-0 text-violet-400"
3761
+ }, undefined, false, undefined, this),
3762
+ "Influence over roadmap and features"
3763
+ ]
3764
+ }, undefined, true, undefined, this),
3765
+ /* @__PURE__ */ jsxDEV20("li", {
3766
+ className: "flex gap-2",
3767
+ children: [
3768
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3769
+ size: 16,
3770
+ className: "mt-0.5 shrink-0 text-violet-400"
3771
+ }, undefined, false, undefined, this),
3772
+ "Priority support during early access"
3773
+ ]
3774
+ }, undefined, true, undefined, this),
3775
+ /* @__PURE__ */ jsxDEV20("li", {
3776
+ className: "flex gap-2",
3777
+ children: [
3778
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3779
+ size: 16,
3780
+ className: "mt-0.5 shrink-0 text-violet-400"
3781
+ }, undefined, false, undefined, this),
3782
+ "Founding discount when paid plans launch"
3783
+ ]
3784
+ }, undefined, true, undefined, this)
3785
+ ]
3786
+ }, undefined, true, undefined, this),
3787
+ /* @__PURE__ */ jsxDEV20("button", {
3788
+ onClick: scrollToWaitlist,
3789
+ className: "btn-primary w-full md:w-auto",
3790
+ children: "Apply to the waitlist"
3791
+ }, undefined, false, undefined, this)
3792
+ ]
3793
+ }, undefined, true, undefined, this)
3794
+ ]
3795
+ }, undefined, true, undefined, this)
3796
+ }, undefined, false, undefined, this)
3797
+ }, undefined, false, undefined, this),
3798
+ /* @__PURE__ */ jsxDEV20("section", {
3799
+ className: "section-padding border-border border-b",
3800
+ children: /* @__PURE__ */ jsxDEV20("div", {
3801
+ className: "mx-auto max-w-6xl",
3802
+ children: /* @__PURE__ */ jsxDEV20("div", {
3803
+ className: "grid gap-6 md:grid-cols-3",
3804
+ children: [
3805
+ /* @__PURE__ */ jsxDEV20("div", {
3806
+ className: "card-subtle col-span-3 space-y-6 border-violet-500/20 p-6",
3807
+ children: [
3808
+ /* @__PURE__ */ jsxDEV20("div", {
3809
+ className: "absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-violet-500 px-3 py-1 text-xs font-medium text-white",
3810
+ children: [
3811
+ /* @__PURE__ */ jsxDEV20("div", {
3812
+ className: "text-1xl font-bold",
3813
+ children: "Free Forever"
3814
+ }, undefined, false, undefined, this),
3815
+ /* @__PURE__ */ jsxDEV20("p", {
3816
+ className: "text-muted-foreground text-xs",
3817
+ children: "Apache 2.0 / MIT License"
3818
+ }, undefined, false, undefined, this)
3819
+ ]
3820
+ }, undefined, true, undefined, this),
3821
+ /* @__PURE__ */ jsxDEV20("div", {
3822
+ className: "flex flex-row justify-around",
3823
+ children: [
3824
+ /* @__PURE__ */ jsxDEV20("div", {
3825
+ className: "w-1/2",
3826
+ children: [
3827
+ /* @__PURE__ */ jsxDEV20("div", {
3828
+ className: "space-y-2",
3829
+ children: /* @__PURE__ */ jsxDEV20("h2", {
3830
+ className: "text-2xl font-bold",
3831
+ children: "OSS Core"
3832
+ }, undefined, false, undefined, this)
3833
+ }, undefined, false, undefined, this),
3834
+ /* @__PURE__ */ jsxDEV20("p", {
3835
+ className: "text-muted-foreground text-sm",
3836
+ children: "The complete spec-first compiler. Generate API, DB, and UI code locally."
3837
+ }, undefined, false, undefined, this)
3838
+ ]
3839
+ }, undefined, true, undefined, this),
3840
+ /* @__PURE__ */ jsxDEV20("ul", {
3841
+ className: "space-y-3",
3842
+ children: [
3843
+ /* @__PURE__ */ jsxDEV20("li", {
3844
+ className: "text-muted-foreground flex gap-3 text-sm",
3845
+ children: [
3846
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3847
+ size: 16,
3848
+ className: "mt-0.5 shrink-0 text-violet-400"
3849
+ }, undefined, false, undefined, this),
3850
+ "Unlimited local regenerations"
3851
+ ]
3852
+ }, undefined, true, undefined, this),
3853
+ /* @__PURE__ */ jsxDEV20("li", {
3854
+ className: "text-muted-foreground flex gap-3 text-sm",
3855
+ children: [
3856
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3857
+ size: 16,
3858
+ className: "mt-0.5 shrink-0 text-violet-400"
3859
+ }, undefined, false, undefined, this),
3860
+ "All standard generators included"
3861
+ ]
3862
+ }, undefined, true, undefined, this),
3863
+ /* @__PURE__ */ jsxDEV20("li", {
3864
+ className: "text-muted-foreground flex gap-3 text-sm",
3865
+ children: [
3866
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3867
+ size: 16,
3868
+ className: "mt-0.5 shrink-0 text-violet-400"
3869
+ }, undefined, false, undefined, this),
3870
+ "Run in your own CI/CD"
3871
+ ]
3872
+ }, undefined, true, undefined, this),
3873
+ /* @__PURE__ */ jsxDEV20("li", {
3874
+ className: "text-muted-foreground flex gap-3 text-sm",
3875
+ children: [
3876
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3877
+ size: 16,
3878
+ className: "mt-0.5 shrink-0 text-violet-400"
3879
+ }, undefined, false, undefined, this),
3880
+ "Community support"
3881
+ ]
3882
+ }, undefined, true, undefined, this)
3883
+ ]
3884
+ }, undefined, true, undefined, this)
3885
+ ]
3886
+ }, undefined, true, undefined, this),
3887
+ /* @__PURE__ */ jsxDEV20(Link2, {
3888
+ href: "/install",
3889
+ className: "btn-ghost w-full",
3890
+ children: "Install now"
3891
+ }, undefined, false, undefined, this)
3892
+ ]
3893
+ }, undefined, true, undefined, this),
3894
+ /* @__PURE__ */ jsxDEV20("div", {
3895
+ className: "card-subtle relative space-y-6 bg-violet-500/5 p-6 ring-2 ring-violet-500",
3896
+ children: [
3897
+ /* @__PURE__ */ jsxDEV20("div", {
3898
+ className: "absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-violet-500 px-3 py-1 text-xs font-medium text-white",
3899
+ children: "Current"
3900
+ }, undefined, false, undefined, this),
3901
+ /* @__PURE__ */ jsxDEV20("div", {
3902
+ className: "space-y-2",
3903
+ children: [
3904
+ /* @__PURE__ */ jsxDEV20("h2", {
3905
+ className: "text-2xl font-bold",
3906
+ children: "Design Partner"
3907
+ }, undefined, false, undefined, this),
3908
+ /* @__PURE__ */ jsxDEV20("div", {
3909
+ className: "space-y-1",
3910
+ children: [
3911
+ /* @__PURE__ */ jsxDEV20("div", {
3912
+ className: "text-2xl font-bold",
3913
+ children: "Free during early access"
3914
+ }, undefined, false, undefined, this),
3915
+ /* @__PURE__ */ jsxDEV20("p", {
3916
+ className: "text-muted-foreground text-xs",
3917
+ children: "Founding discount when paid plans launch"
3918
+ }, undefined, false, undefined, this)
3919
+ ]
3920
+ }, undefined, true, undefined, this)
3921
+ ]
3922
+ }, undefined, true, undefined, this),
3923
+ /* @__PURE__ */ jsxDEV20("ul", {
3924
+ className: "space-y-3",
3925
+ children: [
3926
+ /* @__PURE__ */ jsxDEV20("li", {
3927
+ className: "text-muted-foreground flex gap-3 text-sm",
3928
+ children: [
3929
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3930
+ size: 16,
3931
+ className: "mt-0.5 shrink-0 text-violet-400"
3932
+ }, undefined, false, undefined, this),
3933
+ "Use ContractSpec Studio for real projects during early access"
3934
+ ]
3935
+ }, undefined, true, undefined, this),
3936
+ /* @__PURE__ */ jsxDEV20("li", {
3937
+ className: "text-muted-foreground flex gap-3 text-sm",
3938
+ children: [
3939
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3940
+ size: 16,
3941
+ className: "mt-0.5 shrink-0 text-violet-400"
3942
+ }, undefined, false, undefined, this),
3943
+ "Work directly with the founder on architecture & use cases"
3944
+ ]
3945
+ }, undefined, true, undefined, this),
3946
+ /* @__PURE__ */ jsxDEV20("li", {
3947
+ className: "text-muted-foreground flex gap-3 text-sm",
3948
+ children: [
3949
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3950
+ size: 16,
3951
+ className: "mt-0.5 shrink-0 text-violet-400"
3952
+ }, undefined, false, undefined, this),
3953
+ 'Reasonable "fair use" limits on regenerations and AI credits'
3954
+ ]
3955
+ }, undefined, true, undefined, this),
3956
+ /* @__PURE__ */ jsxDEV20("li", {
3957
+ className: "text-muted-foreground flex gap-3 text-sm",
3958
+ children: [
3959
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
3960
+ size: 16,
3961
+ className: "mt-0.5 shrink-0 text-violet-400"
3962
+ }, undefined, false, undefined, this),
3963
+ "Priority support & feedback loops"
3964
+ ]
3965
+ }, undefined, true, undefined, this)
3966
+ ]
3967
+ }, undefined, true, undefined, this),
3968
+ /* @__PURE__ */ jsxDEV20("button", {
3969
+ onClick: scrollToWaitlist,
3970
+ className: "btn-primary w-full",
3971
+ children: "Apply as a design partner"
3972
+ }, undefined, false, undefined, this)
3973
+ ]
3974
+ }, undefined, true, undefined, this),
3975
+ /* @__PURE__ */ jsxDEV20("div", {
3976
+ className: "card-subtle relative space-y-6 p-6",
3977
+ children: [
3978
+ /* @__PURE__ */ jsxDEV20("div", {
3979
+ className: "bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium",
3980
+ children: "Coming soon"
3981
+ }, undefined, false, undefined, this),
3982
+ /* @__PURE__ */ jsxDEV20("div", {
3983
+ className: "space-y-2",
3984
+ children: [
3985
+ /* @__PURE__ */ jsxDEV20("h2", {
3986
+ className: "text-2xl font-bold",
3987
+ children: "Builder"
3988
+ }, undefined, false, undefined, this),
3989
+ /* @__PURE__ */ jsxDEV20("div", {
3990
+ className: "space-y-1",
3991
+ children: /* @__PURE__ */ jsxDEV20("div", {
3992
+ className: "text-2xl font-bold",
3993
+ children: "Usage-based, for solo builders and small teams"
3994
+ }, undefined, false, undefined, this)
3995
+ }, undefined, false, undefined, this)
3996
+ ]
3997
+ }, undefined, true, undefined, this),
3998
+ /* @__PURE__ */ jsxDEV20("p", {
3999
+ className: "text-muted-foreground text-sm",
4000
+ children: "Pay only for what you regenerate and the AI you consume. No seat-based pricing, and a generous free tier for experiments."
4001
+ }, undefined, false, undefined, this),
4002
+ /* @__PURE__ */ jsxDEV20("ul", {
4003
+ className: "space-y-2",
4004
+ children: [
4005
+ /* @__PURE__ */ jsxDEV20("li", {
4006
+ className: "text-muted-foreground text-sm",
4007
+ children: "1–3 projects"
4008
+ }, undefined, false, undefined, this),
4009
+ /* @__PURE__ */ jsxDEV20("li", {
4010
+ className: "text-muted-foreground text-sm",
4011
+ children: "Generous monthly free regenerations"
4012
+ }, undefined, false, undefined, this),
4013
+ /* @__PURE__ */ jsxDEV20("li", {
4014
+ className: "text-muted-foreground text-sm",
4015
+ children: "Pay-as-you-go beyond the free tier"
4016
+ }, undefined, false, undefined, this)
4017
+ ]
4018
+ }, undefined, true, undefined, this),
4019
+ /* @__PURE__ */ jsxDEV20("button", {
4020
+ disabled: true,
4021
+ className: "btn-ghost w-full cursor-not-allowed opacity-50",
4022
+ children: "Available after public launch"
4023
+ }, undefined, false, undefined, this)
4024
+ ]
4025
+ }, undefined, true, undefined, this),
4026
+ /* @__PURE__ */ jsxDEV20("div", {
4027
+ className: "card-subtle relative space-y-6 p-6",
4028
+ children: [
4029
+ /* @__PURE__ */ jsxDEV20("div", {
4030
+ className: "bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium",
4031
+ children: "Coming soon"
4032
+ }, undefined, false, undefined, this),
4033
+ /* @__PURE__ */ jsxDEV20("div", {
4034
+ className: "space-y-2",
4035
+ children: [
4036
+ /* @__PURE__ */ jsxDEV20("h2", {
4037
+ className: "text-2xl font-bold",
4038
+ children: "Team & Platform"
4039
+ }, undefined, false, undefined, this),
4040
+ /* @__PURE__ */ jsxDEV20("div", {
4041
+ className: "space-y-1",
4042
+ children: /* @__PURE__ */ jsxDEV20("div", {
4043
+ className: "text-2xl font-bold",
4044
+ children: "Custom, for teams standardizing on ContractSpec"
4045
+ }, undefined, false, undefined, this)
4046
+ }, undefined, false, undefined, this)
4047
+ ]
4048
+ }, undefined, true, undefined, this),
4049
+ /* @__PURE__ */ jsxDEV20("p", {
4050
+ className: "text-muted-foreground text-sm",
4051
+ children: "For teams running multiple apps or platforms on ContractSpec, with stricter governance, data, and compliance needs."
4052
+ }, undefined, false, undefined, this),
4053
+ /* @__PURE__ */ jsxDEV20("ul", {
4054
+ className: "space-y-3",
4055
+ children: [
4056
+ /* @__PURE__ */ jsxDEV20("li", {
4057
+ className: "text-muted-foreground flex gap-3 text-sm",
4058
+ children: [
4059
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
4060
+ size: 16,
4061
+ className: "mt-0.5 shrink-0 text-violet-400"
4062
+ }, undefined, false, undefined, this),
4063
+ "Multiple projects and environments"
4064
+ ]
4065
+ }, undefined, true, undefined, this),
4066
+ /* @__PURE__ */ jsxDEV20("li", {
4067
+ className: "text-muted-foreground flex gap-3 text-sm",
4068
+ children: [
4069
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
4070
+ size: 16,
4071
+ className: "mt-0.5 shrink-0 text-violet-400"
4072
+ }, undefined, false, undefined, this),
4073
+ "Advanced RBAC and policy packs"
4074
+ ]
4075
+ }, undefined, true, undefined, this),
4076
+ /* @__PURE__ */ jsxDEV20("li", {
4077
+ className: "text-muted-foreground flex gap-3 text-sm",
4078
+ children: [
4079
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
4080
+ size: 16,
4081
+ className: "mt-0.5 shrink-0 text-violet-400"
4082
+ }, undefined, false, undefined, this),
4083
+ "SSO, audit trails, and longer retention"
4084
+ ]
4085
+ }, undefined, true, undefined, this),
4086
+ /* @__PURE__ */ jsxDEV20("li", {
4087
+ className: "text-muted-foreground flex gap-3 text-sm",
4088
+ children: [
4089
+ /* @__PURE__ */ jsxDEV20(CheckCircle5, {
4090
+ size: 16,
4091
+ className: "mt-0.5 shrink-0 text-violet-400"
4092
+ }, undefined, false, undefined, this),
4093
+ "Priority support & SLAs"
4094
+ ]
4095
+ }, undefined, true, undefined, this)
4096
+ ]
4097
+ }, undefined, true, undefined, this),
4098
+ /* @__PURE__ */ jsxDEV20(Link2, {
4099
+ href: "/contact",
4100
+ className: "btn-ghost w-full",
4101
+ children: "Talk to us"
4102
+ }, undefined, false, undefined, this)
4103
+ ]
4104
+ }, undefined, true, undefined, this)
4105
+ ]
4106
+ }, undefined, true, undefined, this)
4107
+ }, undefined, false, undefined, this)
4108
+ }, undefined, false, undefined, this),
4109
+ /* @__PURE__ */ jsxDEV20("section", {
4110
+ className: "section-padding border-border bg-muted/20 border-b",
4111
+ children: /* @__PURE__ */ jsxDEV20("div", {
4112
+ className: "mx-auto max-w-4xl space-y-8",
4113
+ children: [
4114
+ /* @__PURE__ */ jsxDEV20("div", {
4115
+ className: "space-y-4 text-center",
4116
+ children: [
4117
+ /* @__PURE__ */ jsxDEV20("h2", {
4118
+ className: "text-3xl font-bold",
4119
+ children: "How ContractSpec pricing will work"
4120
+ }, undefined, false, undefined, this),
4121
+ /* @__PURE__ */ jsxDEV20("p", {
4122
+ className: "text-muted-foreground mx-auto max-w-2xl text-lg",
4123
+ children: "We charge based on how much of your stack we help you maintain, not how many people click around in the UI."
4124
+ }, undefined, false, undefined, this)
4125
+ ]
4126
+ }, undefined, true, undefined, this),
4127
+ /* @__PURE__ */ jsxDEV20("div", {
4128
+ className: "grid gap-6 md:grid-cols-3",
4129
+ children: [
4130
+ /* @__PURE__ */ jsxDEV20("div", {
4131
+ className: "card-subtle space-y-3 p-6",
4132
+ children: [
4133
+ /* @__PURE__ */ jsxDEV20("h3", {
4134
+ className: "font-bold",
4135
+ children: "Generous free tier"
4136
+ }, undefined, false, undefined, this),
4137
+ /* @__PURE__ */ jsxDEV20("p", {
4138
+ className: "text-muted-foreground text-sm",
4139
+ children: "One serious project, small spec, and enough monthly regenerations to ship something real."
4140
+ }, undefined, false, undefined, this)
4141
+ ]
4142
+ }, undefined, true, undefined, this),
4143
+ /* @__PURE__ */ jsxDEV20("div", {
4144
+ className: "card-subtle space-y-3 p-6",
4145
+ children: [
4146
+ /* @__PURE__ */ jsxDEV20("h3", {
4147
+ className: "font-bold",
4148
+ children: "Usage-based beyond free"
4149
+ }, undefined, false, undefined, this),
4150
+ /* @__PURE__ */ jsxDEV20("p", {
4151
+ className: "text-muted-foreground text-sm",
4152
+ children: "You pay for regenerations and AI agent actions, not per-seat. The more your system evolves via ContractSpec, the more you pay."
4153
+ }, undefined, false, undefined, this)
4154
+ ]
4155
+ }, undefined, true, undefined, this),
4156
+ /* @__PURE__ */ jsxDEV20("div", {
4157
+ className: "card-subtle space-y-3 p-6",
4158
+ children: [
4159
+ /* @__PURE__ */ jsxDEV20("h3", {
4160
+ className: "font-bold",
4161
+ children: "No lock-in"
4162
+ }, undefined, false, undefined, this),
4163
+ /* @__PURE__ */ jsxDEV20("p", {
4164
+ className: "text-muted-foreground text-sm",
4165
+ children: "Generated code is standard, readable, and exportable. If you leave, your app keeps running."
4166
+ }, undefined, false, undefined, this)
4167
+ ]
4168
+ }, undefined, true, undefined, this)
4169
+ ]
4170
+ }, undefined, true, undefined, this),
4171
+ /* @__PURE__ */ jsxDEV20("div", {
4172
+ className: "pt-6 text-center",
4173
+ children: /* @__PURE__ */ jsxDEV20("button", {
4174
+ onClick: () => setPricingModalOpen(true),
4175
+ className: "btn-ghost",
4176
+ children: "View our tentative pricing model"
4177
+ }, undefined, false, undefined, this)
4178
+ }, undefined, false, undefined, this)
4179
+ ]
4180
+ }, undefined, true, undefined, this)
4181
+ }, undefined, false, undefined, this),
4182
+ /* @__PURE__ */ jsxDEV20("section", {
4183
+ className: "section-padding border-border border-b",
4184
+ children: /* @__PURE__ */ jsxDEV20("div", {
4185
+ className: "mx-auto max-w-3xl space-y-8",
4186
+ children: [
4187
+ /* @__PURE__ */ jsxDEV20("h2", {
4188
+ className: "text-center text-3xl font-bold",
4189
+ children: "Frequently asked questions"
4190
+ }, undefined, false, undefined, this),
4191
+ /* @__PURE__ */ jsxDEV20("div", {
4192
+ className: "space-y-4",
4193
+ children: faqs.map((faq, i) => /* @__PURE__ */ jsxDEV20("div", {
4194
+ className: "card-subtle overflow-hidden",
4195
+ children: [
4196
+ /* @__PURE__ */ jsxDEV20("button", {
4197
+ onClick: () => setOpenFaq(openFaq === i ? null : i),
4198
+ className: "flex w-full items-center justify-between p-6 text-left",
4199
+ children: [
4200
+ /* @__PURE__ */ jsxDEV20("span", {
4201
+ className: "font-medium",
4202
+ children: faq.question
4203
+ }, undefined, false, undefined, this),
4204
+ /* @__PURE__ */ jsxDEV20(ChevronDown, {
4205
+ size: 20,
4206
+ className: `text-muted-foreground transition-transform ${openFaq === i ? "rotate-180" : ""}`
4207
+ }, undefined, false, undefined, this)
4208
+ ]
4209
+ }, undefined, true, undefined, this),
4210
+ openFaq === i && /* @__PURE__ */ jsxDEV20("div", {
4211
+ className: "text-muted-foreground px-6 pb-6 text-sm",
4212
+ children: faq.answer
4213
+ }, undefined, false, undefined, this)
4214
+ ]
4215
+ }, i, true, undefined, this))
4216
+ }, undefined, false, undefined, this),
4217
+ /* @__PURE__ */ jsxDEV20("div", {
4218
+ className: "pt-4 text-center",
4219
+ children: [
4220
+ /* @__PURE__ */ jsxDEV20("p", {
4221
+ className: "text-muted-foreground mb-2 text-sm",
4222
+ children: "Still unsure?"
4223
+ }, undefined, false, undefined, this),
4224
+ /* @__PURE__ */ jsxDEV20(Link2, {
4225
+ href: "/contact",
4226
+ className: "text-sm font-medium text-violet-400 hover:text-violet-300",
4227
+ children: "Contact us →"
4228
+ }, undefined, false, undefined, this)
4229
+ ]
4230
+ }, undefined, true, undefined, this)
4231
+ ]
4232
+ }, undefined, true, undefined, this)
4233
+ }, undefined, false, undefined, this),
4234
+ /* @__PURE__ */ jsxDEV20("section", {
4235
+ className: "section-padding hero-gradient",
4236
+ children: /* @__PURE__ */ jsxDEV20("div", {
4237
+ className: "mx-auto max-w-4xl",
4238
+ children: /* @__PURE__ */ jsxDEV20(WaitlistSection, {}, undefined, false, undefined, this)
4239
+ }, undefined, false, undefined, this)
4240
+ }, undefined, false, undefined, this),
4241
+ /* @__PURE__ */ jsxDEV20(PricingThinkingModal, {
4242
+ open: pricingModalOpen,
4243
+ onOpenChange: setPricingModalOpen,
4244
+ onApplyClick: scrollToWaitlist
4245
+ }, undefined, false, undefined, this)
4246
+ ]
4247
+ }, undefined, true, undefined, this);
4248
+ }
4249
+
4250
+ // src/components/marketing/ProductClientPage.tsx
4251
+ import Link3 from "@contractspec/lib.ui-link";
4252
+ import {
4253
+ analyticsEventNames as analyticsEventNames3,
4254
+ captureAnalyticsEvent as captureAnalyticsEvent3
4255
+ } from "@contractspec/bundle.library/libs/posthog/client";
4256
+ import {
4257
+ CheckCircle as CheckCircle6,
4258
+ ChevronRight as ChevronRight4,
4259
+ Database,
4260
+ FileCode as FileCode2,
4261
+ GitBranch,
4262
+ Layers as Layers3,
4263
+ RefreshCw as RefreshCw3,
4264
+ Shield as Shield2,
4265
+ Unlock as Unlock2,
4266
+ Zap as Zap2
4267
+ } from "lucide-react";
4268
+ import { jsxDEV as jsxDEV21 } from "react/jsx-dev-runtime";
4269
+ "use client";
4270
+ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
4271
+ className: "",
4272
+ children: [
4273
+ /* @__PURE__ */ jsxDEV21("section", {
4274
+ className: "section-padding hero-gradient relative",
4275
+ children: /* @__PURE__ */ jsxDEV21("div", {
4276
+ className: "mx-auto max-w-4xl space-y-6 text-center",
4277
+ children: [
4278
+ /* @__PURE__ */ jsxDEV21("h1", {
4279
+ className: "text-5xl leading-tight font-bold md:text-6xl",
4280
+ children: "Compiler for AI-coded systems"
4281
+ }, undefined, false, undefined, this),
4282
+ /* @__PURE__ */ jsxDEV21("p", {
4283
+ className: "text-muted-foreground mx-auto max-w-2xl text-lg",
4284
+ children: "Define contracts once. Generate consistent code across API, DB, UI, and events. Regenerate safely anytime. No lock-in."
4285
+ }, undefined, false, undefined, this),
4286
+ /* @__PURE__ */ jsxDEV21("div", {
4287
+ className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
4288
+ children: [
4289
+ /* @__PURE__ */ jsxDEV21(Link3, {
4290
+ href: "/install",
4291
+ onClick: () => captureAnalyticsEvent3(analyticsEventNames3.CTA_INSTALL_CLICK, {
4292
+ surface: "product-hero"
4293
+ }),
4294
+ className: "btn-primary inline-flex items-center gap-2",
4295
+ children: [
4296
+ "Install OSS Core ",
4297
+ /* @__PURE__ */ jsxDEV21(ChevronRight4, {
4298
+ size: 16
4299
+ }, undefined, false, undefined, this)
4300
+ ]
4301
+ }, undefined, true, undefined, this),
4302
+ /* @__PURE__ */ jsxDEV21(Link3, {
4303
+ href: "/pricing",
4304
+ className: "btn-ghost",
4305
+ children: "View pricing"
4306
+ }, undefined, false, undefined, this)
4307
+ ]
4308
+ }, undefined, true, undefined, this)
4309
+ ]
4310
+ }, undefined, true, undefined, this)
4311
+ }, undefined, false, undefined, this),
4312
+ /* @__PURE__ */ jsxDEV21("section", {
4313
+ className: "section-padding border-border border-b",
4314
+ children: /* @__PURE__ */ jsxDEV21("div", {
4315
+ className: "mx-auto max-w-4xl space-y-8",
4316
+ children: [
4317
+ /* @__PURE__ */ jsxDEV21("div", {
4318
+ className: "space-y-4",
4319
+ children: [
4320
+ /* @__PURE__ */ jsxDEV21("div", {
4321
+ className: "inline-flex items-center gap-2 rounded-full border border-blue-500/20 bg-blue-500/10 px-3 py-1",
4322
+ children: [
4323
+ /* @__PURE__ */ jsxDEV21(Layers3, {
4324
+ size: 16,
4325
+ className: "text-blue-400"
4326
+ }, undefined, false, undefined, this),
4327
+ /* @__PURE__ */ jsxDEV21("span", {
4328
+ className: "text-sm font-medium text-blue-300",
4329
+ children: "Multi-Surface Consistency"
4330
+ }, undefined, false, undefined, this)
4331
+ ]
4332
+ }, undefined, true, undefined, this),
4333
+ /* @__PURE__ */ jsxDEV21("h2", {
4334
+ className: "text-3xl font-bold md:text-4xl",
4335
+ children: "One contract, all surfaces in sync"
4336
+ }, undefined, false, undefined, this),
4337
+ /* @__PURE__ */ jsxDEV21("p", {
4338
+ className: "text-muted-foreground text-lg",
4339
+ children: "Stop chasing drift between your API, database, UI, and events. One spec generates all outputs, guaranteed to stay consistent."
4340
+ }, undefined, false, undefined, this)
4341
+ ]
4342
+ }, undefined, true, undefined, this),
4343
+ /* @__PURE__ */ jsxDEV21("div", {
4344
+ className: "grid gap-6 md:grid-cols-2",
4345
+ children: [
4346
+ {
4347
+ title: "REST & GraphQL API",
4348
+ description: "Type-safe endpoints with validation. Standard Express, Hono, Elysia, or Apollo handlers.",
4349
+ icon: Zap2
4350
+ },
4351
+ {
4352
+ title: "Database Schema",
4353
+ description: "Prisma migrations and types generated from the same spec. Always in sync with your API.",
4354
+ icon: Database
4355
+ },
4356
+ {
4357
+ title: "UI Components",
4358
+ description: "React forms and views derived from specs. Validation and types flow through automatically.",
4359
+ icon: FileCode2
4360
+ },
4361
+ {
4362
+ title: "MCP Tools & Events",
4363
+ description: "AI agent tool definitions and event schemas. Same contract, different surfaces.",
4364
+ icon: GitBranch
4365
+ }
4366
+ ].map((item, i) => /* @__PURE__ */ jsxDEV21("div", {
4367
+ className: "card-subtle space-y-4 p-6",
4368
+ children: [
4369
+ /* @__PURE__ */ jsxDEV21(item.icon, {
4370
+ className: "text-blue-400",
4371
+ size: 24
4372
+ }, undefined, false, undefined, this),
4373
+ /* @__PURE__ */ jsxDEV21("h3", {
4374
+ className: "text-lg font-bold",
4375
+ children: item.title
4376
+ }, undefined, false, undefined, this),
4377
+ /* @__PURE__ */ jsxDEV21("p", {
4378
+ className: "text-muted-foreground text-sm",
4379
+ children: item.description
4380
+ }, undefined, false, undefined, this)
4381
+ ]
4382
+ }, i, true, undefined, this))
4383
+ }, undefined, false, undefined, this)
4384
+ ]
4385
+ }, undefined, true, undefined, this)
4386
+ }, undefined, false, undefined, this),
4387
+ /* @__PURE__ */ jsxDEV21("section", {
4388
+ className: "section-padding border-border bg-muted/20 border-b",
4389
+ children: /* @__PURE__ */ jsxDEV21("div", {
4390
+ className: "mx-auto max-w-4xl space-y-8",
4391
+ children: [
4392
+ /* @__PURE__ */ jsxDEV21("div", {
4393
+ className: "space-y-4",
4394
+ children: [
4395
+ /* @__PURE__ */ jsxDEV21("div", {
4396
+ className: "inline-flex items-center gap-2 rounded-full border border-emerald-500/20 bg-emerald-500/10 px-3 py-1",
4397
+ children: [
4398
+ /* @__PURE__ */ jsxDEV21(RefreshCw3, {
4399
+ size: 16,
4400
+ className: "text-emerald-400"
4401
+ }, undefined, false, undefined, this),
4402
+ /* @__PURE__ */ jsxDEV21("span", {
4403
+ className: "text-sm font-medium text-emerald-300",
4404
+ children: "Safe Regeneration"
4405
+ }, undefined, false, undefined, this)
4406
+ ]
4407
+ }, undefined, true, undefined, this),
4408
+ /* @__PURE__ */ jsxDEV21("h2", {
4409
+ className: "text-3xl font-bold md:text-4xl",
4410
+ children: "Regenerate anytime without fear"
4411
+ }, undefined, false, undefined, this),
4412
+ /* @__PURE__ */ jsxDEV21("p", {
4413
+ className: "text-muted-foreground text-lg",
4414
+ children: "Contracts enforce invariants. Breaking changes are caught at compile time, not production. Regenerate with confidence."
4415
+ }, undefined, false, undefined, this)
4416
+ ]
4417
+ }, undefined, true, undefined, this),
4418
+ /* @__PURE__ */ jsxDEV21("div", {
4419
+ className: "grid gap-6 md:grid-cols-2",
4420
+ children: [
4421
+ /* @__PURE__ */ jsxDEV21("div", {
4422
+ className: "card-subtle space-y-4 p-6",
4423
+ children: [
4424
+ /* @__PURE__ */ jsxDEV21("h3", {
4425
+ className: "font-bold",
4426
+ children: "Spec-First Safety"
4427
+ }, undefined, false, undefined, this),
4428
+ /* @__PURE__ */ jsxDEV21("p", {
4429
+ className: "text-muted-foreground text-sm",
4430
+ children: "AI agents read specs, not implementations. Generated code that violates contracts gets flagged automatically."
4431
+ }, undefined, false, undefined, this),
4432
+ /* @__PURE__ */ jsxDEV21("ul", {
4433
+ className: "text-muted-foreground space-y-2 text-sm",
4434
+ children: [
4435
+ /* @__PURE__ */ jsxDEV21("li", {
4436
+ className: "flex gap-3",
4437
+ children: [
4438
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4439
+ size: 16,
4440
+ className: "mt-0.5 flex-shrink-0 text-emerald-400"
4441
+ }, undefined, false, undefined, this),
4442
+ "Type-safe from spec to runtime"
4443
+ ]
4444
+ }, undefined, true, undefined, this),
4445
+ /* @__PURE__ */ jsxDEV21("li", {
4446
+ className: "flex gap-3",
4447
+ children: [
4448
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4449
+ size: 16,
4450
+ className: "mt-0.5 flex-shrink-0 text-emerald-400"
4451
+ }, undefined, false, undefined, this),
4452
+ "Invariants enforced at compile time"
4453
+ ]
4454
+ }, undefined, true, undefined, this),
4455
+ /* @__PURE__ */ jsxDEV21("li", {
4456
+ className: "flex gap-3",
4457
+ children: [
4458
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4459
+ size: 16,
4460
+ className: "mt-0.5 flex-shrink-0 text-emerald-400"
4461
+ }, undefined, false, undefined, this),
4462
+ "Breaking changes detected early"
4463
+ ]
4464
+ }, undefined, true, undefined, this)
4465
+ ]
4466
+ }, undefined, true, undefined, this)
4467
+ ]
4468
+ }, undefined, true, undefined, this),
4469
+ /* @__PURE__ */ jsxDEV21("div", {
4470
+ className: "card-subtle space-y-4 p-6",
4471
+ children: [
4472
+ /* @__PURE__ */ jsxDEV21("h3", {
4473
+ className: "font-bold",
4474
+ children: "Version Control Built-in"
4475
+ }, undefined, false, undefined, this),
4476
+ /* @__PURE__ */ jsxDEV21("p", {
4477
+ className: "text-muted-foreground text-sm",
4478
+ children: "Every spec change is tracked. Roll back to any previous version. Migrations are explicit and reversible."
4479
+ }, undefined, false, undefined, this),
4480
+ /* @__PURE__ */ jsxDEV21("ul", {
4481
+ className: "text-muted-foreground space-y-2 text-sm",
4482
+ children: [
4483
+ /* @__PURE__ */ jsxDEV21("li", {
4484
+ className: "flex gap-3",
4485
+ children: [
4486
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4487
+ size: 16,
4488
+ className: "mt-0.5 flex-shrink-0 text-emerald-400"
4489
+ }, undefined, false, undefined, this),
4490
+ "Git-native spec history"
4491
+ ]
4492
+ }, undefined, true, undefined, this),
4493
+ /* @__PURE__ */ jsxDEV21("li", {
4494
+ className: "flex gap-3",
4495
+ children: [
4496
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4497
+ size: 16,
4498
+ className: "mt-0.5 flex-shrink-0 text-emerald-400"
4499
+ }, undefined, false, undefined, this),
4500
+ "Explicit migration paths"
4501
+ ]
4502
+ }, undefined, true, undefined, this),
4503
+ /* @__PURE__ */ jsxDEV21("li", {
4504
+ className: "flex gap-3",
4505
+ children: [
4506
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4507
+ size: 16,
4508
+ className: "mt-0.5 flex-shrink-0 text-emerald-400"
4509
+ }, undefined, false, undefined, this),
4510
+ "One-click rollback"
4511
+ ]
4512
+ }, undefined, true, undefined, this)
4513
+ ]
4514
+ }, undefined, true, undefined, this)
4515
+ ]
4516
+ }, undefined, true, undefined, this)
4517
+ ]
4518
+ }, undefined, true, undefined, this)
4519
+ ]
4520
+ }, undefined, true, undefined, this)
4521
+ }, undefined, false, undefined, this),
4522
+ /* @__PURE__ */ jsxDEV21("section", {
4523
+ className: "section-padding border-border border-b",
4524
+ children: /* @__PURE__ */ jsxDEV21("div", {
4525
+ className: "mx-auto max-w-4xl space-y-8",
4526
+ children: [
4527
+ /* @__PURE__ */ jsxDEV21("div", {
4528
+ className: "space-y-4",
4529
+ children: [
4530
+ /* @__PURE__ */ jsxDEV21("div", {
4531
+ className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
4532
+ children: [
4533
+ /* @__PURE__ */ jsxDEV21(Shield2, {
4534
+ size: 16,
4535
+ className: "text-violet-400"
4536
+ }, undefined, false, undefined, this),
4537
+ /* @__PURE__ */ jsxDEV21("span", {
4538
+ className: "text-sm font-medium text-violet-300",
4539
+ children: "Contract Enforcement"
4540
+ }, undefined, false, undefined, this)
4541
+ ]
4542
+ }, undefined, true, undefined, this),
4543
+ /* @__PURE__ */ jsxDEV21("h2", {
4544
+ className: "text-3xl font-bold md:text-4xl",
4545
+ children: "AI governance that actually works"
4546
+ }, undefined, false, undefined, this),
4547
+ /* @__PURE__ */ jsxDEV21("p", {
4548
+ className: "text-muted-foreground text-lg",
4549
+ children: "Constrain what AI agents can change. Enforce contracts they must respect. No more hallucinated refactors breaking your system."
4550
+ }, undefined, false, undefined, this)
4551
+ ]
4552
+ }, undefined, true, undefined, this),
4553
+ /* @__PURE__ */ jsxDEV21("div", {
4554
+ className: "card-subtle space-y-6 p-6",
4555
+ children: [
4556
+ /* @__PURE__ */ jsxDEV21("div", {
4557
+ className: "space-y-4",
4558
+ children: [
4559
+ /* @__PURE__ */ jsxDEV21("h3", {
4560
+ className: "font-bold",
4561
+ children: "How contract enforcement works"
4562
+ }, undefined, false, undefined, this),
4563
+ /* @__PURE__ */ jsxDEV21("p", {
4564
+ className: "text-muted-foreground text-sm",
4565
+ 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."
4566
+ }, undefined, false, undefined, this)
4567
+ ]
4568
+ }, undefined, true, undefined, this),
4569
+ /* @__PURE__ */ jsxDEV21("div", {
4570
+ className: "grid gap-4 md:grid-cols-3",
4571
+ children: [
4572
+ {
4573
+ title: "Define",
4574
+ description: "Write specs in TypeScript. Define inputs, outputs, and invariants."
4575
+ },
4576
+ {
4577
+ title: "Generate",
4578
+ description: "ContractSpec generates code across all surfaces from your specs."
4579
+ },
4580
+ {
4581
+ title: "Enforce",
4582
+ description: "Any code that violates specs is flagged. AI agents can't break contracts."
4583
+ }
4584
+ ].map((step, i) => /* @__PURE__ */ jsxDEV21("div", {
4585
+ className: "space-y-2",
4586
+ children: [
4587
+ /* @__PURE__ */ jsxDEV21("div", {
4588
+ className: "flex h-8 w-8 items-center justify-center rounded-lg bg-violet-500/20",
4589
+ children: /* @__PURE__ */ jsxDEV21("div", {
4590
+ className: "text-sm font-bold text-violet-400",
4591
+ children: i + 1
4592
+ }, undefined, false, undefined, this)
4593
+ }, undefined, false, undefined, this),
4594
+ /* @__PURE__ */ jsxDEV21("h4", {
4595
+ className: "text-sm font-bold",
4596
+ children: step.title
4597
+ }, undefined, false, undefined, this),
4598
+ /* @__PURE__ */ jsxDEV21("p", {
4599
+ className: "text-muted-foreground text-xs",
4600
+ children: step.description
4601
+ }, undefined, false, undefined, this)
4602
+ ]
4603
+ }, i, true, undefined, this))
4604
+ }, undefined, false, undefined, this)
4605
+ ]
4606
+ }, undefined, true, undefined, this)
4607
+ ]
4608
+ }, undefined, true, undefined, this)
4609
+ }, undefined, false, undefined, this),
4610
+ /* @__PURE__ */ jsxDEV21("section", {
4611
+ className: "section-padding border-border border-b bg-gradient-to-br from-violet-500/10 via-indigo-500/5 to-blue-500/5",
4612
+ children: /* @__PURE__ */ jsxDEV21("div", {
4613
+ className: "mx-auto max-w-4xl space-y-8",
4614
+ children: [
4615
+ /* @__PURE__ */ jsxDEV21("div", {
4616
+ className: "space-y-4",
4617
+ children: [
4618
+ /* @__PURE__ */ jsxDEV21("div", {
4619
+ className: "inline-flex items-center gap-2 rounded-full border border-pink-500/20 bg-pink-500/10 px-3 py-1",
4620
+ children: [
4621
+ /* @__PURE__ */ jsxDEV21(Unlock2, {
4622
+ size: 16,
4623
+ className: "text-pink-400"
4624
+ }, undefined, false, undefined, this),
4625
+ /* @__PURE__ */ jsxDEV21("span", {
4626
+ className: "text-sm font-medium text-pink-300",
4627
+ children: "No Lock-in"
4628
+ }, undefined, false, undefined, this)
4629
+ ]
4630
+ }, undefined, true, undefined, this),
4631
+ /* @__PURE__ */ jsxDEV21("h2", {
4632
+ className: "text-3xl font-bold md:text-4xl",
4633
+ children: "You own everything. Eject anytime."
4634
+ }, undefined, false, undefined, this),
4635
+ /* @__PURE__ */ jsxDEV21("p", {
4636
+ className: "text-muted-foreground text-lg",
4637
+ children: "ContractSpec is a compiler, not a prison. The generated code is yours: standard TypeScript, standard SQL, standard GraphQL."
4638
+ }, undefined, false, undefined, this)
4639
+ ]
4640
+ }, undefined, true, undefined, this),
4641
+ /* @__PURE__ */ jsxDEV21("div", {
4642
+ className: "grid gap-6 md:grid-cols-2",
4643
+ children: [
4644
+ /* @__PURE__ */ jsxDEV21("div", {
4645
+ className: "card-subtle space-y-4 p-6",
4646
+ children: [
4647
+ /* @__PURE__ */ jsxDEV21("h3", {
4648
+ className: "text-lg font-bold",
4649
+ children: "Standard Tech Output"
4650
+ }, undefined, false, undefined, this),
4651
+ /* @__PURE__ */ jsxDEV21("ul", {
4652
+ className: "text-muted-foreground space-y-3 text-sm",
4653
+ children: [
4654
+ "TypeScript you can read and modify",
4655
+ "Prisma migrations you can run manually",
4656
+ "GraphQL schemas you can serve anywhere",
4657
+ "React components with no magic",
4658
+ "REST handlers that work with any framework"
4659
+ ].map((item, i) => /* @__PURE__ */ jsxDEV21("li", {
4660
+ className: "flex gap-3",
4661
+ children: [
4662
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4663
+ size: 16,
4664
+ className: "mt-0.5 flex-shrink-0 text-pink-400"
4665
+ }, undefined, false, undefined, this),
4666
+ item
4667
+ ]
4668
+ }, i, true, undefined, this))
4669
+ }, undefined, false, undefined, this)
4670
+ ]
4671
+ }, undefined, true, undefined, this),
4672
+ /* @__PURE__ */ jsxDEV21("div", {
4673
+ className: "card-subtle space-y-4 p-6",
4674
+ children: [
4675
+ /* @__PURE__ */ jsxDEV21("h3", {
4676
+ className: "text-lg font-bold",
4677
+ children: "No Proprietary Dependencies"
4678
+ }, undefined, false, undefined, this),
4679
+ /* @__PURE__ */ jsxDEV21("ul", {
4680
+ className: "text-muted-foreground space-y-3 text-sm",
4681
+ children: [
4682
+ "No runtime library required",
4683
+ "No vendor-specific abstractions",
4684
+ "Works with your existing CI/CD",
4685
+ "Eject anytime, keep everything",
4686
+ "Open spec format"
4687
+ ].map((item, i) => /* @__PURE__ */ jsxDEV21("li", {
4688
+ className: "flex gap-3",
4689
+ children: [
4690
+ /* @__PURE__ */ jsxDEV21(CheckCircle6, {
4691
+ size: 16,
4692
+ className: "mt-0.5 flex-shrink-0 text-pink-400"
4693
+ }, undefined, false, undefined, this),
4694
+ item
4695
+ ]
4696
+ }, i, true, undefined, this))
4697
+ }, undefined, false, undefined, this)
4698
+ ]
4699
+ }, undefined, true, undefined, this)
4700
+ ]
4701
+ }, undefined, true, undefined, this),
4702
+ /* @__PURE__ */ jsxDEV21("div", {
4703
+ className: "pt-4 text-center",
4704
+ children: /* @__PURE__ */ jsxDEV21("p", {
4705
+ className: "text-muted-foreground mb-4 text-sm",
4706
+ children: [
4707
+ "Like TypeScript compiles to JavaScript, ContractSpec compiles to standard code.",
4708
+ /* @__PURE__ */ jsxDEV21("br", {}, undefined, false, undefined, this),
4709
+ /* @__PURE__ */ jsxDEV21("span", {
4710
+ className: "font-medium text-violet-400",
4711
+ children: "We're the compiler, not the prison."
4712
+ }, undefined, false, undefined, this)
4713
+ ]
4714
+ }, undefined, true, undefined, this)
4715
+ }, undefined, false, undefined, this)
4716
+ ]
4717
+ }, undefined, true, undefined, this)
4718
+ }, undefined, false, undefined, this),
4719
+ /* @__PURE__ */ jsxDEV21("section", {
4720
+ className: "section-padding border-border border-b",
4721
+ children: /* @__PURE__ */ jsxDEV21("div", {
4722
+ className: "mx-auto max-w-4xl space-y-8",
4723
+ children: [
4724
+ /* @__PURE__ */ jsxDEV21("h2", {
4725
+ className: "text-center text-3xl font-bold md:text-4xl",
4726
+ children: "Start small. Expand gradually."
4727
+ }, undefined, false, undefined, this),
4728
+ /* @__PURE__ */ jsxDEV21("p", {
4729
+ className: "text-muted-foreground mx-auto max-w-2xl text-center text-lg",
4730
+ children: "You don't rewrite your app. You stabilize one module at a time. Start with one endpoint, prove value, then expand."
4731
+ }, undefined, false, undefined, this),
4732
+ /* @__PURE__ */ jsxDEV21("div", {
4733
+ className: "grid gap-6 md:grid-cols-3",
4734
+ children: [
4735
+ {
4736
+ title: "Day 1",
4737
+ description: "Pick one API endpoint. Write a spec. See what gets generated."
4738
+ },
4739
+ {
4740
+ title: "Week 1",
4741
+ description: "Add a few more specs. Compare generated code to existing code."
4742
+ },
4743
+ {
4744
+ title: "Month 1",
4745
+ description: "Migrate a full module. Enjoy multi-surface consistency."
4746
+ }
4747
+ ].map((item, i) => /* @__PURE__ */ jsxDEV21("div", {
4748
+ className: "card-subtle space-y-4 p-6 text-center",
4749
+ children: [
4750
+ /* @__PURE__ */ jsxDEV21("div", {
4751
+ className: "text-2xl font-bold text-violet-400",
4752
+ children: item.title
4753
+ }, undefined, false, undefined, this),
4754
+ /* @__PURE__ */ jsxDEV21("p", {
4755
+ className: "text-muted-foreground text-sm",
4756
+ children: item.description
4757
+ }, undefined, false, undefined, this)
4758
+ ]
4759
+ }, i, true, undefined, this))
4760
+ }, undefined, false, undefined, this)
4761
+ ]
4762
+ }, undefined, true, undefined, this)
4763
+ }, undefined, false, undefined, this),
4764
+ /* @__PURE__ */ jsxDEV21("section", {
4765
+ className: "section-padding hero-gradient",
4766
+ children: /* @__PURE__ */ jsxDEV21("div", {
4767
+ className: "mx-auto max-w-4xl space-y-6 text-center",
4768
+ children: [
4769
+ /* @__PURE__ */ jsxDEV21("h2", {
4770
+ className: "text-3xl font-bold md:text-4xl",
4771
+ children: "Ready to stabilize your AI-generated code?"
4772
+ }, undefined, false, undefined, this),
4773
+ /* @__PURE__ */ jsxDEV21("p", {
4774
+ className: "text-muted-foreground text-lg",
4775
+ children: "Start with one module. No big-bang migration. No lock-in."
4776
+ }, undefined, false, undefined, this),
4777
+ /* @__PURE__ */ jsxDEV21("div", {
4778
+ className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
4779
+ children: [
4780
+ /* @__PURE__ */ jsxDEV21(Link3, {
4781
+ href: "/install",
4782
+ className: "btn-primary inline-flex items-center gap-2",
4783
+ children: [
4784
+ "Install OSS Core ",
4785
+ /* @__PURE__ */ jsxDEV21(ChevronRight4, {
4786
+ size: 16
4787
+ }, undefined, false, undefined, this)
4788
+ ]
4789
+ }, undefined, true, undefined, this),
4790
+ /* @__PURE__ */ jsxDEV21(Link3, {
4791
+ href: "/contact#waitlist",
4792
+ className: "btn-ghost",
4793
+ children: "Join Studio Waitlist"
4794
+ }, undefined, false, undefined, this)
4795
+ ]
4796
+ }, undefined, true, undefined, this)
4797
+ ]
4798
+ }, undefined, true, undefined, this)
4799
+ }, undefined, false, undefined, this)
4800
+ ]
4801
+ }, undefined, true, undefined, this);
4802
+ export {
4803
+ WaitlistSection,
4804
+ ProductClientPage,
4805
+ PricingThinkingModal,
4806
+ PricingClient,
4807
+ LandingPage,
4808
+ DesignPartnerPage,
4809
+ ContributePage,
4810
+ ContactClient,
4811
+ CofounderPage,
4812
+ ChangelogPage
4813
+ };