@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.
Files changed (276) hide show
  1. package/README.md +42 -8
  2. package/dist/analytics/index.js +19 -69
  3. package/dist/analytics/index.js.map +1 -1
  4. package/dist/analytics/index.mjs +3 -69
  5. package/dist/analytics/index.mjs.map +1 -1
  6. package/dist/avatar-live/index.js +1 -0
  7. package/dist/avatar-live/index.js.map +1 -1
  8. package/dist/avatar-live/index.mjs +1 -0
  9. package/dist/avatar-live/index.mjs.map +1 -1
  10. package/dist/avatar-live-view/index.js +10 -30
  11. package/dist/avatar-live-view/index.js.map +1 -1
  12. package/dist/avatar-live-view/index.mjs +4 -24
  13. package/dist/avatar-live-view/index.mjs.map +1 -1
  14. package/dist/chunk-23H4JUL4.js +41 -0
  15. package/dist/chunk-23H4JUL4.js.map +1 -0
  16. package/dist/chunk-34RX5P75.mjs +25 -0
  17. package/dist/chunk-34RX5P75.mjs.map +1 -0
  18. package/dist/chunk-3LFFY7AZ.js +184 -0
  19. package/dist/chunk-3LFFY7AZ.js.map +1 -0
  20. package/dist/chunk-3X26GE4S.js +2794 -0
  21. package/dist/chunk-3X26GE4S.js.map +1 -0
  22. package/dist/chunk-45GCA4GG.js +85 -0
  23. package/dist/chunk-45GCA4GG.js.map +1 -0
  24. package/dist/chunk-4SAGVLHN.js +876 -0
  25. package/dist/chunk-4SAGVLHN.js.map +1 -0
  26. package/dist/chunk-4U6YAII5.js +218 -0
  27. package/dist/chunk-4U6YAII5.js.map +1 -0
  28. package/dist/chunk-5GMTBOO6.js +21 -0
  29. package/dist/chunk-5GMTBOO6.js.map +1 -0
  30. package/dist/chunk-5JRJ57CL.mjs +329 -0
  31. package/dist/chunk-5JRJ57CL.mjs.map +1 -0
  32. package/dist/chunk-6C2DKIC7.js +4 -0
  33. package/dist/chunk-6C2DKIC7.js.map +1 -0
  34. package/dist/chunk-6IBFBWC5.mjs +17 -0
  35. package/dist/chunk-6IBFBWC5.mjs.map +1 -0
  36. package/dist/chunk-6KY2ZRVI.js +116 -0
  37. package/dist/chunk-6KY2ZRVI.js.map +1 -0
  38. package/dist/chunk-6VJT3SM4.mjs +182 -0
  39. package/dist/chunk-6VJT3SM4.mjs.map +1 -0
  40. package/dist/chunk-6YZUFMK2.mjs +40 -0
  41. package/dist/chunk-6YZUFMK2.mjs.map +1 -0
  42. package/dist/chunk-7A6R7CGG.js +47 -0
  43. package/dist/chunk-7A6R7CGG.js.map +1 -0
  44. package/dist/chunk-7PWL4V2R.js +4 -0
  45. package/dist/chunk-7PWL4V2R.js.map +1 -0
  46. package/dist/chunk-AA33WDYS.js +161 -0
  47. package/dist/chunk-AA33WDYS.js.map +1 -0
  48. package/dist/chunk-AHRGFXV2.js +525 -0
  49. package/dist/chunk-AHRGFXV2.js.map +1 -0
  50. package/dist/chunk-B63XLDZH.mjs +109 -0
  51. package/dist/chunk-B63XLDZH.mjs.map +1 -0
  52. package/dist/chunk-BX2USEWF.mjs +35 -0
  53. package/dist/chunk-BX2USEWF.mjs.map +1 -0
  54. package/dist/chunk-BYSZT35R.js +150 -0
  55. package/dist/chunk-BYSZT35R.js.map +1 -0
  56. package/dist/chunk-C6OJIHNO.js +12 -0
  57. package/dist/chunk-C6OJIHNO.js.map +1 -0
  58. package/dist/chunk-COOELBX7.mjs +63 -0
  59. package/dist/chunk-COOELBX7.mjs.map +1 -0
  60. package/dist/chunk-D2TW7MNC.mjs +2771 -0
  61. package/dist/chunk-D2TW7MNC.mjs.map +1 -0
  62. package/dist/chunk-D5KEZ6V6.mjs +3 -0
  63. package/dist/chunk-D5KEZ6V6.mjs.map +1 -0
  64. package/dist/chunk-E3GUGJMY.js +46 -0
  65. package/dist/chunk-E3GUGJMY.js.map +1 -0
  66. package/dist/chunk-EBZ2HGJ2.mjs +52 -0
  67. package/dist/chunk-EBZ2HGJ2.mjs.map +1 -0
  68. package/dist/chunk-EDLTUOIA.mjs +210 -0
  69. package/dist/chunk-EDLTUOIA.mjs.map +1 -0
  70. package/dist/chunk-EJQSOT4X.js +4 -0
  71. package/dist/chunk-EJQSOT4X.js.map +1 -0
  72. package/dist/chunk-EUPFS6MZ.mjs +2019 -0
  73. package/dist/chunk-EUPFS6MZ.mjs.map +1 -0
  74. package/dist/chunk-F3XWDC3B.js +77 -0
  75. package/dist/chunk-F3XWDC3B.js.map +1 -0
  76. package/dist/chunk-FFADMVIK.mjs +5127 -0
  77. package/dist/chunk-FFADMVIK.mjs.map +1 -0
  78. package/dist/chunk-FJWS7BKT.mjs +3 -0
  79. package/dist/chunk-FJWS7BKT.mjs.map +1 -0
  80. package/dist/chunk-FJZJDUOR.mjs +3 -0
  81. package/dist/chunk-FJZJDUOR.mjs.map +1 -0
  82. package/dist/chunk-GCFLCO2Z.mjs +145 -0
  83. package/dist/chunk-GCFLCO2Z.mjs.map +1 -0
  84. package/dist/chunk-GEXC4LRP.js +61 -0
  85. package/dist/chunk-GEXC4LRP.js.map +1 -0
  86. package/dist/chunk-GTRAXQGC.mjs +3 -0
  87. package/dist/chunk-GTRAXQGC.mjs.map +1 -0
  88. package/dist/chunk-IKOIRUKW.js +270 -0
  89. package/dist/chunk-IKOIRUKW.js.map +1 -0
  90. package/dist/chunk-IXTWOPRN.js +45 -0
  91. package/dist/chunk-IXTWOPRN.js.map +1 -0
  92. package/dist/chunk-JDXOXGOK.js +547 -0
  93. package/dist/chunk-JDXOXGOK.js.map +1 -0
  94. package/dist/chunk-JSLDWYV7.mjs +558 -0
  95. package/dist/chunk-JSLDWYV7.mjs.map +1 -0
  96. package/dist/chunk-JXLSTVBK.js +336 -0
  97. package/dist/chunk-JXLSTVBK.js.map +1 -0
  98. package/dist/chunk-KHYXK7FG.mjs +49 -0
  99. package/dist/chunk-KHYXK7FG.mjs.map +1 -0
  100. package/dist/chunk-KSMBOWQQ.js +2034 -0
  101. package/dist/chunk-KSMBOWQQ.js.map +1 -0
  102. package/dist/chunk-KU2PXHGB.mjs +83 -0
  103. package/dist/chunk-KU2PXHGB.mjs.map +1 -0
  104. package/dist/chunk-KZANIV3S.mjs +37 -0
  105. package/dist/chunk-KZANIV3S.mjs.map +1 -0
  106. package/dist/chunk-L4BP6YOB.js +20 -0
  107. package/dist/chunk-L4BP6YOB.js.map +1 -0
  108. package/dist/chunk-MRKA2OAF.mjs +75 -0
  109. package/dist/chunk-MRKA2OAF.mjs.map +1 -0
  110. package/dist/chunk-N5EC53MH.mjs +80 -0
  111. package/dist/chunk-N5EC53MH.mjs.map +1 -0
  112. package/dist/chunk-NZANQGDM.mjs +34 -0
  113. package/dist/chunk-NZANQGDM.mjs.map +1 -0
  114. package/dist/chunk-O4GS3XPZ.js +10 -0
  115. package/dist/chunk-O4GS3XPZ.js.map +1 -0
  116. package/dist/chunk-O76QDGRM.js +5154 -0
  117. package/dist/chunk-O76QDGRM.js.map +1 -0
  118. package/dist/chunk-OYEUNZJY.js +114 -0
  119. package/dist/chunk-OYEUNZJY.js.map +1 -0
  120. package/dist/chunk-PHXAGQNB.js +74 -0
  121. package/dist/chunk-PHXAGQNB.js.map +1 -0
  122. package/dist/chunk-PIHHPP7J.mjs +16 -0
  123. package/dist/chunk-PIHHPP7J.mjs.map +1 -0
  124. package/dist/chunk-PXRHVVOU.mjs +499 -0
  125. package/dist/chunk-PXRHVVOU.mjs.map +1 -0
  126. package/dist/chunk-QMA6U6AU.js +36 -0
  127. package/dist/chunk-QMA6U6AU.js.map +1 -0
  128. package/dist/chunk-R6J7IULF.js +44 -0
  129. package/dist/chunk-R6J7IULF.js.map +1 -0
  130. package/dist/chunk-R7G6TWIS.mjs +10 -0
  131. package/dist/chunk-R7G6TWIS.mjs.map +1 -0
  132. package/dist/chunk-RUMGFI6L.mjs +544 -0
  133. package/dist/chunk-RUMGFI6L.mjs.map +1 -0
  134. package/dist/chunk-S54JWSJF.js +565 -0
  135. package/dist/chunk-S54JWSJF.js.map +1 -0
  136. package/dist/chunk-SK5UGG6A.js +2041 -0
  137. package/dist/chunk-SK5UGG6A.js.map +1 -0
  138. package/dist/chunk-SKIYDKIS.mjs +70 -0
  139. package/dist/chunk-SKIYDKIS.mjs.map +1 -0
  140. package/dist/chunk-SZNS5IK6.mjs +322 -0
  141. package/dist/chunk-SZNS5IK6.mjs.map +1 -0
  142. package/dist/chunk-T7JIPZAC.js +66 -0
  143. package/dist/chunk-T7JIPZAC.js.map +1 -0
  144. package/dist/chunk-TGYQHO2E.mjs +864 -0
  145. package/dist/chunk-TGYQHO2E.mjs.map +1 -0
  146. package/dist/chunk-TT3MHN42.mjs +8 -0
  147. package/dist/chunk-TT3MHN42.mjs.map +1 -0
  148. package/dist/chunk-UM55U65W.mjs +268 -0
  149. package/dist/chunk-UM55U65W.mjs.map +1 -0
  150. package/dist/chunk-UQ2HALUD.js +72 -0
  151. package/dist/chunk-UQ2HALUD.js.map +1 -0
  152. package/dist/chunk-UXWT7G77.js +82 -0
  153. package/dist/chunk-UXWT7G77.js.map +1 -0
  154. package/dist/chunk-VNS5WDWO.mjs +7 -0
  155. package/dist/chunk-VNS5WDWO.mjs.map +1 -0
  156. package/dist/chunk-VRWZLGR7.js +4 -0
  157. package/dist/chunk-VRWZLGR7.js.map +1 -0
  158. package/dist/chunk-VZLDSNH4.mjs +22 -0
  159. package/dist/chunk-VZLDSNH4.mjs.map +1 -0
  160. package/dist/chunk-W6P3YETJ.js +92 -0
  161. package/dist/chunk-W6P3YETJ.js.map +1 -0
  162. package/dist/chunk-WPKFFQCR.mjs +90 -0
  163. package/dist/chunk-WPKFFQCR.mjs.map +1 -0
  164. package/dist/chunk-WTVTI5TO.mjs +22 -0
  165. package/dist/chunk-WTVTI5TO.mjs.map +1 -0
  166. package/dist/chunk-XJOBZ4RJ.js +44 -0
  167. package/dist/chunk-XJOBZ4RJ.js.map +1 -0
  168. package/dist/chunk-XP2JDNDU.js +325 -0
  169. package/dist/chunk-XP2JDNDU.js.map +1 -0
  170. package/dist/chunk-Y4V5CEWD.mjs +112 -0
  171. package/dist/chunk-Y4V5CEWD.mjs.map +1 -0
  172. package/dist/chunk-YERN2UWM.js +116 -0
  173. package/dist/chunk-YERN2UWM.js.map +1 -0
  174. package/dist/chunk-ZKJQWFAA.mjs +114 -0
  175. package/dist/chunk-ZKJQWFAA.mjs.map +1 -0
  176. package/dist/chunk-ZOON3S3Y.mjs +138 -0
  177. package/dist/chunk-ZOON3S3Y.mjs.map +1 -0
  178. package/dist/chunk-ZP6QRAYC.mjs +2024 -0
  179. package/dist/chunk-ZP6QRAYC.mjs.map +1 -0
  180. package/dist/chunk-ZSTFX7FV.js +9 -0
  181. package/dist/chunk-ZSTFX7FV.js.map +1 -0
  182. package/dist/client/index.js +23 -331
  183. package/dist/client/index.js.map +1 -1
  184. package/dist/client/index.mjs +3 -330
  185. package/dist/client/index.mjs.map +1 -1
  186. package/dist/comparison/index.js +28 -111
  187. package/dist/comparison/index.js.map +1 -1
  188. package/dist/comparison/index.mjs +2 -107
  189. package/dist/comparison/index.mjs.map +1 -1
  190. package/dist/components/contact.js +21 -931
  191. package/dist/components/contact.js.map +1 -1
  192. package/dist/components/contact.mjs +12 -909
  193. package/dist/components/contact.mjs.map +1 -1
  194. package/dist/components/electron-download.js +12 -124
  195. package/dist/components/electron-download.js.map +1 -1
  196. package/dist/components/electron-download.mjs +4 -106
  197. package/dist/components/electron-download.mjs.map +1 -1
  198. package/dist/components/explore-cta.js +8 -112
  199. package/dist/components/explore-cta.js.map +1 -1
  200. package/dist/components/explore-cta.mjs +3 -114
  201. package/dist/components/explore-cta.mjs.map +1 -1
  202. package/dist/components/explore.js +62 -7833
  203. package/dist/components/explore.js.map +1 -1
  204. package/dist/components/explore.mjs +13 -7800
  205. package/dist/components/explore.mjs.map +1 -1
  206. package/dist/components/launch-countdown.js +8 -83
  207. package/dist/components/launch-countdown.js.map +1 -1
  208. package/dist/components/launch-countdown.mjs +3 -85
  209. package/dist/components/launch-countdown.mjs.map +1 -1
  210. package/dist/components/newsletter.js +20 -993
  211. package/dist/components/newsletter.js.map +1 -1
  212. package/dist/components/newsletter.mjs +11 -971
  213. package/dist/components/newsletter.mjs.map +1 -1
  214. package/dist/components/partners.js +24 -1302
  215. package/dist/components/partners.js.map +1 -1
  216. package/dist/components/partners.mjs +15 -1276
  217. package/dist/components/partners.mjs.map +1 -1
  218. package/dist/components/pricing.js +49 -1249
  219. package/dist/components/pricing.js.map +1 -1
  220. package/dist/components/pricing.mjs +8 -1226
  221. package/dist/components/pricing.mjs.map +1 -1
  222. package/dist/components/problems-solved.js +8 -150
  223. package/dist/components/problems-solved.js.map +1 -1
  224. package/dist/components/problems-solved.mjs +4 -133
  225. package/dist/components/problems-solved.mjs.map +1 -1
  226. package/dist/components/resource-links.js +8 -304
  227. package/dist/components/resource-links.js.map +1 -1
  228. package/dist/components/resource-links.mjs +5 -308
  229. package/dist/components/resource-links.mjs.map +1 -1
  230. package/dist/components/social-links.js +8 -343
  231. package/dist/components/social-links.js.map +1 -1
  232. package/dist/components/social-links.mjs +5 -347
  233. package/dist/components/social-links.mjs.map +1 -1
  234. package/dist/components/unsubscribe.js +10 -627
  235. package/dist/components/unsubscribe.js.map +1 -1
  236. package/dist/components/unsubscribe.mjs +6 -611
  237. package/dist/components/unsubscribe.mjs.map +1 -1
  238. package/dist/components/waitlist.js +21 -1001
  239. package/dist/components/waitlist.js.map +1 -1
  240. package/dist/components/waitlist.mjs +12 -982
  241. package/dist/components/waitlist.mjs.map +1 -1
  242. package/dist/components/website-switcher.js +12 -175
  243. package/dist/components/website-switcher.js.map +1 -1
  244. package/dist/components/website-switcher.mjs +4 -157
  245. package/dist/components/website-switcher.mjs.map +1 -1
  246. package/dist/content/index.js +118 -3616
  247. package/dist/content/index.js.map +1 -1
  248. package/dist/content/index.mjs +12 -3567
  249. package/dist/content/index.mjs.map +1 -1
  250. package/dist/hooks/index.js +37 -2321
  251. package/dist/hooks/index.js.map +1 -1
  252. package/dist/hooks/index.mjs +6 -2318
  253. package/dist/hooks/index.mjs.map +1 -1
  254. package/dist/index.d.mts +1 -1
  255. package/dist/index.d.ts +1 -1
  256. package/dist/index.js +4145 -20599
  257. package/dist/index.js.map +1 -1
  258. package/dist/index.mjs +3766 -20567
  259. package/dist/index.mjs.map +1 -1
  260. package/dist/product/index.js +20 -393
  261. package/dist/product/index.js.map +1 -1
  262. package/dist/product/index.mjs +5 -394
  263. package/dist/product/index.mjs.map +1 -1
  264. package/dist/seo/index.js +8 -76
  265. package/dist/seo/index.js.map +1 -1
  266. package/dist/seo/index.mjs +3 -78
  267. package/dist/seo/index.mjs.map +1 -1
  268. package/dist/store/index.js +51 -2650
  269. package/dist/store/index.js.map +1 -1
  270. package/dist/store/index.mjs +13 -2619
  271. package/dist/store/index.mjs.map +1 -1
  272. package/dist/utils/index.js +69 -134
  273. package/dist/utils/index.js.map +1 -1
  274. package/dist/utils/index.mjs +5 -122
  275. package/dist/utils/index.mjs.map +1 -1
  276. package/package.json +2 -1
@@ -0,0 +1,525 @@
1
+ 'use strict';
2
+
3
+ var chunkL4BP6YOB_js = require('./chunk-L4BP6YOB.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 chunkC6OJIHNO_js = require('./chunk-C6OJIHNO.js');
10
+ var chunkBYSZT35R_js = require('./chunk-BYSZT35R.js');
11
+ var chunkJXLSTVBK_js = require('./chunk-JXLSTVBK.js');
12
+ var React = require('react');
13
+ var lucideReact = require('lucide-react');
14
+ var ReCAPTCHA = require('react-google-recaptcha');
15
+ var sonner = require('sonner');
16
+ var jsxRuntime = require('react/jsx-runtime');
17
+
18
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
19
+
20
+ function _interopNamespace(e) {
21
+ if (e && e.__esModule) return e;
22
+ var n = Object.create(null);
23
+ if (e) {
24
+ Object.keys(e).forEach(function (k) {
25
+ if (k !== 'default') {
26
+ var d = Object.getOwnPropertyDescriptor(e, k);
27
+ Object.defineProperty(n, k, d.get ? d : {
28
+ enumerable: true,
29
+ get: function () { return e[k]; }
30
+ });
31
+ }
32
+ });
33
+ }
34
+ n.default = e;
35
+ return Object.freeze(n);
36
+ }
37
+
38
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
39
+ var ReCAPTCHA__default = /*#__PURE__*/_interopDefault(ReCAPTCHA);
40
+
41
+ var Select = React__namespace.forwardRef(({ className, children, ...props }, ref) => {
42
+ return /* @__PURE__ */ jsxRuntime.jsx(
43
+ "select",
44
+ {
45
+ className: chunkC6OJIHNO_js.cn(
46
+ "flex h-9 w-full appearance-none rounded-md border border-input bg-transparent bg-[length:1rem_1rem] bg-[right_0.75rem_center] bg-no-repeat px-3 py-1 pr-8 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
47
+ // Inline SVG chevron: SVG inside a `background-image: url(data:…)`
48
+ // does NOT inherit `currentColor` from the host element (the SVG is
49
+ // its own document with no parent CSS context), so the stroke is
50
+ // hardcoded to a muted slate-400 (#94a3b8). Matches the muted
51
+ // foreground token visually in both light and dark themes well
52
+ // enough for a passive chevron — addresses #9 review feedback.
53
+ `bg-[url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>")]`,
54
+ className
55
+ ),
56
+ ref,
57
+ ...props,
58
+ children
59
+ }
60
+ );
61
+ });
62
+ Select.displayName = "Select";
63
+ var DEFAULT_CONTACT_CATEGORIES = [
64
+ { value: "general", label: "General enquiry" },
65
+ { value: "sales", label: "Sales" },
66
+ { value: "support", label: "Support" },
67
+ { value: "partnership", label: "Partnership" },
68
+ { value: "press", label: "Press / media" },
69
+ { value: "careers", label: "Careers" },
70
+ { value: "security", label: "Security disclosure" }
71
+ ];
72
+ var SUBMIT_CONTACT_INQUIRY_MUTATION = (
73
+ /* GraphQL */
74
+ `
75
+ mutation SubmitContactInquiry($input: SubmitContactInquiryInput!) {
76
+ submitContactInquiry(input: $input) {
77
+ success
78
+ message
79
+ }
80
+ }
81
+ `
82
+ );
83
+ async function submitContactForm(client, data, productId) {
84
+ try {
85
+ const result = await client.mutate(SUBMIT_CONTACT_INQUIRY_MUTATION, {
86
+ input: {
87
+ name: `${data.firstName} ${data.lastName}`,
88
+ email: data.email.trim().toLowerCase(),
89
+ company: data.company || void 0,
90
+ subject: data.subject,
91
+ message: data.message,
92
+ productId,
93
+ // Send `category` only when the user actually picked one. Older
94
+ // backend deployments without the `category` field in the
95
+ // `SubmitContactInquiryInput` schema would reject any unknown
96
+ // field; spreading conditionally keeps the SDK forward-
97
+ // compatible.
98
+ ...data.category ? { category: data.category } : {},
99
+ ...data.recaptchaToken ? { recaptchaToken: data.recaptchaToken } : {}
100
+ }
101
+ });
102
+ if (result.errors?.length) {
103
+ const errorMsg = result.errors[0]?.message ?? "Failed to send message";
104
+ return { success: false, message: errorMsg };
105
+ }
106
+ const response = result.data?.submitContactInquiry;
107
+ if (response?.success) {
108
+ return {
109
+ success: true,
110
+ message: response.message || "Message sent successfully!"
111
+ };
112
+ }
113
+ return {
114
+ success: false,
115
+ message: response?.message || "Failed to send message"
116
+ };
117
+ } catch (error) {
118
+ console.error("Contact form submission error:", error);
119
+ return {
120
+ success: false,
121
+ message: "Network error. Please try again."
122
+ };
123
+ }
124
+ }
125
+ function replacePlaceholders(text, productName, email) {
126
+ return text.replace(/{productName}/g, productName).replace(/{email}/g, email);
127
+ }
128
+ function ContactPage({
129
+ productName,
130
+ recaptchaSiteKey,
131
+ contactEmail,
132
+ contactPhone,
133
+ officeAddress,
134
+ responseTime = "We typically respond within 24 hours",
135
+ heroTitle = "Get in Touch",
136
+ heroDescription = "Have questions about {productName}? We're here to help. Reach out to our team and we'll get back to you as soon as possible.",
137
+ headingLevel = 1,
138
+ // Backward-compatibility: default to `[]` so existing consumers
139
+ // (fluidgrids/burdenoff/algoshred websites) that don't pass
140
+ // `categories` continue to render with NO dropdown — same behavior
141
+ // they had before this SDK version. To opt in, pass an explicit
142
+ // `categories={…}` array (or the exported `DEFAULT_CONTACT_CATEGORIES`
143
+ // constant for the sane Burdenoff-generic vocabulary).
144
+ categories = [],
145
+ categoryLabel = "Category",
146
+ categoryPlaceholder = "Select a category",
147
+ categoryRequired = true,
148
+ additionalOptions = [
149
+ {
150
+ title: "Sales Inquiries",
151
+ description: "Ready to see {productName} in action? Our sales team is here to help.",
152
+ buttonText: "Contact Sales",
153
+ buttonLink: `mailto:${contactEmail}`
154
+ },
155
+ {
156
+ title: "Technical Support",
157
+ description: "Need help with your {productName} setup? Our support team is ready.",
158
+ buttonText: "Get Support",
159
+ buttonLink: `mailto:${contactEmail}`
160
+ },
161
+ {
162
+ title: "Partnership",
163
+ description: "Interested in partnering with {productName}? Let's explore opportunities.",
164
+ buttonText: "Partner With Us",
165
+ buttonLink: `mailto:${contactEmail}`
166
+ }
167
+ ],
168
+ seo
169
+ }) {
170
+ const client = chunkJXLSTVBK_js.useWebSDK();
171
+ const config = chunkJXLSTVBK_js.useWebSDKConfig();
172
+ const { product } = chunkBYSZT35R_js.useProduct();
173
+ const resolvedProductId = product?.id || config.productId;
174
+ const displayName = productName ?? product?.name ?? config.productId;
175
+ const effectiveRecaptchaSiteKey = recaptchaSiteKey ?? product?.recaptchaSiteKey ?? config.recaptchaSiteKey ?? "";
176
+ const recaptchaRef = React.useRef(null);
177
+ const recaptchaGate = chunkL4BP6YOB_js.useDeferredRecaptcha(effectiveRecaptchaSiteKey);
178
+ const [isSubmitting, setIsSubmitting] = React.useState(false);
179
+ const [submitStatus, setSubmitStatus] = React.useState("idle");
180
+ const handleSubmit = async (e) => {
181
+ e.preventDefault();
182
+ const recaptchaToken = recaptchaRef.current?.getValue() ?? "";
183
+ if (effectiveRecaptchaSiteKey && !recaptchaToken) {
184
+ recaptchaGate.arm();
185
+ sonner.toast.error("Please complete the reCAPTCHA verification");
186
+ return;
187
+ }
188
+ setIsSubmitting(true);
189
+ setSubmitStatus("idle");
190
+ const form = e.currentTarget;
191
+ try {
192
+ const formData = new FormData(form);
193
+ const showCategory = categories.length > 0;
194
+ const rawCategory = showCategory ? (formData.get("category") ?? "").trim() : "";
195
+ if (showCategory && categoryRequired && !rawCategory) {
196
+ sonner.toast.error("Please select a category");
197
+ setIsSubmitting(false);
198
+ return;
199
+ }
200
+ const contactData = {
201
+ firstName: formData.get("firstName"),
202
+ lastName: formData.get("lastName"),
203
+ email: formData.get("email"),
204
+ company: formData.get("company"),
205
+ category: rawCategory || void 0,
206
+ subject: formData.get("subject"),
207
+ message: formData.get("message"),
208
+ recaptchaToken
209
+ };
210
+ const result = await submitContactForm(
211
+ client,
212
+ contactData,
213
+ resolvedProductId
214
+ );
215
+ if (result.success) {
216
+ setSubmitStatus("success");
217
+ sonner.toast.success(
218
+ result.message ?? `Thank you for contacting ${displayName}. We'll get back to you within 24 hours.`
219
+ );
220
+ if (form) {
221
+ form.reset();
222
+ }
223
+ recaptchaRef.current?.reset();
224
+ } else {
225
+ setSubmitStatus("error");
226
+ sonner.toast.error(
227
+ result.message ?? "Failed to send message. Please try again."
228
+ );
229
+ recaptchaRef.current?.reset();
230
+ }
231
+ } catch (error) {
232
+ console.error("Error submitting form:", error);
233
+ setSubmitStatus("error");
234
+ sonner.toast.error("Failed to send message. Please try again later.");
235
+ recaptchaRef.current?.reset();
236
+ } finally {
237
+ setIsSubmitting(false);
238
+ }
239
+ };
240
+ const heroDescriptionText = replacePlaceholders(
241
+ heroDescription,
242
+ displayName,
243
+ contactEmail
244
+ ).trim();
245
+ const hasHero = heroTitle.trim() !== "" || heroDescriptionText !== "";
246
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "w-full", children: [
247
+ seo && /* @__PURE__ */ jsxRuntime.jsx(
248
+ chunkUXWT7G77_js.PageHead,
249
+ {
250
+ title: seo.title ?? `Contact ${displayName} - Get in Touch With Our Team`,
251
+ description: seo.description ?? `Ready to transform your business? Contact our team for sales inquiries, technical support, or partnership opportunities. We're here to help you succeed.`,
252
+ productName: displayName,
253
+ keywords: seo.keywords ?? `contact ${displayName.toLowerCase()}, sales inquiries, customer support, technical support, partnership opportunities, get in touch`,
254
+ image: seo.image ?? "/og-image-contact.png",
255
+ url: seo.url
256
+ }
257
+ ),
258
+ hasHero && /* @__PURE__ */ jsxRuntime.jsx(
259
+ "section",
260
+ {
261
+ className: headingLevel === 2 ? "py-12 md:py-16" : "bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24",
262
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center max-w-3xl mx-auto", children: [
263
+ !heroTitle.trim() ? null : headingLevel === 2 ? /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl md:text-3xl font-bold mb-3", children: heroTitle }) : /* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6", children: heroTitle }),
264
+ heroDescriptionText && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-lg sm:text-xl text-muted-foreground leading-relaxed", children: heroDescriptionText })
265
+ ] }) })
266
+ }
267
+ ),
268
+ /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-12 sm:py-16 md:py-20 lg:py-24", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid sm:grid-cols-1 lg:grid-cols-3 gap-8 sm:gap-10 lg:gap-12", children: [
269
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:col-span-1 order-2 lg:order-1", children: [
270
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl sm:text-2xl font-bold mb-4 sm:mb-6", children: "Contact Information" }),
271
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4 sm:space-y-6", children: [
272
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-3 sm:space-x-4", children: [
273
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Mail, { className: "h-4 w-4 sm:h-5 sm:w-5 text-primary" }) }),
274
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
275
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold mb-1 text-sm sm:text-base", children: "Email" }),
276
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm sm:text-base break-all", children: contactEmail })
277
+ ] })
278
+ ] }),
279
+ contactPhone && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-3 sm:space-x-4", children: [
280
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Phone, { className: "h-4 w-4 sm:h-5 sm:w-5 text-primary" }) }),
281
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
282
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold mb-1 text-sm sm:text-base", children: "Phone" }),
283
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm sm:text-base", children: contactPhone })
284
+ ] })
285
+ ] }),
286
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-3 sm:space-x-4", children: [
287
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MapPin, { className: "h-4 w-4 sm:h-5 sm:w-5 text-primary" }) }),
288
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
289
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold mb-1 text-sm sm:text-base", children: "Office" }),
290
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-muted-foreground text-sm sm:text-base leading-relaxed", children: [
291
+ officeAddress.line1,
292
+ /* @__PURE__ */ jsxRuntime.jsx("br", {}),
293
+ officeAddress.line2,
294
+ /* @__PURE__ */ jsxRuntime.jsx("br", {}),
295
+ officeAddress.line3,
296
+ /* @__PURE__ */ jsxRuntime.jsx("br", {}),
297
+ officeAddress.country
298
+ ] })
299
+ ] })
300
+ ] }),
301
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start space-x-3 sm:space-x-4", children: [
302
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Clock, { className: "h-4 w-4 sm:h-5 sm:w-5 text-primary" }) }),
303
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
304
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold mb-1 text-sm sm:text-base", children: "Response Time" }),
305
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm sm:text-base", children: responseTime })
306
+ ] })
307
+ ] })
308
+ ] })
309
+ ] }),
310
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "lg:col-span-2 order-1 lg:order-2", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "bg-card border rounded-lg p-4 sm:p-6 md:p-8", children: [
311
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-xl sm:text-2xl font-bold mb-4 sm:mb-6", children: "Send us a Message" }),
312
+ /* @__PURE__ */ jsxRuntime.jsxs(
313
+ "form",
314
+ {
315
+ onSubmit: handleSubmit,
316
+ className: "space-y-4 sm:space-y-6",
317
+ ...recaptchaGate.formProps,
318
+ children: [
319
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid sm:grid-cols-2 gap-4 sm:gap-6", children: [
320
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
321
+ /* @__PURE__ */ jsxRuntime.jsx(
322
+ chunkIXTWOPRN_js.Label,
323
+ {
324
+ htmlFor: "firstName",
325
+ className: "text-sm sm:text-base",
326
+ children: "First Name *"
327
+ }
328
+ ),
329
+ /* @__PURE__ */ jsxRuntime.jsx(
330
+ chunk7A6R7CGG_js.Input,
331
+ {
332
+ id: "firstName",
333
+ name: "firstName",
334
+ required: true,
335
+ placeholder: "John",
336
+ className: "text-sm sm:text-base"
337
+ }
338
+ )
339
+ ] }),
340
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
341
+ /* @__PURE__ */ jsxRuntime.jsx(
342
+ chunkIXTWOPRN_js.Label,
343
+ {
344
+ htmlFor: "lastName",
345
+ className: "text-sm sm:text-base",
346
+ children: "Last Name *"
347
+ }
348
+ ),
349
+ /* @__PURE__ */ jsxRuntime.jsx(
350
+ chunk7A6R7CGG_js.Input,
351
+ {
352
+ id: "lastName",
353
+ name: "lastName",
354
+ required: true,
355
+ placeholder: "Doe",
356
+ className: "text-sm sm:text-base"
357
+ }
358
+ )
359
+ ] })
360
+ ] }),
361
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
362
+ /* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "email", className: "text-sm sm:text-base", children: "Email *" }),
363
+ /* @__PURE__ */ jsxRuntime.jsx(
364
+ chunk7A6R7CGG_js.Input,
365
+ {
366
+ id: "email",
367
+ name: "email",
368
+ type: "email",
369
+ required: true,
370
+ placeholder: "john@company.com",
371
+ className: "text-sm sm:text-base"
372
+ }
373
+ )
374
+ ] }),
375
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
376
+ /* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "company", className: "text-sm sm:text-base", children: "Company" }),
377
+ /* @__PURE__ */ jsxRuntime.jsx(
378
+ chunk7A6R7CGG_js.Input,
379
+ {
380
+ id: "company",
381
+ name: "company",
382
+ placeholder: "Acme Inc.",
383
+ className: "text-sm sm:text-base"
384
+ }
385
+ )
386
+ ] }),
387
+ categories.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
388
+ /* @__PURE__ */ jsxRuntime.jsxs(
389
+ chunkIXTWOPRN_js.Label,
390
+ {
391
+ htmlFor: "category",
392
+ className: "text-sm sm:text-base",
393
+ children: [
394
+ categoryLabel,
395
+ categoryRequired ? " *" : ""
396
+ ]
397
+ }
398
+ ),
399
+ /* @__PURE__ */ jsxRuntime.jsxs(
400
+ Select,
401
+ {
402
+ id: "category",
403
+ name: "category",
404
+ required: categoryRequired,
405
+ defaultValue: "",
406
+ className: "text-sm sm:text-base",
407
+ children: [
408
+ /* @__PURE__ */ jsxRuntime.jsx("option", { value: "", disabled: categoryRequired, children: categoryPlaceholder }),
409
+ categories.map((c) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: c.value, children: c.label }, c.value))
410
+ ]
411
+ }
412
+ )
413
+ ] }),
414
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
415
+ /* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "subject", className: "text-sm sm:text-base", children: "Subject *" }),
416
+ /* @__PURE__ */ jsxRuntime.jsx(
417
+ chunk7A6R7CGG_js.Input,
418
+ {
419
+ id: "subject",
420
+ name: "subject",
421
+ required: true,
422
+ placeholder: "How can we help you?",
423
+ className: "text-sm sm:text-base"
424
+ }
425
+ )
426
+ ] }),
427
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
428
+ /* @__PURE__ */ jsxRuntime.jsx(chunkIXTWOPRN_js.Label, { htmlFor: "message", className: "text-sm sm:text-base", children: "Message *" }),
429
+ /* @__PURE__ */ jsxRuntime.jsx(
430
+ chunkR6J7IULF_js.Textarea,
431
+ {
432
+ id: "message",
433
+ name: "message",
434
+ required: true,
435
+ placeholder: "Tell us more about your needs...",
436
+ rows: 5,
437
+ className: "text-sm sm:text-base min-h-[120px] sm:min-h-[150px] resize-y"
438
+ }
439
+ )
440
+ ] }),
441
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-4", children: [
442
+ effectiveRecaptchaSiteKey && /* @__PURE__ */ jsxRuntime.jsx(
443
+ "div",
444
+ {
445
+ className: "flex justify-center sm:justify-start",
446
+ style: { minHeight: chunkL4BP6YOB_js.RECAPTCHA_WIDGET_HEIGHT },
447
+ children: recaptchaGate.armed && /* @__PURE__ */ jsxRuntime.jsx(
448
+ ReCAPTCHA__default.default,
449
+ {
450
+ ref: recaptchaRef,
451
+ sitekey: effectiveRecaptchaSiteKey
452
+ }
453
+ )
454
+ }
455
+ ),
456
+ /* @__PURE__ */ jsxRuntime.jsx(
457
+ chunkUQ2HALUD_js.Button,
458
+ {
459
+ type: "submit",
460
+ size: "lg",
461
+ disabled: isSubmitting,
462
+ className: "w-full sm:w-auto min-w-[200px]",
463
+ children: isSubmitting ? "Sending..." : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
464
+ "Send Message ",
465
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Send, { className: "ml-2 h-4 w-4" })
466
+ ] })
467
+ }
468
+ )
469
+ ] }),
470
+ submitStatus === "success" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 sm:p-4 bg-green-50 border border-green-200 rounded-lg text-green-800 mt-4", children: [
471
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium text-sm sm:text-base", children: "Message sent successfully!" }),
472
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs sm:text-sm mt-1", children: [
473
+ "Thank you for contacting ",
474
+ displayName,
475
+ ". We'll get back to you within 24 hours."
476
+ ] })
477
+ ] }),
478
+ submitStatus === "error" && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-3 sm:p-4 bg-red-50 border border-red-200 rounded-lg text-red-800 mt-4", children: [
479
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "font-medium text-sm sm:text-base", children: "Failed to send message" }),
480
+ /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs sm:text-sm mt-1", children: [
481
+ "Please try again later or contact us directly at",
482
+ " ",
483
+ contactEmail
484
+ ] })
485
+ ] })
486
+ ]
487
+ }
488
+ )
489
+ ] }) })
490
+ ] }) }) }),
491
+ additionalOptions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("section", { className: "py-12 sm:py-16 md:py-20 lg:py-24 bg-muted/30", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "max-w-7xl mx-auto px-4 sm:px-6 lg:px-8", children: [
492
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl sm:text-3xl font-bold text-center mb-8 sm:mb-12", children: "More Ways to Connect" }),
493
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid sm:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8 max-w-5xl mx-auto", children: additionalOptions.map((option, index) => /* @__PURE__ */ jsxRuntime.jsxs(
494
+ "div",
495
+ {
496
+ className: "text-center p-4 sm:p-6 bg-card border rounded-lg",
497
+ children: [
498
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "font-semibold text-base sm:text-lg mb-2", children: option.title }),
499
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground text-sm sm:text-base mb-4 leading-relaxed", children: replacePlaceholders(
500
+ option.description,
501
+ displayName,
502
+ contactEmail
503
+ ) }),
504
+ /* @__PURE__ */ jsxRuntime.jsx(
505
+ chunkUQ2HALUD_js.Button,
506
+ {
507
+ variant: "outline",
508
+ asChild: true,
509
+ className: "text-sm sm:text-base",
510
+ children: /* @__PURE__ */ jsxRuntime.jsx("a", { href: option.buttonLink, children: option.buttonText })
511
+ }
512
+ )
513
+ ]
514
+ },
515
+ index
516
+ )) })
517
+ ] }) })
518
+ ] });
519
+ }
520
+
521
+ exports.ContactPage = ContactPage;
522
+ exports.DEFAULT_CONTACT_CATEGORIES = DEFAULT_CONTACT_CATEGORIES;
523
+ exports.Select = Select;
524
+ //# sourceMappingURL=chunk-AHRGFXV2.js.map
525
+ //# sourceMappingURL=chunk-AHRGFXV2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/select.tsx","../src/components/contact.tsx"],"names":["React","jsx","cn","useWebSDK","useWebSDKConfig","useProduct","useRef","useDeferredRecaptcha","useState","toast","jsxs","PageHead","Mail","Phone","MapPin","Clock","Label","Input","Textarea","RECAPTCHA_WIDGET_HEIGHT","ReCAPTCHA","Button","Fragment","Send"],"mappings":"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","file":"chunk-AHRGFXV2.js","sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"../utils/cn\";\n\n/** Native `<select>` wrapper matching the `Input` design tokens. */\nconst Select = React.forwardRef<\n HTMLSelectElement,\n React.ComponentProps<\"select\">\n>(({ className, children, ...props }, ref) => {\n return (\n <select\n className={cn(\n \"flex h-9 w-full appearance-none rounded-md border border-input bg-transparent bg-[length:1rem_1rem] bg-[right_0.75rem_center] bg-no-repeat px-3 py-1 pr-8 text-base shadow-sm transition-colors placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n // Inline SVG chevron: SVG inside a `background-image: url(data:…)`\n // does NOT inherit `currentColor` from the host element (the SVG is\n // its own document with no parent CSS context), so the stroke is\n // hardcoded to a muted slate-400 (#94a3b8). Matches the muted\n // foreground token visually in both light and dark themes well\n // enough for a passive chevron — addresses #9 review feedback.\n \"bg-[url(\\\"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'/></svg>\\\")]\",\n className,\n )}\n ref={ref}\n {...props}\n >\n {children}\n </select>\n );\n});\nSelect.displayName = \"Select\";\n\nexport { Select };\n","/**\n * Contact Page Component\n * Complete contact page with form submission via GraphQL, reCAPTCHA validation,\n * contact information display, and additional contact options.\n * Uses the WebSDKClient provider for API calls.\n *\n * @example\n * ```tsx\n * import { ContactPage } from '@burdenoff/website-sdk/components/contact'\n *\n * <ContactPage\n * productName=\"MyProduct\"\n * recaptchaSiteKey=\"your-recaptcha-key\"\n * contactEmail=\"contact@myproduct.com\"\n * contactPhone=\"+1-234-567-8900\"\n * officeAddress={{\n * line1: \"123 Main St\",\n * line2: \"Suite 100\",\n * line3: \"City, State 12345\",\n * country: \"USA\"\n * }}\n * />\n * ```\n */\n\n\"use client\";\n\nimport { useState, useRef } from \"react\";\n\nimport { Mail, MapPin, Phone, Clock, Send } from \"lucide-react\";\nimport ReCAPTCHA from \"react-google-recaptcha\";\nimport { toast } from \"sonner\";\n\nimport { useWebSDK, useWebSDKConfig } from \"../client/provider\";\nimport {\n RECAPTCHA_WIDGET_HEIGHT,\n useDeferredRecaptcha,\n} from \"../hooks/use-deferred-recaptcha\";\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 { Select } from \"../ui/select\";\nimport { Textarea } from \"../ui/textarea\";\n\nimport type { WebSDKClient } from \"../client/graphql-client\";\n\n// ============================================================================\n// TYPES & INTERFACES\n// ============================================================================\n\ninterface OfficeAddress {\n line1: string;\n line2: string;\n line3: string;\n country: string;\n}\n\ninterface ContactOption {\n title: string;\n description: string;\n buttonText: string;\n buttonLink: string;\n}\n\n/**\n * One entry in the contact-form Category dropdown. Each product website\n * supplies its own allow-list via the `categories` prop so the\n * vocabulary stays product-appropriate (e.g. VibeControls uses\n * `plugin-developer`, a manufacturing site uses `dealer`). The backend\n * accepts whatever `value` string is sent and persists it directly.\n *\n * `value` flows to the backend; `label` is what the user sees.\n */\nexport interface ContactCategory {\n /** Stored on the server. Short, kebab-case is conventional. */\n value: string;\n /** Human-readable label shown in the dropdown. */\n label: string;\n}\n\n/**\n * Conservative starter category list — Burdenoff-generic vocabulary\n * (General / Sales / Support / Partnership / Press / Careers / Security).\n *\n * **Not** applied by default: pass it explicitly to opt in:\n *\n * ```tsx\n * <ContactPage\n * …\n * categories={DEFAULT_CONTACT_CATEGORIES}\n * />\n * ```\n *\n * The component default for `categories` is `[]` (no dropdown) so this\n * SDK release is backward-compatible with existing consumers that\n * don't yet know about the field — see the prop docs.\n */\nexport const DEFAULT_CONTACT_CATEGORIES: ContactCategory[] = [\n { value: \"general\", label: \"General enquiry\" },\n { value: \"sales\", label: \"Sales\" },\n { value: \"support\", label: \"Support\" },\n { value: \"partnership\", label: \"Partnership\" },\n { value: \"press\", label: \"Press / media\" },\n { value: \"careers\", label: \"Careers\" },\n { value: \"security\", label: \"Security disclosure\" },\n];\n\ninterface ContactFormData {\n firstName: string;\n lastName: string;\n email: string;\n company?: string;\n category?: string;\n subject: string;\n message: string;\n recaptchaToken: string;\n}\n\ntype SubmitStatus = \"idle\" | \"success\" | \"error\";\n\nexport interface ContactPageProps {\n /** Product name. Falls back to SDK config productId if not provided. */\n productName?: string;\n /** reCAPTCHA site key (optional, falls back to SDK config) */\n recaptchaSiteKey?: string;\n /** Contact email */\n contactEmail: string;\n /** Contact phone number */\n contactPhone: string;\n /** Office address */\n officeAddress: OfficeAddress;\n /** Response time message */\n responseTime?: string;\n /** Hero title */\n heroTitle?: string;\n /** Hero description */\n heroDescription?: string;\n /**\n * Heading level for the hero title. Defaults to `1` (a full page hero,\n * `<h1>`). Pass `2` when embedding ContactPage inside another page that\n * already owns the page `<h1>` (e.g. `PartnersPage`) — renders a compact\n * `<h2>` section header instead of a competing hero, keeping one `<h1>`\n * per page for SEO and a clean visual hierarchy.\n */\n headingLevel?: 1 | 2;\n /** Additional contact options */\n additionalOptions?: ContactOption[];\n /**\n * Inquiry-type dropdown allow-list. **Defaults to `[]`** — the\n * dropdown does not render unless the consumer explicitly opts in.\n *\n * Two ways to opt in:\n *\n * ```tsx\n * // 1. Provide a product-specific list\n * <ContactPage categories={[{ value: 'sales', label: 'Sales' }, …]} />\n *\n * // 2. Or use the conservative SDK starter list\n * <ContactPage categories={DEFAULT_CONTACT_CATEGORIES} />\n * ```\n *\n * Default is intentionally empty (not `DEFAULT_CONTACT_CATEGORIES`)\n * to keep this SDK release backward-compatible with existing\n * consumers that don't yet wire `categories` — they get zero\n * behavior change.\n *\n * Typed `readonly` because the component never mutates the array;\n * lets product sites pass an `as const`-frozen config without an\n * extra `[...spread]` at the call site.\n */\n categories?: readonly ContactCategory[];\n /** Label shown above the category dropdown. */\n categoryLabel?: string;\n /** Placeholder text for the unselected state of the dropdown. */\n categoryPlaceholder?: string;\n /**\n * Whether selecting a category is required to submit. Defaults to\n * `true` — the whole point of the dropdown is routing, so users\n * self-triage instead of pushing that work onto support.\n */\n categoryRequired?: boolean;\n /** SEO metadata */\n seo?: {\n title?: string;\n description?: string;\n keywords?: string;\n image?: string;\n url?: string;\n };\n}\n\n// ============================================================================\n// GRAPHQL MUTATION\n// ============================================================================\n\nconst SUBMIT_CONTACT_INQUIRY_MUTATION = /* GraphQL */ `\n mutation SubmitContactInquiry($input: SubmitContactInquiryInput!) {\n submitContactInquiry(input: $input) {\n success\n message\n }\n }\n`;\n\n// ============================================================================\n// API SERVICE\n// ============================================================================\n\nasync function submitContactForm(\n client: WebSDKClient,\n data: ContactFormData,\n productId: string,\n): Promise<{ success: boolean; message?: string }> {\n try {\n const result = await client.mutate<{\n submitContactInquiry: {\n success: boolean;\n message: string;\n };\n }>(SUBMIT_CONTACT_INQUIRY_MUTATION, {\n input: {\n name: `${data.firstName} ${data.lastName}`,\n email: data.email.trim().toLowerCase(),\n company: data.company || undefined,\n subject: data.subject,\n message: data.message,\n productId,\n // Send `category` only when the user actually picked one. Older\n // backend deployments without the `category` field in the\n // `SubmitContactInquiryInput` schema would reject any unknown\n // field; spreading conditionally keeps the SDK forward-\n // compatible.\n ...(data.category ? { category: data.category } : {}),\n ...(data.recaptchaToken ? { recaptchaToken: data.recaptchaToken } : {}),\n },\n });\n\n if (result.errors?.length) {\n const errorMsg = result.errors[0]?.message ?? \"Failed to send message\";\n return { success: false, message: errorMsg };\n }\n\n const response = result.data?.submitContactInquiry;\n if (response?.success) {\n return {\n success: true,\n message: response.message || \"Message sent successfully!\",\n };\n }\n\n return {\n success: false,\n message: response?.message || \"Failed to send message\",\n };\n } catch (error) {\n console.error(\"Contact form submission error:\", error);\n return {\n success: false,\n message: \"Network error. Please try again.\",\n };\n }\n}\n\n// ============================================================================\n// HELPER\n// ============================================================================\n\nfunction replacePlaceholders(\n text: string,\n productName: string,\n email: string,\n): string {\n return text.replace(/{productName}/g, productName).replace(/{email}/g, email);\n}\n\n// ============================================================================\n// MAIN COMPONENT\n// ============================================================================\n\nexport function ContactPage({\n productName,\n recaptchaSiteKey,\n contactEmail,\n contactPhone,\n officeAddress,\n responseTime = \"We typically respond within 24 hours\",\n heroTitle = \"Get in Touch\",\n heroDescription = \"Have questions about {productName}? We're here to help. Reach out to our team and we'll get back to you as soon as possible.\",\n headingLevel = 1,\n // Backward-compatibility: default to `[]` so existing consumers\n // (fluidgrids/burdenoff/algoshred websites) that don't pass\n // `categories` continue to render with NO dropdown — same behavior\n // they had before this SDK version. To opt in, pass an explicit\n // `categories={…}` array (or the exported `DEFAULT_CONTACT_CATEGORIES`\n // constant for the sane Burdenoff-generic vocabulary).\n categories = [],\n categoryLabel = \"Category\",\n categoryPlaceholder = \"Select a category\",\n categoryRequired = true,\n additionalOptions = [\n {\n title: \"Sales Inquiries\",\n description:\n \"Ready to see {productName} in action? Our sales team is here to help.\",\n buttonText: \"Contact Sales\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Technical Support\",\n description:\n \"Need help with your {productName} setup? Our support team is ready.\",\n buttonText: \"Get Support\",\n buttonLink: `mailto:${contactEmail}`,\n },\n {\n title: \"Partnership\",\n description:\n \"Interested in partnering with {productName}? Let's explore opportunities.\",\n buttonText: \"Partner With Us\",\n buttonLink: `mailto:${contactEmail}`,\n },\n ],\n seo,\n}: ContactPageProps) {\n const client = useWebSDK();\n const config = useWebSDKConfig();\n const { product } = useProduct();\n const resolvedProductId = product?.id || config.productId;\n const displayName = productName ?? product?.name ?? config.productId;\n // Resolution order: explicit prop → product CMS (publicProduct.recaptchaSiteKey)\n // → SDK config/env. Lets the key be managed per-product in the CMS without\n // any env wiring on the consuming site.\n const effectiveRecaptchaSiteKey =\n recaptchaSiteKey ??\n product?.recaptchaSiteKey ??\n config.recaptchaSiteKey ??\n \"\";\n\n const recaptchaRef = useRef<ReCAPTCHA>(null);\n const recaptchaGate = useDeferredRecaptcha(effectiveRecaptchaSiteKey);\n const [isSubmitting, setIsSubmitting] = useState(false);\n const [submitStatus, setSubmitStatus] = useState<SubmitStatus>(\"idle\");\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n // Get reCAPTCHA token (skip validation when no site key is configured)\n const recaptchaToken = recaptchaRef.current?.getValue() ?? \"\";\n\n if (effectiveRecaptchaSiteKey && !recaptchaToken) {\n recaptchaGate.arm();\n toast.error(\"Please complete the reCAPTCHA verification\");\n return;\n }\n\n setIsSubmitting(true);\n setSubmitStatus(\"idle\");\n\n // Store form reference before async operations\n const form = e.currentTarget;\n\n try {\n const formData = new FormData(form);\n\n // Category is rendered only when `categories` is non-empty. Read\n // it conditionally so an opt-out site (`categories={[]}`) never\n // sends an empty-string `category` on the wire.\n const showCategory = categories.length > 0;\n const rawCategory = showCategory\n ? ((formData.get(\"category\") as string | null) ?? \"\").trim()\n : \"\";\n if (showCategory && categoryRequired && !rawCategory) {\n // Belt-and-braces validation. Browsers already enforce the\n // `required` attribute, but the form-data path runs even when\n // the native check is bypassed by a custom client.\n //\n // Message is hardcoded (not derived from `categoryPlaceholder`)\n // so a placeholder like \"Department type\" doesn't produce\n // ungrammatical output like \"Please department type\" —\n // addresses #9 review feedback.\n toast.error(\"Please select a category\");\n setIsSubmitting(false);\n return;\n }\n\n const contactData: ContactFormData = {\n firstName: formData.get(\"firstName\") as string,\n lastName: formData.get(\"lastName\") as string,\n email: formData.get(\"email\") as string,\n company: formData.get(\"company\") as string,\n category: rawCategory || undefined,\n subject: formData.get(\"subject\") as string,\n message: formData.get(\"message\") as string,\n recaptchaToken,\n };\n\n const result = await submitContactForm(\n client,\n contactData,\n resolvedProductId,\n );\n\n if (result.success) {\n setSubmitStatus(\"success\");\n toast.success(\n result.message ??\n `Thank you for contacting ${displayName}. We'll get back to you within 24 hours.`,\n );\n\n // Reset form\n if (form) {\n form.reset();\n }\n // Reset reCAPTCHA\n recaptchaRef.current?.reset();\n } else {\n setSubmitStatus(\"error\");\n toast.error(\n result.message ?? \"Failed to send message. Please try again.\",\n );\n recaptchaRef.current?.reset();\n }\n } catch (error) {\n console.error(\"Error submitting form:\", error);\n setSubmitStatus(\"error\");\n toast.error(\"Failed to send message. Please try again later.\");\n recaptchaRef.current?.reset();\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const heroDescriptionText = replacePlaceholders(\n heroDescription,\n displayName,\n contactEmail,\n ).trim();\n const hasHero = heroTitle.trim() !== \"\" || heroDescriptionText !== \"\";\n\n return (\n <div className=\"w-full\">\n {seo && (\n <PageHead\n title={\n seo.title ?? `Contact ${displayName} - Get in Touch With Our Team`\n }\n description={\n seo.description ??\n `Ready to transform your business? Contact our team for sales inquiries, technical support, or partnership opportunities. We're here to help you succeed.`\n }\n productName={displayName}\n keywords={\n seo.keywords ??\n `contact ${displayName.toLowerCase()}, sales inquiries, customer support, technical support, partnership opportunities, get in touch`\n }\n image={seo.image ?? \"/og-image-contact.png\"}\n url={seo.url}\n />\n )}\n\n {/* Hero Section — full page hero (h1) by default; compact section\n header (h2) when embedded in a page that already owns the <h1>.\n An embedding page may blank both the title and the description to\n drop the header entirely; rendering an empty heading would be\n announced by screen readers as a nameless heading (axe\n \"empty-heading\"), so the section is skipped instead. */}\n {hasHero && (\n <section\n className={\n headingLevel === 2\n ? \"py-12 md:py-16\"\n : \"bg-gradient-to-b from-background to-muted/20 py-12 sm:py-16 md:py-20 lg:py-24\"\n }\n >\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"text-center max-w-3xl mx-auto\">\n {!heroTitle.trim() ? null : headingLevel === 2 ? (\n <h2 className=\"text-2xl md:text-3xl font-bold mb-3\">\n {heroTitle}\n </h2>\n ) : (\n <h1 className=\"text-3xl sm:text-4xl md:text-5xl font-bold mb-4 sm:mb-6\">\n {heroTitle}\n </h1>\n )}\n {heroDescriptionText && (\n <p className=\"text-lg sm:text-xl text-muted-foreground leading-relaxed\">\n {heroDescriptionText}\n </p>\n )}\n </div>\n </div>\n </section>\n )}\n\n {/* Contact Form and Info */}\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <div className=\"grid sm:grid-cols-1 lg:grid-cols-3 gap-8 sm:gap-10 lg:gap-12\">\n {/* Contact Information */}\n <div className=\"lg:col-span-1 order-2 lg:order-1\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Contact Information\n </h2>\n\n <div className=\"space-y-4 sm:space-y-6\">\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Mail className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Email\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base break-all\">\n {contactEmail}\n </p>\n </div>\n </div>\n\n {contactPhone && (\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Phone className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Phone\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {contactPhone}\n </p>\n </div>\n </div>\n )}\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <MapPin className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Office\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base leading-relaxed\">\n {officeAddress.line1}\n <br />\n {officeAddress.line2}\n <br />\n {officeAddress.line3}\n <br />\n {officeAddress.country}\n </p>\n </div>\n </div>\n\n <div className=\"flex items-start space-x-3 sm:space-x-4\">\n <div className=\"w-8 h-8 sm:w-10 sm:h-10 bg-primary/10 rounded-lg flex items-center justify-center flex-shrink-0\">\n <Clock className=\"h-4 w-4 sm:h-5 sm:w-5 text-primary\" />\n </div>\n <div className=\"min-w-0 flex-1\">\n <h3 className=\"font-semibold mb-1 text-sm sm:text-base\">\n Response Time\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base\">\n {responseTime}\n </p>\n </div>\n </div>\n </div>\n </div>\n\n {/* Contact Form */}\n <div className=\"lg:col-span-2 order-1 lg:order-2\">\n <div className=\"bg-card border rounded-lg p-4 sm:p-6 md:p-8\">\n <h2 className=\"text-xl sm:text-2xl font-bold mb-4 sm:mb-6\">\n Send us a Message\n </h2>\n\n <form\n onSubmit={handleSubmit}\n className=\"space-y-4 sm:space-y-6\"\n {...recaptchaGate.formProps}\n >\n <div className=\"grid sm:grid-cols-2 gap-4 sm:gap-6\">\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"firstName\"\n className=\"text-sm sm:text-base\"\n >\n First Name *\n </Label>\n <Input\n id=\"firstName\"\n name=\"firstName\"\n required\n placeholder=\"John\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"lastName\"\n className=\"text-sm sm:text-base\"\n >\n Last Name *\n </Label>\n <Input\n id=\"lastName\"\n name=\"lastName\"\n required\n placeholder=\"Doe\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"email\" className=\"text-sm sm:text-base\">\n Email *\n </Label>\n <Input\n id=\"email\"\n name=\"email\"\n type=\"email\"\n required\n placeholder=\"john@company.com\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"company\" className=\"text-sm sm:text-base\">\n Company\n </Label>\n <Input\n id=\"company\"\n name=\"company\"\n placeholder=\"Acme Inc.\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n {categories.length > 0 && (\n <div className=\"space-y-2\">\n <Label\n htmlFor=\"category\"\n className=\"text-sm sm:text-base\"\n >\n {categoryLabel}\n {categoryRequired ? \" *\" : \"\"}\n </Label>\n <Select\n id=\"category\"\n name=\"category\"\n required={categoryRequired}\n defaultValue=\"\"\n className=\"text-sm sm:text-base\"\n >\n {/*\n * `disabled` is tied to `categoryRequired` on\n * purpose. When required, the placeholder is\n * locked out so the native form-validation can\n * enforce that the user picks a real value;\n * when optional, leaving it enabled lets the\n * user clear an accidental selection back to\n * the empty / uncategorized state (otherwise\n * an optional dropdown becomes effectively\n * sticky after any click). The form-submit\n * handler treats `category === ''` as\n * `undefined` on the wire so unselected\n * submissions don't carry a category at all.\n */}\n <option value=\"\" disabled={categoryRequired}>\n {categoryPlaceholder}\n </option>\n {categories.map((c) => (\n <option key={c.value} value={c.value}>\n {c.label}\n </option>\n ))}\n </Select>\n </div>\n )}\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"subject\" className=\"text-sm sm:text-base\">\n Subject *\n </Label>\n <Input\n id=\"subject\"\n name=\"subject\"\n required\n placeholder=\"How can we help you?\"\n className=\"text-sm sm:text-base\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <Label htmlFor=\"message\" className=\"text-sm sm:text-base\">\n Message *\n </Label>\n <Textarea\n id=\"message\"\n name=\"message\"\n required\n placeholder=\"Tell us more about your needs...\"\n rows={5}\n className=\"text-sm sm:text-base min-h-[120px] sm:min-h-[150px] resize-y\"\n />\n </div>\n\n <div className=\"space-y-4\">\n {effectiveRecaptchaSiteKey && (\n <div\n className=\"flex justify-center sm:justify-start\"\n style={{ minHeight: RECAPTCHA_WIDGET_HEIGHT }}\n >\n {/* Mounted on first engagement — see useDeferredRecaptcha. */}\n {recaptchaGate.armed && (\n <ReCAPTCHA\n ref={recaptchaRef}\n sitekey={effectiveRecaptchaSiteKey}\n />\n )}\n </div>\n )}\n\n <Button\n type=\"submit\"\n size=\"lg\"\n disabled={isSubmitting}\n className=\"w-full sm:w-auto min-w-[200px]\"\n >\n {isSubmitting ? (\n \"Sending...\"\n ) : (\n <>\n Send Message <Send className=\"ml-2 h-4 w-4\" />\n </>\n )}\n </Button>\n </div>\n\n {submitStatus === \"success\" && (\n <div className=\"p-3 sm:p-4 bg-green-50 border border-green-200 rounded-lg text-green-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Message sent successfully!\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Thank you for contacting {displayName}. We&apos;ll get\n back to you within 24 hours.\n </p>\n </div>\n )}\n\n {submitStatus === \"error\" && (\n <div className=\"p-3 sm:p-4 bg-red-50 border border-red-200 rounded-lg text-red-800 mt-4\">\n <p className=\"font-medium text-sm sm:text-base\">\n Failed to send message\n </p>\n <p className=\"text-xs sm:text-sm mt-1\">\n Please try again later or contact us directly at{\" \"}\n {contactEmail}\n </p>\n </div>\n )}\n </form>\n </div>\n </div>\n </div>\n </div>\n </section>\n\n {/* Additional Contact Options — hidden when additionalOptions is empty */}\n {additionalOptions.length > 0 && (\n <section className=\"py-12 sm:py-16 md:py-20 lg:py-24 bg-muted/30\">\n <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n <h2 className=\"text-2xl sm:text-3xl font-bold text-center mb-8 sm:mb-12\">\n More Ways to Connect\n </h2>\n\n <div className=\"grid sm:grid-cols-2 lg:grid-cols-3 gap-6 sm:gap-8 max-w-5xl mx-auto\">\n {additionalOptions.map((option, index) => (\n <div\n key={index}\n className=\"text-center p-4 sm:p-6 bg-card border rounded-lg\"\n >\n <h3 className=\"font-semibold text-base sm:text-lg mb-2\">\n {option.title}\n </h3>\n <p className=\"text-muted-foreground text-sm sm:text-base mb-4 leading-relaxed\">\n {replacePlaceholders(\n option.description,\n displayName,\n contactEmail,\n )}\n </p>\n <Button\n variant=\"outline\"\n asChild\n className=\"text-sm sm:text-base\"\n >\n <a href={option.buttonLink}>{option.buttonText}</a>\n </Button>\n </div>\n ))}\n </div>\n </div>\n </section>\n )}\n </div>\n );\n}\n"]}