@contractspec/bundle.marketing 1.12.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +146 -175
- package/.turbo/turbo-prebuild.log +1 -0
- package/CHANGELOG.md +57 -0
- package/dist/browser/components/marketing/ChangelogPage.js +92 -0
- package/dist/browser/components/marketing/CofounderPage.js +581 -0
- package/dist/browser/components/marketing/ContactClient.js +1379 -0
- package/dist/browser/components/marketing/ContributePage.js +487 -0
- package/dist/browser/components/marketing/DesignPartnerPage.js +272 -0
- package/dist/browser/components/marketing/LandingPage.js +629 -0
- package/dist/browser/components/marketing/PricingClient.js +1972 -0
- package/dist/browser/components/marketing/ProductClientPage.js +563 -0
- package/dist/browser/components/marketing/index.js +4818 -0
- package/dist/browser/components/marketing/pricing-thinking-modal.js +258 -0
- package/dist/browser/components/marketing/sections/AudienceSection.js +90 -0
- package/dist/browser/components/marketing/sections/CorePositioningSection.js +72 -0
- package/dist/browser/components/marketing/sections/CtaSection.js +67 -0
- package/dist/browser/components/marketing/sections/DevelopersSection.js +50 -0
- package/dist/browser/components/marketing/sections/FearsSection.js +105 -0
- package/dist/browser/components/marketing/sections/HeroMarketingSection.js +93 -0
- package/dist/browser/components/marketing/sections/IconGridSection.js +63 -0
- package/dist/browser/components/marketing/sections/OutputsSection.js +116 -0
- package/dist/browser/components/marketing/sections/ProblemSection.js +103 -0
- package/dist/browser/components/marketing/sections/SolutionSection.js +103 -0
- package/dist/browser/components/marketing/sections/StepsSection.js +109 -0
- package/dist/browser/components/marketing/waitlist-section.js +1104 -0
- package/dist/browser/components/templates/TemplatesClientPage.js +5662 -0
- package/dist/browser/components/templates/TemplatesPage.js +177 -0
- package/dist/browser/components/templates/TemplatesPreviewModal.js +124 -0
- package/dist/browser/components/templates/index.js +5831 -0
- package/dist/browser/index.js +6485 -0
- package/dist/browser/libs/email/client.js +122 -0
- package/dist/browser/libs/email/contact.js +190 -0
- package/dist/browser/libs/email/newsletter.js +215 -0
- package/dist/browser/libs/email/types.js +2 -0
- package/dist/browser/libs/email/utils.js +16 -0
- package/dist/browser/libs/email/waitlist-application.js +295 -0
- package/dist/browser/libs/email/waitlist.js +225 -0
- package/dist/browser/libs/pricing-examples.js +26 -0
- package/dist/browser/registry/engine.js +5293 -0
- package/dist/browser/registry/factory.js +52 -0
- package/dist/browser/registry/index.js +5358 -0
- package/dist/browser/registry/registry-docs.js +343 -0
- package/dist/browser/registry/registry-landing.js +4937 -0
- package/dist/browser/registry/registry.js +5279 -0
- package/dist/browser/registry/types.js +0 -0
- package/dist/browser/registry/utils.js +5340 -0
- package/dist/components/marketing/ChangelogPage.d.ts +11 -17
- package/dist/components/marketing/ChangelogPage.d.ts.map +1 -1
- package/dist/components/marketing/ChangelogPage.js +84 -62
- package/dist/components/marketing/CofounderPage.d.ts +1 -6
- package/dist/components/marketing/CofounderPage.d.ts.map +1 -1
- package/dist/components/marketing/CofounderPage.js +544 -436
- package/dist/components/marketing/ContactClient.d.ts +1 -6
- package/dist/components/marketing/ContactClient.d.ts.map +1 -1
- package/dist/components/marketing/ContactClient.js +1371 -155
- package/dist/components/marketing/ContributePage.d.ts +3 -8
- package/dist/components/marketing/ContributePage.d.ts.map +1 -1
- package/dist/components/marketing/ContributePage.js +478 -358
- package/dist/components/marketing/DesignPartnerPage.d.ts +3 -8
- package/dist/components/marketing/DesignPartnerPage.d.ts.map +1 -1
- package/dist/components/marketing/DesignPartnerPage.js +263 -211
- package/dist/components/marketing/LandingPage.d.ts +1 -6
- package/dist/components/marketing/LandingPage.d.ts.map +1 -1
- package/dist/components/marketing/LandingPage.js +623 -37
- package/dist/components/marketing/PricingClient.d.ts +1 -6
- package/dist/components/marketing/PricingClient.d.ts.map +1 -1
- package/dist/components/marketing/PricingClient.js +1962 -516
- package/dist/components/marketing/ProductClientPage.d.ts +1 -6
- package/dist/components/marketing/ProductClientPage.d.ts.map +1 -1
- package/dist/components/marketing/ProductClientPage.js +556 -458
- package/dist/components/marketing/index.d.ts +11 -11
- package/dist/components/marketing/index.d.ts.map +1 -0
- package/dist/components/marketing/index.js +4813 -12
- package/dist/components/marketing/pricing-thinking-modal.d.ts +5 -13
- package/dist/components/marketing/pricing-thinking-modal.d.ts.map +1 -1
- package/dist/components/marketing/pricing-thinking-modal.js +248 -197
- package/dist/components/marketing/sections/AudienceSection.d.ts +1 -6
- package/dist/components/marketing/sections/AudienceSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/AudienceSection.js +80 -63
- package/dist/components/marketing/sections/CorePositioningSection.d.ts +1 -6
- package/dist/components/marketing/sections/CorePositioningSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/CorePositioningSection.js +62 -54
- package/dist/components/marketing/sections/CtaSection.d.ts +1 -6
- package/dist/components/marketing/sections/CtaSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/CtaSection.js +58 -50
- package/dist/components/marketing/sections/DevelopersSection.d.ts +1 -6
- package/dist/components/marketing/sections/DevelopersSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/DevelopersSection.js +40 -40
- package/dist/components/marketing/sections/FearsSection.d.ts +1 -6
- package/dist/components/marketing/sections/FearsSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/FearsSection.js +96 -44
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts +1 -6
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/HeroMarketingSection.js +82 -71
- package/dist/components/marketing/sections/IconGridSection.d.ts +25 -39
- package/dist/components/marketing/sections/IconGridSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/IconGridSection.js +55 -41
- package/dist/components/marketing/sections/OutputsSection.d.ts +1 -6
- package/dist/components/marketing/sections/OutputsSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/OutputsSection.js +107 -55
- package/dist/components/marketing/sections/ProblemSection.d.ts +1 -6
- package/dist/components/marketing/sections/ProblemSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/ProblemSection.js +94 -42
- package/dist/components/marketing/sections/SolutionSection.d.ts +1 -6
- package/dist/components/marketing/sections/SolutionSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/SolutionSection.js +94 -42
- package/dist/components/marketing/sections/StepsSection.d.ts +1 -6
- package/dist/components/marketing/sections/StepsSection.d.ts.map +1 -1
- package/dist/components/marketing/sections/StepsSection.js +100 -48
- package/dist/components/marketing/waitlist-section.d.ts +5 -12
- package/dist/components/marketing/waitlist-section.d.ts.map +1 -1
- package/dist/components/marketing/waitlist-section.js +1089 -568
- package/dist/components/templates/TemplatesClientPage.d.ts +1 -6
- package/dist/components/templates/TemplatesClientPage.d.ts.map +1 -1
- package/dist/components/templates/TemplatesClientPage.js +5649 -617
- package/dist/components/templates/TemplatesPage.d.ts +1 -6
- package/dist/components/templates/TemplatesPage.d.ts.map +1 -1
- package/dist/components/templates/TemplatesPage.js +163 -116
- package/dist/components/templates/TemplatesPreviewModal.d.ts +5 -12
- package/dist/components/templates/TemplatesPreviewModal.d.ts.map +1 -1
- package/dist/components/templates/TemplatesPreviewModal.js +113 -131
- package/dist/components/templates/index.d.ts +4 -4
- package/dist/components/templates/index.d.ts.map +1 -0
- package/dist/components/templates/index.js +5825 -4
- package/dist/index.d.ts +9 -29
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6480 -28
- package/dist/libs/email/client.d.ts +9 -12
- package/dist/libs/email/client.d.ts.map +1 -1
- package/dist/libs/email/client.js +109 -105
- package/dist/libs/email/client.test.d.ts +2 -0
- package/dist/libs/email/client.test.d.ts.map +1 -0
- package/dist/libs/email/contact.d.ts +2 -6
- package/dist/libs/email/contact.d.ts.map +1 -1
- package/dist/libs/email/contact.js +155 -41
- package/dist/libs/email/newsletter.d.ts +2 -6
- package/dist/libs/email/newsletter.d.ts.map +1 -1
- package/dist/libs/email/newsletter.js +169 -54
- package/dist/libs/email/types.d.ts +48 -52
- package/dist/libs/email/types.d.ts.map +1 -1
- package/dist/libs/email/types.js +3 -1
- package/dist/libs/email/utils.d.ts +2 -5
- package/dist/libs/email/utils.d.ts.map +1 -1
- package/dist/libs/email/utils.js +10 -6
- package/dist/libs/email/waitlist-application.d.ts +2 -6
- package/dist/libs/email/waitlist-application.d.ts.map +1 -1
- package/dist/libs/email/waitlist-application.js +191 -71
- package/dist/libs/email/waitlist.d.ts +2 -6
- package/dist/libs/email/waitlist.d.ts.map +1 -1
- package/dist/libs/email/waitlist.js +171 -56
- package/dist/libs/pricing-examples.d.ts +13 -16
- package/dist/libs/pricing-examples.d.ts.map +1 -1
- package/dist/libs/pricing-examples.js +20 -20
- package/dist/node/components/marketing/ChangelogPage.js +87 -0
- package/dist/node/components/marketing/CofounderPage.js +576 -0
- package/dist/node/components/marketing/ContactClient.js +1374 -0
- package/dist/node/components/marketing/ContributePage.js +482 -0
- package/dist/node/components/marketing/DesignPartnerPage.js +267 -0
- package/dist/node/components/marketing/LandingPage.js +624 -0
- package/dist/node/components/marketing/PricingClient.js +1967 -0
- package/dist/node/components/marketing/ProductClientPage.js +558 -0
- package/dist/node/components/marketing/index.js +4813 -0
- package/dist/node/components/marketing/pricing-thinking-modal.js +253 -0
- package/dist/node/components/marketing/sections/AudienceSection.js +85 -0
- package/dist/node/components/marketing/sections/CorePositioningSection.js +67 -0
- package/dist/node/components/marketing/sections/CtaSection.js +62 -0
- package/dist/node/components/marketing/sections/DevelopersSection.js +45 -0
- package/dist/node/components/marketing/sections/FearsSection.js +100 -0
- package/dist/node/components/marketing/sections/HeroMarketingSection.js +88 -0
- package/dist/node/components/marketing/sections/IconGridSection.js +58 -0
- package/dist/node/components/marketing/sections/OutputsSection.js +111 -0
- package/dist/node/components/marketing/sections/ProblemSection.js +98 -0
- package/dist/node/components/marketing/sections/SolutionSection.js +98 -0
- package/dist/node/components/marketing/sections/StepsSection.js +104 -0
- package/dist/node/components/marketing/waitlist-section.js +1099 -0
- package/dist/node/components/templates/TemplatesClientPage.js +5657 -0
- package/dist/node/components/templates/TemplatesPage.js +172 -0
- package/dist/node/components/templates/TemplatesPreviewModal.js +119 -0
- package/dist/node/components/templates/index.js +5826 -0
- package/dist/node/index.js +6480 -0
- package/dist/node/libs/email/client.js +117 -0
- package/dist/node/libs/email/contact.js +185 -0
- package/dist/node/libs/email/newsletter.js +210 -0
- package/dist/node/libs/email/types.js +2 -0
- package/dist/node/libs/email/utils.js +11 -0
- package/dist/node/libs/email/waitlist-application.js +290 -0
- package/dist/node/libs/email/waitlist.js +220 -0
- package/dist/node/libs/pricing-examples.js +21 -0
- package/dist/node/registry/engine.js +5288 -0
- package/dist/node/registry/factory.js +47 -0
- package/dist/node/registry/index.js +5353 -0
- package/dist/node/registry/registry-docs.js +338 -0
- package/dist/node/registry/registry-landing.js +4932 -0
- package/dist/node/registry/registry.js +5274 -0
- package/dist/node/registry/types.js +0 -0
- package/dist/node/registry/utils.js +5335 -0
- package/dist/registry/engine.d.ts +4 -8
- package/dist/registry/engine.d.ts.map +1 -1
- package/dist/registry/engine.js +5287 -23
- package/dist/registry/factory.d.ts +30 -34
- package/dist/registry/factory.d.ts.map +1 -1
- package/dist/registry/factory.js +42 -56
- package/dist/registry/index.d.ts +8 -8
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +5353 -8
- package/dist/registry/registry-docs.d.ts +4 -8
- package/dist/registry/registry-docs.d.ts.map +1 -1
- package/dist/registry/registry-docs.js +242 -209
- package/dist/registry/registry-landing.d.ts +5 -9
- package/dist/registry/registry-landing.d.ts.map +1 -1
- package/dist/registry/registry-landing.js +4930 -93
- package/dist/registry/registry.d.ts +7 -11
- package/dist/registry/registry.d.ts.map +1 -1
- package/dist/registry/registry.js +5262 -49
- package/dist/registry/types.d.ts +6 -10
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/types.js +1 -0
- package/dist/registry/utils.d.ts +10 -14
- package/dist/registry/utils.d.ts.map +1 -1
- package/dist/registry/utils.js +5330 -49
- package/package.json +355 -73
- package/tsdown.config.js +1 -2
- package/.turbo/turbo-build$colon$types.log +0 -1
- package/.turbo/turbo-lint.log +0 -3
- package/dist/components/marketing/ChangelogPage.js.map +0 -1
- package/dist/components/marketing/CofounderPage.js.map +0 -1
- package/dist/components/marketing/ContactClient.js.map +0 -1
- package/dist/components/marketing/ContributePage.js.map +0 -1
- package/dist/components/marketing/DesignPartnerPage.js.map +0 -1
- package/dist/components/marketing/LandingPage.js.map +0 -1
- package/dist/components/marketing/PricingClient.js.map +0 -1
- package/dist/components/marketing/ProductClientPage.js.map +0 -1
- package/dist/components/marketing/pricing-thinking-modal.js.map +0 -1
- package/dist/components/marketing/sections/AudienceSection.js.map +0 -1
- package/dist/components/marketing/sections/CorePositioningSection.js.map +0 -1
- package/dist/components/marketing/sections/CtaSection.js.map +0 -1
- package/dist/components/marketing/sections/DevelopersSection.js.map +0 -1
- package/dist/components/marketing/sections/FearsSection.js.map +0 -1
- package/dist/components/marketing/sections/HeroMarketingSection.js.map +0 -1
- package/dist/components/marketing/sections/IconGridSection.js.map +0 -1
- package/dist/components/marketing/sections/OutputsSection.js.map +0 -1
- package/dist/components/marketing/sections/ProblemSection.js.map +0 -1
- package/dist/components/marketing/sections/SolutionSection.js.map +0 -1
- package/dist/components/marketing/sections/StepsSection.js.map +0 -1
- package/dist/components/marketing/waitlist-section.js.map +0 -1
- package/dist/components/templates/TemplatesClientPage.js.map +0 -1
- package/dist/components/templates/TemplatesPage.js.map +0 -1
- package/dist/components/templates/TemplatesPreviewModal.js.map +0 -1
- package/dist/libs/email/client.js.map +0 -1
- package/dist/libs/email/contact.js.map +0 -1
- package/dist/libs/email/newsletter.js.map +0 -1
- package/dist/libs/email/utils.js.map +0 -1
- package/dist/libs/email/waitlist-application.js.map +0 -1
- package/dist/libs/email/waitlist.js.map +0 -1
- package/dist/libs/pricing-examples.js.map +0 -1
- package/dist/registry/engine.js.map +0 -1
- package/dist/registry/factory.js.map +0 -1
- package/dist/registry/registry-docs.js.map +0 -1
- package/dist/registry/registry-landing.js.map +0 -1
- package/dist/registry/registry.js.map +0 -1
- package/dist/registry/utils.js.map +0 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined")
|
|
5
|
+
return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/libs/pricing-examples.ts
|
|
10
|
+
var PRICING_EXAMPLES = {
|
|
11
|
+
free: {
|
|
12
|
+
regenerationsPerMonth: 200,
|
|
13
|
+
aiActionsPerMonth: 100,
|
|
14
|
+
projects: 1
|
|
15
|
+
},
|
|
16
|
+
builder: {
|
|
17
|
+
regenerationsPerMonthHint: "1,000–2,000+",
|
|
18
|
+
aiActionsPerMonthHint: "1,000+"
|
|
19
|
+
},
|
|
20
|
+
team: {
|
|
21
|
+
description: "Higher limits + cheaper per-regen at scale"
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/components/marketing/pricing-thinking-modal.tsx
|
|
26
|
+
import { CheckCircle } from "lucide-react";
|
|
27
|
+
import {
|
|
28
|
+
Dialog,
|
|
29
|
+
DialogContent,
|
|
30
|
+
DialogDescription,
|
|
31
|
+
DialogHeader,
|
|
32
|
+
DialogTitle
|
|
33
|
+
} from "@contractspec/lib.ui-kit-web/ui/dialog";
|
|
34
|
+
import { Button } from "@contractspec/lib.design-system";
|
|
35
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
36
|
+
"use client";
|
|
37
|
+
var pricingTiers = [
|
|
38
|
+
{
|
|
39
|
+
tag: "Planned",
|
|
40
|
+
title: "Free",
|
|
41
|
+
priceLine: "For hobbyists and pre-PMF teams",
|
|
42
|
+
bullets: [
|
|
43
|
+
"1 active project",
|
|
44
|
+
"Small spec size",
|
|
45
|
+
`Example: ~${PRICING_EXAMPLES.free.regenerationsPerMonth} free regenerations per month`,
|
|
46
|
+
`Example: ~${PRICING_EXAMPLES.free.aiActionsPerMonth} free AI agent actions per month`,
|
|
47
|
+
"Unlimited collaborators"
|
|
48
|
+
],
|
|
49
|
+
note: "Good enough to build and launch a real product before paying."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
tag: "Planned",
|
|
53
|
+
title: "Builder",
|
|
54
|
+
priceLine: "Usage-based, for solo builders and small teams",
|
|
55
|
+
bullets: [
|
|
56
|
+
"More projects",
|
|
57
|
+
`More monthly regenerations included (e.g. ${PRICING_EXAMPLES.builder.regenerationsPerMonthHint})`,
|
|
58
|
+
`More AI agent actions included (e.g. ${PRICING_EXAMPLES.builder.aiActionsPerMonthHint})`,
|
|
59
|
+
"Pay-as-you-go for extra regenerations and AI",
|
|
60
|
+
"Basic environments (dev / prod)"
|
|
61
|
+
],
|
|
62
|
+
note: "Pay for how fast and how often you evolve your system, not for seats."
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
tag: "Planned",
|
|
66
|
+
title: "Team & Platform",
|
|
67
|
+
priceLine: "For teams standardizing on ContractSpec",
|
|
68
|
+
bullets: [
|
|
69
|
+
"Multiple projects and environments",
|
|
70
|
+
"Higher regeneration and AI action limits",
|
|
71
|
+
"Cheaper overages as you scale",
|
|
72
|
+
"Advanced RBAC and governance",
|
|
73
|
+
"SSO, audit trails, and longer retention"
|
|
74
|
+
],
|
|
75
|
+
note: "For platform teams using ContractSpec as infra for multiple apps."
|
|
76
|
+
}
|
|
77
|
+
];
|
|
78
|
+
var usageMetrics = [
|
|
79
|
+
{
|
|
80
|
+
name: "Regenerations",
|
|
81
|
+
freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.regenerationsPerMonth} regenerations / month`,
|
|
82
|
+
beyond: "Beyond: pay per additional regeneration, with volume discounts."
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
name: "AI agent actions",
|
|
86
|
+
freeTier: `Free tier: e.g. ~${PRICING_EXAMPLES.free.aiActionsPerMonth} AI agent actions / month`,
|
|
87
|
+
beyond: "Beyond: pay-as-you-go for extra AI usage."
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "Projects",
|
|
91
|
+
freeTier: `Free tier: ${PRICING_EXAMPLES.free.projects} project`,
|
|
92
|
+
beyond: "Builder / Team: more projects included; extra projects available as you scale."
|
|
93
|
+
}
|
|
94
|
+
];
|
|
95
|
+
function PricingThinkingModal({
|
|
96
|
+
open,
|
|
97
|
+
onOpenChange,
|
|
98
|
+
onApplyClick
|
|
99
|
+
}) {
|
|
100
|
+
return /* @__PURE__ */ jsxDEV(Dialog, {
|
|
101
|
+
open,
|
|
102
|
+
onOpenChange,
|
|
103
|
+
children: /* @__PURE__ */ jsxDEV(DialogContent, {
|
|
104
|
+
className: "max-h-[90vh] w-full overflow-y-auto md:max-w-5xl",
|
|
105
|
+
children: [
|
|
106
|
+
/* @__PURE__ */ jsxDEV(DialogHeader, {
|
|
107
|
+
children: [
|
|
108
|
+
/* @__PURE__ */ jsxDEV(DialogTitle, {
|
|
109
|
+
children: "Tentative pricing (work in progress)"
|
|
110
|
+
}, undefined, false, undefined, this),
|
|
111
|
+
/* @__PURE__ */ jsxDEV(DialogDescription, {
|
|
112
|
+
children: "We're still in design-partner mode. This is a draft of how we expect pricing to look once we open public access."
|
|
113
|
+
}, undefined, false, undefined, this)
|
|
114
|
+
]
|
|
115
|
+
}, undefined, true, undefined, this),
|
|
116
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
117
|
+
className: "space-y-8",
|
|
118
|
+
children: [
|
|
119
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
120
|
+
className: "space-y-4",
|
|
121
|
+
children: [
|
|
122
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
123
|
+
className: "flex items-center gap-2",
|
|
124
|
+
children: [
|
|
125
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
126
|
+
className: "text-muted-foreground text-xs font-medium",
|
|
127
|
+
children: "Draft"
|
|
128
|
+
}, undefined, false, undefined, this),
|
|
129
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
130
|
+
className: "text-muted-foreground text-xs",
|
|
131
|
+
children: "•"
|
|
132
|
+
}, undefined, false, undefined, this),
|
|
133
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
134
|
+
className: "text-muted-foreground text-xs",
|
|
135
|
+
children: "Subject to change"
|
|
136
|
+
}, undefined, false, undefined, this)
|
|
137
|
+
]
|
|
138
|
+
}, undefined, true, undefined, this),
|
|
139
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
140
|
+
className: "grid gap-4 md:grid-cols-3",
|
|
141
|
+
children: pricingTiers.map((tier) => /* @__PURE__ */ jsxDEV("div", {
|
|
142
|
+
className: "card-subtle relative space-y-4 p-6",
|
|
143
|
+
children: [
|
|
144
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
145
|
+
className: "bg-muted border-border absolute -top-2 left-1/2 -translate-x-1/2 rounded-full border px-2 py-0.5 text-xs font-medium",
|
|
146
|
+
children: tier.tag
|
|
147
|
+
}, undefined, false, undefined, this),
|
|
148
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
149
|
+
className: "space-y-2 pt-2",
|
|
150
|
+
children: [
|
|
151
|
+
/* @__PURE__ */ jsxDEV("h3", {
|
|
152
|
+
className: "text-xl font-bold",
|
|
153
|
+
children: tier.title
|
|
154
|
+
}, undefined, false, undefined, this),
|
|
155
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
156
|
+
className: "text-muted-foreground text-sm",
|
|
157
|
+
children: tier.priceLine
|
|
158
|
+
}, undefined, false, undefined, this)
|
|
159
|
+
]
|
|
160
|
+
}, undefined, true, undefined, this),
|
|
161
|
+
/* @__PURE__ */ jsxDEV("ul", {
|
|
162
|
+
className: "space-y-2",
|
|
163
|
+
children: tier.bullets.map((bullet, i) => /* @__PURE__ */ jsxDEV("li", {
|
|
164
|
+
className: "text-muted-foreground flex gap-2 text-sm",
|
|
165
|
+
children: [
|
|
166
|
+
/* @__PURE__ */ jsxDEV(CheckCircle, {
|
|
167
|
+
size: 14,
|
|
168
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
169
|
+
}, undefined, false, undefined, this),
|
|
170
|
+
bullet
|
|
171
|
+
]
|
|
172
|
+
}, i, true, undefined, this))
|
|
173
|
+
}, undefined, false, undefined, this),
|
|
174
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
175
|
+
className: "text-muted-foreground text-xs italic",
|
|
176
|
+
children: tier.note
|
|
177
|
+
}, undefined, false, undefined, this)
|
|
178
|
+
]
|
|
179
|
+
}, tier.title, true, undefined, this))
|
|
180
|
+
}, undefined, false, undefined, this)
|
|
181
|
+
]
|
|
182
|
+
}, undefined, true, undefined, this),
|
|
183
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
184
|
+
className: "border-border space-y-4 border-t pt-6",
|
|
185
|
+
children: [
|
|
186
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
187
|
+
children: [
|
|
188
|
+
/* @__PURE__ */ jsxDEV("h3", {
|
|
189
|
+
className: "text-lg font-bold",
|
|
190
|
+
children: "Usage-based, with a generous free tier"
|
|
191
|
+
}, undefined, false, undefined, this),
|
|
192
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
193
|
+
className: "text-muted-foreground mt-2 text-sm",
|
|
194
|
+
children: "Inspired by products like PostHog, we plan to keep a generous free tier on all plans, then charge based on actual usage: regenerations, AI agent actions, and the number of projects you run on ContractSpec."
|
|
195
|
+
}, undefined, false, undefined, this),
|
|
196
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
197
|
+
className: "text-muted-foreground mt-3 text-xs italic",
|
|
198
|
+
children: "Free tier limits are intentionally small but useful: enough to try the agent and regenerate a real project, not enough to run a full team's workload for free."
|
|
199
|
+
}, undefined, false, undefined, this)
|
|
200
|
+
]
|
|
201
|
+
}, undefined, true, undefined, this),
|
|
202
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
203
|
+
className: "grid gap-4 md:grid-cols-3",
|
|
204
|
+
children: usageMetrics.map((metric) => /* @__PURE__ */ jsxDEV("div", {
|
|
205
|
+
className: "card-subtle space-y-2 p-4",
|
|
206
|
+
children: [
|
|
207
|
+
/* @__PURE__ */ jsxDEV("h4", {
|
|
208
|
+
className: "text-sm font-semibold",
|
|
209
|
+
children: metric.name
|
|
210
|
+
}, undefined, false, undefined, this),
|
|
211
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
212
|
+
className: "text-muted-foreground text-xs",
|
|
213
|
+
children: metric.freeTier
|
|
214
|
+
}, undefined, false, undefined, this),
|
|
215
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
216
|
+
className: "text-muted-foreground text-xs",
|
|
217
|
+
children: metric.beyond
|
|
218
|
+
}, undefined, false, undefined, this)
|
|
219
|
+
]
|
|
220
|
+
}, metric.name, true, undefined, this))
|
|
221
|
+
}, undefined, false, undefined, this)
|
|
222
|
+
]
|
|
223
|
+
}, undefined, true, undefined, this),
|
|
224
|
+
/* @__PURE__ */ jsxDEV("div", {
|
|
225
|
+
className: "border-border space-y-4 border-t pt-6",
|
|
226
|
+
children: [
|
|
227
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
228
|
+
className: "text-muted-foreground text-xs",
|
|
229
|
+
children: "These numbers are examples only. Final pricing and limits will evolve as we learn from design partners."
|
|
230
|
+
}, undefined, false, undefined, this),
|
|
231
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
232
|
+
className: "text-muted-foreground text-xs",
|
|
233
|
+
children: "This is a tentative pricing model. We're pre-PMF and pricing is still in draft, subject to change based on what we learn."
|
|
234
|
+
}, undefined, false, undefined, this),
|
|
235
|
+
/* @__PURE__ */ jsxDEV("p", {
|
|
236
|
+
className: "text-muted-foreground text-xs",
|
|
237
|
+
children: "Design partners get early access and a founding discount when paid plans launch."
|
|
238
|
+
}, undefined, false, undefined, this),
|
|
239
|
+
onApplyClick && /* @__PURE__ */ jsxDEV(Button, {
|
|
240
|
+
onClick: () => {
|
|
241
|
+
onOpenChange(false);
|
|
242
|
+
onApplyClick();
|
|
243
|
+
},
|
|
244
|
+
className: "w-full",
|
|
245
|
+
variant: "outline",
|
|
246
|
+
children: "Apply as a design partner"
|
|
247
|
+
}, undefined, false, undefined, this)
|
|
248
|
+
]
|
|
249
|
+
}, undefined, true, undefined, this)
|
|
250
|
+
]
|
|
251
|
+
}, undefined, true, undefined, this)
|
|
252
|
+
]
|
|
253
|
+
}, undefined, true, undefined, this)
|
|
254
|
+
}, undefined, false, undefined, this);
|
|
255
|
+
}
|
|
256
|
+
export {
|
|
257
|
+
PricingThinkingModal
|
|
258
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined")
|
|
5
|
+
return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/components/marketing/sections/AudienceSection.tsx
|
|
10
|
+
import {
|
|
11
|
+
MarketingCard,
|
|
12
|
+
MarketingCardContent,
|
|
13
|
+
MarketingCardHeader,
|
|
14
|
+
MarketingCardTitle,
|
|
15
|
+
MarketingCardsSection
|
|
16
|
+
} from "@contractspec/lib.design-system";
|
|
17
|
+
import { VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
18
|
+
import { Muted, Small } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
19
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
20
|
+
var audiences = [
|
|
21
|
+
{
|
|
22
|
+
tier: "Tier 1: Priority",
|
|
23
|
+
title: "AI-Native Startups & Technical Founders",
|
|
24
|
+
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.",
|
|
25
|
+
need: "Need: A way to stabilize AI-generated code without rewriting it."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
tier: "Tier 1: Priority",
|
|
29
|
+
title: "Small Teams with AI-Generated Chaos",
|
|
30
|
+
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.",
|
|
31
|
+
need: "Need: Incremental stabilization, safe regeneration, contracts as guardrails."
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
tier: "Tier 2: Growth",
|
|
35
|
+
title: "AI Dev Agencies",
|
|
36
|
+
body: "Agencies building many projects for clients using AI-assisted development. Repeating the same patterns, inconsistent quality across projects, handoff nightmares.",
|
|
37
|
+
need: "Need: Reusable templates, consistent contracts, professional handoff artifacts."
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
tier: "Tier 2: Growth",
|
|
41
|
+
title: "Scaleups with Compliance Needs",
|
|
42
|
+
body: "Growing companies that need audit trails, API governance, or regulatory compliance. AI-generated code doesn't meet compliance requirements.",
|
|
43
|
+
need: "Need: Governance layer, change tracking, contract enforcement."
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
function AudienceSection() {
|
|
47
|
+
return /* @__PURE__ */ jsxDEV(MarketingCardsSection, {
|
|
48
|
+
tone: "default",
|
|
49
|
+
columns: 2,
|
|
50
|
+
eyebrow: "Who It's For",
|
|
51
|
+
title: "Built for teams drowning in AI-generated code",
|
|
52
|
+
maxWidth: "xl",
|
|
53
|
+
children: audiences.map((item) => /* @__PURE__ */ jsxDEV(MarketingCard, {
|
|
54
|
+
tone: "muted",
|
|
55
|
+
children: [
|
|
56
|
+
/* @__PURE__ */ jsxDEV(MarketingCardHeader, {
|
|
57
|
+
className: "space-y-2",
|
|
58
|
+
children: [
|
|
59
|
+
/* @__PURE__ */ jsxDEV(Small, {
|
|
60
|
+
className: "font-semibold text-blue-400",
|
|
61
|
+
children: item.tier
|
|
62
|
+
}, undefined, false, undefined, this),
|
|
63
|
+
/* @__PURE__ */ jsxDEV(MarketingCardTitle, {
|
|
64
|
+
className: "text-xl",
|
|
65
|
+
children: item.title
|
|
66
|
+
}, undefined, false, undefined, this)
|
|
67
|
+
]
|
|
68
|
+
}, undefined, true, undefined, this),
|
|
69
|
+
/* @__PURE__ */ jsxDEV(MarketingCardContent, {
|
|
70
|
+
children: /* @__PURE__ */ jsxDEV(VStack, {
|
|
71
|
+
gap: "sm",
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ jsxDEV(Muted, {
|
|
74
|
+
className: "text-sm leading-relaxed",
|
|
75
|
+
children: item.body
|
|
76
|
+
}, undefined, false, undefined, this),
|
|
77
|
+
/* @__PURE__ */ jsxDEV(Small, {
|
|
78
|
+
className: "font-medium text-violet-400",
|
|
79
|
+
children: item.need
|
|
80
|
+
}, undefined, false, undefined, this)
|
|
81
|
+
]
|
|
82
|
+
}, undefined, true, undefined, this)
|
|
83
|
+
}, undefined, false, undefined, this)
|
|
84
|
+
]
|
|
85
|
+
}, item.title, true, undefined, this))
|
|
86
|
+
}, undefined, false, undefined, this);
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
AudienceSection
|
|
90
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined")
|
|
5
|
+
return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/components/marketing/sections/CorePositioningSection.tsx
|
|
10
|
+
import { MarketingSection, ButtonLink } from "@contractspec/lib.design-system";
|
|
11
|
+
import { VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
12
|
+
import { H2, Lead, Small } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
13
|
+
import { ChevronRight } from "lucide-react";
|
|
14
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
15
|
+
function CorePositioningSection() {
|
|
16
|
+
return /* @__PURE__ */ jsxDEV(MarketingSection, {
|
|
17
|
+
tone: "gradient",
|
|
18
|
+
padding: "comfortable",
|
|
19
|
+
align: "center",
|
|
20
|
+
maxWidth: "lg",
|
|
21
|
+
children: /* @__PURE__ */ jsxDEV(VStack, {
|
|
22
|
+
gap: "md",
|
|
23
|
+
align: "center",
|
|
24
|
+
children: [
|
|
25
|
+
/* @__PURE__ */ jsxDEV(H2, {
|
|
26
|
+
className: "text-center text-3xl font-bold md:text-4xl",
|
|
27
|
+
children: [
|
|
28
|
+
"You keep your app.",
|
|
29
|
+
/* @__PURE__ */ jsxDEV("br", {}, undefined, false, undefined, this),
|
|
30
|
+
"We stabilize it, one module at a time."
|
|
31
|
+
]
|
|
32
|
+
}, undefined, true, undefined, this),
|
|
33
|
+
/* @__PURE__ */ jsxDEV(Lead, {
|
|
34
|
+
className: "text-center",
|
|
35
|
+
children: [
|
|
36
|
+
"You own the code. It's standard tech.",
|
|
37
|
+
/* @__PURE__ */ jsxDEV("br", {}, undefined, false, undefined, this),
|
|
38
|
+
/* @__PURE__ */ jsxDEV(Small, {
|
|
39
|
+
className: "font-semibold text-violet-400",
|
|
40
|
+
children: "We're the compiler, not the prison."
|
|
41
|
+
}, undefined, false, undefined, this)
|
|
42
|
+
]
|
|
43
|
+
}, undefined, true, undefined, this),
|
|
44
|
+
/* @__PURE__ */ jsxDEV(VStack, {
|
|
45
|
+
as: "div",
|
|
46
|
+
gap: "sm",
|
|
47
|
+
align: "center",
|
|
48
|
+
className: "pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center",
|
|
49
|
+
children: [
|
|
50
|
+
/* @__PURE__ */ jsxDEV(ButtonLink, {
|
|
51
|
+
href: "/pricing#waitlist",
|
|
52
|
+
children: [
|
|
53
|
+
"Join waitlist ",
|
|
54
|
+
/* @__PURE__ */ jsxDEV(ChevronRight, {
|
|
55
|
+
size: 16
|
|
56
|
+
}, undefined, false, undefined, this)
|
|
57
|
+
]
|
|
58
|
+
}, undefined, true, undefined, this),
|
|
59
|
+
/* @__PURE__ */ jsxDEV(ButtonLink, {
|
|
60
|
+
variant: "ghost",
|
|
61
|
+
href: "/contact",
|
|
62
|
+
children: "Book a call"
|
|
63
|
+
}, undefined, false, undefined, this)
|
|
64
|
+
]
|
|
65
|
+
}, undefined, true, undefined, this)
|
|
66
|
+
]
|
|
67
|
+
}, undefined, true, undefined, this)
|
|
68
|
+
}, undefined, false, undefined, this);
|
|
69
|
+
}
|
|
70
|
+
export {
|
|
71
|
+
CorePositioningSection
|
|
72
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined")
|
|
5
|
+
return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/components/marketing/sections/CtaSection.tsx
|
|
10
|
+
import { MarketingSection, ButtonLink } from "@contractspec/lib.design-system";
|
|
11
|
+
import {
|
|
12
|
+
analyticsEventNames,
|
|
13
|
+
captureAnalyticsEvent
|
|
14
|
+
} from "@contractspec/bundle.library/libs/posthog/client";
|
|
15
|
+
import { VStack } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
16
|
+
import { H2, Lead } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
17
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
18
|
+
function CtaSection() {
|
|
19
|
+
return /* @__PURE__ */ jsxDEV(MarketingSection, {
|
|
20
|
+
tone: "gradient",
|
|
21
|
+
padding: "comfortable",
|
|
22
|
+
align: "center",
|
|
23
|
+
maxWidth: "lg",
|
|
24
|
+
children: /* @__PURE__ */ jsxDEV(VStack, {
|
|
25
|
+
gap: "md",
|
|
26
|
+
align: "center",
|
|
27
|
+
className: "text-center",
|
|
28
|
+
children: [
|
|
29
|
+
/* @__PURE__ */ jsxDEV(H2, {
|
|
30
|
+
className: "text-4xl font-bold md:text-5xl",
|
|
31
|
+
children: "Ready to stabilize your codebase?"
|
|
32
|
+
}, undefined, false, undefined, this),
|
|
33
|
+
/* @__PURE__ */ jsxDEV(Lead, {
|
|
34
|
+
className: "text-muted-foreground text-lg",
|
|
35
|
+
children: "Start with one module. See the difference. Expand at your own pace."
|
|
36
|
+
}, undefined, false, undefined, this),
|
|
37
|
+
/* @__PURE__ */ jsxDEV(VStack, {
|
|
38
|
+
as: "div",
|
|
39
|
+
gap: "sm",
|
|
40
|
+
align: "center",
|
|
41
|
+
className: "pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center",
|
|
42
|
+
children: [
|
|
43
|
+
/* @__PURE__ */ jsxDEV(ButtonLink, {
|
|
44
|
+
href: "/pricing#waitlist",
|
|
45
|
+
onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
|
|
46
|
+
surface: "cta-section"
|
|
47
|
+
}),
|
|
48
|
+
children: "Join waitlist"
|
|
49
|
+
}, undefined, false, undefined, this),
|
|
50
|
+
/* @__PURE__ */ jsxDEV(ButtonLink, {
|
|
51
|
+
variant: "ghost",
|
|
52
|
+
href: "/contact",
|
|
53
|
+
onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
|
|
54
|
+
surface: "cta-section",
|
|
55
|
+
variant: "contact"
|
|
56
|
+
}),
|
|
57
|
+
children: "Book a call"
|
|
58
|
+
}, undefined, false, undefined, this)
|
|
59
|
+
]
|
|
60
|
+
}, undefined, true, undefined, this)
|
|
61
|
+
]
|
|
62
|
+
}, undefined, true, undefined, this)
|
|
63
|
+
}, undefined, false, undefined, this);
|
|
64
|
+
}
|
|
65
|
+
export {
|
|
66
|
+
CtaSection
|
|
67
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined")
|
|
5
|
+
return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/components/marketing/sections/DevelopersSection.tsx
|
|
10
|
+
import {
|
|
11
|
+
ButtonLink,
|
|
12
|
+
MarketingComparisonSection
|
|
13
|
+
} from "@contractspec/lib.design-system";
|
|
14
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
15
|
+
var standardTech = [
|
|
16
|
+
"TypeScript & Zod — schemas you already know",
|
|
17
|
+
"Prisma — standard database access",
|
|
18
|
+
"GraphQL or REST — your choice",
|
|
19
|
+
"React or any UI framework",
|
|
20
|
+
"Bun, Node, Deno — all supported"
|
|
21
|
+
];
|
|
22
|
+
var noMagic = [
|
|
23
|
+
"Generated code is readable & modifiable",
|
|
24
|
+
"No proprietary runtime dependencies",
|
|
25
|
+
"Eject anytime, keep everything",
|
|
26
|
+
"Works with your existing CI/CD",
|
|
27
|
+
"Open spec format"
|
|
28
|
+
];
|
|
29
|
+
function DevelopersSection() {
|
|
30
|
+
return /* @__PURE__ */ jsxDEV(MarketingComparisonSection, {
|
|
31
|
+
tone: "muted",
|
|
32
|
+
title: "Built for developers",
|
|
33
|
+
padding: "comfortable",
|
|
34
|
+
left: { title: "Standard Tech Stack", items: standardTech },
|
|
35
|
+
right: { title: "No Magic, No Lock-in", items: noMagic },
|
|
36
|
+
subtitle: /* @__PURE__ */ jsxDEV(ButtonLink, {
|
|
37
|
+
href: "/docs",
|
|
38
|
+
children: [
|
|
39
|
+
"Read the docs ",
|
|
40
|
+
/* @__PURE__ */ jsxDEV("span", {
|
|
41
|
+
"aria-hidden": true,
|
|
42
|
+
children: "→"
|
|
43
|
+
}, undefined, false, undefined, this)
|
|
44
|
+
]
|
|
45
|
+
}, undefined, true, undefined, this)
|
|
46
|
+
}, undefined, false, undefined, this);
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
DevelopersSection
|
|
50
|
+
};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
+
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
+
}) : x)(function(x) {
|
|
4
|
+
if (typeof require !== "undefined")
|
|
5
|
+
return require.apply(this, arguments);
|
|
6
|
+
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
// src/components/marketing/sections/IconGridSection.tsx
|
|
10
|
+
import { cva } from "class-variance-authority";
|
|
11
|
+
import {
|
|
12
|
+
MarketingCardsSection,
|
|
13
|
+
MarketingIconCard
|
|
14
|
+
} from "@contractspec/lib.design-system";
|
|
15
|
+
import { Muted } from "@contractspec/lib.ui-kit-web/ui/typography";
|
|
16
|
+
import { jsxDEV } from "react/jsx-dev-runtime";
|
|
17
|
+
var itemVariants = cva("", {
|
|
18
|
+
variants: {
|
|
19
|
+
iconRole: {
|
|
20
|
+
iconFirst: "",
|
|
21
|
+
listing: "items-start",
|
|
22
|
+
support: "items-start"
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
defaultVariants: { iconRole: "iconFirst" }
|
|
26
|
+
});
|
|
27
|
+
function IconGridSection({
|
|
28
|
+
eyebrow,
|
|
29
|
+
title,
|
|
30
|
+
subtitle,
|
|
31
|
+
items,
|
|
32
|
+
tone = "default",
|
|
33
|
+
padding,
|
|
34
|
+
columns = 3,
|
|
35
|
+
iconRole = "iconFirst"
|
|
36
|
+
}) {
|
|
37
|
+
return /* @__PURE__ */ jsxDEV(MarketingCardsSection, {
|
|
38
|
+
tone,
|
|
39
|
+
padding,
|
|
40
|
+
eyebrow: eyebrow ? /* @__PURE__ */ jsxDEV(Muted, {
|
|
41
|
+
className: "text-xs font-semibold tracking-[0.2em] uppercase",
|
|
42
|
+
children: eyebrow
|
|
43
|
+
}, undefined, false, undefined, this) : null,
|
|
44
|
+
title,
|
|
45
|
+
subtitle: subtitle ? /* @__PURE__ */ jsxDEV(Muted, {
|
|
46
|
+
className: "text-lg",
|
|
47
|
+
children: subtitle
|
|
48
|
+
}, undefined, false, undefined, this) : null,
|
|
49
|
+
columns,
|
|
50
|
+
children: items.map((card) => /* @__PURE__ */ jsxDEV(MarketingIconCard, {
|
|
51
|
+
icon: card.icon,
|
|
52
|
+
title: card.title,
|
|
53
|
+
description: card.description,
|
|
54
|
+
tone: card.tone,
|
|
55
|
+
iconClassName: card.iconClassName,
|
|
56
|
+
variant: iconRole === "listing" ? "listing" : iconRole === "support" ? "support" : "iconFirst",
|
|
57
|
+
className: itemVariants({ iconRole })
|
|
58
|
+
}, card.title, false, undefined, this))
|
|
59
|
+
}, undefined, false, undefined, this);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// src/components/marketing/sections/FearsSection.tsx
|
|
63
|
+
import { CheckCircle, Code, Unlock, Zap } from "lucide-react";
|
|
64
|
+
import { jsxDEV as jsxDEV2 } from "react/jsx-dev-runtime";
|
|
65
|
+
var fears = [
|
|
66
|
+
{
|
|
67
|
+
title: '"I already have an app"',
|
|
68
|
+
body: "ContractSpec works with existing codebases. You don't start over — you stabilize incrementally, one module at a time. Start with one API endpoint, one data model, one contract.",
|
|
69
|
+
icon: CheckCircle
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
title: '"Vendor lock-in / losing ownership"',
|
|
73
|
+
body: "You own the generated code. It's standard TypeScript, standard SQL, standard GraphQL. ContractSpec is a compiler — like TypeScript itself. You can eject anytime.",
|
|
74
|
+
icon: Unlock
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
title: '"Adoption cost / learning curve"',
|
|
78
|
+
body: "Specs are just TypeScript. If you can write z.object({ name: z.string() }), you can write a ContractSpec. No new language, no magic DSL, no YAML.",
|
|
79
|
+
icon: Code
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
title: '"Forced migrations / magical runtime"',
|
|
83
|
+
body: "ContractSpec generates plain code you can read, debug, and modify. There's no proprietary runtime. Migrations are explicit, reversible, and in your control.",
|
|
84
|
+
icon: Zap
|
|
85
|
+
}
|
|
86
|
+
];
|
|
87
|
+
function FearsSection() {
|
|
88
|
+
return /* @__PURE__ */ jsxDEV2(IconGridSection, {
|
|
89
|
+
tone: "muted",
|
|
90
|
+
columns: 2,
|
|
91
|
+
eyebrow: "We Get It",
|
|
92
|
+
title: "Your fears, addressed",
|
|
93
|
+
subtitle: "We know what you're thinking. Here's why those concerns don't apply to ContractSpec.",
|
|
94
|
+
iconRole: "support",
|
|
95
|
+
items: fears.map((item) => ({
|
|
96
|
+
icon: item.icon,
|
|
97
|
+
title: item.title,
|
|
98
|
+
description: item.body,
|
|
99
|
+
iconClassName: "text-violet-400"
|
|
100
|
+
}))
|
|
101
|
+
}, undefined, false, undefined, this);
|
|
102
|
+
}
|
|
103
|
+
export {
|
|
104
|
+
FearsSection
|
|
105
|
+
};
|