@sonordev/site-kit 5.8.2 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (545) hide show
  1. package/README.md +11 -11
  2. package/agent-manifest.json +22 -11
  3. package/dist/{AnalyticsProvider-LUEUDZZC.mjs → AnalyticsProvider-6QVM2B6O.mjs} +6 -6
  4. package/dist/{AnalyticsProvider-LUEUDZZC.mjs.map → AnalyticsProvider-6QVM2B6O.mjs.map} +1 -1
  5. package/dist/{AnalyticsProvider-4JV3OFCG.js → AnalyticsProvider-AZQXLRWN.js} +10 -10
  6. package/dist/{AnalyticsProvider-4JV3OFCG.js.map → AnalyticsProvider-AZQXLRWN.js.map} +1 -1
  7. package/dist/ArticleFaqSection-3KZ24MFS.js +13 -0
  8. package/dist/ArticleFaqSection-3KZ24MFS.js.map +1 -0
  9. package/dist/ArticleFaqSection-XZPXJVH4.mjs +11 -0
  10. package/dist/ArticleFaqSection-XZPXJVH4.mjs.map +1 -0
  11. package/dist/{BlogViewTracker-YQMTEGYZ.mjs → ArticleViewTracker-AEWJMXQQ.mjs} +13 -13
  12. package/dist/ArticleViewTracker-AEWJMXQQ.mjs.map +1 -0
  13. package/dist/{BlogViewTracker-32C4SCHA.js → ArticleViewTracker-CFBTQ46B.js} +16 -16
  14. package/dist/ArticleViewTracker-CFBTQ46B.js.map +1 -0
  15. package/dist/ChatWidget-6626OPXO.mjs +15 -0
  16. package/dist/{ChatWidget-IRTAMRQS.mjs.map → ChatWidget-6626OPXO.mjs.map} +1 -1
  17. package/dist/ChatWidget-U24AYLXF.js +24 -0
  18. package/dist/{ChatWidget-KCXQXNUF.js.map → ChatWidget-U24AYLXF.js.map} +1 -1
  19. package/dist/EngageWidget-TR47W2ZI.mjs +12 -0
  20. package/dist/{EngageWidget-7AIUJRXV.mjs.map → EngageWidget-TR47W2ZI.mjs.map} +1 -1
  21. package/dist/EngageWidget-XUTDFRF3.js +21 -0
  22. package/dist/{EngageWidget-EUUZHQOU.js.map → EngageWidget-XUTDFRF3.js.map} +1 -1
  23. package/dist/{FileField-XJYJO5HE.mjs → FileField-DNNC5IPS.mjs} +5 -5
  24. package/dist/{FileField-XJYJO5HE.mjs.map → FileField-DNNC5IPS.mjs.map} +1 -1
  25. package/dist/{FileField-SNI5XCHQ.js → FileField-R4RQG77G.js} +6 -6
  26. package/dist/{FileField-SNI5XCHQ.js.map → FileField-R4RQG77G.js.map} +1 -1
  27. package/dist/{FormSpotlight-S64G4CMM.js → FormSpotlight-7ILRAD3W.js} +9 -9
  28. package/dist/{FormSpotlight-S64G4CMM.js.map → FormSpotlight-7ILRAD3W.js.map} +1 -1
  29. package/dist/{FormSpotlight-BCXI4A4R.mjs → FormSpotlight-MXY4I46H.mjs} +3 -3
  30. package/dist/{FormSpotlight-BCXI4A4R.mjs.map → FormSpotlight-MXY4I46H.mjs.map} +1 -1
  31. package/dist/{FormStage-PX5TVY25.js → FormStage-CVD3I3SE.js} +9 -9
  32. package/dist/{FormStage-PX5TVY25.js.map → FormStage-CVD3I3SE.js.map} +1 -1
  33. package/dist/{FormStage-RHARCSPS.mjs → FormStage-FDJGRGEU.mjs} +3 -3
  34. package/dist/{FormStage-RHARCSPS.mjs.map → FormStage-FDJGRGEU.mjs.map} +1 -1
  35. package/dist/ManagedForm-5675CLWS.mjs +16 -0
  36. package/dist/{ManagedForm-7IDXBQS6.mjs.map → ManagedForm-5675CLWS.mjs.map} +1 -1
  37. package/dist/ManagedForm-KYIK54SL.js +25 -0
  38. package/dist/{ManagedForm-RI2TSUZD.js.map → ManagedForm-KYIK54SL.js.map} +1 -1
  39. package/dist/{ManagedNewsletterForm-UXBJ5OJB.mjs → ManagedNewsletterForm-DFLDGNQU.mjs} +11 -11
  40. package/dist/ManagedNewsletterForm-DFLDGNQU.mjs.map +1 -0
  41. package/dist/{ManagedNewsletterForm-IAGIHBNT.js → ManagedNewsletterForm-IH3MRJOD.js} +13 -13
  42. package/dist/ManagedNewsletterForm-IH3MRJOD.js.map +1 -0
  43. package/dist/{SignalCore-Q2BQMPCJ.js → SignalCore-6LYIZFXK.js} +11 -11
  44. package/dist/{SignalCore-Q2BQMPCJ.js.map → SignalCore-6LYIZFXK.js.map} +1 -1
  45. package/dist/{SignalCore-37WGILFY.mjs → SignalCore-ZH3R6XD3.mjs} +5 -5
  46. package/dist/{SignalCore-37WGILFY.mjs.map → SignalCore-ZH3R6XD3.mjs.map} +1 -1
  47. package/dist/SitemapSync-PKBXWVI6.mjs +9 -0
  48. package/dist/{SitemapSync-YIAI7PMT.mjs.map → SitemapSync-PKBXWVI6.mjs.map} +1 -1
  49. package/dist/SitemapSync-PZ76V5MX.js +18 -0
  50. package/dist/{SitemapSync-DWEL7HTB.js.map → SitemapSync-PZ76V5MX.js.map} +1 -1
  51. package/dist/analytics/index.js +9 -9
  52. package/dist/analytics/index.mjs +4 -4
  53. package/dist/{blog-styles-7AKRUMV7.mjs → article-styles-DACUAOVT.mjs} +124 -124
  54. package/dist/article-styles-DACUAOVT.mjs.map +1 -0
  55. package/dist/{blog-styles-6EY3BS5Y.js → article-styles-JHHTNHOK.js} +125 -125
  56. package/dist/article-styles-JHHTNHOK.js.map +1 -0
  57. package/dist/article-tables-EWXG4LNP.js +17 -0
  58. package/dist/article-tables-EWXG4LNP.js.map +1 -0
  59. package/dist/article-tables-OGE52LNT.mjs +4 -0
  60. package/dist/article-tables-OGE52LNT.mjs.map +1 -0
  61. package/dist/{blog/BlogPost.d.ts → articles/Article.d.ts} +18 -16
  62. package/dist/articles/Article.d.ts.map +1 -0
  63. package/dist/{blog/BlogFAQ.d.ts → articles/ArticleFAQ.d.ts} +6 -6
  64. package/dist/articles/ArticleFAQ.d.ts.map +1 -0
  65. package/dist/articles/ArticleFaqSection.d.ts +3 -0
  66. package/dist/articles/ArticleFaqSection.d.ts.map +1 -0
  67. package/dist/{blog/BlogList.d.ts → articles/ArticleList.d.ts} +16 -16
  68. package/dist/articles/ArticleList.d.ts.map +1 -0
  69. package/dist/{blog/BlogViewTracker.d.ts → articles/ArticleViewTracker.d.ts} +4 -4
  70. package/dist/articles/ArticleViewTracker.d.ts.map +1 -0
  71. package/dist/{blog → articles}/AuthorCard.d.ts +3 -3
  72. package/dist/articles/AuthorCard.d.ts.map +1 -0
  73. package/dist/{blog → articles}/AuthorPage.d.ts +1 -1
  74. package/dist/articles/AuthorPage.d.ts.map +1 -0
  75. package/dist/{blog → articles}/ClusterLandingPage.d.ts +6 -6
  76. package/dist/articles/ClusterLandingPage.d.ts.map +1 -0
  77. package/dist/{blog → articles}/ClusterNavigation.d.ts +5 -5
  78. package/dist/articles/ClusterNavigation.d.ts.map +1 -0
  79. package/dist/{blog → articles}/ManagedNewsletterForm.d.ts +1 -1
  80. package/dist/articles/ManagedNewsletterForm.d.ts.map +1 -0
  81. package/dist/{blog → articles}/NewsletterShell.d.ts +1 -1
  82. package/dist/articles/NewsletterShell.d.ts.map +1 -0
  83. package/dist/{blog → articles}/NewsletterWidget.d.ts +4 -4
  84. package/dist/articles/NewsletterWidget.d.ts.map +1 -0
  85. package/dist/{blog/BlogLayout.d.ts → articles/PublicationLayout.d.ts} +18 -18
  86. package/dist/articles/PublicationLayout.d.ts.map +1 -0
  87. package/dist/{blog/BlogSidebar.d.ts → articles/PublicationSidebar.d.ts} +8 -8
  88. package/dist/articles/PublicationSidebar.d.ts.map +1 -0
  89. package/dist/{blog → articles}/RelatedPosts.d.ts +6 -6
  90. package/dist/articles/RelatedPosts.d.ts.map +1 -0
  91. package/dist/{blog → articles}/ServiceCallout.d.ts +4 -4
  92. package/dist/articles/ServiceCallout.d.ts.map +1 -0
  93. package/dist/{blog → articles}/TableOfContents.d.ts +1 -1
  94. package/dist/articles/TableOfContents.d.ts.map +1 -0
  95. package/dist/{blog/blog-styles.d.ts → articles/article-styles.d.ts} +5 -5
  96. package/dist/articles/article-styles.d.ts.map +1 -0
  97. package/dist/{blog/blog-tables.d.ts → articles/article-tables.d.ts} +4 -4
  98. package/dist/articles/article-tables.d.ts.map +1 -0
  99. package/dist/articles/artwork.d.ts +14 -0
  100. package/dist/articles/artwork.d.ts.map +1 -0
  101. package/dist/{blog → articles}/author-schema.d.ts +6 -5
  102. package/dist/articles/author-schema.d.ts.map +1 -0
  103. package/dist/{blog → articles}/author-social.d.ts +2 -2
  104. package/dist/articles/author-social.d.ts.map +1 -0
  105. package/dist/{blog → articles}/excerpt.d.ts +2 -2
  106. package/dist/articles/excerpt.d.ts.map +1 -0
  107. package/dist/{blog → articles}/index.d.ts +26 -31
  108. package/dist/articles/index.d.ts.map +1 -0
  109. package/dist/{blog → articles}/index.js +39 -73
  110. package/dist/articles/index.js.map +1 -0
  111. package/dist/{blog → articles}/index.mjs +16 -17
  112. package/dist/articles/index.mjs.map +1 -0
  113. package/dist/articles/news-sitemap.d.ts +47 -0
  114. package/dist/articles/news-sitemap.d.ts.map +1 -0
  115. package/dist/{blog/processBlogHtml.d.ts → articles/processArticleHtml.d.ts} +4 -4
  116. package/dist/articles/processArticleHtml.d.ts.map +1 -0
  117. package/dist/articles/public-reads.d.ts +27 -0
  118. package/dist/articles/public-reads.d.ts.map +1 -0
  119. package/dist/{blog → articles}/reading-time.d.ts +2 -2
  120. package/dist/articles/reading-time.d.ts.map +1 -0
  121. package/dist/{blog → articles}/routes.d.ts +16 -12
  122. package/dist/articles/routes.d.ts.map +1 -0
  123. package/dist/{blog → articles}/server-core.d.ts +94 -81
  124. package/dist/articles/server-core.d.ts.map +1 -0
  125. package/dist/articles/server-ui.d.ts +29 -0
  126. package/dist/articles/server-ui.d.ts.map +1 -0
  127. package/dist/{chunk-KPWK23G7.js → articles/server-ui.js} +378 -499
  128. package/dist/articles/server-ui.js.map +1 -0
  129. package/dist/{chunk-RA4DCRMR.mjs → articles/server-ui.mjs} +328 -474
  130. package/dist/articles/server-ui.mjs.map +1 -0
  131. package/dist/{blog → articles}/server.d.ts +94 -81
  132. package/dist/articles/server.d.ts.map +1 -0
  133. package/dist/articles/server.js +236 -0
  134. package/dist/articles/server.mjs +11 -0
  135. package/dist/{blog → articles}/types.d.ts +34 -34
  136. package/dist/articles/types.d.ts.map +1 -0
  137. package/dist/articles/widget-styles.d.ts +9 -0
  138. package/dist/articles/widget-styles.d.ts.map +1 -0
  139. package/dist/brand/extract-brand-profile.d.ts +1 -1
  140. package/dist/{chunk-DTWR7VRQ.js → chunk-254IW4FC.js} +9 -9
  141. package/dist/{chunk-DTWR7VRQ.js.map → chunk-254IW4FC.js.map} +1 -1
  142. package/dist/chunk-2KRAY5NC.mjs +6 -0
  143. package/dist/{chunk-TAPCWMBV.mjs.map → chunk-2KRAY5NC.mjs.map} +1 -1
  144. package/dist/{chunk-X6NPTILR.mjs → chunk-2WEBUZNP.mjs} +3 -3
  145. package/dist/{chunk-X6NPTILR.mjs.map → chunk-2WEBUZNP.mjs.map} +1 -1
  146. package/dist/{chunk-3EXBBFXX.mjs → chunk-2YSB4FIC.mjs} +4 -4
  147. package/dist/{chunk-3EXBBFXX.mjs.map → chunk-2YSB4FIC.mjs.map} +1 -1
  148. package/dist/{chunk-GDH42JAS.js → chunk-3GHPFLEH.js} +15 -15
  149. package/dist/{chunk-GDH42JAS.js.map → chunk-3GHPFLEH.js.map} +1 -1
  150. package/dist/{chunk-QWXTQC3N.js → chunk-3LCJJ6Y6.js} +3 -3
  151. package/dist/{chunk-QWXTQC3N.js.map → chunk-3LCJJ6Y6.js.map} +1 -1
  152. package/dist/{chunk-YVQNOB3Q.mjs → chunk-3OCXVTN5.mjs} +3 -3
  153. package/dist/{chunk-YVQNOB3Q.mjs.map → chunk-3OCXVTN5.mjs.map} +1 -1
  154. package/dist/chunk-3T2CVHFO.mjs +453 -0
  155. package/dist/chunk-3T2CVHFO.mjs.map +1 -0
  156. package/dist/{chunk-ZDXY44FH.js → chunk-3U5SVB4W.js} +4 -4
  157. package/dist/{chunk-ZDXY44FH.js.map → chunk-3U5SVB4W.js.map} +1 -1
  158. package/dist/{chunk-I3ND4XYW.js → chunk-4BEGKFMN.js} +8 -8
  159. package/dist/{chunk-I3ND4XYW.js.map → chunk-4BEGKFMN.js.map} +1 -1
  160. package/dist/{chunk-YFX3Q56O.mjs → chunk-4KAMU5HD.mjs} +3 -3
  161. package/dist/chunk-4KAMU5HD.mjs.map +1 -0
  162. package/dist/{chunk-ZPLN537Q.mjs → chunk-4WCA2HM6.mjs} +2 -2
  163. package/dist/chunk-4WCA2HM6.mjs.map +1 -0
  164. package/dist/{chunk-PXWYMOZY.js → chunk-5DSUPTBU.js} +13 -13
  165. package/dist/{chunk-PXWYMOZY.js.map → chunk-5DSUPTBU.js.map} +1 -1
  166. package/dist/{chunk-GHECYDSZ.mjs → chunk-5F2FIM5A.mjs} +16 -15
  167. package/dist/chunk-5F2FIM5A.mjs.map +1 -0
  168. package/dist/{chunk-Y5QZPUL3.mjs → chunk-5YVQWLSQ.mjs} +5 -5
  169. package/dist/chunk-5YVQWLSQ.mjs.map +1 -0
  170. package/dist/chunk-6DCAMW62.mjs +55 -0
  171. package/dist/chunk-6DCAMW62.mjs.map +1 -0
  172. package/dist/{chunk-Q2NBD54V.js → chunk-7THQ4UW3.js} +2 -2
  173. package/dist/chunk-7THQ4UW3.js.map +1 -0
  174. package/dist/{chunk-6FTC6EYD.mjs → chunk-7TKSRUQU.mjs} +7 -7
  175. package/dist/{chunk-6FTC6EYD.mjs.map → chunk-7TKSRUQU.mjs.map} +1 -1
  176. package/dist/{chunk-4TLFZ6NR.mjs → chunk-AS2HUIDW.mjs} +3 -3
  177. package/dist/chunk-AS2HUIDW.mjs.map +1 -0
  178. package/dist/{chunk-YN7QHLWF.js → chunk-BBBJHYPH.js} +5 -5
  179. package/dist/chunk-BBBJHYPH.js.map +1 -0
  180. package/dist/{chunk-3Y7IKQDD.js → chunk-BZG34WHF.js} +14 -14
  181. package/dist/{chunk-3Y7IKQDD.js.map → chunk-BZG34WHF.js.map} +1 -1
  182. package/dist/{chunk-4LYW6PMU.mjs → chunk-C2CTLLIO.mjs} +3 -3
  183. package/dist/chunk-C2CTLLIO.mjs.map +1 -0
  184. package/dist/{chunk-O237KKCX.mjs → chunk-C5VITBN7.mjs} +5 -5
  185. package/dist/chunk-C5VITBN7.mjs.map +1 -0
  186. package/dist/{chunk-75A4KY4X.mjs → chunk-CFRJ2MK5.mjs} +2 -2
  187. package/dist/chunk-CFRJ2MK5.mjs.map +1 -0
  188. package/dist/{chunk-G2WC3CXW.js → chunk-CLO3K7PF.js} +2 -2
  189. package/dist/chunk-CLO3K7PF.js.map +1 -0
  190. package/dist/{chunk-ALVQOG4M.mjs → chunk-CSSNZGTU.mjs} +4 -4
  191. package/dist/{chunk-ALVQOG4M.mjs.map → chunk-CSSNZGTU.mjs.map} +1 -1
  192. package/dist/{chunk-U6O5NG56.js → chunk-CZGGUPPQ.js} +15 -15
  193. package/dist/{chunk-U6O5NG56.js.map → chunk-CZGGUPPQ.js.map} +1 -1
  194. package/dist/{chunk-U5WMGUDV.js → chunk-D47W5DE4.js} +4 -4
  195. package/dist/{chunk-U5WMGUDV.js.map → chunk-D47W5DE4.js.map} +1 -1
  196. package/dist/{chunk-AK6JZ3OE.mjs → chunk-EDLNMGQC.mjs} +3 -3
  197. package/dist/{chunk-DO6ATNLN.js.map → chunk-EDLNMGQC.mjs.map} +1 -1
  198. package/dist/chunk-EL74YDNX.js +8 -0
  199. package/dist/{chunk-TJVZEDE3.js.map → chunk-EL74YDNX.js.map} +1 -1
  200. package/dist/{chunk-HX6ZG3PP.js → chunk-EMHSHAVW.js} +3 -3
  201. package/dist/chunk-EMHSHAVW.js.map +1 -0
  202. package/dist/{chunk-7TC3GRXQ.js → chunk-G6KQ3C3W.js} +25 -23
  203. package/dist/chunk-G6KQ3C3W.js.map +1 -0
  204. package/dist/{chunk-4PXUMDHL.mjs → chunk-GQ3SDRL6.mjs} +4 -4
  205. package/dist/{chunk-4PXUMDHL.mjs.map → chunk-GQ3SDRL6.mjs.map} +1 -1
  206. package/dist/{chunk-73EBIAF3.js → chunk-HFCQGSD2.js} +18 -18
  207. package/dist/{chunk-73EBIAF3.js.map → chunk-HFCQGSD2.js.map} +1 -1
  208. package/dist/{chunk-XZO5I4RS.mjs → chunk-HIZJD7TU.mjs} +3 -3
  209. package/dist/{chunk-XZO5I4RS.mjs.map → chunk-HIZJD7TU.mjs.map} +1 -1
  210. package/dist/{chunk-AUTJQGZ2.mjs → chunk-HOOVYWTO.mjs} +4 -4
  211. package/dist/{chunk-AUTJQGZ2.mjs.map → chunk-HOOVYWTO.mjs.map} +1 -1
  212. package/dist/{chunk-LUF22UGR.js → chunk-HX5JPNMN.js} +8 -8
  213. package/dist/{chunk-LUF22UGR.js.map → chunk-HX5JPNMN.js.map} +1 -1
  214. package/dist/chunk-HXHRS3PX.mjs +349 -0
  215. package/dist/chunk-HXHRS3PX.mjs.map +1 -0
  216. package/dist/{chunk-XBX2K3GA.js → chunk-IBJOGXQI.js} +4 -4
  217. package/dist/{chunk-XBX2K3GA.js.map → chunk-IBJOGXQI.js.map} +1 -1
  218. package/dist/{chunk-NHX6YJ7G.mjs → chunk-JMNBU2RG.mjs} +9 -9
  219. package/dist/{chunk-NHX6YJ7G.mjs.map → chunk-JMNBU2RG.mjs.map} +1 -1
  220. package/dist/{chunk-R7GHP3FY.js → chunk-JONWE26J.js} +3 -3
  221. package/dist/chunk-JONWE26J.js.map +1 -0
  222. package/dist/{chunk-HOJ4J4X2.mjs → chunk-JSXLTZUP.mjs} +6 -6
  223. package/dist/{chunk-HOJ4J4X2.mjs.map → chunk-JSXLTZUP.mjs.map} +1 -1
  224. package/dist/{chunk-5BZNVKNK.mjs → chunk-JXCMCASE.mjs} +3 -3
  225. package/dist/{chunk-5BZNVKNK.mjs.map → chunk-JXCMCASE.mjs.map} +1 -1
  226. package/dist/{chunk-F2ZFMPW4.js → chunk-KA4NNWOK.js} +10 -10
  227. package/dist/{chunk-F2ZFMPW4.js.map → chunk-KA4NNWOK.js.map} +1 -1
  228. package/dist/{chunk-K4TCEAUX.js → chunk-KR7ATPAN.js} +5 -5
  229. package/dist/chunk-KR7ATPAN.js.map +1 -0
  230. package/dist/{chunk-JLVCWC6A.mjs → chunk-KZVSB5WE.mjs} +2 -2
  231. package/dist/chunk-KZVSB5WE.mjs.map +1 -0
  232. package/dist/chunk-LWCAZDY2.js +355 -0
  233. package/dist/chunk-LWCAZDY2.js.map +1 -0
  234. package/dist/{chunk-D7CF3OPZ.js → chunk-MCG4BSRW.js} +5 -5
  235. package/dist/{chunk-D7CF3OPZ.js.map → chunk-MCG4BSRW.js.map} +1 -1
  236. package/dist/{chunk-OBNMSO66.js → chunk-MIYGP34I.js} +14 -14
  237. package/dist/{chunk-OBNMSO66.js.map → chunk-MIYGP34I.js.map} +1 -1
  238. package/dist/{chunk-PXK4WNSU.js → chunk-MS2EE6LT.js} +10 -10
  239. package/dist/{chunk-PXK4WNSU.js.map → chunk-MS2EE6LT.js.map} +1 -1
  240. package/dist/{chunk-JR2FT6T5.js → chunk-N6CB7MK7.js} +6 -6
  241. package/dist/{chunk-JR2FT6T5.js.map → chunk-N6CB7MK7.js.map} +1 -1
  242. package/dist/{chunk-LMEUYRRR.js → chunk-NAA5J2JM.js} +233 -120
  243. package/dist/chunk-NAA5J2JM.js.map +1 -0
  244. package/dist/{chunk-OE7CTIOU.mjs → chunk-NE6QGHFT.mjs} +4 -4
  245. package/dist/{chunk-OE7CTIOU.mjs.map → chunk-NE6QGHFT.mjs.map} +1 -1
  246. package/dist/{chunk-SCVSPTXJ.mjs → chunk-NR52QHOD.mjs} +3 -3
  247. package/dist/{chunk-SCVSPTXJ.mjs.map → chunk-NR52QHOD.mjs.map} +1 -1
  248. package/dist/{chunk-GQF6QAQS.js → chunk-OGNX6JT4.js} +5 -5
  249. package/dist/chunk-OGNX6JT4.js.map +1 -0
  250. package/dist/{chunk-FVW6FT6L.js → chunk-OSU4QA5M.js} +8 -8
  251. package/dist/{chunk-FVW6FT6L.js.map → chunk-OSU4QA5M.js.map} +1 -1
  252. package/dist/{chunk-RI25UGHE.mjs → chunk-PJYTYM5G.mjs} +3 -3
  253. package/dist/{chunk-RI25UGHE.mjs.map → chunk-PJYTYM5G.mjs.map} +1 -1
  254. package/dist/{chunk-DO6ATNLN.js → chunk-PRAHDLKT.js} +5 -5
  255. package/dist/chunk-PRAHDLKT.js.map +1 -0
  256. package/dist/{chunk-RQOKQC7J.mjs → chunk-QEM2F2DC.mjs} +3 -3
  257. package/dist/{chunk-RQOKQC7J.mjs.map → chunk-QEM2F2DC.mjs.map} +1 -1
  258. package/dist/{chunk-3Z3TOPND.js → chunk-QOCLSJIU.js} +3 -3
  259. package/dist/{chunk-3Z3TOPND.js.map → chunk-QOCLSJIU.js.map} +1 -1
  260. package/dist/{chunk-AHKVOYFO.mjs → chunk-QVBAAPNT.mjs} +3 -3
  261. package/dist/{chunk-AHKVOYFO.mjs.map → chunk-QVBAAPNT.mjs.map} +1 -1
  262. package/dist/{chunk-FWFJZV52.mjs → chunk-RC4L4DV2.mjs} +4 -4
  263. package/dist/{chunk-FWFJZV52.mjs.map → chunk-RC4L4DV2.mjs.map} +1 -1
  264. package/dist/{chunk-ZVI7MBVF.mjs → chunk-RDPI27TS.mjs} +12 -10
  265. package/dist/chunk-RDPI27TS.mjs.map +1 -0
  266. package/dist/{chunk-OEW2LFOV.js → chunk-RLUNEEGM.js} +4 -4
  267. package/dist/{chunk-OEW2LFOV.js.map → chunk-RLUNEEGM.js.map} +1 -1
  268. package/dist/{chunk-TCVOGK6U.mjs → chunk-RPCODOWG.mjs} +3 -3
  269. package/dist/{chunk-TCVOGK6U.mjs.map → chunk-RPCODOWG.mjs.map} +1 -1
  270. package/dist/{chunk-QK54SZPF.mjs → chunk-RZGVNDO6.mjs} +4 -4
  271. package/dist/{chunk-QK54SZPF.mjs.map → chunk-RZGVNDO6.mjs.map} +1 -1
  272. package/dist/{chunk-GKVEWOYN.js → chunk-SCRB5DZM.js} +8 -8
  273. package/dist/{chunk-GKVEWOYN.js.map → chunk-SCRB5DZM.js.map} +1 -1
  274. package/dist/{chunk-YQTE32QK.js → chunk-SG7CWD2R.js} +17 -16
  275. package/dist/chunk-SG7CWD2R.js.map +1 -0
  276. package/dist/chunk-TBXWJJGT.js +468 -0
  277. package/dist/chunk-TBXWJJGT.js.map +1 -0
  278. package/dist/{chunk-SJPI34DL.mjs → chunk-TCCGP3FT.mjs} +3 -3
  279. package/dist/{chunk-SJPI34DL.mjs.map → chunk-TCCGP3FT.mjs.map} +1 -1
  280. package/dist/{chunk-7BI2RVQD.js → chunk-TCZHRSWY.js} +4 -4
  281. package/dist/{chunk-7BI2RVQD.js.map → chunk-TCZHRSWY.js.map} +1 -1
  282. package/dist/{chunk-M45AL7EA.js → chunk-TST2IKYO.js} +14 -14
  283. package/dist/{chunk-M45AL7EA.js.map → chunk-TST2IKYO.js.map} +1 -1
  284. package/dist/{chunk-U2V542EO.mjs → chunk-UHYRVALN.mjs} +2 -2
  285. package/dist/{chunk-U2V542EO.mjs.map → chunk-UHYRVALN.mjs.map} +1 -1
  286. package/dist/{chunk-4L7OHRWB.mjs → chunk-UO6KTHBQ.mjs} +4 -4
  287. package/dist/{chunk-4L7OHRWB.mjs.map → chunk-UO6KTHBQ.mjs.map} +1 -1
  288. package/dist/{chunk-H5NBFNND.js → chunk-UZKXOZHR.js} +2 -2
  289. package/dist/chunk-UZKXOZHR.js.map +1 -0
  290. package/dist/{chunk-ZTY4YS7Q.js → chunk-VINLIMAX.js} +3 -3
  291. package/dist/{chunk-ZTY4YS7Q.js.map → chunk-VINLIMAX.js.map} +1 -1
  292. package/dist/{chunk-YC2CKOX6.js → chunk-WDEGGHTB.js} +12 -12
  293. package/dist/{chunk-YC2CKOX6.js.map → chunk-WDEGGHTB.js.map} +1 -1
  294. package/dist/{chunk-OX2GTNMB.mjs → chunk-WV5YQL3W.mjs} +3 -3
  295. package/dist/{chunk-OX2GTNMB.mjs.map → chunk-WV5YQL3W.mjs.map} +1 -1
  296. package/dist/{chunk-3EY5E35M.mjs → chunk-X3MY4PL7.mjs} +210 -107
  297. package/dist/chunk-X3MY4PL7.mjs.map +1 -0
  298. package/dist/{chunk-7SLYI62M.mjs → chunk-XKXZ4OW4.mjs} +4 -4
  299. package/dist/{chunk-7SLYI62M.mjs.map → chunk-XKXZ4OW4.mjs.map} +1 -1
  300. package/dist/{chunk-FX232N4P.mjs → chunk-XSBKR3VF.mjs} +5 -5
  301. package/dist/{chunk-FX232N4P.mjs.map → chunk-XSBKR3VF.mjs.map} +1 -1
  302. package/dist/{chunk-SEP5D4MI.js → chunk-Y2CP5J6Q.js} +2 -2
  303. package/dist/{chunk-SEP5D4MI.js.map → chunk-Y2CP5J6Q.js.map} +1 -1
  304. package/dist/{chunk-HQ2EPU5R.js → chunk-YGDQVZEL.js} +7 -7
  305. package/dist/{chunk-HQ2EPU5R.js.map → chunk-YGDQVZEL.js.map} +1 -1
  306. package/dist/{chunk-KV7XXLJV.mjs → chunk-YPGUV6BT.mjs} +3 -3
  307. package/dist/{chunk-KV7XXLJV.mjs.map → chunk-YPGUV6BT.mjs.map} +1 -1
  308. package/dist/chunk-YRCR7WY3.js +65 -0
  309. package/dist/chunk-YRCR7WY3.js.map +1 -0
  310. package/dist/{chunk-NM567VXC.mjs → chunk-YWLBQ3L5.mjs} +4 -4
  311. package/dist/{chunk-NM567VXC.mjs.map → chunk-YWLBQ3L5.mjs.map} +1 -1
  312. package/dist/{chunk-3HGHWDCY.js → chunk-YYEBFQGS.js} +4 -4
  313. package/dist/{chunk-3HGHWDCY.js.map → chunk-YYEBFQGS.js.map} +1 -1
  314. package/dist/chunk-ZL35JCDA.mjs +61 -0
  315. package/dist/chunk-ZL35JCDA.mjs.map +1 -0
  316. package/dist/chunk-ZR43XFUM.js +60 -0
  317. package/dist/chunk-ZR43XFUM.js.map +1 -0
  318. package/dist/{chunk-EZ5DX7ED.mjs → chunk-ZR4TYCQW.mjs} +3 -3
  319. package/dist/{chunk-EZ5DX7ED.mjs.map → chunk-ZR4TYCQW.mjs.map} +1 -1
  320. package/dist/cli/commands/setup.d.ts +2 -2
  321. package/dist/cli/commands/sync.d.ts +2 -2
  322. package/dist/cli/commands/sync.d.ts.map +1 -1
  323. package/dist/cli/index.js +76 -76
  324. package/dist/cli/index.mjs +29 -29
  325. package/dist/client/index.js +5 -5
  326. package/dist/client/index.mjs +4 -4
  327. package/dist/commerce/index.js +57 -57
  328. package/dist/commerce/index.mjs +5 -5
  329. package/dist/commerce/server.d.ts +1 -1
  330. package/dist/commerce/server.js +7 -7
  331. package/dist/commerce/server.js.map +1 -1
  332. package/dist/commerce/server.mjs +7 -7
  333. package/dist/commerce/server.mjs.map +1 -1
  334. package/dist/discover-LPN55L5B.js +21 -0
  335. package/dist/{discover-NGEPXZOD.js.map → discover-LPN55L5B.js.map} +1 -1
  336. package/dist/discover-QGA6QFSR.mjs +4 -0
  337. package/dist/{discover-CYXYKHZ2.mjs.map → discover-QGA6QFSR.mjs.map} +1 -1
  338. package/dist/engage/index.js +13 -13
  339. package/dist/engage/index.mjs +7 -7
  340. package/dist/fleet/contract.d.ts +1 -1
  341. package/dist/fleet/contract.js +12 -12
  342. package/dist/fleet/contract.mjs +1 -1
  343. package/dist/fleet/index.js +20 -20
  344. package/dist/fleet/index.mjs +5 -5
  345. package/dist/forms/index.js +21 -21
  346. package/dist/forms/index.mjs +10 -10
  347. package/dist/forms/server.js +10 -10
  348. package/dist/forms/server.mjs +8 -8
  349. package/dist/forms/static.js +7 -7
  350. package/dist/forms/static.mjs +6 -6
  351. package/dist/images/index.js +11 -11
  352. package/dist/images/index.mjs +4 -4
  353. package/dist/index.d.ts +2 -2
  354. package/dist/index.d.ts.map +1 -1
  355. package/dist/index.js +70 -70
  356. package/dist/index.mjs +12 -12
  357. package/dist/layout/client.js +10 -10
  358. package/dist/layout/client.mjs +9 -9
  359. package/dist/layout/index.js +12 -12
  360. package/dist/layout/index.mjs +10 -10
  361. package/dist/llms/SpeakableSchema.d.ts +1 -1
  362. package/dist/llms/SpeakableSchema.d.ts.map +1 -1
  363. package/dist/llms/client.d.ts +18 -0
  364. package/dist/llms/client.d.ts.map +1 -0
  365. package/dist/llms/client.js +66 -0
  366. package/dist/llms/client.js.map +1 -0
  367. package/dist/llms/client.mjs +5 -0
  368. package/dist/llms/client.mjs.map +1 -0
  369. package/dist/llms/generateLLMsTxt.d.ts.map +1 -1
  370. package/dist/llms/index.js +75 -478
  371. package/dist/llms/index.js.map +1 -1
  372. package/dist/llms/index.mjs +10 -455
  373. package/dist/llms/index.mjs.map +1 -1
  374. package/dist/llms/types.d.ts +7 -0
  375. package/dist/llms/types.d.ts.map +1 -1
  376. package/dist/maps/index.js +5 -5
  377. package/dist/maps/index.mjs +3 -3
  378. package/dist/og/index.js +7 -7
  379. package/dist/og/index.mjs +2 -2
  380. package/dist/og/route.d.ts +6 -6
  381. package/dist/og/route.js.map +1 -1
  382. package/dist/og/route.mjs.map +1 -1
  383. package/dist/og/wiring.d.ts +4 -4
  384. package/dist/og/wiring.d.ts.map +1 -1
  385. package/dist/proxy/index.js +5 -5
  386. package/dist/proxy/index.mjs +3 -3
  387. package/dist/redirects/index.js +10 -10
  388. package/dist/redirects/index.mjs +3 -3
  389. package/dist/redirects/not-found.js +7 -7
  390. package/dist/redirects/not-found.mjs +3 -3
  391. package/dist/robots/indexnow.d.ts +17 -0
  392. package/dist/robots/indexnow.d.ts.map +1 -0
  393. package/dist/robots/indexnow.js +39 -0
  394. package/dist/robots/indexnow.js.map +1 -0
  395. package/dist/robots/indexnow.mjs +34 -0
  396. package/dist/robots/indexnow.mjs.map +1 -0
  397. package/dist/search/contract.d.ts +1 -1
  398. package/dist/search/contract.js +3 -3
  399. package/dist/search/contract.mjs +1 -1
  400. package/dist/search/index.js +7 -7
  401. package/dist/search/index.mjs +5 -5
  402. package/dist/seo/ManagedSchema.d.ts.map +1 -1
  403. package/dist/seo/client.js +6 -6
  404. package/dist/seo/client.mjs +5 -5
  405. package/dist/seo/index.js +58 -50
  406. package/dist/seo/index.js.map +1 -1
  407. package/dist/seo/index.mjs +23 -15
  408. package/dist/seo/index.mjs.map +1 -1
  409. package/dist/seo/register-sitemap-cli.js +12 -12
  410. package/dist/seo/register-sitemap-cli.mjs +5 -5
  411. package/dist/seo/server.js +21 -21
  412. package/dist/seo/server.mjs +5 -5
  413. package/dist/server/index.js +3 -3
  414. package/dist/server/index.mjs +2 -2
  415. package/dist/{server-api-A2EFCTZX.mjs → server-api-7F5P6CSH.mjs} +6 -6
  416. package/dist/{server-api-A2EFCTZX.mjs.map → server-api-7F5P6CSH.mjs.map} +1 -1
  417. package/dist/{server-api-IWTZ7C3O.js → server-api-OC5JNK6R.js} +24 -24
  418. package/dist/{server-api-IWTZ7C3O.js.map → server-api-OC5JNK6R.js.map} +1 -1
  419. package/dist/shared/build-entries.d.ts +15 -7
  420. package/dist/shared/build-entries.d.ts.map +1 -1
  421. package/dist/shared/version.d.ts +1 -1
  422. package/dist/signal/index.js +11 -11
  423. package/dist/signal/index.mjs +2 -2
  424. package/dist/sitemap/discover.d.ts +1 -1
  425. package/dist/sitemap/index.d.ts +7 -1
  426. package/dist/sitemap/index.d.ts.map +1 -1
  427. package/dist/sitemap/index.js +47 -30
  428. package/dist/sitemap/index.js.map +1 -1
  429. package/dist/sitemap/index.mjs +26 -9
  430. package/dist/sitemap/index.mjs.map +1 -1
  431. package/dist/sitemap/shared.d.ts +1 -1
  432. package/dist/sitemap/shared.d.ts.map +1 -1
  433. package/dist/sites/site-param.d.ts +2 -2
  434. package/dist/sync/index.js +17 -17
  435. package/dist/sync/index.mjs +4 -4
  436. package/dist/types.d.ts +1 -1
  437. package/dist/types.d.ts.map +1 -1
  438. package/dist/writeLLMsTxt-ATADOUVZ.js +20 -0
  439. package/dist/writeLLMsTxt-QJFXBHZF.mjs +11 -0
  440. package/package.json +25 -14
  441. package/dist/BlogPostFaqSection-P3GXVQPA.mjs +0 -11
  442. package/dist/BlogPostFaqSection-P3GXVQPA.mjs.map +0 -1
  443. package/dist/BlogPostFaqSection-YG5J4B4U.js +0 -13
  444. package/dist/BlogPostFaqSection-YG5J4B4U.js.map +0 -1
  445. package/dist/BlogViewTracker-32C4SCHA.js.map +0 -1
  446. package/dist/BlogViewTracker-YQMTEGYZ.mjs.map +0 -1
  447. package/dist/ChatWidget-IRTAMRQS.mjs +0 -15
  448. package/dist/ChatWidget-KCXQXNUF.js +0 -24
  449. package/dist/EngageWidget-7AIUJRXV.mjs +0 -12
  450. package/dist/EngageWidget-EUUZHQOU.js +0 -21
  451. package/dist/ManagedForm-7IDXBQS6.mjs +0 -16
  452. package/dist/ManagedForm-RI2TSUZD.js +0 -25
  453. package/dist/ManagedNewsletterForm-IAGIHBNT.js.map +0 -1
  454. package/dist/ManagedNewsletterForm-UXBJ5OJB.mjs.map +0 -1
  455. package/dist/SitemapSync-DWEL7HTB.js +0 -18
  456. package/dist/SitemapSync-YIAI7PMT.mjs +0 -9
  457. package/dist/blog/AuthorCard.d.ts.map +0 -1
  458. package/dist/blog/AuthorPage.d.ts.map +0 -1
  459. package/dist/blog/BlogFAQ.d.ts.map +0 -1
  460. package/dist/blog/BlogLayout.d.ts.map +0 -1
  461. package/dist/blog/BlogList.d.ts.map +0 -1
  462. package/dist/blog/BlogPost.d.ts.map +0 -1
  463. package/dist/blog/BlogPostFaqSection.d.ts +0 -3
  464. package/dist/blog/BlogPostFaqSection.d.ts.map +0 -1
  465. package/dist/blog/BlogSidebar.d.ts.map +0 -1
  466. package/dist/blog/BlogViewTracker.d.ts.map +0 -1
  467. package/dist/blog/ClusterLandingPage.d.ts.map +0 -1
  468. package/dist/blog/ClusterNavigation.d.ts.map +0 -1
  469. package/dist/blog/ManagedNewsletterForm.d.ts.map +0 -1
  470. package/dist/blog/NewsletterShell.d.ts.map +0 -1
  471. package/dist/blog/NewsletterWidget.d.ts.map +0 -1
  472. package/dist/blog/RelatedPosts.d.ts.map +0 -1
  473. package/dist/blog/ServiceCallout.d.ts.map +0 -1
  474. package/dist/blog/TableOfContents.d.ts.map +0 -1
  475. package/dist/blog/artwork.d.ts +0 -14
  476. package/dist/blog/artwork.d.ts.map +0 -1
  477. package/dist/blog/author-schema.d.ts.map +0 -1
  478. package/dist/blog/author-social.d.ts.map +0 -1
  479. package/dist/blog/blog-styles.d.ts.map +0 -1
  480. package/dist/blog/blog-tables.d.ts.map +0 -1
  481. package/dist/blog/excerpt.d.ts.map +0 -1
  482. package/dist/blog/index.d.ts.map +0 -1
  483. package/dist/blog/index.js.map +0 -1
  484. package/dist/blog/index.mjs.map +0 -1
  485. package/dist/blog/processBlogHtml.d.ts.map +0 -1
  486. package/dist/blog/public-reads.d.ts +0 -27
  487. package/dist/blog/public-reads.d.ts.map +0 -1
  488. package/dist/blog/reading-time.d.ts.map +0 -1
  489. package/dist/blog/routes.d.ts.map +0 -1
  490. package/dist/blog/server-core.d.ts.map +0 -1
  491. package/dist/blog/server-ui.d.ts +0 -29
  492. package/dist/blog/server-ui.d.ts.map +0 -1
  493. package/dist/blog/server-ui.js +0 -267
  494. package/dist/blog/server-ui.js.map +0 -1
  495. package/dist/blog/server-ui.mjs +0 -203
  496. package/dist/blog/server-ui.mjs.map +0 -1
  497. package/dist/blog/server.d.ts.map +0 -1
  498. package/dist/blog/server.js +0 -207
  499. package/dist/blog/server.mjs +0 -10
  500. package/dist/blog/types.d.ts.map +0 -1
  501. package/dist/blog/widget-styles.d.ts +0 -9
  502. package/dist/blog/widget-styles.d.ts.map +0 -1
  503. package/dist/blog-styles-6EY3BS5Y.js.map +0 -1
  504. package/dist/blog-styles-7AKRUMV7.mjs.map +0 -1
  505. package/dist/blog-tables-DWDEWA3S.js +0 -17
  506. package/dist/blog-tables-DWDEWA3S.js.map +0 -1
  507. package/dist/blog-tables-QGIHOESZ.mjs +0 -4
  508. package/dist/blog-tables-QGIHOESZ.mjs.map +0 -1
  509. package/dist/chunk-3EY5E35M.mjs.map +0 -1
  510. package/dist/chunk-4LYW6PMU.mjs.map +0 -1
  511. package/dist/chunk-4TLFZ6NR.mjs.map +0 -1
  512. package/dist/chunk-5B4J3IBX.mjs +0 -164
  513. package/dist/chunk-5B4J3IBX.mjs.map +0 -1
  514. package/dist/chunk-75A4KY4X.mjs.map +0 -1
  515. package/dist/chunk-7TC3GRXQ.js.map +0 -1
  516. package/dist/chunk-AK6JZ3OE.mjs.map +0 -1
  517. package/dist/chunk-FHPW7XVH.js +0 -175
  518. package/dist/chunk-FHPW7XVH.js.map +0 -1
  519. package/dist/chunk-G2WC3CXW.js.map +0 -1
  520. package/dist/chunk-GHECYDSZ.mjs.map +0 -1
  521. package/dist/chunk-GQF6QAQS.js.map +0 -1
  522. package/dist/chunk-H5NBFNND.js.map +0 -1
  523. package/dist/chunk-HX6ZG3PP.js.map +0 -1
  524. package/dist/chunk-JLVCWC6A.mjs.map +0 -1
  525. package/dist/chunk-K4TCEAUX.js.map +0 -1
  526. package/dist/chunk-KPWK23G7.js.map +0 -1
  527. package/dist/chunk-LMEUYRRR.js.map +0 -1
  528. package/dist/chunk-O237KKCX.mjs.map +0 -1
  529. package/dist/chunk-Q2NBD54V.js.map +0 -1
  530. package/dist/chunk-R7GHP3FY.js.map +0 -1
  531. package/dist/chunk-RA4DCRMR.mjs.map +0 -1
  532. package/dist/chunk-TAPCWMBV.mjs +0 -6
  533. package/dist/chunk-TJVZEDE3.js +0 -8
  534. package/dist/chunk-Y5QZPUL3.mjs.map +0 -1
  535. package/dist/chunk-YFX3Q56O.mjs.map +0 -1
  536. package/dist/chunk-YN7QHLWF.js.map +0 -1
  537. package/dist/chunk-YQTE32QK.js.map +0 -1
  538. package/dist/chunk-ZPLN537Q.mjs.map +0 -1
  539. package/dist/chunk-ZVI7MBVF.mjs.map +0 -1
  540. package/dist/discover-CYXYKHZ2.mjs +0 -4
  541. package/dist/discover-NGEPXZOD.js +0 -21
  542. package/dist/writeLLMsTxt-CQ7A4AAL.js +0 -19
  543. package/dist/writeLLMsTxt-NX5MSPYX.mjs +0 -10
  544. /package/dist/{blog → articles}/server.js.map +0 -0
  545. /package/dist/{blog → articles}/server.mjs.map +0 -0
package/dist/seo/index.js CHANGED
@@ -3,20 +3,20 @@
3
3
  var chunkDV2LJYFD_js = require('../chunk-DV2LJYFD.js');
4
4
  var chunkH6AU3WKF_js = require('../chunk-H6AU3WKF.js');
5
5
  var chunkJ7QI3GDX_js = require('../chunk-J7QI3GDX.js');
6
- var chunkDTWR7VRQ_js = require('../chunk-DTWR7VRQ.js');
7
- var chunkM45AL7EA_js = require('../chunk-M45AL7EA.js');
8
- var chunkFVW6FT6L_js = require('../chunk-FVW6FT6L.js');
6
+ var chunk254IW4FC_js = require('../chunk-254IW4FC.js');
7
+ var chunkTST2IKYO_js = require('../chunk-TST2IKYO.js');
8
+ var chunkOSU4QA5M_js = require('../chunk-OSU4QA5M.js');
9
9
  require('../chunk-CXAXZFFW.js');
10
- require('../chunk-YN7QHLWF.js');
10
+ require('../chunk-BBBJHYPH.js');
11
11
  require('../chunk-O5GHP7UO.js');
12
- require('../chunk-R7GHP3FY.js');
13
- require('../chunk-XBX2K3GA.js');
14
- require('../chunk-H5NBFNND.js');
12
+ require('../chunk-JONWE26J.js');
13
+ require('../chunk-IBJOGXQI.js');
14
+ require('../chunk-UZKXOZHR.js');
15
15
  require('../chunk-SWIKKSKL.js');
16
16
  require('../chunk-5RNAUYWE.js');
17
- require('../chunk-GDH42JAS.js');
18
- require('../chunk-7BI2RVQD.js');
19
- require('../chunk-TJVZEDE3.js');
17
+ require('../chunk-3GHPFLEH.js');
18
+ require('../chunk-TCZHRSWY.js');
19
+ require('../chunk-EL74YDNX.js');
20
20
  require('../chunk-SNAQBZPT.js');
21
21
  var react = require('react');
22
22
  var jsxRuntime = require('react/jsx-runtime');
@@ -25,7 +25,7 @@ var jsxRuntime = require('react/jsx-runtime');
25
25
  function withManagedMetadata(path, pageMetadata) {
26
26
  return async function generateMetadata(args, parent) {
27
27
  const resolvedPath = typeof path === "function" ? await path(args) : path;
28
- const managed = await chunkM45AL7EA_js.getManagedMetadata({ path: resolvedPath });
28
+ const managed = await chunkTST2IKYO_js.getManagedMetadata({ path: resolvedPath });
29
29
  if (!pageMetadata) {
30
30
  return managed;
31
31
  }
@@ -63,14 +63,14 @@ async function ManagedSchemaAsync({
63
63
  includeEntityGraph = true
64
64
  }) {
65
65
  const [schemas, pageData, entitySchemas] = await Promise.all([
66
- chunkFVW6FT6L_js.getSchemaMarkups(path, { includeTypes, excludeTypes }),
67
- chunkFVW6FT6L_js.getSEOPageData(path),
68
- includeEntityGraph ? chunkFVW6FT6L_js.getEntityEnhancedSchema(path).catch(() => []) : Promise.resolve([])
66
+ chunkOSU4QA5M_js.getSchemaMarkups(path, { includeTypes, excludeTypes }),
67
+ chunkOSU4QA5M_js.getSEOPageData(path),
68
+ includeEntityGraph ? chunkOSU4QA5M_js.getEntityEnhancedSchema(path).catch(() => []) : Promise.resolve([])
69
69
  ]);
70
70
  const page = pageData?.page;
71
71
  const siteUrl = pageData?.project?.site_url || "";
72
72
  const deny = new Set(excludeTypes ?? []);
73
- const fromSonor = (values) => values.map((v) => chunkFVW6FT6L_js.pruneSchemaTypes(v, deny)).filter((v) => v !== null);
73
+ const fromSonor = (values) => values.map((v) => chunkOSU4QA5M_js.pruneSchemaTypes(v, deny)).filter((v) => v !== null);
74
74
  const allSchemas = [
75
75
  ...fromSonor(entitySchemas),
76
76
  ...schemas.map((s) => s.schema_json),
@@ -78,9 +78,7 @@ async function ManagedSchemaAsync({
78
78
  ...fromSonor(page?.managed_schema ? [page.managed_schema] : []),
79
79
  ...additionalSchemas
80
80
  ];
81
- const hasBreadcrumb = allSchemas.some(
82
- (s) => s && typeof s === "object" && s["@type"] === "BreadcrumbList"
83
- );
81
+ const hasBreadcrumb = allSchemas.some(schemaContainsBreadcrumbList);
84
82
  if (!hasBreadcrumb && path !== "/" && siteUrl) {
85
83
  allSchemas.push(createBreadcrumbSchema(siteUrl, path));
86
84
  }
@@ -95,7 +93,7 @@ async function ManagedSchemaAsync({
95
93
  }
96
94
  if (allSchemas.length === 0 && !includeEntityGraph) {
97
95
  try {
98
- const fallbackSchemas = await chunkFVW6FT6L_js.getEntityEnhancedSchema(path);
96
+ const fallbackSchemas = await chunkOSU4QA5M_js.getEntityEnhancedSchema(path);
99
97
  allSchemas.push(...fallbackSchemas);
100
98
  } catch {
101
99
  }
@@ -124,7 +122,7 @@ async function ManagedSchemaAsync({
124
122
  async function LLMSchemaAsync({
125
123
  path
126
124
  }) {
127
- const { page: pageData, project } = await chunkFVW6FT6L_js.getSEOPageData(path);
125
+ const { page: pageData, project } = await chunkOSU4QA5M_js.getSEOPageData(path);
128
126
  const raw = pageData?.managed_llm_schema;
129
127
  const picked = chunkH6AU3WKF_js.pickManagedLlmSchemaForJsonLd(raw);
130
128
  if (!picked) {
@@ -182,6 +180,16 @@ function createSpeakableWebPageSchema(type, name, url, speakable) {
182
180
  speakable: speakableSpec
183
181
  };
184
182
  }
183
+ function schemaNodeHasType(node, type) {
184
+ if (!node || typeof node !== "object") return false;
185
+ const t = node["@type"];
186
+ return t === type || Array.isArray(t) && t.includes(type);
187
+ }
188
+ function schemaContainsBreadcrumbList(schema) {
189
+ if (schemaNodeHasType(schema, "BreadcrumbList")) return true;
190
+ const graph = schema?.["@graph"];
191
+ return Array.isArray(graph) && graph.some((node) => schemaNodeHasType(node, "BreadcrumbList"));
192
+ }
185
193
  function createBreadcrumbSchema(baseUrl, path, labels) {
186
194
  const segments = path.split("/").filter(Boolean);
187
195
  const items = segments.map((segment, index) => {
@@ -371,7 +379,7 @@ async function ManagedFAQAsync({
371
379
  showTitle = true,
372
380
  site
373
381
  }) {
374
- const faqData = await chunkFVW6FT6L_js.getFAQData(path, site);
382
+ const faqData = await chunkOSU4QA5M_js.getFAQData(path, site);
375
383
  if (!faqData || !faqData.items?.length) {
376
384
  return null;
377
385
  }
@@ -424,7 +432,7 @@ async function ManagedInternalLinksAsync({
424
432
  renderLink,
425
433
  site
426
434
  }) {
427
- const links = await chunkFVW6FT6L_js.getInternalLinks(path, { position, limit, site });
435
+ const links = await chunkOSU4QA5M_js.getInternalLinks(path, { position, limit, site });
428
436
  if (!links.length) {
429
437
  return null;
430
438
  }
@@ -501,7 +509,7 @@ async function ManagedContentAsync({
501
509
  injectEntityAnnotations: shouldInjectEntities = false,
502
510
  site
503
511
  }) {
504
- const block = await chunkFVW6FT6L_js.getContentBlock(path, section, site);
512
+ const block = await chunkOSU4QA5M_js.getContentBlock(path, section, site);
505
513
  if (!block) {
506
514
  if (fallback) {
507
515
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: fallback });
@@ -511,7 +519,7 @@ async function ManagedContentAsync({
511
519
  let entities = [];
512
520
  if (shouldInjectEntities) {
513
521
  try {
514
- entities = await chunkFVW6FT6L_js.getEntities();
522
+ entities = await chunkOSU4QA5M_js.getEntities();
515
523
  } catch (err) {
516
524
  console.warn("@sonordev/seo: Failed to fetch entities for annotation:", err);
517
525
  }
@@ -572,7 +580,7 @@ async function ManagedContentAsync({
572
580
  }
573
581
  }
574
582
  async function getManagedContentData(path, section, site) {
575
- return chunkFVW6FT6L_js.getContentBlock(path, section, site);
583
+ return chunkOSU4QA5M_js.getContentBlock(path, section, site);
576
584
  }
577
585
  function ManagedContent(props) {
578
586
  return /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: null, children: /* @__PURE__ */ jsxRuntime.jsx(ManagedContentAsync, { ...props }) });
@@ -698,103 +706,103 @@ Object.defineProperty(exports, "ManagedScripts", {
698
706
  });
699
707
  Object.defineProperty(exports, "SitemapSync", {
700
708
  enumerable: true,
701
- get: function () { return chunkDTWR7VRQ_js.SitemapSync; }
709
+ get: function () { return chunk254IW4FC_js.SitemapSync; }
702
710
  });
703
711
  Object.defineProperty(exports, "generateSitemap", {
704
712
  enumerable: true,
705
- get: function () { return chunkM45AL7EA_js.generateSitemap; }
713
+ get: function () { return chunkTST2IKYO_js.generateSitemap; }
706
714
  });
707
715
  Object.defineProperty(exports, "getABVariant", {
708
716
  enumerable: true,
709
- get: function () { return chunkM45AL7EA_js.getABVariant; }
717
+ get: function () { return chunkTST2IKYO_js.getABVariant; }
710
718
  });
711
719
  Object.defineProperty(exports, "getManagedMetadata", {
712
720
  enumerable: true,
713
- get: function () { return chunkM45AL7EA_js.getManagedMetadata; }
721
+ get: function () { return chunkTST2IKYO_js.getManagedMetadata; }
714
722
  });
715
723
  Object.defineProperty(exports, "getManagedMetadataWithAB", {
716
724
  enumerable: true,
717
- get: function () { return chunkM45AL7EA_js.getManagedMetadataWithAB; }
725
+ get: function () { return chunkTST2IKYO_js.getManagedMetadataWithAB; }
718
726
  });
719
727
  Object.defineProperty(exports, "getRedirect", {
720
728
  enumerable: true,
721
- get: function () { return chunkM45AL7EA_js.getRedirect; }
729
+ get: function () { return chunkTST2IKYO_js.getRedirect; }
722
730
  });
723
731
  Object.defineProperty(exports, "getRobotsDirective", {
724
732
  enumerable: true,
725
- get: function () { return chunkM45AL7EA_js.getRobotsDirective; }
733
+ get: function () { return chunkTST2IKYO_js.getRobotsDirective; }
726
734
  });
727
735
  Object.defineProperty(exports, "isIndexable", {
728
736
  enumerable: true,
729
- get: function () { return chunkM45AL7EA_js.isIndexable; }
737
+ get: function () { return chunkTST2IKYO_js.isIndexable; }
730
738
  });
731
739
  Object.defineProperty(exports, "getABTest", {
732
740
  enumerable: true,
733
- get: function () { return chunkFVW6FT6L_js.getABTest; }
741
+ get: function () { return chunkOSU4QA5M_js.getABTest; }
734
742
  });
735
743
  Object.defineProperty(exports, "getContentBlock", {
736
744
  enumerable: true,
737
- get: function () { return chunkFVW6FT6L_js.getContentBlock; }
745
+ get: function () { return chunkOSU4QA5M_js.getContentBlock; }
738
746
  });
739
747
  Object.defineProperty(exports, "getEntities", {
740
748
  enumerable: true,
741
- get: function () { return chunkFVW6FT6L_js.getEntities; }
749
+ get: function () { return chunkOSU4QA5M_js.getEntities; }
742
750
  });
743
751
  Object.defineProperty(exports, "getEntityEnhancedSchema", {
744
752
  enumerable: true,
745
- get: function () { return chunkFVW6FT6L_js.getEntityEnhancedSchema; }
753
+ get: function () { return chunkOSU4QA5M_js.getEntityEnhancedSchema; }
746
754
  });
747
755
  Object.defineProperty(exports, "getFAQData", {
748
756
  enumerable: true,
749
- get: function () { return chunkFVW6FT6L_js.getFAQData; }
757
+ get: function () { return chunkOSU4QA5M_js.getFAQData; }
750
758
  });
751
759
  Object.defineProperty(exports, "getInternalLinks", {
752
760
  enumerable: true,
753
- get: function () { return chunkFVW6FT6L_js.getInternalLinks; }
761
+ get: function () { return chunkOSU4QA5M_js.getInternalLinks; }
754
762
  });
755
763
  Object.defineProperty(exports, "getManagedScripts", {
756
764
  enumerable: true,
757
- get: function () { return chunkFVW6FT6L_js.getManagedScripts; }
765
+ get: function () { return chunkOSU4QA5M_js.getManagedScripts; }
758
766
  });
759
767
  Object.defineProperty(exports, "getPrimaryEntity", {
760
768
  enumerable: true,
761
- get: function () { return chunkFVW6FT6L_js.getPrimaryEntity; }
769
+ get: function () { return chunkOSU4QA5M_js.getPrimaryEntity; }
762
770
  });
763
771
  Object.defineProperty(exports, "getRedirectData", {
764
772
  enumerable: true,
765
- get: function () { return chunkFVW6FT6L_js.getRedirectData; }
773
+ get: function () { return chunkOSU4QA5M_js.getRedirectData; }
766
774
  });
767
775
  Object.defineProperty(exports, "getRobotsData", {
768
776
  enumerable: true,
769
- get: function () { return chunkFVW6FT6L_js.getRobotsData; }
777
+ get: function () { return chunkOSU4QA5M_js.getRobotsData; }
770
778
  });
771
779
  Object.defineProperty(exports, "getSEOPageData", {
772
780
  enumerable: true,
773
- get: function () { return chunkFVW6FT6L_js.getSEOPageData; }
781
+ get: function () { return chunkOSU4QA5M_js.getSEOPageData; }
774
782
  });
775
783
  Object.defineProperty(exports, "getSchemaMarkups", {
776
784
  enumerable: true,
777
- get: function () { return chunkFVW6FT6L_js.getSchemaMarkups; }
785
+ get: function () { return chunkOSU4QA5M_js.getSchemaMarkups; }
778
786
  });
779
787
  Object.defineProperty(exports, "getSitemapEntries", {
780
788
  enumerable: true,
781
- get: function () { return chunkFVW6FT6L_js.getSitemapEntries; }
789
+ get: function () { return chunkOSU4QA5M_js.getSitemapEntries; }
782
790
  });
783
791
  Object.defineProperty(exports, "getVisibilityScore", {
784
792
  enumerable: true,
785
- get: function () { return chunkFVW6FT6L_js.getVisibilityScore; }
793
+ get: function () { return chunkOSU4QA5M_js.getVisibilityScore; }
786
794
  });
787
795
  Object.defineProperty(exports, "getVisibilitySummary", {
788
796
  enumerable: true,
789
- get: function () { return chunkFVW6FT6L_js.getVisibilitySummary; }
797
+ get: function () { return chunkOSU4QA5M_js.getVisibilitySummary; }
790
798
  });
791
799
  Object.defineProperty(exports, "recordABImpression", {
792
800
  enumerable: true,
793
- get: function () { return chunkFVW6FT6L_js.recordABImpression; }
801
+ get: function () { return chunkOSU4QA5M_js.recordABImpression; }
794
802
  });
795
803
  Object.defineProperty(exports, "registerSitemap", {
796
804
  enumerable: true,
797
- get: function () { return chunkFVW6FT6L_js.registerSitemap; }
805
+ get: function () { return chunkOSU4QA5M_js.registerSitemap; }
798
806
  });
799
807
  exports.LLMSchema = LLMSchema;
800
808
  exports.LocationPageContent = LocationPageContent;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/seo/withManagedMetadata.ts","../../src/seo/ManagedSchema.tsx","../../src/seo/groundingSchema.ts","../../src/seo/ManagedFAQ.tsx","../../src/seo/ManagedInternalLinks.tsx","../../src/seo/ManagedContent.tsx","../../src/seo/LocationPageContent.tsx"],"names":["getManagedMetadata","getSchemaMarkups","getSEOPageData","getEntityEnhancedSchema","pruneSchemaTypes","jsx","safeJsonLd","pickManagedLlmSchemaForJsonLd","Suspense","jsxs","getFAQData","Fragment","getInternalLinks","getContentBlock","getEntities","cache"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/seo - withManagedMetadata\n *\n * Higher-order function that wraps Next.js generateMetadata to auto-merge\n * Portal-managed SEO data. Portal values serve as defaults; page-level\n * metadata returned by the caller takes priority.\n *\n * @example Zero-config (Portal manages everything):\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about')\n * ```\n *\n * @example With local overrides:\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about', async () => ({\n * title: 'About Us',\n * }))\n * ```\n *\n * @example Dynamic paths:\n * ```ts\n * export const generateMetadata = withManagedMetadata(\n * async ({ params }) => `/services/${(await params).slug}`\n * )\n * ```\n */\n\nimport type { Metadata, ResolvingMetadata } from 'next'\nimport { getManagedMetadata } from './getManagedMetadata'\n\ntype MetadataArgs = {\n params: Promise<Record<string, string>>\n searchParams?: Promise<Record<string, string>>\n}\n\ntype PathResolver =\n | string\n | ((args: MetadataArgs) => string | Promise<string>)\n\ntype PageMetadataFn = (\n args: MetadataArgs,\n parent: ResolvingMetadata\n) => Promise<Metadata> | Metadata\n\n/**\n * Wrap generateMetadata to auto-merge Portal managed metadata.\n *\n * - `path` can be a static string or a function that derives the path\n * from the page's params.\n * - `pageMetadata` (optional) returns page-specific overrides.\n * Anything it returns wins over Portal values.\n */\nexport function withManagedMetadata(\n path: PathResolver,\n pageMetadata?: PageMetadataFn,\n) {\n return async function generateMetadata(\n args: MetadataArgs,\n parent: ResolvingMetadata,\n ): Promise<Metadata> {\n const resolvedPath =\n typeof path === 'function' ? await path(args) : path\n\n // Fetch managed metadata from Portal (acts as defaults)\n const managed = await getManagedMetadata({ path: resolvedPath })\n\n // If no page-specific function, just return managed\n if (!pageMetadata) {\n return managed\n }\n\n // Get page-specific metadata (overrides managed)\n const pageSpecific = await pageMetadata(args, parent)\n\n // Deep merge: page-specific wins over managed\n return {\n ...managed,\n ...pageSpecific,\n openGraph: {\n ...(managed.openGraph as Record<string, unknown> | undefined),\n ...(pageSpecific.openGraph as Record<string, unknown> | undefined),\n },\n twitter: {\n ...(managed.twitter as Record<string, unknown> | undefined),\n ...(pageSpecific.twitter as Record<string, unknown> | undefined),\n },\n } as Metadata\n }\n}\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getSchemaMarkups, getEntityEnhancedSchema, getSEOPageData } from './server-api'\nimport type { ManagedSchemaProps } from './types'\nimport { pickManagedLlmSchemaForJsonLd } from '../llms/contract'\nimport { safeJsonLd } from './safeJsonLd'\nimport { pruneSchemaTypes } from './schema-filter'\n\n/**\n * Speakable configuration for schema markup\n */\nexport interface SpeakableSpec {\n /** CSS selectors for speakable content */\n cssSelector?: string[]\n /** XPath selectors for speakable content */\n xpath?: string[]\n}\n\n/**\n * Extended schema props with speakable and entity support\n */\nexport interface EnhancedManagedSchemaProps extends ManagedSchemaProps {\n /** Add speakable specification to page schema */\n speakable?: SpeakableSpec | boolean\n /** Page type for speakable (WebPage or Article) */\n pageType?: 'WebPage' | 'Article'\n /** Page name for speakable schema */\n pageName?: string\n /** Page URL for speakable schema */\n pageUrl?: string\n /** Include entity-enhanced schema from knowledge graph (AI Visibility) */\n includeEntityGraph?: boolean\n}\n\n/**\n * Default speakable selectors for common page elements\n */\nexport const DEFAULT_SPEAKABLE_SELECTORS = [\n 'h1',\n '[data-speakable=\"true\"]',\n '.page-summary',\n '.key-points',\n '.aeo-block[data-speakable=\"true\"]',\n]\n\n/**\n * ManagedSchema - Server Component that injects JSON-LD schema\n * \n * Fetches schema markup from Portal and renders as script tags.\n * Now with speakable support for voice assistants and AI systems.\n * \n * @example\n * ```tsx\n * // app/services/[slug]/page.tsx\n * import { ManagedSchema } from '@sonordev/site-kit/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <ManagedSchema\n * path={`/services/${params.slug}`}\n * speakable={true}\n * pageName=\"Family Law Services\"\n * pageUrl=\"https://example.com/services/family-law\"\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nasync function ManagedSchemaAsync({\n path,\n additionalSchemas = [],\n includeTypes,\n excludeTypes,\n speakable,\n pageType = 'WebPage',\n pageName,\n pageUrl,\n includeEntityGraph = true,\n}: EnhancedManagedSchemaProps): Promise<React.ReactElement | null> {\n // Fetch all data in parallel — avoids sequential waterfall that delays streaming\n const [schemas, pageData, entitySchemas] = await Promise.all([\n getSchemaMarkups(path, { includeTypes, excludeTypes }),\n getSEOPageData(path),\n includeEntityGraph\n ? getEntityEnhancedSchema(path).catch(() => [] as object[])\n : Promise.resolve([] as object[]),\n ])\n\n const page = pageData?.page\n const siteUrl = pageData?.project?.site_url || ''\n\n // Sonor's other schema sources get the same excludeTypes as the rows\n // (getSchemaMarkups already filtered those): an excluded type is dropped\n // wherever it sits. The site's own additionalSchemas are left as passed.\n const deny = new Set(excludeTypes ?? [])\n const fromSonor = (values: unknown[]) =>\n values.map(v => pruneSchemaTypes(v, deny)).filter(v => v !== null) as object[]\n\n // Combine all schemas: entity-enhanced + managed + page-auto-generated + additional\n const allSchemas = [\n ...fromSonor(entitySchemas),\n ...schemas.map((s: { schema_json?: object }) => s.schema_json),\n // Include auto-generated schema from Signal meta optimization\n ...fromSonor(page?.managed_schema ? [page.managed_schema] : []),\n ...additionalSchemas,\n ]\n\n // Auto-generate BreadcrumbList if none exists and path has segments\n const hasBreadcrumb = allSchemas.some(\n (s) => s && typeof s === 'object' && (s as Record<string, unknown>)['@type'] === 'BreadcrumbList'\n )\n if (!hasBreadcrumb && path !== '/' && siteUrl) {\n allSchemas.push(createBreadcrumbSchema(siteUrl, path))\n }\n\n // Add speakable schema if requested\n if (speakable && pageName && pageUrl) {\n const speakableSchema = createSpeakableWebPageSchema(\n pageType,\n pageName,\n pageUrl,\n typeof speakable === 'object' ? speakable : undefined\n )\n allSchemas.push(speakableSchema)\n }\n\n // If still empty, try entity-enhanced schema as last-resort fallback\n if (allSchemas.length === 0 && !includeEntityGraph) {\n try {\n const fallbackSchemas = await getEntityEnhancedSchema(path)\n allSchemas.push(...fallbackSchemas)\n } catch {\n // Silent fallback\n }\n }\n\n if (allSchemas.length === 0) {\n return null\n }\n\n // If multiple schemas, wrap in @graph\n const schemaContent = allSchemas.length === 1\n ? allSchemas[0]\n : {\n '@context': 'https://schema.org',\n '@graph': allSchemas\n .filter(s => s && typeof s === 'object')\n .map(s => {\n // Remove @context from individual schemas when in graph\n const { '@context': _, ...rest } = s as Record<string, unknown>\n return rest\n }),\n }\n\n // Add @context if not in graph mode\n const finalSchema = allSchemas.length === 1\n ? { '@context': 'https://schema.org', ...schemaContent as Record<string, unknown> }\n : schemaContent\n\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(finalSchema),\n }}\n />\n )\n}\n\n/**\n * LLMSchema - Server Component that injects LLM-optimized structured data\n * \n * This component renders AI-visibility optimized data that helps LLM crawlers\n * (like ChatGPT, Claude, Perplexity) better understand page content.\n * \n * The schema includes:\n * - Detailed description (100-200 words for context)\n * - Keywords and topics\n * - Target audience\n * - Content relationships\n * \n * @example\n * ```tsx\n * import { LLMSchema } from '@sonordev/site-kit/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <LLMSchema\n * path={`/services/${params.slug}`}\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nasync function LLMSchemaAsync({\n path,\n}: {\n projectId?: string\n path: string\n}): Promise<React.ReactElement | null> {\n const { page: pageData, project } = await getSEOPageData(path)\n\n const raw = pageData?.managed_llm_schema as Record<string, unknown> | undefined\n const picked = pickManagedLlmSchemaForJsonLd(raw)\n if (!picked) {\n return null\n }\n\n const siteUrl = (project?.site_url || '').replace(/\\/$/, '')\n const websiteId = siteUrl ? `${siteUrl}/#website` : undefined\n\n // Render as a special JSON-LD type that LLM crawlers can parse\n const llmSchema: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n ...picked,\n additionalType: 'https://sonor.io/ns/LLMOptimizedContent',\n }\n\n if (siteUrl && websiteId) {\n llmSchema.isPartOf = {\n '@type': 'WebSite',\n '@id': websiteId,\n url: siteUrl,\n }\n }\n\n return (\n <script\n type=\"application/ld+json\"\n data-llm-optimized=\"true\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(llmSchema),\n }}\n />\n )\n}\n\n/**\n * Generate schema for a specific type with managed data\n * \n * Helper to create common schema types\n */\nexport function createSchema(\n type: string,\n data: Record<string, unknown>\n): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': type,\n ...data,\n }\n}\n\n/**\n * Create a WebPage or Article schema with speakable specification\n * \n * This helps voice assistants and AI systems identify key content to read aloud.\n * \n * @see https://schema.org/speakable\n * @see https://developers.google.com/search/docs/appearance/structured-data/speakable\n */\nexport function createSpeakableWebPageSchema(\n type: 'WebPage' | 'Article',\n name: string,\n url: string,\n speakable?: SpeakableSpec\n): Record<string, unknown> {\n const speakableSpec: Record<string, unknown> = {\n '@type': 'SpeakableSpecification',\n }\n\n if (speakable?.cssSelector?.length) {\n speakableSpec.cssSelector = speakable.cssSelector\n } else if (speakable?.xpath?.length) {\n speakableSpec.xpath = speakable.xpath\n } else {\n // Use default selectors\n speakableSpec.cssSelector = DEFAULT_SPEAKABLE_SELECTORS\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': type,\n name,\n url,\n speakable: speakableSpec,\n }\n}\n\n/**\n * Create BreadcrumbList schema from path\n */\nexport function createBreadcrumbSchema(\n baseUrl: string,\n path: string,\n labels?: Record<string, string>\n): Record<string, unknown> {\n const segments = path.split('/').filter(Boolean)\n \n const items = segments.map((segment, index) => {\n const itemPath = '/' + segments.slice(0, index + 1).join('/')\n const label = labels?.[segment] || segment.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase())\n \n return {\n '@type': 'ListItem',\n position: index + 1,\n name: label,\n item: `${baseUrl}${itemPath}`,\n }\n })\n\n // Add home as first item\n items.unshift({\n '@type': 'ListItem',\n position: 0,\n name: 'Home',\n item: baseUrl,\n })\n\n // Re-number positions\n items.forEach((item, index) => {\n item.position = index + 1\n })\n\n return createSchema('BreadcrumbList', {\n itemListElement: items,\n })\n}\n\n/**\n * ManagedSchema — Suspense-wrapped so API fetches never block page streaming.\n * The hero and other page content flush immediately; schema scripts stream in when ready.\n */\nexport function ManagedSchema(props: EnhancedManagedSchemaProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedSchemaAsync {...props} />\n </Suspense>\n )\n}\n\n/**\n * LLMSchema — Suspense-wrapped so API fetches never block page streaming.\n */\nexport function LLMSchema(props: { projectId?: string; path: string }): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <LLMSchemaAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedSchema\n","/**\n * Optional JSON-LD stub when Portal does **not** emit Organization/WebSite.\n * Default product stance: Portal owns entity nodes; only use this when confirmed absent.\n */\n\nexport interface WebSiteOrganizationStubInput {\n name: string\n url: string\n sameAs?: string[]\n knowsAbout?: string[]\n}\n\n/**\n * Minimal WebSite + Organization pair with stable @id anchors for isPartOf links.\n */\nexport function createWebSiteOrganizationStub(\n input: WebSiteOrganizationStubInput,\n): Record<string, unknown>[] {\n const origin = input.url.replace(/\\/$/, '')\n const websiteId = `${origin}/#website`\n const orgId = `${origin}/#organization`\n const org: Record<string, unknown> = {\n '@type': 'Organization',\n '@id': orgId,\n name: input.name,\n url: origin,\n ...(input.sameAs?.length ? { sameAs: input.sameAs } : {}),\n ...(input.knowsAbout?.length ? { knowsAbout: input.knowsAbout } : {}),\n }\n const site: Record<string, unknown> = {\n '@type': 'WebSite',\n '@id': websiteId,\n url: origin,\n name: input.name,\n publisher: { '@id': orgId },\n }\n return [org, site]\n}\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getFAQData } from './server-api'\nimport type { ManagedFAQProps, FAQItem } from './types'\nimport { createSchema } from './ManagedSchema'\nimport { safeJsonLd } from './safeJsonLd'\n\n/**\n * Inline styles for the accordion FAQ (no external CSS dependency)\n */\nconst faqStyles = `\n.sk-faq-items {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.sk-faq-item {\n border-bottom: 1px solid rgba(0,0,0,0.08);\n}\n.sk-faq-item:first-child {\n border-top: 1px solid rgba(0,0,0,0.08);\n}\n.sk-faq-item summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n padding: 1.25rem 0;\n font-weight: 600;\n font-size: 1.05rem;\n line-height: 1.5;\n color: inherit;\n list-style: none;\n user-select: none;\n transition: color 0.15s ease;\n}\n.sk-faq-item summary:hover {\n opacity: 0.8;\n}\n.sk-faq-item summary::-webkit-details-marker {\n display: none;\n}\n.sk-faq-item summary::marker {\n display: none;\n content: '';\n}\n.sk-faq-chevron {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 1rem;\n transition: transform 0.2s ease;\n opacity: 0.5;\n}\n.sk-faq-item[open] .sk-faq-chevron {\n transform: rotate(180deg);\n}\n.sk-faq-answer {\n padding: 0 0 1.25rem 0;\n color: rgba(0,0,0,0.6);\n line-height: 1.75;\n font-size: 0.95rem;\n}\n.sk-faq-answer p {\n margin: 0 0 0.75rem 0;\n}\n.sk-faq-answer p:last-child {\n margin-bottom: 0;\n}\n.sk-faq-answer ul, .sk-faq-answer ol {\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n}\n.sk-faq-answer li {\n margin-bottom: 0.25rem;\n}\n.sk-faq-answer a {\n color: inherit;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n.sk-faq-title {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n}\n.sk-faq-description {\n color: rgba(0,0,0,0.6);\n margin-bottom: 2rem;\n font-size: 1rem;\n line-height: 1.6;\n}\n\n`\n\n/**\n * Chevron SVG (no icon library dependency)\n */\nfunction ChevronDown() {\n return (\n <svg\n className=\"sk-faq-chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n}\n\n/**\n * Default FAQ item renderer – uses native <details>/<summary> for toggle\n */\nfunction DefaultFAQItem({ item, index }: { item: FAQItem; index: number }) {\n return (\n <details key={item.id} className=\"sk-faq-item\">\n <summary>\n <span>{item.question}</span>\n <ChevronDown />\n </summary>\n <div\n className=\"sk-faq-answer\"\n dangerouslySetInnerHTML={{ __html: item.answer }}\n />\n </details>\n )\n}\n\n/**\n * Generate FAQ schema from items\n * \n * IMPORTANT: This is the ONLY place FAQ schema (FAQPage) is generated.\n * The CLI setup command does NOT generate FAQ schema - it only extracts/uploads\n * FAQ data to the Portal. This component then dynamically generates the schema\n * from that data, ensuring FAQ changes in Portal automatically update the schema.\n */\nfunction generateFAQSchema(items: FAQItem[]): Record<string, unknown> {\n return createSchema('FAQPage', {\n mainEntity: items\n .filter(item => item.is_visible)\n .map(item => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n },\n })),\n })\n}\n\n/**\n * ManagedFAQ - Server Component that renders FAQ section with schema\n * \n * Fetches FAQ content from Portal and renders with optional schema injection\n * \n * @example\n * ```tsx\n * // app/services/plumbing/page.tsx\n * import { ManagedFAQ } from '@sonordev/site-kit/seo'\n * \n * export default async function PlumbingPage() {\n * return (\n * <main>\n * <h1>Plumbing Services</h1>\n * <section>\n * <ManagedFAQ\n * path=\"/services/plumbing\"\n * showTitle\n * includeSchema\n * />\n * </section>\n * </main>\n * )\n * }\n * ```\n */\nasync function ManagedFAQAsync({\n path,\n className,\n renderItem,\n includeSchema = true,\n showTitle = true,\n site,\n}: ManagedFAQProps): Promise<React.ReactElement | null> {\n const faqData = await getFAQData(path, site)\n\n if (!faqData || !faqData.items?.length) {\n return null\n }\n\n const visibleItems = faqData.items.filter((item: FAQItem) => item.is_visible)\n \n if (visibleItems.length === 0) {\n return null\n }\n\n // Sort by order\n visibleItems.sort((a: FAQItem, b: FAQItem) => a.order - b.order)\n\n const shouldIncludeSchema = includeSchema && faqData.include_schema\n\n return (\n <>\n {shouldIncludeSchema && (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(generateFAQSchema(visibleItems)),\n }}\n />\n )}\n {/* Embedded styles for accordion FAQ (no external CSS file needed) */}\n <style dangerouslySetInnerHTML={{ __html: faqStyles }} />\n <div className={className || 'sk-faq'}>\n {showTitle && faqData.title && (\n <h2 className=\"sk-faq-title\">{faqData.title}</h2>\n )}\n {faqData.description && (\n <p className=\"sk-faq-description\">{faqData.description}</p>\n )}\n <div className=\"sk-faq-items\">\n {visibleItems.map((item: FAQItem, index: number) => \n renderItem \n ? renderItem(item, index)\n : <DefaultFAQItem key={item.id} item={item} index={index} />\n )}\n </div>\n </div>\n </>\n )\n}\n\n/**\n * ManagedFAQ — Suspense-wrapped so the FAQ API fetch never blocks page streaming.\n */\nexport function ManagedFAQ(props: ManagedFAQProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedFAQAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedFAQ\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getInternalLinks } from './server-api'\nimport type { ManagedInternalLinksProps, ManagedLink } from './types'\n\n/**\n * Default link renderer\n */\nfunction DefaultLinkRenderer({ link }: { link: ManagedLink }) {\n const href = link.target_url || link.target_path\n \n return (\n <a \n key={link.id}\n href={href}\n className=\"sk-internal-link\"\n >\n {link.anchor_text}\n </a>\n )\n}\n\n/**\n * ManagedInternalLinks - Server Component for AI-suggested internal links\n * \n * Fetches internal link suggestions from Portal and renders them\n * \n * @example\n * ```tsx\n * // In your article component\n * import { ManagedInternalLinks } from '@sonordev/site-kit/seo'\n * \n * export default async function BlogPost({ params }) {\n * return (\n * <article>\n * <p>Your content here...</p>\n * \n * <ManagedInternalLinks\n * path={`/blog/${params.slug}`}\n * position=\"bottom\"\n * limit={5}\n * />\n * </article>\n * )\n * }\n * ```\n */\nasync function ManagedInternalLinksAsync({\n path,\n position = 'bottom',\n limit = 5,\n className,\n renderLink,\n site,\n}: ManagedInternalLinksProps): Promise<React.ReactElement | null> {\n const links = await getInternalLinks(path, { position, limit, site })\n\n if (!links.length) {\n return null\n }\n\n const containerClass = className || `sk-internal-links sk-internal-links--${position}`\n\n // Different layouts based on position\n if (position === 'inline') {\n // Inline links are meant to be inserted into content\n return (\n <span className={containerClass}>\n {links.map((link: ManagedLink) => \n renderLink ? renderLink(link) : <DefaultLinkRenderer key={link.id} link={link} />\n )}\n </span>\n )\n }\n\n if (position === 'sidebar') {\n return (\n <aside className={containerClass}>\n <h4 className=\"sk-internal-links-title\">Related Pages</h4>\n <ul className=\"sk-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </aside>\n )\n }\n\n if (position === 'related') {\n return (\n <nav className={containerClass} aria-label=\"Related content\">\n <h3 className=\"sk-internal-links-title\">You May Also Like</h3>\n <div className=\"sk-internal-links-grid\">\n {links.map((link: ManagedLink) => (\n <div key={link.id} className=\"sk-internal-link-card\">\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n {link.context && (\n <p className=\"sk-internal-link-context\">{link.context}</p>\n )}\n </div>\n ))}\n </div>\n </nav>\n )\n }\n\n // Default: bottom position\n return (\n <div className={containerClass}>\n <h4 className=\"sk-internal-links-title\">Related Articles</h4>\n <ul className=\"sk-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport function ManagedInternalLinks(props: ManagedInternalLinksProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedInternalLinksAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedInternalLinks\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getContentBlock, getEntities, getPrimaryEntity } from './server-api'\nimport type { ManagedContentProps, ManagedContentBlock, SEOEntity } from './types'\n\n/**\n * Parse and render markdown content (basic support)\n * For full markdown, use a proper parser in your custom renderer\n */\nfunction renderMarkdown(content: string): string {\n return content\n // Headers\n .replace(/^### (.*$)/gim, '<h3>$1</h3>')\n .replace(/^## (.*$)/gim, '<h2>$1</h2>')\n .replace(/^# (.*$)/gim, '<h1>$1</h1>')\n // Bold\n .replace(/\\*\\*(.*)\\*\\*/gim, '<strong>$1</strong>')\n // Italic\n .replace(/\\*(.*)\\*/gim, '<em>$1</em>')\n // Links\n .replace(/\\[(.*?)\\]\\((.*?)\\)/gim, '<a href=\"$2\">$1</a>')\n // Paragraphs\n .replace(/\\n\\n/gim, '</p><p>')\n .replace(/^(.+)$/gim, '<p>$1</p>')\n}\n\n/**\n * Inject entity annotations into HTML content\n * Wraps entity mentions with data-sonor-entity attributes for knowledge graph linking\n */\nfunction injectEntityAnnotations(html: string, entities: SEOEntity[]): string {\n if (!entities.length) return html\n \n let annotatedHtml = html\n \n // Sort entities by name length (longest first) to avoid partial matches\n const sortedEntities = [...entities].sort((a, b) => b.name.length - a.name.length)\n \n for (const entity of sortedEntities) {\n // Skip very short names to avoid false positives\n if (entity.name.length < 3) continue\n \n // Create case-insensitive regex for entity name\n // Avoid matching inside HTML tags or existing annotations\n const regex = new RegExp(\n `(?<![\\\\w-])(?<!data-sonor-entity=\")${escapeRegExp(entity.name)}(?![\\\\w-])`,\n 'gi'\n )\n \n // Determine schema type for microdata\n const schemaType = getSchemaTypeForEntity(entity.entity_type)\n \n annotatedHtml = annotatedHtml.replace(regex, (match) => {\n return `<span class=\"aeo-entity aeo-entity-${entity.entity_type}\" ` +\n `data-sonor-entity=\"${entity.id}\" ` +\n `data-sonor-entity-type=\"${entity.entity_type}\" ` +\n `data-sonor-entity-name=\"${entity.name}\" ` +\n `itemscope itemtype=\"https://schema.org/${schemaType}\">` +\n `<span itemprop=\"name\">${match}</span></span>`\n })\n }\n \n return annotatedHtml\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction getSchemaTypeForEntity(entityType: string): string {\n const typeMap: Record<string, string> = {\n organization: 'Organization',\n person: 'Person',\n service: 'Service',\n product: 'Product',\n location: 'Place',\n concept: 'Thing',\n credential: 'EducationalOccupationalCredential',\n }\n return typeMap[entityType] || 'Thing'\n}\n\n/**\n * ManagedContent - Server Component for CMS-controlled content blocks\n * \n * Fetches content sections from Portal and renders them\n * Supports HTML, Markdown, JSON, and React component references\n * \n * @example\n * ```tsx\n * // Hero section managed by Portal\n * import { ManagedContent } from '@sonordev/site-kit/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <main>\n * <ManagedContent\n * path={`/services/${params.slug}`}\n * section=\"hero\"\n * fallback={<DefaultHero />}\n * />\n *\n * <ManagedContent\n * path={`/services/${params.slug}`}\n * section=\"features\"\n * />\n *\n * <ManagedContent\n * path={`/services/${params.slug}`}\n * section=\"cta\"\n * />\n * </main>\n * )\n * }\n * ```\n */\nasync function ManagedContentAsync({\n path,\n section,\n fallback,\n className,\n components = {},\n injectEntityAnnotations: shouldInjectEntities = false,\n site,\n}: ManagedContentProps): Promise<React.ReactElement | null> {\n const block = await getContentBlock(path, section, site)\n\n if (!block) {\n if (fallback) {\n return <>{fallback}</>\n }\n return null\n }\n\n // Fetch entities if annotation is enabled\n let entities: SEOEntity[] = []\n if (shouldInjectEntities) {\n try {\n entities = await getEntities() as SEOEntity[]\n } catch (err) {\n console.warn('@sonordev/seo: Failed to fetch entities for annotation:', err)\n }\n }\n\n const containerClass = className || `sk-content sk-content--${section}`\n\n // Helper to process HTML with optional entity injection\n const processHtml = (html: string): string => {\n if (shouldInjectEntities && entities.length > 0) {\n return injectEntityAnnotations(html, entities)\n }\n return html\n }\n\n // Handle different content types\n switch (block.content_type) {\n case 'html':\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: processHtml(block.content as string) }}\n />\n )\n\n case 'markdown':\n const htmlContent = processHtml(renderMarkdown(block.content as string))\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: htmlContent }}\n />\n )\n\n case 'json':\n // JSON content for structured data - render as data attributes or custom handling\n const jsonData = typeof block.content === 'string' \n ? JSON.parse(block.content)\n : block.content\n\n return (\n <div \n className={containerClass}\n data-content={JSON.stringify(jsonData)}\n >\n {/* Render JSON structure - customize based on your needs */}\n {jsonData.title && <h2>{jsonData.title}</h2>}\n {jsonData.subtitle && <p className=\"subtitle\">{jsonData.subtitle}</p>}\n {jsonData.content && <div dangerouslySetInnerHTML={{ __html: jsonData.content }} />}\n {jsonData.items && (\n <ul>\n {jsonData.items.map((item: { text: string } | string, index: number) => (\n <li key={index}>{typeof item === 'string' ? item : item.text}</li>\n ))}\n </ul>\n )}\n </div>\n )\n\n case 'react':\n // React component reference - lookup from provided components map\n const componentData = typeof block.content === 'string'\n ? JSON.parse(block.content)\n : block.content as Record<string, unknown>\n\n const componentName = componentData.component as string\n const componentProps = componentData.props as Record<string, unknown> || {}\n\n const Component = components[componentName]\n \n if (!Component) {\n console.warn(`@sonordev/seo: Component \"${componentName}\" not found in components map`)\n return fallback ? <>{fallback}</> : null\n }\n\n return (\n <div className={containerClass}>\n <Component {...componentProps} />\n </div>\n )\n\n default:\n console.warn(`@sonordev/seo: Unknown content type \"${block.content_type}\"`)\n return fallback ? <>{fallback}</> : null\n }\n}\n\n/**\n * Get content block data without rendering\n * \n * Useful when you need to access the raw data. `site` is the sub-site host\n * override for multi-site projects; it resolves from NEXT_PUBLIC_SITE_URL when\n * omitted.\n */\nexport async function getManagedContentData(\n path: string,\n section: string,\n site?: string\n): Promise<ManagedContentBlock | null> {\n return getContentBlock(path, section, site)\n}\n\nexport function ManagedContent(props: ManagedContentProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedContentAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedContent\n","/**\n * @deprecated DO NOT USE in new code. It POSTs `project_id` to the public\n * `/api/public/seo/location-content` route with no `x-api-key`, violating the\n * key-only auth contract every other site-kit fetch follows (the route itself\n * exists and answers for any project id). No site in the workspace renders it.\n * Kept exported so existing imports keep compiling; it renders the section when\n * the route returns one and `fallback` otherwise.\n *\n * LocationPageContent - Server Component for fetching location page sections\n */\n\nimport * as React from 'react'\nimport { cache, Suspense } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface LocationPageContentProps {\n /** Sonor project ID */\n projectId: string\n /** Page path (e.g., /areas/seattle-wa/plumbing) */\n path: string\n /** Section ID or type to fetch (e.g., \"hero\", \"intro\", \"services\") */\n section: string\n /** Fallback content if section not found */\n fallback?: React.ReactNode\n /** Additional className for wrapper */\n className?: string\n /** Custom renderer for the section data */\n render?: (data: LocationSectionData) => React.ReactNode\n}\n\nexport interface LocationSectionData {\n type: string\n content: any\n}\n\nexport interface HeroSectionContent {\n title: string\n subtitle?: string\n cta_text?: string\n cta_href?: string\n stats?: Array<{ label: string; value: string }>\n background_image?: string\n}\n\nexport interface ServiceGridContent {\n services: Array<{\n title: string\n description: string\n href: string\n icon?: string\n }>\n}\n\nexport interface TextSectionContent {\n heading?: string\n paragraphs: string[]\n html?: string\n}\n\n// ============================================\n// API Config\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io'\n return { apiUrl }\n}\n\n// ============================================\n// Cached API Call\n// ============================================\n\n/**\n * Fetch location page section content from Portal\n * Cached with React's cache() for request deduplication\n */\nexport const getLocationSection = cache(async (\n projectId: string,\n path: string,\n section: string\n): Promise<LocationSectionData | null> => {\n const { apiUrl } = getApiConfig()\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/location-content`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n project_id: projectId,\n path,\n section,\n }),\n next: { revalidate: 3600 }, // Cache for 1 hour\n })\n \n if (!response.ok) {\n console.error(`LocationPageContent: Failed to fetch section \"${section}\" for path \"${path}\"`)\n return null\n }\n \n const data = await response.json()\n return data\n } catch (error) {\n console.error('LocationPageContent: API error:', error)\n return null\n }\n})\n\n// ============================================\n// Default Renderers\n// ============================================\n\nfunction HeroRenderer({ data, className }: { data: HeroSectionContent; className?: string }) {\n return (\n <section className={className || 'location-hero'}>\n <h1>{data.title}</h1>\n {data.subtitle && <p className=\"subtitle\">{data.subtitle}</p>}\n {data.stats && (\n <div className=\"stats-grid\">\n {data.stats.map((stat, i) => (\n <div key={i} className=\"stat\">\n <span className=\"stat-value\">{stat.value}</span>\n <span className=\"stat-label\">{stat.label}</span>\n </div>\n ))}\n </div>\n )}\n {data.cta_text && data.cta_href && (\n <a href={data.cta_href} className=\"cta-button\">\n {data.cta_text}\n </a>\n )}\n </section>\n )\n}\n\nfunction TextRenderer({ data, className }: { data: TextSectionContent; className?: string }) {\n if (data.html) {\n return (\n <section \n className={className || 'location-text'} \n dangerouslySetInnerHTML={{ __html: data.html }} \n />\n )\n }\n \n return (\n <section className={className || 'location-text'}>\n {data.heading && <h2>{data.heading}</h2>}\n {data.paragraphs.map((p, i) => (\n <p key={i}>{p}</p>\n ))}\n </section>\n )\n}\n\nfunction ServicesGridRenderer({ data, className }: { data: ServiceGridContent; className?: string }) {\n return (\n <section className={className || 'location-services-grid'}>\n <div className=\"services-list\">\n {data.services.map((service, i) => (\n <a key={i} href={service.href} className=\"service-card\">\n {service.icon && <span className=\"service-icon\">{service.icon}</span>}\n <h3>{service.title}</h3>\n <p>{service.description}</p>\n </a>\n ))}\n </div>\n </section>\n )\n}\n\nfunction DefaultRenderer({ data, className }: { data: any; className?: string }) {\n // Fallback: just render as JSON for debugging\n if (process.env.NODE_ENV === 'development') {\n return (\n <section className={className}>\n <pre style={{ fontSize: '12px', background: '#f0f0f0', padding: '1rem' }}>\n {JSON.stringify(data, null, 2)}\n </pre>\n </section>\n )\n }\n \n // In production, try to render content as text/html\n if (typeof data.content === 'string') {\n return (\n <section \n className={className} \n dangerouslySetInnerHTML={{ __html: data.content }} \n />\n )\n }\n \n return null\n}\n\n// ============================================\n// Main Component\n// ============================================\n\n/**\n * LocationPageContent - Server Component\n * \n * Fetches and renders a section of a location page from Portal.\n * Content is fully editable in Portal → SEO → Location Pages.\n */\nasync function LocationPageContentAsync({\n projectId,\n path,\n section,\n fallback = null,\n className,\n render,\n}: LocationPageContentProps): Promise<React.ReactElement | null> {\n const data = await getLocationSection(projectId, path, section)\n \n if (!data) {\n return fallback as React.ReactElement | null\n }\n \n // If custom renderer provided, use it\n if (render) {\n return <>{render(data)}</>\n }\n \n // Use default renderers based on section type\n switch (data.type) {\n case 'hero':\n return <HeroRenderer data={data.content as HeroSectionContent} className={className} />\n \n case 'text':\n case 'intro':\n case 'about':\n case 'about_location':\n return <TextRenderer data={data.content as TextSectionContent} className={className} />\n \n case 'services_grid':\n case 'services':\n return <ServicesGridRenderer data={data.content as ServiceGridContent} className={className} />\n \n default:\n return <DefaultRenderer data={data} className={className} />\n }\n}\n\n/**\n * LocationPageContent — Suspense-wrapped so API fetches never block page streaming.\n */\nexport function LocationPageContent(props: LocationPageContentProps): React.ReactElement {\n return (\n <Suspense fallback={props.fallback as React.ReactElement ?? null}>\n <LocationPageContentAsync {...props} />\n </Suspense>\n )\n}\n\n// Export types for external use\nexport type {\n HeroSectionContent as LocationHeroContent,\n ServiceGridContent as LocationServicesContent,\n TextSectionContent as LocationTextContent,\n}\n"]}
1
+ {"version":3,"sources":["../../src/seo/withManagedMetadata.ts","../../src/seo/ManagedSchema.tsx","../../src/seo/groundingSchema.ts","../../src/seo/ManagedFAQ.tsx","../../src/seo/ManagedInternalLinks.tsx","../../src/seo/ManagedContent.tsx","../../src/seo/LocationPageContent.tsx"],"names":["getManagedMetadata","getSchemaMarkups","getSEOPageData","getEntityEnhancedSchema","pruneSchemaTypes","jsx","safeJsonLd","pickManagedLlmSchemaForJsonLd","Suspense","jsxs","getFAQData","Fragment","getInternalLinks","getContentBlock","getEntities","cache"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @sonordev/site-kit/seo - withManagedMetadata\n *\n * Higher-order function that wraps Next.js generateMetadata to auto-merge\n * Portal-managed SEO data. Portal values serve as defaults; page-level\n * metadata returned by the caller takes priority.\n *\n * @example Zero-config (Portal manages everything):\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about')\n * ```\n *\n * @example With local overrides:\n * ```ts\n * export const generateMetadata = withManagedMetadata('/about', async () => ({\n * title: 'About Us',\n * }))\n * ```\n *\n * @example Dynamic paths:\n * ```ts\n * export const generateMetadata = withManagedMetadata(\n * async ({ params }) => `/services/${(await params).slug}`\n * )\n * ```\n */\n\nimport type { Metadata, ResolvingMetadata } from 'next'\nimport { getManagedMetadata } from './getManagedMetadata'\n\ntype MetadataArgs = {\n params: Promise<Record<string, string>>\n searchParams?: Promise<Record<string, string>>\n}\n\ntype PathResolver =\n | string\n | ((args: MetadataArgs) => string | Promise<string>)\n\ntype PageMetadataFn = (\n args: MetadataArgs,\n parent: ResolvingMetadata\n) => Promise<Metadata> | Metadata\n\n/**\n * Wrap generateMetadata to auto-merge Portal managed metadata.\n *\n * - `path` can be a static string or a function that derives the path\n * from the page's params.\n * - `pageMetadata` (optional) returns page-specific overrides.\n * Anything it returns wins over Portal values.\n */\nexport function withManagedMetadata(\n path: PathResolver,\n pageMetadata?: PageMetadataFn,\n) {\n return async function generateMetadata(\n args: MetadataArgs,\n parent: ResolvingMetadata,\n ): Promise<Metadata> {\n const resolvedPath =\n typeof path === 'function' ? await path(args) : path\n\n // Fetch managed metadata from Portal (acts as defaults)\n const managed = await getManagedMetadata({ path: resolvedPath })\n\n // If no page-specific function, just return managed\n if (!pageMetadata) {\n return managed\n }\n\n // Get page-specific metadata (overrides managed)\n const pageSpecific = await pageMetadata(args, parent)\n\n // Deep merge: page-specific wins over managed\n return {\n ...managed,\n ...pageSpecific,\n openGraph: {\n ...(managed.openGraph as Record<string, unknown> | undefined),\n ...(pageSpecific.openGraph as Record<string, unknown> | undefined),\n },\n twitter: {\n ...(managed.twitter as Record<string, unknown> | undefined),\n ...(pageSpecific.twitter as Record<string, unknown> | undefined),\n },\n } as Metadata\n }\n}\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getSchemaMarkups, getEntityEnhancedSchema, getSEOPageData } from './server-api'\nimport type { ManagedSchemaProps } from './types'\nimport { pickManagedLlmSchemaForJsonLd } from '../llms/contract'\nimport { safeJsonLd } from './safeJsonLd'\nimport { pruneSchemaTypes } from './schema-filter'\n\n/**\n * Speakable configuration for schema markup\n */\nexport interface SpeakableSpec {\n /** CSS selectors for speakable content */\n cssSelector?: string[]\n /** XPath selectors for speakable content */\n xpath?: string[]\n}\n\n/**\n * Extended schema props with speakable and entity support\n */\nexport interface EnhancedManagedSchemaProps extends ManagedSchemaProps {\n /** Add speakable specification to page schema */\n speakable?: SpeakableSpec | boolean\n /** Page type for speakable (WebPage or Article) */\n pageType?: 'WebPage' | 'Article'\n /** Page name for speakable schema */\n pageName?: string\n /** Page URL for speakable schema */\n pageUrl?: string\n /** Include entity-enhanced schema from knowledge graph (AI Visibility) */\n includeEntityGraph?: boolean\n}\n\n/**\n * Default speakable selectors for common page elements\n */\nexport const DEFAULT_SPEAKABLE_SELECTORS = [\n 'h1',\n '[data-speakable=\"true\"]',\n '.page-summary',\n '.key-points',\n '.aeo-block[data-speakable=\"true\"]',\n]\n\n/**\n * ManagedSchema - Server Component that injects JSON-LD schema\n * \n * Fetches schema markup from Portal and renders as script tags.\n * Now with speakable support for voice assistants and AI systems.\n * \n * @example\n * ```tsx\n * // app/services/[slug]/page.tsx\n * import { ManagedSchema } from '@sonordev/site-kit/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <ManagedSchema\n * path={`/services/${params.slug}`}\n * speakable={true}\n * pageName=\"Family Law Services\"\n * pageUrl=\"https://example.com/services/family-law\"\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nasync function ManagedSchemaAsync({\n path,\n additionalSchemas = [],\n includeTypes,\n excludeTypes,\n speakable,\n pageType = 'WebPage',\n pageName,\n pageUrl,\n includeEntityGraph = true,\n}: EnhancedManagedSchemaProps): Promise<React.ReactElement | null> {\n // Fetch all data in parallel — avoids sequential waterfall that delays streaming\n const [schemas, pageData, entitySchemas] = await Promise.all([\n getSchemaMarkups(path, { includeTypes, excludeTypes }),\n getSEOPageData(path),\n includeEntityGraph\n ? getEntityEnhancedSchema(path).catch(() => [] as object[])\n : Promise.resolve([] as object[]),\n ])\n\n const page = pageData?.page\n const siteUrl = pageData?.project?.site_url || ''\n\n // Sonor's other schema sources get the same excludeTypes as the rows\n // (getSchemaMarkups already filtered those): an excluded type is dropped\n // wherever it sits. The site's own additionalSchemas are left as passed.\n const deny = new Set(excludeTypes ?? [])\n const fromSonor = (values: unknown[]) =>\n values.map(v => pruneSchemaTypes(v, deny)).filter(v => v !== null) as object[]\n\n // Combine all schemas: entity-enhanced + managed + page-auto-generated + additional\n const allSchemas = [\n ...fromSonor(entitySchemas),\n ...schemas.map((s: { schema_json?: object }) => s.schema_json),\n // Include auto-generated schema from Signal meta optimization\n ...fromSonor(page?.managed_schema ? [page.managed_schema] : []),\n ...additionalSchemas,\n ]\n\n // Auto-generate BreadcrumbList if none exists and path has segments.\n // A schema's `@type` can be an array, and Sonor's managed_schema and entity\n // schemas often arrive as one `@graph` wrapper rather than a flat object, so\n // a top-level `@type === 'BreadcrumbList'` check alone misses a breadcrumb\n // nested inside `@graph` and synthesizes a second, duplicate one.\n const hasBreadcrumb = allSchemas.some(schemaContainsBreadcrumbList)\n if (!hasBreadcrumb && path !== '/' && siteUrl) {\n allSchemas.push(createBreadcrumbSchema(siteUrl, path))\n }\n\n // Add speakable schema if requested\n if (speakable && pageName && pageUrl) {\n const speakableSchema = createSpeakableWebPageSchema(\n pageType,\n pageName,\n pageUrl,\n typeof speakable === 'object' ? speakable : undefined\n )\n allSchemas.push(speakableSchema)\n }\n\n // If still empty, try entity-enhanced schema as last-resort fallback\n if (allSchemas.length === 0 && !includeEntityGraph) {\n try {\n const fallbackSchemas = await getEntityEnhancedSchema(path)\n allSchemas.push(...fallbackSchemas)\n } catch {\n // Silent fallback\n }\n }\n\n if (allSchemas.length === 0) {\n return null\n }\n\n // If multiple schemas, wrap in @graph\n const schemaContent = allSchemas.length === 1\n ? allSchemas[0]\n : {\n '@context': 'https://schema.org',\n '@graph': allSchemas\n .filter(s => s && typeof s === 'object')\n .map(s => {\n // Remove @context from individual schemas when in graph\n const { '@context': _, ...rest } = s as Record<string, unknown>\n return rest\n }),\n }\n\n // Add @context if not in graph mode\n const finalSchema = allSchemas.length === 1\n ? { '@context': 'https://schema.org', ...schemaContent as Record<string, unknown> }\n : schemaContent\n\n return (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(finalSchema),\n }}\n />\n )\n}\n\n/**\n * LLMSchema - Server Component that injects LLM-optimized structured data\n * \n * This component renders AI-visibility optimized data that helps LLM crawlers\n * (like ChatGPT, Claude, Perplexity) better understand page content.\n * \n * The schema includes:\n * - Detailed description (100-200 words for context)\n * - Keywords and topics\n * - Target audience\n * - Content relationships\n * \n * @example\n * ```tsx\n * import { LLMSchema } from '@sonordev/site-kit/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <>\n * <LLMSchema\n * path={`/services/${params.slug}`}\n * />\n * <main>...</main>\n * </>\n * )\n * }\n * ```\n */\nasync function LLMSchemaAsync({\n path,\n}: {\n projectId?: string\n path: string\n}): Promise<React.ReactElement | null> {\n const { page: pageData, project } = await getSEOPageData(path)\n\n const raw = pageData?.managed_llm_schema as Record<string, unknown> | undefined\n const picked = pickManagedLlmSchemaForJsonLd(raw)\n if (!picked) {\n return null\n }\n\n const siteUrl = (project?.site_url || '').replace(/\\/$/, '')\n const websiteId = siteUrl ? `${siteUrl}/#website` : undefined\n\n // Render as a special JSON-LD type that LLM crawlers can parse\n const llmSchema: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': 'WebPage',\n ...picked,\n additionalType: 'https://sonor.io/ns/LLMOptimizedContent',\n }\n\n if (siteUrl && websiteId) {\n llmSchema.isPartOf = {\n '@type': 'WebSite',\n '@id': websiteId,\n url: siteUrl,\n }\n }\n\n return (\n <script\n type=\"application/ld+json\"\n data-llm-optimized=\"true\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(llmSchema),\n }}\n />\n )\n}\n\n/**\n * Generate schema for a specific type with managed data\n * \n * Helper to create common schema types\n */\nexport function createSchema(\n type: string,\n data: Record<string, unknown>\n): Record<string, unknown> {\n return {\n '@context': 'https://schema.org',\n '@type': type,\n ...data,\n }\n}\n\n/**\n * Create a WebPage or Article schema with speakable specification\n * \n * This helps voice assistants and AI systems identify key content to read aloud.\n * \n * @see https://schema.org/speakable\n * @see https://developers.google.com/search/docs/appearance/structured-data/speakable\n */\nexport function createSpeakableWebPageSchema(\n type: 'WebPage' | 'Article',\n name: string,\n url: string,\n speakable?: SpeakableSpec\n): Record<string, unknown> {\n const speakableSpec: Record<string, unknown> = {\n '@type': 'SpeakableSpecification',\n }\n\n if (speakable?.cssSelector?.length) {\n speakableSpec.cssSelector = speakable.cssSelector\n } else if (speakable?.xpath?.length) {\n speakableSpec.xpath = speakable.xpath\n } else {\n // Use default selectors\n speakableSpec.cssSelector = DEFAULT_SPEAKABLE_SELECTORS\n }\n\n return {\n '@context': 'https://schema.org',\n '@type': type,\n name,\n url,\n speakable: speakableSpec,\n }\n}\n\n/** True when a JSON-LD node's `@type` is or includes `type` (the value is a string or a string array). */\nfunction schemaNodeHasType(node: unknown, type: string): boolean {\n if (!node || typeof node !== 'object') return false\n const t = (node as Record<string, unknown>)['@type']\n return t === type || (Array.isArray(t) && t.includes(type))\n}\n\n/**\n * True when `schema` is a BreadcrumbList, or a `@graph` wrapper containing one.\n * Sonor's managed_schema and entity-enhanced schemas are frequently shipped as\n * one `{ \"@context\", \"@graph\": [...] }` object rather than a flat node, so a\n * check against the top level alone misses a breadcrumb nested in the graph.\n */\nfunction schemaContainsBreadcrumbList(schema: unknown): boolean {\n if (schemaNodeHasType(schema, 'BreadcrumbList')) return true\n const graph = (schema as Record<string, unknown> | null)?.['@graph']\n return Array.isArray(graph) && graph.some((node) => schemaNodeHasType(node, 'BreadcrumbList'))\n}\n\n/**\n * Create BreadcrumbList schema from path\n */\nexport function createBreadcrumbSchema(\n baseUrl: string,\n path: string,\n labels?: Record<string, string>\n): Record<string, unknown> {\n const segments = path.split('/').filter(Boolean)\n \n const items = segments.map((segment, index) => {\n const itemPath = '/' + segments.slice(0, index + 1).join('/')\n const label = labels?.[segment] || segment.replace(/-/g, ' ').replace(/\\b\\w/g, l => l.toUpperCase())\n \n return {\n '@type': 'ListItem',\n position: index + 1,\n name: label,\n item: `${baseUrl}${itemPath}`,\n }\n })\n\n // Add home as first item\n items.unshift({\n '@type': 'ListItem',\n position: 0,\n name: 'Home',\n item: baseUrl,\n })\n\n // Re-number positions\n items.forEach((item, index) => {\n item.position = index + 1\n })\n\n return createSchema('BreadcrumbList', {\n itemListElement: items,\n })\n}\n\n/**\n * ManagedSchema — Suspense-wrapped so API fetches never block page streaming.\n * The hero and other page content flush immediately; schema scripts stream in when ready.\n */\nexport function ManagedSchema(props: EnhancedManagedSchemaProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedSchemaAsync {...props} />\n </Suspense>\n )\n}\n\n/**\n * LLMSchema — Suspense-wrapped so API fetches never block page streaming.\n */\nexport function LLMSchema(props: { projectId?: string; path: string }): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <LLMSchemaAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedSchema\n","/**\n * Optional JSON-LD stub when Portal does **not** emit Organization/WebSite.\n * Default product stance: Portal owns entity nodes; only use this when confirmed absent.\n */\n\nexport interface WebSiteOrganizationStubInput {\n name: string\n url: string\n sameAs?: string[]\n knowsAbout?: string[]\n}\n\n/**\n * Minimal WebSite + Organization pair with stable @id anchors for isPartOf links.\n */\nexport function createWebSiteOrganizationStub(\n input: WebSiteOrganizationStubInput,\n): Record<string, unknown>[] {\n const origin = input.url.replace(/\\/$/, '')\n const websiteId = `${origin}/#website`\n const orgId = `${origin}/#organization`\n const org: Record<string, unknown> = {\n '@type': 'Organization',\n '@id': orgId,\n name: input.name,\n url: origin,\n ...(input.sameAs?.length ? { sameAs: input.sameAs } : {}),\n ...(input.knowsAbout?.length ? { knowsAbout: input.knowsAbout } : {}),\n }\n const site: Record<string, unknown> = {\n '@type': 'WebSite',\n '@id': websiteId,\n url: origin,\n name: input.name,\n publisher: { '@id': orgId },\n }\n return [org, site]\n}\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getFAQData } from './server-api'\nimport type { ManagedFAQProps, FAQItem } from './types'\nimport { createSchema } from './ManagedSchema'\nimport { safeJsonLd } from './safeJsonLd'\n\n/**\n * Inline styles for the accordion FAQ (no external CSS dependency)\n */\nconst faqStyles = `\n.sk-faq-items {\n display: flex;\n flex-direction: column;\n gap: 0;\n}\n.sk-faq-item {\n border-bottom: 1px solid rgba(0,0,0,0.08);\n}\n.sk-faq-item:first-child {\n border-top: 1px solid rgba(0,0,0,0.08);\n}\n.sk-faq-item summary {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n padding: 1.25rem 0;\n font-weight: 600;\n font-size: 1.05rem;\n line-height: 1.5;\n color: inherit;\n list-style: none;\n user-select: none;\n transition: color 0.15s ease;\n}\n.sk-faq-item summary:hover {\n opacity: 0.8;\n}\n.sk-faq-item summary::-webkit-details-marker {\n display: none;\n}\n.sk-faq-item summary::marker {\n display: none;\n content: '';\n}\n.sk-faq-chevron {\n flex-shrink: 0;\n width: 1.25rem;\n height: 1.25rem;\n margin-left: 1rem;\n transition: transform 0.2s ease;\n opacity: 0.5;\n}\n.sk-faq-item[open] .sk-faq-chevron {\n transform: rotate(180deg);\n}\n.sk-faq-answer {\n padding: 0 0 1.25rem 0;\n color: rgba(0,0,0,0.6);\n line-height: 1.75;\n font-size: 0.95rem;\n}\n.sk-faq-answer p {\n margin: 0 0 0.75rem 0;\n}\n.sk-faq-answer p:last-child {\n margin-bottom: 0;\n}\n.sk-faq-answer ul, .sk-faq-answer ol {\n padding-left: 1.5rem;\n margin: 0.5rem 0;\n}\n.sk-faq-answer li {\n margin-bottom: 0.25rem;\n}\n.sk-faq-answer a {\n color: inherit;\n text-decoration: underline;\n text-underline-offset: 2px;\n}\n.sk-faq-title {\n font-size: 1.75rem;\n font-weight: 700;\n margin-bottom: 0.5rem;\n}\n.sk-faq-description {\n color: rgba(0,0,0,0.6);\n margin-bottom: 2rem;\n font-size: 1rem;\n line-height: 1.6;\n}\n\n`\n\n/**\n * Chevron SVG (no icon library dependency)\n */\nfunction ChevronDown() {\n return (\n <svg\n className=\"sk-faq-chevron\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n )\n}\n\n/**\n * Default FAQ item renderer – uses native <details>/<summary> for toggle\n */\nfunction DefaultFAQItem({ item, index }: { item: FAQItem; index: number }) {\n return (\n <details key={item.id} className=\"sk-faq-item\">\n <summary>\n <span>{item.question}</span>\n <ChevronDown />\n </summary>\n <div\n className=\"sk-faq-answer\"\n dangerouslySetInnerHTML={{ __html: item.answer }}\n />\n </details>\n )\n}\n\n/**\n * Generate FAQ schema from items\n * \n * IMPORTANT: This is the ONLY place FAQ schema (FAQPage) is generated.\n * The CLI setup command does NOT generate FAQ schema - it only extracts/uploads\n * FAQ data to the Portal. This component then dynamically generates the schema\n * from that data, ensuring FAQ changes in Portal automatically update the schema.\n */\nfunction generateFAQSchema(items: FAQItem[]): Record<string, unknown> {\n return createSchema('FAQPage', {\n mainEntity: items\n .filter(item => item.is_visible)\n .map(item => ({\n '@type': 'Question',\n name: item.question,\n acceptedAnswer: {\n '@type': 'Answer',\n text: item.answer,\n },\n })),\n })\n}\n\n/**\n * ManagedFAQ - Server Component that renders FAQ section with schema\n * \n * Fetches FAQ content from Portal and renders with optional schema injection\n * \n * @example\n * ```tsx\n * // app/services/plumbing/page.tsx\n * import { ManagedFAQ } from '@sonordev/site-kit/seo'\n * \n * export default async function PlumbingPage() {\n * return (\n * <main>\n * <h1>Plumbing Services</h1>\n * <section>\n * <ManagedFAQ\n * path=\"/services/plumbing\"\n * showTitle\n * includeSchema\n * />\n * </section>\n * </main>\n * )\n * }\n * ```\n */\nasync function ManagedFAQAsync({\n path,\n className,\n renderItem,\n includeSchema = true,\n showTitle = true,\n site,\n}: ManagedFAQProps): Promise<React.ReactElement | null> {\n const faqData = await getFAQData(path, site)\n\n if (!faqData || !faqData.items?.length) {\n return null\n }\n\n const visibleItems = faqData.items.filter((item: FAQItem) => item.is_visible)\n \n if (visibleItems.length === 0) {\n return null\n }\n\n // Sort by order\n visibleItems.sort((a: FAQItem, b: FAQItem) => a.order - b.order)\n\n const shouldIncludeSchema = includeSchema && faqData.include_schema\n\n return (\n <>\n {shouldIncludeSchema && (\n <script\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: safeJsonLd(generateFAQSchema(visibleItems)),\n }}\n />\n )}\n {/* Embedded styles for accordion FAQ (no external CSS file needed) */}\n <style dangerouslySetInnerHTML={{ __html: faqStyles }} />\n <div className={className || 'sk-faq'}>\n {showTitle && faqData.title && (\n <h2 className=\"sk-faq-title\">{faqData.title}</h2>\n )}\n {faqData.description && (\n <p className=\"sk-faq-description\">{faqData.description}</p>\n )}\n <div className=\"sk-faq-items\">\n {visibleItems.map((item: FAQItem, index: number) => \n renderItem \n ? renderItem(item, index)\n : <DefaultFAQItem key={item.id} item={item} index={index} />\n )}\n </div>\n </div>\n </>\n )\n}\n\n/**\n * ManagedFAQ — Suspense-wrapped so the FAQ API fetch never blocks page streaming.\n */\nexport function ManagedFAQ(props: ManagedFAQProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedFAQAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedFAQ\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getInternalLinks } from './server-api'\nimport type { ManagedInternalLinksProps, ManagedLink } from './types'\n\n/**\n * Default link renderer\n */\nfunction DefaultLinkRenderer({ link }: { link: ManagedLink }) {\n const href = link.target_url || link.target_path\n \n return (\n <a \n key={link.id}\n href={href}\n className=\"sk-internal-link\"\n >\n {link.anchor_text}\n </a>\n )\n}\n\n/**\n * ManagedInternalLinks - Server Component for AI-suggested internal links\n * \n * Fetches internal link suggestions from Portal and renders them\n * \n * @example\n * ```tsx\n * // In your article component\n * import { ManagedInternalLinks } from '@sonordev/site-kit/seo'\n * \n * export default async function Article({ params }) {\n * return (\n * <article>\n * <p>Your content here...</p>\n * \n * <ManagedInternalLinks\n * path={`/article/${params.slug}`}\n * position=\"bottom\"\n * limit={5}\n * />\n * </article>\n * )\n * }\n * ```\n */\nasync function ManagedInternalLinksAsync({\n path,\n position = 'bottom',\n limit = 5,\n className,\n renderLink,\n site,\n}: ManagedInternalLinksProps): Promise<React.ReactElement | null> {\n const links = await getInternalLinks(path, { position, limit, site })\n\n if (!links.length) {\n return null\n }\n\n const containerClass = className || `sk-internal-links sk-internal-links--${position}`\n\n // Different layouts based on position\n if (position === 'inline') {\n // Inline links are meant to be inserted into content\n return (\n <span className={containerClass}>\n {links.map((link: ManagedLink) => \n renderLink ? renderLink(link) : <DefaultLinkRenderer key={link.id} link={link} />\n )}\n </span>\n )\n }\n\n if (position === 'sidebar') {\n return (\n <aside className={containerClass}>\n <h4 className=\"sk-internal-links-title\">Related Pages</h4>\n <ul className=\"sk-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </aside>\n )\n }\n\n if (position === 'related') {\n return (\n <nav className={containerClass} aria-label=\"Related content\">\n <h3 className=\"sk-internal-links-title\">You May Also Like</h3>\n <div className=\"sk-internal-links-grid\">\n {links.map((link: ManagedLink) => (\n <div key={link.id} className=\"sk-internal-link-card\">\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n {link.context && (\n <p className=\"sk-internal-link-context\">{link.context}</p>\n )}\n </div>\n ))}\n </div>\n </nav>\n )\n }\n\n // Default: bottom position\n return (\n <div className={containerClass}>\n <h4 className=\"sk-internal-links-title\">Related Articles</h4>\n <ul className=\"sk-internal-links-list\">\n {links.map((link: ManagedLink) => (\n <li key={link.id}>\n {renderLink ? renderLink(link) : <DefaultLinkRenderer link={link} />}\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport function ManagedInternalLinks(props: ManagedInternalLinksProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedInternalLinksAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedInternalLinks\n","import * as React from 'react'\nimport { Suspense } from 'react'\nimport { getContentBlock, getEntities, getPrimaryEntity } from './server-api'\nimport type { ManagedContentProps, ManagedContentBlock, SEOEntity } from './types'\n\n/**\n * Parse and render markdown content (basic support)\n * For full markdown, use a proper parser in your custom renderer\n */\nfunction renderMarkdown(content: string): string {\n return content\n // Headers\n .replace(/^### (.*$)/gim, '<h3>$1</h3>')\n .replace(/^## (.*$)/gim, '<h2>$1</h2>')\n .replace(/^# (.*$)/gim, '<h1>$1</h1>')\n // Bold\n .replace(/\\*\\*(.*)\\*\\*/gim, '<strong>$1</strong>')\n // Italic\n .replace(/\\*(.*)\\*/gim, '<em>$1</em>')\n // Links\n .replace(/\\[(.*?)\\]\\((.*?)\\)/gim, '<a href=\"$2\">$1</a>')\n // Paragraphs\n .replace(/\\n\\n/gim, '</p><p>')\n .replace(/^(.+)$/gim, '<p>$1</p>')\n}\n\n/**\n * Inject entity annotations into HTML content\n * Wraps entity mentions with data-sonor-entity attributes for knowledge graph linking\n */\nfunction injectEntityAnnotations(html: string, entities: SEOEntity[]): string {\n if (!entities.length) return html\n \n let annotatedHtml = html\n \n // Sort entities by name length (longest first) to avoid partial matches\n const sortedEntities = [...entities].sort((a, b) => b.name.length - a.name.length)\n \n for (const entity of sortedEntities) {\n // Skip very short names to avoid false positives\n if (entity.name.length < 3) continue\n \n // Create case-insensitive regex for entity name\n // Avoid matching inside HTML tags or existing annotations\n const regex = new RegExp(\n `(?<![\\\\w-])(?<!data-sonor-entity=\")${escapeRegExp(entity.name)}(?![\\\\w-])`,\n 'gi'\n )\n \n // Determine schema type for microdata\n const schemaType = getSchemaTypeForEntity(entity.entity_type)\n \n annotatedHtml = annotatedHtml.replace(regex, (match) => {\n return `<span class=\"aeo-entity aeo-entity-${entity.entity_type}\" ` +\n `data-sonor-entity=\"${entity.id}\" ` +\n `data-sonor-entity-type=\"${entity.entity_type}\" ` +\n `data-sonor-entity-name=\"${entity.name}\" ` +\n `itemscope itemtype=\"https://schema.org/${schemaType}\">` +\n `<span itemprop=\"name\">${match}</span></span>`\n })\n }\n \n return annotatedHtml\n}\n\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction getSchemaTypeForEntity(entityType: string): string {\n const typeMap: Record<string, string> = {\n organization: 'Organization',\n person: 'Person',\n service: 'Service',\n product: 'Product',\n location: 'Place',\n concept: 'Thing',\n credential: 'EducationalOccupationalCredential',\n }\n return typeMap[entityType] || 'Thing'\n}\n\n/**\n * ManagedContent - Server Component for CMS-controlled content blocks\n * \n * Fetches content sections from Portal and renders them\n * Supports HTML, Markdown, JSON, and React component references\n * \n * @example\n * ```tsx\n * // Hero section managed by Portal\n * import { ManagedContent } from '@sonordev/site-kit/seo'\n * \n * export default async function ServicePage({ params }) {\n * return (\n * <main>\n * <ManagedContent\n * path={`/services/${params.slug}`}\n * section=\"hero\"\n * fallback={<DefaultHero />}\n * />\n *\n * <ManagedContent\n * path={`/services/${params.slug}`}\n * section=\"features\"\n * />\n *\n * <ManagedContent\n * path={`/services/${params.slug}`}\n * section=\"cta\"\n * />\n * </main>\n * )\n * }\n * ```\n */\nasync function ManagedContentAsync({\n path,\n section,\n fallback,\n className,\n components = {},\n injectEntityAnnotations: shouldInjectEntities = false,\n site,\n}: ManagedContentProps): Promise<React.ReactElement | null> {\n const block = await getContentBlock(path, section, site)\n\n if (!block) {\n if (fallback) {\n return <>{fallback}</>\n }\n return null\n }\n\n // Fetch entities if annotation is enabled\n let entities: SEOEntity[] = []\n if (shouldInjectEntities) {\n try {\n entities = await getEntities() as SEOEntity[]\n } catch (err) {\n console.warn('@sonordev/seo: Failed to fetch entities for annotation:', err)\n }\n }\n\n const containerClass = className || `sk-content sk-content--${section}`\n\n // Helper to process HTML with optional entity injection\n const processHtml = (html: string): string => {\n if (shouldInjectEntities && entities.length > 0) {\n return injectEntityAnnotations(html, entities)\n }\n return html\n }\n\n // Handle different content types\n switch (block.content_type) {\n case 'html':\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: processHtml(block.content as string) }}\n />\n )\n\n case 'markdown':\n const htmlContent = processHtml(renderMarkdown(block.content as string))\n return (\n <div \n className={containerClass}\n dangerouslySetInnerHTML={{ __html: htmlContent }}\n />\n )\n\n case 'json':\n // JSON content for structured data - render as data attributes or custom handling\n const jsonData = typeof block.content === 'string' \n ? JSON.parse(block.content)\n : block.content\n\n return (\n <div \n className={containerClass}\n data-content={JSON.stringify(jsonData)}\n >\n {/* Render JSON structure - customize based on your needs */}\n {jsonData.title && <h2>{jsonData.title}</h2>}\n {jsonData.subtitle && <p className=\"subtitle\">{jsonData.subtitle}</p>}\n {jsonData.content && <div dangerouslySetInnerHTML={{ __html: jsonData.content }} />}\n {jsonData.items && (\n <ul>\n {jsonData.items.map((item: { text: string } | string, index: number) => (\n <li key={index}>{typeof item === 'string' ? item : item.text}</li>\n ))}\n </ul>\n )}\n </div>\n )\n\n case 'react':\n // React component reference - lookup from provided components map\n const componentData = typeof block.content === 'string'\n ? JSON.parse(block.content)\n : block.content as Record<string, unknown>\n\n const componentName = componentData.component as string\n const componentProps = componentData.props as Record<string, unknown> || {}\n\n const Component = components[componentName]\n \n if (!Component) {\n console.warn(`@sonordev/seo: Component \"${componentName}\" not found in components map`)\n return fallback ? <>{fallback}</> : null\n }\n\n return (\n <div className={containerClass}>\n <Component {...componentProps} />\n </div>\n )\n\n default:\n console.warn(`@sonordev/seo: Unknown content type \"${block.content_type}\"`)\n return fallback ? <>{fallback}</> : null\n }\n}\n\n/**\n * Get content block data without rendering\n * \n * Useful when you need to access the raw data. `site` is the sub-site host\n * override for multi-site projects; it resolves from NEXT_PUBLIC_SITE_URL when\n * omitted.\n */\nexport async function getManagedContentData(\n path: string,\n section: string,\n site?: string\n): Promise<ManagedContentBlock | null> {\n return getContentBlock(path, section, site)\n}\n\nexport function ManagedContent(props: ManagedContentProps): React.ReactElement {\n return (\n <Suspense fallback={null}>\n <ManagedContentAsync {...props} />\n </Suspense>\n )\n}\n\nexport default ManagedContent\n","/**\n * @deprecated DO NOT USE in new code. It POSTs `project_id` to the public\n * `/api/public/seo/location-content` route with no `x-api-key`, violating the\n * key-only auth contract every other site-kit fetch follows (the route itself\n * exists and answers for any project id). No site in the workspace renders it.\n * Kept exported so existing imports keep compiling; it renders the section when\n * the route returns one and `fallback` otherwise.\n *\n * LocationPageContent - Server Component for fetching location page sections\n */\n\nimport * as React from 'react'\nimport { cache, Suspense } from 'react'\n\n// ============================================\n// Types\n// ============================================\n\nexport interface LocationPageContentProps {\n /** Sonor project ID */\n projectId: string\n /** Page path (e.g., /areas/seattle-wa/plumbing) */\n path: string\n /** Section ID or type to fetch (e.g., \"hero\", \"intro\", \"services\") */\n section: string\n /** Fallback content if section not found */\n fallback?: React.ReactNode\n /** Additional className for wrapper */\n className?: string\n /** Custom renderer for the section data */\n render?: (data: LocationSectionData) => React.ReactNode\n}\n\nexport interface LocationSectionData {\n type: string\n content: any\n}\n\nexport interface HeroSectionContent {\n title: string\n subtitle?: string\n cta_text?: string\n cta_href?: string\n stats?: Array<{ label: string; value: string }>\n background_image?: string\n}\n\nexport interface ServiceGridContent {\n services: Array<{\n title: string\n description: string\n href: string\n icon?: string\n }>\n}\n\nexport interface TextSectionContent {\n heading?: string\n paragraphs: string[]\n html?: string\n}\n\n// ============================================\n// API Config\n// ============================================\n\nfunction getApiConfig() {\n const apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io'\n return { apiUrl }\n}\n\n// ============================================\n// Cached API Call\n// ============================================\n\n/**\n * Fetch location page section content from Portal\n * Cached with React's cache() for request deduplication\n */\nexport const getLocationSection = cache(async (\n projectId: string,\n path: string,\n section: string\n): Promise<LocationSectionData | null> => {\n const { apiUrl } = getApiConfig()\n \n try {\n const response = await fetch(`${apiUrl}/api/public/seo/location-content`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n project_id: projectId,\n path,\n section,\n }),\n next: { revalidate: 3600 }, // Cache for 1 hour\n })\n \n if (!response.ok) {\n console.error(`LocationPageContent: Failed to fetch section \"${section}\" for path \"${path}\"`)\n return null\n }\n \n const data = await response.json()\n return data\n } catch (error) {\n console.error('LocationPageContent: API error:', error)\n return null\n }\n})\n\n// ============================================\n// Default Renderers\n// ============================================\n\nfunction HeroRenderer({ data, className }: { data: HeroSectionContent; className?: string }) {\n return (\n <section className={className || 'location-hero'}>\n <h1>{data.title}</h1>\n {data.subtitle && <p className=\"subtitle\">{data.subtitle}</p>}\n {data.stats && (\n <div className=\"stats-grid\">\n {data.stats.map((stat, i) => (\n <div key={i} className=\"stat\">\n <span className=\"stat-value\">{stat.value}</span>\n <span className=\"stat-label\">{stat.label}</span>\n </div>\n ))}\n </div>\n )}\n {data.cta_text && data.cta_href && (\n <a href={data.cta_href} className=\"cta-button\">\n {data.cta_text}\n </a>\n )}\n </section>\n )\n}\n\nfunction TextRenderer({ data, className }: { data: TextSectionContent; className?: string }) {\n if (data.html) {\n return (\n <section \n className={className || 'location-text'} \n dangerouslySetInnerHTML={{ __html: data.html }} \n />\n )\n }\n \n return (\n <section className={className || 'location-text'}>\n {data.heading && <h2>{data.heading}</h2>}\n {data.paragraphs.map((p, i) => (\n <p key={i}>{p}</p>\n ))}\n </section>\n )\n}\n\nfunction ServicesGridRenderer({ data, className }: { data: ServiceGridContent; className?: string }) {\n return (\n <section className={className || 'location-services-grid'}>\n <div className=\"services-list\">\n {data.services.map((service, i) => (\n <a key={i} href={service.href} className=\"service-card\">\n {service.icon && <span className=\"service-icon\">{service.icon}</span>}\n <h3>{service.title}</h3>\n <p>{service.description}</p>\n </a>\n ))}\n </div>\n </section>\n )\n}\n\nfunction DefaultRenderer({ data, className }: { data: any; className?: string }) {\n // Fallback: just render as JSON for debugging\n if (process.env.NODE_ENV === 'development') {\n return (\n <section className={className}>\n <pre style={{ fontSize: '12px', background: '#f0f0f0', padding: '1rem' }}>\n {JSON.stringify(data, null, 2)}\n </pre>\n </section>\n )\n }\n \n // In production, try to render content as text/html\n if (typeof data.content === 'string') {\n return (\n <section \n className={className} \n dangerouslySetInnerHTML={{ __html: data.content }} \n />\n )\n }\n \n return null\n}\n\n// ============================================\n// Main Component\n// ============================================\n\n/**\n * LocationPageContent - Server Component\n * \n * Fetches and renders a section of a location page from Portal.\n * Content is fully editable in Portal → SEO → Location Pages.\n */\nasync function LocationPageContentAsync({\n projectId,\n path,\n section,\n fallback = null,\n className,\n render,\n}: LocationPageContentProps): Promise<React.ReactElement | null> {\n const data = await getLocationSection(projectId, path, section)\n \n if (!data) {\n return fallback as React.ReactElement | null\n }\n \n // If custom renderer provided, use it\n if (render) {\n return <>{render(data)}</>\n }\n \n // Use default renderers based on section type\n switch (data.type) {\n case 'hero':\n return <HeroRenderer data={data.content as HeroSectionContent} className={className} />\n \n case 'text':\n case 'intro':\n case 'about':\n case 'about_location':\n return <TextRenderer data={data.content as TextSectionContent} className={className} />\n \n case 'services_grid':\n case 'services':\n return <ServicesGridRenderer data={data.content as ServiceGridContent} className={className} />\n \n default:\n return <DefaultRenderer data={data} className={className} />\n }\n}\n\n/**\n * LocationPageContent — Suspense-wrapped so API fetches never block page streaming.\n */\nexport function LocationPageContent(props: LocationPageContentProps): React.ReactElement {\n return (\n <Suspense fallback={props.fallback as React.ReactElement ?? null}>\n <LocationPageContentAsync {...props} />\n </Suspense>\n )\n}\n\n// Export types for external use\nexport type {\n HeroSectionContent as LocationHeroContent,\n ServiceGridContent as LocationServicesContent,\n TextSectionContent as LocationTextContent,\n}\n"]}