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