@sonordev/site-kit 6.1.0 → 6.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-manifest.json +2 -2
- package/dist/{AnalyticsProvider-V6G45QG7.js → AnalyticsProvider-QK6XBDEJ.js} +10 -10
- package/dist/{AnalyticsProvider-V6G45QG7.js.map → AnalyticsProvider-QK6XBDEJ.js.map} +1 -1
- package/dist/{AnalyticsProvider-PO6SSJG2.mjs → AnalyticsProvider-TIJWTISP.mjs} +6 -6
- package/dist/{AnalyticsProvider-PO6SSJG2.mjs.map → AnalyticsProvider-TIJWTISP.mjs.map} +1 -1
- package/dist/{ArticleViewTracker-FE2YWHX4.js → ArticleViewTracker-ALE672ZR.js} +6 -6
- package/dist/{ArticleViewTracker-FE2YWHX4.js.map → ArticleViewTracker-ALE672ZR.js.map} +1 -1
- package/dist/{ArticleViewTracker-CML36HJZ.mjs → ArticleViewTracker-I66RBWDK.mjs} +5 -5
- package/dist/{ArticleViewTracker-CML36HJZ.mjs.map → ArticleViewTracker-I66RBWDK.mjs.map} +1 -1
- package/dist/ChatWidget-566CQUN6.js +26 -0
- package/dist/{ChatWidget-YL34KOZM.js.map → ChatWidget-566CQUN6.js.map} +1 -1
- package/dist/ChatWidget-LNOY4TUZ.mjs +17 -0
- package/dist/{ChatWidget-GVNDKGUU.mjs.map → ChatWidget-LNOY4TUZ.mjs.map} +1 -1
- package/dist/EngageWidget-DF47YUHQ.js +21 -0
- package/dist/{EngageWidget-IQRKRYPG.js.map → EngageWidget-DF47YUHQ.js.map} +1 -1
- package/dist/EngageWidget-IGF7SC3R.mjs +12 -0
- package/dist/{EngageWidget-465O5XUV.mjs.map → EngageWidget-IGF7SC3R.mjs.map} +1 -1
- package/dist/{FileField-FWKSBFRX.mjs → FileField-AG63W2BC.mjs} +5 -5
- package/dist/{FileField-FWKSBFRX.mjs.map → FileField-AG63W2BC.mjs.map} +1 -1
- package/dist/{FileField-F3PFKMIF.js → FileField-IK6E5IOC.js} +6 -6
- package/dist/{FileField-F3PFKMIF.js.map → FileField-IK6E5IOC.js.map} +1 -1
- package/dist/{FormSpotlight-DJQ3P3EX.js → FormSpotlight-6MUDJWW5.js} +9 -9
- package/dist/{FormSpotlight-DJQ3P3EX.js.map → FormSpotlight-6MUDJWW5.js.map} +1 -1
- package/dist/{FormSpotlight-K4LP2DMP.mjs → FormSpotlight-H7V4GBXG.mjs} +3 -3
- package/dist/{FormSpotlight-K4LP2DMP.mjs.map → FormSpotlight-H7V4GBXG.mjs.map} +1 -1
- package/dist/{FormStage-YKVTHPKV.mjs → FormStage-ACETL7SD.mjs} +3 -3
- package/dist/{FormStage-YKVTHPKV.mjs.map → FormStage-ACETL7SD.mjs.map} +1 -1
- package/dist/{FormStage-QMGZ3MOT.js → FormStage-ZXZRZ2LS.js} +9 -9
- package/dist/{FormStage-QMGZ3MOT.js.map → FormStage-ZXZRZ2LS.js.map} +1 -1
- package/dist/ManagedForm-4U54NPW2.js +25 -0
- package/dist/{ManagedForm-MLPETHSQ.js.map → ManagedForm-4U54NPW2.js.map} +1 -1
- package/dist/ManagedForm-MOBWSG4D.mjs +16 -0
- package/dist/{ManagedForm-P3L34ALG.mjs.map → ManagedForm-MOBWSG4D.mjs.map} +1 -1
- package/dist/{ManagedNewsletterForm-R4LLZBRQ.js → ManagedNewsletterForm-5LBGBE2F.js} +8 -8
- package/dist/{ManagedNewsletterForm-R4LLZBRQ.js.map → ManagedNewsletterForm-5LBGBE2F.js.map} +1 -1
- package/dist/{ManagedNewsletterForm-C5YQH7MP.mjs → ManagedNewsletterForm-OV3OEMUP.mjs} +7 -7
- package/dist/{ManagedNewsletterForm-C5YQH7MP.mjs.map → ManagedNewsletterForm-OV3OEMUP.mjs.map} +1 -1
- package/dist/{SignalCore-CLELIKFI.js → SignalCore-QCVR7TZV.js} +11 -11
- package/dist/{SignalCore-CLELIKFI.js.map → SignalCore-QCVR7TZV.js.map} +1 -1
- package/dist/{SignalCore-BNYNS6P7.mjs → SignalCore-XM2MHEGR.mjs} +5 -5
- package/dist/{SignalCore-BNYNS6P7.mjs.map → SignalCore-XM2MHEGR.mjs.map} +1 -1
- package/dist/SitemapSync-74EVNOFQ.mjs +9 -0
- package/dist/{SitemapSync-SIKJCK7N.mjs.map → SitemapSync-74EVNOFQ.mjs.map} +1 -1
- package/dist/SitemapSync-BQFZAE3X.js +18 -0
- package/dist/{SitemapSync-P7XWL6VV.js.map → SitemapSync-BQFZAE3X.js.map} +1 -1
- package/dist/analytics/index.js +9 -9
- package/dist/analytics/index.mjs +4 -4
- package/dist/articles/index.js +1 -1
- package/dist/articles/index.mjs +1 -1
- package/dist/articles/server-ui.js +1 -1
- package/dist/articles/server-ui.mjs +1 -1
- package/dist/brand/extract-brand-profile.d.ts +2 -7
- package/dist/brand/extract-brand-profile.d.ts.map +1 -1
- package/dist/{chunk-SDGS2R5O.js → chunk-2SLA2LOD.js} +12 -12
- package/dist/{chunk-SDGS2R5O.js.map → chunk-2SLA2LOD.js.map} +1 -1
- package/dist/{chunk-QC6VQ2IW.mjs → chunk-3MLVI5DH.mjs} +3 -3
- package/dist/{chunk-QC6VQ2IW.mjs.map → chunk-3MLVI5DH.mjs.map} +1 -1
- package/dist/{chunk-TA3TQTDA.mjs → chunk-3RISRHOK.mjs} +8 -8
- package/dist/{chunk-TA3TQTDA.mjs.map → chunk-3RISRHOK.mjs.map} +1 -1
- package/dist/chunk-5FBALULE.mjs +6 -0
- package/dist/{chunk-ACKFL6WA.mjs.map → chunk-5FBALULE.mjs.map} +1 -1
- package/dist/{chunk-ESAPT5JT.mjs → chunk-5IQOPL7T.mjs} +3 -3
- package/dist/{chunk-ESAPT5JT.mjs.map → chunk-5IQOPL7T.mjs.map} +1 -1
- package/dist/{chunk-YS7Y2PQG.js → chunk-5OUOVPXC.js} +8 -8
- package/dist/{chunk-YS7Y2PQG.js.map → chunk-5OUOVPXC.js.map} +1 -1
- package/dist/{chunk-YP5WAFTI.mjs → chunk-6FIIA6ME.mjs} +4 -4
- package/dist/{chunk-YP5WAFTI.mjs.map → chunk-6FIIA6ME.mjs.map} +1 -1
- package/dist/{chunk-JOYMIGR2.mjs → chunk-7K6L33BX.mjs} +22 -22
- package/dist/{chunk-RVFOUPK4.js → chunk-7VRK3DWU.js} +6 -6
- package/dist/{chunk-RVFOUPK4.js.map → chunk-7VRK3DWU.js.map} +1 -1
- package/dist/{chunk-IDJY2JWU.js → chunk-AGEE4CGH.js} +5 -5
- package/dist/{chunk-IDJY2JWU.js.map → chunk-AGEE4CGH.js.map} +1 -1
- package/dist/{chunk-JS75ORH7.js → chunk-ATPQ6264.js} +24 -24
- package/dist/{chunk-LF44SJPP.js → chunk-BGBP4UN4.js} +4 -4
- package/dist/{chunk-LF44SJPP.js.map → chunk-BGBP4UN4.js.map} +1 -1
- package/dist/{chunk-RGCUND5Q.mjs → chunk-CI7T4ZRP.mjs} +4 -4
- package/dist/{chunk-RGCUND5Q.mjs.map → chunk-CI7T4ZRP.mjs.map} +1 -1
- package/dist/{chunk-KDNB6BYH.js → chunk-CTAYH725.js} +11 -11
- package/dist/{chunk-KDNB6BYH.js.map → chunk-CTAYH725.js.map} +1 -1
- package/dist/{chunk-YKNXBWPZ.mjs → chunk-D5KKVWZK.mjs} +3 -3
- package/dist/{chunk-YKNXBWPZ.mjs.map → chunk-D5KKVWZK.mjs.map} +1 -1
- package/dist/{chunk-XGELGOF6.mjs → chunk-DVZ4BMXX.mjs} +7 -7
- package/dist/{chunk-XGELGOF6.mjs.map → chunk-DVZ4BMXX.mjs.map} +1 -1
- package/dist/{chunk-FQAZBJJO.mjs → chunk-ESPOINPT.mjs} +3 -3
- package/dist/{chunk-FQAZBJJO.mjs.map → chunk-ESPOINPT.mjs.map} +1 -1
- package/dist/{chunk-XOYQKFKI.mjs → chunk-EVETX2XF.mjs} +4 -4
- package/dist/{chunk-XOYQKFKI.mjs.map → chunk-EVETX2XF.mjs.map} +1 -1
- package/dist/{chunk-ITVQV7DK.js → chunk-EVKP4SOM.js} +10 -10
- package/dist/{chunk-ITVQV7DK.js.map → chunk-EVKP4SOM.js.map} +1 -1
- package/dist/{chunk-CJX2MC62.mjs → chunk-EXVHO3CZ.mjs} +3 -3
- package/dist/{chunk-CJX2MC62.mjs.map → chunk-EXVHO3CZ.mjs.map} +1 -1
- package/dist/{chunk-3DXJHMQM.mjs → chunk-GYKFHQSZ.mjs} +3 -3
- package/dist/{chunk-3DXJHMQM.mjs.map → chunk-GYKFHQSZ.mjs.map} +1 -1
- package/dist/{chunk-H5FCJBAN.mjs → chunk-I4PUQYBI.mjs} +3 -3
- package/dist/{chunk-H5FCJBAN.mjs.map → chunk-I4PUQYBI.mjs.map} +1 -1
- package/dist/{chunk-DQXEYUTD.js → chunk-I7KIVKVW.js} +3 -3
- package/dist/{chunk-DQXEYUTD.js.map → chunk-I7KIVKVW.js.map} +1 -1
- package/dist/{chunk-L3GAEBJU.mjs → chunk-IUNFAKOS.mjs} +3 -3
- package/dist/{chunk-L3GAEBJU.mjs.map → chunk-IUNFAKOS.mjs.map} +1 -1
- package/dist/{chunk-ZQJGCQHC.js → chunk-IWHAJBYL.js} +15 -15
- package/dist/{chunk-ZQJGCQHC.js.map → chunk-IWHAJBYL.js.map} +1 -1
- package/dist/{chunk-AQUWWATH.js → chunk-IZRVSIOK.js} +4 -4
- package/dist/{chunk-AQUWWATH.js.map → chunk-IZRVSIOK.js.map} +1 -1
- package/dist/{chunk-TMNFPVK5.js → chunk-JAA42HR7.js} +7 -7
- package/dist/{chunk-TMNFPVK5.js.map → chunk-JAA42HR7.js.map} +1 -1
- package/dist/{chunk-Y53BIB7A.js → chunk-JSM4AYSZ.js} +14 -14
- package/dist/{chunk-Y53BIB7A.js.map → chunk-JSM4AYSZ.js.map} +1 -1
- package/dist/{chunk-MZK5APTV.js → chunk-KDLN2MR5.js} +18 -18
- package/dist/{chunk-MZK5APTV.js.map → chunk-KDLN2MR5.js.map} +1 -1
- package/dist/{chunk-BGOPF6J2.js → chunk-KEEZX6Q4.js} +3 -3
- package/dist/{chunk-BGOPF6J2.js.map → chunk-KEEZX6Q4.js.map} +1 -1
- package/dist/{chunk-6OSHL7H5.mjs → chunk-LXBPTKYT.mjs} +4 -4
- package/dist/{chunk-6OSHL7H5.mjs.map → chunk-LXBPTKYT.mjs.map} +1 -1
- package/dist/chunk-M2N7NY3V.js +103 -0
- package/dist/chunk-M2N7NY3V.js.map +1 -0
- package/dist/{chunk-36NE4PSS.js → chunk-MQEVQ5YB.js} +3 -3
- package/dist/{chunk-36NE4PSS.js.map → chunk-MQEVQ5YB.js.map} +1 -1
- package/dist/{chunk-DXBSBWSS.js → chunk-MTHMOXZF.js} +6 -6
- package/dist/{chunk-DXBSBWSS.js.map → chunk-MTHMOXZF.js.map} +1 -1
- package/dist/{chunk-BDSNEB3O.mjs → chunk-NRT7MOEO.mjs} +4 -4
- package/dist/{chunk-BDSNEB3O.mjs.map → chunk-NRT7MOEO.mjs.map} +1 -1
- package/dist/chunk-NYXENHD2.mjs +96 -0
- package/dist/chunk-NYXENHD2.mjs.map +1 -0
- package/dist/chunk-OI3FCJSP.js +8 -0
- package/dist/{chunk-OXA4ZSX2.js.map → chunk-OI3FCJSP.js.map} +1 -1
- package/dist/{chunk-F6BYWNHU.mjs → chunk-OUP6UL74.mjs} +3 -3
- package/dist/{chunk-F6BYWNHU.mjs.map → chunk-OUP6UL74.mjs.map} +1 -1
- package/dist/{chunk-OQWAJBYA.mjs → chunk-OWEJXMKY.mjs} +3 -3
- package/dist/{chunk-OQWAJBYA.mjs.map → chunk-OWEJXMKY.mjs.map} +1 -1
- package/dist/{chunk-XKJLJLQ4.js → chunk-OZTVJSFX.js} +107 -49
- package/dist/chunk-OZTVJSFX.js.map +1 -0
- package/dist/{chunk-QF3XTEXV.js → chunk-P4J3WG6C.js} +4 -4
- package/dist/{chunk-QF3XTEXV.js.map → chunk-P4J3WG6C.js.map} +1 -1
- package/dist/{chunk-4EJI4IOX.mjs → chunk-PTQHPWEK.mjs} +97 -39
- package/dist/chunk-PTQHPWEK.mjs.map +1 -0
- package/dist/{chunk-OF4V7CSP.mjs → chunk-QSN2QST7.mjs} +3 -3
- package/dist/{chunk-OF4V7CSP.mjs.map → chunk-QSN2QST7.mjs.map} +1 -1
- package/dist/{chunk-NMKUYGKK.mjs → chunk-RGXYE2ZI.mjs} +4 -4
- package/dist/{chunk-NMKUYGKK.mjs.map → chunk-RGXYE2ZI.mjs.map} +1 -1
- package/dist/{chunk-NNZDWY3L.mjs → chunk-RH4XEXTK.mjs} +3 -3
- package/dist/{chunk-NDVKIDMN.js → chunk-RQG7I6O4.js} +4 -4
- package/dist/{chunk-NDVKIDMN.js.map → chunk-RQG7I6O4.js.map} +1 -1
- package/dist/{chunk-VK74LC4H.js → chunk-S6CMQTVZ.js} +5 -5
- package/dist/{chunk-VK74LC4H.js.map → chunk-S6CMQTVZ.js.map} +1 -1
- package/dist/{chunk-5YA6SI4Z.mjs → chunk-TIFVAASU.mjs} +2 -2
- package/dist/{chunk-K4LLYQFZ.js → chunk-VDGCZVUF.js} +14 -14
- package/dist/{chunk-K4LLYQFZ.js.map → chunk-VDGCZVUF.js.map} +1 -1
- package/dist/{chunk-I4RU3RCS.js → chunk-XCOMBHLF.js} +8 -8
- package/dist/{chunk-I4RU3RCS.js.map → chunk-XCOMBHLF.js.map} +1 -1
- package/dist/{chunk-I7AZC5ZQ.js → chunk-XXSSUCJB.js} +2 -2
- package/dist/{chunk-ZQSJK65K.mjs → chunk-YEHC7VMW.mjs} +3 -3
- package/dist/{chunk-ZQSJK65K.mjs.map → chunk-YEHC7VMW.mjs.map} +1 -1
- package/dist/{chunk-KKTSAT7I.mjs → chunk-YK7SEUFJ.mjs} +4 -4
- package/dist/{chunk-KKTSAT7I.mjs.map → chunk-YK7SEUFJ.mjs.map} +1 -1
- package/dist/{chunk-NN2YE5WT.js → chunk-ZUQSVCMD.js} +3 -3
- package/dist/cli/index.js +211 -211
- package/dist/cli/index.mjs +151 -151
- package/dist/client/index.js +4 -4
- package/dist/client/index.mjs +3 -3
- package/dist/commerce/index.js +57 -57
- package/dist/commerce/index.mjs +5 -5
- package/dist/cta-bar/CtaBar.d.ts +21 -7
- package/dist/cta-bar/CtaBar.d.ts.map +1 -1
- package/dist/cta-bar/index.js +9 -12
- package/dist/cta-bar/index.js.map +1 -1
- package/dist/cta-bar/index.mjs +9 -12
- package/dist/cta-bar/index.mjs.map +1 -1
- package/dist/cta-bar/styles.d.ts.map +1 -1
- package/dist/engage/ChatWidget.d.ts.map +1 -1
- package/dist/engage/EchoUiActions.d.ts +5 -2
- package/dist/engage/EchoUiActions.d.ts.map +1 -1
- package/dist/engage/brand-color.d.ts +37 -0
- package/dist/engage/brand-color.d.ts.map +1 -0
- package/dist/engage/index.js +11 -10
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +8 -7
- package/dist/engage/index.mjs.map +1 -1
- package/dist/fleet/index.js +8 -8
- package/dist/fleet/index.mjs +4 -4
- package/dist/forms/index.js +16 -16
- package/dist/forms/index.mjs +9 -9
- package/dist/forms/server.js +10 -10
- package/dist/forms/server.mjs +8 -8
- package/dist/forms/static.js +7 -7
- package/dist/forms/static.mjs +6 -6
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.js +63 -63
- package/dist/index.mjs +9 -9
- package/dist/layout/client.js +8 -8
- package/dist/layout/client.mjs +7 -7
- package/dist/layout/index.js +10 -10
- package/dist/layout/index.mjs +8 -8
- package/dist/{lib-6HOOMENJ.js → lib-6GWWPDJR.js} +7 -7
- package/dist/lib-BD4KKQBI.mjs +4 -0
- package/dist/{lib-R7IQ4ZHE.mjs → lib-N5PD6JNJ.mjs} +2 -2
- package/dist/{lib-BGAWCSUH.js → lib-WFB5RLEQ.js} +8 -8
- package/dist/maps/index.js +5 -5
- package/dist/maps/index.mjs +3 -3
- package/dist/search/index.js +4 -4
- package/dist/search/index.mjs +3 -3
- package/dist/seo/client.js +5 -5
- package/dist/seo/client.mjs +4 -4
- package/dist/seo/index.js +5 -5
- package/dist/seo/index.mjs +4 -4
- package/dist/seo/register-sitemap-cli.js +12 -93
- package/dist/seo/register-sitemap-cli.mjs +2 -83
- package/dist/server/index.js +3 -3
- package/dist/server/index.mjs +2 -2
- package/dist/shared/color.d.ts +39 -0
- package/dist/shared/color.d.ts.map +1 -0
- package/dist/shared/version.d.ts +1 -1
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sync/index.js +17 -17
- package/dist/sync/index.mjs +4 -4
- package/dist/{web-vitals.attribution-7LKLZ5GR.mjs → web-vitals.attribution-CHXXWO72.mjs} +3 -3
- package/dist/web-vitals.attribution-CHXXWO72.mjs.map +1 -0
- package/dist/{web-vitals.attribution-ONVYQNRB.js → web-vitals.attribution-SQVZNHN3.js} +3 -3
- package/dist/web-vitals.attribution-SQVZNHN3.js.map +1 -0
- package/package.json +1 -1
- package/skills/site-kit/SKILL.md +3 -2
- package/dist/ChatWidget-GVNDKGUU.mjs +0 -16
- package/dist/ChatWidget-YL34KOZM.js +0 -25
- package/dist/EngageWidget-465O5XUV.mjs +0 -12
- package/dist/EngageWidget-IQRKRYPG.js +0 -21
- package/dist/ManagedForm-MLPETHSQ.js +0 -25
- package/dist/ManagedForm-P3L34ALG.mjs +0 -16
- package/dist/SitemapSync-P7XWL6VV.js +0 -18
- package/dist/SitemapSync-SIKJCK7N.mjs +0 -9
- package/dist/chunk-4EJI4IOX.mjs.map +0 -1
- package/dist/chunk-ACKFL6WA.mjs +0 -6
- package/dist/chunk-OXA4ZSX2.js +0 -8
- package/dist/chunk-XKJLJLQ4.js.map +0 -1
- package/dist/lib-RSDMEKDQ.mjs +0 -4
- package/dist/web-vitals.attribution-7LKLZ5GR.mjs.map +0 -1
- package/dist/web-vitals.attribution-ONVYQNRB.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/engage/brand-color.ts","../src/engage/EchoUiActions.tsx","../src/engage/ChatWidget.tsx"],"names":["alpha","messages","jsx","jsxs"],"mappings":"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","file":"chunk-PTQHPWEK.mjs","sourcesContent":["/**\n * @sonordev/site-kit/engage — Echo's brand colours\n *\n * Single source of truth for how Echo turns the site's brand colour into\n * foreground colours. ChatWidget and EchoUiActions route every such decision\n * through here; don't re-derive one inline.\n *\n * - Brand as a FILL (launcher, avatar tile, the visitor's bubbles, the send\n * and submit buttons) stays the raw brand, and text on it is\n * `onBrandColor(brand)`.\n * - Brand as TEXT on the glass panel (quick-action chips, the phone link,\n * markdown link buttons, suggestion chips, the handoff button, the\n * sent-message check) is `brandTextColor(brand, panelTint)`: the raw brand\n * when it already reads, otherwise the brand pulled toward black (light\n * panel) or white (dark panel) just far enough to clear WCAG AA.\n *\n * Why: a light brand (Gunning Homes' #d4af37 gold, any yellow) drawn as text\n * on the ~86% white panel sat at about 2:1.\n */\n\nimport { contrastRatio, DARK_LUMINANCE, parseColor, relativeLuminance, type Rgb } from '../shared/color'\n\n/** WCAG AA for normal-size text. Echo's brand text is 13-14px. */\nconst TEXT_CONTRAST = 4.5\n\n/**\n * The most brand-tinted surface brand text rests on: the markdown link\n * buttons, 8.2% brand over the panel. Clearing AA against it clears the\n * lighter chips and the bare panel too.\n */\nconst RESTING_TINT = 0.082\n\n/**\n * A brand this can't read (oklch(), a named colour, ...) gets this share of\n * itself mixed toward the pole in CSS. 40% clears AA against white (5.7:1)\n * and against a near-black panel (6.5:1) whatever the brand is.\n */\nconst UNREADABLE_BRAND_SHARE = 40\n\nconst WHITE: Rgb = { r: 255, g: 255, b: 255 }\nconst BLACK: Rgb = { r: 0, g: 0, b: 0 }\n\n/** `share` of `a`, the rest `b`: what `color-mix(in srgb, a share, b)` paints. */\nfunction mix(a: Rgb, b: Rgb, share: number): Rgb {\n return {\n r: a.r * share + b.r * (1 - share),\n g: a.g * share + b.g * (1 - share),\n b: a.b * share + b.b * (1 - share),\n }\n}\n\n/** What the browser paints: whole 8-bit channels. */\nfunction round({ r, g, b }: Rgb): Rgb {\n const c = (v: number) => Math.round(Math.min(255, Math.max(0, v)))\n return { r: c(r), g: c(g), b: c(b) }\n}\n\nfunction toHex(rgb: Rgb): string {\n const { r, g, b } = round(rgb)\n return `#${[r, g, b].map((c) => c.toString(16).padStart(2, '0')).join('')}`\n}\n\n/** Light enough that text and icons on a fill of it should be dark. Unreadable colours count as dark. */\nexport function isLightColor(color: string): boolean {\n const rgb = parseColor(color)\n if (!rgb) return false\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000 > 160\n}\n\n/** Text or icon colour on a fill of the brand. */\nexport function onBrandColor(brand: string): string {\n return isLightColor(brand) ? '#1a1a1a' : 'white'\n}\n\n/**\n * An \"r, g, b\" triplet for `rgba(var(--sk-primary-rgb, <triplet>), a)`, or\n * the fallback when the colour can't be read.\n */\nexport function rgbTriplet(color: string, fallback = '37, 99, 235'): string {\n const rgb = parseColor(color)\n if (!rgb) return fallback\n const { r, g, b } = round(rgb)\n return `${r}, ${g}, ${b}`\n}\n\n/**\n * The brand as text on Echo's glass panel.\n *\n * `panelTint` is the panel's resolved tint (the glass recipe's\n * `--sk-glass-t`: `--sk-glass-tint`, then `--sk-bg`, then white). Unset or\n * unreadable, the panel is taken to be white, the default.\n */\nexport function brandTextColor(brand: string, panelTint?: string | null): string {\n const tint = (panelTint && parseColor(panelTint)) || WHITE\n // Pull toward whichever pole the panel contrasts with: black on light\n // glass, white on dark glass (TPS microsites run a navy panel).\n const pole = relativeLuminance(tint) < DARK_LUMINANCE ? WHITE : BLACK\n\n const rgb = parseColor(brand)\n if (!rgb) return `color-mix(in srgb, ${brand} ${UNREADABLE_BRAND_SHARE}%, ${toHex(pole)})`\n\n const surface = relativeLuminance(mix(rgb, tint, RESTING_TINT))\n const reads = (c: Rgb) => contrastRatio(relativeLuminance(c), surface) >= TEXT_CONTRAST\n if (reads(rgb)) return brand\n\n // The largest share of the brand that still reads, judged on the rounded\n // colour actually painted. Twelve halvings is finer than one 8-bit step.\n let lo = 0\n let hi = 1\n for (let i = 0; i < 12; i++) {\n const share = (lo + hi) / 2\n if (reads(round(mix(rgb, pole, share)))) lo = share\n else hi = share\n }\n return toHex(mix(rgb, pole, lo))\n}\n","/**\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 and\n * the brand foreground colours from brand-color.ts.\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'\nimport { onBrandColor } from './brand-color'\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 // 16px, not smaller: iOS Safari zooms the whole page into any focused\n // field under 16px, which throws the visitor out of the chat window.\n fontSize: 16,\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, #dc2626)' }}> *</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, #dc2626)' } : {}) },\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, #dc2626)' }}>{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, #dc2626)' }}>\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: onBrandColor(primaryColor),\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 brandText: string\n onSuggest: (action: string | undefined, message: string) => void\n}\n\nfunction SuggestActionChip({ action, message, primaryColor, primaryRgb, brandText, 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: brandText,\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 /** The brand as text on the panel: ChatWidget's `brandTextColor(primaryColor, panelTint)`. */\n brandText: 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, brandText, 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 brandText={brandText}\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, useLayoutEffect, useCallback } from 'react'\nimport ReactMarkdown from 'react-markdown'\nimport type { ChatConfig, UiAction } from './types'\nimport { EchoUiActions, isNavigable } from './EchoUiActions'\nimport { chatLauncherStyles } from './launcher-placement'\nimport { brandTextColor, isLightColor, onBrandColor, rgbTriplet } from './brand-color'\nimport { GlassStyles } from '../shared/glass'\n// Canonical transport — refreshes a stale minted token and retries once on 401.\n// The credential is passed via options.apiKey (NOT an x-api-key/Authorization\n// header) so sonorFetch injects the freshest token; a hand-set header would pin\n// the stale build-time seed and 401.\nimport { sonorFetch } from '../shared/sonorFetch'\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/** Assistant/agent bubbles and the composer: near-opaque surface on the glass. */\nconst BUBBLE_BG = 'color-mix(in srgb, var(--sk-bg, #ffffff) 94%, transparent)'\n/** Hairline that reads on light and dark glass alike. */\nconst HAIRLINE = '1px solid color-mix(in srgb, var(--sk-text-primary, #111827) 9%, transparent)'\n\n/**\n * Echo's page-level rules, hoisted into <head> once and present whether or\n * not the window is open. The launcher and window are fixed screen chrome:\n * printed, they'd repeat on every sheet (gunning-homes found both at the\n * foot of pages one and two and hid them by hand). Reduced motion skips\n * the window's grow-in.\n */\nconst ECHO_STYLE_HREF = 'sk-echo'\nconst ECHO_CSS = `\n@media print {\n [data-sk-echo-launcher], [data-sk-echo-panel] { display: none !important; }\n}\n@media (prefers-reduced-motion: reduce) {\n [data-sk-echo-panel] { animation: none !important; }\n}\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 * 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, 37, 99, 235), 0.125)\"\n */\nfunction hexAlpha(rgbVar: string, alpha: number, fallbackRgb = '37, 99, 235'): 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] No site credential found. Render SiteKitLayout in app/layout.tsx and set SONOR_API_KEY on the server.')\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 // Launcher and popup placement come from one clearance, so the popup always\n // opens above the launcher wherever the site has moved it, and from one\n // layer, so it always stacks beneath the launcher.\n const placement = chatLauncherStyles({\n position: position === 'bottom-left' ? 'bottom-left' : 'bottom-right',\n offsetBottom: config?.offsetBottom,\n zIndex: config?.zIndex,\n })\n const primaryFallback = staticPrimaryColor(widgetConfig?.brand_primary || config?.buttonColor, '#2563eb')\n const [primaryFromCssVar, setPrimaryFromCssVar] = useState<string | null>(null)\n const primaryColor = primaryFromCssVar ?? primaryFallback\n const primaryRgb = rgbTriplet(primaryColor)\n\n useEffect(() => {\n const cssValue = getComputedStyle(document.documentElement).getPropertyValue('--sk-primary').trim()\n setPrimaryFromCssVar(cssValue || null)\n }, [])\n\n // Brand colour as foreground (brand-color.ts): text on a brand fill, and the\n // brand as text on the panel, which has to know how light the panel is.\n // Read the tint off the open panel itself (the glass recipe resolves it into\n // --sk-glass-t), before paint, so a dark panel never flashes the light-panel\n // colour.\n const onBrand = onBrandColor(primaryColor)\n const panelRef = useRef<HTMLDivElement>(null)\n const [panelTint, setPanelTint] = useState<string | null>(null)\n useLayoutEffect(() => {\n if (!isOpen || !panelRef.current) return\n setPanelTint(getComputedStyle(panelRef.current).getPropertyValue('--sk-glass-t').trim() || null)\n }, [isOpen])\n const brandText = brandTextColor(primaryColor, panelTint)\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 sonorFetch(`${baseUrl}/api/public/seo/project-info`, {}, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/config?projectId=${projectId}`, {}, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/availability?projectId=${projectId}`, {}, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/session`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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 }, { apiKey, retries: 0 })\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 sonorFetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/messages?sessionId=${currentSessionId}`, {}, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/upload`, {\n method: 'POST',\n body: form,\n }, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/handoff`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ sessionId }),\n }, { apiKey, retries: 0 })\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 sonorFetch(`${baseUrl}/engage/widget/offline-form`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\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 }, { apiKey, retries: 0 })\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 // Liquid Glass (6.1.0): the launcher is brand-tinted glass from the shared\n // recipe (shared/glass.tsx). The brand colour reaches it as a custom\n // property, not a background, so the recipe's reduced-transparency and\n // no-backdrop-filter fallbacks still apply. `bottom` transitions so the\n // launcher glides when a CTA bar lifts it.\n const ChatButton = (\n <button\n type=\"button\"\n data-sk-echo-launcher\n className=\"sk-glass sk-glass--brand\"\n onClick={handleToggle}\n aria-label={isOpen ? 'Close chat' : 'Open chat'}\n style={{\n position: 'fixed',\n ...placement.launcher,\n width: '60px',\n height: '60px',\n borderRadius: '50%',\n ['--sk-glass-brand' as string]: primaryColor,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n cursor: 'pointer',\n transition: 'transform 0.2s, bottom 0.35s cubic-bezier(0.2, 0.8, 0.2, 1)',\n zIndex: placement.zIndex.launcher,\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.transform = 'scale(1.05)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.transform = 'scale(1)'\n }}\n >\n {isOpen ? (\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke={onBrand} 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={onBrand} 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 // Liquid Glass (6.1.0): the header is part of the glass sheet, washed with\n // the brand at the top instead of painted solid, and the brand lives on the\n // avatar tile, the launcher, the visitor's bubbles and the send button.\n const Header = (\n <div\n style={{\n padding: '16px 18px 14px',\n background: `linear-gradient(180deg, color-mix(in srgb, ${primaryColor} 16%, transparent), transparent)`,\n borderBottom: '1px solid color-mix(in srgb, var(--sk-text-primary, #111827) 8%, transparent)',\n color: 'var(--sk-text-primary, #111827)',\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: primaryColor,\n color: onBrand,\n boxShadow: 'inset 0 1px 0 color-mix(in srgb, #ffffff 30%, transparent), 0 2px 6px rgba(0, 0, 0, 0.12)',\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, color: 'var(--sk-text-secondary, #6b7280)', 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, color: 'var(--sk-text-secondary, #6b7280)', 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: brandText,\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: onBrand,\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: brandText, 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={brandText} 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: 16, 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: 16, 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: onBrand,\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={onBrand} 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: 'transparent' }}\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' ? '18px 18px 6px 18px' : message.role === 'system' ? '10px' : '18px 18px 18px 6px',\n // Bubbles on glass stay near-opaque: the glass behind them\n // is for depth, never for the text to read against.\n backgroundColor: message.role === 'user' ? primaryColor : message.role === 'system' ? 'color-mix(in srgb, var(--sk-text-primary, #111827) 7%, transparent)' : BUBBLE_BG,\n color: message.role === 'user' ? onBrand : message.role === 'system' ? 'var(--sk-text-secondary, #6b7280)' : 'var(--sk-text-primary, #111827)',\n border: message.role === 'user' || message.role === 'system' ? 'none' : HAIRLINE,\n boxShadow: message.role === 'system' ? 'none' : message.role === 'user' ? 'inset 0 1px 0 color-mix(in srgb, #ffffff 22%, transparent), 0 1px 2px rgba(0,0,0,0.10)' : '0 1px 2px rgba(0,0,0,0.06)',\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 }}\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: brandText,\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: brandText,\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 brandText={brandText}\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, #dc2626)', 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: brandText,\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: '18px 18px 18px 6px',\n backgroundColor: BUBBLE_BG,\n border: HAIRLINE,\n boxShadow: '0 1px 2px rgba(0,0,0,0.06)',\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: '10px 12px 12px', backgroundColor: 'transparent' }}>\n <div style={{ display: 'flex', gap: 8, alignItems: 'center' }}>\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 minWidth: 0,\n padding: '10px 16px',\n borderRadius: 24,\n border: HAIRLINE,\n backgroundColor: BUBBLE_BG,\n color: 'var(--sk-text-primary, #111827)',\n // 16px: iOS Safari zooms the page into any focused field under 16px.\n fontSize: 16,\n outline: 'none',\n boxShadow: 'inset 0 1px 2px rgba(0,0,0,0.04)',\n transition: 'border-color 0.2s',\n }}\n onFocus={(e) => (e.currentTarget.style.borderColor = primaryColor)}\n onBlur={(e) => (e.currentTarget.style.borderColor = '')}\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 ? onBrand : '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 // Liquid Glass (6.1.0): the window is a glass panel (shared/glass.tsx,\n // `--panel` density for reading) that grows out of the launcher's corner.\n const ChatPopup = isOpen && (\n <div\n ref={panelRef}\n data-sk-echo-panel\n className=\"sk-glass sk-glass--panel\"\n style={{\n position: 'fixed',\n ...placement.popup,\n width: '380px',\n maxWidth: 'calc(100vw - 40px)',\n height: '520px',\n color: 'var(--sk-text-primary, #111827)',\n borderRadius: '24px',\n display: 'flex',\n flexDirection: 'column',\n overflow: 'hidden',\n zIndex: placement.zIndex.popup,\n transformOrigin: position === 'bottom-left' ? 'bottom left' : 'bottom right',\n animation: 'chatGlassIn 0.34s cubic-bezier(0.2, 0.9, 0.3, 1.05)',\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: '0 0 8px', textAlign: 'center', fontSize: 11, color: 'var(--sk-text-tertiary, #9ca3af)', backgroundColor: 'transparent' }}>\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 chatGlassIn {\n from { opacity: 0; transform: translateY(12px) scale(0.94); }\n to { opacity: 1; transform: translateY(0) scale(1); }\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 <GlassStyles />\n <style href={ECHO_STYLE_HREF} precedence=\"default\">\n {ECHO_CSS}\n </style>\n {ChatPopup}\n {ChatButton}\n </>\n )\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getApiConfig } from './chunk-
|
|
1
|
+
import { getApiConfig } from './chunk-OWEJXMKY.mjs';
|
|
2
2
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
3
|
|
|
4
4
|
function HoneypotField({ name, value, onChange }) {
|
|
@@ -56,5 +56,5 @@ function NativeFallbackFields({ config, returnTo }) {
|
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
export { HoneypotField, NativeFallbackFields, nativeFormProps };
|
|
59
|
-
//# sourceMappingURL=chunk-
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
59
|
+
//# sourceMappingURL=chunk-QSN2QST7.mjs.map
|
|
60
|
+
//# sourceMappingURL=chunk-QSN2QST7.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/forms/HoneypotField.tsx","../src/forms/native-fallback.tsx"],"names":["jsx"],"mappings":";;;AAqCO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,UAAS,EAAuB;AAC3E,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAa,UAAA;AACxC,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU,EAAA;AAAA,MACV,YAAA,EAAa,cAAA;AAAA,MACb,aAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAK,IAAA;AAAA,MACL,kBAAA,EAAiB,EAAA;AAAA,MAGjB,gBAAA,EAAe,EAAA;AAAA,MACf,eAAA,EAAc,MAAA;AAAA,MACd,gBAAA,EAAe,OAAA;AAAA,MACf,eAAA,EAAc,EAAA;AAAA,MACd,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACjB;AAAA,MACC,GAAI,WAAA,GACD;AAAA,QACE,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA,EAAU,CAAC,CAAA,KAA2C;AACpD,UAAA,QAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AACxB,UAAA,IAAI,CAAA,CAAE,OAAO,KAAA,EAAO;AAElB,YAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AAAA,UAC3C;AAAA,QACF;AAAA,OACF,GACA,EAAE,YAAA,EAAc,EAAA;AAAG;AAAA,GACzB;AAEJ;ACjDA,SAAS,eAAe,MAAA,EAAuD;AAC7E,EAAA,OAAO,CAAC,CAAC,MAAA,EAAQ,YAAA,IAAgB,CAAC,MAAA,CAAO,aAAA;AAC3C;AAGO,SAAS,gBACd,MAAA,EACsC;AACtC,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,SAAU,EAAC;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAChC,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,+BAAA,CAAA,EAAmC,QAAQ,MAAA,EAAO;AAC9E;AAaO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA8B;AACpF,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,aAAY,KAAA,EAAO,MAAA,CAAQ,YAAA,EAAc,QAAA,EAAQ,IAAA,EAAC,CAAA;AAAA,IAC3E,QAAA,mBAAWA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,YAAA,EAAa,KAAA,EAAO,QAAA,EAAU,QAAA,EAAQ,IAAA,EAAC,CAAA,GAAK;AAAA,GAAA,EACpF,CAAA;AAEJ","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/forms/HoneypotField.tsx","../src/forms/native-fallback.tsx"],"names":["jsx"],"mappings":";;;AAqCO,SAAS,aAAA,CAAc,EAAE,IAAA,EAAM,KAAA,EAAO,UAAS,EAAuB;AAC3E,EAAA,MAAM,WAAA,GAAc,OAAO,QAAA,KAAa,UAAA;AACxC,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,MAAA;AAAA,MACL,IAAA;AAAA,MACA,QAAA,EAAU,EAAA;AAAA,MACV,YAAA,EAAa,cAAA;AAAA,MACb,aAAA,EAAY,MAAA;AAAA,MACZ,KAAA,EAAK,IAAA;AAAA,MACL,kBAAA,EAAiB,EAAA;AAAA,MAGjB,gBAAA,EAAe,EAAA;AAAA,MACf,eAAA,EAAc,MAAA;AAAA,MACd,gBAAA,EAAe,OAAA;AAAA,MACf,eAAA,EAAc,EAAA;AAAA,MACd,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,UAAA;AAAA,QACV,IAAA,EAAM,KAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,QAAA,EAAU,QAAA;AAAA,QACV,OAAA,EAAS,CAAA;AAAA,QACT,UAAA,EAAY,QAAA;AAAA,QACZ,aAAA,EAAe;AAAA,OACjB;AAAA,MACC,GAAI,WAAA,GACD;AAAA,QACE,OAAO,KAAA,IAAS,EAAA;AAAA,QAChB,QAAA,EAAU,CAAC,CAAA,KAA2C;AACpD,UAAA,QAAA,CAAU,CAAA,CAAE,OAAO,KAAK,CAAA;AACxB,UAAA,IAAI,CAAA,CAAE,OAAO,KAAA,EAAO;AAElB,YAAA,OAAA,CAAQ,KAAK,4BAA4B,CAAA;AAAA,UAC3C;AAAA,QACF;AAAA,OACF,GACA,EAAE,YAAA,EAAc,EAAA;AAAG;AAAA,GACzB;AAEJ;ACjDA,SAAS,eAAe,MAAA,EAAuD;AAC7E,EAAA,OAAO,CAAC,CAAC,MAAA,EAAQ,YAAA,IAAgB,CAAC,MAAA,CAAO,aAAA;AAC3C;AAGO,SAAS,gBACd,MAAA,EACsC;AACtC,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,SAAU,EAAC;AACrC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,YAAA,EAAa;AAChC,EAAA,OAAO,EAAE,MAAA,EAAQ,CAAA,EAAG,MAAM,CAAA,+BAAA,CAAA,EAAmC,QAAQ,MAAA,EAAO;AAC9E;AAaO,SAAS,oBAAA,CAAqB,EAAE,MAAA,EAAQ,QAAA,EAAS,EAA8B;AACpF,EAAA,IAAI,CAAC,cAAA,CAAe,MAAM,CAAA,EAAG,OAAO,IAAA;AACpC,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,aAAY,KAAA,EAAO,MAAA,CAAQ,YAAA,EAAc,QAAA,EAAQ,IAAA,EAAC,CAAA;AAAA,IAC3E,QAAA,mBAAWA,GAAAA,CAAC,OAAA,EAAA,EAAM,IAAA,EAAK,QAAA,EAAS,IAAA,EAAK,YAAA,EAAa,KAAA,EAAO,QAAA,EAAU,QAAA,EAAQ,IAAA,EAAC,CAAA,GAAK;AAAA,GAAA,EACpF,CAAA;AAEJ","file":"chunk-QSN2QST7.mjs","sourcesContent":["/**\n * Single source of truth for the honeypot input — rendered by BOTH form\n * experiences (classic and stage) inside their <form>. The customRender path\n * deliberately gets none (documented limitation: custom renders lose the\n * honeypot, which is why alternate experiences must be render branches).\n *\n * Invariants (do not weaken any of these):\n * - `inert` blocks focus/interaction at the browser level, surviving hostile\n * site CSS that could defeat the inline styles.\n * - data-sk-honeypot gives site CSS a stable opt-OUT hook.\n * - Controlled input: bots filling via JS still fire React onChange, so the\n * value reaches submitForm's data payload.\n * - Name comes from config (`honeypot_field || DEFAULT_HONEYPOT_FIELD` from\n * the shared contract) — resolved by the caller, never forked here.\n * - The trap must be invisible to AUTOFILL as well as to people. A browser or\n * password manager filling a hidden input flags a real visitor as a bot, and\n * because the value is stripped server-side the mistake is undiagnosable\n * after the fact. `autocomplete=\"off\"` does not achieve this — it is the one\n * value Chrome deliberately ignores for contact/address autofill — so the\n * trap declares `new-password` (never offered saved contact data) plus the\n * documented per-manager opt-outs.\n */\n\nimport React from 'react'\n\nexport interface HoneypotFieldProps {\n name: string\n value?: string\n /**\n * Omit for STATIC mode — an uncontrolled trap a Server Component can render.\n * The trap's whole job is server-side (the value is read off the submission\n * and stripped), so it needs no client state to work; the controlled form is\n * only so the hydrated JSON path can read it back out of React state.\n */\n onChange?: (value: string) => void\n}\n\nexport function HoneypotField({ name, value, onChange }: HoneypotFieldProps) {\n const interactive = typeof onChange === 'function'\n return (\n <input\n type=\"text\"\n name={name}\n tabIndex={-1}\n autoComplete=\"new-password\"\n aria-hidden=\"true\"\n inert\n data-sk-honeypot=\"\"\n // Password-manager opt-outs: 1Password, LastPass, Dashlane, Bitwarden.\n // Each ignores its own attribute; none respects autocomplete alone.\n data-1p-ignore=\"\"\n data-lpignore=\"true\"\n data-form-type=\"other\"\n data-bwignore=\"\"\n style={{\n position: 'absolute',\n left: -9999,\n width: 1,\n height: 1,\n overflow: 'hidden',\n opacity: 0,\n visibility: 'hidden',\n pointerEvents: 'none',\n }}\n {...(interactive\n ? {\n value: value ?? '',\n onChange: (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange!(e.target.value)\n if (e.target.value) {\n // Bot detected\n console.warn('[Forms] Honeypot triggered')\n }\n },\n }\n : { defaultValue: '' })}\n />\n )\n}\n","'use client'\n\n/**\n * No-JS native submission fallback — the floor under every managed form.\n *\n * The classic form is the SSR/no-JS surface (experiences are post-hydration\n * chunks), so it alone carries a real `action`/`method` pointing at\n * sonor-api's POST /api/public/forms/submit-native. With JS running, the\n * form's onSubmit preventDefault()s and the JSON path wins; without JS the\n * browser performs an ordinary form-encoded POST and the lead still lands.\n *\n * Auth rides in the hidden `_sk_token` field: a signed, single-purpose\n * credential minted by the api-key-authenticated forms/config endpoint\n * (`native_token` in the response). No token in the config (older API, or no\n * signing secret) means no fallback — the form keeps its historical behavior\n * rather than pointing at an endpoint that will reject it.\n *\n * Multi-step forms are excluded: step navigation is JS, and a native POST of\n * step-1 fields alone fails whole-form validation server-side. Single-step\n * forms are the overwhelming lead-capture case.\n *\n * Single source of truth for the gating — the form attrs and the hidden\n * fields must always agree, so both read the same predicate.\n */\n\nimport React from 'react'\nimport type { ManagedFormConfig } from './types'\nimport { getApiConfig } from './submitForm'\n\nfunction nativeEligible(config: ManagedFormConfig | null | undefined): boolean {\n return !!config?.native_token && !config.is_multi_step\n}\n\n/** `action`/`method` for the classic <form> — empty when ineligible. */\nexport function nativeFormProps(\n config: ManagedFormConfig | null | undefined,\n): { action?: string; method?: 'post' } {\n if (!nativeEligible(config)) return {}\n const { apiUrl } = getApiConfig()\n return { action: `${apiUrl}/api/public/forms/submit-native`, method: 'post' }\n}\n\nexport interface NativeFallbackFieldsProps {\n config: ManagedFormConfig | null | undefined\n /**\n * Absolute URL the native 303 should land on (usually the page hosting the\n * form). Optional — without it the server falls back to the Referer origin,\n * which loses the path but still returns the visitor to the right site.\n */\n returnTo?: string\n}\n\n/** Hidden control fields the native endpoint reads (`_sk_*` namespace). */\nexport function NativeFallbackFields({ config, returnTo }: NativeFallbackFieldsProps) {\n if (!nativeEligible(config)) return null\n return (\n <>\n <input type=\"hidden\" name=\"_sk_token\" value={config!.native_token} readOnly />\n {returnTo ? <input type=\"hidden\" name=\"_sk_return\" value={returnTo} readOnly /> : null}\n </>\n )\n}\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { DEFAULT_ENGAGE_Z_INDEX } from './chunk-4U5NCKQY.mjs';
|
|
3
3
|
import { getOrCreateVisitorId } from './chunk-ZZQAGCSI.mjs';
|
|
4
4
|
import { resolveAnalyticsTarget } from './chunk-A6UYV475.mjs';
|
|
5
|
-
import { sonorFetch } from './chunk-
|
|
5
|
+
import { sonorFetch } from './chunk-CI7T4ZRP.mjs';
|
|
6
6
|
import React, { useState, useEffect, useCallback, useRef, createElement } from 'react';
|
|
7
7
|
import ReactDOM from 'react-dom';
|
|
8
8
|
import dynamic from 'next/dynamic';
|
|
@@ -269,7 +269,7 @@ function DesignRenderer({
|
|
|
269
269
|
)) });
|
|
270
270
|
}
|
|
271
271
|
var LazyChatWidget = dynamic(
|
|
272
|
-
() => import('./ChatWidget-
|
|
272
|
+
() => import('./ChatWidget-LNOY4TUZ.mjs').then((m) => ({ default: m.ChatWidget })),
|
|
273
273
|
{ ssr: false }
|
|
274
274
|
);
|
|
275
275
|
function EngageWidget(props) {
|
|
@@ -718,5 +718,5 @@ function getDeviceType() {
|
|
|
718
718
|
}
|
|
719
719
|
|
|
720
720
|
export { DesignRenderer, EngageWidget };
|
|
721
|
-
//# sourceMappingURL=chunk-
|
|
722
|
-
//# sourceMappingURL=chunk-
|
|
721
|
+
//# sourceMappingURL=chunk-RGXYE2ZI.mjs.map
|
|
722
|
+
//# sourceMappingURL=chunk-RGXYE2ZI.mjs.map
|