@sonordev/site-kit 7.3.0 → 8.0.0

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 (239) hide show
  1. package/AGENTS.md +40 -12
  2. package/CHANGELOG.md +73 -0
  3. package/README.md +44 -18
  4. package/agent-manifest.json +111 -56
  5. package/dist/AnalyticsProvider-LYFDQRRJ.js +13 -0
  6. package/dist/{ArticleViewTracker-GFOAXFV7.js → ArticleViewTracker-HG7IIRJY.js} +6 -5
  7. package/dist/{BlocksPopup-AHDU34TL.js → BlocksPopup-GFX3GZIK.js} +6 -5
  8. package/dist/{ChatWidget-FHBAHFZX.js → ChatWidget-DVS7MLBN.js} +8 -5
  9. package/dist/{FileField-J5W5MIAZ.js → FileField-DVN7NUBI.js} +5 -5
  10. package/dist/{FormSpotlight-PE5YZBFZ.js → FormSpotlight-W4SXKKO6.js} +3 -3
  11. package/dist/{FormStage-OOPQC27J.js → FormStage-JTEE5MZD.js} +3 -3
  12. package/dist/ManagedForm-ZAUHIHGP.js +19 -0
  13. package/dist/{ManagedNewsletterForm-TC5542ZG.js → ManagedNewsletterForm-DQIB5Z4Y.js} +9 -6
  14. package/dist/{SignalCore-2YP5FCAS.js → SignalCore-W5PYYMGX.js} +7 -7
  15. package/dist/SiteChat-MY2GATWC.js +6 -0
  16. package/dist/SiteDesignReporter-ICZWEGCY.js +12 -0
  17. package/dist/SitePopups-TGULLAER.js +13 -0
  18. package/dist/SitemapSync-AN2OBJE6.js +9 -0
  19. package/dist/_client/booking-widget.js +6 -5
  20. package/dist/_client/testimonial-section.d.ts +1 -1
  21. package/dist/_client/testimonial-section.js +4 -2
  22. package/dist/affiliates/index.js +6 -6
  23. package/dist/analytics/index.js +73 -7
  24. package/dist/articles/index.js +2 -2
  25. package/dist/articles/server-ui.js +3 -3
  26. package/dist/articles/server.js +2 -2
  27. package/dist/brand.css +1 -1
  28. package/dist/chat/index.d.ts +1 -1
  29. package/dist/chat/index.js +39 -8
  30. package/dist/chunk-3G7YABRA.js +25 -0
  31. package/dist/{chunk-CGWUXUYZ.js → chunk-3RDJKIYO.js} +2 -2
  32. package/dist/{chunk-J4FSB4OG.js → chunk-3YKQLC7J.js} +5 -2
  33. package/dist/{chunk-BEBR4OJD.js → chunk-56VDS2RP.js} +2 -2
  34. package/dist/chunk-5ROTTMBL.js +19 -0
  35. package/dist/{chunk-56KNHB4U.js → chunk-5S2XDG5O.js} +1 -1
  36. package/dist/chunk-5TM3WPCI.js +7 -0
  37. package/dist/{chunk-BR4ZKUHH.js → chunk-6CJGZFOU.js} +18 -2
  38. package/dist/{chunk-RYVDGXC2.js → chunk-6KU7STM3.js} +3 -1
  39. package/dist/{chunk-XLSQTTUE.js → chunk-6QFINXLH.js} +3 -3
  40. package/dist/{chunk-CYUFBKJQ.js → chunk-6ZXJ3SXR.js} +1 -1
  41. package/dist/{chunk-NI2XNEMR.js → chunk-7YEEOIWI.js} +1 -1
  42. package/dist/{chunk-DNPNYWVL.js → chunk-BQ2CXKTQ.js} +5 -20
  43. package/dist/{chunk-X6F6SO4S.js → chunk-C7TLGL3R.js} +21 -1
  44. package/dist/{chunk-43OCZ3JA.js → chunk-CAH4Y4PY.js} +4 -2
  45. package/dist/chunk-CAT235HY.js +13 -0
  46. package/dist/{chunk-PXKIGZ2F.js → chunk-EATJPSTS.js} +1 -1
  47. package/dist/{chunk-O5RGXTWU.js → chunk-GNSXOTIK.js} +6 -4
  48. package/dist/{chunk-UPRSH6Q4.js → chunk-ICAVVF6D.js} +3 -3
  49. package/dist/{chunk-2ECWEUHP.js → chunk-IJQ767JS.js} +3 -5
  50. package/dist/{chunk-MKMD2HJW.js → chunk-J65N34YM.js} +3 -3
  51. package/dist/{chunk-6U3VLV2C.js → chunk-JIH32RH2.js} +4 -4
  52. package/dist/{chunk-T4DLETKR.js → chunk-K22OLAPC.js} +2 -2
  53. package/dist/{chunk-I2YX3HVD.js → chunk-KRBBH64S.js} +3 -3
  54. package/dist/{chunk-VF4F5WXZ.js → chunk-LBIQ5LTC.js} +1 -1
  55. package/dist/{chunk-WGIDC6QP.js → chunk-LKH44GI3.js} +5 -5
  56. package/dist/{chunk-ZTLMPUO6.js → chunk-LNSF6BJC.js} +1 -1
  57. package/dist/{chunk-WDQB4OXY.js → chunk-M62U7TJF.js} +1 -1
  58. package/dist/{chunk-EDYHROQ7.js → chunk-NFRJTOTB.js} +3 -3
  59. package/dist/chunk-OD2ULW5Z.js +57 -0
  60. package/dist/{chunk-Y6LP36UW.js → chunk-OE3NXEOF.js} +2 -2
  61. package/dist/{chunk-L7U23XI2.js → chunk-OGK7OL3T.js} +5 -4
  62. package/dist/{chunk-RDPW4D33.js → chunk-PD7K54EQ.js} +2 -2
  63. package/dist/{chunk-MVR4FY5R.js → chunk-PIX7FAMX.js} +2 -2
  64. package/dist/{chunk-2AD3CDRR.js → chunk-ROAOI6GG.js} +10 -10
  65. package/dist/{chunk-YJLS6JBI.js → chunk-S7SSYGUJ.js} +6 -5
  66. package/dist/{chunk-ZKHI4E2B.js → chunk-SBPAXWLF.js} +1 -1
  67. package/dist/{chunk-ZHS2XFLV.js → chunk-TOSZGJEQ.js} +1 -1
  68. package/dist/{chunk-4NTBQNHA.js → chunk-TYAVHRWH.js} +80 -81
  69. package/dist/{chunk-Z65DHMTW.js → chunk-TZ5RTANX.js} +3 -3
  70. package/dist/{chunk-VX5CMNMM.js → chunk-UAYAJPEP.js} +7 -1
  71. package/dist/{chunk-4YTYGG2C.js → chunk-URJN75ZG.js} +29 -16
  72. package/dist/{chunk-EPT6FJUY.js → chunk-UUWUAMUC.js} +13 -16
  73. package/dist/{chunk-PKGN32AU.js → chunk-XPTJRVL2.js} +1 -1
  74. package/dist/{chunk-662ILEZ6.js → chunk-Y35BWW2C.js} +3 -7
  75. package/dist/{chunk-MRQ2U4LZ.js → chunk-ZHNQFNO3.js} +2 -2
  76. package/dist/chunk-ZKADJNR2.js +52 -0
  77. package/dist/{chunk-WGG6GTKW.js → chunk-ZLFGXKLG.js} +1 -1
  78. package/dist/client/index.js +6 -5
  79. package/dist/contracts/entries.d.ts +1 -1
  80. package/dist/contracts/sentences.d.ts +46 -0
  81. package/dist/contracts/site-cache.d.ts +2 -0
  82. package/dist/cta-bar/index.js +1 -1
  83. package/dist/fleet/index.js +6 -5
  84. package/dist/forms/field-autocomplete.d.ts +16 -8
  85. package/dist/forms/index.d.ts +5 -0
  86. package/dist/forms/index.js +17 -17
  87. package/dist/forms/server.js +7 -7
  88. package/dist/forms/static.js +2 -2
  89. package/dist/forms/submitForm.d.ts +5 -0
  90. package/dist/images/index.js +4 -4
  91. package/dist/index.d.ts +3 -7
  92. package/dist/index.js +1 -1
  93. package/dist/layout/SiteKitLayout.d.ts +2 -1
  94. package/dist/layout/client.js +11 -9
  95. package/dist/layout/index.js +14 -12
  96. package/dist/llms/index.js +8 -7
  97. package/dist/maps/index.js +6 -6
  98. package/dist/mcp/sonor.d.ts +47 -3
  99. package/dist/mcp/sonor.js +31 -21
  100. package/dist/proxy/index.d.ts +3 -3
  101. package/dist/proxy/index.js +1 -1
  102. package/dist/reputation/TestimonialSection.d.ts +1 -1
  103. package/dist/reputation/VisualReviewCard.d.ts +6 -0
  104. package/dist/reputation/index.d.ts +2 -1
  105. package/dist/reputation/index.js +5 -2
  106. package/dist/reputation/review-photo.d.ts +2 -0
  107. package/dist/reputation/server.d.ts +3 -2
  108. package/dist/reputation/server.js +4 -1
  109. package/dist/reputation/types.d.ts +22 -0
  110. package/dist/revalidate/index.js +3 -3
  111. package/dist/robots/indexnow.js +2 -2
  112. package/dist/runtime/index.d.ts +32 -0
  113. package/dist/runtime/index.js +7 -0
  114. package/dist/seo/api.d.ts +0 -4
  115. package/dist/seo/client.js +6 -5
  116. package/dist/seo/getManagedMetadata.d.ts +24 -0
  117. package/dist/seo/index.d.ts +2 -3
  118. package/dist/seo/index.js +14 -132
  119. package/dist/seo/indexnow.js +2 -2
  120. package/dist/seo/llms.js +8 -7
  121. package/dist/seo/register-sitemap-cli.js +2 -2
  122. package/dist/seo/server-api.d.ts +0 -6
  123. package/dist/seo/server.d.ts +1 -1
  124. package/dist/seo/server.js +4 -4
  125. package/dist/seo/sitemap.js +5 -4
  126. package/dist/seo/types.d.ts +9 -30
  127. package/dist/server/index.d.ts +8 -1
  128. package/dist/server/index.js +5 -4
  129. package/dist/server/mint-site-token.d.ts +1 -13
  130. package/dist/server/server-fetch.d.ts +19 -0
  131. package/dist/server-api-EGOKC7Q3.js +9 -0
  132. package/dist/shared/build-entries.d.ts +21 -9
  133. package/dist/shared/clientApiConfig.d.ts +56 -0
  134. package/dist/shared/fresh-fetch.d.ts +9 -3
  135. package/dist/shared/identity-reader.d.ts +26 -0
  136. package/dist/shared/identity-storage.d.ts +30 -0
  137. package/dist/shared/identity.d.ts +13 -13
  138. package/dist/shared/import-specifiers.d.ts +26 -0
  139. package/dist/shared/sonorFetch.d.ts +4 -3
  140. package/dist/shared/version.d.ts +1 -1
  141. package/dist/signal/index.js +2 -2
  142. package/dist/sitemap/index.js +5 -4
  143. package/dist/slots/index.js +3 -3
  144. package/dist/sync/index.js +6 -5
  145. package/dist/types.d.ts +0 -1
  146. package/dist/website/cta-bar.js +1 -1
  147. package/dist/website/images.js +4 -4
  148. package/dist/website/index.js +7 -6
  149. package/dist/website/popups.js +10 -7
  150. package/dist/website/slots.js +3 -3
  151. package/dist/{writeLLMsTxt-2NQVDGYI.js → writeLLMsTxt-UZGN6IBU.js} +4 -3
  152. package/docs/MIGRATING-TO-7.md +5 -2
  153. package/docs/MIGRATING-TO-8.md +183 -0
  154. package/docs.json +4 -8
  155. package/package.json +15 -44
  156. package/skills/site-kit/SKILL.md +41 -11
  157. package/src/analytics/README.md +14 -14
  158. package/src/chat/README.md +7 -7
  159. package/src/forms/README.md +61 -6
  160. package/src/mcp/README.md +61 -20
  161. package/src/proxy/README.md +5 -4
  162. package/src/reputation/README.md +25 -0
  163. package/src/revalidate/README.md +2 -2
  164. package/src/runtime/README.md +51 -0
  165. package/src/seo/README.md +24 -8
  166. package/src/sync/README.md +2 -2
  167. package/src/website/README.md +3 -2
  168. package/dist/AnalyticsProvider-DJQA66AG.js +0 -11
  169. package/dist/ManagedForm-JRZAJ7SZ.js +0 -16
  170. package/dist/SiteChat-EGEZJJVV.js +0 -5
  171. package/dist/SiteDesignReporter-YEEWJKWN.js +0 -11
  172. package/dist/SitePopups-LQBIXIFV.js +0 -10
  173. package/dist/SitemapSync-LSZ2EYOF.js +0 -8
  174. package/dist/chunk-24QZEO3Q.js +0 -41
  175. package/dist/chunk-BU66S5B7.js +0 -1
  176. package/dist/chunk-G3NHWMP5.js +0 -233
  177. package/dist/chunk-HODO5BX5.js +0 -28
  178. package/dist/chunk-L3AQCDCY.js +0 -386
  179. package/dist/chunk-P5GB6NEO.js +0 -66
  180. package/dist/chunk-SWKE6FWH.js +0 -47
  181. package/dist/cms/CmsPage.d.ts +0 -17
  182. package/dist/cms/CmsPreview.d.ts +0 -37
  183. package/dist/cms/CmsSection.d.ts +0 -8
  184. package/dist/cms/PortableTextRenderer.d.ts +0 -7
  185. package/dist/cms/index.d.ts +0 -37
  186. package/dist/cms/index.js +0 -5
  187. package/dist/cms/sanity-image.d.ts +0 -47
  188. package/dist/cms/sections/CtaSection.d.ts +0 -3
  189. package/dist/cms/sections/CustomSection.d.ts +0 -7
  190. package/dist/cms/sections/FaqSection.d.ts +0 -3
  191. package/dist/cms/sections/FormSection.d.ts +0 -8
  192. package/dist/cms/sections/GallerySection.d.ts +0 -3
  193. package/dist/cms/sections/HeroSection.d.ts +0 -3
  194. package/dist/cms/sections/RichTextSection.d.ts +0 -3
  195. package/dist/cms/sections/TestimonialsSection.d.ts +0 -3
  196. package/dist/cms/sections/index.d.ts +0 -8
  197. package/dist/cms/server-api.d.ts +0 -49
  198. package/dist/cms/server.d.ts +0 -1
  199. package/dist/cms/server.js +0 -5
  200. package/dist/cms/types.d.ts +0 -104
  201. package/dist/commerce/CalendarView.d.ts +0 -43
  202. package/dist/commerce/CheckoutForm.d.ts +0 -11
  203. package/dist/commerce/EventCalendar.d.ts +0 -26
  204. package/dist/commerce/EventCheckout.d.ts +0 -42
  205. package/dist/commerce/EventEmbed.d.ts +0 -11
  206. package/dist/commerce/EventModal.d.ts +0 -43
  207. package/dist/commerce/EventTile.d.ts +0 -10
  208. package/dist/commerce/EventsAgenda.d.ts +0 -38
  209. package/dist/commerce/EventsWidget.d.ts +0 -84
  210. package/dist/commerce/OfferingCard.d.ts +0 -9
  211. package/dist/commerce/OfferingList.d.ts +0 -9
  212. package/dist/commerce/ProductDetail.d.ts +0 -38
  213. package/dist/commerce/ProductEmbed.d.ts +0 -11
  214. package/dist/commerce/ProductGrid.d.ts +0 -41
  215. package/dist/commerce/ProductPage.d.ts +0 -39
  216. package/dist/commerce/RegistrationForm.d.ts +0 -9
  217. package/dist/commerce/SizeChart.d.ts +0 -8
  218. package/dist/commerce/UpcomingEvents.d.ts +0 -9
  219. package/dist/commerce/api.d.ts +0 -179
  220. package/dist/commerce/events-extras.d.ts +0 -60
  221. package/dist/commerce/index.d.ts +0 -33
  222. package/dist/commerce/index.js +0 -8022
  223. package/dist/commerce/server.d.ts +0 -161
  224. package/dist/commerce/server.js +0 -2
  225. package/dist/commerce/types.d.ts +0 -340
  226. package/dist/commerce/useEventModal.d.ts +0 -20
  227. package/dist/commerce/utils.d.ts +0 -17
  228. package/dist/engage/EngageWidget.d.ts +0 -21
  229. package/dist/engage/index.d.ts +0 -14
  230. package/dist/engage/index.js +0 -45
  231. package/dist/engage/types.d.ts +0 -33
  232. package/dist/seo/ManagedContent.d.ts +0 -14
  233. package/dist/server-api-BVCBLJKL.js +0 -9
  234. package/dist/website/cms/server.d.ts +0 -2
  235. package/dist/website/cms/server.js +0 -5
  236. package/dist/website/cms-server.d.ts +0 -2
  237. package/dist/website/cms.d.ts +0 -2
  238. package/dist/website/cms.js +0 -5
  239. package/src/commerce/README.md +0 -109
@@ -3,9 +3,10 @@ import { useDeferredActivation } from './chunk-YC7ELZS3.js';
3
3
  import { withSiteBody } from './chunk-MJP63SSS.js';
4
4
  import './chunk-FESKKJAS.js';
5
5
  import './chunk-A4CC4ZG3.js';
6
- import { sonorFetch } from './chunk-BEBR4OJD.js';
7
- import './chunk-WGG6GTKW.js';
8
- import './chunk-56KNHB4U.js';
6
+ import { readPublishedApiConfig } from './chunk-3G7YABRA.js';
7
+ import { sonorFetch } from './chunk-56VDS2RP.js';
8
+ import './chunk-ZLFGXKLG.js';
9
+ import './chunk-5S2XDG5O.js';
9
10
  import './chunk-PKBMQBKP.js';
10
11
  import { useEffect } from 'react';
11
12
 
@@ -13,8 +14,8 @@ var SESSION_KEY_PREFIX = "__sonor_article_viewed__:";
13
14
  function trackArticleView(slug, site) {
14
15
  if (!slug || typeof window === "undefined") return;
15
16
  const w = window;
16
- const baseUrl = w.__SITE_KIT_API_URL__;
17
- if (!baseUrl || !w.__SITE_KIT_API_KEY__) return;
17
+ const { apiUrl: baseUrl, apiKey } = readPublishedApiConfig();
18
+ if (!baseUrl || !apiKey) return;
18
19
  const key = `${SESSION_KEY_PREFIX}${slug}`;
19
20
  try {
20
21
  if (sessionStorage.getItem(key)) return;
@@ -1,13 +1,14 @@
1
1
  'use client';
2
- import { getSiteDesignTokens } from './chunk-I2YX3HVD.js';
2
+ import { getSiteDesignTokens } from './chunk-KRBBH64S.js';
3
3
  import { DEFAULT_POPUP_TOKENS, PopupBlocks } from './chunk-BF7TZYC3.js';
4
4
  import { normalizePopupBlocks, toHexColor, readableOn } from './chunk-IHG36STL.js';
5
5
  import './chunk-S22FSH7C.js';
6
- import './chunk-43OCZ3JA.js';
6
+ import './chunk-CAH4Y4PY.js';
7
7
  import './chunk-EKBEOXTH.js';
8
- import './chunk-BEBR4OJD.js';
9
- import './chunk-WGG6GTKW.js';
10
- import './chunk-56KNHB4U.js';
8
+ import './chunk-3G7YABRA.js';
9
+ import './chunk-56VDS2RP.js';
10
+ import './chunk-ZLFGXKLG.js';
11
+ import './chunk-5S2XDG5O.js';
11
12
  import './chunk-PKBMQBKP.js';
12
13
  import { useState } from 'react';
13
14
  import { jsx } from 'react/jsx-runtime';
@@ -1,17 +1,20 @@
1
- export { ChatWidget, EchoChat, isChatEnabled } from './chunk-O5RGXTWU.js';
1
+ export { ChatWidget, EchoChat, isChatEnabled } from './chunk-GNSXOTIK.js';
2
2
  import './chunk-6T6CQVNL.js';
3
3
  import './chunk-JE4A5S4F.js';
4
4
  import './chunk-27FISYK4.js';
5
- import './chunk-EPT6FJUY.js';
5
+ import './chunk-UUWUAMUC.js';
6
6
  import './chunk-Q6E4OPGG.js';
7
+ import './chunk-5ROTTMBL.js';
7
8
  import './chunk-C2FZBUSS.js';
8
9
  import './chunk-5SQK3D53.js';
9
10
  import './chunk-HW7B43E5.js';
10
11
  import './chunk-NJCTQH2P.js';
11
12
  import './chunk-S22FSH7C.js';
12
13
  import './chunk-L2V5PUFN.js';
14
+ import './chunk-5TM3WPCI.js';
13
15
  import './chunk-GJWI74ZZ.js';
14
- import './chunk-BEBR4OJD.js';
15
- import './chunk-WGG6GTKW.js';
16
- import './chunk-56KNHB4U.js';
16
+ import './chunk-3G7YABRA.js';
17
+ import './chunk-56VDS2RP.js';
18
+ import './chunk-ZLFGXKLG.js';
19
+ import './chunk-5S2XDG5O.js';
17
20
  import './chunk-PKBMQBKP.js';
@@ -1,7 +1,8 @@
1
1
  'use client';
2
- import { sonorFetch } from './chunk-BEBR4OJD.js';
3
- import './chunk-WGG6GTKW.js';
4
- import './chunk-56KNHB4U.js';
2
+ import { getClientApiConfig } from './chunk-3G7YABRA.js';
3
+ import { sonorFetch } from './chunk-56VDS2RP.js';
4
+ import './chunk-ZLFGXKLG.js';
5
+ import './chunk-5S2XDG5O.js';
5
6
  import './chunk-PKBMQBKP.js';
6
7
  import React from 'react';
7
8
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -54,8 +55,7 @@ function FileField({
54
55
  ] });
55
56
  }
56
57
  async function uploadFormFile(file) {
57
- const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
58
- const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
58
+ const { apiUrl, apiKey } = getClientApiConfig();
59
59
  if (!apiKey) {
60
60
  throw new Error("API key is required to upload files.");
61
61
  }
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- import { StageStyles, SummaryTick } from './chunk-J4FSB4OG.js';
3
- import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-ZKHI4E2B.js';
4
- import { FormField } from './chunk-4NTBQNHA.js';
2
+ import { StageStyles, SummaryTick } from './chunk-3YKQLC7J.js';
3
+ import { stageFirstName, useFieldControls, stageViews, stageEstimate, AUTO_ADVANCE_TYPES } from './chunk-SBPAXWLF.js';
5
4
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
6
5
  import { isEmptyValue, unseenControlValues, isDisplayOnly } from './chunk-C2FZBUSS.js';
6
+ import { FormField } from './chunk-TYAVHRWH.js';
7
7
  import './chunk-HW7B43E5.js';
8
8
  import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
9
9
  import './chunk-PKBMQBKP.js';
@@ -1,9 +1,9 @@
1
1
  'use client';
2
- import { StageStyles, SummaryTick } from './chunk-J4FSB4OG.js';
3
- import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-ZKHI4E2B.js';
4
- import { FormField } from './chunk-4NTBQNHA.js';
2
+ import { StageStyles, SummaryTick } from './chunk-3YKQLC7J.js';
3
+ import { useFieldControls, stageViews, stageFirstName, stageEstimate, formatAnswer, AUTO_ADVANCE_TYPES } from './chunk-SBPAXWLF.js';
5
4
  import { readAgentSubmit, formToolAttributes } from './chunk-Q6E4OPGG.js';
6
5
  import { isEmptyValue, unseenControlValues } from './chunk-C2FZBUSS.js';
6
+ import { FormField } from './chunk-TYAVHRWH.js';
7
7
  import './chunk-HW7B43E5.js';
8
8
  import { DEFAULT_HONEYPOT_FIELD } from './chunk-NJCTQH2P.js';
9
9
  import './chunk-PKBMQBKP.js';
@@ -0,0 +1,19 @@
1
+ export { ManagedForm } from './chunk-LKH44GI3.js';
2
+ import './chunk-SBPAXWLF.js';
3
+ import './chunk-UUWUAMUC.js';
4
+ import './chunk-Q6E4OPGG.js';
5
+ import './chunk-5ROTTMBL.js';
6
+ import './chunk-C2FZBUSS.js';
7
+ import './chunk-DXO6SBMD.js';
8
+ import './chunk-TYAVHRWH.js';
9
+ import './chunk-5SQK3D53.js';
10
+ import './chunk-HW7B43E5.js';
11
+ import './chunk-NJCTQH2P.js';
12
+ import './chunk-L2V5PUFN.js';
13
+ import './chunk-5TM3WPCI.js';
14
+ import './chunk-GJWI74ZZ.js';
15
+ import './chunk-3G7YABRA.js';
16
+ import './chunk-56VDS2RP.js';
17
+ import './chunk-ZLFGXKLG.js';
18
+ import './chunk-5S2XDG5O.js';
19
+ import './chunk-PKBMQBKP.js';
@@ -1,16 +1,19 @@
1
- import { NewsletterShell } from './chunk-SC4MZGWZ.js';
2
- import './chunk-GYF2ULVO.js';
3
- import { useForm } from './chunk-EPT6FJUY.js';
1
+ import { useForm } from './chunk-UUWUAMUC.js';
4
2
  import './chunk-Q6E4OPGG.js';
3
+ import './chunk-5ROTTMBL.js';
5
4
  import './chunk-C2FZBUSS.js';
6
5
  import './chunk-5SQK3D53.js';
7
6
  import './chunk-HW7B43E5.js';
8
7
  import './chunk-NJCTQH2P.js';
8
+ import { NewsletterShell } from './chunk-SC4MZGWZ.js';
9
+ import './chunk-GYF2ULVO.js';
9
10
  import './chunk-L2V5PUFN.js';
11
+ import './chunk-5TM3WPCI.js';
10
12
  import './chunk-GJWI74ZZ.js';
11
- import './chunk-BEBR4OJD.js';
12
- import './chunk-WGG6GTKW.js';
13
- import './chunk-56KNHB4U.js';
13
+ import './chunk-3G7YABRA.js';
14
+ import './chunk-56VDS2RP.js';
15
+ import './chunk-ZLFGXKLG.js';
16
+ import './chunk-5S2XDG5O.js';
14
17
  import './chunk-PKBMQBKP.js';
15
18
  import { jsx } from 'react/jsx-runtime';
16
19
 
@@ -1,17 +1,17 @@
1
1
  'use client';
2
- import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-24QZEO3Q.js';
2
+ import { getOrCreateVisitorId, getOrCreateSessionId } from './chunk-ZKADJNR2.js';
3
3
  import { onPageLeave } from './chunk-L2V5PUFN.js';
4
+ import './chunk-5TM3WPCI.js';
4
5
  import './chunk-GJWI74ZZ.js';
5
- import { sonorFetch } from './chunk-BEBR4OJD.js';
6
- import { getFreshCredential, isSiteToken } from './chunk-WGG6GTKW.js';
7
- import './chunk-56KNHB4U.js';
6
+ import { getClientApiConfig } from './chunk-3G7YABRA.js';
7
+ import { sonorFetch } from './chunk-56VDS2RP.js';
8
+ import { getFreshCredential, isSiteToken } from './chunk-ZLFGXKLG.js';
9
+ import './chunk-5S2XDG5O.js';
8
10
  import './chunk-PKBMQBKP.js';
9
11
  import { useState, useRef, useEffect, useCallback } from 'react';
10
12
 
11
13
  function getApiConfig() {
12
- const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
13
- const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ : void 0;
14
- return { apiUrl, apiKey };
14
+ return getClientApiConfig();
15
15
  }
16
16
  function isDebug() {
17
17
  return typeof window !== "undefined" && !!window.__SITE_KIT_DEBUG__;
@@ -0,0 +1,6 @@
1
+ export { SiteChat } from './chunk-PD7K54EQ.js';
2
+ import './chunk-27FISYK4.js';
3
+ import './chunk-CAH4Y4PY.js';
4
+ import './chunk-EKBEOXTH.js';
5
+ import './chunk-3G7YABRA.js';
6
+ import './chunk-PKBMQBKP.js';
@@ -0,0 +1,12 @@
1
+ export { SiteDesignReporter } from './chunk-ZHNQFNO3.js';
2
+ import './chunk-KRBBH64S.js';
3
+ import './chunk-IHG36STL.js';
4
+ import './chunk-YC7ELZS3.js';
5
+ import './chunk-S22FSH7C.js';
6
+ import './chunk-CAH4Y4PY.js';
7
+ import './chunk-EKBEOXTH.js';
8
+ import './chunk-3G7YABRA.js';
9
+ import './chunk-56VDS2RP.js';
10
+ import './chunk-ZLFGXKLG.js';
11
+ import './chunk-5S2XDG5O.js';
12
+ import './chunk-PKBMQBKP.js';
@@ -0,0 +1,13 @@
1
+ export { SitePopups } from './chunk-S7SSYGUJ.js';
2
+ import './chunk-27FISYK4.js';
3
+ import './chunk-5ROTTMBL.js';
4
+ import './chunk-ZKADJNR2.js';
5
+ import './chunk-5TM3WPCI.js';
6
+ import './chunk-GJWI74ZZ.js';
7
+ import './chunk-CAH4Y4PY.js';
8
+ import './chunk-EKBEOXTH.js';
9
+ import './chunk-3G7YABRA.js';
10
+ import './chunk-56VDS2RP.js';
11
+ import './chunk-ZLFGXKLG.js';
12
+ import './chunk-5S2XDG5O.js';
13
+ import './chunk-PKBMQBKP.js';
@@ -0,0 +1,9 @@
1
+ export { SitemapSync } from './chunk-K22OLAPC.js';
2
+ import './chunk-YVKRYQRG.js';
3
+ import './chunk-CAH4Y4PY.js';
4
+ import './chunk-EKBEOXTH.js';
5
+ import './chunk-3G7YABRA.js';
6
+ import './chunk-56VDS2RP.js';
7
+ import './chunk-ZLFGXKLG.js';
8
+ import './chunk-5S2XDG5O.js';
9
+ import './chunk-PKBMQBKP.js';
@@ -1,7 +1,8 @@
1
1
  'use client';
2
- export { BookingWidget, BookingWidget_default as default } from '../chunk-L7U23XI2.js';
3
- import '../chunk-2ECWEUHP.js';
4
- import '../chunk-BEBR4OJD.js';
5
- import '../chunk-WGG6GTKW.js';
6
- import '../chunk-56KNHB4U.js';
2
+ export { BookingWidget, BookingWidget_default as default } from '../chunk-OGK7OL3T.js';
3
+ import '../chunk-IJQ767JS.js';
4
+ import '../chunk-3G7YABRA.js';
5
+ import '../chunk-56VDS2RP.js';
6
+ import '../chunk-ZLFGXKLG.js';
7
+ import '../chunk-5S2XDG5O.js';
7
8
  import '../chunk-PKBMQBKP.js';
@@ -8,4 +8,4 @@
8
8
  */
9
9
  import React from 'react';
10
10
  import type { TestimonialSectionProps } from '../reputation/types';
11
- export declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): React.JSX.Element | null;
11
+ export declare function TestimonialSection({ title, subtitle, autoplay, autoplayInterval, showRating, showPhoto, maxReviews, featuredOnly, service, className, }: TestimonialSectionProps): React.JSX.Element | null;
@@ -1,5 +1,7 @@
1
1
  'use client';
2
- export { TestimonialSection } from '../chunk-BR4ZKUHH.js';
3
- import '../chunk-EDYHROQ7.js';
2
+ export { TestimonialSection } from '../chunk-6CJGZFOU.js';
3
+ import '../chunk-CAT235HY.js';
4
+ import '../chunk-NFRJTOTB.js';
4
5
  import '../chunk-MH2DSGC6.js';
6
+ import '../chunk-3G7YABRA.js';
5
7
  import '../chunk-PKBMQBKP.js';
@@ -1,16 +1,16 @@
1
1
  'use client';
2
- import { sonorFetch } from '../chunk-BEBR4OJD.js';
3
- import '../chunk-WGG6GTKW.js';
4
- import '../chunk-56KNHB4U.js';
2
+ import { getClientApiConfig } from '../chunk-3G7YABRA.js';
3
+ import { sonorFetch } from '../chunk-56VDS2RP.js';
4
+ import '../chunk-ZLFGXKLG.js';
5
+ import '../chunk-5S2XDG5O.js';
5
6
  import '../chunk-PKBMQBKP.js';
6
7
  import { useState, useEffect } from 'react';
7
8
  import { jsx, jsxs } from 'react/jsx-runtime';
8
9
 
9
10
  // src/affiliates/api.ts
10
11
  function getApiConfig() {
11
- const apiUrl = typeof window !== "undefined" ? window.__SITE_KIT_API_URL__ || "https://api.sonor.io" : "https://api.sonor.io";
12
- const apiKey = typeof window !== "undefined" ? window.__SITE_KIT_API_KEY__ || "" : "";
13
- return { apiUrl, apiKey };
12
+ const { apiUrl, apiKey } = getClientApiConfig();
13
+ return { apiUrl, apiKey: apiKey ?? "" };
14
14
  }
15
15
  async function apiGet(endpoint) {
16
16
  const { apiUrl, apiKey } = getApiConfig();
@@ -1,13 +1,79 @@
1
1
  'use client';
2
- export { ContactTracking, useContactTracking } from '../chunk-P5GB6NEO.js';
3
- export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-MKMD2HJW.js';
2
+ export { AnalyticsProvider, WebVitals, useAnalytics, useAnalyticsOptional, useTrackEvent } from '../chunk-J65N34YM.js';
3
+ import { trackConversion } from '../chunk-LCDVPAMR.js';
4
4
  export { trackConversion, trackEvent } from '../chunk-LCDVPAMR.js';
5
- import '../chunk-24QZEO3Q.js';
5
+ import '../chunk-ZKADJNR2.js';
6
6
  import '../chunk-L2V5PUFN.js';
7
+ import '../chunk-5TM3WPCI.js';
7
8
  import '../chunk-GJWI74ZZ.js';
8
- export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-43OCZ3JA.js';
9
+ export { isCrossOriginFrame, isFramed, isTopFrameSameOrigin } from '../chunk-CAH4Y4PY.js';
9
10
  import '../chunk-EKBEOXTH.js';
10
- import '../chunk-BEBR4OJD.js';
11
- import '../chunk-WGG6GTKW.js';
12
- import '../chunk-56KNHB4U.js';
11
+ import '../chunk-3G7YABRA.js';
12
+ import '../chunk-56VDS2RP.js';
13
+ import '../chunk-ZLFGXKLG.js';
14
+ import '../chunk-5S2XDG5O.js';
13
15
  import '../chunk-PKBMQBKP.js';
16
+ import { useCallback, useEffect } from 'react';
17
+
18
+ function useContactTracking(options = {}) {
19
+ const { autoTrack = true, debug = false } = options;
20
+ const trackPhoneClick = useCallback((phoneNumber, metadata) => {
21
+ if (debug) console.log("[Analytics] Phone click:", phoneNumber);
22
+ trackConversion({
23
+ type: "phone_call",
24
+ metadata: {
25
+ phoneNumber: phoneNumber.replace(/\D/g, ""),
26
+ // Normalize to digits
27
+ rawNumber: phoneNumber,
28
+ ...metadata
29
+ }
30
+ });
31
+ }, [debug]);
32
+ const trackEmailClick = useCallback((email, metadata) => {
33
+ if (debug) console.log("[Analytics] Email click:", email);
34
+ trackConversion({
35
+ type: "email_click",
36
+ metadata: {
37
+ email,
38
+ ...metadata
39
+ }
40
+ });
41
+ }, [debug]);
42
+ useEffect(() => {
43
+ if (!autoTrack || typeof document === "undefined") return;
44
+ const handleClick = (e) => {
45
+ const target = e.target;
46
+ const anchor = target.closest("a");
47
+ if (!anchor) return;
48
+ const href = anchor.getAttribute("href");
49
+ if (!href) return;
50
+ if (href.startsWith("tel:")) {
51
+ const phone = href.replace("tel:", "").trim();
52
+ trackPhoneClick(phone, {
53
+ linkText: anchor.textContent?.trim(),
54
+ source: "auto"
55
+ });
56
+ } else if (href.startsWith("mailto:")) {
57
+ const email = href.replace("mailto:", "").split("?")[0].trim();
58
+ trackEmailClick(email, {
59
+ linkText: anchor.textContent?.trim(),
60
+ source: "auto"
61
+ });
62
+ }
63
+ };
64
+ document.addEventListener("click", handleClick, { capture: true });
65
+ return () => {
66
+ document.removeEventListener("click", handleClick, { capture: true });
67
+ };
68
+ }, [autoTrack, trackPhoneClick, trackEmailClick]);
69
+ return {
70
+ trackPhoneClick,
71
+ trackEmailClick
72
+ };
73
+ }
74
+ function ContactTracking({ debug = false }) {
75
+ useContactTracking({ autoTrack: true, debug });
76
+ return null;
77
+ }
78
+
79
+ export { ContactTracking, useContactTracking };
@@ -1,6 +1,6 @@
1
1
  'use client';
2
- export { ArticleFAQ } from '../chunk-GKGSXUVQ.js';
3
2
  import { NewsletterShell } from '../chunk-SC4MZGWZ.js';
3
+ export { ArticleFAQ } from '../chunk-GKGSXUVQ.js';
4
4
  import { getAuthorSocialLinks, readingTimeMinutes } from '../chunk-FV2VD7WM.js';
5
5
  export { ClusterNavigation, ServiceCallout, ServiceCallouts } from '../chunk-FV2VD7WM.js';
6
6
  import '../chunk-GYF2ULVO.js';
@@ -15,7 +15,7 @@ import '../chunk-PKBMQBKP.js';
15
15
  import React, { useState, Suspense, useEffect } from 'react';
16
16
  import { jsx, jsxs } from 'react/jsx-runtime';
17
17
 
18
- var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-TC5542ZG.js'));
18
+ var ManagedNewsletterForm = React.lazy(() => import('../ManagedNewsletterForm-DQIB5Z4Y.js'));
19
19
  function NewsletterWidget({
20
20
  title = "Subscribe to Our Newsletter",
21
21
  description = "Get the latest posts delivered straight to your inbox.",
@@ -2,7 +2,7 @@ import { readingTimeMinutes, ServiceCallouts, ClusterNavigation, getAuthorSocial
2
2
  export { ClusterNavigation } from '../chunk-FV2VD7WM.js';
3
3
  import { widgetStyle, widgetTitleStyle } from '../chunk-GYF2ULVO.js';
4
4
  import { resolvePublicationSiteUrl, addExternalLinkTargets } from '../chunk-L5UOHS6E.js';
5
- import { fetchArticleBySlug, fetchRelatedArticles, fetchArticleCategories, getTopicCluster } from '../chunk-PKGN32AU.js';
5
+ import { fetchArticleBySlug, fetchRelatedArticles, fetchArticleCategories, getTopicCluster } from '../chunk-XPTJRVL2.js';
6
6
  export { articleTableCss, wrapArticleTables } from '../chunk-Y3INC4QJ.js';
7
7
  import { resolveArticleArtwork, articleArtworkImageStyle } from '../chunk-QXMIKDOL.js';
8
8
  export { resolveArticleArtwork } from '../chunk-QXMIKDOL.js';
@@ -10,7 +10,7 @@ import { createPublicationRoutes, articleCategorySlug } from '../chunk-WMVK77ND.
10
10
  export { articleCategorySlug, createPublicationRoutes, resolveArticleUrl, resolvePublicationUrl } from '../chunk-WMVK77ND.js';
11
11
  import '../chunk-VWWITFWM.js';
12
12
  import { withSiteParam } from '../chunk-MJP63SSS.js';
13
- import '../chunk-X6F6SO4S.js';
13
+ import '../chunk-C7TLGL3R.js';
14
14
  import '../chunk-MH2DSGC6.js';
15
15
  import '../chunk-YVKRYQRG.js';
16
16
  import '../chunk-FESKKJAS.js';
@@ -133,7 +133,7 @@ async function Article({
133
133
  ...item,
134
134
  answer: addExternalLinkTargets(item.answer || "", siteUrlResolved)
135
135
  })) ?? faqRaw;
136
- const { ArticleViewTracker } = await import('../ArticleViewTracker-GFOAXFV7.js');
136
+ const { ArticleViewTracker } = await import('../ArticleViewTracker-HG7IIRJY.js');
137
137
  if (children) {
138
138
  return /* @__PURE__ */ jsxs(Fragment, { children: [
139
139
  /* @__PURE__ */ jsx(ArticleViewTracker, { slug: post.slug, site }),
@@ -1,10 +1,10 @@
1
- export { FEED_DEFAULT_ITEMS, NEWS_SITEMAP_MAX_URLS, NEWS_SITEMAP_WINDOW_MS, SEO_LIMITS, buildNewsSitemapXml, cdata, generateAllArticleSchemas, generateArticleCategoryMetadata, generateArticleListSchema, generateArticleMetadata, generateArticleSchema, generateArticleSitemap, generateArticleStaticParams, generateAtomFeed, generateAuthorPageMetadata, generateAuthorStaticParams, generateBreadcrumbSchema, generateCategoryStaticParams, generateClusterArticleSchema, generateClusterBreadcrumbSchema, generateClusterItemListSchema, generateClusterLandingSchema, generateClusterPageMetadata, generateFaqSchema, generateHowToSchema, generateNewsSitemap, generatePublicationMetadata, generateRssFeed, getAllArticleSlugs, getAllArticles, getAllAuthorSlugs, getArticle, getArticleCategories, getAuthorBySlug, getAuthorPosts, getClusterNavigation, getPostsByCategory, getRelatedInsights, getTopicCluster, getTopicClusters, recentNewsPosts, requireArticle, sanitizeExcerpt, validateArticleSeo, validateMetaDescription, validateSeoTitle } from '../chunk-PKGN32AU.js';
1
+ export { FEED_DEFAULT_ITEMS, NEWS_SITEMAP_MAX_URLS, NEWS_SITEMAP_WINDOW_MS, SEO_LIMITS, buildNewsSitemapXml, cdata, generateAllArticleSchemas, generateArticleCategoryMetadata, generateArticleListSchema, generateArticleMetadata, generateArticleSchema, generateArticleSitemap, generateArticleStaticParams, generateAtomFeed, generateAuthorPageMetadata, generateAuthorStaticParams, generateBreadcrumbSchema, generateCategoryStaticParams, generateClusterArticleSchema, generateClusterBreadcrumbSchema, generateClusterItemListSchema, generateClusterLandingSchema, generateClusterPageMetadata, generateFaqSchema, generateHowToSchema, generateNewsSitemap, generatePublicationMetadata, generateRssFeed, getAllArticleSlugs, getAllArticles, getAllAuthorSlugs, getArticle, getArticleCategories, getAuthorBySlug, getAuthorPosts, getClusterNavigation, getPostsByCategory, getRelatedInsights, getTopicCluster, getTopicClusters, recentNewsPosts, requireArticle, sanitizeExcerpt, validateArticleSeo, validateMetaDescription, validateSeoTitle } from '../chunk-XPTJRVL2.js';
2
2
  export { articleTableCss, wrapArticleTables } from '../chunk-Y3INC4QJ.js';
3
3
  export { authorEntityId, generateArticleAuthorNode, generateAuthorPersonSchema, generateAuthorSchema, resolveArticleArtwork, withArticleAuthorIdentity } from '../chunk-QXMIKDOL.js';
4
4
  export { articleCategorySlug, createPublicationRoutes, resolveArticleUrl, resolvePublicationUrl } from '../chunk-WMVK77ND.js';
5
5
  import '../chunk-VWWITFWM.js';
6
6
  import '../chunk-MJP63SSS.js';
7
- import '../chunk-X6F6SO4S.js';
7
+ import '../chunk-C7TLGL3R.js';
8
8
  import '../chunk-MH2DSGC6.js';
9
9
  import '../chunk-FESKKJAS.js';
10
10
  import '../chunk-A4CC4ZG3.js';
package/dist/brand.css CHANGED
@@ -13,7 +13,7 @@
13
13
  * --sk-primary-rgb: 84, 185, 72;
14
14
  * }
15
15
  *
16
- * All site-kit components (forms, commerce, booking, chat, popups, blog)
16
+ * All site-kit components (forms, booking, chat, popups, blog) and the kits that build on it (commerce-kit)
17
17
  * read from these tokens. Set them once and every widget matches your brand.
18
18
  */
19
19
 
@@ -4,7 +4,7 @@
4
4
  * The chat launcher and Echo conversation a site shows. SiteKitLayout mounts
5
5
  * it for you (its `chat` prop); `SiteChat` places it yourself the same way
6
6
  * (idle-deferred, gated like analytics), and `ChatWidget` is the widget
7
- * itself. `@sonordev/site-kit/engage` (deprecated) re-exports these.
7
+ * itself.
8
8
  */
9
9
  export { SiteChat, type SiteChatProps } from './SiteChat';
10
10
  export { ChatWidget, EchoChat, isChatEnabled } from './ChatWidget';
@@ -1,22 +1,53 @@
1
1
  'use client';
2
- export { SONOR_PUBLIC_ECHO_DEFAULTS, getEchoWidgetProps } from '../chunk-HODO5BX5.js';
3
- export { ChatWidget, DEFAULT_LAUNCHER_OFFSET_BOTTOM, EchoChat, chatLauncherStyles, isChatEnabled } from '../chunk-O5RGXTWU.js';
4
- export { SiteChat } from '../chunk-RDPW4D33.js';
2
+ export { ChatWidget, DEFAULT_LAUNCHER_OFFSET_BOTTOM, EchoChat, chatLauncherStyles, isChatEnabled } from '../chunk-GNSXOTIK.js';
3
+ export { SiteChat } from '../chunk-PD7K54EQ.js';
5
4
  import '../chunk-6T6CQVNL.js';
6
5
  import '../chunk-JE4A5S4F.js';
7
6
  import '../chunk-27FISYK4.js';
8
- import '../chunk-EPT6FJUY.js';
7
+ import '../chunk-UUWUAMUC.js';
9
8
  import '../chunk-Q6E4OPGG.js';
9
+ import '../chunk-5ROTTMBL.js';
10
10
  import '../chunk-C2FZBUSS.js';
11
11
  import '../chunk-5SQK3D53.js';
12
12
  import '../chunk-HW7B43E5.js';
13
13
  import '../chunk-NJCTQH2P.js';
14
14
  import '../chunk-S22FSH7C.js';
15
15
  import '../chunk-L2V5PUFN.js';
16
+ import '../chunk-5TM3WPCI.js';
16
17
  import '../chunk-GJWI74ZZ.js';
17
- import '../chunk-43OCZ3JA.js';
18
+ import '../chunk-CAH4Y4PY.js';
18
19
  import '../chunk-EKBEOXTH.js';
19
- import '../chunk-BEBR4OJD.js';
20
- import '../chunk-WGG6GTKW.js';
21
- import '../chunk-56KNHB4U.js';
20
+ import '../chunk-3G7YABRA.js';
21
+ import '../chunk-56VDS2RP.js';
22
+ import '../chunk-ZLFGXKLG.js';
23
+ import '../chunk-5S2XDG5O.js';
22
24
  import '../chunk-PKBMQBKP.js';
25
+
26
+ // src/chat/echo-config.ts
27
+ var SONOR_PUBLIC_ECHO_DEFAULTS = {
28
+ signalUrl: "https://signal.sonor.io",
29
+ welcomeMessage: "Hi! I'm Echo, Sonor's AI assistant. I can answer questions about our platform, help you understand pricing, or get you started with a demo. What would you like to know?",
30
+ suggestedQuestions: [
31
+ "What does Sonor do?",
32
+ "How does Signal AI work?",
33
+ "What are the pricing plans?",
34
+ "Can I migrate from HubSpot?",
35
+ "How does the SEO module work?"
36
+ ],
37
+ brandColor: "#2563eb",
38
+ // blue-600 (~5.2:1 on white, AA); overridden by --sk-primary CSS var or API brand_primary
39
+ assistantName: "Echo"
40
+ };
41
+ function getEchoWidgetProps(config = SONOR_PUBLIC_ECHO_DEFAULTS) {
42
+ return {
43
+ signal_enabled: true,
44
+ signal_url: config.signalUrl || SONOR_PUBLIC_ECHO_DEFAULTS.signalUrl,
45
+ welcome_message: config.welcomeMessage || SONOR_PUBLIC_ECHO_DEFAULTS.welcomeMessage,
46
+ suggested_questions: config.suggestedQuestions || SONOR_PUBLIC_ECHO_DEFAULTS.suggestedQuestions,
47
+ brand_color: config.brandColor || SONOR_PUBLIC_ECHO_DEFAULTS.brandColor,
48
+ assistant_name: config.assistantName || SONOR_PUBLIC_ECHO_DEFAULTS.assistantName,
49
+ assistant_avatar: config.assistantAvatar
50
+ };
51
+ }
52
+
53
+ export { SONOR_PUBLIC_ECHO_DEFAULTS, getEchoWidgetProps };
@@ -0,0 +1,25 @@
1
+ // src/shared/clientApiConfig.ts
2
+ var DEFAULT_SONOR_API_URL = "https://api.sonor.io";
3
+ function trimSlash(url) {
4
+ return url.replace(/\/+$/, "");
5
+ }
6
+ function siteKitWindow() {
7
+ return typeof window === "undefined" ? void 0 : window;
8
+ }
9
+ function readPublishedApiConfig() {
10
+ const w = siteKitWindow();
11
+ const apiUrl = w?.__SITE_KIT_API_URL__ ? trimSlash(w.__SITE_KIT_API_URL__) : void 0;
12
+ return { apiUrl, apiKey: w?.__SITE_KIT_API_KEY__ || void 0 };
13
+ }
14
+ function getClientApiConfig(options = {}) {
15
+ if (typeof window === "undefined") {
16
+ return {
17
+ apiUrl: trimSlash(process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_SONOR_API_URL || DEFAULT_SONOR_API_URL),
18
+ apiKey: options.serverKey ? process.env.SONOR_API_KEY || void 0 : void 0
19
+ };
20
+ }
21
+ const published = readPublishedApiConfig();
22
+ return { apiUrl: published.apiUrl || DEFAULT_SONOR_API_URL, apiKey: published.apiKey };
23
+ }
24
+
25
+ export { DEFAULT_SONOR_API_URL, getClientApiConfig, readPublishedApiConfig };
@@ -1,7 +1,7 @@
1
1
  import { SLOTS_CONTRACT_VERSION, verifySlotContent, canonicalJson } from './chunk-VCJYLYJV.js';
2
2
  import { isValidSlotId, SLOT_CONTENT_MAX_LENGTH, parseSlotRichText, normalizeSlotValue } from './chunk-LPH5FANE.js';
3
- import { SITE_CACHE_TAGS } from './chunk-RYVDGXC2.js';
4
- import { resolveServerApiConfig } from './chunk-X6F6SO4S.js';
3
+ import { SITE_CACHE_TAGS } from './chunk-6KU7STM3.js';
4
+ import { resolveServerApiConfig } from './chunk-C7TLGL3R.js';
5
5
  import 'server-only';
6
6
  import * as React from 'react';
7
7
  import { cache } from 'react';
@@ -96,9 +96,12 @@ var CSS = `
96
96
  }
97
97
  .sk-stage__summary:hover,
98
98
  .sk-stage__summary:focus-visible { background: color-mix(in srgb, currentColor 7%, transparent); }
99
+ /* The step number and a settled label stay dimmer than the label (.72) but
100
+ no lower than .62: at .5, near-black text on white measured 3.43:1 live,
101
+ under WCAG AA's 4.5:1. .62 gives ~5:1 on the same text. */
99
102
  .sk-stage__summary-idx {
100
103
  font-size: 11px; font-weight: 700; letter-spacing: .06em;
101
- font-variant-numeric: tabular-nums; opacity: .5; flex-shrink: 0;
104
+ font-variant-numeric: tabular-nums; opacity: .62; flex-shrink: 0;
102
105
  }
103
106
  .sk-stage__summary-label {
104
107
  font-size: 12px; font-weight: 700; letter-spacing: .07em; text-transform: uppercase;
@@ -118,7 +121,7 @@ var CSS = `
118
121
  }
119
122
  }
120
123
  .sk-stage__summary-value--skipped { font-weight: 400; font-style: italic; opacity: .6; }
121
- .sk-stage__beat[data-sk-beat-filled="true"] .sk-stage__summary-label { opacity: .55; }
124
+ .sk-stage__beat[data-sk-beat-filled="true"] .sk-stage__summary-label { opacity: .62; }
122
125
  .sk-stage__summary-tick {
123
126
  width: 15px; height: 15px; border-radius: 50%; flex-shrink: 0; align-self: center;
124
127
  background: color-mix(in srgb, var(--sk-primary, #2563eb) 72%, currentColor);
@@ -1,5 +1,5 @@
1
- import { isTokenMode, getFreshCredential, isSiteToken, refreshSiteToken, currentCredential, credentialBreakerId } from './chunk-WGG6GTKW.js';
2
- import { SITE_KIT_VERSION } from './chunk-56KNHB4U.js';
1
+ import { isTokenMode, getFreshCredential, isSiteToken, refreshSiteToken, currentCredential, credentialBreakerId } from './chunk-ZLFGXKLG.js';
2
+ import { SITE_KIT_VERSION } from './chunk-5S2XDG5O.js';
3
3
 
4
4
  // src/shared/fetchWithRetry.ts
5
5
  function backoffDelay(attempt, response) {
@@ -0,0 +1,19 @@
1
+ import { memoryIdentity, VISITOR_ID_KEY, SESSION_ID_KEY } from './chunk-5TM3WPCI.js';
2
+
3
+ // src/shared/identity-reader.ts
4
+ function readKey(kind, key) {
5
+ try {
6
+ return window[kind].getItem(key) || null;
7
+ } catch {
8
+ return null;
9
+ }
10
+ }
11
+ function readAnalyticsIdentity() {
12
+ if (typeof window === "undefined") return { sessionId: null, visitorId: null };
13
+ return {
14
+ sessionId: readKey("sessionStorage", SESSION_ID_KEY) || memoryIdentity.sessionId || null,
15
+ visitorId: readKey("localStorage", VISITOR_ID_KEY) || memoryIdentity.visitorId || null
16
+ };
17
+ }
18
+
19
+ export { readAnalyticsIdentity };
@@ -1,4 +1,4 @@
1
1
  // src/shared/version.ts
2
- var SITE_KIT_VERSION = "7.3.0";
2
+ var SITE_KIT_VERSION = "8.0.0";
3
3
 
4
4
  export { SITE_KIT_VERSION };