@sonordev/site-kit 3.4.0 → 3.6.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 (227) hide show
  1. package/README.md +2 -2
  2. package/agent-manifest.json +1 -1
  3. package/dist/AnalyticsProvider-GOLL2W6O.mjs +10 -0
  4. package/dist/{AnalyticsProvider-HIGSPNRA.mjs.map → AnalyticsProvider-GOLL2W6O.mjs.map} +1 -1
  5. package/dist/AnalyticsProvider-PK5E4TWJ.js +31 -0
  6. package/dist/{AnalyticsProvider-ARAWVJPX.js.map → AnalyticsProvider-PK5E4TWJ.js.map} +1 -1
  7. package/dist/ChatWidget-5RMDVEJL.js +19 -0
  8. package/dist/{ChatWidget-BDES6WUR.js.map → ChatWidget-5RMDVEJL.js.map} +1 -1
  9. package/dist/ChatWidget-LOZDGIVP.mjs +10 -0
  10. package/dist/{ChatWidget-47KAOFLG.mjs.map → ChatWidget-LOZDGIVP.mjs.map} +1 -1
  11. package/dist/EngageWidget-CYJK6RAJ.js +18 -0
  12. package/dist/{EngageWidget-X3NIWGMZ.js.map → EngageWidget-CYJK6RAJ.js.map} +1 -1
  13. package/dist/EngageWidget-HLJMP7MR.mjs +9 -0
  14. package/dist/{EngageWidget-HPZAI6SU.mjs.map → EngageWidget-HLJMP7MR.mjs.map} +1 -1
  15. package/dist/{SignalCore-K2CTZ52G.js → SignalCore-7SB26IPW.js} +11 -10
  16. package/dist/SignalCore-7SB26IPW.js.map +1 -0
  17. package/dist/{SignalCore-XABEH2GA.mjs → SignalCore-JPQMRYMF.mjs} +5 -4
  18. package/dist/SignalCore-JPQMRYMF.mjs.map +1 -0
  19. package/dist/SitemapSync-4UFM6LWW.mjs +8 -0
  20. package/dist/{SitemapSync-OQPRGBG3.mjs.map → SitemapSync-4UFM6LWW.mjs.map} +1 -1
  21. package/dist/SitemapSync-KIFK3OJO.js +17 -0
  22. package/dist/{SitemapSync-4BALOI4B.js.map → SitemapSync-KIFK3OJO.js.map} +1 -1
  23. package/dist/analytics/index.js +12 -11
  24. package/dist/analytics/index.mjs +5 -4
  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-WVAY4ZWC.mjs → chunk-253MGZYN.mjs} +10 -29
  42. package/dist/chunk-253MGZYN.mjs.map +1 -0
  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-56X3IUOL.js → chunk-3XQV5HDW.js} +12 -31
  46. package/dist/chunk-3XQV5HDW.js.map +1 -0
  47. package/dist/chunk-5BC7I3KH.mjs +134 -0
  48. package/dist/chunk-5BC7I3KH.mjs.map +1 -0
  49. package/dist/{chunk-O4RVFKQW.mjs → chunk-5WRJRJSM.mjs} +3 -3
  50. package/dist/{chunk-O4RVFKQW.mjs.map → chunk-5WRJRJSM.mjs.map} +1 -1
  51. package/dist/{chunk-7TX5BKVA.js → chunk-6T4NVCAT.js} +2 -2
  52. package/dist/{chunk-7TX5BKVA.js.map → chunk-6T4NVCAT.js.map} +1 -1
  53. package/dist/{chunk-E4VA4FYW.js → chunk-7F3RT2RX.js} +8 -8
  54. package/dist/{chunk-E4VA4FYW.js.map → chunk-7F3RT2RX.js.map} +1 -1
  55. package/dist/{chunk-C37DFD5F.js → chunk-7J47WT5V.js} +14 -14
  56. package/dist/{chunk-C37DFD5F.js.map → chunk-7J47WT5V.js.map} +1 -1
  57. package/dist/{chunk-MJV6RC7I.js → chunk-7ZY44LI4.js} +3 -3
  58. package/dist/{chunk-MJV6RC7I.js.map → chunk-7ZY44LI4.js.map} +1 -1
  59. package/dist/{chunk-WZHWWOUC.js → chunk-BX6FFL2Y.js} +6 -16
  60. package/dist/chunk-BX6FFL2Y.js.map +1 -0
  61. package/dist/chunk-BYW3MJ36.mjs +139 -0
  62. package/dist/chunk-BYW3MJ36.mjs.map +1 -0
  63. package/dist/{chunk-PYA4BR2N.mjs → chunk-C4JYWTI5.mjs} +3 -3
  64. package/dist/{chunk-PYA4BR2N.mjs.map → chunk-C4JYWTI5.mjs.map} +1 -1
  65. package/dist/{chunk-VE5XLADP.mjs → chunk-C7MKSHRI.mjs} +3 -3
  66. package/dist/{chunk-VE5XLADP.mjs.map → chunk-C7MKSHRI.mjs.map} +1 -1
  67. package/dist/chunk-CGCYZJYX.mjs +41 -0
  68. package/dist/chunk-CGCYZJYX.mjs.map +1 -0
  69. package/dist/{chunk-RMUOY6XB.js → chunk-CPYUZSJN.js} +7 -7
  70. package/dist/{chunk-RMUOY6XB.js.map → chunk-CPYUZSJN.js.map} +1 -1
  71. package/dist/{chunk-5WEADCND.mjs → chunk-DAVE4PEM.mjs} +4 -4
  72. package/dist/{chunk-5WEADCND.mjs.map → chunk-DAVE4PEM.mjs.map} +1 -1
  73. package/dist/{chunk-MCDQM75H.js → chunk-DF3MIQNB.js} +15 -15
  74. package/dist/{chunk-MCDQM75H.js.map → chunk-DF3MIQNB.js.map} +1 -1
  75. package/dist/{chunk-IB34IYMN.js → chunk-DLZEFUKB.js} +9 -9
  76. package/dist/{chunk-IB34IYMN.js.map → chunk-DLZEFUKB.js.map} +1 -1
  77. package/dist/chunk-FMUTOABC.js +129 -0
  78. package/dist/chunk-FMUTOABC.js.map +1 -0
  79. package/dist/{chunk-3SIIYHVE.mjs → chunk-GJSNM2A3.mjs} +4 -4
  80. package/dist/{chunk-3SIIYHVE.mjs.map → chunk-GJSNM2A3.mjs.map} +1 -1
  81. package/dist/{chunk-X4OPM3SK.mjs → chunk-GU5OTUQS.mjs} +5 -14
  82. package/dist/chunk-GU5OTUQS.mjs.map +1 -0
  83. package/dist/{chunk-SH4VZDVX.mjs → chunk-GUXB3QH7.mjs} +38 -67
  84. package/dist/chunk-GUXB3QH7.mjs.map +1 -0
  85. package/dist/{chunk-O7B7IEXY.js → chunk-JBRLJMXM.js} +14 -14
  86. package/dist/{chunk-O7B7IEXY.js.map → chunk-JBRLJMXM.js.map} +1 -1
  87. package/dist/{chunk-5SJKYZID.js → chunk-JZAKTBKV.js} +5 -5
  88. package/dist/{chunk-5SJKYZID.js.map → chunk-JZAKTBKV.js.map} +1 -1
  89. package/dist/chunk-K24NKI35.js +8 -0
  90. package/dist/{chunk-CDETOO5W.js.map → chunk-K24NKI35.js.map} +1 -1
  91. package/dist/{chunk-HV7IYMXK.js → chunk-KIUNFFDD.js} +13 -13
  92. package/dist/{chunk-HV7IYMXK.js.map → chunk-KIUNFFDD.js.map} +1 -1
  93. package/dist/{chunk-7523LJ52.js → chunk-KJD5UJ4C.js} +9 -9
  94. package/dist/{chunk-7523LJ52.js.map → chunk-KJD5UJ4C.js.map} +1 -1
  95. package/dist/chunk-KRZL6VYP.mjs +6 -0
  96. package/dist/{chunk-YCQHE2XT.mjs.map → chunk-KRZL6VYP.mjs.map} +1 -1
  97. package/dist/chunk-KTHQKVGZ.js +147 -0
  98. package/dist/chunk-KTHQKVGZ.js.map +1 -0
  99. package/dist/{chunk-BMKZHXWQ.js → chunk-MMON6EVI.js} +3 -194
  100. package/dist/chunk-MMON6EVI.js.map +1 -0
  101. package/dist/chunk-N5H6ORXN.mjs +35 -0
  102. package/dist/chunk-N5H6ORXN.mjs.map +1 -0
  103. package/dist/chunk-NB4MK2Q5.js +18 -0
  104. package/dist/chunk-NB4MK2Q5.js.map +1 -0
  105. package/dist/chunk-NI7OY4FW.mjs +16 -0
  106. package/dist/chunk-NI7OY4FW.mjs.map +1 -0
  107. package/dist/{chunk-7UYUVHCR.js → chunk-OIAAYRGO.js} +4 -4
  108. package/dist/{chunk-7UYUVHCR.js.map → chunk-OIAAYRGO.js.map} +1 -1
  109. package/dist/{chunk-IURQA3H5.mjs → chunk-QLBNK6WJ.mjs} +3 -3
  110. package/dist/{chunk-IURQA3H5.mjs.map → chunk-QLBNK6WJ.mjs.map} +1 -1
  111. package/dist/{chunk-6Q72JAL2.js → chunk-QO45Q7KW.js} +6 -6
  112. package/dist/{chunk-6Q72JAL2.js.map → chunk-QO45Q7KW.js.map} +1 -1
  113. package/dist/{chunk-VNQFKBKF.mjs → chunk-RHKFINCS.mjs} +3 -3
  114. package/dist/{chunk-VNQFKBKF.mjs.map → chunk-RHKFINCS.mjs.map} +1 -1
  115. package/dist/{chunk-LQHZFUZJ.mjs → chunk-RQV3FO33.mjs} +3 -3
  116. package/dist/{chunk-LQHZFUZJ.mjs.map → chunk-RQV3FO33.mjs.map} +1 -1
  117. package/dist/chunk-S32BEPZM.mjs +126 -0
  118. package/dist/chunk-S32BEPZM.mjs.map +1 -0
  119. package/dist/{chunk-472FTEPP.mjs → chunk-SOPPUXR3.mjs} +4 -4
  120. package/dist/{chunk-472FTEPP.mjs.map → chunk-SOPPUXR3.mjs.map} +1 -1
  121. package/dist/chunk-T3LOHTC6.js +136 -0
  122. package/dist/chunk-T3LOHTC6.js.map +1 -0
  123. package/dist/chunk-TPL2IHFI.js +43 -0
  124. package/dist/chunk-TPL2IHFI.js.map +1 -0
  125. package/dist/{chunk-JRUNONG5.mjs → chunk-V4LF47AS.mjs} +3 -3
  126. package/dist/{chunk-JRUNONG5.mjs.map → chunk-V4LF47AS.mjs.map} +1 -1
  127. package/dist/chunk-VELBKUIM.js +38 -0
  128. package/dist/chunk-VELBKUIM.js.map +1 -0
  129. package/dist/{chunk-G3G4HQT3.mjs → chunk-VN3TGLT3.mjs} +3 -3
  130. package/dist/{chunk-G3G4HQT3.mjs.map → chunk-VN3TGLT3.mjs.map} +1 -1
  131. package/dist/{chunk-AB2VYIYU.mjs → chunk-WTR7QJ32.mjs} +4 -194
  132. package/dist/chunk-WTR7QJ32.mjs.map +1 -0
  133. package/dist/{chunk-IB4FRJDV.js → chunk-XAWB2HFQ.js} +37 -67
  134. package/dist/chunk-XAWB2HFQ.js.map +1 -0
  135. package/dist/{chunk-QE53WRXW.mjs → chunk-ZTEQXVQF.mjs} +4 -4
  136. package/dist/{chunk-QE53WRXW.mjs.map → chunk-ZTEQXVQF.mjs.map} +1 -1
  137. package/dist/cli/index.js +2 -2
  138. package/dist/cli/index.mjs +1 -1
  139. package/dist/client/index.d.mts +15 -1
  140. package/dist/client/index.d.ts +15 -1
  141. package/dist/client/index.js +15 -1
  142. package/dist/client/index.js.map +1 -1
  143. package/dist/client/index.mjs +17 -0
  144. package/dist/client/index.mjs.map +1 -1
  145. package/dist/commerce/index.js +51 -50
  146. package/dist/commerce/index.mjs +6 -5
  147. package/dist/engage/index.js +9 -8
  148. package/dist/engage/index.js.map +1 -1
  149. package/dist/engage/index.mjs +6 -5
  150. package/dist/engage/index.mjs.map +1 -1
  151. package/dist/fleet/index.js +8 -7
  152. package/dist/fleet/index.mjs +4 -3
  153. package/dist/forms/index.js +13 -12
  154. package/dist/forms/index.js.map +1 -1
  155. package/dist/forms/index.mjs +5 -4
  156. package/dist/forms/index.mjs.map +1 -1
  157. package/dist/images/index.js +11 -10
  158. package/dist/images/index.mjs +4 -3
  159. package/dist/index.d.mts +1 -1
  160. package/dist/index.d.ts +1 -1
  161. package/dist/index.js +64 -63
  162. package/dist/index.js.map +1 -1
  163. package/dist/index.mjs +10 -9
  164. package/dist/index.mjs.map +1 -1
  165. package/dist/layout/client.js +9 -7
  166. package/dist/layout/client.mjs +8 -6
  167. package/dist/layout/index.js +11 -53
  168. package/dist/layout/index.js.map +1 -1
  169. package/dist/layout/index.mjs +9 -51
  170. package/dist/layout/index.mjs.map +1 -1
  171. package/dist/llms/index.js +12 -12
  172. package/dist/llms/index.mjs +2 -2
  173. package/dist/maps/index.js +5 -4
  174. package/dist/maps/index.js.map +1 -1
  175. package/dist/maps/index.mjs +3 -2
  176. package/dist/maps/index.mjs.map +1 -1
  177. package/dist/seo/client.js +5 -4
  178. package/dist/seo/client.mjs +4 -3
  179. package/dist/seo/index.js +5 -4
  180. package/dist/seo/index.js.map +1 -1
  181. package/dist/seo/index.mjs +4 -3
  182. package/dist/seo/index.mjs.map +1 -1
  183. package/dist/seo-pages/contract.js +6 -5
  184. package/dist/seo-pages/contract.js.map +1 -1
  185. package/dist/seo-pages/contract.mjs +2 -1
  186. package/dist/seo-pages/contract.mjs.map +1 -1
  187. package/dist/server/index.d.mts +45 -1
  188. package/dist/server/index.d.ts +45 -1
  189. package/dist/server/index.js +6 -0
  190. package/dist/server/index.mjs +2 -0
  191. package/dist/signal/index.js +11 -11
  192. package/dist/signal/index.mjs +2 -2
  193. package/dist/sitemap/index.js +2 -2
  194. package/dist/sitemap/index.mjs +1 -1
  195. package/dist/sites/contract.d.mts +36 -12
  196. package/dist/sites/contract.d.ts +36 -12
  197. package/dist/sites/contract.js +12 -11
  198. package/dist/sites/contract.mjs +2 -1
  199. package/dist/sync/index.js +16 -15
  200. package/dist/sync/index.mjs +4 -3
  201. package/dist/{types-DYOumpUT.d.mts → types-8IcjVMDa.d.mts} +1 -1
  202. package/dist/{types-DYOumpUT.d.ts → types-8IcjVMDa.d.ts} +1 -1
  203. package/package.json +1 -1
  204. package/dist/AnalyticsProvider-ARAWVJPX.js +0 -30
  205. package/dist/AnalyticsProvider-HIGSPNRA.mjs +0 -9
  206. package/dist/ChatWidget-47KAOFLG.mjs +0 -9
  207. package/dist/ChatWidget-BDES6WUR.js +0 -18
  208. package/dist/EngageWidget-HPZAI6SU.mjs +0 -8
  209. package/dist/EngageWidget-X3NIWGMZ.js +0 -17
  210. package/dist/SignalCore-K2CTZ52G.js.map +0 -1
  211. package/dist/SignalCore-XABEH2GA.mjs.map +0 -1
  212. package/dist/SitemapSync-4BALOI4B.js +0 -16
  213. package/dist/SitemapSync-OQPRGBG3.mjs +0 -7
  214. package/dist/chunk-56X3IUOL.js.map +0 -1
  215. package/dist/chunk-AB2VYIYU.mjs.map +0 -1
  216. package/dist/chunk-BMKZHXWQ.js.map +0 -1
  217. package/dist/chunk-CDETOO5W.js +0 -8
  218. package/dist/chunk-IB4FRJDV.js.map +0 -1
  219. package/dist/chunk-SH4VZDVX.mjs.map +0 -1
  220. package/dist/chunk-WS4GNH3F.mjs +0 -259
  221. package/dist/chunk-WS4GNH3F.mjs.map +0 -1
  222. package/dist/chunk-WVAY4ZWC.mjs.map +0 -1
  223. package/dist/chunk-WZHWWOUC.js.map +0 -1
  224. package/dist/chunk-X4OPM3SK.mjs.map +0 -1
  225. package/dist/chunk-XKV73RDH.js +0 -266
  226. package/dist/chunk-XKV73RDH.js.map +0 -1
  227. package/dist/chunk-YCQHE2XT.mjs +0 -6
@@ -1,7 +1,8 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-IURQA3H5.mjs';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-QLBNK6WJ.mjs';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-CU6OGBKK.mjs';
3
- import '../chunk-WS4GNH3F.mjs';
4
- import '../chunk-YCQHE2XT.mjs';
3
+ import '../chunk-S32BEPZM.mjs';
4
+ import '../chunk-BYW3MJ36.mjs';
5
+ import '../chunk-KRZL6VYP.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
@@ -3,7 +3,7 @@ export { c as AnalyticsConfig, b as AnalyticsEvent, P as PageView } from './type
3
3
  export { L as LandingPage, l as landingPageMetadata } from './metadata-D_GiY8LJ.mjs';
4
4
  export { C as ChatConfig, c as EngageElement, d as WidgetConfig } from './types-D_1iUxOQ.mjs';
5
5
  export { a as FormField, F as FormSubmission, M as ManagedFormConfig } from './types-0dmq3k20.mjs';
6
- 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';
7
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';
8
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';
9
9
  import * as react_jsx_runtime from 'react/jsx-runtime';
package/dist/index.d.ts CHANGED
@@ -3,7 +3,7 @@ export { c as AnalyticsConfig, b as AnalyticsEvent, P as PageView } from './type
3
3
  export { L as LandingPage, l as landingPageMetadata } from './metadata-D_GiY8LJ.js';
4
4
  export { C as ChatConfig, c as EngageElement, d as WidgetConfig } from './types-D_1iUxOQ.js';
5
5
  export { a as FormField, F as FormSubmission, M as ManagedFormConfig } from './types-0dmq3k20.js';
6
- 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';
7
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';
8
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';
9
9
  import * as react_jsx_runtime from 'react/jsx-runtime';
package/dist/index.js CHANGED
@@ -1,23 +1,24 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkEU2UGO25_js = require('./chunk-EU2UGO25.js');
4
- var chunk7523LJ52_js = require('./chunk-7523LJ52.js');
4
+ var chunkKJD5UJ4C_js = require('./chunk-KJD5UJ4C.js');
5
5
  var chunkW6K7MQCC_js = require('./chunk-W6K7MQCC.js');
6
6
  require('./chunk-JP5WGL75.js');
7
- var chunkO7B7IEXY_js = require('./chunk-O7B7IEXY.js');
7
+ var chunkJBRLJMXM_js = require('./chunk-JBRLJMXM.js');
8
8
  require('./chunk-GCPPXUAI.js');
9
9
  var chunkEHJANA5C_js = require('./chunk-EHJANA5C.js');
10
10
  var chunkGSRT66PA_js = require('./chunk-GSRT66PA.js');
11
- var chunkE4VA4FYW_js = require('./chunk-E4VA4FYW.js');
12
- var chunkMJV6RC7I_js = require('./chunk-MJV6RC7I.js');
13
- var chunkC37DFD5F_js = require('./chunk-C37DFD5F.js');
14
- require('./chunk-7UYUVHCR.js');
15
- require('./chunk-HV7IYMXK.js');
11
+ var chunk7F3RT2RX_js = require('./chunk-7F3RT2RX.js');
12
+ var chunk7ZY44LI4_js = require('./chunk-7ZY44LI4.js');
13
+ var chunk7J47WT5V_js = require('./chunk-7J47WT5V.js');
14
+ require('./chunk-OIAAYRGO.js');
15
+ require('./chunk-KIUNFFDD.js');
16
16
  require('./chunk-HMFFAUCD.js');
17
17
  require('./chunk-XB57AM6T.js');
18
18
  require('./chunk-VJMPIRSD.js');
19
- var chunkXKV73RDH_js = require('./chunk-XKV73RDH.js');
20
- require('./chunk-CDETOO5W.js');
19
+ var chunkFMUTOABC_js = require('./chunk-FMUTOABC.js');
20
+ require('./chunk-KTHQKVGZ.js');
21
+ require('./chunk-K24NKI35.js');
21
22
  require('./chunk-ZSMWDLMK.js');
22
23
  var react = require('react');
23
24
  var jsxRuntime = require('react/jsx-runtime');
@@ -35,7 +36,7 @@ async function apiGet(endpoint) {
35
36
  return null;
36
37
  }
37
38
  try {
38
- const response = await chunkXKV73RDH_js.sonorFetch(
39
+ const response = await chunkFMUTOABC_js.sonorFetch(
39
40
  `${apiUrl}${endpoint}`,
40
41
  { method: "GET" },
41
42
  { apiKey, retries: 0 }
@@ -172,51 +173,51 @@ Object.defineProperty(exports, "landingPageMetadata", {
172
173
  });
173
174
  Object.defineProperty(exports, "BookingWidget", {
174
175
  enumerable: true,
175
- get: function () { return chunk7523LJ52_js.BookingWidget; }
176
+ get: function () { return chunkKJD5UJ4C_js.BookingWidget; }
176
177
  });
177
178
  Object.defineProperty(exports, "createBooking", {
178
179
  enumerable: true,
179
- get: function () { return chunk7523LJ52_js.createBooking; }
180
+ get: function () { return chunkKJD5UJ4C_js.createBooking; }
180
181
  });
181
182
  Object.defineProperty(exports, "createSlotHold", {
182
183
  enumerable: true,
183
- get: function () { return chunk7523LJ52_js.createSlotHold; }
184
+ get: function () { return chunkKJD5UJ4C_js.createSlotHold; }
184
185
  });
185
186
  Object.defineProperty(exports, "detectTimezone", {
186
187
  enumerable: true,
187
- get: function () { return chunk7523LJ52_js.detectTimezone; }
188
+ get: function () { return chunkKJD5UJ4C_js.detectTimezone; }
188
189
  });
189
190
  Object.defineProperty(exports, "fetchAvailability", {
190
191
  enumerable: true,
191
- get: function () { return chunk7523LJ52_js.fetchAvailability; }
192
+ get: function () { return chunkKJD5UJ4C_js.fetchAvailability; }
192
193
  });
193
194
  Object.defineProperty(exports, "fetchAvailableDates", {
194
195
  enumerable: true,
195
- get: function () { return chunk7523LJ52_js.fetchAvailableDates; }
196
+ get: function () { return chunkKJD5UJ4C_js.fetchAvailableDates; }
196
197
  });
197
198
  Object.defineProperty(exports, "fetchBookingTypeDetails", {
198
199
  enumerable: true,
199
- get: function () { return chunk7523LJ52_js.fetchBookingTypeDetails; }
200
+ get: function () { return chunkKJD5UJ4C_js.fetchBookingTypeDetails; }
200
201
  });
201
202
  Object.defineProperty(exports, "fetchBookingTypes", {
202
203
  enumerable: true,
203
- get: function () { return chunk7523LJ52_js.fetchBookingTypes; }
204
+ get: function () { return chunkKJD5UJ4C_js.fetchBookingTypes; }
204
205
  });
205
206
  Object.defineProperty(exports, "formatBookingDate", {
206
207
  enumerable: true,
207
- get: function () { return chunk7523LJ52_js.formatDate; }
208
+ get: function () { return chunkKJD5UJ4C_js.formatDate; }
208
209
  });
209
210
  Object.defineProperty(exports, "formatBookingTime", {
210
211
  enumerable: true,
211
- get: function () { return chunk7523LJ52_js.formatTime; }
212
+ get: function () { return chunkKJD5UJ4C_js.formatTime; }
212
213
  });
213
214
  Object.defineProperty(exports, "formatDuration", {
214
215
  enumerable: true,
215
- get: function () { return chunk7523LJ52_js.formatDuration; }
216
+ get: function () { return chunkKJD5UJ4C_js.formatDuration; }
216
217
  });
217
218
  Object.defineProperty(exports, "releaseSlotHold", {
218
219
  enumerable: true,
219
- get: function () { return chunk7523LJ52_js.releaseSlotHold; }
220
+ get: function () { return chunkKJD5UJ4C_js.releaseSlotHold; }
220
221
  });
221
222
  Object.defineProperty(exports, "clearRedirectCache", {
222
223
  enumerable: true,
@@ -236,31 +237,31 @@ Object.defineProperty(exports, "handleManagedRedirects", {
236
237
  });
237
238
  Object.defineProperty(exports, "ManagedImage", {
238
239
  enumerable: true,
239
- get: function () { return chunkO7B7IEXY_js.ManagedImage; }
240
+ get: function () { return chunkJBRLJMXM_js.ManagedImage; }
240
241
  });
241
242
  Object.defineProperty(exports, "assignImageToSlot", {
242
243
  enumerable: true,
243
- get: function () { return chunkO7B7IEXY_js.assignImageToSlot; }
244
+ get: function () { return chunkJBRLJMXM_js.assignImageToSlot; }
244
245
  });
245
246
  Object.defineProperty(exports, "clearImageSlot", {
246
247
  enumerable: true,
247
- get: function () { return chunkO7B7IEXY_js.clearImageSlot; }
248
+ get: function () { return chunkJBRLJMXM_js.clearImageSlot; }
248
249
  });
249
250
  Object.defineProperty(exports, "fetchManagedImage", {
250
251
  enumerable: true,
251
- get: function () { return chunkO7B7IEXY_js.fetchManagedImage; }
252
+ get: function () { return chunkJBRLJMXM_js.fetchManagedImage; }
252
253
  });
253
254
  Object.defineProperty(exports, "fetchManagedImages", {
254
255
  enumerable: true,
255
- get: function () { return chunkO7B7IEXY_js.fetchManagedImages; }
256
+ get: function () { return chunkJBRLJMXM_js.fetchManagedImages; }
256
257
  });
257
258
  Object.defineProperty(exports, "listImageFiles", {
258
259
  enumerable: true,
259
- get: function () { return chunkO7B7IEXY_js.listImageFiles; }
260
+ get: function () { return chunkJBRLJMXM_js.listImageFiles; }
260
261
  });
261
262
  Object.defineProperty(exports, "uploadImage", {
262
263
  enumerable: true,
263
- get: function () { return chunkO7B7IEXY_js.uploadImage; }
264
+ get: function () { return chunkJBRLJMXM_js.uploadImage; }
264
265
  });
265
266
  Object.defineProperty(exports, "TestimonialSection", {
266
267
  enumerable: true,
@@ -276,139 +277,139 @@ Object.defineProperty(exports, "fetchReviews", {
276
277
  });
277
278
  Object.defineProperty(exports, "ExperimentConversion", {
278
279
  enumerable: true,
279
- get: function () { return chunkE4VA4FYW_js.ExperimentConversion; }
280
+ get: function () { return chunk7F3RT2RX_js.ExperimentConversion; }
280
281
  });
281
282
  Object.defineProperty(exports, "SignalExperiment", {
282
283
  enumerable: true,
283
- get: function () { return chunkE4VA4FYW_js.SignalExperiment; }
284
+ get: function () { return chunk7F3RT2RX_js.SignalExperiment; }
284
285
  });
285
286
  Object.defineProperty(exports, "useExperimentVariant", {
286
287
  enumerable: true,
287
- get: function () { return chunkE4VA4FYW_js.useExperimentVariant; }
288
+ get: function () { return chunk7F3RT2RX_js.useExperimentVariant; }
288
289
  });
289
290
  Object.defineProperty(exports, "SignalBridge", {
290
291
  enumerable: true,
291
- get: function () { return chunkMJV6RC7I_js.SignalBridge; }
292
+ get: function () { return chunk7ZY44LI4_js.SignalBridge; }
292
293
  });
293
294
  Object.defineProperty(exports, "useSignal", {
294
295
  enumerable: true,
295
- get: function () { return chunkMJV6RC7I_js.useSignal; }
296
+ get: function () { return chunk7ZY44LI4_js.useSignal; }
296
297
  });
297
298
  Object.defineProperty(exports, "useSignalConfig", {
298
299
  enumerable: true,
299
- get: function () { return chunkMJV6RC7I_js.useSignalConfig; }
300
+ get: function () { return chunk7ZY44LI4_js.useSignalConfig; }
300
301
  });
301
302
  Object.defineProperty(exports, "useSignalEvent", {
302
303
  enumerable: true,
303
- get: function () { return chunkMJV6RC7I_js.useSignalEvent; }
304
+ get: function () { return chunk7ZY44LI4_js.useSignalEvent; }
304
305
  });
305
306
  Object.defineProperty(exports, "useSignalExperiment", {
306
307
  enumerable: true,
307
- get: function () { return chunkMJV6RC7I_js.useSignalExperiment; }
308
+ get: function () { return chunk7ZY44LI4_js.useSignalExperiment; }
308
309
  });
309
310
  Object.defineProperty(exports, "useSignalOutcome", {
310
311
  enumerable: true,
311
- get: function () { return chunkMJV6RC7I_js.useSignalOutcome; }
312
+ get: function () { return chunk7ZY44LI4_js.useSignalOutcome; }
312
313
  });
313
314
  Object.defineProperty(exports, "CalendarView", {
314
315
  enumerable: true,
315
- get: function () { return chunkC37DFD5F_js.CalendarView; }
316
+ get: function () { return chunk7J47WT5V_js.CalendarView; }
316
317
  });
317
318
  Object.defineProperty(exports, "CheckoutForm", {
318
319
  enumerable: true,
319
- get: function () { return chunkC37DFD5F_js.CheckoutForm; }
320
+ get: function () { return chunk7J47WT5V_js.CheckoutForm; }
320
321
  });
321
322
  Object.defineProperty(exports, "EventCalendar", {
322
323
  enumerable: true,
323
- get: function () { return chunkC37DFD5F_js.EventCalendar; }
324
+ get: function () { return chunk7J47WT5V_js.EventCalendar; }
324
325
  });
325
326
  Object.defineProperty(exports, "EventCheckout", {
326
327
  enumerable: true,
327
- get: function () { return chunkC37DFD5F_js.EventCheckout; }
328
+ get: function () { return chunk7J47WT5V_js.EventCheckout; }
328
329
  });
329
330
  Object.defineProperty(exports, "EventEmbed", {
330
331
  enumerable: true,
331
- get: function () { return chunkC37DFD5F_js.EventEmbed; }
332
+ get: function () { return chunk7J47WT5V_js.EventEmbed; }
332
333
  });
333
334
  Object.defineProperty(exports, "EventModal", {
334
335
  enumerable: true,
335
- get: function () { return chunkC37DFD5F_js.EventModal; }
336
+ get: function () { return chunk7J47WT5V_js.EventModal; }
336
337
  });
337
338
  Object.defineProperty(exports, "EventTile", {
338
339
  enumerable: true,
339
- get: function () { return chunkC37DFD5F_js.EventTile; }
340
+ get: function () { return chunk7J47WT5V_js.EventTile; }
340
341
  });
341
342
  Object.defineProperty(exports, "OfferingCard", {
342
343
  enumerable: true,
343
- get: function () { return chunkC37DFD5F_js.OfferingCard; }
344
+ get: function () { return chunk7J47WT5V_js.OfferingCard; }
344
345
  });
345
346
  Object.defineProperty(exports, "OfferingList", {
346
347
  enumerable: true,
347
- get: function () { return chunkC37DFD5F_js.OfferingList; }
348
+ get: function () { return chunk7J47WT5V_js.OfferingList; }
348
349
  });
349
350
  Object.defineProperty(exports, "ProductEmbed", {
350
351
  enumerable: true,
351
- get: function () { return chunkC37DFD5F_js.ProductEmbed; }
352
+ get: function () { return chunk7J47WT5V_js.ProductEmbed; }
352
353
  });
353
354
  Object.defineProperty(exports, "RegistrationForm", {
354
355
  enumerable: true,
355
- get: function () { return chunkC37DFD5F_js.RegistrationForm; }
356
+ get: function () { return chunk7J47WT5V_js.RegistrationForm; }
356
357
  });
357
358
  Object.defineProperty(exports, "UpcomingEvents", {
358
359
  enumerable: true,
359
- get: function () { return chunkC37DFD5F_js.UpcomingEvents; }
360
+ get: function () { return chunk7J47WT5V_js.UpcomingEvents; }
360
361
  });
361
362
  Object.defineProperty(exports, "createCheckoutSession", {
362
363
  enumerable: true,
363
- get: function () { return chunkC37DFD5F_js.createCheckoutSession; }
364
+ get: function () { return chunk7J47WT5V_js.createCheckoutSession; }
364
365
  });
365
366
  Object.defineProperty(exports, "fetchNextEvent", {
366
367
  enumerable: true,
367
- get: function () { return chunkC37DFD5F_js.fetchNextEvent; }
368
+ get: function () { return chunk7J47WT5V_js.fetchNextEvent; }
368
369
  });
369
370
  Object.defineProperty(exports, "fetchOffering", {
370
371
  enumerable: true,
371
- get: function () { return chunkC37DFD5F_js.fetchOffering; }
372
+ get: function () { return chunk7J47WT5V_js.fetchOffering; }
372
373
  });
373
374
  Object.defineProperty(exports, "fetchOfferings", {
374
375
  enumerable: true,
375
- get: function () { return chunkC37DFD5F_js.fetchOfferings; }
376
+ get: function () { return chunk7J47WT5V_js.fetchOfferings; }
376
377
  });
377
378
  Object.defineProperty(exports, "fetchProducts", {
378
379
  enumerable: true,
379
- get: function () { return chunkC37DFD5F_js.fetchProducts; }
380
+ get: function () { return chunk7J47WT5V_js.fetchProducts; }
380
381
  });
381
382
  Object.defineProperty(exports, "fetchServices", {
382
383
  enumerable: true,
383
- get: function () { return chunkC37DFD5F_js.fetchServices; }
384
+ get: function () { return chunk7J47WT5V_js.fetchServices; }
384
385
  });
385
386
  Object.defineProperty(exports, "fetchUpcomingEvents", {
386
387
  enumerable: true,
387
- get: function () { return chunkC37DFD5F_js.fetchUpcomingEvents; }
388
+ get: function () { return chunk7J47WT5V_js.fetchUpcomingEvents; }
388
389
  });
389
390
  Object.defineProperty(exports, "formatDate", {
390
391
  enumerable: true,
391
- get: function () { return chunkC37DFD5F_js.formatDate; }
392
+ get: function () { return chunk7J47WT5V_js.formatDate; }
392
393
  });
393
394
  Object.defineProperty(exports, "formatDateTime", {
394
395
  enumerable: true,
395
- get: function () { return chunkC37DFD5F_js.formatDateTime; }
396
+ get: function () { return chunk7J47WT5V_js.formatDateTime; }
396
397
  });
397
398
  Object.defineProperty(exports, "formatPrice", {
398
399
  enumerable: true,
399
- get: function () { return chunkC37DFD5F_js.formatPrice; }
400
+ get: function () { return chunk7J47WT5V_js.formatPrice; }
400
401
  });
401
402
  Object.defineProperty(exports, "getOfferingUrl", {
402
403
  enumerable: true,
403
- get: function () { return chunkC37DFD5F_js.getOfferingUrl; }
404
+ get: function () { return chunk7J47WT5V_js.getOfferingUrl; }
404
405
  });
405
406
  Object.defineProperty(exports, "registerForEvent", {
406
407
  enumerable: true,
407
- get: function () { return chunkC37DFD5F_js.registerForEvent; }
408
+ get: function () { return chunk7J47WT5V_js.registerForEvent; }
408
409
  });
409
410
  Object.defineProperty(exports, "useEventModal", {
410
411
  enumerable: true,
411
- get: function () { return chunkC37DFD5F_js.useEventModal; }
412
+ get: function () { return chunk7J47WT5V_js.useEventModal; }
412
413
  });
413
414
  exports.AffiliateCard = AffiliateCard;
414
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,21 +1,22 @@
1
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-VE5XLADP.mjs';
2
+ export { BookingWidget, createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate as formatBookingDate, formatTime as formatBookingTime, formatDuration, releaseSlotHold } from './chunk-C7MKSHRI.mjs';
3
3
  export { clearRedirectCache, fetchRedirectRules, generateNextRedirects, handleManagedRedirects } from './chunk-7LAOWIWE.mjs';
4
4
  import './chunk-B22WSN4L.mjs';
5
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from './chunk-IURQA3H5.mjs';
5
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from './chunk-QLBNK6WJ.mjs';
6
6
  import './chunk-CU6OGBKK.mjs';
7
7
  export { TestimonialSection } from './chunk-VIGRGMWR.mjs';
8
8
  export { fetchReviewStats, fetchReviews } from './chunk-MU7DTEUF.mjs';
9
- export { ExperimentConversion, SignalExperiment, useExperimentVariant } from './chunk-JRUNONG5.mjs';
10
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from './chunk-VNQFKBKF.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-472FTEPP.mjs';
12
- import './chunk-O4RVFKQW.mjs';
13
- import './chunk-G3G4HQT3.mjs';
9
+ export { ExperimentConversion, SignalExperiment, useExperimentVariant } from './chunk-V4LF47AS.mjs';
10
+ export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from './chunk-RHKFINCS.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-SOPPUXR3.mjs';
12
+ import './chunk-5WRJRJSM.mjs';
13
+ import './chunk-VN3TGLT3.mjs';
14
14
  import './chunk-3DPXOZAU.mjs';
15
15
  import './chunk-AX4AROLH.mjs';
16
16
  import './chunk-6EDVCUAG.mjs';
17
- import { sonorFetch } from './chunk-WS4GNH3F.mjs';
18
- import './chunk-YCQHE2XT.mjs';
17
+ import { sonorFetch } from './chunk-S32BEPZM.mjs';
18
+ import './chunk-BYW3MJ36.mjs';
19
+ import './chunk-KRZL6VYP.mjs';
19
20
  import './chunk-4XPGGLVP.mjs';
20
21
  import { useState, useEffect } from 'react';
21
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"]}
@@ -1,23 +1,25 @@
1
1
  'use client';
2
2
  'use strict';
3
3
 
4
- var chunk56X3IUOL_js = require('../chunk-56X3IUOL.js');
5
- require('../chunk-RMUOY6XB.js');
4
+ var chunk3XQV5HDW_js = require('../chunk-3XQV5HDW.js');
5
+ require('../chunk-VELBKUIM.js');
6
+ require('../chunk-CPYUZSJN.js');
6
7
  require('../chunk-HGNSJXWT.js');
7
8
  require('../chunk-Q2NBD54V.js');
8
- require('../chunk-WZHWWOUC.js');
9
- require('../chunk-MJV6RC7I.js');
9
+ require('../chunk-NB4MK2Q5.js');
10
+ require('../chunk-7ZY44LI4.js');
10
11
  require('../chunk-XB57AM6T.js');
11
12
  require('../chunk-VJMPIRSD.js');
12
- require('../chunk-XKV73RDH.js');
13
- require('../chunk-CDETOO5W.js');
13
+ require('../chunk-FMUTOABC.js');
14
+ require('../chunk-KTHQKVGZ.js');
15
+ require('../chunk-K24NKI35.js');
14
16
  require('../chunk-ZSMWDLMK.js');
15
17
 
16
18
 
17
19
 
18
20
  Object.defineProperty(exports, "SiteKitClientProviders", {
19
21
  enumerable: true,
20
- get: function () { return chunk56X3IUOL_js.SiteKitClientProviders; }
22
+ get: function () { return chunk3XQV5HDW_js.SiteKitClientProviders; }
21
23
  });
22
24
  //# sourceMappingURL=client.js.map
23
25
  //# sourceMappingURL=client.js.map
@@ -1,14 +1,16 @@
1
1
  'use client';
2
- export { SiteKitClientProviders } from '../chunk-WVAY4ZWC.mjs';
3
- import '../chunk-QE53WRXW.mjs';
2
+ export { SiteKitClientProviders } from '../chunk-253MGZYN.mjs';
3
+ import '../chunk-N5H6ORXN.mjs';
4
+ import '../chunk-ZTEQXVQF.mjs';
4
5
  import '../chunk-ZVBLXXNJ.mjs';
5
6
  import '../chunk-ZPLN537Q.mjs';
6
- import '../chunk-X4OPM3SK.mjs';
7
- import '../chunk-VNQFKBKF.mjs';
7
+ import '../chunk-NI7OY4FW.mjs';
8
+ import '../chunk-RHKFINCS.mjs';
8
9
  import '../chunk-AX4AROLH.mjs';
9
10
  import '../chunk-6EDVCUAG.mjs';
10
- import '../chunk-WS4GNH3F.mjs';
11
- import '../chunk-YCQHE2XT.mjs';
11
+ import '../chunk-S32BEPZM.mjs';
12
+ import '../chunk-BYW3MJ36.mjs';
13
+ import '../chunk-KRZL6VYP.mjs';
12
14
  import '../chunk-4XPGGLVP.mjs';
13
15
  //# sourceMappingURL=client.mjs.map
14
16
  //# sourceMappingURL=client.mjs.map