@contractspec/bundle.marketing 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/.turbo/turbo-build.log +73 -73
  2. package/CHANGELOG.md +49 -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 +34 -34
  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
@@ -186,978 +186,76 @@ Submitted via ContractSpec contact form
186
186
  return { success: true, text: "Message sent successfully!" };
187
187
  };
188
188
 
189
- // src/libs/email/waitlist.ts
190
- "use server";
191
- var WAITLIST_MISSING_CONFIG = "Waitlist service is not configured. Please try again later.";
192
- var WAITLIST_SEND_ERROR = "Failed to join waitlist. Please try again later or contact us directly.";
193
- var joinWaitlist = async (formData) => {
194
- const email = (formData.get("email") ?? "").toString().trim();
195
- if (!email || !email.includes("@")) {
196
- return {
197
- success: false,
198
- text: "Please enter a valid email address."
199
- };
200
- }
201
- const configResult = getEmailConfig();
202
- if (!configResult.ok || !configResult.config) {
203
- return {
204
- success: false,
205
- text: configResult.errorMessage ?? WAITLIST_MISSING_CONFIG
206
- };
207
- }
208
- const waitlistText = `
209
- You're on the waitlist!
210
-
211
- Thanks for joining the ContractSpec waitlist. You're now in line for early access to:
212
-
213
- • Stabilize your AI-generated code with ContractSpec
214
- • Multi-surface consistency (API, DB, UI, events)
215
- • Safe regeneration without breaking changes
216
- • AI governance and contract enforcement
217
-
218
- We'll notify you as soon as early access is available. In the meantime, you can:
219
-
220
- • Check out our docs: https://contractspec.io/docs
221
- • Follow our progress on GitHub
222
- • Book a demo call to see ContractSpec in action
223
-
224
- We're excited to have you on board!
225
-
226
- ---
227
- ContractSpec Team
228
- https://contractspec.io
229
-
230
- To remove yourself from the waitlist, reply to this email with "remove"
231
- `.trim();
232
- const waitlistHtml = `
233
- <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
234
- <h1 style="color: #8b5cf6;">You're on the waitlist!</h1>
235
- <p>Thanks for joining the ContractSpec waitlist. You're now in line for early access to:</p>
236
- <ul style="line-height: 1.8;">
237
- <li>Stabilize your AI-generated code with ContractSpec</li>
238
- <li>Multi-surface consistency (API, DB, UI, events)</li>
239
- <li>Safe regeneration without breaking changes</li>
240
- <li>AI governance and contract enforcement</li>
241
- </ul>
242
- <p>We'll notify you as soon as early access is available. In the meantime, you can:</p>
243
- <ul style="line-height: 1.8;">
244
- <li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
245
- <li>Follow our progress on GitHub</li>
246
- <li>Book a demo call to see ContractSpec in action</li>
247
- </ul>
248
- <p>We're excited to have you on board!</p>
249
- <hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
250
- <p style="color: #6b7280; font-size: 14px;">
251
- ContractSpec Team<br />
252
- <a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
253
- </p>
254
- <p style="color: #9ca3af; font-size: 12px;">
255
- To remove yourself from the waitlist, reply to this email with "remove"
256
- </p>
257
- </div>
258
- `;
259
- const userSend = await sendEmail(configResult.config, {
260
- to: [{ email }],
261
- subject: "You're on the ContractSpec waitlist!",
262
- text: waitlistText,
263
- html: waitlistHtml,
264
- context: "waitlist-welcome"
265
- });
266
- if (!userSend.success) {
267
- return { success: false, text: WAITLIST_SEND_ERROR };
268
- }
269
- const teamNotificationText = `New waitlist signup from: ${email}`;
270
- const teamNotificationHtml = `
271
- <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
272
- <p style="margin: 0 0 8px;">New waitlist signup</p>
273
- <p style="margin: 0;"><strong>Email:</strong> ${formatMultilineHtml(email)}</p>
274
- </div>
275
- `;
276
- const teamSend = await sendEmail(configResult.config, {
277
- to: [configResult.config.teamInbox],
278
- subject: `New Waitlist Signup: ${email}`,
279
- text: teamNotificationText,
280
- html: teamNotificationHtml,
281
- context: "waitlist-team-notification"
282
- });
283
- if (!teamSend.success) {
284
- return { success: false, text: WAITLIST_SEND_ERROR };
285
- }
286
- return { success: true, text: "Successfully joined waitlist!" };
287
- };
288
-
289
- // src/libs/email/waitlist-application.ts
290
- "use server";
291
- var APPLICATION_MISSING_CONFIG = "Waitlist application service is not configured. Please try again later.";
292
- var APPLICATION_SEND_ERROR = "Failed to submit application. Please try again later or contact us directly.";
293
- var submitWaitlistApplication = async (formData) => {
294
- const email = (formData.get("email") ?? "").toString().trim();
295
- const name = (formData.get("name") ?? "").toString().trim();
296
- const company = (formData.get("company") ?? "").toString().trim();
297
- const role = (formData.get("role") ?? "").toString().trim();
298
- const useCase = (formData.get("useCase") ?? "").toString().trim();
299
- const currentStack = (formData.get("currentStack") ?? "").toString().trim();
300
- const whatBuilding = (formData.get("whatBuilding") ?? "").toString().trim();
301
- const whatSolving = (formData.get("whatSolving") ?? "").toString().trim();
302
- const teamSize = (formData.get("teamSize") ?? "").toString().trim();
303
- const timeline = (formData.get("timeline") ?? "").toString().trim();
304
- const openToSessions = formData.get("openToSessions") === "on";
305
- const okayWithCaseStudies = formData.get("okayWithCaseStudies") === "on";
306
- if (!email || !email.includes("@")) {
307
- return {
308
- success: false,
309
- text: "Please enter a valid email address."
310
- };
311
- }
312
- if (!name || !whatBuilding || !whatSolving) {
313
- return {
314
- success: false,
315
- text: "Please fill in all required fields."
316
- };
317
- }
318
- const configResult = getEmailConfig();
319
- if (!configResult.ok || !configResult.config) {
320
- return {
321
- success: false,
322
- text: configResult.errorMessage ?? APPLICATION_MISSING_CONFIG
323
- };
324
- }
325
- const applicantText = `
326
- You're on the list.
327
-
328
- 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.
329
-
330
- What happens next:
331
- • We review applications weekly
332
- • If selected, we'll reach out via email to schedule an intro call
333
- • During early access, you'll get hands-on support and influence over the roadmap
334
-
335
- In the meantime:
336
- • Check out our docs: https://contractspec.io/docs
337
- • Book a demo call: https://contractspec.io/contact
338
-
339
- We're excited about the possibility of working together!
340
-
341
- ---
342
- ContractSpec Team
343
- https://contractspec.io
344
- `.trim();
345
- const applicantHtml = `
346
- <div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
347
- <h1 style="color: #8b5cf6;">You're on the list.</h1>
348
- <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>
349
- <h2 style="color: #8b5cf6; margin-top: 24px;">What happens next:</h2>
350
- <ul style="line-height: 1.8;">
351
- <li>We review applications weekly</li>
352
- <li>If selected, we'll reach out via email to schedule an intro call</li>
353
- <li>During early access, you'll get hands-on support and influence over the roadmap</li>
354
- </ul>
355
- <h2 style="color: #8b5cf6; margin-top: 24px;">In the meantime:</h2>
356
- <ul style="line-height: 1.8;">
357
- <li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
358
- <li>Book a demo call: <a href="https://contractspec.io/contact" style="color: #8b5cf6;">contractspec.io/contact</a></li>
359
- </ul>
360
- <p>We're excited about the possibility of working together!</p>
361
- <hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
362
- <p style="color: #6b7280; font-size: 14px;">
363
- ContractSpec Team<br />
364
- <a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
365
- </p>
366
- </div>
367
- `;
368
- const applicantSend = await sendEmail(configResult.config, {
369
- to: [{ email }],
370
- subject: "You're on the ContractSpec design partner waitlist!",
371
- text: applicantText,
372
- html: applicantHtml,
373
- context: "waitlist-application-welcome"
374
- });
375
- if (!applicantSend.success) {
376
- return { success: false, text: APPLICATION_SEND_ERROR };
377
- }
378
- const preferencesText = `
379
- Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
380
- Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
381
- `.trim();
382
- const teamEmailText = `
383
- New Design Partner Waitlist Application
384
-
385
- Contact Information:
386
- - Name: ${name}
387
- - Email: ${email}
388
- ${company ? `- Company/Project: ${company}` : ""}
389
- ${role ? `- Role: ${role}` : ""}
390
-
391
- Application Details:
392
- - What are you building with AI today?
393
- ${whatBuilding}
394
-
395
- - What do you hope ContractSpec will solve for you?
396
- ${whatSolving}
397
-
398
- - Primary use case: ${useCase || "Not specified"}
399
- - Current stack: ${currentStack || "Not specified"}
400
- - Team Size: ${teamSize || "Not specified"}
401
- - Timeline: ${timeline || "Not specified"}
402
-
403
- Preferences:
404
- - Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
405
- - Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
406
-
407
- ---
408
- Submitted via ContractSpec waitlist application form
409
- `.trim();
410
- const teamEmailHtml = `
411
- <div style="font-family: sans-serif; max-width: 720px; margin: 0 auto;">
412
- <h1 style="color: #8b5cf6;">New Design Partner Waitlist Application</h1>
413
- <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Contact Information</h2>
414
- <ul style="padding-left: 16px; line-height: 1.6; margin: 0 0 16px;">
415
- <li>Name: ${escapeHtml(name)}</li>
416
- <li>Email: ${escapeHtml(email)}</li>
417
- ${company ? `<li>Company/Project: ${escapeHtml(company)}</li>` : ""}
418
- ${role ? `<li>Role: ${escapeHtml(role)}</li>` : ""}
419
- </ul>
420
- <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Application Details</h2>
421
- <p style="margin: 0 0 8px; font-weight: 600;">What are you building with AI today?</p>
422
- <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
423
- ${formatMultilineHtml(whatBuilding)}
424
- </div>
425
- <p style="margin: 16px 0 8px; font-weight: 600;">What do you hope ContractSpec will solve for you?</p>
426
- <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
427
- ${formatMultilineHtml(whatSolving)}
428
- </div>
429
- <ul style="padding-left: 16px; line-height: 1.6; margin: 16px 0;">
430
- <li>Primary use case: ${escapeHtml(useCase || "Not specified")}</li>
431
- <li>Current stack: ${escapeHtml(currentStack || "Not specified")}</li>
432
- <li>Team Size: ${escapeHtml(teamSize || "Not specified")}</li>
433
- <li>Timeline: ${escapeHtml(timeline || "Not specified")}</li>
434
- </ul>
435
- <h2 style="color: #8b5cf6; margin: 16px 0 8px;">Preferences</h2>
436
- <div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; line-height: 1.6;">
437
- ${formatMultilineHtml(preferencesText)}
438
- </div>
439
- <p style="color: #6b7280; font-size: 12px; margin-top: 20px;">Submitted via ContractSpec waitlist application form</p>
440
- </div>
441
- `;
442
- const teamSend = await sendEmail(configResult.config, {
443
- to: [configResult.config.teamInbox],
444
- subject: `New Design Partner Application: ${name} (${email})`,
445
- text: teamEmailText,
446
- html: teamEmailHtml,
447
- replyTo: email,
448
- context: "waitlist-application-team-notification"
449
- });
450
- if (!teamSend.success) {
451
- return { success: false, text: APPLICATION_SEND_ERROR };
452
- }
453
- return {
454
- success: true,
455
- text: "Application submitted successfully!"
456
- };
457
- };
458
-
459
- // src/components/marketing/waitlist-section.tsx
460
- import { useEffect, useState } from "react";
461
- import { useForm } from "react-hook-form";
462
- import { zodResolver } from "@hookform/resolvers/zod";
463
- import z from "zod";
464
- import { AlertCircle, CheckCircle } from "lucide-react";
189
+ // src/components/marketing/studio-signup-section.tsx
190
+ import Link from "next/link";
191
+ import { ArrowRight, Rocket } from "lucide-react";
465
192
  import { Button } from "@contractspec/lib.design-system";
466
- import { Textarea } from "@contractspec/lib.design-system";
467
- import { Label } from "@contractspec/lib.ui-kit-web/ui/label";
468
- import {
469
- Select,
470
- SelectContent,
471
- SelectItem,
472
- SelectTrigger,
473
- SelectValue
474
- } from "@contractspec/lib.ui-kit-web/ui/select";
475
- import { Checkbox } from "@contractspec/lib.ui-kit-web/ui/checkbox";
476
- import { Switch } from "@contractspec/lib.ui-kit-web/ui/switch";
477
- import { Input } from "@contractspec/lib.design-system";
478
- import { jsxDEV, Fragment } from "react/jsx-dev-runtime";
193
+ import { jsxDEV } from "react/jsx-dev-runtime";
479
194
  "use client";
480
- var simpleWaitlistSchema = z.object({
481
- email: z.email("Please enter a valid email address")
482
- });
483
- var designPartnerSchema = z.object({
484
- name: z.string().min(1, "Name is required"),
485
- email: z.email("Please enter a valid email address"),
486
- company: z.string().optional(),
487
- role: z.string().optional(),
488
- useCase: z.string().optional(),
489
- currentStack: z.string().optional(),
490
- whatBuilding: z.string().min(1, "Please tell us what you are building"),
491
- whatSolving: z.string().min(1, "Please tell us what ContractSpec will solve for you"),
492
- teamSize: z.string().optional(),
493
- timeline: z.string().optional(),
494
- openToSessions: z.boolean().default(false),
495
- okayWithCaseStudies: z.boolean().default(false)
496
- });
497
- function WaitlistSection({
498
- variant = "default",
499
- context = "pricing"
195
+ var studioUrl = "https://app.contractspec.studio";
196
+ var studioDocsUrl = "https://app.contractspec.studio/docs";
197
+ function StudioSignupSection({
198
+ variant = "default"
500
199
  }) {
501
- const [isDesignPartner, setIsDesignPartner] = useState(false);
502
- const [submitResult, setSubmitResult] = useState(null);
503
- const [isPending, setIsPending] = useState(false);
504
- const simpleForm = useForm({
505
- resolver: zodResolver(simpleWaitlistSchema),
506
- defaultValues: {
507
- email: ""
508
- }
509
- });
510
- const designPartnerForm = useForm({
511
- resolver: zodResolver(designPartnerSchema),
512
- defaultValues: {
513
- name: "",
514
- email: "",
515
- company: "",
516
- role: "",
517
- useCase: "",
518
- currentStack: "",
519
- whatBuilding: "",
520
- whatSolving: "",
521
- teamSize: "",
522
- timeline: "",
523
- openToSessions: false,
524
- okayWithCaseStudies: false
525
- }
526
- });
527
- const simpleEmail = simpleForm.watch("email");
528
- const designPartnerEmail = designPartnerForm.watch("email");
529
- useEffect(() => {
530
- const currentDesignPartnerEmail = designPartnerForm.getValues("email");
531
- if (simpleEmail && simpleEmail !== currentDesignPartnerEmail) {
532
- designPartnerForm.setValue("email", simpleEmail, { shouldDirty: false });
533
- }
534
- }, [simpleEmail, designPartnerForm]);
535
- useEffect(() => {
536
- const currentSimpleEmail = simpleForm.getValues("email");
537
- if (designPartnerEmail && designPartnerEmail !== currentSimpleEmail) {
538
- simpleForm.setValue("email", designPartnerEmail, { shouldDirty: false });
539
- }
540
- }, [designPartnerEmail, simpleForm]);
541
- const handleSimpleSubmit = async (data) => {
542
- setIsPending(true);
543
- setSubmitResult(null);
544
- try {
545
- const formData = new FormData;
546
- formData.set("email", data.email);
547
- const result = await joinWaitlist(formData);
548
- if (result.success) {
549
- setSubmitResult({
550
- success: true,
551
- text: "Thanks for joining the waitlist! Check your inbox for a confirmation."
552
- });
553
- simpleForm.reset();
554
- } else {
555
- setSubmitResult({
556
- success: false,
557
- text: result.text || "Failed to join waitlist. Please try again."
558
- });
559
- }
560
- } catch (_error) {
561
- setSubmitResult({
562
- success: false,
563
- text: "Failed to join waitlist. Please try again."
564
- });
565
- } finally {
566
- setIsPending(false);
567
- }
568
- };
569
- const handleDesignPartnerSubmit = async (data) => {
570
- setIsPending(true);
571
- setSubmitResult(null);
572
- try {
573
- const formData = new FormData;
574
- formData.set("email", data.email);
575
- formData.set("name", data.name);
576
- if (data.company)
577
- formData.set("company", data.company);
578
- if (data.role)
579
- formData.set("role", data.role);
580
- if (data.useCase)
581
- formData.set("useCase", data.useCase);
582
- if (data.currentStack)
583
- formData.set("currentStack", data.currentStack);
584
- formData.set("whatBuilding", data.whatBuilding);
585
- formData.set("whatSolving", data.whatSolving);
586
- if (data.teamSize)
587
- formData.set("teamSize", data.teamSize);
588
- if (data.timeline)
589
- formData.set("timeline", data.timeline);
590
- if (data.openToSessions)
591
- formData.set("openToSessions", "on");
592
- if (data.okayWithCaseStudies)
593
- formData.set("okayWithCaseStudies", "on");
594
- const result = await submitWaitlistApplication(formData);
595
- if (result.success) {
596
- setSubmitResult({
597
- success: true,
598
- 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."
599
- });
600
- designPartnerForm.reset();
601
- } else {
602
- setSubmitResult({
603
- success: false,
604
- text: result.text || "Failed to submit application. Please try again."
605
- });
606
- }
607
- } catch (_error) {
608
- setSubmitResult({
609
- success: false,
610
- text: "Failed to submit application. Please try again."
611
- });
612
- } finally {
613
- setIsPending(false);
614
- }
615
- };
616
- const onSubmit = isDesignPartner ? designPartnerForm.handleSubmit(handleDesignPartnerSubmit) : simpleForm.handleSubmit(handleSimpleSubmit);
617
200
  const isCompact = variant === "compact";
618
201
  return /* @__PURE__ */ jsxDEV("div", {
619
- id: "waitlist",
202
+ id: "studio-signup",
620
203
  className: isCompact ? "space-y-4" : "card-subtle space-y-6 p-8",
621
204
  children: [
622
- !isCompact && /* @__PURE__ */ jsxDEV("div", {
205
+ /* @__PURE__ */ jsxDEV("div", {
623
206
  className: "space-y-4",
624
207
  children: [
625
208
  /* @__PURE__ */ jsxDEV("div", {
626
209
  className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
627
- children: /* @__PURE__ */ jsxDEV("span", {
628
- className: "text-sm font-medium text-violet-300",
629
- children: isDesignPartner ? "Design Partner Waitlist" : "Join the Waitlist"
630
- }, undefined, false, undefined, this)
631
- }, undefined, false, undefined, this),
632
- /* @__PURE__ */ jsxDEV("h2", {
633
- className: "text-2xl font-bold",
634
- children: isDesignPartner ? "Apply for early access to ContractSpec" : "Get early access to ContractSpec"
635
- }, undefined, false, undefined, this),
636
- /* @__PURE__ */ jsxDEV("p", {
637
- className: "text-muted-foreground text-sm",
638
- 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."
639
- }, undefined, false, undefined, this)
640
- ]
641
- }, undefined, true, undefined, this),
642
- !isCompact && /* @__PURE__ */ jsxDEV("div", {
643
- className: "border-border bg-muted/20 flex items-center justify-between gap-4 rounded-lg border p-4",
644
- children: [
645
- /* @__PURE__ */ jsxDEV("div", {
646
- className: "space-y-1",
647
210
  children: [
648
- /* @__PURE__ */ jsxDEV(Label, {
649
- htmlFor: "design-partner-toggle",
650
- className: "text-sm font-medium",
651
- children: "Apply as a design partner"
211
+ /* @__PURE__ */ jsxDEV(Rocket, {
212
+ size: 14,
213
+ className: "text-violet-300"
652
214
  }, undefined, false, undefined, this),
653
- /* @__PURE__ */ jsxDEV("p", {
654
- className: "text-muted-foreground text-xs",
655
- children: isDesignPartner ? "Get hands-on support, influence the roadmap, and founding discount" : "Get priority access, 1:1 onboarding, and help shape ContractSpec"
215
+ /* @__PURE__ */ jsxDEV("span", {
216
+ className: "text-sm font-medium text-violet-300",
217
+ children: "ContractSpec Studio"
656
218
  }, undefined, false, undefined, this)
657
219
  ]
658
220
  }, undefined, true, undefined, this),
659
- /* @__PURE__ */ jsxDEV(Switch, {
660
- id: "design-partner-toggle",
661
- checked: isDesignPartner,
662
- onCheckedChange: setIsDesignPartner,
663
- disabled: isPending || submitResult?.success
664
- }, undefined, false, undefined, this)
665
- ]
666
- }, undefined, true, undefined, this),
667
- !isCompact && isDesignPartner && /* @__PURE__ */ jsxDEV("div", {
668
- className: "space-y-2",
669
- children: [
221
+ /* @__PURE__ */ jsxDEV("h2", {
222
+ className: isCompact ? "text-xl font-bold" : "text-2xl font-bold",
223
+ children: "Try ContractSpec Studio"
224
+ }, undefined, false, undefined, this),
670
225
  /* @__PURE__ */ jsxDEV("p", {
671
- className: "text-sm font-medium",
672
- children: "Benefits:"
226
+ className: "text-muted-foreground text-sm",
227
+ children: "The AI-powered product decision engine that turns product signals into spec-first deliverables."
673
228
  }, undefined, false, undefined, this),
674
- /* @__PURE__ */ jsxDEV("ul", {
675
- className: "text-muted-foreground space-y-1 text-sm",
676
- children: [
677
- /* @__PURE__ */ jsxDEV("li", {
678
- children: "• Early access to ContractSpec Studio"
679
- }, undefined, false, undefined, this),
680
- /* @__PURE__ */ jsxDEV("li", {
681
- children: "• 1:1 onboarding and architecture sessions"
682
- }, undefined, false, undefined, this),
683
- /* @__PURE__ */ jsxDEV("li", {
684
- children: "• Priority support via direct channels"
685
- }, undefined, false, undefined, this),
686
- /* @__PURE__ */ jsxDEV("li", {
687
- children: "• Influence over roadmap and features"
688
- }, undefined, false, undefined, this),
689
- /* @__PURE__ */ jsxDEV("li", {
690
- children: "• Founding discount when paid plans launch"
691
- }, undefined, false, undefined, this)
692
- ]
693
- }, undefined, true, undefined, this)
229
+ /* @__PURE__ */ jsxDEV("p", {
230
+ className: "text-muted-foreground text-xs",
231
+ children: "Evidence -> Correlation -> Decision -> Change -> Export -> Check -> Notify -> Autopilot"
232
+ }, undefined, false, undefined, this)
694
233
  ]
695
234
  }, undefined, true, undefined, this),
696
- /* @__PURE__ */ jsxDEV("form", {
697
- onSubmit,
698
- className: "space-y-4",
235
+ /* @__PURE__ */ jsxDEV("div", {
236
+ className: "flex flex-col gap-3 sm:flex-row",
699
237
  children: [
700
- isDesignPartner ? /* @__PURE__ */ jsxDEV(Fragment, {
701
- children: [
702
- /* @__PURE__ */ jsxDEV("div", {
703
- className: "grid gap-4 md:grid-cols-2",
704
- children: [
705
- /* @__PURE__ */ jsxDEV("div", {
706
- className: "space-y-2",
707
- children: [
708
- /* @__PURE__ */ jsxDEV(Label, {
709
- htmlFor: "waitlist-name",
710
- className: "text-sm font-medium",
711
- children: [
712
- "Name ",
713
- /* @__PURE__ */ jsxDEV("span", {
714
- className: "text-red-400",
715
- children: "*"
716
- }, undefined, false, undefined, this)
717
- ]
718
- }, undefined, true, undefined, this),
719
- /* @__PURE__ */ jsxDEV(Input, {
720
- id: "waitlist-name",
721
- ...designPartnerForm.register("name"),
722
- type: "text",
723
- placeholder: "Your name",
724
- disabled: isPending || submitResult?.success
725
- }, undefined, false, undefined, this),
726
- designPartnerForm.formState.errors.name && /* @__PURE__ */ jsxDEV("p", {
727
- className: "text-xs text-red-400",
728
- children: designPartnerForm.formState.errors.name.message
729
- }, undefined, false, undefined, this)
730
- ]
731
- }, undefined, true, undefined, this),
732
- /* @__PURE__ */ jsxDEV("div", {
733
- className: "space-y-2",
734
- children: [
735
- /* @__PURE__ */ jsxDEV(Label, {
736
- htmlFor: "waitlist-email",
737
- className: "text-sm font-medium",
738
- children: [
739
- "Email ",
740
- /* @__PURE__ */ jsxDEV("span", {
741
- className: "text-red-400",
742
- children: "*"
743
- }, undefined, false, undefined, this)
744
- ]
745
- }, undefined, true, undefined, this),
746
- /* @__PURE__ */ jsxDEV(Input, {
747
- id: "waitlist-email",
748
- ...designPartnerForm.register("email"),
749
- type: "email",
750
- placeholder: "your@email.com",
751
- disabled: isPending || submitResult?.success
752
- }, undefined, false, undefined, this),
753
- designPartnerForm.formState.errors.email && /* @__PURE__ */ jsxDEV("p", {
754
- className: "text-xs text-red-400",
755
- children: designPartnerForm.formState.errors.email.message
756
- }, undefined, false, undefined, this)
757
- ]
758
- }, undefined, true, undefined, this)
759
- ]
760
- }, undefined, true, undefined, this),
761
- /* @__PURE__ */ jsxDEV("div", {
762
- className: "grid gap-4 md:grid-cols-2",
763
- children: [
764
- /* @__PURE__ */ jsxDEV("div", {
765
- className: "space-y-2",
766
- children: [
767
- /* @__PURE__ */ jsxDEV(Label, {
768
- htmlFor: "waitlist-company",
769
- className: "text-sm font-medium",
770
- children: "Company / Project Name"
771
- }, undefined, false, undefined, this),
772
- /* @__PURE__ */ jsxDEV(Input, {
773
- id: "waitlist-company",
774
- ...designPartnerForm.register("company"),
775
- type: "text",
776
- placeholder: "Your company or project",
777
- disabled: isPending || submitResult?.success
778
- }, undefined, false, undefined, this)
779
- ]
780
- }, undefined, true, undefined, this),
781
- /* @__PURE__ */ jsxDEV("div", {
782
- className: "space-y-2",
783
- children: [
784
- /* @__PURE__ */ jsxDEV(Label, {
785
- htmlFor: "waitlist-role",
786
- className: "text-sm font-medium",
787
- children: "Role"
788
- }, undefined, false, undefined, this),
789
- /* @__PURE__ */ jsxDEV(Select, {
790
- value: designPartnerForm.watch("role") || "",
791
- onValueChange: (value) => designPartnerForm.setValue("role", value),
792
- disabled: isPending || submitResult?.success,
793
- children: [
794
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
795
- id: "waitlist-role",
796
- className: "w-full",
797
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
798
- placeholder: "Select your role"
799
- }, undefined, false, undefined, this)
800
- }, undefined, false, undefined, this),
801
- /* @__PURE__ */ jsxDEV(SelectContent, {
802
- children: [
803
- /* @__PURE__ */ jsxDEV(SelectItem, {
804
- value: "founder",
805
- children: "Founder"
806
- }, undefined, false, undefined, this),
807
- /* @__PURE__ */ jsxDEV(SelectItem, {
808
- value: "cto",
809
- children: "CTO"
810
- }, undefined, false, undefined, this),
811
- /* @__PURE__ */ jsxDEV(SelectItem, {
812
- value: "lead-engineer",
813
- children: "Lead Engineer"
814
- }, undefined, false, undefined, this),
815
- /* @__PURE__ */ jsxDEV(SelectItem, {
816
- value: "engineer",
817
- children: "Engineer"
818
- }, undefined, false, undefined, this),
819
- /* @__PURE__ */ jsxDEV(SelectItem, {
820
- value: "product-manager",
821
- children: "Product Manager"
822
- }, undefined, false, undefined, this),
823
- /* @__PURE__ */ jsxDEV(SelectItem, {
824
- value: "other",
825
- children: "Other"
826
- }, undefined, false, undefined, this)
827
- ]
828
- }, undefined, true, undefined, this)
829
- ]
830
- }, undefined, true, undefined, this)
831
- ]
832
- }, undefined, true, undefined, this)
833
- ]
834
- }, undefined, true, undefined, this),
835
- /* @__PURE__ */ jsxDEV("div", {
836
- className: "grid gap-4 md:grid-cols-2",
837
- children: [
838
- /* @__PURE__ */ jsxDEV("div", {
839
- className: "space-y-2",
840
- children: [
841
- /* @__PURE__ */ jsxDEV(Label, {
842
- htmlFor: "waitlist-use-case",
843
- className: "text-sm font-medium",
844
- children: "Primary use case"
845
- }, undefined, false, undefined, this),
846
- /* @__PURE__ */ jsxDEV(Select, {
847
- value: designPartnerForm.watch("useCase") || "",
848
- onValueChange: (value) => designPartnerForm.setValue("useCase", value),
849
- disabled: isPending || submitResult?.success,
850
- children: [
851
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
852
- id: "waitlist-use-case",
853
- className: "w-full",
854
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
855
- placeholder: "Select a use case"
856
- }, undefined, false, undefined, this)
857
- }, undefined, false, undefined, this),
858
- /* @__PURE__ */ jsxDEV(SelectContent, {
859
- children: [
860
- /* @__PURE__ */ jsxDEV(SelectItem, {
861
- value: "api-platform",
862
- children: "API platform"
863
- }, undefined, false, undefined, this),
864
- /* @__PURE__ */ jsxDEV(SelectItem, {
865
- value: "ai-ops",
866
- children: "AI operations"
867
- }, undefined, false, undefined, this),
868
- /* @__PURE__ */ jsxDEV(SelectItem, {
869
- value: "integration-hub",
870
- children: "Integration hub"
871
- }, undefined, false, undefined, this),
872
- /* @__PURE__ */ jsxDEV(SelectItem, {
873
- value: "internal-tools",
874
- children: "Internal tools"
875
- }, undefined, false, undefined, this),
876
- /* @__PURE__ */ jsxDEV(SelectItem, {
877
- value: "data-pipelines",
878
- children: "Data pipelines"
879
- }, undefined, false, undefined, this),
880
- /* @__PURE__ */ jsxDEV(SelectItem, {
881
- value: "other",
882
- children: "Other"
883
- }, undefined, false, undefined, this)
884
- ]
885
- }, undefined, true, undefined, this)
886
- ]
887
- }, undefined, true, undefined, this)
888
- ]
889
- }, undefined, true, undefined, this),
890
- /* @__PURE__ */ jsxDEV("div", {
891
- className: "space-y-2",
892
- children: [
893
- /* @__PURE__ */ jsxDEV(Label, {
894
- htmlFor: "waitlist-current-stack",
895
- className: "text-sm font-medium",
896
- children: "Current stack"
897
- }, undefined, false, undefined, this),
898
- /* @__PURE__ */ jsxDEV(Input, {
899
- id: "waitlist-current-stack",
900
- ...designPartnerForm.register("currentStack"),
901
- type: "text",
902
- placeholder: "e.g. Next.js, Postgres, OpenAPI",
903
- disabled: isPending || submitResult?.success
904
- }, undefined, false, undefined, this)
905
- ]
906
- }, undefined, true, undefined, this)
907
- ]
908
- }, undefined, true, undefined, this),
909
- /* @__PURE__ */ jsxDEV("div", {
910
- className: "space-y-2",
911
- children: [
912
- /* @__PURE__ */ jsxDEV(Label, {
913
- htmlFor: "waitlist-what-building",
914
- className: "text-sm font-medium",
915
- children: [
916
- "What are you building with AI today?",
917
- " ",
918
- /* @__PURE__ */ jsxDEV("span", {
919
- className: "text-red-400",
920
- children: "*"
921
- }, undefined, false, undefined, this)
922
- ]
923
- }, undefined, true, undefined, this),
924
- /* @__PURE__ */ jsxDEV(Textarea, {
925
- id: "waitlist-what-building",
926
- ...designPartnerForm.register("whatBuilding"),
927
- placeholder: "Tell us about your project...",
928
- disabled: isPending || submitResult?.success,
929
- rows: 4
930
- }, undefined, false, undefined, this),
931
- designPartnerForm.formState.errors.whatBuilding && /* @__PURE__ */ jsxDEV("p", {
932
- className: "text-xs text-red-400",
933
- children: designPartnerForm.formState.errors.whatBuilding.message
934
- }, undefined, false, undefined, this)
935
- ]
936
- }, undefined, true, undefined, this),
937
- /* @__PURE__ */ jsxDEV("div", {
938
- className: "space-y-2",
939
- children: [
940
- /* @__PURE__ */ jsxDEV(Label, {
941
- htmlFor: "waitlist-what-solving",
942
- className: "text-sm font-medium",
943
- children: [
944
- "What do you hope ContractSpec will solve for you?",
945
- " ",
946
- /* @__PURE__ */ jsxDEV("span", {
947
- className: "text-red-400",
948
- children: "*"
949
- }, undefined, false, undefined, this)
950
- ]
951
- }, undefined, true, undefined, this),
952
- /* @__PURE__ */ jsxDEV(Textarea, {
953
- id: "waitlist-what-solving",
954
- ...designPartnerForm.register("whatSolving"),
955
- placeholder: "What problems are you trying to solve?",
956
- disabled: isPending || submitResult?.success,
957
- rows: 4
958
- }, undefined, false, undefined, this),
959
- designPartnerForm.formState.errors.whatSolving && /* @__PURE__ */ jsxDEV("p", {
960
- className: "text-xs text-red-400",
961
- children: designPartnerForm.formState.errors.whatSolving.message
962
- }, undefined, false, undefined, this)
963
- ]
964
- }, undefined, true, undefined, this),
965
- /* @__PURE__ */ jsxDEV("div", {
966
- className: "grid gap-4 md:grid-cols-2",
967
- children: [
968
- /* @__PURE__ */ jsxDEV("div", {
969
- className: "space-y-2",
970
- children: [
971
- /* @__PURE__ */ jsxDEV(Label, {
972
- htmlFor: "waitlist-team-size",
973
- className: "text-sm font-medium",
974
- children: "Team Size"
975
- }, undefined, false, undefined, this),
976
- /* @__PURE__ */ jsxDEV(Select, {
977
- value: designPartnerForm.watch("teamSize") || "",
978
- onValueChange: (value) => designPartnerForm.setValue("teamSize", value),
979
- disabled: isPending || submitResult?.success,
980
- children: [
981
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
982
- id: "waitlist-team-size",
983
- className: "w-full",
984
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
985
- placeholder: "Select team size"
986
- }, undefined, false, undefined, this)
987
- }, undefined, false, undefined, this),
988
- /* @__PURE__ */ jsxDEV(SelectContent, {
989
- children: [
990
- /* @__PURE__ */ jsxDEV(SelectItem, {
991
- value: "solo",
992
- children: "Solo"
993
- }, undefined, false, undefined, this),
994
- /* @__PURE__ */ jsxDEV(SelectItem, {
995
- value: "2-5",
996
- children: "2-5"
997
- }, undefined, false, undefined, this),
998
- /* @__PURE__ */ jsxDEV(SelectItem, {
999
- value: "6-20",
1000
- children: "6-20"
1001
- }, undefined, false, undefined, this),
1002
- /* @__PURE__ */ jsxDEV(SelectItem, {
1003
- value: "20+",
1004
- children: "20+"
1005
- }, undefined, false, undefined, this)
1006
- ]
1007
- }, undefined, true, undefined, this)
1008
- ]
1009
- }, undefined, true, undefined, this)
1010
- ]
1011
- }, undefined, true, undefined, this),
1012
- /* @__PURE__ */ jsxDEV("div", {
1013
- className: "space-y-2",
1014
- children: [
1015
- /* @__PURE__ */ jsxDEV(Label, {
1016
- htmlFor: "waitlist-timeline",
1017
- className: "text-sm font-medium",
1018
- children: "Timeline"
1019
- }, undefined, false, undefined, this),
1020
- /* @__PURE__ */ jsxDEV(Select, {
1021
- value: designPartnerForm.watch("timeline") || "",
1022
- onValueChange: (value) => designPartnerForm.setValue("timeline", value),
1023
- disabled: isPending || submitResult?.success,
1024
- children: [
1025
- /* @__PURE__ */ jsxDEV(SelectTrigger, {
1026
- id: "waitlist-timeline",
1027
- className: "w-full",
1028
- children: /* @__PURE__ */ jsxDEV(SelectValue, {
1029
- placeholder: "Select timeline"
1030
- }, undefined, false, undefined, this)
1031
- }, undefined, false, undefined, this),
1032
- /* @__PURE__ */ jsxDEV(SelectContent, {
1033
- children: [
1034
- /* @__PURE__ */ jsxDEV(SelectItem, {
1035
- value: "now",
1036
- children: "Now"
1037
- }, undefined, false, undefined, this),
1038
- /* @__PURE__ */ jsxDEV(SelectItem, {
1039
- value: "1-3-months",
1040
- children: "1-3 months"
1041
- }, undefined, false, undefined, this),
1042
- /* @__PURE__ */ jsxDEV(SelectItem, {
1043
- value: "3-6-months",
1044
- children: "3-6 months"
1045
- }, undefined, false, undefined, this),
1046
- /* @__PURE__ */ jsxDEV(SelectItem, {
1047
- value: "exploring",
1048
- children: "Exploring"
1049
- }, undefined, false, undefined, this)
1050
- ]
1051
- }, undefined, true, undefined, this)
1052
- ]
1053
- }, undefined, true, undefined, this)
1054
- ]
1055
- }, undefined, true, undefined, this)
1056
- ]
1057
- }, undefined, true, undefined, this),
1058
- /* @__PURE__ */ jsxDEV("div", {
1059
- className: "space-y-3",
1060
- children: [
1061
- /* @__PURE__ */ jsxDEV("div", {
1062
- className: "flex items-start gap-3",
1063
- children: [
1064
- /* @__PURE__ */ jsxDEV(Checkbox, {
1065
- id: "waitlist-open-to-sessions",
1066
- checked: designPartnerForm.watch("openToSessions"),
1067
- onCheckedChange: (checked) => designPartnerForm.setValue("openToSessions", checked === true),
1068
- disabled: isPending || submitResult?.success
1069
- }, undefined, false, undefined, this),
1070
- /* @__PURE__ */ jsxDEV(Label, {
1071
- htmlFor: "waitlist-open-to-sessions",
1072
- className: "cursor-pointer text-sm leading-relaxed",
1073
- children: "I'm open to 1:1 product/design sessions"
1074
- }, undefined, false, undefined, this)
1075
- ]
1076
- }, undefined, true, undefined, this),
1077
- /* @__PURE__ */ jsxDEV("div", {
1078
- className: "flex items-start gap-3",
1079
- children: [
1080
- /* @__PURE__ */ jsxDEV(Checkbox, {
1081
- id: "waitlist-case-studies",
1082
- checked: designPartnerForm.watch("okayWithCaseStudies"),
1083
- onCheckedChange: (checked) => designPartnerForm.setValue("okayWithCaseStudies", checked === true),
1084
- disabled: isPending || submitResult?.success
1085
- }, undefined, false, undefined, this),
1086
- /* @__PURE__ */ jsxDEV(Label, {
1087
- htmlFor: "waitlist-case-studies",
1088
- className: "cursor-pointer text-sm leading-relaxed",
1089
- children: "I'm okay with anonymized case studies about our usage"
1090
- }, undefined, false, undefined, this)
1091
- ]
1092
- }, undefined, true, undefined, this)
1093
- ]
1094
- }, undefined, true, undefined, this)
1095
- ]
1096
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV("div", {
1097
- className: "space-y-2",
1098
- children: [
1099
- /* @__PURE__ */ jsxDEV(Label, {
1100
- htmlFor: "waitlist-email",
1101
- className: "text-sm font-medium",
1102
- children: [
1103
- "Email ",
1104
- /* @__PURE__ */ jsxDEV("span", {
1105
- className: "text-red-400",
1106
- children: "*"
1107
- }, undefined, false, undefined, this)
1108
- ]
1109
- }, undefined, true, undefined, this),
1110
- /* @__PURE__ */ jsxDEV(Input, {
1111
- id: "waitlist-email",
1112
- ...simpleForm.register("email"),
1113
- type: "email",
1114
- placeholder: "your@email.com",
1115
- disabled: isPending || submitResult?.success
1116
- }, undefined, false, undefined, this),
1117
- simpleForm.formState.errors.email && /* @__PURE__ */ jsxDEV("p", {
1118
- className: "text-xs text-red-400",
1119
- children: simpleForm.formState.errors.email.message
1120
- }, undefined, false, undefined, this)
1121
- ]
1122
- }, undefined, true, undefined, this),
1123
- submitResult && !isPending && /* @__PURE__ */ jsxDEV("div", {
1124
- 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"}`,
1125
- children: [
1126
- submitResult.success ? /* @__PURE__ */ jsxDEV(CheckCircle, {
1127
- size: 20,
1128
- className: "mt-0.5 shrink-0"
1129
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV(AlertCircle, {
1130
- size: 20,
1131
- className: "mt-0.5 shrink-0"
1132
- }, undefined, false, undefined, this),
1133
- /* @__PURE__ */ jsxDEV("div", {
1134
- className: "flex-1",
1135
- children: submitResult.success ? /* @__PURE__ */ jsxDEV(Fragment, {
1136
- children: [
1137
- /* @__PURE__ */ jsxDEV("p", {
1138
- className: "mb-1 font-semibold",
1139
- children: "You're on the list."
1140
- }, undefined, false, undefined, this),
1141
- /* @__PURE__ */ jsxDEV("p", {
1142
- className: "text-sm",
1143
- children: submitResult.text
1144
- }, undefined, false, undefined, this)
1145
- ]
1146
- }, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV("p", {
1147
- children: submitResult.text
1148
- }, undefined, false, undefined, this)
1149
- }, undefined, false, undefined, this)
1150
- ]
1151
- }, undefined, true, undefined, this),
1152
238
  /* @__PURE__ */ jsxDEV(Button, {
1153
- type: "submit",
1154
- disabled: isPending || submitResult?.success,
1155
- className: "w-full",
1156
- children: isPending ? "Submitting..." : isDesignPartner ? "Apply to the waitlist" : "Join waitlist"
239
+ asChild: true,
240
+ className: "w-full sm:w-auto",
241
+ children: /* @__PURE__ */ jsxDEV(Link, {
242
+ href: studioUrl,
243
+ children: [
244
+ "Get Started Free ",
245
+ /* @__PURE__ */ jsxDEV(ArrowRight, {
246
+ className: "ml-2 h-4 w-4"
247
+ }, undefined, false, undefined, this)
248
+ ]
249
+ }, undefined, true, undefined, this)
1157
250
  }, undefined, false, undefined, this),
1158
- /* @__PURE__ */ jsxDEV("p", {
1159
- className: "text-muted-foreground text-center text-xs",
1160
- children: "No spam. We'll only email you about ContractSpec and your application."
251
+ /* @__PURE__ */ jsxDEV(Button, {
252
+ asChild: true,
253
+ variant: "outline",
254
+ className: "w-full sm:w-auto",
255
+ children: /* @__PURE__ */ jsxDEV(Link, {
256
+ href: studioDocsUrl,
257
+ children: "Read Studio Docs"
258
+ }, undefined, false, undefined, this)
1161
259
  }, undefined, false, undefined, this)
1162
260
  ]
1163
261
  }, undefined, true, undefined, this)
@@ -1170,14 +268,14 @@ import { useActionState } from "react";
1170
268
  import {
1171
269
  Calendar,
1172
270
  MessageSquare,
1173
- CheckCircle as CheckCircle2,
1174
- AlertCircle as AlertCircle2
271
+ CheckCircle,
272
+ AlertCircle
1175
273
  } from "lucide-react";
1176
274
  import {
1177
275
  ActionForm,
1178
276
  Button as Button2,
1179
- Input as Input2,
1180
- Textarea as Textarea2
277
+ Input,
278
+ Textarea
1181
279
  } from "@contractspec/lib.design-system";
1182
280
  import { VStack, HStack } from "@contractspec/lib.ui-kit-web/ui/stack";
1183
281
  import {
@@ -1222,9 +320,7 @@ function ContactClient() {
1222
320
  }, undefined, false, undefined, this)
1223
321
  ]
1224
322
  }, undefined, true, undefined, this),
1225
- /* @__PURE__ */ jsxDEV2(WaitlistSection, {
1226
- context: "contact"
1227
- }, undefined, false, undefined, this),
323
+ /* @__PURE__ */ jsxDEV2(StudioSignupSection, {}, undefined, false, undefined, this),
1228
324
  /* @__PURE__ */ jsxDEV2(VStack, {
1229
325
  className: "card-subtle gap-6 p-8",
1230
326
  id: "call",
@@ -1301,7 +397,7 @@ function ContactClient() {
1301
397
  className: "text-sm font-medium",
1302
398
  children: "Name"
1303
399
  }, undefined, false, undefined, this),
1304
- /* @__PURE__ */ jsxDEV2(Input2, {
400
+ /* @__PURE__ */ jsxDEV2(Input, {
1305
401
  id: "contact-name",
1306
402
  name: "name",
1307
403
  type: "text",
@@ -1318,7 +414,7 @@ function ContactClient() {
1318
414
  className: "text-sm font-medium",
1319
415
  children: "Email"
1320
416
  }, undefined, false, undefined, this),
1321
- /* @__PURE__ */ jsxDEV2(Input2, {
417
+ /* @__PURE__ */ jsxDEV2(Input, {
1322
418
  id: "contact-email",
1323
419
  name: "email",
1324
420
  type: "email",
@@ -1336,7 +432,7 @@ function ContactClient() {
1336
432
  className: "text-sm font-medium",
1337
433
  children: "Message"
1338
434
  }, undefined, false, undefined, this),
1339
- /* @__PURE__ */ jsxDEV2(Textarea2, {
435
+ /* @__PURE__ */ jsxDEV2(Textarea, {
1340
436
  id: "contact-message",
1341
437
  name: "message",
1342
438
  placeholder: "Tell us what's on your mind...",
@@ -1349,9 +445,9 @@ function ContactClient() {
1349
445
  contactResult && !contactPending && /* @__PURE__ */ jsxDEV2(HStack, {
1350
446
  className: `items-center gap-2 rounded-lg p-3 text-sm ${contactResult.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"}`,
1351
447
  children: [
1352
- contactResult.success ? /* @__PURE__ */ jsxDEV2(CheckCircle2, {
448
+ contactResult.success ? /* @__PURE__ */ jsxDEV2(CheckCircle, {
1353
449
  size: 16
1354
- }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV2(AlertCircle2, {
450
+ }, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV2(AlertCircle, {
1355
451
  size: 16
1356
452
  }, undefined, false, undefined, this),
1357
453
  /* @__PURE__ */ jsxDEV2(Small, {