@sonordev/site-kit 3.3.1 → 3.5.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 (257) hide show
  1. package/README.md +2 -2
  2. package/agent-manifest.json +13 -1
  3. package/dist/AnalyticsProvider-35EDQA5V.js +31 -0
  4. package/dist/{AnalyticsProvider-PLGTU56K.js.map → AnalyticsProvider-35EDQA5V.js.map} +1 -1
  5. package/dist/AnalyticsProvider-V5CWTWWO.mjs +10 -0
  6. package/dist/{AnalyticsProvider-3MZ3O5OB.mjs.map → AnalyticsProvider-V5CWTWWO.mjs.map} +1 -1
  7. package/dist/ChatWidget-2OK6DD66.js +19 -0
  8. package/dist/{ChatWidget-FQARJMGU.js.map → ChatWidget-2OK6DD66.js.map} +1 -1
  9. package/dist/ChatWidget-WNT6VNJK.mjs +10 -0
  10. package/dist/{ChatWidget-7JHVRNVE.mjs.map → ChatWidget-WNT6VNJK.mjs.map} +1 -1
  11. package/dist/EngageWidget-7RZIC426.js +18 -0
  12. package/dist/{EngageWidget-DQ62NQPU.js.map → EngageWidget-7RZIC426.js.map} +1 -1
  13. package/dist/EngageWidget-GWME22IP.mjs +9 -0
  14. package/dist/{EngageWidget-VXQOZOYA.mjs.map → EngageWidget-GWME22IP.mjs.map} +1 -1
  15. package/dist/{SignalCore-3SG3LFQL.js → SignalCore-DK4HQBPY.js} +62 -43
  16. package/dist/SignalCore-DK4HQBPY.js.map +1 -0
  17. package/dist/{SignalCore-BKG66B4C.mjs → SignalCore-TW4YA3BW.mjs} +56 -37
  18. package/dist/SignalCore-TW4YA3BW.mjs.map +1 -0
  19. package/dist/SitemapSync-7PXQMF5A.mjs +8 -0
  20. package/dist/{SitemapSync-IO2VOR23.mjs.map → SitemapSync-7PXQMF5A.mjs.map} +1 -1
  21. package/dist/SitemapSync-O3J2DPV7.js +17 -0
  22. package/dist/{SitemapSync-DWX7I6MX.js.map → SitemapSync-O3J2DPV7.js.map} +1 -1
  23. package/dist/analytics/index.js +14 -12
  24. package/dist/analytics/index.mjs +7 -5
  25. package/dist/blog/index.d.mts +3 -3
  26. package/dist/blog/index.d.ts +3 -3
  27. package/dist/blog/index.js +11 -15
  28. package/dist/blog/index.js.map +1 -1
  29. package/dist/blog/index.mjs +2 -2
  30. package/dist/blog/index.mjs.map +1 -1
  31. package/dist/blog/server-ui.d.mts +1 -1
  32. package/dist/blog/server-ui.d.ts +1 -1
  33. package/dist/blog/server-ui.js +198 -9
  34. package/dist/blog/server-ui.js.map +1 -1
  35. package/dist/blog/server-ui.mjs +198 -2
  36. package/dist/blog/server-ui.mjs.map +1 -1
  37. package/dist/blog/server.d.mts +27 -8
  38. package/dist/blog/server.d.ts +27 -8
  39. package/dist/blog/server.js +45 -43
  40. package/dist/blog/server.mjs +3 -1
  41. package/dist/{chunk-QW3T6WH2.mjs → chunk-2NA5CAK5.mjs} +3 -3
  42. package/dist/{chunk-QW3T6WH2.mjs.map → chunk-2NA5CAK5.mjs.map} +1 -1
  43. package/dist/{chunk-WN5A3KSY.mjs → chunk-34IUDOBC.mjs} +2 -2
  44. package/dist/{chunk-WN5A3KSY.mjs.map → chunk-34IUDOBC.mjs.map} +1 -1
  45. package/dist/{chunk-3WRE7ZDC.js → chunk-3KEZ2YHQ.js} +8 -8
  46. package/dist/{chunk-3WRE7ZDC.js.map → chunk-3KEZ2YHQ.js.map} +1 -1
  47. package/dist/{chunk-NQ3K4NWX.mjs → chunk-5WQHWBCW.mjs} +11 -30
  48. package/dist/chunk-5WQHWBCW.mjs.map +1 -0
  49. package/dist/chunk-6EDVCUAG.mjs +29 -0
  50. package/dist/chunk-6EDVCUAG.mjs.map +1 -0
  51. package/dist/{chunk-ZFF3BKNE.mjs → chunk-6JVDIW5L.mjs} +4 -4
  52. package/dist/{chunk-ZFF3BKNE.mjs.map → chunk-6JVDIW5L.mjs.map} +1 -1
  53. package/dist/{chunk-7TX5BKVA.js → chunk-6T4NVCAT.js} +2 -2
  54. package/dist/{chunk-7TX5BKVA.js.map → chunk-6T4NVCAT.js.map} +1 -1
  55. package/dist/{chunk-OC64AHKN.mjs → chunk-7FZWMAI2.mjs} +3 -3
  56. package/dist/{chunk-OC64AHKN.mjs.map → chunk-7FZWMAI2.mjs.map} +1 -1
  57. package/dist/{chunk-EE6SFAZP.mjs → chunk-AX4AROLH.mjs} +5 -14
  58. package/dist/chunk-AX4AROLH.mjs.map +1 -0
  59. package/dist/chunk-BNJH2RFU.mjs +139 -0
  60. package/dist/chunk-BNJH2RFU.mjs.map +1 -0
  61. package/dist/{chunk-WZHWWOUC.js → chunk-BX6FFL2Y.js} +6 -16
  62. package/dist/chunk-BX6FFL2Y.js.map +1 -0
  63. package/dist/chunk-CGCYZJYX.mjs +41 -0
  64. package/dist/chunk-CGCYZJYX.mjs.map +1 -0
  65. package/dist/{chunk-PIV54R2O.js → chunk-CTPE3G5W.js} +5 -5
  66. package/dist/{chunk-PIV54R2O.js.map → chunk-CTPE3G5W.js.map} +1 -1
  67. package/dist/chunk-CXDIWBIQ.js +78 -0
  68. package/dist/chunk-CXDIWBIQ.js.map +1 -0
  69. package/dist/chunk-DWVF7SEK.mjs +35 -0
  70. package/dist/chunk-DWVF7SEK.mjs.map +1 -0
  71. package/dist/{chunk-C4JAMON3.js → chunk-EH7QQU6P.js} +15 -15
  72. package/dist/{chunk-C4JAMON3.js.map → chunk-EH7QQU6P.js.map} +1 -1
  73. package/dist/chunk-EU2UGO25.js +52 -0
  74. package/dist/chunk-EU2UGO25.js.map +1 -0
  75. package/dist/{chunk-X4OPM3SK.mjs → chunk-GU5OTUQS.mjs} +5 -14
  76. package/dist/chunk-GU5OTUQS.mjs.map +1 -0
  77. package/dist/{chunk-SH4VZDVX.mjs → chunk-GUXB3QH7.mjs} +38 -67
  78. package/dist/chunk-GUXB3QH7.mjs.map +1 -0
  79. package/dist/{chunk-JD6LV6JZ.mjs → chunk-HRJ65XKY.mjs} +3 -3
  80. package/dist/{chunk-JD6LV6JZ.mjs.map → chunk-HRJ65XKY.mjs.map} +1 -1
  81. package/dist/chunk-IBMOX3YE.mjs +48 -0
  82. package/dist/chunk-IBMOX3YE.mjs.map +1 -0
  83. package/dist/{chunk-TXEOLHMC.js → chunk-IMDSDDRU.js} +4 -4
  84. package/dist/{chunk-TXEOLHMC.js.map → chunk-IMDSDDRU.js.map} +1 -1
  85. package/dist/{chunk-25YPXQBA.mjs → chunk-INGAARGC.mjs} +8 -25
  86. package/dist/chunk-INGAARGC.mjs.map +1 -0
  87. package/dist/{chunk-3AG6O3IA.mjs → chunk-LZSHZVBE.mjs} +49 -5
  88. package/dist/chunk-LZSHZVBE.mjs.map +1 -0
  89. package/dist/chunk-MJDYY6S3.mjs +76 -0
  90. package/dist/chunk-MJDYY6S3.mjs.map +1 -0
  91. package/dist/{chunk-BMKZHXWQ.js → chunk-MMON6EVI.js} +3 -194
  92. package/dist/chunk-MMON6EVI.js.map +1 -0
  93. package/dist/chunk-NB4MK2Q5.js +18 -0
  94. package/dist/chunk-NB4MK2Q5.js.map +1 -0
  95. package/dist/{chunk-DIXWP4BO.mjs → chunk-NBI5AV6U.mjs} +3 -3
  96. package/dist/{chunk-DIXWP4BO.mjs.map → chunk-NBI5AV6U.mjs.map} +1 -1
  97. package/dist/chunk-NI7OY4FW.mjs +16 -0
  98. package/dist/chunk-NI7OY4FW.mjs.map +1 -0
  99. package/dist/chunk-NME3SQCB.js +8 -0
  100. package/dist/{chunk-3X2YPJU5.js.map → chunk-NME3SQCB.js.map} +1 -1
  101. package/dist/{chunk-4JMXBIUC.js → chunk-PE2A3ON5.js} +16 -35
  102. package/dist/chunk-PE2A3ON5.js.map +1 -0
  103. package/dist/{chunk-BOWR5QEV.js → chunk-PWIBFSXK.js} +14 -14
  104. package/dist/{chunk-BOWR5QEV.js.map → chunk-PWIBFSXK.js.map} +1 -1
  105. package/dist/{chunk-4ROFY6PM.js → chunk-Q2SPOBHU.js} +61 -17
  106. package/dist/chunk-Q2SPOBHU.js.map +1 -0
  107. package/dist/chunk-QGPYFC6G.mjs +6 -0
  108. package/dist/{chunk-K6YGF2KJ.mjs.map → chunk-QGPYFC6G.mjs.map} +1 -1
  109. package/dist/{chunk-FSYXHIAI.js → chunk-SQGDDITI.js} +14 -14
  110. package/dist/{chunk-FSYXHIAI.js.map → chunk-SQGDDITI.js.map} +1 -1
  111. package/dist/{chunk-S2N3NSC7.mjs → chunk-STTSIODQ.mjs} +5 -5
  112. package/dist/{chunk-S2N3NSC7.mjs.map → chunk-STTSIODQ.mjs.map} +1 -1
  113. package/dist/{chunk-QRIGY6EM.js → chunk-T3RPPS25.js} +7 -7
  114. package/dist/{chunk-QRIGY6EM.js.map → chunk-T3RPPS25.js.map} +1 -1
  115. package/dist/{chunk-DNW7FTJD.js → chunk-TBMFLLRV.js} +9 -9
  116. package/dist/{chunk-DNW7FTJD.js.map → chunk-TBMFLLRV.js.map} +1 -1
  117. package/dist/{chunk-YFYMOQAX.js → chunk-TJS6FPR7.js} +14 -31
  118. package/dist/chunk-TJS6FPR7.js.map +1 -0
  119. package/dist/chunk-TPL2IHFI.js +43 -0
  120. package/dist/chunk-TPL2IHFI.js.map +1 -0
  121. package/dist/chunk-TRTT4PND.js +38 -0
  122. package/dist/chunk-TRTT4PND.js.map +1 -0
  123. package/dist/{chunk-QFWBAGBT.mjs → chunk-UFOOVODL.mjs} +3 -3
  124. package/dist/{chunk-QFWBAGBT.mjs.map → chunk-UFOOVODL.mjs.map} +1 -1
  125. package/dist/chunk-UXEB6UAR.js +147 -0
  126. package/dist/chunk-UXEB6UAR.js.map +1 -0
  127. package/dist/{chunk-MLD3EGM2.mjs → chunk-V37Z65NF.mjs} +3 -3
  128. package/dist/{chunk-MLD3EGM2.mjs.map → chunk-V37Z65NF.mjs.map} +1 -1
  129. package/dist/chunk-VJMPIRSD.js +31 -0
  130. package/dist/chunk-VJMPIRSD.js.map +1 -0
  131. package/dist/chunk-VX3WK77I.mjs +126 -0
  132. package/dist/chunk-VX3WK77I.mjs.map +1 -0
  133. package/dist/{chunk-AB2VYIYU.mjs → chunk-WTR7QJ32.mjs} +4 -194
  134. package/dist/chunk-WTR7QJ32.mjs.map +1 -0
  135. package/dist/{chunk-IB4FRJDV.js → chunk-XAWB2HFQ.js} +37 -67
  136. package/dist/chunk-XAWB2HFQ.js.map +1 -0
  137. package/dist/{chunk-3BNFUMLL.js → chunk-XB57AM6T.js} +5 -14
  138. package/dist/chunk-XB57AM6T.js.map +1 -0
  139. package/dist/chunk-XY4NJJEX.js +129 -0
  140. package/dist/chunk-XY4NJJEX.js.map +1 -0
  141. package/dist/{chunk-FMQHK6MM.js → chunk-Y4U3OCKH.js} +3 -3
  142. package/dist/{chunk-FMQHK6MM.js.map → chunk-Y4U3OCKH.js.map} +1 -1
  143. package/dist/{chunk-ZYIONE7A.mjs → chunk-YKPAFEJ4.mjs} +4 -4
  144. package/dist/{chunk-ZYIONE7A.mjs.map → chunk-YKPAFEJ4.mjs.map} +1 -1
  145. package/dist/{chunk-7OROUYZH.mjs → chunk-YSDJ7HI3.mjs} +4 -4
  146. package/dist/{chunk-7OROUYZH.mjs.map → chunk-YSDJ7HI3.mjs.map} +1 -1
  147. package/dist/{chunk-PCDAVHVX.js → chunk-ZY3G7JGT.js} +8 -8
  148. package/dist/{chunk-PCDAVHVX.js.map → chunk-ZY3G7JGT.js.map} +1 -1
  149. package/dist/cli/index.js +2 -2
  150. package/dist/cli/index.mjs +1 -1
  151. package/dist/client/index.d.mts +15 -1
  152. package/dist/client/index.d.ts +15 -1
  153. package/dist/client/index.js +21 -6
  154. package/dist/client/index.js.map +1 -1
  155. package/dist/client/index.mjs +19 -1
  156. package/dist/client/index.mjs.map +1 -1
  157. package/dist/commerce/index.js +53 -51
  158. package/dist/commerce/index.mjs +8 -6
  159. package/dist/engage/index.js +11 -9
  160. package/dist/engage/index.js.map +1 -1
  161. package/dist/engage/index.mjs +8 -6
  162. package/dist/engage/index.mjs.map +1 -1
  163. package/dist/fleet/index.js +8 -7
  164. package/dist/fleet/index.mjs +4 -3
  165. package/dist/forms/index.js +14 -12
  166. package/dist/forms/index.js.map +1 -1
  167. package/dist/forms/index.mjs +6 -4
  168. package/dist/forms/index.mjs.map +1 -1
  169. package/dist/images/index.js +11 -10
  170. package/dist/images/index.mjs +4 -3
  171. package/dist/index.d.mts +2 -1
  172. package/dist/index.d.ts +2 -1
  173. package/dist/index.js +75 -64
  174. package/dist/index.js.map +1 -1
  175. package/dist/index.mjs +13 -10
  176. package/dist/index.mjs.map +1 -1
  177. package/dist/landing/index.d.mts +21 -0
  178. package/dist/landing/index.d.ts +21 -0
  179. package/dist/landing/index.js +21 -0
  180. package/dist/landing/index.js.map +1 -0
  181. package/dist/landing/index.mjs +4 -0
  182. package/dist/landing/index.mjs.map +1 -0
  183. package/dist/layout/client.js +11 -8
  184. package/dist/layout/client.mjs +10 -7
  185. package/dist/layout/index.js +13 -54
  186. package/dist/layout/index.js.map +1 -1
  187. package/dist/layout/index.mjs +11 -52
  188. package/dist/layout/index.mjs.map +1 -1
  189. package/dist/llms/index.js +12 -12
  190. package/dist/llms/index.mjs +2 -2
  191. package/dist/maps/index.js +5 -4
  192. package/dist/maps/index.js.map +1 -1
  193. package/dist/maps/index.mjs +3 -2
  194. package/dist/maps/index.mjs.map +1 -1
  195. package/dist/metadata-D_GiY8LJ.d.mts +36 -0
  196. package/dist/metadata-D_GiY8LJ.d.ts +36 -0
  197. package/dist/middleware/index.js +2 -8
  198. package/dist/middleware/index.js.map +1 -1
  199. package/dist/middleware/index.mjs +2 -8
  200. package/dist/middleware/index.mjs.map +1 -1
  201. package/dist/seo/client.js +5 -4
  202. package/dist/seo/client.mjs +4 -3
  203. package/dist/seo/index.js +5 -4
  204. package/dist/seo/index.js.map +1 -1
  205. package/dist/seo/index.mjs +4 -3
  206. package/dist/seo/index.mjs.map +1 -1
  207. package/dist/seo-pages/contract.js +6 -5
  208. package/dist/seo-pages/contract.js.map +1 -1
  209. package/dist/seo-pages/contract.mjs +2 -1
  210. package/dist/seo-pages/contract.mjs.map +1 -1
  211. package/dist/server/index.d.mts +34 -1
  212. package/dist/server/index.d.ts +34 -1
  213. package/dist/server/index.js +6 -0
  214. package/dist/server/index.mjs +2 -0
  215. package/dist/signal/index.js +11 -11
  216. package/dist/signal/index.mjs +2 -2
  217. package/dist/sitemap/index.js +2 -2
  218. package/dist/sitemap/index.mjs +1 -1
  219. package/dist/sites/contract.d.mts +36 -12
  220. package/dist/sites/contract.d.ts +36 -12
  221. package/dist/sites/contract.js +12 -11
  222. package/dist/sites/contract.mjs +2 -1
  223. package/dist/sync/index.js +16 -15
  224. package/dist/sync/index.mjs +4 -3
  225. package/dist/{types-DYOumpUT.d.mts → types-8IcjVMDa.d.mts} +1 -1
  226. package/dist/{types-DYOumpUT.d.ts → types-8IcjVMDa.d.ts} +1 -1
  227. package/package.json +11 -1
  228. package/dist/AnalyticsProvider-3MZ3O5OB.mjs +0 -8
  229. package/dist/AnalyticsProvider-PLGTU56K.js +0 -29
  230. package/dist/ChatWidget-7JHVRNVE.mjs +0 -8
  231. package/dist/ChatWidget-FQARJMGU.js +0 -17
  232. package/dist/EngageWidget-DQ62NQPU.js +0 -16
  233. package/dist/EngageWidget-VXQOZOYA.mjs +0 -7
  234. package/dist/SignalCore-3SG3LFQL.js.map +0 -1
  235. package/dist/SignalCore-BKG66B4C.mjs.map +0 -1
  236. package/dist/SitemapSync-DWX7I6MX.js +0 -16
  237. package/dist/SitemapSync-IO2VOR23.mjs +0 -7
  238. package/dist/chunk-25YPXQBA.mjs.map +0 -1
  239. package/dist/chunk-3AG6O3IA.mjs.map +0 -1
  240. package/dist/chunk-3BNFUMLL.js.map +0 -1
  241. package/dist/chunk-3X2YPJU5.js +0 -8
  242. package/dist/chunk-4JMXBIUC.js.map +0 -1
  243. package/dist/chunk-4ROFY6PM.js.map +0 -1
  244. package/dist/chunk-AB2VYIYU.mjs.map +0 -1
  245. package/dist/chunk-BMKZHXWQ.js.map +0 -1
  246. package/dist/chunk-EE6SFAZP.mjs.map +0 -1
  247. package/dist/chunk-GUU3AEFM.mjs +0 -259
  248. package/dist/chunk-GUU3AEFM.mjs.map +0 -1
  249. package/dist/chunk-IB4FRJDV.js.map +0 -1
  250. package/dist/chunk-K6YGF2KJ.mjs +0 -6
  251. package/dist/chunk-KPKZBIAQ.js +0 -264
  252. package/dist/chunk-KPKZBIAQ.js.map +0 -1
  253. package/dist/chunk-NQ3K4NWX.mjs.map +0 -1
  254. package/dist/chunk-SH4VZDVX.mjs.map +0 -1
  255. package/dist/chunk-WZHWWOUC.js.map +0 -1
  256. package/dist/chunk-X4OPM3SK.mjs.map +0 -1
  257. package/dist/chunk-YFYMOQAX.js.map +0 -1
@@ -1,7 +1,8 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-MLD3EGM2.mjs';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-V37Z65NF.mjs';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-CU6OGBKK.mjs';
3
- import '../chunk-GUU3AEFM.mjs';
4
- import '../chunk-K6YGF2KJ.mjs';
3
+ import '../chunk-VX3WK77I.mjs';
4
+ import '../chunk-BNJH2RFU.mjs';
5
+ import '../chunk-QGPYFC6G.mjs';
5
6
  import '../chunk-4XPGGLVP.mjs';
6
7
  //# sourceMappingURL=index.mjs.map
7
8
  //# sourceMappingURL=index.mjs.map
package/dist/index.d.mts CHANGED
@@ -1,8 +1,9 @@
1
1
  export { b as ManagedFAQData, M as ManagedMetadataResult, a as ManagedSchemaProps } from './types-DPsbBKiu.mjs';
2
2
  export { c as AnalyticsConfig, b as AnalyticsEvent, P as PageView } from './types-DNSYU7qI.mjs';
3
+ export { L as LandingPage, l as landingPageMetadata } from './metadata-D_GiY8LJ.mjs';
3
4
  export { C as ChatConfig, c as EngageElement, d as WidgetConfig } from './types-D_1iUxOQ.mjs';
4
5
  export { a as FormField, F as FormSubmission, M as ManagedFormConfig } from './types-0dmq3k20.mjs';
5
- export { a as BlogAuthor, b as BlogCategory, B as BlogPostType } from './types-DYOumpUT.mjs';
6
+ export { B as BlogAuthor, b as BlogCategory, a as BlogPostType } from './types-8IcjVMDa.mjs';
6
7
  export { d as Cart, e as CartItem, a as CommerceCategory, C as CommerceOffering, c as CommerceSchedule, b as CommerceVariant, O as OfferingType } from './types-iZM4Lz71.mjs';
7
8
  export { d as CalendarView, C as CheckoutForm, t as CheckoutLineItem, f as EventCalendar, c as EventCheckout, s as EventCheckoutProps, b as EventEmbed, e as EventModal, E as EventTile, O as OfferingCard, a as OfferingList, P as ProductEmbed, R as RegistrationForm, U as UpcomingEvents, m as createCheckoutSession, l as fetchNextEvent, h as fetchOffering, g as fetchOfferings, i as fetchProducts, j as fetchServices, k as fetchUpcomingEvents, o as formatDate, p as formatDateTime, n as formatPrice, q as getOfferingUrl, r as registerForEvent, u as useEventModal } from './useEventModal-qJfX_1XG.mjs';
8
9
  import * as react_jsx_runtime from 'react/jsx-runtime';
package/dist/index.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  export { b as ManagedFAQData, M as ManagedMetadataResult, a as ManagedSchemaProps } from './types-DPsbBKiu.js';
2
2
  export { c as AnalyticsConfig, b as AnalyticsEvent, P as PageView } from './types-DNSYU7qI.js';
3
+ export { L as LandingPage, l as landingPageMetadata } from './metadata-D_GiY8LJ.js';
3
4
  export { C as ChatConfig, c as EngageElement, d as WidgetConfig } from './types-D_1iUxOQ.js';
4
5
  export { a as FormField, F as FormSubmission, M as ManagedFormConfig } from './types-0dmq3k20.js';
5
- export { a as BlogAuthor, b as BlogCategory, B as BlogPostType } from './types-DYOumpUT.js';
6
+ export { B as BlogAuthor, b as BlogCategory, a as BlogPostType } from './types-8IcjVMDa.js';
6
7
  export { d as Cart, e as CartItem, a as CommerceCategory, C as CommerceOffering, c as CommerceSchedule, b as CommerceVariant, O as OfferingType } from './types-iZM4Lz71.js';
7
8
  export { d as CalendarView, C as CheckoutForm, t as CheckoutLineItem, f as EventCalendar, c as EventCheckout, s as EventCheckoutProps, b as EventEmbed, e as EventModal, E as EventTile, O as OfferingCard, a as OfferingList, P as ProductEmbed, R as RegistrationForm, U as UpcomingEvents, m as createCheckoutSession, l as fetchNextEvent, h as fetchOffering, g as fetchOfferings, i as fetchProducts, j as fetchServices, k as fetchUpcomingEvents, o as formatDate, p as formatDateTime, n as formatPrice, q as getOfferingUrl, r as registerForEvent, u as useEventModal } from './useEventModal-CcxNZOvp.js';
8
9
  import * as react_jsx_runtime from 'react/jsx-runtime';
package/dist/index.js CHANGED
@@ -1,21 +1,24 @@
1
1
  'use strict';
2
2
 
3
- var chunkDNW7FTJD_js = require('./chunk-DNW7FTJD.js');
3
+ var chunkEU2UGO25_js = require('./chunk-EU2UGO25.js');
4
+ var chunkTBMFLLRV_js = require('./chunk-TBMFLLRV.js');
4
5
  var chunkW6K7MQCC_js = require('./chunk-W6K7MQCC.js');
5
6
  require('./chunk-JP5WGL75.js');
6
- var chunkBOWR5QEV_js = require('./chunk-BOWR5QEV.js');
7
+ var chunkPWIBFSXK_js = require('./chunk-PWIBFSXK.js');
7
8
  require('./chunk-GCPPXUAI.js');
8
9
  var chunkEHJANA5C_js = require('./chunk-EHJANA5C.js');
9
10
  var chunkGSRT66PA_js = require('./chunk-GSRT66PA.js');
10
- var chunkPCDAVHVX_js = require('./chunk-PCDAVHVX.js');
11
- var chunkFMQHK6MM_js = require('./chunk-FMQHK6MM.js');
12
- var chunkFSYXHIAI_js = require('./chunk-FSYXHIAI.js');
13
- require('./chunk-TXEOLHMC.js');
14
- require('./chunk-4ROFY6PM.js');
11
+ var chunkZY3G7JGT_js = require('./chunk-ZY3G7JGT.js');
12
+ var chunkY4U3OCKH_js = require('./chunk-Y4U3OCKH.js');
13
+ var chunkSQGDDITI_js = require('./chunk-SQGDDITI.js');
14
+ require('./chunk-IMDSDDRU.js');
15
+ require('./chunk-Q2SPOBHU.js');
15
16
  require('./chunk-HMFFAUCD.js');
16
- require('./chunk-3BNFUMLL.js');
17
- var chunkKPKZBIAQ_js = require('./chunk-KPKZBIAQ.js');
18
- require('./chunk-3X2YPJU5.js');
17
+ require('./chunk-XB57AM6T.js');
18
+ require('./chunk-VJMPIRSD.js');
19
+ var chunkXY4NJJEX_js = require('./chunk-XY4NJJEX.js');
20
+ require('./chunk-UXEB6UAR.js');
21
+ require('./chunk-NME3SQCB.js');
19
22
  require('./chunk-ZSMWDLMK.js');
20
23
  var react = require('react');
21
24
  var jsxRuntime = require('react/jsx-runtime');
@@ -33,7 +36,7 @@ async function apiGet(endpoint) {
33
36
  return null;
34
37
  }
35
38
  try {
36
- const response = await chunkKPKZBIAQ_js.sonorFetch(
39
+ const response = await chunkXY4NJJEX_js.sonorFetch(
37
40
  `${apiUrl}${endpoint}`,
38
41
  { method: "GET" },
39
42
  { apiKey, retries: 0 }
@@ -160,53 +163,61 @@ function AffiliatesWidget({
160
163
  ) });
161
164
  }
162
165
 
166
+ Object.defineProperty(exports, "LandingPage", {
167
+ enumerable: true,
168
+ get: function () { return chunkEU2UGO25_js.LandingPage; }
169
+ });
170
+ Object.defineProperty(exports, "landingPageMetadata", {
171
+ enumerable: true,
172
+ get: function () { return chunkEU2UGO25_js.landingPageMetadata; }
173
+ });
163
174
  Object.defineProperty(exports, "BookingWidget", {
164
175
  enumerable: true,
165
- get: function () { return chunkDNW7FTJD_js.BookingWidget; }
176
+ get: function () { return chunkTBMFLLRV_js.BookingWidget; }
166
177
  });
167
178
  Object.defineProperty(exports, "createBooking", {
168
179
  enumerable: true,
169
- get: function () { return chunkDNW7FTJD_js.createBooking; }
180
+ get: function () { return chunkTBMFLLRV_js.createBooking; }
170
181
  });
171
182
  Object.defineProperty(exports, "createSlotHold", {
172
183
  enumerable: true,
173
- get: function () { return chunkDNW7FTJD_js.createSlotHold; }
184
+ get: function () { return chunkTBMFLLRV_js.createSlotHold; }
174
185
  });
175
186
  Object.defineProperty(exports, "detectTimezone", {
176
187
  enumerable: true,
177
- get: function () { return chunkDNW7FTJD_js.detectTimezone; }
188
+ get: function () { return chunkTBMFLLRV_js.detectTimezone; }
178
189
  });
179
190
  Object.defineProperty(exports, "fetchAvailability", {
180
191
  enumerable: true,
181
- get: function () { return chunkDNW7FTJD_js.fetchAvailability; }
192
+ get: function () { return chunkTBMFLLRV_js.fetchAvailability; }
182
193
  });
183
194
  Object.defineProperty(exports, "fetchAvailableDates", {
184
195
  enumerable: true,
185
- get: function () { return chunkDNW7FTJD_js.fetchAvailableDates; }
196
+ get: function () { return chunkTBMFLLRV_js.fetchAvailableDates; }
186
197
  });
187
198
  Object.defineProperty(exports, "fetchBookingTypeDetails", {
188
199
  enumerable: true,
189
- get: function () { return chunkDNW7FTJD_js.fetchBookingTypeDetails; }
200
+ get: function () { return chunkTBMFLLRV_js.fetchBookingTypeDetails; }
190
201
  });
191
202
  Object.defineProperty(exports, "fetchBookingTypes", {
192
203
  enumerable: true,
193
- get: function () { return chunkDNW7FTJD_js.fetchBookingTypes; }
204
+ get: function () { return chunkTBMFLLRV_js.fetchBookingTypes; }
194
205
  });
195
206
  Object.defineProperty(exports, "formatBookingDate", {
196
207
  enumerable: true,
197
- get: function () { return chunkDNW7FTJD_js.formatDate; }
208
+ get: function () { return chunkTBMFLLRV_js.formatDate; }
198
209
  });
199
210
  Object.defineProperty(exports, "formatBookingTime", {
200
211
  enumerable: true,
201
- get: function () { return chunkDNW7FTJD_js.formatTime; }
212
+ get: function () { return chunkTBMFLLRV_js.formatTime; }
202
213
  });
203
214
  Object.defineProperty(exports, "formatDuration", {
204
215
  enumerable: true,
205
- get: function () { return chunkDNW7FTJD_js.formatDuration; }
216
+ get: function () { return chunkTBMFLLRV_js.formatDuration; }
206
217
  });
207
218
  Object.defineProperty(exports, "releaseSlotHold", {
208
219
  enumerable: true,
209
- get: function () { return chunkDNW7FTJD_js.releaseSlotHold; }
220
+ get: function () { return chunkTBMFLLRV_js.releaseSlotHold; }
210
221
  });
211
222
  Object.defineProperty(exports, "clearRedirectCache", {
212
223
  enumerable: true,
@@ -226,31 +237,31 @@ Object.defineProperty(exports, "handleManagedRedirects", {
226
237
  });
227
238
  Object.defineProperty(exports, "ManagedImage", {
228
239
  enumerable: true,
229
- get: function () { return chunkBOWR5QEV_js.ManagedImage; }
240
+ get: function () { return chunkPWIBFSXK_js.ManagedImage; }
230
241
  });
231
242
  Object.defineProperty(exports, "assignImageToSlot", {
232
243
  enumerable: true,
233
- get: function () { return chunkBOWR5QEV_js.assignImageToSlot; }
244
+ get: function () { return chunkPWIBFSXK_js.assignImageToSlot; }
234
245
  });
235
246
  Object.defineProperty(exports, "clearImageSlot", {
236
247
  enumerable: true,
237
- get: function () { return chunkBOWR5QEV_js.clearImageSlot; }
248
+ get: function () { return chunkPWIBFSXK_js.clearImageSlot; }
238
249
  });
239
250
  Object.defineProperty(exports, "fetchManagedImage", {
240
251
  enumerable: true,
241
- get: function () { return chunkBOWR5QEV_js.fetchManagedImage; }
252
+ get: function () { return chunkPWIBFSXK_js.fetchManagedImage; }
242
253
  });
243
254
  Object.defineProperty(exports, "fetchManagedImages", {
244
255
  enumerable: true,
245
- get: function () { return chunkBOWR5QEV_js.fetchManagedImages; }
256
+ get: function () { return chunkPWIBFSXK_js.fetchManagedImages; }
246
257
  });
247
258
  Object.defineProperty(exports, "listImageFiles", {
248
259
  enumerable: true,
249
- get: function () { return chunkBOWR5QEV_js.listImageFiles; }
260
+ get: function () { return chunkPWIBFSXK_js.listImageFiles; }
250
261
  });
251
262
  Object.defineProperty(exports, "uploadImage", {
252
263
  enumerable: true,
253
- get: function () { return chunkBOWR5QEV_js.uploadImage; }
264
+ get: function () { return chunkPWIBFSXK_js.uploadImage; }
254
265
  });
255
266
  Object.defineProperty(exports, "TestimonialSection", {
256
267
  enumerable: true,
@@ -266,139 +277,139 @@ Object.defineProperty(exports, "fetchReviews", {
266
277
  });
267
278
  Object.defineProperty(exports, "ExperimentConversion", {
268
279
  enumerable: true,
269
- get: function () { return chunkPCDAVHVX_js.ExperimentConversion; }
280
+ get: function () { return chunkZY3G7JGT_js.ExperimentConversion; }
270
281
  });
271
282
  Object.defineProperty(exports, "SignalExperiment", {
272
283
  enumerable: true,
273
- get: function () { return chunkPCDAVHVX_js.SignalExperiment; }
284
+ get: function () { return chunkZY3G7JGT_js.SignalExperiment; }
274
285
  });
275
286
  Object.defineProperty(exports, "useExperimentVariant", {
276
287
  enumerable: true,
277
- get: function () { return chunkPCDAVHVX_js.useExperimentVariant; }
288
+ get: function () { return chunkZY3G7JGT_js.useExperimentVariant; }
278
289
  });
279
290
  Object.defineProperty(exports, "SignalBridge", {
280
291
  enumerable: true,
281
- get: function () { return chunkFMQHK6MM_js.SignalBridge; }
292
+ get: function () { return chunkY4U3OCKH_js.SignalBridge; }
282
293
  });
283
294
  Object.defineProperty(exports, "useSignal", {
284
295
  enumerable: true,
285
- get: function () { return chunkFMQHK6MM_js.useSignal; }
296
+ get: function () { return chunkY4U3OCKH_js.useSignal; }
286
297
  });
287
298
  Object.defineProperty(exports, "useSignalConfig", {
288
299
  enumerable: true,
289
- get: function () { return chunkFMQHK6MM_js.useSignalConfig; }
300
+ get: function () { return chunkY4U3OCKH_js.useSignalConfig; }
290
301
  });
291
302
  Object.defineProperty(exports, "useSignalEvent", {
292
303
  enumerable: true,
293
- get: function () { return chunkFMQHK6MM_js.useSignalEvent; }
304
+ get: function () { return chunkY4U3OCKH_js.useSignalEvent; }
294
305
  });
295
306
  Object.defineProperty(exports, "useSignalExperiment", {
296
307
  enumerable: true,
297
- get: function () { return chunkFMQHK6MM_js.useSignalExperiment; }
308
+ get: function () { return chunkY4U3OCKH_js.useSignalExperiment; }
298
309
  });
299
310
  Object.defineProperty(exports, "useSignalOutcome", {
300
311
  enumerable: true,
301
- get: function () { return chunkFMQHK6MM_js.useSignalOutcome; }
312
+ get: function () { return chunkY4U3OCKH_js.useSignalOutcome; }
302
313
  });
303
314
  Object.defineProperty(exports, "CalendarView", {
304
315
  enumerable: true,
305
- get: function () { return chunkFSYXHIAI_js.CalendarView; }
316
+ get: function () { return chunkSQGDDITI_js.CalendarView; }
306
317
  });
307
318
  Object.defineProperty(exports, "CheckoutForm", {
308
319
  enumerable: true,
309
- get: function () { return chunkFSYXHIAI_js.CheckoutForm; }
320
+ get: function () { return chunkSQGDDITI_js.CheckoutForm; }
310
321
  });
311
322
  Object.defineProperty(exports, "EventCalendar", {
312
323
  enumerable: true,
313
- get: function () { return chunkFSYXHIAI_js.EventCalendar; }
324
+ get: function () { return chunkSQGDDITI_js.EventCalendar; }
314
325
  });
315
326
  Object.defineProperty(exports, "EventCheckout", {
316
327
  enumerable: true,
317
- get: function () { return chunkFSYXHIAI_js.EventCheckout; }
328
+ get: function () { return chunkSQGDDITI_js.EventCheckout; }
318
329
  });
319
330
  Object.defineProperty(exports, "EventEmbed", {
320
331
  enumerable: true,
321
- get: function () { return chunkFSYXHIAI_js.EventEmbed; }
332
+ get: function () { return chunkSQGDDITI_js.EventEmbed; }
322
333
  });
323
334
  Object.defineProperty(exports, "EventModal", {
324
335
  enumerable: true,
325
- get: function () { return chunkFSYXHIAI_js.EventModal; }
336
+ get: function () { return chunkSQGDDITI_js.EventModal; }
326
337
  });
327
338
  Object.defineProperty(exports, "EventTile", {
328
339
  enumerable: true,
329
- get: function () { return chunkFSYXHIAI_js.EventTile; }
340
+ get: function () { return chunkSQGDDITI_js.EventTile; }
330
341
  });
331
342
  Object.defineProperty(exports, "OfferingCard", {
332
343
  enumerable: true,
333
- get: function () { return chunkFSYXHIAI_js.OfferingCard; }
344
+ get: function () { return chunkSQGDDITI_js.OfferingCard; }
334
345
  });
335
346
  Object.defineProperty(exports, "OfferingList", {
336
347
  enumerable: true,
337
- get: function () { return chunkFSYXHIAI_js.OfferingList; }
348
+ get: function () { return chunkSQGDDITI_js.OfferingList; }
338
349
  });
339
350
  Object.defineProperty(exports, "ProductEmbed", {
340
351
  enumerable: true,
341
- get: function () { return chunkFSYXHIAI_js.ProductEmbed; }
352
+ get: function () { return chunkSQGDDITI_js.ProductEmbed; }
342
353
  });
343
354
  Object.defineProperty(exports, "RegistrationForm", {
344
355
  enumerable: true,
345
- get: function () { return chunkFSYXHIAI_js.RegistrationForm; }
356
+ get: function () { return chunkSQGDDITI_js.RegistrationForm; }
346
357
  });
347
358
  Object.defineProperty(exports, "UpcomingEvents", {
348
359
  enumerable: true,
349
- get: function () { return chunkFSYXHIAI_js.UpcomingEvents; }
360
+ get: function () { return chunkSQGDDITI_js.UpcomingEvents; }
350
361
  });
351
362
  Object.defineProperty(exports, "createCheckoutSession", {
352
363
  enumerable: true,
353
- get: function () { return chunkFSYXHIAI_js.createCheckoutSession; }
364
+ get: function () { return chunkSQGDDITI_js.createCheckoutSession; }
354
365
  });
355
366
  Object.defineProperty(exports, "fetchNextEvent", {
356
367
  enumerable: true,
357
- get: function () { return chunkFSYXHIAI_js.fetchNextEvent; }
368
+ get: function () { return chunkSQGDDITI_js.fetchNextEvent; }
358
369
  });
359
370
  Object.defineProperty(exports, "fetchOffering", {
360
371
  enumerable: true,
361
- get: function () { return chunkFSYXHIAI_js.fetchOffering; }
372
+ get: function () { return chunkSQGDDITI_js.fetchOffering; }
362
373
  });
363
374
  Object.defineProperty(exports, "fetchOfferings", {
364
375
  enumerable: true,
365
- get: function () { return chunkFSYXHIAI_js.fetchOfferings; }
376
+ get: function () { return chunkSQGDDITI_js.fetchOfferings; }
366
377
  });
367
378
  Object.defineProperty(exports, "fetchProducts", {
368
379
  enumerable: true,
369
- get: function () { return chunkFSYXHIAI_js.fetchProducts; }
380
+ get: function () { return chunkSQGDDITI_js.fetchProducts; }
370
381
  });
371
382
  Object.defineProperty(exports, "fetchServices", {
372
383
  enumerable: true,
373
- get: function () { return chunkFSYXHIAI_js.fetchServices; }
384
+ get: function () { return chunkSQGDDITI_js.fetchServices; }
374
385
  });
375
386
  Object.defineProperty(exports, "fetchUpcomingEvents", {
376
387
  enumerable: true,
377
- get: function () { return chunkFSYXHIAI_js.fetchUpcomingEvents; }
388
+ get: function () { return chunkSQGDDITI_js.fetchUpcomingEvents; }
378
389
  });
379
390
  Object.defineProperty(exports, "formatDate", {
380
391
  enumerable: true,
381
- get: function () { return chunkFSYXHIAI_js.formatDate; }
392
+ get: function () { return chunkSQGDDITI_js.formatDate; }
382
393
  });
383
394
  Object.defineProperty(exports, "formatDateTime", {
384
395
  enumerable: true,
385
- get: function () { return chunkFSYXHIAI_js.formatDateTime; }
396
+ get: function () { return chunkSQGDDITI_js.formatDateTime; }
386
397
  });
387
398
  Object.defineProperty(exports, "formatPrice", {
388
399
  enumerable: true,
389
- get: function () { return chunkFSYXHIAI_js.formatPrice; }
400
+ get: function () { return chunkSQGDDITI_js.formatPrice; }
390
401
  });
391
402
  Object.defineProperty(exports, "getOfferingUrl", {
392
403
  enumerable: true,
393
- get: function () { return chunkFSYXHIAI_js.getOfferingUrl; }
404
+ get: function () { return chunkSQGDDITI_js.getOfferingUrl; }
394
405
  });
395
406
  Object.defineProperty(exports, "registerForEvent", {
396
407
  enumerable: true,
397
- get: function () { return chunkFSYXHIAI_js.registerForEvent; }
408
+ get: function () { return chunkSQGDDITI_js.registerForEvent; }
398
409
  });
399
410
  Object.defineProperty(exports, "useEventModal", {
400
411
  enumerable: true,
401
- get: function () { return chunkFSYXHIAI_js.useEventModal; }
412
+ get: function () { return chunkSQGDDITI_js.useEventModal; }
402
413
  });
403
414
  exports.AffiliateCard = AffiliateCard;
404
415
  exports.AffiliatesWidget = AffiliatesWidget;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx"],"names":["sonorFetch","useState","useEffect","getTrackingUrl","jsx"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n // Route through sonorFetch (the canonical transport) — NOT bare fetch — so a\n // stale build-time seed token is transparently refreshed and a 401 triggers\n // one refresh+retry. The credential goes via options.apiKey, never a header:\n // sonorFetch injects the freshest token as x-api-key; a hand-set header would\n // pin the stale seed and 401.\n const response = await sonorFetch(\n `${apiUrl}${endpoint}`,\n { method: 'GET' },\n { apiKey, retries: 0 },\n )\n\n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.sonor.io/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @sonordev/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @sonordev/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx"],"names":["sonorFetch","useState","useEffect","getTrackingUrl","jsx"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n // Route through sonorFetch (the canonical transport) — NOT bare fetch — so a\n // stale build-time seed token is transparently refreshed and a 401 triggers\n // one refresh+retry. The credential goes via options.apiKey, never a header:\n // sonorFetch injects the freshest token as x-api-key; a hand-set header would\n // pin the stale seed and 401.\n const response = await sonorFetch(\n `${apiUrl}${endpoint}`,\n { method: 'GET' },\n { apiKey, retries: 0 },\n )\n\n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.sonor.io/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @sonordev/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @sonordev/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,19 +1,22 @@
1
- export { BookingWidget, createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate as formatBookingDate, formatTime as formatBookingTime, formatDuration, releaseSlotHold } from './chunk-OC64AHKN.mjs';
1
+ export { LandingPage, landingPageMetadata } from './chunk-IBMOX3YE.mjs';
2
+ export { BookingWidget, createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate as formatBookingDate, formatTime as formatBookingTime, formatDuration, releaseSlotHold } from './chunk-7FZWMAI2.mjs';
2
3
  export { clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects } from './chunk-7LAOWIWE.mjs';
3
4
  import './chunk-B22WSN4L.mjs';
4
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from './chunk-MLD3EGM2.mjs';
5
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from './chunk-V37Z65NF.mjs';
5
6
  import './chunk-CU6OGBKK.mjs';
6
7
  export { TestimonialSection } from './chunk-VIGRGMWR.mjs';
7
8
  export { fetchReviewStats, fetchReviews } from './chunk-MU7DTEUF.mjs';
8
- export { ExperimentConversion, SignalExperiment, useExperimentVariant } from './chunk-JD6LV6JZ.mjs';
9
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from './chunk-QFWBAGBT.mjs';
10
- export { CalendarView, CheckoutForm, EventCalendar, EventCheckout, EventEmbed, EventModal, EventTile, OfferingCard, OfferingList, ProductEmbed, RegistrationForm, UpcomingEvents, createCheckoutSession, fetchNextEvent, fetchOffering, fetchOfferings, fetchProducts, fetchServices, fetchUpcomingEvents, formatDate, formatDateTime, formatPrice, getOfferingUrl, registerForEvent, useEventModal } from './chunk-7OROUYZH.mjs';
11
- import './chunk-DIXWP4BO.mjs';
12
- import './chunk-3AG6O3IA.mjs';
9
+ export { ExperimentConversion, SignalExperiment, useExperimentVariant } from './chunk-HRJ65XKY.mjs';
10
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from './chunk-UFOOVODL.mjs';
11
+ export { CalendarView, CheckoutForm, EventCalendar, EventCheckout, EventEmbed, EventModal, EventTile, OfferingCard, OfferingList, ProductEmbed, RegistrationForm, UpcomingEvents, createCheckoutSession, fetchNextEvent, fetchOffering, fetchOfferings, fetchProducts, fetchServices, fetchUpcomingEvents, formatDate, formatDateTime, formatPrice, getOfferingUrl, registerForEvent, useEventModal } from './chunk-YSDJ7HI3.mjs';
12
+ import './chunk-NBI5AV6U.mjs';
13
+ import './chunk-LZSHZVBE.mjs';
13
14
  import './chunk-3DPXOZAU.mjs';
14
- import './chunk-EE6SFAZP.mjs';
15
- import { sonorFetch } from './chunk-GUU3AEFM.mjs';
16
- import './chunk-K6YGF2KJ.mjs';
15
+ import './chunk-AX4AROLH.mjs';
16
+ import './chunk-6EDVCUAG.mjs';
17
+ import { sonorFetch } from './chunk-VX3WK77I.mjs';
18
+ import './chunk-BNJH2RFU.mjs';
19
+ import './chunk-QGPYFC6G.mjs';
17
20
  import './chunk-4XPGGLVP.mjs';
18
21
  import { useState, useEffect } from 'react';
19
22
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx"],"names":["getTrackingUrl"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n // Route through sonorFetch (the canonical transport) — NOT bare fetch — so a\n // stale build-time seed token is transparently refreshed and a 401 triggers\n // one refresh+retry. The credential goes via options.apiKey, never a header:\n // sonorFetch injects the freshest token as x-api-key; a hand-set header would\n // pin the stale seed and 401.\n const response = await sonorFetch(\n `${apiUrl}${endpoint}`,\n { method: 'GET' },\n { apiKey, retries: 0 },\n )\n\n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.sonor.io/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @sonordev/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @sonordev/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../src/affiliates/api.ts","../src/affiliates/useAffiliates.ts","../src/affiliates/AffiliatesWidget.tsx"],"names":["getTrackingUrl"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * @sonordev/site-kit/affiliates - Affiliates API\n * \n * API functions for fetching affiliate data for client sites.\n * All data goes through Portal API with API key auth - never Supabase directly.\n */\n\nimport { sonorFetch } from '../shared/sonorFetch'\nimport type { Affiliate, AffiliateWithOffers, FetchAffiliatesOptions } from './types'\n\n// ============================================\n// API Config Helpers\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_URL__ || 'https://api.sonor.io'\n : 'https://api.sonor.io'\n const apiKey = typeof window !== 'undefined' \n ? (window as any).__SITE_KIT_API_KEY__ || ''\n : ''\n return { apiUrl, apiKey }\n}\n\nasync function apiGet<T>(endpoint: string): Promise<T | null> {\n const { apiUrl, apiKey } = getApiConfig()\n \n if (!apiKey) {\n console.error('[Affiliates] No API key configured')\n return null\n }\n \n try {\n // Route through sonorFetch (the canonical transport) — NOT bare fetch — so a\n // stale build-time seed token is transparently refreshed and a 401 triggers\n // one refresh+retry. The credential goes via options.apiKey, never a header:\n // sonorFetch injects the freshest token as x-api-key; a hand-set header would\n // pin the stale seed and 401.\n const response = await sonorFetch(\n `${apiUrl}${endpoint}`,\n { method: 'GET' },\n { apiKey, retries: 0 },\n )\n\n if (!response.ok) {\n console.error(`[Affiliates] API error: ${response.statusText}`)\n return null\n }\n \n return await response.json()\n } catch (error) {\n console.error('[Affiliates] Network error:', error)\n return null\n }\n}\n\n// ============================================\n// Fetch Affiliates\n// ============================================\n\n/**\n * Fetch all active affiliates for the project\n * \n * @example\n * ```ts\n * const affiliates = await fetchAffiliates()\n * ```\n */\nexport async function fetchAffiliates(\n options: FetchAffiliatesOptions = {}\n): Promise<AffiliateWithOffers[]> {\n const result = await apiGet<{ affiliates: AffiliateWithOffers[] }>(\n '/api/public/affiliates'\n )\n \n return result?.affiliates || []\n}\n\n/**\n * Build a tracking URL for an affiliate offer\n * When clicked, this redirects through our tracking endpoint and then to the destination\n * \n * @example\n * ```ts\n * const trackingUrl = getTrackingUrl(affiliate.id, offer.id)\n * // Returns: https://api.sonor.io/a/{affiliateId}/{offerId}\n * ```\n */\nexport function getTrackingUrl(affiliateId: string, offerId: string): string {\n const { apiUrl } = getApiConfig()\n return `${apiUrl}/a/${affiliateId}/${offerId}`\n}\n","/**\n * @sonordev/site-kit/affiliates - useAffiliates Hook\n * \n * React hook for fetching and displaying affiliates on client sites.\n */\n\n'use client'\n\nimport { useState, useEffect } from 'react'\nimport type { AffiliateWithOffers } from './types'\nimport { fetchAffiliates, getTrackingUrl } from './api'\n\nexport interface UseAffiliatesResult {\n affiliates: AffiliateWithOffers[]\n isLoading: boolean\n error: string | null\n getTrackingUrl: (affiliateId: string, offerId: string) => string\n}\n\n/**\n * Hook to fetch affiliates for display on client sites\n * \n * @example\n * ```tsx\n * function AffiliatesSection() {\n * const { affiliates, isLoading } = useAffiliates()\n * \n * if (isLoading) return <div>Loading...</div>\n * \n * return (\n * <div className=\"grid grid-cols-3 gap-4\">\n * {affiliates.map(affiliate => (\n * <AffiliateCard key={affiliate.id} affiliate={affiliate} />\n * ))}\n * </div>\n * )\n * }\n * ```\n */\nexport function useAffiliates(): UseAffiliatesResult {\n const [affiliates, setAffiliates] = useState<AffiliateWithOffers[]>([])\n const [isLoading, setIsLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n async function load() {\n try {\n setIsLoading(true)\n setError(null)\n const data = await fetchAffiliates()\n setAffiliates(data)\n } catch (err) {\n setError(err instanceof Error ? err.message : 'Failed to load affiliates')\n } finally {\n setIsLoading(false)\n }\n }\n \n load()\n }, [])\n\n return {\n affiliates,\n isLoading,\n error,\n getTrackingUrl,\n }\n}\n","/**\n * @sonordev/site-kit/affiliates - AffiliatesWidget Component\n * \n * Unstyled, headless component for displaying affiliates.\n * Client sites can wrap this or use it directly with their own styling.\n */\n\n'use client'\n\nimport React from 'react'\nimport { useAffiliates } from './useAffiliates'\nimport type { AffiliateWithOffers, AffiliateOffer } from './types'\n\n// ============================================\n// Affiliate Card (Unstyled)\n// ============================================\n\nexport interface AffiliateCardProps {\n affiliate: AffiliateWithOffers\n className?: string\n /** Optional custom render for the logo */\n renderLogo?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Show offers as links below the card */\n showOffers?: boolean\n}\n\n/**\n * Single affiliate card - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * <AffiliateCard \n * affiliate={affiliate}\n * className=\"p-4 bg-white rounded-lg shadow\"\n * showOffers\n * />\n * ```\n */\nexport function AffiliateCard({\n affiliate,\n className = '',\n renderLogo,\n showOffers = false,\n}: AffiliateCardProps) {\n const { getTrackingUrl } = useAffiliates()\n \n const defaultLogo = (\n <div data-affiliate-logo className=\"affiliate-logo\">\n {affiliate.logo_url ? (\n <img \n src={affiliate.logo_url} \n alt={affiliate.name}\n loading=\"lazy\"\n />\n ) : (\n <span>{affiliate.name.charAt(0)}</span>\n )}\n </div>\n )\n\n return (\n <div className={className} data-affiliate-card data-affiliate-id={affiliate.id}>\n {/* Logo */}\n {renderLogo ? renderLogo(affiliate) : defaultLogo}\n \n {/* Name */}\n <div data-affiliate-name className=\"affiliate-name\">\n {affiliate.name}\n </div>\n \n {/* Website link */}\n {affiliate.website_url && (\n <a \n href={affiliate.website_url}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-website\n className=\"affiliate-website\"\n >\n Visit Website\n </a>\n )}\n \n {/* Offers */}\n {showOffers && affiliate.offers && affiliate.offers.length > 0 && (\n <div data-affiliate-offers className=\"affiliate-offers\">\n {affiliate.offers.map(offer => (\n <a\n key={offer.id}\n href={getTrackingUrl(affiliate.id, offer.id)}\n target=\"_blank\"\n rel=\"noopener noreferrer sponsored\"\n data-affiliate-offer\n data-offer-id={offer.id}\n className=\"affiliate-offer\"\n >\n {offer.name}\n </a>\n ))}\n </div>\n )}\n </div>\n )\n}\n\n// ============================================\n// Affiliates Grid (Unstyled)\n// ============================================\n\nexport interface AffiliatesWidgetProps {\n className?: string\n /** Custom loading component */\n loadingComponent?: React.ReactNode\n /** Custom empty state component */\n emptyComponent?: React.ReactNode\n /** Custom error component */\n errorComponent?: React.ReactNode\n /** Show offers on each card */\n showOffers?: boolean\n /** Custom render function for each affiliate */\n renderAffiliate?: (affiliate: AffiliateWithOffers) => React.ReactNode\n /** Maximum number to display */\n limit?: number\n}\n\n/**\n * Display a grid of affiliates - unstyled, bring your own CSS\n * \n * @example\n * ```tsx\n * // Basic usage\n * <AffiliatesWidget className=\"grid grid-cols-3 gap-4\" />\n * \n * // With custom rendering\n * <AffiliatesWidget\n * renderAffiliate={(affiliate) => (\n * <MyCustomCard key={affiliate.id} data={affiliate} />\n * )}\n * />\n * ```\n */\nexport function AffiliatesWidget({\n className = '',\n loadingComponent,\n emptyComponent,\n errorComponent,\n showOffers = false,\n renderAffiliate,\n limit,\n}: AffiliatesWidgetProps) {\n const { affiliates, isLoading, error, getTrackingUrl } = useAffiliates()\n \n if (isLoading) {\n return loadingComponent || <div data-affiliates-loading>Loading affiliates...</div>\n }\n \n if (error) {\n return errorComponent || <div data-affiliates-error>{error}</div>\n }\n \n const displayAffiliates = limit ? affiliates.slice(0, limit) : affiliates\n \n if (displayAffiliates.length === 0) {\n return emptyComponent || null\n }\n \n return (\n <div className={className} data-affiliates-widget>\n {displayAffiliates.map(affiliate => \n renderAffiliate \n ? renderAffiliate(affiliate)\n : <AffiliateCard \n key={affiliate.id} \n affiliate={affiliate} \n showOffers={showOffers}\n />\n )}\n </div>\n )\n}\n"]}
@@ -0,0 +1,21 @@
1
+ export { L as LandingPage, a as LandingPageProps, l as landingPageMetadata } from '../metadata-D_GiY8LJ.mjs';
2
+ import 'react/jsx-runtime';
3
+ import 'react';
4
+ import 'next';
5
+
6
+ /**
7
+ * Landing-page campaign contract.
8
+ *
9
+ * normalizeCampaignSlug is an inlined MIRROR of sonor-api's
10
+ * `src/modules/analytics/utils/campaign.util.ts` (the CANONICAL copy) —
11
+ * keep the function body byte-identical. Both suites assert the same fixed
12
+ * vectors (sonor-api's campaign.util.spec.ts and this package's
13
+ * landing/contract.test.ts), so silent drift fails CI on either side.
14
+ *
15
+ * A slug normalized here always matches the server's canonical form, so the
16
+ * campaign a developer declares in code is exactly the identity the
17
+ * dashboard reports on.
18
+ */
19
+ declare function normalizeCampaignSlug(input?: string | null): string | null;
20
+
21
+ export { normalizeCampaignSlug };
@@ -0,0 +1,21 @@
1
+ export { L as LandingPage, a as LandingPageProps, l as landingPageMetadata } from '../metadata-D_GiY8LJ.js';
2
+ import 'react/jsx-runtime';
3
+ import 'react';
4
+ import 'next';
5
+
6
+ /**
7
+ * Landing-page campaign contract.
8
+ *
9
+ * normalizeCampaignSlug is an inlined MIRROR of sonor-api's
10
+ * `src/modules/analytics/utils/campaign.util.ts` (the CANONICAL copy) —
11
+ * keep the function body byte-identical. Both suites assert the same fixed
12
+ * vectors (sonor-api's campaign.util.spec.ts and this package's
13
+ * landing/contract.test.ts), so silent drift fails CI on either side.
14
+ *
15
+ * A slug normalized here always matches the server's canonical form, so the
16
+ * campaign a developer declares in code is exactly the identity the
17
+ * dashboard reports on.
18
+ */
19
+ declare function normalizeCampaignSlug(input?: string | null): string | null;
20
+
21
+ export { normalizeCampaignSlug };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ var chunkEU2UGO25_js = require('../chunk-EU2UGO25.js');
4
+ require('../chunk-ZSMWDLMK.js');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "LandingPage", {
9
+ enumerable: true,
10
+ get: function () { return chunkEU2UGO25_js.LandingPage; }
11
+ });
12
+ Object.defineProperty(exports, "landingPageMetadata", {
13
+ enumerable: true,
14
+ get: function () { return chunkEU2UGO25_js.landingPageMetadata; }
15
+ });
16
+ Object.defineProperty(exports, "normalizeCampaignSlug", {
17
+ enumerable: true,
18
+ get: function () { return chunkEU2UGO25_js.normalizeCampaignSlug; }
19
+ });
20
+ //# sourceMappingURL=index.js.map
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,4 @@
1
+ export { LandingPage, landingPageMetadata, normalizeCampaignSlug } from '../chunk-IBMOX3YE.mjs';
2
+ import '../chunk-4XPGGLVP.mjs';
3
+ //# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}