@sonordev/site-kit 5.3.2 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/AGENTS.md +16 -6
  2. package/README.md +26 -7
  3. package/agent-manifest.json +11 -10
  4. package/dist/AnalyticsProvider-KFXAH4GR.mjs +11 -0
  5. package/dist/{AnalyticsProvider-2XK54UZW.mjs.map → AnalyticsProvider-KFXAH4GR.mjs.map} +1 -1
  6. package/dist/AnalyticsProvider-WDDW3IJW.js +32 -0
  7. package/dist/{AnalyticsProvider-PM7SOGOS.js.map → AnalyticsProvider-WDDW3IJW.js.map} +1 -1
  8. package/dist/{BlogViewTracker-3BIUF5TI.js → BlogViewTracker-D4DIEP4Q.js} +6 -6
  9. package/dist/{BlogViewTracker-3BIUF5TI.js.map → BlogViewTracker-D4DIEP4Q.js.map} +1 -1
  10. package/dist/{BlogViewTracker-KFUDRDQK.mjs → BlogViewTracker-ZVEGGH3Y.mjs} +5 -5
  11. package/dist/{BlogViewTracker-KFUDRDQK.mjs.map → BlogViewTracker-ZVEGGH3Y.mjs.map} +1 -1
  12. package/dist/ChatWidget-2ZYPYIMQ.js +22 -0
  13. package/dist/{ChatWidget-7BYSGNO2.js.map → ChatWidget-2ZYPYIMQ.js.map} +1 -1
  14. package/dist/ChatWidget-FYCCLMQE.mjs +13 -0
  15. package/dist/{ChatWidget-4PHZHGG5.mjs.map → ChatWidget-FYCCLMQE.mjs.map} +1 -1
  16. package/dist/EngageWidget-6HUZYOY7.mjs +11 -0
  17. package/dist/{EngageWidget-D6M6QWEC.mjs.map → EngageWidget-6HUZYOY7.mjs.map} +1 -1
  18. package/dist/EngageWidget-MYQTBBW6.js +20 -0
  19. package/dist/{EngageWidget-Q4ITKTMJ.js.map → EngageWidget-MYQTBBW6.js.map} +1 -1
  20. package/dist/{FileField-YBBIJOCK.js → FileField-JK2S24XU.js} +6 -6
  21. package/dist/{FileField-YBBIJOCK.js.map → FileField-JK2S24XU.js.map} +1 -1
  22. package/dist/{FileField-PQQDX4IR.mjs → FileField-OZZHWGPA.mjs} +5 -5
  23. package/dist/{FileField-PQQDX4IR.mjs.map → FileField-OZZHWGPA.mjs.map} +1 -1
  24. package/dist/{FormSpotlight-WUN24F3P.js → FormSpotlight-5AXFQU5M.js} +15 -15
  25. package/dist/{FormSpotlight-WUN24F3P.js.map → FormSpotlight-5AXFQU5M.js.map} +1 -1
  26. package/dist/{FormSpotlight-7TIIWFTP.mjs → FormSpotlight-XV42L72H.mjs} +3 -3
  27. package/dist/{FormSpotlight-7TIIWFTP.mjs.map → FormSpotlight-XV42L72H.mjs.map} +1 -1
  28. package/dist/{FormStage-CM7OVLUT.js → FormStage-HATUHNRV.js} +13 -13
  29. package/dist/{FormStage-CM7OVLUT.js.map → FormStage-HATUHNRV.js.map} +1 -1
  30. package/dist/{FormStage-TFN2GIBO.mjs → FormStage-RUK675HV.mjs} +3 -3
  31. package/dist/{FormStage-TFN2GIBO.mjs.map → FormStage-RUK675HV.mjs.map} +1 -1
  32. package/dist/ManagedForm-JWEXJEXK.js +23 -0
  33. package/dist/{ManagedForm-N63YGVNY.js.map → ManagedForm-JWEXJEXK.js.map} +1 -1
  34. package/dist/ManagedForm-OA3MNGXT.mjs +14 -0
  35. package/dist/{ManagedForm-ZUXLHEQU.mjs.map → ManagedForm-OA3MNGXT.mjs.map} +1 -1
  36. package/dist/{ManagedNewsletterForm-PIVJTU5L.js → ManagedNewsletterForm-AAHH63KT.js} +8 -8
  37. package/dist/{ManagedNewsletterForm-PIVJTU5L.js.map → ManagedNewsletterForm-AAHH63KT.js.map} +1 -1
  38. package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs → ManagedNewsletterForm-HZKTNWLW.mjs} +7 -7
  39. package/dist/{ManagedNewsletterForm-4AVKTZ2A.mjs.map → ManagedNewsletterForm-HZKTNWLW.mjs.map} +1 -1
  40. package/dist/{SignalCore-LT4NCPOR.mjs → SignalCore-X3GDGBZD.mjs} +5 -5
  41. package/dist/{SignalCore-LT4NCPOR.mjs.map → SignalCore-X3GDGBZD.mjs.map} +1 -1
  42. package/dist/{SignalCore-2M5TISM7.js → SignalCore-YSNZYBKJ.js} +11 -11
  43. package/dist/{SignalCore-2M5TISM7.js.map → SignalCore-YSNZYBKJ.js.map} +1 -1
  44. package/dist/SitemapSync-2PTDBH5E.mjs +9 -0
  45. package/dist/{SitemapSync-G3OLECFI.mjs.map → SitemapSync-2PTDBH5E.mjs.map} +1 -1
  46. package/dist/SitemapSync-3SFAI546.js +18 -0
  47. package/dist/{SitemapSync-7OBOJG2L.js.map → SitemapSync-3SFAI546.js.map} +1 -1
  48. package/dist/analytics/dispatch.d.ts +4 -4
  49. package/dist/analytics/index.js +15 -15
  50. package/dist/analytics/index.mjs +6 -6
  51. package/dist/{api-NTHZ6PAW.mjs → api-D745LGGU.mjs} +3 -3
  52. package/dist/api-D745LGGU.mjs.map +1 -0
  53. package/dist/{api-N5OLQXYN.js → api-XR5APCH3.js} +3 -3
  54. package/dist/api-XR5APCH3.js.map +1 -0
  55. package/dist/blog/AuthorPage.d.ts +1 -1
  56. package/dist/blog/AuthorPage.d.ts.map +1 -1
  57. package/dist/blog/BlogLayout.d.ts +3 -1
  58. package/dist/blog/BlogLayout.d.ts.map +1 -1
  59. package/dist/blog/BlogList.d.ts +3 -1
  60. package/dist/blog/BlogList.d.ts.map +1 -1
  61. package/dist/blog/BlogPost.d.ts +3 -1
  62. package/dist/blog/BlogPost.d.ts.map +1 -1
  63. package/dist/blog/BlogSidebar.d.ts +3 -1
  64. package/dist/blog/BlogSidebar.d.ts.map +1 -1
  65. package/dist/blog/ClusterLandingPage.d.ts +3 -1
  66. package/dist/blog/ClusterLandingPage.d.ts.map +1 -1
  67. package/dist/blog/ClusterNavigation.d.ts +3 -1
  68. package/dist/blog/ClusterNavigation.d.ts.map +1 -1
  69. package/dist/blog/RelatedPosts.d.ts +4 -1
  70. package/dist/blog/RelatedPosts.d.ts.map +1 -1
  71. package/dist/blog/artwork-components.test.d.ts +2 -0
  72. package/dist/blog/artwork-components.test.d.ts.map +1 -0
  73. package/dist/blog/artwork.d.ts +14 -0
  74. package/dist/blog/artwork.d.ts.map +1 -0
  75. package/dist/blog/artwork.test.d.ts +2 -0
  76. package/dist/blog/artwork.test.d.ts.map +1 -0
  77. package/dist/blog/blog-styles.d.ts.map +1 -1
  78. package/dist/blog/blog-tables.d.ts +13 -0
  79. package/dist/blog/blog-tables.d.ts.map +1 -0
  80. package/dist/blog/blog-tables.test.d.ts +2 -0
  81. package/dist/blog/blog-tables.test.d.ts.map +1 -0
  82. package/dist/blog/index.d.ts +3 -0
  83. package/dist/blog/index.d.ts.map +1 -1
  84. package/dist/blog/index.js +52 -30
  85. package/dist/blog/index.js.map +1 -1
  86. package/dist/blog/index.mjs +15 -12
  87. package/dist/blog/index.mjs.map +1 -1
  88. package/dist/blog/publication-render.test.d.ts +2 -0
  89. package/dist/blog/publication-render.test.d.ts.map +1 -0
  90. package/dist/blog/publication-routes.test.d.ts +2 -0
  91. package/dist/blog/publication-routes.test.d.ts.map +1 -0
  92. package/dist/blog/routes.d.ts +40 -0
  93. package/dist/blog/routes.d.ts.map +1 -0
  94. package/dist/blog/server-core.d.ts +28 -21
  95. package/dist/blog/server-core.d.ts.map +1 -1
  96. package/dist/blog/server-ui.d.ts +4 -0
  97. package/dist/blog/server-ui.d.ts.map +1 -1
  98. package/dist/blog/server-ui.js +49 -28
  99. package/dist/blog/server-ui.js.map +1 -1
  100. package/dist/blog/server-ui.mjs +9 -15
  101. package/dist/blog/server-ui.mjs.map +1 -1
  102. package/dist/blog/server.d.ts +28 -21
  103. package/dist/blog/server.d.ts.map +1 -1
  104. package/dist/blog/server.js +71 -42
  105. package/dist/blog/server.mjs +3 -2
  106. package/dist/blog/types.d.ts +8 -1
  107. package/dist/blog/types.d.ts.map +1 -1
  108. package/dist/blog-styles-6EY3BS5Y.js +595 -0
  109. package/dist/blog-styles-6EY3BS5Y.js.map +1 -0
  110. package/dist/blog-styles-7AKRUMV7.mjs +592 -0
  111. package/dist/blog-styles-7AKRUMV7.mjs.map +1 -0
  112. package/dist/blog-tables-DWDEWA3S.js +17 -0
  113. package/dist/blog-tables-DWDEWA3S.js.map +1 -0
  114. package/dist/blog-tables-QGIHOESZ.mjs +4 -0
  115. package/dist/blog-tables-QGIHOESZ.mjs.map +1 -0
  116. package/dist/{chunk-OIJ435IZ.js → chunk-2CMSWJWC.js} +18 -18
  117. package/dist/{chunk-OIJ435IZ.js.map → chunk-2CMSWJWC.js.map} +1 -1
  118. package/dist/{chunk-K37JPEQW.js → chunk-2OU4KBUN.js} +26 -23
  119. package/dist/chunk-2OU4KBUN.js.map +1 -0
  120. package/dist/{chunk-JSLYNYTB.mjs → chunk-3B6CXGAK.mjs} +3 -3
  121. package/dist/{chunk-JSLYNYTB.mjs.map → chunk-3B6CXGAK.mjs.map} +1 -1
  122. package/dist/{chunk-HMFFAUCD.js → chunk-3DWIYCQX.js} +2 -2
  123. package/dist/chunk-3DWIYCQX.js.map +1 -0
  124. package/dist/{chunk-3EPMDPWI.js → chunk-3SDMJMN2.js} +5 -5
  125. package/dist/{chunk-3EPMDPWI.js.map → chunk-3SDMJMN2.js.map} +1 -1
  126. package/dist/chunk-4B4S56WJ.mjs +110 -0
  127. package/dist/chunk-4B4S56WJ.mjs.map +1 -0
  128. package/dist/chunk-4U5NCKQY.mjs +39 -0
  129. package/dist/chunk-4U5NCKQY.mjs.map +1 -0
  130. package/dist/{chunk-CQUA2AUA.mjs → chunk-4XGACM7D.mjs} +3 -3
  131. package/dist/{chunk-CQUA2AUA.mjs.map → chunk-4XGACM7D.mjs.map} +1 -1
  132. package/dist/{chunk-AVM4OZHR.mjs → chunk-5TGAUWNO.mjs} +3 -3
  133. package/dist/{chunk-AVM4OZHR.mjs.map → chunk-5TGAUWNO.mjs.map} +1 -1
  134. package/dist/{chunk-RO55G3OA.mjs → chunk-64BOVMXG.mjs} +3 -3
  135. package/dist/{chunk-RO55G3OA.mjs.map → chunk-64BOVMXG.mjs.map} +1 -1
  136. package/dist/{chunk-JBGRXICL.js → chunk-746RKQHA.js} +75 -70
  137. package/dist/chunk-746RKQHA.js.map +1 -0
  138. package/dist/{chunk-N3C323NY.mjs → chunk-7PPNXORV.mjs} +3 -3
  139. package/dist/{chunk-N3C323NY.mjs.map → chunk-7PPNXORV.mjs.map} +1 -1
  140. package/dist/{chunk-DYKFC7WY.js → chunk-A3F5GRNJ.js} +8 -8
  141. package/dist/{chunk-DYKFC7WY.js.map → chunk-A3F5GRNJ.js.map} +1 -1
  142. package/dist/{chunk-4TU246Q4.mjs → chunk-AEARU24Q.mjs} +40 -26
  143. package/dist/chunk-AEARU24Q.mjs.map +1 -0
  144. package/dist/{chunk-5BZDHZCN.js → chunk-BNOQXDPJ.js} +4 -4
  145. package/dist/{chunk-5BZDHZCN.js.map → chunk-BNOQXDPJ.js.map} +1 -1
  146. package/dist/{chunk-XQZTOWS3.js → chunk-CT5REGAK.js} +15 -15
  147. package/dist/{chunk-XQZTOWS3.js.map → chunk-CT5REGAK.js.map} +1 -1
  148. package/dist/{chunk-KOP3DPIR.mjs → chunk-DRLHQQBH.mjs} +4 -4
  149. package/dist/{chunk-KOP3DPIR.mjs.map → chunk-DRLHQQBH.mjs.map} +1 -1
  150. package/dist/{chunk-Y7SRO7MJ.mjs → chunk-DYULWKDC.mjs} +4 -4
  151. package/dist/{chunk-Y7SRO7MJ.mjs.map → chunk-DYULWKDC.mjs.map} +1 -1
  152. package/dist/{chunk-DHXQBTXE.mjs → chunk-EEQYKMGH.mjs} +75 -70
  153. package/dist/chunk-EEQYKMGH.mjs.map +1 -0
  154. package/dist/chunk-ESP5RMB7.js +42 -0
  155. package/dist/chunk-ESP5RMB7.js.map +1 -0
  156. package/dist/{chunk-4DE2KJ7R.js → chunk-FF5N5D3D.js} +8 -8
  157. package/dist/{chunk-4DE2KJ7R.js.map → chunk-FF5N5D3D.js.map} +1 -1
  158. package/dist/{chunk-757HXAYX.js → chunk-FYVLQ3OU.js} +3 -3
  159. package/dist/{chunk-757HXAYX.js.map → chunk-FYVLQ3OU.js.map} +1 -1
  160. package/dist/{chunk-OC6PU7U2.mjs → chunk-G5HUI4BO.mjs} +3 -3
  161. package/dist/{chunk-OC6PU7U2.mjs.map → chunk-G5HUI4BO.mjs.map} +1 -1
  162. package/dist/chunk-G6WF4G3E.js +43 -0
  163. package/dist/chunk-G6WF4G3E.js.map +1 -0
  164. package/dist/chunk-GHECYDSZ.mjs +134 -0
  165. package/dist/chunk-GHECYDSZ.mjs.map +1 -0
  166. package/dist/{chunk-JTO3K5B7.mjs → chunk-HBI67P7Y.mjs} +4 -4
  167. package/dist/{chunk-JTO3K5B7.mjs.map → chunk-HBI67P7Y.mjs.map} +1 -1
  168. package/dist/{chunk-FFJVQWKO.js → chunk-HFJQMIFM.js} +4 -4
  169. package/dist/{chunk-FFJVQWKO.js.map → chunk-HFJQMIFM.js.map} +1 -1
  170. package/dist/{chunk-A3NNUKFA.js → chunk-HX3BRMOX.js} +96 -644
  171. package/dist/chunk-HX3BRMOX.js.map +1 -0
  172. package/dist/{chunk-3TXX5KIN.js → chunk-JNRHTZL4.js} +2 -2
  173. package/dist/{chunk-3TXX5KIN.js.map → chunk-JNRHTZL4.js.map} +1 -1
  174. package/dist/{chunk-R3LYTIVN.js → chunk-KAUUGRYB.js} +5 -5
  175. package/dist/{chunk-R3LYTIVN.js.map → chunk-KAUUGRYB.js.map} +1 -1
  176. package/dist/{chunk-L2LJQIM3.js → chunk-KPKQKFT4.js} +11 -11
  177. package/dist/chunk-KPKQKFT4.js.map +1 -0
  178. package/dist/chunk-LC7AM4J5.js +118 -0
  179. package/dist/chunk-LC7AM4J5.js.map +1 -0
  180. package/dist/{chunk-GFNXWS3I.js → chunk-MCJF2KJ6.js} +5 -5
  181. package/dist/{chunk-GFNXWS3I.js.map → chunk-MCJF2KJ6.js.map} +1 -1
  182. package/dist/{chunk-Z7K5AMCE.js → chunk-MNYM2XU4.js} +4 -4
  183. package/dist/{chunk-Z7K5AMCE.js.map → chunk-MNYM2XU4.js.map} +1 -1
  184. package/dist/{chunk-6QABCGM6.mjs → chunk-MU7IEPDG.mjs} +4 -4
  185. package/dist/chunk-MU7IEPDG.mjs.map +1 -0
  186. package/dist/chunk-NSWO43XW.mjs +39 -0
  187. package/dist/chunk-NSWO43XW.mjs.map +1 -0
  188. package/dist/{chunk-Z33JXJTJ.js → chunk-NZSFOZJV.js} +40 -26
  189. package/dist/chunk-NZSFOZJV.js.map +1 -0
  190. package/dist/{chunk-ZKR5AJV5.mjs → chunk-OFSA7LUH.mjs} +4 -4
  191. package/dist/{chunk-ZKR5AJV5.mjs.map → chunk-OFSA7LUH.mjs.map} +1 -1
  192. package/dist/{chunk-M7FWXEXC.js → chunk-PIPLBBDH.js} +8 -8
  193. package/dist/{chunk-M7FWXEXC.js.map → chunk-PIPLBBDH.js.map} +1 -1
  194. package/dist/{chunk-FDVE56JS.js → chunk-Q26VZNM2.js} +3 -3
  195. package/dist/{chunk-FDVE56JS.js.map → chunk-Q26VZNM2.js.map} +1 -1
  196. package/dist/{chunk-6AZTRTCG.js → chunk-QEGUI2Q2.js} +15 -15
  197. package/dist/{chunk-6AZTRTCG.js.map → chunk-QEGUI2Q2.js.map} +1 -1
  198. package/dist/{chunk-GPNBBUEN.js → chunk-QFNSM77X.js} +3 -3
  199. package/dist/{chunk-GPNBBUEN.js.map → chunk-QFNSM77X.js.map} +1 -1
  200. package/dist/{chunk-QZ54OCWD.mjs → chunk-R4MX6EOM.mjs} +7 -7
  201. package/dist/{chunk-QZ54OCWD.mjs.map → chunk-R4MX6EOM.mjs.map} +1 -1
  202. package/dist/{chunk-67CHHDBL.mjs → chunk-RMMHWSPP.mjs} +96 -644
  203. package/dist/chunk-RMMHWSPP.mjs.map +1 -0
  204. package/dist/{chunk-B4BFQSSS.mjs → chunk-RU54J2PY.mjs} +4 -4
  205. package/dist/chunk-RU54J2PY.mjs.map +1 -0
  206. package/dist/{chunk-AXAIUCSF.mjs → chunk-RZUZMUTN.mjs} +9 -8
  207. package/dist/chunk-RZUZMUTN.mjs.map +1 -0
  208. package/dist/{chunk-NSLYY62T.mjs → chunk-S6FEC6UT.mjs} +9 -5
  209. package/dist/chunk-S6FEC6UT.mjs.map +1 -0
  210. package/dist/{chunk-3DPXOZAU.mjs → chunk-SHLWA6JY.mjs} +2 -2
  211. package/dist/chunk-SHLWA6JY.mjs.map +1 -0
  212. package/dist/{chunk-E33HJMRP.js → chunk-SQVYLIIN.js} +11 -7
  213. package/dist/chunk-SQVYLIIN.js.map +1 -0
  214. package/dist/chunk-SUZ3ZLB2.js +8 -0
  215. package/dist/{chunk-D37M7MIH.js.map → chunk-SUZ3ZLB2.js.map} +1 -1
  216. package/dist/{chunk-DZDWBQKA.mjs → chunk-TALEV3IH.mjs} +3 -3
  217. package/dist/{chunk-DZDWBQKA.mjs.map → chunk-TALEV3IH.mjs.map} +1 -1
  218. package/dist/{chunk-UOTXSWKZ.mjs → chunk-TP7H6BSK.mjs} +2 -2
  219. package/dist/{chunk-UOTXSWKZ.mjs.map → chunk-TP7H6BSK.mjs.map} +1 -1
  220. package/dist/{chunk-XW5KNCWJ.mjs → chunk-TX2QQ7IX.mjs} +3 -3
  221. package/dist/{chunk-XW5KNCWJ.mjs.map → chunk-TX2QQ7IX.mjs.map} +1 -1
  222. package/dist/{chunk-PEEQMI7U.js → chunk-UNPEMSLK.js} +12 -11
  223. package/dist/chunk-UNPEMSLK.js.map +1 -0
  224. package/dist/{chunk-42F5EK24.mjs → chunk-UZL2QU2V.mjs} +16 -13
  225. package/dist/chunk-UZL2QU2V.mjs.map +1 -0
  226. package/dist/{chunk-6VG65AIA.mjs → chunk-V6NOM7PJ.mjs} +3 -3
  227. package/dist/{chunk-6VG65AIA.mjs.map → chunk-V6NOM7PJ.mjs.map} +1 -1
  228. package/dist/{chunk-W23TMUKB.js → chunk-VAS3LH5W.js} +418 -98
  229. package/dist/chunk-VAS3LH5W.js.map +1 -0
  230. package/dist/{chunk-TS3N3LGZ.mjs → chunk-VYHRAICF.mjs} +4 -4
  231. package/dist/{chunk-TS3N3LGZ.mjs.map → chunk-VYHRAICF.mjs.map} +1 -1
  232. package/dist/{chunk-G3YUSRCL.js → chunk-W5NVW23S.js} +4 -4
  233. package/dist/{chunk-G3YUSRCL.js.map → chunk-W5NVW23S.js.map} +1 -1
  234. package/dist/chunk-WDBCXRTT.mjs +6 -0
  235. package/dist/{chunk-OUERH2T4.mjs.map → chunk-WDBCXRTT.mjs.map} +1 -1
  236. package/dist/{chunk-ZOJ3TLO5.mjs → chunk-WIZRCI6J.mjs} +3 -3
  237. package/dist/{chunk-ZOJ3TLO5.mjs.map → chunk-WIZRCI6J.mjs.map} +1 -1
  238. package/dist/{chunk-HDQTZAGE.mjs → chunk-X2XFLYZ3.mjs} +3 -3
  239. package/dist/{chunk-HDQTZAGE.mjs.map → chunk-X2XFLYZ3.mjs.map} +1 -1
  240. package/dist/{chunk-HVFXFPUJ.mjs → chunk-XQYC4KMH.mjs} +413 -94
  241. package/dist/chunk-XQYC4KMH.mjs.map +1 -0
  242. package/dist/{chunk-KPFPSOYS.js → chunk-YNC5D3FT.js} +12 -12
  243. package/dist/{chunk-KPFPSOYS.js.map → chunk-YNC5D3FT.js.map} +1 -1
  244. package/dist/chunk-YQTE32QK.js +137 -0
  245. package/dist/chunk-YQTE32QK.js.map +1 -0
  246. package/dist/{chunk-PZXKFHPO.js → chunk-YYAFHIY7.js} +15 -15
  247. package/dist/chunk-YYAFHIY7.js.map +1 -0
  248. package/dist/{chunk-MANX6422.js → chunk-Z6S4MWSR.js} +7 -7
  249. package/dist/{chunk-MANX6422.js.map → chunk-Z6S4MWSR.js.map} +1 -1
  250. package/dist/{chunk-DVH3JHZ3.mjs → chunk-ZRQFG3L6.mjs} +5 -5
  251. package/dist/{chunk-DVH3JHZ3.mjs.map → chunk-ZRQFG3L6.mjs.map} +1 -1
  252. package/dist/cli/agent/checks.d.ts.map +1 -1
  253. package/dist/cli/agent/ssr-bailout.d.ts +27 -0
  254. package/dist/cli/agent/ssr-bailout.d.ts.map +1 -0
  255. package/dist/cli/agent/ssr-bailout.test.d.ts +2 -0
  256. package/dist/cli/agent/ssr-bailout.test.d.ts.map +1 -0
  257. package/dist/cli/codemod/transforms.d.ts.map +1 -1
  258. package/dist/cli/index.js +38 -51
  259. package/dist/cli/index.js.map +1 -1
  260. package/dist/cli/index.mjs +36 -49
  261. package/dist/cli/index.mjs.map +1 -1
  262. package/dist/cli/migrator/index.d.ts.map +1 -1
  263. package/dist/client/index.d.ts +1 -0
  264. package/dist/client/index.d.ts.map +1 -1
  265. package/dist/client/index.js +20 -7
  266. package/dist/client/index.js.map +1 -1
  267. package/dist/client/index.mjs +5 -4
  268. package/dist/client/index.mjs.map +1 -1
  269. package/dist/cms/index.js.map +1 -1
  270. package/dist/cms/index.mjs.map +1 -1
  271. package/dist/cms/sanity-image.d.ts +1 -1
  272. package/dist/commerce/index.js +58 -58
  273. package/dist/commerce/index.mjs +7 -7
  274. package/dist/engage/ChatWidget.d.ts.map +1 -1
  275. package/dist/engage/EngageWidget.d.ts +3 -4
  276. package/dist/engage/EngageWidget.d.ts.map +1 -1
  277. package/dist/engage/chat-launcher.test.d.ts +2 -0
  278. package/dist/engage/chat-launcher.test.d.ts.map +1 -0
  279. package/dist/engage/index.js +12 -10
  280. package/dist/engage/index.js.map +1 -1
  281. package/dist/engage/index.mjs +9 -7
  282. package/dist/engage/index.mjs.map +1 -1
  283. package/dist/engage/launcher-placement.d.ts +56 -0
  284. package/dist/engage/launcher-placement.d.ts.map +1 -0
  285. package/dist/engage/launcher-placement.test.d.ts +2 -0
  286. package/dist/engage/launcher-placement.test.d.ts.map +1 -0
  287. package/dist/engage/types.d.ts +41 -7
  288. package/dist/engage/types.d.ts.map +1 -1
  289. package/dist/fleet/index.js +8 -8
  290. package/dist/fleet/index.mjs +4 -4
  291. package/dist/forms/index.js +16 -16
  292. package/dist/forms/index.mjs +9 -9
  293. package/dist/forms/server.js +10 -10
  294. package/dist/forms/server.mjs +8 -8
  295. package/dist/forms/static.js +7 -7
  296. package/dist/forms/static.mjs +6 -6
  297. package/dist/images/ManagedImage.d.ts.map +1 -1
  298. package/dist/images/index.js +11 -11
  299. package/dist/images/index.mjs +4 -4
  300. package/dist/index.js +65 -65
  301. package/dist/index.mjs +11 -11
  302. package/dist/layout/SiteKitClientProviders.d.ts.map +1 -1
  303. package/dist/layout/client.d.ts.map +1 -1
  304. package/dist/layout/client.js +8 -8
  305. package/dist/layout/client.mjs +7 -7
  306. package/dist/layout/index.js +10 -10
  307. package/dist/layout/index.mjs +8 -8
  308. package/dist/layout/types.d.ts +7 -3
  309. package/dist/layout/types.d.ts.map +1 -1
  310. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  311. package/dist/llms/index.js +12 -12
  312. package/dist/llms/index.mjs +2 -2
  313. package/dist/llms/types.d.ts +7 -1
  314. package/dist/llms/types.d.ts.map +1 -1
  315. package/dist/maps/index.js +5 -5
  316. package/dist/maps/index.mjs +3 -3
  317. package/dist/mcp/WebMcpTools.d.ts +5 -2
  318. package/dist/mcp/WebMcpTools.d.ts.map +1 -1
  319. package/dist/mcp/client.js.map +1 -1
  320. package/dist/mcp/client.mjs.map +1 -1
  321. package/dist/search/index.js +4 -4
  322. package/dist/search/index.mjs +3 -3
  323. package/dist/seo/LocationPageContent.d.ts +6 -5
  324. package/dist/seo/LocationPageContent.d.ts.map +1 -1
  325. package/dist/seo/api.d.ts +4 -5
  326. package/dist/seo/api.d.ts.map +1 -1
  327. package/dist/seo/client.js +5 -5
  328. package/dist/seo/client.mjs +4 -4
  329. package/dist/seo/index.js +42 -42
  330. package/dist/seo/index.js.map +1 -1
  331. package/dist/seo/index.mjs +8 -8
  332. package/dist/seo/index.mjs.map +1 -1
  333. package/dist/seo/routing.d.ts +9 -23
  334. package/dist/seo/routing.d.ts.map +1 -1
  335. package/dist/seo/server-api.d.ts +11 -5
  336. package/dist/seo/server-api.d.ts.map +1 -1
  337. package/dist/seo/server.js +18 -18
  338. package/dist/seo/server.mjs +2 -2
  339. package/dist/server/index.js +3 -3
  340. package/dist/server/index.mjs +2 -2
  341. package/dist/{server-api-HW4PL2L2.mjs → server-api-RG3ZL3DV.mjs} +3 -3
  342. package/dist/{server-api-HW4PL2L2.mjs.map → server-api-RG3ZL3DV.mjs.map} +1 -1
  343. package/dist/{server-api-DB2SIUP4.js → server-api-RYJQAUGO.js} +21 -21
  344. package/dist/{server-api-DB2SIUP4.js.map → server-api-RYJQAUGO.js.map} +1 -1
  345. package/dist/shared/version.d.ts +1 -1
  346. package/dist/shared/visual-viewport-gap.d.ts +52 -0
  347. package/dist/shared/visual-viewport-gap.d.ts.map +1 -0
  348. package/dist/shared/visual-viewport-gap.test.d.ts +2 -0
  349. package/dist/shared/visual-viewport-gap.test.d.ts.map +1 -0
  350. package/dist/signal/index.js +11 -11
  351. package/dist/signal/index.mjs +2 -2
  352. package/dist/sitemap/index.js +2 -2
  353. package/dist/sitemap/index.mjs +1 -1
  354. package/dist/sync/BookingWidget.d.ts +0 -23
  355. package/dist/sync/BookingWidget.d.ts.map +1 -1
  356. package/dist/sync/MeetingFormatStep.d.ts +13 -0
  357. package/dist/sync/MeetingFormatStep.d.ts.map +1 -0
  358. package/dist/sync/api.d.ts +9 -10
  359. package/dist/sync/api.d.ts.map +1 -1
  360. package/dist/sync/booking-flow.d.ts +7 -0
  361. package/dist/sync/booking-flow.d.ts.map +1 -0
  362. package/dist/sync/booking-flow.test.d.ts +2 -0
  363. package/dist/sync/booking-flow.test.d.ts.map +1 -0
  364. package/dist/sync/index.d.ts +2 -2
  365. package/dist/sync/index.d.ts.map +1 -1
  366. package/dist/sync/index.js +20 -16
  367. package/dist/sync/index.mjs +4 -4
  368. package/dist/sync/types.d.ts +34 -0
  369. package/dist/sync/types.d.ts.map +1 -1
  370. package/dist/types.d.ts +9 -0
  371. package/dist/types.d.ts.map +1 -1
  372. package/package.json +1 -1
  373. package/skills/site-kit/SKILL.md +8 -3
  374. package/dist/AnalyticsProvider-2XK54UZW.mjs +0 -11
  375. package/dist/AnalyticsProvider-PM7SOGOS.js +0 -32
  376. package/dist/ChatWidget-4PHZHGG5.mjs +0 -11
  377. package/dist/ChatWidget-7BYSGNO2.js +0 -20
  378. package/dist/EngageWidget-D6M6QWEC.mjs +0 -9
  379. package/dist/EngageWidget-Q4ITKTMJ.js +0 -18
  380. package/dist/ManagedForm-N63YGVNY.js +0 -23
  381. package/dist/ManagedForm-ZUXLHEQU.mjs +0 -14
  382. package/dist/SitemapSync-7OBOJG2L.js +0 -18
  383. package/dist/SitemapSync-G3OLECFI.mjs +0 -9
  384. package/dist/api-N5OLQXYN.js.map +0 -1
  385. package/dist/api-NTHZ6PAW.mjs.map +0 -1
  386. package/dist/chunk-3DPXOZAU.mjs.map +0 -1
  387. package/dist/chunk-42F5EK24.mjs.map +0 -1
  388. package/dist/chunk-4TU246Q4.mjs.map +0 -1
  389. package/dist/chunk-67CHHDBL.mjs.map +0 -1
  390. package/dist/chunk-6QABCGM6.mjs.map +0 -1
  391. package/dist/chunk-A3NNUKFA.js.map +0 -1
  392. package/dist/chunk-AXAIUCSF.mjs.map +0 -1
  393. package/dist/chunk-B4BFQSSS.mjs.map +0 -1
  394. package/dist/chunk-CGCYZJYX.mjs +0 -41
  395. package/dist/chunk-CGCYZJYX.mjs.map +0 -1
  396. package/dist/chunk-D37M7MIH.js +0 -8
  397. package/dist/chunk-DHXQBTXE.mjs.map +0 -1
  398. package/dist/chunk-E33HJMRP.js.map +0 -1
  399. package/dist/chunk-HMFFAUCD.js.map +0 -1
  400. package/dist/chunk-HVFXFPUJ.mjs.map +0 -1
  401. package/dist/chunk-JBGRXICL.js.map +0 -1
  402. package/dist/chunk-K37JPEQW.js.map +0 -1
  403. package/dist/chunk-L2LJQIM3.js.map +0 -1
  404. package/dist/chunk-NSLYY62T.mjs.map +0 -1
  405. package/dist/chunk-OUERH2T4.mjs +0 -6
  406. package/dist/chunk-PEEQMI7U.js.map +0 -1
  407. package/dist/chunk-PZXKFHPO.js.map +0 -1
  408. package/dist/chunk-TPL2IHFI.js +0 -43
  409. package/dist/chunk-TPL2IHFI.js.map +0 -1
  410. package/dist/chunk-W23TMUKB.js.map +0 -1
  411. package/dist/chunk-Z33JXJTJ.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/blog/ClusterLandingPage.tsx"],"names":["getTopicCluster","jsx","jsxs","Fragment","readingTimeMinutes"],"mappings":"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","file":"server-ui.js","sourcesContent":["/**\n * @sonordev/site-kit/blog - Cluster Landing Page Component\n *\n * Pre-built page component for `/blog/cluster/[slug]` routes.\n * Renders a topic cluster overview with:\n * - Cluster hero (name, topic, description)\n * - Pillar article (featured, large card)\n * - Support articles (grid, categorized by article_type or funnel_stage)\n *\n * Server component — fetches cluster data from Portal API.\n * Ships with `.sk-cluster-landing-*` scoped styles.\n */\n\nimport React from 'react'\nimport { getTopicCluster } from './server-core'\nimport type { TopicCluster, BlogPost } from './types'\nimport { readingTimeMinutes } from './reading-time'\n\n// ============================================================================\n// CSS\n// ============================================================================\n\nconst clusterLandingCss = `\n.sk-cluster-landing { max-width: 72rem; margin: 0 auto; padding: 2rem 1rem; }\n\n.sk-cluster-hero { margin-bottom: 3rem; text-align: center; }\n.sk-cluster-hero-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.75rem; font-weight: 600; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n}\n.sk-cluster-hero-title {\n font-size: 2.25rem; font-weight: 800; color: #111827;\n line-height: 1.2; margin: 0 0 0.75rem 0;\n}\n.sk-cluster-hero-desc {\n font-size: 1.125rem; color: #6b7280; max-width: 40rem;\n margin: 0 auto; line-height: 1.6;\n}\n.sk-cluster-hero-meta {\n display: flex; justify-content: center; gap: 1.5rem;\n margin-top: 1rem; font-size: 0.875rem; color: #9ca3af;\n}\n\n.sk-cluster-pillar-card {\n display: block; text-decoration: none; color: inherit;\n padding: 2rem; border-radius: 0.75rem;\n background: linear-gradient(135deg, rgba(99,102,241,0.04), rgba(99,102,241,0.01));\n border: 2px solid rgba(99,102,241,0.2);\n margin-bottom: 3rem; transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-pillar-card:hover {\n border-color: rgba(99,102,241,0.4);\n box-shadow: 0 4px 24px rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.6875rem; font-weight: 700; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n padding: 0.25rem 0.5rem; border-radius: 9999px;\n background: rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-title {\n font-size: 1.5rem; font-weight: 700; color: #111827;\n margin: 0 0 0.5rem 0; line-height: 1.3;\n}\n.sk-cluster-pillar-excerpt {\n font-size: 1rem; color: #6b7280; line-height: 1.6;\n margin: 0 0 1rem 0;\n}\n.sk-cluster-pillar-meta {\n display: flex; gap: 1rem; font-size: 0.8125rem; color: #9ca3af;\n}\n\n.sk-cluster-supports-section { margin-bottom: 2rem; }\n.sk-cluster-supports-title {\n font-size: 1.25rem; font-weight: 700; color: #111827;\n margin: 0 0 1.25rem 0;\n}\n.sk-cluster-supports-grid {\n display: grid; gap: 1.25rem;\n grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));\n}\n.sk-cluster-support-card {\n display: block; text-decoration: none; color: inherit;\n padding: 1.25rem; border-radius: 0.5rem;\n border: 1px solid #e5e7eb; background: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-support-card:hover {\n border-color: #c7d2fe;\n box-shadow: 0 2px 12px rgba(0,0,0,0.04);\n}\n.sk-cluster-support-card-header {\n display: flex; align-items: center; gap: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.sk-cluster-support-type {\n display: inline-flex; align-items: center;\n padding: 0.125rem 0.375rem; border-radius: 9999px;\n font-size: 0.6875rem; font-weight: 500;\n background: rgba(99,102,241,0.06); color: #6366f1;\n border: 1px solid rgba(99,102,241,0.12);\n text-transform: capitalize;\n}\n.sk-cluster-support-intent {\n font-size: 0.6875rem; color: #9ca3af;\n text-transform: capitalize;\n}\n.sk-cluster-support-title {\n font-size: 1rem; font-weight: 600; color: #111827;\n margin: 0 0 0.375rem 0; line-height: 1.4;\n}\n.sk-cluster-support-excerpt {\n font-size: 0.875rem; color: #6b7280; line-height: 1.5;\n margin: 0; display: -webkit-box; -webkit-line-clamp: 2;\n -webkit-box-orient: vertical; overflow: hidden;\n}\n.sk-cluster-support-meta {\n display: flex; gap: 0.75rem; margin-top: 0.75rem;\n font-size: 0.75rem; color: #9ca3af;\n}\n`\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport interface ClusterLandingPageProps {\n /** Cluster slug to fetch */\n slug: string\n /** Base path for blog URLs (default: /blog) */\n basePath?: string\n /**\n * Include each article's own category segment in its URL:\n * {basePath}/{category}/{slug}. Enable on sites whose blog routes are\n * category-segmented (e.g. upforge.io /insights/{category}/{slug}) —\n * without it, links point at {basePath}/{slug} and 404 on such sites.\n */\n categoryInPath?: boolean\n /** Disable default styles */\n unstyled?: boolean\n /** Custom class name */\n className?: string\n /** Render prop for full data access */\n children?: (props: { cluster: TopicCluster }) => React.ReactNode\n}\n\n/** Category slug of a post — handles both string and object category shapes. */\nfunction categorySlugOf(post: { category?: unknown } | null | undefined): string | null {\n const c = post?.category as { slug?: string } | string | undefined\n if (!c) return null\n if (typeof c === 'string') return c\n return c.slug || null\n}\n\nexport async function ClusterLandingPage({\n slug,\n basePath = '/blog',\n categoryInPath = false,\n unstyled = false,\n className,\n children,\n}: ClusterLandingPageProps) {\n const cluster = await getTopicCluster(slug)\n\n if (!cluster) {\n return (\n <div style={{ padding: '4rem 1rem', textAlign: 'center', color: '#6b7280' }}>\n <p>Topic cluster not found.</p>\n </div>\n )\n }\n\n // Custom render\n if (children) {\n return children({ cluster })\n }\n\n const pillar = cluster.pillar\n const supports = cluster.supports || []\n\n const articleUrl = (post: { slug: string; category?: unknown }) => {\n const cat = categoryInPath ? categorySlugOf(post) : null\n return cat ? `${basePath}/${cat}/${post.slug}` : `${basePath}/${post.slug}`\n }\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: clusterLandingCss }} />}\n\n <div className={`${unstyled ? '' : 'sk-cluster-landing'} ${className || ''}`}>\n {/* Hero */}\n <header className={unstyled ? '' : 'sk-cluster-hero'}>\n <p className={unstyled ? '' : 'sk-cluster-hero-label'}>\n Topic Cluster\n </p>\n <h1 className={unstyled ? '' : 'sk-cluster-hero-title'}>\n {cluster.cluster_name}\n </h1>\n <p className={unstyled ? '' : 'sk-cluster-hero-desc'}>\n {cluster.core_topic}\n {cluster.geo_target ? ` in ${cluster.geo_target}` : ''}\n </p>\n <div className={unstyled ? '' : 'sk-cluster-hero-meta'}>\n <span>{cluster.article_count} articles</span>\n {cluster.geo_target && <span>{cluster.geo_target}</span>}\n </div>\n </header>\n\n {/* Pillar article (hero card) */}\n {pillar && (\n <a href={articleUrl(pillar)} className={unstyled ? '' : 'sk-cluster-pillar-card'}>\n <span className={unstyled ? '' : 'sk-cluster-pillar-label'}>\n Pillar Guide\n </span>\n <h2 className={unstyled ? '' : 'sk-cluster-pillar-title'}>\n {pillar.title}\n </h2>\n {pillar.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-pillar-excerpt'}>\n {pillar.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-pillar-meta'}>\n {readingTimeMinutes(pillar) && (\n <span>{readingTimeMinutes(pillar)} min read</span>\n )}\n {pillar.word_count && (\n <span>{pillar.word_count.toLocaleString()} words</span>\n )}\n </div>\n </a>\n )}\n\n {/* Support articles */}\n {supports.length > 0 && (\n <section className={unstyled ? '' : 'sk-cluster-supports-section'}>\n <h2 className={unstyled ? '' : 'sk-cluster-supports-title'}>\n Deep Dives\n </h2>\n <div className={unstyled ? '' : 'sk-cluster-supports-grid'}>\n {supports.map((post) => (\n <a\n key={post.id || post.slug}\n href={articleUrl(post)}\n className={unstyled ? '' : 'sk-cluster-support-card'}\n >\n <div className={unstyled ? '' : 'sk-cluster-support-card-header'}>\n {post.article_type && (\n <span className={unstyled ? '' : 'sk-cluster-support-type'}>\n {post.article_type}\n </span>\n )}\n {post.search_intent && (\n <span className={unstyled ? '' : 'sk-cluster-support-intent'}>\n {post.search_intent}\n </span>\n )}\n </div>\n <h3 className={unstyled ? '' : 'sk-cluster-support-title'}>\n {post.title}\n </h3>\n {post.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-support-excerpt'}>\n {post.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-support-meta'}>\n {readingTimeMinutes(post) && (\n <span>{readingTimeMinutes(post)} min read</span>\n )}\n {post.relationship_to_pillar && (\n <span>{post.relationship_to_pillar}</span>\n )}\n </div>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/blog/ClusterLandingPage.tsx"],"names":["getTopicCluster","jsx","createBlogRoutes","jsxs","Fragment","readingTimeMinutes"],"mappings":"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","file":"server-ui.js","sourcesContent":["/**\n * @sonordev/site-kit/blog - Cluster Landing Page Component\n *\n * Pre-built page component for `/blog/cluster/[slug]` routes.\n * Renders a topic cluster overview with:\n * - Cluster hero (name, topic, description)\n * - Pillar article (featured, large card)\n * - Support articles (grid, categorized by article_type or funnel_stage)\n *\n * Server component — fetches cluster data from Portal API.\n * Ships with `.sk-cluster-landing-*` scoped styles.\n */\n\nimport React from 'react'\nimport { createBlogRoutes, type BlogRoutingOptions } from './routes'\nimport { getTopicCluster } from './server-core'\nimport type { TopicCluster, BlogPost } from './types'\nimport { readingTimeMinutes } from './reading-time'\n\n// ============================================================================\n// CSS\n// ============================================================================\n\nconst clusterLandingCss = `\n.sk-cluster-landing { max-width: 72rem; margin: 0 auto; padding: 2rem 1rem; }\n\n.sk-cluster-hero { margin-bottom: 3rem; text-align: center; }\n.sk-cluster-hero-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.75rem; font-weight: 600; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n}\n.sk-cluster-hero-title {\n font-size: 2.25rem; font-weight: 800; color: #111827;\n line-height: 1.2; margin: 0 0 0.75rem 0;\n}\n.sk-cluster-hero-desc {\n font-size: 1.125rem; color: #6b7280; max-width: 40rem;\n margin: 0 auto; line-height: 1.6;\n}\n.sk-cluster-hero-meta {\n display: flex; justify-content: center; gap: 1.5rem;\n margin-top: 1rem; font-size: 0.875rem; color: #9ca3af;\n}\n\n.sk-cluster-pillar-card {\n display: block; text-decoration: none; color: inherit;\n padding: 2rem; border-radius: 0.75rem;\n background: linear-gradient(135deg, rgba(99,102,241,0.04), rgba(99,102,241,0.01));\n border: 2px solid rgba(99,102,241,0.2);\n margin-bottom: 3rem; transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-pillar-card:hover {\n border-color: rgba(99,102,241,0.4);\n box-shadow: 0 4px 24px rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.6875rem; font-weight: 700; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n padding: 0.25rem 0.5rem; border-radius: 9999px;\n background: rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-title {\n font-size: 1.5rem; font-weight: 700; color: #111827;\n margin: 0 0 0.5rem 0; line-height: 1.3;\n}\n.sk-cluster-pillar-excerpt {\n font-size: 1rem; color: #6b7280; line-height: 1.6;\n margin: 0 0 1rem 0;\n}\n.sk-cluster-pillar-meta {\n display: flex; gap: 1rem; font-size: 0.8125rem; color: #9ca3af;\n}\n\n.sk-cluster-supports-section { margin-bottom: 2rem; }\n.sk-cluster-supports-title {\n font-size: 1.25rem; font-weight: 700; color: #111827;\n margin: 0 0 1.25rem 0;\n}\n.sk-cluster-supports-grid {\n display: grid; gap: 1.25rem;\n grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));\n}\n.sk-cluster-support-card {\n display: block; text-decoration: none; color: inherit;\n padding: 1.25rem; border-radius: 0.5rem;\n border: 1px solid #e5e7eb; background: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-support-card:hover {\n border-color: #c7d2fe;\n box-shadow: 0 2px 12px rgba(0,0,0,0.04);\n}\n.sk-cluster-support-card-header {\n display: flex; align-items: center; gap: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.sk-cluster-support-type {\n display: inline-flex; align-items: center;\n padding: 0.125rem 0.375rem; border-radius: 9999px;\n font-size: 0.6875rem; font-weight: 500;\n background: rgba(99,102,241,0.06); color: #6366f1;\n border: 1px solid rgba(99,102,241,0.12);\n text-transform: capitalize;\n}\n.sk-cluster-support-intent {\n font-size: 0.6875rem; color: #9ca3af;\n text-transform: capitalize;\n}\n.sk-cluster-support-title {\n font-size: 1rem; font-weight: 600; color: #111827;\n margin: 0 0 0.375rem 0; line-height: 1.4;\n}\n.sk-cluster-support-excerpt {\n font-size: 0.875rem; color: #6b7280; line-height: 1.5;\n margin: 0; display: -webkit-box; -webkit-line-clamp: 2;\n -webkit-box-orient: vertical; overflow: hidden;\n}\n.sk-cluster-support-meta {\n display: flex; gap: 0.75rem; margin-top: 0.75rem;\n font-size: 0.75rem; color: #9ca3af;\n}\n`\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport interface ClusterLandingPageProps {\n /** Cluster slug to fetch */\n slug: string\n /** Base path for blog URLs (default: /blog) */\n basePath?: string\n routing?: BlogRoutingOptions\n /**\n * Include each article's own category segment in its URL:\n * {basePath}/{category}/{slug}. Enable on sites whose blog routes are\n * category-segmented (e.g. upforge.io /insights/{category}/{slug}) —\n * without it, links point at {basePath}/{slug} and 404 on such sites.\n */\n categoryInPath?: boolean\n /** Disable default styles */\n unstyled?: boolean\n /** Custom class name */\n className?: string\n /** Render prop for full data access */\n children?: (props: { cluster: TopicCluster }) => React.ReactNode\n}\n\nexport async function ClusterLandingPage({\n slug,\n basePath,\n routing,\n categoryInPath = false,\n unstyled = false,\n className,\n children,\n}: ClusterLandingPageProps) {\n const cluster = await getTopicCluster(slug)\n\n if (!cluster) {\n return (\n <div style={{ padding: '4rem 1rem', textAlign: 'center', color: '#6b7280' }}>\n <p>Topic cluster not found.</p>\n </div>\n )\n }\n\n // Custom render\n if (children) {\n return children({ cluster })\n }\n\n const pillar = cluster.pillar\n const supports = cluster.supports || []\n\n const articleUrl = createBlogRoutes({ basePath, includeCategoryInPath: categoryInPath, ...routing }).post\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: clusterLandingCss }} />}\n\n <div className={`${unstyled ? '' : 'sk-cluster-landing'} ${className || ''}`}>\n {/* Hero */}\n <header className={unstyled ? '' : 'sk-cluster-hero'}>\n <p className={unstyled ? '' : 'sk-cluster-hero-label'}>\n Topic Cluster\n </p>\n <h1 className={unstyled ? '' : 'sk-cluster-hero-title'}>\n {cluster.cluster_name}\n </h1>\n <p className={unstyled ? '' : 'sk-cluster-hero-desc'}>\n {cluster.core_topic}\n {cluster.geo_target ? ` in ${cluster.geo_target}` : ''}\n </p>\n <div className={unstyled ? '' : 'sk-cluster-hero-meta'}>\n <span>{cluster.article_count} articles</span>\n {cluster.geo_target && <span>{cluster.geo_target}</span>}\n </div>\n </header>\n\n {/* Pillar article (hero card) */}\n {pillar && (\n <a href={articleUrl(pillar)} className={unstyled ? '' : 'sk-cluster-pillar-card'}>\n <span className={unstyled ? '' : 'sk-cluster-pillar-label'}>\n Pillar Guide\n </span>\n <h2 className={unstyled ? '' : 'sk-cluster-pillar-title'}>\n {pillar.title}\n </h2>\n {pillar.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-pillar-excerpt'}>\n {pillar.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-pillar-meta'}>\n {readingTimeMinutes(pillar) && (\n <span>{readingTimeMinutes(pillar)} min read</span>\n )}\n {pillar.word_count && (\n <span>{pillar.word_count.toLocaleString()} words</span>\n )}\n </div>\n </a>\n )}\n\n {/* Support articles */}\n {supports.length > 0 && (\n <section className={unstyled ? '' : 'sk-cluster-supports-section'}>\n <h2 className={unstyled ? '' : 'sk-cluster-supports-title'}>\n Deep Dives\n </h2>\n <div className={unstyled ? '' : 'sk-cluster-supports-grid'}>\n {supports.map((post) => (\n <a\n key={post.id || post.slug}\n href={articleUrl(post)}\n className={unstyled ? '' : 'sk-cluster-support-card'}\n >\n <div className={unstyled ? '' : 'sk-cluster-support-card-header'}>\n {post.article_type && (\n <span className={unstyled ? '' : 'sk-cluster-support-type'}>\n {post.article_type}\n </span>\n )}\n {post.search_intent && (\n <span className={unstyled ? '' : 'sk-cluster-support-intent'}>\n {post.search_intent}\n </span>\n )}\n </div>\n <h3 className={unstyled ? '' : 'sk-cluster-support-title'}>\n {post.title}\n </h3>\n {post.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-support-excerpt'}>\n {post.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-support-meta'}>\n {readingTimeMinutes(post) && (\n <span>{readingTimeMinutes(post)} min read</span>\n )}\n {post.relationship_to_pillar && (\n <span>{post.relationship_to_pillar}</span>\n )}\n </div>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n </>\n )\n}\n"]}
@@ -1,8 +1,10 @@
1
- import { readingTimeMinutes } from '../chunk-67CHHDBL.mjs';
2
- export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts } from '../chunk-67CHHDBL.mjs';
1
+ import { readingTimeMinutes } from '../chunk-RMMHWSPP.mjs';
2
+ export { BlogLayout, BlogList, BlogPage, BlogPost, BlogPostPage, BlogSidebar, CategoryPage, ClusterNavigation, RelatedPosts } from '../chunk-RMMHWSPP.mjs';
3
3
  import '../chunk-YFX3Q56O.mjs';
4
- import { getTopicCluster } from '../chunk-DHXQBTXE.mjs';
5
- import '../chunk-CGCYZJYX.mjs';
4
+ import { getTopicCluster } from '../chunk-EEQYKMGH.mjs';
5
+ export { blogTableCss, wrapBlogTables } from '../chunk-GHECYDSZ.mjs';
6
+ import { createBlogRoutes } from '../chunk-4B4S56WJ.mjs';
7
+ export { blogCategorySlug, createBlogRoutes, resolveBlogArtwork, resolveBlogPostUrl, resolveBlogUrl } from '../chunk-4B4S56WJ.mjs';
6
8
  import '../chunk-6XNEGG5B.mjs';
7
9
  import '../chunk-BEXTDHO4.mjs';
8
10
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -108,15 +110,10 @@ var clusterLandingCss = `
108
110
  font-size: 0.75rem; color: #9ca3af;
109
111
  }
110
112
  `;
111
- function categorySlugOf(post) {
112
- const c = post?.category;
113
- if (!c) return null;
114
- if (typeof c === "string") return c;
115
- return c.slug || null;
116
- }
117
113
  async function ClusterLandingPage({
118
114
  slug,
119
- basePath = "/blog",
115
+ basePath,
116
+ routing,
120
117
  categoryInPath = false,
121
118
  unstyled = false,
122
119
  className,
@@ -131,10 +128,7 @@ async function ClusterLandingPage({
131
128
  }
132
129
  const pillar = cluster.pillar;
133
130
  const supports = cluster.supports || [];
134
- const articleUrl = (post) => {
135
- const cat = categoryInPath ? categorySlugOf(post) : null;
136
- return cat ? `${basePath}/${cat}/${post.slug}` : `${basePath}/${post.slug}`;
137
- };
131
+ const articleUrl = createBlogRoutes({ basePath, includeCategoryInPath: categoryInPath, ...routing }).post;
138
132
  return /* @__PURE__ */ jsxs(Fragment, { children: [
139
133
  !unstyled && /* @__PURE__ */ jsx("style", { dangerouslySetInnerHTML: { __html: clusterLandingCss } }),
140
134
  /* @__PURE__ */ jsxs("div", { className: `${unstyled ? "" : "sk-cluster-landing"} ${className || ""}`, children: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/blog/ClusterLandingPage.tsx"],"names":[],"mappings":";;;;;;;;;AAsBA,IAAM,iBAAA,GAAoB;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA+H1B,SAAS,eAAe,IAAA,EAAgE;AACtF,EAAA,MAAM,IAAI,IAAA,EAAM,QAAA;AAChB,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,OAAO,EAAE,IAAA,IAAQ,IAAA;AACnB;AAEA,eAAsB,kBAAA,CAAmB;AAAA,EACvC,IAAA;AAAA,EACA,QAAA,GAAW,OAAA;AAAA,EACX,cAAA,GAAiB,KAAA;AAAA,EACjB,QAAA,GAAW,KAAA;AAAA,EACX,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,IAAI,CAAA;AAE1C,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,SAAS,WAAA,EAAa,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,SAAA,EAAU,EACxE,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,sCAAwB,CAAA,EAC7B,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,QAAA,CAAS,EAAE,OAAA,EAAS,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,SAAS,OAAA,CAAQ,MAAA;AACvB,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,QAAA,IAAY,EAAC;AAEtC,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAA+C;AACjE,IAAA,MAAM,GAAA,GAAM,cAAA,GAAiB,cAAA,CAAe,IAAI,CAAA,GAAI,IAAA;AACpD,IAAA,OAAO,GAAA,GAAM,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,GAAK,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,EAC3E,CAAA;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,CAAC,4BAAY,GAAA,CAAC,OAAA,EAAA,EAAM,yBAAyB,EAAE,MAAA,EAAQ,mBAAkB,EAAG,CAAA;AAAA,oBAE7E,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,EAAG,QAAA,GAAW,KAAK,oBAAoB,CAAA,CAAA,EAAI,SAAA,IAAa,EAAE,CAAA,CAAA,EAExE,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,QAAA,EAAA,EAAO,SAAA,EAAW,QAAA,GAAW,EAAA,GAAK,iBAAA,EACjC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,QAAA,GAAW,EAAA,GAAK,yBAAyB,QAAA,EAAA,eAAA,EAEvD,CAAA;AAAA,4BACC,IAAA,EAAA,EAAG,SAAA,EAAW,WAAW,EAAA,GAAK,uBAAA,EAC5B,kBAAQ,YAAA,EACX,CAAA;AAAA,wBACA,IAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAW,QAAA,GAAW,KAAK,sBAAA,EAC3B,QAAA,EAAA;AAAA,UAAA,OAAA,CAAQ,UAAA;AAAA,UACR,OAAA,CAAQ,UAAA,GAAa,CAAA,IAAA,EAAO,OAAA,CAAQ,UAAU,CAAA,CAAA,GAAK;AAAA,SAAA,EACtD,CAAA;AAAA,wBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,GAAW,KAAK,sBAAA,EAC9B,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,OAAA,CAAQ,aAAA;AAAA,YAAc;AAAA,WAAA,EAAS,CAAA;AAAA,UACrC,OAAA,CAAQ,UAAA,oBAAc,GAAA,CAAC,MAAA,EAAA,EAAM,kBAAQ,UAAA,EAAW;AAAA,SAAA,EACnD;AAAA,OAAA,EACF,CAAA;AAAA,MAGC,MAAA,oBACC,IAAA,CAAC,GAAA,EAAA,EAAE,IAAA,EAAM,UAAA,CAAW,MAAM,CAAA,EAAG,SAAA,EAAW,QAAA,GAAW,EAAA,GAAK,wBAAA,EACtD,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,QAAA,GAAW,EAAA,GAAK,2BAA2B,QAAA,EAAA,cAAA,EAE5D,CAAA;AAAA,4BACC,IAAA,EAAA,EAAG,SAAA,EAAW,WAAW,EAAA,GAAK,yBAAA,EAC5B,iBAAO,KAAA,EACV,CAAA;AAAA,QACC,MAAA,CAAO,2BACN,GAAA,CAAC,GAAA,EAAA,EAAE,WAAW,QAAA,GAAW,EAAA,GAAK,2BAAA,EAC3B,QAAA,EAAA,MAAA,CAAO,OAAA,EACV,CAAA;AAAA,wBAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,GAAW,KAAK,wBAAA,EAC7B,QAAA,EAAA;AAAA,UAAA,kBAAA,CAAmB,MAAM,CAAA,oBACxB,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,YAAE;AAAA,WAAA,EAAS,CAAA;AAAA,UAE5C,MAAA,CAAO,UAAA,oBACN,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,YAAA,MAAA,CAAO,WAAW,cAAA,EAAe;AAAA,YAAE;AAAA,WAAA,EAAM;AAAA,SAAA,EAEpD;AAAA,OAAA,EACF,CAAA;AAAA,MAID,QAAA,CAAS,SAAS,CAAA,oBACjB,IAAA,CAAC,aAAQ,SAAA,EAAW,QAAA,GAAW,KAAK,6BAAA,EAClC,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAW,QAAA,GAAW,EAAA,GAAK,6BAA6B,QAAA,EAAA,YAAA,EAE5D,CAAA;AAAA,wBACA,GAAA,CAAC,SAAI,SAAA,EAAW,QAAA,GAAW,KAAK,0BAAA,EAC7B,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,IAAA,qBACb,IAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YAEC,IAAA,EAAM,WAAW,IAAI,CAAA;AAAA,YACrB,SAAA,EAAW,WAAW,EAAA,GAAK,yBAAA;AAAA,YAE3B,QAAA,EAAA;AAAA,8BAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,GAAW,EAAA,GAAK,gCAAA,EAC7B,QAAA,EAAA;AAAA,gBAAA,IAAA,CAAK,YAAA,wBACH,MAAA,EAAA,EAAK,SAAA,EAAW,WAAW,EAAA,GAAK,yBAAA,EAC9B,eAAK,YAAA,EACR,CAAA;AAAA,gBAED,IAAA,CAAK,iCACJ,GAAA,CAAC,MAAA,EAAA,EAAK,WAAW,QAAA,GAAW,EAAA,GAAK,2BAAA,EAC9B,QAAA,EAAA,IAAA,CAAK,aAAA,EACR;AAAA,eAAA,EAEJ,CAAA;AAAA,kCACC,IAAA,EAAA,EAAG,SAAA,EAAW,WAAW,EAAA,GAAK,0BAAA,EAC5B,eAAK,KAAA,EACR,CAAA;AAAA,cACC,IAAA,CAAK,2BACJ,GAAA,CAAC,GAAA,EAAA,EAAE,WAAW,QAAA,GAAW,EAAA,GAAK,4BAAA,EAC3B,QAAA,EAAA,IAAA,CAAK,OAAA,EACR,CAAA;AAAA,8BAEF,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,QAAA,GAAW,KAAK,yBAAA,EAC7B,QAAA,EAAA;AAAA,gBAAA,kBAAA,CAAmB,IAAI,CAAA,oBACtB,IAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA;AAAA,kBAAA,kBAAA,CAAmB,IAAI,CAAA;AAAA,kBAAE;AAAA,iBAAA,EAAS,CAAA;AAAA,gBAE1C,IAAA,CAAK,sBAAA,oBACJ,GAAA,CAAC,MAAA,EAAA,EAAM,eAAK,sBAAA,EAAuB;AAAA,eAAA,EAEvC;AAAA;AAAA,WAAA;AAAA,UA/BK,IAAA,CAAK,MAAM,IAAA,CAAK;AAAA,SAiCxB,CAAA,EACH;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ","file":"server-ui.mjs","sourcesContent":["/**\n * @sonordev/site-kit/blog - Cluster Landing Page Component\n *\n * Pre-built page component for `/blog/cluster/[slug]` routes.\n * Renders a topic cluster overview with:\n * - Cluster hero (name, topic, description)\n * - Pillar article (featured, large card)\n * - Support articles (grid, categorized by article_type or funnel_stage)\n *\n * Server component — fetches cluster data from Portal API.\n * Ships with `.sk-cluster-landing-*` scoped styles.\n */\n\nimport React from 'react'\nimport { getTopicCluster } from './server-core'\nimport type { TopicCluster, BlogPost } from './types'\nimport { readingTimeMinutes } from './reading-time'\n\n// ============================================================================\n// CSS\n// ============================================================================\n\nconst clusterLandingCss = `\n.sk-cluster-landing { max-width: 72rem; margin: 0 auto; padding: 2rem 1rem; }\n\n.sk-cluster-hero { margin-bottom: 3rem; text-align: center; }\n.sk-cluster-hero-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.75rem; font-weight: 600; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n}\n.sk-cluster-hero-title {\n font-size: 2.25rem; font-weight: 800; color: #111827;\n line-height: 1.2; margin: 0 0 0.75rem 0;\n}\n.sk-cluster-hero-desc {\n font-size: 1.125rem; color: #6b7280; max-width: 40rem;\n margin: 0 auto; line-height: 1.6;\n}\n.sk-cluster-hero-meta {\n display: flex; justify-content: center; gap: 1.5rem;\n margin-top: 1rem; font-size: 0.875rem; color: #9ca3af;\n}\n\n.sk-cluster-pillar-card {\n display: block; text-decoration: none; color: inherit;\n padding: 2rem; border-radius: 0.75rem;\n background: linear-gradient(135deg, rgba(99,102,241,0.04), rgba(99,102,241,0.01));\n border: 2px solid rgba(99,102,241,0.2);\n margin-bottom: 3rem; transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-pillar-card:hover {\n border-color: rgba(99,102,241,0.4);\n box-shadow: 0 4px 24px rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.6875rem; font-weight: 700; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n padding: 0.25rem 0.5rem; border-radius: 9999px;\n background: rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-title {\n font-size: 1.5rem; font-weight: 700; color: #111827;\n margin: 0 0 0.5rem 0; line-height: 1.3;\n}\n.sk-cluster-pillar-excerpt {\n font-size: 1rem; color: #6b7280; line-height: 1.6;\n margin: 0 0 1rem 0;\n}\n.sk-cluster-pillar-meta {\n display: flex; gap: 1rem; font-size: 0.8125rem; color: #9ca3af;\n}\n\n.sk-cluster-supports-section { margin-bottom: 2rem; }\n.sk-cluster-supports-title {\n font-size: 1.25rem; font-weight: 700; color: #111827;\n margin: 0 0 1.25rem 0;\n}\n.sk-cluster-supports-grid {\n display: grid; gap: 1.25rem;\n grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));\n}\n.sk-cluster-support-card {\n display: block; text-decoration: none; color: inherit;\n padding: 1.25rem; border-radius: 0.5rem;\n border: 1px solid #e5e7eb; background: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-support-card:hover {\n border-color: #c7d2fe;\n box-shadow: 0 2px 12px rgba(0,0,0,0.04);\n}\n.sk-cluster-support-card-header {\n display: flex; align-items: center; gap: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.sk-cluster-support-type {\n display: inline-flex; align-items: center;\n padding: 0.125rem 0.375rem; border-radius: 9999px;\n font-size: 0.6875rem; font-weight: 500;\n background: rgba(99,102,241,0.06); color: #6366f1;\n border: 1px solid rgba(99,102,241,0.12);\n text-transform: capitalize;\n}\n.sk-cluster-support-intent {\n font-size: 0.6875rem; color: #9ca3af;\n text-transform: capitalize;\n}\n.sk-cluster-support-title {\n font-size: 1rem; font-weight: 600; color: #111827;\n margin: 0 0 0.375rem 0; line-height: 1.4;\n}\n.sk-cluster-support-excerpt {\n font-size: 0.875rem; color: #6b7280; line-height: 1.5;\n margin: 0; display: -webkit-box; -webkit-line-clamp: 2;\n -webkit-box-orient: vertical; overflow: hidden;\n}\n.sk-cluster-support-meta {\n display: flex; gap: 0.75rem; margin-top: 0.75rem;\n font-size: 0.75rem; color: #9ca3af;\n}\n`\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport interface ClusterLandingPageProps {\n /** Cluster slug to fetch */\n slug: string\n /** Base path for blog URLs (default: /blog) */\n basePath?: string\n /**\n * Include each article's own category segment in its URL:\n * {basePath}/{category}/{slug}. Enable on sites whose blog routes are\n * category-segmented (e.g. upforge.io /insights/{category}/{slug}) —\n * without it, links point at {basePath}/{slug} and 404 on such sites.\n */\n categoryInPath?: boolean\n /** Disable default styles */\n unstyled?: boolean\n /** Custom class name */\n className?: string\n /** Render prop for full data access */\n children?: (props: { cluster: TopicCluster }) => React.ReactNode\n}\n\n/** Category slug of a post — handles both string and object category shapes. */\nfunction categorySlugOf(post: { category?: unknown } | null | undefined): string | null {\n const c = post?.category as { slug?: string } | string | undefined\n if (!c) return null\n if (typeof c === 'string') return c\n return c.slug || null\n}\n\nexport async function ClusterLandingPage({\n slug,\n basePath = '/blog',\n categoryInPath = false,\n unstyled = false,\n className,\n children,\n}: ClusterLandingPageProps) {\n const cluster = await getTopicCluster(slug)\n\n if (!cluster) {\n return (\n <div style={{ padding: '4rem 1rem', textAlign: 'center', color: '#6b7280' }}>\n <p>Topic cluster not found.</p>\n </div>\n )\n }\n\n // Custom render\n if (children) {\n return children({ cluster })\n }\n\n const pillar = cluster.pillar\n const supports = cluster.supports || []\n\n const articleUrl = (post: { slug: string; category?: unknown }) => {\n const cat = categoryInPath ? categorySlugOf(post) : null\n return cat ? `${basePath}/${cat}/${post.slug}` : `${basePath}/${post.slug}`\n }\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: clusterLandingCss }} />}\n\n <div className={`${unstyled ? '' : 'sk-cluster-landing'} ${className || ''}`}>\n {/* Hero */}\n <header className={unstyled ? '' : 'sk-cluster-hero'}>\n <p className={unstyled ? '' : 'sk-cluster-hero-label'}>\n Topic Cluster\n </p>\n <h1 className={unstyled ? '' : 'sk-cluster-hero-title'}>\n {cluster.cluster_name}\n </h1>\n <p className={unstyled ? '' : 'sk-cluster-hero-desc'}>\n {cluster.core_topic}\n {cluster.geo_target ? ` in ${cluster.geo_target}` : ''}\n </p>\n <div className={unstyled ? '' : 'sk-cluster-hero-meta'}>\n <span>{cluster.article_count} articles</span>\n {cluster.geo_target && <span>{cluster.geo_target}</span>}\n </div>\n </header>\n\n {/* Pillar article (hero card) */}\n {pillar && (\n <a href={articleUrl(pillar)} className={unstyled ? '' : 'sk-cluster-pillar-card'}>\n <span className={unstyled ? '' : 'sk-cluster-pillar-label'}>\n Pillar Guide\n </span>\n <h2 className={unstyled ? '' : 'sk-cluster-pillar-title'}>\n {pillar.title}\n </h2>\n {pillar.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-pillar-excerpt'}>\n {pillar.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-pillar-meta'}>\n {readingTimeMinutes(pillar) && (\n <span>{readingTimeMinutes(pillar)} min read</span>\n )}\n {pillar.word_count && (\n <span>{pillar.word_count.toLocaleString()} words</span>\n )}\n </div>\n </a>\n )}\n\n {/* Support articles */}\n {supports.length > 0 && (\n <section className={unstyled ? '' : 'sk-cluster-supports-section'}>\n <h2 className={unstyled ? '' : 'sk-cluster-supports-title'}>\n Deep Dives\n </h2>\n <div className={unstyled ? '' : 'sk-cluster-supports-grid'}>\n {supports.map((post) => (\n <a\n key={post.id || post.slug}\n href={articleUrl(post)}\n className={unstyled ? '' : 'sk-cluster-support-card'}\n >\n <div className={unstyled ? '' : 'sk-cluster-support-card-header'}>\n {post.article_type && (\n <span className={unstyled ? '' : 'sk-cluster-support-type'}>\n {post.article_type}\n </span>\n )}\n {post.search_intent && (\n <span className={unstyled ? '' : 'sk-cluster-support-intent'}>\n {post.search_intent}\n </span>\n )}\n </div>\n <h3 className={unstyled ? '' : 'sk-cluster-support-title'}>\n {post.title}\n </h3>\n {post.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-support-excerpt'}>\n {post.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-support-meta'}>\n {readingTimeMinutes(post) && (\n <span>{readingTimeMinutes(post)} min read</span>\n )}\n {post.relationship_to_pillar && (\n <span>{post.relationship_to_pillar}</span>\n )}\n </div>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n </>\n )\n}\n"]}
1
+ {"version":3,"sources":["../../src/blog/ClusterLandingPage.tsx"],"names":[],"mappings":"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","file":"server-ui.mjs","sourcesContent":["/**\n * @sonordev/site-kit/blog - Cluster Landing Page Component\n *\n * Pre-built page component for `/blog/cluster/[slug]` routes.\n * Renders a topic cluster overview with:\n * - Cluster hero (name, topic, description)\n * - Pillar article (featured, large card)\n * - Support articles (grid, categorized by article_type or funnel_stage)\n *\n * Server component — fetches cluster data from Portal API.\n * Ships with `.sk-cluster-landing-*` scoped styles.\n */\n\nimport React from 'react'\nimport { createBlogRoutes, type BlogRoutingOptions } from './routes'\nimport { getTopicCluster } from './server-core'\nimport type { TopicCluster, BlogPost } from './types'\nimport { readingTimeMinutes } from './reading-time'\n\n// ============================================================================\n// CSS\n// ============================================================================\n\nconst clusterLandingCss = `\n.sk-cluster-landing { max-width: 72rem; margin: 0 auto; padding: 2rem 1rem; }\n\n.sk-cluster-hero { margin-bottom: 3rem; text-align: center; }\n.sk-cluster-hero-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.75rem; font-weight: 600; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n}\n.sk-cluster-hero-title {\n font-size: 2.25rem; font-weight: 800; color: #111827;\n line-height: 1.2; margin: 0 0 0.75rem 0;\n}\n.sk-cluster-hero-desc {\n font-size: 1.125rem; color: #6b7280; max-width: 40rem;\n margin: 0 auto; line-height: 1.6;\n}\n.sk-cluster-hero-meta {\n display: flex; justify-content: center; gap: 1.5rem;\n margin-top: 1rem; font-size: 0.875rem; color: #9ca3af;\n}\n\n.sk-cluster-pillar-card {\n display: block; text-decoration: none; color: inherit;\n padding: 2rem; border-radius: 0.75rem;\n background: linear-gradient(135deg, rgba(99,102,241,0.04), rgba(99,102,241,0.01));\n border: 2px solid rgba(99,102,241,0.2);\n margin-bottom: 3rem; transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-pillar-card:hover {\n border-color: rgba(99,102,241,0.4);\n box-shadow: 0 4px 24px rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-label {\n display: inline-flex; align-items: center; gap: 0.375rem;\n font-size: 0.6875rem; font-weight: 700; text-transform: uppercase;\n letter-spacing: 0.05em; color: #6366f1; margin-bottom: 0.75rem;\n padding: 0.25rem 0.5rem; border-radius: 9999px;\n background: rgba(99,102,241,0.08);\n}\n.sk-cluster-pillar-title {\n font-size: 1.5rem; font-weight: 700; color: #111827;\n margin: 0 0 0.5rem 0; line-height: 1.3;\n}\n.sk-cluster-pillar-excerpt {\n font-size: 1rem; color: #6b7280; line-height: 1.6;\n margin: 0 0 1rem 0;\n}\n.sk-cluster-pillar-meta {\n display: flex; gap: 1rem; font-size: 0.8125rem; color: #9ca3af;\n}\n\n.sk-cluster-supports-section { margin-bottom: 2rem; }\n.sk-cluster-supports-title {\n font-size: 1.25rem; font-weight: 700; color: #111827;\n margin: 0 0 1.25rem 0;\n}\n.sk-cluster-supports-grid {\n display: grid; gap: 1.25rem;\n grid-template-columns: repeat(auto-fill, minmax(20rem, 1fr));\n}\n.sk-cluster-support-card {\n display: block; text-decoration: none; color: inherit;\n padding: 1.25rem; border-radius: 0.5rem;\n border: 1px solid #e5e7eb; background: #fff;\n transition: border-color 0.2s, box-shadow 0.2s;\n}\n.sk-cluster-support-card:hover {\n border-color: #c7d2fe;\n box-shadow: 0 2px 12px rgba(0,0,0,0.04);\n}\n.sk-cluster-support-card-header {\n display: flex; align-items: center; gap: 0.5rem;\n margin-bottom: 0.5rem;\n}\n.sk-cluster-support-type {\n display: inline-flex; align-items: center;\n padding: 0.125rem 0.375rem; border-radius: 9999px;\n font-size: 0.6875rem; font-weight: 500;\n background: rgba(99,102,241,0.06); color: #6366f1;\n border: 1px solid rgba(99,102,241,0.12);\n text-transform: capitalize;\n}\n.sk-cluster-support-intent {\n font-size: 0.6875rem; color: #9ca3af;\n text-transform: capitalize;\n}\n.sk-cluster-support-title {\n font-size: 1rem; font-weight: 600; color: #111827;\n margin: 0 0 0.375rem 0; line-height: 1.4;\n}\n.sk-cluster-support-excerpt {\n font-size: 0.875rem; color: #6b7280; line-height: 1.5;\n margin: 0; display: -webkit-box; -webkit-line-clamp: 2;\n -webkit-box-orient: vertical; overflow: hidden;\n}\n.sk-cluster-support-meta {\n display: flex; gap: 0.75rem; margin-top: 0.75rem;\n font-size: 0.75rem; color: #9ca3af;\n}\n`\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport interface ClusterLandingPageProps {\n /** Cluster slug to fetch */\n slug: string\n /** Base path for blog URLs (default: /blog) */\n basePath?: string\n routing?: BlogRoutingOptions\n /**\n * Include each article's own category segment in its URL:\n * {basePath}/{category}/{slug}. Enable on sites whose blog routes are\n * category-segmented (e.g. upforge.io /insights/{category}/{slug}) —\n * without it, links point at {basePath}/{slug} and 404 on such sites.\n */\n categoryInPath?: boolean\n /** Disable default styles */\n unstyled?: boolean\n /** Custom class name */\n className?: string\n /** Render prop for full data access */\n children?: (props: { cluster: TopicCluster }) => React.ReactNode\n}\n\nexport async function ClusterLandingPage({\n slug,\n basePath,\n routing,\n categoryInPath = false,\n unstyled = false,\n className,\n children,\n}: ClusterLandingPageProps) {\n const cluster = await getTopicCluster(slug)\n\n if (!cluster) {\n return (\n <div style={{ padding: '4rem 1rem', textAlign: 'center', color: '#6b7280' }}>\n <p>Topic cluster not found.</p>\n </div>\n )\n }\n\n // Custom render\n if (children) {\n return children({ cluster })\n }\n\n const pillar = cluster.pillar\n const supports = cluster.supports || []\n\n const articleUrl = createBlogRoutes({ basePath, includeCategoryInPath: categoryInPath, ...routing }).post\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: clusterLandingCss }} />}\n\n <div className={`${unstyled ? '' : 'sk-cluster-landing'} ${className || ''}`}>\n {/* Hero */}\n <header className={unstyled ? '' : 'sk-cluster-hero'}>\n <p className={unstyled ? '' : 'sk-cluster-hero-label'}>\n Topic Cluster\n </p>\n <h1 className={unstyled ? '' : 'sk-cluster-hero-title'}>\n {cluster.cluster_name}\n </h1>\n <p className={unstyled ? '' : 'sk-cluster-hero-desc'}>\n {cluster.core_topic}\n {cluster.geo_target ? ` in ${cluster.geo_target}` : ''}\n </p>\n <div className={unstyled ? '' : 'sk-cluster-hero-meta'}>\n <span>{cluster.article_count} articles</span>\n {cluster.geo_target && <span>{cluster.geo_target}</span>}\n </div>\n </header>\n\n {/* Pillar article (hero card) */}\n {pillar && (\n <a href={articleUrl(pillar)} className={unstyled ? '' : 'sk-cluster-pillar-card'}>\n <span className={unstyled ? '' : 'sk-cluster-pillar-label'}>\n Pillar Guide\n </span>\n <h2 className={unstyled ? '' : 'sk-cluster-pillar-title'}>\n {pillar.title}\n </h2>\n {pillar.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-pillar-excerpt'}>\n {pillar.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-pillar-meta'}>\n {readingTimeMinutes(pillar) && (\n <span>{readingTimeMinutes(pillar)} min read</span>\n )}\n {pillar.word_count && (\n <span>{pillar.word_count.toLocaleString()} words</span>\n )}\n </div>\n </a>\n )}\n\n {/* Support articles */}\n {supports.length > 0 && (\n <section className={unstyled ? '' : 'sk-cluster-supports-section'}>\n <h2 className={unstyled ? '' : 'sk-cluster-supports-title'}>\n Deep Dives\n </h2>\n <div className={unstyled ? '' : 'sk-cluster-supports-grid'}>\n {supports.map((post) => (\n <a\n key={post.id || post.slug}\n href={articleUrl(post)}\n className={unstyled ? '' : 'sk-cluster-support-card'}\n >\n <div className={unstyled ? '' : 'sk-cluster-support-card-header'}>\n {post.article_type && (\n <span className={unstyled ? '' : 'sk-cluster-support-type'}>\n {post.article_type}\n </span>\n )}\n {post.search_intent && (\n <span className={unstyled ? '' : 'sk-cluster-support-intent'}>\n {post.search_intent}\n </span>\n )}\n </div>\n <h3 className={unstyled ? '' : 'sk-cluster-support-title'}>\n {post.title}\n </h3>\n {post.excerpt && (\n <p className={unstyled ? '' : 'sk-cluster-support-excerpt'}>\n {post.excerpt}\n </p>\n )}\n <div className={unstyled ? '' : 'sk-cluster-support-meta'}>\n {readingTimeMinutes(post) && (\n <span>{readingTimeMinutes(post)} min read</span>\n )}\n {post.relationship_to_pillar && (\n <span>{post.relationship_to_pillar}</span>\n )}\n </div>\n </a>\n ))}\n </div>\n </section>\n )}\n </div>\n </>\n )\n}\n"]}
@@ -8,6 +8,7 @@
8
8
  import type { Metadata } from 'next';
9
9
  import type { BlogPost as BlogPostRecord, BlogAuthor, TopicCluster, ClusterNavigation } from './types';
10
10
  import { sanitizeExcerpt } from './excerpt';
11
+ import { type BlogRoutingOptions } from './routes';
11
12
  export { sanitizeExcerpt };
12
13
  export declare const SEO_LIMITS: {
13
14
  readonly title: {
@@ -79,7 +80,7 @@ export declare function getBlogCategories(): Promise<{
79
80
  slug: string;
80
81
  post_count: number;
81
82
  }[]>;
82
- interface BlogMetadataOptions {
83
+ export interface BlogMetadataOptions extends BlogRoutingOptions {
83
84
  /** Site name for og:site_name */
84
85
  siteName?: string;
85
86
  /** Base URL of the site */
@@ -112,8 +113,9 @@ export declare function generateBlogCategoryMetadata(categoryName: string, optio
112
113
  * Generate static params for blog post pages
113
114
  * Usage: export const generateStaticParams = generateBlogStaticParams
114
115
  */
115
- export declare function generateBlogStaticParams(): Promise<{
116
+ export declare function generateBlogStaticParams(options?: BlogRoutingOptions): Promise<{
116
117
  slug: string;
118
+ category?: string;
117
119
  }[]>;
118
120
  /**
119
121
  * Generate static params for category pages
@@ -131,11 +133,15 @@ interface SitemapEntry {
131
133
  /**
132
134
  * Generate sitemap entries for blog posts
133
135
  */
134
- export declare function generateBlogSitemap(siteUrl: string): Promise<SitemapEntry[]>;
136
+ export interface BlogSitemapOptions extends BlogRoutingOptions {
137
+ includeCategories?: boolean;
138
+ includeClusters?: boolean;
139
+ }
140
+ export declare function generateBlogSitemap(siteUrl: string, options?: BlogSitemapOptions): Promise<SitemapEntry[]>;
135
141
  /**
136
142
  * Generate JSON-LD schema for a blog post
137
143
  */
138
- export declare function generateBlogPostSchema(post: BlogPostRecord, options?: {
144
+ export declare function generateBlogPostSchema(post: BlogPostRecord, options?: BlogRoutingOptions & {
139
145
  siteUrl?: string;
140
146
  siteName?: string;
141
147
  logoUrl?: string;
@@ -143,7 +149,7 @@ export declare function generateBlogPostSchema(post: BlogPostRecord, options?: {
143
149
  /**
144
150
  * Generate JSON-LD schema for blog index/listing page
145
151
  */
146
- export declare function generateBlogListSchema(options?: {
152
+ export declare function generateBlogListSchema(options?: BlogRoutingOptions & {
147
153
  siteUrl?: string;
148
154
  siteName?: string;
149
155
  description?: string;
@@ -164,10 +170,10 @@ export interface HowToStep {
164
170
  /**
165
171
  * Generate HowTo schema for step-by-step posts
166
172
  */
167
- export declare function generateHowToSchema(post: BlogPostRecord, steps: HowToStep[], options?: {
173
+ export declare function generateHowToSchema(post: BlogPostRecord, steps: HowToStep[], options?: BlogRoutingOptions & {
168
174
  siteUrl?: string;
169
175
  }): object;
170
- interface RssFeedOptions {
176
+ export interface RssFeedOptions extends BlogRoutingOptions {
171
177
  siteUrl: string;
172
178
  siteName: string;
173
179
  description?: string;
@@ -185,7 +191,9 @@ interface RssFeedOptions {
185
191
  * controller reads — accumulating up to FEED_MAX_POSTS. A mid-loop failure
186
192
  * returns what was accumulated so far: a partial feed beats an empty one.
187
193
  */
188
- export declare function getAllBlogPosts(): Promise<BlogPostRecord[]>;
194
+ export declare function getAllBlogPosts(options?: {
195
+ maxPosts?: number;
196
+ }): Promise<BlogPostRecord[]>;
189
197
  /**
190
198
  * Generate RSS 2.0 feed XML
191
199
  */
@@ -229,18 +237,16 @@ export declare function getPostsByCategory(categorySlug: string): Promise<BlogPo
229
237
  * Generate ItemList schema for a cluster's pillar page.
230
238
  * Wraps supporting posts as a structured list Google can parse.
231
239
  */
232
- export declare function generateClusterItemListSchema(cluster: TopicCluster, options?: {
240
+ export declare function generateClusterItemListSchema(cluster: TopicCluster, options?: BlogRoutingOptions & {
233
241
  siteUrl?: string;
234
- basePath?: string;
235
242
  }): object;
236
243
  /**
237
244
  * Generate Article schema with cluster relationship (isPartOf / hasPart).
238
245
  * - Support articles get `isPartOf` pointing to the pillar.
239
246
  * - Pillar articles get `hasPart` listing all supports.
240
247
  */
241
- export declare function generateClusterArticleSchema(post: BlogPostRecord, cluster: TopicCluster, options?: {
248
+ export declare function generateClusterArticleSchema(post: BlogPostRecord, cluster: TopicCluster, options?: BlogRoutingOptions & {
242
249
  siteUrl?: string;
243
- basePath?: string;
244
250
  siteName?: string;
245
251
  logoUrl?: string;
246
252
  }): object;
@@ -248,26 +254,23 @@ export declare function generateClusterArticleSchema(post: BlogPostRecord, clust
248
254
  * Generate BreadcrumbList schema for a cluster-linked post.
249
255
  * Path: Home > Blog > Cluster > Article
250
256
  */
251
- export declare function generateClusterBreadcrumbSchema(post: BlogPostRecord, cluster: TopicCluster, options?: {
257
+ export declare function generateClusterBreadcrumbSchema(post: BlogPostRecord, cluster: TopicCluster, options?: BlogRoutingOptions & {
252
258
  siteUrl?: string;
253
259
  siteName?: string;
254
- basePath?: string;
255
260
  }): object;
256
261
  /**
257
262
  * Generate CollectionPage schema for a cluster landing page.
258
263
  */
259
- export declare function generateClusterLandingSchema(cluster: TopicCluster, options?: {
264
+ export declare function generateClusterLandingSchema(cluster: TopicCluster, options?: BlogRoutingOptions & {
260
265
  siteUrl?: string;
261
- basePath?: string;
262
266
  siteName?: string;
263
267
  }): object;
264
268
  /**
265
269
  * Generate metadata for a cluster landing page (Next.js generateMetadata).
266
270
  */
267
- export declare function generateClusterPageMetadata(clusterSlug: string, options?: {
271
+ export declare function generateClusterPageMetadata(clusterSlug: string, options?: BlogRoutingOptions & {
268
272
  siteName?: string;
269
273
  siteUrl?: string;
270
- basePath?: string;
271
274
  }): Promise<{
272
275
  title?: undefined;
273
276
  description?: undefined;
@@ -292,7 +295,7 @@ export declare function getRelatedInsights(currentSlug: string, options?: {
292
295
  /**
293
296
  * Generate BreadcrumbList schema for blog navigation
294
297
  */
295
- export declare function generateBreadcrumbSchema(post: BlogPostRecord, options?: {
298
+ export declare function generateBreadcrumbSchema(post: BlogPostRecord, options?: BlogRoutingOptions & {
296
299
  siteUrl?: string;
297
300
  siteName?: string;
298
301
  }): object;
@@ -301,7 +304,7 @@ export declare function generateBreadcrumbSchema(post: BlogPostRecord, options?:
301
304
  * This is the recommended way to include multiple schemas.
302
305
  * When post has E-E-A-T schema (post.schema), use it instead of generating Article/FAQ.
303
306
  */
304
- export declare function generateAllBlogSchemas(post: BlogPostRecord, options?: {
307
+ export declare function generateAllBlogSchemas(post: BlogPostRecord, options?: BlogRoutingOptions & {
305
308
  siteUrl?: string;
306
309
  siteName?: string;
307
310
  logoUrl?: string;
@@ -340,7 +343,7 @@ export declare function generateAuthorStaticParams(): Promise<{
340
343
  /**
341
344
  * Generate Next.js Metadata for an author page
342
345
  */
343
- export declare function generateAuthorPageMetadata(author: BlogAuthor, options?: {
346
+ export declare function generateAuthorPageMetadata(author: BlogAuthor, options?: BlogRoutingOptions & {
344
347
  siteUrl?: string;
345
348
  siteName?: string;
346
349
  }): Metadata;
@@ -356,4 +359,8 @@ export declare function generateAuthorPageMetadata(author: BlogAuthor, options?:
356
359
  export { generateAuthorSchema } from './author-schema';
357
360
  /** Portal blog post document shape (alias of `BlogPost` from `./types`) */
358
361
  export type { BlogPost as BlogPostRecord } from './types';
362
+ export { blogCategorySlug, createBlogRoutes, resolveBlogPostUrl, resolveBlogUrl } from './routes';
363
+ export type { BlogRoutePost, BlogRoutingOptions } from './routes';
364
+ export { resolveBlogArtwork } from './artwork';
365
+ export { wrapBlogTables, blogTableCss } from './blog-tables';
359
366
  //# sourceMappingURL=server-core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-core.d.ts","sourceRoot":"","sources":["../../src/blog/server-core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server-core.d.ts","sourceRoot":"","sources":["../../src/blog/server-core.ts"],"names":[],"mappings":"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"}