@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.
Files changed (237) hide show
  1. package/agent-manifest.json +2 -2
  2. package/dist/{AnalyticsProvider-V6G45QG7.js → AnalyticsProvider-QK6XBDEJ.js} +10 -10
  3. package/dist/{AnalyticsProvider-V6G45QG7.js.map → AnalyticsProvider-QK6XBDEJ.js.map} +1 -1
  4. package/dist/{AnalyticsProvider-PO6SSJG2.mjs → AnalyticsProvider-TIJWTISP.mjs} +6 -6
  5. package/dist/{AnalyticsProvider-PO6SSJG2.mjs.map → AnalyticsProvider-TIJWTISP.mjs.map} +1 -1
  6. package/dist/{ArticleViewTracker-FE2YWHX4.js → ArticleViewTracker-ALE672ZR.js} +6 -6
  7. package/dist/{ArticleViewTracker-FE2YWHX4.js.map → ArticleViewTracker-ALE672ZR.js.map} +1 -1
  8. package/dist/{ArticleViewTracker-CML36HJZ.mjs → ArticleViewTracker-I66RBWDK.mjs} +5 -5
  9. package/dist/{ArticleViewTracker-CML36HJZ.mjs.map → ArticleViewTracker-I66RBWDK.mjs.map} +1 -1
  10. package/dist/ChatWidget-566CQUN6.js +26 -0
  11. package/dist/{ChatWidget-YL34KOZM.js.map → ChatWidget-566CQUN6.js.map} +1 -1
  12. package/dist/ChatWidget-LNOY4TUZ.mjs +17 -0
  13. package/dist/{ChatWidget-GVNDKGUU.mjs.map → ChatWidget-LNOY4TUZ.mjs.map} +1 -1
  14. package/dist/EngageWidget-DF47YUHQ.js +21 -0
  15. package/dist/{EngageWidget-IQRKRYPG.js.map → EngageWidget-DF47YUHQ.js.map} +1 -1
  16. package/dist/EngageWidget-IGF7SC3R.mjs +12 -0
  17. package/dist/{EngageWidget-465O5XUV.mjs.map → EngageWidget-IGF7SC3R.mjs.map} +1 -1
  18. package/dist/{FileField-FWKSBFRX.mjs → FileField-AG63W2BC.mjs} +5 -5
  19. package/dist/{FileField-FWKSBFRX.mjs.map → FileField-AG63W2BC.mjs.map} +1 -1
  20. package/dist/{FileField-F3PFKMIF.js → FileField-IK6E5IOC.js} +6 -6
  21. package/dist/{FileField-F3PFKMIF.js.map → FileField-IK6E5IOC.js.map} +1 -1
  22. package/dist/{FormSpotlight-DJQ3P3EX.js → FormSpotlight-6MUDJWW5.js} +9 -9
  23. package/dist/{FormSpotlight-DJQ3P3EX.js.map → FormSpotlight-6MUDJWW5.js.map} +1 -1
  24. package/dist/{FormSpotlight-K4LP2DMP.mjs → FormSpotlight-H7V4GBXG.mjs} +3 -3
  25. package/dist/{FormSpotlight-K4LP2DMP.mjs.map → FormSpotlight-H7V4GBXG.mjs.map} +1 -1
  26. package/dist/{FormStage-YKVTHPKV.mjs → FormStage-ACETL7SD.mjs} +3 -3
  27. package/dist/{FormStage-YKVTHPKV.mjs.map → FormStage-ACETL7SD.mjs.map} +1 -1
  28. package/dist/{FormStage-QMGZ3MOT.js → FormStage-ZXZRZ2LS.js} +9 -9
  29. package/dist/{FormStage-QMGZ3MOT.js.map → FormStage-ZXZRZ2LS.js.map} +1 -1
  30. package/dist/ManagedForm-4U54NPW2.js +25 -0
  31. package/dist/{ManagedForm-MLPETHSQ.js.map → ManagedForm-4U54NPW2.js.map} +1 -1
  32. package/dist/ManagedForm-MOBWSG4D.mjs +16 -0
  33. package/dist/{ManagedForm-P3L34ALG.mjs.map → ManagedForm-MOBWSG4D.mjs.map} +1 -1
  34. package/dist/{ManagedNewsletterForm-R4LLZBRQ.js → ManagedNewsletterForm-5LBGBE2F.js} +8 -8
  35. package/dist/{ManagedNewsletterForm-R4LLZBRQ.js.map → ManagedNewsletterForm-5LBGBE2F.js.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-C5YQH7MP.mjs → ManagedNewsletterForm-OV3OEMUP.mjs} +7 -7
  37. package/dist/{ManagedNewsletterForm-C5YQH7MP.mjs.map → ManagedNewsletterForm-OV3OEMUP.mjs.map} +1 -1
  38. package/dist/{SignalCore-CLELIKFI.js → SignalCore-QCVR7TZV.js} +11 -11
  39. package/dist/{SignalCore-CLELIKFI.js.map → SignalCore-QCVR7TZV.js.map} +1 -1
  40. package/dist/{SignalCore-BNYNS6P7.mjs → SignalCore-XM2MHEGR.mjs} +5 -5
  41. package/dist/{SignalCore-BNYNS6P7.mjs.map → SignalCore-XM2MHEGR.mjs.map} +1 -1
  42. package/dist/SitemapSync-74EVNOFQ.mjs +9 -0
  43. package/dist/{SitemapSync-SIKJCK7N.mjs.map → SitemapSync-74EVNOFQ.mjs.map} +1 -1
  44. package/dist/SitemapSync-BQFZAE3X.js +18 -0
  45. package/dist/{SitemapSync-P7XWL6VV.js.map → SitemapSync-BQFZAE3X.js.map} +1 -1
  46. package/dist/analytics/index.js +9 -9
  47. package/dist/analytics/index.mjs +4 -4
  48. package/dist/articles/index.js +1 -1
  49. package/dist/articles/index.mjs +1 -1
  50. package/dist/articles/server-ui.js +1 -1
  51. package/dist/articles/server-ui.mjs +1 -1
  52. package/dist/brand/extract-brand-profile.d.ts +2 -7
  53. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  54. package/dist/{chunk-SDGS2R5O.js → chunk-2SLA2LOD.js} +12 -12
  55. package/dist/{chunk-SDGS2R5O.js.map → chunk-2SLA2LOD.js.map} +1 -1
  56. package/dist/{chunk-QC6VQ2IW.mjs → chunk-3MLVI5DH.mjs} +3 -3
  57. package/dist/{chunk-QC6VQ2IW.mjs.map → chunk-3MLVI5DH.mjs.map} +1 -1
  58. package/dist/{chunk-TA3TQTDA.mjs → chunk-3RISRHOK.mjs} +8 -8
  59. package/dist/{chunk-TA3TQTDA.mjs.map → chunk-3RISRHOK.mjs.map} +1 -1
  60. package/dist/chunk-5FBALULE.mjs +6 -0
  61. package/dist/{chunk-ACKFL6WA.mjs.map → chunk-5FBALULE.mjs.map} +1 -1
  62. package/dist/{chunk-ESAPT5JT.mjs → chunk-5IQOPL7T.mjs} +3 -3
  63. package/dist/{chunk-ESAPT5JT.mjs.map → chunk-5IQOPL7T.mjs.map} +1 -1
  64. package/dist/{chunk-YS7Y2PQG.js → chunk-5OUOVPXC.js} +8 -8
  65. package/dist/{chunk-YS7Y2PQG.js.map → chunk-5OUOVPXC.js.map} +1 -1
  66. package/dist/{chunk-YP5WAFTI.mjs → chunk-6FIIA6ME.mjs} +4 -4
  67. package/dist/{chunk-YP5WAFTI.mjs.map → chunk-6FIIA6ME.mjs.map} +1 -1
  68. package/dist/{chunk-JOYMIGR2.mjs → chunk-7K6L33BX.mjs} +22 -22
  69. package/dist/{chunk-RVFOUPK4.js → chunk-7VRK3DWU.js} +6 -6
  70. package/dist/{chunk-RVFOUPK4.js.map → chunk-7VRK3DWU.js.map} +1 -1
  71. package/dist/{chunk-IDJY2JWU.js → chunk-AGEE4CGH.js} +5 -5
  72. package/dist/{chunk-IDJY2JWU.js.map → chunk-AGEE4CGH.js.map} +1 -1
  73. package/dist/{chunk-JS75ORH7.js → chunk-ATPQ6264.js} +24 -24
  74. package/dist/{chunk-LF44SJPP.js → chunk-BGBP4UN4.js} +4 -4
  75. package/dist/{chunk-LF44SJPP.js.map → chunk-BGBP4UN4.js.map} +1 -1
  76. package/dist/{chunk-RGCUND5Q.mjs → chunk-CI7T4ZRP.mjs} +4 -4
  77. package/dist/{chunk-RGCUND5Q.mjs.map → chunk-CI7T4ZRP.mjs.map} +1 -1
  78. package/dist/{chunk-KDNB6BYH.js → chunk-CTAYH725.js} +11 -11
  79. package/dist/{chunk-KDNB6BYH.js.map → chunk-CTAYH725.js.map} +1 -1
  80. package/dist/{chunk-YKNXBWPZ.mjs → chunk-D5KKVWZK.mjs} +3 -3
  81. package/dist/{chunk-YKNXBWPZ.mjs.map → chunk-D5KKVWZK.mjs.map} +1 -1
  82. package/dist/{chunk-XGELGOF6.mjs → chunk-DVZ4BMXX.mjs} +7 -7
  83. package/dist/{chunk-XGELGOF6.mjs.map → chunk-DVZ4BMXX.mjs.map} +1 -1
  84. package/dist/{chunk-FQAZBJJO.mjs → chunk-ESPOINPT.mjs} +3 -3
  85. package/dist/{chunk-FQAZBJJO.mjs.map → chunk-ESPOINPT.mjs.map} +1 -1
  86. package/dist/{chunk-XOYQKFKI.mjs → chunk-EVETX2XF.mjs} +4 -4
  87. package/dist/{chunk-XOYQKFKI.mjs.map → chunk-EVETX2XF.mjs.map} +1 -1
  88. package/dist/{chunk-ITVQV7DK.js → chunk-EVKP4SOM.js} +10 -10
  89. package/dist/{chunk-ITVQV7DK.js.map → chunk-EVKP4SOM.js.map} +1 -1
  90. package/dist/{chunk-CJX2MC62.mjs → chunk-EXVHO3CZ.mjs} +3 -3
  91. package/dist/{chunk-CJX2MC62.mjs.map → chunk-EXVHO3CZ.mjs.map} +1 -1
  92. package/dist/{chunk-3DXJHMQM.mjs → chunk-GYKFHQSZ.mjs} +3 -3
  93. package/dist/{chunk-3DXJHMQM.mjs.map → chunk-GYKFHQSZ.mjs.map} +1 -1
  94. package/dist/{chunk-H5FCJBAN.mjs → chunk-I4PUQYBI.mjs} +3 -3
  95. package/dist/{chunk-H5FCJBAN.mjs.map → chunk-I4PUQYBI.mjs.map} +1 -1
  96. package/dist/{chunk-DQXEYUTD.js → chunk-I7KIVKVW.js} +3 -3
  97. package/dist/{chunk-DQXEYUTD.js.map → chunk-I7KIVKVW.js.map} +1 -1
  98. package/dist/{chunk-L3GAEBJU.mjs → chunk-IUNFAKOS.mjs} +3 -3
  99. package/dist/{chunk-L3GAEBJU.mjs.map → chunk-IUNFAKOS.mjs.map} +1 -1
  100. package/dist/{chunk-ZQJGCQHC.js → chunk-IWHAJBYL.js} +15 -15
  101. package/dist/{chunk-ZQJGCQHC.js.map → chunk-IWHAJBYL.js.map} +1 -1
  102. package/dist/{chunk-AQUWWATH.js → chunk-IZRVSIOK.js} +4 -4
  103. package/dist/{chunk-AQUWWATH.js.map → chunk-IZRVSIOK.js.map} +1 -1
  104. package/dist/{chunk-TMNFPVK5.js → chunk-JAA42HR7.js} +7 -7
  105. package/dist/{chunk-TMNFPVK5.js.map → chunk-JAA42HR7.js.map} +1 -1
  106. package/dist/{chunk-Y53BIB7A.js → chunk-JSM4AYSZ.js} +14 -14
  107. package/dist/{chunk-Y53BIB7A.js.map → chunk-JSM4AYSZ.js.map} +1 -1
  108. package/dist/{chunk-MZK5APTV.js → chunk-KDLN2MR5.js} +18 -18
  109. package/dist/{chunk-MZK5APTV.js.map → chunk-KDLN2MR5.js.map} +1 -1
  110. package/dist/{chunk-BGOPF6J2.js → chunk-KEEZX6Q4.js} +3 -3
  111. package/dist/{chunk-BGOPF6J2.js.map → chunk-KEEZX6Q4.js.map} +1 -1
  112. package/dist/{chunk-6OSHL7H5.mjs → chunk-LXBPTKYT.mjs} +4 -4
  113. package/dist/{chunk-6OSHL7H5.mjs.map → chunk-LXBPTKYT.mjs.map} +1 -1
  114. package/dist/chunk-M2N7NY3V.js +103 -0
  115. package/dist/chunk-M2N7NY3V.js.map +1 -0
  116. package/dist/{chunk-36NE4PSS.js → chunk-MQEVQ5YB.js} +3 -3
  117. package/dist/{chunk-36NE4PSS.js.map → chunk-MQEVQ5YB.js.map} +1 -1
  118. package/dist/{chunk-DXBSBWSS.js → chunk-MTHMOXZF.js} +6 -6
  119. package/dist/{chunk-DXBSBWSS.js.map → chunk-MTHMOXZF.js.map} +1 -1
  120. package/dist/{chunk-BDSNEB3O.mjs → chunk-NRT7MOEO.mjs} +4 -4
  121. package/dist/{chunk-BDSNEB3O.mjs.map → chunk-NRT7MOEO.mjs.map} +1 -1
  122. package/dist/chunk-NYXENHD2.mjs +96 -0
  123. package/dist/chunk-NYXENHD2.mjs.map +1 -0
  124. package/dist/chunk-OI3FCJSP.js +8 -0
  125. package/dist/{chunk-OXA4ZSX2.js.map → chunk-OI3FCJSP.js.map} +1 -1
  126. package/dist/{chunk-F6BYWNHU.mjs → chunk-OUP6UL74.mjs} +3 -3
  127. package/dist/{chunk-F6BYWNHU.mjs.map → chunk-OUP6UL74.mjs.map} +1 -1
  128. package/dist/{chunk-OQWAJBYA.mjs → chunk-OWEJXMKY.mjs} +3 -3
  129. package/dist/{chunk-OQWAJBYA.mjs.map → chunk-OWEJXMKY.mjs.map} +1 -1
  130. package/dist/{chunk-XKJLJLQ4.js → chunk-OZTVJSFX.js} +107 -49
  131. package/dist/chunk-OZTVJSFX.js.map +1 -0
  132. package/dist/{chunk-QF3XTEXV.js → chunk-P4J3WG6C.js} +4 -4
  133. package/dist/{chunk-QF3XTEXV.js.map → chunk-P4J3WG6C.js.map} +1 -1
  134. package/dist/{chunk-4EJI4IOX.mjs → chunk-PTQHPWEK.mjs} +97 -39
  135. package/dist/chunk-PTQHPWEK.mjs.map +1 -0
  136. package/dist/{chunk-OF4V7CSP.mjs → chunk-QSN2QST7.mjs} +3 -3
  137. package/dist/{chunk-OF4V7CSP.mjs.map → chunk-QSN2QST7.mjs.map} +1 -1
  138. package/dist/{chunk-NMKUYGKK.mjs → chunk-RGXYE2ZI.mjs} +4 -4
  139. package/dist/{chunk-NMKUYGKK.mjs.map → chunk-RGXYE2ZI.mjs.map} +1 -1
  140. package/dist/{chunk-NNZDWY3L.mjs → chunk-RH4XEXTK.mjs} +3 -3
  141. package/dist/{chunk-NDVKIDMN.js → chunk-RQG7I6O4.js} +4 -4
  142. package/dist/{chunk-NDVKIDMN.js.map → chunk-RQG7I6O4.js.map} +1 -1
  143. package/dist/{chunk-VK74LC4H.js → chunk-S6CMQTVZ.js} +5 -5
  144. package/dist/{chunk-VK74LC4H.js.map → chunk-S6CMQTVZ.js.map} +1 -1
  145. package/dist/{chunk-5YA6SI4Z.mjs → chunk-TIFVAASU.mjs} +2 -2
  146. package/dist/{chunk-K4LLYQFZ.js → chunk-VDGCZVUF.js} +14 -14
  147. package/dist/{chunk-K4LLYQFZ.js.map → chunk-VDGCZVUF.js.map} +1 -1
  148. package/dist/{chunk-I4RU3RCS.js → chunk-XCOMBHLF.js} +8 -8
  149. package/dist/{chunk-I4RU3RCS.js.map → chunk-XCOMBHLF.js.map} +1 -1
  150. package/dist/{chunk-I7AZC5ZQ.js → chunk-XXSSUCJB.js} +2 -2
  151. package/dist/{chunk-ZQSJK65K.mjs → chunk-YEHC7VMW.mjs} +3 -3
  152. package/dist/{chunk-ZQSJK65K.mjs.map → chunk-YEHC7VMW.mjs.map} +1 -1
  153. package/dist/{chunk-KKTSAT7I.mjs → chunk-YK7SEUFJ.mjs} +4 -4
  154. package/dist/{chunk-KKTSAT7I.mjs.map → chunk-YK7SEUFJ.mjs.map} +1 -1
  155. package/dist/{chunk-NN2YE5WT.js → chunk-ZUQSVCMD.js} +3 -3
  156. package/dist/cli/index.js +211 -211
  157. package/dist/cli/index.mjs +151 -151
  158. package/dist/client/index.js +4 -4
  159. package/dist/client/index.mjs +3 -3
  160. package/dist/commerce/index.js +57 -57
  161. package/dist/commerce/index.mjs +5 -5
  162. package/dist/cta-bar/CtaBar.d.ts +21 -7
  163. package/dist/cta-bar/CtaBar.d.ts.map +1 -1
  164. package/dist/cta-bar/index.js +9 -12
  165. package/dist/cta-bar/index.js.map +1 -1
  166. package/dist/cta-bar/index.mjs +9 -12
  167. package/dist/cta-bar/index.mjs.map +1 -1
  168. package/dist/cta-bar/styles.d.ts.map +1 -1
  169. package/dist/engage/ChatWidget.d.ts.map +1 -1
  170. package/dist/engage/EchoUiActions.d.ts +5 -2
  171. package/dist/engage/EchoUiActions.d.ts.map +1 -1
  172. package/dist/engage/brand-color.d.ts +37 -0
  173. package/dist/engage/brand-color.d.ts.map +1 -0
  174. package/dist/engage/index.js +11 -10
  175. package/dist/engage/index.js.map +1 -1
  176. package/dist/engage/index.mjs +8 -7
  177. package/dist/engage/index.mjs.map +1 -1
  178. package/dist/fleet/index.js +8 -8
  179. package/dist/fleet/index.mjs +4 -4
  180. package/dist/forms/index.js +16 -16
  181. package/dist/forms/index.mjs +9 -9
  182. package/dist/forms/server.js +10 -10
  183. package/dist/forms/server.mjs +8 -8
  184. package/dist/forms/static.js +7 -7
  185. package/dist/forms/static.mjs +6 -6
  186. package/dist/images/index.js +11 -11
  187. package/dist/images/index.mjs +4 -4
  188. package/dist/index.js +63 -63
  189. package/dist/index.mjs +9 -9
  190. package/dist/layout/client.js +8 -8
  191. package/dist/layout/client.mjs +7 -7
  192. package/dist/layout/index.js +10 -10
  193. package/dist/layout/index.mjs +8 -8
  194. package/dist/{lib-6HOOMENJ.js → lib-6GWWPDJR.js} +7 -7
  195. package/dist/lib-BD4KKQBI.mjs +4 -0
  196. package/dist/{lib-R7IQ4ZHE.mjs → lib-N5PD6JNJ.mjs} +2 -2
  197. package/dist/{lib-BGAWCSUH.js → lib-WFB5RLEQ.js} +8 -8
  198. package/dist/maps/index.js +5 -5
  199. package/dist/maps/index.mjs +3 -3
  200. package/dist/search/index.js +4 -4
  201. package/dist/search/index.mjs +3 -3
  202. package/dist/seo/client.js +5 -5
  203. package/dist/seo/client.mjs +4 -4
  204. package/dist/seo/index.js +5 -5
  205. package/dist/seo/index.mjs +4 -4
  206. package/dist/seo/register-sitemap-cli.js +12 -93
  207. package/dist/seo/register-sitemap-cli.mjs +2 -83
  208. package/dist/server/index.js +3 -3
  209. package/dist/server/index.mjs +2 -2
  210. package/dist/shared/color.d.ts +39 -0
  211. package/dist/shared/color.d.ts.map +1 -0
  212. package/dist/shared/version.d.ts +1 -1
  213. package/dist/signal/index.js +11 -11
  214. package/dist/signal/index.mjs +2 -2
  215. package/dist/sync/index.js +17 -17
  216. package/dist/sync/index.mjs +4 -4
  217. package/dist/{web-vitals.attribution-7LKLZ5GR.mjs → web-vitals.attribution-CHXXWO72.mjs} +3 -3
  218. package/dist/web-vitals.attribution-CHXXWO72.mjs.map +1 -0
  219. package/dist/{web-vitals.attribution-ONVYQNRB.js → web-vitals.attribution-SQVZNHN3.js} +3 -3
  220. package/dist/web-vitals.attribution-SQVZNHN3.js.map +1 -0
  221. package/package.json +1 -1
  222. package/skills/site-kit/SKILL.md +3 -2
  223. package/dist/ChatWidget-GVNDKGUU.mjs +0 -16
  224. package/dist/ChatWidget-YL34KOZM.js +0 -25
  225. package/dist/EngageWidget-465O5XUV.mjs +0 -12
  226. package/dist/EngageWidget-IQRKRYPG.js +0 -21
  227. package/dist/ManagedForm-MLPETHSQ.js +0 -25
  228. package/dist/ManagedForm-P3L34ALG.mjs +0 -16
  229. package/dist/SitemapSync-P7XWL6VV.js +0 -18
  230. package/dist/SitemapSync-SIKJCK7N.mjs +0 -9
  231. package/dist/chunk-4EJI4IOX.mjs.map +0 -1
  232. package/dist/chunk-ACKFL6WA.mjs +0 -6
  233. package/dist/chunk-OXA4ZSX2.js +0 -8
  234. package/dist/chunk-XKJLJLQ4.js.map +0 -1
  235. package/dist/lib-RSDMEKDQ.mjs +0 -4
  236. package/dist/web-vitals.attribution-7LKLZ5GR.mjs.map +0 -1
  237. package/dist/web-vitals.attribution-ONVYQNRB.js.map +0 -1
@@ -1,12 +1,65 @@
1
1
  'use client';
2
2
  import { chatLauncherStyles } from './chunk-4U5NCKQY.mjs';
3
3
  import { GlassStyles } from './chunk-OBKS3CPP.mjs';
4
- import { useForm } from './chunk-YP5WAFTI.mjs';
5
- import { sonorFetch } from './chunk-RGCUND5Q.mjs';
6
- import { useState, useRef, useEffect, useCallback } from 'react';
4
+ import { useForm } from './chunk-6FIIA6ME.mjs';
5
+ import { parseColor, relativeLuminance, DARK_LUMINANCE, contrastRatio } from './chunk-NYXENHD2.mjs';
6
+ import { sonorFetch } from './chunk-CI7T4ZRP.mjs';
7
+ import { useState, useRef, useEffect, useLayoutEffect, useCallback } from 'react';
7
8
  import ReactMarkdown from 'react-markdown';
8
9
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
9
10
 
11
+ // src/engage/brand-color.ts
12
+ var TEXT_CONTRAST = 4.5;
13
+ var RESTING_TINT = 0.082;
14
+ var UNREADABLE_BRAND_SHARE = 40;
15
+ var WHITE = { r: 255, g: 255, b: 255 };
16
+ var BLACK = { r: 0, g: 0, b: 0 };
17
+ function mix(a, b, share) {
18
+ return {
19
+ r: a.r * share + b.r * (1 - share),
20
+ g: a.g * share + b.g * (1 - share),
21
+ b: a.b * share + b.b * (1 - share)
22
+ };
23
+ }
24
+ function round({ r, g, b }) {
25
+ const c = (v) => Math.round(Math.min(255, Math.max(0, v)));
26
+ return { r: c(r), g: c(g), b: c(b) };
27
+ }
28
+ function toHex(rgb) {
29
+ const { r, g, b } = round(rgb);
30
+ return `#${[r, g, b].map((c) => c.toString(16).padStart(2, "0")).join("")}`;
31
+ }
32
+ function isLightColor(color) {
33
+ const rgb = parseColor(color);
34
+ if (!rgb) return false;
35
+ return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1e3 > 160;
36
+ }
37
+ function onBrandColor(brand) {
38
+ return isLightColor(brand) ? "#1a1a1a" : "white";
39
+ }
40
+ function rgbTriplet(color, fallback = "37, 99, 235") {
41
+ const rgb = parseColor(color);
42
+ if (!rgb) return fallback;
43
+ const { r, g, b } = round(rgb);
44
+ return `${r}, ${g}, ${b}`;
45
+ }
46
+ function brandTextColor(brand, panelTint) {
47
+ const tint = panelTint && parseColor(panelTint) || WHITE;
48
+ const pole = relativeLuminance(tint) < DARK_LUMINANCE ? WHITE : BLACK;
49
+ const rgb = parseColor(brand);
50
+ if (!rgb) return `color-mix(in srgb, ${brand} ${UNREADABLE_BRAND_SHARE}%, ${toHex(pole)})`;
51
+ const surface = relativeLuminance(mix(rgb, tint, RESTING_TINT));
52
+ const reads = (c) => contrastRatio(relativeLuminance(c), surface) >= TEXT_CONTRAST;
53
+ if (reads(rgb)) return brand;
54
+ let lo = 0;
55
+ let hi = 1;
56
+ for (let i = 0; i < 12; i++) {
57
+ const share = (lo + hi) / 2;
58
+ if (reads(round(mix(rgb, pole, share)))) lo = share;
59
+ else hi = share;
60
+ }
61
+ return toHex(mix(rgb, pole, lo));
62
+ }
10
63
  function alpha(rgb, a) {
11
64
  return `rgba(var(--sk-primary-rgb, ${rgb}), ${a})`;
12
65
  }
@@ -192,7 +245,7 @@ function InlineManagedForm({ slug, prefill, primaryColor, primaryRgb }) {
192
245
  borderRadius: 8,
193
246
  border: "none",
194
247
  backgroundColor: primaryColor,
195
- color: "#fff",
248
+ color: onBrandColor(primaryColor),
196
249
  fontSize: 13.5,
197
250
  fontWeight: 600,
198
251
  cursor: isSubmitting ? "default" : "pointer",
@@ -205,7 +258,7 @@ function InlineManagedForm({ slug, prefill, primaryColor, primaryRgb }) {
205
258
  }
206
259
  );
207
260
  }
208
- function SuggestActionChip({ action, message, primaryColor, primaryRgb, onSuggest }) {
261
+ function SuggestActionChip({ action, message, primaryColor, primaryRgb, brandText, onSuggest }) {
209
262
  return /* @__PURE__ */ jsx(
210
263
  "button",
211
264
  {
@@ -216,7 +269,7 @@ function SuggestActionChip({ action, message, primaryColor, primaryRgb, onSugges
216
269
  borderRadius: 16,
217
270
  border: `1px solid ${primaryColor}`,
218
271
  backgroundColor: alpha(primaryRgb, 0.063),
219
- color: primaryColor,
272
+ color: brandText,
220
273
  fontSize: 13,
221
274
  cursor: "pointer"
222
275
  },
@@ -224,7 +277,7 @@ function SuggestActionChip({ action, message, primaryColor, primaryRgb, onSugges
224
277
  }
225
278
  );
226
279
  }
227
- function EchoUiActions({ actions, primaryColor, primaryRgb, onSuggest }) {
280
+ function EchoUiActions({ actions, primaryColor, primaryRgb, brandText, onSuggest }) {
228
281
  if (!actions?.length) return null;
229
282
  const chips = actions.filter((a) => a?.type === "suggest_action");
230
283
  const forms = actions.filter((a) => a?.type === "show_form");
@@ -256,6 +309,7 @@ function EchoUiActions({ actions, primaryColor, primaryRgb, onSuggest }) {
256
309
  message: label,
257
310
  primaryColor,
258
311
  primaryRgb,
312
+ brandText,
259
313
  onSuggest
260
314
  },
261
315
  `chip-${i}`
@@ -300,21 +354,18 @@ function userRequestedHandoff(text) {
300
354
  }
301
355
  var BUBBLE_BG = "color-mix(in srgb, var(--sk-bg, #ffffff) 94%, transparent)";
302
356
  var HAIRLINE = "1px solid color-mix(in srgb, var(--sk-text-primary, #111827) 9%, transparent)";
303
- function isLightColor(hex) {
304
- const num = parseInt(hex.replace("#", ""), 16);
305
- const r = num >> 16;
306
- const g = num >> 8 & 255;
307
- const b = num & 255;
308
- return (r * 299 + g * 587 + b * 114) / 1e3 > 160;
357
+ var ECHO_STYLE_HREF = "sk-echo";
358
+ var ECHO_CSS = `
359
+ @media print {
360
+ [data-sk-echo-launcher], [data-sk-echo-panel] { display: none !important; }
309
361
  }
362
+ @media (prefers-reduced-motion: reduce) {
363
+ [data-sk-echo-panel] { animation: none !important; }
364
+ }
365
+ `;
310
366
  function staticPrimaryColor(apiFallback, hardDefault) {
311
367
  return apiFallback || hardDefault;
312
368
  }
313
- function hexToRgbString(hex, fallback = "37, 99, 235") {
314
- const match = hex.replace("#", "").match(/^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);
315
- if (!match) return fallback;
316
- return `${parseInt(match[1], 16)}, ${parseInt(match[2], 16)}, ${parseInt(match[3], 16)}`;
317
- }
318
369
  function hexAlpha(rgbVar, alpha2, fallbackRgb = "37, 99, 235") {
319
370
  return `rgba(var(${rgbVar}, ${fallbackRgb}), ${alpha2})`;
320
371
  }
@@ -367,11 +418,19 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
367
418
  const primaryFallback = staticPrimaryColor(widgetConfig?.brand_primary || config?.buttonColor, "#2563eb");
368
419
  const [primaryFromCssVar, setPrimaryFromCssVar] = useState(null);
369
420
  const primaryColor = primaryFromCssVar ?? primaryFallback;
370
- const primaryRgb = hexToRgbString(primaryColor);
421
+ const primaryRgb = rgbTriplet(primaryColor);
371
422
  useEffect(() => {
372
423
  const cssValue = getComputedStyle(document.documentElement).getPropertyValue("--sk-primary").trim();
373
424
  setPrimaryFromCssVar(cssValue || null);
374
425
  }, []);
426
+ const onBrand = onBrandColor(primaryColor);
427
+ const panelRef = useRef(null);
428
+ const [panelTint, setPanelTint] = useState(null);
429
+ useLayoutEffect(() => {
430
+ if (!isOpen || !panelRef.current) return;
431
+ setPanelTint(getComputedStyle(panelRef.current).getPropertyValue("--sk-glass-t").trim() || null);
432
+ }, [isOpen]);
433
+ const brandText = brandTextColor(primaryColor, panelTint);
375
434
  const businessName = propAssistantName || widgetConfig?.project_name || widgetConfig?.business_info?.name || "Chat with us";
376
435
  const logoUrl = propAssistantAvatar || widgetConfig?.logo_url || null;
377
436
  const welcomeEnabled = widgetConfig?.welcome_screen_enabled !== false;
@@ -1057,7 +1116,6 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1057
1116
  if (availability && availability.agentsOnline > 0) return { dot: "#22c55e", text: "Online" };
1058
1117
  return { dot: "var(--sk-text-tertiary, #9ca3af)", text: "We'll respond soon" };
1059
1118
  })();
1060
- const launcherIcon = isLightColor(primaryColor) ? "#1a1a1a" : "white";
1061
1119
  const ChatButton = /* @__PURE__ */ jsx(
1062
1120
  "button",
1063
1121
  {
@@ -1086,10 +1144,10 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1086
1144
  onMouseLeave: (e) => {
1087
1145
  e.currentTarget.style.transform = "scale(1)";
1088
1146
  },
1089
- children: isOpen ? /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: launcherIcon, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1147
+ children: isOpen ? /* @__PURE__ */ jsxs("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", stroke: onBrand, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1090
1148
  /* @__PURE__ */ jsx("line", { x1: "18", y1: "6", x2: "6", y2: "18" }),
1091
1149
  /* @__PURE__ */ jsx("line", { x1: "6", y1: "6", x2: "18", y2: "18" })
1092
- ] }) : /* @__PURE__ */ jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: launcherIcon, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) })
1150
+ ] }) : /* @__PURE__ */ jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: onBrand, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("path", { d: "M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z" }) })
1093
1151
  }
1094
1152
  );
1095
1153
  const Header = /* @__PURE__ */ jsxs(
@@ -1113,7 +1171,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1113
1171
  height: 40,
1114
1172
  borderRadius: "50%",
1115
1173
  backgroundColor: primaryColor,
1116
- color: launcherIcon,
1174
+ color: onBrand,
1117
1175
  boxShadow: "inset 0 1px 0 color-mix(in srgb, #ffffff 30%, transparent), 0 2px 6px rgba(0, 0, 0, 0.12)",
1118
1176
  display: "flex",
1119
1177
  alignItems: "center",
@@ -1150,7 +1208,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1150
1208
  borderRadius: 12,
1151
1209
  border: `1px solid ${hexAlpha("--sk-primary-rgb", 0.2, primaryRgb)}`,
1152
1210
  backgroundColor: hexAlpha("--sk-primary-rgb", 0.031, primaryRgb),
1153
- color: primaryColor,
1211
+ color: brandText,
1154
1212
  fontSize: 14,
1155
1213
  cursor: "pointer",
1156
1214
  textAlign: "left",
@@ -1179,7 +1237,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1179
1237
  borderRadius: 12,
1180
1238
  border: "none",
1181
1239
  backgroundColor: primaryColor,
1182
- color: isLightColor(primaryColor) ? "#1a1a1a" : "white",
1240
+ color: onBrand,
1183
1241
  fontSize: 14,
1184
1242
  fontWeight: 600,
1185
1243
  cursor: "pointer",
@@ -1191,11 +1249,11 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1191
1249
  widgetConfig?.business_info?.phone && /* @__PURE__ */ jsxs("div", { style: { textAlign: "center", fontSize: 13, color: "var(--sk-text-secondary, #6b7280)" }, children: [
1192
1250
  "Or call us at",
1193
1251
  " ",
1194
- /* @__PURE__ */ jsx("a", { href: `tel:${widgetConfig.business_info.phone}`, style: { color: primaryColor, textDecoration: "none", fontWeight: 500 }, children: widgetConfig.business_info.phone })
1252
+ /* @__PURE__ */ jsx("a", { href: `tel:${widgetConfig.business_info.phone}`, style: { color: brandText, textDecoration: "none", fontWeight: 500 }, children: widgetConfig.business_info.phone })
1195
1253
  ] })
1196
1254
  ] });
1197
1255
  const OfflineFormView = /* @__PURE__ */ jsx("div", { style: { padding: 20, flex: 1, overflowY: "auto" }, children: offlineSubmitted ? /* @__PURE__ */ jsxs("div", { style: { textAlign: "center", padding: 20 }, children: [
1198
- /* @__PURE__ */ jsx("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" }, children: /* @__PURE__ */ jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: primaryColor, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" }) }) }),
1256
+ /* @__PURE__ */ jsx("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" }, children: /* @__PURE__ */ jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: brandText, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: /* @__PURE__ */ jsx("polyline", { points: "20 6 9 17 4 12" }) }) }),
1199
1257
  /* @__PURE__ */ jsx("h3", { style: { margin: "0 0 8px", fontSize: 18, fontWeight: 600, color: "var(--sk-text-primary, #111827)" }, children: "Message Sent!" }),
1200
1258
  /* @__PURE__ */ jsx("p", { style: { margin: 0, color: "var(--sk-text-secondary, #6b7280)", fontSize: 14 }, children: offlineSubheading })
1201
1259
  ] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleOfflineSubmit, children: [
@@ -1242,7 +1300,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1242
1300
  borderRadius: 8,
1243
1301
  border: "none",
1244
1302
  backgroundColor: primaryColor,
1245
- color: isLightColor(primaryColor) ? "#1a1a1a" : "white",
1303
+ color: onBrand,
1246
1304
  fontSize: 14,
1247
1305
  fontWeight: 600,
1248
1306
  cursor: isLoading ? "wait" : "pointer",
@@ -1290,7 +1348,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1290
1348
  alignItems: "center",
1291
1349
  justifyContent: "center"
1292
1350
  },
1293
- children: /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: isLightColor(primaryColor) ? "#1a1a1a" : "white", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1351
+ children: /* @__PURE__ */ jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: onBrand, strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [
1294
1352
  /* @__PURE__ */ jsx("path", { d: "M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2" }),
1295
1353
  /* @__PURE__ */ jsx("circle", { cx: "8.5", cy: "7", r: "4" }),
1296
1354
  /* @__PURE__ */ jsx("line", { x1: "20", y1: "8", x2: "20", y2: "14" }),
@@ -1339,7 +1397,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1339
1397
  // Bubbles on glass stay near-opaque: the glass behind them
1340
1398
  // is for depth, never for the text to read against.
1341
1399
  backgroundColor: message.role === "user" ? primaryColor : message.role === "system" ? "color-mix(in srgb, var(--sk-text-primary, #111827) 7%, transparent)" : BUBBLE_BG,
1342
- color: message.role === "user" ? isLightColor(primaryColor) ? "#1a1a1a" : "white" : message.role === "system" ? "var(--sk-text-secondary, #6b7280)" : "var(--sk-text-primary, #111827)",
1400
+ color: message.role === "user" ? onBrand : message.role === "system" ? "var(--sk-text-secondary, #6b7280)" : "var(--sk-text-primary, #111827)",
1343
1401
  border: message.role === "user" || message.role === "system" ? "none" : HAIRLINE,
1344
1402
  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)",
1345
1403
  fontSize: message.role === "system" ? 13 : 14,
@@ -1375,7 +1433,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1375
1433
  padding: "8px 14px",
1376
1434
  borderRadius: 8,
1377
1435
  backgroundColor: hexAlpha("--sk-primary-rgb", 0.082, primaryRgb),
1378
- color: primaryColor,
1436
+ color: brandText,
1379
1437
  fontWeight: 600,
1380
1438
  fontSize: 13,
1381
1439
  textDecoration: "none",
@@ -1421,7 +1479,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1421
1479
  borderRadius: 16,
1422
1480
  border: `1px solid ${primaryColor}`,
1423
1481
  backgroundColor: hexAlpha("--sk-primary-rgb", 0.063, primaryRgb),
1424
- color: primaryColor,
1482
+ color: brandText,
1425
1483
  fontSize: 13,
1426
1484
  cursor: "pointer"
1427
1485
  },
@@ -1435,6 +1493,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1435
1493
  actions: message.uiActions,
1436
1494
  primaryColor,
1437
1495
  primaryRgb,
1496
+ brandText,
1438
1497
  onSuggest: handleSuggestAction
1439
1498
  }
1440
1499
  ) : null,
@@ -1458,7 +1517,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1458
1517
  borderRadius: 6,
1459
1518
  border: `1px solid ${primaryColor}`,
1460
1519
  backgroundColor: "transparent",
1461
- color: primaryColor,
1520
+ color: brandText,
1462
1521
  fontSize: 13,
1463
1522
  cursor: "pointer"
1464
1523
  },
@@ -1540,7 +1599,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1540
1599
  borderRadius: "50%",
1541
1600
  border: "none",
1542
1601
  backgroundColor: (inputValue.trim() || pendingFiles.length) && !isLoading ? primaryColor : "var(--sk-border, #e5e7eb)",
1543
- color: (inputValue.trim() || pendingFiles.length) && !isLoading && isLightColor(primaryColor) ? "#1a1a1a" : "white",
1602
+ color: (inputValue.trim() || pendingFiles.length) && !isLoading ? onBrand : "white",
1544
1603
  cursor: inputValue.trim() && !isLoading ? "pointer" : "not-allowed",
1545
1604
  display: "flex",
1546
1605
  alignItems: "center",
@@ -1556,6 +1615,7 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1556
1615
  const ChatPopup = isOpen && /* @__PURE__ */ jsxs(
1557
1616
  "div",
1558
1617
  {
1618
+ ref: panelRef,
1559
1619
  "data-sk-echo-panel": true,
1560
1620
  className: "sk-glass sk-glass--panel",
1561
1621
  style: {
@@ -1586,9 +1646,6 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1586
1646
  from { opacity: 0; transform: translateY(12px) scale(0.94); }
1587
1647
  to { opacity: 1; transform: translateY(0) scale(1); }
1588
1648
  }
1589
- @media (prefers-reduced-motion: reduce) {
1590
- [data-sk-echo-panel] { animation: none !important; }
1591
- }
1592
1649
  @keyframes chatDot {
1593
1650
  0%, 80%, 100% { opacity: 0.3; }
1594
1651
  40% { opacity: 1; }
@@ -1615,11 +1672,12 @@ function ChatWidget({ projectId: propProjectId, config, apiUrl: propApiUrl, sign
1615
1672
  );
1616
1673
  return /* @__PURE__ */ jsxs(Fragment, { children: [
1617
1674
  /* @__PURE__ */ jsx(GlassStyles, {}),
1675
+ /* @__PURE__ */ jsx("style", { href: ECHO_STYLE_HREF, precedence: "default", children: ECHO_CSS }),
1618
1676
  ChatPopup,
1619
1677
  ChatButton
1620
1678
  ] });
1621
1679
  }
1622
1680
 
1623
1681
  export { ChatWidget };
1624
- //# sourceMappingURL=chunk-4EJI4IOX.mjs.map
1625
- //# sourceMappingURL=chunk-4EJI4IOX.mjs.map
1682
+ //# sourceMappingURL=chunk-PTQHPWEK.mjs.map
1683
+ //# sourceMappingURL=chunk-PTQHPWEK.mjs.map