@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 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-FJWS7BKT.mjs"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-FJZJDUOR.mjs"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { productSlugVariants } from './chunk-KZANIV3S.mjs';
|
|
2
|
+
import { useWebSDK, useWebSDKConfig } from './chunk-5JRJ57CL.mjs';
|
|
3
|
+
import { createContext, useState, useCallback, useLayoutEffect, useMemo, useContext } from 'react';
|
|
4
|
+
import { jsx } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var PRODUCT_FIELDS_BASE = `
|
|
7
|
+
id
|
|
8
|
+
name
|
|
9
|
+
slug
|
|
10
|
+
description
|
|
11
|
+
status
|
|
12
|
+
logoUrl
|
|
13
|
+
website
|
|
14
|
+
appUrl
|
|
15
|
+
docsUrl
|
|
16
|
+
contactEmail
|
|
17
|
+
supportEmail
|
|
18
|
+
contactPhone
|
|
19
|
+
contactAddress
|
|
20
|
+
seoTitle
|
|
21
|
+
seoDescription
|
|
22
|
+
seoKeywords
|
|
23
|
+
ogImage
|
|
24
|
+
socialLinks
|
|
25
|
+
recaptchaSiteKey
|
|
26
|
+
rybbitSiteId
|
|
27
|
+
notificationEmail
|
|
28
|
+
metadata
|
|
29
|
+
`;
|
|
30
|
+
var PUBLIC_PRODUCT_QUERY = `
|
|
31
|
+
query PublicProduct($slug: String!) {
|
|
32
|
+
publicProduct(slug: $slug) {
|
|
33
|
+
${PRODUCT_FIELDS_BASE}
|
|
34
|
+
resourceLinks
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
var PUBLIC_PRODUCT_QUERY_FALLBACK = `
|
|
39
|
+
query PublicProductFallback($slug: String!) {
|
|
40
|
+
publicProduct(slug: $slug) {
|
|
41
|
+
${PRODUCT_FIELDS_BASE}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
`;
|
|
45
|
+
var ProductContext = createContext({
|
|
46
|
+
product: null,
|
|
47
|
+
loading: true,
|
|
48
|
+
error: null,
|
|
49
|
+
hasProvider: false,
|
|
50
|
+
refetch: () => {
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
async function queryPublicProduct(client, slug) {
|
|
54
|
+
const result = await client.query(
|
|
55
|
+
PUBLIC_PRODUCT_QUERY,
|
|
56
|
+
{ slug }
|
|
57
|
+
);
|
|
58
|
+
const schemaMissingResourceLinks = result.errors?.some(
|
|
59
|
+
(e) => /Cannot query field ["']?resourceLinks["']?/i.test(e?.message ?? "")
|
|
60
|
+
);
|
|
61
|
+
if (!schemaMissingResourceLinks) return result;
|
|
62
|
+
return client.query(
|
|
63
|
+
PUBLIC_PRODUCT_QUERY_FALLBACK,
|
|
64
|
+
{ slug }
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
async function fetchPublicProduct(client, slug) {
|
|
68
|
+
for (const candidate of productSlugVariants(slug)) {
|
|
69
|
+
const result = await queryPublicProduct(client, candidate);
|
|
70
|
+
if (result.errors?.length) {
|
|
71
|
+
return {
|
|
72
|
+
product: null,
|
|
73
|
+
error: result.errors[0]?.message ?? "Unknown error"
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (result.data?.publicProduct) {
|
|
77
|
+
return { product: result.data.publicProduct, error: null };
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return { product: null, error: null };
|
|
81
|
+
}
|
|
82
|
+
function ProductProvider({ children, fallback }) {
|
|
83
|
+
const client = useWebSDK();
|
|
84
|
+
const config = useWebSDKConfig();
|
|
85
|
+
const [product, setProduct] = useState(
|
|
86
|
+
fallback ? fallback : null
|
|
87
|
+
);
|
|
88
|
+
const [loading, setLoading] = useState(true);
|
|
89
|
+
const [error, setError] = useState(null);
|
|
90
|
+
const fetchProduct = useCallback(async () => {
|
|
91
|
+
if (!config.productSlug) {
|
|
92
|
+
setLoading(false);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
setLoading(true);
|
|
96
|
+
setError(null);
|
|
97
|
+
try {
|
|
98
|
+
const outcome = await fetchPublicProduct(client, config.productSlug);
|
|
99
|
+
if (outcome.error) {
|
|
100
|
+
setError(outcome.error);
|
|
101
|
+
} else if (outcome.product) {
|
|
102
|
+
setProduct(outcome.product);
|
|
103
|
+
}
|
|
104
|
+
} catch (err) {
|
|
105
|
+
setError(err instanceof Error ? err.message : "Failed to fetch product");
|
|
106
|
+
} finally {
|
|
107
|
+
setLoading(false);
|
|
108
|
+
}
|
|
109
|
+
}, [client, config.productSlug]);
|
|
110
|
+
useLayoutEffect(() => {
|
|
111
|
+
fetchProduct();
|
|
112
|
+
}, [fetchProduct]);
|
|
113
|
+
const value = useMemo(
|
|
114
|
+
() => ({
|
|
115
|
+
product,
|
|
116
|
+
loading,
|
|
117
|
+
error,
|
|
118
|
+
hasProvider: true,
|
|
119
|
+
refetch: fetchProduct
|
|
120
|
+
}),
|
|
121
|
+
[product, loading, error, fetchProduct]
|
|
122
|
+
);
|
|
123
|
+
return /* @__PURE__ */ jsx(ProductContext.Provider, { value, children });
|
|
124
|
+
}
|
|
125
|
+
function useProduct() {
|
|
126
|
+
return useContext(ProductContext);
|
|
127
|
+
}
|
|
128
|
+
function useProductConfig() {
|
|
129
|
+
const { product } = useProduct();
|
|
130
|
+
const config = useWebSDKConfig();
|
|
131
|
+
return {
|
|
132
|
+
// Prefer product-level config, fall back to SDK config
|
|
133
|
+
recaptchaSiteKey: product?.recaptchaSiteKey ?? config.recaptchaSiteKey ?? null,
|
|
134
|
+
rybbitSiteId: product?.rybbitSiteId ?? config.rybbitSiteId ?? null,
|
|
135
|
+
contactEmail: product?.contactEmail ?? null,
|
|
136
|
+
supportEmail: product?.supportEmail ?? null,
|
|
137
|
+
notificationEmail: product?.notificationEmail ?? product?.contactEmail ?? null,
|
|
138
|
+
productName: product?.name ?? null,
|
|
139
|
+
logoUrl: product?.logoUrl ?? null
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export { ProductProvider, fetchPublicProduct, useProduct, useProductConfig };
|
|
144
|
+
//# sourceMappingURL=chunk-GCFLCO2Z.mjs.map
|
|
145
|
+
//# sourceMappingURL=chunk-GCFLCO2Z.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/product/product-provider.tsx"],"names":[],"mappings":"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","file":"chunk-GCFLCO2Z.mjs","sourcesContent":["/**\n * Product Provider\n *\n * React context and hooks for accessing product metadata from the global tenant service.\n * Fetches product info (name, logo, SEO, contact, reCAPTCHA key, etc.) on mount\n * and provides it to all child components.\n */\n\"use client\";\n\nimport {\n createContext,\n useContext,\n useState,\n useLayoutEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { productSlugVariants } from \"../utils/product-slug\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ProductData {\n id: string;\n name: string;\n slug: string;\n description?: string | null;\n status: string;\n logoUrl?: string | null;\n website?: string | null;\n appUrl?: string | null;\n docsUrl?: string | null;\n contactEmail?: string | null;\n supportEmail?: string | null;\n contactPhone?: string | null;\n contactAddress?: string | null;\n seoTitle?: string | null;\n seoDescription?: string | null;\n seoKeywords?: string | null;\n ogImage?: string | null;\n socialLinks?: Record<string, string> | null;\n /**\n * Resource links for the website footer \"Resources\" column\n * (JSON: { docs, community, careers, team, companies, ... }).\n * Same shape as socialLinks. Free-form keys; the ResourceLinks\n * component renders known keys and silently ignores the rest.\n * Backed by Product.resourceLinks on the backend (global-tenant-svc).\n */\n resourceLinks?: Record<string, string> | null;\n recaptchaSiteKey?: string | null;\n rybbitSiteId?: string | null;\n notificationEmail?: string | null;\n metadata?: Record<string, unknown> | null;\n}\n\nexport interface ProductProviderProps {\n /** Child components */\n children: ReactNode;\n /** Optional fallback product data (used while loading) */\n fallback?: Partial<ProductData>;\n}\n\n// ============================================================================\n// GraphQL Query\n// ============================================================================\n\n/**\n * Body of fields requested for every product fetch — shared by the primary\n * query and the legacy-backend fallback below. Kept as a string fragment\n * (not a real GraphQL `fragment` block) so we can append/strip\n * `resourceLinks` without touching anything else.\n */\nconst PRODUCT_FIELDS_BASE = `\n id\n name\n slug\n description\n status\n logoUrl\n website\n appUrl\n docsUrl\n contactEmail\n supportEmail\n contactPhone\n contactAddress\n seoTitle\n seoDescription\n seoKeywords\n ogImage\n socialLinks\n recaptchaSiteKey\n rybbitSiteId\n notificationEmail\n metadata\n`;\n\n/**\n * Primary query — includes the recently-added `resourceLinks` field.\n * Backends that have run the corresponding `global-tenant-svc` migration\n * (PR #64) expose this field; older ones don't, in which case\n * GraphQL validation rejects the whole query with\n * `Cannot query field \"resourceLinks\" on type \"PublicProduct\"`. The fetch\n * helper detects that specific error and transparently retries the\n * fallback below, so the SDK works on both pre- and post-migration\n * deployments without consumer-side gating.\n */\nconst PUBLIC_PRODUCT_QUERY = `\n query PublicProduct($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n resourceLinks\n }\n }\n`;\n\n/**\n * Fallback query for older backend deployments. Identical to the primary\n * minus `resourceLinks`. Consumers see `product.resourceLinks === undefined`\n * and any consumer (e.g. `<ResourceLinks/>`) falls through to prop / default\n * resolution paths.\n */\nconst PUBLIC_PRODUCT_QUERY_FALLBACK = `\n query PublicProductFallback($slug: String!) {\n publicProduct(slug: $slug) {\n ${PRODUCT_FIELDS_BASE}\n }\n }\n`;\n\n// ============================================================================\n// Context\n// ============================================================================\n\ninterface ProductContextValue {\n product: ProductData | null;\n loading: boolean;\n error: string | null;\n hasProvider: boolean;\n refetch: () => void;\n}\n\nconst ProductContext = createContext<ProductContextValue>({\n product: null,\n loading: true,\n error: null,\n hasProvider: false,\n refetch: () => {},\n});\n\n// ============================================================================\n// Provider\n// ============================================================================\n\n/** Result of {@link fetchPublicProduct}. */\nexport interface PublicProductFetchResult {\n product: ProductData | null;\n error: string | null;\n}\n\nasync function queryPublicProduct(\n client: Pick<WebSDKClient, \"query\">,\n slug: string,\n) {\n const result = await client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY,\n { slug },\n );\n\n // Backwards-compat fallback: if the backend's `publicProduct` schema\n // doesn't yet expose `resourceLinks` (deployed before\n // `global-tenant-svc` PR #64), the primary query fails validation\n // with a \"Cannot query field …\" error and `result.data` is null.\n // Retry the fallback query that omits `resourceLinks`; consumers\n // gracefully see `product.resourceLinks === undefined` and fall\n // through their own resolution paths.\n const schemaMissingResourceLinks = result.errors?.some((e) =>\n /Cannot query field [\"']?resourceLinks[\"']?/i.test(e?.message ?? \"\"),\n );\n if (!schemaMissingResourceLinks) return result;\n return client.query<{ publicProduct: ProductData | null }>(\n PUBLIC_PRODUCT_QUERY_FALLBACK,\n { slug },\n );\n}\n\n/**\n * Fetch a product's public metadata by slug.\n *\n * A renamed product (`botlit` → `botmanor`) is looked up under the configured\n * slug first, then under its twin, so a site keeps resolving its product on\n * both sides of the tenant-service slug migration. The first error stops the\n * lookup; \"not found\" under every spelling returns `{ product: null, error: null }`.\n */\nexport async function fetchPublicProduct(\n client: Pick<WebSDKClient, \"query\">,\n slug: string,\n): Promise<PublicProductFetchResult> {\n for (const candidate of productSlugVariants(slug)) {\n const result = await queryPublicProduct(client, candidate);\n if (result.errors?.length) {\n return {\n product: null,\n error: result.errors[0]?.message ?? \"Unknown error\",\n };\n }\n if (result.data?.publicProduct) {\n return { product: result.data.publicProduct, error: null };\n }\n }\n return { product: null, error: null };\n}\n\n/**\n * ProductProvider fetches and provides product metadata to child components.\n * Uses the product slug from WebSDKConfig to fetch from the public API.\n *\n * @example\n * ```tsx\n * <WebSDKProvider config={sdkConfig}>\n * <ProductProvider>\n * <App />\n * </ProductProvider>\n * </WebSDKProvider>\n * ```\n */\nexport function ProductProvider({ children, fallback }: ProductProviderProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const [product, setProduct] = useState<ProductData | null>(\n fallback ? (fallback as ProductData) : null,\n );\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const fetchProduct = useCallback(async () => {\n if (!config.productSlug) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const outcome = await fetchPublicProduct(client, config.productSlug);\n if (outcome.error) {\n setError(outcome.error);\n } else if (outcome.product) {\n setProduct(outcome.product);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Failed to fetch product\");\n } finally {\n setLoading(false);\n }\n }, [client, config.productSlug]);\n\n // Use useLayoutEffect for earliest possible fetch after commit (before paint).\n // Runs when slug or client changes. Client-side query cache + dedup ensures\n // no duplicate network requests even if React StrictMode fires this twice.\n useLayoutEffect(() => {\n fetchProduct();\n }, [fetchProduct]);\n\n const value = useMemo(\n () => ({\n product,\n loading,\n error,\n hasProvider: true,\n refetch: fetchProduct,\n }),\n [product, loading, error, fetchProduct],\n );\n\n return (\n <ProductContext.Provider value={value}>{children}</ProductContext.Provider>\n );\n}\n\n// ============================================================================\n// Hooks\n// ============================================================================\n\n/**\n * Hook to access the current product data.\n *\n * @example\n * ```tsx\n * const { product, loading } = useProduct();\n * if (loading) return <Loading />;\n * return <h1>{product?.name}</h1>;\n * ```\n */\nexport function useProduct(): ProductContextValue {\n return useContext(ProductContext);\n}\n\n/**\n * Hook to get product-specific configuration.\n * Merges SDK config with fetched product data.\n * Useful for getting reCAPTCHA keys, analytics IDs, etc.\n *\n * @example\n * ```tsx\n * const { recaptchaSiteKey, rybbitSiteId } = useProductConfig();\n * ```\n */\nexport function useProductConfig(): {\n recaptchaSiteKey: string | null;\n rybbitSiteId: string | null;\n contactEmail: string | null;\n supportEmail: string | null;\n notificationEmail: string | null;\n productName: string | null;\n logoUrl: string | null;\n} {\n const { product } = useProduct();\n const config = useWebSDKConfig();\n\n return {\n // Prefer product-level config, fall back to SDK config\n recaptchaSiteKey:\n product?.recaptchaSiteKey ?? config.recaptchaSiteKey ?? null,\n rybbitSiteId: product?.rybbitSiteId ?? config.rybbitSiteId ?? null,\n contactEmail: product?.contactEmail ?? null,\n supportEmail: product?.supportEmail ?? null,\n notificationEmail:\n product?.notificationEmail ?? product?.contactEmail ?? null,\n productName: product?.name ?? null,\n logoUrl: product?.logoUrl ?? null,\n };\n}\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var ReactMarkdown = require('react-markdown');
|
|
4
|
+
var rehypeSanitize = require('rehype-sanitize');
|
|
5
|
+
var remarkGfm = require('remark-gfm');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
+
|
|
10
|
+
var ReactMarkdown__default = /*#__PURE__*/_interopDefault(ReactMarkdown);
|
|
11
|
+
var rehypeSanitize__default = /*#__PURE__*/_interopDefault(rehypeSanitize);
|
|
12
|
+
var remarkGfm__default = /*#__PURE__*/_interopDefault(remarkGfm);
|
|
13
|
+
|
|
14
|
+
function MarkdownLink({
|
|
15
|
+
href,
|
|
16
|
+
children,
|
|
17
|
+
// react-markdown passes the hast node to every override; it is not a DOM attribute.
|
|
18
|
+
node: _node,
|
|
19
|
+
...props
|
|
20
|
+
}) {
|
|
21
|
+
const isExternal = typeof href === "string" && (href.startsWith("http://") || href.startsWith("https://"));
|
|
22
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
23
|
+
"a",
|
|
24
|
+
{
|
|
25
|
+
href,
|
|
26
|
+
...props,
|
|
27
|
+
...isExternal ? { target: "_blank", rel: "noopener noreferrer" } : { rel: "noopener noreferrer" },
|
|
28
|
+
children
|
|
29
|
+
}
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
var defaultComponents = {
|
|
33
|
+
a: MarkdownLink
|
|
34
|
+
};
|
|
35
|
+
function Markdown({
|
|
36
|
+
children,
|
|
37
|
+
className,
|
|
38
|
+
inline,
|
|
39
|
+
components,
|
|
40
|
+
rehypePlugins
|
|
41
|
+
}) {
|
|
42
|
+
const content = /* @__PURE__ */ jsxRuntime.jsx(
|
|
43
|
+
ReactMarkdown__default.default,
|
|
44
|
+
{
|
|
45
|
+
remarkPlugins: [remarkGfm__default.default],
|
|
46
|
+
rehypePlugins: [rehypeSanitize__default.default, ...rehypePlugins ?? []],
|
|
47
|
+
components: { ...defaultComponents, ...components },
|
|
48
|
+
...inline ? { disallowedElements: ["p"], unwrapDisallowed: true } : {},
|
|
49
|
+
children
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
if (inline) {
|
|
53
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className, children: content });
|
|
54
|
+
}
|
|
55
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className, children: content });
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
exports.Markdown = Markdown;
|
|
59
|
+
exports.MarkdownLink = MarkdownLink;
|
|
60
|
+
//# sourceMappingURL=chunk-GEXC4LRP.js.map
|
|
61
|
+
//# sourceMappingURL=chunk-GEXC4LRP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/content/Markdown.tsx"],"names":["jsx","ReactMarkdown","remarkGfm","rehypeSanitize"],"mappings":";;;;;;;;;;;;;AA8BO,SAAS,YAAA,CAAa;AAAA,EAC3B,IAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,IAAA,EAAM,KAAA;AAAA,EACN,GAAG;AACL,CAAA,EAAqC;AACnC,EAAA,MAAM,UAAA,GACJ,OAAO,IAAA,KAAS,QAAA,KACf,IAAA,CAAK,WAAW,SAAS,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,UAAU,CAAA,CAAA;AAC3D,EAAA,uBACEA,cAAA;AAAA,IAAC,GAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACC,GAAG,KAAA;AAAA,MACH,GAAI,UAAA,GACD,EAAE,MAAA,EAAQ,QAAA,EAAU,KAAK,qBAAA,EAAsB,GAC/C,EAAE,GAAA,EAAK,qBAAA,EAAsB;AAAA,MAEhC;AAAA;AAAA,GACH;AAEJ;AAEA,IAAM,iBAAA,GAAgC;AAAA,EACpC,CAAA,EAAG;AACL,CAAA;AAUO,SAAS,QAAA,CAAS;AAAA,EACvB,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,OAAA,mBACJA,cAAA;AAAA,IAACC,8BAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAe,CAACC,0BAAS,CAAA;AAAA,MACzB,eAAe,CAACC,+BAAA,EAAgB,GAAI,aAAA,IAAiB,EAAG,CAAA;AAAA,MACxD,UAAA,EAAY,EAAE,GAAG,iBAAA,EAAmB,GAAG,UAAA,EAAW;AAAA,MACjD,GAAI,MAAA,GAAS,EAAE,kBAAA,EAAoB,CAAC,GAAG,CAAA,EAAG,gBAAA,EAAkB,IAAA,EAAK,GAAI,EAAC;AAAA,MAEtE;AAAA;AAAA,GACH;AAGF,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,uBAAOH,cAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAuB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAAA,EAC9C;AAEA,EAAA,uBAAOA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAuB,QAAA,EAAA,OAAA,EAAQ,CAAA;AAC7C","file":"chunk-GEXC4LRP.js","sourcesContent":["import type { ComponentProps, ReactNode } from \"react\";\n\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeSanitize from \"rehype-sanitize\";\nimport remarkGfm from \"remark-gfm\";\n\nimport type { Components, ExtraProps, Options } from \"react-markdown\";\n\nexport interface MarkdownProps {\n /** Markdown source to render. */\n children: string;\n /** Additional classes for the wrapper element. */\n className?: string;\n /** Render without a wrapping block element, suitable for inline content. */\n inline?: boolean;\n /** Optional react-markdown component overrides. */\n components?: Components;\n /**\n * Extra rehype plugins. They run AFTER `rehype-sanitize`, on the already-safe tree, so they\n * are for annotating nodes an override then reads — never for adding markup, because\n * nothing sanitises what they insert.\n */\n rehypePlugins?: Options[\"rehypePlugins\"];\n}\n\n/**\n * The default markdown link: external links open in a new tab, every link gets safe `rel`\n * attributes. Exported so a caller overriding `a` (to add context around links, say) can\n * still render the same element.\n */\nexport function MarkdownLink({\n href,\n children,\n // react-markdown passes the hast node to every override; it is not a DOM attribute.\n node: _node,\n ...props\n}: ComponentProps<\"a\"> & ExtraProps) {\n const isExternal =\n typeof href === \"string\" &&\n (href.startsWith(\"http://\") || href.startsWith(\"https://\"));\n return (\n <a\n href={href}\n {...props}\n {...(isExternal\n ? { target: \"_blank\", rel: \"noopener noreferrer\" }\n : { rel: \"noopener noreferrer\" })}\n >\n {children}\n </a>\n );\n}\n\nconst defaultComponents: Components = {\n a: MarkdownLink,\n};\n\n/**\n * Shared markdown renderer for website content.\n *\n * - Uses `react-markdown` for standards-compliant parsing.\n * - Enables GitHub Flavored Markdown (tables, task lists, strikethrough, autolinks).\n * - Sanitizes HTML via `rehype-sanitize` so raw markup in markdown is stripped.\n * - External links open in a new tab with safe rel attributes.\n */\nexport function Markdown({\n children,\n className,\n inline,\n components,\n rehypePlugins,\n}: MarkdownProps): ReactNode {\n const content = (\n <ReactMarkdown\n remarkPlugins={[remarkGfm]}\n rehypePlugins={[rehypeSanitize, ...(rehypePlugins ?? [])]}\n components={{ ...defaultComponents, ...components }}\n {...(inline ? { disallowedElements: [\"p\"], unwrapDisallowed: true } : {})}\n >\n {children}\n </ReactMarkdown>\n );\n\n if (inline) {\n return <span className={className}>{content}</span>;\n }\n\n return <div className={className}>{content}</div>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-GTRAXQGC.mjs"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkUXWT7G77_js = require('./chunk-UXWT7G77.js');
|
|
4
|
+
var chunkUQ2HALUD_js = require('./chunk-UQ2HALUD.js');
|
|
5
|
+
var chunkJXLSTVBK_js = require('./chunk-JXLSTVBK.js');
|
|
6
|
+
var react = require('react');
|
|
7
|
+
var sonner = require('sonner');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
|
|
10
|
+
var UNSUBSCRIBE_MUTATION = (
|
|
11
|
+
/* GraphQL */
|
|
12
|
+
`
|
|
13
|
+
mutation PublicUnsubscribeByToken($token: String!) {
|
|
14
|
+
publicUnsubscribeByToken(token: $token)
|
|
15
|
+
}
|
|
16
|
+
`
|
|
17
|
+
);
|
|
18
|
+
function UnsubscribePage({
|
|
19
|
+
productName,
|
|
20
|
+
className = "",
|
|
21
|
+
seoTitle = "Unsubscribe from Newsletter",
|
|
22
|
+
seoDescription = "Manage your newsletter subscription preferences.",
|
|
23
|
+
resubscribeUrl,
|
|
24
|
+
successMessage = "You have been successfully unsubscribed from our newsletter.",
|
|
25
|
+
errorMessage = "Something went wrong. Please try again or contact support."
|
|
26
|
+
}) {
|
|
27
|
+
const client = chunkJXLSTVBK_js.useWebSDK();
|
|
28
|
+
const config = chunkJXLSTVBK_js.useWebSDKConfig();
|
|
29
|
+
const displayName = productName ?? config.productId;
|
|
30
|
+
const [state, setState] = react.useState("loading");
|
|
31
|
+
const [error, setError] = react.useState("");
|
|
32
|
+
const [token, setToken] = react.useState("");
|
|
33
|
+
const [successCopy, setSuccessCopy] = react.useState(successMessage);
|
|
34
|
+
react.useEffect(() => {
|
|
35
|
+
const params = new URLSearchParams(window.location.search);
|
|
36
|
+
const t = params.get("token");
|
|
37
|
+
if (t) {
|
|
38
|
+
setToken(t);
|
|
39
|
+
setState("confirming");
|
|
40
|
+
} else {
|
|
41
|
+
setState("invalid");
|
|
42
|
+
}
|
|
43
|
+
}, []);
|
|
44
|
+
const handleUnsubscribe = async () => {
|
|
45
|
+
if (!token) return;
|
|
46
|
+
setState("processing");
|
|
47
|
+
try {
|
|
48
|
+
const result = await client.mutate(UNSUBSCRIBE_MUTATION, { token });
|
|
49
|
+
if (result.errors?.length) {
|
|
50
|
+
const errMsg = result.errors[0]?.message ?? errorMessage;
|
|
51
|
+
const code = result.errors[0]?.extensions?.code;
|
|
52
|
+
if (code === "ALREADY_UNSUBSCRIBED") {
|
|
53
|
+
sonner.toast.info("You are already unsubscribed from this newsletter.");
|
|
54
|
+
setSuccessCopy("You were already unsubscribed from this newsletter.");
|
|
55
|
+
setState("success");
|
|
56
|
+
return;
|
|
57
|
+
} else if (code === "UNSUBSCRIBE_TOKEN_EXPIRED") {
|
|
58
|
+
setError(
|
|
59
|
+
"This unsubscribe link has expired. Please contact support."
|
|
60
|
+
);
|
|
61
|
+
} else if (code === "INVALID_UNSUBSCRIBE_TOKEN") {
|
|
62
|
+
setState("invalid");
|
|
63
|
+
return;
|
|
64
|
+
} else {
|
|
65
|
+
setError(errMsg);
|
|
66
|
+
}
|
|
67
|
+
setState("error");
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (result.data?.publicUnsubscribeByToken) {
|
|
71
|
+
setSuccessCopy(successMessage);
|
|
72
|
+
setState("success");
|
|
73
|
+
sonner.toast.success("Successfully unsubscribed");
|
|
74
|
+
} else {
|
|
75
|
+
setError(errorMessage);
|
|
76
|
+
setState("error");
|
|
77
|
+
}
|
|
78
|
+
} catch {
|
|
79
|
+
setError(errorMessage);
|
|
80
|
+
setState("error");
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
84
|
+
"div",
|
|
85
|
+
{
|
|
86
|
+
className,
|
|
87
|
+
style: {
|
|
88
|
+
minHeight: "60vh",
|
|
89
|
+
display: "flex",
|
|
90
|
+
alignItems: "center",
|
|
91
|
+
justifyContent: "center",
|
|
92
|
+
padding: "6rem 1rem 4rem"
|
|
93
|
+
},
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkUXWT7G77_js.PageHead, { title: seoTitle, description: seoDescription }),
|
|
96
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-md w-full text-center", children: [
|
|
97
|
+
state === "loading" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "animate-pulse", children: [
|
|
98
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-8 w-48 bg-muted rounded mx-auto mb-4" }),
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-4 w-64 bg-muted rounded mx-auto" })
|
|
100
|
+
] }),
|
|
101
|
+
state === "confirming" && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
102
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 h-16 mx-auto mb-6 rounded-full bg-amber-100 dark:bg-amber-900/30 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
103
|
+
"svg",
|
|
104
|
+
{
|
|
105
|
+
className: "w-8 h-8 text-amber-600 dark:text-amber-400",
|
|
106
|
+
fill: "none",
|
|
107
|
+
viewBox: "0 0 24 24",
|
|
108
|
+
stroke: "currentColor",
|
|
109
|
+
strokeWidth: 2,
|
|
110
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
+
"path",
|
|
112
|
+
{
|
|
113
|
+
strokeLinecap: "round",
|
|
114
|
+
strokeLinejoin: "round",
|
|
115
|
+
d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
) }),
|
|
120
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground mb-3", children: "Unsubscribe from Newsletter" }),
|
|
121
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-muted-foreground mb-8", children: [
|
|
122
|
+
"Are you sure you want to unsubscribe from ",
|
|
123
|
+
displayName,
|
|
124
|
+
" ",
|
|
125
|
+
"newsletter? You will no longer receive updates and news from us."
|
|
126
|
+
] }),
|
|
127
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row gap-3 justify-center", children: [
|
|
128
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
129
|
+
chunkUQ2HALUD_js.Button,
|
|
130
|
+
{
|
|
131
|
+
onClick: handleUnsubscribe,
|
|
132
|
+
variant: "destructive",
|
|
133
|
+
className: "px-8",
|
|
134
|
+
children: "Yes, Unsubscribe"
|
|
135
|
+
}
|
|
136
|
+
),
|
|
137
|
+
resubscribeUrl && /* @__PURE__ */ jsxRuntime.jsx(
|
|
138
|
+
chunkUQ2HALUD_js.Button,
|
|
139
|
+
{
|
|
140
|
+
variant: "outline",
|
|
141
|
+
onClick: () => {
|
|
142
|
+
window.location.href = resubscribeUrl;
|
|
143
|
+
},
|
|
144
|
+
className: "px-8",
|
|
145
|
+
children: "Cancel"
|
|
146
|
+
}
|
|
147
|
+
)
|
|
148
|
+
] })
|
|
149
|
+
] }),
|
|
150
|
+
state === "processing" && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
151
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 h-16 mx-auto mb-6 rounded-full bg-muted flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
152
|
+
"svg",
|
|
153
|
+
{
|
|
154
|
+
className: "w-8 h-8 text-muted-foreground animate-spin",
|
|
155
|
+
fill: "none",
|
|
156
|
+
viewBox: "0 0 24 24",
|
|
157
|
+
children: [
|
|
158
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
159
|
+
"circle",
|
|
160
|
+
{
|
|
161
|
+
className: "opacity-25",
|
|
162
|
+
cx: "12",
|
|
163
|
+
cy: "12",
|
|
164
|
+
r: "10",
|
|
165
|
+
stroke: "currentColor",
|
|
166
|
+
strokeWidth: "4"
|
|
167
|
+
}
|
|
168
|
+
),
|
|
169
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
170
|
+
"path",
|
|
171
|
+
{
|
|
172
|
+
className: "opacity-75",
|
|
173
|
+
fill: "currentColor",
|
|
174
|
+
d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z"
|
|
175
|
+
}
|
|
176
|
+
)
|
|
177
|
+
]
|
|
178
|
+
}
|
|
179
|
+
) }),
|
|
180
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground mb-3", children: "Unsubscribing..." }),
|
|
181
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "Please wait while we process your request." })
|
|
182
|
+
] }),
|
|
183
|
+
state === "success" && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
184
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 h-16 mx-auto mb-6 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
185
|
+
"svg",
|
|
186
|
+
{
|
|
187
|
+
className: "w-8 h-8 text-green-600 dark:text-green-400",
|
|
188
|
+
fill: "none",
|
|
189
|
+
viewBox: "0 0 24 24",
|
|
190
|
+
stroke: "currentColor",
|
|
191
|
+
strokeWidth: 2,
|
|
192
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
193
|
+
"path",
|
|
194
|
+
{
|
|
195
|
+
strokeLinecap: "round",
|
|
196
|
+
strokeLinejoin: "round",
|
|
197
|
+
d: "M5 13l4 4L19 7"
|
|
198
|
+
}
|
|
199
|
+
)
|
|
200
|
+
}
|
|
201
|
+
) }),
|
|
202
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground mb-3", children: "Successfully Unsubscribed" }),
|
|
203
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-8", children: successCopy }),
|
|
204
|
+
resubscribeUrl && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
205
|
+
"Changed your mind?",
|
|
206
|
+
" ",
|
|
207
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
208
|
+
"a",
|
|
209
|
+
{
|
|
210
|
+
href: resubscribeUrl,
|
|
211
|
+
className: "text-primary underline hover:no-underline",
|
|
212
|
+
children: "Resubscribe"
|
|
213
|
+
}
|
|
214
|
+
)
|
|
215
|
+
] })
|
|
216
|
+
] }),
|
|
217
|
+
state === "error" && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
218
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 h-16 mx-auto mb-6 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
219
|
+
"svg",
|
|
220
|
+
{
|
|
221
|
+
className: "w-8 h-8 text-red-600 dark:text-red-400",
|
|
222
|
+
fill: "none",
|
|
223
|
+
viewBox: "0 0 24 24",
|
|
224
|
+
stroke: "currentColor",
|
|
225
|
+
strokeWidth: 2,
|
|
226
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
227
|
+
"path",
|
|
228
|
+
{
|
|
229
|
+
strokeLinecap: "round",
|
|
230
|
+
strokeLinejoin: "round",
|
|
231
|
+
d: "M6 18L18 6M6 6l12 12"
|
|
232
|
+
}
|
|
233
|
+
)
|
|
234
|
+
}
|
|
235
|
+
) }),
|
|
236
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground mb-3", children: "Unsubscribe Failed" }),
|
|
237
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground mb-8", children: error }),
|
|
238
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkUQ2HALUD_js.Button, { onClick: () => setState("confirming"), variant: "outline", children: "Try Again" })
|
|
239
|
+
] }),
|
|
240
|
+
state === "invalid" && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
241
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 h-16 mx-auto mb-6 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
242
|
+
"svg",
|
|
243
|
+
{
|
|
244
|
+
className: "w-8 h-8 text-gray-400",
|
|
245
|
+
fill: "none",
|
|
246
|
+
viewBox: "0 0 24 24",
|
|
247
|
+
stroke: "currentColor",
|
|
248
|
+
strokeWidth: 2,
|
|
249
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
250
|
+
"path",
|
|
251
|
+
{
|
|
252
|
+
strokeLinecap: "round",
|
|
253
|
+
strokeLinejoin: "round",
|
|
254
|
+
d: "M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21"
|
|
255
|
+
}
|
|
256
|
+
)
|
|
257
|
+
}
|
|
258
|
+
) }),
|
|
259
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-2xl font-bold text-foreground mb-3", children: "Invalid Unsubscribe Link" }),
|
|
260
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "This unsubscribe link is invalid or missing. If you want to unsubscribe, please use the link from your newsletter email." })
|
|
261
|
+
] })
|
|
262
|
+
] })
|
|
263
|
+
]
|
|
264
|
+
}
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
exports.UnsubscribePage = UnsubscribePage;
|
|
269
|
+
//# sourceMappingURL=chunk-IKOIRUKW.js.map
|
|
270
|
+
//# sourceMappingURL=chunk-IKOIRUKW.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/unsubscribe.tsx"],"names":["useWebSDK","useWebSDKConfig","useState","useEffect","toast","jsxs","jsx","PageHead","Button"],"mappings":"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","file":"chunk-IKOIRUKW.js","sourcesContent":["\"use client\";\n\nimport { useState, useEffect } from \"react\";\n\nimport { toast } from \"sonner\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport { PageHead } from \"../seo/page-head\";\nimport { Button } from \"../ui/button\";\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst UNSUBSCRIBE_MUTATION = /* GraphQL */ `\n mutation PublicUnsubscribeByToken($token: String!) {\n publicUnsubscribeByToken(token: $token)\n }\n`;\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface UnsubscribePageProps {\n productName?: string;\n className?: string;\n seoTitle?: string;\n seoDescription?: string;\n resubscribeUrl?: string;\n successMessage?: string;\n errorMessage?: string;\n}\n\ntype UnsubscribeState =\n \"loading\" | \"confirming\" | \"processing\" | \"success\" | \"error\" | \"invalid\";\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport function UnsubscribePage({\n productName,\n className = \"\",\n seoTitle = \"Unsubscribe from Newsletter\",\n seoDescription = \"Manage your newsletter subscription preferences.\",\n resubscribeUrl,\n successMessage = \"You have been successfully unsubscribed from our newsletter.\",\n errorMessage = \"Something went wrong. Please try again or contact support.\",\n}: UnsubscribePageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const displayName = productName ?? config.productId;\n\n const [state, setState] = useState<UnsubscribeState>(\"loading\");\n const [error, setError] = useState<string>(\"\");\n const [token, setToken] = useState<string>(\"\");\n const [successCopy, setSuccessCopy] = useState<string>(successMessage);\n\n useEffect(() => {\n const params = new URLSearchParams(window.location.search);\n const t = params.get(\"token\");\n if (t) {\n setToken(t);\n setState(\"confirming\");\n } else {\n setState(\"invalid\");\n }\n }, []);\n\n const handleUnsubscribe = async () => {\n if (!token) return;\n\n setState(\"processing\");\n\n try {\n const result = await client.mutate<{\n publicUnsubscribeByToken: boolean;\n }>(UNSUBSCRIBE_MUTATION, { token });\n\n if (result.errors?.length) {\n const errMsg = result.errors[0]?.message ?? errorMessage;\n const code = (result.errors[0] as { extensions?: { code?: string } })\n ?.extensions?.code;\n\n if (code === \"ALREADY_UNSUBSCRIBED\") {\n toast.info(\"You are already unsubscribed from this newsletter.\");\n setSuccessCopy(\"You were already unsubscribed from this newsletter.\");\n setState(\"success\");\n return;\n } else if (code === \"UNSUBSCRIBE_TOKEN_EXPIRED\") {\n setError(\n \"This unsubscribe link has expired. Please contact support.\",\n );\n } else if (code === \"INVALID_UNSUBSCRIBE_TOKEN\") {\n setState(\"invalid\");\n return;\n } else {\n setError(errMsg);\n }\n setState(\"error\");\n return;\n }\n\n if (result.data?.publicUnsubscribeByToken) {\n setSuccessCopy(successMessage);\n setState(\"success\");\n toast.success(\"Successfully unsubscribed\");\n } else {\n setError(errorMessage);\n setState(\"error\");\n }\n } catch {\n setError(errorMessage);\n setState(\"error\");\n }\n };\n\n return (\n <div\n className={className}\n style={{\n minHeight: \"60vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"6rem 1rem 4rem\",\n }}\n >\n <PageHead title={seoTitle} description={seoDescription} />\n\n <div className=\"max-w-md w-full text-center\">\n {/* Loading */}\n {state === \"loading\" && (\n <div className=\"animate-pulse\">\n <div className=\"h-8 w-48 bg-muted rounded mx-auto mb-4\" />\n <div className=\"h-4 w-64 bg-muted rounded mx-auto\" />\n </div>\n )}\n\n {/* Confirm */}\n {state === \"confirming\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-amber-100 dark:bg-amber-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-amber-600 dark:text-amber-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe from Newsletter\n </h1>\n <p className=\"text-muted-foreground mb-8\">\n Are you sure you want to unsubscribe from {displayName}{\" \"}\n newsletter? You will no longer receive updates and news from us.\n </p>\n <div className=\"flex flex-col sm:flex-row gap-3 justify-center\">\n <Button\n onClick={handleUnsubscribe}\n variant=\"destructive\"\n className=\"px-8\"\n >\n Yes, Unsubscribe\n </Button>\n {resubscribeUrl && (\n <Button\n variant=\"outline\"\n onClick={() => {\n window.location.href = resubscribeUrl;\n }}\n className=\"px-8\"\n >\n Cancel\n </Button>\n )}\n </div>\n </div>\n )}\n\n {/* Processing */}\n {state === \"processing\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-muted flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-muted-foreground animate-spin\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribing...\n </h1>\n <p className=\"text-muted-foreground\">\n Please wait while we process your request.\n </p>\n </div>\n )}\n\n {/* Success */}\n {state === \"success\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-green-600 dark:text-green-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M5 13l4 4L19 7\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Successfully Unsubscribed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{successCopy}</p>\n {resubscribeUrl && (\n <p className=\"text-sm text-muted-foreground\">\n Changed your mind?{\" \"}\n <a\n href={resubscribeUrl}\n className=\"text-primary underline hover:no-underline\"\n >\n Resubscribe\n </a>\n </p>\n )}\n </div>\n )}\n\n {/* Error */}\n {state === \"error\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-red-100 dark:bg-red-900/30 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-red-600 dark:text-red-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Unsubscribe Failed\n </h1>\n <p className=\"text-muted-foreground mb-8\">{error}</p>\n <Button onClick={() => setState(\"confirming\")} variant=\"outline\">\n Try Again\n </Button>\n </div>\n )}\n\n {/* Invalid / No Token */}\n {state === \"invalid\" && (\n <div>\n <div className=\"w-16 h-16 mx-auto mb-6 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center\">\n <svg\n className=\"w-8 h-8 text-gray-400\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M13.875 18.825A10.05 10.05 0 0112 19c-4.478 0-8.268-2.943-9.543-7a9.97 9.97 0 011.563-3.029m5.858.908a3 3 0 114.243 4.243M9.878 9.878l4.242 4.242M9.88 9.88l-3.29-3.29m7.532 7.532l3.29 3.29M3 3l3.59 3.59m0 0A9.953 9.953 0 0112 5c4.478 0 8.268 2.943 9.543 7a10.025 10.025 0 01-4.132 5.411m0 0L21 21\"\n />\n </svg>\n </div>\n <h1 className=\"text-2xl font-bold text-foreground mb-3\">\n Invalid Unsubscribe Link\n </h1>\n <p className=\"text-muted-foreground\">\n This unsubscribe link is invalid or missing. If you want to\n unsubscribe, please use the link from your newsletter email.\n </p>\n </div>\n )}\n </div>\n </div>\n );\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkC6OJIHNO_js = require('./chunk-C6OJIHNO.js');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var LabelPrimitive = require('@radix-ui/react-label');
|
|
6
|
+
var classVarianceAuthority = require('class-variance-authority');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
|
+
var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
|
|
29
|
+
|
|
30
|
+
var labelVariants = classVarianceAuthority.cva(
|
|
31
|
+
"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"
|
|
32
|
+
);
|
|
33
|
+
var Label = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
34
|
+
LabelPrimitive__namespace.Root,
|
|
35
|
+
{
|
|
36
|
+
ref,
|
|
37
|
+
className: chunkC6OJIHNO_js.cn(labelVariants(), className),
|
|
38
|
+
...props
|
|
39
|
+
}
|
|
40
|
+
));
|
|
41
|
+
Label.displayName = LabelPrimitive__namespace.Root.displayName;
|
|
42
|
+
|
|
43
|
+
exports.Label = Label;
|
|
44
|
+
//# sourceMappingURL=chunk-IXTWOPRN.js.map
|
|
45
|
+
//# sourceMappingURL=chunk-IXTWOPRN.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/label.tsx"],"names":["cva","React","jsx","LabelPrimitive","cn"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,IAAM,aAAA,GAAgBA,0BAAA;AAAA,EACpB;AACF,CAAA;AAEA,IAAM,KAAA,GAAcC,4BAIlB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAgBC,yBAAA,CAAA,IAAA;AAAA,EAAf;AAAA,IACC,GAAA;AAAA,IACA,SAAA,EAAWC,mBAAA,CAAG,aAAA,EAAc,EAAG,SAAS,CAAA;AAAA,IACvC,GAAG;AAAA;AACN,CACD;AACD,KAAA,CAAM,cAA6BD,yBAAA,CAAA,IAAA,CAAK,WAAA","file":"chunk-IXTWOPRN.js","sourcesContent":["import * as React from \"react\";\n\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\n\nimport { cn } from \"../utils/cn\";\n\nconst labelVariants = cva(\n \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\",\n);\n\nconst Label = React.forwardRef<\n React.ElementRef<typeof LabelPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n <LabelPrimitive.Root\n ref={ref}\n className={cn(labelVariants(), className)}\n {...props}\n />\n));\nLabel.displayName = LabelPrimitive.Root.displayName;\n\nexport { Label };\n"]}
|