@sonordev/site-kit 3.3.0 → 3.4.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 (200) hide show
  1. package/agent-manifest.json +13 -1
  2. package/dist/AnalyticsProvider-ARAWVJPX.js +30 -0
  3. package/dist/{AnalyticsProvider-26VS3CQR.js.map → AnalyticsProvider-ARAWVJPX.js.map} +1 -1
  4. package/dist/AnalyticsProvider-HIGSPNRA.mjs +9 -0
  5. package/dist/{AnalyticsProvider-AMHG4DIE.mjs.map → AnalyticsProvider-HIGSPNRA.mjs.map} +1 -1
  6. package/dist/ChatWidget-47KAOFLG.mjs +9 -0
  7. package/dist/{ChatWidget-UKPEQEHB.mjs.map → ChatWidget-47KAOFLG.mjs.map} +1 -1
  8. package/dist/ChatWidget-BDES6WUR.js +18 -0
  9. package/dist/{ChatWidget-NIYNSMLU.js.map → ChatWidget-BDES6WUR.js.map} +1 -1
  10. package/dist/EngageWidget-HPZAI6SU.mjs +8 -0
  11. package/dist/{EngageWidget-S76ZMDEF.mjs.map → EngageWidget-HPZAI6SU.mjs.map} +1 -1
  12. package/dist/EngageWidget-X3NIWGMZ.js +17 -0
  13. package/dist/{EngageWidget-33QCFWQW.js.map → EngageWidget-X3NIWGMZ.js.map} +1 -1
  14. package/dist/{SignalCore-2UXXM4FF.js → SignalCore-K2CTZ52G.js} +61 -43
  15. package/dist/SignalCore-K2CTZ52G.js.map +1 -0
  16. package/dist/{SignalCore-2AUGAOQT.mjs → SignalCore-XABEH2GA.mjs} +55 -37
  17. package/dist/SignalCore-XABEH2GA.mjs.map +1 -0
  18. package/dist/SitemapSync-4BALOI4B.js +16 -0
  19. package/dist/{SitemapSync-WQJMHJNY.js.map → SitemapSync-4BALOI4B.js.map} +1 -1
  20. package/dist/SitemapSync-OQPRGBG3.mjs +7 -0
  21. package/dist/{SitemapSync-RBHXPQAQ.mjs.map → SitemapSync-OQPRGBG3.mjs.map} +1 -1
  22. package/dist/analytics/index.js +13 -12
  23. package/dist/analytics/index.mjs +6 -5
  24. package/dist/{chunk-2RLG4KBJ.mjs → chunk-3SIIYHVE.mjs} +5 -5
  25. package/dist/{chunk-2RLG4KBJ.mjs.map → chunk-3SIIYHVE.mjs.map} +1 -1
  26. package/dist/{chunk-PLQ4CUNI.mjs → chunk-472FTEPP.mjs} +4 -4
  27. package/dist/{chunk-PLQ4CUNI.mjs.map → chunk-472FTEPP.mjs.map} +1 -1
  28. package/dist/{chunk-BOTWTNHW.js → chunk-56X3IUOL.js} +16 -16
  29. package/dist/{chunk-BOTWTNHW.js.map → chunk-56X3IUOL.js.map} +1 -1
  30. package/dist/{chunk-QOFC3BYG.js → chunk-5SJKYZID.js} +9 -28
  31. package/dist/chunk-5SJKYZID.js.map +1 -0
  32. package/dist/{chunk-SLOZWRWU.mjs → chunk-5WEADCND.mjs} +4 -4
  33. package/dist/{chunk-SLOZWRWU.mjs.map → chunk-5WEADCND.mjs.map} +1 -1
  34. package/dist/chunk-6EDVCUAG.mjs +29 -0
  35. package/dist/chunk-6EDVCUAG.mjs.map +1 -0
  36. package/dist/{chunk-EL6ZMYD2.js → chunk-6Q72JAL2.js} +8 -8
  37. package/dist/{chunk-EL6ZMYD2.js.map → chunk-6Q72JAL2.js.map} +1 -1
  38. package/dist/{chunk-BPKDRTEA.js → chunk-7523LJ52.js} +9 -9
  39. package/dist/{chunk-BPKDRTEA.js.map → chunk-7523LJ52.js.map} +1 -1
  40. package/dist/{chunk-EM4DFSC5.js → chunk-7UYUVHCR.js} +4 -4
  41. package/dist/{chunk-EM4DFSC5.js.map → chunk-7UYUVHCR.js.map} +1 -1
  42. package/dist/{chunk-EE6SFAZP.mjs → chunk-AX4AROLH.mjs} +5 -14
  43. package/dist/chunk-AX4AROLH.mjs.map +1 -0
  44. package/dist/{chunk-G4FJJK6J.js → chunk-C37DFD5F.js} +14 -14
  45. package/dist/{chunk-G4FJJK6J.js.map → chunk-C37DFD5F.js.map} +1 -1
  46. package/dist/chunk-CDETOO5W.js +8 -0
  47. package/dist/{chunk-EOENN46G.js.map → chunk-CDETOO5W.js.map} +1 -1
  48. package/dist/{chunk-I2M533CW.js → chunk-E4VA4FYW.js} +8 -8
  49. package/dist/{chunk-I2M533CW.js.map → chunk-E4VA4FYW.js.map} +1 -1
  50. package/dist/chunk-EU2UGO25.js +52 -0
  51. package/dist/chunk-EU2UGO25.js.map +1 -0
  52. package/dist/{chunk-NNPF4KRZ.mjs → chunk-G3G4HQT3.mjs} +49 -5
  53. package/dist/chunk-G3G4HQT3.mjs.map +1 -0
  54. package/dist/{chunk-XOCQANYF.js → chunk-HV7IYMXK.js} +61 -17
  55. package/dist/chunk-HV7IYMXK.js.map +1 -0
  56. package/dist/{chunk-K2P7KPEQ.js → chunk-IB34IYMN.js} +14 -31
  57. package/dist/chunk-IB34IYMN.js.map +1 -0
  58. package/dist/chunk-IBMOX3YE.mjs +48 -0
  59. package/dist/chunk-IBMOX3YE.mjs.map +1 -0
  60. package/dist/{chunk-6BDXN4X3.mjs → chunk-IURQA3H5.mjs} +3 -3
  61. package/dist/{chunk-6BDXN4X3.mjs.map → chunk-IURQA3H5.mjs.map} +1 -1
  62. package/dist/chunk-JEOKDUPQ.js +45 -0
  63. package/dist/chunk-JEOKDUPQ.js.map +1 -0
  64. package/dist/{chunk-5KVT66R6.mjs → chunk-JRUNONG5.mjs} +3 -3
  65. package/dist/{chunk-5KVT66R6.mjs.map → chunk-JRUNONG5.mjs.map} +1 -1
  66. package/dist/chunk-LOS5D6B3.js +72 -0
  67. package/dist/chunk-LOS5D6B3.js.map +1 -0
  68. package/dist/{chunk-WEHJRE3H.mjs → chunk-LQHZFUZJ.mjs} +8 -25
  69. package/dist/chunk-LQHZFUZJ.mjs.map +1 -0
  70. package/dist/{chunk-P3QZRG2Z.js → chunk-MCDQM75H.js} +15 -15
  71. package/dist/{chunk-P3QZRG2Z.js.map → chunk-MCDQM75H.js.map} +1 -1
  72. package/dist/{chunk-6UK5JIKE.js → chunk-MJV6RC7I.js} +3 -3
  73. package/dist/{chunk-6UK5JIKE.js.map → chunk-MJV6RC7I.js.map} +1 -1
  74. package/dist/{chunk-PUGRSMAV.mjs → chunk-O4RVFKQW.mjs} +3 -3
  75. package/dist/{chunk-PUGRSMAV.mjs.map → chunk-O4RVFKQW.mjs.map} +1 -1
  76. package/dist/{chunk-WAYG3LS2.js → chunk-O7B7IEXY.js} +14 -14
  77. package/dist/{chunk-WAYG3LS2.js.map → chunk-O7B7IEXY.js.map} +1 -1
  78. package/dist/{chunk-M4HLDK62.mjs → chunk-PYA4BR2N.mjs} +6 -25
  79. package/dist/chunk-PYA4BR2N.mjs.map +1 -0
  80. package/dist/{chunk-X72PFC4X.mjs → chunk-QE53WRXW.mjs} +4 -4
  81. package/dist/{chunk-X72PFC4X.mjs.map → chunk-QE53WRXW.mjs.map} +1 -1
  82. package/dist/{chunk-DLJZYWP3.mjs → chunk-QGV7FEUI.mjs} +7 -43
  83. package/dist/chunk-QGV7FEUI.mjs.map +1 -0
  84. package/dist/chunk-QJU6HBSK.mjs +39 -0
  85. package/dist/chunk-QJU6HBSK.mjs.map +1 -0
  86. package/dist/{chunk-FX3VR4BF.js → chunk-RMUOY6XB.js} +7 -7
  87. package/dist/{chunk-FX3VR4BF.js.map → chunk-RMUOY6XB.js.map} +1 -1
  88. package/dist/{chunk-ILLOVVVP.mjs → chunk-VE5XLADP.mjs} +3 -3
  89. package/dist/{chunk-ILLOVVVP.mjs.map → chunk-VE5XLADP.mjs.map} +1 -1
  90. package/dist/chunk-VJMPIRSD.js +31 -0
  91. package/dist/chunk-VJMPIRSD.js.map +1 -0
  92. package/dist/{chunk-Z26CMPBX.js → chunk-VMVEL4WU.js} +7 -43
  93. package/dist/chunk-VMVEL4WU.js.map +1 -0
  94. package/dist/{chunk-ZCZEKWFW.mjs → chunk-VNQFKBKF.mjs} +3 -3
  95. package/dist/{chunk-ZCZEKWFW.mjs.map → chunk-VNQFKBKF.mjs.map} +1 -1
  96. package/dist/{chunk-FO6Y27AH.mjs → chunk-WS4GNH3F.mjs} +4 -4
  97. package/dist/{chunk-FO6Y27AH.mjs.map → chunk-WS4GNH3F.mjs.map} +1 -1
  98. package/dist/{chunk-AXFM4MFK.mjs → chunk-WVAY4ZWC.mjs} +9 -9
  99. package/dist/{chunk-AXFM4MFK.mjs.map → chunk-WVAY4ZWC.mjs.map} +1 -1
  100. package/dist/{chunk-3BNFUMLL.js → chunk-XB57AM6T.js} +5 -14
  101. package/dist/chunk-XB57AM6T.js.map +1 -0
  102. package/dist/chunk-XIJ4F6IE.mjs +63 -0
  103. package/dist/chunk-XIJ4F6IE.mjs.map +1 -0
  104. package/dist/{chunk-M2EGCGIT.js → chunk-XKV73RDH.js} +9 -7
  105. package/dist/{chunk-M2EGCGIT.js.map → chunk-XKV73RDH.js.map} +1 -1
  106. package/dist/chunk-YCQHE2XT.mjs +6 -0
  107. package/dist/{chunk-S4FJIG6Y.mjs.map → chunk-YCQHE2XT.mjs.map} +1 -1
  108. package/dist/cli/index.js +2 -2
  109. package/dist/cli/index.mjs +1 -1
  110. package/dist/client/index.js +6 -5
  111. package/dist/client/index.mjs +2 -1
  112. package/dist/commerce/index.js +52 -51
  113. package/dist/commerce/index.mjs +7 -6
  114. package/dist/discover-Q5RWC27Y.js +21 -0
  115. package/dist/discover-Q5RWC27Y.js.map +1 -0
  116. package/dist/discover-ROPVYJJP.mjs +4 -0
  117. package/dist/discover-ROPVYJJP.mjs.map +1 -0
  118. package/dist/engage/index.js +10 -9
  119. package/dist/engage/index.js.map +1 -1
  120. package/dist/engage/index.mjs +7 -6
  121. package/dist/engage/index.mjs.map +1 -1
  122. package/dist/fleet/index.js +7 -7
  123. package/dist/fleet/index.mjs +3 -3
  124. package/dist/forms/index.js +13 -12
  125. package/dist/forms/index.js.map +1 -1
  126. package/dist/forms/index.mjs +5 -4
  127. package/dist/forms/index.mjs.map +1 -1
  128. package/dist/images/index.js +10 -10
  129. package/dist/images/index.mjs +3 -3
  130. package/dist/index.d.mts +1 -0
  131. package/dist/index.d.ts +1 -0
  132. package/dist/index.js +74 -64
  133. package/dist/index.js.map +1 -1
  134. package/dist/index.mjs +12 -10
  135. package/dist/index.mjs.map +1 -1
  136. package/dist/landing/index.d.mts +21 -0
  137. package/dist/landing/index.d.ts +21 -0
  138. package/dist/landing/index.js +21 -0
  139. package/dist/landing/index.js.map +1 -0
  140. package/dist/landing/index.mjs +4 -0
  141. package/dist/landing/index.mjs.map +1 -0
  142. package/dist/layout/client.js +8 -7
  143. package/dist/layout/client.mjs +7 -6
  144. package/dist/layout/index.js +9 -8
  145. package/dist/layout/index.js.map +1 -1
  146. package/dist/layout/index.mjs +7 -6
  147. package/dist/layout/index.mjs.map +1 -1
  148. package/dist/maps/index.js +4 -4
  149. package/dist/maps/index.mjs +2 -2
  150. package/dist/metadata-D_GiY8LJ.d.mts +36 -0
  151. package/dist/metadata-D_GiY8LJ.d.ts +36 -0
  152. package/dist/middleware/index.js +2 -8
  153. package/dist/middleware/index.js.map +1 -1
  154. package/dist/middleware/index.mjs +2 -8
  155. package/dist/middleware/index.mjs.map +1 -1
  156. package/dist/seo/client.js +5 -4
  157. package/dist/seo/client.mjs +4 -3
  158. package/dist/seo/index.js +14 -13
  159. package/dist/seo/index.js.map +1 -1
  160. package/dist/seo/index.mjs +6 -5
  161. package/dist/seo/index.mjs.map +1 -1
  162. package/dist/seo/register-sitemap-cli.js +64 -96
  163. package/dist/seo/register-sitemap-cli.js.map +1 -1
  164. package/dist/seo/register-sitemap-cli.mjs +62 -94
  165. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  166. package/dist/seo/server.js +5 -5
  167. package/dist/seo/server.mjs +1 -1
  168. package/dist/signal/index.js +11 -11
  169. package/dist/signal/index.mjs +2 -2
  170. package/dist/sitemap/index.d.mts +15 -17
  171. package/dist/sitemap/index.d.ts +15 -17
  172. package/dist/sitemap/index.js +14 -37
  173. package/dist/sitemap/index.js.map +1 -1
  174. package/dist/sitemap/index.mjs +11 -34
  175. package/dist/sitemap/index.mjs.map +1 -1
  176. package/dist/sync/index.js +15 -15
  177. package/dist/sync/index.mjs +3 -3
  178. package/package.json +11 -1
  179. package/dist/AnalyticsProvider-26VS3CQR.js +0 -29
  180. package/dist/AnalyticsProvider-AMHG4DIE.mjs +0 -8
  181. package/dist/ChatWidget-NIYNSMLU.js +0 -17
  182. package/dist/ChatWidget-UKPEQEHB.mjs +0 -8
  183. package/dist/EngageWidget-33QCFWQW.js +0 -16
  184. package/dist/EngageWidget-S76ZMDEF.mjs +0 -7
  185. package/dist/SignalCore-2AUGAOQT.mjs.map +0 -1
  186. package/dist/SignalCore-2UXXM4FF.js.map +0 -1
  187. package/dist/SitemapSync-RBHXPQAQ.mjs +0 -6
  188. package/dist/SitemapSync-WQJMHJNY.js +0 -15
  189. package/dist/chunk-3BNFUMLL.js.map +0 -1
  190. package/dist/chunk-DLJZYWP3.mjs.map +0 -1
  191. package/dist/chunk-EE6SFAZP.mjs.map +0 -1
  192. package/dist/chunk-EOENN46G.js +0 -8
  193. package/dist/chunk-K2P7KPEQ.js.map +0 -1
  194. package/dist/chunk-M4HLDK62.mjs.map +0 -1
  195. package/dist/chunk-NNPF4KRZ.mjs.map +0 -1
  196. package/dist/chunk-QOFC3BYG.js.map +0 -1
  197. package/dist/chunk-S4FJIG6Y.mjs +0 -6
  198. package/dist/chunk-WEHJRE3H.mjs.map +0 -1
  199. package/dist/chunk-XOCQANYF.js.map +0 -1
  200. package/dist/chunk-Z26CMPBX.js.map +0 -1
@@ -1,7 +1,7 @@
1
- export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-6BDXN4X3.mjs';
1
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from '../chunk-IURQA3H5.mjs';
2
2
  export { ManagedFavicon, getManagedFaviconUrl } from '../chunk-CU6OGBKK.mjs';
3
- import '../chunk-FO6Y27AH.mjs';
4
- import '../chunk-S4FJIG6Y.mjs';
3
+ import '../chunk-WS4GNH3F.mjs';
4
+ import '../chunk-YCQHE2XT.mjs';
5
5
  import '../chunk-4XPGGLVP.mjs';
6
6
  //# sourceMappingURL=index.mjs.map
7
7
  //# sourceMappingURL=index.mjs.map
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
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
6
  export { a as BlogAuthor, b as BlogCategory, B as BlogPostType } from './types-DYOumpUT.mjs';
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
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
6
  export { a as BlogAuthor, b as BlogCategory, B as BlogPostType } from './types-DYOumpUT.js';
package/dist/index.js CHANGED
@@ -1,21 +1,23 @@
1
1
  'use strict';
2
2
 
3
- var chunkBPKDRTEA_js = require('./chunk-BPKDRTEA.js');
3
+ var chunkEU2UGO25_js = require('./chunk-EU2UGO25.js');
4
+ var chunk7523LJ52_js = require('./chunk-7523LJ52.js');
4
5
  var chunkW6K7MQCC_js = require('./chunk-W6K7MQCC.js');
5
6
  require('./chunk-JP5WGL75.js');
6
- var chunkWAYG3LS2_js = require('./chunk-WAYG3LS2.js');
7
+ var chunkO7B7IEXY_js = require('./chunk-O7B7IEXY.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 chunkI2M533CW_js = require('./chunk-I2M533CW.js');
11
- var chunk6UK5JIKE_js = require('./chunk-6UK5JIKE.js');
12
- var chunkG4FJJK6J_js = require('./chunk-G4FJJK6J.js');
13
- require('./chunk-EM4DFSC5.js');
14
- require('./chunk-XOCQANYF.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');
15
16
  require('./chunk-HMFFAUCD.js');
16
- require('./chunk-3BNFUMLL.js');
17
- var chunkM2EGCGIT_js = require('./chunk-M2EGCGIT.js');
18
- require('./chunk-EOENN46G.js');
17
+ require('./chunk-XB57AM6T.js');
18
+ require('./chunk-VJMPIRSD.js');
19
+ var chunkXKV73RDH_js = require('./chunk-XKV73RDH.js');
20
+ require('./chunk-CDETOO5W.js');
19
21
  require('./chunk-ZSMWDLMK.js');
20
22
  var react = require('react');
21
23
  var jsxRuntime = require('react/jsx-runtime');
@@ -33,7 +35,7 @@ async function apiGet(endpoint) {
33
35
  return null;
34
36
  }
35
37
  try {
36
- const response = await chunkM2EGCGIT_js.sonorFetch(
38
+ const response = await chunkXKV73RDH_js.sonorFetch(
37
39
  `${apiUrl}${endpoint}`,
38
40
  { method: "GET" },
39
41
  { apiKey, retries: 0 }
@@ -160,53 +162,61 @@ function AffiliatesWidget({
160
162
  ) });
161
163
  }
162
164
 
165
+ Object.defineProperty(exports, "LandingPage", {
166
+ enumerable: true,
167
+ get: function () { return chunkEU2UGO25_js.LandingPage; }
168
+ });
169
+ Object.defineProperty(exports, "landingPageMetadata", {
170
+ enumerable: true,
171
+ get: function () { return chunkEU2UGO25_js.landingPageMetadata; }
172
+ });
163
173
  Object.defineProperty(exports, "BookingWidget", {
164
174
  enumerable: true,
165
- get: function () { return chunkBPKDRTEA_js.BookingWidget; }
175
+ get: function () { return chunk7523LJ52_js.BookingWidget; }
166
176
  });
167
177
  Object.defineProperty(exports, "createBooking", {
168
178
  enumerable: true,
169
- get: function () { return chunkBPKDRTEA_js.createBooking; }
179
+ get: function () { return chunk7523LJ52_js.createBooking; }
170
180
  });
171
181
  Object.defineProperty(exports, "createSlotHold", {
172
182
  enumerable: true,
173
- get: function () { return chunkBPKDRTEA_js.createSlotHold; }
183
+ get: function () { return chunk7523LJ52_js.createSlotHold; }
174
184
  });
175
185
  Object.defineProperty(exports, "detectTimezone", {
176
186
  enumerable: true,
177
- get: function () { return chunkBPKDRTEA_js.detectTimezone; }
187
+ get: function () { return chunk7523LJ52_js.detectTimezone; }
178
188
  });
179
189
  Object.defineProperty(exports, "fetchAvailability", {
180
190
  enumerable: true,
181
- get: function () { return chunkBPKDRTEA_js.fetchAvailability; }
191
+ get: function () { return chunk7523LJ52_js.fetchAvailability; }
182
192
  });
183
193
  Object.defineProperty(exports, "fetchAvailableDates", {
184
194
  enumerable: true,
185
- get: function () { return chunkBPKDRTEA_js.fetchAvailableDates; }
195
+ get: function () { return chunk7523LJ52_js.fetchAvailableDates; }
186
196
  });
187
197
  Object.defineProperty(exports, "fetchBookingTypeDetails", {
188
198
  enumerable: true,
189
- get: function () { return chunkBPKDRTEA_js.fetchBookingTypeDetails; }
199
+ get: function () { return chunk7523LJ52_js.fetchBookingTypeDetails; }
190
200
  });
191
201
  Object.defineProperty(exports, "fetchBookingTypes", {
192
202
  enumerable: true,
193
- get: function () { return chunkBPKDRTEA_js.fetchBookingTypes; }
203
+ get: function () { return chunk7523LJ52_js.fetchBookingTypes; }
194
204
  });
195
205
  Object.defineProperty(exports, "formatBookingDate", {
196
206
  enumerable: true,
197
- get: function () { return chunkBPKDRTEA_js.formatDate; }
207
+ get: function () { return chunk7523LJ52_js.formatDate; }
198
208
  });
199
209
  Object.defineProperty(exports, "formatBookingTime", {
200
210
  enumerable: true,
201
- get: function () { return chunkBPKDRTEA_js.formatTime; }
211
+ get: function () { return chunk7523LJ52_js.formatTime; }
202
212
  });
203
213
  Object.defineProperty(exports, "formatDuration", {
204
214
  enumerable: true,
205
- get: function () { return chunkBPKDRTEA_js.formatDuration; }
215
+ get: function () { return chunk7523LJ52_js.formatDuration; }
206
216
  });
207
217
  Object.defineProperty(exports, "releaseSlotHold", {
208
218
  enumerable: true,
209
- get: function () { return chunkBPKDRTEA_js.releaseSlotHold; }
219
+ get: function () { return chunk7523LJ52_js.releaseSlotHold; }
210
220
  });
211
221
  Object.defineProperty(exports, "clearRedirectCache", {
212
222
  enumerable: true,
@@ -226,31 +236,31 @@ Object.defineProperty(exports, "handleManagedRedirects", {
226
236
  });
227
237
  Object.defineProperty(exports, "ManagedImage", {
228
238
  enumerable: true,
229
- get: function () { return chunkWAYG3LS2_js.ManagedImage; }
239
+ get: function () { return chunkO7B7IEXY_js.ManagedImage; }
230
240
  });
231
241
  Object.defineProperty(exports, "assignImageToSlot", {
232
242
  enumerable: true,
233
- get: function () { return chunkWAYG3LS2_js.assignImageToSlot; }
243
+ get: function () { return chunkO7B7IEXY_js.assignImageToSlot; }
234
244
  });
235
245
  Object.defineProperty(exports, "clearImageSlot", {
236
246
  enumerable: true,
237
- get: function () { return chunkWAYG3LS2_js.clearImageSlot; }
247
+ get: function () { return chunkO7B7IEXY_js.clearImageSlot; }
238
248
  });
239
249
  Object.defineProperty(exports, "fetchManagedImage", {
240
250
  enumerable: true,
241
- get: function () { return chunkWAYG3LS2_js.fetchManagedImage; }
251
+ get: function () { return chunkO7B7IEXY_js.fetchManagedImage; }
242
252
  });
243
253
  Object.defineProperty(exports, "fetchManagedImages", {
244
254
  enumerable: true,
245
- get: function () { return chunkWAYG3LS2_js.fetchManagedImages; }
255
+ get: function () { return chunkO7B7IEXY_js.fetchManagedImages; }
246
256
  });
247
257
  Object.defineProperty(exports, "listImageFiles", {
248
258
  enumerable: true,
249
- get: function () { return chunkWAYG3LS2_js.listImageFiles; }
259
+ get: function () { return chunkO7B7IEXY_js.listImageFiles; }
250
260
  });
251
261
  Object.defineProperty(exports, "uploadImage", {
252
262
  enumerable: true,
253
- get: function () { return chunkWAYG3LS2_js.uploadImage; }
263
+ get: function () { return chunkO7B7IEXY_js.uploadImage; }
254
264
  });
255
265
  Object.defineProperty(exports, "TestimonialSection", {
256
266
  enumerable: true,
@@ -266,139 +276,139 @@ Object.defineProperty(exports, "fetchReviews", {
266
276
  });
267
277
  Object.defineProperty(exports, "ExperimentConversion", {
268
278
  enumerable: true,
269
- get: function () { return chunkI2M533CW_js.ExperimentConversion; }
279
+ get: function () { return chunkE4VA4FYW_js.ExperimentConversion; }
270
280
  });
271
281
  Object.defineProperty(exports, "SignalExperiment", {
272
282
  enumerable: true,
273
- get: function () { return chunkI2M533CW_js.SignalExperiment; }
283
+ get: function () { return chunkE4VA4FYW_js.SignalExperiment; }
274
284
  });
275
285
  Object.defineProperty(exports, "useExperimentVariant", {
276
286
  enumerable: true,
277
- get: function () { return chunkI2M533CW_js.useExperimentVariant; }
287
+ get: function () { return chunkE4VA4FYW_js.useExperimentVariant; }
278
288
  });
279
289
  Object.defineProperty(exports, "SignalBridge", {
280
290
  enumerable: true,
281
- get: function () { return chunk6UK5JIKE_js.SignalBridge; }
291
+ get: function () { return chunkMJV6RC7I_js.SignalBridge; }
282
292
  });
283
293
  Object.defineProperty(exports, "useSignal", {
284
294
  enumerable: true,
285
- get: function () { return chunk6UK5JIKE_js.useSignal; }
295
+ get: function () { return chunkMJV6RC7I_js.useSignal; }
286
296
  });
287
297
  Object.defineProperty(exports, "useSignalConfig", {
288
298
  enumerable: true,
289
- get: function () { return chunk6UK5JIKE_js.useSignalConfig; }
299
+ get: function () { return chunkMJV6RC7I_js.useSignalConfig; }
290
300
  });
291
301
  Object.defineProperty(exports, "useSignalEvent", {
292
302
  enumerable: true,
293
- get: function () { return chunk6UK5JIKE_js.useSignalEvent; }
303
+ get: function () { return chunkMJV6RC7I_js.useSignalEvent; }
294
304
  });
295
305
  Object.defineProperty(exports, "useSignalExperiment", {
296
306
  enumerable: true,
297
- get: function () { return chunk6UK5JIKE_js.useSignalExperiment; }
307
+ get: function () { return chunkMJV6RC7I_js.useSignalExperiment; }
298
308
  });
299
309
  Object.defineProperty(exports, "useSignalOutcome", {
300
310
  enumerable: true,
301
- get: function () { return chunk6UK5JIKE_js.useSignalOutcome; }
311
+ get: function () { return chunkMJV6RC7I_js.useSignalOutcome; }
302
312
  });
303
313
  Object.defineProperty(exports, "CalendarView", {
304
314
  enumerable: true,
305
- get: function () { return chunkG4FJJK6J_js.CalendarView; }
315
+ get: function () { return chunkC37DFD5F_js.CalendarView; }
306
316
  });
307
317
  Object.defineProperty(exports, "CheckoutForm", {
308
318
  enumerable: true,
309
- get: function () { return chunkG4FJJK6J_js.CheckoutForm; }
319
+ get: function () { return chunkC37DFD5F_js.CheckoutForm; }
310
320
  });
311
321
  Object.defineProperty(exports, "EventCalendar", {
312
322
  enumerable: true,
313
- get: function () { return chunkG4FJJK6J_js.EventCalendar; }
323
+ get: function () { return chunkC37DFD5F_js.EventCalendar; }
314
324
  });
315
325
  Object.defineProperty(exports, "EventCheckout", {
316
326
  enumerable: true,
317
- get: function () { return chunkG4FJJK6J_js.EventCheckout; }
327
+ get: function () { return chunkC37DFD5F_js.EventCheckout; }
318
328
  });
319
329
  Object.defineProperty(exports, "EventEmbed", {
320
330
  enumerable: true,
321
- get: function () { return chunkG4FJJK6J_js.EventEmbed; }
331
+ get: function () { return chunkC37DFD5F_js.EventEmbed; }
322
332
  });
323
333
  Object.defineProperty(exports, "EventModal", {
324
334
  enumerable: true,
325
- get: function () { return chunkG4FJJK6J_js.EventModal; }
335
+ get: function () { return chunkC37DFD5F_js.EventModal; }
326
336
  });
327
337
  Object.defineProperty(exports, "EventTile", {
328
338
  enumerable: true,
329
- get: function () { return chunkG4FJJK6J_js.EventTile; }
339
+ get: function () { return chunkC37DFD5F_js.EventTile; }
330
340
  });
331
341
  Object.defineProperty(exports, "OfferingCard", {
332
342
  enumerable: true,
333
- get: function () { return chunkG4FJJK6J_js.OfferingCard; }
343
+ get: function () { return chunkC37DFD5F_js.OfferingCard; }
334
344
  });
335
345
  Object.defineProperty(exports, "OfferingList", {
336
346
  enumerable: true,
337
- get: function () { return chunkG4FJJK6J_js.OfferingList; }
347
+ get: function () { return chunkC37DFD5F_js.OfferingList; }
338
348
  });
339
349
  Object.defineProperty(exports, "ProductEmbed", {
340
350
  enumerable: true,
341
- get: function () { return chunkG4FJJK6J_js.ProductEmbed; }
351
+ get: function () { return chunkC37DFD5F_js.ProductEmbed; }
342
352
  });
343
353
  Object.defineProperty(exports, "RegistrationForm", {
344
354
  enumerable: true,
345
- get: function () { return chunkG4FJJK6J_js.RegistrationForm; }
355
+ get: function () { return chunkC37DFD5F_js.RegistrationForm; }
346
356
  });
347
357
  Object.defineProperty(exports, "UpcomingEvents", {
348
358
  enumerable: true,
349
- get: function () { return chunkG4FJJK6J_js.UpcomingEvents; }
359
+ get: function () { return chunkC37DFD5F_js.UpcomingEvents; }
350
360
  });
351
361
  Object.defineProperty(exports, "createCheckoutSession", {
352
362
  enumerable: true,
353
- get: function () { return chunkG4FJJK6J_js.createCheckoutSession; }
363
+ get: function () { return chunkC37DFD5F_js.createCheckoutSession; }
354
364
  });
355
365
  Object.defineProperty(exports, "fetchNextEvent", {
356
366
  enumerable: true,
357
- get: function () { return chunkG4FJJK6J_js.fetchNextEvent; }
367
+ get: function () { return chunkC37DFD5F_js.fetchNextEvent; }
358
368
  });
359
369
  Object.defineProperty(exports, "fetchOffering", {
360
370
  enumerable: true,
361
- get: function () { return chunkG4FJJK6J_js.fetchOffering; }
371
+ get: function () { return chunkC37DFD5F_js.fetchOffering; }
362
372
  });
363
373
  Object.defineProperty(exports, "fetchOfferings", {
364
374
  enumerable: true,
365
- get: function () { return chunkG4FJJK6J_js.fetchOfferings; }
375
+ get: function () { return chunkC37DFD5F_js.fetchOfferings; }
366
376
  });
367
377
  Object.defineProperty(exports, "fetchProducts", {
368
378
  enumerable: true,
369
- get: function () { return chunkG4FJJK6J_js.fetchProducts; }
379
+ get: function () { return chunkC37DFD5F_js.fetchProducts; }
370
380
  });
371
381
  Object.defineProperty(exports, "fetchServices", {
372
382
  enumerable: true,
373
- get: function () { return chunkG4FJJK6J_js.fetchServices; }
383
+ get: function () { return chunkC37DFD5F_js.fetchServices; }
374
384
  });
375
385
  Object.defineProperty(exports, "fetchUpcomingEvents", {
376
386
  enumerable: true,
377
- get: function () { return chunkG4FJJK6J_js.fetchUpcomingEvents; }
387
+ get: function () { return chunkC37DFD5F_js.fetchUpcomingEvents; }
378
388
  });
379
389
  Object.defineProperty(exports, "formatDate", {
380
390
  enumerable: true,
381
- get: function () { return chunkG4FJJK6J_js.formatDate; }
391
+ get: function () { return chunkC37DFD5F_js.formatDate; }
382
392
  });
383
393
  Object.defineProperty(exports, "formatDateTime", {
384
394
  enumerable: true,
385
- get: function () { return chunkG4FJJK6J_js.formatDateTime; }
395
+ get: function () { return chunkC37DFD5F_js.formatDateTime; }
386
396
  });
387
397
  Object.defineProperty(exports, "formatPrice", {
388
398
  enumerable: true,
389
- get: function () { return chunkG4FJJK6J_js.formatPrice; }
399
+ get: function () { return chunkC37DFD5F_js.formatPrice; }
390
400
  });
391
401
  Object.defineProperty(exports, "getOfferingUrl", {
392
402
  enumerable: true,
393
- get: function () { return chunkG4FJJK6J_js.getOfferingUrl; }
403
+ get: function () { return chunkC37DFD5F_js.getOfferingUrl; }
394
404
  });
395
405
  Object.defineProperty(exports, "registerForEvent", {
396
406
  enumerable: true,
397
- get: function () { return chunkG4FJJK6J_js.registerForEvent; }
407
+ get: function () { return chunkC37DFD5F_js.registerForEvent; }
398
408
  });
399
409
  Object.defineProperty(exports, "useEventModal", {
400
410
  enumerable: true,
401
- get: function () { return chunkG4FJJK6J_js.useEventModal; }
411
+ get: function () { return chunkC37DFD5F_js.useEventModal; }
402
412
  });
403
413
  exports.AffiliateCard = AffiliateCard;
404
414
  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,21 @@
1
- export { BookingWidget, createBooking, createSlotHold, detectTimezone, fetchAvailability, fetchAvailableDates, fetchBookingTypeDetails, fetchBookingTypes, formatDate as formatBookingDate, formatTime as formatBookingTime, formatDuration, releaseSlotHold } from './chunk-ILLOVVVP.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-VE5XLADP.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-6BDXN4X3.mjs';
5
+ export { ManagedImage, assignImageToSlot, clearImageSlot, fetchManagedImage, fetchManagedImages, listImageFiles, uploadImage } from './chunk-IURQA3H5.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-5KVT66R6.mjs';
9
- export { SignalBridge, useSignal, useSignalConfig, useSignalEvent, useSignalExperiment, useSignalOutcome } from './chunk-ZCZEKWFW.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-PLQ4CUNI.mjs';
11
- import './chunk-PUGRSMAV.mjs';
12
- import './chunk-NNPF4KRZ.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';
13
14
  import './chunk-3DPXOZAU.mjs';
14
- import './chunk-EE6SFAZP.mjs';
15
- import { sonorFetch } from './chunk-FO6Y27AH.mjs';
16
- import './chunk-S4FJIG6Y.mjs';
15
+ import './chunk-AX4AROLH.mjs';
16
+ import './chunk-6EDVCUAG.mjs';
17
+ import { sonorFetch } from './chunk-WS4GNH3F.mjs';
18
+ import './chunk-YCQHE2XT.mjs';
17
19
  import './chunk-4XPGGLVP.mjs';
18
20
  import { useState, useEffect } from 'react';
19
21
  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"}