@sonordev/site-kit 3.0.5 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/AGENTS.md +107 -0
  2. package/agent-manifest.json +377 -0
  3. package/dist/AnalyticsProvider-A3STXJ65.js +29 -0
  4. package/dist/{AnalyticsProvider-WTOGN7LV.js.map → AnalyticsProvider-A3STXJ65.js.map} +1 -1
  5. package/dist/AnalyticsProvider-LEXGFM2K.mjs +8 -0
  6. package/dist/{AnalyticsProvider-MLT26JRP.mjs.map → AnalyticsProvider-LEXGFM2K.mjs.map} +1 -1
  7. package/dist/BlogPostFaqSection-4AD2NIGG.js +13 -0
  8. package/dist/{BlogPostFaqSection-H556RV62.js.map → BlogPostFaqSection-4AD2NIGG.js.map} +1 -1
  9. package/dist/{BlogPostFaqSection-VSHOKKUD.mjs → BlogPostFaqSection-TU6YEC7P.mjs} +3 -3
  10. package/dist/{BlogPostFaqSection-VSHOKKUD.mjs.map → BlogPostFaqSection-TU6YEC7P.mjs.map} +1 -1
  11. package/dist/ChatWidget-4QR2ZDRE.mjs +8 -0
  12. package/dist/{ChatWidget-QPZTPSPE.mjs.map → ChatWidget-4QR2ZDRE.mjs.map} +1 -1
  13. package/dist/ChatWidget-U3K2VHVN.js +17 -0
  14. package/dist/{ChatWidget-MAL7FB4M.js.map → ChatWidget-U3K2VHVN.js.map} +1 -1
  15. package/dist/EngageWidget-2FMKYJJT.mjs +7 -0
  16. package/dist/{EngageWidget-IPBUA4DW.mjs.map → EngageWidget-2FMKYJJT.mjs.map} +1 -1
  17. package/dist/EngageWidget-TOGMQ2G6.js +16 -0
  18. package/dist/{EngageWidget-N3CABK3L.js.map → EngageWidget-TOGMQ2G6.js.map} +1 -1
  19. package/dist/{SignalCore-4MDIJUAP.mjs → SignalCore-5QJG3IJB.mjs} +60 -47
  20. package/dist/SignalCore-5QJG3IJB.mjs.map +1 -0
  21. package/dist/{SignalCore-ZMFUE3N4.js → SignalCore-JB3VHHTG.js} +60 -47
  22. package/dist/SignalCore-JB3VHHTG.js.map +1 -0
  23. package/dist/SitemapSync-BJWSTERT.js +15 -0
  24. package/dist/{SitemapSync-FUCH6Y6J.js.map → SitemapSync-BJWSTERT.js.map} +1 -1
  25. package/dist/SitemapSync-T6PIDW64.mjs +6 -0
  26. package/dist/{SitemapSync-LCSPRAWU.mjs.map → SitemapSync-T6PIDW64.mjs.map} +1 -1
  27. package/dist/analytics/index.js +11 -9
  28. package/dist/analytics/index.mjs +4 -2
  29. package/dist/blog/index.js +12 -12
  30. package/dist/blog/index.mjs +2 -2
  31. package/dist/blog/server-ui.js +5 -5
  32. package/dist/blog/server-ui.mjs +1 -1
  33. package/dist/brand.css +21 -6
  34. package/dist/{chunk-O7E6QVK3.js → chunk-52VXHSVT.js} +3 -3
  35. package/dist/{chunk-O7E6QVK3.js.map → chunk-52VXHSVT.js.map} +1 -1
  36. package/dist/{chunk-I2GTT2DG.js → chunk-5RX4CUR2.js} +19 -21
  37. package/dist/chunk-5RX4CUR2.js.map +1 -0
  38. package/dist/{chunk-5AESOLXS.mjs → chunk-5ZNKNNJ4.mjs} +13 -11
  39. package/dist/chunk-5ZNKNNJ4.mjs.map +1 -0
  40. package/dist/{chunk-3YQCPLGP.mjs → chunk-7OK6BI3A.mjs} +41 -79
  41. package/dist/chunk-7OK6BI3A.mjs.map +1 -0
  42. package/dist/{chunk-TCVHI3JP.mjs → chunk-7R7SGJG3.mjs} +71 -109
  43. package/dist/chunk-7R7SGJG3.mjs.map +1 -0
  44. package/dist/{chunk-FT5JNCD4.mjs → chunk-AB2VYIYU.mjs} +11 -11
  45. package/dist/{chunk-FT5JNCD4.mjs.map → chunk-AB2VYIYU.mjs.map} +1 -1
  46. package/dist/{chunk-FMZOZQBV.mjs → chunk-AMBTOIYM.mjs} +19 -21
  47. package/dist/chunk-AMBTOIYM.mjs.map +1 -0
  48. package/dist/chunk-B5YNHSRA.js +102 -0
  49. package/dist/chunk-B5YNHSRA.js.map +1 -0
  50. package/dist/{chunk-I5TJIESQ.js → chunk-BMKZHXWQ.js} +11 -11
  51. package/dist/{chunk-I5TJIESQ.js.map → chunk-BMKZHXWQ.js.map} +1 -1
  52. package/dist/{chunk-NNZDHLXN.js → chunk-BNBCSHTK.js} +35 -9
  53. package/dist/chunk-BNBCSHTK.js.map +1 -0
  54. package/dist/{chunk-AN4ATCYQ.mjs → chunk-BUCF5FUY.mjs} +3 -3
  55. package/dist/{chunk-AN4ATCYQ.mjs.map → chunk-BUCF5FUY.mjs.map} +1 -1
  56. package/dist/{chunk-3GCEFS73.js → chunk-DCZUMCEC.js} +39 -62
  57. package/dist/chunk-DCZUMCEC.js.map +1 -0
  58. package/dist/{chunk-EUDTPXUI.mjs → chunk-DYCEEU67.mjs} +3 -3
  59. package/dist/{chunk-EUDTPXUI.mjs.map → chunk-DYCEEU67.mjs.map} +1 -1
  60. package/dist/chunk-E4TWVVSW.mjs +97 -0
  61. package/dist/chunk-E4TWVVSW.mjs.map +1 -0
  62. package/dist/{chunk-VCWSSGCU.js → chunk-E7M5MDGC.js} +32 -43
  63. package/dist/chunk-E7M5MDGC.js.map +1 -0
  64. package/dist/{chunk-QTWA44S3.mjs → chunk-GMO6POZ2.mjs} +7 -8
  65. package/dist/chunk-GMO6POZ2.mjs.map +1 -0
  66. package/dist/chunk-GMSPDTEV.js +264 -0
  67. package/dist/chunk-GMSPDTEV.js.map +1 -0
  68. package/dist/{chunk-UJQYSVYV.js → chunk-GQF6QAQS.js} +4 -4
  69. package/dist/{chunk-UJQYSVYV.js.map → chunk-GQF6QAQS.js.map} +1 -1
  70. package/dist/{chunk-65SMJBHW.mjs → chunk-IR5UC236.mjs} +69 -74
  71. package/dist/chunk-IR5UC236.mjs.map +1 -0
  72. package/dist/{chunk-MLJXELPA.js → chunk-LF3ID6WN.js} +71 -111
  73. package/dist/chunk-LF3ID6WN.js.map +1 -0
  74. package/dist/{chunk-YFGKIKXA.mjs → chunk-MKZHVSKL.mjs} +3 -3
  75. package/dist/{chunk-YFGKIKXA.mjs.map → chunk-MKZHVSKL.mjs.map} +1 -1
  76. package/dist/{chunk-IBDVZ6BF.js → chunk-MX6DK246.js} +69 -74
  77. package/dist/chunk-MX6DK246.js.map +1 -0
  78. package/dist/{chunk-DGHPOWLU.js → chunk-MYAXI33P.js} +8 -8
  79. package/dist/{chunk-DGHPOWLU.js.map → chunk-MYAXI33P.js.map} +1 -1
  80. package/dist/{chunk-YJWKHCOB.js → chunk-NDROQRDB.js} +13 -11
  81. package/dist/chunk-NDROQRDB.js.map +1 -0
  82. package/dist/{chunk-RI6JZUAE.js → chunk-NJIHMZPC.js} +7 -8
  83. package/dist/chunk-NJIHMZPC.js.map +1 -0
  84. package/dist/{chunk-KHFNPPOX.mjs → chunk-NQ2P7AB3.mjs} +31 -42
  85. package/dist/chunk-NQ2P7AB3.mjs.map +1 -0
  86. package/dist/{chunk-PST3NOEM.mjs → chunk-O237KKCX.mjs} +4 -4
  87. package/dist/{chunk-PST3NOEM.mjs.map → chunk-O237KKCX.mjs.map} +1 -1
  88. package/dist/chunk-Q2NBD54V.js +69 -0
  89. package/dist/chunk-Q2NBD54V.js.map +1 -0
  90. package/dist/chunk-QLM7RNQI.mjs +6 -0
  91. package/dist/chunk-QLM7RNQI.mjs.map +1 -0
  92. package/dist/chunk-SBT4J733.mjs +259 -0
  93. package/dist/chunk-SBT4J733.mjs.map +1 -0
  94. package/dist/{chunk-EBJ4S5DU.js → chunk-SGPIGHMN.js} +4 -4
  95. package/dist/{chunk-EBJ4S5DU.js.map → chunk-SGPIGHMN.js.map} +1 -1
  96. package/dist/chunk-V6NVBFEP.js +54 -0
  97. package/dist/chunk-V6NVBFEP.js.map +1 -0
  98. package/dist/{chunk-KMZ527EM.mjs → chunk-VTHCUHMK.mjs} +34 -8
  99. package/dist/chunk-VTHCUHMK.mjs.map +1 -0
  100. package/dist/chunk-WAAFJPNR.js +8 -0
  101. package/dist/chunk-WAAFJPNR.js.map +1 -0
  102. package/dist/chunk-WZHWWOUC.js +51 -0
  103. package/dist/chunk-WZHWWOUC.js.map +1 -0
  104. package/dist/chunk-X3S6KXAP.mjs +47 -0
  105. package/dist/chunk-X3S6KXAP.mjs.map +1 -0
  106. package/dist/chunk-X4OPM3SK.mjs +43 -0
  107. package/dist/chunk-X4OPM3SK.mjs.map +1 -0
  108. package/dist/{chunk-T4QBSRA4.mjs → chunk-XHEXIYKY.mjs} +37 -60
  109. package/dist/chunk-XHEXIYKY.mjs.map +1 -0
  110. package/dist/{chunk-IFVMZFNT.js → chunk-XM67L4HL.js} +41 -79
  111. package/dist/chunk-XM67L4HL.js.map +1 -0
  112. package/dist/chunk-ZPLN537Q.mjs +57 -0
  113. package/dist/chunk-ZPLN537Q.mjs.map +1 -0
  114. package/dist/cli/index.js +8986 -1276
  115. package/dist/cli/index.js.map +1 -1
  116. package/dist/cli/index.mjs +8972 -1280
  117. package/dist/cli/index.mjs.map +1 -1
  118. package/dist/commerce/index.js +50 -48
  119. package/dist/commerce/index.mjs +5 -3
  120. package/dist/engage/index.js +11 -8
  121. package/dist/engage/index.js.map +1 -1
  122. package/dist/engage/index.mjs +8 -5
  123. package/dist/engage/index.mjs.map +1 -1
  124. package/dist/fleet/contract.d.mts +99 -0
  125. package/dist/fleet/contract.d.ts +99 -0
  126. package/dist/fleet/contract.js +53 -0
  127. package/dist/fleet/contract.js.map +1 -0
  128. package/dist/fleet/contract.mjs +4 -0
  129. package/dist/fleet/contract.mjs.map +1 -0
  130. package/dist/fleet/index.d.mts +89 -0
  131. package/dist/fleet/index.d.ts +89 -0
  132. package/dist/fleet/index.js +74 -0
  133. package/dist/fleet/index.js.map +1 -0
  134. package/dist/fleet/index.mjs +9 -0
  135. package/dist/fleet/index.mjs.map +1 -0
  136. package/dist/forms/contract.d.mts +69 -0
  137. package/dist/forms/contract.d.ts +69 -0
  138. package/dist/forms/contract.js +33 -0
  139. package/dist/forms/contract.js.map +1 -0
  140. package/dist/forms/contract.mjs +4 -0
  141. package/dist/forms/contract.mjs.map +1 -0
  142. package/dist/forms/index.js +27 -23
  143. package/dist/forms/index.js.map +1 -1
  144. package/dist/forms/index.mjs +20 -16
  145. package/dist/forms/index.mjs.map +1 -1
  146. package/dist/forms/styles.css +14 -10
  147. package/dist/images/index.js +10 -8
  148. package/dist/images/index.mjs +3 -1
  149. package/dist/index.js +103 -102
  150. package/dist/index.js.map +1 -1
  151. package/dist/index.mjs +14 -13
  152. package/dist/index.mjs.map +1 -1
  153. package/dist/layout/client.d.mts +8 -1
  154. package/dist/layout/client.d.ts +8 -1
  155. package/dist/layout/client.js +8 -3
  156. package/dist/layout/client.mjs +7 -2
  157. package/dist/layout/index.d.mts +7 -1
  158. package/dist/layout/index.d.ts +7 -1
  159. package/dist/layout/index.js +57 -4
  160. package/dist/layout/index.js.map +1 -1
  161. package/dist/layout/index.mjs +56 -3
  162. package/dist/layout/index.mjs.map +1 -1
  163. package/dist/maps/index.d.mts +4 -2
  164. package/dist/maps/index.d.ts +4 -2
  165. package/dist/maps/index.js +9 -18
  166. package/dist/maps/index.js.map +1 -1
  167. package/dist/maps/index.mjs +9 -18
  168. package/dist/maps/index.mjs.map +1 -1
  169. package/dist/portfolio/contract.d.mts +61 -0
  170. package/dist/portfolio/contract.d.ts +61 -0
  171. package/dist/portfolio/contract.js +43 -0
  172. package/dist/portfolio/contract.js.map +1 -0
  173. package/dist/portfolio/contract.mjs +38 -0
  174. package/dist/portfolio/contract.mjs.map +1 -0
  175. package/dist/seo/client.js +4 -2
  176. package/dist/seo/client.mjs +3 -1
  177. package/dist/seo/index.js +4 -2
  178. package/dist/seo/index.js.map +1 -1
  179. package/dist/seo/index.mjs +3 -1
  180. package/dist/seo/index.mjs.map +1 -1
  181. package/dist/seo-pages/contract.d.mts +62 -0
  182. package/dist/seo-pages/contract.d.ts +62 -0
  183. package/dist/seo-pages/contract.js +48 -0
  184. package/dist/seo-pages/contract.js.map +1 -0
  185. package/dist/seo-pages/contract.mjs +44 -0
  186. package/dist/seo-pages/contract.mjs.map +1 -0
  187. package/dist/signal/index.js +11 -11
  188. package/dist/signal/index.mjs +2 -2
  189. package/dist/sites/contract.d.mts +57 -0
  190. package/dist/sites/contract.d.ts +57 -0
  191. package/dist/sites/contract.js +37 -0
  192. package/dist/sites/contract.js.map +1 -0
  193. package/dist/sites/contract.mjs +4 -0
  194. package/dist/sites/contract.mjs.map +1 -0
  195. package/dist/sync/index.js +15 -13
  196. package/dist/sync/index.mjs +3 -1
  197. package/package.json +44 -4
  198. package/skills/site-kit/SKILL.md +66 -0
  199. package/dist/AnalyticsProvider-MLT26JRP.mjs +0 -6
  200. package/dist/AnalyticsProvider-WTOGN7LV.js +0 -27
  201. package/dist/BlogPostFaqSection-H556RV62.js +0 -13
  202. package/dist/ChatWidget-MAL7FB4M.js +0 -14
  203. package/dist/ChatWidget-QPZTPSPE.mjs +0 -5
  204. package/dist/EngageWidget-IPBUA4DW.mjs +0 -5
  205. package/dist/EngageWidget-N3CABK3L.js +0 -14
  206. package/dist/SignalCore-4MDIJUAP.mjs.map +0 -1
  207. package/dist/SignalCore-ZMFUE3N4.js.map +0 -1
  208. package/dist/SitemapSync-FUCH6Y6J.js +0 -13
  209. package/dist/SitemapSync-LCSPRAWU.mjs +0 -4
  210. package/dist/chunk-3GCEFS73.js.map +0 -1
  211. package/dist/chunk-3YQCPLGP.mjs.map +0 -1
  212. package/dist/chunk-5AESOLXS.mjs.map +0 -1
  213. package/dist/chunk-65SMJBHW.mjs.map +0 -1
  214. package/dist/chunk-FMZOZQBV.mjs.map +0 -1
  215. package/dist/chunk-I2GTT2DG.js.map +0 -1
  216. package/dist/chunk-IBDVZ6BF.js.map +0 -1
  217. package/dist/chunk-IFVMZFNT.js.map +0 -1
  218. package/dist/chunk-KHFNPPOX.mjs.map +0 -1
  219. package/dist/chunk-KMZ527EM.mjs.map +0 -1
  220. package/dist/chunk-MLJXELPA.js.map +0 -1
  221. package/dist/chunk-NNZDHLXN.js.map +0 -1
  222. package/dist/chunk-QTWA44S3.mjs.map +0 -1
  223. package/dist/chunk-RI6JZUAE.js.map +0 -1
  224. package/dist/chunk-T4QBSRA4.mjs.map +0 -1
  225. package/dist/chunk-TCVHI3JP.mjs.map +0 -1
  226. package/dist/chunk-VCWSSGCU.js.map +0 -1
  227. package/dist/chunk-YJWKHCOB.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engage/EchoUiActions.tsx","../src/engage/ChatWidget.tsx"],"names":["alpha","messages","jsx","jsxs"],"mappings":"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","file":"chunk-KHFNPPOX.mjs","sourcesContent":["/**\n * @sonordev/site-kit/engage - Echo UI Actions\n *\n * Renders the optional `uiActions` the visitor Echo concierge returns alongside\n * a chat reply (see signal-api echo.service.ts). Rendered beneath the assistant\n * message in ChatWidget, on-brand with the widget's primary-color tokens.\n *\n * - show_form → compact inline managed form (reuses the canonical\n * forms `useForm` fetch/validate/submit path) with optional prefill.\n * - suggest_action → clickable chip; sends the message as the next turn, or\n * navigates when the action is a path/URL.\n * - show_portfolio_item → intentionally ignored. Portfolio is Upforge-specific\n * and Upforge runs its own custom Echo chat, not this widget.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useForm } from '../forms/useForm'\nimport type { FormField } from '../forms/types'\nimport type { UiAction } from './types'\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** rgba() from the widget's primary-color RGB triplet (mirrors ChatWidget.hexAlpha). */\nfunction alpha(rgb: string, a: number): string {\n return `rgba(var(--sk-primary-rgb, ${rgb}), ${a})`\n}\n\nfunction asString(v: unknown): string | undefined {\n return typeof v === 'string' && v.trim() ? v : undefined\n}\n\nfunction asRecord(v: unknown): Record<string, unknown> | undefined {\n return v && typeof v === 'object' && !Array.isArray(v) ? (v as Record<string, unknown>) : undefined\n}\n\n/** A path / URL / scheme we should navigate to rather than send as a chat turn. */\nfunction isNavigable(action: string): boolean {\n return /^(https?:\\/\\/|\\/|#|tel:|mailto:)/i.test(action.trim())\n}\n\n// ---------------------------------------------------------------------------\n// Inline managed form (show_form)\n// ---------------------------------------------------------------------------\n\ninterface InlineManagedFormProps {\n slug: string\n prefill?: Record<string, unknown>\n primaryColor: string\n primaryRgb: string\n}\n\nconst DISPLAY_ONLY: ReadonlyArray<string> = ['heading', 'section_header', 'paragraph']\n\nfunction InlineManagedForm({ slug, prefill, primaryColor, primaryRgb }: InlineManagedFormProps) {\n const {\n form,\n isLoading,\n fetchError,\n submitError,\n visibleFields,\n values,\n errors,\n setFieldValue,\n submit,\n isSubmitting,\n isComplete,\n } = useForm(slug, { initialValues: prefill || {} })\n\n const cardStyle: React.CSSProperties = {\n marginTop: 8,\n padding: 12,\n borderRadius: 12,\n border: `1px solid ${alpha(primaryRgb, 0.25)}`,\n backgroundColor: alpha(primaryRgb, 0.04),\n }\n\n if (isLoading) {\n return (\n <div style={cardStyle}>\n <p style={{ margin: 0, fontSize: 13, color: 'var(--sk-text-tertiary, #9ca3af)' }}>Loading form…</p>\n </div>\n )\n }\n\n if (fetchError || !form) {\n return (\n <div style={cardStyle}>\n <p style={{ margin: 0, fontSize: 13, color: 'var(--sk-text-tertiary, #9ca3af)' }}>\n This form is unavailable right now.\n </p>\n </div>\n )\n }\n\n if (isComplete) {\n return (\n <div style={cardStyle} role=\"status\" aria-live=\"polite\">\n <p style={{ margin: 0, fontSize: 13.5, color: 'var(--sk-text-primary, #111827)', lineHeight: 1.5 }}>\n {form.success_message}\n </p>\n </div>\n )\n }\n\n const inputBase: React.CSSProperties = {\n width: '100%',\n padding: '8px 10px',\n borderRadius: 8,\n // Longhand (not the `border` shorthand) so the error-state `borderColor`\n // override doesn't mix shorthand+longhand and trigger React's style warning.\n borderWidth: 1,\n borderStyle: 'solid',\n borderColor: 'var(--sk-border, #e5e7eb)',\n backgroundColor: 'var(--sk-bg, #ffffff)',\n color: 'var(--sk-text-primary, #111827)',\n fontSize: 13.5,\n boxSizing: 'border-box',\n outline: 'none',\n }\n\n const renderField = (field: FormField) => {\n const value = values[field.slug]\n const strValue = value == null ? '' : String(value)\n const err = errors[field.slug]\n const labelEl =\n !field.hide_label && field.label ? (\n <label\n htmlFor={`echo-form-${form.id}-${field.slug}`}\n style={{ display: 'block', fontSize: 12.5, fontWeight: 600, marginBottom: 4, color: 'var(--sk-text-secondary, #4b5563)' }}\n >\n {field.label}\n {field.is_required ? <span style={{ color: 'var(--sk-error, #ef4444)' }}> *</span> : null}\n </label>\n ) : null\n const id = `echo-form-${form.id}-${field.slug}`\n const common = {\n id,\n placeholder: field.placeholder || (field.hide_label ? field.label : undefined),\n 'aria-invalid': !!err,\n style: { ...inputBase, ...(err ? { borderColor: 'var(--sk-error, #ef4444)' } : {}) },\n } as const\n\n let control: React.ReactNode\n switch (field.field_type) {\n case 'textarea':\n control = (\n <textarea\n {...common}\n rows={3}\n value={strValue}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n style={{ ...common.style, resize: 'vertical' as const }}\n />\n )\n break\n case 'select':\n control = (\n <select {...common} value={strValue} onChange={(e) => setFieldValue(field.slug, e.target.value)}>\n <option value=\"\">{field.placeholder || 'Select…'}</option>\n {(field.options || []).map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n break\n case 'radio':\n control = (\n <div role=\"radiogroup\" style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {(field.options || []).map((opt) => (\n <label key={opt.value} style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 13, cursor: 'pointer' }}>\n <input\n type=\"radio\"\n name={id}\n checked={strValue === opt.value}\n onChange={() => setFieldValue(field.slug, opt.value)}\n />\n {opt.label}\n </label>\n ))}\n </div>\n )\n break\n case 'checkbox':\n control = (\n <label style={{ display: 'flex', alignItems: 'center', gap: 6, fontSize: 13, cursor: 'pointer' }}>\n <input\n type=\"checkbox\"\n checked={value === true || value === 'true'}\n onChange={(e) => setFieldValue(field.slug, e.target.checked)}\n />\n {field.placeholder || field.label}\n </label>\n )\n break\n default: {\n const typeMap: Record<string, string> = {\n email: 'email',\n phone: 'tel',\n tel: 'tel',\n number: 'number',\n date: 'date',\n time: 'time',\n datetime: 'datetime-local',\n }\n control = (\n <input\n {...common}\n type={typeMap[field.field_type] || 'text'}\n value={strValue}\n onChange={(e) => setFieldValue(field.slug, e.target.value)}\n />\n )\n }\n }\n\n return (\n <div key={field.id || field.slug} style={{ marginBottom: 8 }}>\n {field.field_type === 'checkbox' ? null : labelEl}\n {control}\n {err ? <p style={{ margin: '4px 0 0', fontSize: 11.5, color: 'var(--sk-error, #ef4444)' }}>{err}</p> : null}\n </div>\n )\n }\n\n return (\n <form\n style={cardStyle}\n onSubmit={(e) => {\n e.preventDefault()\n void submit()\n }}\n >\n {form.name ? (\n <div style={{ fontSize: 13.5, fontWeight: 600, marginBottom: 8, color: 'var(--sk-text-primary, #111827)' }}>\n {form.name}\n </div>\n ) : null}\n\n {visibleFields.map((field) => {\n if (field.field_type === 'hidden') return null\n if (DISPLAY_ONLY.includes(field.field_type)) {\n return (\n <p key={field.id || field.slug} style={{ margin: '0 0 8px', fontSize: 12.5, color: 'var(--sk-text-secondary, #4b5563)' }}>\n {field.label}\n </p>\n )\n }\n return renderField(field)\n })}\n\n {submitError ? (\n <p role=\"alert\" style={{ margin: '0 0 8px', fontSize: 12, color: 'var(--sk-error, #ef4444)' }}>\n {submitError}\n </p>\n ) : null}\n\n <button\n type=\"submit\"\n disabled={isSubmitting}\n style={{\n width: '100%',\n padding: '9px 14px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: primaryColor,\n color: '#fff',\n fontSize: 13.5,\n fontWeight: 600,\n cursor: isSubmitting ? 'default' : 'pointer',\n opacity: isSubmitting ? 0.7 : 1,\n }}\n >\n {isSubmitting ? 'Sending…' : form.submit_button_text || 'Submit'}\n </button>\n </form>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Suggestion-action chip (suggest_action)\n// ---------------------------------------------------------------------------\n\ninterface SuggestActionChipProps {\n action?: string\n message: string\n primaryColor: string\n primaryRgb: string\n onSuggest: (action: string | undefined, message: string) => void\n}\n\nfunction SuggestActionChip({ action, message, primaryColor, primaryRgb, onSuggest }: SuggestActionChipProps) {\n return (\n <button\n type=\"button\"\n onClick={() => onSuggest(action, message)}\n style={{\n padding: '6px 12px',\n borderRadius: 16,\n border: `1px solid ${primaryColor}`,\n backgroundColor: alpha(primaryRgb, 0.063),\n color: primaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n {message}\n </button>\n )\n}\n\n// ---------------------------------------------------------------------------\n// Dispatcher\n// ---------------------------------------------------------------------------\n\nexport interface EchoUiActionsProps {\n actions: UiAction[]\n primaryColor: string\n primaryRgb: string\n /** Called by a suggest_action chip — send the message as the next turn or navigate. */\n onSuggest: (action: string | undefined, message: string) => void\n}\n\nexport function EchoUiActions({ actions, primaryColor, primaryRgb, onSuggest }: EchoUiActionsProps) {\n if (!actions?.length) return null\n\n // Group the suggest_action chips so they flow together like the suggestion row.\n const chips = actions.filter((a) => a?.type === 'suggest_action')\n const forms = actions.filter((a) => a?.type === 'show_form')\n // show_portfolio_item (and any unknown type) is intentionally not rendered here.\n\n if (!chips.length && !forms.length) return null\n\n return (\n <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 8 }}>\n {forms.map((a, i) => {\n const slug = asString(a.data?.formSlug)\n if (!slug) return null\n return (\n <InlineManagedForm\n key={`form-${slug}-${i}`}\n slug={slug}\n prefill={asRecord(a.data?.prefill)}\n primaryColor={primaryColor}\n primaryRgb={primaryRgb}\n />\n )\n })}\n\n {chips.length ? (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6 }}>\n {chips.map((a, i) => {\n const message = asString(a.data?.message)\n const action = asString(a.data?.action)\n // A chip needs a label — fall back to the action when no message is given.\n const label = message || action\n if (!label) return null\n return (\n <SuggestActionChip\n key={`chip-${i}`}\n action={action}\n message={label}\n primaryColor={primaryColor}\n primaryRgb={primaryRgb}\n onSuggest={onSuggest}\n />\n )\n })}\n </div>\n ) : null}\n </div>\n )\n}\n\nexport { isNavigable }\n","/**\n * @sonordev/site-kit/engage - Chat Widget (Redesigned)\n *\n * Features:\n * - Pulls brand colors (primary/secondary) + business info from project settings via API\n * - Welcome screen with quick-action chips before first message\n * - Echo (AI) chat when mode is ai / hybrid; gateway returns Echo responses\n * - Automated handoff to live agent (re-checks availability; if agents online, POST handoff)\n * - Managed offline form when nobody is online (configurable heading/subheading)\n * - Socket.io with auto-reconnect for real-time live chat\n * - Proper AI → Live → Offline sequence routing\n */\n\n'use client'\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport type { ChatConfig, UiAction } from './types'\nimport { EchoUiActions, isNavigable } from './EchoUiActions'\n\n// Socket type — the actual library is lazy-loaded via socket-loader.ts\n// to keep socket.io-client out of the main bundle entirely.\ntype Socket = { connected: boolean; disconnect: () => void; on: (ev: string, fn: (...args: any[]) => void) => void; emit: (ev: string, data?: any) => void }\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\ninterface ChatWidgetProps {\n /** Optional: resolved from API key via project-info when not provided */\n projectId?: string\n config?: Partial<ChatConfig>\n apiUrl?: string\n /** Signal API base URL for direct AI chat (no Portal passthrough) */\n signalUrl?: string\n /** Clickable question chips shown in the welcome screen before the first message */\n suggested_questions?: string[]\n /** Name shown in the chat header for the AI assistant (overrides API config) */\n assistant_name?: string\n /** Welcome message shown when chat first opens (overrides API config) */\n welcome_message?: string\n /** Avatar URL for the assistant shown in the header */\n assistant_avatar?: string\n}\n\ninterface MessageAttachment {\n name: string\n url: string\n size?: number\n mimeType?: string\n}\n\ninterface Message {\n id: string\n role: 'user' | 'assistant' | 'agent' | 'system'\n content: string\n timestamp: Date\n agentName?: string\n attachments?: MessageAttachment[]\n suggestions?: string[]\n sendFailed?: boolean\n /** When true, show \"Talk to a person\" button (AI cannot answer or user requested handoff) */\n offerHandoff?: boolean\n /** Optional inline UI actions returned by the visitor Echo endpoint (forms, suggestion chips). */\n uiActions?: UiAction[]\n}\n\ninterface AvailabilityStatus {\n available: boolean\n mode: 'live' | 'ai' | 'offline'\n agentsOnline: number\n operatingHoursActive: boolean\n}\n\ninterface OfflineFormData {\n name: string\n email: string\n phone: string\n message: string\n}\n\n/** Enriched widget config from API (engage_chat_config + project settings) */\ninterface WidgetConfigFromApi {\n // Chat config fields\n is_enabled?: boolean\n position?: string\n initial_message?: string\n welcome_message?: string\n form_heading?: string\n form_description?: string\n offline_message?: string\n offlineFormSlug?: string\n chat_mode?: string\n signal_enabled?: boolean\n offline_mode?: string\n offline_heading?: string\n offline_subheading?: string\n welcome_screen_enabled?: boolean\n welcome_quick_actions?: string[]\n handoff_enabled?: boolean\n show_powered_by?: boolean\n business_hours?: any\n // Branding from Project Settings\n brand_primary?: string\n logo_url?: string\n project_name?: string\n // Business info from Project Settings\n business_info?: {\n name?: string\n phone?: string\n domain?: string\n address?: string\n hours?: any\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction getApiConfig() {\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development'\n const defaultApiUrl = isDev && process.env?.SONOR_API_URL\n ? process.env.SONOR_API_URL\n : 'https://api.sonor.io'\n const defaultSignalUrl = isDev && (process.env?.SONOR_SIGNAL_URL || process.env?.NEXT_PUBLIC_SIGNAL_API_URL)\n ? (process.env.SONOR_SIGNAL_URL || process.env.NEXT_PUBLIC_SIGNAL_API_URL)\n : 'https://signal.sonor.io'\n const apiUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || defaultApiUrl\n : defaultApiUrl\n const apiKey = typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n const signalUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_SIGNAL_URL__ || defaultSignalUrl\n : defaultSignalUrl\n return { apiUrl, apiKey, signalUrl }\n}\n\nfunction generateVisitorId(): string {\n const stored = typeof localStorage !== 'undefined' ? localStorage.getItem('engage_visitor_id') : null\n if (stored) return stored\n const id = `visitor_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`\n if (typeof localStorage !== 'undefined') localStorage.setItem('engage_visitor_id', id)\n return id\n}\n\n/** Convert plain URLs in text to markdown links so they render as buttons. Skips URLs already inside markdown links. */\nfunction linkifyUrls(text: string): string {\n return text.replace(\n /(^|[^(\\]])(https?:\\/\\/[^\\s<>\"{}|\\\\^`[\\])]+)/g,\n (_, before, url) => `${before}[${url}](${url})`,\n )\n}\n\n/** Detect if text expresses intent to talk to a live person */\nfunction userRequestedHandoff(text: string): boolean {\n const lower = text.toLowerCase().trim()\n const patterns = [\n /\\b(talk|speak)\\s+(to|with)\\s+(a\\s+)?(person|human|agent|representative|someone)\\b/,\n /\\b(real|live)\\s+(person|human|agent|support)\\b/,\n /\\bconnect\\s+(me\\s+)?(with|to)\\s+(a\\s+)?(person|human|agent)\\b/,\n /\\b(need|want)\\s+(to\\s+)?(talk|speak)\\s+(to|with)\\s+(someone|a\\s+person)\\b/,\n /\\bhuman\\s+(support|agent|help)\\b/,\n /\\b(talk|speak)\\s+to\\s+(a\\s+)?person\\b/,\n /\\bget\\s+(a\\s+)?(person|human)\\b/,\n ]\n return patterns.some((p) => p.test(lower))\n}\n\n/** Darken / lighten a hex colour */\nfunction adjustColor(hex: string, amount: number): string {\n const num = parseInt(hex.replace('#', ''), 16)\n const r = Math.min(255, Math.max(0, (num >> 16) + amount))\n const g = Math.min(255, Math.max(0, ((num >> 8) & 0x00ff) + amount))\n const b = Math.min(255, Math.max(0, (num & 0x0000ff) + amount))\n return `#${((1 << 24) | (r << 16) | (g << 8) | b).toString(16).slice(1)}`\n}\n\n/** Determine if a hex colour is light enough to need dark text */\nfunction isLightColor(hex: string): boolean {\n const num = parseInt(hex.replace('#', ''), 16)\n const r = num >> 16\n const g = (num >> 8) & 0x00ff\n const b = num & 0x0000ff\n return (r * 299 + g * 587 + b * 114) / 1000 > 160\n}\n\n/**\n * SSR-safe brand color: same on server and first client render (hydration).\n * `--sk-primary` is applied after mount in useEffect — reading getComputedStyle during render\n * caused server (API/config hex) vs client (CSS rgb) mismatches on the launcher button.\n */\nfunction staticPrimaryColor(apiFallback: string | undefined, hardDefault: string): string {\n return apiFallback || hardDefault\n}\n\n/**\n * Convert a hex color to an \"r, g, b\" string for use in rgba().\n * Returns the fallback if the input is not a valid hex color.\n */\nfunction hexToRgbString(hex: string, fallback = '59, 130, 246'): string {\n const match = hex.replace('#', '').match(/^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i)\n if (!match) return fallback\n return `${parseInt(match[1], 16)}, ${parseInt(match[2], 16)}, ${parseInt(match[3], 16)}`\n}\n\n/**\n * Generate an rgba() value from a CSS custom property holding an RGB triplet.\n * Usage: hexAlpha('--sk-primary-rgb', 0.125) → \"rgba(var(--sk-primary-rgb, 59, 130, 246), 0.125)\"\n */\nfunction hexAlpha(rgbVar: string, alpha: number, fallbackRgb = '59, 130, 246'): string {\n return `rgba(var(${rgbVar}, ${fallbackRgb}), ${alpha})`\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, signalUrl: propSignalUrl, suggested_questions: propSuggestedQuestions, assistant_name: propAssistantName, welcome_message: propWelcomeMessage, assistant_avatar: propAssistantAvatar }: ChatWidgetProps) {\n // Resolve projectId from API key when not provided (backend derives project from key)\n const [resolvedProjectId, setResolvedProjectId] = useState<string | null>(propProjectId || null)\n const projectId = propProjectId || resolvedProjectId || ''\n\n // State -------------------------------------------------------------------\n const [isOpen, setIsOpen] = useState(false)\n const [messages, setMessages] = useState<Message[]>([])\n const [inputValue, setInputValue] = useState('')\n const [isLoading, setIsLoading] = useState(false)\n const [availability, setAvailability] = useState<AvailabilityStatus | null>(null)\n const [sessionId, setSessionId] = useState<string | null>(null)\n const [visitorId] = useState(generateVisitorId)\n const [agentTyping, setAgentTyping] = useState(false)\n const [showOfflineForm, setShowOfflineForm] = useState(false)\n const [offlineForm, setOfflineForm] = useState<OfflineFormData>({ name: '', email: '', phone: '', message: '' })\n const [offlineSubmitted, setOfflineSubmitted] = useState(false)\n const [connectionStatus, setConnectionStatus] = useState<'connecting' | 'connected' | 'disconnected'>('disconnected')\n const [widgetConfig, setWidgetConfig] = useState<WidgetConfigFromApi | null>(null)\n const [handoffOfflinePrompt, setHandoffOfflinePrompt] = useState<string | null>(null)\n const [pendingFiles, setPendingFiles] = useState<File[]>([])\n const [lastFailedSend, setLastFailedSend] = useState<{ content: string; attachments: MessageAttachment[] } | null>(null)\n const [showWelcome, setShowWelcome] = useState(true)\n const [checkingAvailability, setCheckingAvailability] = useState(false)\n const [checkingHandoff, setCheckingHandoff] = useState(false)\n const [isHandedOff, setIsHandedOff] = useState(false)\n const fileInputRef = useRef<HTMLInputElement>(null)\n const pendingInitialMessageRef = useRef<string | null>(null)\n const apiKeyMissingWarnedRef = useRef(false)\n const siteContextRef = useRef<string | null>(null)\n function ensureApiKey(): string | null {\n const { apiKey } = getApiConfig()\n if (apiKey) return apiKey\n if (!apiKeyMissingWarnedRef.current) {\n apiKeyMissingWarnedRef.current = true\n console.warn('[ChatWidget] API key is required for Engage widget. Set __SITE_KIT_API_KEY__ or pass apiKey via SiteKitProvider.')\n }\n return null\n }\n\n const messagesEndRef = useRef<HTMLDivElement>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n const socketRef = useRef<Socket | null>(null)\n const pollingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null)\n\n // Derived values ----------------------------------------------------------\n const position = config?.position || widgetConfig?.position || 'bottom-right'\n const primaryFallback = staticPrimaryColor(widgetConfig?.brand_primary || config?.buttonColor, '#3b82f6')\n const [primaryFromCssVar, setPrimaryFromCssVar] = useState<string | null>(null)\n const primaryColor = primaryFromCssVar ?? primaryFallback\n const primaryRgb = hexToRgbString(primaryColor)\n\n useEffect(() => {\n const cssValue = getComputedStyle(document.documentElement).getPropertyValue('--sk-primary').trim()\n setPrimaryFromCssVar(cssValue || null)\n }, [])\n // assistant_name prop overrides API config; falls back to project/business name\n const businessName = propAssistantName || widgetConfig?.project_name || widgetConfig?.business_info?.name || 'Chat with us'\n // assistant_avatar prop overrides logo from API config\n const logoUrl = propAssistantAvatar || widgetConfig?.logo_url || null\n const welcomeEnabled = widgetConfig?.welcome_screen_enabled !== false\n // suggested_questions prop overrides API welcome_quick_actions\n const quickActions: string[] = propSuggestedQuestions ?? (Array.isArray(widgetConfig?.welcome_quick_actions) ? widgetConfig.welcome_quick_actions : [])\n const showPoweredBy = widgetConfig?.show_powered_by !== false\n // welcome_message prop takes highest priority\n const welcomeMessage =\n propWelcomeMessage ?? widgetConfig?.initial_message ?? widgetConfig?.welcome_message ?? config?.welcomeMessage ?? 'Hi! How can I help you today?'\n const offlineHeading = widgetConfig?.offline_heading ?? 'No agents available right now'\n const offlineSubheading =\n handoffOfflinePrompt ?? widgetConfig?.offline_subheading ?? widgetConfig?.form_description ?? widgetConfig?.offline_message ?? config?.offlineMessage ?? \"Leave us a message and we'll get back to you!\"\n\n const baseUrl = propApiUrl || getApiConfig().apiUrl\n const signalUrl = propSignalUrl || getApiConfig().signalUrl\n\n // Resolve projectId from API key when not provided\n useEffect(() => {\n if (propProjectId || resolvedProjectId) return\n const { apiKey } = getApiConfig()\n if (!apiKey) return\n let cancelled = false\n fetch(`${baseUrl}/api/public/seo/project-info`, {\n headers: { 'x-api-key': apiKey },\n })\n .then((res) => (res.ok ? res.json() : null))\n .then((data) => {\n if (cancelled || !data?.valid || !data?.project_id) return\n setResolvedProjectId(data.project_id)\n })\n .catch(() => {})\n return () => { cancelled = true }\n }, [propProjectId, resolvedProjectId, baseUrl])\n\n // -------------------------------------------------------------------------\n // API calls\n // -------------------------------------------------------------------------\n\n const fetchWidgetConfig = useCallback(async () => {\n if (!projectId) return\n const apiKey = ensureApiKey()\n if (!apiKey) return\n try {\n const response = await fetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {\n headers: { 'x-api-key': apiKey },\n })\n if (response.ok) {\n const { data } = await response.json()\n setWidgetConfig(data ?? null)\n }\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('[ChatWidget] Config fetch failed:', error instanceof Error ? error.message : error)\n }\n }\n }, [projectId, baseUrl])\n\n const checkAvailability = useCallback(async (): Promise<AvailabilityStatus | null> => {\n if (!projectId) return null\n const apiKey = ensureApiKey()\n if (!apiKey) return null\n try {\n const response = await fetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {\n headers: { 'x-api-key': apiKey },\n })\n if (response.ok) {\n const { data } = await response.json()\n setAvailability(data)\n return data\n }\n } catch (error) {\n if (process.env.NODE_ENV === 'development') {\n console.warn('[ChatWidget] Availability check failed:', error instanceof Error ? error.message : error)\n }\n }\n return null\n }, [projectId, baseUrl])\n\n const initSession = useCallback(async () => {\n const apiKey = ensureApiKey()\n if (!apiKey) return null\n try {\n const response = await fetch(`${baseUrl}/engage/widget/session`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },\n body: JSON.stringify({\n projectId,\n visitorId,\n sourceUrl: typeof window !== 'undefined' ? window.location.href : '',\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : '',\n }),\n })\n if (response.ok) {\n const { data } = await response.json()\n const session = data.session ?? data\n const sid = session?.id ?? session?.session_id ?? data.id ?? data.session_id\n const signalEnabled = session?.chat_mode === 'ai' || session?.chat_mode === 'hybrid'\n setSessionId(sid)\n const messages = session?.messages ?? data.messages ?? []\n if (messages.length > 0) {\n setMessages(\n messages.map((m: any) => ({\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n })),\n )\n }\n return { id: sid, signalEnabled }\n }\n } catch (error) {\n console.error('[ChatWidget] Session init failed:', error)\n }\n return null\n }, [projectId, visitorId, baseUrl])\n\n /** Fetch llms.txt from same origin when chat opens (for site context in Echo) */\n const fetchSiteContext = useCallback(async () => {\n if (siteContextRef.current) return siteContextRef.current\n try {\n const base = typeof window !== 'undefined' ? window.location.origin : ''\n const res = await fetch(`${base}/llms.txt`, { cache: 'no-store' })\n if (res.ok) {\n const text = await res.text()\n if (text?.trim()) siteContextRef.current = text.trim()\n }\n } catch {\n // Ignore - Signal will fall back to fetching from project domain\n }\n return siteContextRef.current\n }, [])\n\n /** Send message directly to Signal API (no Portal passthrough). Auth via x-api-key. */\n const sendToSignalApi = useCallback(\n async (content: string, conversationId?: string | null) => {\n const apiKey = ensureApiKey()\n if (!apiKey) throw new Error('API key required for chat')\n\n const url = `${signalUrl.replace(/\\/$/, '')}/echo/public/chat`\n const siteContext = await fetchSiteContext()\n const body = {\n message: content,\n visitorId,\n ...(conversationId ? { conversationId } : {}),\n pageUrl: typeof window !== 'undefined' ? window.location.href : undefined,\n ...(siteContext ? { siteContext } : {}),\n }\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify(body),\n })\n const json = await res.json()\n if (!res.ok) {\n throw new Error(json?.error?.message || json?.message || `Signal API error: ${res.status}`)\n }\n const data = json?.data ?? json\n const aiContent = data?.content ?? data?.response ?? data?.message ?? \"I'm sorry, I couldn't process that.\"\n const suggestions = data?.suggestions\n const offerHandoff = data?.offerHandoff === true || data?.offer_handoff === true\n // Optional inline UI actions (show_form / suggest_action / …) from the Echo concierge.\n const uiActions = Array.isArray(data?.uiActions)\n ? (data.uiActions as UiAction[]).filter((a) => a && typeof a === 'object' && typeof a.type === 'string' && a.data && typeof a.data === 'object')\n : undefined\n const newConversationId = data?.conversationId ?? conversationId\n return { content: aiContent, suggestions, offerHandoff, uiActions, conversationId: newConversationId }\n },\n [signalUrl, visitorId, fetchSiteContext],\n )\n\n /**\n * Single source of truth for appending an Echo (Signal) reply as an assistant\n * message. Suggestions, inline uiActions, and the handoff offer all attach\n * here so the three send paths (initial pending message, handleSubmit, and a\n * suggest_action chip) can never drift. `probeContent` is the user text we\n * scan for an explicit handoff request.\n */\n const pushEchoReply = useCallback(\n (\n reply: { content: string; suggestions?: string[]; offerHandoff?: boolean; uiActions?: UiAction[] },\n probeContent: string,\n ) => {\n setMessages((prev) => [\n ...prev,\n {\n id: `ai-${Date.now()}`,\n role: 'assistant',\n content: reply.content,\n timestamp: new Date(),\n ...(reply.suggestions?.length ? { suggestions: reply.suggestions } : {}),\n ...(reply.uiActions?.length ? { uiActions: reply.uiActions } : {}),\n ...(reply.offerHandoff || userRequestedHandoff(probeContent) ? { offerHandoff: true } : {}),\n },\n ])\n },\n [],\n )\n\n // -------------------------------------------------------------------------\n // Socket.io message handler\n // -------------------------------------------------------------------------\n\n const handleSocketMessage = useCallback((data: any) => {\n switch (data.type || data.event) {\n case 'message': {\n const role = data.role === 'visitor' ? 'user' : data.role === 'ai' ? 'assistant' : (data.role as Message['role'])\n const newMessage: Message = {\n id: data.id || `msg-${Date.now()}`,\n role,\n content: data.content ?? '',\n timestamp: new Date(),\n agentName: data.agentName,\n ...(data.attachments?.length ? { attachments: data.attachments } : {}),\n ...(data.suggestions?.length ? { suggestions: data.suggestions as string[] } : {}),\n }\n setMessages((prev) => [...prev, newMessage])\n if (role === 'assistant' || role === 'agent') {\n setAgentTyping(false)\n setIsLoading(false)\n }\n break\n }\n case 'agent:joined':\n setMessages((prev) => [\n ...prev,\n {\n id: `system-${Date.now()}`,\n role: 'system',\n content: data.agentName ? `${data.agentName} has joined the chat.` : 'An agent has joined the chat.',\n timestamp: new Date(),\n },\n ])\n break\n case 'typing':\n setAgentTyping(data.isTyping)\n break\n case 'handoff:initiated':\n setMessages((prev) => [\n ...prev,\n { id: `system-${Date.now()}`, role: 'system', content: data.message || 'Connecting you with a team member...', timestamp: new Date() },\n ])\n break\n case 'chat:closed':\n setMessages((prev) => [\n ...prev,\n { id: `system-${Date.now()}`, role: 'system', content: data.message || 'This chat has been closed.', timestamp: new Date() },\n ])\n break\n }\n }, [])\n\n // -------------------------------------------------------------------------\n // Socket.io connection (with auto-reconnect)\n // -------------------------------------------------------------------------\n\n const connectSocket = useCallback(\n async (currentSessionId: string) => {\n if (socketRef.current?.connected) return\n\n // Disconnect any stale socket first\n if (socketRef.current) {\n socketRef.current.disconnect()\n socketRef.current = null\n }\n\n // Lazy-load socket.io via separate module so bundlers never pull it\n // into the main engage chunk (avoids massive client bundle).\n const { createSocket } = await import('./socket-loader')\n\n const namespaceUrl = `${baseUrl.replace(/\\/$/, '')}/engage/chat`\n const socket = await createSocket(namespaceUrl, {\n query: { projectId, visitorId, sessionId: currentSessionId },\n transports: ['websocket', 'polling'],\n // Auto-reconnect config\n reconnection: true,\n reconnectionAttempts: 10,\n reconnectionDelay: 1000,\n reconnectionDelayMax: 10000,\n timeout: 15000,\n })\n\n socket.on('connect', () => {\n setConnectionStatus('connected')\n console.log('[ChatWidget] Socket.io connected')\n // Re-fetch messages to catch anything missed while disconnected\n if (currentSessionId) {\n const apiKey = ensureApiKey()\n if (apiKey) {\n fetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {\n headers: { 'x-api-key': apiKey },\n })\n .then((res) => (res.ok ? res.json() : null))\n .then((json) => {\n const data = json?.data ?? json\n if (Array.isArray(data) && data.length) {\n setMessages((prev) => {\n const byId = new Map(prev.map((m) => [m.id, m]))\n data.forEach((m: any) =>\n byId.set(m.id, {\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n attachments: m.attachments,\n }),\n )\n return Array.from(byId.values()).sort((a, b) => (a.timestamp as Date).getTime() - (b.timestamp as Date).getTime())\n })\n }\n })\n .catch((err) => console.warn('[ChatWidget] Refetch messages on reconnect failed', err))\n }\n }\n\n // Retry any buffered message\n if (lastFailedSend) {\n socket.emit('visitor:message', {\n content: lastFailedSend.content,\n attachments: lastFailedSend.attachments?.length ? lastFailedSend.attachments : undefined,\n })\n setLastFailedSend(null)\n setMessages((prev) => prev.filter((m) => !m.sendFailed))\n setIsLoading(true)\n }\n })\n\n socket.on('message', (data: any) => handleSocketMessage({ type: 'message', ...data }))\n socket.on('agent:joined', (data: any) => handleSocketMessage({ type: 'agent:joined', ...data }))\n socket.on('typing', (data: any) => handleSocketMessage({ type: 'typing', ...data }))\n socket.on('handoff:initiated', (data: any) => handleSocketMessage({ type: 'handoff:initiated', ...data }))\n socket.on('chat:closed', (data: any) => handleSocketMessage({ type: 'chat:closed', ...data }))\n\n socket.on('disconnect', (reason) => {\n setConnectionStatus('disconnected')\n console.log('[ChatWidget] Socket disconnected:', reason)\n })\n\n socket.on('reconnect_attempt', (attempt) => {\n setConnectionStatus('connecting')\n console.log(`[ChatWidget] Reconnect attempt #${attempt}`)\n })\n\n socket.on('reconnect_failed', () => {\n console.warn('[ChatWidget] All reconnect attempts failed, falling back to polling')\n if (isOpen && currentSessionId) startPolling(currentSessionId)\n })\n\n socket.on('connect_error', (err) => {\n console.error('[ChatWidget] Socket connect error:', err?.message || err, { baseUrl: namespaceUrl, projectId, visitorId })\n setConnectionStatus('connecting') // socket.io will auto-retry\n })\n\n socketRef.current = socket\n },\n [projectId, visitorId, baseUrl, isOpen, handleSocketMessage, lastFailedSend],\n )\n\n // Polling fallback\n const startPolling = useCallback(\n (currentSessionId: string) => {\n if (pollingIntervalRef.current) return\n pollingIntervalRef.current = setInterval(async () => {\n try {\n const apiKey = ensureApiKey()\n if (!apiKey) return\n const response = await fetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {\n headers: { 'x-api-key': apiKey },\n })\n if (response.ok) {\n const { data } = await response.json()\n setMessages((prev) => {\n const existingIds = new Set(prev.map((m) => m.id))\n const newMessages = data.filter((m: any) => !existingIds.has(m.id))\n if (newMessages.length > 0) {\n return [\n ...prev,\n ...newMessages.map((m: any) => ({\n id: m.id,\n role: m.role === 'visitor' ? 'user' : m.role,\n content: m.content,\n timestamp: new Date(m.created_at),\n agentName: m.sender_name,\n })),\n ]\n }\n return prev\n })\n }\n } catch (error) {\n console.error('[ChatWidget] Polling failed:', error)\n }\n }, 3000)\n },\n [baseUrl],\n )\n\n // -------------------------------------------------------------------------\n // Effects\n // -------------------------------------------------------------------------\n\n // Scroll to bottom on new messages\n useEffect(() => {\n messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' })\n }, [messages, agentTyping])\n\n // Focus input when chat opens and welcome screen is hidden\n useEffect(() => {\n if (isOpen && !showWelcome && inputRef.current) inputRef.current.focus()\n }, [isOpen, showWelcome])\n\n // Fetch config + availability on mount\n useEffect(() => {\n fetchWidgetConfig()\n checkAvailability()\n const interval = setInterval(checkAvailability, 60000)\n return () => {\n clearInterval(interval)\n if (socketRef.current) {\n socketRef.current.disconnect()\n socketRef.current = null\n }\n }\n }, [fetchWidgetConfig, checkAvailability])\n\n // Init session and connect when chat opens (after welcome dismissed and routing decided)\n useEffect(() => {\n if (isOpen && !showWelcome && !checkingAvailability && !showOfflineForm && !sessionId) {\n initSession().then(async (result) => {\n if (!result?.id) return\n const { id, signalEnabled } = result\n const pending = pendingInitialMessageRef.current\n if (pending) {\n pendingInitialMessageRef.current = null\n }\n\n // AI mode: send pending message directly to Signal API (no Portal passthrough)\n if (signalEnabled && pending) {\n setIsLoading(true)\n setMessages((prev) => [\n ...prev,\n { id: `u-${Date.now()}`, role: 'user', content: pending, timestamp: new Date() },\n ])\n try {\n const reply = await sendToSignalApi(pending, id)\n pushEchoReply(reply, pending)\n } catch (err) {\n console.error('[ChatWidget] Signal API error:', err)\n setMessages((prev) => [\n ...prev,\n {\n id: `err-${Date.now()}`,\n role: 'assistant',\n content: 'I apologize, but I encountered an error. Would you like to speak with a team member?',\n timestamp: new Date(),\n suggestions: ['Talk to a person', 'Try again'],\n offerHandoff: true,\n },\n ])\n } finally {\n setIsLoading(false)\n }\n }\n\n // Only connect socket for live-only (non-Signal) projects.\n // Signal projects stay socket-free during the AI phase — the socket\n // connects later if/when a handoff to a live agent is confirmed.\n if (!signalEnabled) {\n setConnectionStatus('connecting')\n await connectSocket(id)\n }\n\n // Live mode: send pending via socket once connected\n if (!signalEnabled && pending) {\n const waitForSocket = () => new Promise<void>((resolve) => {\n const check = (attempts = 0) => {\n if (socketRef.current?.connected || attempts > 20) { resolve(); return }\n setTimeout(() => check(attempts + 1), 150)\n }\n check()\n })\n await waitForSocket()\n if (socketRef.current?.connected) {\n socketRef.current.emit('visitor:message', { content: pending })\n }\n }\n })\n }\n return () => {\n if (pollingIntervalRef.current) clearInterval(pollingIntervalRef.current)\n }\n }, [isOpen, showWelcome, checkingAvailability, showOfflineForm, sessionId, initSession, connectSocket, sendToSignalApi, pushEchoReply])\n\n // -------------------------------------------------------------------------\n // Handlers\n // -------------------------------------------------------------------------\n\n const handleToggle = useCallback(() => {\n setIsOpen((prev) => !prev)\n }, [])\n\n /** Start chatting (dismiss welcome screen) with availability routing */\n const startChat = useCallback(\n async (initialMessage?: string) => {\n setShowWelcome(false)\n\n const beginChatSession = () => {\n setMessages([{ id: 'welcome', role: 'assistant', content: welcomeMessage, timestamp: new Date() }])\n if (initialMessage) {\n // Stash the initial message — the session-init effect will send it\n // once the socket is connected. This avoids duplicate messages.\n pendingInitialMessageRef.current = initialMessage\n const userMsg: Message = { id: `user-${Date.now()}`, role: 'user', content: initialMessage, timestamp: new Date() }\n setMessages((prev) => [...prev, userMsg])\n setIsLoading(true)\n }\n }\n\n // Signal/AI mode → go straight to chat (AI is always available)\n if (widgetConfig?.signal_enabled) {\n beginChatSession()\n return\n }\n\n // ─── Live-only mode: check agent availability ───────────────────\n // No Signal → live chat with human agents or offline form.\n setCheckingAvailability(true)\n\n // First real-time check\n const firstCheck = await checkAvailability()\n if (firstCheck?.available && firstCheck.agentsOnline > 0) {\n setCheckingAvailability(false)\n beginChatSession()\n return\n }\n\n // No agents online – wait ~5 seconds for push notification response.\n // Future: this is where we send a push notification to agents via\n // the Sonor Messenger app. Agents get 5-6 seconds to open the\n // notification and come online before we fall through to the offline form.\n await new Promise((resolve) => setTimeout(resolve, 5000))\n\n // Re-check after the grace period\n const secondCheck = await checkAvailability()\n setCheckingAvailability(false)\n\n if (secondCheck?.available && secondCheck.agentsOnline > 0) {\n // An agent responded – start live chat\n beginChatSession()\n } else {\n // Still no agents – show offline form\n setShowOfflineForm(true)\n }\n },\n [widgetConfig?.signal_enabled, welcomeMessage, checkAvailability],\n )\n\n const uploadWidgetFile = useCallback(\n async (file: File): Promise<MessageAttachment | null> => {\n if (!sessionId || !visitorId) return null\n const apiKey = ensureApiKey()\n if (!apiKey) return null\n const form = new FormData()\n form.append('file', file)\n form.append('sessionId', sessionId)\n form.append('visitorId', visitorId)\n const res = await fetch(`${baseUrl}/engage/widget/upload`, {\n method: 'POST',\n headers: { 'x-api-key': apiKey },\n body: form,\n })\n if (!res.ok) throw new Error('Upload failed')\n const json = await res.json()\n const d = json?.data ?? json\n return d?.url ? { name: d.name ?? file.name, url: d.url, size: d.size, mimeType: d.mimeType } : null\n },\n [sessionId, visitorId, baseUrl],\n )\n\n const handleSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n const hasText = !!inputValue.trim()\n const hasFiles = pendingFiles.length > 0\n if ((!hasText && !hasFiles) || isLoading) return\n\n const content = inputValue.trim() || ''\n let attachments: MessageAttachment[] = []\n if (pendingFiles.length) {\n try {\n for (const file of pendingFiles) {\n const att = await uploadWidgetFile(file)\n if (att) attachments.push(att)\n }\n setPendingFiles([])\n } catch (err) {\n console.error('[ChatWidget] File upload failed', err)\n setMessages((prev) => [...prev, { id: `err-${Date.now()}`, role: 'assistant', content: 'Failed to upload file. Please try again.', timestamp: new Date() }])\n return\n }\n }\n\n const userMessage: Message = {\n id: `user-${Date.now()}`,\n role: 'user',\n content,\n timestamp: new Date(),\n ...(attachments.length ? { attachments } : {}),\n }\n setMessages((prev) => [...prev, userMessage])\n setInputValue('')\n setIsLoading(true)\n\n // AI mode: call Signal API directly (no Portal passthrough)\n // Once handed off to a live agent, messages go through the socket instead.\n if (widgetConfig?.signal_enabled && !isHandedOff && hasText) {\n try {\n const reply = await sendToSignalApi(content, sessionId)\n const lastUserContent = messages.filter((m) => m.role === 'user').slice(-1)[0]?.content ?? ''\n pushEchoReply(reply, lastUserContent)\n } catch (err) {\n console.error('[ChatWidget] Signal API error:', err)\n setMessages((prev) => [\n ...prev,\n {\n id: `err-${Date.now()}`,\n role: 'assistant',\n content: 'I apologize, but I encountered an error. Would you like to speak with a team member?',\n timestamp: new Date(),\n suggestions: ['Talk to a person', 'Try again'],\n offerHandoff: true,\n },\n ])\n } finally {\n setIsLoading(false)\n }\n return\n }\n\n // Live mode: use socket\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:message', { content: userMessage.content, attachments: attachments.length ? attachments : undefined })\n setLastFailedSend(null)\n return\n }\n\n // Buffer for retry on reconnect instead of showing error immediately\n setLastFailedSend({ content: userMessage.content, attachments })\n // Give socket.io a moment to reconnect before showing error\n setTimeout(() => {\n if (!socketRef.current?.connected) {\n setMessages((prev) => [\n ...prev,\n { id: `error-${Date.now()}`, role: 'system', content: 'Reconnecting...', timestamp: new Date(), sendFailed: true },\n ])\n setIsLoading(false)\n }\n }, 3000)\n },\n [inputValue, isLoading, pendingFiles, uploadWidgetFile, widgetConfig?.signal_enabled, isHandedOff, sendToSignalApi, sessionId, pushEchoReply],\n )\n\n /**\n * Send a plain text turn to Echo (used by suggest_action chips). AI-only —\n * uiActions only ever appear in Signal/AI mode, so this mirrors handleSubmit's\n * AI branch (routing through the same sendToSignalApi + pushEchoReply path).\n */\n const sendEchoText = useCallback(\n async (text: string) => {\n const content = text.trim()\n if (!content || isLoading) return\n setMessages((prev) => [\n ...prev,\n { id: `user-${Date.now()}`, role: 'user', content, timestamp: new Date() },\n ])\n setIsLoading(true)\n try {\n const reply = await sendToSignalApi(content, sessionId)\n pushEchoReply(reply, content)\n } catch (err) {\n console.error('[ChatWidget] Signal API error:', err)\n setMessages((prev) => [\n ...prev,\n {\n id: `err-${Date.now()}`,\n role: 'assistant',\n content: 'I apologize, but I encountered an error. Would you like to speak with a team member?',\n timestamp: new Date(),\n suggestions: ['Talk to a person', 'Try again'],\n offerHandoff: true,\n },\n ])\n } finally {\n setIsLoading(false)\n }\n },\n [isLoading, sessionId, sendToSignalApi, pushEchoReply],\n )\n\n /**\n * A suggest_action chip was clicked. Navigate when `action` is a path/URL\n * (internal path / hash same-tab, external URL new tab); otherwise send the\n * human-readable message as the next chat turn.\n */\n const handleSuggestAction = useCallback(\n (action: string | undefined, message: string) => {\n const a = (action || '').trim()\n if (a && isNavigable(a)) {\n if (typeof window !== 'undefined') {\n if (/^https?:\\/\\//i.test(a)) window.open(a, '_blank', 'noopener,noreferrer')\n else window.location.href = a\n }\n return\n }\n if (message?.trim()) void sendEchoText(message)\n },\n [sendEchoText],\n )\n\n const retryFailedSend = useCallback(() => {\n if (!lastFailedSend || !sessionId) return\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:message', { content: lastFailedSend.content, attachments: lastFailedSend.attachments?.length ? lastFailedSend.attachments : undefined })\n setLastFailedSend(null)\n setMessages((prev) => prev.filter((m) => !m.sendFailed))\n setIsLoading(true)\n } else {\n connectSocket(sessionId)\n }\n }, [lastFailedSend, sessionId, connectSocket])\n\n const requestHandoff = useCallback(async () => {\n if (!sessionId) return\n const apiKey = ensureApiKey()\n if (!apiKey) return\n setCheckingHandoff(true)\n try {\n // Backend handles availability check (first check → 5s grace → second check)\n // and emits urgent notifications to agents if available.\n const res = await fetch(`${baseUrl}/engage/widget/handoff`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },\n body: JSON.stringify({ sessionId }),\n })\n const json = await res.json()\n const available = json?.data?.available === true\n setCheckingHandoff(false)\n\n if (available) {\n // Agents are online and notified — NOW connect the socket so the\n // visitor becomes visible in the agent's dashboard for the first time.\n setIsHandedOff(true)\n setConnectionStatus('connecting')\n await connectSocket(sessionId)\n setMessages((prev) => [\n ...prev,\n { id: `handoff-${Date.now()}`, role: 'system', content: 'Connecting you with a team member. Please hold on!', timestamp: new Date() },\n ])\n } else {\n // No agents online — show offline form\n setHandoffOfflinePrompt(widgetConfig?.offline_subheading ?? \"Nobody is online right now. Leave your details and we'll get back to you.\")\n setShowOfflineForm(true)\n setMessages((prev) => [\n ...prev,\n { id: `handoff-offline-${Date.now()}`, role: 'system', content: offlineHeading, timestamp: new Date() },\n ])\n }\n } catch (error) {\n setCheckingHandoff(false)\n console.error('[ChatWidget] Handoff request failed:', error)\n }\n }, [sessionId, baseUrl, widgetConfig, offlineHeading, connectSocket])\n\n const [offlineError, setOfflineError] = useState<string | null>(null)\n\n const handleOfflineSubmit = useCallback(\n async (e: React.FormEvent) => {\n e.preventDefault()\n if (!offlineForm.name || !offlineForm.email || !offlineForm.message) return\n const apiKey = ensureApiKey()\n if (!apiKey) return\n setIsLoading(true)\n setOfflineError(null)\n try {\n const response = await fetch(`${baseUrl}/engage/widget/offline-form`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },\n body: JSON.stringify({\n projectId,\n visitorId,\n ...offlineForm,\n pageUrl: typeof window !== 'undefined' ? window.location.href : '',\n ...(widgetConfig?.offlineFormSlug && { formSlug: widgetConfig.offlineFormSlug }),\n }),\n })\n if (response.ok) {\n setOfflineSubmitted(true)\n } else {\n const errorBody = await response.text().catch(() => '')\n console.error(`[ChatWidget] Offline form returned ${response.status}:`, errorBody)\n setOfflineError('Something went wrong. Please try again.')\n }\n } catch (error) {\n console.error('[ChatWidget] Offline form submission failed:', error)\n setOfflineError('Unable to send message. Please check your connection and try again.')\n } finally {\n setIsLoading(false)\n }\n },\n [offlineForm, projectId, visitorId, baseUrl, widgetConfig],\n )\n\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n handleSubmit(e as any)\n }\n }, [handleSubmit])\n\n const handleTyping = useCallback(() => {\n const socket = socketRef.current\n if (socket?.connected) {\n socket.emit('visitor:typing', { isTyping: true })\n setTimeout(() => {\n if (socketRef.current?.connected) socketRef.current.emit('visitor:typing', { isTyping: false })\n }, 2000)\n }\n }, [])\n\n // -------------------------------------------------------------------------\n // Status label\n // -------------------------------------------------------------------------\n\n const statusLabel = (() => {\n if (showOfflineForm) return null\n if (checkingAvailability) return { dot: '#f59e0b', text: 'Checking for a team member...' }\n if (widgetConfig?.signal_enabled) return { dot: null, text: 'Echo Intelligent Site Assistant' }\n if (availability && availability.agentsOnline > 0) return { dot: '#22c55e', text: 'Online' }\n return { dot: 'var(--sk-text-tertiary, #9ca3af)', text: \"We'll respond soon\" }\n })()\n\n // -------------------------------------------------------------------------\n // Render: Chat Button\n // -------------------------------------------------------------------------\n\n const ChatButton = (\n <button\n type=\"button\"\n data-sk-echo-launcher\n onClick={handleToggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n style={{\n position: 'fixed',\n [position === 'bottom-left' ? 'left' : 'right']: '20px',\n bottom: 'calc(20px + env(safe-area-inset-bottom, 0px))',\n width: '60px',\n height: '60px',\n borderRadius: '50%',\n backgroundColor: primaryColor,\n border: 'none',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n boxShadow: '0 4px 12px rgba(0, 0, 0, 0.25)',\n transition: 'transform 0.2s, box-shadow 0.2s',\n zIndex: 9999,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05)'\n e.currentTarget.style.boxShadow = '0 6px 16px rgba(0, 0, 0, 0.3)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.25)'\n }}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n ) : (\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"white\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </button>\n )\n\n // -------------------------------------------------------------------------\n // Render: Header (shared across all views)\n // -------------------------------------------------------------------------\n\n const Header = (\n <div\n style={{\n padding: '16px 20px',\n background: `linear-gradient(135deg, ${primaryColor}, ${adjustColor(primaryColor, -25)})`,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n display: 'flex',\n alignItems: 'center',\n gap: 12,\n }}\n >\n {/* Logo or icon */}\n <div\n style={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n backgroundColor: 'rgba(255,255,255,0.2)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n flexShrink: 0,\n }}\n >\n {logoUrl ? (\n <img src={logoUrl} alt=\"\" style={{ width: 28, height: 28, objectFit: 'contain', filter: isLightColor(primaryColor) ? 'none' : 'brightness(0) invert(1)' }} />\n ) : (\n <svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\" />\n </svg>\n )}\n </div>\n <div style={{ flex: 1, minWidth: 0 }}>\n <div style={{ fontWeight: 600, fontSize: 16, whiteSpace: 'nowrap', overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {showOfflineForm ? offlineHeading : businessName}\n </div>\n {statusLabel && (\n <div style={{ fontSize: 13, opacity: 0.9, display: 'flex', alignItems: 'center', gap: 6, marginTop: 2 }}>\n {statusLabel.dot && (\n <span style={{ width: 8, height: 8, borderRadius: '50%', backgroundColor: statusLabel.dot, flexShrink: 0 }} />\n )}\n {statusLabel.text}\n </div>\n )}\n </div>\n\n {/* Connection status indicator */}\n {connectionStatus === 'connecting' && !showWelcome && !showOfflineForm && (\n <div style={{ fontSize: 11, opacity: 0.7, display: 'flex', alignItems: 'center', gap: 4 }}>\n <span style={{ animation: 'chatDot 1s infinite ease-in-out' }}>●</span>\n Connecting\n </div>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Welcome Screen\n // -------------------------------------------------------------------------\n\n const WelcomeScreen = (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', padding: 20, gap: 16 }}>\n <div style={{ textAlign: 'center', paddingTop: 8 }}>\n <div style={{ fontSize: 15, color: 'var(--sk-text-primary, #374151)', lineHeight: 1.5 }}>\n {welcomeMessage}\n </div>\n </div>\n\n {/* Quick action chips */}\n {quickActions.length > 0 && (\n <div style={{ display: 'flex', flexDirection: 'column', gap: 8 }}>\n {quickActions.map((action, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => startChat(action)}\n style={{\n padding: '12px 16px',\n borderRadius: 12,\n border: `1px solid ${hexAlpha('--sk-primary-rgb', 0.2, primaryRgb)}`,\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.031, primaryRgb),\n color: primaryColor,\n fontSize: 14,\n cursor: 'pointer',\n textAlign: 'left',\n transition: 'background-color 0.15s, border-color 0.15s',\n lineHeight: 1.4,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.082, primaryRgb)\n e.currentTarget.style.borderColor = hexAlpha('--sk-primary-rgb', 0.333, primaryRgb)\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.031, primaryRgb)\n e.currentTarget.style.borderColor = hexAlpha('--sk-primary-rgb', 0.2, primaryRgb)\n }}\n >\n {action}\n </button>\n ))}\n </div>\n )}\n\n {/* Start chat button */}\n <button\n type=\"button\"\n onClick={() => startChat()}\n style={{\n padding: '12px 20px',\n borderRadius: 12,\n border: 'none',\n backgroundColor: primaryColor,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n fontSize: 14,\n fontWeight: 600,\n cursor: 'pointer',\n marginTop: 'auto',\n }}\n >\n Start a conversation\n </button>\n\n {/* Business phone */}\n {widgetConfig?.business_info?.phone && (\n <div style={{ textAlign: 'center', fontSize: 13, color: 'var(--sk-text-secondary, #6b7280)' }}>\n Or call us at{' '}\n <a href={`tel:${widgetConfig.business_info.phone}`} style={{ color: primaryColor, textDecoration: 'none', fontWeight: 500 }}>\n {widgetConfig.business_info.phone}\n </a>\n </div>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Offline Form\n // -------------------------------------------------------------------------\n\n const OfflineFormView = (\n <div style={{ padding: 20, flex: 1, overflowY: 'auto' }}>\n {offlineSubmitted ? (\n <div style={{ textAlign: 'center', padding: 20 }}>\n <div style={{ width: 56, height: 56, borderRadius: '50%', backgroundColor: hexAlpha('--sk-primary-rgb', 0.082, primaryRgb), display: 'flex', alignItems: 'center', justifyContent: 'center', margin: '0 auto 16px' }}>\n <svg width=\"28\" height=\"28\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={primaryColor} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n </div>\n <h3 style={{ margin: '0 0 8px', fontSize: 18, fontWeight: 600, color: 'var(--sk-text-primary, #111827)' }}>Message Sent!</h3>\n <p style={{ margin: 0, color: 'var(--sk-text-secondary, #6b7280)', fontSize: 14 }}>{offlineSubheading}</p>\n </div>\n ) : (\n <form onSubmit={handleOfflineSubmit}>\n <p style={{ margin: '0 0 16px', color: 'var(--sk-text-secondary, #6b7280)', fontSize: 14 }}>{offlineSubheading}</p>\n {[\n { name: 'name' as const, type: 'text', placeholder: 'Your name *', required: true },\n { name: 'email' as const, type: 'email', placeholder: 'Your email *', required: true },\n { name: 'phone' as const, type: 'tel', placeholder: 'Phone (optional)', required: false },\n ].map((field) => (\n <div key={field.name} style={{ marginBottom: 12 }}>\n <input\n type={field.type}\n placeholder={field.placeholder}\n value={offlineForm[field.name]}\n onChange={(e) => setOfflineForm((prev) => ({ ...prev, [field.name]: e.target.value }))}\n required={field.required}\n style={{ width: '100%', padding: '10px 12px', borderRadius: 8, border: '1px solid var(--sk-border, #e5e7eb)', fontSize: 14, outline: 'none', boxSizing: 'border-box' }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = 'var(--sk-border, #e5e7eb)')}\n />\n </div>\n ))}\n <div style={{ marginBottom: 16 }}>\n <textarea\n placeholder=\"How can we help? *\"\n value={offlineForm.message}\n onChange={(e) => setOfflineForm((prev) => ({ ...prev, message: e.target.value }))}\n required\n rows={4}\n style={{ width: '100%', padding: '10px 12px', borderRadius: 8, border: '1px solid var(--sk-border, #e5e7eb)', fontSize: 14, outline: 'none', resize: 'vertical', boxSizing: 'border-box' }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = 'var(--sk-border, #e5e7eb)')}\n />\n </div>\n {offlineError && (\n <div style={{ padding: '8px 12px', borderRadius: 8, backgroundColor: 'var(--sk-error-bg, #fef2f2)', border: '1px solid var(--sk-error, #fecaca)', color: 'var(--sk-error, #dc2626)', fontSize: 13, marginBottom: 12 }}>\n {offlineError}\n </div>\n )}\n <button\n type=\"submit\"\n disabled={isLoading}\n style={{\n width: '100%',\n padding: '12px',\n borderRadius: 8,\n border: 'none',\n backgroundColor: primaryColor,\n color: isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n fontSize: 14,\n fontWeight: 600,\n cursor: isLoading ? 'wait' : 'pointer',\n opacity: isLoading ? 0.7 : 1,\n }}\n >\n {isLoading ? 'Sending...' : 'Send Message'}\n </button>\n </form>\n )}\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Checking Availability Screen\n // -------------------------------------------------------------------------\n\n const CheckingScreen = (\n <div style={{ flex: 1, display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', padding: 32, gap: 20, textAlign: 'center' }}>\n {/* Pulsing radar icon */}\n <div style={{ position: 'relative', width: 64, height: 64 }}>\n <div\n style={{\n position: 'absolute',\n inset: 0,\n borderRadius: '50%',\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.082, primaryRgb),\n animation: 'checkPulse 2s infinite ease-out',\n }}\n />\n <div\n style={{\n position: 'absolute',\n inset: 8,\n borderRadius: '50%',\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.145, primaryRgb),\n animation: 'checkPulse 2s infinite ease-out 0.4s',\n }}\n />\n <div\n style={{\n position: 'absolute',\n inset: 16,\n borderRadius: '50%',\n backgroundColor: primaryColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={isLightColor(primaryColor) ? '#1a1a1a' : 'white'} strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2\" />\n <circle cx=\"8.5\" cy=\"7\" r=\"4\" />\n <line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"14\" />\n <line x1=\"23\" y1=\"11\" x2=\"17\" y2=\"11\" />\n </svg>\n </div>\n </div>\n\n <div>\n <div style={{ fontSize: 16, fontWeight: 600, color: 'var(--sk-text-primary, #111827)', marginBottom: 6 }}>\n {checkingHandoff ? 'Looking for online support' : 'Checking for a team member'}\n </div>\n <div style={{ fontSize: 14, color: 'var(--sk-text-secondary, #6b7280)', lineHeight: 1.5 }}>\n One moment please\n <span style={{ display: 'inline-flex', width: 20 }}>\n <span style={{ animation: 'checkDots 1.5s infinite steps(4, end)' }}>...</span>\n </span>\n </div>\n </div>\n\n {/* Progress bar */}\n <div style={{ width: '80%', height: 3, backgroundColor: 'var(--sk-border, #e5e7eb)', borderRadius: 2, overflow: 'hidden' }}>\n <div\n style={{\n width: '100%',\n height: '100%',\n backgroundColor: primaryColor,\n borderRadius: 2,\n animation: 'checkProgress 5s linear forwards',\n transformOrigin: 'left',\n }}\n />\n </div>\n\n <div style={{ fontSize: 12, color: 'var(--sk-text-tertiary, #9ca3af)' }}>\n This usually takes just a few seconds\n </div>\n </div>\n )\n\n // -------------------------------------------------------------------------\n // Render: Messages View\n // -------------------------------------------------------------------------\n\n const MessagesView = (\n <>\n {/* Messages area */}\n <div\n style={{ flex: 1, overflowY: 'auto', padding: 16, display: 'flex', flexDirection: 'column', gap: 12, backgroundColor: 'var(--sk-bg-elevated, #f9fafb)' }}\n >\n {messages.map((message) => {\n const isAssistant = message.role === 'assistant' || message.role === 'agent'\n return (\n <div key={message.id} style={{ display: 'flex', justifyContent: message.role === 'user' ? 'flex-end' : 'flex-start' }}>\n <div\n style={{\n maxWidth: '80%',\n padding: message.role === 'system' ? '8px 12px' : isAssistant ? '12px 16px' : '10px 14px',\n borderRadius: message.role === 'user' ? '16px 16px 4px 16px' : message.role === 'system' ? '8px' : '16px 16px 16px 4px',\n backgroundColor: message.role === 'user' ? primaryColor : message.role === 'system' ? 'var(--sk-border, #e5e7eb)' : 'var(--sk-bg, #ffffff)',\n color: message.role === 'user' ? (isLightColor(primaryColor) ? '#1a1a1a' : 'white') : message.role === 'system' ? 'var(--sk-text-secondary, #6b7280)' : 'var(--sk-text-primary, #111827)',\n boxShadow: message.role === 'system' ? 'none' : '0 1px 2px rgba(0,0,0,0.08)',\n fontSize: message.role === 'system' ? 13 : 14,\n fontStyle: message.role === 'system' ? 'italic' : 'normal',\n lineHeight: isAssistant ? 1.6 : 1.5,\n whiteSpace: isAssistant ? 'normal' : 'pre-wrap',\n wordBreak: 'break-word',\n textAlign: isAssistant ? 'left' : undefined,\n borderLeft: isAssistant ? `3px solid ${hexAlpha('--sk-primary-rgb', 0.2, primaryRgb)}` : undefined,\n }}\n >\n {message.agentName && message.role === 'agent' && (\n <div style={{ fontSize: 12, opacity: 0.6, marginBottom: 4 }}>{message.agentName}</div>\n )}\n {isAssistant ? (\n <div className=\"chatMessageContent\">\n <ReactMarkdown\n components={{\n p: ({ children }) => <p style={{ margin: '0 0 8px', lineHeight: 1.6 }}>{children}</p>,\n strong: ({ children }) => <strong style={{ fontWeight: 600 }}>{children}</strong>,\n ul: ({ children }) => <ul style={{ margin: '4px 0 8px', paddingLeft: 20 }}>{children}</ul>,\n ol: ({ children }) => <ol style={{ margin: '4px 0 8px', paddingLeft: 20 }}>{children}</ol>,\n li: ({ children }) => <li style={{ marginBottom: 4 }}>{children}</li>,\n h3: ({ children }) => <h3 style={{ margin: '12px 0 6px', fontSize: 15, fontWeight: 600 }}>{children}</h3>,\n h4: ({ children }) => <h4 style={{ margin: '8px 0 4px', fontSize: 14, fontWeight: 600 }}>{children}</h4>,\n a: ({ href, children }) => (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{\n display: 'inline-block',\n marginTop: 6,\n marginRight: 6,\n padding: '8px 14px',\n borderRadius: 8,\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.082, primaryRgb),\n color: primaryColor,\n fontWeight: 600,\n fontSize: 13,\n textDecoration: 'none',\n border: `1px solid ${hexAlpha('--sk-primary-rgb', 0.25, primaryRgb)}`,\n boxShadow: '0 1px 2px rgba(0,0,0,0.06)',\n transition: 'background-color 0.15s, transform 0.1s',\n }}\n onMouseOver={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.145, primaryRgb)\n e.currentTarget.style.transform = 'translateY(-1px)'\n }}\n onMouseOut={(e) => {\n e.currentTarget.style.backgroundColor = hexAlpha('--sk-primary-rgb', 0.082, primaryRgb)\n e.currentTarget.style.transform = 'translateY(0)'\n }}\n >\n {children}\n </a>\n ),\n }}\n >\n {linkifyUrls(message.content)}\n </ReactMarkdown>\n </div>\n ) : (\n message.content\n )}\n {/* Attachments */}\n {message.attachments?.length ? (\n <div style={{ marginTop: 8, display: 'flex', flexDirection: 'column', gap: 6 }}>\n {message.attachments.map((att, i) =>\n att.mimeType?.startsWith('image/') ? (\n <a key={i} href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ display: 'block' }}>\n <img src={att.url} alt={att.name} style={{ maxWidth: '100%', maxHeight: 200, borderRadius: 8, objectFit: 'contain' }} />\n </a>\n ) : (\n <a key={i} href={att.url} target=\"_blank\" rel=\"noopener noreferrer\" style={{ fontSize: 13, wordBreak: 'break-all', display: 'flex', alignItems: 'center', gap: 6 }}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21.44 11.05l-9.19 9.19a6 6 0 0 1-8.49-8.49l9.19-9.19a4 4 0 0 1 5.66 5.66l-9.2 9.19a2 2 0 0 1-2.83-2.83l8.49-8.48\" />\n </svg>\n {att.name}\n </a>\n ),\n )}\n </div>\n ) : null}\n {/* Suggestion chips */}\n {message.suggestions?.length ? (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 6, marginTop: 8 }}>\n {message.suggestions.map((s, i) => (\n <button\n key={i}\n type=\"button\"\n onClick={() => {\n if (/talk\\s+to\\s+(a\\s+)?person/i.test(s)) {\n requestHandoff()\n } else {\n setInputValue(s)\n inputRef.current?.focus()\n }\n }}\n style={{\n padding: '6px 12px',\n borderRadius: 16,\n border: `1px solid ${primaryColor}`,\n backgroundColor: hexAlpha('--sk-primary-rgb', 0.063, primaryRgb),\n color: primaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n {s}\n </button>\n ))}\n </div>\n ) : null}\n {/* Inline Echo UI actions (managed form / suggestion chips) */}\n {message.uiActions?.length ? (\n <EchoUiActions\n actions={message.uiActions}\n primaryColor={primaryColor}\n primaryRgb={primaryRgb}\n onSuggest={handleSuggestAction}\n />\n ) : null}\n {/* Retry on failed send */}\n {message.sendFailed && lastFailedSend && (\n <div style={{ marginTop: 8 }}>\n <button\n type=\"button\"\n onClick={retryFailedSend}\n style={{ padding: '6px 12px', borderRadius: 6, border: '1px solid var(--sk-error, #ef4444)', backgroundColor: 'var(--sk-error-bg, #fef2f2)', color: 'var(--sk-error, #dc2626)', fontSize: 13, cursor: 'pointer' }}\n >\n Retry send\n </button>\n </div>\n )}\n {/* Handoff button — only when user requested it or AI cannot answer (hide if \"Talk to a person\" chip already shown) */}\n {widgetConfig?.signal_enabled && message.role === 'assistant' && widgetConfig?.handoff_enabled !== false && message.offerHandoff && !message.suggestions?.some((s) => /talk\\s+to\\s+(a\\s+)?person/i.test(s)) && message.id === messages.filter((m) => m.role === 'assistant').slice(-1)[0]?.id && (\n <button\n onClick={requestHandoff}\n style={{\n display: 'inline-block',\n marginTop: 8,\n padding: '6px 12px',\n borderRadius: 6,\n border: `1px solid ${primaryColor}`,\n backgroundColor: 'transparent',\n color: primaryColor,\n fontSize: 13,\n cursor: 'pointer',\n }}\n >\n Talk to a person\n </button>\n )}\n </div>\n </div>\n )\n })}\n\n {/* Typing indicator */}\n {(isLoading || agentTyping) && (\n <div style={{ display: 'flex', justifyContent: 'flex-start' }}>\n <div\n style={{\n padding: '10px 14px',\n borderRadius: '16px 16px 16px 4px',\n backgroundColor: 'var(--sk-bg, #ffffff)',\n boxShadow: '0 1px 2px rgba(0,0,0,0.08)',\n display: 'flex',\n gap: 4,\n color: 'var(--sk-text-tertiary, #9ca3af)',\n }}\n >\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0s' }}>●</span>\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0.2s' }}>●</span>\n <span style={{ animation: 'chatDot 1.4s infinite ease-in-out', animationDelay: '0.4s' }}>●</span>\n </div>\n </div>\n )}\n\n <div ref={messagesEndRef} />\n </div>\n\n {/* Failed send bar */}\n {lastFailedSend && (\n <div style={{ padding: '8px 12px', backgroundColor: 'var(--sk-error-bg, #fef2f2)', borderTop: '1px solid var(--sk-error, #fecaca)', display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 8 }}>\n <span style={{ fontSize: 13, color: 'var(--sk-error, #dc2626)' }}>Failed to send</span>\n <button type=\"button\" onClick={retryFailedSend} style={{ padding: '4px 10px', borderRadius: 6, border: '1px solid var(--sk-error, #dc2626)', background: 'var(--sk-bg, #fff)', color: 'var(--sk-error, #dc2626)', fontSize: 12, cursor: 'pointer' }}>\n Retry\n </button>\n </div>\n )}\n\n {/* Input */}\n <form onSubmit={handleSubmit} style={{ padding: 12, borderTop: '1px solid var(--sk-border, #e5e7eb)', backgroundColor: 'var(--sk-bg, #ffffff)' }}>\n <div style={{ display: 'flex', gap: 8 }}>\n <input\n ref={inputRef}\n type=\"text\"\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n handleTyping()\n }}\n onKeyDown={handleKeyDown}\n placeholder=\"Type a message...\"\n disabled={isLoading}\n style={{\n flex: 1,\n padding: '10px 14px',\n borderRadius: 24,\n border: '1px solid var(--sk-border, #e5e7eb)',\n fontSize: 14,\n outline: 'none',\n transition: 'border-color 0.2s',\n }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = 'var(--sk-border, #e5e7eb)')}\n />\n <button\n type=\"submit\"\n disabled={!inputValue.trim() || isLoading}\n style={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n border: 'none',\n backgroundColor: (inputValue.trim() || pendingFiles.length) && !isLoading ? primaryColor : 'var(--sk-border, #e5e7eb)',\n color: (inputValue.trim() || pendingFiles.length) && !isLoading && isLightColor(primaryColor) ? '#1a1a1a' : 'white',\n cursor: inputValue.trim() && !isLoading ? 'pointer' : 'not-allowed',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n transition: 'background-color 0.2s',\n flexShrink: 0,\n }}\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n </button>\n </div>\n </form>\n </>\n )\n\n // -------------------------------------------------------------------------\n // Render: Popup\n // -------------------------------------------------------------------------\n\n const ChatPopup = isOpen && (\n <div\n style={{\n position: 'fixed',\n [position === 'bottom-left' ? 'left' : 'right']: '20px',\n bottom: 'calc(90px + env(safe-area-inset-bottom, 0px))',\n width: '380px',\n maxWidth: 'calc(100vw - 40px)',\n height: '520px',\n maxHeight: 'calc(100dvh - 120px)',\n backgroundColor: 'var(--sk-bg, #ffffff)',\n borderRadius: '16px',\n boxShadow: '0 8px 32px rgba(0, 0, 0, 0.2)',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n zIndex: 9998,\n animation: 'chatSlideUp 0.3s ease-out',\n }}\n >\n {Header}\n\n {/* Content: Welcome → Checking → Chat → Offline */}\n {checkingAvailability || checkingHandoff ? CheckingScreen : showOfflineForm ? OfflineFormView : showWelcome && welcomeEnabled && messages.length === 0 ? WelcomeScreen : MessagesView}\n\n {/* Powered by */}\n {showPoweredBy && (\n <div style={{ padding: '6px 0', textAlign: 'center', fontSize: 11, color: 'var(--sk-text-tertiary, #9ca3af)', backgroundColor: 'var(--sk-bg, #ffffff)', borderTop: '1px solid var(--sk-bg-elevated, #f3f4f6)' }}>\n Powered by{' '}\n <a href=\"https://sonor.io\" target=\"_blank\" rel=\"noopener noreferrer\" style={{ color: 'var(--sk-text-secondary, #6b7280)', textDecoration: 'none', fontWeight: 500 }}>\n Sonor\n </a>\n </div>\n )}\n\n {/* CSS animations and markdown styles */}\n <style>{`\n @keyframes chatSlideUp {\n from { opacity: 0; transform: translateY(20px); }\n to { opacity: 1; transform: translateY(0); }\n }\n @keyframes chatDot {\n 0%, 80%, 100% { opacity: 0.3; }\n 40% { opacity: 1; }\n }\n @keyframes checkPulse {\n 0% { transform: scale(1); opacity: 1; }\n 100% { transform: scale(1.8); opacity: 0; }\n }\n @keyframes checkDots {\n 0% { content: ''; }\n 25% { content: '.'; }\n 50% { content: '..'; }\n 75% { content: '...'; }\n }\n @keyframes checkProgress {\n from { transform: scaleX(0); }\n to { transform: scaleX(1); }\n }\n .chatMessageContent p:first-child { margin-top: 0; }\n .chatMessageContent p:last-child { margin-bottom: 0; }\n `}</style>\n </div>\n )\n\n // Show button immediately; popup content needs projectId (resolved from API key via project-info)\n return (\n <>\n {ChatPopup}\n {ChatButton}\n </>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/layout/SiteKitClientProviders.tsx"],"names":[],"mappings":"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","file":"chunk-KMZ527EM.mjs","sourcesContent":["'use client'\n\n/**\n * SiteKitClientProviders — Client Island\n *\n * This is the 'use client' boundary for SiteKitLayout.\n * It composes the client-only providers (Analytics, Engage, Signal, SitemapSync)\n * that require React context or browser APIs.\n *\n * All modules are lazy-loaded via next/dynamic so their JS is only downloaded\n * when the feature is enabled — keeping the initial bundle lightweight.\n *\n * All modules share a unified identity (visitor ID + session ID) via\n * SiteKitIdentityProvider, ensuring consistent tracking across Analytics,\n * Signal, and Engage.\n *\n * Props are passed down from the server-side SiteKitLayout component,\n * which reads env vars at render time.\n */\n\nimport React, { Suspense, useCallback, useRef, useState, type ReactNode } from 'react'\nimport dynamic from 'next/dynamic'\nimport {\n SiteKitIdentityProvider,\n getOrCreateVisitorId,\n getOrCreateSessionId,\n} from '../shared/identity'\n// Defer non-critical module mounting until the page is quiet: the lazy\n// modules below are dynamic(ssr:false) and never render on the server, but\n// rendering them during hydration still kicks off their chunk downloads +\n// mount effects inside the critical startup window. useDeferredActivation\n// holds them until window.load + idle or first interaction — the same\n// strategy as the hand-rolled per-site deferrals this replaces (upforge\n// `deferred-analytics.tsx`, TPS `DeferredAnalytics.tsx`). The hook is public\n// (`@sonordev/site-kit/client`) so sites can reuse it for their own scripts.\nimport { useDeferredActivation } from '../shared/defer'\nimport type { AnalyticsConfig, EngageConfig, SignalConfig } from './types'\n\n// Lazy-load feature modules — JS only downloaded when feature is enabled\nconst LazyAnalyticsProvider = dynamic(\n () => import('../analytics/AnalyticsProvider').then(m => ({ default: m.AnalyticsProvider })),\n { ssr: false },\n)\nconst LazyEngageWidget = dynamic(\n () => import('../engage/EngageWidget').then(m => ({ default: m.EngageWidget })),\n { ssr: false },\n)\nconst LazySitemapSync = dynamic(\n () => import('../SitemapSync').then(m => ({ default: m.SitemapSync })),\n { ssr: false },\n)\n// SignalBridge is imported STATICALLY, not via dynamic(ssr:false): it is a\n// tiny SSR-safe context shell that renders children immediately and\n// lazy-loads its machinery (SignalCore) as a childless sibling internally.\n// Wrapping children in a dynamic(ssr:false) component was the old SSR-bailout\n// failure mode — do not reintroduce it.\nimport { SignalBridge } from '../signal/SignalBridge'\n\nexport interface SiteKitClientProvidersProps {\n children: ReactNode\n apiKey: string\n apiUrl: string\n projectId?: string\n analytics?: boolean | AnalyticsConfig\n engage?: boolean | EngageConfig\n signal?: boolean | SignalConfig\n sitemapSync?: boolean\n /**\n * Defer Analytics / Engage / SitemapSync until window load + idle or first\n * interaction (default true). Pass false to restore legacy eager mounting\n * on hydration. SignalBridge is never deferred — it must apply experiment\n * variants as early as possible.\n */\n defer?: boolean\n debug?: boolean\n}\n\nexport function SiteKitClientProviders({\n children,\n apiKey,\n apiUrl,\n projectId,\n analytics = true,\n engage = true,\n signal = false,\n sitemapSync = true,\n defer = true,\n debug = false,\n}: SiteKitClientProvidersProps) {\n // One shared activation gate for all deferred siblings, so they mount in a\n // single commit instead of staggered re-renders.\n const modulesReady = useDeferredActivation(defer)\n // Hoist analytics config so the `site` dimension is resolvable up here.\n const analyticsConfig: AnalyticsConfig =\n typeof analytics === 'object' ? analytics : {}\n\n // Resolve the sub-site identifier — the dimension that lets one Sonor project\n // host many sites (e.g. truepowersystems.com + ohiopowerstudies.com under one\n // TPS project). Precedence: explicit `analytics.site` > NEXT_PUBLIC_SITE_URL\n // host > window.location.host. Always a string (possibly empty).\n const explicitSite = analyticsConfig.site\n const envSiteUrl =\n typeof process !== 'undefined'\n ? process.env.NEXT_PUBLIC_SITE_URL\n : undefined\n let resolvedSite = explicitSite ?? ''\n if (!resolvedSite && envSiteUrl) {\n try {\n resolvedSite = new URL(envSiteUrl).host\n } catch {\n /* malformed URL — fall through to client-side host */\n }\n }\n if (!resolvedSite && typeof window !== 'undefined') {\n resolvedSite = window.location.host\n }\n const site = resolvedSite\n\n // Set window globals for modules that still read from them.\n if (typeof window !== 'undefined') {\n ;(window as any).__SITE_KIT_API_URL__ = apiUrl\n ;(window as any).__SITE_KIT_API_KEY__ = apiKey\n ;(window as any).__SITE_KIT_DEBUG__ = debug\n ;(window as any).__SITE_KIT_SITE__ = site\n }\n\n // Unified identity — single source of truth for all modules\n const [visitorId] = useState(() => getOrCreateVisitorId())\n const [sessionId] = useState(() => getOrCreateSessionId())\n\n // Page metadata bridge: Analytics writes, Signal reads\n const pageMetadataRef = useRef<Record<string, unknown> | null>(null)\n const onPageMetadata = useCallback((metadata: Record<string, unknown>) => {\n pageMetadataRef.current = metadata\n }, [])\n\n let content = <>{children}</>\n\n // Wrap with SignalBridge if enabled. Safe to wrap: the shell is SSR-safe\n // and renders children straight through — the heavy machinery mounts as a\n // childless sibling inside it. Not gated on modulesReady: experiment\n // variants must apply as early as possible.\n if (signal) {\n const signalConfig: SignalConfig =\n typeof signal === 'object' ? signal : {}\n content = (\n <SignalBridge\n enabled\n realtime={signalConfig.realtime !== false}\n experiments={signalConfig.experiments !== false}\n behaviorTracking={signalConfig.behaviorTracking !== false}\n visitorId={visitorId}\n sessionId={sessionId}\n pageMetadataRef={pageMetadataRef}\n >\n {content}\n </SignalBridge>\n )\n }\n\n // Add Analytics if enabled (renders alongside, doesn't wrap).\n //\n // CRITICAL: LazyAnalyticsProvider is dynamic(..., { ssr: false }). Wrapping\n // {content} inside an ssr:false component makes the entire page tree skip\n // server rendering — the route de-opts to 100% client rendering and the\n // hero / LCP element only paints after hydration (mobile LCP ~4s, Lighthouse\n // ~85). Analytics tracks via effects + a metadata ref, so it never needs to\n // wrap page content — mount it as a childless sibling, exactly like Engage.\n // Each deferred sibling is appended as `{modulesReady && <Module/>}` so the\n // children slot never moves in the tree — flipping ready only mounts the\n // sibling, it never remounts page content.\n if (analytics) {\n content = (\n <>\n {content}\n {modulesReady && (\n <Suspense fallback={null}>\n <LazyAnalyticsProvider\n apiUrl={apiUrl}\n apiKey={apiKey}\n site={site}\n trackPageViews={analyticsConfig.trackPageViews !== false}\n trackWebVitals={analyticsConfig.trackWebVitals !== false}\n trackScrollDepth={analyticsConfig.trackScrollDepth !== false}\n trackClicks={analyticsConfig.trackClicks !== false}\n sessionTimeout={analyticsConfig.sessionDuration}\n excludePaths={analyticsConfig.excludePaths}\n debug={debug}\n externalVisitorId={visitorId}\n externalSessionId={sessionId}\n onPageMetadata={onPageMetadata}\n />\n </Suspense>\n )}\n </>\n )\n }\n\n // Add Engage widget if enabled (renders alongside, doesn't wrap)\n if (engage) {\n const engageConfig: EngageConfig =\n typeof engage === 'object' ? engage : {}\n content = (\n <>\n {content}\n {modulesReady && (\n <LazyEngageWidget\n apiUrl={apiUrl}\n apiKey={apiKey}\n projectId={projectId}\n position={engageConfig.position || 'bottom-right'}\n zIndex={engageConfig.zIndex}\n chatEnabled={engageConfig.chatEnabled !== false}\n />\n )}\n </>\n )\n }\n\n // Add SitemapSync if enabled\n if (sitemapSync) {\n content = (\n <>\n {content}\n {modulesReady && <LazySitemapSync debug={debug} />}\n </>\n )\n }\n\n return (\n <SiteKitIdentityProvider visitorId={visitorId} sessionId={sessionId}>\n {content}\n </SiteKitIdentityProvider>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/forms/useFormTracking.ts","../src/forms/defaultSuccessMessage.ts","../src/forms/fetchWithRetry.ts","../src/forms/recaptcha.ts","../src/forms/submitForm.ts","../src/forms/useForm.ts"],"names":["useRef","useEffect","useCallback","useState","useMemo"],"mappings":"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","file":"chunk-MLJXELPA.js","sourcesContent":["/**\n * @sonordev/site-kit/forms - Form Tracking Hook\n * \n * Tracks form analytics including step progress and abandonment\n */\n\n'use client'\n\nimport { useEffect, useRef, useCallback } from 'react'\n\ninterface UseFormTrackingOptions {\n formId: string\n totalSteps: number\n enabled?: boolean\n debug?: boolean\n}\n\ninterface FormTrackingReturn {\n trackStepChange: (step: number) => void\n trackComplete: () => void\n sessionId: string\n}\n\nexport function useFormTracking({\n formId,\n totalSteps,\n enabled = true,\n debug = false,\n}: UseFormTrackingOptions): FormTrackingReturn {\n const sessionIdRef = useRef<string>('')\n const startTimeRef = useRef<number>(0)\n const stepStartTimeRef = useRef<number>(0)\n const stepTimesRef = useRef<Record<number, number>>({})\n const currentStepRef = useRef<number>(1)\n const maxStepRef = useRef<number>(1)\n const analyticsIdRef = useRef<string | null>(null)\n \n // Initialize tracking\n useEffect(() => {\n if (!enabled) return\n if (!formId) {\n if (debug) console.warn('[Forms] Tracking skipped: formId is empty')\n return\n }\n \n // Generate session ID\n sessionIdRef.current = crypto.randomUUID()\n startTimeRef.current = Date.now()\n stepStartTimeRef.current = Date.now()\n \n // Record form start\n const startTracking = async () => {\n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n try {\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/start`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n formId,\n sessionId: sessionIdRef.current,\n deviceType: getDeviceType(),\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n const data = await response.json()\n analyticsIdRef.current = data.id\n if (debug) console.log('[Forms] Started tracking:', data.id)\n } catch (error) {\n if (debug) console.error('[Forms] Error starting tracking:', error)\n }\n }\n \n startTracking()\n \n // Handle abandonment on page leave\n const handleBeforeUnload = () => {\n if (!analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) return\n \n const now = Date.now()\n const currentStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = currentStepTime\n \n // Use sendBeacon for reliable delivery during page unload\n const payload = JSON.stringify({\n analyticsId: analyticsIdRef.current,\n step: currentStepRef.current,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n })\n \n const blob = new Blob([payload], { type: 'application/json' })\n // Note: sendBeacon doesn't support custom headers, API key included in URL\n const _headers = new Headers({\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n })\n \n // Try sendBeacon first (more reliable during unload)\n const sent = navigator.sendBeacon(\n `${apiUrl}/api/public/forms/analytics/abandon`,\n blob\n )\n \n if (debug) console.log('[Forms] Abandonment tracked:', sent ? 'success' : 'failed')\n }\n \n window.addEventListener('beforeunload', handleBeforeUnload)\n \n return () => {\n window.removeEventListener('beforeunload', handleBeforeUnload)\n }\n }, [formId, enabled, debug])\n \n // Track step changes\n const trackStepChange = useCallback(async (step: number) => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time spent on previous step\n const prevStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = prevStepTime\n \n // Update refs\n currentStepRef.current = step\n maxStepRef.current = Math.max(maxStepRef.current, step)\n stepStartTimeRef.current = now\n \n // Update database\n try {\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/step`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n step,\n maxStep: maxStepRef.current,\n stepTimes: stepTimesRef.current,\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Step changed to:', step)\n } catch (error) {\n if (debug) console.error('[Forms] Error updating step:', error)\n }\n }, [enabled, debug])\n \n // Track completion\n const trackComplete = useCallback(async () => {\n if (!enabled || !analyticsIdRef.current) return\n \n const apiUrl = (window as any).__SITE_KIT_API_URL__\n const apiKey = (window as any).__SITE_KIT_API_KEY__\n \n if (!apiUrl || !apiKey) {\n if (debug) console.error('[Forms] Missing API URL or API key')\n return\n }\n \n const now = Date.now()\n \n // Record time for final step\n const finalStepTime = Math.floor((now - stepStartTimeRef.current) / 1000)\n stepTimesRef.current[currentStepRef.current] = finalStepTime\n \n try {\n // Complete form analytics tracking\n // Note: A database trigger will automatically log this as a conversion\n // in analytics_conversions when completed_at is set\n const response = await fetch(`${apiUrl}/api/public/forms/analytics/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n analyticsId: analyticsIdRef.current,\n totalSteps,\n stepTimes: stepTimesRef.current,\n totalTimeSeconds: Math.floor((now - startTimeRef.current) / 1000),\n }),\n })\n \n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n \n if (debug) console.log('[Forms] Form completed, recording conversion')\n\n // Explicitly track as a conversion (don't rely on DB trigger)\n try {\n await fetch(`${apiUrl}/api/public/analytics/conversion`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n sessionId: sessionIdRef.current,\n conversionType: 'form_submission',\n metadata: { formId, analyticsId: analyticsIdRef.current },\n pagePath: typeof window !== 'undefined' ? window.location.pathname : '/',\n referrer: typeof document !== 'undefined' ? document.referrer || null : null,\n deviceType: getDeviceType(),\n }),\n })\n } catch (convErr) {\n if (debug) console.error('[Forms] Error recording conversion:', convErr)\n }\n } catch (error) {\n if (debug) console.error('[Forms] Error completing tracking:', error)\n }\n }, [enabled, totalSteps, formId, debug])\n \n return {\n trackStepChange,\n trackComplete,\n sessionId: sessionIdRef.current,\n }\n}\n\n// Helper\nfunction getDeviceType(): 'desktop' | 'mobile' | 'tablet' {\n if (typeof window === 'undefined') return 'desktop'\n const ua = navigator.userAgent\n if (/tablet|ipad|playbook|silk/i.test(ua)) return 'tablet'\n if (/mobile|iphone|ipod|android|blackberry|opera mini|iemobile/i.test(ua)) return 'mobile'\n return 'desktop'\n}\n\n","/** Shown when the API omits or returns an empty `success_message`. */\nexport const DEFAULT_FORM_SUCCESS_MESSAGE =\n 'Thank you for your submission! We will be in touch soon.'\n","/**\n * @sonordev/site-kit/forms - Resilient fetch\n *\n * Adds a per-attempt timeout and retries transient failures (network errors,\n * request timeouts, HTTP 429, and 5xx) with exponential backoff.\n *\n * A form submission must survive a brief API blip — a deploy, a cold start, a\n * dropped packet. A single un-retried fetch turning into \"Something went wrong\"\n * is how leads get lost.\n */\n\nexport interface FetchRetryOptions {\n /** Number of retries AFTER the first attempt (default 2 → up to 3 tries total). */\n retries?: number\n /** Per-attempt timeout in milliseconds (default 15000). */\n timeoutMs?: number\n}\n\nfunction backoffDelay(attempt: number, response?: Response): number {\n // Honor a Retry-After header on 429 responses when present.\n if (response?.status === 429) {\n const header = response.headers.get('retry-after')\n const seconds = header ? parseInt(header, 10) : NaN\n if (!Number.isNaN(seconds) && seconds > 0) return Math.min(seconds * 1000, 10000)\n }\n // Exponential backoff: 500ms, 1s, 2s, ... capped at 8s.\n return Math.min(8000, 500 * 2 ** attempt)\n}\n\n/**\n * fetch() with a timeout and automatic retries for transient failures.\n *\n * Non-transient responses (2xx, 3xx, and 4xx other than 429) are returned to\n * the caller as-is — only 429/5xx and thrown network/timeout errors are retried.\n * If every attempt fails with a thrown error, the last error is re-thrown.\n */\nexport async function fetchWithRetry(\n url: string,\n init: RequestInit,\n options: FetchRetryOptions = {},\n): Promise<Response> {\n const retries = options.retries ?? 2\n const timeoutMs = options.timeoutMs ?? 15000\n let lastError: unknown\n\n for (let attempt = 0; attempt <= retries; attempt++) {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), timeoutMs)\n try {\n const response = await fetch(url, { ...init, signal: controller.signal })\n clearTimeout(timer)\n\n if ((response.status === 429 || response.status >= 500) && attempt < retries) {\n await new Promise((resolve) => setTimeout(resolve, backoffDelay(attempt, response)))\n continue\n }\n return response\n } catch (error) {\n clearTimeout(timer)\n lastError = error\n // Network failure or timeout (AbortController) — retry while attempts remain.\n if (attempt < retries) {\n await new Promise((resolve) => setTimeout(resolve, backoffDelay(attempt)))\n continue\n }\n }\n }\n\n throw lastError instanceof Error\n ? lastError\n : new Error('Network request failed after multiple attempts. Please try again.')\n}\n","/**\n * reCAPTCHA Enterprise - Client-side token generation for site-kit forms\n *\n * Site key is read from:\n * - window.__SITE_KIT_RECAPTCHA_SITE_KEY__ (set by SiteKitProvider)\n * - process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY (when bundled in Next.js app)\n */\n\nfunction getSiteKey(explicitSiteKey?: string): string | undefined {\n if (typeof window === 'undefined') return undefined\n if (explicitSiteKey) return explicitSiteKey\n const win = window as any\n return win.__SITE_KIT_RECAPTCHA_SITE_KEY__ ?? process.env.NEXT_PUBLIC_RECAPTCHA_SITE_KEY\n}\n\n/** Max time to wait for reCAPTCHA Enterprise to become usable before giving up. */\nconst RECAPTCHA_LOAD_TIMEOUT_MS = 10000\n\nfunction loadScript(siteKey: string): Promise<any> {\n return new Promise((resolve) => {\n if (typeof window === 'undefined') {\n resolve(null)\n return\n }\n const win = window as any\n if (win.grecaptcha?.enterprise) {\n resolve(win.grecaptcha)\n return\n }\n\n // Never hang the form: if the script is blocked (ad-blocker), stalls, or\n // never initializes `grecaptcha.enterprise`, resolve null after a timeout.\n // The caller treats a null result as \"no token\" rather than waiting forever.\n let settled = false\n const finish = (value: any) => {\n if (settled) return\n settled = true\n resolve(value)\n }\n const giveUp = setTimeout(() => finish(null), RECAPTCHA_LOAD_TIMEOUT_MS)\n\n const waitForReady = () => {\n if (settled) return\n if (win.grecaptcha?.enterprise) {\n clearTimeout(giveUp)\n finish(win.grecaptcha)\n return\n }\n setTimeout(waitForReady, 50)\n }\n\n const existing = document.querySelector('script[src*=\"recaptcha/enterprise\"]')\n if (existing) {\n waitForReady()\n return\n }\n\n const script = document.createElement('script')\n script.src = `https://www.google.com/recaptcha/enterprise.js?render=${siteKey}`\n script.async = true\n script.onload = () => waitForReady()\n script.onerror = () => {\n clearTimeout(giveUp)\n finish(null)\n }\n document.head.appendChild(script)\n })\n}\n\n/**\n * Get a reCAPTCHA Enterprise token for form submission.\n * Returns null if not configured or in SSR.\n */\nexport async function getRecaptchaToken(explicitSiteKey?: string): Promise<string | null> {\n const siteKey = getSiteKey(explicitSiteKey)\n if (!siteKey || typeof window === 'undefined') return null\n try {\n const grecaptcha = await loadScript(siteKey)\n if (!grecaptcha?.enterprise?.execute) return null\n const token = await grecaptcha.enterprise.execute(siteKey, { action: 'submit' })\n return token || null\n } catch (err) {\n console.warn('[site-kit reCAPTCHA]', err)\n return null\n }\n}\n","/**\n * @sonordev/site-kit/forms - Shared submission logic\n *\n * Single source of truth for sending a managed form to the Sonor API. Both\n * <ManagedForm> (via FormClient) and the headless useForm() hook submit through\n * here, so the request shape, retry behaviour, reCAPTCHA handling, and error\n * parsing can never drift between the two paths.\n */\n\nimport { fetchWithRetry } from './fetchWithRetry'\nimport { getRecaptchaToken } from './recaptcha'\nimport type { ManagedFormConfig } from './types'\n\n/**\n * Default honeypot field name. Deliberately obscure — a common name like\n * \"website\" collides with real form fields and gets every genuine submission\n * flagged as spam.\n */\nexport const DEFAULT_HONEYPOT_FIELD = '_sk_hp_url'\n\nfunction getApiConfig(): { apiUrl: string; apiKey: string | undefined } {\n const apiUrl =\n typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey =\n typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n return { apiUrl, apiKey }\n}\n\nfunction getUTMParams(): Record<string, string | null> {\n if (typeof window === 'undefined') return {}\n const params = new URLSearchParams(window.location.search)\n const out: Record<string, string | null> = {}\n for (const key of ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content']) {\n out[key] = params.get(key)\n }\n return out\n}\n\nexport interface SubmitFormArgs {\n config: ManagedFormConfig\n /**\n * Field values to submit. The caller must pass VISIBLE values only —\n * conditionally-hidden fields should be excluded so stale values are not sent.\n */\n values: Record<string, unknown>\n /** Honeypot input value (empty string for the headless hook, which has no honeypot UI). */\n honeypotValue: string\n /** Timestamp (ms) the form was first rendered — a weak anti-bot timing signal. */\n formLoadedAt: number\n}\n\n/**\n * Submit a managed form. Throws on failure (network, timeout, or a non-2xx\n * response) with a human-readable message; resolves with the parsed API\n * response on success.\n */\nexport async function submitForm({\n config,\n values,\n honeypotValue,\n formLoadedAt,\n}: SubmitFormArgs): Promise<unknown> {\n const { apiUrl, apiKey } = getApiConfig()\n if (!apiKey) {\n throw new Error('API key is required. Set SONOR_API_KEY in your environment.')\n }\n\n // reCAPTCHA token is fetched right before the POST so it cannot expire.\n const recaptchaToken = config.recaptcha_enabled\n ? await getRecaptchaToken(config.recaptcha_site_key)\n : null\n if (config.recaptcha_enabled && !recaptchaToken) {\n throw new Error('Verification could not be completed. Please try again.')\n }\n\n const honeypotFieldName = config.honeypot_field || DEFAULT_HONEYPOT_FIELD\n const utm = getUTMParams()\n\n const payload = {\n formId: config.id,\n form_id: config.id,\n data: {\n ...values,\n ...(config.honeypot_enabled ? { [honeypotFieldName]: honeypotValue } : {}),\n },\n metadata: {\n pageUrl: typeof window !== 'undefined' ? window.location.href : null,\n referrer: typeof document !== 'undefined' ? document.referrer || null : null,\n userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : null,\n sessionId:\n typeof sessionStorage !== 'undefined' ? sessionStorage.getItem('_sk_sid') : null,\n // Anonymous visitor id (_sk_vid) — the same id Analytics/Signal stamp on\n // page views, so the Sonor side can bind this lead to its browsing session\n // (page -> lead attribution). Sent on every submission; null pre-hydration.\n visitorId:\n typeof localStorage !== 'undefined' ? localStorage.getItem('_sk_vid') : null,\n recaptchaToken: recaptchaToken || undefined,\n utmSource: utm.utm_source,\n utmMedium: utm.utm_medium,\n utmCampaign: utm.utm_campaign,\n // Sub-site host — preserved on form_submissions for lead attribution\n // across multi-site projects. Resolved by SiteKitClientProviders.\n site:\n typeof window !== 'undefined'\n ? (window as { __SITE_KIT_SITE__?: string }).__SITE_KIT_SITE__ ||\n window.location.host\n : undefined,\n _formLoadedAt: formLoadedAt,\n },\n }\n\n const response = await fetchWithRetry(\n `${apiUrl}/api/public/forms/submit`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify(payload),\n },\n { retries: 2, timeoutMs: 20000 },\n )\n\n const data = await response.json().catch(() => null)\n\n if (!response.ok) {\n const msg = (\n data?.message ??\n data?.error ??\n (response.statusText || `HTTP ${response.status}`)\n )\n .toString()\n .trim()\n throw new Error(\n msg ? `Failed to submit form: ${msg}` : `Failed to submit form (${response.status})`,\n )\n }\n\n return data\n}\n","/**\n * @sonordev/site-kit/forms - useForm Hook\n * \n * Headless hook for complete control over form rendering.\n * Fetches form config from API, handles validation, state, and submission.\n * \n * @example\n * ```tsx\n * const { form, fields, values, errors, setFieldValue, submit, isSubmitting } = useForm('contact-form')\n * \n * return (\n * <form onSubmit={(e) => { e.preventDefault(); submit() }}>\n * {fields.map(field => (\n * <MyCustomInput\n * key={field.slug}\n * label={field.label}\n * value={values[field.slug]}\n * error={errors[field.slug]}\n * onChange={(val) => setFieldValue(field.slug, val)}\n * />\n * ))}\n * <button type=\"submit\" disabled={isSubmitting}>Submit</button>\n * </form>\n * )\n * ```\n */\n\n'use client'\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from 'react'\nimport { useFormTracking } from './useFormTracking'\nimport { fetchWithRetry } from './fetchWithRetry'\nimport { submitForm } from './submitForm'\nimport type { \n ManagedFormConfig, \n FormField, \n FormSubmission \n} from './types'\nimport { DEFAULT_FORM_SUCCESS_MESSAGE } from './defaultSuccessMessage'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UseFormOptions {\n /** Project ID (defaults to SiteKitProvider config) */\n projectId?: string\n /** Callback when form submits successfully */\n onSuccess?: (submission: FormSubmission) => void\n /** Callback when submission fails */\n onError?: (error: Error) => void\n /** Initial values to prefill */\n initialValues?: Record<string, unknown>\n /** Auto-redirect after success (override form config) */\n redirectUrl?: string | false\n}\n\nexport interface UseFormReturn {\n /** Form configuration (null while loading) */\n form: ManagedFormConfig | null\n /** Loading state */\n isLoading: boolean\n /** Error fetching form */\n fetchError: Error | null\n /** Human-readable error from the last submit attempt (null when none) */\n submitError: string | null\n\n /** All form fields */\n allFields: FormField[]\n /** Fields for current step (multi-step) or all fields (single step) */\n fields: FormField[]\n /** Visible fields only (respecting conditional logic) */\n visibleFields: FormField[]\n \n /** Current form values */\n values: Record<string, unknown>\n /** Current validation errors */\n errors: Record<string, string>\n \n /** Set a single field value */\n setFieldValue: (key: string, value: unknown) => void\n /** Set multiple field values at once */\n setValues: (values: Record<string, unknown>) => void\n /** Clear all errors */\n clearErrors: () => void\n \n /** Multi-step state */\n step: number\n totalSteps: number\n isMultiStep: boolean\n progress: number\n \n /** Multi-step navigation */\n nextStep: () => boolean\n prevStep: () => void\n goToStep: (step: number) => void\n canGoNext: boolean\n canGoPrev: boolean\n isLastStep: boolean\n \n /** Validate current step */\n validate: () => boolean\n /** Validate a single field */\n validateField: (field: FormField) => string | null\n /** Check if a field is visible (conditional logic) */\n isFieldVisible: (field: FormField) => boolean\n \n /** Submit the form */\n submit: () => Promise<void>\n /** Submission state */\n isSubmitting: boolean\n isComplete: boolean\n /** Reset form to initial state */\n reset: () => void\n}\n\n// ============================================\n// Hook\n// ============================================\n\nexport function useForm(\n formIdOrSlug: string,\n options: UseFormOptions = {}\n): UseFormReturn {\n const { \n projectId: optionsProjectId,\n onSuccess, \n onError, \n initialValues = {},\n redirectUrl,\n } = options\n \n // Get projectId from window globals if not provided\n const projectId = optionsProjectId || \n (typeof window !== 'undefined' ? (window as any).__SITE_KIT_PROJECT_ID__ : undefined)\n \n // State\n const [form, setForm] = useState<ManagedFormConfig | null>(null)\n const [isLoading, setIsLoading] = useState(true)\n const [fetchError, setFetchError] = useState<Error | null>(null)\n const [values, setValuesState] = useState<Record<string, unknown>>(initialValues)\n const [errors, setErrors] = useState<Record<string, string>>({})\n const [step, setStep] = useState(1)\n const [isSubmitting, setIsSubmitting] = useState(false)\n const [isComplete, setIsComplete] = useState(false)\n const [submitError, setSubmitError] = useState<string | null>(null)\n\n // Synchronous re-entrancy guard + anti-bot timing.\n const isSubmittingRef = useRef(false)\n const formLoadedAt = useRef(Date.now())\n\n const totalSteps = form?.total_steps || 1\n const isMultiStep = (form?.is_multi_step) || false\n \n const { trackStepChange, trackComplete } = useFormTracking({\n formId: form?.id || '',\n totalSteps,\n })\n \n // Fetch form config (project is derived from API key on the backend; projectId is optional)\n useEffect(() => {\n const apiUrl = typeof window !== 'undefined'\n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n\n async function fetchForm() {\n try {\n setIsLoading(true)\n setFetchError(null)\n\n // The provider sets __SITE_KIT_API_KEY__ during its render; if this\n // hook's effect happens to run first, poll briefly for it rather than\n // failing permanently and wedging the form on \"API key is required\".\n const readApiKey = (): string | undefined =>\n typeof window !== 'undefined' ? (window as any).__SITE_KIT_API_KEY__ : undefined\n let apiKey = readApiKey()\n for (let i = 0; i < 15 && !apiKey; i++) {\n await new Promise((r) => setTimeout(r, 100))\n apiKey = readApiKey()\n }\n if (!apiKey) {\n throw new Error('API key is required. Provide it via SiteKitLayout/SiteKitProvider or set SONOR_API_KEY.')\n }\n\n const url = `${apiUrl}/api/public/forms/config`\n const init: RequestInit = {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({\n formIdOrSlug: formIdOrSlug,\n }),\n }\n\n const response = await fetchWithRetry(url, init, { retries: 3, timeoutMs: 15000 })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch form: ${response.statusText}`)\n }\n \n const data = await response.json()\n if (!data) throw new Error('Form not found')\n\n if (typeof window !== 'undefined' && data.recaptcha_site_key) {\n ;(window as any).__SITE_KIT_RECAPTCHA_SITE_KEY__ = data.recaptcha_site_key\n }\n \n // Sort steps and fields\n if (data.steps) {\n data.steps.sort((a: any, b: any) => (a.step_number || 0) - (b.step_number || 0))\n }\n if (data.fields) {\n data.fields.sort((a: any, b: any) => (a.sort_order || 0) - (b.sort_order || 0))\n }\n \n // Compute multi-step properties\n const total_steps = data.steps?.length || 1\n const is_multi_step = total_steps > 1\n\n const apiSuccess =\n typeof data.success_message === 'string' ? data.success_message.trim() : ''\n const success_message =\n apiSuccess ||\n (typeof (data as { successMessage?: string }).successMessage === 'string'\n ? String((data as { successMessage?: string }).successMessage).trim()\n : '') ||\n DEFAULT_FORM_SUCCESS_MESSAGE\n \n setForm({\n ...data,\n success_message,\n total_steps,\n is_multi_step,\n })\n \n // Set default values from field configs\n const defaults: Record<string, unknown> = {}\n for (const field of data.fields || []) {\n if (field.default_value !== undefined && field.default_value !== null) {\n defaults[field.slug] = field.default_value\n }\n }\n setValuesState({ ...defaults, ...initialValues })\n \n } catch (err) {\n setFetchError(err as Error)\n } finally {\n setIsLoading(false)\n }\n }\n \n fetchForm()\n }, [formIdOrSlug, projectId])\n \n // All fields\n const allFields = useMemo(() => form?.fields || [], [form])\n \n // Fields for current step\n const fields = useMemo(() => {\n if (!isMultiStep) return allFields\n \n const currentStepConfig = form?.steps?.find(s => s.step_number === step)\n if (!currentStepConfig) return allFields\n \n return allFields.filter(f => f.step_id === currentStepConfig.id)\n }, [form, step, allFields, isMultiStep])\n \n // Check if field is visible (conditional logic)\n const isFieldVisible = useCallback((field: FormField): boolean => {\n if (!field.conditional?.show_when) return true\n \n const { field: condField, operator, value } = field.conditional.show_when\n const fieldValue = values[condField]\n \n switch (operator) {\n case 'equals':\n return fieldValue === value\n case 'not_equals':\n return fieldValue !== value\n case 'contains':\n return String(fieldValue || '').includes(String(value))\n case 'not_contains':\n return !String(fieldValue || '').includes(String(value))\n case 'is_empty':\n return !fieldValue || fieldValue === ''\n case 'not_empty':\n return !!fieldValue && fieldValue !== ''\n case 'greater_than':\n return Number(fieldValue) > Number(value)\n case 'less_than':\n return Number(fieldValue) < Number(value)\n default:\n return true\n }\n }, [values])\n \n // Visible fields only\n const visibleFields = useMemo(() => {\n return fields.filter(isFieldVisible)\n }, [fields, isFieldVisible])\n \n // Validate a single field\n const validateField = useCallback((field: FormField): string | null => {\n if (!isFieldVisible(field)) return null\n // Skip display-only field types\n if (['heading', 'section_header', 'paragraph', 'hidden'].includes(field.field_type)) return null\n\n const value = values[field.slug]\n const rules = field.validation || {}\n \n // Required check\n if (field.is_required && (!value || value === '')) {\n return rules.custom_error || `${field.label} is required`\n }\n \n if (!value) return null\n \n const strValue = String(value)\n \n // Length checks\n if (rules.min_length && strValue.length < rules.min_length) {\n return `${field.label} must be at least ${rules.min_length} characters`\n }\n if (rules.max_length && strValue.length > rules.max_length) {\n return `${field.label} must be no more than ${rules.max_length} characters`\n }\n \n // Numeric checks\n if (rules.min !== undefined && Number(value) < rules.min) {\n return `${field.label} must be at least ${rules.min}`\n }\n if (rules.max !== undefined && Number(value) > rules.max) {\n return `${field.label} must be no more than ${rules.max}`\n }\n \n // Pattern check — guard against an invalid admin-entered pattern.\n if (rules.pattern) {\n try {\n if (!new RegExp(rules.pattern).test(strValue)) {\n return rules.custom_error || `${field.label} is invalid`\n }\n } catch {\n // Malformed pattern — skip rather than crashing the form.\n }\n }\n \n // Email check\n if (field.field_type === 'email' && !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(strValue)) {\n return 'Please enter a valid email address'\n }\n \n // Phone check\n if (field.field_type === 'phone' && !/^[\\d\\s\\-\\+\\(\\)]+$/.test(strValue)) {\n return 'Please enter a valid phone number'\n }\n \n return null\n }, [values, isFieldVisible])\n \n // Validate current step\n const validate = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n \n for (const field of fields) {\n const error = validateField(field)\n if (error) {\n newErrors[field.slug] = error\n }\n }\n \n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [fields, validateField])\n\n // Validate EVERY field across all steps — used on final submit so a required\n // field left empty on an earlier step cannot slip through.\n const validateAll = useCallback((): boolean => {\n const newErrors: Record<string, string> = {}\n for (const field of allFields) {\n const error = validateField(field)\n if (error) newErrors[field.slug] = error\n }\n setErrors(newErrors)\n return Object.keys(newErrors).length === 0\n }, [allFields, validateField])\n\n // Visible field values only — never submit a value from a conditionally-hidden field.\n const buildVisibleValues = useCallback((): Record<string, unknown> => {\n const out: Record<string, unknown> = {}\n for (const field of allFields) {\n if (!isFieldVisible(field)) continue\n if (field.slug in values) out[field.slug] = values[field.slug]\n }\n return out\n }, [allFields, values, isFieldVisible])\n\n // Set single field value\n const setFieldValue = useCallback((key: string, value: unknown) => {\n setValuesState(prev => ({ ...prev, [key]: value }))\n // Clear error when field changes\n setErrors(prev => {\n if (prev[key]) {\n const next = { ...prev }\n delete next[key]\n return next\n }\n return prev\n })\n }, [])\n \n // Set multiple values\n const setValues = useCallback((newValues: Record<string, unknown>) => {\n setValuesState(prev => ({ ...prev, ...newValues }))\n }, [])\n \n // Clear all errors\n const clearErrors = useCallback(() => {\n setErrors({})\n }, [])\n \n // Step navigation\n const canGoNext = step < totalSteps\n const canGoPrev = step > 1\n const isLastStep = step === totalSteps\n const progress = Math.round((step / totalSteps) * 100)\n \n const nextStep = useCallback((): boolean => {\n if (!validate()) return false\n \n if (step < totalSteps) {\n const newStep = step + 1\n setStep(newStep)\n trackStepChange(newStep)\n return true\n }\n return false\n }, [step, totalSteps, validate, trackStepChange])\n \n const prevStep = useCallback(() => {\n if (step > 1) {\n const newStep = step - 1\n setStep(newStep)\n trackStepChange(newStep)\n }\n }, [step, trackStepChange])\n \n const goToStep = useCallback((targetStep: number) => {\n if (targetStep >= 1 && targetStep <= totalSteps) {\n setStep(targetStep)\n trackStepChange(targetStep)\n }\n }, [totalSteps, trackStepChange])\n \n // Submit form\n const submit = useCallback(async () => {\n if (!form) return\n // Re-entrancy guard — blocks a concurrent double-submit in the same tick.\n if (isSubmittingRef.current) return\n if (!validateAll()) return\n\n isSubmittingRef.current = true\n setIsSubmitting(true)\n setSubmitError(null)\n\n try {\n const data = await submitForm({\n config: form,\n values: buildVisibleValues(),\n honeypotValue: '',\n formLoadedAt: formLoadedAt.current,\n })\n\n trackComplete()\n setIsComplete(true)\n onSuccess?.(data as FormSubmission)\n\n const finalRedirect = redirectUrl !== false\n ? (redirectUrl || form.redirect_url)\n : undefined\n if (finalRedirect) {\n window.location.href = finalRedirect\n }\n } catch (error) {\n console.error('[useForm] Submission error:', error)\n setSubmitError('Something went wrong sending your submission. Please try again.')\n onError?.(error as Error)\n } finally {\n isSubmittingRef.current = false\n setIsSubmitting(false)\n }\n }, [form, validateAll, buildVisibleValues, trackComplete, onSuccess, onError, redirectUrl])\n \n // Reset form\n const reset = useCallback(() => {\n setValuesState(initialValues)\n setErrors({})\n setStep(1)\n setIsComplete(false)\n setSubmitError(null)\n }, [initialValues])\n \n return {\n form,\n isLoading,\n fetchError,\n submitError,\n\n allFields,\n fields,\n visibleFields,\n \n values,\n errors,\n setFieldValue,\n setValues,\n clearErrors,\n \n step,\n totalSteps,\n isMultiStep,\n progress,\n \n nextStep,\n prevStep,\n goToStep,\n canGoNext,\n canGoPrev,\n isLastStep,\n \n validate,\n validateField,\n isFieldVisible,\n \n submit,\n isSubmitting,\n isComplete,\n reset,\n }\n}\n"]}