@contractspec/bundle.marketing 1.12.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$colon$types.log +1 -0
- package/.turbo/turbo-build.log +175 -0
- package/.turbo/turbo-lint.log +3 -0
- package/AGENTS.md +36 -0
- package/CHANGELOG.md +416 -0
- package/README.md +57 -0
- package/dist/components/marketing/ChangelogPage.d.ts +21 -0
- package/dist/components/marketing/ChangelogPage.d.ts.map +1 -0
- package/dist/components/marketing/ChangelogPage.js +65 -0
- package/dist/components/marketing/ChangelogPage.js.map +1 -0
- package/dist/components/marketing/CofounderPage.d.ts +7 -0
- package/dist/components/marketing/CofounderPage.d.ts.map +1 -0
- package/dist/components/marketing/CofounderPage.js +468 -0
- package/dist/components/marketing/CofounderPage.js.map +1 -0
- package/dist/components/marketing/ContactClient.d.ts +7 -0
- package/dist/components/marketing/ContactClient.d.ts.map +1 -0
- package/dist/components/marketing/ContactClient.js +158 -0
- package/dist/components/marketing/ContactClient.js.map +1 -0
- package/dist/components/marketing/ContributePage.d.ts +9 -0
- package/dist/components/marketing/ContributePage.d.ts.map +1 -0
- package/dist/components/marketing/ContributePage.js +362 -0
- package/dist/components/marketing/ContributePage.js.map +1 -0
- package/dist/components/marketing/DesignPartnerPage.d.ts +9 -0
- package/dist/components/marketing/DesignPartnerPage.d.ts.map +1 -0
- package/dist/components/marketing/DesignPartnerPage.js +215 -0
- package/dist/components/marketing/DesignPartnerPage.js.map +1 -0
- package/dist/components/marketing/LandingPage.d.ts +7 -0
- package/dist/components/marketing/LandingPage.d.ts.map +1 -0
- package/dist/components/marketing/LandingPage.js +38 -0
- package/dist/components/marketing/LandingPage.js.map +1 -0
- package/dist/components/marketing/PricingClient.d.ts +7 -0
- package/dist/components/marketing/PricingClient.d.ts.map +1 -0
- package/dist/components/marketing/PricingClient.js +521 -0
- package/dist/components/marketing/PricingClient.js.map +1 -0
- package/dist/components/marketing/ProductClientPage.d.ts +7 -0
- package/dist/components/marketing/ProductClientPage.d.ts.map +1 -0
- package/dist/components/marketing/ProductClientPage.js +460 -0
- package/dist/components/marketing/ProductClientPage.js.map +1 -0
- package/dist/components/marketing/index.d.ts +11 -0
- package/dist/components/marketing/index.js +12 -0
- package/dist/components/marketing/pricing-thinking-modal.d.ts +16 -0
- package/dist/components/marketing/pricing-thinking-modal.d.ts.map +1 -0
- package/dist/components/marketing/pricing-thinking-modal.js +202 -0
- package/dist/components/marketing/pricing-thinking-modal.js.map +1 -0
- package/dist/components/marketing/sections/AudienceSection.d.ts +7 -0
- package/dist/components/marketing/sections/AudienceSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/AudienceSection.js +68 -0
- package/dist/components/marketing/sections/AudienceSection.js.map +1 -0
- package/dist/components/marketing/sections/CorePositioningSection.d.ts +7 -0
- package/dist/components/marketing/sections/CorePositioningSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/CorePositioningSection.js +59 -0
- package/dist/components/marketing/sections/CorePositioningSection.js.map +1 -0
- package/dist/components/marketing/sections/CtaSection.d.ts +7 -0
- package/dist/components/marketing/sections/CtaSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/CtaSection.js +54 -0
- package/dist/components/marketing/sections/CtaSection.js.map +1 -0
- package/dist/components/marketing/sections/DevelopersSection.d.ts +7 -0
- package/dist/components/marketing/sections/DevelopersSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/DevelopersSection.js +45 -0
- package/dist/components/marketing/sections/DevelopersSection.js.map +1 -0
- package/dist/components/marketing/sections/FearsSection.d.ts +7 -0
- package/dist/components/marketing/sections/FearsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/FearsSection.js +48 -0
- package/dist/components/marketing/sections/FearsSection.js.map +1 -0
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts +7 -0
- package/dist/components/marketing/sections/HeroMarketingSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/HeroMarketingSection.js +77 -0
- package/dist/components/marketing/sections/HeroMarketingSection.js.map +1 -0
- package/dist/components/marketing/sections/IconGridSection.d.ts +45 -0
- package/dist/components/marketing/sections/IconGridSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/IconGridSection.js +44 -0
- package/dist/components/marketing/sections/IconGridSection.js.map +1 -0
- package/dist/components/marketing/sections/OutputsSection.d.ts +7 -0
- package/dist/components/marketing/sections/OutputsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/OutputsSection.js +59 -0
- package/dist/components/marketing/sections/OutputsSection.js.map +1 -0
- package/dist/components/marketing/sections/ProblemSection.d.ts +7 -0
- package/dist/components/marketing/sections/ProblemSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/ProblemSection.js +46 -0
- package/dist/components/marketing/sections/ProblemSection.js.map +1 -0
- package/dist/components/marketing/sections/SolutionSection.d.ts +7 -0
- package/dist/components/marketing/sections/SolutionSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/SolutionSection.js +46 -0
- package/dist/components/marketing/sections/SolutionSection.js.map +1 -0
- package/dist/components/marketing/sections/StepsSection.d.ts +7 -0
- package/dist/components/marketing/sections/StepsSection.d.ts.map +1 -0
- package/dist/components/marketing/sections/StepsSection.js +52 -0
- package/dist/components/marketing/sections/StepsSection.js.map +1 -0
- package/dist/components/marketing/waitlist-section.d.ts +15 -0
- package/dist/components/marketing/waitlist-section.d.ts.map +1 -0
- package/dist/components/marketing/waitlist-section.js +578 -0
- package/dist/components/marketing/waitlist-section.js.map +1 -0
- package/dist/components/templates/TemplatesClientPage.d.ts +7 -0
- package/dist/components/templates/TemplatesClientPage.d.ts.map +1 -0
- package/dist/components/templates/TemplatesClientPage.js +625 -0
- package/dist/components/templates/TemplatesClientPage.js.map +1 -0
- package/dist/components/templates/TemplatesPage.d.ts +7 -0
- package/dist/components/templates/TemplatesPage.d.ts.map +1 -0
- package/dist/components/templates/TemplatesPage.js +125 -0
- package/dist/components/templates/TemplatesPage.js.map +1 -0
- package/dist/components/templates/TemplatesPreviewModal.d.ts +15 -0
- package/dist/components/templates/TemplatesPreviewModal.d.ts.map +1 -0
- package/dist/components/templates/TemplatesPreviewModal.js +137 -0
- package/dist/components/templates/TemplatesPreviewModal.js.map +1 -0
- package/dist/components/templates/index.d.ts +4 -0
- package/dist/components/templates/index.js +5 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.js +28 -0
- package/dist/libs/email/client.d.ts +15 -0
- package/dist/libs/email/client.d.ts.map +1 -0
- package/dist/libs/email/client.js +113 -0
- package/dist/libs/email/client.js.map +1 -0
- package/dist/libs/email/contact.d.ts +7 -0
- package/dist/libs/email/contact.d.ts.map +1 -0
- package/dist/libs/email/contact.js +71 -0
- package/dist/libs/email/contact.js.map +1 -0
- package/dist/libs/email/newsletter.d.ts +7 -0
- package/dist/libs/email/newsletter.d.ts.map +1 -0
- package/dist/libs/email/newsletter.js +95 -0
- package/dist/libs/email/newsletter.js.map +1 -0
- package/dist/libs/email/types.d.ts +53 -0
- package/dist/libs/email/types.d.ts.map +1 -0
- package/dist/libs/email/types.js +1 -0
- package/dist/libs/email/utils.d.ts +6 -0
- package/dist/libs/email/utils.d.ts.map +1 -0
- package/dist/libs/email/utils.js +7 -0
- package/dist/libs/email/utils.js.map +1 -0
- package/dist/libs/email/waitlist-application.d.ts +7 -0
- package/dist/libs/email/waitlist-application.d.ts.map +1 -0
- package/dist/libs/email/waitlist-application.js +170 -0
- package/dist/libs/email/waitlist-application.js.map +1 -0
- package/dist/libs/email/waitlist.d.ts +7 -0
- package/dist/libs/email/waitlist.d.ts.map +1 -0
- package/dist/libs/email/waitlist.js +105 -0
- package/dist/libs/email/waitlist.js.map +1 -0
- package/dist/libs/pricing-examples.d.ts +22 -0
- package/dist/libs/pricing-examples.d.ts.map +1 -0
- package/dist/libs/pricing-examples.js +21 -0
- package/dist/libs/pricing-examples.js.map +1 -0
- package/dist/registry/engine.d.ts +17 -0
- package/dist/registry/engine.d.ts.map +1 -0
- package/dist/registry/engine.js +24 -0
- package/dist/registry/engine.js.map +1 -0
- package/dist/registry/factory.d.ts +64 -0
- package/dist/registry/factory.d.ts.map +1 -0
- package/dist/registry/factory.js +61 -0
- package/dist/registry/factory.js.map +1 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry-docs.d.ts +15 -0
- package/dist/registry/registry-docs.d.ts.map +1 -0
- package/dist/registry/registry-docs.js +305 -0
- package/dist/registry/registry-docs.js.map +1 -0
- package/dist/registry/registry-landing.d.ts +19 -0
- package/dist/registry/registry-landing.d.ts.map +1 -0
- package/dist/registry/registry-landing.js +95 -0
- package/dist/registry/registry-landing.js.map +1 -0
- package/dist/registry/registry.d.ts +30 -0
- package/dist/registry/registry.d.ts.map +1 -0
- package/dist/registry/registry.js +61 -0
- package/dist/registry/registry.js.map +1 -0
- package/dist/registry/types.d.ts +19 -0
- package/dist/registry/types.d.ts.map +1 -0
- package/dist/registry/types.js +0 -0
- package/dist/registry/utils.d.ts +31 -0
- package/dist/registry/utils.d.ts.map +1 -0
- package/dist/registry/utils.js +54 -0
- package/dist/registry/utils.js.map +1 -0
- package/package.json +151 -0
- package/src/components/marketing/ChangelogPage.tsx +110 -0
- package/src/components/marketing/CofounderPage.tsx +409 -0
- package/src/components/marketing/ContactClient.tsx +174 -0
- package/src/components/marketing/ContributePage.tsx +319 -0
- package/src/components/marketing/DesignPartnerPage.tsx +181 -0
- package/src/components/marketing/LandingPage.tsx +30 -0
- package/src/components/marketing/PricingClient.tsx +446 -0
- package/src/components/marketing/ProductClientPage.tsx +391 -0
- package/src/components/marketing/index.ts +10 -0
- package/src/components/marketing/pricing-thinking-modal.tsx +224 -0
- package/src/components/marketing/sections/AudienceSection.tsx +66 -0
- package/src/components/marketing/sections/CorePositioningSection.tsx +44 -0
- package/src/components/marketing/sections/CtaSection.tsx +57 -0
- package/src/components/marketing/sections/DevelopersSection.tsx +38 -0
- package/src/components/marketing/sections/FearsSection.tsx +45 -0
- package/src/components/marketing/sections/HeroMarketingSection.tsx +73 -0
- package/src/components/marketing/sections/IconGridSection.tsx +91 -0
- package/src/components/marketing/sections/OutputsSection.tsx +59 -0
- package/src/components/marketing/sections/ProblemSection.tsx +47 -0
- package/src/components/marketing/sections/SolutionSection.tsx +47 -0
- package/src/components/marketing/sections/StepsSection.tsx +55 -0
- package/src/components/marketing/waitlist-section.tsx +606 -0
- package/src/components/templates/TemplatesClientPage.tsx +711 -0
- package/src/components/templates/TemplatesPage.tsx +129 -0
- package/src/components/templates/TemplatesPreviewModal.tsx +260 -0
- package/src/components/templates/index.ts +3 -0
- package/src/index.ts +15 -0
- package/src/libs/email/client.test.ts +107 -0
- package/src/libs/email/client.ts +146 -0
- package/src/libs/email/contact.ts +80 -0
- package/src/libs/email/newsletter.ts +108 -0
- package/src/libs/email/types.ts +59 -0
- package/src/libs/email/utils.ts +8 -0
- package/src/libs/email/waitlist-application.ts +192 -0
- package/src/libs/email/waitlist.ts +118 -0
- package/src/libs/pricing-examples.ts +19 -0
- package/src/registry/engine.ts +38 -0
- package/src/registry/factory.ts +110 -0
- package/src/registry/index.ts +7 -0
- package/src/registry/registry-docs.ts +843 -0
- package/src/registry/registry-landing.ts +118 -0
- package/src/registry/registry.ts +85 -0
- package/src/registry/types.ts +17 -0
- package/src/registry/utils.ts +99 -0
- package/tsconfig.json +13 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/tsdown.config.js +10 -0
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { WaitlistSection } from "./waitlist-section.js";
|
|
4
|
+
import { PricingThinkingModal } from "./pricing-thinking-modal.js";
|
|
5
|
+
import { CheckCircle, ChevronDown, ChevronRight } from "lucide-react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { useState } from "react";
|
|
8
|
+
import Link from "next/link";
|
|
9
|
+
|
|
10
|
+
//#region src/components/marketing/PricingClient.tsx
|
|
11
|
+
const faqs = [
|
|
12
|
+
{
|
|
13
|
+
question: "Can I pay for ContractSpec today?",
|
|
14
|
+
answer: "Not yet. We're pre-PMF and working closely with a small set of design partners. They get full access during early access and will be first to move onto paid plans once we're confident in the value and stability."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: "What will you charge for later?",
|
|
18
|
+
answer: "Our plan is to charge based on usage: regenerations, AI agent actions, and number of active projects. A generous free tier will stay available so smaller teams and experiments can thrive."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
question: "What do I get as a design partner?",
|
|
22
|
+
answer: "Direct collaboration on features, priority onboarding, and a founding discount when paid plans launch. You also shape how ContractSpec works for teams like yours."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
question: "Will you ever charge per seat?",
|
|
26
|
+
answer: "No. We want everyone in your team to use ContractSpec without friction. Pricing is tied to how much of your system we help you maintain, not how many teammates you invite."
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
function PricingClient() {
|
|
30
|
+
const [openFaq, setOpenFaq] = useState(null);
|
|
31
|
+
const [pricingModalOpen, setPricingModalOpen] = useState(false);
|
|
32
|
+
const scrollToWaitlist = () => {
|
|
33
|
+
const waitlistElement = document.getElementById("waitlist");
|
|
34
|
+
if (waitlistElement) waitlistElement.scrollIntoView({
|
|
35
|
+
behavior: "smooth",
|
|
36
|
+
block: "start"
|
|
37
|
+
});
|
|
38
|
+
};
|
|
39
|
+
return /* @__PURE__ */ jsxs("main", {
|
|
40
|
+
className: "",
|
|
41
|
+
children: [
|
|
42
|
+
/* @__PURE__ */ jsx("section", {
|
|
43
|
+
className: "section-padding hero-gradient relative",
|
|
44
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
45
|
+
className: "mx-auto max-w-4xl space-y-6 text-center",
|
|
46
|
+
children: [
|
|
47
|
+
/* @__PURE__ */ jsx("h1", {
|
|
48
|
+
className: "text-5xl leading-tight font-bold md:text-6xl",
|
|
49
|
+
children: "Transparent, usage-based pricing – after we earn it."
|
|
50
|
+
}),
|
|
51
|
+
/* @__PURE__ */ jsx("p", {
|
|
52
|
+
className: "text-muted-foreground mx-auto max-w-2xl text-lg",
|
|
53
|
+
children: "ContractSpec Core (the OSS compiler) is and always will be free. ContractSpec Studio (the managed platform) is in early access."
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ jsxs("div", {
|
|
56
|
+
className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
|
|
57
|
+
children: [/* @__PURE__ */ jsxs(Link, {
|
|
58
|
+
href: "/install",
|
|
59
|
+
className: "btn-primary inline-flex items-center gap-2",
|
|
60
|
+
children: ["Install OSS Core ", /* @__PURE__ */ jsx(ChevronRight, { size: 16 })]
|
|
61
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
62
|
+
onClick: scrollToWaitlist,
|
|
63
|
+
className: "btn-ghost inline-flex items-center gap-2",
|
|
64
|
+
children: "Join Studio waitlist"
|
|
65
|
+
})]
|
|
66
|
+
})
|
|
67
|
+
]
|
|
68
|
+
})
|
|
69
|
+
}),
|
|
70
|
+
/* @__PURE__ */ jsx("section", {
|
|
71
|
+
className: "section-padding border-border border-b",
|
|
72
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
73
|
+
className: "mx-auto max-w-6xl",
|
|
74
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
75
|
+
className: "card-subtle flex flex-col gap-6 p-8 md:flex-row md:items-center",
|
|
76
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
77
|
+
className: "flex-1 space-y-4",
|
|
78
|
+
children: [
|
|
79
|
+
/* @__PURE__ */ jsx("div", {
|
|
80
|
+
className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
|
|
81
|
+
children: /* @__PURE__ */ jsx("span", {
|
|
82
|
+
className: "text-sm font-medium text-violet-300",
|
|
83
|
+
children: "Now accepting design partners"
|
|
84
|
+
})
|
|
85
|
+
}),
|
|
86
|
+
/* @__PURE__ */ jsx("h2", {
|
|
87
|
+
className: "text-2xl font-bold",
|
|
88
|
+
children: "Help us design the compiler for AI-native software."
|
|
89
|
+
}),
|
|
90
|
+
/* @__PURE__ */ jsx("p", {
|
|
91
|
+
className: "text-muted-foreground text-sm",
|
|
92
|
+
children: "We work closely with a small group of teams building serious products with AI. You bring real-world complexity, we bring the spec-first engine and a lot of attention."
|
|
93
|
+
})
|
|
94
|
+
]
|
|
95
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
96
|
+
className: "flex-1 space-y-4",
|
|
97
|
+
children: [/* @__PURE__ */ jsxs("ul", {
|
|
98
|
+
className: "text-muted-foreground space-y-2 text-sm",
|
|
99
|
+
children: [
|
|
100
|
+
/* @__PURE__ */ jsxs("li", {
|
|
101
|
+
className: "flex gap-2",
|
|
102
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
103
|
+
size: 16,
|
|
104
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
105
|
+
}), "Early access to ContractSpec Studio"]
|
|
106
|
+
}),
|
|
107
|
+
/* @__PURE__ */ jsxs("li", {
|
|
108
|
+
className: "flex gap-2",
|
|
109
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
110
|
+
size: 16,
|
|
111
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
112
|
+
}), "Hands-on onboarding and architecture help"]
|
|
113
|
+
}),
|
|
114
|
+
/* @__PURE__ */ jsxs("li", {
|
|
115
|
+
className: "flex gap-2",
|
|
116
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
117
|
+
size: 16,
|
|
118
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
119
|
+
}), "Influence over roadmap and features"]
|
|
120
|
+
}),
|
|
121
|
+
/* @__PURE__ */ jsxs("li", {
|
|
122
|
+
className: "flex gap-2",
|
|
123
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
124
|
+
size: 16,
|
|
125
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
126
|
+
}), "Priority support during early access"]
|
|
127
|
+
}),
|
|
128
|
+
/* @__PURE__ */ jsxs("li", {
|
|
129
|
+
className: "flex gap-2",
|
|
130
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
131
|
+
size: 16,
|
|
132
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
133
|
+
}), "Founding discount when paid plans launch"]
|
|
134
|
+
})
|
|
135
|
+
]
|
|
136
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
137
|
+
onClick: scrollToWaitlist,
|
|
138
|
+
className: "btn-primary w-full md:w-auto",
|
|
139
|
+
children: "Apply to the waitlist"
|
|
140
|
+
})]
|
|
141
|
+
})]
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
}),
|
|
145
|
+
/* @__PURE__ */ jsx("section", {
|
|
146
|
+
className: "section-padding border-border border-b",
|
|
147
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
148
|
+
className: "mx-auto max-w-6xl",
|
|
149
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
150
|
+
className: "grid gap-6 md:grid-cols-3",
|
|
151
|
+
children: [
|
|
152
|
+
/* @__PURE__ */ jsxs("div", {
|
|
153
|
+
className: "card-subtle col-span-3 space-y-6 border-violet-500/20 p-6",
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ jsxs("div", {
|
|
156
|
+
className: "absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-violet-500 px-3 py-1 text-xs font-medium text-white",
|
|
157
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
158
|
+
className: "text-1xl font-bold",
|
|
159
|
+
children: "Free Forever"
|
|
160
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
161
|
+
className: "text-muted-foreground text-xs",
|
|
162
|
+
children: "Apache 2.0 / MIT License"
|
|
163
|
+
})]
|
|
164
|
+
}),
|
|
165
|
+
/* @__PURE__ */ jsxs("div", {
|
|
166
|
+
className: "flex flex-row justify-around",
|
|
167
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
168
|
+
className: "w-1/2",
|
|
169
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
170
|
+
className: "space-y-2",
|
|
171
|
+
children: /* @__PURE__ */ jsx("h2", {
|
|
172
|
+
className: "text-2xl font-bold",
|
|
173
|
+
children: "OSS Core"
|
|
174
|
+
})
|
|
175
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
176
|
+
className: "text-muted-foreground text-sm",
|
|
177
|
+
children: "The complete spec-first compiler. Generate API, DB, and UI code locally."
|
|
178
|
+
})]
|
|
179
|
+
}), /* @__PURE__ */ jsxs("ul", {
|
|
180
|
+
className: "space-y-3",
|
|
181
|
+
children: [
|
|
182
|
+
/* @__PURE__ */ jsxs("li", {
|
|
183
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
184
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
185
|
+
size: 16,
|
|
186
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
187
|
+
}), "Unlimited local regenerations"]
|
|
188
|
+
}),
|
|
189
|
+
/* @__PURE__ */ jsxs("li", {
|
|
190
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
191
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
192
|
+
size: 16,
|
|
193
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
194
|
+
}), "All standard generators included"]
|
|
195
|
+
}),
|
|
196
|
+
/* @__PURE__ */ jsxs("li", {
|
|
197
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
198
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
199
|
+
size: 16,
|
|
200
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
201
|
+
}), "Run in your own CI/CD"]
|
|
202
|
+
}),
|
|
203
|
+
/* @__PURE__ */ jsxs("li", {
|
|
204
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
205
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
206
|
+
size: 16,
|
|
207
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
208
|
+
}), "Community support"]
|
|
209
|
+
})
|
|
210
|
+
]
|
|
211
|
+
})]
|
|
212
|
+
}),
|
|
213
|
+
/* @__PURE__ */ jsx(Link, {
|
|
214
|
+
href: "/install",
|
|
215
|
+
className: "btn-ghost w-full",
|
|
216
|
+
children: "Install now"
|
|
217
|
+
})
|
|
218
|
+
]
|
|
219
|
+
}),
|
|
220
|
+
/* @__PURE__ */ jsxs("div", {
|
|
221
|
+
className: "card-subtle relative space-y-6 bg-violet-500/5 p-6 ring-2 ring-violet-500",
|
|
222
|
+
children: [
|
|
223
|
+
/* @__PURE__ */ jsx("div", {
|
|
224
|
+
className: "absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-violet-500 px-3 py-1 text-xs font-medium text-white",
|
|
225
|
+
children: "Current"
|
|
226
|
+
}),
|
|
227
|
+
/* @__PURE__ */ jsxs("div", {
|
|
228
|
+
className: "space-y-2",
|
|
229
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
230
|
+
className: "text-2xl font-bold",
|
|
231
|
+
children: "Design Partner"
|
|
232
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
233
|
+
className: "space-y-1",
|
|
234
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
235
|
+
className: "text-2xl font-bold",
|
|
236
|
+
children: "Free during early access"
|
|
237
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
238
|
+
className: "text-muted-foreground text-xs",
|
|
239
|
+
children: "Founding discount when paid plans launch"
|
|
240
|
+
})]
|
|
241
|
+
})]
|
|
242
|
+
}),
|
|
243
|
+
/* @__PURE__ */ jsxs("ul", {
|
|
244
|
+
className: "space-y-3",
|
|
245
|
+
children: [
|
|
246
|
+
/* @__PURE__ */ jsxs("li", {
|
|
247
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
248
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
249
|
+
size: 16,
|
|
250
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
251
|
+
}), "Use ContractSpec Studio for real projects during early access"]
|
|
252
|
+
}),
|
|
253
|
+
/* @__PURE__ */ jsxs("li", {
|
|
254
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
255
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
256
|
+
size: 16,
|
|
257
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
258
|
+
}), "Work directly with the founder on architecture & use cases"]
|
|
259
|
+
}),
|
|
260
|
+
/* @__PURE__ */ jsxs("li", {
|
|
261
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
262
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
263
|
+
size: 16,
|
|
264
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
265
|
+
}), "Reasonable \"fair use\" limits on regenerations and AI credits"]
|
|
266
|
+
}),
|
|
267
|
+
/* @__PURE__ */ jsxs("li", {
|
|
268
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
269
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
270
|
+
size: 16,
|
|
271
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
272
|
+
}), "Priority support & feedback loops"]
|
|
273
|
+
})
|
|
274
|
+
]
|
|
275
|
+
}),
|
|
276
|
+
/* @__PURE__ */ jsx("button", {
|
|
277
|
+
onClick: scrollToWaitlist,
|
|
278
|
+
className: "btn-primary w-full",
|
|
279
|
+
children: "Apply as a design partner"
|
|
280
|
+
})
|
|
281
|
+
]
|
|
282
|
+
}),
|
|
283
|
+
/* @__PURE__ */ jsxs("div", {
|
|
284
|
+
className: "card-subtle relative space-y-6 p-6",
|
|
285
|
+
children: [
|
|
286
|
+
/* @__PURE__ */ jsx("div", {
|
|
287
|
+
className: "bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium",
|
|
288
|
+
children: "Coming soon"
|
|
289
|
+
}),
|
|
290
|
+
/* @__PURE__ */ jsxs("div", {
|
|
291
|
+
className: "space-y-2",
|
|
292
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
293
|
+
className: "text-2xl font-bold",
|
|
294
|
+
children: "Builder"
|
|
295
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
296
|
+
className: "space-y-1",
|
|
297
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
298
|
+
className: "text-2xl font-bold",
|
|
299
|
+
children: "Usage-based, for solo builders and small teams"
|
|
300
|
+
})
|
|
301
|
+
})]
|
|
302
|
+
}),
|
|
303
|
+
/* @__PURE__ */ jsx("p", {
|
|
304
|
+
className: "text-muted-foreground text-sm",
|
|
305
|
+
children: "Pay only for what you regenerate and the AI you consume. No seat-based pricing, and a generous free tier for experiments."
|
|
306
|
+
}),
|
|
307
|
+
/* @__PURE__ */ jsxs("ul", {
|
|
308
|
+
className: "space-y-2",
|
|
309
|
+
children: [
|
|
310
|
+
/* @__PURE__ */ jsx("li", {
|
|
311
|
+
className: "text-muted-foreground text-sm",
|
|
312
|
+
children: "1–3 projects"
|
|
313
|
+
}),
|
|
314
|
+
/* @__PURE__ */ jsx("li", {
|
|
315
|
+
className: "text-muted-foreground text-sm",
|
|
316
|
+
children: "Generous monthly free regenerations"
|
|
317
|
+
}),
|
|
318
|
+
/* @__PURE__ */ jsx("li", {
|
|
319
|
+
className: "text-muted-foreground text-sm",
|
|
320
|
+
children: "Pay-as-you-go beyond the free tier"
|
|
321
|
+
})
|
|
322
|
+
]
|
|
323
|
+
}),
|
|
324
|
+
/* @__PURE__ */ jsx("button", {
|
|
325
|
+
disabled: true,
|
|
326
|
+
className: "btn-ghost w-full cursor-not-allowed opacity-50",
|
|
327
|
+
children: "Available after public launch"
|
|
328
|
+
})
|
|
329
|
+
]
|
|
330
|
+
}),
|
|
331
|
+
/* @__PURE__ */ jsxs("div", {
|
|
332
|
+
className: "card-subtle relative space-y-6 p-6",
|
|
333
|
+
children: [
|
|
334
|
+
/* @__PURE__ */ jsx("div", {
|
|
335
|
+
className: "bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium",
|
|
336
|
+
children: "Coming soon"
|
|
337
|
+
}),
|
|
338
|
+
/* @__PURE__ */ jsxs("div", {
|
|
339
|
+
className: "space-y-2",
|
|
340
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
341
|
+
className: "text-2xl font-bold",
|
|
342
|
+
children: "Team & Platform"
|
|
343
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
344
|
+
className: "space-y-1",
|
|
345
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
346
|
+
className: "text-2xl font-bold",
|
|
347
|
+
children: "Custom, for teams standardizing on ContractSpec"
|
|
348
|
+
})
|
|
349
|
+
})]
|
|
350
|
+
}),
|
|
351
|
+
/* @__PURE__ */ jsx("p", {
|
|
352
|
+
className: "text-muted-foreground text-sm",
|
|
353
|
+
children: "For teams running multiple apps or platforms on ContractSpec, with stricter governance, data, and compliance needs."
|
|
354
|
+
}),
|
|
355
|
+
/* @__PURE__ */ jsxs("ul", {
|
|
356
|
+
className: "space-y-3",
|
|
357
|
+
children: [
|
|
358
|
+
/* @__PURE__ */ jsxs("li", {
|
|
359
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
360
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
361
|
+
size: 16,
|
|
362
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
363
|
+
}), "Multiple projects and environments"]
|
|
364
|
+
}),
|
|
365
|
+
/* @__PURE__ */ jsxs("li", {
|
|
366
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
367
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
368
|
+
size: 16,
|
|
369
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
370
|
+
}), "Advanced RBAC and policy packs"]
|
|
371
|
+
}),
|
|
372
|
+
/* @__PURE__ */ jsxs("li", {
|
|
373
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
374
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
375
|
+
size: 16,
|
|
376
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
377
|
+
}), "SSO, audit trails, and longer retention"]
|
|
378
|
+
}),
|
|
379
|
+
/* @__PURE__ */ jsxs("li", {
|
|
380
|
+
className: "text-muted-foreground flex gap-3 text-sm",
|
|
381
|
+
children: [/* @__PURE__ */ jsx(CheckCircle, {
|
|
382
|
+
size: 16,
|
|
383
|
+
className: "mt-0.5 shrink-0 text-violet-400"
|
|
384
|
+
}), "Priority support & SLAs"]
|
|
385
|
+
})
|
|
386
|
+
]
|
|
387
|
+
}),
|
|
388
|
+
/* @__PURE__ */ jsx(Link, {
|
|
389
|
+
href: "/contact",
|
|
390
|
+
className: "btn-ghost w-full",
|
|
391
|
+
children: "Talk to us"
|
|
392
|
+
})
|
|
393
|
+
]
|
|
394
|
+
})
|
|
395
|
+
]
|
|
396
|
+
})
|
|
397
|
+
})
|
|
398
|
+
}),
|
|
399
|
+
/* @__PURE__ */ jsx("section", {
|
|
400
|
+
className: "section-padding border-border bg-muted/20 border-b",
|
|
401
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
402
|
+
className: "mx-auto max-w-4xl space-y-8",
|
|
403
|
+
children: [
|
|
404
|
+
/* @__PURE__ */ jsxs("div", {
|
|
405
|
+
className: "space-y-4 text-center",
|
|
406
|
+
children: [/* @__PURE__ */ jsx("h2", {
|
|
407
|
+
className: "text-3xl font-bold",
|
|
408
|
+
children: "How ContractSpec pricing will work"
|
|
409
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
410
|
+
className: "text-muted-foreground mx-auto max-w-2xl text-lg",
|
|
411
|
+
children: "We charge based on how much of your stack we help you maintain, not how many people click around in the UI."
|
|
412
|
+
})]
|
|
413
|
+
}),
|
|
414
|
+
/* @__PURE__ */ jsxs("div", {
|
|
415
|
+
className: "grid gap-6 md:grid-cols-3",
|
|
416
|
+
children: [
|
|
417
|
+
/* @__PURE__ */ jsxs("div", {
|
|
418
|
+
className: "card-subtle space-y-3 p-6",
|
|
419
|
+
children: [/* @__PURE__ */ jsx("h3", {
|
|
420
|
+
className: "font-bold",
|
|
421
|
+
children: "Generous free tier"
|
|
422
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
423
|
+
className: "text-muted-foreground text-sm",
|
|
424
|
+
children: "One serious project, small spec, and enough monthly regenerations to ship something real."
|
|
425
|
+
})]
|
|
426
|
+
}),
|
|
427
|
+
/* @__PURE__ */ jsxs("div", {
|
|
428
|
+
className: "card-subtle space-y-3 p-6",
|
|
429
|
+
children: [/* @__PURE__ */ jsx("h3", {
|
|
430
|
+
className: "font-bold",
|
|
431
|
+
children: "Usage-based beyond free"
|
|
432
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
433
|
+
className: "text-muted-foreground text-sm",
|
|
434
|
+
children: "You pay for regenerations and AI agent actions, not per-seat. The more your system evolves via ContractSpec, the more you pay."
|
|
435
|
+
})]
|
|
436
|
+
}),
|
|
437
|
+
/* @__PURE__ */ jsxs("div", {
|
|
438
|
+
className: "card-subtle space-y-3 p-6",
|
|
439
|
+
children: [/* @__PURE__ */ jsx("h3", {
|
|
440
|
+
className: "font-bold",
|
|
441
|
+
children: "No lock-in"
|
|
442
|
+
}), /* @__PURE__ */ jsx("p", {
|
|
443
|
+
className: "text-muted-foreground text-sm",
|
|
444
|
+
children: "Generated code is standard, readable, and exportable. If you leave, your app keeps running."
|
|
445
|
+
})]
|
|
446
|
+
})
|
|
447
|
+
]
|
|
448
|
+
}),
|
|
449
|
+
/* @__PURE__ */ jsx("div", {
|
|
450
|
+
className: "pt-6 text-center",
|
|
451
|
+
children: /* @__PURE__ */ jsx("button", {
|
|
452
|
+
onClick: () => setPricingModalOpen(true),
|
|
453
|
+
className: "btn-ghost",
|
|
454
|
+
children: "View our tentative pricing model"
|
|
455
|
+
})
|
|
456
|
+
})
|
|
457
|
+
]
|
|
458
|
+
})
|
|
459
|
+
}),
|
|
460
|
+
/* @__PURE__ */ jsx("section", {
|
|
461
|
+
className: "section-padding border-border border-b",
|
|
462
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
463
|
+
className: "mx-auto max-w-3xl space-y-8",
|
|
464
|
+
children: [
|
|
465
|
+
/* @__PURE__ */ jsx("h2", {
|
|
466
|
+
className: "text-center text-3xl font-bold",
|
|
467
|
+
children: "Frequently asked questions"
|
|
468
|
+
}),
|
|
469
|
+
/* @__PURE__ */ jsx("div", {
|
|
470
|
+
className: "space-y-4",
|
|
471
|
+
children: faqs.map((faq, i) => /* @__PURE__ */ jsxs("div", {
|
|
472
|
+
className: "card-subtle overflow-hidden",
|
|
473
|
+
children: [/* @__PURE__ */ jsxs("button", {
|
|
474
|
+
onClick: () => setOpenFaq(openFaq === i ? null : i),
|
|
475
|
+
className: "flex w-full items-center justify-between p-6 text-left",
|
|
476
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
477
|
+
className: "font-medium",
|
|
478
|
+
children: faq.question
|
|
479
|
+
}), /* @__PURE__ */ jsx(ChevronDown, {
|
|
480
|
+
size: 20,
|
|
481
|
+
className: `text-muted-foreground transition-transform ${openFaq === i ? "rotate-180" : ""}`
|
|
482
|
+
})]
|
|
483
|
+
}), openFaq === i && /* @__PURE__ */ jsx("div", {
|
|
484
|
+
className: "text-muted-foreground px-6 pb-6 text-sm",
|
|
485
|
+
children: faq.answer
|
|
486
|
+
})]
|
|
487
|
+
}, i))
|
|
488
|
+
}),
|
|
489
|
+
/* @__PURE__ */ jsxs("div", {
|
|
490
|
+
className: "pt-4 text-center",
|
|
491
|
+
children: [/* @__PURE__ */ jsx("p", {
|
|
492
|
+
className: "text-muted-foreground mb-2 text-sm",
|
|
493
|
+
children: "Still unsure?"
|
|
494
|
+
}), /* @__PURE__ */ jsx(Link, {
|
|
495
|
+
href: "/contact",
|
|
496
|
+
className: "text-sm font-medium text-violet-400 hover:text-violet-300",
|
|
497
|
+
children: "Contact us →"
|
|
498
|
+
})]
|
|
499
|
+
})
|
|
500
|
+
]
|
|
501
|
+
})
|
|
502
|
+
}),
|
|
503
|
+
/* @__PURE__ */ jsx("section", {
|
|
504
|
+
className: "section-padding hero-gradient",
|
|
505
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
506
|
+
className: "mx-auto max-w-4xl",
|
|
507
|
+
children: /* @__PURE__ */ jsx(WaitlistSection, {})
|
|
508
|
+
})
|
|
509
|
+
}),
|
|
510
|
+
/* @__PURE__ */ jsx(PricingThinkingModal, {
|
|
511
|
+
open: pricingModalOpen,
|
|
512
|
+
onOpenChange: setPricingModalOpen,
|
|
513
|
+
onApplyClick: scrollToWaitlist
|
|
514
|
+
})
|
|
515
|
+
]
|
|
516
|
+
});
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
//#endregion
|
|
520
|
+
export { PricingClient };
|
|
521
|
+
//# sourceMappingURL=PricingClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PricingClient.js","names":[],"sources":["../../../src/components/marketing/PricingClient.tsx"],"sourcesContent":["'use client';\n\nimport { useState } from 'react';\nimport Link from 'next/link';\nimport { CheckCircle, ChevronDown, ChevronRight } from 'lucide-react';\n\nimport { WaitlistSection } from './waitlist-section';\nimport { PricingThinkingModal } from './pricing-thinking-modal';\n\ninterface FAQ {\n question: string;\n answer: string;\n}\n\nconst faqs: FAQ[] = [\n {\n question: 'Can I pay for ContractSpec today?',\n answer:\n \"Not yet. We're pre-PMF and working closely with a small set of design partners. They get full access during early access and will be first to move onto paid plans once we're confident in the value and stability.\",\n },\n {\n question: 'What will you charge for later?',\n answer:\n 'Our plan is to charge based on usage: regenerations, AI agent actions, and number of active projects. A generous free tier will stay available so smaller teams and experiments can thrive.',\n },\n {\n question: 'What do I get as a design partner?',\n answer:\n 'Direct collaboration on features, priority onboarding, and a founding discount when paid plans launch. You also shape how ContractSpec works for teams like yours.',\n },\n {\n question: 'Will you ever charge per seat?',\n answer:\n 'No. We want everyone in your team to use ContractSpec without friction. Pricing is tied to how much of your system we help you maintain, not how many teammates you invite.',\n },\n];\n\nexport function PricingClient() {\n const [openFaq, setOpenFaq] = useState<number | null>(null);\n const [pricingModalOpen, setPricingModalOpen] = useState(false);\n\n const scrollToWaitlist = () => {\n const waitlistElement = document.getElementById('waitlist');\n if (waitlistElement) {\n waitlistElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n };\n\n return (\n <main className=\"\">\n {/* Hero */}\n <section className=\"section-padding hero-gradient relative\">\n <div className=\"mx-auto max-w-4xl space-y-6 text-center\">\n <h1 className=\"text-5xl leading-tight font-bold md:text-6xl\">\n Transparent, usage-based pricing – after we earn it.\n </h1>\n <p className=\"text-muted-foreground mx-auto max-w-2xl text-lg\">\n ContractSpec Core (the OSS compiler) is and always will be free.\n ContractSpec Studio (the managed platform) is in early access.\n </p>\n <div className=\"flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row\">\n <Link\n href=\"/install\"\n className=\"btn-primary inline-flex items-center gap-2\"\n >\n Install OSS Core <ChevronRight size={16} />\n </Link>\n <button\n onClick={scrollToWaitlist}\n className=\"btn-ghost inline-flex items-center gap-2\"\n >\n Join Studio waitlist\n </button>\n </div>\n </div>\n </section>\n\n {/* Design-Partner Highlight Strip */}\n <section className=\"section-padding border-border border-b\">\n <div className=\"mx-auto max-w-6xl\">\n <div className=\"card-subtle flex flex-col gap-6 p-8 md:flex-row md:items-center\">\n <div className=\"flex-1 space-y-4\">\n <div className=\"inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1\">\n <span className=\"text-sm font-medium text-violet-300\">\n Now accepting design partners\n </span>\n </div>\n <h2 className=\"text-2xl font-bold\">\n Help us design the compiler for AI-native software.\n </h2>\n <p className=\"text-muted-foreground text-sm\">\n We work closely with a small group of teams building serious\n products with AI. You bring real-world complexity, we bring the\n spec-first engine and a lot of attention.\n </p>\n </div>\n <div className=\"flex-1 space-y-4\">\n <ul className=\"text-muted-foreground space-y-2 text-sm\">\n <li className=\"flex gap-2\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Early access to ContractSpec Studio\n </li>\n <li className=\"flex gap-2\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Hands-on onboarding and architecture help\n </li>\n <li className=\"flex gap-2\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Influence over roadmap and features\n </li>\n <li className=\"flex gap-2\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Priority support during early access\n </li>\n <li className=\"flex gap-2\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Founding discount when paid plans launch\n </li>\n </ul>\n <button\n onClick={scrollToWaitlist}\n className=\"btn-primary w-full md:w-auto\"\n >\n Apply to the waitlist\n </button>\n </div>\n </div>\n </div>\n </section>\n\n {/* Future Pricing Tiers */}\n <section className=\"section-padding border-border border-b\">\n <div className=\"mx-auto max-w-6xl\">\n <div className=\"grid gap-6 md:grid-cols-3\">\n {/* OSS Core (Forever Free) */}\n <div className=\"card-subtle col-span-3 space-y-6 border-violet-500/20 p-6\">\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-violet-500 px-3 py-1 text-xs font-medium text-white\">\n <div className=\"text-1xl font-bold\">Free Forever</div>\n <p className=\"text-muted-foreground text-xs\">\n Apache 2.0 / MIT License\n </p>\n </div>\n <div className=\"flex flex-row justify-around\">\n <div className=\"w-1/2\">\n <div className=\"space-y-2\">\n <h2 className=\"text-2xl font-bold\">OSS Core</h2>\n </div>\n <p className=\"text-muted-foreground text-sm\">\n The complete spec-first compiler. Generate API, DB, and UI\n code locally.\n </p>\n </div>\n <ul className=\"space-y-3\">\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Unlimited local regenerations\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n All standard generators included\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Run in your own CI/CD\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Community support\n </li>\n </ul>\n </div>\n <Link href=\"/install\" className=\"btn-ghost w-full\">\n Install now\n </Link>\n </div>\n\n {/* Design Partner (Current) */}\n <div className=\"card-subtle relative space-y-6 bg-violet-500/5 p-6 ring-2 ring-violet-500\">\n <div className=\"absolute -top-3 left-1/2 -translate-x-1/2 rounded-full bg-violet-500 px-3 py-1 text-xs font-medium text-white\">\n Current\n </div>\n <div className=\"space-y-2\">\n <h2 className=\"text-2xl font-bold\">Design Partner</h2>\n <div className=\"space-y-1\">\n <div className=\"text-2xl font-bold\">\n Free during early access\n </div>\n <p className=\"text-muted-foreground text-xs\">\n Founding discount when paid plans launch\n </p>\n </div>\n </div>\n <ul className=\"space-y-3\">\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Use ContractSpec Studio for real projects during early access\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Work directly with the founder on architecture & use cases\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Reasonable \"fair use\" limits on regenerations and AI credits\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Priority support & feedback loops\n </li>\n </ul>\n <button onClick={scrollToWaitlist} className=\"btn-primary w-full\">\n Apply as a design partner\n </button>\n </div>\n\n {/* Builder (Coming Soon) */}\n <div className=\"card-subtle relative space-y-6 p-6\">\n <div className=\"bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium\">\n Coming soon\n </div>\n <div className=\"space-y-2\">\n <h2 className=\"text-2xl font-bold\">Builder</h2>\n <div className=\"space-y-1\">\n <div className=\"text-2xl font-bold\">\n Usage-based, for solo builders and small teams\n </div>\n </div>\n </div>\n <p className=\"text-muted-foreground text-sm\">\n Pay only for what you regenerate and the AI you consume. No\n seat-based pricing, and a generous free tier for experiments.\n </p>\n <ul className=\"space-y-2\">\n <li className=\"text-muted-foreground text-sm\">1–3 projects</li>\n <li className=\"text-muted-foreground text-sm\">\n Generous monthly free regenerations\n </li>\n <li className=\"text-muted-foreground text-sm\">\n Pay-as-you-go beyond the free tier\n </li>\n </ul>\n <button\n disabled\n className=\"btn-ghost w-full cursor-not-allowed opacity-50\"\n >\n Available after public launch\n </button>\n </div>\n\n {/* Team / Enterprise (Coming Soon) */}\n <div className=\"card-subtle relative space-y-6 p-6\">\n <div className=\"bg-muted border-border absolute -top-3 left-1/2 -translate-x-1/2 rounded-full border px-3 py-1 text-xs font-medium\">\n Coming soon\n </div>\n <div className=\"space-y-2\">\n <h2 className=\"text-2xl font-bold\">Team & Platform</h2>\n <div className=\"space-y-1\">\n <div className=\"text-2xl font-bold\">\n Custom, for teams standardizing on ContractSpec\n </div>\n </div>\n </div>\n <p className=\"text-muted-foreground text-sm\">\n For teams running multiple apps or platforms on ContractSpec,\n with stricter governance, data, and compliance needs.\n </p>\n <ul className=\"space-y-3\">\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Multiple projects and environments\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Advanced RBAC and policy packs\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n SSO, audit trails, and longer retention\n </li>\n <li className=\"text-muted-foreground flex gap-3 text-sm\">\n <CheckCircle\n size={16}\n className=\"mt-0.5 shrink-0 text-violet-400\"\n />\n Priority support & SLAs\n </li>\n </ul>\n <Link href=\"/contact\" className=\"btn-ghost w-full\">\n Talk to us\n </Link>\n </div>\n </div>\n </div>\n </section>\n\n {/* How Pricing Will Work */}\n <section className=\"section-padding border-border bg-muted/20 border-b\">\n <div className=\"mx-auto max-w-4xl space-y-8\">\n <div className=\"space-y-4 text-center\">\n <h2 className=\"text-3xl font-bold\">\n How ContractSpec pricing will work\n </h2>\n <p className=\"text-muted-foreground mx-auto max-w-2xl text-lg\">\n We charge based on how much of your stack we help you maintain,\n not how many people click around in the UI.\n </p>\n </div>\n <div className=\"grid gap-6 md:grid-cols-3\">\n <div className=\"card-subtle space-y-3 p-6\">\n <h3 className=\"font-bold\">Generous free tier</h3>\n <p className=\"text-muted-foreground text-sm\">\n One serious project, small spec, and enough monthly\n regenerations to ship something real.\n </p>\n </div>\n <div className=\"card-subtle space-y-3 p-6\">\n <h3 className=\"font-bold\">Usage-based beyond free</h3>\n <p className=\"text-muted-foreground text-sm\">\n You pay for regenerations and AI agent actions, not per-seat.\n The more your system evolves via ContractSpec, the more you pay.\n </p>\n </div>\n <div className=\"card-subtle space-y-3 p-6\">\n <h3 className=\"font-bold\">No lock-in</h3>\n <p className=\"text-muted-foreground text-sm\">\n Generated code is standard, readable, and exportable. If you\n leave, your app keeps running.\n </p>\n </div>\n </div>\n <div className=\"pt-6 text-center\">\n <button\n onClick={() => setPricingModalOpen(true)}\n className=\"btn-ghost\"\n >\n View our tentative pricing model\n </button>\n </div>\n </div>\n </section>\n\n {/* FAQ */}\n <section className=\"section-padding border-border border-b\">\n <div className=\"mx-auto max-w-3xl space-y-8\">\n <h2 className=\"text-center text-3xl font-bold\">\n Frequently asked questions\n </h2>\n <div className=\"space-y-4\">\n {faqs.map((faq, i) => (\n <div key={i} className=\"card-subtle overflow-hidden\">\n <button\n onClick={() => setOpenFaq(openFaq === i ? null : i)}\n className=\"flex w-full items-center justify-between p-6 text-left\"\n >\n <span className=\"font-medium\">{faq.question}</span>\n <ChevronDown\n size={20}\n className={`text-muted-foreground transition-transform ${\n openFaq === i ? 'rotate-180' : ''\n }`}\n />\n </button>\n {openFaq === i && (\n <div className=\"text-muted-foreground px-6 pb-6 text-sm\">\n {faq.answer}\n </div>\n )}\n </div>\n ))}\n </div>\n <div className=\"pt-4 text-center\">\n <p className=\"text-muted-foreground mb-2 text-sm\">Still unsure?</p>\n <Link\n href=\"/contact\"\n className=\"text-sm font-medium text-violet-400 hover:text-violet-300\"\n >\n Contact us →\n </Link>\n </div>\n </div>\n </section>\n\n {/* Waitlist Section */}\n <section className=\"section-padding hero-gradient\">\n <div className=\"mx-auto max-w-4xl\">\n <WaitlistSection />\n </div>\n </section>\n\n {/* Pricing Thinking Modal */}\n <PricingThinkingModal\n open={pricingModalOpen}\n onOpenChange={setPricingModalOpen}\n onApplyClick={scrollToWaitlist}\n />\n </main>\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
2
|
+
|
|
3
|
+
//#region src/components/marketing/ProductClientPage.d.ts
|
|
4
|
+
declare const ProductClientPage: () => react_jsx_runtime0.JSX.Element;
|
|
5
|
+
//#endregion
|
|
6
|
+
export { ProductClientPage };
|
|
7
|
+
//# sourceMappingURL=ProductClientPage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProductClientPage.d.ts","names":[],"sources":["../../../src/components/marketing/ProductClientPage.tsx"],"mappings":";;;cAoBa,iBAAA,QAAiB,kBAAA,CAAA,GAAA,CAAA,OAAA"}
|