@burdenoff/website-sdk 2026.1101.1 → 2026.1101.2
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/README.md +42 -8
- package/dist/analytics/index.js +19 -69
- package/dist/analytics/index.js.map +1 -1
- package/dist/analytics/index.mjs +3 -69
- package/dist/analytics/index.mjs.map +1 -1
- package/dist/avatar-live/index.js +1 -0
- package/dist/avatar-live/index.js.map +1 -1
- package/dist/avatar-live/index.mjs +1 -0
- package/dist/avatar-live/index.mjs.map +1 -1
- package/dist/avatar-live-view/index.js +10 -30
- package/dist/avatar-live-view/index.js.map +1 -1
- package/dist/avatar-live-view/index.mjs +4 -24
- package/dist/avatar-live-view/index.mjs.map +1 -1
- package/dist/chunk-23H4JUL4.js +41 -0
- package/dist/chunk-23H4JUL4.js.map +1 -0
- package/dist/chunk-34RX5P75.mjs +25 -0
- package/dist/chunk-34RX5P75.mjs.map +1 -0
- package/dist/chunk-3LFFY7AZ.js +184 -0
- package/dist/chunk-3LFFY7AZ.js.map +1 -0
- package/dist/chunk-3X26GE4S.js +2794 -0
- package/dist/chunk-3X26GE4S.js.map +1 -0
- package/dist/chunk-45GCA4GG.js +85 -0
- package/dist/chunk-45GCA4GG.js.map +1 -0
- package/dist/chunk-4SAGVLHN.js +876 -0
- package/dist/chunk-4SAGVLHN.js.map +1 -0
- package/dist/chunk-4U6YAII5.js +218 -0
- package/dist/chunk-4U6YAII5.js.map +1 -0
- package/dist/chunk-5GMTBOO6.js +21 -0
- package/dist/chunk-5GMTBOO6.js.map +1 -0
- package/dist/chunk-5JRJ57CL.mjs +329 -0
- package/dist/chunk-5JRJ57CL.mjs.map +1 -0
- package/dist/chunk-6C2DKIC7.js +4 -0
- package/dist/chunk-6C2DKIC7.js.map +1 -0
- package/dist/chunk-6IBFBWC5.mjs +17 -0
- package/dist/chunk-6IBFBWC5.mjs.map +1 -0
- package/dist/chunk-6KY2ZRVI.js +116 -0
- package/dist/chunk-6KY2ZRVI.js.map +1 -0
- package/dist/chunk-6VJT3SM4.mjs +182 -0
- package/dist/chunk-6VJT3SM4.mjs.map +1 -0
- package/dist/chunk-6YZUFMK2.mjs +40 -0
- package/dist/chunk-6YZUFMK2.mjs.map +1 -0
- package/dist/chunk-7A6R7CGG.js +47 -0
- package/dist/chunk-7A6R7CGG.js.map +1 -0
- package/dist/chunk-7PWL4V2R.js +4 -0
- package/dist/chunk-7PWL4V2R.js.map +1 -0
- package/dist/chunk-AA33WDYS.js +161 -0
- package/dist/chunk-AA33WDYS.js.map +1 -0
- package/dist/chunk-AHRGFXV2.js +525 -0
- package/dist/chunk-AHRGFXV2.js.map +1 -0
- package/dist/chunk-B63XLDZH.mjs +109 -0
- package/dist/chunk-B63XLDZH.mjs.map +1 -0
- package/dist/chunk-BX2USEWF.mjs +35 -0
- package/dist/chunk-BX2USEWF.mjs.map +1 -0
- package/dist/chunk-BYSZT35R.js +150 -0
- package/dist/chunk-BYSZT35R.js.map +1 -0
- package/dist/chunk-C6OJIHNO.js +12 -0
- package/dist/chunk-C6OJIHNO.js.map +1 -0
- package/dist/chunk-COOELBX7.mjs +63 -0
- package/dist/chunk-COOELBX7.mjs.map +1 -0
- package/dist/chunk-D2TW7MNC.mjs +2771 -0
- package/dist/chunk-D2TW7MNC.mjs.map +1 -0
- package/dist/chunk-D5KEZ6V6.mjs +3 -0
- package/dist/chunk-D5KEZ6V6.mjs.map +1 -0
- package/dist/chunk-E3GUGJMY.js +46 -0
- package/dist/chunk-E3GUGJMY.js.map +1 -0
- package/dist/chunk-EBZ2HGJ2.mjs +52 -0
- package/dist/chunk-EBZ2HGJ2.mjs.map +1 -0
- package/dist/chunk-EDLTUOIA.mjs +210 -0
- package/dist/chunk-EDLTUOIA.mjs.map +1 -0
- package/dist/chunk-EJQSOT4X.js +4 -0
- package/dist/chunk-EJQSOT4X.js.map +1 -0
- package/dist/chunk-EUPFS6MZ.mjs +2019 -0
- package/dist/chunk-EUPFS6MZ.mjs.map +1 -0
- package/dist/chunk-F3XWDC3B.js +77 -0
- package/dist/chunk-F3XWDC3B.js.map +1 -0
- package/dist/chunk-FFADMVIK.mjs +5127 -0
- package/dist/chunk-FFADMVIK.mjs.map +1 -0
- package/dist/chunk-FJWS7BKT.mjs +3 -0
- package/dist/chunk-FJWS7BKT.mjs.map +1 -0
- package/dist/chunk-FJZJDUOR.mjs +3 -0
- package/dist/chunk-FJZJDUOR.mjs.map +1 -0
- package/dist/chunk-GCFLCO2Z.mjs +145 -0
- package/dist/chunk-GCFLCO2Z.mjs.map +1 -0
- package/dist/chunk-GEXC4LRP.js +61 -0
- package/dist/chunk-GEXC4LRP.js.map +1 -0
- package/dist/chunk-GTRAXQGC.mjs +3 -0
- package/dist/chunk-GTRAXQGC.mjs.map +1 -0
- package/dist/chunk-IKOIRUKW.js +270 -0
- package/dist/chunk-IKOIRUKW.js.map +1 -0
- package/dist/chunk-IXTWOPRN.js +45 -0
- package/dist/chunk-IXTWOPRN.js.map +1 -0
- package/dist/chunk-JDXOXGOK.js +547 -0
- package/dist/chunk-JDXOXGOK.js.map +1 -0
- package/dist/chunk-JSLDWYV7.mjs +558 -0
- package/dist/chunk-JSLDWYV7.mjs.map +1 -0
- package/dist/chunk-JXLSTVBK.js +336 -0
- package/dist/chunk-JXLSTVBK.js.map +1 -0
- package/dist/chunk-KHYXK7FG.mjs +49 -0
- package/dist/chunk-KHYXK7FG.mjs.map +1 -0
- package/dist/chunk-KSMBOWQQ.js +2034 -0
- package/dist/chunk-KSMBOWQQ.js.map +1 -0
- package/dist/chunk-KU2PXHGB.mjs +83 -0
- package/dist/chunk-KU2PXHGB.mjs.map +1 -0
- package/dist/chunk-KZANIV3S.mjs +37 -0
- package/dist/chunk-KZANIV3S.mjs.map +1 -0
- package/dist/chunk-L4BP6YOB.js +20 -0
- package/dist/chunk-L4BP6YOB.js.map +1 -0
- package/dist/chunk-MRKA2OAF.mjs +75 -0
- package/dist/chunk-MRKA2OAF.mjs.map +1 -0
- package/dist/chunk-N5EC53MH.mjs +80 -0
- package/dist/chunk-N5EC53MH.mjs.map +1 -0
- package/dist/chunk-NZANQGDM.mjs +34 -0
- package/dist/chunk-NZANQGDM.mjs.map +1 -0
- package/dist/chunk-O4GS3XPZ.js +10 -0
- package/dist/chunk-O4GS3XPZ.js.map +1 -0
- package/dist/chunk-O76QDGRM.js +5154 -0
- package/dist/chunk-O76QDGRM.js.map +1 -0
- package/dist/chunk-OYEUNZJY.js +114 -0
- package/dist/chunk-OYEUNZJY.js.map +1 -0
- package/dist/chunk-PHXAGQNB.js +74 -0
- package/dist/chunk-PHXAGQNB.js.map +1 -0
- package/dist/chunk-PIHHPP7J.mjs +16 -0
- package/dist/chunk-PIHHPP7J.mjs.map +1 -0
- package/dist/chunk-PXRHVVOU.mjs +499 -0
- package/dist/chunk-PXRHVVOU.mjs.map +1 -0
- package/dist/chunk-QMA6U6AU.js +36 -0
- package/dist/chunk-QMA6U6AU.js.map +1 -0
- package/dist/chunk-R6J7IULF.js +44 -0
- package/dist/chunk-R6J7IULF.js.map +1 -0
- package/dist/chunk-R7G6TWIS.mjs +10 -0
- package/dist/chunk-R7G6TWIS.mjs.map +1 -0
- package/dist/chunk-RUMGFI6L.mjs +544 -0
- package/dist/chunk-RUMGFI6L.mjs.map +1 -0
- package/dist/chunk-S54JWSJF.js +565 -0
- package/dist/chunk-S54JWSJF.js.map +1 -0
- package/dist/chunk-SK5UGG6A.js +2041 -0
- package/dist/chunk-SK5UGG6A.js.map +1 -0
- package/dist/chunk-SKIYDKIS.mjs +70 -0
- package/dist/chunk-SKIYDKIS.mjs.map +1 -0
- package/dist/chunk-SZNS5IK6.mjs +322 -0
- package/dist/chunk-SZNS5IK6.mjs.map +1 -0
- package/dist/chunk-T7JIPZAC.js +66 -0
- package/dist/chunk-T7JIPZAC.js.map +1 -0
- package/dist/chunk-TGYQHO2E.mjs +864 -0
- package/dist/chunk-TGYQHO2E.mjs.map +1 -0
- package/dist/chunk-TT3MHN42.mjs +8 -0
- package/dist/chunk-TT3MHN42.mjs.map +1 -0
- package/dist/chunk-UM55U65W.mjs +268 -0
- package/dist/chunk-UM55U65W.mjs.map +1 -0
- package/dist/chunk-UQ2HALUD.js +72 -0
- package/dist/chunk-UQ2HALUD.js.map +1 -0
- package/dist/chunk-UXWT7G77.js +82 -0
- package/dist/chunk-UXWT7G77.js.map +1 -0
- package/dist/chunk-VNS5WDWO.mjs +7 -0
- package/dist/chunk-VNS5WDWO.mjs.map +1 -0
- package/dist/chunk-VRWZLGR7.js +4 -0
- package/dist/chunk-VRWZLGR7.js.map +1 -0
- package/dist/chunk-VZLDSNH4.mjs +22 -0
- package/dist/chunk-VZLDSNH4.mjs.map +1 -0
- package/dist/chunk-W6P3YETJ.js +92 -0
- package/dist/chunk-W6P3YETJ.js.map +1 -0
- package/dist/chunk-WPKFFQCR.mjs +90 -0
- package/dist/chunk-WPKFFQCR.mjs.map +1 -0
- package/dist/chunk-WTVTI5TO.mjs +22 -0
- package/dist/chunk-WTVTI5TO.mjs.map +1 -0
- package/dist/chunk-XJOBZ4RJ.js +44 -0
- package/dist/chunk-XJOBZ4RJ.js.map +1 -0
- package/dist/chunk-XP2JDNDU.js +325 -0
- package/dist/chunk-XP2JDNDU.js.map +1 -0
- package/dist/chunk-Y4V5CEWD.mjs +112 -0
- package/dist/chunk-Y4V5CEWD.mjs.map +1 -0
- package/dist/chunk-YERN2UWM.js +116 -0
- package/dist/chunk-YERN2UWM.js.map +1 -0
- package/dist/chunk-ZKJQWFAA.mjs +114 -0
- package/dist/chunk-ZKJQWFAA.mjs.map +1 -0
- package/dist/chunk-ZOON3S3Y.mjs +138 -0
- package/dist/chunk-ZOON3S3Y.mjs.map +1 -0
- package/dist/chunk-ZP6QRAYC.mjs +2024 -0
- package/dist/chunk-ZP6QRAYC.mjs.map +1 -0
- package/dist/chunk-ZSTFX7FV.js +9 -0
- package/dist/chunk-ZSTFX7FV.js.map +1 -0
- package/dist/client/index.js +23 -331
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +3 -330
- package/dist/client/index.mjs.map +1 -1
- package/dist/comparison/index.js +28 -111
- package/dist/comparison/index.js.map +1 -1
- package/dist/comparison/index.mjs +2 -107
- package/dist/comparison/index.mjs.map +1 -1
- package/dist/components/contact.js +21 -931
- package/dist/components/contact.js.map +1 -1
- package/dist/components/contact.mjs +12 -909
- package/dist/components/contact.mjs.map +1 -1
- package/dist/components/electron-download.js +12 -124
- package/dist/components/electron-download.js.map +1 -1
- package/dist/components/electron-download.mjs +4 -106
- package/dist/components/electron-download.mjs.map +1 -1
- package/dist/components/explore-cta.js +8 -112
- package/dist/components/explore-cta.js.map +1 -1
- package/dist/components/explore-cta.mjs +3 -114
- package/dist/components/explore-cta.mjs.map +1 -1
- package/dist/components/explore.js +62 -7833
- package/dist/components/explore.js.map +1 -1
- package/dist/components/explore.mjs +13 -7800
- package/dist/components/explore.mjs.map +1 -1
- package/dist/components/launch-countdown.js +8 -83
- package/dist/components/launch-countdown.js.map +1 -1
- package/dist/components/launch-countdown.mjs +3 -85
- package/dist/components/launch-countdown.mjs.map +1 -1
- package/dist/components/newsletter.js +20 -993
- package/dist/components/newsletter.js.map +1 -1
- package/dist/components/newsletter.mjs +11 -971
- package/dist/components/newsletter.mjs.map +1 -1
- package/dist/components/partners.js +24 -1302
- package/dist/components/partners.js.map +1 -1
- package/dist/components/partners.mjs +15 -1276
- package/dist/components/partners.mjs.map +1 -1
- package/dist/components/pricing.js +49 -1249
- package/dist/components/pricing.js.map +1 -1
- package/dist/components/pricing.mjs +8 -1226
- package/dist/components/pricing.mjs.map +1 -1
- package/dist/components/problems-solved.js +8 -150
- package/dist/components/problems-solved.js.map +1 -1
- package/dist/components/problems-solved.mjs +4 -133
- package/dist/components/problems-solved.mjs.map +1 -1
- package/dist/components/resource-links.js +8 -304
- package/dist/components/resource-links.js.map +1 -1
- package/dist/components/resource-links.mjs +5 -308
- package/dist/components/resource-links.mjs.map +1 -1
- package/dist/components/social-links.js +8 -343
- package/dist/components/social-links.js.map +1 -1
- package/dist/components/social-links.mjs +5 -347
- package/dist/components/social-links.mjs.map +1 -1
- package/dist/components/unsubscribe.js +10 -627
- package/dist/components/unsubscribe.js.map +1 -1
- package/dist/components/unsubscribe.mjs +6 -611
- package/dist/components/unsubscribe.mjs.map +1 -1
- package/dist/components/waitlist.js +21 -1001
- package/dist/components/waitlist.js.map +1 -1
- package/dist/components/waitlist.mjs +12 -982
- package/dist/components/waitlist.mjs.map +1 -1
- package/dist/components/website-switcher.js +12 -175
- package/dist/components/website-switcher.js.map +1 -1
- package/dist/components/website-switcher.mjs +4 -157
- package/dist/components/website-switcher.mjs.map +1 -1
- package/dist/content/index.js +118 -3616
- package/dist/content/index.js.map +1 -1
- package/dist/content/index.mjs +12 -3567
- package/dist/content/index.mjs.map +1 -1
- package/dist/hooks/index.js +37 -2321
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/index.mjs +6 -2318
- package/dist/hooks/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4145 -20599
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +3766 -20567
- package/dist/index.mjs.map +1 -1
- package/dist/product/index.js +20 -393
- package/dist/product/index.js.map +1 -1
- package/dist/product/index.mjs +5 -394
- package/dist/product/index.mjs.map +1 -1
- package/dist/seo/index.js +8 -76
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +3 -78
- package/dist/seo/index.mjs.map +1 -1
- package/dist/store/index.js +51 -2650
- package/dist/store/index.js.map +1 -1
- package/dist/store/index.mjs +13 -2619
- package/dist/store/index.mjs.map +1 -1
- package/dist/utils/index.js +69 -134
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +5 -122
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,547 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkXJOBZ4RJ_js = require('./chunk-XJOBZ4RJ.js');
|
|
4
|
+
var chunkR6J7IULF_js = require('./chunk-R6J7IULF.js');
|
|
5
|
+
var chunkIXTWOPRN_js = require('./chunk-IXTWOPRN.js');
|
|
6
|
+
var chunk7A6R7CGG_js = require('./chunk-7A6R7CGG.js');
|
|
7
|
+
var chunkUXWT7G77_js = require('./chunk-UXWT7G77.js');
|
|
8
|
+
var chunkUQ2HALUD_js = require('./chunk-UQ2HALUD.js');
|
|
9
|
+
var chunkBYSZT35R_js = require('./chunk-BYSZT35R.js');
|
|
10
|
+
var chunkJXLSTVBK_js = require('./chunk-JXLSTVBK.js');
|
|
11
|
+
var react = require('react');
|
|
12
|
+
var zod$1 = require('@hookform/resolvers/zod');
|
|
13
|
+
var reactHookForm = require('react-hook-form');
|
|
14
|
+
var sonner = require('sonner');
|
|
15
|
+
var zod = require('zod');
|
|
16
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
17
|
+
|
|
18
|
+
var waitlistPageSchema = zod.z.object({
|
|
19
|
+
name: zod.z.string().min(1, "Name is required"),
|
|
20
|
+
email: zod.z.string().email("Please enter a valid email address"),
|
|
21
|
+
company: zod.z.string().optional(),
|
|
22
|
+
reason: zod.z.string().optional()
|
|
23
|
+
});
|
|
24
|
+
var JOIN_WAITLIST_MUTATION = (
|
|
25
|
+
/* GraphQL */
|
|
26
|
+
`
|
|
27
|
+
mutation JoinWaitlist($input: JoinWaitlistInput!) {
|
|
28
|
+
joinWaitlist(input: $input) {
|
|
29
|
+
id
|
|
30
|
+
email
|
|
31
|
+
name
|
|
32
|
+
status
|
|
33
|
+
createdAt
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
`
|
|
37
|
+
);
|
|
38
|
+
async function joinWaitlist(client, data, productId) {
|
|
39
|
+
try {
|
|
40
|
+
const result = await client.mutate(JOIN_WAITLIST_MUTATION, {
|
|
41
|
+
input: {
|
|
42
|
+
email: data.email.trim().toLowerCase(),
|
|
43
|
+
platformProductId: productId,
|
|
44
|
+
name: data.name?.trim() || void 0,
|
|
45
|
+
company: data.company?.trim() || void 0,
|
|
46
|
+
reason: data.reason?.trim() || void 0,
|
|
47
|
+
context: {
|
|
48
|
+
source: "website",
|
|
49
|
+
referrer: typeof window !== "undefined" ? window.location.href : "",
|
|
50
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
if (result.errors?.length) {
|
|
55
|
+
const errorMsg = result.errors[0]?.message ?? "Failed to join waitlist";
|
|
56
|
+
if (errorMsg.toLowerCase().includes("already")) {
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
message: "You are already on the waitlist!"
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return { success: false, message: errorMsg };
|
|
63
|
+
}
|
|
64
|
+
return { success: true, message: "You have been added to the waitlist!" };
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.error("Waitlist signup error:", error);
|
|
67
|
+
return { success: false, message: "Network error. Please try again." };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function useRateLimit(maxAttempts, windowMinutes) {
|
|
71
|
+
const rateLimitRef = react.useRef(null);
|
|
72
|
+
const [isLimited, setIsLimited] = react.useState(false);
|
|
73
|
+
const [resetTime, setResetTime] = react.useState(null);
|
|
74
|
+
function recordAttempt() {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
const state = rateLimitRef.current;
|
|
77
|
+
if (state && now > state.resetTime) {
|
|
78
|
+
rateLimitRef.current = null;
|
|
79
|
+
}
|
|
80
|
+
const current = rateLimitRef.current;
|
|
81
|
+
if (!current) {
|
|
82
|
+
rateLimitRef.current = {
|
|
83
|
+
attempts: 1,
|
|
84
|
+
resetTime: now + windowMinutes * 60 * 1e3
|
|
85
|
+
};
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
current.attempts += 1;
|
|
89
|
+
if (current.attempts >= maxAttempts) {
|
|
90
|
+
setIsLimited(true);
|
|
91
|
+
setResetTime(new Date(current.resetTime));
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
function checkLimit() {
|
|
97
|
+
const state = rateLimitRef.current;
|
|
98
|
+
if (!state) return false;
|
|
99
|
+
if (Date.now() > state.resetTime) {
|
|
100
|
+
rateLimitRef.current = null;
|
|
101
|
+
setIsLimited(false);
|
|
102
|
+
setResetTime(null);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return state.attempts >= maxAttempts;
|
|
106
|
+
}
|
|
107
|
+
return { isLimited, resetTime, recordAttempt, checkLimit };
|
|
108
|
+
}
|
|
109
|
+
function WaitlistPage({
|
|
110
|
+
productName,
|
|
111
|
+
heroTitle = "Join the Waitlist",
|
|
112
|
+
heroSubtitle = "Be among the first to experience what's coming next",
|
|
113
|
+
heroDescription,
|
|
114
|
+
successMessage = "You have been added to the waitlist!",
|
|
115
|
+
errorMessage = "Failed to join waitlist. Please try again.",
|
|
116
|
+
className,
|
|
117
|
+
seo
|
|
118
|
+
}) {
|
|
119
|
+
const client = chunkJXLSTVBK_js.useWebSDK();
|
|
120
|
+
const config = chunkJXLSTVBK_js.useWebSDKConfig();
|
|
121
|
+
const {
|
|
122
|
+
product,
|
|
123
|
+
loading: productLoading,
|
|
124
|
+
error: productError,
|
|
125
|
+
hasProvider
|
|
126
|
+
} = chunkBYSZT35R_js.useProduct();
|
|
127
|
+
const displayName = productName ?? product?.name ?? config.productId;
|
|
128
|
+
const productStatus = product?.status;
|
|
129
|
+
const canCheckStatus = Boolean(config.productSlug);
|
|
130
|
+
const [isSubmitting, setIsSubmitting] = react.useState(false);
|
|
131
|
+
const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(
|
|
132
|
+
3,
|
|
133
|
+
15
|
|
134
|
+
);
|
|
135
|
+
const {
|
|
136
|
+
register,
|
|
137
|
+
handleSubmit,
|
|
138
|
+
formState: { errors },
|
|
139
|
+
reset
|
|
140
|
+
} = reactHookForm.useForm({
|
|
141
|
+
resolver: zod$1.zodResolver(waitlistPageSchema)
|
|
142
|
+
});
|
|
143
|
+
if (canCheckStatus && !hasProvider) {
|
|
144
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
145
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
146
|
+
chunkUXWT7G77_js.PageHead,
|
|
147
|
+
{
|
|
148
|
+
title: seo.title ?? "",
|
|
149
|
+
description: seo.description ?? "",
|
|
150
|
+
keywords: seo.keywords,
|
|
151
|
+
image: seo.image,
|
|
152
|
+
url: seo.url
|
|
153
|
+
}
|
|
154
|
+
),
|
|
155
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "relative overflow-hidden py-24 lg:py-32", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6", children: [
|
|
156
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl text-foreground", children: "Waitlist Unavailable" }),
|
|
157
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg text-muted-foreground", children: [
|
|
158
|
+
"Product status checks require ",
|
|
159
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { children: "ProductProvider" }),
|
|
160
|
+
" to be mounted. Please update your integration configuration."
|
|
161
|
+
] })
|
|
162
|
+
] }) })
|
|
163
|
+
] });
|
|
164
|
+
}
|
|
165
|
+
if (canCheckStatus && productLoading) {
|
|
166
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
167
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
168
|
+
chunkUXWT7G77_js.PageHead,
|
|
169
|
+
{
|
|
170
|
+
title: seo.title ?? "",
|
|
171
|
+
description: seo.description ?? "",
|
|
172
|
+
keywords: seo.keywords,
|
|
173
|
+
image: seo.image,
|
|
174
|
+
url: seo.url
|
|
175
|
+
}
|
|
176
|
+
),
|
|
177
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "relative overflow-hidden py-24 lg:py-32", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6", children: [
|
|
178
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl text-foreground", children: "Loading\u2026" }),
|
|
179
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg text-muted-foreground", children: "Fetching product status." })
|
|
180
|
+
] }) })
|
|
181
|
+
] });
|
|
182
|
+
}
|
|
183
|
+
if (canCheckStatus && (productError || !productStatus)) {
|
|
184
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
185
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
186
|
+
chunkUXWT7G77_js.PageHead,
|
|
187
|
+
{
|
|
188
|
+
title: seo.title ?? "",
|
|
189
|
+
description: seo.description ?? "",
|
|
190
|
+
keywords: seo.keywords,
|
|
191
|
+
image: seo.image,
|
|
192
|
+
url: seo.url
|
|
193
|
+
}
|
|
194
|
+
),
|
|
195
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "relative overflow-hidden py-24 lg:py-32", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6", children: [
|
|
196
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl text-foreground", children: "Waitlist Unavailable" }),
|
|
197
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg text-muted-foreground", children: "We can\u2019t confirm waitlist availability right now. Please try again later." })
|
|
198
|
+
] }) })
|
|
199
|
+
] });
|
|
200
|
+
}
|
|
201
|
+
if (canCheckStatus && (productStatus === "ACTIVE" || productStatus === "RELEASED")) {
|
|
202
|
+
const appUrl = product?.appUrl || product?.website || "#";
|
|
203
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
204
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
205
|
+
chunkUXWT7G77_js.PageHead,
|
|
206
|
+
{
|
|
207
|
+
title: seo.title ?? "",
|
|
208
|
+
description: seo.description ?? "",
|
|
209
|
+
keywords: seo.keywords,
|
|
210
|
+
image: seo.image,
|
|
211
|
+
url: seo.url
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "relative overflow-hidden py-24 lg:py-32", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8", children: [
|
|
215
|
+
/* @__PURE__ */ jsxRuntime.jsxs("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl text-foreground", children: [
|
|
216
|
+
displayName,
|
|
217
|
+
" is now available!"
|
|
218
|
+
] }),
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg text-muted-foreground", children: [
|
|
220
|
+
"Great news \u2014 ",
|
|
221
|
+
displayName,
|
|
222
|
+
" is open to everyone. Sign up or log in to get started."
|
|
223
|
+
] }),
|
|
224
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkUQ2HALUD_js.Button, { size: "lg", asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx("a", { href: appUrl, target: "_blank", rel: "noopener noreferrer", children: "Get Started" }) })
|
|
225
|
+
] }) })
|
|
226
|
+
] });
|
|
227
|
+
}
|
|
228
|
+
if (canCheckStatus && (productStatus === "DRAFT" || productStatus === "COMING_SOON")) {
|
|
229
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
230
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
231
|
+
chunkUXWT7G77_js.PageHead,
|
|
232
|
+
{
|
|
233
|
+
title: seo.title ?? "",
|
|
234
|
+
description: seo.description ?? "",
|
|
235
|
+
keywords: seo.keywords,
|
|
236
|
+
image: seo.image,
|
|
237
|
+
url: seo.url
|
|
238
|
+
}
|
|
239
|
+
),
|
|
240
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "relative overflow-hidden py-24 lg:py-32", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8", children: [
|
|
241
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl text-foreground", children: "Coming Soon" }),
|
|
242
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg text-muted-foreground", children: [
|
|
243
|
+
displayName,
|
|
244
|
+
" is not yet accepting waitlist signups. Check back soon!"
|
|
245
|
+
] })
|
|
246
|
+
] }) })
|
|
247
|
+
] });
|
|
248
|
+
}
|
|
249
|
+
if (canCheckStatus && productStatus !== "WAITLIST") {
|
|
250
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
251
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
252
|
+
chunkUXWT7G77_js.PageHead,
|
|
253
|
+
{
|
|
254
|
+
title: seo.title ?? "",
|
|
255
|
+
description: seo.description ?? "",
|
|
256
|
+
keywords: seo.keywords,
|
|
257
|
+
image: seo.image,
|
|
258
|
+
url: seo.url
|
|
259
|
+
}
|
|
260
|
+
),
|
|
261
|
+
/* @__PURE__ */ jsxRuntime.jsx("section", { className: "relative overflow-hidden py-24 lg:py-32", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6", children: [
|
|
262
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold tracking-tight sm:text-5xl text-foreground", children: "Waitlist Unavailable" }),
|
|
263
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-lg text-muted-foreground", children: [
|
|
264
|
+
displayName,
|
|
265
|
+
" is not accepting waitlist signups right now."
|
|
266
|
+
] })
|
|
267
|
+
] }) })
|
|
268
|
+
] });
|
|
269
|
+
}
|
|
270
|
+
const onSubmit = async (data) => {
|
|
271
|
+
if (canCheckStatus && productStatus !== "WAITLIST") {
|
|
272
|
+
sonner.toast.error("This product is not accepting waitlist signups right now.");
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
if (checkLimit()) {
|
|
276
|
+
sonner.toast.error(
|
|
277
|
+
`Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`
|
|
278
|
+
);
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
setIsSubmitting(true);
|
|
282
|
+
try {
|
|
283
|
+
const result = await joinWaitlist(
|
|
284
|
+
client,
|
|
285
|
+
data,
|
|
286
|
+
product?.id || config.productId
|
|
287
|
+
);
|
|
288
|
+
if (result.success) {
|
|
289
|
+
chunkXJOBZ4RJ_js.trackWebsiteEvent("waitlist.signed_up", { form: "page" });
|
|
290
|
+
sonner.toast.success(result.message ?? successMessage);
|
|
291
|
+
reset();
|
|
292
|
+
} else {
|
|
293
|
+
sonner.toast.error(result.message ?? errorMessage);
|
|
294
|
+
}
|
|
295
|
+
recordAttempt();
|
|
296
|
+
} catch (_error) {
|
|
297
|
+
sonner.toast.error(errorMessage);
|
|
298
|
+
} finally {
|
|
299
|
+
setIsSubmitting(false);
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
303
|
+
seo && /* @__PURE__ */ jsxRuntime.jsx(
|
|
304
|
+
chunkUXWT7G77_js.PageHead,
|
|
305
|
+
{
|
|
306
|
+
title: seo.title ?? `Join the Waitlist - ${displayName}`,
|
|
307
|
+
description: seo.description ?? heroDescription ?? heroSubtitle,
|
|
308
|
+
productName: displayName,
|
|
309
|
+
keywords: seo.keywords,
|
|
310
|
+
image: seo.image,
|
|
311
|
+
url: seo.url
|
|
312
|
+
}
|
|
313
|
+
),
|
|
314
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-h-screen flex items-center justify-center px-4 py-12", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-lg w-full space-y-8", children: [
|
|
315
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
|
|
316
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl font-bold tracking-tight", children: heroTitle }),
|
|
317
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-lg text-muted-foreground", children: heroSubtitle }),
|
|
318
|
+
heroDescription && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-4 text-sm text-muted-foreground", children: heroDescription })
|
|
319
|
+
] }),
|
|
320
|
+
/* @__PURE__ */ jsxRuntime.jsxs("form", { onSubmit: handleSubmit(onSubmit), className: "space-y-5", children: [
|
|
321
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
322
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "waitlist-name", children: "Name *" }),
|
|
323
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
324
|
+
chunk7A6R7CGG_js.Input,
|
|
325
|
+
{
|
|
326
|
+
id: "waitlist-name",
|
|
327
|
+
type: "text",
|
|
328
|
+
placeholder: "Your name",
|
|
329
|
+
disabled: isSubmitting || isLimited,
|
|
330
|
+
...register("name")
|
|
331
|
+
}
|
|
332
|
+
),
|
|
333
|
+
errors.name && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: errors.name.message })
|
|
334
|
+
] }),
|
|
335
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
336
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "waitlist-email", children: "Email *" }),
|
|
337
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
338
|
+
chunk7A6R7CGG_js.Input,
|
|
339
|
+
{
|
|
340
|
+
id: "waitlist-email",
|
|
341
|
+
type: "email",
|
|
342
|
+
placeholder: "you@example.com",
|
|
343
|
+
disabled: isSubmitting || isLimited,
|
|
344
|
+
...register("email")
|
|
345
|
+
}
|
|
346
|
+
),
|
|
347
|
+
errors.email && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: errors.email.message })
|
|
348
|
+
] }),
|
|
349
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
350
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "waitlist-company", children: "Company" }),
|
|
351
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
352
|
+
chunk7A6R7CGG_js.Input,
|
|
353
|
+
{
|
|
354
|
+
id: "waitlist-company",
|
|
355
|
+
type: "text",
|
|
356
|
+
placeholder: "Your company (optional)",
|
|
357
|
+
disabled: isSubmitting || isLimited,
|
|
358
|
+
...register("company")
|
|
359
|
+
}
|
|
360
|
+
)
|
|
361
|
+
] }),
|
|
362
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
363
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "waitlist-reason", children: "Why are you interested?" }),
|
|
364
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
365
|
+
chunkR6J7IULF_js.Textarea,
|
|
366
|
+
{
|
|
367
|
+
id: "waitlist-reason",
|
|
368
|
+
placeholder: "Tell us what excites you about the product (optional)",
|
|
369
|
+
rows: 3,
|
|
370
|
+
disabled: isSubmitting || isLimited,
|
|
371
|
+
className: "resize-y",
|
|
372
|
+
...register("reason")
|
|
373
|
+
}
|
|
374
|
+
)
|
|
375
|
+
] }),
|
|
376
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
377
|
+
chunkUQ2HALUD_js.Button,
|
|
378
|
+
{
|
|
379
|
+
type: "submit",
|
|
380
|
+
className: "w-full",
|
|
381
|
+
disabled: isSubmitting || isLimited,
|
|
382
|
+
children: isSubmitting ? "Joining..." : "Join Waitlist"
|
|
383
|
+
}
|
|
384
|
+
),
|
|
385
|
+
isLimited && resetTime && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground text-center", children: [
|
|
386
|
+
"Rate limit reached. Try again after",
|
|
387
|
+
" ",
|
|
388
|
+
resetTime.toLocaleTimeString()
|
|
389
|
+
] })
|
|
390
|
+
] }),
|
|
391
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground text-center", children: [
|
|
392
|
+
"By joining the waitlist, you agree to receive updates from",
|
|
393
|
+
" ",
|
|
394
|
+
displayName,
|
|
395
|
+
". We respect your privacy and will never share your information."
|
|
396
|
+
] })
|
|
397
|
+
] }) }) })
|
|
398
|
+
] });
|
|
399
|
+
}
|
|
400
|
+
function WaitlistForm({
|
|
401
|
+
variant = "inline",
|
|
402
|
+
showLabel = false,
|
|
403
|
+
showDescription = false,
|
|
404
|
+
showNameField = false,
|
|
405
|
+
description = "Join our waitlist to get early access",
|
|
406
|
+
buttonText = "Join Waitlist",
|
|
407
|
+
className = ""
|
|
408
|
+
}) {
|
|
409
|
+
const client = chunkJXLSTVBK_js.useWebSDK();
|
|
410
|
+
const config = chunkJXLSTVBK_js.useWebSDKConfig();
|
|
411
|
+
const {
|
|
412
|
+
product,
|
|
413
|
+
loading: productLoading,
|
|
414
|
+
error: productError,
|
|
415
|
+
hasProvider
|
|
416
|
+
} = chunkBYSZT35R_js.useProduct();
|
|
417
|
+
const productStatus = product?.status;
|
|
418
|
+
const canCheckStatus = Boolean(config.productSlug);
|
|
419
|
+
const [email, setEmail] = react.useState("");
|
|
420
|
+
const [name, setName] = react.useState("");
|
|
421
|
+
const [isLoading, setIsLoading] = react.useState(false);
|
|
422
|
+
const handleSubmit = async (e) => {
|
|
423
|
+
e.preventDefault();
|
|
424
|
+
if (canCheckStatus && productStatus !== "WAITLIST") {
|
|
425
|
+
sonner.toast.error("This product is not accepting waitlist signups right now.");
|
|
426
|
+
return;
|
|
427
|
+
}
|
|
428
|
+
if (!email || !email.includes("@")) {
|
|
429
|
+
sonner.toast.error("Please enter a valid email address");
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
setIsLoading(true);
|
|
433
|
+
try {
|
|
434
|
+
const result = await joinWaitlist(
|
|
435
|
+
client,
|
|
436
|
+
{ email, name: name || void 0 },
|
|
437
|
+
product?.id || config.productId
|
|
438
|
+
);
|
|
439
|
+
if (result.success) {
|
|
440
|
+
chunkXJOBZ4RJ_js.trackWebsiteEvent("waitlist.signed_up", { form: "inline" });
|
|
441
|
+
sonner.toast.success(result.message ?? "You have been added to the waitlist!");
|
|
442
|
+
setEmail("");
|
|
443
|
+
setName("");
|
|
444
|
+
} else {
|
|
445
|
+
sonner.toast.error(result.message ?? "Failed to join waitlist");
|
|
446
|
+
}
|
|
447
|
+
} catch (_error) {
|
|
448
|
+
sonner.toast.error("An error occurred. Please try again.");
|
|
449
|
+
} finally {
|
|
450
|
+
setIsLoading(false);
|
|
451
|
+
}
|
|
452
|
+
};
|
|
453
|
+
const isInline = variant === "inline";
|
|
454
|
+
if (canCheckStatus && !hasProvider) {
|
|
455
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
456
|
+
showDescription && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-3", children: description }),
|
|
457
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
458
|
+
"Product status checks require ",
|
|
459
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { children: "ProductProvider" }),
|
|
460
|
+
" to be mounted."
|
|
461
|
+
] })
|
|
462
|
+
] });
|
|
463
|
+
}
|
|
464
|
+
if (canCheckStatus && productLoading) {
|
|
465
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
466
|
+
showDescription && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-3", children: description }),
|
|
467
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "Loading waitlist\u2026" })
|
|
468
|
+
] });
|
|
469
|
+
}
|
|
470
|
+
if (canCheckStatus && (productError || productStatus !== "WAITLIST")) {
|
|
471
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
472
|
+
showDescription && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-3", children: description }),
|
|
473
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "Waitlist signups are not available right now." })
|
|
474
|
+
] });
|
|
475
|
+
}
|
|
476
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, children: [
|
|
477
|
+
showDescription && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mb-3", children: description }),
|
|
478
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
479
|
+
"form",
|
|
480
|
+
{
|
|
481
|
+
onSubmit: handleSubmit,
|
|
482
|
+
className: isInline ? "flex gap-2" : "flex flex-col gap-2",
|
|
483
|
+
children: [
|
|
484
|
+
showNameField && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: isInline ? "flex-1" : "w-full", children: [
|
|
485
|
+
showLabel && /* @__PURE__ */ jsxRuntime.jsx(
|
|
486
|
+
chunkIXTWOPRN_js.Label,
|
|
487
|
+
{
|
|
488
|
+
htmlFor: "waitlist-inline-name",
|
|
489
|
+
className: "text-sm mb-1 block",
|
|
490
|
+
children: "Name"
|
|
491
|
+
}
|
|
492
|
+
),
|
|
493
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
494
|
+
chunk7A6R7CGG_js.Input,
|
|
495
|
+
{
|
|
496
|
+
id: "waitlist-inline-name",
|
|
497
|
+
type: "text",
|
|
498
|
+
placeholder: "Your name",
|
|
499
|
+
value: name,
|
|
500
|
+
onChange: (e) => setName(e.target.value),
|
|
501
|
+
disabled: isLoading,
|
|
502
|
+
className: "w-full"
|
|
503
|
+
}
|
|
504
|
+
)
|
|
505
|
+
] }),
|
|
506
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: isInline ? "flex-1" : "w-full", children: [
|
|
507
|
+
showLabel && /* @__PURE__ */ jsxRuntime.jsx(
|
|
508
|
+
chunkIXTWOPRN_js.Label,
|
|
509
|
+
{
|
|
510
|
+
htmlFor: "waitlist-inline-email",
|
|
511
|
+
className: "text-sm mb-1 block",
|
|
512
|
+
children: "Email"
|
|
513
|
+
}
|
|
514
|
+
),
|
|
515
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
516
|
+
chunk7A6R7CGG_js.Input,
|
|
517
|
+
{
|
|
518
|
+
id: "waitlist-inline-email",
|
|
519
|
+
type: "email",
|
|
520
|
+
placeholder: "Enter your email",
|
|
521
|
+
value: email,
|
|
522
|
+
onChange: (e) => setEmail(e.target.value),
|
|
523
|
+
disabled: isLoading,
|
|
524
|
+
required: true,
|
|
525
|
+
className: "w-full"
|
|
526
|
+
}
|
|
527
|
+
)
|
|
528
|
+
] }),
|
|
529
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
530
|
+
chunkUQ2HALUD_js.Button,
|
|
531
|
+
{
|
|
532
|
+
type: "submit",
|
|
533
|
+
disabled: isLoading,
|
|
534
|
+
className: isInline ? "whitespace-nowrap" : "w-full",
|
|
535
|
+
children: isLoading ? "Joining..." : buttonText
|
|
536
|
+
}
|
|
537
|
+
)
|
|
538
|
+
]
|
|
539
|
+
}
|
|
540
|
+
)
|
|
541
|
+
] });
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
exports.WaitlistForm = WaitlistForm;
|
|
545
|
+
exports.WaitlistPage = WaitlistPage;
|
|
546
|
+
//# sourceMappingURL=chunk-JDXOXGOK.js.map
|
|
547
|
+
//# sourceMappingURL=chunk-JDXOXGOK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/waitlist.tsx"],"names":["z","useRef","useState","useWebSDK","useWebSDKConfig","useProduct","useForm","zodResolver","jsxs","jsx","PageHead","Button","toast","trackWebsiteEvent","Fragment","Label","Input","Textarea"],"mappings":";;;;;;;;;;;;;;;;;AAiGA,IAAM,kBAAA,GAAqBA,MAAE,MAAA,CAAO;AAAA,EAClC,MAAMA,KAAA,CAAE,MAAA,EAAO,CAAE,GAAA,CAAI,GAAG,kBAAkB,CAAA;AAAA,EAC1C,KAAA,EAAOA,KAAA,CAAE,MAAA,EAAO,CAAE,MAAM,oCAAoC,CAAA;AAAA,EAC5D,OAAA,EAASA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,MAAA,EAAQA,KAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC,CAAA;AAQD,IAAM,sBAAA;AAAA;AAAA,EAAuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAgB7C,eAAe,YAAA,CACb,MAAA,EACA,IAAA,EAMA,SAAA,EACiD;AACjD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO,MAAA,CAQzB,sBAAA,EAAwB;AAAA,MACzB,KAAA,EAAO;AAAA,QACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,GAAO,WAAA,EAAY;AAAA,QACrC,iBAAA,EAAmB,SAAA;AAAA,QACnB,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA,QAC3B,OAAA,EAAS,IAAA,CAAK,OAAA,EAAS,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA,QACjC,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAK,IAAK,KAAA,CAAA;AAAA,QAC/B,OAAA,EAAS;AAAA,UACP,MAAA,EAAQ,SAAA;AAAA,UACR,UAAU,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,IAAA,GAAO,EAAA;AAAA,UACjE,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA;AAAY;AACpC;AACF,KACD,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,QAAQ,MAAA,EAAQ;AACzB,MAAA,MAAM,QAAA,GAAW,MAAA,CAAO,MAAA,CAAO,CAAC,GAAG,OAAA,IAAW,yBAAA;AAC9C,MAAA,IAAI,QAAA,CAAS,WAAA,EAAY,CAAE,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AACA,MAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,QAAA,EAAS;AAAA,IAC7C;AAEA,IAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,EAAS,sCAAA,EAAuC;AAAA,EAC1E,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,0BAA0B,KAAK,CAAA;AAC7C,IAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,kCAAA,EAAmC;AAAA,EACvE;AACF;AAMA,SAAS,YAAA,CAAa,aAAqB,aAAA,EAAuB;AAChE,EAAA,MAAM,YAAA,GAAeC,aAA8B,IAAI,CAAA;AACvD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAsB,IAAI,CAAA;AAE5D,EAAA,SAAS,aAAA,GAAyB;AAChC,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,IAAA,MAAM,QAAQ,YAAA,CAAa,OAAA;AAG3B,IAAA,IAAI,KAAA,IAAS,GAAA,GAAM,KAAA,CAAM,SAAA,EAAW;AAClC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AAAA,IACzB;AAEA,IAAA,MAAM,UAAU,YAAA,CAAa,OAAA;AAE7B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,YAAA,CAAa,OAAA,GAAU;AAAA,QACrB,QAAA,EAAU,CAAA;AAAA,QACV,SAAA,EAAW,GAAA,GAAM,aAAA,GAAgB,EAAA,GAAK;AAAA,OACxC;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAA,CAAQ,QAAA,IAAY,CAAA;AAEpB,IAAA,IAAI,OAAA,CAAQ,YAAY,WAAA,EAAa;AACnC,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,YAAA,CAAa,IAAI,IAAA,CAAK,OAAA,CAAQ,SAAS,CAAC,CAAA;AACxC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,SAAS,UAAA,GAAsB;AAC7B,IAAA,MAAM,QAAQ,YAAA,CAAa,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AACnB,IAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,KAAA,CAAM,SAAA,EAAW;AAChC,MAAA,YAAA,CAAa,OAAA,GAAU,IAAA;AACvB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,YAAA,CAAa,IAAI,CAAA;AACjB,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,MAAM,QAAA,IAAY,WAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,aAAA,EAAe,UAAA,EAAW;AAC3D;AAMO,SAAS,YAAA,CAAa;AAAA,EAC3B,WAAA;AAAA,EACA,SAAA,GAAY,mBAAA;AAAA,EACZ,YAAA,GAAe,qDAAA;AAAA,EACf,eAAA;AAAA,EACA,cAAA,GAAiB,sCAAA;AAAA,EACjB,YAAA,GAAe,4CAAA;AAAA,EACf,SAAA;AAAA,EACA;AACF,CAAA,EAAsB;AACpB,EAAA,MAAM,SAASC,0BAAA,EAAU;AACzB,EAAA,MAAM,SAASC,gCAAA,EAAgB;AAC/B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,MACEC,2BAAA,EAAW;AACf,EAAA,MAAM,WAAA,GAAc,WAAA,IAAe,OAAA,EAAS,IAAA,IAAQ,MAAA,CAAO,SAAA;AAC3D,EAAA,MAAM,gBAAgB,OAAA,EAAS,MAAA;AAC/B,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA;AAEjD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIH,eAAS,KAAK,CAAA;AACtD,EAAA,MAAM,EAAE,SAAA,EAAW,SAAA,EAAW,aAAA,EAAe,YAAW,GAAI,YAAA;AAAA,IAC1D,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,IACpB;AAAA,MACEI,qBAAA,CAA8B;AAAA,IAChC,QAAA,EAAUC,kBAAY,kBAAkB;AAAA,GACzC,CAAA;AAED,EAAA,IAAI,cAAA,IAAkB,CAAC,WAAA,EAAa;AAClC,IAAA,uBACEC,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,GAAA,oBACCC,cAAA;AAAA,QAACC,yBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,UACpB,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,KAAK,GAAA,CAAI;AAAA;AAAA,OACX;AAAA,qCAED,SAAA,EAAA,EAAQ,SAAA,EAAU,2CACjB,QAAA,kBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,sBAAA,EAE9E,CAAA;AAAA,wBACAD,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,UAAA,gCAAA;AAAA,0BACbC,cAAA,CAAC,UAAK,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,UAAO;AAAA,SAAA,EAE5D;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,kBAAkB,cAAA,EAAgB;AACpC,IAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,GAAA,oBACCC,cAAA;AAAA,QAACC,yBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,UACpB,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,KAAK,GAAA,CAAI;AAAA;AAAA,OACX;AAAA,qCAED,SAAA,EAAA,EAAQ,SAAA,EAAU,2CACjB,QAAA,kBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,eAAA,EAE9E,CAAA;AAAA,wBACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,0BAAA,EAE7C;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,cAAA,KAAmB,YAAA,IAAgB,CAAC,aAAA,CAAA,EAAgB;AACtD,IAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,GAAA,oBACCC,cAAA;AAAA,QAACC,yBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,UACpB,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,KAAK,GAAA,CAAI;AAAA;AAAA,OACX;AAAA,qCAED,SAAA,EAAA,EAAQ,SAAA,EAAU,2CACjB,QAAA,kBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,sBAAA,EAE9E,CAAA;AAAA,wBACAA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,gFAAA,EAG7C;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IACE,cAAA,KACC,aAAA,KAAkB,QAAA,IAAY,aAAA,KAAkB,UAAA,CAAA,EACjD;AACA,IAAA,MAAM,MAAA,GAAS,OAAA,EAAS,MAAA,IAAU,OAAA,EAAS,OAAA,IAAW,GAAA;AACtD,IAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,GAAA,oBACCC,cAAA;AAAA,QAACC,yBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,UACpB,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,KAAK,GAAA,CAAI;AAAA;AAAA,OACX;AAAA,qCAED,SAAA,EAAA,EAAQ,SAAA,EAAU,2CACjB,QAAA,kBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAA,CAAC,IAAA,EAAA,EAAG,WAAU,+DAAA,EACX,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UAAY;AAAA,SAAA,EACf,CAAA;AAAA,wBACAA,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,UAAA,oBAAA;AAAA,UAC7B,WAAA;AAAA,UAAY;AAAA,SAAA,EAE5B,CAAA;AAAA,wBACAC,cAAA,CAACE,uBAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,SAAO,IAAA,EACvB,QAAA,kBAAAF,cAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,QAAQ,MAAA,EAAO,QAAA,EAAS,GAAA,EAAI,qBAAA,EAAsB,yBAE3D,CAAA,EACF;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IACE,cAAA,KACC,aAAA,KAAkB,OAAA,IAAW,aAAA,KAAkB,aAAA,CAAA,EAChD;AACA,IAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,GAAA,oBACCC,cAAA;AAAA,QAACC,yBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,UACpB,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,KAAK,GAAA,CAAI;AAAA;AAAA,OACX;AAAA,qCAED,SAAA,EAAA,EAAQ,SAAA,EAAU,2CACjB,QAAA,kBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,aAAA,EAE9E,CAAA;AAAA,wBACAD,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UAAY;AAAA,SAAA,EAEf;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,cAAA,IAAkB,kBAAkB,UAAA,EAAY;AAClD,IAAA,uBACEA,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,GAAA,oBACCC,cAAA;AAAA,QAACC,yBAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAO,IAAI,KAAA,IAAS,EAAA;AAAA,UACpB,WAAA,EAAa,IAAI,WAAA,IAAe,EAAA;AAAA,UAChC,UAAU,GAAA,CAAI,QAAA;AAAA,UACd,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,KAAK,GAAA,CAAI;AAAA;AAAA,OACX;AAAA,qCAED,SAAA,EAAA,EAAQ,SAAA,EAAU,2CACjB,QAAA,kBAAAF,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,uEAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+DAAA,EAAgE,QAAA,EAAA,sBAAA,EAE9E,CAAA;AAAA,wBACAD,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EACV,QAAA,EAAA;AAAA,UAAA,WAAA;AAAA,UAAY;AAAA,SAAA,EACf;AAAA,OAAA,EACF,CAAA,EACF;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,QAAA,GAAW,OAAO,IAAA,KAA+B;AACrD,IAAA,IAAI,cAAA,IAAkB,kBAAkB,UAAA,EAAY;AAClD,MAAAI,YAAA,CAAM,MAAM,2DAA2D,CAAA;AACvE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,YAAW,EAAG;AAChB,MAAAA,YAAA,CAAM,KAAA;AAAA,QACJ,CAAA,0CAAA,EAA6C,SAAA,EAAW,kBAAA,EAAoB,CAAA;AAAA,OAC9E;AACA,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,IAAI,CAAA;AAEpB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,YAAA;AAAA,QACnB,MAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,OACxB;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAElB,QAAAC,kCAAA,CAAkB,oBAAA,EAAsB,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AACxD,QAAAD,YAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,cAAc,CAAA;AAC9C,QAAA,KAAA,EAAM;AAAA,MACR,CAAA,MAAO;AACL,QAAAA,YAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW,YAAY,CAAA;AAAA,MAC5C;AAEA,MAAA,aAAA,EAAc;AAAA,IAChB,SAAS,MAAA,EAAQ;AACf,MAAAA,YAAA,CAAM,MAAM,YAAY,CAAA;AAAA,IAC1B,CAAA,SAAE;AACA,MAAA,eAAA,CAAgB,KAAK,CAAA;AAAA,IACvB;AAAA,EACF,CAAA;AAEA,EAAA,uBACEJ,eAAA,CAAAM,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,GAAA,oBACCL,cAAA;AAAA,MAACC,yBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,GAAA,CAAI,KAAA,IAAS,CAAA,oBAAA,EAAuB,WAAW,CAAA,CAAA;AAAA,QACtD,WAAA,EAAa,GAAA,CAAI,WAAA,IAAe,eAAA,IAAmB,YAAA;AAAA,QACnD,WAAA,EAAa,WAAA;AAAA,QACb,UAAU,GAAA,CAAI,QAAA;AAAA,QACd,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,KAAK,GAAA,CAAI;AAAA;AAAA,KACX;AAAA,oBAGFD,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EACH,QAAA,kBAAAA,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,0DAAA,EACb,QAAA,kBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EAEb,QAAA,EAAA;AAAA,sBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,aAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,mCAAA,EAAqC,QAAA,EAAA,SAAA,EAAU,CAAA;AAAA,wBAC7DA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EACV,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,QACC,eAAA,oBACCA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,sCACV,QAAA,EAAA,eAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,sCAGC,MAAA,EAAA,EAAK,QAAA,EAAU,aAAa,QAAQ,CAAA,EAAG,WAAU,WAAA,EAChD,QAAA,EAAA;AAAA,wBAAAD,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACM,sBAAA,EAAA,EAAM,OAAA,EAAQ,eAAA,EAAgB,QAAA,EAAA,QAAA,EAAM,CAAA;AAAA,0BACrCN,cAAA;AAAA,YAACO,sBAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,eAAA;AAAA,cACH,IAAA,EAAK,MAAA;AAAA,cACL,WAAA,EAAY,WAAA;AAAA,cACZ,UAAU,YAAA,IAAgB,SAAA;AAAA,cACzB,GAAG,SAAS,MAAM;AAAA;AAAA,WACrB;AAAA,UACC,MAAA,CAAO,wBACNP,cAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0BAAA,EACV,QAAA,EAAA,MAAA,CAAO,KAAK,OAAA,EACf;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACM,sBAAA,EAAA,EAAM,OAAA,EAAQ,gBAAA,EAAiB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,0BACvCN,cAAA;AAAA,YAACO,sBAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,gBAAA;AAAA,cACH,IAAA,EAAK,OAAA;AAAA,cACL,WAAA,EAAY,iBAAA;AAAA,cACZ,UAAU,YAAA,IAAgB,SAAA;AAAA,cACzB,GAAG,SAAS,OAAO;AAAA;AAAA,WACtB;AAAA,UACC,MAAA,CAAO,yBACNP,cAAA,CAAC,GAAA,EAAA,EAAE,WAAU,0BAAA,EACV,QAAA,EAAA,MAAA,CAAO,MAAM,OAAA,EAChB;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEAD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACM,sBAAA,EAAA,EAAM,OAAA,EAAQ,kBAAA,EAAmB,QAAA,EAAA,SAAA,EAAO,CAAA;AAAA,0BACzCN,cAAA;AAAA,YAACO,sBAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,kBAAA;AAAA,cACH,IAAA,EAAK,MAAA;AAAA,cACL,WAAA,EAAY,yBAAA;AAAA,cACZ,UAAU,YAAA,IAAgB,SAAA;AAAA,cACzB,GAAG,SAAS,SAAS;AAAA;AAAA;AACxB,SAAA,EACF,CAAA;AAAA,wBAEAR,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,0BAAAC,cAAA,CAACM,sBAAA,EAAA,EAAM,OAAA,EAAQ,iBAAA,EAAkB,QAAA,EAAA,yBAAA,EAAuB,CAAA;AAAA,0BACxDN,cAAA;AAAA,YAACQ,yBAAA;AAAA,YAAA;AAAA,cACC,EAAA,EAAG,iBAAA;AAAA,cACH,WAAA,EAAY,uDAAA;AAAA,cACZ,IAAA,EAAM,CAAA;AAAA,cACN,UAAU,YAAA,IAAgB,SAAA;AAAA,cAC1B,SAAA,EAAU,UAAA;AAAA,cACT,GAAG,SAAS,QAAQ;AAAA;AAAA;AACvB,SAAA,EACF,CAAA;AAAA,wBAEAR,cAAA;AAAA,UAACE,uBAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,QAAA;AAAA,YACV,UAAU,YAAA,IAAgB,SAAA;AAAA,YAEzB,yBAAe,YAAA,GAAe;AAAA;AAAA,SACjC;AAAA,QAEC,SAAA,IAAa,SAAA,oBACZH,eAAA,CAAC,GAAA,EAAA,EAAE,WAAU,2CAAA,EAA4C,QAAA,EAAA;AAAA,UAAA,qCAAA;AAAA,UACnB,GAAA;AAAA,UACnC,UAAU,kBAAA;AAAmB,SAAA,EAChC;AAAA,OAAA,EAEJ,CAAA;AAAA,sBAGAA,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,2CAAA,EAA4C,QAAA,EAAA;AAAA,QAAA,4DAAA;AAAA,QACI,GAAA;AAAA,QAC1D,WAAA;AAAA,QAAY;AAAA,OAAA,EAEf;AAAA,KAAA,EACF,GACF,CAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AASO,SAAS,YAAA,CAAa;AAAA,EAC3B,OAAA,GAAU,QAAA;AAAA,EACV,SAAA,GAAY,KAAA;AAAA,EACZ,eAAA,GAAkB,KAAA;AAAA,EAClB,aAAA,GAAgB,KAAA;AAAA,EAChB,WAAA,GAAc,uCAAA;AAAA,EACd,UAAA,GAAa,eAAA;AAAA,EACb,SAAA,GAAY;AACd,CAAA,EAAsB;AACpB,EAAA,MAAM,SAASL,0BAAA,EAAU;AACzB,EAAA,MAAM,SAASC,gCAAA,EAAgB;AAC/B,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,OAAA,EAAS,cAAA;AAAA,IACT,KAAA,EAAO,YAAA;AAAA,IACP;AAAA,MACEC,2BAAA,EAAW;AACf,EAAA,MAAM,gBAAgB,OAAA,EAAS,MAAA;AAC/B,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,MAAA,CAAO,WAAW,CAAA;AAEjD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIH,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAIA,eAAS,EAAE,CAAA;AACnC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAEhD,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAuB;AACjD,IAAA,CAAA,CAAE,cAAA,EAAe;AAEjB,IAAA,IAAI,cAAA,IAAkB,kBAAkB,UAAA,EAAY;AAClD,MAAAU,YAAA,CAAM,MAAM,2DAA2D,CAAA;AACvE,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAClC,MAAAA,YAAA,CAAM,MAAM,oCAAoC,CAAA;AAChD,MAAA;AAAA,IACF;AAEA,IAAA,YAAA,CAAa,IAAI,CAAA;AAEjB,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,YAAA;AAAA,QACnB,MAAA;AAAA,QACA,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,IAAQ,KAAA,CAAA,EAAU;AAAA,QACjC,OAAA,EAAS,MAAM,MAAA,CAAO;AAAA,OACxB;AAEA,MAAA,IAAI,OAAO,OAAA,EAAS;AAElB,QAAAC,kCAAA,CAAkB,oBAAA,EAAsB,EAAE,IAAA,EAAM,QAAA,EAAU,CAAA;AAC1D,QAAAD,YAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,OAAA,IAAW,sCAAsC,CAAA;AACtE,QAAA,QAAA,CAAS,EAAE,CAAA;AACX,QAAA,OAAA,CAAQ,EAAE,CAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAAA,YAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW,yBAAyB,CAAA;AAAA,MACzD;AAAA,IACF,SAAS,MAAA,EAAQ;AACf,MAAAA,YAAA,CAAM,MAAM,sCAAsC,CAAA;AAAA,IACpD,CAAA,SAAE;AACA,MAAA,YAAA,CAAa,KAAK,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAW,OAAA,KAAY,QAAA;AAE7B,EAAA,IAAI,cAAA,IAAkB,CAAC,WAAA,EAAa;AAClC,IAAA,uBACEJ,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,eAAA,oBACCC,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBAEjED,eAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA;AAAA,QAAA,gCAAA;AAAA,wBACbC,cAAA,CAAC,UAAK,QAAA,EAAA,iBAAA,EAAe,CAAA;AAAA,QAAO;AAAA,OAAA,EAE5D;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,kBAAkB,cAAA,EAAgB;AACpC,IAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,eAAA,oBACCC,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBAEjEA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,wBAAA,EAAiB;AAAA,KAAA,EAChE,CAAA;AAAA,EAEJ;AAEA,EAAA,IAAI,cAAA,KAAmB,YAAA,IAAgB,aAAA,KAAkB,UAAA,CAAA,EAAa;AACpE,IAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,MAAA,eAAA,oBACCC,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,sBAEjEA,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,+BAAA,EAAgC,QAAA,EAAA,+CAAA,EAE7C;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACED,eAAA,CAAC,SAAI,SAAA,EACF,QAAA,EAAA;AAAA,IAAA,eAAA,oBACCC,cAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,oCAAA,EAAsC,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,oBAEjED,eAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,YAAA;AAAA,QACV,SAAA,EAAW,WAAW,YAAA,GAAe,qBAAA;AAAA,QAEpC,QAAA,EAAA;AAAA,UAAA,aAAA,oBACCA,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,GAAW,WAAW,QAAA,EACnC,QAAA,EAAA;AAAA,YAAA,SAAA,oBACCC,cAAA;AAAA,cAACM,sBAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,sBAAA;AAAA,gBACR,SAAA,EAAU,oBAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BAEFN,cAAA;AAAA,cAACO,sBAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAG,sBAAA;AAAA,gBACH,IAAA,EAAK,MAAA;AAAA,gBACL,WAAA,EAAY,WAAA;AAAA,gBACZ,KAAA,EAAO,IAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACvC,QAAA,EAAU,SAAA;AAAA,gBACV,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BAEFR,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,GAAW,WAAW,QAAA,EACnC,QAAA,EAAA;AAAA,YAAA,SAAA,oBACCC,cAAA;AAAA,cAACM,sBAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAQ,uBAAA;AAAA,gBACR,SAAA,EAAU,oBAAA;AAAA,gBACX,QAAA,EAAA;AAAA;AAAA,aAED;AAAA,4BAEFN,cAAA;AAAA,cAACO,sBAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAG,uBAAA;AAAA,gBACH,IAAA,EAAK,OAAA;AAAA,gBACL,WAAA,EAAY,kBAAA;AAAA,gBACZ,KAAA,EAAO,KAAA;AAAA,gBACP,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBACxC,QAAA,EAAU,SAAA;AAAA,gBACV,QAAA,EAAQ,IAAA;AAAA,gBACR,SAAA,EAAU;AAAA;AAAA;AACZ,WAAA,EACF,CAAA;AAAA,0BACAP,cAAA;AAAA,YAACE,uBAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,QAAA;AAAA,cACL,QAAA,EAAU,SAAA;AAAA,cACV,SAAA,EAAW,WAAW,mBAAA,GAAsB,QAAA;AAAA,cAE3C,sBAAY,YAAA,GAAe;AAAA;AAAA;AAC9B;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ","file":"chunk-JDXOXGOK.js","sourcesContent":["/**\n * Waitlist Components\n * Full-page and inline waitlist signup forms using GraphQL via WebSDKClient.\n *\n * @example\n * ```tsx\n * // Full-page waitlist\n * import { WaitlistPage } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistPage\n * productName=\"BigConsole\"\n * heroTitle=\"Join the Waitlist\"\n * heroSubtitle=\"Be among the first to try BigConsole\"\n * />\n *\n * // Inline waitlist form (for hero sections / footers)\n * import { WaitlistForm } from '@burdenoff/website-sdk/components/waitlist'\n *\n * <WaitlistForm variant=\"inline\" buttonText=\"Join Waitlist\" />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { zodResolver } from \"@hookform/resolvers/zod\";\nimport { useForm } from \"react-hook-form\";\nimport { toast } from \"sonner\";\nimport { z } from \"zod\";\n\nimport { trackWebsiteEvent } from \"../analytics/events\";\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { useProduct } from \"../product/product-provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\nimport { Input } from \"../ui/input\";\nimport { Label } from \"../ui/label\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\nexport interface WaitlistPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero subtitle */\n heroSubtitle?: string;\n /** Hero description */\n heroDescription?: string;\n /** Message shown on successful signup */\n successMessage?: string;\n /** Message shown on error */\n errorMessage?: string;\n /** Custom CSS class for container */\n className?: string;\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\nexport interface WaitlistFormProps {\n /** Layout variant */\n variant?: \"inline\" | \"stacked\";\n /** Show email label */\n showLabel?: boolean;\n /** Show description text */\n showDescription?: boolean;\n /** Whether to show the name field */\n showNameField?: boolean;\n /** Description text */\n description?: string;\n /** Button text */\n buttonText?: string;\n /** Custom CSS class */\n className?: string;\n}\n\ninterface RateLimitState {\n attempts: number;\n resetTime: number;\n}\n\n// ============================================================================\n// VALIDATION SCHEMAS\n// ============================================================================\n\nconst waitlistPageSchema = z.object({\n name: z.string().min(1, \"Name is required\"),\n email: z.string().email(\"Please enter a valid email address\"),\n company: z.string().optional(),\n reason: z.string().optional(),\n});\n\ntype WaitlistPageFormData = z.infer<typeof waitlistPageSchema>;\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst JOIN_WAITLIST_MUTATION = /* GraphQL */ `\n mutation JoinWaitlist($input: JoinWaitlistInput!) {\n joinWaitlist(input: $input) {\n id\n email\n name\n status\n createdAt\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function joinWaitlist(\n client: WebSDKClient,\n data: {\n email: string;\n name?: string;\n company?: string;\n reason?: string;\n },\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n joinWaitlist: {\n id: string;\n email: string;\n name: string | null;\n status: string;\n createdAt: string;\n };\n }>(JOIN_WAITLIST_MUTATION, {\n input: {\n email: data.email.trim().toLowerCase(),\n platformProductId: productId,\n name: data.name?.trim() || undefined,\n company: data.company?.trim() || undefined,\n reason: data.reason?.trim() || undefined,\n context: {\n source: \"website\",\n referrer: typeof window !== \"undefined\" ? window.location.href : \"\",\n timestamp: new Date().toISOString(),\n },\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to join waitlist\";\n if (errorMsg.toLowerCase().includes(\"already\")) {\n return {\n success: false,\n message: \"You are already on the waitlist!\",\n };\n }\n return { success: false, message: errorMsg };\n }\n\n return { success: true, message: \"You have been added to the waitlist!\" };\n } catch (error) {\n console.error(\"Waitlist signup error:\", error);\n return { success: false, message: \"Network error. Please try again.\" };\n }\n}\n\n// ============================================================================\n// RATE LIMITING (in-memory for SSR compatibility)\n// ============================================================================\n\nfunction useRateLimit(maxAttempts: number, windowMinutes: number) {\n const rateLimitRef = useRef<RateLimitState | null>(null);\n const [isLimited, setIsLimited] = useState(false);\n const [resetTime, setResetTime] = useState<Date | null>(null);\n\n function recordAttempt(): boolean {\n const now = Date.now();\n const state = rateLimitRef.current;\n\n // Reset if window expired\n if (state && now > state.resetTime) {\n rateLimitRef.current = null;\n }\n\n const current = rateLimitRef.current;\n\n if (!current) {\n rateLimitRef.current = {\n attempts: 1,\n resetTime: now + windowMinutes * 60 * 1000,\n };\n return false;\n }\n\n current.attempts += 1;\n\n if (current.attempts >= maxAttempts) {\n setIsLimited(true);\n setResetTime(new Date(current.resetTime));\n return true;\n }\n\n return false;\n }\n\n function checkLimit(): boolean {\n const state = rateLimitRef.current;\n if (!state) return false;\n if (Date.now() > state.resetTime) {\n rateLimitRef.current = null;\n setIsLimited(false);\n setResetTime(null);\n return false;\n }\n return state.attempts >= maxAttempts;\n }\n\n return { isLimited, resetTime, recordAttempt, checkLimit };\n}\n\n// ============================================================================\n// WAITLIST PAGE (Full-page component)\n// ============================================================================\n\nexport function WaitlistPage({\n productName,\n heroTitle = \"Join the Waitlist\",\n heroSubtitle = \"Be among the first to experience what's coming next\",\n heroDescription,\n successMessage = \"You have been added to the waitlist!\",\n errorMessage = \"Failed to join waitlist. Please try again.\",\n className,\n seo,\n}: WaitlistPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const displayName = productName ?? product?.name ?? config.productId;\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [isSubmitting, setIsSubmitting] = useState(false);\n const { isLimited, resetTime, recordAttempt, checkLimit } = useRateLimit(\n 3,\n 15,\n );\n\n const {\n register,\n handleSubmit,\n formState: { errors },\n reset,\n } = useForm<WaitlistPageFormData>({\n resolver: zodResolver(waitlistPageSchema),\n });\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted. Please update your integration configuration.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Loading…\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Fetching product status.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || !productStatus)) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n We can’t confirm waitlist availability right now. Please try again\n later.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is already available, show \"already available\" instead of waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"ACTIVE\" || productStatus === \"RELEASED\")\n ) {\n const appUrl = product?.appUrl || product?.website || \"#\";\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n {displayName} is now available!\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n Great news — {displayName} is open to everyone. Sign up or log in\n to get started.\n </p>\n <Button size=\"lg\" asChild>\n <a href={appUrl} target=\"_blank\" rel=\"noopener noreferrer\">\n Get Started\n </a>\n </Button>\n </div>\n </section>\n </div>\n );\n }\n\n // If product is DRAFT or COMING_SOON, don't show waitlist form\n if (\n canCheckStatus &&\n (productStatus === \"DRAFT\" || productStatus === \"COMING_SOON\")\n ) {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-8\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Coming Soon\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not yet accepting waitlist signups. Check back\n soon!\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n // Defensive: if backend introduces a new status we don't recognize, don't render a signup form.\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n return (\n <div className={className}>\n {seo && (\n <PageHead\n title={seo.title ?? \"\"}\n description={seo.description ?? \"\"}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n <section className=\"relative overflow-hidden py-24 lg:py-32\">\n <div className=\"relative max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 text-center space-y-6\">\n <h1 className=\"text-4xl font-bold tracking-tight sm:text-5xl text-foreground\">\n Waitlist Unavailable\n </h1>\n <p className=\"text-lg text-muted-foreground\">\n {displayName} is not accepting waitlist signups right now.\n </p>\n </div>\n </section>\n </div>\n );\n }\n\n const onSubmit = async (data: WaitlistPageFormData) => {\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (checkLimit()) {\n toast.error(\n `Too many attempts. Please try again after ${resetTime?.toLocaleTimeString()}`,\n );\n return;\n }\n\n setIsSubmitting(true);\n\n try {\n const result = await joinWaitlist(\n client,\n data,\n product?.id || config.productId,\n );\n\n if (result.success) {\n // Funnel fact for analytics; carries no email, name or free text.\n trackWebsiteEvent(\"waitlist.signed_up\", { form: \"page\" });\n toast.success(result.message ?? successMessage);\n reset();\n } else {\n toast.error(result.message ?? errorMessage);\n }\n\n recordAttempt();\n } catch (_error) {\n toast.error(errorMessage);\n } finally {\n setIsSubmitting(false);\n }\n };\n\n return (\n <>\n {seo && (\n <PageHead\n title={seo.title ?? `Join the Waitlist - ${displayName}`}\n description={seo.description ?? heroDescription ?? heroSubtitle}\n productName={displayName}\n keywords={seo.keywords}\n image={seo.image}\n url={seo.url}\n />\n )}\n\n <div className={className}>\n <div className=\"min-h-screen flex items-center justify-center px-4 py-12\">\n <div className=\"max-w-lg w-full space-y-8\">\n {/* Hero */}\n <div className=\"text-center\">\n <h1 className=\"text-4xl font-bold tracking-tight\">{heroTitle}</h1>\n <p className=\"mt-2 text-lg text-muted-foreground\">\n {heroSubtitle}\n </p>\n {heroDescription && (\n <p className=\"mt-4 text-sm text-muted-foreground\">\n {heroDescription}\n </p>\n )}\n </div>\n\n {/* Form */}\n <form onSubmit={handleSubmit(onSubmit)} className=\"space-y-5\">\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-name\">Name *</Label>\n <Input\n id=\"waitlist-name\"\n type=\"text\"\n placeholder=\"Your name\"\n disabled={isSubmitting || isLimited}\n {...register(\"name\")}\n />\n {errors.name && (\n <p className=\"text-sm text-destructive\">\n {errors.name.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-email\">Email *</Label>\n <Input\n id=\"waitlist-email\"\n type=\"email\"\n placeholder=\"you@example.com\"\n disabled={isSubmitting || isLimited}\n {...register(\"email\")}\n />\n {errors.email && (\n <p className=\"text-sm text-destructive\">\n {errors.email.message}\n </p>\n )}\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-company\">Company</Label>\n <Input\n id=\"waitlist-company\"\n type=\"text\"\n placeholder=\"Your company (optional)\"\n disabled={isSubmitting || isLimited}\n {...register(\"company\")}\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"waitlist-reason\">Why are you interested?</Label>\n <Textarea\n id=\"waitlist-reason\"\n placeholder=\"Tell us what excites you about the product (optional)\"\n rows={3}\n disabled={isSubmitting || isLimited}\n className=\"resize-y\"\n {...register(\"reason\")}\n />\n </div>\n\n <Button\n type=\"submit\"\n className=\"w-full\"\n disabled={isSubmitting || isLimited}\n >\n {isSubmitting ? \"Joining...\" : \"Join Waitlist\"}\n </Button>\n\n {isLimited && resetTime && (\n <p className=\"text-sm text-muted-foreground text-center\">\n Rate limit reached. Try again after{\" \"}\n {resetTime.toLocaleTimeString()}\n </p>\n )}\n </form>\n\n {/* Privacy Notice */}\n <p className=\"text-xs text-muted-foreground text-center\">\n By joining the waitlist, you agree to receive updates from{\" \"}\n {displayName}. We respect your privacy and will never share your\n information.\n </p>\n </div>\n </div>\n </div>\n </>\n );\n}\n\n// ============================================================================\n// WAITLIST FORM (Inline Component)\n// ============================================================================\n\n/**\n * Lightweight inline waitlist signup form for hero sections, footers, etc.\n */\nexport function WaitlistForm({\n variant = \"inline\",\n showLabel = false,\n showDescription = false,\n showNameField = false,\n description = \"Join our waitlist to get early access\",\n buttonText = \"Join Waitlist\",\n className = \"\",\n}: WaitlistFormProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const {\n product,\n loading: productLoading,\n error: productError,\n hasProvider,\n } = useProduct();\n const productStatus = product?.status;\n const canCheckStatus = Boolean(config.productSlug);\n\n const [email, setEmail] = useState(\"\");\n const [name, setName] = useState(\"\");\n const [isLoading, setIsLoading] = useState(false);\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n if (canCheckStatus && productStatus !== \"WAITLIST\") {\n toast.error(\"This product is not accepting waitlist signups right now.\");\n return;\n }\n\n if (!email || !email.includes(\"@\")) {\n toast.error(\"Please enter a valid email address\");\n return;\n }\n\n setIsLoading(true);\n\n try {\n const result = await joinWaitlist(\n client,\n { email, name: name || undefined },\n product?.id || config.productId,\n );\n\n if (result.success) {\n // Funnel fact for analytics; carries no email, name or free text.\n trackWebsiteEvent(\"waitlist.signed_up\", { form: \"inline\" });\n toast.success(result.message ?? \"You have been added to the waitlist!\");\n setEmail(\"\");\n setName(\"\");\n } else {\n toast.error(result.message ?? \"Failed to join waitlist\");\n }\n } catch (_error) {\n toast.error(\"An error occurred. Please try again.\");\n } finally {\n setIsLoading(false);\n }\n };\n\n const isInline = variant === \"inline\";\n\n if (canCheckStatus && !hasProvider) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Product status checks require <code>ProductProvider</code> to be\n mounted.\n </p>\n </div>\n );\n }\n\n if (canCheckStatus && productLoading) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">Loading waitlist…</p>\n </div>\n );\n }\n\n if (canCheckStatus && (productError || productStatus !== \"WAITLIST\")) {\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <p className=\"text-sm text-muted-foreground\">\n Waitlist signups are not available right now.\n </p>\n </div>\n );\n }\n\n return (\n <div className={className}>\n {showDescription && (\n <p className=\"text-sm text-muted-foreground mb-3\">{description}</p>\n )}\n <form\n onSubmit={handleSubmit}\n className={isInline ? \"flex gap-2\" : \"flex flex-col gap-2\"}\n >\n {showNameField && (\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-name\"\n className=\"text-sm mb-1 block\"\n >\n Name\n </Label>\n )}\n <Input\n id=\"waitlist-inline-name\"\n type=\"text\"\n placeholder=\"Your name\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n disabled={isLoading}\n className=\"w-full\"\n />\n </div>\n )}\n <div className={isInline ? \"flex-1\" : \"w-full\"}>\n {showLabel && (\n <Label\n htmlFor=\"waitlist-inline-email\"\n className=\"text-sm mb-1 block\"\n >\n Email\n </Label>\n )}\n <Input\n id=\"waitlist-inline-email\"\n type=\"email\"\n placeholder=\"Enter your email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n disabled={isLoading}\n required\n className=\"w-full\"\n />\n </div>\n <Button\n type=\"submit\"\n disabled={isLoading}\n className={isInline ? \"whitespace-nowrap\" : \"w-full\"}\n >\n {isLoading ? \"Joining...\" : buttonText}\n </Button>\n </form>\n </div>\n );\n}\n"]}
|