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