@contractspec/bundle.marketing 2.0.0 → 2.1.1
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 +73 -73
- package/CHANGELOG.md +51 -0
- package/README.md +6 -1
- package/dist/browser/components/marketing/CofounderPage.js +2 -2
- package/dist/browser/components/marketing/ContactClient.js +57 -961
- package/dist/browser/components/marketing/DesignPartnerPage.js +2 -2
- package/dist/browser/components/marketing/LandingPage.js +6 -6
- package/dist/browser/components/marketing/PricingClient.js +107 -1127
- package/dist/browser/components/marketing/ProductClientPage.js +2 -2
- package/dist/browser/components/marketing/index.js +157 -1064
- package/dist/browser/components/marketing/pricing-thinking-modal.js +3 -3
- package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/browser/components/marketing/sections/CtaSection.js +2 -2
- package/dist/browser/components/marketing/sections/HeroMarketingSection.js +2 -2
- package/dist/browser/components/marketing/studio-signup-section.js +87 -0
- package/dist/browser/components/templates/TemplatesClientPage.js +175 -1082
- package/dist/browser/components/templates/index.js +181 -1088
- package/dist/browser/index.js +505 -1157
- package/dist/browser/registry/engine.js +158 -1080
- package/dist/browser/registry/index.js +158 -1080
- package/dist/browser/registry/registry-docs.js +2 -17
- package/dist/browser/registry/registry-landing.js +156 -1063
- package/dist/browser/registry/registry.js +158 -1080
- package/dist/browser/registry/utils.js +158 -1080
- package/dist/components/marketing/CofounderPage.js +2 -2
- package/dist/components/marketing/ContactClient.js +57 -961
- package/dist/components/marketing/DesignPartnerPage.js +2 -2
- package/dist/components/marketing/LandingPage.js +6 -6
- package/dist/components/marketing/PricingClient.js +107 -1127
- package/dist/components/marketing/ProductClientPage.js +2 -2
- package/dist/components/marketing/index.d.ts +1 -1
- package/dist/components/marketing/index.js +157 -1064
- package/dist/components/marketing/pricing-thinking-modal.js +3 -3
- package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/components/marketing/sections/CtaSection.js +2 -2
- package/dist/components/marketing/sections/HeroMarketingSection.js +2 -2
- package/dist/components/marketing/studio-signup-section.d.ts +5 -0
- package/dist/components/marketing/studio-signup-section.js +82 -0
- package/dist/components/templates/TemplatesClientPage.js +175 -1082
- package/dist/components/templates/index.js +181 -1088
- package/dist/index.js +505 -1157
- package/dist/node/components/marketing/CofounderPage.js +2 -2
- package/dist/node/components/marketing/ContactClient.js +57 -961
- package/dist/node/components/marketing/DesignPartnerPage.js +2 -2
- package/dist/node/components/marketing/LandingPage.js +6 -6
- package/dist/node/components/marketing/PricingClient.js +107 -1127
- package/dist/node/components/marketing/ProductClientPage.js +2 -2
- package/dist/node/components/marketing/index.js +157 -1064
- package/dist/node/components/marketing/pricing-thinking-modal.js +3 -3
- package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/node/components/marketing/sections/CtaSection.js +2 -2
- package/dist/node/components/marketing/sections/HeroMarketingSection.js +2 -2
- package/dist/node/components/marketing/studio-signup-section.js +82 -0
- package/dist/node/components/templates/TemplatesClientPage.js +175 -1082
- package/dist/node/components/templates/index.js +181 -1088
- package/dist/node/index.js +505 -1157
- package/dist/node/registry/engine.js +158 -1080
- package/dist/node/registry/index.js +158 -1080
- package/dist/node/registry/registry-docs.js +2 -17
- package/dist/node/registry/registry-landing.js +156 -1063
- package/dist/node/registry/registry.js +158 -1080
- package/dist/node/registry/utils.js +158 -1080
- package/dist/registry/engine.js +158 -1080
- package/dist/registry/index.js +158 -1080
- package/dist/registry/registry-docs.js +2 -17
- package/dist/registry/registry-landing.js +156 -1063
- package/dist/registry/registry.js +158 -1080
- package/dist/registry/utils.js +158 -1080
- package/package.json +35 -35
- package/src/components/marketing/CofounderPage.tsx +2 -2
- package/src/components/marketing/ContactClient.tsx +3 -3
- package/src/components/marketing/DesignPartnerPage.tsx +3 -3
- package/src/components/marketing/PricingClient.tsx +39 -38
- package/src/components/marketing/ProductClientPage.tsx +2 -2
- package/src/components/marketing/index.ts +1 -1
- package/src/components/marketing/pricing-thinking-modal.tsx +5 -5
- package/src/components/marketing/sections/CorePositioningSection.tsx +2 -2
- package/src/components/marketing/sections/CtaSection.tsx +2 -2
- package/src/components/marketing/sections/HeroMarketingSection.tsx +2 -2
- package/src/components/marketing/studio-signup-section.tsx +56 -0
- package/src/components/templates/TemplatesClientPage.tsx +12 -9
- package/src/registry/registry-docs.ts +0 -40
- package/dist/browser/components/marketing/waitlist-section.js +0 -1104
- package/dist/components/marketing/waitlist-section.d.ts +0 -7
- package/dist/components/marketing/waitlist-section.js +0 -1099
- package/dist/node/components/marketing/waitlist-section.js +0 -1099
- package/src/components/marketing/waitlist-section.tsx +0 -606
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contractspec/bundle.marketing",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"clean": "rm -rf dist",
|
|
@@ -178,12 +178,12 @@
|
|
|
178
178
|
"browser": "./dist/browser/components/marketing/sections/StepsSection.js",
|
|
179
179
|
"default": "./dist/components/marketing/sections/StepsSection.js"
|
|
180
180
|
},
|
|
181
|
-
"./components/marketing/
|
|
182
|
-
"types": "./dist/components/marketing/
|
|
183
|
-
"bun": "./dist/components/marketing/
|
|
184
|
-
"node": "./dist/node/components/marketing/
|
|
185
|
-
"browser": "./dist/browser/components/marketing/
|
|
186
|
-
"default": "./dist/components/marketing/
|
|
181
|
+
"./components/marketing/studio-signup-section": {
|
|
182
|
+
"types": "./dist/components/marketing/studio-signup-section.d.ts",
|
|
183
|
+
"bun": "./dist/components/marketing/studio-signup-section.js",
|
|
184
|
+
"node": "./dist/node/components/marketing/studio-signup-section.js",
|
|
185
|
+
"browser": "./dist/browser/components/marketing/studio-signup-section.js",
|
|
186
|
+
"default": "./dist/components/marketing/studio-signup-section.js"
|
|
187
187
|
},
|
|
188
188
|
"./components/templates": {
|
|
189
189
|
"types": "./dist/components/templates/index.d.ts",
|
|
@@ -342,28 +342,28 @@
|
|
|
342
342
|
},
|
|
343
343
|
"types": "./dist/index.d.ts",
|
|
344
344
|
"dependencies": {
|
|
345
|
-
"@contractspec/bundle.library": "2.
|
|
346
|
-
"@contractspec/example.agent-console": "2.
|
|
347
|
-
"@contractspec/example.analytics-dashboard": "2.
|
|
348
|
-
"@contractspec/example.crm-pipeline": "2.
|
|
349
|
-
"@contractspec/example.integration-hub": "2.
|
|
350
|
-
"@contractspec/example.marketplace": "2.
|
|
351
|
-
"@contractspec/example.saas-boilerplate": "2.
|
|
352
|
-
"@contractspec/example.workflow-system": "2.
|
|
353
|
-
"@contractspec/lib.contracts-spec": "2.
|
|
354
|
-
"@contractspec/lib.contracts-runtime-client-react": "2.
|
|
355
|
-
"@contractspec/lib.design-system": "2.
|
|
356
|
-
"@contractspec/lib.email": "2.
|
|
357
|
-
"@contractspec/lib.example-shared-ui": "2.
|
|
358
|
-
"@contractspec/lib.logger": "2.
|
|
359
|
-
"@contractspec/lib.runtime-sandbox": "1.
|
|
360
|
-
"@contractspec/lib.ui-kit-core": "2.
|
|
361
|
-
"@contractspec/lib.ui-kit-web": "2.
|
|
362
|
-
"@contractspec/lib.ui-link": "2.
|
|
363
|
-
"@contractspec/module.examples": "2.
|
|
345
|
+
"@contractspec/bundle.library": "2.1.1",
|
|
346
|
+
"@contractspec/example.agent-console": "2.1.1",
|
|
347
|
+
"@contractspec/example.analytics-dashboard": "2.1.1",
|
|
348
|
+
"@contractspec/example.crm-pipeline": "2.1.1",
|
|
349
|
+
"@contractspec/example.integration-hub": "2.1.1",
|
|
350
|
+
"@contractspec/example.marketplace": "2.1.1",
|
|
351
|
+
"@contractspec/example.saas-boilerplate": "2.1.1",
|
|
352
|
+
"@contractspec/example.workflow-system": "2.1.1",
|
|
353
|
+
"@contractspec/lib.contracts-spec": "2.1.1",
|
|
354
|
+
"@contractspec/lib.contracts-runtime-client-react": "2.1.1",
|
|
355
|
+
"@contractspec/lib.design-system": "2.1.1",
|
|
356
|
+
"@contractspec/lib.email": "2.1.0",
|
|
357
|
+
"@contractspec/lib.example-shared-ui": "2.1.1",
|
|
358
|
+
"@contractspec/lib.logger": "2.1.0",
|
|
359
|
+
"@contractspec/lib.runtime-sandbox": "1.1.0",
|
|
360
|
+
"@contractspec/lib.ui-kit-core": "2.1.0",
|
|
361
|
+
"@contractspec/lib.ui-kit-web": "2.1.0",
|
|
362
|
+
"@contractspec/lib.ui-link": "2.1.0",
|
|
363
|
+
"@contractspec/module.examples": "2.1.1",
|
|
364
364
|
"@electric-sql/pglite": "^0.3.14",
|
|
365
365
|
"@hookform/resolvers": "^5.2.2",
|
|
366
|
-
"@scaleway/sdk": "^3.
|
|
366
|
+
"@scaleway/sdk": "^3.2.0",
|
|
367
367
|
"@scaleway/sdk-client": "^2.1.0",
|
|
368
368
|
"class-variance-authority": "^0.7.1",
|
|
369
369
|
"framer-motion": "^12.34.0",
|
|
@@ -375,9 +375,9 @@
|
|
|
375
375
|
},
|
|
376
376
|
"devDependencies": {
|
|
377
377
|
"@types/react": "~19.2.14",
|
|
378
|
-
"@contractspec/tool.typescript": "2.
|
|
378
|
+
"@contractspec/tool.typescript": "2.1.0",
|
|
379
379
|
"typescript": "^5.9.3",
|
|
380
|
-
"@contractspec/tool.bun": "2.
|
|
380
|
+
"@contractspec/tool.bun": "2.1.0"
|
|
381
381
|
},
|
|
382
382
|
"publishConfig": {
|
|
383
383
|
"access": "public",
|
|
@@ -544,12 +544,12 @@
|
|
|
544
544
|
"browser": "./dist/browser/components/marketing/sections/StepsSection.js",
|
|
545
545
|
"default": "./dist/components/marketing/sections/StepsSection.js"
|
|
546
546
|
},
|
|
547
|
-
"./components/marketing/
|
|
548
|
-
"types": "./dist/components/marketing/
|
|
549
|
-
"bun": "./dist/components/marketing/
|
|
550
|
-
"node": "./dist/node/components/marketing/
|
|
551
|
-
"browser": "./dist/browser/components/marketing/
|
|
552
|
-
"default": "./dist/components/marketing/
|
|
547
|
+
"./components/marketing/studio-signup-section": {
|
|
548
|
+
"types": "./dist/components/marketing/studio-signup-section.d.ts",
|
|
549
|
+
"bun": "./dist/components/marketing/studio-signup-section.js",
|
|
550
|
+
"node": "./dist/node/components/marketing/studio-signup-section.js",
|
|
551
|
+
"browser": "./dist/browser/components/marketing/studio-signup-section.js",
|
|
552
|
+
"default": "./dist/components/marketing/studio-signup-section.js"
|
|
553
553
|
},
|
|
554
554
|
"./components/templates": {
|
|
555
555
|
"types": "./dist/components/templates/index.d.ts",
|
|
@@ -77,7 +77,7 @@ function WhatExistsSection() {
|
|
|
77
77
|
];
|
|
78
78
|
|
|
79
79
|
const planned = [
|
|
80
|
-
'
|
|
80
|
+
'ContractSpec Studio product-decision engine',
|
|
81
81
|
'Auto-evolution engine',
|
|
82
82
|
'Multi-tenant SaaS',
|
|
83
83
|
'Integration marketplace',
|
|
@@ -128,7 +128,7 @@ function RoleSection() {
|
|
|
128
128
|
const productDeliverables = [
|
|
129
129
|
'Ship UI/UX improvements weekly',
|
|
130
130
|
'Define specs based on user research',
|
|
131
|
-
'Own the
|
|
131
|
+
'Own the Studio product experience',
|
|
132
132
|
'Collaborate on architecture decisions',
|
|
133
133
|
];
|
|
134
134
|
|
|
@@ -12,7 +12,7 @@ import type { SubmitContactFormResult } from '../../libs/email/types'; // Assumi
|
|
|
12
12
|
// Wait check imports again. submitContactForm is imported from @contractspec/bundle.marketing.
|
|
13
13
|
// In bundle.marketing, it is likely in 'src/actions' or 'src/utils'.
|
|
14
14
|
// I need to check where submitContactForm is defined in bundle.marketing.
|
|
15
|
-
import {
|
|
15
|
+
import { StudioSignupSection } from './studio-signup-section';
|
|
16
16
|
import {
|
|
17
17
|
ActionForm,
|
|
18
18
|
Button,
|
|
@@ -63,8 +63,8 @@ export function ContactClient() {
|
|
|
63
63
|
</Muted>
|
|
64
64
|
</VStack>
|
|
65
65
|
|
|
66
|
-
{/*
|
|
67
|
-
<
|
|
66
|
+
{/* Studio Signup Section */}
|
|
67
|
+
<StudioSignupSection />
|
|
68
68
|
|
|
69
69
|
{/* Book a Call Section */}
|
|
70
70
|
<VStack className="card-subtle gap-6 p-8" id="call">
|
|
@@ -48,12 +48,12 @@ export function DesignPartnerPage() {
|
|
|
48
48
|
<h3 className="text-xl font-semibold">1. Access the Studio</h3>
|
|
49
49
|
<p className="text-muted-foreground">
|
|
50
50
|
Your account has been enabled with Design Partner privileges.
|
|
51
|
-
Log in to
|
|
52
|
-
|
|
51
|
+
Log in to ContractSpec Studio to run the full loop from evidence
|
|
52
|
+
to spec-first deliverables with your team.
|
|
53
53
|
</p>
|
|
54
54
|
<div className="pt-2">
|
|
55
55
|
<Button asChild variant="outline">
|
|
56
|
-
<Link href="https://
|
|
56
|
+
<Link href="https://app.contractspec.studio">
|
|
57
57
|
Launch Studio <ArrowRight className="ml-2 h-4 w-4" />
|
|
58
58
|
</Link>
|
|
59
59
|
</Button>
|
|
@@ -4,7 +4,7 @@ import { useState } from 'react';
|
|
|
4
4
|
import Link from 'next/link';
|
|
5
5
|
import { CheckCircle, ChevronDown, ChevronRight } from 'lucide-react';
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { StudioSignupSection } from './studio-signup-section';
|
|
8
8
|
import { PricingThinkingModal } from './pricing-thinking-modal';
|
|
9
9
|
|
|
10
10
|
interface FAQ {
|
|
@@ -14,19 +14,19 @@ interface FAQ {
|
|
|
14
14
|
|
|
15
15
|
const faqs: FAQ[] = [
|
|
16
16
|
{
|
|
17
|
-
question: 'Can I
|
|
17
|
+
question: 'Can I use ContractSpec Studio today?',
|
|
18
18
|
answer:
|
|
19
|
-
|
|
19
|
+
'Yes. ContractSpec Studio is live at app.contractspec.studio. Start with the free tier and upgrade as paid plans roll out.',
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
question: 'What will you charge for later?',
|
|
23
23
|
answer:
|
|
24
|
-
'
|
|
24
|
+
'Pricing is evolving toward usage: regenerations, AI agent actions, and active projects. A generous free tier will remain so smaller teams and experiments can thrive.',
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
question: 'What do I get as a design partner?',
|
|
28
28
|
answer:
|
|
29
|
-
'Direct collaboration on
|
|
29
|
+
'Direct collaboration on roadmap priorities, hands-on onboarding, and priority support. You also help shape Studio workflows before broad rollout.',
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
question: 'Will you ever charge per seat?',
|
|
@@ -39,11 +39,12 @@ export function PricingClient() {
|
|
|
39
39
|
const [openFaq, setOpenFaq] = useState<number | null>(null);
|
|
40
40
|
const [pricingModalOpen, setPricingModalOpen] = useState(false);
|
|
41
41
|
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
const openStudio = () => {
|
|
43
|
+
window.open(
|
|
44
|
+
'https://app.contractspec.studio',
|
|
45
|
+
'_blank',
|
|
46
|
+
'noopener,noreferrer'
|
|
47
|
+
);
|
|
47
48
|
};
|
|
48
49
|
|
|
49
50
|
return (
|
|
@@ -56,7 +57,8 @@ export function PricingClient() {
|
|
|
56
57
|
</h1>
|
|
57
58
|
<p className="text-muted-foreground mx-auto max-w-2xl text-lg">
|
|
58
59
|
ContractSpec Core (the OSS compiler) is and always will be free.
|
|
59
|
-
ContractSpec Studio
|
|
60
|
+
ContractSpec Studio is live, with paid plans rolling out
|
|
61
|
+
progressively.
|
|
60
62
|
</p>
|
|
61
63
|
<div className="flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row">
|
|
62
64
|
<Link
|
|
@@ -65,12 +67,12 @@ export function PricingClient() {
|
|
|
65
67
|
>
|
|
66
68
|
Install OSS Core <ChevronRight size={16} />
|
|
67
69
|
</Link>
|
|
68
|
-
<
|
|
69
|
-
|
|
70
|
+
<Link
|
|
71
|
+
href="https://app.contractspec.studio"
|
|
70
72
|
className="btn-ghost inline-flex items-center gap-2"
|
|
71
73
|
>
|
|
72
|
-
|
|
73
|
-
</
|
|
74
|
+
Try Studio Free
|
|
75
|
+
</Link>
|
|
74
76
|
</div>
|
|
75
77
|
</div>
|
|
76
78
|
</section>
|
|
@@ -101,7 +103,7 @@ export function PricingClient() {
|
|
|
101
103
|
size={16}
|
|
102
104
|
className="mt-0.5 shrink-0 text-violet-400"
|
|
103
105
|
/>
|
|
104
|
-
|
|
106
|
+
Priority access to new Studio capabilities
|
|
105
107
|
</li>
|
|
106
108
|
<li className="flex gap-2">
|
|
107
109
|
<CheckCircle
|
|
@@ -122,22 +124,22 @@ export function PricingClient() {
|
|
|
122
124
|
size={16}
|
|
123
125
|
className="mt-0.5 shrink-0 text-violet-400"
|
|
124
126
|
/>
|
|
125
|
-
Priority support
|
|
127
|
+
Priority support through direct channels
|
|
126
128
|
</li>
|
|
127
129
|
<li className="flex gap-2">
|
|
128
130
|
<CheckCircle
|
|
129
131
|
size={16}
|
|
130
132
|
className="mt-0.5 shrink-0 text-violet-400"
|
|
131
133
|
/>
|
|
132
|
-
|
|
134
|
+
Pricing input and partner incentives
|
|
133
135
|
</li>
|
|
134
136
|
</ul>
|
|
135
|
-
<
|
|
136
|
-
|
|
137
|
+
<Link
|
|
138
|
+
href="/design-partner"
|
|
137
139
|
className="btn-primary w-full md:w-auto"
|
|
138
140
|
>
|
|
139
|
-
Apply
|
|
140
|
-
</
|
|
141
|
+
Apply as a design partner
|
|
142
|
+
</Link>
|
|
141
143
|
</div>
|
|
142
144
|
</div>
|
|
143
145
|
</div>
|
|
@@ -204,16 +206,14 @@ export function PricingClient() {
|
|
|
204
206
|
{/* Design Partner (Current) */}
|
|
205
207
|
<div className="card-subtle relative space-y-6 bg-violet-500/5 p-6 ring-2 ring-violet-500">
|
|
206
208
|
<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">
|
|
207
|
-
|
|
209
|
+
Live program
|
|
208
210
|
</div>
|
|
209
211
|
<div className="space-y-2">
|
|
210
212
|
<h2 className="text-2xl font-bold">Design Partner</h2>
|
|
211
213
|
<div className="space-y-1">
|
|
212
|
-
<div className="text-2xl font-bold">
|
|
213
|
-
Free during early access
|
|
214
|
-
</div>
|
|
214
|
+
<div className="text-2xl font-bold">Invite-based</div>
|
|
215
215
|
<p className="text-muted-foreground text-xs">
|
|
216
|
-
|
|
216
|
+
Built for teams shaping the next Studio capabilities
|
|
217
217
|
</p>
|
|
218
218
|
</div>
|
|
219
219
|
</div>
|
|
@@ -223,33 +223,34 @@ export function PricingClient() {
|
|
|
223
223
|
size={16}
|
|
224
224
|
className="mt-0.5 shrink-0 text-violet-400"
|
|
225
225
|
/>
|
|
226
|
-
Use ContractSpec Studio for real projects
|
|
226
|
+
Use ContractSpec Studio for real projects
|
|
227
227
|
</li>
|
|
228
228
|
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
229
229
|
<CheckCircle
|
|
230
230
|
size={16}
|
|
231
231
|
className="mt-0.5 shrink-0 text-violet-400"
|
|
232
232
|
/>
|
|
233
|
-
Work directly with the
|
|
233
|
+
Work directly with the team on architecture and workflow
|
|
234
|
+
design
|
|
234
235
|
</li>
|
|
235
236
|
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
236
237
|
<CheckCircle
|
|
237
238
|
size={16}
|
|
238
239
|
className="mt-0.5 shrink-0 text-violet-400"
|
|
239
240
|
/>
|
|
240
|
-
|
|
241
|
+
Access to partner-only previews and feedback loops
|
|
241
242
|
</li>
|
|
242
243
|
<li className="text-muted-foreground flex gap-3 text-sm">
|
|
243
244
|
<CheckCircle
|
|
244
245
|
size={16}
|
|
245
246
|
className="mt-0.5 shrink-0 text-violet-400"
|
|
246
247
|
/>
|
|
247
|
-
Priority support
|
|
248
|
+
Priority support and roadmap influence
|
|
248
249
|
</li>
|
|
249
250
|
</ul>
|
|
250
|
-
<
|
|
251
|
+
<Link href="/design-partner" className="btn-primary w-full">
|
|
251
252
|
Apply as a design partner
|
|
252
|
-
</
|
|
253
|
+
</Link>
|
|
253
254
|
</div>
|
|
254
255
|
|
|
255
256
|
{/* Builder (Coming Soon) */}
|
|
@@ -282,7 +283,7 @@ export function PricingClient() {
|
|
|
282
283
|
disabled
|
|
283
284
|
className="btn-ghost w-full cursor-not-allowed opacity-50"
|
|
284
285
|
>
|
|
285
|
-
Available after
|
|
286
|
+
Available after pricing rollout
|
|
286
287
|
</button>
|
|
287
288
|
</div>
|
|
288
289
|
|
|
@@ -346,7 +347,7 @@ export function PricingClient() {
|
|
|
346
347
|
<div className="mx-auto max-w-4xl space-y-8">
|
|
347
348
|
<div className="space-y-4 text-center">
|
|
348
349
|
<h2 className="text-3xl font-bold">
|
|
349
|
-
How ContractSpec pricing
|
|
350
|
+
How ContractSpec pricing works now and next
|
|
350
351
|
</h2>
|
|
351
352
|
<p className="text-muted-foreground mx-auto max-w-2xl text-lg">
|
|
352
353
|
We charge based on how much of your stack we help you maintain,
|
|
@@ -428,10 +429,10 @@ export function PricingClient() {
|
|
|
428
429
|
</div>
|
|
429
430
|
</section>
|
|
430
431
|
|
|
431
|
-
{/*
|
|
432
|
+
{/* Studio Signup Section */}
|
|
432
433
|
<section className="section-padding hero-gradient">
|
|
433
434
|
<div className="mx-auto max-w-4xl">
|
|
434
|
-
<
|
|
435
|
+
<StudioSignupSection />
|
|
435
436
|
</div>
|
|
436
437
|
</section>
|
|
437
438
|
|
|
@@ -439,7 +440,7 @@ export function PricingClient() {
|
|
|
439
440
|
<PricingThinkingModal
|
|
440
441
|
open={pricingModalOpen}
|
|
441
442
|
onOpenChange={setPricingModalOpen}
|
|
442
|
-
onApplyClick={
|
|
443
|
+
onApplyClick={openStudio}
|
|
443
444
|
/>
|
|
444
445
|
</main>
|
|
445
446
|
);
|
|
@@ -381,8 +381,8 @@ export const ProductClientPage = () => (
|
|
|
381
381
|
>
|
|
382
382
|
Install OSS Core <ChevronRight size={16} />
|
|
383
383
|
</Link>
|
|
384
|
-
<Link href="
|
|
385
|
-
|
|
384
|
+
<Link href="https://app.contractspec.studio" className="btn-ghost">
|
|
385
|
+
Try Studio
|
|
386
386
|
</Link>
|
|
387
387
|
</div>
|
|
388
388
|
</div>
|
|
@@ -6,5 +6,5 @@ export { ChangelogPage } from './ChangelogPage';
|
|
|
6
6
|
export { CofounderPage } from './CofounderPage';
|
|
7
7
|
export { ContributePage } from './ContributePage';
|
|
8
8
|
export { DesignPartnerPage } from './DesignPartnerPage';
|
|
9
|
-
export {
|
|
9
|
+
export { StudioSignupSection } from './studio-signup-section';
|
|
10
10
|
export { PricingThinkingModal } from './pricing-thinking-modal';
|
|
@@ -103,8 +103,8 @@ export function PricingThinkingModal({
|
|
|
103
103
|
<DialogHeader>
|
|
104
104
|
<DialogTitle>Tentative pricing (work in progress)</DialogTitle>
|
|
105
105
|
<DialogDescription>
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
ContractSpec Studio is live. This is a draft of how paid plans are
|
|
107
|
+
expected to evolve as usage grows.
|
|
108
108
|
</DialogDescription>
|
|
109
109
|
</DialogHeader>
|
|
110
110
|
|
|
@@ -201,8 +201,8 @@ export function PricingThinkingModal({
|
|
|
201
201
|
still in draft, subject to change based on what we learn.
|
|
202
202
|
</p>
|
|
203
203
|
<p className="text-muted-foreground text-xs">
|
|
204
|
-
Design partners get
|
|
205
|
-
plans launch.
|
|
204
|
+
Design partners get priority onboarding and partner incentives as
|
|
205
|
+
paid plans launch.
|
|
206
206
|
</p>
|
|
207
207
|
{onApplyClick && (
|
|
208
208
|
<Button
|
|
@@ -213,7 +213,7 @@ export function PricingThinkingModal({
|
|
|
213
213
|
className="w-full"
|
|
214
214
|
variant="outline"
|
|
215
215
|
>
|
|
216
|
-
|
|
216
|
+
Try Studio
|
|
217
217
|
</Button>
|
|
218
218
|
)}
|
|
219
219
|
</div>
|
|
@@ -31,8 +31,8 @@ export function CorePositioningSection() {
|
|
|
31
31
|
align="center"
|
|
32
32
|
className="pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center"
|
|
33
33
|
>
|
|
34
|
-
<ButtonLink href="
|
|
35
|
-
|
|
34
|
+
<ButtonLink href="https://app.contractspec.studio">
|
|
35
|
+
Try Studio <ChevronRight size={16} />
|
|
36
36
|
</ButtonLink>
|
|
37
37
|
<ButtonLink variant="ghost" href="/contact">
|
|
38
38
|
Book a call
|
|
@@ -29,14 +29,14 @@ export function CtaSection() {
|
|
|
29
29
|
className="pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center"
|
|
30
30
|
>
|
|
31
31
|
<ButtonLink
|
|
32
|
-
href="
|
|
32
|
+
href="https://app.contractspec.studio"
|
|
33
33
|
onClick={() =>
|
|
34
34
|
captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
|
|
35
35
|
surface: 'cta-section',
|
|
36
36
|
})
|
|
37
37
|
}
|
|
38
38
|
>
|
|
39
|
-
|
|
39
|
+
Try Studio
|
|
40
40
|
</ButtonLink>
|
|
41
41
|
<ButtonLink
|
|
42
42
|
variant="ghost"
|
|
@@ -44,14 +44,14 @@ export function HeroMarketingSection() {
|
|
|
44
44
|
</ButtonLink>
|
|
45
45
|
<ButtonLink
|
|
46
46
|
variant="ghost"
|
|
47
|
-
href="
|
|
47
|
+
href="https://app.contractspec.studio"
|
|
48
48
|
onClick={() =>
|
|
49
49
|
captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
|
|
50
50
|
surface: 'hero',
|
|
51
51
|
})
|
|
52
52
|
}
|
|
53
53
|
>
|
|
54
|
-
|
|
54
|
+
Try Studio
|
|
55
55
|
</ButtonLink>
|
|
56
56
|
</HStack>
|
|
57
57
|
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import Link from 'next/link';
|
|
4
|
+
import { ArrowRight, Rocket } from 'lucide-react';
|
|
5
|
+
import { Button } from '@contractspec/lib.design-system';
|
|
6
|
+
|
|
7
|
+
interface StudioSignupSectionProps {
|
|
8
|
+
variant?: 'default' | 'compact';
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const studioUrl = 'https://app.contractspec.studio';
|
|
12
|
+
const studioDocsUrl = 'https://app.contractspec.studio/docs';
|
|
13
|
+
|
|
14
|
+
export function StudioSignupSection({
|
|
15
|
+
variant = 'default',
|
|
16
|
+
}: StudioSignupSectionProps) {
|
|
17
|
+
const isCompact = variant === 'compact';
|
|
18
|
+
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
id="studio-signup"
|
|
22
|
+
className={isCompact ? 'space-y-4' : 'card-subtle space-y-6 p-8'}
|
|
23
|
+
>
|
|
24
|
+
<div className="space-y-4">
|
|
25
|
+
<div className="inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1">
|
|
26
|
+
<Rocket size={14} className="text-violet-300" />
|
|
27
|
+
<span className="text-sm font-medium text-violet-300">
|
|
28
|
+
ContractSpec Studio
|
|
29
|
+
</span>
|
|
30
|
+
</div>
|
|
31
|
+
<h2 className={isCompact ? 'text-xl font-bold' : 'text-2xl font-bold'}>
|
|
32
|
+
Try ContractSpec Studio
|
|
33
|
+
</h2>
|
|
34
|
+
<p className="text-muted-foreground text-sm">
|
|
35
|
+
The AI-powered product decision engine that turns product signals into
|
|
36
|
+
spec-first deliverables.
|
|
37
|
+
</p>
|
|
38
|
+
<p className="text-muted-foreground text-xs">
|
|
39
|
+
Evidence -> Correlation -> Decision -> Change -> Export
|
|
40
|
+
-> Check -> Notify -> Autopilot
|
|
41
|
+
</p>
|
|
42
|
+
</div>
|
|
43
|
+
|
|
44
|
+
<div className="flex flex-col gap-3 sm:flex-row">
|
|
45
|
+
<Button asChild className="w-full sm:w-auto">
|
|
46
|
+
<Link href={studioUrl}>
|
|
47
|
+
Get Started Free <ArrowRight className="ml-2 h-4 w-4" />
|
|
48
|
+
</Link>
|
|
49
|
+
</Button>
|
|
50
|
+
<Button asChild variant="outline" className="w-full sm:w-auto">
|
|
51
|
+
<Link href={studioDocsUrl}>Read Studio Docs</Link>
|
|
52
|
+
</Button>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
DialogHeader,
|
|
28
28
|
DialogTitle,
|
|
29
29
|
} from '@contractspec/lib.ui-kit-web/ui/dialog';
|
|
30
|
-
import {
|
|
30
|
+
import { StudioSignupSection } from '../marketing';
|
|
31
31
|
import { TemplatePreviewModal } from './TemplatesPreviewModal';
|
|
32
32
|
|
|
33
33
|
const templates = [
|
|
@@ -252,7 +252,7 @@ export const TemplatesPage = () => {
|
|
|
252
252
|
const [selectedTag, setSelectedTag] = useState<string | null>(null);
|
|
253
253
|
const [search, setSearch] = useState('');
|
|
254
254
|
const [preview, setPreview] = useState<TemplateId | null>(null);
|
|
255
|
-
const [
|
|
255
|
+
const [studioSignupModalOpen, setStudioSignupModalOpen] = useState(false);
|
|
256
256
|
const [source, setSource] = useState<'local' | 'registry'>('local');
|
|
257
257
|
const [selectedTemplateForCommand, setSelectedTemplateForCommand] = useState<
|
|
258
258
|
RegistryTemplate | LocalTemplate | null
|
|
@@ -632,16 +632,19 @@ export const TemplatesPage = () => {
|
|
|
632
632
|
/>
|
|
633
633
|
{/*) : null}*/}
|
|
634
634
|
|
|
635
|
-
<Dialog
|
|
635
|
+
<Dialog
|
|
636
|
+
open={studioSignupModalOpen}
|
|
637
|
+
onOpenChange={setStudioSignupModalOpen}
|
|
638
|
+
>
|
|
636
639
|
<DialogContent className="max-h-[90vh] max-w-2xl overflow-y-auto">
|
|
637
640
|
<DialogHeader>
|
|
638
|
-
<DialogTitle>
|
|
641
|
+
<DialogTitle>Deploy in Studio</DialogTitle>
|
|
639
642
|
<DialogDescription>
|
|
640
|
-
|
|
641
|
-
|
|
643
|
+
Deploy templates in ContractSpec Studio and run the full
|
|
644
|
+
evidence-to-spec loop with your team.
|
|
642
645
|
</DialogDescription>
|
|
643
646
|
</DialogHeader>
|
|
644
|
-
<
|
|
647
|
+
<StudioSignupSection variant="compact" />
|
|
645
648
|
</DialogContent>
|
|
646
649
|
</Dialog>
|
|
647
650
|
|
|
@@ -698,10 +701,10 @@ export const TemplatesPage = () => {
|
|
|
698
701
|
templateId: commandId,
|
|
699
702
|
});
|
|
700
703
|
setSelectedTemplateForCommand(null);
|
|
701
|
-
|
|
704
|
+
setStudioSignupModalOpen(true);
|
|
702
705
|
}}
|
|
703
706
|
>
|
|
704
|
-
Deploy to Studio
|
|
707
|
+
Deploy to Studio
|
|
705
708
|
</button>
|
|
706
709
|
</div>
|
|
707
710
|
</DialogContent>
|