@sonordev/site-kit 1.5.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (269) hide show
  1. package/dist/AnalyticsProvider-J7UMCBCJ.mjs +4 -0
  2. package/dist/{AnalyticsProvider-BBLU4U2T.mjs.map → AnalyticsProvider-J7UMCBCJ.mjs.map} +1 -1
  3. package/dist/AnalyticsProvider-PPDJIGWY.js +25 -0
  4. package/dist/{AnalyticsProvider-EMDIAAWR.js.map → AnalyticsProvider-PPDJIGWY.js.map} +1 -1
  5. package/dist/EngageWidget-IDBEBGQR.js +13 -0
  6. package/dist/{EngageWidget-UHWXXCAX.js.map → EngageWidget-IDBEBGQR.js.map} +1 -1
  7. package/dist/EngageWidget-SRRI4W7U.mjs +4 -0
  8. package/dist/{EngageWidget-CVZMTSB6.mjs.map → EngageWidget-SRRI4W7U.mjs.map} +1 -1
  9. package/dist/SignalBridge-D6W6OLVG.mjs +4 -0
  10. package/dist/{SignalBridge-WGHMEILW.mjs.map → SignalBridge-D6W6OLVG.mjs.map} +1 -1
  11. package/dist/SignalBridge-THATXU2R.js +33 -0
  12. package/dist/{SignalBridge-6UYUZ2CN.js.map → SignalBridge-THATXU2R.js.map} +1 -1
  13. package/dist/analytics/index.js +9 -9
  14. package/dist/analytics/index.mjs +2 -2
  15. package/dist/blog/index.js +75 -75
  16. package/dist/blog/index.js.map +1 -1
  17. package/dist/blog/index.mjs +75 -75
  18. package/dist/blog/index.mjs.map +1 -1
  19. package/dist/blog/server.js +2 -2
  20. package/dist/blog/server.js.map +1 -1
  21. package/dist/blog/server.mjs +2 -2
  22. package/dist/blog/server.mjs.map +1 -1
  23. package/dist/brand.css +87 -0
  24. package/dist/{chunk-ZU6YPEAF.mjs → chunk-2OJCYWSQ.mjs} +85 -73
  25. package/dist/chunk-2OJCYWSQ.mjs.map +1 -0
  26. package/dist/{chunk-PM2KQ6YK.mjs → chunk-3CXAWGUP.mjs} +3 -3
  27. package/dist/{chunk-PM2KQ6YK.mjs.map → chunk-3CXAWGUP.mjs.map} +1 -1
  28. package/dist/{chunk-36Y7OWES.mjs → chunk-3YQCPLGP.mjs} +4 -4
  29. package/dist/chunk-3YQCPLGP.mjs.map +1 -0
  30. package/dist/{chunk-XWWBUC2I.js → chunk-6ZGM7S5O.js} +77 -61
  31. package/dist/chunk-6ZGM7S5O.js.map +1 -0
  32. package/dist/{chunk-XFOL6JDF.mjs → chunk-7LAOWIWE.mjs} +4 -4
  33. package/dist/chunk-7LAOWIWE.mjs.map +1 -0
  34. package/dist/{chunk-YBTYDBWY.js → chunk-7M3FNAS5.js} +6 -8
  35. package/dist/chunk-7M3FNAS5.js.map +1 -0
  36. package/dist/{chunk-4QHHFCAA.mjs → chunk-AOIG5PVY.mjs} +6 -8
  37. package/dist/chunk-AOIG5PVY.mjs.map +1 -0
  38. package/dist/{chunk-VZMDH3R4.mjs → chunk-B22WSN4L.mjs} +4 -4
  39. package/dist/chunk-B22WSN4L.mjs.map +1 -0
  40. package/dist/{chunk-ELDJDBQL.js → chunk-BVUOATPG.js} +7 -7
  41. package/dist/chunk-BVUOATPG.js.map +1 -0
  42. package/dist/{chunk-N24BPFF6.mjs → chunk-CU6OGBKK.mjs} +6 -6
  43. package/dist/chunk-CU6OGBKK.mjs.map +1 -0
  44. package/dist/{chunk-NRNK7LXK.mjs → chunk-DWI5ZKPM.mjs} +4 -4
  45. package/dist/chunk-DWI5ZKPM.mjs.map +1 -0
  46. package/dist/{chunk-KRPFLF62.mjs → chunk-F5NXD7VQ.mjs} +10 -12
  47. package/dist/{chunk-KRPFLF62.mjs.map → chunk-F5NXD7VQ.mjs.map} +1 -1
  48. package/dist/{chunk-PTTDKFL7.js → chunk-FCXQECM7.js} +6 -6
  49. package/dist/chunk-FCXQECM7.js.map +1 -0
  50. package/dist/{chunk-DY4K6X3A.js → chunk-GCPPXUAI.js} +6 -6
  51. package/dist/chunk-GCPPXUAI.js.map +1 -0
  52. package/dist/{chunk-KJN2C6YE.js → chunk-I34XL5VJ.js} +5 -5
  53. package/dist/chunk-I34XL5VJ.js.map +1 -0
  54. package/dist/{chunk-G6VGUAK2.js → chunk-IFVMZFNT.js} +4 -4
  55. package/dist/chunk-IFVMZFNT.js.map +1 -0
  56. package/dist/{chunk-FMB2RZDH.mjs → chunk-J4U3IEXL.mjs} +6 -6
  57. package/dist/chunk-J4U3IEXL.mjs.map +1 -0
  58. package/dist/{chunk-EUNL6GAL.js → chunk-JP5WGL75.js} +4 -4
  59. package/dist/chunk-JP5WGL75.js.map +1 -0
  60. package/dist/{chunk-MG23BS36.js → chunk-L3UB4B74.js} +5 -5
  61. package/dist/chunk-L3UB4B74.js.map +1 -0
  62. package/dist/{chunk-FVCQBTNK.mjs → chunk-MSRLAD7F.mjs} +77 -61
  63. package/dist/chunk-MSRLAD7F.mjs.map +1 -0
  64. package/dist/{chunk-M5FLRLHI.mjs → chunk-OM6R7CDP.mjs} +3 -3
  65. package/dist/chunk-OM6R7CDP.mjs.map +1 -0
  66. package/dist/{chunk-4X5TFGKD.mjs → chunk-P3POHQWW.mjs} +422 -426
  67. package/dist/chunk-P3POHQWW.mjs.map +1 -0
  68. package/dist/{chunk-GJD4CFHN.js → chunk-RLNG67S5.js} +7 -7
  69. package/dist/chunk-RLNG67S5.js.map +1 -0
  70. package/dist/{chunk-FTSXKDP3.js → chunk-RO6DHV6S.js} +10 -12
  71. package/dist/{chunk-FTSXKDP3.js.map → chunk-RO6DHV6S.js.map} +1 -1
  72. package/dist/{chunk-WW7UM7XY.js → chunk-TZAD7CZD.js} +424 -428
  73. package/dist/chunk-TZAD7CZD.js.map +1 -0
  74. package/dist/{chunk-TXZNP76P.js → chunk-UD5447TC.js} +13 -15
  75. package/dist/chunk-UD5447TC.js.map +1 -0
  76. package/dist/{chunk-TC6TOW2T.js → chunk-UJ757WGI.js} +4 -4
  77. package/dist/{chunk-TC6TOW2T.js.map → chunk-UJ757WGI.js.map} +1 -1
  78. package/dist/{chunk-C3A5HXHX.mjs → chunk-V6V6OXS2.mjs} +5 -5
  79. package/dist/chunk-V6V6OXS2.mjs.map +1 -0
  80. package/dist/{chunk-X4J33XQD.js → chunk-W6K7MQCC.js} +6 -6
  81. package/dist/chunk-W6K7MQCC.js.map +1 -0
  82. package/dist/{chunk-FI2ME55T.mjs → chunk-W7RZ3OTA.mjs} +7 -7
  83. package/dist/chunk-W7RZ3OTA.mjs.map +1 -0
  84. package/dist/{chunk-IJ2LWZID.js → chunk-WETCVFIK.js} +85 -73
  85. package/dist/chunk-WETCVFIK.js.map +1 -0
  86. package/dist/{chunk-VNAJQKYG.mjs → chunk-WN2PUL6B.mjs} +13 -15
  87. package/dist/chunk-WN2PUL6B.mjs.map +1 -0
  88. package/dist/cli/index.js +19339 -3461
  89. package/dist/cli/index.js.map +1 -1
  90. package/dist/cli/index.mjs +19331 -3452
  91. package/dist/cli/index.mjs.map +1 -1
  92. package/dist/cms/index.d.mts +1 -1
  93. package/dist/cms/index.d.ts +1 -1
  94. package/dist/cms/index.js +3 -3
  95. package/dist/cms/index.js.map +1 -1
  96. package/dist/cms/index.mjs +2 -2
  97. package/dist/cms/index.mjs.map +1 -1
  98. package/dist/cms/server.js +4 -4
  99. package/dist/cms/server.mjs +1 -1
  100. package/dist/commerce/index.js +47 -47
  101. package/dist/commerce/index.mjs +3 -3
  102. package/dist/engage/index.js +6 -6
  103. package/dist/engage/index.js.map +1 -1
  104. package/dist/engage/index.mjs +3 -3
  105. package/dist/engage/index.mjs.map +1 -1
  106. package/dist/forms/index.js +379 -84
  107. package/dist/forms/index.js.map +1 -1
  108. package/dist/forms/index.mjs +375 -65
  109. package/dist/forms/index.mjs.map +1 -1
  110. package/dist/forms/styles.css +312 -0
  111. package/dist/images/index.js +11 -11
  112. package/dist/images/index.mjs +2 -2
  113. package/dist/images/server.js +4 -4
  114. package/dist/images/server.mjs +1 -1
  115. package/dist/index.d.mts +4 -131
  116. package/dist/index.d.ts +4 -131
  117. package/dist/index.js +85 -1373
  118. package/dist/index.js.map +1 -1
  119. package/dist/index.mjs +13 -1294
  120. package/dist/index.mjs.map +1 -1
  121. package/dist/layout/client.js +2 -2
  122. package/dist/layout/client.mjs +1 -1
  123. package/dist/layout/index.js +21 -11
  124. package/dist/layout/index.js.map +1 -1
  125. package/dist/layout/index.mjs +17 -7
  126. package/dist/layout/index.mjs.map +1 -1
  127. package/dist/llms/index.d.mts +3 -3
  128. package/dist/llms/index.d.ts +3 -3
  129. package/dist/llms/index.js +12 -12
  130. package/dist/llms/index.js.map +1 -1
  131. package/dist/llms/index.mjs +2 -2
  132. package/dist/llms/index.mjs.map +1 -1
  133. package/dist/manifest/index.js +4 -4
  134. package/dist/manifest/index.js.map +1 -1
  135. package/dist/manifest/index.mjs +3 -3
  136. package/dist/manifest/index.mjs.map +1 -1
  137. package/dist/middleware/index.js +3 -3
  138. package/dist/middleware/index.mjs +2 -2
  139. package/dist/redirects/index.js +6 -6
  140. package/dist/redirects/index.mjs +2 -2
  141. package/dist/robots/index.js +3 -3
  142. package/dist/robots/index.js.map +1 -1
  143. package/dist/robots/index.mjs +2 -2
  144. package/dist/robots/index.mjs.map +1 -1
  145. package/dist/{routing-DZYzyDHw.d.ts → routing-DQ_Et-OP.d.mts} +4 -4
  146. package/dist/{routing-B5XS-6_W.d.mts → routing-IYiJNIIX.d.ts} +4 -4
  147. package/dist/seo/index.d.mts +3 -5
  148. package/dist/seo/index.d.ts +3 -5
  149. package/dist/seo/index.js +77 -76
  150. package/dist/seo/index.js.map +1 -1
  151. package/dist/seo/index.mjs +41 -40
  152. package/dist/seo/index.mjs.map +1 -1
  153. package/dist/seo/register-sitemap-cli.js +3 -3
  154. package/dist/seo/register-sitemap-cli.js.map +1 -1
  155. package/dist/seo/register-sitemap-cli.mjs +3 -3
  156. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  157. package/dist/seo/server.d.mts +3 -3
  158. package/dist/seo/server.d.ts +3 -3
  159. package/dist/seo/server.js +7 -7
  160. package/dist/seo/server.js.map +1 -1
  161. package/dist/seo/server.mjs +5 -5
  162. package/dist/seo/server.mjs.map +1 -1
  163. package/dist/{server-api-XGKRGUMG.js → server-api-36R24YWN.js} +21 -21
  164. package/dist/{server-api-XGKRGUMG.js.map → server-api-36R24YWN.js.map} +1 -1
  165. package/dist/{server-api-COVFLFZ2.mjs → server-api-UIZU4JM3.mjs} +3 -3
  166. package/dist/{server-api-COVFLFZ2.mjs.map → server-api-UIZU4JM3.mjs.map} +1 -1
  167. package/dist/setup/index.d.mts +2 -5
  168. package/dist/setup/index.d.ts +2 -5
  169. package/dist/setup/index.js +0 -31
  170. package/dist/setup/index.mjs +1 -4
  171. package/dist/site-config/index.js +3 -3
  172. package/dist/site-config/index.mjs +1 -1
  173. package/dist/sitemap/index.js +10 -9
  174. package/dist/sitemap/index.js.map +1 -1
  175. package/dist/sitemap/index.mjs +8 -7
  176. package/dist/sitemap/index.mjs.map +1 -1
  177. package/dist/sync/index.js +13 -13
  178. package/dist/sync/index.mjs +1 -1
  179. package/dist/{types-KZP_VWZp.d.mts → types-CGkyylOa.d.mts} +2 -2
  180. package/dist/{types-KZP_VWZp.d.ts → types-CGkyylOa.d.ts} +2 -2
  181. package/package.json +4 -12
  182. package/dist/AnalyticsProvider-BBLU4U2T.mjs +0 -4
  183. package/dist/AnalyticsProvider-EMDIAAWR.js +0 -25
  184. package/dist/EngageWidget-CVZMTSB6.mjs +0 -4
  185. package/dist/EngageWidget-UHWXXCAX.js +0 -13
  186. package/dist/SetupWizard-Cki06kB0.d.mts +0 -12
  187. package/dist/SetupWizard-Cki06kB0.d.ts +0 -12
  188. package/dist/SignalBridge-6UYUZ2CN.js +0 -33
  189. package/dist/SignalBridge-WGHMEILW.mjs +0 -4
  190. package/dist/chunk-36Y7OWES.mjs.map +0 -1
  191. package/dist/chunk-373TK6TZ.js +0 -321
  192. package/dist/chunk-373TK6TZ.js.map +0 -1
  193. package/dist/chunk-4MOJJSNA.js +0 -14867
  194. package/dist/chunk-4MOJJSNA.js.map +0 -1
  195. package/dist/chunk-4QHHFCAA.mjs.map +0 -1
  196. package/dist/chunk-4X5TFGKD.mjs.map +0 -1
  197. package/dist/chunk-5YDPPOUU.mjs +0 -810
  198. package/dist/chunk-5YDPPOUU.mjs.map +0 -1
  199. package/dist/chunk-7FKPJQVS.mjs +0 -289
  200. package/dist/chunk-7FKPJQVS.mjs.map +0 -1
  201. package/dist/chunk-C3A5HXHX.mjs.map +0 -1
  202. package/dist/chunk-DY4K6X3A.js.map +0 -1
  203. package/dist/chunk-ELDJDBQL.js.map +0 -1
  204. package/dist/chunk-EUNL6GAL.js.map +0 -1
  205. package/dist/chunk-FI2ME55T.mjs.map +0 -1
  206. package/dist/chunk-FMB2RZDH.mjs.map +0 -1
  207. package/dist/chunk-FVCQBTNK.mjs.map +0 -1
  208. package/dist/chunk-G6VGUAK2.js.map +0 -1
  209. package/dist/chunk-GJD4CFHN.js.map +0 -1
  210. package/dist/chunk-GVXZWXQ7.js +0 -814
  211. package/dist/chunk-GVXZWXQ7.js.map +0 -1
  212. package/dist/chunk-HF2FWDBJ.mjs +0 -968
  213. package/dist/chunk-HF2FWDBJ.mjs.map +0 -1
  214. package/dist/chunk-IFAW7JFO.js +0 -1429
  215. package/dist/chunk-IFAW7JFO.js.map +0 -1
  216. package/dist/chunk-IJ2LWZID.js.map +0 -1
  217. package/dist/chunk-IKIJEKU3.mjs +0 -1427
  218. package/dist/chunk-IKIJEKU3.mjs.map +0 -1
  219. package/dist/chunk-JFTGG6HK.mjs +0 -14848
  220. package/dist/chunk-JFTGG6HK.mjs.map +0 -1
  221. package/dist/chunk-JM3ZR6LB.js +0 -981
  222. package/dist/chunk-JM3ZR6LB.js.map +0 -1
  223. package/dist/chunk-KJN2C6YE.js.map +0 -1
  224. package/dist/chunk-M5FLRLHI.mjs.map +0 -1
  225. package/dist/chunk-MCGLYYAR.mjs +0 -341
  226. package/dist/chunk-MCGLYYAR.mjs.map +0 -1
  227. package/dist/chunk-MG23BS36.js.map +0 -1
  228. package/dist/chunk-N24BPFF6.mjs.map +0 -1
  229. package/dist/chunk-NRNK7LXK.mjs.map +0 -1
  230. package/dist/chunk-PTTDKFL7.js.map +0 -1
  231. package/dist/chunk-S7FRYNSU.mjs +0 -315
  232. package/dist/chunk-S7FRYNSU.mjs.map +0 -1
  233. package/dist/chunk-SLB5V4RT.js +0 -302
  234. package/dist/chunk-SLB5V4RT.js.map +0 -1
  235. package/dist/chunk-TXZNP76P.js.map +0 -1
  236. package/dist/chunk-VNAJQKYG.mjs.map +0 -1
  237. package/dist/chunk-VZMDH3R4.mjs.map +0 -1
  238. package/dist/chunk-WW7UM7XY.js.map +0 -1
  239. package/dist/chunk-X4J33XQD.js.map +0 -1
  240. package/dist/chunk-XFOL6JDF.mjs.map +0 -1
  241. package/dist/chunk-XWWBUC2I.js.map +0 -1
  242. package/dist/chunk-YBTYDBWY.js.map +0 -1
  243. package/dist/chunk-ZQO6FZZB.js +0 -343
  244. package/dist/chunk-ZQO6FZZB.js.map +0 -1
  245. package/dist/chunk-ZU6YPEAF.mjs.map +0 -1
  246. package/dist/generators-DOFWGRXS.js +0 -37
  247. package/dist/generators-DOFWGRXS.js.map +0 -1
  248. package/dist/generators-R62APO62.mjs +0 -4
  249. package/dist/generators-R62APO62.mjs.map +0 -1
  250. package/dist/migrator-3WQB3KQ2.mjs +0 -4
  251. package/dist/migrator-3WQB3KQ2.mjs.map +0 -1
  252. package/dist/migrator-HFVQYK5R.js +0 -37
  253. package/dist/migrator-HFVQYK5R.js.map +0 -1
  254. package/dist/scanner-AF7YUCFG.mjs +0 -4
  255. package/dist/scanner-AF7YUCFG.mjs.map +0 -1
  256. package/dist/scanner-DBD5K6F7.js +0 -53
  257. package/dist/scanner-DBD5K6F7.js.map +0 -1
  258. package/dist/setup/client.d.mts +0 -60
  259. package/dist/setup/client.d.ts +0 -60
  260. package/dist/setup/client.js +0 -31
  261. package/dist/setup/client.js.map +0 -1
  262. package/dist/setup/client.mjs +0 -6
  263. package/dist/setup/client.mjs.map +0 -1
  264. package/dist/setup/server.d.mts +0 -14
  265. package/dist/setup/server.d.ts +0 -14
  266. package/dist/setup/server.js +0 -13
  267. package/dist/setup/server.js.map +0 -1
  268. package/dist/setup/server.mjs +0 -4
  269. package/dist/setup/server.mjs.map +0 -1
@@ -50,7 +50,7 @@ interface CmsPreviewProps {
50
50
  * import { CmsPreview } from '@sonordev/site-kit/cms'
51
51
  *
52
52
  * <CmsPreview
53
- * apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}
53
+ * apiKey={process.env.SONOR_API_KEY!}
54
54
  * path="/about"
55
55
  * pollInterval={3000}
56
56
  * />
@@ -50,7 +50,7 @@ interface CmsPreviewProps {
50
50
  * import { CmsPreview } from '@sonordev/site-kit/cms'
51
51
  *
52
52
  * <CmsPreview
53
- * apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}
53
+ * apiKey={process.env.SONOR_API_KEY!}
54
54
  * path="/about"
55
55
  * pollInterval={3000}
56
56
  * />
package/dist/cms/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkMG23BS36_js = require('../chunk-MG23BS36.js');
3
+ var chunkL3UB4B74_js = require('../chunk-L3UB4B74.js');
4
4
  require('../chunk-ZSMWDLMK.js');
5
5
  var react = require('@portabletext/react');
6
6
  var imageUrlBuilder = require('@sanity/image-url');
@@ -284,7 +284,7 @@ async function CmsPage({
284
284
  fallback,
285
285
  className
286
286
  }) {
287
- const page = await chunkMG23BS36_js.getCmsPage(path);
287
+ const page = await chunkL3UB4B74_js.getCmsPage(path);
288
288
  if (!page) {
289
289
  if (fallback) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fallback });
290
290
  return null;
@@ -312,7 +312,7 @@ async function CmsPage({
312
312
  );
313
313
  }
314
314
  function CmsPreview({
315
- apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.sonor.io",
315
+ apiUrl = process.env.SONOR_API_URL || "https://api.sonor.io",
316
316
  apiKey,
317
317
  path,
318
318
  pollInterval = 3e3,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["imageUrlBuilder","jsx","jsxs","PortableText","getCmsPage","Fragment","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["imageUrlBuilder","jsx","jsxs","PortableText","getCmsPage","Fragment","useState","useEffect"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.SONOR_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { getCmsPage } from '../chunk-C3A5HXHX.mjs';
1
+ import { getCmsPage } from '../chunk-V6V6OXS2.mjs';
2
2
  import '../chunk-4XPGGLVP.mjs';
3
3
  import { PortableText } from '@portabletext/react';
4
4
  import imageUrlBuilder from '@sanity/image-url';
@@ -306,7 +306,7 @@ async function CmsPage({
306
306
  );
307
307
  }
308
308
  function CmsPreview({
309
- apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || "https://api.sonor.io",
309
+ apiUrl = process.env.SONOR_API_URL || "https://api.sonor.io",
310
310
  apiKey,
311
311
  path,
312
312
  pollInterval = 3e3,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.NEXT_PUBLIC_UPTRADE_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/cms/sanity-image.ts","../../src/cms/PortableTextRenderer.tsx","../../src/cms/sections/HeroSection.tsx","../../src/cms/sections/RichTextSection.tsx","../../src/cms/sections/CtaSection.tsx","../../src/cms/sections/GallerySection.tsx","../../src/cms/sections/TestimonialsSection.tsx","../../src/cms/sections/FaqSection.tsx","../../src/cms/sections/FormSection.tsx","../../src/cms/sections/CustomSection.tsx","../../src/cms/CmsSection.tsx","../../src/cms/CmsPage.tsx","../../src/cms/CmsPreview.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Sanity Image URL Builder\n *\n * Wraps @sanity/image-url to produce optimised, hotspot-aware URLs\n * from SanityImageRef objects stored in CMS content.\n */\nimport imageUrlBuilder from '@sanity/image-url'\nimport type { SanityImageRef } from './types'\n\n// ---------------------------------------------------------------------------\n// Singleton builder (configured once per runtime)\n// ---------------------------------------------------------------------------\n\nlet _builder: ReturnType<typeof imageUrlBuilder> | null = null\n\nexport interface SanityImageConfig {\n projectId: string\n dataset: string\n}\n\nconst DEFAULT_CONFIG: SanityImageConfig = {\n projectId: 'l55lyemx',\n dataset: 'production',\n}\n\n/**\n * Initialise (or re-initialise) the image builder with project config.\n * Call once at app startup — e.g. in SiteKitProvider or layout.\n * If never called, falls back to DEFAULT_CONFIG.\n */\nexport function configureSanityImages(config: SanityImageConfig) {\n _builder = imageUrlBuilder(config)\n}\n\nfunction getBuilder() {\n if (!_builder) {\n _builder = imageUrlBuilder(DEFAULT_CONFIG)\n }\n return _builder\n}\n\n// ---------------------------------------------------------------------------\n// URL helpers\n// ---------------------------------------------------------------------------\n\nexport interface ImageUrlOptions {\n width?: number\n height?: number\n /** Device-pixel-ratio multiplier (default 1) */\n dpr?: number\n /** Quality 0-100 (default: Sanity auto) */\n quality?: number\n /** Force a specific format */\n format?: 'webp' | 'avif' | 'png' | 'jpg'\n /** Fit mode */\n fit?: 'clip' | 'crop' | 'fill' | 'fillmax' | 'max' | 'scale' | 'min'\n /** Apply blur (0-2000) */\n blur?: number\n}\n\n/**\n * Build an optimised image URL from a SanityImageRef.\n * Automatically applies hotspot/crop metadata when present.\n *\n * ```ts\n * const url = sanityImageUrl(heroImage, { width: 1200 })\n * ```\n */\nexport function sanityImageUrl(\n image: SanityImageRef | undefined | null,\n options: ImageUrlOptions = {},\n): string {\n if (!image?.asset?._ref) return ''\n\n let builder = getBuilder().image(image).auto('format')\n\n if (options.width) builder = builder.width(options.width)\n if (options.height) builder = builder.height(options.height)\n if (options.dpr) builder = builder.dpr(options.dpr)\n if (options.quality) builder = builder.quality(options.quality)\n if (options.format) builder = builder.format(options.format as any)\n if (options.fit) builder = builder.fit(options.fit)\n if (options.blur) builder = builder.blur(options.blur)\n\n return builder.url()\n}\n\n/**\n * Generate a srcSet string for responsive images.\n *\n * ```tsx\n * <img srcSet={sanityImageSrcSet(img, [400, 800, 1200])} sizes=\"100vw\" />\n * ```\n */\nexport function sanityImageSrcSet(\n image: SanityImageRef | undefined | null,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageUrlOptions, 'width'> = {},\n): string {\n if (!image?.asset?._ref) return ''\n return widths\n .map((w) => `${sanityImageUrl(image, { ...options, width: w })} ${w}w`)\n .join(', ')\n}\n\n/**\n * Compute CSS `object-position` from a Sanity hotspot.\n * Returns `undefined` if no hotspot is defined.\n */\nexport function hotspotToObjectPosition(\n image: SanityImageRef | undefined | null,\n): string | undefined {\n if (!image?.hotspot) return undefined\n return `${(image.hotspot.x * 100).toFixed(1)}% ${(image.hotspot.y * 100).toFixed(1)}%`\n}\n","import React from 'react'\nimport { PortableText, type PortableTextComponents } from '@portabletext/react'\nimport type { PortableTextRendererProps, PortableTextContent } from './types'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from './sanity-image'\n\n// ---------------------------------------------------------------------------\n// Default Component Map\n// ---------------------------------------------------------------------------\n\nconst defaultComponents: PortableTextComponents = {\n block: {\n h1: ({ children }) => (\n <h1 className=\"sonor-cms-h1\">{children}</h1>\n ),\n h2: ({ children }) => (\n <h2 className=\"sonor-cms-h2\">{children}</h2>\n ),\n h3: ({ children }) => (\n <h3 className=\"sonor-cms-h3\">{children}</h3>\n ),\n h4: ({ children }) => (\n <h4 className=\"sonor-cms-h4\">{children}</h4>\n ),\n normal: ({ children }) => (\n <p className=\"sonor-cms-p\">{children}</p>\n ),\n blockquote: ({ children }) => (\n <blockquote className=\"sonor-cms-blockquote\">{children}</blockquote>\n ),\n },\n marks: {\n strong: ({ children }) => <strong>{children}</strong>,\n em: ({ children }) => <em>{children}</em>,\n code: ({ children }) => (\n <code className=\"sonor-cms-code\">{children}</code>\n ),\n underline: ({ children }) => <u>{children}</u>,\n 'strike-through': ({ children }) => <s>{children}</s>,\n link: ({ children, value }) => {\n const href = value?.href || '#'\n const isExternal = href.startsWith('http')\n return (\n <a\n href={href}\n className=\"sonor-cms-link\"\n {...(isExternal\n ? { target: '_blank', rel: 'noopener noreferrer' }\n : {})}\n >\n {children}\n </a>\n )\n },\n highlight: ({ children }) => (\n <mark className=\"sonor-cms-highlight\">{children}</mark>\n ),\n },\n list: {\n bullet: ({ children }) => (\n <ul className=\"sonor-cms-ul\">{children}</ul>\n ),\n number: ({ children }) => (\n <ol className=\"sonor-cms-ol\">{children}</ol>\n ),\n },\n listItem: {\n bullet: ({ children }) => <li>{children}</li>,\n number: ({ children }) => <li>{children}</li>,\n },\n types: {\n image: ({ value }) => {\n if (!value?.asset?._ref && !value?.url) return null\n const src = value.url || sanityImageUrl(value, { width: 1200 })\n const srcSet = !value.url ? sanityImageSrcSet(value, [400, 800, 1200, 1600]) : undefined\n const objectPosition = hotspotToObjectPosition(value)\n return (\n <figure className=\"sonor-cms-figure\">\n <img\n src={src}\n srcSet={srcSet}\n sizes=\"(max-width: 768px) 100vw, (max-width: 1200px) 80vw, 1200px\"\n alt={value.alt || ''}\n className=\"sonor-cms-img\"\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n {value.caption && (\n <figcaption className=\"sonor-cms-figcaption\">\n {typeof value.caption === 'string'\n ? value.caption\n : null}\n </figcaption>\n )}\n </figure>\n )\n },\n },\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * Renders Portable Text content with Sonor default styling.\n * Accepts `components` prop to override or extend defaults.\n */\nexport function PortableTextRenderer({\n value,\n components: overrides,\n className,\n}: PortableTextRendererProps) {\n if (!value || !Array.isArray(value) || value.length === 0) return null\n\n const merged: PortableTextComponents = overrides\n ? {\n ...defaultComponents,\n block: { ...(defaultComponents.block as object), ...(overrides as any).block },\n marks: { ...(defaultComponents.marks as object), ...(overrides as any).marks },\n types: { ...(defaultComponents.types as object), ...(overrides as any).types },\n list: { ...(defaultComponents.list as object), ...(overrides as any).list },\n listItem: { ...(defaultComponents.listItem as object), ...(overrides as any).listItem },\n }\n : defaultComponents\n\n return (\n <div className={className || 'sonor-cms-content'}>\n <PortableText value={value as any} components={merged} />\n </div>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function HeroSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const subheadline = data.subheadline as PortableTextContent | undefined\n const ctaText = data.ctaText as string | undefined\n const ctaLink = data.ctaLink as string | undefined\n const bgImage = data.backgroundImage as SanityImageRef | undefined\n const bgUrl = sanityImageUrl(bgImage, { width: 1920, quality: 80 })\n const bgPosition = hotspotToObjectPosition(bgImage) || '50% 50%'\n\n return (\n <section\n className=\"sonor-cms-hero\"\n style={\n bgUrl\n ? { backgroundImage: `url(${bgUrl})`, backgroundPosition: bgPosition, backgroundSize: 'cover' }\n : undefined\n }\n >\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-hero-headline\" />\n )}\n {subheadline && (\n <PortableTextRenderer value={subheadline} components={portableTextComponents} className=\"sonor-cms-hero-subheadline\" />\n )}\n {ctaText && ctaLink && (\n <a href={ctaLink} className=\"sonor-cms-hero-cta\">\n {ctaText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function RichTextSection({ data, portableTextComponents }: SectionRendererProps) {\n const content = data.content as PortableTextContent | undefined\n if (!content) return null\n\n return (\n <section className=\"sonor-cms-richtext\">\n <PortableTextRenderer value={content} components={portableTextComponents} />\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\nexport function CtaSection({ data, portableTextComponents }: SectionRendererProps) {\n const headline = data.headline as PortableTextContent | undefined\n const description = data.description as PortableTextContent | undefined\n const buttonText = data.buttonText as string | undefined\n const buttonLink = data.buttonLink as string | undefined\n\n return (\n <section className=\"sonor-cms-cta\">\n {headline && (\n <PortableTextRenderer value={headline} components={portableTextComponents} className=\"sonor-cms-cta-headline\" />\n )}\n {description && (\n <PortableTextRenderer value={description} components={portableTextComponents} className=\"sonor-cms-cta-description\" />\n )}\n {buttonText && buttonLink && (\n <a href={buttonLink} className=\"sonor-cms-cta-button\">\n {buttonText}\n </a>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl, sanityImageSrcSet, hotspotToObjectPosition } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\nexport function GallerySection({ data, portableTextComponents }: SectionRendererProps) {\n const images = (data.images || []) as SanityImageRef[]\n const layout = (data.layout || 'grid') as string\n const caption = data.caption as PortableTextContent | undefined\n\n if (images.length === 0) return null\n\n return (\n <section className=\"sonor-cms-gallery\">\n <div className={`sonor-cms-gallery-${layout}`}>\n {images.map((img, i) => {\n const objectPosition = hotspotToObjectPosition(img)\n return (\n <figure key={img.asset?._ref || i} className=\"sonor-cms-gallery-item\">\n <img\n src={sanityImageUrl(img, { width: 800 })}\n srcSet={sanityImageSrcSet(img, [400, 800, 1200])}\n sizes=\"(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw\"\n alt={img.alt || ''}\n loading=\"lazy\"\n style={objectPosition ? { objectPosition } : undefined}\n />\n </figure>\n )\n })}\n </div>\n {caption && (\n <PortableTextRenderer value={caption} components={portableTextComponents} className=\"sonor-cms-gallery-caption\" />\n )}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport { sanityImageUrl } from '../sanity-image'\nimport type { SectionRendererProps, PortableTextContent, SanityImageRef } from '../types'\n\ninterface TestimonialItem {\n quote: PortableTextContent\n author: string\n role?: string\n avatar?: SanityImageRef\n}\n\nexport function TestimonialsSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as TestimonialItem[]\n const layout = (data.layout || 'grid') as string\n\n if (items.length === 0) return null\n\n return (\n <section className={`sonor-cms-testimonials sonor-cms-testimonials-${layout}`}>\n {items.map((item, i) => (\n <blockquote key={i} className=\"sonor-cms-testimonial\">\n <PortableTextRenderer value={item.quote} components={portableTextComponents} className=\"sonor-cms-testimonial-quote\" />\n <footer className=\"sonor-cms-testimonial-footer\">\n {item.avatar?.asset?._ref && (\n <img\n src={sanityImageUrl(item.avatar, { width: 80, height: 80, fit: 'crop' })}\n alt={item.avatar.alt || item.author}\n className=\"sonor-cms-testimonial-avatar\"\n width={80}\n height={80}\n loading=\"lazy\"\n />\n )}\n <cite className=\"sonor-cms-testimonial-author\">\n {item.author}\n {item.role && (\n <span className=\"sonor-cms-testimonial-role\">, {item.role}</span>\n )}\n </cite>\n </footer>\n </blockquote>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\ninterface FaqItem {\n question: string\n answer: PortableTextContent\n}\n\nexport function FaqSection({ data, portableTextComponents }: SectionRendererProps) {\n const items = (data.items || []) as FaqItem[]\n\n if (items.length === 0) return null\n\n return (\n <section className=\"sonor-cms-faq\">\n {items.map((item, i) => (\n <details key={i} className=\"sonor-cms-faq-item\">\n <summary className=\"sonor-cms-faq-question\">{item.question}</summary>\n <div className=\"sonor-cms-faq-answer\">\n <PortableTextRenderer value={item.answer} components={portableTextComponents} />\n </div>\n </details>\n ))}\n </section>\n )\n}\n","import React from 'react'\nimport { PortableTextRenderer } from '../PortableTextRenderer'\nimport type { SectionRendererProps, PortableTextContent } from '../types'\n\n/**\n * Form section — renders a heading and a placeholder for the managed form.\n * The actual form rendering depends on ManagedForm from the forms module.\n * Sites should override this section renderer to integrate with their form setup.\n */\nexport function FormSection({ data, portableTextComponents }: SectionRendererProps) {\n const formSlug = data.formSlug as string | undefined\n const heading = data.heading as PortableTextContent | undefined\n\n return (\n <section className=\"sonor-cms-form\">\n {heading && (\n <PortableTextRenderer value={heading} components={portableTextComponents} className=\"sonor-cms-form-heading\" />\n )}\n {formSlug ? (\n <div\n className=\"sonor-cms-form-embed\"\n data-form-slug={formSlug}\n >\n {/* Override FormSection renderer to integrate ManagedForm */}\n </div>\n ) : (\n <p className=\"sonor-cms-form-placeholder\">Form not configured</p>\n )}\n </section>\n )\n}\n","import React from 'react'\nimport type { SectionRendererProps } from '../types'\n\n/**\n * Custom section — passes props to a named component.\n * Sites must provide their own component map via sectionComponents override.\n */\nexport function CustomSection({ data, displayName }: SectionRendererProps) {\n const componentName = data.componentName as string | undefined\n const props = (data.props || {}) as Record<string, unknown>\n\n return (\n <section className=\"sonor-cms-custom\" data-component={componentName}>\n <div className=\"sonor-cms-custom-placeholder\">\n Custom component: {componentName || displayName}\n {/* Override 'custom' in sectionComponents to render actual components */}\n </div>\n </section>\n )\n}\n","import React from 'react'\nimport type { CmsSectionProps, SectionRendererProps, SectionType } from './types'\nimport {\n HeroSection,\n RichTextSection,\n CtaSection,\n GallerySection,\n TestimonialsSection,\n FaqSection,\n FormSection,\n CustomSection,\n} from './sections'\n\nconst defaultRenderers: Record<SectionType, React.ComponentType<SectionRendererProps>> = {\n hero: HeroSection,\n richText: RichTextSection,\n cta: CtaSection,\n gallery: GallerySection,\n testimonials: TestimonialsSection,\n faq: FaqSection,\n form: FormSection,\n custom: CustomSection,\n}\n\n/**\n * Renders a single CMS section using the appropriate renderer for its type.\n * Override specific section renderers via the `sectionComponents` prop.\n */\nexport function CmsSection({ section, sectionComponents, portableTextComponents }: CmsSectionProps) {\n const Renderer =\n sectionComponents?.[section.sectionType] ||\n defaultRenderers[section.sectionType]\n\n if (!Renderer) {\n if (process.env.NODE_ENV === 'development') {\n console.warn(`@sonordev/cms: No renderer for section type: ${section.sectionType}`)\n }\n return null\n }\n\n return (\n <div\n className={`sonor-cms-section sonor-cms-section-${section.sectionType}`}\n data-section-id={section._id}\n data-section-type={section.sectionType}\n >\n <Renderer\n data={section.data}\n sectionType={section.sectionType}\n displayName={section.displayName}\n portableTextComponents={portableTextComponents}\n />\n </div>\n )\n}\n","import React from 'react'\nimport type { CmsPageProps, CmsSectionData } from './types'\nimport { getCmsPage } from './server-api'\nimport { CmsSection } from './CmsSection'\n\n/**\n * Async React Server Component that fetches and renders a full CMS page.\n *\n * @example\n * ```tsx\n * // app/[...slug]/page.tsx\n * import { CmsPage } from '@sonordev/site-kit/cms'\n *\n * export default function Page({ params }) {\n * return <CmsPage path={`/${params.slug.join('/')}`} />\n * }\n * ```\n */\nexport async function CmsPage({\n path,\n sectionComponents,\n portableTextComponents,\n fallback,\n className,\n}: CmsPageProps): Promise<React.ReactElement | null> {\n const page = await getCmsPage(path)\n\n if (!page) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n if (!page.sections || page.sections.length === 0) {\n if (fallback) return <>{fallback}</>\n return null\n }\n\n return (\n <div\n className={className || 'sonor-cms-page'}\n data-cms-page-id={page._id}\n data-cms-path={page.path}\n >\n {page.sections.map((section: CmsSectionData) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n","'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { CmsPageData, CmsSectionProps, SectionType, SectionRendererProps } from './types'\nimport { CmsSection } from './CmsSection'\n\ninterface CmsPreviewProps {\n /** Portal API base URL */\n apiUrl?: string\n /** API key for fetching draft content */\n apiKey: string\n /** Page path to preview */\n path: string\n /** Poll interval in ms (0 = no polling) */\n pollInterval?: number\n /** Override section renderers */\n sectionComponents?: Partial<Record<SectionType, React.ComponentType<SectionRendererProps>>>\n /** Override Portable Text components */\n portableTextComponents?: Record<string, React.ComponentType<any>>\n /** Wrapper className */\n className?: string\n}\n\n/**\n * Client component for previewing draft CMS content.\n * Fetches draft content from Portal API and re-renders on changes.\n *\n * @example\n * ```tsx\n * // Used in preview mode (e.g., ?preview=true)\n * import { CmsPreview } from '@sonordev/site-kit/cms'\n *\n * <CmsPreview\n * apiKey={process.env.SONOR_API_KEY!}\n * path=\"/about\"\n * pollInterval={3000}\n * />\n * ```\n */\nexport function CmsPreview({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey,\n path,\n pollInterval = 3000,\n sectionComponents,\n portableTextComponents,\n className,\n}: CmsPreviewProps) {\n const [page, setPage] = useState<CmsPageData | null>(null)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n let cancelled = false\n\n async function fetchPage() {\n try {\n const res = await fetch(`${apiUrl}/api/public/cms/page`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ path }),\n })\n\n if (!res.ok) {\n setError(`Error ${res.status}`)\n return\n }\n\n const data = await res.json()\n if (!cancelled && data?.found && data.page) {\n setPage(data.page)\n setError(null)\n }\n } catch (err) {\n if (!cancelled) {\n setError('Failed to load preview')\n }\n }\n }\n\n fetchPage()\n\n if (pollInterval > 0) {\n const interval = setInterval(fetchPage, pollInterval)\n return () => {\n cancelled = true\n clearInterval(interval)\n }\n }\n\n return () => {\n cancelled = true\n }\n }, [apiUrl, apiKey, path, pollInterval])\n\n if (error) {\n return (\n <div className=\"sonor-cms-preview-error\">\n <p>Preview error: {error}</p>\n </div>\n )\n }\n\n if (!page) {\n return (\n <div className=\"sonor-cms-preview-loading\">\n <p>Loading preview...</p>\n </div>\n )\n }\n\n return (\n <div\n className={className || 'sonor-cms-page sonor-cms-preview'}\n data-cms-preview=\"true\"\n data-cms-path={page.path}\n >\n {page.sections?.map((section) => (\n <CmsSection\n key={section._id}\n section={section}\n sectionComponents={sectionComponents}\n portableTextComponents={portableTextComponents}\n />\n ))}\n </div>\n )\n}\n"]}
@@ -1,21 +1,21 @@
1
1
  'use strict';
2
2
 
3
- var chunkMG23BS36_js = require('../chunk-MG23BS36.js');
3
+ var chunkL3UB4B74_js = require('../chunk-L3UB4B74.js');
4
4
  require('../chunk-ZSMWDLMK.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "getCmsPage", {
9
9
  enumerable: true,
10
- get: function () { return chunkMG23BS36_js.getCmsPage; }
10
+ get: function () { return chunkL3UB4B74_js.getCmsPage; }
11
11
  });
12
12
  Object.defineProperty(exports, "getCmsPageMetadata", {
13
13
  enumerable: true,
14
- get: function () { return chunkMG23BS36_js.getCmsPageMetadata; }
14
+ get: function () { return chunkL3UB4B74_js.getCmsPageMetadata; }
15
15
  });
16
16
  Object.defineProperty(exports, "getCmsSection", {
17
17
  enumerable: true,
18
- get: function () { return chunkMG23BS36_js.getCmsSection; }
18
+ get: function () { return chunkL3UB4B74_js.getCmsSection; }
19
19
  });
20
20
  //# sourceMappingURL=server.js.map
21
21
  //# sourceMappingURL=server.js.map
@@ -1,4 +1,4 @@
1
- export { getCmsPage, getCmsPageMetadata, getCmsSection } from '../chunk-C3A5HXHX.mjs';
1
+ export { getCmsPage, getCmsPageMetadata, getCmsSection } from '../chunk-V6V6OXS2.mjs';
2
2
  import '../chunk-4XPGGLVP.mjs';
3
3
  //# sourceMappingURL=server.mjs.map
4
4
  //# sourceMappingURL=server.mjs.map