@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.
- package/.turbo/turbo-build.log +73 -73
- package/CHANGELOG.md +20 -0
- package/README.md +6 -1
- package/dist/browser/components/marketing/CofounderPage.js +2 -2
- package/dist/browser/components/marketing/ContactClient.js +57 -961
- package/dist/browser/components/marketing/DesignPartnerPage.js +2 -2
- package/dist/browser/components/marketing/LandingPage.js +6 -6
- package/dist/browser/components/marketing/PricingClient.js +107 -1127
- package/dist/browser/components/marketing/ProductClientPage.js +2 -2
- package/dist/browser/components/marketing/index.js +157 -1064
- package/dist/browser/components/marketing/pricing-thinking-modal.js +3 -3
- package/dist/browser/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/browser/components/marketing/sections/CtaSection.js +2 -2
- package/dist/browser/components/marketing/sections/HeroMarketingSection.js +2 -2
- package/dist/browser/components/marketing/studio-signup-section.js +87 -0
- package/dist/browser/components/templates/TemplatesClientPage.js +175 -1082
- package/dist/browser/components/templates/index.js +181 -1088
- package/dist/browser/index.js +505 -1157
- package/dist/browser/registry/engine.js +158 -1080
- package/dist/browser/registry/index.js +158 -1080
- package/dist/browser/registry/registry-docs.js +2 -17
- package/dist/browser/registry/registry-landing.js +156 -1063
- package/dist/browser/registry/registry.js +158 -1080
- package/dist/browser/registry/utils.js +158 -1080
- package/dist/components/marketing/CofounderPage.js +2 -2
- package/dist/components/marketing/ContactClient.js +57 -961
- package/dist/components/marketing/DesignPartnerPage.js +2 -2
- package/dist/components/marketing/LandingPage.js +6 -6
- package/dist/components/marketing/PricingClient.js +107 -1127
- package/dist/components/marketing/ProductClientPage.js +2 -2
- package/dist/components/marketing/index.d.ts +1 -1
- package/dist/components/marketing/index.js +157 -1064
- package/dist/components/marketing/pricing-thinking-modal.js +3 -3
- package/dist/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/components/marketing/sections/CtaSection.js +2 -2
- package/dist/components/marketing/sections/HeroMarketingSection.js +2 -2
- package/dist/components/marketing/studio-signup-section.d.ts +5 -0
- package/dist/components/marketing/studio-signup-section.js +82 -0
- package/dist/components/templates/TemplatesClientPage.js +175 -1082
- package/dist/components/templates/index.js +181 -1088
- package/dist/index.js +505 -1157
- package/dist/node/components/marketing/CofounderPage.js +2 -2
- package/dist/node/components/marketing/ContactClient.js +57 -961
- package/dist/node/components/marketing/DesignPartnerPage.js +2 -2
- package/dist/node/components/marketing/LandingPage.js +6 -6
- package/dist/node/components/marketing/PricingClient.js +107 -1127
- package/dist/node/components/marketing/ProductClientPage.js +2 -2
- package/dist/node/components/marketing/index.js +157 -1064
- package/dist/node/components/marketing/pricing-thinking-modal.js +3 -3
- package/dist/node/components/marketing/sections/CorePositioningSection.js +2 -2
- package/dist/node/components/marketing/sections/CtaSection.js +2 -2
- package/dist/node/components/marketing/sections/HeroMarketingSection.js +2 -2
- package/dist/node/components/marketing/studio-signup-section.js +82 -0
- package/dist/node/components/templates/TemplatesClientPage.js +175 -1082
- package/dist/node/components/templates/index.js +181 -1088
- package/dist/node/index.js +505 -1157
- package/dist/node/registry/engine.js +158 -1080
- package/dist/node/registry/index.js +158 -1080
- package/dist/node/registry/registry-docs.js +2 -17
- package/dist/node/registry/registry-landing.js +156 -1063
- package/dist/node/registry/registry.js +158 -1080
- package/dist/node/registry/utils.js +158 -1080
- package/dist/registry/engine.js +158 -1080
- package/dist/registry/index.js +158 -1080
- package/dist/registry/registry-docs.js +2 -17
- package/dist/registry/registry-landing.js +156 -1063
- package/dist/registry/registry.js +158 -1080
- package/dist/registry/utils.js +158 -1080
- package/package.json +26 -26
- package/src/components/marketing/CofounderPage.tsx +2 -2
- package/src/components/marketing/ContactClient.tsx +3 -3
- package/src/components/marketing/DesignPartnerPage.tsx +3 -3
- package/src/components/marketing/PricingClient.tsx +39 -38
- package/src/components/marketing/ProductClientPage.tsx +2 -2
- package/src/components/marketing/index.ts +1 -1
- package/src/components/marketing/pricing-thinking-modal.tsx +5 -5
- package/src/components/marketing/sections/CorePositioningSection.tsx +2 -2
- package/src/components/marketing/sections/CtaSection.tsx +2 -2
- package/src/components/marketing/sections/HeroMarketingSection.tsx +2 -2
- package/src/components/marketing/studio-signup-section.tsx +56 -0
- package/src/components/templates/TemplatesClientPage.tsx +12 -9
- package/src/registry/registry-docs.ts +0 -40
- package/dist/browser/components/marketing/waitlist-section.js +0 -1104
- package/dist/components/marketing/waitlist-section.d.ts +0 -7
- package/dist/components/marketing/waitlist-section.js +0 -1099
- package/dist/node/components/marketing/waitlist-section.js +0 -1099
- package/src/components/marketing/waitlist-section.tsx +0 -606
|
@@ -176,7 +176,7 @@ function WhatExistsSection() {
|
|
|
176
176
|
"Solo founder, bootstrapped"
|
|
177
177
|
];
|
|
178
178
|
const planned = [
|
|
179
|
-
"
|
|
179
|
+
"ContractSpec Studio product-decision engine",
|
|
180
180
|
"Auto-evolution engine",
|
|
181
181
|
"Multi-tenant SaaS",
|
|
182
182
|
"Integration marketplace"
|
|
@@ -262,7 +262,7 @@ function RoleSection() {
|
|
|
262
262
|
const productDeliverables = [
|
|
263
263
|
"Ship UI/UX improvements weekly",
|
|
264
264
|
"Define specs based on user research",
|
|
265
|
-
"Own the
|
|
265
|
+
"Own the Studio product experience",
|
|
266
266
|
"Collaborate on architecture decisions"
|
|
267
267
|
];
|
|
268
268
|
return /* @__PURE__ */ jsxDEV2(MarketingSection, {
|
|
@@ -839,978 +839,76 @@ Submitted via ContractSpec contact form
|
|
|
839
839
|
return { success: true, text: "Message sent successfully!" };
|
|
840
840
|
};
|
|
841
841
|
|
|
842
|
-
// src/
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
var WAITLIST_SEND_ERROR = "Failed to join waitlist. Please try again later or contact us directly.";
|
|
846
|
-
var joinWaitlist = async (formData) => {
|
|
847
|
-
const email = (formData.get("email") ?? "").toString().trim();
|
|
848
|
-
if (!email || !email.includes("@")) {
|
|
849
|
-
return {
|
|
850
|
-
success: false,
|
|
851
|
-
text: "Please enter a valid email address."
|
|
852
|
-
};
|
|
853
|
-
}
|
|
854
|
-
const configResult = getEmailConfig();
|
|
855
|
-
if (!configResult.ok || !configResult.config) {
|
|
856
|
-
return {
|
|
857
|
-
success: false,
|
|
858
|
-
text: configResult.errorMessage ?? WAITLIST_MISSING_CONFIG
|
|
859
|
-
};
|
|
860
|
-
}
|
|
861
|
-
const waitlistText = `
|
|
862
|
-
You're on the waitlist!
|
|
863
|
-
|
|
864
|
-
Thanks for joining the ContractSpec waitlist. You're now in line for early access to:
|
|
865
|
-
|
|
866
|
-
• Stabilize your AI-generated code with ContractSpec
|
|
867
|
-
• Multi-surface consistency (API, DB, UI, events)
|
|
868
|
-
• Safe regeneration without breaking changes
|
|
869
|
-
• AI governance and contract enforcement
|
|
870
|
-
|
|
871
|
-
We'll notify you as soon as early access is available. In the meantime, you can:
|
|
872
|
-
|
|
873
|
-
• Check out our docs: https://contractspec.io/docs
|
|
874
|
-
• Follow our progress on GitHub
|
|
875
|
-
• Book a demo call to see ContractSpec in action
|
|
876
|
-
|
|
877
|
-
We're excited to have you on board!
|
|
878
|
-
|
|
879
|
-
---
|
|
880
|
-
ContractSpec Team
|
|
881
|
-
https://contractspec.io
|
|
882
|
-
|
|
883
|
-
To remove yourself from the waitlist, reply to this email with "remove"
|
|
884
|
-
`.trim();
|
|
885
|
-
const waitlistHtml = `
|
|
886
|
-
<div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
|
|
887
|
-
<h1 style="color: #8b5cf6;">You're on the waitlist!</h1>
|
|
888
|
-
<p>Thanks for joining the ContractSpec waitlist. You're now in line for early access to:</p>
|
|
889
|
-
<ul style="line-height: 1.8;">
|
|
890
|
-
<li>Stabilize your AI-generated code with ContractSpec</li>
|
|
891
|
-
<li>Multi-surface consistency (API, DB, UI, events)</li>
|
|
892
|
-
<li>Safe regeneration without breaking changes</li>
|
|
893
|
-
<li>AI governance and contract enforcement</li>
|
|
894
|
-
</ul>
|
|
895
|
-
<p>We'll notify you as soon as early access is available. In the meantime, you can:</p>
|
|
896
|
-
<ul style="line-height: 1.8;">
|
|
897
|
-
<li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
|
|
898
|
-
<li>Follow our progress on GitHub</li>
|
|
899
|
-
<li>Book a demo call to see ContractSpec in action</li>
|
|
900
|
-
</ul>
|
|
901
|
-
<p>We're excited to have you on board!</p>
|
|
902
|
-
<hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
|
|
903
|
-
<p style="color: #6b7280; font-size: 14px;">
|
|
904
|
-
ContractSpec Team<br />
|
|
905
|
-
<a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
|
|
906
|
-
</p>
|
|
907
|
-
<p style="color: #9ca3af; font-size: 12px;">
|
|
908
|
-
To remove yourself from the waitlist, reply to this email with "remove"
|
|
909
|
-
</p>
|
|
910
|
-
</div>
|
|
911
|
-
`;
|
|
912
|
-
const userSend = await sendEmail(configResult.config, {
|
|
913
|
-
to: [{ email }],
|
|
914
|
-
subject: "You're on the ContractSpec waitlist!",
|
|
915
|
-
text: waitlistText,
|
|
916
|
-
html: waitlistHtml,
|
|
917
|
-
context: "waitlist-welcome"
|
|
918
|
-
});
|
|
919
|
-
if (!userSend.success) {
|
|
920
|
-
return { success: false, text: WAITLIST_SEND_ERROR };
|
|
921
|
-
}
|
|
922
|
-
const teamNotificationText = `New waitlist signup from: ${email}`;
|
|
923
|
-
const teamNotificationHtml = `
|
|
924
|
-
<div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
|
|
925
|
-
<p style="margin: 0 0 8px;">New waitlist signup</p>
|
|
926
|
-
<p style="margin: 0;"><strong>Email:</strong> ${formatMultilineHtml(email)}</p>
|
|
927
|
-
</div>
|
|
928
|
-
`;
|
|
929
|
-
const teamSend = await sendEmail(configResult.config, {
|
|
930
|
-
to: [configResult.config.teamInbox],
|
|
931
|
-
subject: `New Waitlist Signup: ${email}`,
|
|
932
|
-
text: teamNotificationText,
|
|
933
|
-
html: teamNotificationHtml,
|
|
934
|
-
context: "waitlist-team-notification"
|
|
935
|
-
});
|
|
936
|
-
if (!teamSend.success) {
|
|
937
|
-
return { success: false, text: WAITLIST_SEND_ERROR };
|
|
938
|
-
}
|
|
939
|
-
return { success: true, text: "Successfully joined waitlist!" };
|
|
940
|
-
};
|
|
941
|
-
|
|
942
|
-
// src/libs/email/waitlist-application.ts
|
|
943
|
-
"use server";
|
|
944
|
-
var APPLICATION_MISSING_CONFIG = "Waitlist application service is not configured. Please try again later.";
|
|
945
|
-
var APPLICATION_SEND_ERROR = "Failed to submit application. Please try again later or contact us directly.";
|
|
946
|
-
var submitWaitlistApplication = async (formData) => {
|
|
947
|
-
const email = (formData.get("email") ?? "").toString().trim();
|
|
948
|
-
const name = (formData.get("name") ?? "").toString().trim();
|
|
949
|
-
const company = (formData.get("company") ?? "").toString().trim();
|
|
950
|
-
const role = (formData.get("role") ?? "").toString().trim();
|
|
951
|
-
const useCase = (formData.get("useCase") ?? "").toString().trim();
|
|
952
|
-
const currentStack = (formData.get("currentStack") ?? "").toString().trim();
|
|
953
|
-
const whatBuilding = (formData.get("whatBuilding") ?? "").toString().trim();
|
|
954
|
-
const whatSolving = (formData.get("whatSolving") ?? "").toString().trim();
|
|
955
|
-
const teamSize = (formData.get("teamSize") ?? "").toString().trim();
|
|
956
|
-
const timeline = (formData.get("timeline") ?? "").toString().trim();
|
|
957
|
-
const openToSessions = formData.get("openToSessions") === "on";
|
|
958
|
-
const okayWithCaseStudies = formData.get("okayWithCaseStudies") === "on";
|
|
959
|
-
if (!email || !email.includes("@")) {
|
|
960
|
-
return {
|
|
961
|
-
success: false,
|
|
962
|
-
text: "Please enter a valid email address."
|
|
963
|
-
};
|
|
964
|
-
}
|
|
965
|
-
if (!name || !whatBuilding || !whatSolving) {
|
|
966
|
-
return {
|
|
967
|
-
success: false,
|
|
968
|
-
text: "Please fill in all required fields."
|
|
969
|
-
};
|
|
970
|
-
}
|
|
971
|
-
const configResult = getEmailConfig();
|
|
972
|
-
if (!configResult.ok || !configResult.config) {
|
|
973
|
-
return {
|
|
974
|
-
success: false,
|
|
975
|
-
text: configResult.errorMessage ?? APPLICATION_MISSING_CONFIG
|
|
976
|
-
};
|
|
977
|
-
}
|
|
978
|
-
const applicantText = `
|
|
979
|
-
You're on the list.
|
|
980
|
-
|
|
981
|
-
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.
|
|
982
|
-
|
|
983
|
-
What happens next:
|
|
984
|
-
• We review applications weekly
|
|
985
|
-
• If selected, we'll reach out via email to schedule an intro call
|
|
986
|
-
• During early access, you'll get hands-on support and influence over the roadmap
|
|
987
|
-
|
|
988
|
-
In the meantime:
|
|
989
|
-
• Check out our docs: https://contractspec.io/docs
|
|
990
|
-
• Book a demo call: https://contractspec.io/contact
|
|
991
|
-
|
|
992
|
-
We're excited about the possibility of working together!
|
|
993
|
-
|
|
994
|
-
---
|
|
995
|
-
ContractSpec Team
|
|
996
|
-
https://contractspec.io
|
|
997
|
-
`.trim();
|
|
998
|
-
const applicantHtml = `
|
|
999
|
-
<div style="font-family: sans-serif; max-width: 640px; margin: 0 auto;">
|
|
1000
|
-
<h1 style="color: #8b5cf6;">You're on the list.</h1>
|
|
1001
|
-
<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>
|
|
1002
|
-
<h2 style="color: #8b5cf6; margin-top: 24px;">What happens next:</h2>
|
|
1003
|
-
<ul style="line-height: 1.8;">
|
|
1004
|
-
<li>We review applications weekly</li>
|
|
1005
|
-
<li>If selected, we'll reach out via email to schedule an intro call</li>
|
|
1006
|
-
<li>During early access, you'll get hands-on support and influence over the roadmap</li>
|
|
1007
|
-
</ul>
|
|
1008
|
-
<h2 style="color: #8b5cf6; margin-top: 24px;">In the meantime:</h2>
|
|
1009
|
-
<ul style="line-height: 1.8;">
|
|
1010
|
-
<li>Check out our <a href="https://contractspec.io/docs" style="color: #8b5cf6;">docs</a></li>
|
|
1011
|
-
<li>Book a demo call: <a href="https://contractspec.io/contact" style="color: #8b5cf6;">contractspec.io/contact</a></li>
|
|
1012
|
-
</ul>
|
|
1013
|
-
<p>We're excited about the possibility of working together!</p>
|
|
1014
|
-
<hr style="margin: 30px 0; border: none; border-top: 1px solid #e5e7eb;" />
|
|
1015
|
-
<p style="color: #6b7280; font-size: 14px;">
|
|
1016
|
-
ContractSpec Team<br />
|
|
1017
|
-
<a href="https://contractspec.io" style="color: #8b5cf6;">contractspec.io</a>
|
|
1018
|
-
</p>
|
|
1019
|
-
</div>
|
|
1020
|
-
`;
|
|
1021
|
-
const applicantSend = await sendEmail(configResult.config, {
|
|
1022
|
-
to: [{ email }],
|
|
1023
|
-
subject: "You're on the ContractSpec design partner waitlist!",
|
|
1024
|
-
text: applicantText,
|
|
1025
|
-
html: applicantHtml,
|
|
1026
|
-
context: "waitlist-application-welcome"
|
|
1027
|
-
});
|
|
1028
|
-
if (!applicantSend.success) {
|
|
1029
|
-
return { success: false, text: APPLICATION_SEND_ERROR };
|
|
1030
|
-
}
|
|
1031
|
-
const preferencesText = `
|
|
1032
|
-
Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
|
|
1033
|
-
Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
|
|
1034
|
-
`.trim();
|
|
1035
|
-
const teamEmailText = `
|
|
1036
|
-
New Design Partner Waitlist Application
|
|
1037
|
-
|
|
1038
|
-
Contact Information:
|
|
1039
|
-
- Name: ${name}
|
|
1040
|
-
- Email: ${email}
|
|
1041
|
-
${company ? `- Company/Project: ${company}` : ""}
|
|
1042
|
-
${role ? `- Role: ${role}` : ""}
|
|
1043
|
-
|
|
1044
|
-
Application Details:
|
|
1045
|
-
- What are you building with AI today?
|
|
1046
|
-
${whatBuilding}
|
|
1047
|
-
|
|
1048
|
-
- What do you hope ContractSpec will solve for you?
|
|
1049
|
-
${whatSolving}
|
|
1050
|
-
|
|
1051
|
-
- Primary use case: ${useCase || "Not specified"}
|
|
1052
|
-
- Current stack: ${currentStack || "Not specified"}
|
|
1053
|
-
- Team Size: ${teamSize || "Not specified"}
|
|
1054
|
-
- Timeline: ${timeline || "Not specified"}
|
|
1055
|
-
|
|
1056
|
-
Preferences:
|
|
1057
|
-
- Open to 1:1 product/design sessions: ${openToSessions ? "Yes" : "No"}
|
|
1058
|
-
- Okay with anonymized case studies: ${okayWithCaseStudies ? "Yes" : "No"}
|
|
1059
|
-
|
|
1060
|
-
---
|
|
1061
|
-
Submitted via ContractSpec waitlist application form
|
|
1062
|
-
`.trim();
|
|
1063
|
-
const teamEmailHtml = `
|
|
1064
|
-
<div style="font-family: sans-serif; max-width: 720px; margin: 0 auto;">
|
|
1065
|
-
<h1 style="color: #8b5cf6;">New Design Partner Waitlist Application</h1>
|
|
1066
|
-
<h2 style="color: #8b5cf6; margin: 16px 0 8px;">Contact Information</h2>
|
|
1067
|
-
<ul style="padding-left: 16px; line-height: 1.6; margin: 0 0 16px;">
|
|
1068
|
-
<li>Name: ${escapeHtml(name)}</li>
|
|
1069
|
-
<li>Email: ${escapeHtml(email)}</li>
|
|
1070
|
-
${company ? `<li>Company/Project: ${escapeHtml(company)}</li>` : ""}
|
|
1071
|
-
${role ? `<li>Role: ${escapeHtml(role)}</li>` : ""}
|
|
1072
|
-
</ul>
|
|
1073
|
-
<h2 style="color: #8b5cf6; margin: 16px 0 8px;">Application Details</h2>
|
|
1074
|
-
<p style="margin: 0 0 8px; font-weight: 600;">What are you building with AI today?</p>
|
|
1075
|
-
<div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
|
|
1076
|
-
${formatMultilineHtml(whatBuilding)}
|
|
1077
|
-
</div>
|
|
1078
|
-
<p style="margin: 16px 0 8px; font-weight: 600;">What do you hope ContractSpec will solve for you?</p>
|
|
1079
|
-
<div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; white-space: pre-wrap; line-height: 1.6;">
|
|
1080
|
-
${formatMultilineHtml(whatSolving)}
|
|
1081
|
-
</div>
|
|
1082
|
-
<ul style="padding-left: 16px; line-height: 1.6; margin: 16px 0;">
|
|
1083
|
-
<li>Primary use case: ${escapeHtml(useCase || "Not specified")}</li>
|
|
1084
|
-
<li>Current stack: ${escapeHtml(currentStack || "Not specified")}</li>
|
|
1085
|
-
<li>Team Size: ${escapeHtml(teamSize || "Not specified")}</li>
|
|
1086
|
-
<li>Timeline: ${escapeHtml(timeline || "Not specified")}</li>
|
|
1087
|
-
</ul>
|
|
1088
|
-
<h2 style="color: #8b5cf6; margin: 16px 0 8px;">Preferences</h2>
|
|
1089
|
-
<div style="border: 1px solid #e5e7eb; border-radius: 8px; padding: 12px; background: #f9fafb; line-height: 1.6;">
|
|
1090
|
-
${formatMultilineHtml(preferencesText)}
|
|
1091
|
-
</div>
|
|
1092
|
-
<p style="color: #6b7280; font-size: 12px; margin-top: 20px;">Submitted via ContractSpec waitlist application form</p>
|
|
1093
|
-
</div>
|
|
1094
|
-
`;
|
|
1095
|
-
const teamSend = await sendEmail(configResult.config, {
|
|
1096
|
-
to: [configResult.config.teamInbox],
|
|
1097
|
-
subject: `New Design Partner Application: ${name} (${email})`,
|
|
1098
|
-
text: teamEmailText,
|
|
1099
|
-
html: teamEmailHtml,
|
|
1100
|
-
replyTo: email,
|
|
1101
|
-
context: "waitlist-application-team-notification"
|
|
1102
|
-
});
|
|
1103
|
-
if (!teamSend.success) {
|
|
1104
|
-
return { success: false, text: APPLICATION_SEND_ERROR };
|
|
1105
|
-
}
|
|
1106
|
-
return {
|
|
1107
|
-
success: true,
|
|
1108
|
-
text: "Application submitted successfully!"
|
|
1109
|
-
};
|
|
1110
|
-
};
|
|
1111
|
-
|
|
1112
|
-
// src/components/marketing/waitlist-section.tsx
|
|
1113
|
-
import { useEffect, useState } from "react";
|
|
1114
|
-
import { useForm } from "react-hook-form";
|
|
1115
|
-
import { zodResolver } from "@hookform/resolvers/zod";
|
|
1116
|
-
import z from "zod";
|
|
1117
|
-
import { AlertCircle, CheckCircle } from "lucide-react";
|
|
842
|
+
// src/components/marketing/studio-signup-section.tsx
|
|
843
|
+
import Link from "next/link";
|
|
844
|
+
import { ArrowRight, Rocket as Rocket2 } from "lucide-react";
|
|
1118
845
|
import { Button } from "@contractspec/lib.design-system";
|
|
1119
|
-
import {
|
|
1120
|
-
import { Label } from "@contractspec/lib.ui-kit-web/ui/label";
|
|
1121
|
-
import {
|
|
1122
|
-
Select,
|
|
1123
|
-
SelectContent,
|
|
1124
|
-
SelectItem,
|
|
1125
|
-
SelectTrigger,
|
|
1126
|
-
SelectValue
|
|
1127
|
-
} from "@contractspec/lib.ui-kit-web/ui/select";
|
|
1128
|
-
import { Checkbox } from "@contractspec/lib.ui-kit-web/ui/checkbox";
|
|
1129
|
-
import { Switch } from "@contractspec/lib.ui-kit-web/ui/switch";
|
|
1130
|
-
import { Input } from "@contractspec/lib.design-system";
|
|
1131
|
-
import { jsxDEV as jsxDEV3, Fragment } from "react/jsx-dev-runtime";
|
|
846
|
+
import { jsxDEV as jsxDEV3 } from "react/jsx-dev-runtime";
|
|
1132
847
|
"use client";
|
|
1133
|
-
var
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
name: z.string().min(1, "Name is required"),
|
|
1138
|
-
email: z.email("Please enter a valid email address"),
|
|
1139
|
-
company: z.string().optional(),
|
|
1140
|
-
role: z.string().optional(),
|
|
1141
|
-
useCase: z.string().optional(),
|
|
1142
|
-
currentStack: z.string().optional(),
|
|
1143
|
-
whatBuilding: z.string().min(1, "Please tell us what you are building"),
|
|
1144
|
-
whatSolving: z.string().min(1, "Please tell us what ContractSpec will solve for you"),
|
|
1145
|
-
teamSize: z.string().optional(),
|
|
1146
|
-
timeline: z.string().optional(),
|
|
1147
|
-
openToSessions: z.boolean().default(false),
|
|
1148
|
-
okayWithCaseStudies: z.boolean().default(false)
|
|
1149
|
-
});
|
|
1150
|
-
function WaitlistSection({
|
|
1151
|
-
variant = "default",
|
|
1152
|
-
context = "pricing"
|
|
848
|
+
var studioUrl = "https://app.contractspec.studio";
|
|
849
|
+
var studioDocsUrl = "https://app.contractspec.studio/docs";
|
|
850
|
+
function StudioSignupSection({
|
|
851
|
+
variant = "default"
|
|
1153
852
|
}) {
|
|
1154
|
-
const [isDesignPartner, setIsDesignPartner] = useState(false);
|
|
1155
|
-
const [submitResult, setSubmitResult] = useState(null);
|
|
1156
|
-
const [isPending, setIsPending] = useState(false);
|
|
1157
|
-
const simpleForm = useForm({
|
|
1158
|
-
resolver: zodResolver(simpleWaitlistSchema),
|
|
1159
|
-
defaultValues: {
|
|
1160
|
-
email: ""
|
|
1161
|
-
}
|
|
1162
|
-
});
|
|
1163
|
-
const designPartnerForm = useForm({
|
|
1164
|
-
resolver: zodResolver(designPartnerSchema),
|
|
1165
|
-
defaultValues: {
|
|
1166
|
-
name: "",
|
|
1167
|
-
email: "",
|
|
1168
|
-
company: "",
|
|
1169
|
-
role: "",
|
|
1170
|
-
useCase: "",
|
|
1171
|
-
currentStack: "",
|
|
1172
|
-
whatBuilding: "",
|
|
1173
|
-
whatSolving: "",
|
|
1174
|
-
teamSize: "",
|
|
1175
|
-
timeline: "",
|
|
1176
|
-
openToSessions: false,
|
|
1177
|
-
okayWithCaseStudies: false
|
|
1178
|
-
}
|
|
1179
|
-
});
|
|
1180
|
-
const simpleEmail = simpleForm.watch("email");
|
|
1181
|
-
const designPartnerEmail = designPartnerForm.watch("email");
|
|
1182
|
-
useEffect(() => {
|
|
1183
|
-
const currentDesignPartnerEmail = designPartnerForm.getValues("email");
|
|
1184
|
-
if (simpleEmail && simpleEmail !== currentDesignPartnerEmail) {
|
|
1185
|
-
designPartnerForm.setValue("email", simpleEmail, { shouldDirty: false });
|
|
1186
|
-
}
|
|
1187
|
-
}, [simpleEmail, designPartnerForm]);
|
|
1188
|
-
useEffect(() => {
|
|
1189
|
-
const currentSimpleEmail = simpleForm.getValues("email");
|
|
1190
|
-
if (designPartnerEmail && designPartnerEmail !== currentSimpleEmail) {
|
|
1191
|
-
simpleForm.setValue("email", designPartnerEmail, { shouldDirty: false });
|
|
1192
|
-
}
|
|
1193
|
-
}, [designPartnerEmail, simpleForm]);
|
|
1194
|
-
const handleSimpleSubmit = async (data) => {
|
|
1195
|
-
setIsPending(true);
|
|
1196
|
-
setSubmitResult(null);
|
|
1197
|
-
try {
|
|
1198
|
-
const formData = new FormData;
|
|
1199
|
-
formData.set("email", data.email);
|
|
1200
|
-
const result = await joinWaitlist(formData);
|
|
1201
|
-
if (result.success) {
|
|
1202
|
-
setSubmitResult({
|
|
1203
|
-
success: true,
|
|
1204
|
-
text: "Thanks for joining the waitlist! Check your inbox for a confirmation."
|
|
1205
|
-
});
|
|
1206
|
-
simpleForm.reset();
|
|
1207
|
-
} else {
|
|
1208
|
-
setSubmitResult({
|
|
1209
|
-
success: false,
|
|
1210
|
-
text: result.text || "Failed to join waitlist. Please try again."
|
|
1211
|
-
});
|
|
1212
|
-
}
|
|
1213
|
-
} catch (_error) {
|
|
1214
|
-
setSubmitResult({
|
|
1215
|
-
success: false,
|
|
1216
|
-
text: "Failed to join waitlist. Please try again."
|
|
1217
|
-
});
|
|
1218
|
-
} finally {
|
|
1219
|
-
setIsPending(false);
|
|
1220
|
-
}
|
|
1221
|
-
};
|
|
1222
|
-
const handleDesignPartnerSubmit = async (data) => {
|
|
1223
|
-
setIsPending(true);
|
|
1224
|
-
setSubmitResult(null);
|
|
1225
|
-
try {
|
|
1226
|
-
const formData = new FormData;
|
|
1227
|
-
formData.set("email", data.email);
|
|
1228
|
-
formData.set("name", data.name);
|
|
1229
|
-
if (data.company)
|
|
1230
|
-
formData.set("company", data.company);
|
|
1231
|
-
if (data.role)
|
|
1232
|
-
formData.set("role", data.role);
|
|
1233
|
-
if (data.useCase)
|
|
1234
|
-
formData.set("useCase", data.useCase);
|
|
1235
|
-
if (data.currentStack)
|
|
1236
|
-
formData.set("currentStack", data.currentStack);
|
|
1237
|
-
formData.set("whatBuilding", data.whatBuilding);
|
|
1238
|
-
formData.set("whatSolving", data.whatSolving);
|
|
1239
|
-
if (data.teamSize)
|
|
1240
|
-
formData.set("teamSize", data.teamSize);
|
|
1241
|
-
if (data.timeline)
|
|
1242
|
-
formData.set("timeline", data.timeline);
|
|
1243
|
-
if (data.openToSessions)
|
|
1244
|
-
formData.set("openToSessions", "on");
|
|
1245
|
-
if (data.okayWithCaseStudies)
|
|
1246
|
-
formData.set("okayWithCaseStudies", "on");
|
|
1247
|
-
const result = await submitWaitlistApplication(formData);
|
|
1248
|
-
if (result.success) {
|
|
1249
|
-
setSubmitResult({
|
|
1250
|
-
success: true,
|
|
1251
|
-
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."
|
|
1252
|
-
});
|
|
1253
|
-
designPartnerForm.reset();
|
|
1254
|
-
} else {
|
|
1255
|
-
setSubmitResult({
|
|
1256
|
-
success: false,
|
|
1257
|
-
text: result.text || "Failed to submit application. Please try again."
|
|
1258
|
-
});
|
|
1259
|
-
}
|
|
1260
|
-
} catch (_error) {
|
|
1261
|
-
setSubmitResult({
|
|
1262
|
-
success: false,
|
|
1263
|
-
text: "Failed to submit application. Please try again."
|
|
1264
|
-
});
|
|
1265
|
-
} finally {
|
|
1266
|
-
setIsPending(false);
|
|
1267
|
-
}
|
|
1268
|
-
};
|
|
1269
|
-
const onSubmit = isDesignPartner ? designPartnerForm.handleSubmit(handleDesignPartnerSubmit) : simpleForm.handleSubmit(handleSimpleSubmit);
|
|
1270
853
|
const isCompact = variant === "compact";
|
|
1271
854
|
return /* @__PURE__ */ jsxDEV3("div", {
|
|
1272
|
-
id: "
|
|
855
|
+
id: "studio-signup",
|
|
1273
856
|
className: isCompact ? "space-y-4" : "card-subtle space-y-6 p-8",
|
|
1274
857
|
children: [
|
|
1275
|
-
|
|
858
|
+
/* @__PURE__ */ jsxDEV3("div", {
|
|
1276
859
|
className: "space-y-4",
|
|
1277
860
|
children: [
|
|
1278
861
|
/* @__PURE__ */ jsxDEV3("div", {
|
|
1279
862
|
className: "inline-flex items-center gap-2 rounded-full border border-violet-500/20 bg-violet-500/10 px-3 py-1",
|
|
1280
|
-
children: /* @__PURE__ */ jsxDEV3("span", {
|
|
1281
|
-
className: "text-sm font-medium text-violet-300",
|
|
1282
|
-
children: isDesignPartner ? "Design Partner Waitlist" : "Join the Waitlist"
|
|
1283
|
-
}, undefined, false, undefined, this)
|
|
1284
|
-
}, undefined, false, undefined, this),
|
|
1285
|
-
/* @__PURE__ */ jsxDEV3("h2", {
|
|
1286
|
-
className: "text-2xl font-bold",
|
|
1287
|
-
children: isDesignPartner ? "Apply for early access to ContractSpec" : "Get early access to ContractSpec"
|
|
1288
|
-
}, undefined, false, undefined, this),
|
|
1289
|
-
/* @__PURE__ */ jsxDEV3("p", {
|
|
1290
|
-
className: "text-muted-foreground text-sm",
|
|
1291
|
-
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."
|
|
1292
|
-
}, undefined, false, undefined, this)
|
|
1293
|
-
]
|
|
1294
|
-
}, undefined, true, undefined, this),
|
|
1295
|
-
!isCompact && /* @__PURE__ */ jsxDEV3("div", {
|
|
1296
|
-
className: "border-border bg-muted/20 flex items-center justify-between gap-4 rounded-lg border p-4",
|
|
1297
|
-
children: [
|
|
1298
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1299
|
-
className: "space-y-1",
|
|
1300
863
|
children: [
|
|
1301
|
-
/* @__PURE__ */ jsxDEV3(
|
|
1302
|
-
|
|
1303
|
-
className: "text-
|
|
1304
|
-
children: "Apply as a design partner"
|
|
864
|
+
/* @__PURE__ */ jsxDEV3(Rocket2, {
|
|
865
|
+
size: 14,
|
|
866
|
+
className: "text-violet-300"
|
|
1305
867
|
}, undefined, false, undefined, this),
|
|
1306
|
-
/* @__PURE__ */ jsxDEV3("
|
|
1307
|
-
className: "text-
|
|
1308
|
-
children:
|
|
868
|
+
/* @__PURE__ */ jsxDEV3("span", {
|
|
869
|
+
className: "text-sm font-medium text-violet-300",
|
|
870
|
+
children: "ContractSpec Studio"
|
|
1309
871
|
}, undefined, false, undefined, this)
|
|
1310
872
|
]
|
|
1311
873
|
}, undefined, true, undefined, this),
|
|
1312
|
-
/* @__PURE__ */ jsxDEV3(
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
disabled: isPending || submitResult?.success
|
|
1317
|
-
}, undefined, false, undefined, this)
|
|
1318
|
-
]
|
|
1319
|
-
}, undefined, true, undefined, this),
|
|
1320
|
-
!isCompact && isDesignPartner && /* @__PURE__ */ jsxDEV3("div", {
|
|
1321
|
-
className: "space-y-2",
|
|
1322
|
-
children: [
|
|
874
|
+
/* @__PURE__ */ jsxDEV3("h2", {
|
|
875
|
+
className: isCompact ? "text-xl font-bold" : "text-2xl font-bold",
|
|
876
|
+
children: "Try ContractSpec Studio"
|
|
877
|
+
}, undefined, false, undefined, this),
|
|
1323
878
|
/* @__PURE__ */ jsxDEV3("p", {
|
|
1324
|
-
className: "text-
|
|
1325
|
-
children: "
|
|
879
|
+
className: "text-muted-foreground text-sm",
|
|
880
|
+
children: "The AI-powered product decision engine that turns product signals into spec-first deliverables."
|
|
1326
881
|
}, undefined, false, undefined, this),
|
|
1327
|
-
/* @__PURE__ */ jsxDEV3("
|
|
1328
|
-
className: "text-muted-foreground
|
|
1329
|
-
children:
|
|
1330
|
-
|
|
1331
|
-
children: "• Early access to ContractSpec Studio"
|
|
1332
|
-
}, undefined, false, undefined, this),
|
|
1333
|
-
/* @__PURE__ */ jsxDEV3("li", {
|
|
1334
|
-
children: "• 1:1 onboarding and architecture sessions"
|
|
1335
|
-
}, undefined, false, undefined, this),
|
|
1336
|
-
/* @__PURE__ */ jsxDEV3("li", {
|
|
1337
|
-
children: "• Priority support via direct channels"
|
|
1338
|
-
}, undefined, false, undefined, this),
|
|
1339
|
-
/* @__PURE__ */ jsxDEV3("li", {
|
|
1340
|
-
children: "• Influence over roadmap and features"
|
|
1341
|
-
}, undefined, false, undefined, this),
|
|
1342
|
-
/* @__PURE__ */ jsxDEV3("li", {
|
|
1343
|
-
children: "• Founding discount when paid plans launch"
|
|
1344
|
-
}, undefined, false, undefined, this)
|
|
1345
|
-
]
|
|
1346
|
-
}, undefined, true, undefined, this)
|
|
882
|
+
/* @__PURE__ */ jsxDEV3("p", {
|
|
883
|
+
className: "text-muted-foreground text-xs",
|
|
884
|
+
children: "Evidence -> Correlation -> Decision -> Change -> Export -> Check -> Notify -> Autopilot"
|
|
885
|
+
}, undefined, false, undefined, this)
|
|
1347
886
|
]
|
|
1348
887
|
}, undefined, true, undefined, this),
|
|
1349
|
-
/* @__PURE__ */ jsxDEV3("
|
|
1350
|
-
|
|
1351
|
-
className: "space-y-4",
|
|
888
|
+
/* @__PURE__ */ jsxDEV3("div", {
|
|
889
|
+
className: "flex flex-col gap-3 sm:flex-row",
|
|
1352
890
|
children: [
|
|
1353
|
-
isDesignPartner ? /* @__PURE__ */ jsxDEV3(Fragment, {
|
|
1354
|
-
children: [
|
|
1355
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1356
|
-
className: "grid gap-4 md:grid-cols-2",
|
|
1357
|
-
children: [
|
|
1358
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1359
|
-
className: "space-y-2",
|
|
1360
|
-
children: [
|
|
1361
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1362
|
-
htmlFor: "waitlist-name",
|
|
1363
|
-
className: "text-sm font-medium",
|
|
1364
|
-
children: [
|
|
1365
|
-
"Name ",
|
|
1366
|
-
/* @__PURE__ */ jsxDEV3("span", {
|
|
1367
|
-
className: "text-red-400",
|
|
1368
|
-
children: "*"
|
|
1369
|
-
}, undefined, false, undefined, this)
|
|
1370
|
-
]
|
|
1371
|
-
}, undefined, true, undefined, this),
|
|
1372
|
-
/* @__PURE__ */ jsxDEV3(Input, {
|
|
1373
|
-
id: "waitlist-name",
|
|
1374
|
-
...designPartnerForm.register("name"),
|
|
1375
|
-
type: "text",
|
|
1376
|
-
placeholder: "Your name",
|
|
1377
|
-
disabled: isPending || submitResult?.success
|
|
1378
|
-
}, undefined, false, undefined, this),
|
|
1379
|
-
designPartnerForm.formState.errors.name && /* @__PURE__ */ jsxDEV3("p", {
|
|
1380
|
-
className: "text-xs text-red-400",
|
|
1381
|
-
children: designPartnerForm.formState.errors.name.message
|
|
1382
|
-
}, undefined, false, undefined, this)
|
|
1383
|
-
]
|
|
1384
|
-
}, undefined, true, undefined, this),
|
|
1385
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1386
|
-
className: "space-y-2",
|
|
1387
|
-
children: [
|
|
1388
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1389
|
-
htmlFor: "waitlist-email",
|
|
1390
|
-
className: "text-sm font-medium",
|
|
1391
|
-
children: [
|
|
1392
|
-
"Email ",
|
|
1393
|
-
/* @__PURE__ */ jsxDEV3("span", {
|
|
1394
|
-
className: "text-red-400",
|
|
1395
|
-
children: "*"
|
|
1396
|
-
}, undefined, false, undefined, this)
|
|
1397
|
-
]
|
|
1398
|
-
}, undefined, true, undefined, this),
|
|
1399
|
-
/* @__PURE__ */ jsxDEV3(Input, {
|
|
1400
|
-
id: "waitlist-email",
|
|
1401
|
-
...designPartnerForm.register("email"),
|
|
1402
|
-
type: "email",
|
|
1403
|
-
placeholder: "your@email.com",
|
|
1404
|
-
disabled: isPending || submitResult?.success
|
|
1405
|
-
}, undefined, false, undefined, this),
|
|
1406
|
-
designPartnerForm.formState.errors.email && /* @__PURE__ */ jsxDEV3("p", {
|
|
1407
|
-
className: "text-xs text-red-400",
|
|
1408
|
-
children: designPartnerForm.formState.errors.email.message
|
|
1409
|
-
}, undefined, false, undefined, this)
|
|
1410
|
-
]
|
|
1411
|
-
}, undefined, true, undefined, this)
|
|
1412
|
-
]
|
|
1413
|
-
}, undefined, true, undefined, this),
|
|
1414
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1415
|
-
className: "grid gap-4 md:grid-cols-2",
|
|
1416
|
-
children: [
|
|
1417
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1418
|
-
className: "space-y-2",
|
|
1419
|
-
children: [
|
|
1420
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1421
|
-
htmlFor: "waitlist-company",
|
|
1422
|
-
className: "text-sm font-medium",
|
|
1423
|
-
children: "Company / Project Name"
|
|
1424
|
-
}, undefined, false, undefined, this),
|
|
1425
|
-
/* @__PURE__ */ jsxDEV3(Input, {
|
|
1426
|
-
id: "waitlist-company",
|
|
1427
|
-
...designPartnerForm.register("company"),
|
|
1428
|
-
type: "text",
|
|
1429
|
-
placeholder: "Your company or project",
|
|
1430
|
-
disabled: isPending || submitResult?.success
|
|
1431
|
-
}, undefined, false, undefined, this)
|
|
1432
|
-
]
|
|
1433
|
-
}, undefined, true, undefined, this),
|
|
1434
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1435
|
-
className: "space-y-2",
|
|
1436
|
-
children: [
|
|
1437
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1438
|
-
htmlFor: "waitlist-role",
|
|
1439
|
-
className: "text-sm font-medium",
|
|
1440
|
-
children: "Role"
|
|
1441
|
-
}, undefined, false, undefined, this),
|
|
1442
|
-
/* @__PURE__ */ jsxDEV3(Select, {
|
|
1443
|
-
value: designPartnerForm.watch("role") || "",
|
|
1444
|
-
onValueChange: (value) => designPartnerForm.setValue("role", value),
|
|
1445
|
-
disabled: isPending || submitResult?.success,
|
|
1446
|
-
children: [
|
|
1447
|
-
/* @__PURE__ */ jsxDEV3(SelectTrigger, {
|
|
1448
|
-
id: "waitlist-role",
|
|
1449
|
-
className: "w-full",
|
|
1450
|
-
children: /* @__PURE__ */ jsxDEV3(SelectValue, {
|
|
1451
|
-
placeholder: "Select your role"
|
|
1452
|
-
}, undefined, false, undefined, this)
|
|
1453
|
-
}, undefined, false, undefined, this),
|
|
1454
|
-
/* @__PURE__ */ jsxDEV3(SelectContent, {
|
|
1455
|
-
children: [
|
|
1456
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1457
|
-
value: "founder",
|
|
1458
|
-
children: "Founder"
|
|
1459
|
-
}, undefined, false, undefined, this),
|
|
1460
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1461
|
-
value: "cto",
|
|
1462
|
-
children: "CTO"
|
|
1463
|
-
}, undefined, false, undefined, this),
|
|
1464
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1465
|
-
value: "lead-engineer",
|
|
1466
|
-
children: "Lead Engineer"
|
|
1467
|
-
}, undefined, false, undefined, this),
|
|
1468
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1469
|
-
value: "engineer",
|
|
1470
|
-
children: "Engineer"
|
|
1471
|
-
}, undefined, false, undefined, this),
|
|
1472
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1473
|
-
value: "product-manager",
|
|
1474
|
-
children: "Product Manager"
|
|
1475
|
-
}, undefined, false, undefined, this),
|
|
1476
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1477
|
-
value: "other",
|
|
1478
|
-
children: "Other"
|
|
1479
|
-
}, undefined, false, undefined, this)
|
|
1480
|
-
]
|
|
1481
|
-
}, undefined, true, undefined, this)
|
|
1482
|
-
]
|
|
1483
|
-
}, undefined, true, undefined, this)
|
|
1484
|
-
]
|
|
1485
|
-
}, undefined, true, undefined, this)
|
|
1486
|
-
]
|
|
1487
|
-
}, undefined, true, undefined, this),
|
|
1488
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1489
|
-
className: "grid gap-4 md:grid-cols-2",
|
|
1490
|
-
children: [
|
|
1491
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1492
|
-
className: "space-y-2",
|
|
1493
|
-
children: [
|
|
1494
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1495
|
-
htmlFor: "waitlist-use-case",
|
|
1496
|
-
className: "text-sm font-medium",
|
|
1497
|
-
children: "Primary use case"
|
|
1498
|
-
}, undefined, false, undefined, this),
|
|
1499
|
-
/* @__PURE__ */ jsxDEV3(Select, {
|
|
1500
|
-
value: designPartnerForm.watch("useCase") || "",
|
|
1501
|
-
onValueChange: (value) => designPartnerForm.setValue("useCase", value),
|
|
1502
|
-
disabled: isPending || submitResult?.success,
|
|
1503
|
-
children: [
|
|
1504
|
-
/* @__PURE__ */ jsxDEV3(SelectTrigger, {
|
|
1505
|
-
id: "waitlist-use-case",
|
|
1506
|
-
className: "w-full",
|
|
1507
|
-
children: /* @__PURE__ */ jsxDEV3(SelectValue, {
|
|
1508
|
-
placeholder: "Select a use case"
|
|
1509
|
-
}, undefined, false, undefined, this)
|
|
1510
|
-
}, undefined, false, undefined, this),
|
|
1511
|
-
/* @__PURE__ */ jsxDEV3(SelectContent, {
|
|
1512
|
-
children: [
|
|
1513
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1514
|
-
value: "api-platform",
|
|
1515
|
-
children: "API platform"
|
|
1516
|
-
}, undefined, false, undefined, this),
|
|
1517
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1518
|
-
value: "ai-ops",
|
|
1519
|
-
children: "AI operations"
|
|
1520
|
-
}, undefined, false, undefined, this),
|
|
1521
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1522
|
-
value: "integration-hub",
|
|
1523
|
-
children: "Integration hub"
|
|
1524
|
-
}, undefined, false, undefined, this),
|
|
1525
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1526
|
-
value: "internal-tools",
|
|
1527
|
-
children: "Internal tools"
|
|
1528
|
-
}, undefined, false, undefined, this),
|
|
1529
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1530
|
-
value: "data-pipelines",
|
|
1531
|
-
children: "Data pipelines"
|
|
1532
|
-
}, undefined, false, undefined, this),
|
|
1533
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1534
|
-
value: "other",
|
|
1535
|
-
children: "Other"
|
|
1536
|
-
}, undefined, false, undefined, this)
|
|
1537
|
-
]
|
|
1538
|
-
}, undefined, true, undefined, this)
|
|
1539
|
-
]
|
|
1540
|
-
}, undefined, true, undefined, this)
|
|
1541
|
-
]
|
|
1542
|
-
}, undefined, true, undefined, this),
|
|
1543
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1544
|
-
className: "space-y-2",
|
|
1545
|
-
children: [
|
|
1546
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1547
|
-
htmlFor: "waitlist-current-stack",
|
|
1548
|
-
className: "text-sm font-medium",
|
|
1549
|
-
children: "Current stack"
|
|
1550
|
-
}, undefined, false, undefined, this),
|
|
1551
|
-
/* @__PURE__ */ jsxDEV3(Input, {
|
|
1552
|
-
id: "waitlist-current-stack",
|
|
1553
|
-
...designPartnerForm.register("currentStack"),
|
|
1554
|
-
type: "text",
|
|
1555
|
-
placeholder: "e.g. Next.js, Postgres, OpenAPI",
|
|
1556
|
-
disabled: isPending || submitResult?.success
|
|
1557
|
-
}, undefined, false, undefined, this)
|
|
1558
|
-
]
|
|
1559
|
-
}, undefined, true, undefined, this)
|
|
1560
|
-
]
|
|
1561
|
-
}, undefined, true, undefined, this),
|
|
1562
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1563
|
-
className: "space-y-2",
|
|
1564
|
-
children: [
|
|
1565
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1566
|
-
htmlFor: "waitlist-what-building",
|
|
1567
|
-
className: "text-sm font-medium",
|
|
1568
|
-
children: [
|
|
1569
|
-
"What are you building with AI today?",
|
|
1570
|
-
" ",
|
|
1571
|
-
/* @__PURE__ */ jsxDEV3("span", {
|
|
1572
|
-
className: "text-red-400",
|
|
1573
|
-
children: "*"
|
|
1574
|
-
}, undefined, false, undefined, this)
|
|
1575
|
-
]
|
|
1576
|
-
}, undefined, true, undefined, this),
|
|
1577
|
-
/* @__PURE__ */ jsxDEV3(Textarea, {
|
|
1578
|
-
id: "waitlist-what-building",
|
|
1579
|
-
...designPartnerForm.register("whatBuilding"),
|
|
1580
|
-
placeholder: "Tell us about your project...",
|
|
1581
|
-
disabled: isPending || submitResult?.success,
|
|
1582
|
-
rows: 4
|
|
1583
|
-
}, undefined, false, undefined, this),
|
|
1584
|
-
designPartnerForm.formState.errors.whatBuilding && /* @__PURE__ */ jsxDEV3("p", {
|
|
1585
|
-
className: "text-xs text-red-400",
|
|
1586
|
-
children: designPartnerForm.formState.errors.whatBuilding.message
|
|
1587
|
-
}, undefined, false, undefined, this)
|
|
1588
|
-
]
|
|
1589
|
-
}, undefined, true, undefined, this),
|
|
1590
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1591
|
-
className: "space-y-2",
|
|
1592
|
-
children: [
|
|
1593
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1594
|
-
htmlFor: "waitlist-what-solving",
|
|
1595
|
-
className: "text-sm font-medium",
|
|
1596
|
-
children: [
|
|
1597
|
-
"What do you hope ContractSpec will solve for you?",
|
|
1598
|
-
" ",
|
|
1599
|
-
/* @__PURE__ */ jsxDEV3("span", {
|
|
1600
|
-
className: "text-red-400",
|
|
1601
|
-
children: "*"
|
|
1602
|
-
}, undefined, false, undefined, this)
|
|
1603
|
-
]
|
|
1604
|
-
}, undefined, true, undefined, this),
|
|
1605
|
-
/* @__PURE__ */ jsxDEV3(Textarea, {
|
|
1606
|
-
id: "waitlist-what-solving",
|
|
1607
|
-
...designPartnerForm.register("whatSolving"),
|
|
1608
|
-
placeholder: "What problems are you trying to solve?",
|
|
1609
|
-
disabled: isPending || submitResult?.success,
|
|
1610
|
-
rows: 4
|
|
1611
|
-
}, undefined, false, undefined, this),
|
|
1612
|
-
designPartnerForm.formState.errors.whatSolving && /* @__PURE__ */ jsxDEV3("p", {
|
|
1613
|
-
className: "text-xs text-red-400",
|
|
1614
|
-
children: designPartnerForm.formState.errors.whatSolving.message
|
|
1615
|
-
}, undefined, false, undefined, this)
|
|
1616
|
-
]
|
|
1617
|
-
}, undefined, true, undefined, this),
|
|
1618
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1619
|
-
className: "grid gap-4 md:grid-cols-2",
|
|
1620
|
-
children: [
|
|
1621
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1622
|
-
className: "space-y-2",
|
|
1623
|
-
children: [
|
|
1624
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1625
|
-
htmlFor: "waitlist-team-size",
|
|
1626
|
-
className: "text-sm font-medium",
|
|
1627
|
-
children: "Team Size"
|
|
1628
|
-
}, undefined, false, undefined, this),
|
|
1629
|
-
/* @__PURE__ */ jsxDEV3(Select, {
|
|
1630
|
-
value: designPartnerForm.watch("teamSize") || "",
|
|
1631
|
-
onValueChange: (value) => designPartnerForm.setValue("teamSize", value),
|
|
1632
|
-
disabled: isPending || submitResult?.success,
|
|
1633
|
-
children: [
|
|
1634
|
-
/* @__PURE__ */ jsxDEV3(SelectTrigger, {
|
|
1635
|
-
id: "waitlist-team-size",
|
|
1636
|
-
className: "w-full",
|
|
1637
|
-
children: /* @__PURE__ */ jsxDEV3(SelectValue, {
|
|
1638
|
-
placeholder: "Select team size"
|
|
1639
|
-
}, undefined, false, undefined, this)
|
|
1640
|
-
}, undefined, false, undefined, this),
|
|
1641
|
-
/* @__PURE__ */ jsxDEV3(SelectContent, {
|
|
1642
|
-
children: [
|
|
1643
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1644
|
-
value: "solo",
|
|
1645
|
-
children: "Solo"
|
|
1646
|
-
}, undefined, false, undefined, this),
|
|
1647
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1648
|
-
value: "2-5",
|
|
1649
|
-
children: "2-5"
|
|
1650
|
-
}, undefined, false, undefined, this),
|
|
1651
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1652
|
-
value: "6-20",
|
|
1653
|
-
children: "6-20"
|
|
1654
|
-
}, undefined, false, undefined, this),
|
|
1655
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1656
|
-
value: "20+",
|
|
1657
|
-
children: "20+"
|
|
1658
|
-
}, undefined, false, undefined, this)
|
|
1659
|
-
]
|
|
1660
|
-
}, undefined, true, undefined, this)
|
|
1661
|
-
]
|
|
1662
|
-
}, undefined, true, undefined, this)
|
|
1663
|
-
]
|
|
1664
|
-
}, undefined, true, undefined, this),
|
|
1665
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1666
|
-
className: "space-y-2",
|
|
1667
|
-
children: [
|
|
1668
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1669
|
-
htmlFor: "waitlist-timeline",
|
|
1670
|
-
className: "text-sm font-medium",
|
|
1671
|
-
children: "Timeline"
|
|
1672
|
-
}, undefined, false, undefined, this),
|
|
1673
|
-
/* @__PURE__ */ jsxDEV3(Select, {
|
|
1674
|
-
value: designPartnerForm.watch("timeline") || "",
|
|
1675
|
-
onValueChange: (value) => designPartnerForm.setValue("timeline", value),
|
|
1676
|
-
disabled: isPending || submitResult?.success,
|
|
1677
|
-
children: [
|
|
1678
|
-
/* @__PURE__ */ jsxDEV3(SelectTrigger, {
|
|
1679
|
-
id: "waitlist-timeline",
|
|
1680
|
-
className: "w-full",
|
|
1681
|
-
children: /* @__PURE__ */ jsxDEV3(SelectValue, {
|
|
1682
|
-
placeholder: "Select timeline"
|
|
1683
|
-
}, undefined, false, undefined, this)
|
|
1684
|
-
}, undefined, false, undefined, this),
|
|
1685
|
-
/* @__PURE__ */ jsxDEV3(SelectContent, {
|
|
1686
|
-
children: [
|
|
1687
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1688
|
-
value: "now",
|
|
1689
|
-
children: "Now"
|
|
1690
|
-
}, undefined, false, undefined, this),
|
|
1691
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1692
|
-
value: "1-3-months",
|
|
1693
|
-
children: "1-3 months"
|
|
1694
|
-
}, undefined, false, undefined, this),
|
|
1695
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1696
|
-
value: "3-6-months",
|
|
1697
|
-
children: "3-6 months"
|
|
1698
|
-
}, undefined, false, undefined, this),
|
|
1699
|
-
/* @__PURE__ */ jsxDEV3(SelectItem, {
|
|
1700
|
-
value: "exploring",
|
|
1701
|
-
children: "Exploring"
|
|
1702
|
-
}, undefined, false, undefined, this)
|
|
1703
|
-
]
|
|
1704
|
-
}, undefined, true, undefined, this)
|
|
1705
|
-
]
|
|
1706
|
-
}, undefined, true, undefined, this)
|
|
1707
|
-
]
|
|
1708
|
-
}, undefined, true, undefined, this)
|
|
1709
|
-
]
|
|
1710
|
-
}, undefined, true, undefined, this),
|
|
1711
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1712
|
-
className: "space-y-3",
|
|
1713
|
-
children: [
|
|
1714
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1715
|
-
className: "flex items-start gap-3",
|
|
1716
|
-
children: [
|
|
1717
|
-
/* @__PURE__ */ jsxDEV3(Checkbox, {
|
|
1718
|
-
id: "waitlist-open-to-sessions",
|
|
1719
|
-
checked: designPartnerForm.watch("openToSessions"),
|
|
1720
|
-
onCheckedChange: (checked) => designPartnerForm.setValue("openToSessions", checked === true),
|
|
1721
|
-
disabled: isPending || submitResult?.success
|
|
1722
|
-
}, undefined, false, undefined, this),
|
|
1723
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1724
|
-
htmlFor: "waitlist-open-to-sessions",
|
|
1725
|
-
className: "cursor-pointer text-sm leading-relaxed",
|
|
1726
|
-
children: "I'm open to 1:1 product/design sessions"
|
|
1727
|
-
}, undefined, false, undefined, this)
|
|
1728
|
-
]
|
|
1729
|
-
}, undefined, true, undefined, this),
|
|
1730
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1731
|
-
className: "flex items-start gap-3",
|
|
1732
|
-
children: [
|
|
1733
|
-
/* @__PURE__ */ jsxDEV3(Checkbox, {
|
|
1734
|
-
id: "waitlist-case-studies",
|
|
1735
|
-
checked: designPartnerForm.watch("okayWithCaseStudies"),
|
|
1736
|
-
onCheckedChange: (checked) => designPartnerForm.setValue("okayWithCaseStudies", checked === true),
|
|
1737
|
-
disabled: isPending || submitResult?.success
|
|
1738
|
-
}, undefined, false, undefined, this),
|
|
1739
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1740
|
-
htmlFor: "waitlist-case-studies",
|
|
1741
|
-
className: "cursor-pointer text-sm leading-relaxed",
|
|
1742
|
-
children: "I'm okay with anonymized case studies about our usage"
|
|
1743
|
-
}, undefined, false, undefined, this)
|
|
1744
|
-
]
|
|
1745
|
-
}, undefined, true, undefined, this)
|
|
1746
|
-
]
|
|
1747
|
-
}, undefined, true, undefined, this)
|
|
1748
|
-
]
|
|
1749
|
-
}, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV3("div", {
|
|
1750
|
-
className: "space-y-2",
|
|
1751
|
-
children: [
|
|
1752
|
-
/* @__PURE__ */ jsxDEV3(Label, {
|
|
1753
|
-
htmlFor: "waitlist-email",
|
|
1754
|
-
className: "text-sm font-medium",
|
|
1755
|
-
children: [
|
|
1756
|
-
"Email ",
|
|
1757
|
-
/* @__PURE__ */ jsxDEV3("span", {
|
|
1758
|
-
className: "text-red-400",
|
|
1759
|
-
children: "*"
|
|
1760
|
-
}, undefined, false, undefined, this)
|
|
1761
|
-
]
|
|
1762
|
-
}, undefined, true, undefined, this),
|
|
1763
|
-
/* @__PURE__ */ jsxDEV3(Input, {
|
|
1764
|
-
id: "waitlist-email",
|
|
1765
|
-
...simpleForm.register("email"),
|
|
1766
|
-
type: "email",
|
|
1767
|
-
placeholder: "your@email.com",
|
|
1768
|
-
disabled: isPending || submitResult?.success
|
|
1769
|
-
}, undefined, false, undefined, this),
|
|
1770
|
-
simpleForm.formState.errors.email && /* @__PURE__ */ jsxDEV3("p", {
|
|
1771
|
-
className: "text-xs text-red-400",
|
|
1772
|
-
children: simpleForm.formState.errors.email.message
|
|
1773
|
-
}, undefined, false, undefined, this)
|
|
1774
|
-
]
|
|
1775
|
-
}, undefined, true, undefined, this),
|
|
1776
|
-
submitResult && !isPending && /* @__PURE__ */ jsxDEV3("div", {
|
|
1777
|
-
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"}`,
|
|
1778
|
-
children: [
|
|
1779
|
-
submitResult.success ? /* @__PURE__ */ jsxDEV3(CheckCircle, {
|
|
1780
|
-
size: 20,
|
|
1781
|
-
className: "mt-0.5 shrink-0"
|
|
1782
|
-
}, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV3(AlertCircle, {
|
|
1783
|
-
size: 20,
|
|
1784
|
-
className: "mt-0.5 shrink-0"
|
|
1785
|
-
}, undefined, false, undefined, this),
|
|
1786
|
-
/* @__PURE__ */ jsxDEV3("div", {
|
|
1787
|
-
className: "flex-1",
|
|
1788
|
-
children: submitResult.success ? /* @__PURE__ */ jsxDEV3(Fragment, {
|
|
1789
|
-
children: [
|
|
1790
|
-
/* @__PURE__ */ jsxDEV3("p", {
|
|
1791
|
-
className: "mb-1 font-semibold",
|
|
1792
|
-
children: "You're on the list."
|
|
1793
|
-
}, undefined, false, undefined, this),
|
|
1794
|
-
/* @__PURE__ */ jsxDEV3("p", {
|
|
1795
|
-
className: "text-sm",
|
|
1796
|
-
children: submitResult.text
|
|
1797
|
-
}, undefined, false, undefined, this)
|
|
1798
|
-
]
|
|
1799
|
-
}, undefined, true, undefined, this) : /* @__PURE__ */ jsxDEV3("p", {
|
|
1800
|
-
children: submitResult.text
|
|
1801
|
-
}, undefined, false, undefined, this)
|
|
1802
|
-
}, undefined, false, undefined, this)
|
|
1803
|
-
]
|
|
1804
|
-
}, undefined, true, undefined, this),
|
|
1805
891
|
/* @__PURE__ */ jsxDEV3(Button, {
|
|
1806
|
-
|
|
1807
|
-
|
|
1808
|
-
|
|
1809
|
-
|
|
892
|
+
asChild: true,
|
|
893
|
+
className: "w-full sm:w-auto",
|
|
894
|
+
children: /* @__PURE__ */ jsxDEV3(Link, {
|
|
895
|
+
href: studioUrl,
|
|
896
|
+
children: [
|
|
897
|
+
"Get Started Free ",
|
|
898
|
+
/* @__PURE__ */ jsxDEV3(ArrowRight, {
|
|
899
|
+
className: "ml-2 h-4 w-4"
|
|
900
|
+
}, undefined, false, undefined, this)
|
|
901
|
+
]
|
|
902
|
+
}, undefined, true, undefined, this)
|
|
1810
903
|
}, undefined, false, undefined, this),
|
|
1811
|
-
/* @__PURE__ */ jsxDEV3(
|
|
1812
|
-
|
|
1813
|
-
|
|
904
|
+
/* @__PURE__ */ jsxDEV3(Button, {
|
|
905
|
+
asChild: true,
|
|
906
|
+
variant: "outline",
|
|
907
|
+
className: "w-full sm:w-auto",
|
|
908
|
+
children: /* @__PURE__ */ jsxDEV3(Link, {
|
|
909
|
+
href: studioDocsUrl,
|
|
910
|
+
children: "Read Studio Docs"
|
|
911
|
+
}, undefined, false, undefined, this)
|
|
1814
912
|
}, undefined, false, undefined, this)
|
|
1815
913
|
]
|
|
1816
914
|
}, undefined, true, undefined, this)
|
|
@@ -1823,14 +921,14 @@ import { useActionState } from "react";
|
|
|
1823
921
|
import {
|
|
1824
922
|
Calendar,
|
|
1825
923
|
MessageSquare as MessageSquare2,
|
|
1826
|
-
CheckCircle
|
|
1827
|
-
AlertCircle
|
|
924
|
+
CheckCircle,
|
|
925
|
+
AlertCircle
|
|
1828
926
|
} from "lucide-react";
|
|
1829
927
|
import {
|
|
1830
928
|
ActionForm,
|
|
1831
929
|
Button as Button2,
|
|
1832
|
-
Input
|
|
1833
|
-
Textarea
|
|
930
|
+
Input,
|
|
931
|
+
Textarea
|
|
1834
932
|
} from "@contractspec/lib.design-system";
|
|
1835
933
|
import { VStack as VStack2, HStack as HStack2 } from "@contractspec/lib.ui-kit-web/ui/stack";
|
|
1836
934
|
import {
|
|
@@ -1875,9 +973,7 @@ function ContactClient() {
|
|
|
1875
973
|
}, undefined, false, undefined, this)
|
|
1876
974
|
]
|
|
1877
975
|
}, undefined, true, undefined, this),
|
|
1878
|
-
/* @__PURE__ */ jsxDEV4(
|
|
1879
|
-
context: "contact"
|
|
1880
|
-
}, undefined, false, undefined, this),
|
|
976
|
+
/* @__PURE__ */ jsxDEV4(StudioSignupSection, {}, undefined, false, undefined, this),
|
|
1881
977
|
/* @__PURE__ */ jsxDEV4(VStack2, {
|
|
1882
978
|
className: "card-subtle gap-6 p-8",
|
|
1883
979
|
id: "call",
|
|
@@ -1954,7 +1050,7 @@ function ContactClient() {
|
|
|
1954
1050
|
className: "text-sm font-medium",
|
|
1955
1051
|
children: "Name"
|
|
1956
1052
|
}, undefined, false, undefined, this),
|
|
1957
|
-
/* @__PURE__ */ jsxDEV4(
|
|
1053
|
+
/* @__PURE__ */ jsxDEV4(Input, {
|
|
1958
1054
|
id: "contact-name",
|
|
1959
1055
|
name: "name",
|
|
1960
1056
|
type: "text",
|
|
@@ -1971,7 +1067,7 @@ function ContactClient() {
|
|
|
1971
1067
|
className: "text-sm font-medium",
|
|
1972
1068
|
children: "Email"
|
|
1973
1069
|
}, undefined, false, undefined, this),
|
|
1974
|
-
/* @__PURE__ */ jsxDEV4(
|
|
1070
|
+
/* @__PURE__ */ jsxDEV4(Input, {
|
|
1975
1071
|
id: "contact-email",
|
|
1976
1072
|
name: "email",
|
|
1977
1073
|
type: "email",
|
|
@@ -1989,7 +1085,7 @@ function ContactClient() {
|
|
|
1989
1085
|
className: "text-sm font-medium",
|
|
1990
1086
|
children: "Message"
|
|
1991
1087
|
}, undefined, false, undefined, this),
|
|
1992
|
-
/* @__PURE__ */ jsxDEV4(
|
|
1088
|
+
/* @__PURE__ */ jsxDEV4(Textarea, {
|
|
1993
1089
|
id: "contact-message",
|
|
1994
1090
|
name: "message",
|
|
1995
1091
|
placeholder: "Tell us what's on your mind...",
|
|
@@ -2002,9 +1098,9 @@ function ContactClient() {
|
|
|
2002
1098
|
contactResult && !contactPending && /* @__PURE__ */ jsxDEV4(HStack2, {
|
|
2003
1099
|
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"}`,
|
|
2004
1100
|
children: [
|
|
2005
|
-
contactResult.success ? /* @__PURE__ */ jsxDEV4(
|
|
1101
|
+
contactResult.success ? /* @__PURE__ */ jsxDEV4(CheckCircle, {
|
|
2006
1102
|
size: 16
|
|
2007
|
-
}, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV4(
|
|
1103
|
+
}, undefined, false, undefined, this) : /* @__PURE__ */ jsxDEV4(AlertCircle, {
|
|
2008
1104
|
size: 16
|
|
2009
1105
|
}, undefined, false, undefined, this),
|
|
2010
1106
|
/* @__PURE__ */ jsxDEV4(Small2, {
|
|
@@ -2505,13 +1601,13 @@ function ContributePage() {
|
|
|
2505
1601
|
}
|
|
2506
1602
|
|
|
2507
1603
|
// src/components/marketing/DesignPartnerPage.tsx
|
|
2508
|
-
import
|
|
1604
|
+
import Link2 from "next/link";
|
|
2509
1605
|
import { Button as Button3 } from "@contractspec/lib.design-system";
|
|
2510
1606
|
import {
|
|
2511
|
-
ArrowRight,
|
|
1607
|
+
ArrowRight as ArrowRight2,
|
|
2512
1608
|
BookOpen,
|
|
2513
1609
|
MessageSquare as MessageSquare3,
|
|
2514
|
-
Rocket as
|
|
1610
|
+
Rocket as Rocket3,
|
|
2515
1611
|
Users as Users2
|
|
2516
1612
|
} from "lucide-react";
|
|
2517
1613
|
import { jsxDEV as jsxDEV6 } from "react/jsx-dev-runtime";
|
|
@@ -2559,7 +1655,7 @@ function DesignPartnerPage() {
|
|
|
2559
1655
|
children: [
|
|
2560
1656
|
/* @__PURE__ */ jsxDEV6("div", {
|
|
2561
1657
|
className: "border-primary/20 bg-primary/10 flex h-12 w-12 items-center justify-center rounded-lg border",
|
|
2562
|
-
children: /* @__PURE__ */ jsxDEV6(
|
|
1658
|
+
children: /* @__PURE__ */ jsxDEV6(Rocket3, {
|
|
2563
1659
|
className: "text-primary h-6 w-6"
|
|
2564
1660
|
}, undefined, false, undefined, this)
|
|
2565
1661
|
}, undefined, false, undefined, this),
|
|
@@ -2569,18 +1665,18 @@ function DesignPartnerPage() {
|
|
|
2569
1665
|
}, undefined, false, undefined, this),
|
|
2570
1666
|
/* @__PURE__ */ jsxDEV6("p", {
|
|
2571
1667
|
className: "text-muted-foreground",
|
|
2572
|
-
children: "Your account has been enabled with Design Partner privileges. Log in to
|
|
1668
|
+
children: "Your account has been enabled with Design Partner privileges. Log in to ContractSpec Studio to run the full loop from evidence to spec-first deliverables with your team."
|
|
2573
1669
|
}, undefined, false, undefined, this),
|
|
2574
1670
|
/* @__PURE__ */ jsxDEV6("div", {
|
|
2575
1671
|
className: "pt-2",
|
|
2576
1672
|
children: /* @__PURE__ */ jsxDEV6(Button3, {
|
|
2577
1673
|
asChild: true,
|
|
2578
1674
|
variant: "outline",
|
|
2579
|
-
children: /* @__PURE__ */ jsxDEV6(
|
|
2580
|
-
href: "https://
|
|
1675
|
+
children: /* @__PURE__ */ jsxDEV6(Link2, {
|
|
1676
|
+
href: "https://app.contractspec.studio",
|
|
2581
1677
|
children: [
|
|
2582
1678
|
"Launch Studio ",
|
|
2583
|
-
/* @__PURE__ */ jsxDEV6(
|
|
1679
|
+
/* @__PURE__ */ jsxDEV6(ArrowRight2, {
|
|
2584
1680
|
className: "ml-2 h-4 w-4"
|
|
2585
1681
|
}, undefined, false, undefined, this)
|
|
2586
1682
|
]
|
|
@@ -2611,12 +1707,12 @@ function DesignPartnerPage() {
|
|
|
2611
1707
|
children: /* @__PURE__ */ jsxDEV6(Button3, {
|
|
2612
1708
|
asChild: true,
|
|
2613
1709
|
variant: "outline",
|
|
2614
|
-
children: /* @__PURE__ */ jsxDEV6(
|
|
1710
|
+
children: /* @__PURE__ */ jsxDEV6(Link2, {
|
|
2615
1711
|
href: "mailto:partners@contractspec.io",
|
|
2616
1712
|
children: [
|
|
2617
1713
|
"Contact Partner Success",
|
|
2618
1714
|
" ",
|
|
2619
|
-
/* @__PURE__ */ jsxDEV6(
|
|
1715
|
+
/* @__PURE__ */ jsxDEV6(ArrowRight2, {
|
|
2620
1716
|
className: "ml-2 h-4 w-4"
|
|
2621
1717
|
}, undefined, false, undefined, this)
|
|
2622
1718
|
]
|
|
@@ -2647,11 +1743,11 @@ function DesignPartnerPage() {
|
|
|
2647
1743
|
children: /* @__PURE__ */ jsxDEV6(Button3, {
|
|
2648
1744
|
asChild: true,
|
|
2649
1745
|
variant: "outline",
|
|
2650
|
-
children: /* @__PURE__ */ jsxDEV6(
|
|
1746
|
+
children: /* @__PURE__ */ jsxDEV6(Link2, {
|
|
2651
1747
|
href: "/docs",
|
|
2652
1748
|
children: [
|
|
2653
1749
|
"Read the Docs ",
|
|
2654
|
-
/* @__PURE__ */ jsxDEV6(
|
|
1750
|
+
/* @__PURE__ */ jsxDEV6(ArrowRight2, {
|
|
2655
1751
|
className: "ml-2 h-4 w-4"
|
|
2656
1752
|
}, undefined, false, undefined, this)
|
|
2657
1753
|
]
|
|
@@ -2753,7 +1849,7 @@ function DesignPartnerPage() {
|
|
|
2753
1849
|
/* @__PURE__ */ jsxDEV6(Button3, {
|
|
2754
1850
|
asChild: true,
|
|
2755
1851
|
size: "lg",
|
|
2756
|
-
children: /* @__PURE__ */ jsxDEV6(
|
|
1852
|
+
children: /* @__PURE__ */ jsxDEV6(Link2, {
|
|
2757
1853
|
href: "mailto:partners@contractspec.io",
|
|
2758
1854
|
children: "Email the Founders"
|
|
2759
1855
|
}, undefined, false, undefined, this)
|
|
@@ -2820,11 +1916,11 @@ function HeroMarketingSection() {
|
|
|
2820
1916
|
}, undefined, true, undefined, this),
|
|
2821
1917
|
/* @__PURE__ */ jsxDEV7(ButtonLink2, {
|
|
2822
1918
|
variant: "ghost",
|
|
2823
|
-
href: "
|
|
1919
|
+
href: "https://app.contractspec.studio",
|
|
2824
1920
|
onClick: () => captureAnalyticsEvent(analyticsEventNames.CTA_STUDIO_CLICK, {
|
|
2825
1921
|
surface: "hero"
|
|
2826
1922
|
}),
|
|
2827
|
-
children: "
|
|
1923
|
+
children: "Try Studio"
|
|
2828
1924
|
}, undefined, false, undefined, this)
|
|
2829
1925
|
]
|
|
2830
1926
|
}, undefined, true, undefined, this),
|
|
@@ -2982,13 +2078,13 @@ function SolutionSection() {
|
|
|
2982
2078
|
}
|
|
2983
2079
|
|
|
2984
2080
|
// src/components/marketing/sections/FearsSection.tsx
|
|
2985
|
-
import { CheckCircle as
|
|
2081
|
+
import { CheckCircle as CheckCircle2, Code, Unlock, Zap } from "lucide-react";
|
|
2986
2082
|
import { jsxDEV as jsxDEV11 } from "react/jsx-dev-runtime";
|
|
2987
2083
|
var fears = [
|
|
2988
2084
|
{
|
|
2989
2085
|
title: '"I already have an app"',
|
|
2990
2086
|
body: "ContractSpec works with existing codebases. You don't start over — you stabilize incrementally, one module at a time. Start with one API endpoint, one data model, one contract.",
|
|
2991
|
-
icon:
|
|
2087
|
+
icon: CheckCircle2
|
|
2992
2088
|
},
|
|
2993
2089
|
{
|
|
2994
2090
|
title: '"Vendor lock-in / losing ownership"',
|
|
@@ -3065,9 +2161,9 @@ function CorePositioningSection() {
|
|
|
3065
2161
|
className: "pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center",
|
|
3066
2162
|
children: [
|
|
3067
2163
|
/* @__PURE__ */ jsxDEV12(ButtonLink3, {
|
|
3068
|
-
href: "
|
|
2164
|
+
href: "https://app.contractspec.studio",
|
|
3069
2165
|
children: [
|
|
3070
|
-
"
|
|
2166
|
+
"Try Studio ",
|
|
3071
2167
|
/* @__PURE__ */ jsxDEV12(ChevronRight2, {
|
|
3072
2168
|
size: 16
|
|
3073
2169
|
}, undefined, false, undefined, this)
|
|
@@ -3339,11 +2435,11 @@ function CtaSection() {
|
|
|
3339
2435
|
className: "pt-2 sm:flex sm:flex-row sm:flex-wrap sm:items-center sm:justify-center",
|
|
3340
2436
|
children: [
|
|
3341
2437
|
/* @__PURE__ */ jsxDEV17(ButtonLink5, {
|
|
3342
|
-
href: "
|
|
2438
|
+
href: "https://app.contractspec.studio",
|
|
3343
2439
|
onClick: () => captureAnalyticsEvent2(analyticsEventNames2.CTA_STUDIO_CLICK, {
|
|
3344
2440
|
surface: "cta-section"
|
|
3345
2441
|
}),
|
|
3346
|
-
children: "
|
|
2442
|
+
children: "Try Studio"
|
|
3347
2443
|
}, undefined, false, undefined, this),
|
|
3348
2444
|
/* @__PURE__ */ jsxDEV17(ButtonLink5, {
|
|
3349
2445
|
variant: "ghost",
|
|
@@ -3401,7 +2497,7 @@ var PRICING_EXAMPLES = {
|
|
|
3401
2497
|
};
|
|
3402
2498
|
|
|
3403
2499
|
// src/components/marketing/pricing-thinking-modal.tsx
|
|
3404
|
-
import { CheckCircle as
|
|
2500
|
+
import { CheckCircle as CheckCircle3 } from "lucide-react";
|
|
3405
2501
|
import {
|
|
3406
2502
|
Dialog,
|
|
3407
2503
|
DialogContent,
|
|
@@ -3487,7 +2583,7 @@ function PricingThinkingModal({
|
|
|
3487
2583
|
children: "Tentative pricing (work in progress)"
|
|
3488
2584
|
}, undefined, false, undefined, this),
|
|
3489
2585
|
/* @__PURE__ */ jsxDEV19(DialogDescription, {
|
|
3490
|
-
children: "
|
|
2586
|
+
children: "ContractSpec Studio is live. This is a draft of how paid plans are expected to evolve as usage grows."
|
|
3491
2587
|
}, undefined, false, undefined, this)
|
|
3492
2588
|
]
|
|
3493
2589
|
}, undefined, true, undefined, this),
|
|
@@ -3541,7 +2637,7 @@ function PricingThinkingModal({
|
|
|
3541
2637
|
children: tier.bullets.map((bullet, i) => /* @__PURE__ */ jsxDEV19("li", {
|
|
3542
2638
|
className: "text-muted-foreground flex gap-2 text-sm",
|
|
3543
2639
|
children: [
|
|
3544
|
-
/* @__PURE__ */ jsxDEV19(
|
|
2640
|
+
/* @__PURE__ */ jsxDEV19(CheckCircle3, {
|
|
3545
2641
|
size: 14,
|
|
3546
2642
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3547
2643
|
}, undefined, false, undefined, this),
|
|
@@ -3612,7 +2708,7 @@ function PricingThinkingModal({
|
|
|
3612
2708
|
}, undefined, false, undefined, this),
|
|
3613
2709
|
/* @__PURE__ */ jsxDEV19("p", {
|
|
3614
2710
|
className: "text-muted-foreground text-xs",
|
|
3615
|
-
children: "Design partners get
|
|
2711
|
+
children: "Design partners get priority onboarding and partner incentives as paid plans launch."
|
|
3616
2712
|
}, undefined, false, undefined, this),
|
|
3617
2713
|
onApplyClick && /* @__PURE__ */ jsxDEV19(Button4, {
|
|
3618
2714
|
onClick: () => {
|
|
@@ -3621,7 +2717,7 @@ function PricingThinkingModal({
|
|
|
3621
2717
|
},
|
|
3622
2718
|
className: "w-full",
|
|
3623
2719
|
variant: "outline",
|
|
3624
|
-
children: "
|
|
2720
|
+
children: "Try Studio"
|
|
3625
2721
|
}, undefined, false, undefined, this)
|
|
3626
2722
|
]
|
|
3627
2723
|
}, undefined, true, undefined, this)
|
|
@@ -3633,23 +2729,23 @@ function PricingThinkingModal({
|
|
|
3633
2729
|
}
|
|
3634
2730
|
|
|
3635
2731
|
// src/components/marketing/PricingClient.tsx
|
|
3636
|
-
import { useState
|
|
3637
|
-
import
|
|
3638
|
-
import { CheckCircle as
|
|
2732
|
+
import { useState } from "react";
|
|
2733
|
+
import Link3 from "next/link";
|
|
2734
|
+
import { CheckCircle as CheckCircle4, ChevronDown, ChevronRight as ChevronRight3 } from "lucide-react";
|
|
3639
2735
|
import { jsxDEV as jsxDEV20 } from "react/jsx-dev-runtime";
|
|
3640
2736
|
"use client";
|
|
3641
2737
|
var faqs = [
|
|
3642
2738
|
{
|
|
3643
|
-
question: "Can I
|
|
3644
|
-
answer: "
|
|
2739
|
+
question: "Can I use ContractSpec Studio today?",
|
|
2740
|
+
answer: "Yes. ContractSpec Studio is live at app.contractspec.studio. Start with the free tier and upgrade as paid plans roll out."
|
|
3645
2741
|
},
|
|
3646
2742
|
{
|
|
3647
2743
|
question: "What will you charge for later?",
|
|
3648
|
-
answer: "
|
|
2744
|
+
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."
|
|
3649
2745
|
},
|
|
3650
2746
|
{
|
|
3651
2747
|
question: "What do I get as a design partner?",
|
|
3652
|
-
answer: "Direct collaboration on
|
|
2748
|
+
answer: "Direct collaboration on roadmap priorities, hands-on onboarding, and priority support. You also help shape Studio workflows before broad rollout."
|
|
3653
2749
|
},
|
|
3654
2750
|
{
|
|
3655
2751
|
question: "Will you ever charge per seat?",
|
|
@@ -3657,13 +2753,10 @@ var faqs = [
|
|
|
3657
2753
|
}
|
|
3658
2754
|
];
|
|
3659
2755
|
function PricingClient() {
|
|
3660
|
-
const [openFaq, setOpenFaq] =
|
|
3661
|
-
const [pricingModalOpen, setPricingModalOpen] =
|
|
3662
|
-
const
|
|
3663
|
-
|
|
3664
|
-
if (waitlistElement) {
|
|
3665
|
-
waitlistElement.scrollIntoView({ behavior: "smooth", block: "start" });
|
|
3666
|
-
}
|
|
2756
|
+
const [openFaq, setOpenFaq] = useState(null);
|
|
2757
|
+
const [pricingModalOpen, setPricingModalOpen] = useState(false);
|
|
2758
|
+
const openStudio = () => {
|
|
2759
|
+
window.open("https://app.contractspec.studio", "_blank", "noopener,noreferrer");
|
|
3667
2760
|
};
|
|
3668
2761
|
return /* @__PURE__ */ jsxDEV20("main", {
|
|
3669
2762
|
className: "",
|
|
@@ -3679,12 +2772,12 @@ function PricingClient() {
|
|
|
3679
2772
|
}, undefined, false, undefined, this),
|
|
3680
2773
|
/* @__PURE__ */ jsxDEV20("p", {
|
|
3681
2774
|
className: "text-muted-foreground mx-auto max-w-2xl text-lg",
|
|
3682
|
-
children: "ContractSpec Core (the OSS compiler) is and always will be free. ContractSpec Studio
|
|
2775
|
+
children: "ContractSpec Core (the OSS compiler) is and always will be free. ContractSpec Studio is live, with paid plans rolling out progressively."
|
|
3683
2776
|
}, undefined, false, undefined, this),
|
|
3684
2777
|
/* @__PURE__ */ jsxDEV20("div", {
|
|
3685
2778
|
className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
|
|
3686
2779
|
children: [
|
|
3687
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2780
|
+
/* @__PURE__ */ jsxDEV20(Link3, {
|
|
3688
2781
|
href: "/install",
|
|
3689
2782
|
className: "btn-primary inline-flex items-center gap-2",
|
|
3690
2783
|
children: [
|
|
@@ -3694,10 +2787,10 @@ function PricingClient() {
|
|
|
3694
2787
|
}, undefined, false, undefined, this)
|
|
3695
2788
|
]
|
|
3696
2789
|
}, undefined, true, undefined, this),
|
|
3697
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3698
|
-
|
|
2790
|
+
/* @__PURE__ */ jsxDEV20(Link3, {
|
|
2791
|
+
href: "https://app.contractspec.studio",
|
|
3699
2792
|
className: "btn-ghost inline-flex items-center gap-2",
|
|
3700
|
-
children: "
|
|
2793
|
+
children: "Try Studio Free"
|
|
3701
2794
|
}, undefined, false, undefined, this)
|
|
3702
2795
|
]
|
|
3703
2796
|
}, undefined, true, undefined, this)
|
|
@@ -3740,17 +2833,17 @@ function PricingClient() {
|
|
|
3740
2833
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3741
2834
|
className: "flex gap-2",
|
|
3742
2835
|
children: [
|
|
3743
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2836
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3744
2837
|
size: 16,
|
|
3745
2838
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3746
2839
|
}, undefined, false, undefined, this),
|
|
3747
|
-
"
|
|
2840
|
+
"Priority access to new Studio capabilities"
|
|
3748
2841
|
]
|
|
3749
2842
|
}, undefined, true, undefined, this),
|
|
3750
2843
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3751
2844
|
className: "flex gap-2",
|
|
3752
2845
|
children: [
|
|
3753
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2846
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3754
2847
|
size: 16,
|
|
3755
2848
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3756
2849
|
}, undefined, false, undefined, this),
|
|
@@ -3760,7 +2853,7 @@ function PricingClient() {
|
|
|
3760
2853
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3761
2854
|
className: "flex gap-2",
|
|
3762
2855
|
children: [
|
|
3763
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2856
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3764
2857
|
size: 16,
|
|
3765
2858
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3766
2859
|
}, undefined, false, undefined, this),
|
|
@@ -3770,29 +2863,29 @@ function PricingClient() {
|
|
|
3770
2863
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3771
2864
|
className: "flex gap-2",
|
|
3772
2865
|
children: [
|
|
3773
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2866
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3774
2867
|
size: 16,
|
|
3775
2868
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3776
2869
|
}, undefined, false, undefined, this),
|
|
3777
|
-
"Priority support
|
|
2870
|
+
"Priority support through direct channels"
|
|
3778
2871
|
]
|
|
3779
2872
|
}, undefined, true, undefined, this),
|
|
3780
2873
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3781
2874
|
className: "flex gap-2",
|
|
3782
2875
|
children: [
|
|
3783
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2876
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3784
2877
|
size: 16,
|
|
3785
2878
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3786
2879
|
}, undefined, false, undefined, this),
|
|
3787
|
-
"
|
|
2880
|
+
"Pricing input and partner incentives"
|
|
3788
2881
|
]
|
|
3789
2882
|
}, undefined, true, undefined, this)
|
|
3790
2883
|
]
|
|
3791
2884
|
}, undefined, true, undefined, this),
|
|
3792
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3793
|
-
|
|
2885
|
+
/* @__PURE__ */ jsxDEV20(Link3, {
|
|
2886
|
+
href: "/design-partner",
|
|
3794
2887
|
className: "btn-primary w-full md:w-auto",
|
|
3795
|
-
children: "Apply
|
|
2888
|
+
children: "Apply as a design partner"
|
|
3796
2889
|
}, undefined, false, undefined, this)
|
|
3797
2890
|
]
|
|
3798
2891
|
}, undefined, true, undefined, this)
|
|
@@ -3848,7 +2941,7 @@ function PricingClient() {
|
|
|
3848
2941
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3849
2942
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3850
2943
|
children: [
|
|
3851
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2944
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3852
2945
|
size: 16,
|
|
3853
2946
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3854
2947
|
}, undefined, false, undefined, this),
|
|
@@ -3858,7 +2951,7 @@ function PricingClient() {
|
|
|
3858
2951
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3859
2952
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3860
2953
|
children: [
|
|
3861
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2954
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3862
2955
|
size: 16,
|
|
3863
2956
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3864
2957
|
}, undefined, false, undefined, this),
|
|
@@ -3868,7 +2961,7 @@ function PricingClient() {
|
|
|
3868
2961
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3869
2962
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3870
2963
|
children: [
|
|
3871
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2964
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3872
2965
|
size: 16,
|
|
3873
2966
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3874
2967
|
}, undefined, false, undefined, this),
|
|
@@ -3878,7 +2971,7 @@ function PricingClient() {
|
|
|
3878
2971
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3879
2972
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3880
2973
|
children: [
|
|
3881
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2974
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3882
2975
|
size: 16,
|
|
3883
2976
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3884
2977
|
}, undefined, false, undefined, this),
|
|
@@ -3889,7 +2982,7 @@ function PricingClient() {
|
|
|
3889
2982
|
}, undefined, true, undefined, this)
|
|
3890
2983
|
]
|
|
3891
2984
|
}, undefined, true, undefined, this),
|
|
3892
|
-
/* @__PURE__ */ jsxDEV20(
|
|
2985
|
+
/* @__PURE__ */ jsxDEV20(Link3, {
|
|
3893
2986
|
href: "/install",
|
|
3894
2987
|
className: "btn-ghost w-full",
|
|
3895
2988
|
children: "Install now"
|
|
@@ -3901,7 +2994,7 @@ function PricingClient() {
|
|
|
3901
2994
|
children: [
|
|
3902
2995
|
/* @__PURE__ */ jsxDEV20("div", {
|
|
3903
2996
|
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",
|
|
3904
|
-
children: "
|
|
2997
|
+
children: "Live program"
|
|
3905
2998
|
}, undefined, false, undefined, this),
|
|
3906
2999
|
/* @__PURE__ */ jsxDEV20("div", {
|
|
3907
3000
|
className: "space-y-2",
|
|
@@ -3915,11 +3008,11 @@ function PricingClient() {
|
|
|
3915
3008
|
children: [
|
|
3916
3009
|
/* @__PURE__ */ jsxDEV20("div", {
|
|
3917
3010
|
className: "text-2xl font-bold",
|
|
3918
|
-
children: "
|
|
3011
|
+
children: "Invite-based"
|
|
3919
3012
|
}, undefined, false, undefined, this),
|
|
3920
3013
|
/* @__PURE__ */ jsxDEV20("p", {
|
|
3921
3014
|
className: "text-muted-foreground text-xs",
|
|
3922
|
-
children: "
|
|
3015
|
+
children: "Built for teams shaping the next Studio capabilities"
|
|
3923
3016
|
}, undefined, false, undefined, this)
|
|
3924
3017
|
]
|
|
3925
3018
|
}, undefined, true, undefined, this)
|
|
@@ -3931,47 +3024,47 @@ function PricingClient() {
|
|
|
3931
3024
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3932
3025
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3933
3026
|
children: [
|
|
3934
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3027
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3935
3028
|
size: 16,
|
|
3936
3029
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3937
3030
|
}, undefined, false, undefined, this),
|
|
3938
|
-
"Use ContractSpec Studio for real projects
|
|
3031
|
+
"Use ContractSpec Studio for real projects"
|
|
3939
3032
|
]
|
|
3940
3033
|
}, undefined, true, undefined, this),
|
|
3941
3034
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3942
3035
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3943
3036
|
children: [
|
|
3944
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3037
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3945
3038
|
size: 16,
|
|
3946
3039
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3947
3040
|
}, undefined, false, undefined, this),
|
|
3948
|
-
"Work directly with the
|
|
3041
|
+
"Work directly with the team on architecture and workflow design"
|
|
3949
3042
|
]
|
|
3950
3043
|
}, undefined, true, undefined, this),
|
|
3951
3044
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3952
3045
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3953
3046
|
children: [
|
|
3954
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3047
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3955
3048
|
size: 16,
|
|
3956
3049
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3957
3050
|
}, undefined, false, undefined, this),
|
|
3958
|
-
|
|
3051
|
+
"Access to partner-only previews and feedback loops"
|
|
3959
3052
|
]
|
|
3960
3053
|
}, undefined, true, undefined, this),
|
|
3961
3054
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
3962
3055
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
3963
3056
|
children: [
|
|
3964
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3057
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
3965
3058
|
size: 16,
|
|
3966
3059
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
3967
3060
|
}, undefined, false, undefined, this),
|
|
3968
|
-
"Priority support
|
|
3061
|
+
"Priority support and roadmap influence"
|
|
3969
3062
|
]
|
|
3970
3063
|
}, undefined, true, undefined, this)
|
|
3971
3064
|
]
|
|
3972
3065
|
}, undefined, true, undefined, this),
|
|
3973
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3974
|
-
|
|
3066
|
+
/* @__PURE__ */ jsxDEV20(Link3, {
|
|
3067
|
+
href: "/design-partner",
|
|
3975
3068
|
className: "btn-primary w-full",
|
|
3976
3069
|
children: "Apply as a design partner"
|
|
3977
3070
|
}, undefined, false, undefined, this)
|
|
@@ -4024,7 +3117,7 @@ function PricingClient() {
|
|
|
4024
3117
|
/* @__PURE__ */ jsxDEV20("button", {
|
|
4025
3118
|
disabled: true,
|
|
4026
3119
|
className: "btn-ghost w-full cursor-not-allowed opacity-50",
|
|
4027
|
-
children: "Available after
|
|
3120
|
+
children: "Available after pricing rollout"
|
|
4028
3121
|
}, undefined, false, undefined, this)
|
|
4029
3122
|
]
|
|
4030
3123
|
}, undefined, true, undefined, this),
|
|
@@ -4061,7 +3154,7 @@ function PricingClient() {
|
|
|
4061
3154
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
4062
3155
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
4063
3156
|
children: [
|
|
4064
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3157
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
4065
3158
|
size: 16,
|
|
4066
3159
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
4067
3160
|
}, undefined, false, undefined, this),
|
|
@@ -4071,7 +3164,7 @@ function PricingClient() {
|
|
|
4071
3164
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
4072
3165
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
4073
3166
|
children: [
|
|
4074
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3167
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
4075
3168
|
size: 16,
|
|
4076
3169
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
4077
3170
|
}, undefined, false, undefined, this),
|
|
@@ -4081,7 +3174,7 @@ function PricingClient() {
|
|
|
4081
3174
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
4082
3175
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
4083
3176
|
children: [
|
|
4084
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3177
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
4085
3178
|
size: 16,
|
|
4086
3179
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
4087
3180
|
}, undefined, false, undefined, this),
|
|
@@ -4091,7 +3184,7 @@ function PricingClient() {
|
|
|
4091
3184
|
/* @__PURE__ */ jsxDEV20("li", {
|
|
4092
3185
|
className: "text-muted-foreground flex gap-3 text-sm",
|
|
4093
3186
|
children: [
|
|
4094
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3187
|
+
/* @__PURE__ */ jsxDEV20(CheckCircle4, {
|
|
4095
3188
|
size: 16,
|
|
4096
3189
|
className: "mt-0.5 shrink-0 text-violet-400"
|
|
4097
3190
|
}, undefined, false, undefined, this),
|
|
@@ -4100,7 +3193,7 @@ function PricingClient() {
|
|
|
4100
3193
|
}, undefined, true, undefined, this)
|
|
4101
3194
|
]
|
|
4102
3195
|
}, undefined, true, undefined, this),
|
|
4103
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3196
|
+
/* @__PURE__ */ jsxDEV20(Link3, {
|
|
4104
3197
|
href: "/contact",
|
|
4105
3198
|
className: "btn-ghost w-full",
|
|
4106
3199
|
children: "Talk to us"
|
|
@@ -4121,7 +3214,7 @@ function PricingClient() {
|
|
|
4121
3214
|
children: [
|
|
4122
3215
|
/* @__PURE__ */ jsxDEV20("h2", {
|
|
4123
3216
|
className: "text-3xl font-bold",
|
|
4124
|
-
children: "How ContractSpec pricing
|
|
3217
|
+
children: "How ContractSpec pricing works now and next"
|
|
4125
3218
|
}, undefined, false, undefined, this),
|
|
4126
3219
|
/* @__PURE__ */ jsxDEV20("p", {
|
|
4127
3220
|
className: "text-muted-foreground mx-auto max-w-2xl text-lg",
|
|
@@ -4226,7 +3319,7 @@ function PricingClient() {
|
|
|
4226
3319
|
className: "text-muted-foreground mb-2 text-sm",
|
|
4227
3320
|
children: "Still unsure?"
|
|
4228
3321
|
}, undefined, false, undefined, this),
|
|
4229
|
-
/* @__PURE__ */ jsxDEV20(
|
|
3322
|
+
/* @__PURE__ */ jsxDEV20(Link3, {
|
|
4230
3323
|
href: "/contact",
|
|
4231
3324
|
className: "text-sm font-medium text-violet-400 hover:text-violet-300",
|
|
4232
3325
|
children: "Contact us →"
|
|
@@ -4240,26 +3333,26 @@ function PricingClient() {
|
|
|
4240
3333
|
className: "section-padding hero-gradient",
|
|
4241
3334
|
children: /* @__PURE__ */ jsxDEV20("div", {
|
|
4242
3335
|
className: "mx-auto max-w-4xl",
|
|
4243
|
-
children: /* @__PURE__ */ jsxDEV20(
|
|
3336
|
+
children: /* @__PURE__ */ jsxDEV20(StudioSignupSection, {}, undefined, false, undefined, this)
|
|
4244
3337
|
}, undefined, false, undefined, this)
|
|
4245
3338
|
}, undefined, false, undefined, this),
|
|
4246
3339
|
/* @__PURE__ */ jsxDEV20(PricingThinkingModal, {
|
|
4247
3340
|
open: pricingModalOpen,
|
|
4248
3341
|
onOpenChange: setPricingModalOpen,
|
|
4249
|
-
onApplyClick:
|
|
3342
|
+
onApplyClick: openStudio
|
|
4250
3343
|
}, undefined, false, undefined, this)
|
|
4251
3344
|
]
|
|
4252
3345
|
}, undefined, true, undefined, this);
|
|
4253
3346
|
}
|
|
4254
3347
|
|
|
4255
3348
|
// src/components/marketing/ProductClientPage.tsx
|
|
4256
|
-
import
|
|
3349
|
+
import Link4 from "@contractspec/lib.ui-link";
|
|
4257
3350
|
import {
|
|
4258
3351
|
analyticsEventNames as analyticsEventNames3,
|
|
4259
3352
|
captureAnalyticsEvent as captureAnalyticsEvent3
|
|
4260
3353
|
} from "@contractspec/bundle.library/libs/posthog/client";
|
|
4261
3354
|
import {
|
|
4262
|
-
CheckCircle as
|
|
3355
|
+
CheckCircle as CheckCircle5,
|
|
4263
3356
|
ChevronRight as ChevronRight4,
|
|
4264
3357
|
Database,
|
|
4265
3358
|
FileCode as FileCode2,
|
|
@@ -4291,7 +3384,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4291
3384
|
/* @__PURE__ */ jsxDEV21("div", {
|
|
4292
3385
|
className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
|
|
4293
3386
|
children: [
|
|
4294
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3387
|
+
/* @__PURE__ */ jsxDEV21(Link4, {
|
|
4295
3388
|
href: "/install",
|
|
4296
3389
|
onClick: () => captureAnalyticsEvent3(analyticsEventNames3.CTA_INSTALL_CLICK, {
|
|
4297
3390
|
surface: "product-hero"
|
|
@@ -4304,7 +3397,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4304
3397
|
}, undefined, false, undefined, this)
|
|
4305
3398
|
]
|
|
4306
3399
|
}, undefined, true, undefined, this),
|
|
4307
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3400
|
+
/* @__PURE__ */ jsxDEV21(Link4, {
|
|
4308
3401
|
href: "/pricing",
|
|
4309
3402
|
className: "btn-ghost",
|
|
4310
3403
|
children: "View pricing"
|
|
@@ -4440,7 +3533,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4440
3533
|
/* @__PURE__ */ jsxDEV21("li", {
|
|
4441
3534
|
className: "flex gap-3",
|
|
4442
3535
|
children: [
|
|
4443
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3536
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4444
3537
|
size: 16,
|
|
4445
3538
|
className: "mt-0.5 flex-shrink-0 text-emerald-400"
|
|
4446
3539
|
}, undefined, false, undefined, this),
|
|
@@ -4450,7 +3543,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4450
3543
|
/* @__PURE__ */ jsxDEV21("li", {
|
|
4451
3544
|
className: "flex gap-3",
|
|
4452
3545
|
children: [
|
|
4453
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3546
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4454
3547
|
size: 16,
|
|
4455
3548
|
className: "mt-0.5 flex-shrink-0 text-emerald-400"
|
|
4456
3549
|
}, undefined, false, undefined, this),
|
|
@@ -4460,7 +3553,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4460
3553
|
/* @__PURE__ */ jsxDEV21("li", {
|
|
4461
3554
|
className: "flex gap-3",
|
|
4462
3555
|
children: [
|
|
4463
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3556
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4464
3557
|
size: 16,
|
|
4465
3558
|
className: "mt-0.5 flex-shrink-0 text-emerald-400"
|
|
4466
3559
|
}, undefined, false, undefined, this),
|
|
@@ -4488,7 +3581,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4488
3581
|
/* @__PURE__ */ jsxDEV21("li", {
|
|
4489
3582
|
className: "flex gap-3",
|
|
4490
3583
|
children: [
|
|
4491
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3584
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4492
3585
|
size: 16,
|
|
4493
3586
|
className: "mt-0.5 flex-shrink-0 text-emerald-400"
|
|
4494
3587
|
}, undefined, false, undefined, this),
|
|
@@ -4498,7 +3591,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4498
3591
|
/* @__PURE__ */ jsxDEV21("li", {
|
|
4499
3592
|
className: "flex gap-3",
|
|
4500
3593
|
children: [
|
|
4501
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3594
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4502
3595
|
size: 16,
|
|
4503
3596
|
className: "mt-0.5 flex-shrink-0 text-emerald-400"
|
|
4504
3597
|
}, undefined, false, undefined, this),
|
|
@@ -4508,7 +3601,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4508
3601
|
/* @__PURE__ */ jsxDEV21("li", {
|
|
4509
3602
|
className: "flex gap-3",
|
|
4510
3603
|
children: [
|
|
4511
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3604
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4512
3605
|
size: 16,
|
|
4513
3606
|
className: "mt-0.5 flex-shrink-0 text-emerald-400"
|
|
4514
3607
|
}, undefined, false, undefined, this),
|
|
@@ -4664,7 +3757,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4664
3757
|
].map((item, i) => /* @__PURE__ */ jsxDEV21("li", {
|
|
4665
3758
|
className: "flex gap-3",
|
|
4666
3759
|
children: [
|
|
4667
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3760
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4668
3761
|
size: 16,
|
|
4669
3762
|
className: "mt-0.5 flex-shrink-0 text-pink-400"
|
|
4670
3763
|
}, undefined, false, undefined, this),
|
|
@@ -4692,7 +3785,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4692
3785
|
].map((item, i) => /* @__PURE__ */ jsxDEV21("li", {
|
|
4693
3786
|
className: "flex gap-3",
|
|
4694
3787
|
children: [
|
|
4695
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3788
|
+
/* @__PURE__ */ jsxDEV21(CheckCircle5, {
|
|
4696
3789
|
size: 16,
|
|
4697
3790
|
className: "mt-0.5 flex-shrink-0 text-pink-400"
|
|
4698
3791
|
}, undefined, false, undefined, this),
|
|
@@ -4782,7 +3875,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4782
3875
|
/* @__PURE__ */ jsxDEV21("div", {
|
|
4783
3876
|
className: "flex flex-col items-center justify-center gap-4 pt-4 sm:flex-row",
|
|
4784
3877
|
children: [
|
|
4785
|
-
/* @__PURE__ */ jsxDEV21(
|
|
3878
|
+
/* @__PURE__ */ jsxDEV21(Link4, {
|
|
4786
3879
|
href: "/install",
|
|
4787
3880
|
className: "btn-primary inline-flex items-center gap-2",
|
|
4788
3881
|
children: [
|
|
@@ -4792,10 +3885,10 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4792
3885
|
}, undefined, false, undefined, this)
|
|
4793
3886
|
]
|
|
4794
3887
|
}, undefined, true, undefined, this),
|
|
4795
|
-
/* @__PURE__ */ jsxDEV21(
|
|
4796
|
-
href: "
|
|
3888
|
+
/* @__PURE__ */ jsxDEV21(Link4, {
|
|
3889
|
+
href: "https://app.contractspec.studio",
|
|
4797
3890
|
className: "btn-ghost",
|
|
4798
|
-
children: "
|
|
3891
|
+
children: "Try Studio"
|
|
4799
3892
|
}, undefined, false, undefined, this)
|
|
4800
3893
|
]
|
|
4801
3894
|
}, undefined, true, undefined, this)
|
|
@@ -4805,7 +3898,7 @@ var ProductClientPage = () => /* @__PURE__ */ jsxDEV21("main", {
|
|
|
4805
3898
|
]
|
|
4806
3899
|
}, undefined, true, undefined, this);
|
|
4807
3900
|
export {
|
|
4808
|
-
|
|
3901
|
+
StudioSignupSection,
|
|
4809
3902
|
ProductClientPage,
|
|
4810
3903
|
PricingThinkingModal,
|
|
4811
3904
|
PricingClient,
|