@contractspec/bundle.marketing 3.7.6 → 3.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +84 -84
- package/AGENTS.md +29 -21
- package/README.md +36 -49
- package/dist/browser/components/marketing/ChangelogPage.js +8 -8
- package/dist/browser/components/marketing/CofounderPage.js +167 -523
- package/dist/browser/components/marketing/ContactClient.js +200 -207
- package/dist/browser/components/marketing/ContributePage.js +211 -463
- package/dist/browser/components/marketing/DesignPartnerPage.js +165 -218
- package/dist/browser/components/marketing/LandingPage.js +464 -568
- package/dist/browser/components/marketing/PricingClient.js +213 -839
- package/dist/browser/components/marketing/ProductClientPage.js +265 -463
- package/dist/browser/components/marketing/index.js +2007 -3338
- package/dist/browser/components/marketing/pricing-thinking-modal.js +12 -12
- package/dist/browser/components/marketing/sections/AudienceSection.js +2 -2
- package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/browser/components/marketing/sections/CtaSection.js +3 -3
- package/dist/browser/components/marketing/sections/FearsSection.js +3 -3
- package/dist/browser/components/marketing/sections/HeroMarketingSection.js +6 -6
- package/dist/browser/components/marketing/sections/IconGridSection.js +2 -2
- package/dist/browser/components/marketing/sections/OutputsSection.js +2 -2
- package/dist/browser/components/marketing/sections/ProblemSection.js +2 -2
- package/dist/browser/components/marketing/sections/SolutionSection.js +2 -2
- package/dist/browser/components/marketing/sections/StepsSection.js +4 -4
- package/dist/browser/components/marketing/studio-signup-section.js +25 -41
- package/dist/browser/components/templates/TemplatesClientPage.js +2324 -3578
- package/dist/browser/components/templates/TemplatesPage.js +1 -1
- package/dist/browser/components/templates/TemplatesPreviewModal.js +3 -3
- package/dist/browser/components/templates/index.js +2361 -3615
- package/dist/browser/index.js +2363 -3617
- package/dist/browser/libs/email/client.js +1 -1
- package/dist/browser/libs/email/contact.js +1 -1
- package/dist/browser/libs/email/newsletter.js +1 -1
- package/dist/browser/libs/email/waitlist-application.js +1 -1
- package/dist/browser/libs/email/waitlist.js +1 -1
- package/dist/browser/registry/engine.js +2003 -3334
- package/dist/browser/registry/index.js +2003 -3334
- package/dist/browser/registry/registry-docs.js +2 -2
- package/dist/browser/registry/registry-landing.js +2007 -3338
- package/dist/browser/registry/registry.js +2003 -3334
- package/dist/browser/registry/utils.js +2003 -3334
- package/dist/components/marketing/ChangelogPage.js +8 -8
- package/dist/components/marketing/CofounderPage.js +167 -523
- package/dist/components/marketing/ContactClient.js +200 -207
- package/dist/components/marketing/ContributePage.d.ts +0 -2
- package/dist/components/marketing/ContributePage.js +211 -463
- package/dist/components/marketing/DesignPartnerPage.js +165 -218
- package/dist/components/marketing/LandingPage.js +464 -568
- package/dist/components/marketing/PricingClient.js +213 -839
- package/dist/components/marketing/ProductClientPage.js +265 -463
- package/dist/components/marketing/index.d.ts +5 -5
- package/dist/components/marketing/index.js +2007 -3338
- package/dist/components/marketing/pricing-thinking-modal.js +12 -12
- package/dist/components/marketing/sections/AudienceSection.js +2 -2
- package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/components/marketing/sections/CtaSection.js +3 -3
- package/dist/components/marketing/sections/FearsSection.js +3 -3
- package/dist/components/marketing/sections/HeroMarketingSection.js +6 -6
- package/dist/components/marketing/sections/IconGridSection.d.ts +3 -3
- package/dist/components/marketing/sections/IconGridSection.js +2 -2
- package/dist/components/marketing/sections/OutputsSection.js +2 -2
- package/dist/components/marketing/sections/ProblemSection.js +2 -2
- package/dist/components/marketing/sections/SolutionSection.js +2 -2
- package/dist/components/marketing/sections/StepsSection.js +4 -4
- package/dist/components/marketing/studio-signup-section.js +25 -41
- package/dist/components/templates/TemplatesClientPage.js +2324 -3578
- package/dist/components/templates/TemplatesPage.js +1 -1
- package/dist/components/templates/TemplatesPreviewModal.js +3 -3
- package/dist/components/templates/index.js +2361 -3615
- package/dist/index.js +2363 -3617
- package/dist/libs/email/client.js +1 -1
- package/dist/libs/email/contact.js +1 -1
- package/dist/libs/email/newsletter.js +1 -1
- package/dist/libs/email/waitlist-application.js +1 -1
- package/dist/libs/email/waitlist.js +1 -1
- package/dist/node/components/marketing/ChangelogPage.js +8 -8
- package/dist/node/components/marketing/CofounderPage.js +167 -523
- package/dist/node/components/marketing/ContactClient.js +200 -207
- package/dist/node/components/marketing/ContributePage.js +211 -463
- package/dist/node/components/marketing/DesignPartnerPage.js +165 -218
- package/dist/node/components/marketing/LandingPage.js +464 -568
- package/dist/node/components/marketing/PricingClient.js +213 -839
- package/dist/node/components/marketing/ProductClientPage.js +265 -463
- package/dist/node/components/marketing/index.js +2007 -3338
- package/dist/node/components/marketing/pricing-thinking-modal.js +12 -12
- package/dist/node/components/marketing/sections/AudienceSection.js +2 -2
- package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/node/components/marketing/sections/CtaSection.js +3 -3
- package/dist/node/components/marketing/sections/FearsSection.js +3 -3
- package/dist/node/components/marketing/sections/HeroMarketingSection.js +6 -6
- package/dist/node/components/marketing/sections/IconGridSection.js +2 -2
- package/dist/node/components/marketing/sections/OutputsSection.js +2 -2
- package/dist/node/components/marketing/sections/ProblemSection.js +2 -2
- package/dist/node/components/marketing/sections/SolutionSection.js +2 -2
- package/dist/node/components/marketing/sections/StepsSection.js +4 -4
- package/dist/node/components/marketing/studio-signup-section.js +25 -41
- package/dist/node/components/templates/TemplatesClientPage.js +2324 -3578
- package/dist/node/components/templates/TemplatesPage.js +1 -1
- package/dist/node/components/templates/TemplatesPreviewModal.js +3 -3
- package/dist/node/components/templates/index.js +2361 -3615
- package/dist/node/index.js +2363 -3617
- package/dist/node/libs/email/client.js +1 -1
- package/dist/node/libs/email/contact.js +1 -1
- package/dist/node/libs/email/newsletter.js +1 -1
- package/dist/node/libs/email/waitlist-application.js +1 -1
- package/dist/node/libs/email/waitlist.js +1 -1
- package/dist/node/registry/engine.js +2003 -3334
- package/dist/node/registry/index.js +2003 -3334
- package/dist/node/registry/registry-docs.js +2 -2
- package/dist/node/registry/registry-landing.js +2007 -3338
- package/dist/node/registry/registry.js +2003 -3334
- package/dist/node/registry/utils.js +2003 -3334
- package/dist/registry/engine.js +2003 -3334
- package/dist/registry/index.js +2003 -3334
- package/dist/registry/registry-docs.js +2 -2
- package/dist/registry/registry-landing.js +2007 -3338
- package/dist/registry/registry.js +2003 -3334
- package/dist/registry/utils.js +2003 -3334
- package/package.json +22 -22
- package/src/bundles/MarketingBundle.ts +273 -273
- package/src/components/marketing/ChangelogPage.tsx +72 -100
- package/src/components/marketing/CofounderPage.tsx +120 -384
- package/src/components/marketing/ContactClient.tsx +164 -154
- package/src/components/marketing/ContributePage.tsx +139 -313
- package/src/components/marketing/DesignPartnerPage.tsx +133 -171
- package/src/components/marketing/LandingPage.tsx +353 -25
- package/src/components/marketing/PricingClient.tsx +192 -437
- package/src/components/marketing/ProductClientPage.tsx +255 -377
- package/src/components/marketing/index.ts +5 -5
- package/src/components/marketing/pricing-thinking-modal.tsx +197 -197
- package/src/components/marketing/sections/AudienceSection.tsx +55 -56
- package/src/components/marketing/sections/CorePositioningSection.tsx +37 -37
- package/src/components/marketing/sections/CtaSection.tsx +49 -50
- package/src/components/marketing/sections/DevelopersSection.tsx +26 -27
- package/src/components/marketing/sections/FearsSection.tsx +36 -37
- package/src/components/marketing/sections/HeroMarketingSection.tsx +59 -59
- package/src/components/marketing/sections/IconGridSection.tsx +71 -71
- package/src/components/marketing/sections/OutputsSection.tsx +51 -52
- package/src/components/marketing/sections/ProblemSection.tsx +39 -40
- package/src/components/marketing/sections/SolutionSection.tsx +39 -40
- package/src/components/marketing/sections/StepsSection.tsx +47 -48
- package/src/components/marketing/studio-signup-section.tsx +39 -41
- package/src/components/templates/TemplatesClientPage.tsx +727 -685
- package/src/components/templates/TemplatesPage.tsx +110 -110
- package/src/components/templates/TemplatesPreviewModal.tsx +197 -198
- package/src/index.ts +4 -4
- package/src/libs/email/client.test.ts +81 -81
- package/src/libs/email/client.ts +111 -111
- package/src/libs/email/contact.ts +35 -35
- package/src/libs/email/newsletter.ts +46 -46
- package/src/libs/email/types.ts +29 -29
- package/src/libs/email/utils.ts +5 -5
- package/src/libs/email/waitlist-application.ts +72 -72
- package/src/libs/email/waitlist.ts +46 -46
- package/src/libs/pricing-examples.ts +12 -12
- package/src/registry/engine.ts +16 -16
- package/src/registry/factory.ts +57 -57
- package/src/registry/registry-docs.ts +656 -666
- package/src/registry/registry-landing.ts +94 -95
- package/src/registry/registry.ts +36 -37
- package/src/registry/types.ts +2 -2
- package/src/registry/utils.ts +56 -56
- package/tsconfig.json +11 -11
- package/tsdown.config.js +5 -5
|
@@ -6,621 +6,517 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
|
|
|
6
6
|
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
7
|
});
|
|
8
8
|
|
|
9
|
-
// src/components/marketing/
|
|
10
|
-
import { ButtonLink, MarketingSection } from "@contractspec/lib.design-system";
|
|
9
|
+
// src/components/marketing/LandingPage.tsx
|
|
11
10
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
ArrowRight,
|
|
12
|
+
Blocks,
|
|
13
|
+
Bot,
|
|
14
|
+
Braces,
|
|
15
|
+
ChartColumn,
|
|
16
|
+
Database,
|
|
17
|
+
GitBranch,
|
|
18
|
+
ShieldCheck,
|
|
19
|
+
Sparkles,
|
|
20
|
+
Workflow
|
|
21
|
+
} from "lucide-react";
|
|
22
|
+
import Link from "next/link";
|
|
18
23
|
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
19
24
|
"use client";
|
|
20
|
-
var
|
|
21
|
-
function HeroMarketingSection() {
|
|
22
|
-
return /* @__PURE__ */ jsxDEV(MarketingSection, {
|
|
23
|
-
tone: "gradient",
|
|
24
|
-
padding: "spacious",
|
|
25
|
-
align: "center",
|
|
26
|
-
children: /* @__PURE__ */ jsxDEV(VStack, {
|
|
27
|
-
gap: "lg",
|
|
28
|
-
align: "center",
|
|
29
|
-
className: "text-center",
|
|
30
|
-
children: [
|
|
31
|
-
/* @__PURE__ */ jsxDEV(Box, {
|
|
32
|
-
as: "div",
|
|
33
|
-
role: "presentation",
|
|
34
|
-
className: "bg-muted text-muted-foreground inline-flex items-center rounded-full px-3 py-1 text-xs font-medium tracking-wider uppercase",
|
|
35
|
-
children: "Open Source Core"
|
|
36
|
-
}, undefined, false, undefined, this),
|
|
37
|
-
/* @__PURE__ */ jsxDEV(H1, {
|
|
38
|
-
className: "text-4xl leading-tight font-bold text-balance md:text-5xl",
|
|
39
|
-
children: "Stabilize your AI-generated code"
|
|
40
|
-
}, undefined, false, undefined, this),
|
|
41
|
-
/* @__PURE__ */ jsxDEV(Lead, {
|
|
42
|
-
className: "text-muted-foreground text-lg text-balance md:text-xl",
|
|
43
|
-
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."
|
|
44
|
-
}, undefined, false, undefined, this),
|
|
45
|
-
/* @__PURE__ */ jsxDEV(HStack, {
|
|
46
|
-
gap: "md",
|
|
47
|
-
justify: "center",
|
|
48
|
-
wrap: "wrap",
|
|
49
|
-
children: [
|
|
50
|
-
/* @__PURE__ */ jsxDEV(ButtonLink, {
|
|
51
|
-
href: "/install",
|
|
52
|
-
onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_INSTALL_CLICK, {
|
|
53
|
-
surface: "hero"
|
|
54
|
-
}),
|
|
55
|
-
children: [
|
|
56
|
-
"Install OSS ",
|
|
57
|
-
/* @__PURE__ */ jsxDEV(ChevronRight, {
|
|
58
|
-
size: 16
|
|
59
|
-
}, undefined, false, undefined, this)
|
|
60
|
-
]
|
|
61
|
-
}, undefined, true, undefined, this),
|
|
62
|
-
/* @__PURE__ */ jsxDEV(ButtonLink, {
|
|
63
|
-
variant: "ghost",
|
|
64
|
-
href: "https://www.contractspec.studio",
|
|
65
|
-
onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
|
|
66
|
-
surface: "hero"
|
|
67
|
-
}),
|
|
68
|
-
children: "Try Studio"
|
|
69
|
-
}, undefined, false, undefined, this)
|
|
70
|
-
]
|
|
71
|
-
}, undefined, true, undefined, this),
|
|
72
|
-
/* @__PURE__ */ jsxDEV(HStack, {
|
|
73
|
-
gap: "sm",
|
|
74
|
-
justify: "center",
|
|
75
|
-
wrap: "wrap",
|
|
76
|
-
className: "pt-2",
|
|
77
|
-
children: heroChips.map((chip) => /* @__PURE__ */ jsxDEV(Box, {
|
|
78
|
-
as: "div",
|
|
79
|
-
role: "presentation",
|
|
80
|
-
className: "border-border text-foreground inline-flex items-center rounded-full border px-3 py-1 text-sm",
|
|
81
|
-
children: /* @__PURE__ */ jsxDEV(Small, {
|
|
82
|
-
className: "font-medium",
|
|
83
|
-
children: chip
|
|
84
|
-
}, undefined, false, undefined, this)
|
|
85
|
-
}, chip, false, undefined, this))
|
|
86
|
-
}, undefined, false, undefined, this)
|
|
87
|
-
]
|
|
88
|
-
}, undefined, true, undefined, this)
|
|
89
|
-
}, undefined, false, undefined, this);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// src/components/marketing/sections/IconGridSection.tsx
|
|
93
|
-
import { cva } from "class-variance-authority";
|
|
94
|
-
import {
|
|
95
|
-
MarketingCardsSection,
|
|
96
|
-
MarketingIconCard
|
|
97
|
-
} from "@contractspec/lib.design-system";
|
|
98
|
-
import { Muted } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
99
|
-
import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
|
|
100
|
-
var itemVariants = cva("", {
|
|
101
|
-
variants: {
|
|
102
|
-
iconRole: {
|
|
103
|
-
iconFirst: "",
|
|
104
|
-
listing: "items-start",
|
|
105
|
-
support: "items-start"
|
|
106
|
-
}
|
|
107
|
-
},
|
|
108
|
-
defaultVariants: { iconRole: "iconFirst" }
|
|
109
|
-
});
|
|
110
|
-
function IconGridSection({
|
|
111
|
-
eyebrow,
|
|
112
|
-
title,
|
|
113
|
-
subtitle,
|
|
114
|
-
items,
|
|
115
|
-
tone = "default",
|
|
116
|
-
padding,
|
|
117
|
-
columns = 3,
|
|
118
|
-
iconRole = "iconFirst"
|
|
119
|
-
}) {
|
|
120
|
-
return /* @__PURE__ */ jsxDEV2(MarketingCardsSection, {
|
|
121
|
-
tone,
|
|
122
|
-
padding,
|
|
123
|
-
eyebrow: eyebrow ? /* @__PURE__ */ jsxDEV2(Muted, {
|
|
124
|
-
className: "text-xs font-semibold tracking-[0.2em] uppercase",
|
|
125
|
-
children: eyebrow
|
|
126
|
-
}, undefined, false, undefined, this) : null,
|
|
127
|
-
title,
|
|
128
|
-
subtitle: subtitle ? /* @__PURE__ */ jsxDEV2(Muted, {
|
|
129
|
-
className: "text-lg",
|
|
130
|
-
children: subtitle
|
|
131
|
-
}, undefined, false, undefined, this) : null,
|
|
132
|
-
columns,
|
|
133
|
-
children: items.map((card) => /* @__PURE__ */ jsxDEV2(MarketingIconCard, {
|
|
134
|
-
icon: card.icon,
|
|
135
|
-
title: card.title,
|
|
136
|
-
description: card.description,
|
|
137
|
-
tone: card.tone,
|
|
138
|
-
iconClassName: card.iconClassName,
|
|
139
|
-
variant: iconRole === "listing" ? "listing" : iconRole === "support" ? "support" : "iconFirst",
|
|
140
|
-
className: itemVariants({ iconRole })
|
|
141
|
-
}, card.title, false, undefined, this))
|
|
142
|
-
}, undefined, false, undefined, this);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// src/components/marketing/sections/ProblemSection.tsx
|
|
146
|
-
import { AlertTriangle, Layers, RefreshCw, XCircle } from "lucide-react";
|
|
147
|
-
import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
|
|
148
|
-
var problemItems = [
|
|
149
|
-
{
|
|
150
|
-
icon: AlertTriangle,
|
|
151
|
-
title: "Can't enforce invariants",
|
|
152
|
-
description: "AI-generated code drifts from business rules over time. No source of truth means no safety.",
|
|
153
|
-
iconClassName: "text-red-400"
|
|
154
|
-
},
|
|
25
|
+
var failureModes = [
|
|
155
26
|
{
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
description: "API, DB, UI, and events get out of sync. One change breaks three surfaces.",
|
|
159
|
-
iconClassName: "text-orange-400"
|
|
27
|
+
title: "Implicit rules drift first",
|
|
28
|
+
description: "Prompt chains and AI edits move faster than the product rules they are supposed to respect."
|
|
160
29
|
},
|
|
161
30
|
{
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
description: 'AI "improvements" introduce subtle bugs and break contracts you didn’t know existed.',
|
|
165
|
-
iconClassName: "text-amber-400"
|
|
31
|
+
title: "Surfaces stop agreeing",
|
|
32
|
+
description: "API, UI, database, events, and MCP tools evolve independently unless something explicit keeps them aligned."
|
|
166
33
|
},
|
|
167
34
|
{
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
description: "Teams ship fast initially, then spend months untangling AI-generated chaos.",
|
|
171
|
-
iconClassName: "text-red-400"
|
|
35
|
+
title: "Teams lose safe regeneration",
|
|
36
|
+
description: "Without a stable contract layer, every regeneration feels like rewriting production in the dark."
|
|
172
37
|
}
|
|
173
38
|
];
|
|
174
|
-
|
|
175
|
-
return /* @__PURE__ */ jsxDEV3(IconGridSection, {
|
|
176
|
-
tone: "muted",
|
|
177
|
-
columns: 4,
|
|
178
|
-
eyebrow: "The Problem",
|
|
179
|
-
title: "AI agents write code fast. Then the chaos begins.",
|
|
180
|
-
subtitle: 'In 2025, "vibe coding" and AI agents generate enormous amounts of code. But they have critical limitations that destroy long-term maintainability.',
|
|
181
|
-
items: problemItems
|
|
182
|
-
}, undefined, false, undefined, this);
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
// src/components/marketing/sections/SolutionSection.tsx
|
|
186
|
-
import { FileCode, Layers as Layers2, RefreshCw as RefreshCw2, Shield } from "lucide-react";
|
|
187
|
-
import { jsxDEV as jsxDEV4 } from "react/jsx-dev-runtime";
|
|
188
|
-
var solutionItems = [
|
|
39
|
+
var systemSurfaces = [
|
|
189
40
|
{
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
iconClassName: "text-emerald-400"
|
|
41
|
+
label: "Contracts and generation",
|
|
42
|
+
description: "Define the canonical behavior once and derive the implementation surfaces from it.",
|
|
43
|
+
icon: Braces
|
|
194
44
|
},
|
|
195
45
|
{
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
iconClassName: "text-blue-400"
|
|
46
|
+
label: "Runtime adapters",
|
|
47
|
+
description: "Bind the same source of truth to REST, GraphQL, React, MCP, and operational flows.",
|
|
48
|
+
icon: Workflow
|
|
200
49
|
},
|
|
201
50
|
{
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
iconClassName: "text-violet-400"
|
|
51
|
+
label: "Harness and proof",
|
|
52
|
+
description: "Replay, evaluate, inspect, and verify how the system behaves before you trust automation with more.",
|
|
53
|
+
icon: ChartColumn
|
|
206
54
|
},
|
|
207
55
|
{
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
iconClassName: "text-pink-400"
|
|
56
|
+
label: "Studio operating layer",
|
|
57
|
+
description: "Run the opinionated product loop when you want coordination, governance, and a packaged operating surface.",
|
|
58
|
+
icon: Sparkles
|
|
212
59
|
}
|
|
213
60
|
];
|
|
214
|
-
|
|
215
|
-
return /* @__PURE__ */ jsxDEV4(IconGridSection, {
|
|
216
|
-
tone: "default",
|
|
217
|
-
columns: 4,
|
|
218
|
-
eyebrow: "The Solution",
|
|
219
|
-
title: "ContractSpec: The safety layer for AI-coded systems",
|
|
220
|
-
subtitle: "Define contracts once. Generate consistent code across all surfaces. Regenerate safely anytime. No lock-in.",
|
|
221
|
-
items: solutionItems
|
|
222
|
-
}, undefined, false, undefined, this);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
// src/components/marketing/sections/FearsSection.tsx
|
|
226
|
-
import { CheckCircle, Code, Unlock, Zap } from "lucide-react";
|
|
227
|
-
import { jsxDEV as jsxDEV5 } from "react/jsx-dev-runtime";
|
|
228
|
-
var fears = [
|
|
61
|
+
var outputs = [
|
|
229
62
|
{
|
|
230
|
-
title:
|
|
231
|
-
|
|
232
|
-
icon:
|
|
63
|
+
title: "APIs",
|
|
64
|
+
copy: "Typed endpoints and schemas stay aligned with the same contract language the team edits.",
|
|
65
|
+
icon: GitBranch
|
|
233
66
|
},
|
|
234
67
|
{
|
|
235
|
-
title:
|
|
236
|
-
|
|
237
|
-
icon:
|
|
68
|
+
title: "Data",
|
|
69
|
+
copy: "Schema, validation, and migrations are shaped by the same product rules instead of scattered implementations.",
|
|
70
|
+
icon: Database
|
|
238
71
|
},
|
|
239
72
|
{
|
|
240
|
-
title:
|
|
241
|
-
|
|
242
|
-
icon:
|
|
73
|
+
title: "Interfaces",
|
|
74
|
+
copy: "Forms, presentations, and client types inherit the same system boundaries instead of drifting from the backend.",
|
|
75
|
+
icon: Blocks
|
|
243
76
|
},
|
|
244
77
|
{
|
|
245
|
-
title:
|
|
246
|
-
|
|
247
|
-
icon:
|
|
78
|
+
title: "Agents and tools",
|
|
79
|
+
copy: "MCP tools and agent-facing surfaces are generated from explicit contracts rather than guessed from code.",
|
|
80
|
+
icon: Bot
|
|
248
81
|
}
|
|
249
82
|
];
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
83
|
+
var adoptionSteps = [
|
|
84
|
+
"Start with one module that is already drifting or feels unsafe to regenerate.",
|
|
85
|
+
"Define explicit contracts, then bring API, UI, data, and tools back into alignment.",
|
|
86
|
+
"Adopt Studio when the team wants an operating surface on top of the open system."
|
|
87
|
+
];
|
|
88
|
+
function LandingPage() {
|
|
89
|
+
return /* @__PURE__ */ jsxDEV("main", {
|
|
90
|
+
children: [
|
|
91
|
+
/* @__PURE__ */ jsxDEV("section", {
|
|
92
|
+
className: "section-padding hero-gradient border-border/70 border-b",
|
|
93
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
94
|
+
className: "editorial-shell",
|
|
95
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
96
|
+
className: "grid gap-10 lg:grid-cols-[1.15fr_0.85fr] lg:items-end",
|
|
97
|
+
children: [
|
|
98
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
99
|
+
className: "space-y-7",
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
102
|
+
className: "badge",
|
|
103
|
+
children: [
|
|
104
|
+
/* @__PURE__ */ jsxDEV(ShieldCheck, {
|
|
105
|
+
size: 14
|
|
106
|
+
}, undefined, false, undefined, this),
|
|
107
|
+
"Open system, explicit control"
|
|
108
|
+
]
|
|
109
|
+
}, undefined, true, undefined, this),
|
|
110
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
111
|
+
className: "space-y-5",
|
|
112
|
+
children: [
|
|
113
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
114
|
+
className: "editorial-kicker",
|
|
115
|
+
children: "ContractSpec for AI-native teams"
|
|
116
|
+
}, undefined, false, undefined, this),
|
|
117
|
+
/* @__PURE__ */ jsxDEV("h1", {
|
|
118
|
+
className: "editorial-title max-w-5xl",
|
|
119
|
+
children: "Build and run AI-native systems on explicit contracts."
|
|
120
|
+
}, undefined, false, undefined, this),
|
|
121
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
122
|
+
className: "editorial-subtitle",
|
|
123
|
+
children: "ContractSpec gives teams an open spec system for defining behavior, aligning every surface, and regenerating safely. The OSS foundation stays yours. Studio is the operating layer when you want a product on top."
|
|
124
|
+
}, undefined, false, undefined, this)
|
|
125
|
+
]
|
|
126
|
+
}, undefined, true, undefined, this),
|
|
127
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
128
|
+
className: "flex flex-col gap-3 sm:flex-row",
|
|
129
|
+
children: [
|
|
130
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
131
|
+
href: "/install",
|
|
132
|
+
className: "btn-primary",
|
|
133
|
+
children: [
|
|
134
|
+
"Start with OSS ",
|
|
135
|
+
/* @__PURE__ */ jsxDEV(ArrowRight, {
|
|
136
|
+
className: "ml-2 h-4 w-4"
|
|
137
|
+
}, undefined, false, undefined, this)
|
|
138
|
+
]
|
|
139
|
+
}, undefined, true, undefined, this),
|
|
140
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
141
|
+
href: "https://www.contractspec.studio",
|
|
142
|
+
className: "btn-ghost",
|
|
143
|
+
children: "Explore Studio"
|
|
144
|
+
}, undefined, false, undefined, this),
|
|
145
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
146
|
+
href: "/product",
|
|
147
|
+
className: "btn-ghost",
|
|
148
|
+
children: "See the architecture"
|
|
149
|
+
}, undefined, false, undefined, this)
|
|
150
|
+
]
|
|
151
|
+
}, undefined, true, undefined, this),
|
|
152
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
153
|
+
className: "editorial-proof-strip",
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
156
|
+
className: "editorial-stat",
|
|
157
|
+
children: [
|
|
158
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
159
|
+
className: "editorial-stat-value",
|
|
160
|
+
children: "1"
|
|
161
|
+
}, undefined, false, undefined, this),
|
|
162
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
163
|
+
className: "editorial-label",
|
|
164
|
+
children: "explicit system source"
|
|
165
|
+
}, undefined, false, undefined, this)
|
|
166
|
+
]
|
|
167
|
+
}, undefined, true, undefined, this),
|
|
168
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
169
|
+
className: "editorial-stat",
|
|
170
|
+
children: [
|
|
171
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
172
|
+
className: "editorial-stat-value",
|
|
173
|
+
children: "4+"
|
|
174
|
+
}, undefined, false, undefined, this),
|
|
175
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
176
|
+
className: "editorial-label",
|
|
177
|
+
children: "aligned surface families"
|
|
178
|
+
}, undefined, false, undefined, this)
|
|
179
|
+
]
|
|
180
|
+
}, undefined, true, undefined, this),
|
|
181
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
182
|
+
className: "editorial-stat",
|
|
183
|
+
children: [
|
|
184
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
185
|
+
className: "editorial-stat-value",
|
|
186
|
+
children: "0"
|
|
187
|
+
}, undefined, false, undefined, this),
|
|
188
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
189
|
+
className: "editorial-label",
|
|
190
|
+
children: "required lock-in"
|
|
191
|
+
}, undefined, false, undefined, this)
|
|
192
|
+
]
|
|
193
|
+
}, undefined, true, undefined, this)
|
|
194
|
+
]
|
|
195
|
+
}, undefined, true, undefined, this)
|
|
196
|
+
]
|
|
197
|
+
}, undefined, true, undefined, this),
|
|
198
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
199
|
+
className: "editorial-panel space-y-6",
|
|
200
|
+
children: [
|
|
201
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
202
|
+
className: "editorial-kicker",
|
|
203
|
+
children: "What the site should make clear"
|
|
204
|
+
}, undefined, false, undefined, this),
|
|
205
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
206
|
+
className: "space-y-4",
|
|
207
|
+
children: [
|
|
208
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
209
|
+
className: "editorial-panel-title",
|
|
210
|
+
children: "This is not “yet another AI builder.”"
|
|
211
|
+
}, undefined, false, undefined, this),
|
|
212
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
213
|
+
className: "editorial-copy text-sm",
|
|
214
|
+
children: "ContractSpec exists for teams that already know AI can write a lot of software, but need explicit control over what that software is allowed to become over time."
|
|
215
|
+
}, undefined, false, undefined, this)
|
|
216
|
+
]
|
|
217
|
+
}, undefined, true, undefined, this),
|
|
218
|
+
/* @__PURE__ */ jsxDEV("ul", {
|
|
219
|
+
className: "editorial-list",
|
|
220
|
+
children: [
|
|
221
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
222
|
+
children: [
|
|
223
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
224
|
+
className: "editorial-list-marker"
|
|
225
|
+
}, undefined, false, undefined, this),
|
|
226
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
227
|
+
children: "Keep the code and the standards you already use."
|
|
228
|
+
}, undefined, false, undefined, this)
|
|
229
|
+
]
|
|
230
|
+
}, undefined, true, undefined, this),
|
|
231
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
232
|
+
children: [
|
|
233
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
234
|
+
className: "editorial-list-marker"
|
|
235
|
+
}, undefined, false, undefined, this),
|
|
236
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
237
|
+
children: "Stabilize one module at a time instead of rewriting your app."
|
|
238
|
+
}, undefined, false, undefined, this)
|
|
239
|
+
]
|
|
240
|
+
}, undefined, true, undefined, this),
|
|
241
|
+
/* @__PURE__ */ jsxDEV("li", {
|
|
242
|
+
children: [
|
|
243
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
244
|
+
className: "editorial-list-marker"
|
|
245
|
+
}, undefined, false, undefined, this),
|
|
246
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
247
|
+
children: "Move into Studio only when you want the operating product."
|
|
248
|
+
}, undefined, false, undefined, this)
|
|
249
|
+
]
|
|
250
|
+
}, undefined, true, undefined, this)
|
|
251
|
+
]
|
|
252
|
+
}, undefined, true, undefined, this)
|
|
253
|
+
]
|
|
254
|
+
}, undefined, true, undefined, this)
|
|
255
|
+
]
|
|
256
|
+
}, undefined, true, undefined, this)
|
|
257
|
+
}, undefined, false, undefined, this)
|
|
258
|
+
}, undefined, false, undefined, this),
|
|
259
|
+
/* @__PURE__ */ jsxDEV("section", {
|
|
260
|
+
className: "editorial-section",
|
|
261
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
262
|
+
className: "editorial-shell space-y-10",
|
|
285
263
|
children: [
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
264
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
265
|
+
className: "max-w-3xl space-y-4",
|
|
266
|
+
children: [
|
|
267
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
268
|
+
className: "editorial-kicker",
|
|
269
|
+
children: "Why teams end up here"
|
|
270
|
+
}, undefined, false, undefined, this),
|
|
271
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
272
|
+
className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
|
|
273
|
+
children: "AI speed is not the problem. Implicit systems are."
|
|
274
|
+
}, undefined, false, undefined, this),
|
|
275
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
276
|
+
className: "editorial-copy",
|
|
277
|
+
children: "Once a team depends on prompts, AI edits, and generated code across multiple surfaces, the real failure mode is not “AI wrote bad code.” It is that nobody can state the system rules precisely enough to keep regeneration safe."
|
|
278
|
+
}, undefined, false, undefined, this)
|
|
279
|
+
]
|
|
280
|
+
}, undefined, true, undefined, this),
|
|
281
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
282
|
+
className: "editorial-grid xl:grid-cols-3",
|
|
283
|
+
children: failureModes.map((item) => /* @__PURE__ */ jsxDEV("div", {
|
|
284
|
+
className: "editorial-panel",
|
|
285
|
+
children: [
|
|
286
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
287
|
+
className: "editorial-kicker",
|
|
288
|
+
children: item.title
|
|
289
|
+
}, undefined, false, undefined, this),
|
|
290
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
291
|
+
className: "mt-4 text-base text-muted-foreground leading-8",
|
|
292
|
+
children: item.description
|
|
293
|
+
}, undefined, false, undefined, this)
|
|
294
|
+
]
|
|
295
|
+
}, item.title, true, undefined, this))
|
|
296
|
+
}, undefined, false, undefined, this)
|
|
289
297
|
]
|
|
290
|
-
}, undefined, true, undefined, this)
|
|
291
|
-
|
|
292
|
-
|
|
298
|
+
}, undefined, true, undefined, this)
|
|
299
|
+
}, undefined, false, undefined, this),
|
|
300
|
+
/* @__PURE__ */ jsxDEV("section", {
|
|
301
|
+
className: "editorial-section bg-striped",
|
|
302
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
303
|
+
className: "editorial-shell space-y-10",
|
|
293
304
|
children: [
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
305
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
306
|
+
className: "max-w-3xl space-y-4",
|
|
307
|
+
children: [
|
|
308
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
309
|
+
className: "editorial-kicker",
|
|
310
|
+
children: "The open system"
|
|
311
|
+
}, undefined, false, undefined, this),
|
|
312
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
313
|
+
className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
|
|
314
|
+
children: "One explicit layer that keeps the whole stack honest."
|
|
315
|
+
}, undefined, false, undefined, this),
|
|
316
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
317
|
+
className: "editorial-copy",
|
|
318
|
+
children: "ContractSpec is broader than generation. It is the contract layer, the runtime bridges, the proof surfaces, and the adoption path that lets teams move from OSS control to an operating product without pretending they are different systems."
|
|
319
|
+
}, undefined, false, undefined, this)
|
|
320
|
+
]
|
|
321
|
+
}, undefined, true, undefined, this),
|
|
322
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
323
|
+
className: "editorial-grid",
|
|
324
|
+
children: systemSurfaces.map((surface) => /* @__PURE__ */ jsxDEV("div", {
|
|
325
|
+
className: "editorial-panel",
|
|
326
|
+
children: [
|
|
327
|
+
/* @__PURE__ */ jsxDEV(surface.icon, {
|
|
328
|
+
className: "h-5 w-5 text-[color:var(--rust)]"
|
|
329
|
+
}, undefined, false, undefined, this),
|
|
330
|
+
/* @__PURE__ */ jsxDEV("h3", {
|
|
331
|
+
className: "mt-5 font-serif text-2xl tracking-[-0.03em]",
|
|
332
|
+
children: surface.label
|
|
333
|
+
}, undefined, false, undefined, this),
|
|
334
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
335
|
+
className: "mt-3 text-muted-foreground text-sm leading-7",
|
|
336
|
+
children: surface.description
|
|
337
|
+
}, undefined, false, undefined, this)
|
|
338
|
+
]
|
|
339
|
+
}, surface.label, true, undefined, this))
|
|
299
340
|
}, undefined, false, undefined, this)
|
|
300
341
|
]
|
|
301
|
-
}, undefined, true, undefined, this)
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
className: "
|
|
342
|
+
}, undefined, true, undefined, this)
|
|
343
|
+
}, undefined, false, undefined, this),
|
|
344
|
+
/* @__PURE__ */ jsxDEV("section", {
|
|
345
|
+
className: "editorial-section",
|
|
346
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
347
|
+
className: "editorial-shell grid gap-10 lg:grid-cols-[0.9fr_1.1fr]",
|
|
307
348
|
children: [
|
|
308
|
-
/* @__PURE__ */
|
|
309
|
-
|
|
349
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
350
|
+
className: "space-y-4",
|
|
310
351
|
children: [
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
352
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
353
|
+
className: "editorial-kicker",
|
|
354
|
+
children: "What the OSS layer actually gives you"
|
|
355
|
+
}, undefined, false, undefined, this),
|
|
356
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
357
|
+
className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
|
|
358
|
+
children: "Explicit contracts show up where teams usually lose control."
|
|
359
|
+
}, undefined, false, undefined, this),
|
|
360
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
361
|
+
className: "editorial-copy",
|
|
362
|
+
children: "The promise is not magic generation. The promise is that the same product rules can shape APIs, data, interfaces, and agent tools without each surface inventing its own truth."
|
|
314
363
|
}, undefined, false, undefined, this)
|
|
315
364
|
]
|
|
316
365
|
}, undefined, true, undefined, this),
|
|
317
|
-
/* @__PURE__ */
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
366
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
367
|
+
className: "grid gap-5 md:grid-cols-2",
|
|
368
|
+
children: outputs.map((output) => /* @__PURE__ */ jsxDEV("div", {
|
|
369
|
+
className: "editorial-panel",
|
|
370
|
+
children: [
|
|
371
|
+
/* @__PURE__ */ jsxDEV(output.icon, {
|
|
372
|
+
className: "h-5 w-5 text-[color:var(--blue)]"
|
|
373
|
+
}, undefined, false, undefined, this),
|
|
374
|
+
/* @__PURE__ */ jsxDEV("h3", {
|
|
375
|
+
className: "mt-5 font-serif text-2xl tracking-[-0.03em]",
|
|
376
|
+
children: output.title
|
|
377
|
+
}, undefined, false, undefined, this),
|
|
378
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
379
|
+
className: "mt-3 text-muted-foreground text-sm leading-7",
|
|
380
|
+
children: output.copy
|
|
381
|
+
}, undefined, false, undefined, this)
|
|
382
|
+
]
|
|
383
|
+
}, output.title, true, undefined, this))
|
|
321
384
|
}, undefined, false, undefined, this)
|
|
322
385
|
]
|
|
323
386
|
}, undefined, true, undefined, this)
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
// src/components/marketing/sections/AudienceSection.tsx
|
|
330
|
-
import {
|
|
331
|
-
MarketingCard,
|
|
332
|
-
MarketingCardContent,
|
|
333
|
-
MarketingCardHeader,
|
|
334
|
-
MarketingCardTitle,
|
|
335
|
-
MarketingCardsSection as MarketingCardsSection2
|
|
336
|
-
} from "@contractspec/lib.design-system";
|
|
337
|
-
import { VStack as VStack3 } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
338
|
-
import { Muted as Muted2, Small as Small3 } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
339
|
-
import { jsxDEV as jsxDEV7 } from "react/jsx-dev-runtime";
|
|
340
|
-
var audiences = [
|
|
341
|
-
{
|
|
342
|
-
tier: "Tier 1: Priority",
|
|
343
|
-
title: "AI-Native Startups & Technical Founders",
|
|
344
|
-
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.",
|
|
345
|
-
need: "Need: A way to stabilize AI-generated code without rewriting it."
|
|
346
|
-
},
|
|
347
|
-
{
|
|
348
|
-
tier: "Tier 1: Priority",
|
|
349
|
-
title: "Small Teams with AI-Generated Chaos",
|
|
350
|
-
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.",
|
|
351
|
-
need: "Need: Incremental stabilization, safe regeneration, contracts as guardrails."
|
|
352
|
-
},
|
|
353
|
-
{
|
|
354
|
-
tier: "Tier 2: Growth",
|
|
355
|
-
title: "AI Dev Agencies",
|
|
356
|
-
body: "Agencies building many projects for clients using AI-assisted development. Repeating the same patterns, inconsistent quality across projects, handoff nightmares.",
|
|
357
|
-
need: "Need: Reusable templates, consistent contracts, professional handoff artifacts."
|
|
358
|
-
},
|
|
359
|
-
{
|
|
360
|
-
tier: "Tier 2: Growth",
|
|
361
|
-
title: "Scaleups with Compliance Needs",
|
|
362
|
-
body: "Growing companies that need audit trails, API governance, or regulatory compliance. AI-generated code doesn't meet compliance requirements.",
|
|
363
|
-
need: "Need: Governance layer, change tracking, contract enforcement."
|
|
364
|
-
}
|
|
365
|
-
];
|
|
366
|
-
function AudienceSection() {
|
|
367
|
-
return /* @__PURE__ */ jsxDEV7(MarketingCardsSection2, {
|
|
368
|
-
tone: "default",
|
|
369
|
-
columns: 2,
|
|
370
|
-
eyebrow: "Who It's For",
|
|
371
|
-
title: "Built for teams drowning in AI-generated code",
|
|
372
|
-
maxWidth: "xl",
|
|
373
|
-
children: audiences.map((item) => /* @__PURE__ */ jsxDEV7(MarketingCard, {
|
|
374
|
-
tone: "muted",
|
|
375
|
-
children: [
|
|
376
|
-
/* @__PURE__ */ jsxDEV7(MarketingCardHeader, {
|
|
377
|
-
className: "space-y-2",
|
|
387
|
+
}, undefined, false, undefined, this),
|
|
388
|
+
/* @__PURE__ */ jsxDEV("section", {
|
|
389
|
+
className: "editorial-section bg-striped",
|
|
390
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
391
|
+
className: "editorial-shell grid gap-8 lg:grid-cols-[1.1fr_0.9fr]",
|
|
378
392
|
children: [
|
|
379
|
-
/* @__PURE__ */
|
|
380
|
-
className: "
|
|
381
|
-
children:
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
393
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
394
|
+
className: "editorial-panel space-y-6",
|
|
395
|
+
children: [
|
|
396
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
397
|
+
className: "editorial-kicker",
|
|
398
|
+
children: "Adoption path"
|
|
399
|
+
}, undefined, false, undefined, this),
|
|
400
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
401
|
+
className: "editorial-panel-title",
|
|
402
|
+
children: "Start where the risk is highest, not where the marketing says to start."
|
|
403
|
+
}, undefined, false, undefined, this),
|
|
404
|
+
/* @__PURE__ */ jsxDEV("ol", {
|
|
405
|
+
className: "space-y-4",
|
|
406
|
+
children: adoptionSteps.map((step, index) => /* @__PURE__ */ jsxDEV("li", {
|
|
407
|
+
className: "flex gap-4",
|
|
408
|
+
children: [
|
|
409
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
410
|
+
className: "flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-[rgb(162_79_42_/_0.12)] font-mono text-[color:var(--rust)] text-xs",
|
|
411
|
+
children: [
|
|
412
|
+
"0",
|
|
413
|
+
index + 1
|
|
414
|
+
]
|
|
415
|
+
}, undefined, true, undefined, this),
|
|
416
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
417
|
+
className: "text-muted-foreground text-sm leading-7",
|
|
418
|
+
children: step
|
|
419
|
+
}, undefined, false, undefined, this)
|
|
420
|
+
]
|
|
421
|
+
}, step, true, undefined, this))
|
|
422
|
+
}, undefined, false, undefined, this)
|
|
423
|
+
]
|
|
424
|
+
}, undefined, true, undefined, this),
|
|
425
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
426
|
+
className: "editorial-panel space-y-6",
|
|
427
|
+
children: [
|
|
428
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
429
|
+
className: "editorial-kicker",
|
|
430
|
+
children: "Studio on top"
|
|
431
|
+
}, undefined, false, undefined, this),
|
|
432
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
433
|
+
className: "editorial-panel-title",
|
|
434
|
+
children: "Studio is the operating surface, not a replacement identity."
|
|
435
|
+
}, undefined, false, undefined, this),
|
|
436
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
437
|
+
className: "text-muted-foreground text-sm leading-7",
|
|
438
|
+
children: "Use Studio when your team wants a packaged loop for evidence, drafting, review, export, and follow-up. The relationship should feel like the best application built on top of the same open system, not a bait-and-switch away from it."
|
|
439
|
+
}, undefined, false, undefined, this),
|
|
440
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
441
|
+
className: "editorial-divider"
|
|
442
|
+
}, undefined, false, undefined, this),
|
|
443
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
444
|
+
className: "grid gap-4 text-muted-foreground text-sm",
|
|
445
|
+
children: [
|
|
446
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
447
|
+
children: [
|
|
448
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
449
|
+
className: "font-medium text-foreground",
|
|
450
|
+
children: "OSS/Core:"
|
|
451
|
+
}, undefined, false, undefined, this),
|
|
452
|
+
" ",
|
|
453
|
+
"contracts, generation, runtimes, harnesses, agent tooling."
|
|
454
|
+
]
|
|
455
|
+
}, undefined, true, undefined, this),
|
|
456
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
457
|
+
children: [
|
|
458
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
459
|
+
className: "font-medium text-foreground",
|
|
460
|
+
children: "Studio:"
|
|
461
|
+
}, undefined, false, undefined, this),
|
|
462
|
+
" the opinionated operating loop when a team wants the product."
|
|
463
|
+
]
|
|
464
|
+
}, undefined, true, undefined, this)
|
|
465
|
+
]
|
|
466
|
+
}, undefined, true, undefined, this)
|
|
467
|
+
]
|
|
468
|
+
}, undefined, true, undefined, this)
|
|
387
469
|
]
|
|
388
|
-
}, undefined, true, undefined, this)
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
470
|
+
}, undefined, true, undefined, this)
|
|
471
|
+
}, undefined, false, undefined, this),
|
|
472
|
+
/* @__PURE__ */ jsxDEV("section", {
|
|
473
|
+
className: "section-padding",
|
|
474
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
475
|
+
className: "editorial-shell",
|
|
476
|
+
children: /* @__PURE__ */ jsxDEV("div", {
|
|
477
|
+
className: "editorial-panel flex flex-col gap-8 rounded-[40px] border-dashed px-6 py-8 md:px-10 md:py-10 lg:flex-row lg:items-end lg:justify-between",
|
|
392
478
|
children: [
|
|
393
|
-
/* @__PURE__ */
|
|
394
|
-
className: "
|
|
395
|
-
children:
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
479
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
480
|
+
className: "max-w-3xl space-y-4",
|
|
481
|
+
children: [
|
|
482
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
483
|
+
className: "editorial-kicker",
|
|
484
|
+
children: "Choose your path"
|
|
485
|
+
}, undefined, false, undefined, this),
|
|
486
|
+
/* @__PURE__ */ jsxDEV("h2", {
|
|
487
|
+
className: "font-serif text-4xl tracking-[-0.04em] md:text-5xl",
|
|
488
|
+
children: "Adopt the open system first. Evaluate Studio when the team is ready for the operating layer."
|
|
489
|
+
}, undefined, false, undefined, this),
|
|
490
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
491
|
+
className: "editorial-copy",
|
|
492
|
+
children: "That is the product story the site should tell everywhere: open foundation, explicit contracts, safe regeneration, then an opinionated surface on top for teams that want it."
|
|
493
|
+
}, undefined, false, undefined, this)
|
|
494
|
+
]
|
|
495
|
+
}, undefined, true, undefined, this),
|
|
496
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
497
|
+
className: "flex flex-col gap-3 sm:flex-row lg:flex-col",
|
|
498
|
+
children: [
|
|
499
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
500
|
+
href: "/install",
|
|
501
|
+
className: "btn-primary",
|
|
502
|
+
children: "Start with OSS"
|
|
503
|
+
}, undefined, false, undefined, this),
|
|
504
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
505
|
+
href: "https://www.contractspec.studio",
|
|
506
|
+
className: "btn-ghost",
|
|
507
|
+
children: "Explore Studio"
|
|
508
|
+
}, undefined, false, undefined, this),
|
|
509
|
+
/* @__PURE__ */ jsxDEV(Link, {
|
|
510
|
+
href: "/pricing",
|
|
511
|
+
className: "btn-ghost",
|
|
512
|
+
children: "See packaging"
|
|
513
|
+
}, undefined, false, undefined, this)
|
|
514
|
+
]
|
|
515
|
+
}, undefined, true, undefined, this)
|
|
401
516
|
]
|
|
402
517
|
}, undefined, true, undefined, this)
|
|
403
518
|
}, undefined, false, undefined, this)
|
|
404
|
-
|
|
405
|
-
}, item.title, true, undefined, this))
|
|
406
|
-
}, undefined, false, undefined, this);
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// src/components/marketing/sections/OutputsSection.tsx
|
|
410
|
-
import { jsxDEV as jsxDEV8 } from "react/jsx-dev-runtime";
|
|
411
|
-
var outputs = [
|
|
412
|
-
{
|
|
413
|
-
title: "REST API",
|
|
414
|
-
description: "Type-safe endpoints with validation. Standard Express/Hono/Elysia handlers.",
|
|
415
|
-
icon: "\uD83D\uDD0C"
|
|
416
|
-
},
|
|
417
|
-
{
|
|
418
|
-
title: "GraphQL Schema",
|
|
419
|
-
description: "Automatically generated resolvers. Standard Pothos/Apollo output.",
|
|
420
|
-
icon: "\uD83D\uDCCA"
|
|
421
|
-
},
|
|
422
|
-
{
|
|
423
|
-
title: "Database Schema",
|
|
424
|
-
description: "Prisma migrations and types. Standard SQL underneath.",
|
|
425
|
-
icon: "\uD83D\uDDC4️"
|
|
426
|
-
},
|
|
427
|
-
{
|
|
428
|
-
title: "MCP Tools",
|
|
429
|
-
description: "AI agent tool definitions. Works with Claude, GPT, and any MCP client.",
|
|
430
|
-
icon: "\uD83E\uDD16"
|
|
431
|
-
},
|
|
432
|
-
{
|
|
433
|
-
title: "Client SDKs",
|
|
434
|
-
description: "Type-safe API clients. Standard fetch/axios underneath.",
|
|
435
|
-
icon: "\uD83D\uDCE6"
|
|
436
|
-
},
|
|
437
|
-
{
|
|
438
|
-
title: "UI Components",
|
|
439
|
-
description: "React forms and views from specs. Standard JSX output.",
|
|
440
|
-
icon: "\uD83C\uDFA8"
|
|
441
|
-
}
|
|
442
|
-
];
|
|
443
|
-
function OutputsSection() {
|
|
444
|
-
return /* @__PURE__ */ jsxDEV8(IconGridSection, {
|
|
445
|
-
tone: "muted",
|
|
446
|
-
columns: 3,
|
|
447
|
-
title: "What ContractSpec generates",
|
|
448
|
-
subtitle: "One contract, multiple outputs. All in sync. All standard tech.",
|
|
449
|
-
iconRole: "iconFirst",
|
|
450
|
-
items: outputs.map((item) => ({
|
|
451
|
-
icon: () => /* @__PURE__ */ jsxDEV8("span", {
|
|
452
|
-
"aria-hidden": true,
|
|
453
|
-
className: "text-3xl",
|
|
454
|
-
children: item.icon
|
|
455
|
-
}, undefined, false, undefined, this),
|
|
456
|
-
title: item.title,
|
|
457
|
-
description: item.description
|
|
458
|
-
}))
|
|
459
|
-
}, undefined, false, undefined, this);
|
|
460
|
-
}
|
|
461
|
-
|
|
462
|
-
// src/components/marketing/sections/StepsSection.tsx
|
|
463
|
-
import { jsxDEV as jsxDEV9 } from "react/jsx-dev-runtime";
|
|
464
|
-
var steps = [
|
|
465
|
-
{
|
|
466
|
-
step: 1,
|
|
467
|
-
title: "Pick one module",
|
|
468
|
-
description: "Start with one API endpoint, one entity, one surface. No big-bang migration."
|
|
469
|
-
},
|
|
470
|
-
{
|
|
471
|
-
step: 2,
|
|
472
|
-
title: "Define the contract",
|
|
473
|
-
description: "Write a spec in TypeScript. Just types and Zod schemas you already know."
|
|
474
|
-
},
|
|
475
|
-
{
|
|
476
|
-
step: 3,
|
|
477
|
-
title: "Generate & compare",
|
|
478
|
-
description: "See what ContractSpec generates. Compare to your existing code. Keep what works."
|
|
479
|
-
},
|
|
480
|
-
{
|
|
481
|
-
step: 4,
|
|
482
|
-
title: "Expand gradually",
|
|
483
|
-
description: "Add more contracts as you see value. No pressure. No lock-in. Your pace."
|
|
484
|
-
}
|
|
485
|
-
];
|
|
486
|
-
function StepsSection() {
|
|
487
|
-
return /* @__PURE__ */ jsxDEV9(IconGridSection, {
|
|
488
|
-
tone: "default",
|
|
489
|
-
columns: 4,
|
|
490
|
-
title: "How incremental adoption works",
|
|
491
|
-
padding: "comfortable",
|
|
492
|
-
iconRole: "listing",
|
|
493
|
-
items: steps.map((item) => ({
|
|
494
|
-
icon: ({ className }) => /* @__PURE__ */ jsxDEV9("div", {
|
|
495
|
-
className: `bg-primary/15 flex h-10 w-10 items-center justify-center rounded-lg ${className ?? ""}`,
|
|
496
|
-
children: /* @__PURE__ */ jsxDEV9("span", {
|
|
497
|
-
className: "text-primary text-sm font-semibold",
|
|
498
|
-
children: item.step
|
|
499
|
-
}, undefined, false, undefined, this)
|
|
500
|
-
}, undefined, false, undefined, this),
|
|
501
|
-
title: item.title,
|
|
502
|
-
description: item.description,
|
|
503
|
-
tone: "muted"
|
|
504
|
-
}))
|
|
505
|
-
}, undefined, false, undefined, this);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
// src/components/marketing/sections/DevelopersSection.tsx
|
|
509
|
-
import {
|
|
510
|
-
ButtonLink as ButtonLink3,
|
|
511
|
-
MarketingComparisonSection
|
|
512
|
-
} from "@contractspec/lib.design-system";
|
|
513
|
-
import { jsxDEV as jsxDEV10 } from "react/jsx-dev-runtime";
|
|
514
|
-
var standardTech = [
|
|
515
|
-
"TypeScript & Zod — schemas you already know",
|
|
516
|
-
"Prisma — standard database access",
|
|
517
|
-
"GraphQL or REST — your choice",
|
|
518
|
-
"React or any UI framework",
|
|
519
|
-
"Bun, Node, Deno — all supported"
|
|
520
|
-
];
|
|
521
|
-
var noMagic = [
|
|
522
|
-
"Generated code is readable & modifiable",
|
|
523
|
-
"No proprietary runtime dependencies",
|
|
524
|
-
"Eject anytime, keep everything",
|
|
525
|
-
"Works with your existing CI/CD",
|
|
526
|
-
"Open spec format"
|
|
527
|
-
];
|
|
528
|
-
function DevelopersSection() {
|
|
529
|
-
return /* @__PURE__ */ jsxDEV10(MarketingComparisonSection, {
|
|
530
|
-
tone: "muted",
|
|
531
|
-
title: "Built for developers",
|
|
532
|
-
padding: "comfortable",
|
|
533
|
-
left: { title: "Standard Tech Stack", items: standardTech },
|
|
534
|
-
right: { title: "No Magic, No Lock-in", items: noMagic },
|
|
535
|
-
subtitle: /* @__PURE__ */ jsxDEV10(ButtonLink3, {
|
|
536
|
-
href: "/docs",
|
|
537
|
-
children: [
|
|
538
|
-
"Read the docs ",
|
|
539
|
-
/* @__PURE__ */ jsxDEV10("span", {
|
|
540
|
-
"aria-hidden": true,
|
|
541
|
-
children: "→"
|
|
542
|
-
}, undefined, false, undefined, this)
|
|
543
|
-
]
|
|
544
|
-
}, undefined, true, undefined, this)
|
|
545
|
-
}, undefined, false, undefined, this);
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
// src/components/marketing/sections/CtaSection.tsx
|
|
549
|
-
import { ButtonLink as ButtonLink4, MarketingSection as MarketingSection3 } from "@contractspec/lib.design-system";
|
|
550
|
-
import {
|
|
551
|
-
analyticsEventNames as analyticsEventNames2,
|
|
552
|
-
captureAnalyticsEvent as captureAnalyticsEvent2
|
|
553
|
-
} from "@contractspec/bundle.library/libs/posthog/client";
|
|
554
|
-
import { VStack as VStack4 } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
555
|
-
import { H2 as H22, Lead as Lead3 } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
556
|
-
import { jsxDEV as jsxDEV11 } from "react/jsx-dev-runtime";
|
|
557
|
-
function CtaSection() {
|
|
558
|
-
return /* @__PURE__ */ jsxDEV11(MarketingSection3, {
|
|
559
|
-
tone: "gradient",
|
|
560
|
-
padding: "comfortable",
|
|
561
|
-
align: "center",
|
|
562
|
-
maxWidth: "lg",
|
|
563
|
-
children: /* @__PURE__ */ jsxDEV11(VStack4, {
|
|
564
|
-
gap: "md",
|
|
565
|
-
align: "center",
|
|
566
|
-
className: "text-center",
|
|
567
|
-
children: [
|
|
568
|
-
/* @__PURE__ */ jsxDEV11(H22, {
|
|
569
|
-
className: "text-4xl font-bold md:text-5xl",
|
|
570
|
-
children: "Ready to stabilize your codebase?"
|
|
571
|
-
}, undefined, false, undefined, this),
|
|
572
|
-
/* @__PURE__ */ jsxDEV11(Lead3, {
|
|
573
|
-
className: "text-muted-foreground text-lg",
|
|
574
|
-
children: "Start with one module. See the difference. Expand at your own pace."
|
|
575
|
-
}, undefined, false, undefined, this),
|
|
576
|
-
/* @__PURE__ */ jsxDEV11(VStack4, {
|
|
577
|
-
as: "div",
|
|
578
|
-
gap: "sm",
|
|
579
|
-
align: "center",
|
|
580
|
-
className: "pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center",
|
|
581
|
-
children: [
|
|
582
|
-
/* @__PURE__ */ jsxDEV11(ButtonLink4, {
|
|
583
|
-
href: "https://www.contractspec.studio",
|
|
584
|
-
onClick: () => captureAnalyticsEvent2(analyticsEventNames2.CTA_STUDIO_CLICK, {
|
|
585
|
-
surface: "cta-section"
|
|
586
|
-
}),
|
|
587
|
-
children: "Try Studio"
|
|
588
|
-
}, undefined, false, undefined, this),
|
|
589
|
-
/* @__PURE__ */ jsxDEV11(ButtonLink4, {
|
|
590
|
-
variant: "ghost",
|
|
591
|
-
href: "/contact",
|
|
592
|
-
onClick: () => captureAnalyticsEvent2(analyticsEventNames2.CTA_STUDIO_CLICK, {
|
|
593
|
-
surface: "cta-section",
|
|
594
|
-
variant: "contact"
|
|
595
|
-
}),
|
|
596
|
-
children: "Book a call"
|
|
597
|
-
}, undefined, false, undefined, this)
|
|
598
|
-
]
|
|
599
|
-
}, undefined, true, undefined, this)
|
|
600
|
-
]
|
|
601
|
-
}, undefined, true, undefined, this)
|
|
602
|
-
}, undefined, false, undefined, this);
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
// src/components/marketing/LandingPage.tsx
|
|
606
|
-
import { VStack as VStack5 } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
607
|
-
import { jsxDEV as jsxDEV12 } from "react/jsx-dev-runtime";
|
|
608
|
-
"use client";
|
|
609
|
-
function LandingPage() {
|
|
610
|
-
return /* @__PURE__ */ jsxDEV12(VStack5, {
|
|
611
|
-
as: "main",
|
|
612
|
-
gap: "none",
|
|
613
|
-
children: [
|
|
614
|
-
/* @__PURE__ */ jsxDEV12(HeroMarketingSection, {}, undefined, false, undefined, this),
|
|
615
|
-
/* @__PURE__ */ jsxDEV12(ProblemSection, {}, undefined, false, undefined, this),
|
|
616
|
-
/* @__PURE__ */ jsxDEV12(SolutionSection, {}, undefined, false, undefined, this),
|
|
617
|
-
/* @__PURE__ */ jsxDEV12(FearsSection, {}, undefined, false, undefined, this),
|
|
618
|
-
/* @__PURE__ */ jsxDEV12(CorePositioningSection, {}, undefined, false, undefined, this),
|
|
619
|
-
/* @__PURE__ */ jsxDEV12(AudienceSection, {}, undefined, false, undefined, this),
|
|
620
|
-
/* @__PURE__ */ jsxDEV12(OutputsSection, {}, undefined, false, undefined, this),
|
|
621
|
-
/* @__PURE__ */ jsxDEV12(StepsSection, {}, undefined, false, undefined, this),
|
|
622
|
-
/* @__PURE__ */ jsxDEV12(DevelopersSection, {}, undefined, false, undefined, this),
|
|
623
|
-
/* @__PURE__ */ jsxDEV12(CtaSection, {}, undefined, false, undefined, this)
|
|
519
|
+
}, undefined, false, undefined, this)
|
|
624
520
|
]
|
|
625
521
|
}, undefined, true, undefined, this);
|
|
626
522
|
}
|