@contractspec/bundle.marketing 2.1.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.
Files changed (87) hide show
  1. package/.turbo/turbo-build.log +73 -73
  2. package/CHANGELOG.md +20 -0
  3. package/README.md +6 -1
  4. package/dist/browser/components/marketing/CofounderPage.js +2 -2
  5. package/dist/browser/components/marketing/ContactClient.js +57 -961
  6. package/dist/browser/components/marketing/DesignPartnerPage.js +2 -2
  7. package/dist/browser/components/marketing/LandingPage.js +6 -6
  8. package/dist/browser/components/marketing/PricingClient.js +107 -1127
  9. package/dist/browser/components/marketing/ProductClientPage.js +2 -2
  10. package/dist/browser/components/marketing/index.js +157 -1064
  11. package/dist/browser/components/marketing/pricing-thinking-modal.js +3 -3
  12. package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
  13. package/dist/browser/components/marketing/sections/CtaSection.js +2 -2
  14. package/dist/browser/components/marketing/sections/HeroMarketingSection.js +2 -2
  15. package/dist/browser/components/marketing/studio-signup-section.js +87 -0
  16. package/dist/browser/components/templates/TemplatesClientPage.js +175 -1082
  17. package/dist/browser/components/templates/index.js +181 -1088
  18. package/dist/browser/index.js +505 -1157
  19. package/dist/browser/registry/engine.js +158 -1080
  20. package/dist/browser/registry/index.js +158 -1080
  21. package/dist/browser/registry/registry-docs.js +2 -17
  22. package/dist/browser/registry/registry-landing.js +156 -1063
  23. package/dist/browser/registry/registry.js +158 -1080
  24. package/dist/browser/registry/utils.js +158 -1080
  25. package/dist/components/marketing/CofounderPage.js +2 -2
  26. package/dist/components/marketing/ContactClient.js +57 -961
  27. package/dist/components/marketing/DesignPartnerPage.js +2 -2
  28. package/dist/components/marketing/LandingPage.js +6 -6
  29. package/dist/components/marketing/PricingClient.js +107 -1127
  30. package/dist/components/marketing/ProductClientPage.js +2 -2
  31. package/dist/components/marketing/index.d.ts +1 -1
  32. package/dist/components/marketing/index.js +157 -1064
  33. package/dist/components/marketing/pricing-thinking-modal.js +3 -3
  34. package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
  35. package/dist/components/marketing/sections/CtaSection.js +2 -2
  36. package/dist/components/marketing/sections/HeroMarketingSection.js +2 -2
  37. package/dist/components/marketing/studio-signup-section.d.ts +5 -0
  38. package/dist/components/marketing/studio-signup-section.js +82 -0
  39. package/dist/components/templates/TemplatesClientPage.js +175 -1082
  40. package/dist/components/templates/index.js +181 -1088
  41. package/dist/index.js +505 -1157
  42. package/dist/node/components/marketing/CofounderPage.js +2 -2
  43. package/dist/node/components/marketing/ContactClient.js +57 -961
  44. package/dist/node/components/marketing/DesignPartnerPage.js +2 -2
  45. package/dist/node/components/marketing/LandingPage.js +6 -6
  46. package/dist/node/components/marketing/PricingClient.js +107 -1127
  47. package/dist/node/components/marketing/ProductClientPage.js +2 -2
  48. package/dist/node/components/marketing/index.js +157 -1064
  49. package/dist/node/components/marketing/pricing-thinking-modal.js +3 -3
  50. package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
  51. package/dist/node/components/marketing/sections/CtaSection.js +2 -2
  52. package/dist/node/components/marketing/sections/HeroMarketingSection.js +2 -2
  53. package/dist/node/components/marketing/studio-signup-section.js +82 -0
  54. package/dist/node/components/templates/TemplatesClientPage.js +175 -1082
  55. package/dist/node/components/templates/index.js +181 -1088
  56. package/dist/node/index.js +505 -1157
  57. package/dist/node/registry/engine.js +158 -1080
  58. package/dist/node/registry/index.js +158 -1080
  59. package/dist/node/registry/registry-docs.js +2 -17
  60. package/dist/node/registry/registry-landing.js +156 -1063
  61. package/dist/node/registry/registry.js +158 -1080
  62. package/dist/node/registry/utils.js +158 -1080
  63. package/dist/registry/engine.js +158 -1080
  64. package/dist/registry/index.js +158 -1080
  65. package/dist/registry/registry-docs.js +2 -17
  66. package/dist/registry/registry-landing.js +156 -1063
  67. package/dist/registry/registry.js +158 -1080
  68. package/dist/registry/utils.js +158 -1080
  69. package/package.json +26 -26
  70. package/src/components/marketing/CofounderPage.tsx +2 -2
  71. package/src/components/marketing/ContactClient.tsx +3 -3
  72. package/src/components/marketing/DesignPartnerPage.tsx +3 -3
  73. package/src/components/marketing/PricingClient.tsx +39 -38
  74. package/src/components/marketing/ProductClientPage.tsx +2 -2
  75. package/src/components/marketing/index.ts +1 -1
  76. package/src/components/marketing/pricing-thinking-modal.tsx +5 -5
  77. package/src/components/marketing/sections/CorePositioningSection.tsx +2 -2
  78. package/src/components/marketing/sections/CtaSection.tsx +2 -2
  79. package/src/components/marketing/sections/HeroMarketingSection.tsx +2 -2
  80. package/src/components/marketing/studio-signup-section.tsx +56 -0
  81. package/src/components/templates/TemplatesClientPage.tsx +12 -9
  82. package/src/registry/registry-docs.ts +0 -40
  83. package/dist/browser/components/marketing/waitlist-section.js +0 -1104
  84. package/dist/components/marketing/waitlist-section.d.ts +0 -7
  85. package/dist/components/marketing/waitlist-section.js +0 -1099
  86. package/dist/node/components/marketing/waitlist-section.js +0 -1099
  87. package/src/components/marketing/waitlist-section.tsx +0 -606
@@ -6,1093 +6,76 @@ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require
6
6
  throw Error('Dynamic require of "' + x + '" is not supported');
7
7
  });
8
8
 
9
- // src/libs/email/client.ts
10
- import { createClient, Temv1alpha1 } from "@scaleway/sdk";
11
- import { Logger } from "@contractspec/lib.logger";
12
- var DEFAULT_FROM = {
13
- email: "noreply@transactional.contractspec.io",
14
- name: "ContractSpec"
15
- };
16
- var DEFAULT_TEAM_INBOX = {
17
- email: "contact@contractspec.io",
18
- name: "ContractSpec Team"
19
- };
20
- var DEFAULT_REGION = "fr-par";
21
- var cachedConfig = null;
22
- var cachedClient = null;
23
- var apiFactory = (client) => new Temv1alpha1.API(client);
24
- var mapRegion = (value) => {
25
- const normalized = value?.trim().toLowerCase();
26
- if (normalized === "par" || normalized === "fr-par")
27
- return "fr-par";
28
- if (normalized === "ams" || normalized === "nl-ams")
29
- return "nl-ams";
30
- if (normalized === "waw" || normalized === "pl-waw")
31
- return "pl-waw";
32
- return DEFAULT_REGION;
33
- };
34
- var getEmailConfig = () => {
35
- if (cachedConfig) {
36
- return { ok: true, config: cachedConfig };
37
- }
38
- const accessKey = process.env.SCALEWAY_ACCESS_KEY || process.env.SCALEWAY_ACCESS_KEY_QUEUE;
39
- const secretKey = process.env.SCALEWAY_SECRET_KEY || process.env.SCALEWAY_SECRET_KEY_QUEUE;
40
- const projectId = process.env.SCALEWAY_PROJECT_ID;
41
- if (!accessKey || !secretKey || !projectId) {
42
- return {
43
- ok: false,
44
- errorMessage: "Email service is not configured. Please contact us directly at contact@contractspec.io."
45
- };
46
- }
47
- const region = mapRegion(process.env.SCALEWAY_REGION);
48
- cachedConfig = {
49
- accessKey,
50
- secretKey,
51
- projectId,
52
- region,
53
- defaultZone: `${region}-1`,
54
- from: {
55
- email: process.env.SCALEWAY_EMAIL_FROM_EMAIL ?? DEFAULT_FROM.email,
56
- name: process.env.SCALEWAY_EMAIL_FROM_NAME ?? DEFAULT_FROM.name
57
- },
58
- teamInbox: {
59
- email: process.env.SCALEWAY_EMAIL_TEAM_EMAIL ?? DEFAULT_TEAM_INBOX.email,
60
- name: process.env.SCALEWAY_EMAIL_TEAM_NAME ?? DEFAULT_TEAM_INBOX.name
61
- }
62
- };
63
- return { ok: true, config: cachedConfig };
64
- };
65
- var getTemClient = (config) => {
66
- if (cachedClient) {
67
- return cachedClient;
68
- }
69
- const client = createClient({
70
- accessKey: config.accessKey,
71
- secretKey: config.secretKey,
72
- defaultProjectId: config.projectId,
73
- defaultRegion: config.region,
74
- defaultZone: config.defaultZone
75
- });
76
- cachedClient = apiFactory(client);
77
- return cachedClient;
78
- };
79
- var sendEmail = async (config, request) => {
80
- try {
81
- const client = getTemClient(config);
82
- await client.createEmail({
83
- region: config.region,
84
- projectId: config.projectId,
85
- from: config.from,
86
- to: request.to,
87
- subject: request.subject,
88
- text: request.text,
89
- html: request.html || request.text,
90
- additionalHeaders: request.replyTo ? [{ key: "Reply-To", value: request.replyTo }] : undefined
91
- });
92
- return { success: true };
93
- } catch (error) {
94
- new Logger().error("scaleway_tem_email_send_failed", {
95
- context: request.context ?? "email",
96
- error: error instanceof Error ? error.message : error
97
- });
98
- return {
99
- success: false,
100
- error,
101
- errorMessage: "Failed to send email via Scaleway."
102
- };
103
- }
104
- };
105
- var __internal = {
106
- resetCaches() {
107
- cachedClient = null;
108
- cachedConfig = null;
109
- apiFactory = (client) => new Temv1alpha1.API(client);
110
- },
111
- setApiFactory(factory) {
112
- apiFactory = factory;
113
- },
114
- setClient(client) {
115
- cachedClient = client;
116
- }
117
- };
118
-
119
- // src/libs/email/utils.ts
120
- var escapeHtml = (value) => value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
121
- var formatMultilineHtml = (value) => escapeHtml(value).replaceAll(`
122
- `, "<br />");
123
-
124
- // src/libs/email/waitlist.ts
125
- "use server";
126
- var WAITLIST_MISSING_CONFIG = "Waitlist service is not configured. Please try again later.";
127
- var WAITLIST_SEND_ERROR = "Failed to join waitlist. Please try again later or contact us directly.";
128
- var joinWaitlist = async (formData) => {
129
- const email = (formData.get("email") ?? "").toString().trim();
130
- if (!email || !email.includes("@")) {
131
- return {
132
- success: false,
133
- text: "Please enter a valid email address."
134
- };
135
- }
136
- const configResult = getEmailConfig();
137
- if (!configResult.ok || !configResult.config) {
138
- return {
139
- success: false,
140
- text: configResult.errorMessage ?? WAITLIST_MISSING_CONFIG
141
- };
142
- }
143
- const waitlistText = `
144
- You're on the waitlist!
145
-
146
- Thanks for joining the ContractSpec waitlist. You're now in line for early access to:
147
-
148
- • Stabilize your AI-generated code with ContractSpec
149
- • Multi-surface consistency (API, DB, UI, events)
150
- • Safe regeneration without breaking changes
151
- • AI governance and contract enforcement
152
-
153
- We'll notify you as soon as early access is available. In the meantime, you can:
154
-
155
- • Check out our docs: https://contractspec.io/docs
156
- • Follow our progress on GitHub
157
- • Book a demo call to see ContractSpec in action
158
-
159
- We're excited to have you on board!
160
-
161
- ---
162
- ContractSpec Team
163
- https://contractspec.io
164
-
165
- To remove yourself from the waitlist, reply to this email with "remove"
166
- `.trim();
167
- const waitlistHtml = `
168
- <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
169
- <h1 style="color: #8b5cf6;">You're on the waitlist!</h1>
170
- <p>Thanks for joining the ContractSpec waitlist. You're now in line for early access to:</p>
171
- <ul style="line-height: 1.8;">
172
- <li>Stabilize your AI-generated code with ContractSpec</li>
173
- <li>Multi-surface consistency (API, DB, UI, events)</li>
174
- <li>Safe regeneration without breaking changes</li>
175
- <li>AI governance and contract enforcement</li>
176
- </ul>
177
- <p>We'll notify you as soon as early access is available. In the meantime, you can:</p>
178
- <ul style="line-height: 1.8;">
179
- <li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
180
- <li>Follow our progress on GitHub</li>
181
- <li>Book a demo call to see ContractSpec in action</li>
182
- </ul>
183
- <p>We're excited to have you on board!</p>
184
- <hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
185
- <p style="color: #6b7280; font-size: 14px;">
186
- ContractSpec Team<br />
187
- <a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
188
- </p>
189
- <p style="color: #9ca3af; font-size: 12px;">
190
- To remove yourself from the waitlist, reply to this email with "remove"
191
- </p>
192
- </div>
193
- `;
194
- const userSend = await sendEmail(configResult.config, {
195
- to: [{ email }],
196
- subject: "You're on the ContractSpec waitlist!",
197
- text: waitlistText,
198
- html: waitlistHtml,
199
- context: "waitlist-welcome"
200
- });
201
- if (!userSend.success) {
202
- return { success: false, text: WAITLIST_SEND_ERROR };
203
- }
204
- const teamNotificationText = `New waitlist signup from: ${email}`;
205
- const teamNotificationHtml = `
206
- <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
207
- <p style="margin: 0 0 8px;">New waitlist signup</p>
208
- <p style="margin: 0;"><strong>Email:</strong> ${formatMultilineHtml(email)}</p>
209
- </div>
210
- `;
211
- const teamSend = await sendEmail(configResult.config, {
212
- to: [configResult.config.teamInbox],
213
- subject: `New Waitlist Signup: ${email}`,
214
- text: teamNotificationText,
215
- html: teamNotificationHtml,
216
- context: "waitlist-team-notification"
217
- });
218
- if (!teamSend.success) {
219
- return { success: false, text: WAITLIST_SEND_ERROR };
220
- }
221
- return { success: true, text: "Successfully joined waitlist!" };
222
- };
223
-
224
- // src/libs/email/waitlist-application.ts
225
- "use server";
226
- var APPLICATION_MISSING_CONFIG = "Waitlist application service is not configured. Please try again later.";
227
- var APPLICATION_SEND_ERROR = "Failed to submit application. Please try again later or contact us directly.";
228
- var submitWaitlistApplication = async (formData) => {
229
- const email = (formData.get("email") ?? "").toString().trim();
230
- const name = (formData.get("name") ?? "").toString().trim();
231
- const company = (formData.get("company") ?? "").toString().trim();
232
- const role = (formData.get("role") ?? "").toString().trim();
233
- const useCase = (formData.get("useCase") ?? "").toString().trim();
234
- const currentStack = (formData.get("currentStack") ?? "").toString().trim();
235
- const whatBuilding = (formData.get("whatBuilding") ?? "").toString().trim();
236
- const whatSolving = (formData.get("whatSolving") ?? "").toString().trim();
237
- const teamSize = (formData.get("teamSize") ?? "").toString().trim();
238
- const timeline = (formData.get("timeline") ?? "").toString().trim();
239
- const openToSessions = formData.get("openToSessions") === "on";
240
- const okayWithCaseStudies = formData.get("okayWithCaseStudies") === "on";
241
- if (!email || !email.includes("@")) {
242
- return {
243
- success: false,
244
- text: "Please enter a valid email address."
245
- };
246
- }
247
- if (!name || !whatBuilding || !whatSolving) {
248
- return {
249
- success: false,
250
- text: "Please fill in all required fields."
251
- };
252
- }
253
- const configResult = getEmailConfig();
254
- if (!configResult.ok || !configResult.config) {
255
- return {
256
- success: false,
257
- text: configResult.errorMessage ?? APPLICATION_MISSING_CONFIG
258
- };
259
- }
260
- const applicantText = `
261
- You're on the list.
262
-
263
- Thanks for applying to the ContractSpec design partner program. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally.
264
-
265
- What happens next:
266
- • We review applications weekly
267
- • If selected, we'll reach out via email to schedule an intro call
268
- • During early access, you'll get hands-on support and influence over the roadmap
269
-
270
- In the meantime:
271
- • Check out our docs: https://contractspec.io/docs
272
- • Book a demo call: https://contractspec.io/contact
273
-
274
- We're excited about the possibility of working together!
275
-
276
- ---
277
- ContractSpec Team
278
- https://contractspec.io
279
- `.trim();
280
- const applicantHtml = `
281
- <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
282
- <h1 style="color: #8b5cf6;">You're on the list.</h1>
283
- <p>Thanks for applying to the ContractSpec design partner program. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally.</p>
284
- <h2 style="color: #8b5cf6; margin-top: 24px;">What happens next:</h2>
285
- <ul style="line-height: 1.8;">
286
- <li>We review applications weekly</li>
287
- <li>If selected, we'll reach out via email to schedule an intro call</li>
288
- <li>During early access, you'll get hands-on support and influence over the roadmap</li>
289
- </ul>
290
- <h2 style="color: #8b5cf6; margin-top: 24px;">In the meantime:</h2>
291
- <ul style="line-height: 1.8;">
292
- <li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
293
- <li>Book a demo call: <a href="https://contractspec.io/contact" style="color: #8b5cf6;">contractspec.io/contact</a></li>
294
- </ul>
295
- <p>We're excited about the possibility of working together!</p>
296
- <hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
297
- <p style="color: #6b7280; font-size: 14px;">
298
- ContractSpec Team<br />
299
- <a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
300
- </p>
301
- </div>
302
- `;
303
- const applicantSend = await sendEmail(configResult.config, {
304
- to: [{ email }],
305
- subject: "You're on the ContractSpec design partner waitlist!",
306
- text: applicantText,
307
- html: applicantHtml,
308
- context: "waitlist-application-welcome"
309
- });
310
- if (!applicantSend.success) {
311
- return { success: false, text: APPLICATION_SEND_ERROR };
312
- }
313
- const preferencesText = `
314
- Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
315
- Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
316
- `.trim();
317
- const teamEmailText = `
318
- New Design Partner Waitlist Application
319
-
320
- Contact Information:
321
- - Name: ${name}
322
- - Email: ${email}
323
- ${company ? `- Company/Project: ${company}` : ""}
324
- ${role ? `- Role: ${role}` : ""}
325
-
326
- Application Details:
327
- - What are you building with AI today?
328
- ${whatBuilding}
329
-
330
- - What do you hope ContractSpec will solve for you?
331
- ${whatSolving}
332
-
333
- - Primary use case: ${useCase || "Not specified"}
334
- - Current stack: ${currentStack || "Not specified"}
335
- - Team Size: ${teamSize || "Not specified"}
336
- - Timeline: ${timeline || "Not specified"}
337
-
338
- Preferences:
339
- - Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
340
- - Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
341
-
342
- ---
343
- Submitted via ContractSpec waitlist application form
344
- `.trim();
345
- const teamEmailHtml = `
346
- <div style="font-family: sans-serif; max-width: 720px; margin: 0 auto;">
347
- <h1 style="color: #8b5cf6;">New Design Partner Waitlist Application</h1>
348
- <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Contact Information</h2>
349
- <ul style="padding-left: 16px; line-height: 1.6; margin: 0 0 16px;">
350
- <li>Name: ${escapeHtml(name)}</li>
351
- <li>Email: ${escapeHtml(email)}</li>
352
- ${company ? `<li>Company/Project: ${escapeHtml(company)}</li>` : ""}
353
- ${role ? `<li>Role: ${escapeHtml(role)}</li>` : ""}
354
- </ul>
355
- <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Application Details</h2>
356
- <p style="margin: 0 0 8px; font-weight: 600;">What are you building with AI today?</p>
357
- <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
358
- ${formatMultilineHtml(whatBuilding)}
359
- </div>
360
- <p style="margin: 16px 0 8px; font-weight: 600;">What do you hope ContractSpec will solve for you?</p>
361
- <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
362
- ${formatMultilineHtml(whatSolving)}
363
- </div>
364
- <ul style="padding-left: 16px; line-height: 1.6; margin: 16px 0;">
365
- <li>Primary use case: ${escapeHtml(useCase || "Not specified")}</li>
366
- <li>Current stack: ${escapeHtml(currentStack || "Not specified")}</li>
367
- <li>Team Size: ${escapeHtml(teamSize || "Not specified")}</li>
368
- <li>Timeline: ${escapeHtml(timeline || "Not specified")}</li>
369
- </ul>
370
- <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Preferences</h2>
371
- <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; line-height: 1.6;">
372
- ${formatMultilineHtml(preferencesText)}
373
- </div>
374
- <p style="color: #6b7280; font-size: 12px; margin-top: 20px;">Submitted via ContractSpec waitlist application form</p>
375
- </div>
376
- `;
377
- const teamSend = await sendEmail(configResult.config, {
378
- to: [configResult.config.teamInbox],
379
- subject: `New Design Partner Application: ${name} (${email})`,
380
- text: teamEmailText,
381
- html: teamEmailHtml,
382
- replyTo: email,
383
- context: "waitlist-application-team-notification"
384
- });
385
- if (!teamSend.success) {
386
- return { success: false, text: APPLICATION_SEND_ERROR };
387
- }
388
- return {
389
- success: true,
390
- text: "Application submitted successfully!"
391
- };
392
- };
393
-
394
- // src/components/marketing/waitlist-section.tsx
395
- import { useEffect, useState } from "react";
396
- import { useForm } from "react-hook-form";
397
- import { zodResolver } from "@hookform/resolvers/zod";
398
- import z from "zod";
399
- import { AlertCircle, CheckCircle } from "lucide-react";
9
+ // src/components/marketing/studio-signup-section.tsx
10
+ import Link from "next/link";
11
+ import { ArrowRight, Rocket } from "lucide-react";
400
12
  import { Button } from "@contractspec/lib.design-system";
401
- import { Textarea } from "@contractspec/lib.design-system";
402
- import { Label } from "@contractspec/lib.ui-kit-web/ui/label";
403
- import {
404
- Select,
405
- SelectContent,
406
- SelectItem,
407
- SelectTrigger,
408
- SelectValue
409
- } from "@contractspec/lib.ui-kit-web/ui/select";
410
- import { Checkbox } from "@contractspec/lib.ui-kit-web/ui/checkbox";
411
- import { Switch } from "@contractspec/lib.ui-kit-web/ui/switch";
412
- import { Input } from "@contractspec/lib.design-system";
413
- import { jsxDEV, Fragment } from "react/jsx-dev-runtime";
13
+ import { jsxDEV } from "react/jsx-dev-runtime";
414
14
  "use client";
415
- var simpleWaitlistSchema = z.object({
416
- email: z.email("Please enter a valid email address")
417
- });
418
- var designPartnerSchema = z.object({
419
- name: z.string().min(1, "Name is required"),
420
- email: z.email("Please enter a valid email address"),
421
- company: z.string().optional(),
422
- role: z.string().optional(),
423
- useCase: z.string().optional(),
424
- currentStack: z.string().optional(),
425
- whatBuilding: z.string().min(1, "Please tell us what you are building"),
426
- whatSolving: z.string().min(1, "Please tell us what ContractSpec will solve for you"),
427
- teamSize: z.string().optional(),
428
- timeline: z.string().optional(),
429
- openToSessions: z.boolean().default(false),
430
- okayWithCaseStudies: z.boolean().default(false)
431
- });
432
- function WaitlistSection({
433
- variant = "default",
434
- context = "pricing"
15
+ var studioUrl = "https://app.contractspec.studio";
16
+ var studioDocsUrl = "https://app.contractspec.studio/docs";
17
+ function StudioSignupSection({
18
+ variant = "default"
435
19
  }) {
436
- const [isDesignPartner, setIsDesignPartner] = useState(false);
437
- const [submitResult, setSubmitResult] = useState(null);
438
- const [isPending, setIsPending] = useState(false);
439
- const simpleForm = useForm({
440
- resolver: zodResolver(simpleWaitlistSchema),
441
- defaultValues: {
442
- email: ""
443
- }
444
- });
445
- const designPartnerForm = useForm({
446
- resolver: zodResolver(designPartnerSchema),
447
- defaultValues: {
448
- name: "",
449
- email: "",
450
- company: "",
451
- role: "",
452
- useCase: "",
453
- currentStack: "",
454
- whatBuilding: "",
455
- whatSolving: "",
456
- teamSize: "",
457
- timeline: "",
458
- openToSessions: false,
459
- okayWithCaseStudies: false
460
- }
461
- });
462
- const simpleEmail = simpleForm.watch("email");
463
- const designPartnerEmail = designPartnerForm.watch("email");
464
- useEffect(() => {
465
- const currentDesignPartnerEmail = designPartnerForm.getValues("email");
466
- if (simpleEmail && simpleEmail !== currentDesignPartnerEmail) {
467
- designPartnerForm.setValue("email", simpleEmail, { shouldDirty: false });
468
- }
469
- }, [simpleEmail, designPartnerForm]);
470
- useEffect(() => {
471
- const currentSimpleEmail = simpleForm.getValues("email");
472
- if (designPartnerEmail && designPartnerEmail !== currentSimpleEmail) {
473
- simpleForm.setValue("email", designPartnerEmail, { shouldDirty: false });
474
- }
475
- }, [designPartnerEmail, simpleForm]);
476
- const handleSimpleSubmit = async (data) => {
477
- setIsPending(true);
478
- setSubmitResult(null);
479
- try {
480
- const formData = new FormData;
481
- formData.set("email", data.email);
482
- const result = await joinWaitlist(formData);
483
- if (result.success) {
484
- setSubmitResult({
485
- success: true,
486
- text: "Thanks for joining the waitlist! Check your inbox for a confirmation."
487
- });
488
- simpleForm.reset();
489
- } else {
490
- setSubmitResult({
491
- success: false,
492
- text: result.text || "Failed to join waitlist. Please try again."
493
- });
494
- }
495
- } catch (_error) {
496
- setSubmitResult({
497
- success: false,
498
- text: "Failed to join waitlist. Please try again."
499
- });
500
- } finally {
501
- setIsPending(false);
502
- }
503
- };
504
- const handleDesignPartnerSubmit = async (data) => {
505
- setIsPending(true);
506
- setSubmitResult(null);
507
- try {
508
- const formData = new FormData;
509
- formData.set("email", data.email);
510
- formData.set("name", data.name);
511
- if (data.company)
512
- formData.set("company", data.company);
513
- if (data.role)
514
- formData.set("role", data.role);
515
- if (data.useCase)
516
- formData.set("useCase", data.useCase);
517
- if (data.currentStack)
518
- formData.set("currentStack", data.currentStack);
519
- formData.set("whatBuilding", data.whatBuilding);
520
- formData.set("whatSolving", data.whatSolving);
521
- if (data.teamSize)
522
- formData.set("teamSize", data.teamSize);
523
- if (data.timeline)
524
- formData.set("timeline", data.timeline);
525
- if (data.openToSessions)
526
- formData.set("openToSessions", "on");
527
- if (data.okayWithCaseStudies)
528
- formData.set("okayWithCaseStudies", "on");
529
- const result = await submitWaitlistApplication(formData);
530
- if (result.success) {
531
- setSubmitResult({
532
- success: true,
533
- text: "You're on the list. Thanks for applying. We're slowly onboarding design partners in waves. If your use case is a good fit, we'll reach out personally."
534
- });
535
- designPartnerForm.reset();
536
- } else {
537
- setSubmitResult({
538
- success: false,
539
- text: result.text || "Failed to submit application. Please try again."
540
- });
541
- }
542
- } catch (_error) {
543
- setSubmitResult({
544
- success: false,
545
- text: "Failed to submit application. Please try again."
546
- });
547
- } finally {
548
- setIsPending(false);
549
- }
550
- };
551
- const onSubmit = isDesignPartner ? designPartnerForm.handleSubmit(handleDesignPartnerSubmit) : simpleForm.handleSubmit(handleSimpleSubmit);
552
20
  const isCompact = variant === "compact";
553
21
  return /* @__PURE__ */ jsxDEV("div", {
554
- id: "waitlist",
22
+ id: "studio-signup",
555
23
  className: isCompact ? "space-y-4" : "card-subtle space-y-6 p-8",
556
24
  children: [
557
- !isCompact && /* @__PURE__ */ jsxDEV("div", {
25
+ /* @__PURE__ */ jsxDEV("div", {
558
26
  className: "space-y-4",
559
27
  children: [
560
28
  /* @__PURE__ */ jsxDEV("div", {
561
29
  className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
562
- children: /* @__PURE__ */ jsxDEV("span", {
563
- className: "text-sm font-medium text-violet-300",
564
- children: isDesignPartner ? "Design Partner Waitlist" : "Join the Waitlist"
565
- }, undefined, false, undefined, this)
566
- }, undefined, false, undefined, this),
567
- /* @__PURE__ */ jsxDEV("h2", {
568
- className: "text-2xl font-bold",
569
- children: isDesignPartner ? "Apply for early access to ContractSpec" : "Get early access to ContractSpec"
570
- }, undefined, false, undefined, this),
571
- /* @__PURE__ */ jsxDEV("p", {
572
- className: "text-muted-foreground text-sm",
573
- children: isDesignPartner ? "Tell us what you're building. We'll prioritize teams where ContractSpec can have a big impact, and where we can learn the most." : "Join the waitlist to be notified when ContractSpec becomes available."
574
- }, undefined, false, undefined, this)
575
- ]
576
- }, undefined, true, undefined, this),
577
- !isCompact && /* @__PURE__ */ jsxDEV("div", {
578
- className: "border-border bg-muted/20 flex items-center justify-between gap-4 rounded-lg border p-4",
579
- children: [
580
- /* @__PURE__ */ jsxDEV("div", {
581
- className: "space-y-1",
582
30
  children: [
583
- /* @__PURE__ */ jsxDEV(Label, {
584
- htmlFor: "design-partner-toggle",
585
- className: "text-sm font-medium",
586
- children: "Apply as a design partner"
31
+ /* @__PURE__ */ jsxDEV(Rocket, {
32
+ size: 14,
33
+ className: "text-violet-300"
587
34
  }, undefined, false, undefined, this),
588
- /* @__PURE__ */ jsxDEV("p", {
589
- className: "text-muted-foreground text-xs",
590
- children: isDesignPartner ? "Get hands-on support, influence the roadmap, and founding discount" : "Get priority access, 1:1 onboarding, and help shape ContractSpec"
35
+ /* @__PURE__ */ jsxDEV("span", {
36
+ className: "text-sm font-medium text-violet-300",
37
+ children: "ContractSpec Studio"
591
38
  }, undefined, false, undefined, this)
592
39
  ]
593
40
  }, undefined, true, undefined, this),
594
- /* @__PURE__ */ jsxDEV(Switch, {
595
- id: "design-partner-toggle",
596
- checked: isDesignPartner,
597
- onCheckedChange: setIsDesignPartner,
598
- disabled: isPending || submitResult?.success
599
- }, undefined, false, undefined, this)
600
- ]
601
- }, undefined, true, undefined, this),
602
- !isCompact && isDesignPartner && /* @__PURE__ */ jsxDEV("div", {
603
- className: "space-y-2",
604
- children: [
41
+ /* @__PURE__ */ jsxDEV("h2", {
42
+ className: isCompact ? "text-xl font-bold" : "text-2xl font-bold",
43
+ children: "Try ContractSpec Studio"
44
+ }, undefined, false, undefined, this),
605
45
  /* @__PURE__ */ jsxDEV("p", {
606
- className: "text-sm font-medium",
607
- children: "Benefits:"
46
+ className: "text-muted-foreground text-sm",
47
+ children: "The AI-powered product decision engine that turns product signals into spec-first deliverables."
608
48
  }, undefined, false, undefined, this),
609
- /* @__PURE__ */ jsxDEV("ul", {
610
- className: "text-muted-foreground space-y-1 text-sm",
611
- children: [
612
- /* @__PURE__ */ jsxDEV("li", {
613
- children: "• Early access to ContractSpec Studio"
614
- }, undefined, false, undefined, this),
615
- /* @__PURE__ */ jsxDEV("li", {
616
- children: "• 1:1 onboarding and architecture sessions"
617
- }, undefined, false, undefined, this),
618
- /* @__PURE__ */ jsxDEV("li", {
619
- children: "• Priority support via direct channels"
620
- }, undefined, false, undefined, this),
621
- /* @__PURE__ */ jsxDEV("li", {
622
- children: "• Influence over roadmap and features"
623
- }, undefined, false, undefined, this),
624
- /* @__PURE__ */ jsxDEV("li", {
625
- children: "• Founding discount when paid plans launch"
626
- }, undefined, false, undefined, this)
627
- ]
628
- }, undefined, true, undefined, this)
49
+ /* @__PURE__ */ jsxDEV("p", {
50
+ className: "text-muted-foreground text-xs",
51
+ children: "Evidence -> Correlation -> Decision -> Change -> Export -> Check -> Notify -> Autopilot"
52
+ }, undefined, false, undefined, this)
629
53
  ]
630
54
  }, undefined, true, undefined, this),
631
- /* @__PURE__ */ jsxDEV("form", {
632
- onSubmit,
633
- className: "space-y-4",
55
+ /* @__PURE__ */ jsxDEV("div", {
56
+ className: "flex flex-col gap-3 sm:flex-row",
634
57
  children: [
635
- isDesignPartner ? /* @__PURE__ */ jsxDEV(Fragment, {
636
- children: [
637
- /* @__PURE__ */ jsxDEV("div", {
638
- className: "grid gap-4 md:grid-cols-2",
639
- children: [
640
- /* @__PURE__ */ jsxDEV("div", {
641
- className: "space-y-2",
642
- children: [
643
- /* @__PURE__ */ jsxDEV(Label, {
644
- htmlFor: "waitlist-name",
645
- className: "text-sm font-medium",
646
- children: [
647
- "Name ",
648
- /* @__PURE__ */ jsxDEV("span", {
649
- className: "text-red-400",
650
- children: "*"
651
- }, undefined, false, undefined, this)
652
- ]
653
- }, undefined, true, undefined, this),
654
- /* @__PURE__ */ jsxDEV(Input, {
655
- id: "waitlist-name",
656
- ...designPartnerForm.register("name"),
657
- type: "text",
658
- placeholder: "Your name",
659
- disabled: isPending || submitResult?.success
660
- }, undefined, false, undefined, this),
661
- designPartnerForm.formState.errors.name && /* @__PURE__ */ jsxDEV("p", {
662
- className: "text-xs text-red-400",
663
- children: designPartnerForm.formState.errors.name.message
664
- }, undefined, false, undefined, this)
665
- ]
666
- }, undefined, true, undefined, this),
667
- /* @__PURE__ */ jsxDEV("div", {
668
- className: "space-y-2",
669
- children: [
670
- /* @__PURE__ */ jsxDEV(Label, {
671
- htmlFor: "waitlist-email",
672
- className: "text-sm font-medium",
673
- children: [
674
- "Email ",
675
- /* @__PURE__ */ jsxDEV("span", {
676
- className: "text-red-400",
677
- children: "*"
678
- }, undefined, false, undefined, this)
679
- ]
680
- }, undefined, true, undefined, this),
681
- /* @__PURE__ */ jsxDEV(Input, {
682
- id: "waitlist-email",
683
- ...designPartnerForm.register("email"),
684
- type: "email",
685
- placeholder: "your@email.com",
686
- disabled: isPending || submitResult?.success
687
- }, undefined, false, undefined, this),
688
- designPartnerForm.formState.errors.email && /* @__PURE__ */ jsxDEV("p", {
689
- className: "text-xs text-red-400",
690
- children: designPartnerForm.formState.errors.email.message
691
- }, undefined, false, undefined, this)
692
- ]
693
- }, undefined, true, undefined, this)
694
- ]
695
- }, undefined, true, undefined, this),
696
- /* @__PURE__ */ jsxDEV("div", {
697
- className: "grid gap-4 md:grid-cols-2",
698
- children: [
699
- /* @__PURE__ */ jsxDEV("div", {
700
- className: "space-y-2",
701
- children: [
702
- /* @__PURE__ */ jsxDEV(Label, {
703
- htmlFor: "waitlist-company",
704
- className: "text-sm font-medium",
705
- children: "Company / Project Name"
706
- }, undefined, false, undefined, this),
707
- /* @__PURE__ */ jsxDEV(Input, {
708
- id: "waitlist-company",
709
- ...designPartnerForm.register("company"),
710
- type: "text",
711
- placeholder: "Your company or project",
712
- disabled: isPending || submitResult?.success
713
- }, undefined, false, undefined, this)
714
- ]
715
- }, undefined, true, undefined, this),
716
- /* @__PURE__ */ jsxDEV("div", {
717
- className: "space-y-2",
718
- children: [
719
- /* @__PURE__ */ jsxDEV(Label, {
720
- htmlFor: "waitlist-role",
721
- className: "text-sm font-medium",
722
- children: "Role"
723
- }, undefined, false, undefined, this),
724
- /* @__PURE__ */ jsxDEV(Select, {
725
- value: designPartnerForm.watch("role") || "",
726
- onValueChange: (value) => designPartnerForm.setValue("role", value),
727
- disabled: isPending || submitResult?.success,
728
- children: [
729
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
730
- id: "waitlist-role",
731
- className: "w-full",
732
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
733
- placeholder: "Select your role"
734
- }, undefined, false, undefined, this)
735
- }, undefined, false, undefined, this),
736
- /* @__PURE__ */ jsxDEV(SelectContent, {
737
- children: [
738
- /* @__PURE__ */ jsxDEV(SelectItem, {
739
- value: "founder",
740
- children: "Founder"
741
- }, undefined, false, undefined, this),
742
- /* @__PURE__ */ jsxDEV(SelectItem, {
743
- value: "cto",
744
- children: "CTO"
745
- }, undefined, false, undefined, this),
746
- /* @__PURE__ */ jsxDEV(SelectItem, {
747
- value: "lead-engineer",
748
- children: "Lead Engineer"
749
- }, undefined, false, undefined, this),
750
- /* @__PURE__ */ jsxDEV(SelectItem, {
751
- value: "engineer",
752
- children: "Engineer"
753
- }, undefined, false, undefined, this),
754
- /* @__PURE__ */ jsxDEV(SelectItem, {
755
- value: "product-manager",
756
- children: "Product Manager"
757
- }, undefined, false, undefined, this),
758
- /* @__PURE__ */ jsxDEV(SelectItem, {
759
- value: "other",
760
- children: "Other"
761
- }, undefined, false, undefined, this)
762
- ]
763
- }, undefined, true, undefined, this)
764
- ]
765
- }, undefined, true, undefined, this)
766
- ]
767
- }, undefined, true, undefined, this)
768
- ]
769
- }, undefined, true, undefined, this),
770
- /* @__PURE__ */ jsxDEV("div", {
771
- className: "grid gap-4 md:grid-cols-2",
772
- children: [
773
- /* @__PURE__ */ jsxDEV("div", {
774
- className: "space-y-2",
775
- children: [
776
- /* @__PURE__ */ jsxDEV(Label, {
777
- htmlFor: "waitlist-use-case",
778
- className: "text-sm font-medium",
779
- children: "Primary use case"
780
- }, undefined, false, undefined, this),
781
- /* @__PURE__ */ jsxDEV(Select, {
782
- value: designPartnerForm.watch("useCase") || "",
783
- onValueChange: (value) => designPartnerForm.setValue("useCase", value),
784
- disabled: isPending || submitResult?.success,
785
- children: [
786
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
787
- id: "waitlist-use-case",
788
- className: "w-full",
789
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
790
- placeholder: "Select a use case"
791
- }, undefined, false, undefined, this)
792
- }, undefined, false, undefined, this),
793
- /* @__PURE__ */ jsxDEV(SelectContent, {
794
- children: [
795
- /* @__PURE__ */ jsxDEV(SelectItem, {
796
- value: "api-platform",
797
- children: "API platform"
798
- }, undefined, false, undefined, this),
799
- /* @__PURE__ */ jsxDEV(SelectItem, {
800
- value: "ai-ops",
801
- children: "AI operations"
802
- }, undefined, false, undefined, this),
803
- /* @__PURE__ */ jsxDEV(SelectItem, {
804
- value: "integration-hub",
805
- children: "Integration hub"
806
- }, undefined, false, undefined, this),
807
- /* @__PURE__ */ jsxDEV(SelectItem, {
808
- value: "internal-tools",
809
- children: "Internal tools"
810
- }, undefined, false, undefined, this),
811
- /* @__PURE__ */ jsxDEV(SelectItem, {
812
- value: "data-pipelines",
813
- children: "Data pipelines"
814
- }, undefined, false, undefined, this),
815
- /* @__PURE__ */ jsxDEV(SelectItem, {
816
- value: "other",
817
- children: "Other"
818
- }, undefined, false, undefined, this)
819
- ]
820
- }, undefined, true, undefined, this)
821
- ]
822
- }, undefined, true, undefined, this)
823
- ]
824
- }, undefined, true, undefined, this),
825
- /* @__PURE__ */ jsxDEV("div", {
826
- className: "space-y-2",
827
- children: [
828
- /* @__PURE__ */ jsxDEV(Label, {
829
- htmlFor: "waitlist-current-stack",
830
- className: "text-sm font-medium",
831
- children: "Current stack"
832
- }, undefined, false, undefined, this),
833
- /* @__PURE__ */ jsxDEV(Input, {
834
- id: "waitlist-current-stack",
835
- ...designPartnerForm.register("currentStack"),
836
- type: "text",
837
- placeholder: "e.g. Next.js, Postgres, OpenAPI",
838
- disabled: isPending || submitResult?.success
839
- }, undefined, false, undefined, this)
840
- ]
841
- }, undefined, true, undefined, this)
842
- ]
843
- }, undefined, true, undefined, this),
844
- /* @__PURE__ */ jsxDEV("div", {
845
- className: "space-y-2",
846
- children: [
847
- /* @__PURE__ */ jsxDEV(Label, {
848
- htmlFor: "waitlist-what-building",
849
- className: "text-sm font-medium",
850
- children: [
851
- "What are you building with AI today?",
852
- " ",
853
- /* @__PURE__ */ jsxDEV("span", {
854
- className: "text-red-400",
855
- children: "*"
856
- }, undefined, false, undefined, this)
857
- ]
858
- }, undefined, true, undefined, this),
859
- /* @__PURE__ */ jsxDEV(Textarea, {
860
- id: "waitlist-what-building",
861
- ...designPartnerForm.register("whatBuilding"),
862
- placeholder: "Tell us about your project...",
863
- disabled: isPending || submitResult?.success,
864
- rows: 4
865
- }, undefined, false, undefined, this),
866
- designPartnerForm.formState.errors.whatBuilding && /* @__PURE__ */ jsxDEV("p", {
867
- className: "text-xs text-red-400",
868
- children: designPartnerForm.formState.errors.whatBuilding.message
869
- }, undefined, false, undefined, this)
870
- ]
871
- }, undefined, true, undefined, this),
872
- /* @__PURE__ */ jsxDEV("div", {
873
- className: "space-y-2",
874
- children: [
875
- /* @__PURE__ */ jsxDEV(Label, {
876
- htmlFor: "waitlist-what-solving",
877
- className: "text-sm font-medium",
878
- children: [
879
- "What do you hope ContractSpec will solve for you?",
880
- " ",
881
- /* @__PURE__ */ jsxDEV("span", {
882
- className: "text-red-400",
883
- children: "*"
884
- }, undefined, false, undefined, this)
885
- ]
886
- }, undefined, true, undefined, this),
887
- /* @__PURE__ */ jsxDEV(Textarea, {
888
- id: "waitlist-what-solving",
889
- ...designPartnerForm.register("whatSolving"),
890
- placeholder: "What problems are you trying to solve?",
891
- disabled: isPending || submitResult?.success,
892
- rows: 4
893
- }, undefined, false, undefined, this),
894
- designPartnerForm.formState.errors.whatSolving && /* @__PURE__ */ jsxDEV("p", {
895
- className: "text-xs text-red-400",
896
- children: designPartnerForm.formState.errors.whatSolving.message
897
- }, undefined, false, undefined, this)
898
- ]
899
- }, undefined, true, undefined, this),
900
- /* @__PURE__ */ jsxDEV("div", {
901
- className: "grid gap-4 md:grid-cols-2",
902
- children: [
903
- /* @__PURE__ */ jsxDEV("div", {
904
- className: "space-y-2",
905
- children: [
906
- /* @__PURE__ */ jsxDEV(Label, {
907
- htmlFor: "waitlist-team-size",
908
- className: "text-sm font-medium",
909
- children: "Team Size"
910
- }, undefined, false, undefined, this),
911
- /* @__PURE__ */ jsxDEV(Select, {
912
- value: designPartnerForm.watch("teamSize") || "",
913
- onValueChange: (value) => designPartnerForm.setValue("teamSize", value),
914
- disabled: isPending || submitResult?.success,
915
- children: [
916
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
917
- id: "waitlist-team-size",
918
- className: "w-full",
919
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
920
- placeholder: "Select team size"
921
- }, undefined, false, undefined, this)
922
- }, undefined, false, undefined, this),
923
- /* @__PURE__ */ jsxDEV(SelectContent, {
924
- children: [
925
- /* @__PURE__ */ jsxDEV(SelectItem, {
926
- value: "solo",
927
- children: "Solo"
928
- }, undefined, false, undefined, this),
929
- /* @__PURE__ */ jsxDEV(SelectItem, {
930
- value: "2-5",
931
- children: "2-5"
932
- }, undefined, false, undefined, this),
933
- /* @__PURE__ */ jsxDEV(SelectItem, {
934
- value: "6-20",
935
- children: "6-20"
936
- }, undefined, false, undefined, this),
937
- /* @__PURE__ */ jsxDEV(SelectItem, {
938
- value: "20+",
939
- children: "20+"
940
- }, undefined, false, undefined, this)
941
- ]
942
- }, undefined, true, undefined, this)
943
- ]
944
- }, undefined, true, undefined, this)
945
- ]
946
- }, undefined, true, undefined, this),
947
- /* @__PURE__ */ jsxDEV("div", {
948
- className: "space-y-2",
949
- children: [
950
- /* @__PURE__ */ jsxDEV(Label, {
951
- htmlFor: "waitlist-timeline",
952
- className: "text-sm font-medium",
953
- children: "Timeline"
954
- }, undefined, false, undefined, this),
955
- /* @__PURE__ */ jsxDEV(Select, {
956
- value: designPartnerForm.watch("timeline") || "",
957
- onValueChange: (value) => designPartnerForm.setValue("timeline", value),
958
- disabled: isPending || submitResult?.success,
959
- children: [
960
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
961
- id: "waitlist-timeline",
962
- className: "w-full",
963
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
964
- placeholder: "Select timeline"
965
- }, undefined, false, undefined, this)
966
- }, undefined, false, undefined, this),
967
- /* @__PURE__ */ jsxDEV(SelectContent, {
968
- children: [
969
- /* @__PURE__ */ jsxDEV(SelectItem, {
970
- value: "now",
971
- children: "Now"
972
- }, undefined, false, undefined, this),
973
- /* @__PURE__ */ jsxDEV(SelectItem, {
974
- value: "1-3-months",
975
- children: "1-3 months"
976
- }, undefined, false, undefined, this),
977
- /* @__PURE__ */ jsxDEV(SelectItem, {
978
- value: "3-6-months",
979
- children: "3-6 months"
980
- }, undefined, false, undefined, this),
981
- /* @__PURE__ */ jsxDEV(SelectItem, {
982
- value: "exploring",
983
- children: "Exploring"
984
- }, undefined, false, undefined, this)
985
- ]
986
- }, undefined, true, undefined, this)
987
- ]
988
- }, undefined, true, undefined, this)
989
- ]
990
- }, undefined, true, undefined, this)
991
- ]
992
- }, undefined, true, undefined, this),
993
- /* @__PURE__ */ jsxDEV("div", {
994
- className: "space-y-3",
995
- children: [
996
- /* @__PURE__ */ jsxDEV("div", {
997
- className: "flex items-start gap-3",
998
- children: [
999
- /* @__PURE__ */ jsxDEV(Checkbox, {
1000
- id: "waitlist-open-to-sessions",
1001
- checked: designPartnerForm.watch("openToSessions"),
1002
- onCheckedChange: (checked) => designPartnerForm.setValue("openToSessions", checked === true),
1003
- disabled: isPending || submitResult?.success
1004
- }, undefined, false, undefined, this),
1005
- /* @__PURE__ */ jsxDEV(Label, {
1006
- htmlFor: "waitlist-open-to-sessions",
1007
- className: "cursor-pointer text-sm leading-relaxed",
1008
- children: "I'm open to 1:1 product/design sessions"
1009
- }, undefined, false, undefined, this)
1010
- ]
1011
- }, undefined, true, undefined, this),
1012
- /* @__PURE__ */ jsxDEV("div", {
1013
- className: "flex items-start gap-3",
1014
- children: [
1015
- /* @__PURE__ */ jsxDEV(Checkbox, {
1016
- id: "waitlist-case-studies",
1017
- checked: designPartnerForm.watch("okayWithCaseStudies"),
1018
- onCheckedChange: (checked) => designPartnerForm.setValue("okayWithCaseStudies", checked === true),
1019
- disabled: isPending || submitResult?.success
1020
- }, undefined, false, undefined, this),
1021
- /* @__PURE__ */ jsxDEV(Label, {
1022
- htmlFor: "waitlist-case-studies",
1023
- className: "cursor-pointer text-sm leading-relaxed",
1024
- children: "I'm okay with anonymized case studies about our usage"
1025
- }, undefined, false, undefined, this)
1026
- ]
1027
- }, undefined, true, undefined, this)
1028
- ]
1029
- }, undefined, true, undefined, this)
1030
- ]
1031
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV("div", {
1032
- className: "space-y-2",
1033
- children: [
1034
- /* @__PURE__ */ jsxDEV(Label, {
1035
- htmlFor: "waitlist-email",
1036
- className: "text-sm font-medium",
1037
- children: [
1038
- "Email ",
1039
- /* @__PURE__ */ jsxDEV("span", {
1040
- className: "text-red-400",
1041
- children: "*"
1042
- }, undefined, false, undefined, this)
1043
- ]
1044
- }, undefined, true, undefined, this),
1045
- /* @__PURE__ */ jsxDEV(Input, {
1046
- id: "waitlist-email",
1047
- ...simpleForm.register("email"),
1048
- type: "email",
1049
- placeholder: "your@email.com",
1050
- disabled: isPending || submitResult?.success
1051
- }, undefined, false, undefined, this),
1052
- simpleForm.formState.errors.email && /* @__PURE__ */ jsxDEV("p", {
1053
- className: "text-xs text-red-400",
1054
- children: simpleForm.formState.errors.email.message
1055
- }, undefined, false, undefined, this)
1056
- ]
1057
- }, undefined, true, undefined, this),
1058
- submitResult && !isPending && /* @__PURE__ */ jsxDEV("div", {
1059
- className: `flex items-start gap-2 rounded-lg p-4 text-sm ${submitResult.success ? "border border-green-500/20 bg-green-500/10 text-green-400" : "border border-red-500/20 bg-red-500/10 text-red-400"}`,
1060
- children: [
1061
- submitResult.success ? /* @__PURE__ */ jsxDEV(CheckCircle, {
1062
- size: 20,
1063
- className: "mt-0.5 shrink-0"
1064
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV(AlertCircle, {
1065
- size: 20,
1066
- className: "mt-0.5 shrink-0"
1067
- }, undefined, false, undefined, this),
1068
- /* @__PURE__ */ jsxDEV("div", {
1069
- className: "flex-1",
1070
- children: submitResult.success ? /* @__PURE__ */ jsxDEV(Fragment, {
1071
- children: [
1072
- /* @__PURE__ */ jsxDEV("p", {
1073
- className: "mb-1 font-semibold",
1074
- children: "You're on the list."
1075
- }, undefined, false, undefined, this),
1076
- /* @__PURE__ */ jsxDEV("p", {
1077
- className: "text-sm",
1078
- children: submitResult.text
1079
- }, undefined, false, undefined, this)
1080
- ]
1081
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV("p", {
1082
- children: submitResult.text
1083
- }, undefined, false, undefined, this)
1084
- }, undefined, false, undefined, this)
1085
- ]
1086
- }, undefined, true, undefined, this),
1087
58
  /* @__PURE__ */ jsxDEV(Button, {
1088
- type: "submit",
1089
- disabled: isPending || submitResult?.success,
1090
- className: "w-full",
1091
- children: isPending ? "Submitting..." : isDesignPartner ? "Apply to the waitlist" : "Join waitlist"
59
+ asChild: true,
60
+ className: "w-full sm:w-auto",
61
+ children: /* @__PURE__ */ jsxDEV(Link, {
62
+ href: studioUrl,
63
+ children: [
64
+ "Get Started Free ",
65
+ /* @__PURE__ */ jsxDEV(ArrowRight, {
66
+ className: "ml-2 h-4 w-4"
67
+ }, undefined, false, undefined, this)
68
+ ]
69
+ }, undefined, true, undefined, this)
1092
70
  }, undefined, false, undefined, this),
1093
- /* @__PURE__ */ jsxDEV("p", {
1094
- className: "text-muted-foreground text-center text-xs",
1095
- children: "No spam. We'll only email you about ContractSpec and your application."
71
+ /* @__PURE__ */ jsxDEV(Button, {
72
+ asChild: true,
73
+ variant: "outline",
74
+ className: "w-full sm:w-auto",
75
+ children: /* @__PURE__ */ jsxDEV(Link, {
76
+ href: studioDocsUrl,
77
+ children: "Read Studio Docs"
78
+ }, undefined, false, undefined, this)
1096
79
  }, undefined, false, undefined, this)
1097
80
  ]
1098
81
  }, undefined, true, undefined, this)
@@ -1117,7 +100,7 @@ var PRICING_EXAMPLES = {
1117
100
  };
1118
101
 
1119
102
  // src/components/marketing/pricing-thinking-modal.tsx
1120
- import { CheckCircle as CheckCircle2 } from "lucide-react";
103
+ import { CheckCircle } from "lucide-react";
1121
104
  import {
1122
105
  Dialog,
1123
106
  DialogContent,
@@ -1203,7 +186,7 @@ function PricingThinkingModal({
1203
186
  children: "Tentative pricing (work in progress)"
1204
187
  }, undefined, false, undefined, this),
1205
188
  /* @__PURE__ */ jsxDEV2(DialogDescription, {
1206
- children: "We're still in design-partner mode. This is a draft of how we expect pricing to look once we open public access."
189
+ children: "ContractSpec Studio is live. This is a draft of how paid plans are expected to evolve as usage grows."
1207
190
  }, undefined, false, undefined, this)
1208
191
  ]
1209
192
  }, undefined, true, undefined, this),
@@ -1257,7 +240,7 @@ function PricingThinkingModal({
1257
240
  children: tier.bullets.map((bullet, i) => /* @__PURE__ */ jsxDEV2("li", {
1258
241
  className: "text-muted-foreground flex gap-2 text-sm",
1259
242
  children: [
1260
- /* @__PURE__ */ jsxDEV2(CheckCircle2, {
243
+ /* @__PURE__ */ jsxDEV2(CheckCircle, {
1261
244
  size: 14,
1262
245
  className: "mt-0.5 shrink-0 text-violet-400"
1263
246
  }, undefined, false, undefined, this),
@@ -1328,7 +311,7 @@ function PricingThinkingModal({
1328
311
  }, undefined, false, undefined, this),
1329
312
  /* @__PURE__ */ jsxDEV2("p", {
1330
313
  className: "text-muted-foreground text-xs",
1331
- children: "Design partners get early access and a founding discount when paid plans launch."
314
+ children: "Design partners get priority onboarding and partner incentives as paid plans launch."
1332
315
  }, undefined, false, undefined, this),
1333
316
  onApplyClick && /* @__PURE__ */ jsxDEV2(Button2, {
1334
317
  onClick: () => {
@@ -1337,7 +320,7 @@ function PricingThinkingModal({
1337
320
  },
1338
321
  className: "w-full",
1339
322
  variant: "outline",
1340
- children: "Apply as a design partner"
323
+ children: "Try Studio"
1341
324
  }, undefined, false, undefined, this)
1342
325
  ]
1343
326
  }, undefined, true, undefined, this)
@@ -1349,23 +332,23 @@ function PricingThinkingModal({
1349
332
  }
1350
333
 
1351
334
  // src/components/marketing/PricingClient.tsx
1352
- import { useState as useState2 } from "react";
1353
- import Link from "next/link";
1354
- import { CheckCircle as CheckCircle3, ChevronDown, ChevronRight } from "lucide-react";
335
+ import { useState } from "react";
336
+ import Link2 from "next/link";
337
+ import { CheckCircle as CheckCircle2, ChevronDown, ChevronRight } from "lucide-react";
1355
338
  import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
1356
339
  "use client";
1357
340
  var faqs = [
1358
341
  {
1359
- question: "Can I pay for ContractSpec today?",
1360
- 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."
342
+ question: "Can I use ContractSpec Studio today?",
343
+ answer: "Yes. ContractSpec Studio is live at app.contractspec.studio. Start with the free tier and upgrade as paid plans roll out."
1361
344
  },
1362
345
  {
1363
346
  question: "What will you charge for later?",
1364
- 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."
347
+ answer: "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."
1365
348
  },
1366
349
  {
1367
350
  question: "What do I get as a design partner?",
1368
- 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."
351
+ answer: "Direct collaboration on roadmap priorities, hands-on onboarding, and priority support. You also help shape Studio workflows before broad rollout."
1369
352
  },
1370
353
  {
1371
354
  question: "Will you ever charge per seat?",
@@ -1373,13 +356,10 @@ var faqs = [
1373
356
  }
1374
357
  ];
1375
358
  function PricingClient() {
1376
- const [openFaq, setOpenFaq] = useState2(null);
1377
- const [pricingModalOpen, setPricingModalOpen] = useState2(false);
1378
- const scrollToWaitlist = () => {
1379
- const waitlistElement = document.getElementById("waitlist");
1380
- if (waitlistElement) {
1381
- waitlistElement.scrollIntoView({ behavior: "smooth", block: "start" });
1382
- }
359
+ const [openFaq, setOpenFaq] = useState(null);
360
+ const [pricingModalOpen, setPricingModalOpen] = useState(false);
361
+ const openStudio = () => {
362
+ window.open("https://app.contractspec.studio", "_blank", "noopener,noreferrer");
1383
363
  };
1384
364
  return /* @__PURE__ */ jsxDEV3("main", {
1385
365
  className: "",
@@ -1395,12 +375,12 @@ function PricingClient() {
1395
375
  }, undefined, false, undefined, this),
1396
376
  /* @__PURE__ */ jsxDEV3("p", {
1397
377
  className: "text-muted-foreground mx-auto max-w-2xl text-lg",
1398
- children: "ContractSpec Core (the OSS compiler) is and always will be free. ContractSpec Studio (the managed platform) is in early access."
378
+ children: "ContractSpec Core (the OSS compiler) is and always will be free. ContractSpec Studio is live, with paid plans rolling out progressively."
1399
379
  }, undefined, false, undefined, this),
1400
380
  /* @__PURE__ */ jsxDEV3("div", {
1401
381
  className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
1402
382
  children: [
1403
- /* @__PURE__ */ jsxDEV3(Link, {
383
+ /* @__PURE__ */ jsxDEV3(Link2, {
1404
384
  href: "/install",
1405
385
  className: "btn-primary inline-flex items-center gap-2",
1406
386
  children: [
@@ -1410,10 +390,10 @@ function PricingClient() {
1410
390
  }, undefined, false, undefined, this)
1411
391
  ]
1412
392
  }, undefined, true, undefined, this),
1413
- /* @__PURE__ */ jsxDEV3("button", {
1414
- onClick: scrollToWaitlist,
393
+ /* @__PURE__ */ jsxDEV3(Link2, {
394
+ href: "https://app.contractspec.studio",
1415
395
  className: "btn-ghost inline-flex items-center gap-2",
1416
- children: "Join Studio waitlist"
396
+ children: "Try Studio Free"
1417
397
  }, undefined, false, undefined, this)
1418
398
  ]
1419
399
  }, undefined, true, undefined, this)
@@ -1456,17 +436,17 @@ function PricingClient() {
1456
436
  /* @__PURE__ */ jsxDEV3("li", {
1457
437
  className: "flex gap-2",
1458
438
  children: [
1459
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
439
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1460
440
  size: 16,
1461
441
  className: "mt-0.5 shrink-0 text-violet-400"
1462
442
  }, undefined, false, undefined, this),
1463
- "Early access to ContractSpec Studio"
443
+ "Priority access to new Studio capabilities"
1464
444
  ]
1465
445
  }, undefined, true, undefined, this),
1466
446
  /* @__PURE__ */ jsxDEV3("li", {
1467
447
  className: "flex gap-2",
1468
448
  children: [
1469
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
449
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1470
450
  size: 16,
1471
451
  className: "mt-0.5 shrink-0 text-violet-400"
1472
452
  }, undefined, false, undefined, this),
@@ -1476,7 +456,7 @@ function PricingClient() {
1476
456
  /* @__PURE__ */ jsxDEV3("li", {
1477
457
  className: "flex gap-2",
1478
458
  children: [
1479
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
459
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1480
460
  size: 16,
1481
461
  className: "mt-0.5 shrink-0 text-violet-400"
1482
462
  }, undefined, false, undefined, this),
@@ -1486,29 +466,29 @@ function PricingClient() {
1486
466
  /* @__PURE__ */ jsxDEV3("li", {
1487
467
  className: "flex gap-2",
1488
468
  children: [
1489
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
469
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1490
470
  size: 16,
1491
471
  className: "mt-0.5 shrink-0 text-violet-400"
1492
472
  }, undefined, false, undefined, this),
1493
- "Priority support during early access"
473
+ "Priority support through direct channels"
1494
474
  ]
1495
475
  }, undefined, true, undefined, this),
1496
476
  /* @__PURE__ */ jsxDEV3("li", {
1497
477
  className: "flex gap-2",
1498
478
  children: [
1499
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
479
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1500
480
  size: 16,
1501
481
  className: "mt-0.5 shrink-0 text-violet-400"
1502
482
  }, undefined, false, undefined, this),
1503
- "Founding discount when paid plans launch"
483
+ "Pricing input and partner incentives"
1504
484
  ]
1505
485
  }, undefined, true, undefined, this)
1506
486
  ]
1507
487
  }, undefined, true, undefined, this),
1508
- /* @__PURE__ */ jsxDEV3("button", {
1509
- onClick: scrollToWaitlist,
488
+ /* @__PURE__ */ jsxDEV3(Link2, {
489
+ href: "/design-partner",
1510
490
  className: "btn-primary w-full md:w-auto",
1511
- children: "Apply to the waitlist"
491
+ children: "Apply as a design partner"
1512
492
  }, undefined, false, undefined, this)
1513
493
  ]
1514
494
  }, undefined, true, undefined, this)
@@ -1564,7 +544,7 @@ function PricingClient() {
1564
544
  /* @__PURE__ */ jsxDEV3("li", {
1565
545
  className: "text-muted-foreground flex gap-3 text-sm",
1566
546
  children: [
1567
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
547
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1568
548
  size: 16,
1569
549
  className: "mt-0.5 shrink-0 text-violet-400"
1570
550
  }, undefined, false, undefined, this),
@@ -1574,7 +554,7 @@ function PricingClient() {
1574
554
  /* @__PURE__ */ jsxDEV3("li", {
1575
555
  className: "text-muted-foreground flex gap-3 text-sm",
1576
556
  children: [
1577
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
557
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1578
558
  size: 16,
1579
559
  className: "mt-0.5 shrink-0 text-violet-400"
1580
560
  }, undefined, false, undefined, this),
@@ -1584,7 +564,7 @@ function PricingClient() {
1584
564
  /* @__PURE__ */ jsxDEV3("li", {
1585
565
  className: "text-muted-foreground flex gap-3 text-sm",
1586
566
  children: [
1587
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
567
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1588
568
  size: 16,
1589
569
  className: "mt-0.5 shrink-0 text-violet-400"
1590
570
  }, undefined, false, undefined, this),
@@ -1594,7 +574,7 @@ function PricingClient() {
1594
574
  /* @__PURE__ */ jsxDEV3("li", {
1595
575
  className: "text-muted-foreground flex gap-3 text-sm",
1596
576
  children: [
1597
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
577
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1598
578
  size: 16,
1599
579
  className: "mt-0.5 shrink-0 text-violet-400"
1600
580
  }, undefined, false, undefined, this),
@@ -1605,7 +585,7 @@ function PricingClient() {
1605
585
  }, undefined, true, undefined, this)
1606
586
  ]
1607
587
  }, undefined, true, undefined, this),
1608
- /* @__PURE__ */ jsxDEV3(Link, {
588
+ /* @__PURE__ */ jsxDEV3(Link2, {
1609
589
  href: "/install",
1610
590
  className: "btn-ghost w-full",
1611
591
  children: "Install now"
@@ -1617,7 +597,7 @@ function PricingClient() {
1617
597
  children: [
1618
598
  /* @__PURE__ */ jsxDEV3("div", {
1619
599
  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",
1620
- children: "Current"
600
+ children: "Live program"
1621
601
  }, undefined, false, undefined, this),
1622
602
  /* @__PURE__ */ jsxDEV3("div", {
1623
603
  className: "space-y-2",
@@ -1631,11 +611,11 @@ function PricingClient() {
1631
611
  children: [
1632
612
  /* @__PURE__ */ jsxDEV3("div", {
1633
613
  className: "text-2xl font-bold",
1634
- children: "Free during early access"
614
+ children: "Invite-based"
1635
615
  }, undefined, false, undefined, this),
1636
616
  /* @__PURE__ */ jsxDEV3("p", {
1637
617
  className: "text-muted-foreground text-xs",
1638
- children: "Founding discount when paid plans launch"
618
+ children: "Built for teams shaping the next Studio capabilities"
1639
619
  }, undefined, false, undefined, this)
1640
620
  ]
1641
621
  }, undefined, true, undefined, this)
@@ -1647,47 +627,47 @@ function PricingClient() {
1647
627
  /* @__PURE__ */ jsxDEV3("li", {
1648
628
  className: "text-muted-foreground flex gap-3 text-sm",
1649
629
  children: [
1650
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
630
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1651
631
  size: 16,
1652
632
  className: "mt-0.5 shrink-0 text-violet-400"
1653
633
  }, undefined, false, undefined, this),
1654
- "Use ContractSpec Studio for real projects during early access"
634
+ "Use ContractSpec Studio for real projects"
1655
635
  ]
1656
636
  }, undefined, true, undefined, this),
1657
637
  /* @__PURE__ */ jsxDEV3("li", {
1658
638
  className: "text-muted-foreground flex gap-3 text-sm",
1659
639
  children: [
1660
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
640
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1661
641
  size: 16,
1662
642
  className: "mt-0.5 shrink-0 text-violet-400"
1663
643
  }, undefined, false, undefined, this),
1664
- "Work directly with the founder on architecture & use cases"
644
+ "Work directly with the team on architecture and workflow design"
1665
645
  ]
1666
646
  }, undefined, true, undefined, this),
1667
647
  /* @__PURE__ */ jsxDEV3("li", {
1668
648
  className: "text-muted-foreground flex gap-3 text-sm",
1669
649
  children: [
1670
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
650
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1671
651
  size: 16,
1672
652
  className: "mt-0.5 shrink-0 text-violet-400"
1673
653
  }, undefined, false, undefined, this),
1674
- 'Reasonable "fair use" limits on regenerations and AI credits'
654
+ "Access to partner-only previews and feedback loops"
1675
655
  ]
1676
656
  }, undefined, true, undefined, this),
1677
657
  /* @__PURE__ */ jsxDEV3("li", {
1678
658
  className: "text-muted-foreground flex gap-3 text-sm",
1679
659
  children: [
1680
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
660
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1681
661
  size: 16,
1682
662
  className: "mt-0.5 shrink-0 text-violet-400"
1683
663
  }, undefined, false, undefined, this),
1684
- "Priority support & feedback loops"
664
+ "Priority support and roadmap influence"
1685
665
  ]
1686
666
  }, undefined, true, undefined, this)
1687
667
  ]
1688
668
  }, undefined, true, undefined, this),
1689
- /* @__PURE__ */ jsxDEV3("button", {
1690
- onClick: scrollToWaitlist,
669
+ /* @__PURE__ */ jsxDEV3(Link2, {
670
+ href: "/design-partner",
1691
671
  className: "btn-primary w-full",
1692
672
  children: "Apply as a design partner"
1693
673
  }, undefined, false, undefined, this)
@@ -1740,7 +720,7 @@ function PricingClient() {
1740
720
  /* @__PURE__ */ jsxDEV3("button", {
1741
721
  disabled: true,
1742
722
  className: "btn-ghost w-full cursor-not-allowed opacity-50",
1743
- children: "Available after public launch"
723
+ children: "Available after pricing rollout"
1744
724
  }, undefined, false, undefined, this)
1745
725
  ]
1746
726
  }, undefined, true, undefined, this),
@@ -1777,7 +757,7 @@ function PricingClient() {
1777
757
  /* @__PURE__ */ jsxDEV3("li", {
1778
758
  className: "text-muted-foreground flex gap-3 text-sm",
1779
759
  children: [
1780
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
760
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1781
761
  size: 16,
1782
762
  className: "mt-0.5 shrink-0 text-violet-400"
1783
763
  }, undefined, false, undefined, this),
@@ -1787,7 +767,7 @@ function PricingClient() {
1787
767
  /* @__PURE__ */ jsxDEV3("li", {
1788
768
  className: "text-muted-foreground flex gap-3 text-sm",
1789
769
  children: [
1790
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
770
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1791
771
  size: 16,
1792
772
  className: "mt-0.5 shrink-0 text-violet-400"
1793
773
  }, undefined, false, undefined, this),
@@ -1797,7 +777,7 @@ function PricingClient() {
1797
777
  /* @__PURE__ */ jsxDEV3("li", {
1798
778
  className: "text-muted-foreground flex gap-3 text-sm",
1799
779
  children: [
1800
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
780
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1801
781
  size: 16,
1802
782
  className: "mt-0.5 shrink-0 text-violet-400"
1803
783
  }, undefined, false, undefined, this),
@@ -1807,7 +787,7 @@ function PricingClient() {
1807
787
  /* @__PURE__ */ jsxDEV3("li", {
1808
788
  className: "text-muted-foreground flex gap-3 text-sm",
1809
789
  children: [
1810
- /* @__PURE__ */ jsxDEV3(CheckCircle3, {
790
+ /* @__PURE__ */ jsxDEV3(CheckCircle2, {
1811
791
  size: 16,
1812
792
  className: "mt-0.5 shrink-0 text-violet-400"
1813
793
  }, undefined, false, undefined, this),
@@ -1816,7 +796,7 @@ function PricingClient() {
1816
796
  }, undefined, true, undefined, this)
1817
797
  ]
1818
798
  }, undefined, true, undefined, this),
1819
- /* @__PURE__ */ jsxDEV3(Link, {
799
+ /* @__PURE__ */ jsxDEV3(Link2, {
1820
800
  href: "/contact",
1821
801
  className: "btn-ghost w-full",
1822
802
  children: "Talk to us"
@@ -1837,7 +817,7 @@ function PricingClient() {
1837
817
  children: [
1838
818
  /* @__PURE__ */ jsxDEV3("h2", {
1839
819
  className: "text-3xl font-bold",
1840
- children: "How ContractSpec pricing will work"
820
+ children: "How ContractSpec pricing works now and next"
1841
821
  }, undefined, false, undefined, this),
1842
822
  /* @__PURE__ */ jsxDEV3("p", {
1843
823
  className: "text-muted-foreground mx-auto max-w-2xl text-lg",
@@ -1942,7 +922,7 @@ function PricingClient() {
1942
922
  className: "text-muted-foreground mb-2 text-sm",
1943
923
  children: "Still unsure?"
1944
924
  }, undefined, false, undefined, this),
1945
- /* @__PURE__ */ jsxDEV3(Link, {
925
+ /* @__PURE__ */ jsxDEV3(Link2, {
1946
926
  href: "/contact",
1947
927
  className: "text-sm font-medium text-violet-400 hover:text-violet-300",
1948
928
  children: "Contact us →"
@@ -1956,13 +936,13 @@ function PricingClient() {
1956
936
  className: "section-padding hero-gradient",
1957
937
  children: /* @__PURE__ */ jsxDEV3("div", {
1958
938
  className: "mx-auto max-w-4xl",
1959
- children: /* @__PURE__ */ jsxDEV3(WaitlistSection, {}, undefined, false, undefined, this)
939
+ children: /* @__PURE__ */ jsxDEV3(StudioSignupSection, {}, undefined, false, undefined, this)
1960
940
  }, undefined, false, undefined, this)
1961
941
  }, undefined, false, undefined, this),
1962
942
  /* @__PURE__ */ jsxDEV3(PricingThinkingModal, {
1963
943
  open: pricingModalOpen,
1964
944
  onOpenChange: setPricingModalOpen,
1965
- onApplyClick: scrollToWaitlist
945
+ onApplyClick: openStudio
1966
946
  }, undefined, false, undefined, this)
1967
947
  ]
1968
948
  }, undefined, true, undefined, this);