@sonordev/site-kit 5.6.0 → 5.8.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 (632) hide show
  1. package/README.md +3 -3
  2. package/agent-manifest.json +24 -4
  3. package/dist/AnalyticsProvider-OCXRNIVE.js +33 -0
  4. package/dist/{AnalyticsProvider-6PXC7UDP.js.map → AnalyticsProvider-OCXRNIVE.js.map} +1 -1
  5. package/dist/AnalyticsProvider-ZAUONQCX.mjs +12 -0
  6. package/dist/{AnalyticsProvider-FVQIYSLY.mjs.map → AnalyticsProvider-ZAUONQCX.mjs.map} +1 -1
  7. package/dist/{BlogViewTracker-S4HSRCW7.js → BlogViewTracker-HK5C7PU6.js} +14 -11
  8. package/dist/BlogViewTracker-HK5C7PU6.js.map +1 -0
  9. package/dist/{BlogViewTracker-ZUGLBOVI.mjs → BlogViewTracker-KXRZHN3U.mjs} +13 -10
  10. package/dist/BlogViewTracker-KXRZHN3U.mjs.map +1 -0
  11. package/dist/ChatWidget-3OW5LY37.js +24 -0
  12. package/dist/{ChatWidget-2TQWCXWP.js.map → ChatWidget-3OW5LY37.js.map} +1 -1
  13. package/dist/ChatWidget-54GVS27I.mjs +15 -0
  14. package/dist/{ChatWidget-DG52ZIE6.mjs.map → ChatWidget-54GVS27I.mjs.map} +1 -1
  15. package/dist/EngageWidget-7EUP76WE.mjs +12 -0
  16. package/dist/{EngageWidget-2VUJADIU.mjs.map → EngageWidget-7EUP76WE.mjs.map} +1 -1
  17. package/dist/EngageWidget-DDP5UFA4.js +21 -0
  18. package/dist/{EngageWidget-Z7RC2INM.js.map → EngageWidget-DDP5UFA4.js.map} +1 -1
  19. package/dist/{FileField-FSQ7W3A5.mjs → FileField-IQLN6E3C.mjs} +5 -5
  20. package/dist/{FileField-FSQ7W3A5.mjs.map → FileField-IQLN6E3C.mjs.map} +1 -1
  21. package/dist/{FileField-UOQHL25J.js → FileField-SBPL4JHP.js} +6 -6
  22. package/dist/{FileField-UOQHL25J.js.map → FileField-SBPL4JHP.js.map} +1 -1
  23. package/dist/{FormSpotlight-RHL5FWM2.mjs → FormSpotlight-E2LKKHGV.mjs} +11 -7
  24. package/dist/FormSpotlight-E2LKKHGV.mjs.map +1 -0
  25. package/dist/{FormSpotlight-TED32NHP.js → FormSpotlight-YTACNE57.js} +25 -21
  26. package/dist/FormSpotlight-YTACNE57.js.map +1 -0
  27. package/dist/{FormStage-PFEBKHGY.js → FormStage-S277U2CP.js} +20 -15
  28. package/dist/FormStage-S277U2CP.js.map +1 -0
  29. package/dist/{FormStage-DINIRFOX.mjs → FormStage-YSBN5XKL.mjs} +9 -4
  30. package/dist/FormStage-YSBN5XKL.mjs.map +1 -0
  31. package/dist/ManagedForm-I3QVRQ53.mjs +16 -0
  32. package/dist/{ManagedForm-545YAUFC.mjs.map → ManagedForm-I3QVRQ53.mjs.map} +1 -1
  33. package/dist/ManagedForm-TSYKQFLJ.js +25 -0
  34. package/dist/{ManagedForm-43WLCUAK.js.map → ManagedForm-TSYKQFLJ.js.map} +1 -1
  35. package/dist/{ManagedNewsletterForm-ZPY5RRKX.mjs → ManagedNewsletterForm-T3YRAWKZ.mjs} +9 -7
  36. package/dist/ManagedNewsletterForm-T3YRAWKZ.mjs.map +1 -0
  37. package/dist/{ManagedNewsletterForm-I3QN57HB.js → ManagedNewsletterForm-YSOPPKS6.js} +10 -8
  38. package/dist/ManagedNewsletterForm-YSOPPKS6.js.map +1 -0
  39. package/dist/{SignalCore-EEH5IM4U.mjs → SignalCore-PPSIQ4BW.mjs} +8 -14
  40. package/dist/SignalCore-PPSIQ4BW.mjs.map +1 -0
  41. package/dist/{SignalCore-M4AXIMV4.js → SignalCore-SUZH3XWZ.js} +14 -20
  42. package/dist/SignalCore-SUZH3XWZ.js.map +1 -0
  43. package/dist/SitemapSync-HSHCOKCL.mjs +9 -0
  44. package/dist/{SitemapSync-46G7LVZS.mjs.map → SitemapSync-HSHCOKCL.mjs.map} +1 -1
  45. package/dist/SitemapSync-LH6UVP4P.js +18 -0
  46. package/dist/{SitemapSync-XK4JKCS7.js.map → SitemapSync-LH6UVP4P.js.map} +1 -1
  47. package/dist/analytics/AnalyticsProvider.d.ts.map +1 -1
  48. package/dist/analytics/index.js +10 -9
  49. package/dist/analytics/index.mjs +5 -4
  50. package/dist/blog/BlogLayout.d.ts +3 -1
  51. package/dist/blog/BlogLayout.d.ts.map +1 -1
  52. package/dist/blog/BlogList.d.ts +7 -1
  53. package/dist/blog/BlogList.d.ts.map +1 -1
  54. package/dist/blog/BlogPost.d.ts +20 -1
  55. package/dist/blog/BlogPost.d.ts.map +1 -1
  56. package/dist/blog/BlogSidebar.d.ts +3 -1
  57. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  58. package/dist/blog/BlogViewTracker.d.ts +8 -2
  59. package/dist/blog/BlogViewTracker.d.ts.map +1 -1
  60. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  61. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  62. package/dist/blog/ClusterNavigation.d.ts +5 -2
  63. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  64. package/dist/blog/RelatedPosts.d.ts +3 -1
  65. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  66. package/dist/blog/index.d.ts +1 -1
  67. package/dist/blog/index.d.ts.map +1 -1
  68. package/dist/blog/index.js +40 -31
  69. package/dist/blog/index.js.map +1 -1
  70. package/dist/blog/index.mjs +11 -6
  71. package/dist/blog/index.mjs.map +1 -1
  72. package/dist/blog/metadata-images.test.d.ts +2 -0
  73. package/dist/blog/metadata-images.test.d.ts.map +1 -0
  74. package/dist/blog/not-found.test.d.ts +2 -0
  75. package/dist/blog/not-found.test.d.ts.map +1 -0
  76. package/dist/blog/processBlogHtml.d.ts +19 -2
  77. package/dist/blog/processBlogHtml.d.ts.map +1 -1
  78. package/dist/blog/public-reads.d.ts +27 -0
  79. package/dist/blog/public-reads.d.ts.map +1 -0
  80. package/dist/blog/server-core.d.ts +107 -16
  81. package/dist/blog/server-core.d.ts.map +1 -1
  82. package/dist/blog/server-ui.js +29 -23
  83. package/dist/blog/server-ui.js.map +1 -1
  84. package/dist/blog/server-ui.mjs +12 -6
  85. package/dist/blog/server-ui.mjs.map +1 -1
  86. package/dist/blog/server.d.ts +107 -16
  87. package/dist/blog/server.d.ts.map +1 -1
  88. package/dist/blog/server.js +54 -47
  89. package/dist/blog/server.mjs +5 -2
  90. package/dist/blog/site-scope.test.d.ts +2 -0
  91. package/dist/blog/site-scope.test.d.ts.map +1 -0
  92. package/dist/blog/static-params.test.d.ts +2 -0
  93. package/dist/blog/static-params.test.d.ts.map +1 -0
  94. package/dist/brand/extract-brand-profile.d.ts +36 -2
  95. package/dist/brand/extract-brand-profile.d.ts.map +1 -1
  96. package/dist/brand/extract-brand-profile.test.d.ts +2 -0
  97. package/dist/brand/extract-brand-profile.test.d.ts.map +1 -0
  98. package/dist/{chunk-B64AZC6P.js → chunk-2FQG2AHJ.js} +60 -35
  99. package/dist/chunk-2FQG2AHJ.js.map +1 -0
  100. package/dist/{chunk-N2PGTPWN.js → chunk-2OQWLXDO.js} +13 -13
  101. package/dist/{chunk-N2PGTPWN.js.map → chunk-2OQWLXDO.js.map} +1 -1
  102. package/dist/{chunk-T5VTQUNF.js → chunk-2SCDUVFJ.js} +10 -10
  103. package/dist/{chunk-T5VTQUNF.js.map → chunk-2SCDUVFJ.js.map} +1 -1
  104. package/dist/{chunk-S4RC6VAQ.js → chunk-35ERUUH3.js} +6 -6
  105. package/dist/{chunk-S4RC6VAQ.js.map → chunk-35ERUUH3.js.map} +1 -1
  106. package/dist/{chunk-VHZ4LHQT.mjs → chunk-3AUFD7KR.mjs} +3 -3
  107. package/dist/{chunk-VHZ4LHQT.mjs.map → chunk-3AUFD7KR.mjs.map} +1 -1
  108. package/dist/{chunk-DHIWR7CG.js → chunk-3BVCF4ZF.js} +4 -4
  109. package/dist/{chunk-DHIWR7CG.js.map → chunk-3BVCF4ZF.js.map} +1 -1
  110. package/dist/{chunk-EEQYKMGH.mjs → chunk-3EY5E35M.mjs} +57 -86
  111. package/dist/chunk-3EY5E35M.mjs.map +1 -0
  112. package/dist/{chunk-JNABXCLY.mjs → chunk-3SLFT453.mjs} +5 -5
  113. package/dist/{chunk-JNABXCLY.mjs.map → chunk-3SLFT453.mjs.map} +1 -1
  114. package/dist/{chunk-AJQI3WTN.mjs → chunk-4L7OHRWB.mjs} +12 -9
  115. package/dist/chunk-4L7OHRWB.mjs.map +1 -0
  116. package/dist/chunk-4LYW6PMU.mjs +72 -0
  117. package/dist/chunk-4LYW6PMU.mjs.map +1 -0
  118. package/dist/{chunk-R3KTBKSW.js → chunk-4OS6M3V4.js} +6 -12
  119. package/dist/chunk-4OS6M3V4.js.map +1 -0
  120. package/dist/{chunk-AY7JBGYC.js → chunk-4RY7JETY.js} +14 -14
  121. package/dist/{chunk-AY7JBGYC.js.map → chunk-4RY7JETY.js.map} +1 -1
  122. package/dist/chunk-4TLFZ6NR.mjs +16 -0
  123. package/dist/chunk-4TLFZ6NR.mjs.map +1 -0
  124. package/dist/{chunk-4B4S56WJ.mjs → chunk-5B4J3IBX.mjs} +75 -21
  125. package/dist/chunk-5B4J3IBX.mjs.map +1 -0
  126. package/dist/chunk-5O7JSWT6.js +8 -0
  127. package/dist/{chunk-KSL3WA2I.js.map → chunk-5O7JSWT6.js.map} +1 -1
  128. package/dist/chunk-5SANRSX3.mjs +17 -0
  129. package/dist/chunk-5SANRSX3.mjs.map +1 -0
  130. package/dist/{chunk-LCSYJXIO.mjs → chunk-5WGMXSCB.mjs} +3 -3
  131. package/dist/{chunk-LCSYJXIO.mjs.map → chunk-5WGMXSCB.mjs.map} +1 -1
  132. package/dist/chunk-5XFFUP6D.js +100 -0
  133. package/dist/chunk-5XFFUP6D.js.map +1 -0
  134. package/dist/{chunk-AHZR4VGY.mjs → chunk-6HFFTGFP.mjs} +50 -26
  135. package/dist/chunk-6HFFTGFP.mjs.map +1 -0
  136. package/dist/{chunk-USKIL6V6.mjs → chunk-6SBTHS6C.mjs} +3 -3
  137. package/dist/{chunk-USKIL6V6.mjs.map → chunk-6SBTHS6C.mjs.map} +1 -1
  138. package/dist/{chunk-NZSFOZJV.js → chunk-7TC3GRXQ.js} +73 -38
  139. package/dist/chunk-7TC3GRXQ.js.map +1 -0
  140. package/dist/{chunk-HIHAXEPD.mjs → chunk-7THZOAUR.mjs} +4 -4
  141. package/dist/{chunk-HIHAXEPD.mjs.map → chunk-7THZOAUR.mjs.map} +1 -1
  142. package/dist/{chunk-YCI36ZUS.mjs → chunk-AOWJP25J.mjs} +4 -4
  143. package/dist/{chunk-YCI36ZUS.mjs.map → chunk-AOWJP25J.mjs.map} +1 -1
  144. package/dist/{chunk-H44XZUOV.mjs → chunk-B2VFMPVJ.mjs} +4 -4
  145. package/dist/{chunk-H44XZUOV.mjs.map → chunk-B2VFMPVJ.mjs.map} +1 -1
  146. package/dist/{chunk-OA7KKOAK.mjs → chunk-B35OJ7FR.mjs} +4 -4
  147. package/dist/{chunk-OA7KKOAK.mjs.map → chunk-B35OJ7FR.mjs.map} +1 -1
  148. package/dist/{chunk-XR32C47O.js → chunk-BER36QXU.js} +9 -9
  149. package/dist/{chunk-XR32C47O.js.map → chunk-BER36QXU.js.map} +1 -1
  150. package/dist/{chunk-7C7XO5HX.mjs → chunk-BFZNLTWK.mjs} +3 -3
  151. package/dist/{chunk-7C7XO5HX.mjs.map → chunk-BFZNLTWK.mjs.map} +1 -1
  152. package/dist/chunk-BQP6JIE2.mjs +28 -0
  153. package/dist/chunk-BQP6JIE2.mjs.map +1 -0
  154. package/dist/{chunk-5KIO6FXE.js → chunk-C3WU45JT.js} +7 -7
  155. package/dist/{chunk-5KIO6FXE.js.map → chunk-C3WU45JT.js.map} +1 -1
  156. package/dist/chunk-CUNZAD46.js +53 -0
  157. package/dist/chunk-CUNZAD46.js.map +1 -0
  158. package/dist/chunk-CXAXZFFW.js +157 -0
  159. package/dist/chunk-CXAXZFFW.js.map +1 -0
  160. package/dist/{chunk-H4OBGC43.mjs → chunk-DA7IANFG.mjs} +14 -3
  161. package/dist/chunk-DA7IANFG.mjs.map +1 -0
  162. package/dist/{chunk-BWSMUSDB.js → chunk-EIW6YEPY.js} +8 -8
  163. package/dist/{chunk-BWSMUSDB.js.map → chunk-EIW6YEPY.js.map} +1 -1
  164. package/dist/{chunk-UU47DGHE.js → chunk-F6SKG34N.js} +8 -13
  165. package/dist/chunk-F6SKG34N.js.map +1 -0
  166. package/dist/{chunk-LC7AM4J5.js → chunk-FHPW7XVH.js} +77 -20
  167. package/dist/chunk-FHPW7XVH.js.map +1 -0
  168. package/dist/{chunk-JNRHTZL4.js → chunk-FVW6FT6L.js} +73 -29
  169. package/dist/chunk-FVW6FT6L.js.map +1 -0
  170. package/dist/{chunk-KY6M76JW.js → chunk-GNDWTXLU.js} +56 -177
  171. package/dist/chunk-GNDWTXLU.js.map +1 -0
  172. package/dist/{chunk-OZ3FU4BT.js → chunk-H5NBFNND.js} +2 -2
  173. package/dist/chunk-H5NBFNND.js.map +1 -0
  174. package/dist/{chunk-SYGGZZMU.js → chunk-HAKD27AZ.js} +7 -7
  175. package/dist/{chunk-SYGGZZMU.js.map → chunk-HAKD27AZ.js.map} +1 -1
  176. package/dist/chunk-HCN3IKMW.mjs +106 -0
  177. package/dist/chunk-HCN3IKMW.mjs.map +1 -0
  178. package/dist/{chunk-QNPVVWR7.mjs → chunk-HCX343AS.mjs} +4 -4
  179. package/dist/{chunk-QNPVVWR7.mjs.map → chunk-HCX343AS.mjs.map} +1 -1
  180. package/dist/{chunk-C2MSD2UM.mjs → chunk-HEOQT5SM.mjs} +216 -103
  181. package/dist/chunk-HEOQT5SM.mjs.map +1 -0
  182. package/dist/{chunk-RU54J2PY.mjs → chunk-HOJ4J4X2.mjs} +30 -12
  183. package/dist/chunk-HOJ4J4X2.mjs.map +1 -0
  184. package/dist/{chunk-H3D3ZGOJ.js → chunk-HQOHB6QF.js} +15 -15
  185. package/dist/{chunk-H3D3ZGOJ.js.map → chunk-HQOHB6QF.js.map} +1 -1
  186. package/dist/chunk-HRMGITUZ.mjs +6 -0
  187. package/dist/{chunk-DQUBETXH.mjs.map → chunk-HRMGITUZ.mjs.map} +1 -1
  188. package/dist/{chunk-7AUDKXY5.mjs → chunk-HYVEIP2N.mjs} +3 -3
  189. package/dist/{chunk-7AUDKXY5.mjs.map → chunk-HYVEIP2N.mjs.map} +1 -1
  190. package/dist/{chunk-46BMNWE6.js → chunk-I3ND4XYW.js} +12 -9
  191. package/dist/chunk-I3ND4XYW.js.map +1 -0
  192. package/dist/{chunk-53KMRZT7.js → chunk-JDTU2RWC.js} +3 -3
  193. package/dist/{chunk-53KMRZT7.js.map → chunk-JDTU2RWC.js.map} +1 -1
  194. package/dist/{chunk-GZJE23Y5.mjs → chunk-JLVCWC6A.mjs} +2 -2
  195. package/dist/chunk-JLVCWC6A.mjs.map +1 -0
  196. package/dist/chunk-K4TCEAUX.js +52 -0
  197. package/dist/chunk-K4TCEAUX.js.map +1 -0
  198. package/dist/chunk-KV7XXLJV.mjs +30 -0
  199. package/dist/chunk-KV7XXLJV.mjs.map +1 -0
  200. package/dist/{chunk-5UFDHGFE.mjs → chunk-L24RDT6Q.mjs} +3 -3
  201. package/dist/{chunk-5UFDHGFE.mjs.map → chunk-L24RDT6Q.mjs.map} +1 -1
  202. package/dist/{chunk-JE5DWAE6.js → chunk-LBZGYF3B.js} +4 -4
  203. package/dist/{chunk-JE5DWAE6.js.map → chunk-LBZGYF3B.js.map} +1 -1
  204. package/dist/{chunk-746RKQHA.js → chunk-LMEUYRRR.js} +93 -121
  205. package/dist/chunk-LMEUYRRR.js.map +1 -0
  206. package/dist/chunk-LVGSOW2F.js +32 -0
  207. package/dist/chunk-LVGSOW2F.js.map +1 -0
  208. package/dist/{chunk-KPKQKFT4.js → chunk-M45AL7EA.js} +37 -19
  209. package/dist/chunk-M45AL7EA.js.map +1 -0
  210. package/dist/{chunk-XK5AIWQG.js → chunk-MHX6TOAS.js} +3 -3
  211. package/dist/{chunk-XK5AIWQG.js.map → chunk-MHX6TOAS.js.map} +1 -1
  212. package/dist/chunk-MLVHVKFT.mjs +148 -0
  213. package/dist/chunk-MLVHVKFT.mjs.map +1 -0
  214. package/dist/{chunk-RIYAMYLV.mjs → chunk-N2NZBPQ5.mjs} +4 -10
  215. package/dist/chunk-N2NZBPQ5.mjs.map +1 -0
  216. package/dist/chunk-NRBITVDK.js +114 -0
  217. package/dist/chunk-NRBITVDK.js.map +1 -0
  218. package/dist/{chunk-IYCLN3XS.mjs → chunk-O4YBWJHP.mjs} +6 -11
  219. package/dist/chunk-O4YBWJHP.mjs.map +1 -0
  220. package/dist/{chunk-5KIEZHVK.mjs → chunk-O5ZSGBQD.mjs} +4 -4
  221. package/dist/{chunk-5KIEZHVK.mjs.map → chunk-O5ZSGBQD.mjs.map} +1 -1
  222. package/dist/{chunk-TP7H6BSK.mjs → chunk-OE7CTIOU.mjs} +73 -30
  223. package/dist/chunk-OE7CTIOU.mjs.map +1 -0
  224. package/dist/{chunk-UJ6CHZAI.mjs → chunk-OEW2LFOV.js} +169 -25
  225. package/dist/chunk-OEW2LFOV.js.map +1 -0
  226. package/dist/chunk-P4Y75QSU.js +19 -0
  227. package/dist/chunk-P4Y75QSU.js.map +1 -0
  228. package/dist/{chunk-6OP5XSMM.mjs → chunk-PK2OTGW5.mjs} +6 -12
  229. package/dist/chunk-PK2OTGW5.mjs.map +1 -0
  230. package/dist/{chunk-OC7AO7XS.js → chunk-PRTXAIIC.js} +15 -15
  231. package/dist/{chunk-OC7AO7XS.js.map → chunk-PRTXAIIC.js.map} +1 -1
  232. package/dist/{chunk-K2V3ZW36.mjs → chunk-PUAXHYBL.mjs} +3 -3
  233. package/dist/{chunk-K2V3ZW36.mjs.map → chunk-PUAXHYBL.mjs.map} +1 -1
  234. package/dist/chunk-QRHVMTHF.mjs +94 -0
  235. package/dist/chunk-QRHVMTHF.mjs.map +1 -0
  236. package/dist/{chunk-BZLIOT7Q.js → chunk-QTJTDQYR.js} +76 -111
  237. package/dist/chunk-QTJTDQYR.js.map +1 -0
  238. package/dist/{chunk-GJ6NOLGC.mjs → chunk-QVHVL7EX.mjs} +3 -3
  239. package/dist/{chunk-GJ6NOLGC.mjs.map → chunk-QVHVL7EX.mjs.map} +1 -1
  240. package/dist/chunk-R7GHP3FY.js +81 -0
  241. package/dist/chunk-R7GHP3FY.js.map +1 -0
  242. package/dist/chunk-SEP5D4MI.js +116 -0
  243. package/dist/chunk-SEP5D4MI.js.map +1 -0
  244. package/dist/{chunk-GPLCPMVD.mjs → chunk-TXMVU4EY.mjs} +62 -97
  245. package/dist/chunk-TXMVU4EY.mjs.map +1 -0
  246. package/dist/chunk-U2V542EO.mjs +98 -0
  247. package/dist/chunk-U2V542EO.mjs.map +1 -0
  248. package/dist/{chunk-YYN4YZYZ.js → chunk-UWHCHYCX.js} +4 -4
  249. package/dist/{chunk-YYN4YZYZ.js.map → chunk-UWHCHYCX.js.map} +1 -1
  250. package/dist/{chunk-473WDGQZ.mjs → chunk-VJ74275U.mjs} +38 -156
  251. package/dist/chunk-VJ74275U.mjs.map +1 -0
  252. package/dist/{chunk-H7274TKR.mjs → chunk-VJV7WUR2.mjs} +12 -4
  253. package/dist/chunk-VJV7WUR2.mjs.map +1 -0
  254. package/dist/{chunk-CQS5ZYI6.mjs → chunk-VYL6IHJA.mjs} +9 -9
  255. package/dist/{chunk-CQS5ZYI6.mjs.map → chunk-VYL6IHJA.mjs.map} +1 -1
  256. package/dist/{chunk-5B4FABFK.js → chunk-WS7MH3GD.js} +14 -2
  257. package/dist/chunk-WS7MH3GD.js.map +1 -0
  258. package/dist/{chunk-IPV2TUAT.js → chunk-XA2GJFVM.js} +12 -4
  259. package/dist/chunk-XA2GJFVM.js.map +1 -0
  260. package/dist/chunk-XBX2K3GA.js +33 -0
  261. package/dist/chunk-XBX2K3GA.js.map +1 -0
  262. package/dist/{chunk-X5TCH7VZ.js → chunk-XCYKM2SA.js} +6 -13
  263. package/dist/chunk-XCYKM2SA.js.map +1 -0
  264. package/dist/{chunk-6CJP7BFM.js → chunk-XZO5I4RS.mjs} +147 -20
  265. package/dist/chunk-XZO5I4RS.mjs.map +1 -0
  266. package/dist/chunk-Y5QZPUL3.mjs +47 -0
  267. package/dist/chunk-Y5QZPUL3.mjs.map +1 -0
  268. package/dist/{chunk-B6O7D5U4.js → chunk-YECDJDDD.js} +10 -10
  269. package/dist/{chunk-B6O7D5U4.js.map → chunk-YECDJDDD.js.map} +1 -1
  270. package/dist/chunk-YN7QHLWF.js +19 -0
  271. package/dist/chunk-YN7QHLWF.js.map +1 -0
  272. package/dist/chunk-YU7QZ3PP.mjs +45 -0
  273. package/dist/chunk-YU7QZ3PP.mjs.map +1 -0
  274. package/dist/{chunk-CQRLKNHQ.js → chunk-ZEOC26LZ.js} +223 -110
  275. package/dist/chunk-ZEOC26LZ.js.map +1 -0
  276. package/dist/{chunk-AEARU24Q.mjs → chunk-ZVI7MBVF.mjs} +73 -38
  277. package/dist/chunk-ZVI7MBVF.mjs.map +1 -0
  278. package/dist/cli/agent/checks.d.ts +15 -1
  279. package/dist/cli/agent/checks.d.ts.map +1 -1
  280. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts +2 -0
  281. package/dist/cli/agent/sitemap-trailing-slash.test.d.ts.map +1 -0
  282. package/dist/cli/commands/api-routes.d.ts.map +1 -1
  283. package/dist/cli/commands/doctor.d.ts.map +1 -1
  284. package/dist/cli/commands/geo.d.ts +4 -0
  285. package/dist/cli/commands/geo.d.ts.map +1 -1
  286. package/dist/cli/commands/geo.test.d.ts +2 -0
  287. package/dist/cli/commands/geo.test.d.ts.map +1 -0
  288. package/dist/cli/commands/og.d.ts +31 -4
  289. package/dist/cli/commands/og.d.ts.map +1 -1
  290. package/dist/cli/commands/scaffold.d.ts +1 -2
  291. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  292. package/dist/cli/commands/sync.d.ts.map +1 -1
  293. package/dist/cli/generators/index.d.ts +5 -0
  294. package/dist/cli/generators/index.d.ts.map +1 -1
  295. package/dist/cli/generators/index.test.d.ts +2 -0
  296. package/dist/cli/generators/index.test.d.ts.map +1 -0
  297. package/dist/cli/index.js +921 -466
  298. package/dist/cli/index.js.map +1 -1
  299. package/dist/cli/index.mjs +862 -407
  300. package/dist/cli/index.mjs.map +1 -1
  301. package/dist/client/index.js +6 -6
  302. package/dist/client/index.mjs +5 -5
  303. package/dist/commerce/CheckoutForm.d.ts.map +1 -1
  304. package/dist/commerce/ProductDetail.d.ts.map +1 -1
  305. package/dist/commerce/api.d.ts +14 -0
  306. package/dist/commerce/api.d.ts.map +1 -1
  307. package/dist/commerce/discount-checkout.test.d.ts +2 -0
  308. package/dist/commerce/discount-checkout.test.d.ts.map +1 -0
  309. package/dist/commerce/index.d.ts +1 -1
  310. package/dist/commerce/index.d.ts.map +1 -1
  311. package/dist/commerce/index.js +61 -56
  312. package/dist/commerce/index.mjs +6 -5
  313. package/dist/config/index.js +3 -3
  314. package/dist/config/index.mjs +1 -1
  315. package/dist/discover-CYXYKHZ2.mjs +4 -0
  316. package/dist/{discover-BEJRYNFF.mjs.map → discover-CYXYKHZ2.mjs.map} +1 -1
  317. package/dist/discover-NGEPXZOD.js +21 -0
  318. package/dist/{discover-WVDYDUJX.js.map → discover-NGEPXZOD.js.map} +1 -1
  319. package/dist/engage/index.js +12 -10
  320. package/dist/engage/index.js.map +1 -1
  321. package/dist/engage/index.mjs +9 -7
  322. package/dist/engage/index.mjs.map +1 -1
  323. package/dist/fleet/index.js +8 -8
  324. package/dist/fleet/index.mjs +4 -4
  325. package/dist/forms/FormClient.d.ts.map +1 -1
  326. package/dist/forms/FormField.d.ts +7 -1
  327. package/dist/forms/FormField.d.ts.map +1 -1
  328. package/dist/forms/FormSpotlight.d.ts +1 -1
  329. package/dist/forms/FormSpotlight.d.ts.map +1 -1
  330. package/dist/forms/FormStage.d.ts +1 -1
  331. package/dist/forms/FormStage.d.ts.map +1 -1
  332. package/dist/forms/experience-plan.d.ts +0 -1
  333. package/dist/forms/experience-plan.d.ts.map +1 -1
  334. package/dist/forms/field-interactions.d.ts +63 -0
  335. package/dist/forms/field-interactions.d.ts.map +1 -0
  336. package/dist/forms/field-interactions.test.d.ts +8 -0
  337. package/dist/forms/field-interactions.test.d.ts.map +1 -0
  338. package/dist/forms/field-rules.d.ts +41 -0
  339. package/dist/forms/field-rules.d.ts.map +1 -0
  340. package/dist/forms/field-rules.test.d.ts +8 -0
  341. package/dist/forms/field-rules.test.d.ts.map +1 -0
  342. package/dist/forms/form-field-focus.test.d.ts +8 -0
  343. package/dist/forms/form-field-focus.test.d.ts.map +1 -0
  344. package/dist/forms/index.js +25 -23
  345. package/dist/forms/index.js.map +1 -1
  346. package/dist/forms/index.mjs +13 -11
  347. package/dist/forms/index.mjs.map +1 -1
  348. package/dist/forms/server.js +11 -11
  349. package/dist/forms/server.mjs +9 -9
  350. package/dist/forms/static.js +8 -8
  351. package/dist/forms/static.mjs +7 -7
  352. package/dist/forms/tracking-session.d.ts +48 -3
  353. package/dist/forms/tracking-session.d.ts.map +1 -1
  354. package/dist/forms/types.d.ts +11 -0
  355. package/dist/forms/types.d.ts.map +1 -1
  356. package/dist/forms/useForm.d.ts +8 -0
  357. package/dist/forms/useForm.d.ts.map +1 -1
  358. package/dist/forms/useFormTracking.d.ts +29 -4
  359. package/dist/forms/useFormTracking.d.ts.map +1 -1
  360. package/dist/images/index.js +11 -11
  361. package/dist/images/index.mjs +4 -4
  362. package/dist/index.js +72 -68
  363. package/dist/index.js.map +1 -1
  364. package/dist/index.mjs +14 -10
  365. package/dist/index.mjs.map +1 -1
  366. package/dist/layout/client.js +10 -10
  367. package/dist/layout/client.mjs +9 -9
  368. package/dist/layout/index.js +13 -12
  369. package/dist/layout/index.js.map +1 -1
  370. package/dist/layout/index.mjs +11 -10
  371. package/dist/layout/index.mjs.map +1 -1
  372. package/dist/llms/aiRobots.d.ts +24 -5
  373. package/dist/llms/aiRobots.d.ts.map +1 -1
  374. package/dist/llms/api.d.ts +8 -3
  375. package/dist/llms/api.d.ts.map +1 -1
  376. package/dist/llms/discovery-headers.d.ts +24 -0
  377. package/dist/llms/discovery-headers.d.ts.map +1 -1
  378. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  379. package/dist/llms/handlers.d.ts +20 -2
  380. package/dist/llms/handlers.d.ts.map +1 -1
  381. package/dist/llms/index.d.ts +2 -2
  382. package/dist/llms/index.d.ts.map +1 -1
  383. package/dist/llms/index.js +54 -98
  384. package/dist/llms/index.js.map +1 -1
  385. package/dist/llms/index.mjs +20 -83
  386. package/dist/llms/index.mjs.map +1 -1
  387. package/dist/llms/links.d.ts +26 -0
  388. package/dist/llms/links.d.ts.map +1 -0
  389. package/dist/llms/links.test.d.ts +2 -0
  390. package/dist/llms/links.test.d.ts.map +1 -0
  391. package/dist/llms/types.d.ts +15 -0
  392. package/dist/llms/types.d.ts.map +1 -1
  393. package/dist/llms/wiring.d.ts +103 -0
  394. package/dist/llms/wiring.d.ts.map +1 -0
  395. package/dist/llms/wiring.test.d.ts +2 -0
  396. package/dist/llms/wiring.test.d.ts.map +1 -0
  397. package/dist/llms/writeLLMsTxt.d.ts +9 -0
  398. package/dist/llms/writeLLMsTxt.d.ts.map +1 -1
  399. package/dist/maps/index.js +5 -5
  400. package/dist/maps/index.mjs +3 -3
  401. package/dist/motion/gsap.d.ts +54 -0
  402. package/dist/motion/gsap.d.ts.map +1 -1
  403. package/dist/motion/gsap.js +34 -4
  404. package/dist/motion/gsap.js.map +1 -1
  405. package/dist/motion/gsap.mjs +33 -5
  406. package/dist/motion/gsap.mjs.map +1 -1
  407. package/dist/motion/gsap.test.d.ts +2 -0
  408. package/dist/motion/gsap.test.d.ts.map +1 -0
  409. package/dist/og/config.d.ts +6 -0
  410. package/dist/og/config.d.ts.map +1 -1
  411. package/dist/og/contrast.d.ts +33 -0
  412. package/dist/og/contrast.d.ts.map +1 -0
  413. package/dist/og/index.d.ts +2 -0
  414. package/dist/og/index.d.ts.map +1 -1
  415. package/dist/og/index.js +26 -8
  416. package/dist/og/index.mjs +3 -1
  417. package/dist/og/pages.d.ts +101 -0
  418. package/dist/og/pages.d.ts.map +1 -1
  419. package/dist/og/route-copy.d.ts +34 -0
  420. package/dist/og/route-copy.d.ts.map +1 -0
  421. package/dist/og/route-fit.d.ts +77 -0
  422. package/dist/og/route-fit.d.ts.map +1 -0
  423. package/dist/og/route.d.ts +80 -20
  424. package/dist/og/route.d.ts.map +1 -1
  425. package/dist/og/route.js +195 -25
  426. package/dist/og/route.js.map +1 -1
  427. package/dist/og/route.mjs +193 -26
  428. package/dist/og/route.mjs.map +1 -1
  429. package/dist/og/route.test.d.ts +2 -0
  430. package/dist/og/route.test.d.ts.map +1 -0
  431. package/dist/og/template.d.ts.map +1 -1
  432. package/dist/og/wiring.d.ts +48 -4
  433. package/dist/og/wiring.d.ts.map +1 -1
  434. package/dist/proxy/index.d.ts +16 -11
  435. package/dist/proxy/index.d.ts.map +1 -1
  436. package/dist/proxy/index.js +15 -10
  437. package/dist/proxy/index.js.map +1 -1
  438. package/dist/proxy/index.mjs +12 -7
  439. package/dist/proxy/index.mjs.map +1 -1
  440. package/dist/proxy/llms-discovery.test.d.ts +2 -0
  441. package/dist/proxy/llms-discovery.test.d.ts.map +1 -0
  442. package/dist/redirects/index.d.ts +25 -1
  443. package/dist/redirects/index.d.ts.map +1 -1
  444. package/dist/redirects/index.js +11 -8
  445. package/dist/redirects/index.mjs +4 -1
  446. package/dist/redirects/index.test.d.ts +2 -0
  447. package/dist/redirects/index.test.d.ts.map +1 -0
  448. package/dist/redirects/not-found.d.ts +14 -29
  449. package/dist/redirects/not-found.d.ts.map +1 -1
  450. package/dist/redirects/not-found.js +15 -5
  451. package/dist/redirects/not-found.js.map +1 -1
  452. package/dist/redirects/not-found.mjs +11 -1
  453. package/dist/redirects/not-found.mjs.map +1 -1
  454. package/dist/robots/index.d.ts +7 -1
  455. package/dist/robots/index.d.ts.map +1 -1
  456. package/dist/robots/index.js +27 -1
  457. package/dist/robots/index.js.map +1 -1
  458. package/dist/robots/index.mjs +4 -1
  459. package/dist/robots/index.mjs.map +1 -1
  460. package/dist/robots/index.test.d.ts +2 -0
  461. package/dist/robots/index.test.d.ts.map +1 -0
  462. package/dist/robots/next-internals.d.ts +22 -0
  463. package/dist/robots/next-internals.d.ts.map +1 -0
  464. package/dist/search/index.js +4 -4
  465. package/dist/search/index.mjs +3 -3
  466. package/dist/seo/ManagedContent.d.ts +4 -2
  467. package/dist/seo/ManagedContent.d.ts.map +1 -1
  468. package/dist/seo/ManagedFAQ.d.ts.map +1 -1
  469. package/dist/seo/ManagedInternalLinks.d.ts.map +1 -1
  470. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  471. package/dist/seo/client.js +6 -6
  472. package/dist/seo/client.mjs +5 -5
  473. package/dist/seo/getManagedMetadata.d.ts.map +1 -1
  474. package/dist/seo/getManagedMetadata.test.d.ts +2 -0
  475. package/dist/seo/getManagedMetadata.test.d.ts.map +1 -0
  476. package/dist/seo/index.js +59 -49
  477. package/dist/seo/index.js.map +1 -1
  478. package/dist/seo/index.mjs +29 -19
  479. package/dist/seo/index.mjs.map +1 -1
  480. package/dist/seo/managed-schema-filter.test.d.ts +2 -0
  481. package/dist/seo/managed-schema-filter.test.d.ts.map +1 -0
  482. package/dist/seo/register-sitemap-cli-impl.d.ts +32 -0
  483. package/dist/seo/register-sitemap-cli-impl.d.ts.map +1 -1
  484. package/dist/seo/register-sitemap-cli.d.ts +7 -0
  485. package/dist/seo/register-sitemap-cli.d.ts.map +1 -1
  486. package/dist/seo/register-sitemap-cli.js +273 -56
  487. package/dist/seo/register-sitemap-cli.js.map +1 -1
  488. package/dist/seo/register-sitemap-cli.mjs +269 -52
  489. package/dist/seo/register-sitemap-cli.mjs.map +1 -1
  490. package/dist/seo/register-sitemap-request.d.ts +36 -0
  491. package/dist/seo/register-sitemap-request.d.ts.map +1 -0
  492. package/dist/seo/register-sitemap-request.test.d.ts +2 -0
  493. package/dist/seo/register-sitemap-request.test.d.ts.map +1 -0
  494. package/dist/seo/routing.d.ts +2 -0
  495. package/dist/seo/routing.d.ts.map +1 -1
  496. package/dist/seo/schema-filter.d.ts +43 -0
  497. package/dist/seo/schema-filter.d.ts.map +1 -0
  498. package/dist/seo/schema-filter.test.d.ts +2 -0
  499. package/dist/seo/schema-filter.test.d.ts.map +1 -0
  500. package/dist/seo/server-api.d.ts +15 -2
  501. package/dist/seo/server-api.d.ts.map +1 -1
  502. package/dist/seo/server.js +23 -18
  503. package/dist/seo/server.mjs +7 -2
  504. package/dist/seo/site-scope.test.d.ts +2 -0
  505. package/dist/seo/site-scope.test.d.ts.map +1 -0
  506. package/dist/seo/types.d.ts +30 -0
  507. package/dist/seo/types.d.ts.map +1 -1
  508. package/dist/seo-meta/contract.d.ts +60 -0
  509. package/dist/seo-meta/contract.d.ts.map +1 -0
  510. package/dist/seo-meta/contract.js +41 -0
  511. package/dist/seo-meta/contract.js.map +1 -0
  512. package/dist/seo-meta/contract.mjs +4 -0
  513. package/dist/seo-meta/contract.mjs.map +1 -0
  514. package/dist/seo-meta/contract.test.d.ts +2 -0
  515. package/dist/seo-meta/contract.test.d.ts.map +1 -0
  516. package/dist/server/index.js +4 -3
  517. package/dist/server/index.mjs +3 -2
  518. package/dist/server/mint-site-token.d.ts +2 -32
  519. package/dist/server/mint-site-token.d.ts.map +1 -1
  520. package/dist/{server-api-RG3ZL3DV.mjs → server-api-A2EFCTZX.mjs} +7 -3
  521. package/dist/{server-api-RG3ZL3DV.mjs.map → server-api-A2EFCTZX.mjs.map} +1 -1
  522. package/dist/{server-api-RYJQAUGO.js → server-api-IWTZ7C3O.js} +25 -21
  523. package/dist/{server-api-RYJQAUGO.js.map → server-api-IWTZ7C3O.js.map} +1 -1
  524. package/dist/shared/build-entries.d.ts +2 -0
  525. package/dist/shared/build-entries.d.ts.map +1 -1
  526. package/dist/shared/fresh-fetch.d.ts +64 -0
  527. package/dist/shared/fresh-fetch.d.ts.map +1 -0
  528. package/dist/shared/fresh-fetch.test.d.ts +2 -0
  529. package/dist/shared/fresh-fetch.test.d.ts.map +1 -0
  530. package/dist/shared/next-files.d.ts +42 -0
  531. package/dist/shared/next-files.d.ts.map +1 -0
  532. package/dist/shared/next-files.test.d.ts +2 -0
  533. package/dist/shared/next-files.test.d.ts.map +1 -0
  534. package/dist/shared/page-leave.d.ts +27 -0
  535. package/dist/shared/page-leave.d.ts.map +1 -0
  536. package/dist/shared/page-leave.test.d.ts +2 -0
  537. package/dist/shared/page-leave.test.d.ts.map +1 -0
  538. package/dist/shared/source-graph.d.ts +63 -0
  539. package/dist/shared/source-graph.d.ts.map +1 -0
  540. package/dist/shared/source-graph.test.d.ts +2 -0
  541. package/dist/shared/source-graph.test.d.ts.map +1 -0
  542. package/dist/shared/version.d.ts +1 -1
  543. package/dist/signal/SignalCore.d.ts.map +1 -1
  544. package/dist/signal/index.js +11 -11
  545. package/dist/signal/index.mjs +2 -2
  546. package/dist/sitemap/discover.d.ts.map +1 -1
  547. package/dist/sitemap/index.d.ts +25 -5
  548. package/dist/sitemap/index.d.ts.map +1 -1
  549. package/dist/sitemap/index.js +54 -51
  550. package/dist/sitemap/index.js.map +1 -1
  551. package/dist/sitemap/index.mjs +39 -36
  552. package/dist/sitemap/index.mjs.map +1 -1
  553. package/dist/sitemap/shared.d.ts +65 -0
  554. package/dist/sitemap/shared.d.ts.map +1 -1
  555. package/dist/sitemap/trailing-slash.test.d.ts +2 -0
  556. package/dist/sitemap/trailing-slash.test.d.ts.map +1 -0
  557. package/dist/sites/resolve.d.ts.map +1 -1
  558. package/dist/sites/site-param.d.ts +16 -0
  559. package/dist/sites/site-param.d.ts.map +1 -0
  560. package/dist/sync/index.js +17 -17
  561. package/dist/sync/index.mjs +4 -4
  562. package/dist/writeLLMsTxt-CQ7A4AAL.js +20 -0
  563. package/dist/writeLLMsTxt-CQ7A4AAL.js.map +1 -0
  564. package/dist/writeLLMsTxt-NX5MSPYX.mjs +11 -0
  565. package/dist/writeLLMsTxt-NX5MSPYX.mjs.map +1 -0
  566. package/package.json +25 -22
  567. package/dist/AnalyticsProvider-6PXC7UDP.js +0 -32
  568. package/dist/AnalyticsProvider-FVQIYSLY.mjs +0 -11
  569. package/dist/BlogViewTracker-S4HSRCW7.js.map +0 -1
  570. package/dist/BlogViewTracker-ZUGLBOVI.mjs.map +0 -1
  571. package/dist/ChatWidget-2TQWCXWP.js +0 -22
  572. package/dist/ChatWidget-DG52ZIE6.mjs +0 -13
  573. package/dist/EngageWidget-2VUJADIU.mjs +0 -12
  574. package/dist/EngageWidget-Z7RC2INM.js +0 -21
  575. package/dist/FormSpotlight-RHL5FWM2.mjs.map +0 -1
  576. package/dist/FormSpotlight-TED32NHP.js.map +0 -1
  577. package/dist/FormStage-DINIRFOX.mjs.map +0 -1
  578. package/dist/FormStage-PFEBKHGY.js.map +0 -1
  579. package/dist/ManagedForm-43WLCUAK.js +0 -23
  580. package/dist/ManagedForm-545YAUFC.mjs +0 -14
  581. package/dist/ManagedNewsletterForm-I3QN57HB.js.map +0 -1
  582. package/dist/ManagedNewsletterForm-ZPY5RRKX.mjs.map +0 -1
  583. package/dist/SignalCore-EEH5IM4U.mjs.map +0 -1
  584. package/dist/SignalCore-M4AXIMV4.js.map +0 -1
  585. package/dist/SitemapSync-46G7LVZS.mjs +0 -9
  586. package/dist/SitemapSync-XK4JKCS7.js +0 -18
  587. package/dist/chunk-46BMNWE6.js.map +0 -1
  588. package/dist/chunk-473WDGQZ.mjs.map +0 -1
  589. package/dist/chunk-4B4S56WJ.mjs.map +0 -1
  590. package/dist/chunk-5B4FABFK.js.map +0 -1
  591. package/dist/chunk-6CJP7BFM.js.map +0 -1
  592. package/dist/chunk-6OP5XSMM.mjs.map +0 -1
  593. package/dist/chunk-746RKQHA.js.map +0 -1
  594. package/dist/chunk-AEARU24Q.mjs.map +0 -1
  595. package/dist/chunk-AHZR4VGY.mjs.map +0 -1
  596. package/dist/chunk-AJQI3WTN.mjs.map +0 -1
  597. package/dist/chunk-B64AZC6P.js.map +0 -1
  598. package/dist/chunk-BZLIOT7Q.js.map +0 -1
  599. package/dist/chunk-C2MSD2UM.mjs.map +0 -1
  600. package/dist/chunk-CQRLKNHQ.js.map +0 -1
  601. package/dist/chunk-DQUBETXH.mjs +0 -6
  602. package/dist/chunk-EEQYKMGH.mjs.map +0 -1
  603. package/dist/chunk-GPLCPMVD.mjs.map +0 -1
  604. package/dist/chunk-GZJE23Y5.mjs.map +0 -1
  605. package/dist/chunk-H4OBGC43.mjs.map +0 -1
  606. package/dist/chunk-H7274TKR.mjs.map +0 -1
  607. package/dist/chunk-IPV2TUAT.js.map +0 -1
  608. package/dist/chunk-IYCLN3XS.mjs.map +0 -1
  609. package/dist/chunk-JEOKDUPQ.js +0 -45
  610. package/dist/chunk-JEOKDUPQ.js.map +0 -1
  611. package/dist/chunk-JNRHTZL4.js.map +0 -1
  612. package/dist/chunk-KPKQKFT4.js.map +0 -1
  613. package/dist/chunk-KSL3WA2I.js +0 -8
  614. package/dist/chunk-KY6M76JW.js.map +0 -1
  615. package/dist/chunk-LC7AM4J5.js.map +0 -1
  616. package/dist/chunk-LOS5D6B3.js +0 -72
  617. package/dist/chunk-LOS5D6B3.js.map +0 -1
  618. package/dist/chunk-NZSFOZJV.js.map +0 -1
  619. package/dist/chunk-OZ3FU4BT.js.map +0 -1
  620. package/dist/chunk-QJU6HBSK.mjs +0 -39
  621. package/dist/chunk-QJU6HBSK.mjs.map +0 -1
  622. package/dist/chunk-R3KTBKSW.js.map +0 -1
  623. package/dist/chunk-RIYAMYLV.mjs.map +0 -1
  624. package/dist/chunk-RU54J2PY.mjs.map +0 -1
  625. package/dist/chunk-TP7H6BSK.mjs.map +0 -1
  626. package/dist/chunk-UJ6CHZAI.mjs.map +0 -1
  627. package/dist/chunk-UU47DGHE.js.map +0 -1
  628. package/dist/chunk-X5TCH7VZ.js.map +0 -1
  629. package/dist/chunk-XIJ4F6IE.mjs +0 -63
  630. package/dist/chunk-XIJ4F6IE.mjs.map +0 -1
  631. package/dist/discover-BEJRYNFF.mjs +0 -4
  632. package/dist/discover-WVDYDUJX.js +0 -21
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/blog/ServiceCallout.tsx","../src/blog/ClusterNavigation.tsx","../src/blog/processBlogHtml.ts","../src/blog/reading-time.ts","../src/blog/author-social.ts","../src/blog/BlogPost.tsx","../src/blog/BlogList.tsx","../src/blog/BlogSidebar.tsx","../src/blog/BlogLayout.tsx","../src/blog/RelatedPosts.tsx"],"names":["jsxs","jsx","Fragment","createBlogRoutes","marked","resolveBlogArtwork","blogCategorySlug","blogArtworkImageStyle","cls","React","fetchCategories","widgetStyle","widgetTitleStyle","fetchRelatedPosts"],"mappings":"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","file":"chunk-KY6M76JW.js","sourcesContent":["/**\n * @sonordev/site-kit/blog - Service Callout / CTA Component\n *\n * Renders a promotional call-to-action section within blog posts.\n * Automatically generated by Signal AI during blog creation, linking\n * article content to the business's relevant services.\n *\n * Two variants:\n * - 'featured' (default): Full-width gradient banner with button\n * - 'inline': Compact card with icon accent\n *\n * Uses site-kit brand tokens (--sk-primary, --sk-bg, etc.) for theming.\n * Supports full Tailwind override via `styles` prop.\n *\n * @example\n * ```tsx\n * <ServiceCallout\n * title=\"Ready to build your MVP?\"\n * description=\"Our team specializes in lean SaaS builds.\"\n * cta=\"Get Started\"\n * url=\"/services/application-development\"\n * />\n * ```\n */\n\nimport React from 'react'\n\nexport interface ServiceCalloutProps {\n title: string\n description?: string\n cta?: string\n url: string\n variant?: 'featured' | 'inline'\n /** Override default styles with Tailwind classes */\n styles?: {\n wrapper?: string\n title?: string\n description?: string\n button?: string\n }\n /** Strip all default styles (BYO Tailwind) */\n unstyled?: boolean\n}\n\n// Default inline styles using CSS custom properties for brand theming\nconst defaults = {\n featured: {\n wrapper: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1.5rem',\n padding: '2rem 2.5rem',\n margin: '3rem 0',\n borderRadius: '1rem',\n background: 'linear-gradient(135deg, color-mix(in srgb, var(--sk-primary, #2563eb) 8%, transparent), color-mix(in srgb, var(--sk-primary, #2563eb) 15%, transparent))',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #2563eb) 25%, transparent)',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 700,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.9375rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.5rem',\n maxWidth: '40rem',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.75rem 1.75rem',\n borderRadius: '0.5rem',\n fontWeight: 600,\n fontSize: '0.9375rem',\n color: '#ffffff',\n background: 'var(--sk-primary, #2563eb)',\n textDecoration: 'none',\n transition: 'transform 0.15s, box-shadow 0.15s',\n whiteSpace: 'nowrap' as const,\n },\n },\n inline: {\n wrapper: {\n display: 'flex',\n gap: '1rem',\n padding: '1.25rem 1.5rem',\n margin: '2rem 0',\n borderRadius: '0.75rem',\n background: 'var(--sk-bg-elevated, #f8fafc)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #2563eb) 20%, var(--sk-surface-border, #e2e8f0))',\n },\n icon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.625rem',\n background: 'var(--sk-primary, #2563eb)',\n color: '#ffffff',\n flexShrink: 0,\n fontSize: '1.125rem',\n },\n title: {\n fontSize: '1rem',\n fontWeight: 600,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.875rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.25rem',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n marginTop: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: 'var(--sk-primary, #2563eb)',\n textDecoration: 'none',\n },\n },\n}\n\nexport function ServiceCallout({\n title,\n description,\n cta = 'Learn More',\n url,\n variant = 'featured',\n styles,\n unstyled = false,\n}: ServiceCalloutProps) {\n if (variant === 'inline') {\n return (\n <aside\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.inline.wrapper}\n role=\"complementary\"\n aria-label=\"Related service\"\n >\n <div style={unstyled ? undefined : defaults.inline.icon}>→</div>\n <div>\n <h4\n className={styles?.title}\n style={unstyled ? undefined : defaults.inline.title}\n >\n {title}\n </h4>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.inline.description}\n >\n {description}\n </p>\n )}\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.inline.link}\n >\n {cta} →\n </a>\n </div>\n </aside>\n )\n }\n\n // Featured variant (default)\n return (\n <section\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.featured.wrapper}\n role=\"complementary\"\n aria-label=\"Call to action\"\n >\n <div>\n <h3\n className={styles?.title}\n style={unstyled ? undefined : defaults.featured.title}\n >\n {title}\n </h3>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.featured.description}\n >\n {description}\n </p>\n )}\n </div>\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.featured.button}\n >\n {cta} →\n </a>\n </section>\n )\n}\n\n/**\n * Renders all service callouts for a blog post.\n * First callout uses 'featured' variant, subsequent use 'inline'.\n */\nexport function ServiceCallouts({\n callouts,\n styles,\n unstyled,\n}: {\n callouts: Array<{ title: string; description?: string; cta?: string; url: string }>\n styles?: ServiceCalloutProps['styles']\n unstyled?: boolean\n}) {\n if (!callouts || callouts.length === 0) return null\n\n return (\n <>\n {callouts.map((callout, i) => (\n <ServiceCallout\n key={callout.url + i}\n {...callout}\n variant={i === 0 ? 'featured' : 'inline'}\n styles={styles}\n unstyled={unstyled}\n />\n ))}\n </>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Cluster Navigation Component\n *\n * Renders cluster context on blog post pages:\n * - \"Full Guide\" pillar backlink (on support articles only)\n * - Sibling article list with article_type badges\n *\n * Adapts to light/dark themes automatically using the same --sk-* variables\n * as the rest of site-kit, with currentColor-based fallbacks.\n */\n\nimport React from 'react'\nimport type { ClusterNavigation as ClusterNavigationType } from './types'\nimport { createBlogRoutes, type BlogRoutingOptions } from './routes'\n\n// ============================================================================\n// CSS\n// ============================================================================\n\nconst clusterNavCss = `\n.sk-cluster-nav {\n --_cn-primary: var(--sk-primary, currentColor);\n --_cn-bg: var(--sk-bg-elevated, color-mix(in srgb, currentColor 6%, transparent));\n --_cn-border: var(--sk-surface-border, color-mix(in srgb, currentColor 12%, transparent));\n --_cn-text: var(--sk-text-primary, inherit);\n --_cn-text2: var(--sk-text-secondary, color-mix(in srgb, currentColor 70%, transparent));\n --_cn-text3: var(--sk-text-tertiary, color-mix(in srgb, currentColor 45%, transparent));\n\n margin: 2rem 0;\n padding: 1.5rem;\n border-radius: 0.75rem;\n background: var(--_cn-bg);\n border: 1px solid var(--_cn-border);\n color: var(--_cn-text);\n}\n\n.sk-cluster-pillar-link {\n margin-bottom: 1.25rem;\n padding-bottom: 1.25rem;\n border-bottom: 1px solid var(--_cn-border);\n}\n.sk-cluster-pillar-link-label {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--_cn-text3);\n margin: 0 0 0.375rem 0;\n}\n.sk-cluster-pillar-link a {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--_cn-primary);\n text-decoration: none;\n transition: opacity 0.15s;\n}\n.sk-cluster-pillar-link a:hover { opacity: 0.8; }\n\n.sk-cluster-siblings-title {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--_cn-text3);\n margin: 0 0 0.75rem 0;\n}\n.sk-cluster-siblings-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n.sk-cluster-siblings-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.sk-cluster-siblings-item a {\n font-size: 0.875rem;\n color: var(--_cn-text2);\n text-decoration: none;\n transition: color 0.15s;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.sk-cluster-siblings-item a:hover { color: var(--_cn-primary); }\n.sk-cluster-type-badge {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0.125rem 0.4rem;\n border-radius: 9999px;\n font-size: 0.625rem;\n font-weight: 500;\n text-transform: capitalize;\n background: color-mix(in srgb, var(--_cn-primary) 10%, transparent);\n color: var(--_cn-primary);\n border: 1px solid color-mix(in srgb, var(--_cn-primary) 20%, transparent);\n}\n`\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport interface ClusterNavigationProps {\n /** Cluster navigation data */\n navigation: ClusterNavigationType\n /** Base path for blog URLs (default: /blog) */\n basePath?: string\n routing?: BlogRoutingOptions\n /**\n * Fallback category slug for URL building (optional). Each linked article's\n * OWN category takes precedence when present — applying one category to\n * every sibling produced wrong-category URLs (duplicate content / redirect\n * chains) on category-segmented sites whenever a cluster spans categories.\n */\n category?: string\n /** Append a trailing slash to article URLs (only for trailingSlash sites) */\n trailingSlash?: boolean\n /** Disable default styles */\n unstyled?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport function ClusterNavigation({\n navigation,\n basePath,\n routing,\n category,\n trailingSlash = false,\n unstyled = false,\n className,\n}: ClusterNavigationProps) {\n if (!navigation) return null\n\n const siblings = (navigation.siblings || []).filter(\n s => s.article_type !== 'pillar'\n )\n\n const hasPillarLink = !navigation.is_pillar && navigation.pillar\n const hasSiblings = siblings.length > 0\n\n if (!hasPillarLink && !hasSiblings) return null\n\n const articleUrl = (article: { slug: string; category?: string }) => {\n // Preserve the existing category-aware default; explicit routing can opt out.\n const path = createBlogRoutes({ basePath, category, includeCategoryInPath: !routing, ...routing }).post(article)\n return trailingSlash ? path.replace(/\\/?([?#]|$)/, '/$1') : path\n }\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: clusterNavCss }} />}\n\n <nav className={`${unstyled ? '' : 'sk-cluster-nav'} ${className || ''}`}>\n {hasPillarLink && navigation.pillar && (\n <div className={unstyled ? '' : 'sk-cluster-pillar-link'}>\n <p className={unstyled ? '' : 'sk-cluster-pillar-link-label'}>Full Guide</p>\n <a href={articleUrl(navigation.pillar)}>\n {navigation.pillar.title}\n </a>\n </div>\n )}\n\n {hasSiblings && (\n <div>\n <p className={unstyled ? '' : 'sk-cluster-siblings-title'}>\n {navigation.is_pillar ? 'Deep Dives' : 'More in This Series'}\n </p>\n <ul className={unstyled ? '' : 'sk-cluster-siblings-list'}>\n {siblings.map((sibling) => (\n <li key={sibling.slug} className={unstyled ? '' : 'sk-cluster-siblings-item'}>\n <span className={unstyled ? '' : 'sk-cluster-type-badge'}>\n {sibling.article_type}\n </span>\n <a href={articleUrl(sibling)}>{sibling.title}</a>\n </li>\n ))}\n </ul>\n </div>\n )}\n </nav>\n </>\n )\n}\n","/**\n * Post-process Portal/blog HTML for safe, consistent link behavior.\n * Server-safe string transforms only (no DOM).\n */\n\n/** Normalize hostname for same-site detection (strips leading www). */\nexport function normalizeSiteHost(siteUrl: string): string {\n try {\n const base = siteUrl.startsWith('http') ? siteUrl : `https://${siteUrl}`\n const u = new URL(base)\n return u.hostname.replace(/^www\\./i, '').toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * Resolve canonical site URL for link classification.\n * Pass `explicit` from props when env vars are not set (e.g. non-Vercel hosts).\n */\nexport function resolveBlogSiteUrl(explicit?: string): string {\n const fromProp = explicit?.trim()\n if (fromProp) return fromProp\n const next = process.env.NEXT_PUBLIC_SITE_URL?.trim()\n if (next) return next\n const site = process.env.SITE_URL?.trim()\n if (site) return site\n const vercel = process.env.VERCEL_URL?.trim()\n if (vercel) return vercel.startsWith('http') ? vercel : `https://${vercel}`\n return ''\n}\n\n/**\n * Add `target=\"_blank\"` and `rel=\"noopener noreferrer\"` to external http(s) links.\n * Same registrable host (with or without `www`) is treated as internal.\n * Skips anchors that already set `target`.\n */\nexport function addExternalLinkTargets(html: string, siteUrl: string): string {\n if (!html || !siteUrl) return html\n const siteHost = normalizeSiteHost(siteUrl)\n if (!siteHost) return html\n\n return html.replace(/<a\\b([^>]*)>/gi, (_full, attrs: string) => {\n const hrefMatch = attrs.match(/\\bhref\\s*=\\s*([\"'])([^\"']*)\\1/i)\n if (!hrefMatch) return `<a${attrs}>`\n const href = hrefMatch[2].trim()\n if (!/^https?:\\/\\//i.test(href)) return `<a${attrs}>`\n\n try {\n const url = new URL(href)\n const linkHost = url.hostname.replace(/^www\\./i, '').toLowerCase()\n if (linkHost === siteHost) return `<a${attrs}>`\n if (/\\btarget\\s*=/i.test(attrs)) return `<a${attrs}>`\n const trimmed = attrs.trim()\n return `<a ${trimmed} target=\"_blank\" rel=\"noopener noreferrer\">`\n } catch {\n return `<a${attrs}>`\n }\n })\n}\n","import type { BlogPost } from './types'\n\n/**\n * Single source of truth for reading-time display.\n *\n * The DB/API column is `reading_time` (blog_posts) — `reading_time_minutes`\n * never existed server-side and exists on the type only for callers that\n * pre-map their own data. Every \"X min read\" chip resolves through here.\n */\nexport function readingTimeMinutes(\n post: Pick<BlogPost, 'reading_time' | 'reading_time_minutes'>\n): number | null {\n const value = post.reading_time_minutes ?? post.reading_time\n return typeof value === 'number' && value > 0 ? value : null\n}\n","import type { BlogAuthor } from './types'\n\nexport interface AuthorSocialLink {\n label: string\n href: string\n}\n\nconst withPrefix = (value: string, base: string): string =>\n value.startsWith('http') ? value : `${base}${value}`\n\n/**\n * Single source of truth for author social display.\n *\n * The real blog_authors columns are linkedin_url / twitter_url / website_url\n * (E-E-A-T fields); `social_links` / `website` are the legacy shape that no\n * API response ever carried. Real columns win; legacy handles get their host\n * prefixed unless they are already full URLs.\n */\nexport function getAuthorSocialLinks(\n author: Pick<\n BlogAuthor,\n 'linkedin_url' | 'twitter_url' | 'website_url' | 'website' | 'social_links'\n >\n): AuthorSocialLink[] {\n const links: AuthorSocialLink[] = []\n\n const linkedin = author.linkedin_url || author.social_links?.linkedin\n if (linkedin) links.push({ label: 'LinkedIn', href: withPrefix(linkedin, 'https://linkedin.com/in/') })\n\n const twitter = author.twitter_url\n ? author.twitter_url\n : author.social_links?.twitter\n ? withPrefix(author.social_links.twitter, 'https://twitter.com/')\n : null\n if (twitter) links.push({ label: 'Twitter', href: twitter })\n\n const website = author.website_url || author.website\n if (website) links.push({ label: 'Website', href: website })\n\n const github = author.social_links?.github\n if (github) links.push({ label: 'GitHub', href: withPrefix(github, 'https://github.com/') })\n\n return links\n}\n","/**\n * @sonordev/site-kit/blog - Blog Post Component\n *\n * Fetches and displays a single blog post with full content, table of contents,\n * author info, related posts, and SEO metadata support.\n *\n * Ships with world-class default styling via scoped `.sk-blog-*` classes.\n * No configuration needed — just `<BlogPost slug={slug} />`.\n *\n * Override with `styles` prop (per-element class names) or `unstyled` for\n * complete control. The `children` render prop gives full data access.\n */\n\nimport React from 'react'\nimport { marked } from 'marked'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor, ClusterNavigation as ClusterNavigationType } from './types'\nimport { ServiceCallouts } from './ServiceCallout'\nimport { readingTimeMinutes } from './reading-time'\nimport { getAuthorSocialLinks } from './author-social'\nimport { ClusterNavigation } from './ClusterNavigation'\nimport { addExternalLinkTargets, resolveBlogSiteUrl } from './processBlogHtml'\nimport { blogArtworkImageStyle, resolveBlogArtwork } from './artwork'\nimport { blogCategorySlug, createBlogRoutes, type BlogRoutingOptions } from './routes'\n\n/**\n * Extract cluster navigation from a post's cluster fields (pure function, no\n * API calls). Mirrored copy: server-core.ts getClusterNavigation is\n * identical. Keep the two in sync — they CANNOT be consolidated because\n * blog/index is a CLIENT_ENTRY that must never import blog/server-core (see\n * build-entries.ts and client-entry-boundary.test.ts).\n */\nfunction getClusterNav(post: Record<string, any>): ClusterNavigationType | null {\n if (!post.cluster_id && !post.cluster_slug) return null\n const isPillar = post.article_type === 'pillar'\n return {\n cluster_name: post.cluster_name || '',\n cluster_slug: post.cluster_slug || '',\n pillar: isPillar ? null\n : post.parent_pillar_slug\n ? {\n slug: post.parent_pillar_slug,\n title: post.parent_pillar_title || '',\n category: post.parent_pillar_category || undefined,\n }\n : null,\n siblings: post.sibling_articles || [],\n is_pillar: isPillar,\n }\n}\n\n// ============================================================================\n// Markdown helpers\n// ============================================================================\n\nfunction looksLikeMarkdown(text: string): boolean {\n if (text.trimStart().startsWith('<')) return false\n const markers = [/^#{1,6}\\s/m, /\\*\\*[^*]+\\*\\*/, /\\[([^\\]]+)\\]\\([^)]+\\)/, /^[-*]\\s/m, /^>\\s/m]\n let hits = 0\n for (const re of markers) if (re.test(text)) hits++\n return hits >= 2\n}\n\nfunction slugify(text: string): string {\n return text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '')\n}\n\n/** Convert markdown to HTML if needed, and inject IDs into headings for TOC anchors. */\nfunction ensureHtml(raw: string): string {\n if (!raw) return raw\n let html = raw\n if (looksLikeMarkdown(html)) {\n html = marked.parse(html, { gfm: true, breaks: false, async: false }) as string\n }\n html = injectHeadingIds(html)\n return html\n}\n\n/** Add `id` attributes to h2-h4 that lack them so TOC anchor links work. */\nfunction injectHeadingIds(html: string): string {\n return html.replace(/<h([2-4])([^>]*)>(.*?)<\\/h[2-4]>/gi, (_full, level, attrs: string, inner: string) => {\n if (/\\bid\\s*=/i.test(attrs)) return _full\n const text = inner.replace(/<[^>]*>/g, '')\n const id = slugify(text)\n return `<h${level}${attrs} id=\"${id}\">${inner}</h${level}>`\n })\n}\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogPostStyles {\n article?: string\n header?: string\n breadcrumb?: string\n breadcrumbLink?: string\n title?: string\n subtitle?: string\n meta?: string\n metaItem?: string\n featuredImageWrapper?: string\n featuredImage?: string\n contentLayout?: string\n content?: string\n tocSidebar?: string\n tocTitle?: string\n tocList?: string\n tocItem?: string\n tocLink?: string\n tags?: string\n tag?: string\n faqSection?: string\n faqTitle?: string\n faqItem?: string\n faqQuestion?: string\n faqAnswer?: string\n authorCard?: string\n relatedSection?: string\n relatedTitle?: string\n relatedGrid?: string\n relatedCard?: string\n notFound?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchBlogPost(apiUrl: string, apiKey: string, slug: string): Promise<BlogPostType | null> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n if (!response.ok) {\n if (response.status === 404) return null\n console.error('[Blog] Failed to fetch post:', response.statusText)\n return null\n }\n const data = await response.json()\n return data.post\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\nasync function fetchRelatedPosts(apiUrl: string, apiKey: string, postId: string, limit: number = 3): Promise<BlogPostType[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },\n body: JSON.stringify({ current_post_id: postId, limit }),\n next: { revalidate: 300 },\n })\n if (!response.ok) return []\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// TOC GENERATION\n// ============================================================================\n\nfunction generateTableOfContents(html: string): TocItem[] {\n const headingRegex = /<h([2-4])[^>]*(?:id=\"([^\"]*)\")?[^>]*>(.*?)<\\/h[2-4]>/gi\n const items: TocItem[] = []\n let match\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const existingId = match[2]\n const text = match[3].replace(/<[^>]*>/g, '')\n const id = existingId || slugify(text)\n items.push({ id, text, level })\n }\n return items\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\nexport interface BlogPostServerProps {\n apiUrl?: string\n apiKey?: string\n slug: string\n showToc?: boolean\n showRelated?: boolean\n relatedCount?: number\n showAuthor?: boolean\n basePath?: string\n routing?: BlogRoutingOptions\n className?: string\n styles?: BlogPostStyles\n unstyled?: boolean\n siteUrl?: string\n children?: (props: {\n post: BlogPostType\n tableOfContents: TocItem[]\n relatedPosts: BlogPostType[]\n }) => React.ReactNode\n}\n\n// ============================================================================\n// CLASS HELPER — pick custom `styles` class or default `.sk-blog-*` class\n// ============================================================================\n\nfunction cls(unstyled: boolean, styles: BlogPostStyles, key: keyof BlogPostStyles, defaultClass: string, extra?: string): string | undefined {\n if (unstyled) return styles[key] || undefined\n const base = styles[key] || defaultClass\n return extra ? `${base} ${extra}` : base\n}\n\n// ============================================================================\n// BLOG POST COMPONENT\n// ============================================================================\n\nexport async function BlogPost({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n slug,\n showToc = true,\n showRelated = true,\n relatedCount = 3,\n showAuthor = true,\n basePath,\n routing,\n className,\n styles = {},\n unstyled = false,\n siteUrl,\n children,\n}: BlogPostServerProps) {\n const routes = createBlogRoutes({ basePath, ...routing })\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n // Keep server-rendered styles and HTML processing out of the legacy client barrel.\n const [post, { blogPostCss }, { wrapBlogTables }] = await Promise.all([\n fetchBlogPost(apiUrl, apiKey, slug),\n unstyled ? Promise.resolve({ blogPostCss: '' }) : import('./blog-styles'),\n import('./blog-tables'),\n ])\n\n // ---------- NOT FOUND ----------\n if (!post) {\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogPostCss }} />}\n <div className={cls(unstyled, styles, 'notFound', 'sk-blog-not-found', className)}>\n <h1>Post Not Found</h1>\n <p>The blog post you&rsquo;re looking for doesn&rsquo;t exist or has been removed.</p>\n <a href={routes.index}>&larr; Back to Blog</a>\n </div>\n </>\n )\n }\n\n // ---------- PREPARE DATA ----------\n const rawContent = post.content_html || post.content || ''\n const content = ensureHtml(rawContent)\n const siteUrlResolved = resolveBlogSiteUrl(siteUrl)\n const contentWithExternalTargets = wrapBlogTables(addExternalLinkTargets(content, siteUrlResolved))\n const artwork = resolveBlogArtwork(post, 'article')\n const tableOfContents = showToc ? generateTableOfContents(content) : []\n const relatedPosts = showRelated ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount) : []\n\n const faqRaw = (post.faq_items ?? (post as { faqItems?: unknown }).faqItems) as Array<{ question: string; answer: string }> | undefined\n const faqItemsProcessed = faqRaw?.map((item) => ({\n ...item,\n answer: addExternalLinkTargets(item.answer || '', siteUrlResolved),\n })) ?? faqRaw\n\n // Client islands, dynamically imported so tsup splits + 'use client'-stamps\n // their chunks (same pattern for both).\n const { BlogViewTracker } = await import('./BlogViewTracker')\n\n // ---------- CUSTOM RENDER ----------\n if (children) {\n return (\n <>\n <BlogViewTracker slug={post.slug} />\n {children({ post, tableOfContents, relatedPosts })}\n </>\n )\n }\n\n const { BlogPostFaqSection } = await import('./BlogPostFaqSection')\n\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })\n : null\n\n const hasToc = showToc && tableOfContents.length > 0\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogPostCss }} />}\n <BlogViewTracker slug={post.slug} />\n\n <article className={cls(unstyled, styles, 'article', 'sk-blog-article', className)}>\n {/* ===== Header ===== */}\n <header className={cls(unstyled, styles, 'header', 'sk-blog-header')}>\n <nav className={cls(unstyled, styles, 'breadcrumb', 'sk-blog-breadcrumb')}>\n <a href={routes.index} className={styles.breadcrumbLink || undefined}>Blog</a>\n {post.category && (\n <>\n <span className=\"sk-blog-breadcrumb-sep\">/</span>\n <a\n href={routing?.categoryPath ? routes.category(blogCategorySlug(post.category)) : `${routes.index}?category=${encodeURIComponent(blogCategorySlug(post.category))}`}\n className={styles.breadcrumbLink || undefined}\n >\n {typeof post.category === 'string' ? post.category : (post.category as any)?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n <h1 className={cls(unstyled, styles, 'title', 'sk-blog-title')}>{post.title}</h1>\n\n {post.subtitle && (\n <p className={cls(unstyled, styles, 'subtitle', 'sk-blog-subtitle')}>{post.subtitle}</p>\n )}\n\n <div className={cls(unstyled, styles, 'meta', 'sk-blog-meta')}>\n {post.author && (\n <span className={cls(unstyled, styles, 'metaItem', 'sk-blog-meta-item')}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.author && date && <span className=\"sk-blog-meta-dot\" />}\n {date && (\n <span className={cls(unstyled, styles, 'metaItem', 'sk-blog-meta-item')}>{date}</span>\n )}\n {date && readingTimeMinutes(post) && <span className=\"sk-blog-meta-dot\" />}\n {readingTimeMinutes(post) && (\n <span className={cls(unstyled, styles, 'metaItem', 'sk-blog-meta-item')}>\n {readingTimeMinutes(post)} min read\n </span>\n )}\n </div>\n </header>\n\n {/* ===== Featured Image ===== */}\n {artwork.src && (\n <figure className={cls(unstyled, styles, 'featuredImageWrapper', 'sk-blog-featured-wrap')}>\n <img\n src={artwork.src}\n alt={artwork.alt}\n data-sk-composed-card={artwork.composed || undefined}\n style={blogArtworkImageStyle(artwork)}\n className={cls(unstyled, styles, 'featuredImage', 'sk-blog-featured-img')}\n />\n </figure>\n )}\n\n {/* ===== Content + TOC ===== */}\n <div className={cls(unstyled, styles, 'contentLayout', hasToc ? 'sk-blog-layout sk-blog-layout--has-toc' : 'sk-blog-layout')}>\n <div\n className={cls(unstyled, styles, 'content', 'sk-blog-content')}\n dangerouslySetInnerHTML={{ __html: contentWithExternalTargets }}\n />\n\n {hasToc && (\n <aside className={cls(unstyled, styles, 'tocSidebar', 'sk-blog-toc')}>\n <h4 className={cls(unstyled, styles, 'tocTitle', 'sk-blog-toc-title')}>On This Page</h4>\n <ul className={cls(unstyled, styles, 'tocList', 'sk-blog-toc-list')}>\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n className={cls(unstyled, styles, 'tocItem', item.level > 2 ? `sk-blog-toc-indent-${item.level}` : '')}\n >\n <a href={`#${item.id}`} className={styles.tocLink || undefined}>{item.text}</a>\n </li>\n ))}\n </ul>\n </aside>\n )}\n </div>\n\n {/* ===== Tags ===== */}\n {post.tags && post.tags.length > 0 && (\n <div className={cls(unstyled, styles, 'tags', 'sk-blog-tags')}>\n {post.tags.map((tag, index) => {\n const tagName = typeof tag === 'string' ? tag : tag?.name || ''\n return (\n <a key={`${tagName}-${index}`} href={`${routes.index}?tag=${encodeURIComponent(tagName)}`} className={cls(unstyled, styles, 'tag', 'sk-blog-tag')}>\n #{tagName}\n </a>\n )\n })}\n </div>\n )}\n\n {/* ===== Service Callouts ===== */}\n <ServiceCallouts\n callouts={(post as any).service_callouts ?? (post as any).serviceCallouts ?? []}\n unstyled={unstyled}\n />\n\n {/* ===== FAQ ===== */}\n <BlogPostFaqSection\n items={(faqItemsProcessed ?? []) as any[]}\n unstyled={unstyled}\n styles={unstyled ? {\n section: styles.faqSection,\n title: styles.faqTitle,\n item: styles.faqItem,\n question: styles.faqQuestion,\n answerInner: styles.faqAnswer,\n } : undefined}\n />\n\n {/* ===== Author ===== */}\n {showAuthor && post.author && typeof post.author === 'object' && (\n <AuthorSection author={normalizeAuthorForDisplay(post.author)} className={styles.authorCard} unstyled={unstyled} />\n )}\n\n {/* ===== Cluster Navigation ===== */}\n {(() => {\n const clusterNav = getClusterNav(post as any)\n if (!clusterNav) return null\n return (\n <ClusterNavigation\n navigation={clusterNav}\n basePath={basePath}\n routing={routing}\n unstyled={unstyled}\n />\n )\n })()}\n\n {/* ===== Related Posts ===== */}\n {showRelated && relatedPosts.length > 0 && (\n <section className={cls(unstyled, styles, 'relatedSection', 'sk-blog-related')}>\n <h2 className={cls(unstyled, styles, 'relatedTitle', 'sk-blog-related-title')}>Related Posts</h2>\n <div className={cls(unstyled, styles, 'relatedGrid', 'sk-blog-related-grid')}>\n {relatedPosts.map((rp) => {\n const relatedArtwork = resolveBlogArtwork(rp)\n return (\n <a key={rp.id} href={routes.post(rp)} className={cls(unstyled, styles, 'relatedCard', 'sk-blog-related-card')}>\n {relatedArtwork.src && <img src={relatedArtwork.src} alt={relatedArtwork.alt} data-sk-composed-card={relatedArtwork.composed || undefined} style={blogArtworkImageStyle(relatedArtwork)} />}\n <div className=\"sk-blog-related-card-body\">\n <h3>{rp.title}</h3>\n {rp.excerpt && <p>{rp.excerpt.slice(0, 120)}...</p>}\n </div>\n </a>\n )\n })}\n </div>\n </section>\n )}\n </article>\n </>\n )\n}\n\n// ============================================================================\n// AUTHOR HELPERS\n// ============================================================================\n\nfunction normalizeAuthorForDisplay(author: Record<string, unknown> | BlogAuthor): BlogAuthor & { sameAs?: string[]; title?: string } {\n const a = author as Record<string, unknown>\n return {\n id: (a.id as string) ?? 'author',\n project_id: (a.project_id as string) ?? '',\n name: (a.name as string) ?? 'Author',\n slug: (a.slug as string) ?? 'author',\n bio: (a.bio as string) ?? undefined,\n avatar_url: (a.avatar_url as string) ?? (a.image as string) ?? (a.image_url as string) ?? undefined,\n website: (a.website as string) ?? (a.url as string) ?? undefined,\n social_links: a.social_links as BlogAuthor['social_links'] | undefined,\n // Real API columns (blog_authors) — previously dropped here, so\n // AuthorSection could never render socials from a live author row.\n linkedin_url: (a.linkedin_url as string) ?? undefined,\n twitter_url: (a.twitter_url as string) ?? undefined,\n website_url: (a.website_url as string) ?? undefined,\n same_as: (a.same_as as string[]) ?? undefined,\n is_active: (a.is_active as boolean) ?? true,\n ...(normalizeSocialProfiles(a.socialProfiles).length\n ? { sameAs: normalizeSocialProfiles(a.socialProfiles) }\n : {}),\n ...(a.title ? { title: a.title as string } : {}),\n } as BlogAuthor & { sameAs?: string[]; title?: string }\n}\n\n/**\n * socialProfiles arrives as either string[] (site config) or the\n * {linkedin, twitter} object sonor-api emits — accept both into sameAs.\n */\nfunction normalizeSocialProfiles(value: unknown): string[] {\n if (Array.isArray(value)) return value.filter((v): v is string => typeof v === 'string' && !!v)\n if (value && typeof value === 'object') {\n return Object.values(value as Record<string, unknown>).filter(\n (v): v is string => typeof v === 'string' && !!v\n )\n }\n return []\n}\n\nfunction AuthorSection({ author, className, unstyled = false }: { author: BlogAuthor & { sameAs?: string[]; title?: string }; className?: string; unstyled?: boolean }) {\n const base = unstyled ? className : (className || 'sk-blog-author')\n const socialLinks = getAuthorSocialLinks(author)\n return (\n <section className={base || undefined}>\n {author.avatar_url && <img src={author.avatar_url} alt={author.name} className={unstyled ? undefined : 'sk-blog-author-avatar'} />}\n <div>\n <h3 className={unstyled ? undefined : 'sk-blog-author-name'}>{author.name}</h3>\n {'title' in author && author.title && <p className={unstyled ? undefined : 'sk-blog-author-title'}>{author.title}</p>}\n {author.bio && <p className={unstyled ? undefined : 'sk-blog-author-bio'}>{author.bio}</p>}\n {socialLinks.length > 0 && (\n <div className={unstyled ? undefined : 'sk-blog-author-links'}>\n {socialLinks.map((link) => <a key={link.label} href={link.href} target=\"_blank\" rel=\"noopener noreferrer\">{link.label}</a>)}\n </div>\n )}\n {'sameAs' in author && author.sameAs && author.sameAs.length > 0 && socialLinks.length === 0 && (\n <div className={unstyled ? undefined : 'sk-blog-author-links'}>\n {author.sameAs.map((url, i) => <a key={i} href={url} target=\"_blank\" rel=\"noopener noreferrer\">Profile</a>)}\n </div>\n )}\n </div>\n </section>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Blog List Component\n *\n * Fetches and displays a list of blog posts with pagination, filtering, and sorting.\n *\n * Ships with world-class default styling via scoped `.sk-bloglist-*` classes.\n * No configuration needed — just `<BlogList basePath=\"/blog\" />`.\n *\n * Override with `styles` prop (per-element class names) or `unstyled` for\n * complete control. The `children` render prop gives full data access.\n */\n\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\nimport { readingTimeMinutes } from './reading-time'\nimport { blogArtworkImageStyle, resolveBlogArtwork } from './artwork'\nimport { createBlogRoutes, type BlogRoutingOptions } from './routes'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogListStyles {\n container?: string\n categoryNav?: string\n categoryLink?: string\n categoryLinkActive?: string\n categoryLinkInactive?: string\n grid?: string\n card?: string\n cardImageWrapper?: string\n cardImage?: string\n cardBody?: string\n cardMeta?: string\n cardCategory?: string\n cardDate?: string\n cardTitle?: string\n cardTitleLink?: string\n cardExcerpt?: string\n cardFooter?: string\n cardAuthor?: string\n cardReadingTime?: string\n cardReadMore?: string\n pagination?: string\n paginationLink?: string\n paginationInfo?: string\n emptyState?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\ninterface FetchBlogListParams {\n apiUrl: string\n apiKey: string\n category?: string\n tag?: string\n author?: string\n featured?: boolean\n search?: string\n /** Topic cluster slug — the server resolves it to cluster_id */\n cluster?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n}\n\nasync function fetchBlogList(params: FetchBlogListParams): Promise<BlogListResult> {\n const {\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n cluster,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n } = params\n\n const queryParams = new URLSearchParams()\n if (category) queryParams.set('category', category)\n if (tag) queryParams.set('tag', tag)\n if (author) queryParams.set('author', author)\n if (featured) queryParams.set('featured', 'true')\n if (search) queryParams.set('search', search)\n if (cluster) queryParams.set('cluster', cluster)\n queryParams.set('page', String(page))\n queryParams.set('per_page', String(perPage))\n queryParams.set('order_by', orderBy)\n queryParams.set('order', order)\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts?${queryParams}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) {\n console.error('[Blog] Failed to fetch posts:', response.statusText)\n return emptyResult()\n }\n\n const data = await response.json()\n return {\n posts: data.posts || [],\n pagination: {\n page: data.pagination?.page || 1,\n perPage: data.pagination?.per_page || 12,\n total: data.pagination?.total || 0,\n totalPages: data.pagination?.total_pages || 0,\n hasNext: data.pagination?.has_next || false,\n hasPrev: data.pagination?.has_prev || false,\n },\n }\n } catch (error) {\n console.error('[Blog] Error fetching posts:', error)\n return emptyResult()\n }\n}\n\nfunction emptyResult(): BlogListResult {\n return { posts: [], pagination: { page: 1, perPage: 12, total: 0, totalPages: 0, hasNext: false, hasPrev: false } }\n}\n\nasync function fetchCategories(apiUrl: string, apiKey: string): Promise<BlogCategory[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n if (!response.ok) return []\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n// ============================================================================\n// CLASS HELPER\n// ============================================================================\n\nfunction cls(unstyled: boolean, styles: BlogListStyles, key: keyof BlogListStyles, defaultClass: string, extra?: string): string | undefined {\n if (unstyled) return styles[key] || undefined\n const base = styles[key] || defaultClass\n return extra ? `${base} ${extra}` : base\n}\n\n// ============================================================================\n// BLOG LIST COMPONENT\n// ============================================================================\n\nexport interface BlogListServerProps {\n apiUrl?: string\n apiKey?: string\n category?: string\n tag?: string\n /** Author slug (preferred) or display name; slug filtering requires the current Sonor API */\n author?: string\n featured?: boolean\n search?: string\n /**\n * Topic cluster slug — pairs with getTopicCluster. Note: an unknown slug\n * yields an UNfiltered list (pre-existing API behavior).\n */\n cluster?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n showCategoryFilter?: boolean\n showPagination?: boolean\n className?: string\n basePath?: string\n routing?: BlogRoutingOptions\n styles?: BlogListStyles\n unstyled?: boolean\n renderPost?: (post: BlogPost) => React.ReactNode\n children?: (props: {\n posts: BlogPost[]\n pagination: BlogListResult['pagination']\n categories: BlogCategory[]\n }) => React.ReactNode\n}\n\nexport async function BlogList({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n category,\n tag,\n author,\n featured,\n search,\n cluster,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n showCategoryFilter = false,\n showPagination = true,\n className,\n basePath,\n routing,\n styles = {},\n unstyled = false,\n renderPost,\n children,\n}: BlogListServerProps) {\n const routes = createBlogRoutes({ basePath, ...routing })\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n // These styles are emitted by the server, so client widgets don't need them eagerly.\n const [blogData, categories, { blogListCss }] = await Promise.all([\n fetchBlogList({ apiUrl, apiKey, category, tag, author, featured, search, cluster, page, perPage, orderBy, order }),\n showCategoryFilter ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n unstyled || children ? Promise.resolve({ blogListCss: '' }) : import('./blog-styles'),\n ])\n\n if (children) {\n return children({ posts: blogData.posts, pagination: blogData.pagination, categories })\n }\n\n const { posts, pagination } = blogData\n\n // ---------- EMPTY STATE ----------\n if (posts.length === 0) {\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogListCss }} />}\n <div className={cls(unstyled, styles, 'emptyState', 'sk-bloglist sk-bloglist-empty', className)}>\n <p>No posts found.</p>\n </div>\n </>\n )\n }\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogListCss }} />}\n\n <div className={cls(unstyled, styles, 'container', 'sk-bloglist', className)}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav className={cls(unstyled, styles, 'categoryNav', 'sk-bloglist-cats')}>\n <a\n href={routes.index}\n className={cls(unstyled, styles, 'categoryLink', !category ? 'sk-bloglist-cat sk-bloglist-cat--active' : 'sk-bloglist-cat')}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={routing?.categoryPath ? routes.category(cat.slug) : `${routes.index}?category=${encodeURIComponent(cat.slug)}`}\n className={cls(unstyled, styles, 'categoryLink', category === cat.slug ? 'sk-bloglist-cat sk-bloglist-cat--active' : 'sk-bloglist-cat')}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div className={cls(unstyled, styles, 'grid', 'sk-bloglist-grid')}>\n {posts.map((post) =>\n renderPost ? (\n <React.Fragment key={post.id}>{renderPost(post)}</React.Fragment>\n ) : (\n <BlogPostCard key={post.id} post={post} href={routes.post(post)} styles={styles} unstyled={unstyled} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav className={cls(unstyled, styles, 'pagination', 'sk-bloglist-pagination')}>\n {pagination.hasPrev && (\n <a href={buildPaginationUrl(routes.index, page - 1, category)} className={cls(unstyled, styles, 'paginationLink', 'sk-bloglist-page-link')}>\n &larr; Previous\n </a>\n )}\n <span className={cls(unstyled, styles, 'paginationInfo', 'sk-bloglist-page-info')}>\n Page {pagination.page} of {pagination.totalPages}\n </span>\n {pagination.hasNext && (\n <a href={buildPaginationUrl(routes.index, page + 1, category)} className={cls(unstyled, styles, 'paginationLink', 'sk-bloglist-page-link')}>\n Next &rarr;\n </a>\n )}\n </nav>\n )}\n </div>\n </>\n )\n}\n\n// ============================================================================\n// BLOG POST CARD (Default rendering)\n// ============================================================================\n\ninterface BlogPostCardProps {\n post: BlogPost\n href: string\n styles?: BlogListStyles\n unstyled?: boolean\n}\n\nfunction BlogPostCard({ post, href, styles = {}, unstyled = false }: BlogPostCardProps) {\n const artwork = resolveBlogArtwork(post)\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })\n : null\n\n return (\n <article className={cls(unstyled, styles, 'card', 'sk-bloglist-card')}>\n {artwork.src && (\n <a href={href} className={cls(unstyled, styles, 'cardImageWrapper', 'sk-bloglist-card-img-link')}>\n <img\n src={artwork.src}\n alt={artwork.alt}\n data-sk-composed-card={artwork.composed || undefined}\n style={blogArtworkImageStyle(artwork)}\n className={cls(unstyled, styles, 'cardImage', 'sk-bloglist-card-img')}\n />\n </a>\n )}\n\n <div className={cls(unstyled, styles, 'cardBody', 'sk-bloglist-card-body')}>\n {/* Meta */}\n <div className={cls(unstyled, styles, 'cardMeta', 'sk-bloglist-card-meta')}>\n {post.category && (\n <span className={cls(unstyled, styles, 'cardCategory', 'sk-bloglist-card-category')}>\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {(post as any).article_type && (\n <span className=\"sk-bloglist-card-article-type\" style={{\n display: 'inline-flex', alignItems: 'center',\n padding: '0.0625rem 0.375rem', borderRadius: '9999px',\n fontSize: '0.6875rem', fontWeight: 500,\n background: (post as any).article_type === 'pillar' ? 'rgba(99,102,241,0.1)' : 'rgba(99,102,241,0.05)',\n color: '#6366f1', border: '1px solid rgba(99,102,241,0.15)',\n textTransform: 'capitalize',\n }}>\n {(post as any).article_type}\n </span>\n )}\n {date && <span className={cls(unstyled, styles, 'cardDate', 'sk-bloglist-card-date')}>{date}</span>}\n </div>\n\n {/* Title */}\n <h3 className={cls(unstyled, styles, 'cardTitle', 'sk-bloglist-card-title')}>\n <a href={href} className={styles.cardTitleLink || undefined}>\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p className={cls(unstyled, styles, 'cardExcerpt', 'sk-bloglist-card-excerpt')}>\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div className={cls(unstyled, styles, 'cardFooter', 'sk-bloglist-card-footer')}>\n {post.author && (\n <span className={cls(unstyled, styles, 'cardAuthor', '')}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {readingTimeMinutes(post) && (\n <span className={cls(unstyled, styles, 'cardReadingTime', '')}>\n {readingTimeMinutes(post)} min read\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction buildPaginationUrl(basePath: string, page: number, category?: string): string {\n const params = new URLSearchParams()\n params.set('page', String(page))\n if (category) params.set('category', category)\n return `${basePath}?${params}`\n}\n","/**\n * @sonordev/site-kit/blog - Blog Sidebar Component\n * \n * A reusable sidebar for blog pages with categories, recent posts,\n * tags, newsletter signup, and custom widgets.\n */\n\nimport React from 'react'\nimport type { BlogPost, BlogCategory, BlogTag } from './types'\nimport { widgetStyle, widgetTitleStyle } from './widget-styles'\nimport { blogArtworkImageStyle, resolveBlogArtwork } from './artwork'\nimport { createBlogRoutes, type BlogRoutingOptions } from './routes'\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchRecentPosts(\n apiUrl: string,\n apiKey: string,\n limit: number = 5\n): Promise<BlogPost[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/recent?limit=${limit}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching recent posts:', error)\n return []\n }\n}\n\nasync function fetchCategories(apiUrl: string, apiKey: string): Promise<BlogCategory[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\nasync function fetchTags(apiUrl: string, apiKey: string): Promise<BlogTag[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/tags`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.tags || []\n } catch (error) {\n console.error('[Blog] Error fetching tags:', error)\n return []\n }\n}\n\n// ============================================================================\n// BLOG SIDEBAR COMPONENT\n// ============================================================================\n\nexport interface BlogSidebarProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Show categories widget */\n showCategories?: boolean\n /** Show recent posts widget */\n showRecentPosts?: boolean\n /** Number of recent posts to show */\n recentPostsCount?: number\n /** Show tags widget */\n showTags?: boolean\n /** Show search widget */\n showSearch?: boolean\n /** Base URL for blog links */\n basePath?: string\n routing?: BlogRoutingOptions\n /** Custom class name */\n className?: string\n /** Current category filter (for highlighting) */\n currentCategory?: string\n /** Additional widgets to render */\n children?: React.ReactNode\n}\n\nexport async function BlogSidebar({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n showCategories = true,\n showRecentPosts = true,\n recentPostsCount = 5,\n showTags = true,\n showSearch = true,\n basePath,\n routing,\n className,\n currentCategory,\n children,\n}: BlogSidebarProps) {\n const routes = createBlogRoutes({ basePath, ...routing })\n if (!apiKey) {\n console.warn('[Blog] No API key configured for sidebar')\n return null\n }\n\n // Fetch data in parallel\n const [categories, recentPosts, tags] = await Promise.all([\n showCategories ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n showRecentPosts ? fetchRecentPosts(apiUrl, apiKey, recentPostsCount) : Promise.resolve([]),\n showTags ? fetchTags(apiUrl, apiKey) : Promise.resolve([]),\n ])\n\n return (\n <aside className={className} style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>\n {/* Search Widget */}\n {showSearch && <SearchWidget basePath={routes.index} />}\n\n {/* Categories Widget */}\n {showCategories && categories.length > 0 && (\n <CategoriesWidget\n categories={categories}\n basePath={routes.index}\n categoryPath={routing?.categoryPath ? routes.category : undefined}\n currentCategory={currentCategory}\n />\n )}\n\n {/* Recent Posts Widget */}\n {showRecentPosts && recentPosts.length > 0 && (\n <RecentPostsWidget posts={recentPosts} routes={routes} />\n )}\n\n {/* Tags Widget */}\n {showTags && tags.length > 0 && (\n <TagsWidget tags={tags} basePath={routes.index} />\n )}\n\n {/* Custom Widgets */}\n {children}\n </aside>\n )\n}\n\n// ============================================================================\n// WIDGET COMPONENTS\n// ============================================================================\n\nfunction SearchWidget({ basePath }: { basePath: string }) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Search</h4>\n <form action={basePath} method=\"get\">\n <input\n type=\"search\"\n name=\"search\"\n placeholder=\"Search posts...\"\n style={{\n width: '100%',\n padding: '10px 12px',\n border: '1px solid var(--sk-border)',\n borderRadius: 8,\n fontSize: 14,\n }}\n />\n </form>\n </div>\n )\n}\n\nfunction CategoriesWidget({\n categories,\n basePath,\n categoryPath,\n currentCategory,\n}: {\n categories: BlogCategory[]\n basePath: string\n categoryPath?: (slug: string) => string\n currentCategory?: string\n}) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Categories</h4>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n <li style={{ marginBottom: 8 }}>\n <a\n href={basePath}\n style={{\n ...categoryLinkStyle,\n fontWeight: !currentCategory ? 600 : 400,\n color: !currentCategory ? 'var(--sk-primary)' : 'var(--sk-text-primary)',\n }}\n >\n All Posts\n </a>\n </li>\n {categories.map((cat) => (\n <li key={cat.slug} style={{ marginBottom: 8 }}>\n <a\n href={categoryPath ? categoryPath(cat.slug) : `${basePath}?category=${encodeURIComponent(cat.slug)}`}\n style={{\n ...categoryLinkStyle,\n fontWeight: currentCategory === cat.slug ? 600 : 400,\n color: currentCategory === cat.slug ? 'var(--sk-primary)' : 'var(--sk-text-primary)',\n }}\n >\n {cat.name}\n <span style={{ color: 'var(--sk-text-tertiary)', marginLeft: 8 }}>({cat.post_count})</span>\n </a>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction RecentPostsWidget({\n posts,\n routes,\n}: {\n posts: BlogPost[]\n routes: ReturnType<typeof createBlogRoutes>\n}) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Recent Posts</h4>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {posts.map((post) => {\n const artwork = resolveBlogArtwork(post)\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n })\n : null\n\n return (\n <li\n key={post.id}\n style={{\n marginBottom: 16,\n paddingBottom: 16,\n borderBottom: '1px solid var(--sk-border)',\n }}\n >\n <div style={{ display: 'flex', gap: 12 }}>\n {artwork.src && (\n <a href={routes.post(post)}>\n <img\n src={artwork.src}\n alt=\"\"\n data-sk-composed-card={artwork.composed || undefined}\n style={{\n width: 64,\n height: 48,\n objectFit: 'cover',\n borderRadius: 6,\n flexShrink: 0,\n ...blogArtworkImageStyle(artwork),\n }}\n />\n </a>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <a\n href={routes.post(post)}\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: 'var(--sk-text-primary)',\n textDecoration: 'none',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {post.title}\n </a>\n {date && (\n <span style={{ fontSize: 12, color: 'var(--sk-text-tertiary)', display: 'block', marginTop: 4 }}>\n {date}\n </span>\n )}\n </div>\n </div>\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\nfunction TagsWidget({\n tags,\n basePath,\n}: {\n tags: BlogTag[]\n basePath: string\n}) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Popular Tags</h4>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>\n {tags.slice(0, 15).map((tag) => (\n <a\n key={tag.slug}\n href={`${basePath}?tag=${encodeURIComponent(tag.name)}`}\n style={{\n padding: '4px 10px',\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 9999,\n fontSize: 12,\n color: 'var(--sk-text-primary)',\n textDecoration: 'none',\n transition: 'background-color 0.2s',\n }}\n >\n {tag.name}\n </a>\n ))}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\n\nconst categoryLinkStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n fontSize: 14,\n textDecoration: 'none',\n}\n","/**\n * @sonordev/site-kit/blog - Blog Layout Component\n * \n * A complete blog layout with sidebar, responsive design, and optional hero.\n * Use this to wrap your blog pages for consistent styling.\n */\n\nimport React from 'react'\nimport { BlogSidebar, BlogSidebarProps } from './BlogSidebar'\nimport type { BlogRoutingOptions } from './routes'\n\n// ============================================================================\n// BLOG LAYOUT COMPONENT\n// ============================================================================\n\nexport interface BlogLayoutProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Layout style: 'sidebar-right', 'sidebar-left', 'full-width' */\n layout?: 'sidebar-right' | 'sidebar-left' | 'full-width'\n /** Show sidebar */\n showSidebar?: boolean\n /** Sidebar props */\n sidebarProps?: Partial<BlogSidebarProps>\n /** Hero section config */\n hero?: {\n title?: string\n subtitle?: string\n backgroundImage?: string\n backgroundColor?: string\n }\n /** Max width for content */\n maxWidth?: number\n /** Base URL for blog links */\n basePath?: string\n routing?: BlogRoutingOptions\n /** Custom class name */\n className?: string\n /** Current category (for sidebar highlighting) */\n currentCategory?: string\n /** Main content */\n children: React.ReactNode\n}\n\nexport async function BlogLayout({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n layout = 'sidebar-right',\n showSidebar = true,\n sidebarProps = {},\n hero,\n maxWidth = 1280,\n basePath,\n routing,\n className,\n currentCategory,\n children,\n}: BlogLayoutProps) {\n const hasSidebar = showSidebar && layout !== 'full-width'\n\n return (\n <div className={className}>\n {/* Hero Section */}\n {hero && (\n <section\n style={{\n padding: '60px 20px',\n backgroundColor: hero.backgroundColor || 'var(--sk-primary)',\n backgroundImage: hero.backgroundImage ? `url(${hero.backgroundImage})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n color: 'var(--sk-bg)',\n textAlign: 'center',\n }}\n >\n <div style={{ maxWidth, margin: '0 auto' }}>\n {hero.title && (\n <h1\n style={{\n fontSize: 'clamp(32px, 5vw, 48px)',\n fontWeight: 700,\n marginBottom: 16,\n }}\n >\n {hero.title}\n </h1>\n )}\n {hero.subtitle && (\n <p\n style={{\n fontSize: 'clamp(16px, 2vw, 20px)',\n opacity: 0.9,\n maxWidth: 600,\n margin: '0 auto',\n }}\n >\n {hero.subtitle}\n </p>\n )}\n </div>\n </section>\n )}\n\n {/* Main Content Area */}\n <div\n style={{\n maxWidth,\n margin: '0 auto',\n padding: '40px 20px',\n }}\n >\n <div\n style={{\n display: hasSidebar ? 'grid' : 'block',\n gridTemplateColumns: hasSidebar\n ? layout === 'sidebar-left'\n ? '300px 1fr'\n : '1fr 300px'\n : undefined,\n gap: 48,\n }}\n >\n {/* Sidebar (Left Position) */}\n {hasSidebar && layout === 'sidebar-left' && (\n <BlogSidebar\n apiUrl={apiUrl}\n apiKey={apiKey}\n basePath={basePath}\n routing={routing}\n currentCategory={currentCategory}\n {...sidebarProps}\n />\n )}\n\n {/* Main Content */}\n <main style={{ minWidth: 0 }}>{children}</main>\n\n {/* Sidebar (Right Position) */}\n {hasSidebar && layout === 'sidebar-right' && (\n <BlogSidebar\n apiUrl={apiUrl}\n apiKey={apiKey}\n basePath={basePath}\n routing={routing}\n currentCategory={currentCategory}\n {...sidebarProps}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// BLOG PAGE WRAPPER\n// ============================================================================\n\n/**\n * Convenience wrapper for a complete blog index page\n */\nexport interface BlogPageProps extends Omit<BlogLayoutProps, 'children'> {\n /** List component to render */\n listComponent: React.ReactNode\n}\n\nexport async function BlogPage({ listComponent, ...layoutProps }: BlogPageProps) {\n return <BlogLayout {...layoutProps}>{listComponent}</BlogLayout>\n}\n\n/**\n * Convenience wrapper for a single blog post page\n */\nexport interface BlogPostPageProps extends Omit<BlogLayoutProps, 'children'> {\n /** Post component to render */\n postComponent: React.ReactNode\n}\n\nexport async function BlogPostPage({ postComponent, ...layoutProps }: BlogPostPageProps) {\n return (\n <BlogLayout {...layoutProps} showSidebar={false} layout=\"full-width\">\n <div style={{ maxWidth: 800, margin: '0 auto' }}>{postComponent}</div>\n </BlogLayout>\n )\n}\n\n// ============================================================================\n// CATEGORY PAGE WRAPPER\n// ============================================================================\n\nexport interface CategoryPageProps extends BlogLayoutProps {\n /** Category slug being viewed */\n category: string\n /** Category display name */\n categoryName?: string\n /** List component */\n listComponent: React.ReactNode\n}\n\nexport async function CategoryPage({\n category,\n categoryName,\n listComponent,\n hero,\n ...layoutProps\n}: CategoryPageProps) {\n const categoryHero = hero || {\n title: categoryName || category,\n subtitle: `Browse all posts in ${categoryName || category}`,\n backgroundColor: 'var(--sk-primary)',\n }\n\n return (\n <BlogLayout {...layoutProps} hero={categoryHero} currentCategory={category}>\n {listComponent}\n </BlogLayout>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Related Posts Component\n * \n * Fetches and displays related blog posts via Portal API\n */\n\nimport React from 'react'\nimport type { RelatedPostsProps, BlogPost } from './types'\nimport { blogArtworkImageStyle, resolveBlogArtwork } from './artwork'\nimport { createBlogRoutes, type BlogRoutingOptions } from './routes'\n\nasync function fetchRelatedPosts(\n apiUrl: string,\n apiKey: string,\n currentPostId: string,\n limit: number\n): Promise<BlogPost[]> {\n try {\n // `/public/blog/*`, not `/api/public/blog/*`. public-blog.controller is\n // one of only two public controllers whose @Controller() omits the `api/`\n // segment (public-images is the other); every other blog call in this\n // module already uses the short form. This one did not, so related posts\n // 404'd and silently rendered as none.\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n // The controller reads snake_case `current_post_id` and looks the post\n // up by id. camelCase here meant the id arrived as undefined, the\n // lookup matched nothing, and this rendered \"no related posts\" as a\n // clean 200 — the silent sibling of the 404 path bug fixed above.\n body: JSON.stringify({\n current_post_id: currentPostId,\n limit,\n }),\n })\n \n if (!response.ok) {\n console.error('Failed to fetch related posts:', response.statusText)\n return []\n }\n \n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('Failed to fetch related posts:', error)\n return []\n }\n}\n\ninterface RelatedPostsServerProps {\n apiUrl?: string\n apiKey?: string\n currentPostId: string\n limit?: number\n className?: string\n basePath?: string\n routing?: BlogRoutingOptions\n renderItem?: (post: BlogPost) => React.ReactNode\n}\n\nexport async function RelatedPosts({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n currentPostId,\n limit = 3,\n className,\n basePath,\n routing,\n renderItem,\n}: RelatedPostsServerProps) {\n const routes = createBlogRoutes({ basePath, ...routing })\n if (!apiKey) {\n console.warn('[Blog] No API key configured for RelatedPosts')\n return null\n }\n \n const posts = await fetchRelatedPosts(apiUrl, apiKey, currentPostId, limit)\n\n if (posts.length === 0) return null\n\n return (\n <section className={className}>\n <h3 style={{ marginBottom: 16 }}>Related Posts</h3>\n <div style={{ display: 'grid', gap: 16 }}>\n {posts.map((post) => {\n const artwork = resolveBlogArtwork(post)\n return renderItem ? (\n renderItem(post)\n ) : (\n <article key={post.id} style={{ borderBottom: '1px solid var(--sk-border)', paddingBottom: 16 }}>\n {artwork.src && (\n <img\n src={artwork.src}\n alt={artwork.alt}\n data-sk-composed-card={artwork.composed || undefined}\n style={{\n width: '100%',\n height: 120,\n objectFit: 'cover',\n borderRadius: 8,\n marginBottom: 8,\n ...blogArtworkImageStyle(artwork),\n }}\n />\n )}\n <a href={routes.post(post)} style={{ textDecoration: 'none' }}>\n <h4 style={{ margin: 0, color: 'inherit' }}>{post.title}</h4>\n </a>\n {post.excerpt && (\n <p style={{ margin: '4px 0 0', fontSize: 14, color: 'var(--sk-text-secondary)' }}>\n {post.excerpt}\n </p>\n )}\n </article>\n )\n })}\n </div>\n </section>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/blog/routes.ts","../src/blog/artwork.ts","../src/blog/author-schema.ts"],"names":[],"mappings":";;;AAsBO,SAAS,iBAAiB,QAAA,EAA6C;AAC5E,EAAA,MAAM,KAAA,GAAQ,OAAO,QAAA,KAAa,QAAA,GAAW,WAAW,QAAA,EAAU,IAAA,IAAQ,UAAU,IAAA,IAAQ,EAAA;AAC5F,EAAA,OAAO,KAAA,CAAM,IAAA,EAAK,CAAE,WAAA,EAAY,CAAE,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAAE,OAAA,CAAQ,UAAA,EAAY,EAAE,CAAA;AACtF;AAEA,SAAS,UAAU,IAAA,EAAsB;AACvC,EAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,EAAK;AACxB,EAAA,IAAI,CAAC,KAAA,IAAS,qBAAA,CAAsB,IAAA,CAAK,KAAK,CAAA,IAAK,KAAA,CAAM,UAAA,CAAW,IAAI,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AACjG,IAAA,MAAM,IAAI,MAAM,kEAAkE,CAAA;AAAA,EACpF;AACA,EAAA,OAAO,MAAM,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,GAAQ,IAAI,KAAK,CAAA,CAAA;AAClD;AAGO,SAAS,gBAAA,CAAiB,OAAA,GAA8B,EAAC,EAAG;AACjE,EAAA,MAAM,OAAO,OAAA,CAAQ,QAAA,IAAY,QAAQ,YAAA,IAAgB,OAAA,EAAS,MAAK,IAAK,OAAA;AAC5E,EAAA,MAAM,QAAQ,SAAA,CAAU,GAAG,EAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,IAAK,GAAA;AACpD,EAAA,MAAM,MAAA,GAAS,KAAA,KAAU,GAAA,GAAM,EAAA,GAAK,KAAA;AACpC,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAK,IAAA,EAA6B;AAChC,MAAA,IAAI,QAAQ,QAAA,EAAU,OAAO,UAAU,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AAC7D,MAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,IAAA,CAAK,QAAA,IAAY,QAAQ,QAAQ,CAAA;AACnE,MAAA,OAAO,GAAG,MAAM,CAAA,EAAG,OAAA,CAAQ,qBAAA,IAAyB,WAAW,CAAA,CAAA,EAAI,kBAAA,CAAmB,QAAQ,CAAC,KAAK,EAAE,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,IACzI,CAAA;AAAA,IACA,SAAS,IAAA,EAAsB;AAC7B,MAAA,MAAM,UAAA,GAAa,iBAAiB,IAAI,CAAA;AACxC,MAAA,OAAO,OAAA,CAAQ,YAAA,GACX,SAAA,CAAU,OAAA,CAAQ,YAAA,CAAa,UAAU,CAAC,CAAA,GAC1C,CAAA,EAAG,MAAM,CAAA,UAAA,EAAa,kBAAA,CAAmB,UAAU,CAAC,CAAA,CAAA;AAAA,IAC1D,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,IAAA,KAAiB,CAAA,EAAG,MAAM,CAAA,SAAA,EAAY,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAAA,IACxE,MAAA,EAAQ,CAAC,IAAA,KAAiB,CAAA,EAAG,MAAM,CAAA,QAAA,EAAW,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAAA,IACtE,GAAA,EAAK,GAAG,MAAM,CAAA,QAAA,CAAA;AAAA,IACd,IAAA,EAAM,GAAG,MAAM,CAAA,SAAA;AAAA,GACjB;AACF;AAEO,SAAS,cAAA,CAAe,IAAA,EAAc,OAAA,GAAU,EAAA,EAAY;AACjE,EAAA,OAAO,CAAA,EAAG,QAAQ,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAC,CAAA,EAAG,SAAA,CAAU,IAAI,CAAC,CAAA,CAAA;AACzD;AAGO,SAAS,kBAAA,CAAmB,IAAA,EAAqB,OAAA,GAAqD,EAAC,EAAW;AACvH,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,aAAA,EAAe,IAAA,EAAK;AAC3C,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,SAAS,CAAA,EAAG;AACnC,MAAA,IAAI;AAAE,QAAA,OAAO,IAAI,GAAA,CAAI,SAAS,CAAA,CAAE,QAAA,EAAS;AAAA,MAAE,CAAA,CAAA,MAAQ;AAAA,MAA4B;AAAA,IACjF,CAAA,MAAA,IAAW,SAAA,CAAU,UAAA,CAAW,GAAG,KAAK,CAAC,SAAA,CAAU,UAAA,CAAW,IAAI,CAAA,IAAK,CAAC,SAAA,CAAU,QAAA,CAAS,IAAI,CAAA,EAAG;AAChG,MAAA,OAAO,cAAA,CAAe,SAAA,EAAW,OAAA,CAAQ,OAAO,CAAA;AAAA,IAClD;AAAA,EACF;AACA,EAAA,OAAO,cAAA,CAAe,iBAAiB,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA,EAAG,QAAQ,OAAO,CAAA;AAC7E;;;AC/DO,SAAS,kBAAA,CAAmB,IAAA,EAAqB,SAAA,GAAgC,MAAA,EAAqB;AAC3G,EAAA,MAAM,SAAA,GAAY,SAAA,KAAc,SAAA,IAAa,CAAC,CAAC,IAAA,CAAK,eAAA;AACpD,EAAA,MAAM,GAAA,GAAA,CAAO,SAAA,GAAY,IAAA,CAAK,eAAA,GAAkB,KAAK,cAAA,KAAmB,MAAA;AACxE,EAAA,MAAM,GAAA,GAAM,YACR,IAAA,CAAK,mBAAA,IAAuB,KAC5B,IAAA,CAAK,kBAAA,IAAsB,KAAK,KAAA,IAAS,EAAA;AAC7C,EAAA,IAAI,QAAA,GAAW,KAAA;AACf,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,IAAI;AAEF,MAAA,QAAA,GAAW,mBAAmB,IAAA,CAAK,IAAI,IAAI,GAAA,EAAK,0BAA0B,EAAE,QAAQ,CAAA;AAAA,IACtF,CAAA,CAAA,MAAQ;AAAA,IAAqE;AAAA,EAC/E;AACA,EAAA,OAAO,EAAE,GAAA,EAAK,GAAA,EAAK,QAAA,EAAS;AAC9B;AAGO,SAAS,sBAAsB,OAAA,EAAiD;AACrF,EAAA,OAAO,OAAA,CAAQ,QAAA,GACX,EAAE,OAAA,EAAS,OAAA,EAAS,MAAA,EAAQ,MAAA,EAAQ,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,SAAA,EAAW,SAAA,EAAW,QAAO,GAC/F,MAAA;AACN;;;ACVO,SAAS,oBAAA,CACd,MAAA,EACA,OAAA,GAAmD,EAAC,EAC5C;AACR,EAAA,MAAM,EAAE,OAAA,GAAU,EAAA,EAAI,QAAA,EAAS,GAAI,OAAA;AAEnC,EAAA,MAAM,SAAmB,CAAC,GAAI,MAAA,CAAO,OAAA,IAAW,EAAG,CAAA;AACnD,EAAA,IAAI,MAAA,CAAO,YAAA,EAAc,MAAA,CAAO,IAAA,CAAK,OAAO,YAAY,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,OAAO,WAAW,CAAA;AACtD,EAAA,IAAI,MAAA,CAAO,WAAA,EAAa,MAAA,CAAO,IAAA,CAAK,OAAO,WAAW,CAAA;AACtD,EAAA,IAAI,MAAA,CAAO,cAAc,OAAA,EAAS,MAAA,CAAO,KAAK,CAAA,oBAAA,EAAuB,MAAA,CAAO,YAAA,CAAa,OAAO,CAAA,CAAE,CAAA;AAClG,EAAA,IAAI,OAAO,YAAA,EAAc,QAAA,SAAiB,IAAA,CAAK,MAAA,CAAO,aAAa,QAAQ,CAAA;AAC3E,EAAA,IAAI,MAAA,CAAO,cAAc,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,mBAAA,EAAsB,MAAA,CAAO,YAAA,CAAa,MAAM,CAAA,CAAE,CAAA;AAG/F,EAAA,MAAM,YAAA,GAAe,CAAC,GAAG,IAAI,IAAI,MAAA,CAAO,MAAA,CAAO,OAAO,CAAC,CAAC,CAAA;AAExD,EAAA,MAAM,MAAA,GAA8B;AAAA,IAClC,UAAA,EAAY,oBAAA;AAAA,IACZ,OAAA,EAAS,QAAA;AAAA,IACT,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,KAAK,MAAA,CAAO,eAAA,IAAmB,GAAG,OAAO,CAAA,aAAA,EAAgB,OAAO,IAAI,CAAA;AAAA,GACtE;AAEA,EAAA,IAAI,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,QAAA,GAAW,MAAA,CAAO,KAAA;AAC3C,EAAA,IAAI,MAAA,CAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,QAAA,GAAW;AAAA,MAChB,OAAA,EAAS,cAAA;AAAA,MACT,IAAA,EAAM,OAAO,OAAA,IAAW,QAAA;AAAA,MACxB,GAAI,OAAA,GAAU,EAAE,GAAA,EAAK,OAAA,KAAY;AAAC,KACpC;AAAA,EACF;AACA,EAAA,IAAI,MAAA,CAAO,OAAO,MAAA,CAAO,SAAA,SAAkB,WAAA,GAAc,MAAA,CAAO,aAAa,MAAA,CAAO,GAAA;AACpF,EAAA,IAAI,MAAA,CAAO,UAAA,EAAY,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,UAAA;AAC7C,EAAA,IAAI,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,MAAA,GAAS,YAAA;AAC7C,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,EAAG,MAAA,CAAO,aAAa,MAAA,CAAO,WAAA;AACpF,EAAA,IAAI,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,WAAA,CAAY,SAAS,CAAA,EAAG;AACvD,IAAA,MAAA,CAAO,aAAA,GAAgB,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACpD,OAAA,EAAS,mCAAA;AAAA,MACT,kBAAA,EAAoB;AAAA,KACtB,CAAE,CAAA;AAAA,EACJ;AAEA,EAAA,OAAO,MAAA;AACT","file":"chunk-LC7AM4J5.js","sourcesContent":["/** Shared, environment-free publication routes for server helpers and blog UI. */\nexport interface BlogRoutePost {\n slug: string\n category?: string | { slug?: string; name?: string } | null\n canonical_url?: string | null\n}\n\nexport interface BlogRoutingOptions {\n /** Publication root. Defaults to /blog. */\n basePath?: string\n /** Existing metadata option; basePath takes precedence when both are set. */\n blogBasePath?: string\n /** Use /publication/category/post instead of /publication/post. */\n includeCategoryInPath?: boolean\n /** Fallback category for partial cluster records. */\n category?: string\n /** A custom local article path. Receives the post's slug and category. */\n postPath?: (post: BlogRoutePost) => string\n /** A custom category destination, for example /theforge?category=guides. */\n categoryPath?: (slug: string) => string\n}\n\nexport function blogCategorySlug(category: BlogRoutePost['category']): string {\n const value = typeof category === 'string' ? category : category?.slug || category?.name || ''\n return value.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '')\n}\n\nfunction localPath(path: string): string {\n const value = path.trim()\n if (!value || /^[a-z][a-z\\d+.-]*:/i.test(value) || value.startsWith('//') || value.includes('\\\\')) {\n throw new Error('Blog routes must be local paths, such as /theforge/guides/story.')\n }\n return value.startsWith('/') ? value : `/${value}`\n}\n\n/** Single source of truth for publication paths. Custom routes never change OG artwork. */\nexport function createBlogRoutes(options: BlogRoutingOptions = {}) {\n const raw = (options.basePath ?? options.blogBasePath ?? '/blog').trim() || '/blog'\n const index = localPath(raw).replace(/\\/+$/, '') || '/'\n const prefix = index === '/' ? '' : index\n return {\n index,\n post(post: BlogRoutePost): string {\n if (options.postPath) return localPath(options.postPath(post))\n const category = blogCategorySlug(post.category || options.category)\n return `${prefix}${options.includeCategoryInPath && category ? `/${encodeURIComponent(category)}` : ''}/${encodeURIComponent(post.slug)}`\n },\n category(slug: string): string {\n const normalized = blogCategorySlug(slug)\n return options.categoryPath\n ? localPath(options.categoryPath(normalized))\n : `${prefix}/category/${encodeURIComponent(normalized)}`\n },\n cluster: (slug: string) => `${prefix}/cluster/${encodeURIComponent(slug)}`,\n author: (slug: string) => `${prefix}/author/${encodeURIComponent(slug)}`,\n rss: `${prefix}/rss.xml`,\n atom: `${prefix}/feed.xml`,\n }\n}\n\nexport function resolveBlogUrl(path: string, siteUrl = ''): string {\n return `${siteUrl.replace(/\\/+$/, '')}${localPath(path)}`\n}\n\n/** Metadata, feeds, sitemaps and generated schemas agree on a supplied canonical. */\nexport function resolveBlogPostUrl(post: BlogRoutePost, options: BlogRoutingOptions & { siteUrl?: string } = {}): string {\n const canonical = post.canonical_url?.trim()\n if (canonical) {\n if (/^https?:\\/\\//i.test(canonical)) {\n try { return new URL(canonical).toString() } catch { /* use the local route */ }\n } else if (canonical.startsWith('/') && !canonical.startsWith('//') && !canonical.includes('\\\\')) {\n return resolveBlogUrl(canonical, options.siteUrl)\n }\n }\n return resolveBlogUrl(createBlogRoutes(options).post(post), options.siteUrl)\n}\n","import type { CSSProperties } from 'react'\nimport type { BlogPost } from './types'\n\nexport interface BlogArtwork {\n src: string | undefined\n alt: string\n composed: boolean\n}\n\ntype ArtworkSource = Pick<BlogPost, 'title' | 'featured_image' | 'featured_image_alt' | 'editorial_image' | 'editorial_image_alt'>\n\n/** Single source of truth for article artwork versus complete promotional cards. */\nexport function resolveBlogArtwork(post: ArtworkSource, placement: 'article' | 'card' = 'card'): BlogArtwork {\n const editorial = placement === 'article' && !!post.editorial_image\n const src = (editorial ? post.editorial_image : post.featured_image) || undefined\n const alt = editorial\n ? post.editorial_image_alt ?? ''\n : post.featured_image_alt ?? post.title ?? ''\n let composed = false\n if (src) {\n try {\n // Inspect the path, not a query string that happens to mention a card.\n composed = /\\/Blog\\/Cards\\//i.test(new URL(src, 'https://site-kit.invalid').pathname)\n } catch { /* An unrecognized source retains the normal photograph layout. */ }\n }\n return { src, alt, composed }\n}\n\n/** Preserve generated text and graphics across every stock card surface. */\nexport function blogArtworkImageStyle(artwork: BlogArtwork): CSSProperties | undefined {\n return artwork.composed\n ? { display: 'block', height: 'auto', maxHeight: 'none', objectFit: 'contain', transform: 'none' }\n : undefined\n}\n","/**\n * @sonordev/site-kit/blog — Author JSON-LD (pure)\n *\n * Split out of `./server-core` on purpose. `generateAuthorSchema` is a pure\n * function — it maps a `BlogAuthor` to a Person schema object and touches no\n * env, no config, and no network. It only ever lived in `server-core` because\n * the other author helpers there (`getAuthorBySlug`, `getAuthorPosts`) do fetch.\n *\n * `AuthorPage` is exported from the client-stamped `@sonordev/site-kit/blog`\n * barrel (see `./index.ts`), so importing this one function from `server-core`\n * dragged that whole server module — its `x-api-key` fetches included — into\n * the browser bundle. Keeping the pure half here means `AuthorPage` can stay in\n * the barrel without pulling a single line of server code with it.\n *\n * Anything added here must stay pure. If it needs an API key or a fetch, it\n * belongs in `./server-core`, not in this file.\n */\n\nimport type { BlogAuthor } from './types'\n\n/**\n * Generate Person JSON-LD schema for an author page\n */\nexport function generateAuthorSchema(\n author: BlogAuthor,\n options: { siteUrl?: string; siteName?: string } = {}\n): object {\n const { siteUrl = '', siteName } = options\n\n const sameAs: string[] = [...(author.same_as || [])]\n if (author.linkedin_url) sameAs.push(author.linkedin_url)\n if (author.twitter_url) sameAs.push(author.twitter_url)\n if (author.website_url) sameAs.push(author.website_url)\n if (author.social_links?.twitter) sameAs.push(`https://twitter.com/${author.social_links.twitter}`)\n if (author.social_links?.linkedin) sameAs.push(author.social_links.linkedin)\n if (author.social_links?.github) sameAs.push(`https://github.com/${author.social_links.github}`)\n\n // Deduplicate\n const uniqueSameAs = [...new Set(sameAs.filter(Boolean))]\n\n const schema: Record<string, any> = {\n '@context': 'https://schema.org',\n '@type': 'Person',\n name: author.name,\n url: author.author_page_url || `${siteUrl}/blog/author/${author.slug}`,\n }\n\n if (author.title) schema.jobTitle = author.title\n if (author.company || siteName) {\n schema.worksFor = {\n '@type': 'Organization',\n name: author.company || siteName,\n ...(siteUrl ? { url: siteUrl } : {}),\n }\n }\n if (author.bio || author.short_bio) schema.description = author.short_bio || author.bio\n if (author.avatar_url) schema.image = author.avatar_url\n if (uniqueSameAs.length > 0) schema.sameAs = uniqueSameAs\n if (author.knows_about && author.knows_about.length > 0) schema.knowsAbout = author.knows_about\n if (author.credentials && author.credentials.length > 0) {\n schema.hasCredential = author.credentials.map((c) => ({\n '@type': 'EducationalOccupationalCredential',\n credentialCategory: c,\n }))\n }\n\n return schema\n}\n"]}
@@ -1,72 +0,0 @@
1
- 'use strict';
2
-
3
- var fs = require('fs');
4
- var path = require('path');
5
-
6
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
-
8
- var fs__default = /*#__PURE__*/_interopDefault(fs);
9
- var path__default = /*#__PURE__*/_interopDefault(path);
10
-
11
- // src/sitemap/discover.ts
12
- var APP_DIR_CANDIDATES = ["app", path__default.default.join("src", "app")];
13
- var SITEMAP_ROUTE_EXTENSIONS = ["ts", "tsx", "js", "jsx", "mjs"];
14
- function findAppDirForDiscovery(cwd = process.cwd()) {
15
- for (const candidate of APP_DIR_CANDIDATES) {
16
- const abs = path__default.default.join(cwd, candidate);
17
- if (fs__default.default.existsSync(abs)) return abs;
18
- }
19
- return null;
20
- }
21
- function findSitemapRoute(cwd = process.cwd()) {
22
- for (const dir of APP_DIR_CANDIDATES) {
23
- for (const ext of SITEMAP_ROUTE_EXTENSIONS) {
24
- const rel = path__default.default.join(dir, `sitemap.${ext}`);
25
- if (fs__default.default.existsSync(path__default.default.join(cwd, rel))) return rel;
26
- }
27
- }
28
- return null;
29
- }
30
- function discoverNextJsRoutes(appDir, basePath = "") {
31
- const entries = [];
32
- const items = fs__default.default.readdirSync(appDir, { withFileTypes: true });
33
- for (const item of items) {
34
- if (item.name.startsWith("_") || item.name.startsWith(".")) continue;
35
- if (item.name === "api") continue;
36
- if (item.name === "node_modules") continue;
37
- const itemPath = path__default.default.join(appDir, item.name);
38
- if (item.isDirectory()) {
39
- const hasPage = fs__default.default.existsSync(path__default.default.join(itemPath, "page.tsx")) || fs__default.default.existsSync(path__default.default.join(itemPath, "page.js")) || fs__default.default.existsSync(path__default.default.join(itemPath, "page.jsx"));
40
- const isRouteGroup = item.name.startsWith("(") && item.name.endsWith(")");
41
- const isDynamic = item.name.startsWith("[") && item.name.endsWith("]");
42
- let routePath = basePath;
43
- if (!isRouteGroup && !isDynamic) {
44
- routePath = `${basePath}/${item.name}`;
45
- }
46
- if (hasPage && !isDynamic) {
47
- const priority = routePath === "" ? 1 : 0.8;
48
- entries.push({ path: routePath || "/", priority });
49
- }
50
- if (!isDynamic) {
51
- const subEntries = discoverNextJsRoutes(
52
- itemPath,
53
- isRouteGroup ? basePath : routePath
54
- );
55
- entries.push(...subEntries);
56
- }
57
- }
58
- }
59
- if (basePath === "") {
60
- const hasRootPage = fs__default.default.existsSync(path__default.default.join(appDir, "page.tsx")) || fs__default.default.existsSync(path__default.default.join(appDir, "page.js")) || fs__default.default.existsSync(path__default.default.join(appDir, "page.jsx"));
61
- if (hasRootPage) {
62
- entries.unshift({ path: "/", priority: 1 });
63
- }
64
- }
65
- return entries;
66
- }
67
-
68
- exports.discoverNextJsRoutes = discoverNextJsRoutes;
69
- exports.findAppDirForDiscovery = findAppDirForDiscovery;
70
- exports.findSitemapRoute = findSitemapRoute;
71
- //# sourceMappingURL=chunk-LOS5D6B3.js.map
72
- //# sourceMappingURL=chunk-LOS5D6B3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/sitemap/discover.ts"],"names":["path","fs"],"mappings":"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","file":"chunk-LOS5D6B3.js","sourcesContent":["/**\n * @sonordev/site-kit — Node-only filesystem discovery for the sitemap CLI\n *\n * Single source of truth for the build-time filesystem scan used by\n * `registerLocalSitemap` (both the standalone CLI impl and the server routing\n * helper used to keep their own byte-drifting copies of `discoverNextJsRoutes`).\n *\n * Plus `findSitemapRoute` — the guard that makes `--auto-discover` safe to leave\n * in any site's `postbuild`.\n *\n * IMPORTANT — why a filesystem scan must never drive a `full-replace`:\n * a scan of `app/` can only see STATIC route segments. It structurally cannot\n * enumerate the params of a dynamic route (`/work/[slug]`, `/blog/[cat]/[id]`),\n * and it ignores the app's sitemap `exclude` config. So the route set it\n * produces is always a strict, incomplete SUBSET of the real page set. Feeding\n * that incomplete set to a `full-replace` sync tells the API to DELETE every\n * page that isn't in it — i.e. every dynamic page, plus anything the app\n * intentionally excluded. When a site also has an `app/sitemap.{ts,js}` (which\n * `createSitemap` syncs as an authoritative full-replace), the two syncs delete\n * and recreate each other's rows on every build (the sitemap-oscillation bug),\n * destroying managed metadata, Signal optimizations, LLM schemas, and GSC\n * history on real pages. Hence: auto-discover is additive by default, and skips\n * entirely when a sitemap route already exists.\n *\n * Node built-ins (`fs`/`path`) only — never import this from browser/client code.\n */\n\nimport fs from 'fs'\nimport path from 'path'\n\n/** App-directory candidates, in resolution order (Next.js `app/` or `src/app/`). */\nconst APP_DIR_CANDIDATES = ['app', path.join('src', 'app')]\n\n/** Extensions a Next.js `sitemap` route file can use. */\nconst SITEMAP_ROUTE_EXTENSIONS = ['ts', 'tsx', 'js', 'jsx', 'mjs']\n\n/**\n * Return the app directory (absolute path) that exists under `cwd`, or null.\n * Prefers `app/`, then `src/app/`.\n */\nexport function findAppDirForDiscovery(cwd: string = process.cwd()): string | null {\n for (const candidate of APP_DIR_CANDIDATES) {\n const abs = path.join(cwd, candidate)\n if (fs.existsSync(abs)) return abs\n }\n return null\n}\n\n/**\n * Detect a Next.js `sitemap` route file (`app/sitemap.{ts,tsx,js,jsx,mjs}` or\n * `src/app/sitemap.*`). Returns the project-relative path if found, else null.\n *\n * Presence of this file means the framework already emits `/sitemap.xml` — the\n * authoritative page set — and site-kit's runtime `SitemapSync` syncs that real\n * sitemap (dynamic routes and all) additively. In that world an `--auto-discover`\n * filesystem scan is both inferior and dangerous (see the module header), so the\n * CLI skips.\n */\nexport function findSitemapRoute(cwd: string = process.cwd()): string | null {\n for (const dir of APP_DIR_CANDIDATES) {\n for (const ext of SITEMAP_ROUTE_EXTENSIONS) {\n const rel = path.join(dir, `sitemap.${ext}`)\n if (fs.existsSync(path.join(cwd, rel))) return rel\n }\n }\n return null\n}\n\n/**\n * Recursively discover STATIC Next.js routes from an app directory.\n *\n * Intentionally skips dynamic segments (`[slug]`) — they can't be enumerated\n * from disk — which is exactly why the result is incomplete and must only ever\n * drive an additive sync. Route groups `(marketing)` are folded out of the URL.\n */\nexport function discoverNextJsRoutes(\n appDir: string,\n basePath: string = '',\n): Array<{ path: string; priority: number }> {\n const entries: Array<{ path: string; priority: number }> = []\n\n const items = fs.readdirSync(appDir, { withFileTypes: true })\n\n for (const item of items) {\n if (item.name.startsWith('_') || item.name.startsWith('.')) continue\n if (item.name === 'api') continue\n if (item.name === 'node_modules') continue\n\n const itemPath = path.join(appDir, item.name)\n\n if (item.isDirectory()) {\n const hasPage =\n fs.existsSync(path.join(itemPath, 'page.tsx')) ||\n fs.existsSync(path.join(itemPath, 'page.js')) ||\n fs.existsSync(path.join(itemPath, 'page.jsx'))\n\n const isRouteGroup = item.name.startsWith('(') && item.name.endsWith(')')\n const isDynamic = item.name.startsWith('[') && item.name.endsWith(']')\n\n let routePath = basePath\n if (!isRouteGroup && !isDynamic) {\n routePath = `${basePath}/${item.name}`\n }\n\n if (hasPage && !isDynamic) {\n const priority = routePath === '' ? 1.0 : 0.8\n entries.push({ path: routePath || '/', priority })\n }\n\n if (!isDynamic) {\n const subEntries = discoverNextJsRoutes(\n itemPath,\n isRouteGroup ? basePath : routePath,\n )\n entries.push(...subEntries)\n }\n }\n }\n\n if (basePath === '') {\n const hasRootPage =\n fs.existsSync(path.join(appDir, 'page.tsx')) ||\n fs.existsSync(path.join(appDir, 'page.js')) ||\n fs.existsSync(path.join(appDir, 'page.jsx'))\n if (hasRootPage) {\n entries.unshift({ path: '/', priority: 1.0 })\n }\n }\n\n return entries\n}\n"]}