@sonordev/site-kit 3.3.1 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/agent-manifest.json +13 -1
- package/dist/AnalyticsProvider-35EDQA5V.js +31 -0
- package/dist/{AnalyticsProvider-PLGTU56K.js.map → AnalyticsProvider-35EDQA5V.js.map} +1 -1
- package/dist/AnalyticsProvider-V5CWTWWO.mjs +10 -0
- package/dist/{AnalyticsProvider-3MZ3O5OB.mjs.map → AnalyticsProvider-V5CWTWWO.mjs.map} +1 -1
- package/dist/ChatWidget-2OK6DD66.js +19 -0
- package/dist/{ChatWidget-FQARJMGU.js.map → ChatWidget-2OK6DD66.js.map} +1 -1
- package/dist/ChatWidget-WNT6VNJK.mjs +10 -0
- package/dist/{ChatWidget-7JHVRNVE.mjs.map → ChatWidget-WNT6VNJK.mjs.map} +1 -1
- package/dist/EngageWidget-7RZIC426.js +18 -0
- package/dist/{EngageWidget-DQ62NQPU.js.map → EngageWidget-7RZIC426.js.map} +1 -1
- package/dist/EngageWidget-GWME22IP.mjs +9 -0
- package/dist/{EngageWidget-VXQOZOYA.mjs.map → EngageWidget-GWME22IP.mjs.map} +1 -1
- package/dist/{SignalCore-3SG3LFQL.js → SignalCore-DK4HQBPY.js} +62 -43
- package/dist/SignalCore-DK4HQBPY.js.map +1 -0
- package/dist/{SignalCore-BKG66B4C.mjs → SignalCore-TW4YA3BW.mjs} +56 -37
- package/dist/SignalCore-TW4YA3BW.mjs.map +1 -0
- package/dist/SitemapSync-7PXQMF5A.mjs +8 -0
- package/dist/{SitemapSync-IO2VOR23.mjs.map → SitemapSync-7PXQMF5A.mjs.map} +1 -1
- package/dist/SitemapSync-O3J2DPV7.js +17 -0
- package/dist/{SitemapSync-DWX7I6MX.js.map → SitemapSync-O3J2DPV7.js.map} +1 -1
- package/dist/analytics/index.js +14 -12
- package/dist/analytics/index.mjs +7 -5
- package/dist/blog/index.d.mts +3 -3
- package/dist/blog/index.d.ts +3 -3
- package/dist/blog/index.js +11 -15
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +2 -2
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/server-ui.d.mts +1 -1
- package/dist/blog/server-ui.d.ts +1 -1
- package/dist/blog/server-ui.js +198 -9
- package/dist/blog/server-ui.js.map +1 -1
- package/dist/blog/server-ui.mjs +198 -2
- package/dist/blog/server-ui.mjs.map +1 -1
- package/dist/blog/server.d.mts +27 -8
- package/dist/blog/server.d.ts +27 -8
- package/dist/blog/server.js +45 -43
- package/dist/blog/server.mjs +3 -1
- package/dist/{chunk-QW3T6WH2.mjs → chunk-2NA5CAK5.mjs} +3 -3
- package/dist/{chunk-QW3T6WH2.mjs.map → chunk-2NA5CAK5.mjs.map} +1 -1
- package/dist/{chunk-WN5A3KSY.mjs → chunk-34IUDOBC.mjs} +2 -2
- package/dist/{chunk-WN5A3KSY.mjs.map → chunk-34IUDOBC.mjs.map} +1 -1
- package/dist/{chunk-3WRE7ZDC.js → chunk-3KEZ2YHQ.js} +8 -8
- package/dist/{chunk-3WRE7ZDC.js.map → chunk-3KEZ2YHQ.js.map} +1 -1
- package/dist/{chunk-NQ3K4NWX.mjs → chunk-5WQHWBCW.mjs} +11 -30
- package/dist/chunk-5WQHWBCW.mjs.map +1 -0
- package/dist/chunk-6EDVCUAG.mjs +29 -0
- package/dist/chunk-6EDVCUAG.mjs.map +1 -0
- package/dist/{chunk-ZFF3BKNE.mjs → chunk-6JVDIW5L.mjs} +4 -4
- package/dist/{chunk-ZFF3BKNE.mjs.map → chunk-6JVDIW5L.mjs.map} +1 -1
- package/dist/{chunk-7TX5BKVA.js → chunk-6T4NVCAT.js} +2 -2
- package/dist/{chunk-7TX5BKVA.js.map → chunk-6T4NVCAT.js.map} +1 -1
- package/dist/{chunk-OC64AHKN.mjs → chunk-7FZWMAI2.mjs} +3 -3
- package/dist/{chunk-OC64AHKN.mjs.map → chunk-7FZWMAI2.mjs.map} +1 -1
- package/dist/{chunk-EE6SFAZP.mjs → chunk-AX4AROLH.mjs} +5 -14
- package/dist/chunk-AX4AROLH.mjs.map +1 -0
- package/dist/chunk-BNJH2RFU.mjs +139 -0
- package/dist/chunk-BNJH2RFU.mjs.map +1 -0
- package/dist/{chunk-WZHWWOUC.js → chunk-BX6FFL2Y.js} +6 -16
- package/dist/chunk-BX6FFL2Y.js.map +1 -0
- package/dist/chunk-CGCYZJYX.mjs +41 -0
- package/dist/chunk-CGCYZJYX.mjs.map +1 -0
- package/dist/{chunk-PIV54R2O.js → chunk-CTPE3G5W.js} +5 -5
- package/dist/{chunk-PIV54R2O.js.map → chunk-CTPE3G5W.js.map} +1 -1
- package/dist/chunk-CXDIWBIQ.js +78 -0
- package/dist/chunk-CXDIWBIQ.js.map +1 -0
- package/dist/chunk-DWVF7SEK.mjs +35 -0
- package/dist/chunk-DWVF7SEK.mjs.map +1 -0
- package/dist/{chunk-C4JAMON3.js → chunk-EH7QQU6P.js} +15 -15
- package/dist/{chunk-C4JAMON3.js.map → chunk-EH7QQU6P.js.map} +1 -1
- package/dist/chunk-EU2UGO25.js +52 -0
- package/dist/chunk-EU2UGO25.js.map +1 -0
- package/dist/{chunk-X4OPM3SK.mjs → chunk-GU5OTUQS.mjs} +5 -14
- package/dist/chunk-GU5OTUQS.mjs.map +1 -0
- package/dist/{chunk-SH4VZDVX.mjs → chunk-GUXB3QH7.mjs} +38 -67
- package/dist/chunk-GUXB3QH7.mjs.map +1 -0
- package/dist/{chunk-JD6LV6JZ.mjs → chunk-HRJ65XKY.mjs} +3 -3
- package/dist/{chunk-JD6LV6JZ.mjs.map → chunk-HRJ65XKY.mjs.map} +1 -1
- package/dist/chunk-IBMOX3YE.mjs +48 -0
- package/dist/chunk-IBMOX3YE.mjs.map +1 -0
- package/dist/{chunk-TXEOLHMC.js → chunk-IMDSDDRU.js} +4 -4
- package/dist/{chunk-TXEOLHMC.js.map → chunk-IMDSDDRU.js.map} +1 -1
- package/dist/{chunk-25YPXQBA.mjs → chunk-INGAARGC.mjs} +8 -25
- package/dist/chunk-INGAARGC.mjs.map +1 -0
- package/dist/{chunk-3AG6O3IA.mjs → chunk-LZSHZVBE.mjs} +49 -5
- package/dist/chunk-LZSHZVBE.mjs.map +1 -0
- package/dist/chunk-MJDYY6S3.mjs +76 -0
- package/dist/chunk-MJDYY6S3.mjs.map +1 -0
- package/dist/{chunk-BMKZHXWQ.js → chunk-MMON6EVI.js} +3 -194
- package/dist/chunk-MMON6EVI.js.map +1 -0
- package/dist/chunk-NB4MK2Q5.js +18 -0
- package/dist/chunk-NB4MK2Q5.js.map +1 -0
- package/dist/{chunk-DIXWP4BO.mjs → chunk-NBI5AV6U.mjs} +3 -3
- package/dist/{chunk-DIXWP4BO.mjs.map → chunk-NBI5AV6U.mjs.map} +1 -1
- package/dist/chunk-NI7OY4FW.mjs +16 -0
- package/dist/chunk-NI7OY4FW.mjs.map +1 -0
- package/dist/chunk-NME3SQCB.js +8 -0
- package/dist/{chunk-3X2YPJU5.js.map → chunk-NME3SQCB.js.map} +1 -1
- package/dist/{chunk-4JMXBIUC.js → chunk-PE2A3ON5.js} +16 -35
- package/dist/chunk-PE2A3ON5.js.map +1 -0
- package/dist/{chunk-BOWR5QEV.js → chunk-PWIBFSXK.js} +14 -14
- package/dist/{chunk-BOWR5QEV.js.map → chunk-PWIBFSXK.js.map} +1 -1
- package/dist/{chunk-4ROFY6PM.js → chunk-Q2SPOBHU.js} +61 -17
- package/dist/chunk-Q2SPOBHU.js.map +1 -0
- package/dist/chunk-QGPYFC6G.mjs +6 -0
- package/dist/{chunk-K6YGF2KJ.mjs.map → chunk-QGPYFC6G.mjs.map} +1 -1
- package/dist/{chunk-FSYXHIAI.js → chunk-SQGDDITI.js} +14 -14
- package/dist/{chunk-FSYXHIAI.js.map → chunk-SQGDDITI.js.map} +1 -1
- package/dist/{chunk-S2N3NSC7.mjs → chunk-STTSIODQ.mjs} +5 -5
- package/dist/{chunk-S2N3NSC7.mjs.map → chunk-STTSIODQ.mjs.map} +1 -1
- package/dist/{chunk-QRIGY6EM.js → chunk-T3RPPS25.js} +7 -7
- package/dist/{chunk-QRIGY6EM.js.map → chunk-T3RPPS25.js.map} +1 -1
- package/dist/{chunk-DNW7FTJD.js → chunk-TBMFLLRV.js} +9 -9
- package/dist/{chunk-DNW7FTJD.js.map → chunk-TBMFLLRV.js.map} +1 -1
- package/dist/{chunk-YFYMOQAX.js → chunk-TJS6FPR7.js} +14 -31
- package/dist/chunk-TJS6FPR7.js.map +1 -0
- package/dist/chunk-TPL2IHFI.js +43 -0
- package/dist/chunk-TPL2IHFI.js.map +1 -0
- package/dist/chunk-TRTT4PND.js +38 -0
- package/dist/chunk-TRTT4PND.js.map +1 -0
- package/dist/{chunk-QFWBAGBT.mjs → chunk-UFOOVODL.mjs} +3 -3
- package/dist/{chunk-QFWBAGBT.mjs.map → chunk-UFOOVODL.mjs.map} +1 -1
- package/dist/chunk-UXEB6UAR.js +147 -0
- package/dist/chunk-UXEB6UAR.js.map +1 -0
- package/dist/{chunk-MLD3EGM2.mjs → chunk-V37Z65NF.mjs} +3 -3
- package/dist/{chunk-MLD3EGM2.mjs.map → chunk-V37Z65NF.mjs.map} +1 -1
- package/dist/chunk-VJMPIRSD.js +31 -0
- package/dist/chunk-VJMPIRSD.js.map +1 -0
- package/dist/chunk-VX3WK77I.mjs +126 -0
- package/dist/chunk-VX3WK77I.mjs.map +1 -0
- package/dist/{chunk-AB2VYIYU.mjs → chunk-WTR7QJ32.mjs} +4 -194
- package/dist/chunk-WTR7QJ32.mjs.map +1 -0
- package/dist/{chunk-IB4FRJDV.js → chunk-XAWB2HFQ.js} +37 -67
- package/dist/chunk-XAWB2HFQ.js.map +1 -0
- package/dist/{chunk-3BNFUMLL.js → chunk-XB57AM6T.js} +5 -14
- package/dist/chunk-XB57AM6T.js.map +1 -0
- package/dist/chunk-XY4NJJEX.js +129 -0
- package/dist/chunk-XY4NJJEX.js.map +1 -0
- package/dist/{chunk-FMQHK6MM.js → chunk-Y4U3OCKH.js} +3 -3
- package/dist/{chunk-FMQHK6MM.js.map → chunk-Y4U3OCKH.js.map} +1 -1
- package/dist/{chunk-ZYIONE7A.mjs → chunk-YKPAFEJ4.mjs} +4 -4
- package/dist/{chunk-ZYIONE7A.mjs.map → chunk-YKPAFEJ4.mjs.map} +1 -1
- package/dist/{chunk-7OROUYZH.mjs → chunk-YSDJ7HI3.mjs} +4 -4
- package/dist/{chunk-7OROUYZH.mjs.map → chunk-YSDJ7HI3.mjs.map} +1 -1
- package/dist/{chunk-PCDAVHVX.js → chunk-ZY3G7JGT.js} +8 -8
- package/dist/{chunk-PCDAVHVX.js.map → chunk-ZY3G7JGT.js.map} +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.mjs +1 -1
- package/dist/client/index.d.mts +15 -1
- package/dist/client/index.d.ts +15 -1
- package/dist/client/index.js +21 -6
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +19 -1
- package/dist/client/index.mjs.map +1 -1
- package/dist/commerce/index.js +53 -51
- package/dist/commerce/index.mjs +8 -6
- package/dist/engage/index.js +11 -9
- package/dist/engage/index.js.map +1 -1
- package/dist/engage/index.mjs +8 -6
- package/dist/engage/index.mjs.map +1 -1
- package/dist/fleet/index.js +8 -7
- package/dist/fleet/index.mjs +4 -3
- package/dist/forms/index.js +14 -12
- package/dist/forms/index.js.map +1 -1
- package/dist/forms/index.mjs +6 -4
- package/dist/forms/index.mjs.map +1 -1
- package/dist/images/index.js +11 -10
- package/dist/images/index.mjs +4 -3
- package/dist/index.d.mts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +75 -64
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +13 -10
- package/dist/index.mjs.map +1 -1
- package/dist/landing/index.d.mts +21 -0
- package/dist/landing/index.d.ts +21 -0
- package/dist/landing/index.js +21 -0
- package/dist/landing/index.js.map +1 -0
- package/dist/landing/index.mjs +4 -0
- package/dist/landing/index.mjs.map +1 -0
- package/dist/layout/client.js +11 -8
- package/dist/layout/client.mjs +10 -7
- package/dist/layout/index.js +13 -54
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/index.mjs +11 -52
- package/dist/layout/index.mjs.map +1 -1
- package/dist/llms/index.js +12 -12
- package/dist/llms/index.mjs +2 -2
- package/dist/maps/index.js +5 -4
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/index.mjs +3 -2
- package/dist/maps/index.mjs.map +1 -1
- package/dist/metadata-D_GiY8LJ.d.mts +36 -0
- package/dist/metadata-D_GiY8LJ.d.ts +36 -0
- package/dist/middleware/index.js +2 -8
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/index.mjs +2 -8
- package/dist/middleware/index.mjs.map +1 -1
- package/dist/seo/client.js +5 -4
- package/dist/seo/client.mjs +4 -3
- package/dist/seo/index.js +5 -4
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +4 -3
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo-pages/contract.js +6 -5
- package/dist/seo-pages/contract.js.map +1 -1
- package/dist/seo-pages/contract.mjs +2 -1
- package/dist/seo-pages/contract.mjs.map +1 -1
- package/dist/server/index.d.mts +34 -1
- package/dist/server/index.d.ts +34 -1
- package/dist/server/index.js +6 -0
- package/dist/server/index.mjs +2 -0
- package/dist/signal/index.js +11 -11
- package/dist/signal/index.mjs +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/sitemap/index.mjs +1 -1
- package/dist/sites/contract.d.mts +36 -12
- package/dist/sites/contract.d.ts +36 -12
- package/dist/sites/contract.js +12 -11
- package/dist/sites/contract.mjs +2 -1
- package/dist/sync/index.js +16 -15
- package/dist/sync/index.mjs +4 -3
- package/dist/{types-DYOumpUT.d.mts → types-8IcjVMDa.d.mts} +1 -1
- package/dist/{types-DYOumpUT.d.ts → types-8IcjVMDa.d.ts} +1 -1
- package/package.json +11 -1
- package/dist/AnalyticsProvider-3MZ3O5OB.mjs +0 -8
- package/dist/AnalyticsProvider-PLGTU56K.js +0 -29
- package/dist/ChatWidget-7JHVRNVE.mjs +0 -8
- package/dist/ChatWidget-FQARJMGU.js +0 -17
- package/dist/EngageWidget-DQ62NQPU.js +0 -16
- package/dist/EngageWidget-VXQOZOYA.mjs +0 -7
- package/dist/SignalCore-3SG3LFQL.js.map +0 -1
- package/dist/SignalCore-BKG66B4C.mjs.map +0 -1
- package/dist/SitemapSync-DWX7I6MX.js +0 -16
- package/dist/SitemapSync-IO2VOR23.mjs +0 -7
- package/dist/chunk-25YPXQBA.mjs.map +0 -1
- package/dist/chunk-3AG6O3IA.mjs.map +0 -1
- package/dist/chunk-3BNFUMLL.js.map +0 -1
- package/dist/chunk-3X2YPJU5.js +0 -8
- package/dist/chunk-4JMXBIUC.js.map +0 -1
- package/dist/chunk-4ROFY6PM.js.map +0 -1
- package/dist/chunk-AB2VYIYU.mjs.map +0 -1
- package/dist/chunk-BMKZHXWQ.js.map +0 -1
- package/dist/chunk-EE6SFAZP.mjs.map +0 -1
- package/dist/chunk-GUU3AEFM.mjs +0 -259
- package/dist/chunk-GUU3AEFM.mjs.map +0 -1
- package/dist/chunk-IB4FRJDV.js.map +0 -1
- package/dist/chunk-K6YGF2KJ.mjs +0 -6
- package/dist/chunk-KPKZBIAQ.js +0 -264
- package/dist/chunk-KPKZBIAQ.js.map +0 -1
- package/dist/chunk-NQ3K4NWX.mjs.map +0 -1
- package/dist/chunk-SH4VZDVX.mjs.map +0 -1
- package/dist/chunk-WZHWWOUC.js.map +0 -1
- package/dist/chunk-X4OPM3SK.mjs.map +0 -1
- package/dist/chunk-YFYMOQAX.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blog/ServiceCallout.tsx","../src/blog/ClusterNavigation.tsx","../src/blog/processBlogHtml.ts","../src/blog/blog-styles.ts","../src/blog/BlogPost.tsx","../src/blog/BlogList.tsx"],"names":["jsxs","Fragment","jsx","cls"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAqZnC,IAAA;AAAK,CAAA;AAMA,IAAM,WAAA;AAAA;AAAA,EAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;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","file":"chunk-WTR7QJ32.mjs","sourcesContent":["/**\n * @sonordev/site-kit/blog - Service Callout / CTA Component\n *\n * Renders a promotional call-to-action section within blog posts.\n * Automatically generated by Signal AI during blog creation, linking\n * article content to the business's relevant services.\n *\n * Two variants:\n * - 'featured' (default): Full-width gradient banner with button\n * - 'inline': Compact card with icon accent\n *\n * Uses site-kit brand tokens (--sk-primary, --sk-bg, etc.) for theming.\n * Supports full Tailwind override via `styles` prop.\n *\n * @example\n * ```tsx\n * <ServiceCallout\n * title=\"Ready to build your MVP?\"\n * description=\"Our team specializes in lean SaaS builds.\"\n * cta=\"Get Started\"\n * url=\"/services/application-development\"\n * />\n * ```\n */\n\nimport React from 'react'\n\nexport interface ServiceCalloutProps {\n title: string\n description?: string\n cta?: string\n url: string\n variant?: 'featured' | 'inline'\n /** Override default styles with Tailwind classes */\n styles?: {\n wrapper?: string\n title?: string\n description?: string\n button?: string\n }\n /** Strip all default styles (BYO Tailwind) */\n unstyled?: boolean\n}\n\n// Default inline styles using CSS custom properties for brand theming\nconst defaults = {\n featured: {\n wrapper: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1.5rem',\n padding: '2rem 2.5rem',\n margin: '3rem 0',\n borderRadius: '1rem',\n background: 'linear-gradient(135deg, color-mix(in srgb, var(--sk-primary, #2563eb) 8%, transparent), color-mix(in srgb, var(--sk-primary, #2563eb) 15%, transparent))',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #2563eb) 25%, transparent)',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 700,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.9375rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.5rem',\n maxWidth: '40rem',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.75rem 1.75rem',\n borderRadius: '0.5rem',\n fontWeight: 600,\n fontSize: '0.9375rem',\n color: '#ffffff',\n background: 'var(--sk-primary, #2563eb)',\n textDecoration: 'none',\n transition: 'transform 0.15s, box-shadow 0.15s',\n whiteSpace: 'nowrap' as const,\n },\n },\n inline: {\n wrapper: {\n display: 'flex',\n gap: '1rem',\n padding: '1.25rem 1.5rem',\n margin: '2rem 0',\n borderRadius: '0.75rem',\n background: 'var(--sk-bg-elevated, #f8fafc)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #2563eb) 20%, var(--sk-surface-border, #e2e8f0))',\n },\n icon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.625rem',\n background: 'var(--sk-primary, #2563eb)',\n color: '#ffffff',\n flexShrink: 0,\n fontSize: '1.125rem',\n },\n title: {\n fontSize: '1rem',\n fontWeight: 600,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.875rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.25rem',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n marginTop: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: 'var(--sk-primary, #2563eb)',\n textDecoration: 'none',\n },\n },\n}\n\nexport function ServiceCallout({\n title,\n description,\n cta = 'Learn More',\n url,\n variant = 'featured',\n styles,\n unstyled = false,\n}: ServiceCalloutProps) {\n if (variant === 'inline') {\n return (\n <aside\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.inline.wrapper}\n role=\"complementary\"\n aria-label=\"Related service\"\n >\n <div style={unstyled ? undefined : defaults.inline.icon}>→</div>\n <div>\n <h4\n className={styles?.title}\n style={unstyled ? undefined : defaults.inline.title}\n >\n {title}\n </h4>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.inline.description}\n >\n {description}\n </p>\n )}\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.inline.link}\n >\n {cta} →\n </a>\n </div>\n </aside>\n )\n }\n\n // Featured variant (default)\n return (\n <section\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.featured.wrapper}\n role=\"complementary\"\n aria-label=\"Call to action\"\n >\n <div>\n <h3\n className={styles?.title}\n style={unstyled ? undefined : defaults.featured.title}\n >\n {title}\n </h3>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.featured.description}\n >\n {description}\n </p>\n )}\n </div>\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.featured.button}\n >\n {cta} →\n </a>\n </section>\n )\n}\n\n/**\n * Renders all service callouts for a blog post.\n * First callout uses 'featured' variant, subsequent use 'inline'.\n */\nexport function ServiceCallouts({\n callouts,\n styles,\n unstyled,\n}: {\n callouts: Array<{ title: string; description?: string; cta?: string; url: string }>\n styles?: ServiceCalloutProps['styles']\n unstyled?: boolean\n}) {\n if (!callouts || callouts.length === 0) return null\n\n return (\n <>\n {callouts.map((callout, i) => (\n <ServiceCallout\n key={callout.url + i}\n {...callout}\n variant={i === 0 ? 'featured' : 'inline'}\n styles={styles}\n unstyled={unstyled}\n />\n ))}\n </>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Cluster Navigation Component\n *\n * Renders cluster context on blog post pages:\n * - \"Full Guide\" pillar backlink (on support articles only)\n * - Sibling article list with article_type badges\n *\n * Adapts to light/dark themes automatically using the same --sk-* variables\n * as the rest of site-kit, with currentColor-based fallbacks.\n */\n\nimport React from 'react'\nimport type { ClusterNavigation as ClusterNavigationType } from './types'\n\n// ============================================================================\n// CSS\n// ============================================================================\n\nconst clusterNavCss = `\n.sk-cluster-nav {\n --_cn-primary: var(--sk-primary, currentColor);\n --_cn-bg: var(--sk-bg-elevated, color-mix(in srgb, currentColor 6%, transparent));\n --_cn-border: var(--sk-surface-border, color-mix(in srgb, currentColor 12%, transparent));\n --_cn-text: var(--sk-text-primary, inherit);\n --_cn-text2: var(--sk-text-secondary, color-mix(in srgb, currentColor 70%, transparent));\n --_cn-text3: var(--sk-text-tertiary, color-mix(in srgb, currentColor 45%, transparent));\n\n margin: 2rem 0;\n padding: 1.5rem;\n border-radius: 0.75rem;\n background: var(--_cn-bg);\n border: 1px solid var(--_cn-border);\n color: var(--_cn-text);\n}\n\n.sk-cluster-pillar-link {\n margin-bottom: 1.25rem;\n padding-bottom: 1.25rem;\n border-bottom: 1px solid var(--_cn-border);\n}\n.sk-cluster-pillar-link-label {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--_cn-text3);\n margin: 0 0 0.375rem 0;\n}\n.sk-cluster-pillar-link a {\n font-size: 0.9375rem;\n font-weight: 600;\n color: var(--_cn-primary);\n text-decoration: none;\n transition: opacity 0.15s;\n}\n.sk-cluster-pillar-link a:hover { opacity: 0.8; }\n\n.sk-cluster-siblings-title {\n font-size: 0.6875rem;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--_cn-text3);\n margin: 0 0 0.75rem 0;\n}\n.sk-cluster-siblings-list {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n}\n.sk-cluster-siblings-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n}\n.sk-cluster-siblings-item a {\n font-size: 0.875rem;\n color: var(--_cn-text2);\n text-decoration: none;\n transition: color 0.15s;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.sk-cluster-siblings-item a:hover { color: var(--_cn-primary); }\n.sk-cluster-type-badge {\n display: inline-flex;\n align-items: center;\n flex-shrink: 0;\n padding: 0.125rem 0.4rem;\n border-radius: 9999px;\n font-size: 0.625rem;\n font-weight: 500;\n text-transform: capitalize;\n background: color-mix(in srgb, var(--_cn-primary) 10%, transparent);\n color: var(--_cn-primary);\n border: 1px solid color-mix(in srgb, var(--_cn-primary) 20%, transparent);\n}\n`\n\n// ============================================================================\n// COMPONENT\n// ============================================================================\n\nexport interface ClusterNavigationProps {\n /** Cluster navigation data */\n navigation: ClusterNavigationType\n /** Base path for blog URLs (default: /blog) */\n basePath?: string\n /**\n * Fallback category slug for URL building (optional). Each linked article's\n * OWN category takes precedence when present — applying one category to\n * every sibling produced wrong-category URLs (duplicate content / redirect\n * chains) on category-segmented sites whenever a cluster spans categories.\n */\n category?: string\n /** Append a trailing slash to article URLs (only for trailingSlash sites) */\n trailingSlash?: boolean\n /** Disable default styles */\n unstyled?: boolean\n /** Custom class name */\n className?: string\n}\n\nexport function ClusterNavigation({\n navigation,\n basePath = '/blog',\n category,\n trailingSlash = false,\n unstyled = false,\n className,\n}: ClusterNavigationProps) {\n if (!navigation) return null\n\n const siblings = (navigation.siblings || []).filter(\n s => s.article_type !== 'pillar'\n )\n\n const hasPillarLink = !navigation.is_pillar && navigation.pillar\n const hasSiblings = siblings.length > 0\n\n if (!hasPillarLink && !hasSiblings) return null\n\n const articleUrl = (article: { slug: string; category?: string }) => {\n const cat = article.category || category\n const path = cat\n ? `${basePath}/${cat}/${article.slug}`\n : `${basePath}/${article.slug}`\n return trailingSlash ? `${path}/` : path\n }\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: clusterNavCss }} />}\n\n <nav className={`${unstyled ? '' : 'sk-cluster-nav'} ${className || ''}`}>\n {hasPillarLink && navigation.pillar && (\n <div className={unstyled ? '' : 'sk-cluster-pillar-link'}>\n <p className={unstyled ? '' : 'sk-cluster-pillar-link-label'}>Full Guide</p>\n <a href={articleUrl(navigation.pillar)}>\n {navigation.pillar.title}\n </a>\n </div>\n )}\n\n {hasSiblings && (\n <div>\n <p className={unstyled ? '' : 'sk-cluster-siblings-title'}>\n {navigation.is_pillar ? 'Deep Dives' : 'More in This Series'}\n </p>\n <ul className={unstyled ? '' : 'sk-cluster-siblings-list'}>\n {siblings.map((sibling) => (\n <li key={sibling.slug} className={unstyled ? '' : 'sk-cluster-siblings-item'}>\n <span className={unstyled ? '' : 'sk-cluster-type-badge'}>\n {sibling.article_type}\n </span>\n <a href={articleUrl(sibling)}>{sibling.title}</a>\n </li>\n ))}\n </ul>\n </div>\n )}\n </nav>\n </>\n )\n}\n","/**\n * Post-process Portal/blog HTML for safe, consistent link behavior.\n * Server-safe string transforms only (no DOM).\n */\n\n/** Normalize hostname for same-site detection (strips leading www). */\nexport function normalizeSiteHost(siteUrl: string): string {\n try {\n const base = siteUrl.startsWith('http') ? siteUrl : `https://${siteUrl}`\n const u = new URL(base)\n return u.hostname.replace(/^www\\./i, '').toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * Resolve canonical site URL for link classification.\n * Pass `explicit` from props when env vars are not set (e.g. non-Vercel hosts).\n */\nexport function resolveBlogSiteUrl(explicit?: string): string {\n const fromProp = explicit?.trim()\n if (fromProp) return fromProp\n const next = process.env.NEXT_PUBLIC_SITE_URL?.trim()\n if (next) return next\n const site = process.env.SITE_URL?.trim()\n if (site) return site\n const vercel = process.env.VERCEL_URL?.trim()\n if (vercel) return vercel.startsWith('http') ? vercel : `https://${vercel}`\n return ''\n}\n\n/**\n * Add `target=\"_blank\"` and `rel=\"noopener noreferrer\"` to external http(s) links.\n * Same registrable host (with or without `www`) is treated as internal.\n * Skips anchors that already set `target`.\n */\nexport function addExternalLinkTargets(html: string, siteUrl: string): string {\n if (!html || !siteUrl) return html\n const siteHost = normalizeSiteHost(siteUrl)\n if (!siteHost) return html\n\n return html.replace(/<a\\b([^>]*)>/gi, (_full, attrs: string) => {\n const hrefMatch = attrs.match(/\\bhref\\s*=\\s*([\"'])([^\"']*)\\1/i)\n if (!hrefMatch) return `<a${attrs}>`\n const href = hrefMatch[2].trim()\n if (!/^https?:\\/\\//i.test(href)) return `<a${attrs}>`\n\n try {\n const url = new URL(href)\n const linkHost = url.hostname.replace(/^www\\./i, '').toLowerCase()\n if (linkHost === siteHost) return `<a${attrs}>`\n if (/\\btarget\\s*=/i.test(attrs)) return `<a${attrs}>`\n const trimmed = attrs.trim()\n return `<a ${trimmed} target=\"_blank\" rel=\"noopener noreferrer\">`\n } catch {\n return `<a${attrs}>`\n }\n })\n}\n","/**\n * Scoped CSS for BlogPost and BlogList default rendering.\n *\n * Injected via `<style>` in the server component output so consumers\n * get a polished blog with zero configuration.\n *\n * All colours use `--sk-*` CSS custom properties with `color-mix()` fallbacks\n * that adapt to both light and dark host sites. The host can set:\n *\n * --sk-primary Brand accent (links, highlights)\n * --sk-bg Page background\n * --sk-bg-elevated Card / elevated surface background\n * --sk-text-primary Main text\n * --sk-text-secondary Subdued text\n * --sk-text-tertiary Faint text / meta\n * --sk-surface-border Subtle border color\n *\n * If none are set the defaults produce a clean neutral light-mode look.\n */\n\n// ---------------------------------------------------------------------------\n// BlogPost styles\n// ---------------------------------------------------------------------------\n\nexport const blogPostCss = /* css */ `\n/* ===== Layout ===== */\n.sk-blog-article {\n --_sk-primary: var(--sk-primary, #2563eb);\n --_sk-bg: var(--sk-bg, #ffffff);\n --_sk-bg-el: var(--sk-bg-elevated, #f8fafc);\n --_sk-text: var(--sk-text-primary, inherit);\n --_sk-text2: var(--sk-text-secondary, #475569);\n --_sk-text3: var(--sk-text-tertiary, #94a3b8);\n --_sk-border: var(--sk-surface-border, #e2e8f0);\n max-width: 1080px;\n margin: 0 auto;\n padding: 0 1rem;\n color: var(--_sk-text);\n}\n\n/* ===== Header ===== */\n.sk-blog-header { margin-bottom: 2.5rem; }\n\n.sk-blog-breadcrumb {\n display: flex;\n align-items: center;\n gap: 0.4rem;\n margin-bottom: 1.25rem;\n font-size: 0.8125rem;\n color: var(--_sk-text3);\n}\n.sk-blog-breadcrumb a {\n color: var(--_sk-primary);\n text-decoration: none;\n font-weight: 500;\n}\n.sk-blog-breadcrumb a:hover { text-decoration: underline; }\n.sk-blog-breadcrumb-sep { color: var(--_sk-text3); }\n\n.sk-blog-title {\n font-size: 2.5rem;\n font-weight: 800;\n line-height: 1.15;\n letter-spacing: -0.02em;\n text-wrap: balance;\n margin: 0 0 0.75rem;\n color: var(--_sk-text);\n}\n.sk-blog-subtitle {\n font-size: 1.25rem;\n line-height: 1.5;\n color: var(--_sk-text2);\n margin: 0 0 1rem;\n}\n.sk-blog-meta {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: 0.5rem;\n font-size: 0.8125rem;\n color: var(--_sk-text3);\n}\n.sk-blog-meta-item { white-space: nowrap; }\n.sk-blog-meta-dot {\n width: 3px; height: 3px;\n border-radius: 50%;\n background: var(--_sk-text3);\n flex-shrink: 0;\n}\n\n/* ===== Featured image ===== */\n.sk-blog-featured-wrap {\n margin: 0 0 2.5rem;\n border-radius: 0.75rem;\n overflow: hidden;\n}\n.sk-blog-featured-img {\n display: block;\n width: 100%;\n max-height: 500px;\n object-fit: cover;\n}\n\n/* ===== Content + TOC grid ===== */\n.sk-blog-layout {\n display: grid;\n grid-template-columns: 1fr;\n gap: 3rem;\n}\n@media (min-width: 1024px) {\n .sk-blog-layout--has-toc {\n grid-template-columns: 1fr 320px;\n }\n}\n\n/* ===== Article body typography ===== */\n.sk-blog-content {\n font-size: 1.125rem;\n line-height: 1.8;\n color: var(--_sk-text);\n overflow-wrap: break-word;\n}\n.sk-blog-content > * + * { margin-top: 1.5em; }\n.sk-blog-content h2,\n.sk-blog-content h3,\n.sk-blog-content h4 {\n scroll-margin-top: 5rem;\n line-height: 1.3;\n font-weight: 700;\n color: var(--_sk-text);\n}\n.sk-blog-content h2 { font-size: 1.5rem; margin-top: 2.5em; margin-bottom: 0.75em; }\n.sk-blog-content h3 { font-size: 1.25rem; margin-top: 2em; margin-bottom: 0.5em; }\n.sk-blog-content h4 { font-size: 1.1rem; margin-top: 1.5em; margin-bottom: 0.5em; }\n.sk-blog-content p { margin: 0 0 1.5em; }\n.sk-blog-content a {\n color: var(--_sk-primary);\n text-decoration: underline;\n text-decoration-color: color-mix(in srgb, var(--_sk-primary) 40%, transparent);\n text-underline-offset: 2px;\n transition: text-decoration-color 0.15s;\n}\n.sk-blog-content a:hover {\n text-decoration-color: var(--_sk-primary);\n}\n.sk-blog-content strong { font-weight: 700; color: var(--_sk-text); }\n.sk-blog-content em { font-style: italic; }\n.sk-blog-content blockquote {\n border-left: 3px solid var(--_sk-primary);\n padding: 0.75em 1.25em;\n margin: 1.5em 0;\n color: var(--_sk-text2);\n font-style: italic;\n background: color-mix(in srgb, var(--_sk-primary) 5%, var(--_sk-bg));\n border-radius: 0 0.5rem 0.5rem 0;\n}\n.sk-blog-content blockquote p:last-child { margin-bottom: 0; }\n.sk-blog-content ul,\n.sk-blog-content ol {\n padding-left: 1.5em;\n margin: 1.25em 0;\n}\n.sk-blog-content li { margin-bottom: 0.5em; }\n.sk-blog-content li::marker { color: var(--_sk-primary); }\n.sk-blog-content code {\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 0.875em;\n padding: 0.15em 0.4em;\n border-radius: 0.25rem;\n background: color-mix(in srgb, var(--_sk-text) 8%, var(--_sk-bg));\n}\n.sk-blog-content pre {\n margin: 1.5em 0;\n padding: 1.25em 1.5em;\n border-radius: 0.75rem;\n background: color-mix(in srgb, var(--_sk-text) 6%, var(--_sk-bg));\n overflow-x: auto;\n font-size: 0.875rem;\n line-height: 1.7;\n}\n.sk-blog-content pre code {\n background: none;\n padding: 0;\n font-size: inherit;\n}\n.sk-blog-content img {\n max-width: 100%;\n height: auto;\n border-radius: 0.5rem;\n margin: 1.5em auto;\n display: block;\n}\n.sk-blog-content hr {\n border: none;\n height: 1px;\n background: var(--_sk-border);\n margin: 2.5em 0;\n}\n.sk-blog-content table {\n width: 100%;\n border-collapse: collapse;\n margin: 1.5em 0;\n font-size: 0.95rem;\n}\n.sk-blog-content th,\n.sk-blog-content td {\n text-align: left;\n padding: 0.625rem 0.875rem;\n border-bottom: 1px solid var(--_sk-border);\n}\n.sk-blog-content th {\n font-weight: 600;\n color: var(--_sk-text);\n}\n.sk-blog-content td { color: var(--_sk-text2); }\n\n/* ===== Table of contents ===== */\n.sk-blog-toc {\n position: sticky;\n top: 6rem;\n align-self: start;\n padding: 1.25rem;\n border-radius: 0.75rem;\n background: var(--_sk-bg-el);\n border: 1px solid var(--_sk-border);\n max-height: calc(100vh - 8rem);\n overflow-y: auto;\n scrollbar-width: thin;\n scrollbar-color: var(--_sk-border) transparent;\n}\n.sk-blog-toc::-webkit-scrollbar { width: 5px; }\n.sk-blog-toc::-webkit-scrollbar-track { background: transparent; }\n.sk-blog-toc::-webkit-scrollbar-thumb { background: var(--_sk-border); border-radius: 3px; }\n.sk-blog-toc::-webkit-scrollbar-thumb:hover { background: var(--_sk-text3); }\n.sk-blog-toc-title {\n margin: 0 0 0.75rem;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n color: var(--_sk-text3);\n}\n.sk-blog-toc-list {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n.sk-blog-toc-list li { margin-bottom: 0.4rem; }\n.sk-blog-toc-list a {\n display: block;\n font-size: 0.8125rem;\n line-height: 1.5;\n color: var(--_sk-text2);\n text-decoration: none;\n padding: 0.15rem 0;\n transition: color 0.15s;\n}\n.sk-blog-toc-list a:hover { color: var(--_sk-primary); }\n.sk-blog-toc-indent-3 { padding-left: 0.75rem; }\n.sk-blog-toc-indent-4 { padding-left: 1.5rem; }\n\n@media (max-width: 1023px) {\n .sk-blog-toc { display: none; }\n}\n\n/* ===== Tags ===== */\n.sk-blog-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-top: 2.5rem;\n}\n.sk-blog-tag {\n display: inline-block;\n padding: 0.25rem 0.875rem;\n font-size: 0.8125rem;\n font-weight: 500;\n border-radius: 9999px;\n background: var(--_sk-bg-el);\n border: 1px solid var(--_sk-border);\n color: var(--_sk-text2);\n text-decoration: none;\n transition: color 0.15s, border-color 0.15s;\n}\n.sk-blog-tag:hover {\n color: var(--_sk-primary);\n border-color: color-mix(in srgb, var(--_sk-primary) 40%, transparent);\n}\n\n/* ===== Author card ===== */\n.sk-blog-author {\n margin-top: 3rem;\n padding: 1.5rem;\n border-radius: 0.75rem;\n background: var(--_sk-bg-el);\n border: 1px solid var(--_sk-border);\n display: flex;\n gap: 1.25rem;\n align-items: flex-start;\n}\n.sk-blog-author-avatar {\n width: 72px;\n height: 72px;\n border-radius: 50%;\n object-fit: cover;\n flex-shrink: 0;\n}\n.sk-blog-author-name {\n margin: 0 0 0.125rem;\n font-size: 1.0625rem;\n font-weight: 700;\n color: var(--_sk-text);\n}\n.sk-blog-author-title {\n margin: 0 0 0.25rem;\n font-size: 0.8125rem;\n color: var(--_sk-text3);\n}\n.sk-blog-author-bio {\n margin: 0.5rem 0 0;\n font-size: 0.875rem;\n line-height: 1.6;\n color: var(--_sk-text2);\n}\n.sk-blog-author-links {\n display: flex;\n gap: 1rem;\n margin-top: 0.625rem;\n}\n.sk-blog-author-links a {\n font-size: 0.8125rem;\n font-weight: 600;\n color: var(--_sk-primary);\n text-decoration: none;\n}\n.sk-blog-author-links a:hover { text-decoration: underline; }\n\n@media (max-width: 640px) {\n .sk-blog-author { flex-direction: column; align-items: center; text-align: center; }\n .sk-blog-author-links { justify-content: center; }\n}\n\n/* ===== Related posts ===== */\n.sk-blog-related { margin-top: 3.5rem; }\n.sk-blog-related-title {\n font-size: 1.375rem;\n font-weight: 700;\n margin: 0 0 1.5rem;\n color: var(--_sk-text);\n}\n.sk-blog-related-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n gap: 1.25rem;\n}\n.sk-blog-related-card {\n border-radius: 0.75rem;\n overflow: hidden;\n background: var(--_sk-bg-el);\n border: 1px solid var(--_sk-border);\n text-decoration: none;\n color: inherit;\n display: flex;\n flex-direction: column;\n transition: transform 0.2s, box-shadow 0.2s;\n}\n.sk-blog-related-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 24px rgba(0,0,0,0.08);\n}\n.sk-blog-related-card img {\n width: 100%;\n height: 160px;\n object-fit: cover;\n}\n.sk-blog-related-card-body { padding: 1rem 1.125rem; }\n.sk-blog-related-card h3 {\n font-size: 0.9375rem;\n font-weight: 650;\n line-height: 1.4;\n margin: 0 0 0.375rem;\n color: var(--_sk-text);\n}\n.sk-blog-related-card p {\n font-size: 0.8125rem;\n line-height: 1.5;\n color: var(--_sk-text2);\n margin: 0;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* ===== Not found ===== */\n.sk-blog-not-found {\n text-align: center;\n padding: 5rem 1rem;\n}\n.sk-blog-not-found h1 {\n font-size: 1.5rem;\n font-weight: 700;\n margin: 0 0 0.75rem;\n color: var(--_sk-text);\n}\n.sk-blog-not-found p {\n color: var(--_sk-text2);\n margin: 0 0 1.5rem;\n}\n.sk-blog-not-found a {\n display: inline-block;\n padding: 0.75rem 1.5rem;\n border-radius: 0.5rem;\n background: var(--_sk-primary);\n color: #fff;\n font-weight: 600;\n font-size: 0.875rem;\n text-decoration: none;\n transition: opacity 0.15s;\n}\n.sk-blog-not-found a:hover { opacity: 0.9; }\n\n/* ===== Responsive ===== */\n@media (max-width: 768px) {\n .sk-blog-title { font-size: 1.75rem; }\n .sk-blog-subtitle { font-size: 1.0625rem; }\n .sk-blog-content { font-size: 1rem; }\n .sk-blog-related-grid { grid-template-columns: 1fr; }\n}\n`.trim()\n\n// ---------------------------------------------------------------------------\n// BlogList styles\n// ---------------------------------------------------------------------------\n\nexport const blogListCss = /* css */ `\n/* ===== BlogList layout ===== */\n.sk-bloglist {\n --_sk-primary: var(--sk-primary, #2563eb);\n --_sk-bg: var(--sk-bg, #ffffff);\n --_sk-bg-el: var(--sk-bg-elevated, #f8fafc);\n --_sk-text: var(--sk-text-primary, inherit);\n --_sk-text2: var(--sk-text-secondary, #475569);\n --_sk-text3: var(--sk-text-tertiary, #94a3b8);\n --_sk-border: var(--sk-surface-border, #e2e8f0);\n}\n\n/* ===== Category filter ===== */\n.sk-bloglist-cats {\n display: flex;\n flex-wrap: wrap;\n gap: 0.5rem;\n margin-bottom: 2rem;\n}\n.sk-bloglist-cat {\n display: inline-block;\n padding: 0.375rem 1rem;\n border-radius: 9999px;\n font-size: 0.8125rem;\n font-weight: 600;\n text-decoration: none;\n transition: background 0.15s, color 0.15s, border-color 0.15s;\n border: 1px solid var(--_sk-border);\n background: var(--_sk-bg-el);\n color: var(--_sk-text2);\n}\n.sk-bloglist-cat:hover {\n border-color: color-mix(in srgb, var(--_sk-primary) 40%, transparent);\n color: var(--_sk-primary);\n}\n.sk-bloglist-cat--active {\n background: var(--_sk-primary);\n color: #fff;\n border-color: var(--_sk-primary);\n}\n.sk-bloglist-cat--active:hover { color: #fff; opacity: 0.9; }\n\n/* ===== Card grid ===== */\n.sk-bloglist-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 1.5rem;\n}\n\n/* ===== Post card ===== */\n.sk-bloglist-card {\n border-radius: 0.75rem;\n overflow: hidden;\n background: var(--_sk-bg-el);\n border: 1px solid var(--_sk-border);\n display: flex;\n flex-direction: column;\n transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;\n}\n.sk-bloglist-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 8px 24px rgba(0,0,0,0.08);\n border-color: color-mix(in srgb, var(--_sk-primary) 30%, var(--_sk-border));\n}\n.sk-bloglist-card-img-link { display: block; overflow: hidden; }\n.sk-bloglist-card-img {\n display: block;\n width: 100%;\n height: 200px;\n object-fit: cover;\n transition: transform 0.4s;\n}\n.sk-bloglist-card:hover .sk-bloglist-card-img { transform: scale(1.03); }\n.sk-bloglist-card-body {\n padding: 1.25rem;\n display: flex;\n flex-direction: column;\n flex: 1;\n}\n.sk-bloglist-card-meta {\n display: flex;\n align-items: center;\n gap: 0.625rem;\n margin-bottom: 0.625rem;\n}\n.sk-bloglist-card-category {\n display: inline-block;\n padding: 0.125rem 0.5rem;\n border-radius: 0.25rem;\n font-size: 0.6875rem;\n font-weight: 700;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n background: color-mix(in srgb, var(--_sk-primary) 12%, transparent);\n color: var(--_sk-primary);\n}\n.sk-bloglist-card-date {\n font-size: 0.8125rem;\n color: var(--_sk-text3);\n}\n.sk-bloglist-card-title {\n font-size: 1.0625rem;\n font-weight: 700;\n line-height: 1.4;\n margin: 0 0 0.5rem;\n}\n.sk-bloglist-card-title a {\n color: var(--_sk-text);\n text-decoration: none;\n transition: color 0.15s;\n}\n.sk-bloglist-card:hover .sk-bloglist-card-title a { color: var(--_sk-primary); }\n.sk-bloglist-card-excerpt {\n font-size: 0.875rem;\n line-height: 1.6;\n color: var(--_sk-text2);\n margin: 0 0 1rem;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n flex: 1;\n}\n.sk-bloglist-card-footer {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding-top: 0.75rem;\n border-top: 1px solid var(--_sk-border);\n font-size: 0.8125rem;\n color: var(--_sk-text3);\n}\n\n/* ===== Pagination ===== */\n.sk-bloglist-pagination {\n display: flex;\n justify-content: center;\n align-items: center;\n gap: 0.75rem;\n margin-top: 3rem;\n}\n.sk-bloglist-page-link {\n display: inline-block;\n padding: 0.5rem 1.25rem;\n border-radius: 0.5rem;\n background: var(--_sk-primary);\n color: #fff;\n font-size: 0.875rem;\n font-weight: 600;\n text-decoration: none;\n transition: opacity 0.15s;\n}\n.sk-bloglist-page-link:hover { opacity: 0.9; }\n.sk-bloglist-page-info {\n font-size: 0.8125rem;\n color: var(--_sk-text3);\n}\n\n/* ===== Empty state ===== */\n.sk-bloglist-empty {\n text-align: center;\n padding: 3rem 1rem;\n color: var(--_sk-text2);\n}\n\n/* ===== Responsive ===== */\n@media (max-width: 640px) {\n .sk-bloglist-grid { grid-template-columns: 1fr; }\n}\n`.trim()\n","/**\n * @sonordev/site-kit/blog - Blog Post Component\n *\n * Fetches and displays a single blog post with full content, table of contents,\n * author info, related posts, and SEO metadata support.\n *\n * Ships with world-class default styling via scoped `.sk-blog-*` classes.\n * No configuration needed — just `<BlogPost slug={slug} />`.\n *\n * Override with `styles` prop (per-element class names) or `unstyled` for\n * complete control. The `children` render prop gives full data access.\n */\n\nimport React from 'react'\nimport { marked } from 'marked'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor, ClusterNavigation as ClusterNavigationType } from './types'\nimport { ServiceCallouts } from './ServiceCallout'\nimport { ClusterNavigation } from './ClusterNavigation'\nimport { addExternalLinkTargets, resolveBlogSiteUrl } from './processBlogHtml'\nimport { blogPostCss } from './blog-styles'\n\n/** Extract cluster navigation from a post's cluster fields (pure function, no API calls). */\nfunction getClusterNav(post: Record<string, any>): ClusterNavigationType | null {\n if (!post.cluster_id && !post.cluster_slug) return null\n const isPillar = post.article_type === 'pillar'\n return {\n cluster_name: post.cluster_name || '',\n cluster_slug: post.cluster_slug || '',\n pillar: isPillar ? null\n : post.parent_pillar_slug ? { slug: post.parent_pillar_slug, title: post.parent_pillar_title || '' } : null,\n siblings: post.sibling_articles || [],\n is_pillar: isPillar,\n }\n}\n\n// ============================================================================\n// Markdown helpers\n// ============================================================================\n\nfunction looksLikeMarkdown(text: string): boolean {\n if (text.trimStart().startsWith('<')) return false\n const markers = [/^#{1,6}\\s/m, /\\*\\*[^*]+\\*\\*/, /\\[([^\\]]+)\\]\\([^)]+\\)/, /^[-*]\\s/m, /^>\\s/m]\n let hits = 0\n for (const re of markers) if (re.test(text)) hits++\n return hits >= 2\n}\n\nfunction slugify(text: string): string {\n return text.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '')\n}\n\n/** Convert markdown to HTML if needed, and inject IDs into headings for TOC anchors. */\nfunction ensureHtml(raw: string): string {\n if (!raw) return raw\n let html = raw\n if (looksLikeMarkdown(html)) {\n html = marked.parse(html, { gfm: true, breaks: false, async: false }) as string\n }\n html = injectHeadingIds(html)\n return html\n}\n\n/** Add `id` attributes to h2-h4 that lack them so TOC anchor links work. */\nfunction injectHeadingIds(html: string): string {\n return html.replace(/<h([2-4])([^>]*)>(.*?)<\\/h[2-4]>/gi, (_full, level, attrs: string, inner: string) => {\n if (/\\bid\\s*=/i.test(attrs)) return _full\n const text = inner.replace(/<[^>]*>/g, '')\n const id = slugify(text)\n return `<h${level}${attrs} id=\"${id}\">${inner}</h${level}>`\n })\n}\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogPostStyles {\n article?: string\n header?: string\n breadcrumb?: string\n breadcrumbLink?: string\n title?: string\n subtitle?: string\n meta?: string\n metaItem?: string\n featuredImageWrapper?: string\n featuredImage?: string\n contentLayout?: string\n content?: string\n tocSidebar?: string\n tocTitle?: string\n tocList?: string\n tocItem?: string\n tocLink?: string\n tags?: string\n tag?: string\n faqSection?: string\n faqTitle?: string\n faqItem?: string\n faqQuestion?: string\n faqAnswer?: string\n authorCard?: string\n relatedSection?: string\n relatedTitle?: string\n relatedGrid?: string\n relatedCard?: string\n notFound?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchBlogPost(apiUrl: string, apiKey: string, slug: string): Promise<BlogPostType | null> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n if (!response.ok) {\n if (response.status === 404) return null\n console.error('[Blog] Failed to fetch post:', response.statusText)\n return null\n }\n const data = await response.json()\n return data.post\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\nasync function fetchRelatedPosts(apiUrl: string, apiKey: string, postId: string, limit: number = 3): Promise<BlogPostType[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', 'x-api-key': apiKey },\n body: JSON.stringify({ current_post_id: postId, limit }),\n next: { revalidate: 300 },\n })\n if (!response.ok) return []\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// TOC GENERATION\n// ============================================================================\n\nfunction generateTableOfContents(html: string): TocItem[] {\n const headingRegex = /<h([2-4])[^>]*(?:id=\"([^\"]*)\")?[^>]*>(.*?)<\\/h[2-4]>/gi\n const items: TocItem[] = []\n let match\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const existingId = match[2]\n const text = match[3].replace(/<[^>]*>/g, '')\n const id = existingId || slugify(text)\n items.push({ id, text, level })\n }\n return items\n}\n\n// ============================================================================\n// COMPONENT PROPS\n// ============================================================================\n\nexport interface BlogPostServerProps {\n apiUrl?: string\n apiKey?: string\n slug: string\n showToc?: boolean\n showRelated?: boolean\n relatedCount?: number\n showAuthor?: boolean\n basePath?: string\n className?: string\n styles?: BlogPostStyles\n unstyled?: boolean\n siteUrl?: string\n children?: (props: {\n post: BlogPostType\n tableOfContents: TocItem[]\n relatedPosts: BlogPostType[]\n }) => React.ReactNode\n}\n\n// ============================================================================\n// CLASS HELPER — pick custom `styles` class or default `.sk-blog-*` class\n// ============================================================================\n\nfunction cls(unstyled: boolean, styles: BlogPostStyles, key: keyof BlogPostStyles, defaultClass: string, extra?: string): string | undefined {\n if (unstyled) return styles[key] || undefined\n const base = styles[key] || defaultClass\n return extra ? `${base} ${extra}` : base\n}\n\n// ============================================================================\n// BLOG POST COMPONENT\n// ============================================================================\n\nexport async function BlogPost({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n slug,\n showToc = true,\n showRelated = true,\n relatedCount = 3,\n showAuthor = true,\n basePath = '/blog',\n className,\n styles = {},\n unstyled = false,\n siteUrl,\n children,\n}: BlogPostServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n const post = await fetchBlogPost(apiUrl, apiKey, slug)\n\n // ---------- NOT FOUND ----------\n if (!post) {\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogPostCss }} />}\n <div className={cls(unstyled, styles, 'notFound', 'sk-blog-not-found', className)}>\n <h1>Post Not Found</h1>\n <p>The blog post you’re looking for doesn’t exist or has been removed.</p>\n <a href={basePath}>← Back to Blog</a>\n </div>\n </>\n )\n }\n\n // ---------- PREPARE DATA ----------\n const rawContent = post.content_html || post.content || ''\n const content = ensureHtml(rawContent)\n const siteUrlResolved = resolveBlogSiteUrl(siteUrl)\n const contentWithExternalTargets = addExternalLinkTargets(content, siteUrlResolved)\n const tableOfContents = showToc ? generateTableOfContents(content) : []\n const relatedPosts = showRelated ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount) : []\n\n const faqRaw = (post.faq_items ?? (post as { faqItems?: unknown }).faqItems) as Array<{ question: string; answer: string }> | undefined\n const faqItemsProcessed = faqRaw?.map((item) => ({\n ...item,\n answer: addExternalLinkTargets(item.answer || '', siteUrlResolved),\n })) ?? faqRaw\n\n // ---------- CUSTOM RENDER ----------\n if (children) {\n return children({ post, tableOfContents, relatedPosts })\n }\n\n const { BlogPostFaqSection } = await import('./BlogPostFaqSection')\n\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })\n : null\n\n const hasToc = showToc && tableOfContents.length > 0\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogPostCss }} />}\n\n <article className={cls(unstyled, styles, 'article', 'sk-blog-article', className)}>\n {/* ===== Header ===== */}\n <header className={cls(unstyled, styles, 'header', 'sk-blog-header')}>\n <nav className={cls(unstyled, styles, 'breadcrumb', 'sk-blog-breadcrumb')}>\n <a href={basePath} className={styles.breadcrumbLink || undefined}>Blog</a>\n {post.category && (\n <>\n <span className=\"sk-blog-breadcrumb-sep\">/</span>\n <a\n href={`${basePath}?category=${post.category}`}\n className={styles.breadcrumbLink || undefined}\n >\n {typeof post.category === 'string' ? post.category : (post.category as any)?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n <h1 className={cls(unstyled, styles, 'title', 'sk-blog-title')}>{post.title}</h1>\n\n {post.subtitle && (\n <p className={cls(unstyled, styles, 'subtitle', 'sk-blog-subtitle')}>{post.subtitle}</p>\n )}\n\n <div className={cls(unstyled, styles, 'meta', 'sk-blog-meta')}>\n {post.author && (\n <span className={cls(unstyled, styles, 'metaItem', 'sk-blog-meta-item')}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.author && date && <span className=\"sk-blog-meta-dot\" />}\n {date && (\n <span className={cls(unstyled, styles, 'metaItem', 'sk-blog-meta-item')}>{date}</span>\n )}\n {date && post.reading_time_minutes && <span className=\"sk-blog-meta-dot\" />}\n {post.reading_time_minutes && (\n <span className={cls(unstyled, styles, 'metaItem', 'sk-blog-meta-item')}>\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </header>\n\n {/* ===== Featured Image ===== */}\n {post.featured_image && (\n <figure className={cls(unstyled, styles, 'featuredImageWrapper', 'sk-blog-featured-wrap')}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={cls(unstyled, styles, 'featuredImage', 'sk-blog-featured-img')}\n />\n </figure>\n )}\n\n {/* ===== Content + TOC ===== */}\n <div className={cls(unstyled, styles, 'contentLayout', hasToc ? 'sk-blog-layout sk-blog-layout--has-toc' : 'sk-blog-layout')}>\n <div\n className={cls(unstyled, styles, 'content', 'sk-blog-content')}\n dangerouslySetInnerHTML={{ __html: contentWithExternalTargets }}\n />\n\n {hasToc && (\n <aside className={cls(unstyled, styles, 'tocSidebar', 'sk-blog-toc')}>\n <h4 className={cls(unstyled, styles, 'tocTitle', 'sk-blog-toc-title')}>On This Page</h4>\n <ul className={cls(unstyled, styles, 'tocList', 'sk-blog-toc-list')}>\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n className={cls(unstyled, styles, 'tocItem', item.level > 2 ? `sk-blog-toc-indent-${item.level}` : '')}\n >\n <a href={`#${item.id}`} className={styles.tocLink || undefined}>{item.text}</a>\n </li>\n ))}\n </ul>\n </aside>\n )}\n </div>\n\n {/* ===== Tags ===== */}\n {post.tags && post.tags.length > 0 && (\n <div className={cls(unstyled, styles, 'tags', 'sk-blog-tags')}>\n {post.tags.map((tag, index) => {\n const tagName = typeof tag === 'string' ? tag : tag?.name || ''\n return (\n <a key={`${tagName}-${index}`} href={`${basePath}?tag=${tagName}`} className={cls(unstyled, styles, 'tag', 'sk-blog-tag')}>\n #{tagName}\n </a>\n )\n })}\n </div>\n )}\n\n {/* ===== Service Callouts ===== */}\n <ServiceCallouts\n callouts={(post as any).service_callouts ?? (post as any).serviceCallouts ?? []}\n unstyled={unstyled}\n />\n\n {/* ===== FAQ ===== */}\n <BlogPostFaqSection\n items={(faqItemsProcessed ?? []) as any[]}\n unstyled={unstyled}\n styles={unstyled ? {\n section: styles.faqSection,\n title: styles.faqTitle,\n item: styles.faqItem,\n question: styles.faqQuestion,\n answerInner: styles.faqAnswer,\n } : undefined}\n />\n\n {/* ===== Author ===== */}\n {showAuthor && post.author && typeof post.author === 'object' && (\n <AuthorSection author={normalizeAuthorForDisplay(post.author)} className={styles.authorCard} unstyled={unstyled} />\n )}\n\n {/* ===== Cluster Navigation ===== */}\n {(() => {\n const clusterNav = getClusterNav(post as any)\n if (!clusterNav) return null\n return (\n <ClusterNavigation\n navigation={clusterNav}\n basePath={basePath}\n unstyled={unstyled}\n />\n )\n })()}\n\n {/* ===== Related Posts ===== */}\n {showRelated && relatedPosts.length > 0 && (\n <section className={cls(unstyled, styles, 'relatedSection', 'sk-blog-related')}>\n <h2 className={cls(unstyled, styles, 'relatedTitle', 'sk-blog-related-title')}>Related Posts</h2>\n <div className={cls(unstyled, styles, 'relatedGrid', 'sk-blog-related-grid')}>\n {relatedPosts.map((rp) => (\n <a key={rp.id} href={`${basePath}/${rp.slug}`} className={cls(unstyled, styles, 'relatedCard', 'sk-blog-related-card')}>\n {rp.featured_image && <img src={rp.featured_image} alt={rp.title} />}\n <div className=\"sk-blog-related-card-body\">\n <h3>{rp.title}</h3>\n {rp.excerpt && <p>{rp.excerpt.slice(0, 120)}...</p>}\n </div>\n </a>\n ))}\n </div>\n </section>\n )}\n </article>\n </>\n )\n}\n\n// ============================================================================\n// AUTHOR HELPERS\n// ============================================================================\n\nfunction normalizeAuthorForDisplay(author: Record<string, unknown> | BlogAuthor): BlogAuthor & { sameAs?: string[]; title?: string } {\n const a = author as Record<string, unknown>\n return {\n id: (a.id as string) ?? 'author',\n project_id: (a.project_id as string) ?? '',\n name: (a.name as string) ?? 'Author',\n slug: (a.slug as string) ?? 'author',\n bio: (a.bio as string) ?? undefined,\n avatar_url: (a.avatar_url as string) ?? (a.image as string) ?? (a.image_url as string) ?? undefined,\n email: (a.email as string) ?? undefined,\n website: (a.website as string) ?? (a.url as string) ?? undefined,\n social_links: a.social_links as BlogAuthor['social_links'] | undefined,\n is_active: (a.is_active as boolean) ?? true,\n ...((a.socialProfiles as string[])?.length ? { sameAs: a.socialProfiles as string[] } : {}),\n ...(a.title ? { title: a.title as string } : {}),\n } as BlogAuthor & { sameAs?: string[]; title?: string }\n}\n\nfunction AuthorSection({ author, className, unstyled = false }: { author: BlogAuthor & { sameAs?: string[]; title?: string }; className?: string; unstyled?: boolean }) {\n const base = unstyled ? className : (className || 'sk-blog-author')\n return (\n <section className={base || undefined}>\n {author.avatar_url && <img src={author.avatar_url} alt={author.name} className={unstyled ? undefined : 'sk-blog-author-avatar'} />}\n <div>\n <h3 className={unstyled ? undefined : 'sk-blog-author-name'}>{author.name}</h3>\n {'title' in author && author.title && <p className={unstyled ? undefined : 'sk-blog-author-title'}>{author.title}</p>}\n {author.bio && <p className={unstyled ? undefined : 'sk-blog-author-bio'}>{author.bio}</p>}\n {author.social_links && (\n <div className={unstyled ? undefined : 'sk-blog-author-links'}>\n {author.social_links.twitter && <a href={`https://twitter.com/${author.social_links.twitter}`} target=\"_blank\" rel=\"noopener noreferrer\">Twitter</a>}\n {author.social_links.linkedin && <a href={author.social_links.linkedin} target=\"_blank\" rel=\"noopener noreferrer\">LinkedIn</a>}\n </div>\n )}\n {'sameAs' in author && author.sameAs && author.sameAs.length > 0 && !author.social_links && (\n <div className={unstyled ? undefined : 'sk-blog-author-links'}>\n {author.sameAs.map((url, i) => <a key={i} href={url} target=\"_blank\" rel=\"noopener noreferrer\">Profile</a>)}\n </div>\n )}\n </div>\n </section>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Blog List Component\n *\n * Fetches and displays a list of blog posts with pagination, filtering, and sorting.\n *\n * Ships with world-class default styling via scoped `.sk-bloglist-*` classes.\n * No configuration needed — just `<BlogList basePath=\"/blog\" />`.\n *\n * Override with `styles` prop (per-element class names) or `unstyled` for\n * complete control. The `children` render prop gives full data access.\n */\n\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\nimport { blogListCss } from './blog-styles'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogListStyles {\n container?: string\n categoryNav?: string\n categoryLink?: string\n categoryLinkActive?: string\n categoryLinkInactive?: string\n grid?: string\n card?: string\n cardImageWrapper?: string\n cardImage?: string\n cardBody?: string\n cardMeta?: string\n cardCategory?: string\n cardDate?: string\n cardTitle?: string\n cardTitleLink?: string\n cardExcerpt?: string\n cardFooter?: string\n cardAuthor?: string\n cardReadingTime?: string\n cardReadMore?: string\n pagination?: string\n paginationLink?: string\n paginationInfo?: string\n emptyState?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\ninterface FetchBlogListParams {\n apiUrl: string\n apiKey: string\n category?: string\n tag?: string\n author?: string\n featured?: boolean\n search?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n}\n\nasync function fetchBlogList(params: FetchBlogListParams): Promise<BlogListResult> {\n const {\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n } = params\n\n const queryParams = new URLSearchParams()\n if (category) queryParams.set('category', category)\n if (tag) queryParams.set('tag', tag)\n if (author) queryParams.set('author', author)\n if (featured) queryParams.set('featured', 'true')\n if (search) queryParams.set('search', search)\n if ((params as any).cluster) queryParams.set('cluster', (params as any).cluster)\n queryParams.set('page', String(page))\n queryParams.set('per_page', String(perPage))\n queryParams.set('order_by', orderBy)\n queryParams.set('order', order)\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts?${queryParams}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) {\n console.error('[Blog] Failed to fetch posts:', response.statusText)\n return emptyResult()\n }\n\n const data = await response.json()\n return {\n posts: data.posts || [],\n pagination: {\n page: data.pagination?.page || 1,\n perPage: data.pagination?.per_page || 12,\n total: data.pagination?.total || 0,\n totalPages: data.pagination?.total_pages || 0,\n hasNext: data.pagination?.has_next || false,\n hasPrev: data.pagination?.has_prev || false,\n },\n }\n } catch (error) {\n console.error('[Blog] Error fetching posts:', error)\n return emptyResult()\n }\n}\n\nfunction emptyResult(): BlogListResult {\n return { posts: [], pagination: { page: 1, perPage: 12, total: 0, totalPages: 0, hasNext: false, hasPrev: false } }\n}\n\nasync function fetchCategories(apiUrl: string, apiKey: string): Promise<BlogCategory[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n if (!response.ok) return []\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n// ============================================================================\n// CLASS HELPER\n// ============================================================================\n\nfunction cls(unstyled: boolean, styles: BlogListStyles, key: keyof BlogListStyles, defaultClass: string, extra?: string): string | undefined {\n if (unstyled) return styles[key] || undefined\n const base = styles[key] || defaultClass\n return extra ? `${base} ${extra}` : base\n}\n\n// ============================================================================\n// BLOG LIST COMPONENT\n// ============================================================================\n\nexport interface BlogListServerProps {\n apiUrl?: string\n apiKey?: string\n category?: string\n tag?: string\n author?: string\n featured?: boolean\n search?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n showCategoryFilter?: boolean\n showPagination?: boolean\n className?: string\n basePath?: string\n styles?: BlogListStyles\n unstyled?: boolean\n renderPost?: (post: BlogPost) => React.ReactNode\n children?: (props: {\n posts: BlogPost[]\n pagination: BlogListResult['pagination']\n categories: BlogCategory[]\n }) => React.ReactNode\n}\n\nexport async function BlogList({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n showCategoryFilter = false,\n showPagination = true,\n className,\n basePath = '/blog',\n styles = {},\n unstyled = false,\n renderPost,\n children,\n}: BlogListServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n const [blogData, categories] = await Promise.all([\n fetchBlogList({ apiUrl, apiKey, category, tag, author, featured, search, page, perPage, orderBy, order }),\n showCategoryFilter ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n ])\n\n if (children) {\n return children({ posts: blogData.posts, pagination: blogData.pagination, categories })\n }\n\n const { posts, pagination } = blogData\n\n // ---------- EMPTY STATE ----------\n if (posts.length === 0) {\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogListCss }} />}\n <div className={cls(unstyled, styles, 'emptyState', 'sk-bloglist sk-bloglist-empty', className)}>\n <p>No posts found.</p>\n </div>\n </>\n )\n }\n\n return (\n <>\n {!unstyled && <style dangerouslySetInnerHTML={{ __html: blogListCss }} />}\n\n <div className={cls(unstyled, styles, 'container', 'sk-bloglist', className)}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav className={cls(unstyled, styles, 'categoryNav', 'sk-bloglist-cats')}>\n <a\n href={basePath}\n className={cls(unstyled, styles, 'categoryLink', !category ? 'sk-bloglist-cat sk-bloglist-cat--active' : 'sk-bloglist-cat')}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={`${basePath}?category=${cat.slug}`}\n className={cls(unstyled, styles, 'categoryLink', category === cat.slug ? 'sk-bloglist-cat sk-bloglist-cat--active' : 'sk-bloglist-cat')}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div className={cls(unstyled, styles, 'grid', 'sk-bloglist-grid')}>\n {posts.map((post) =>\n renderPost ? (\n <React.Fragment key={post.id}>{renderPost(post)}</React.Fragment>\n ) : (\n <BlogPostCard key={post.id} post={post} basePath={basePath} styles={styles} unstyled={unstyled} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav className={cls(unstyled, styles, 'pagination', 'sk-bloglist-pagination')}>\n {pagination.hasPrev && (\n <a href={buildPaginationUrl(basePath, page - 1, category)} className={cls(unstyled, styles, 'paginationLink', 'sk-bloglist-page-link')}>\n ← Previous\n </a>\n )}\n <span className={cls(unstyled, styles, 'paginationInfo', 'sk-bloglist-page-info')}>\n Page {pagination.page} of {pagination.totalPages}\n </span>\n {pagination.hasNext && (\n <a href={buildPaginationUrl(basePath, page + 1, category)} className={cls(unstyled, styles, 'paginationLink', 'sk-bloglist-page-link')}>\n Next →\n </a>\n )}\n </nav>\n )}\n </div>\n </>\n )\n}\n\n// ============================================================================\n// BLOG POST CARD (Default rendering)\n// ============================================================================\n\ninterface BlogPostCardProps {\n post: BlogPost\n basePath: string\n styles?: BlogListStyles\n unstyled?: boolean\n}\n\nfunction BlogPostCard({ post, basePath, styles = {}, unstyled = false }: BlogPostCardProps) {\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })\n : null\n\n return (\n <article className={cls(unstyled, styles, 'card', 'sk-bloglist-card')}>\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`} className={cls(unstyled, styles, 'cardImageWrapper', 'sk-bloglist-card-img-link')}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={cls(unstyled, styles, 'cardImage', 'sk-bloglist-card-img')}\n />\n </a>\n )}\n\n <div className={cls(unstyled, styles, 'cardBody', 'sk-bloglist-card-body')}>\n {/* Meta */}\n <div className={cls(unstyled, styles, 'cardMeta', 'sk-bloglist-card-meta')}>\n {post.category && (\n <span className={cls(unstyled, styles, 'cardCategory', 'sk-bloglist-card-category')}>\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {(post as any).article_type && (\n <span className=\"sk-bloglist-card-article-type\" style={{\n display: 'inline-flex', alignItems: 'center',\n padding: '0.0625rem 0.375rem', borderRadius: '9999px',\n fontSize: '0.6875rem', fontWeight: 500,\n background: (post as any).article_type === 'pillar' ? 'rgba(99,102,241,0.1)' : 'rgba(99,102,241,0.05)',\n color: '#6366f1', border: '1px solid rgba(99,102,241,0.15)',\n textTransform: 'capitalize',\n }}>\n {(post as any).article_type}\n </span>\n )}\n {date && <span className={cls(unstyled, styles, 'cardDate', 'sk-bloglist-card-date')}>{date}</span>}\n </div>\n\n {/* Title */}\n <h3 className={cls(unstyled, styles, 'cardTitle', 'sk-bloglist-card-title')}>\n <a href={`${basePath}/${post.slug}`} className={styles.cardTitleLink || undefined}>\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p className={cls(unstyled, styles, 'cardExcerpt', 'sk-bloglist-card-excerpt')}>\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div className={cls(unstyled, styles, 'cardFooter', 'sk-bloglist-card-footer')}>\n {post.author && (\n <span className={cls(unstyled, styles, 'cardAuthor', '')}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.reading_time_minutes && (\n <span className={cls(unstyled, styles, 'cardReadingTime', '')}>\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction buildPaginationUrl(basePath: string, page: number, category?: string): string {\n const params = new URLSearchParams()\n params.set('page', String(page))\n if (category) params.set('category', category)\n return `${basePath}?${params}`\n}\n"]}
|
|
@@ -1,12 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var chunkQPIKPWAZ_js = require('./chunk-QPIKPWAZ.js');
|
|
4
|
+
|
|
3
5
|
// src/blog/server-core.ts
|
|
4
|
-
function getConfig() {
|
|
5
|
-
return {
|
|
6
|
-
apiUrl: process.env.SONOR_API_URL || process.env.NEXT_PUBLIC_SONOR_API_URL || process.env.NEXT_PUBLIC_PORTAL_API_URL || "https://api.sonor.io",
|
|
7
|
-
apiKey: process.env.SONOR_API_KEY || process.env.NEXT_PUBLIC_SONOR_API_KEY || ""
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
6
|
var SEO_LIMITS = {
|
|
11
7
|
title: { min: 30, max: 60, recommended: 55 },
|
|
12
8
|
metaDescription: { min: 120, max: 160, recommended: 155 },
|
|
@@ -97,11 +93,12 @@ function validateBlogPostSeo(post) {
|
|
|
97
93
|
return results;
|
|
98
94
|
}
|
|
99
95
|
async function getBlogPost(slug) {
|
|
100
|
-
const
|
|
101
|
-
if (!
|
|
96
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
97
|
+
if (!config) {
|
|
102
98
|
console.warn("[Blog] No API key configured");
|
|
103
99
|
return null;
|
|
104
100
|
}
|
|
101
|
+
const { apiUrl, apiKey } = config;
|
|
105
102
|
try {
|
|
106
103
|
const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {
|
|
107
104
|
headers: { "x-api-key": apiKey },
|
|
@@ -116,11 +113,12 @@ async function getBlogPost(slug) {
|
|
|
116
113
|
}
|
|
117
114
|
}
|
|
118
115
|
async function getAllBlogSlugs() {
|
|
119
|
-
const
|
|
120
|
-
if (!
|
|
116
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
117
|
+
if (!config) {
|
|
121
118
|
console.warn("[Blog] No API key configured");
|
|
122
119
|
return [];
|
|
123
120
|
}
|
|
121
|
+
const { apiUrl, apiKey } = config;
|
|
124
122
|
try {
|
|
125
123
|
const response = await fetch(`${apiUrl}/public/blog/slugs`, {
|
|
126
124
|
headers: { "x-api-key": apiKey },
|
|
@@ -135,8 +133,9 @@ async function getAllBlogSlugs() {
|
|
|
135
133
|
}
|
|
136
134
|
}
|
|
137
135
|
async function getBlogCategories() {
|
|
138
|
-
const
|
|
139
|
-
if (!
|
|
136
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
137
|
+
if (!config) return [];
|
|
138
|
+
const { apiUrl, apiKey } = config;
|
|
140
139
|
try {
|
|
141
140
|
const response = await fetch(`${apiUrl}/public/blog/categories`, {
|
|
142
141
|
headers: { "x-api-key": apiKey },
|
|
@@ -390,11 +389,12 @@ function generateHowToSchema(post, steps, options = {}) {
|
|
|
390
389
|
};
|
|
391
390
|
}
|
|
392
391
|
async function getAllBlogPosts() {
|
|
393
|
-
const
|
|
394
|
-
if (!
|
|
392
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
393
|
+
if (!config) {
|
|
395
394
|
console.warn("[Blog] No API key configured");
|
|
396
395
|
return [];
|
|
397
396
|
}
|
|
397
|
+
const { apiUrl, apiKey } = config;
|
|
398
398
|
try {
|
|
399
399
|
const response = await fetch(`${apiUrl}/public/blog/posts?limit=100`, {
|
|
400
400
|
headers: { "x-api-key": apiKey },
|
|
@@ -546,8 +546,9 @@ async function generateAtomFeed(options) {
|
|
|
546
546
|
return atom;
|
|
547
547
|
}
|
|
548
548
|
async function getTopicClusters() {
|
|
549
|
-
const
|
|
550
|
-
if (!
|
|
549
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
550
|
+
if (!config) return [];
|
|
551
|
+
const { apiUrl, apiKey } = config;
|
|
551
552
|
try {
|
|
552
553
|
const response = await fetch(`${apiUrl}/public/blog/clusters`, {
|
|
553
554
|
headers: { "x-api-key": apiKey },
|
|
@@ -577,8 +578,9 @@ async function getTopicClusters() {
|
|
|
577
578
|
}
|
|
578
579
|
}
|
|
579
580
|
async function getTopicCluster(slug) {
|
|
580
|
-
const
|
|
581
|
-
if (!
|
|
581
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
582
|
+
if (!config) return null;
|
|
583
|
+
const { apiUrl, apiKey } = config;
|
|
582
584
|
try {
|
|
583
585
|
const response = await fetch(`${apiUrl}/public/blog/clusters/${slug}`, {
|
|
584
586
|
headers: { "x-api-key": apiKey },
|
|
@@ -635,8 +637,9 @@ async function identifyTopicClusters(categorySlug) {
|
|
|
635
637
|
return { pillar, supportingPosts, internalLinks };
|
|
636
638
|
}
|
|
637
639
|
async function getPostsByCategory(categorySlug) {
|
|
638
|
-
const
|
|
639
|
-
if (!
|
|
640
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
641
|
+
if (!config) return [];
|
|
642
|
+
const { apiUrl, apiKey } = config;
|
|
640
643
|
try {
|
|
641
644
|
const response = await fetch(`${apiUrl}/public/blog/posts?category=${categorySlug}&limit=50`, {
|
|
642
645
|
headers: { "x-api-key": apiKey },
|
|
@@ -784,9 +787,10 @@ async function generateClusterPageMetadata(clusterSlug, options = {}) {
|
|
|
784
787
|
};
|
|
785
788
|
}
|
|
786
789
|
async function getRelatedInsights(currentSlug, options = {}) {
|
|
787
|
-
const
|
|
790
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
791
|
+
if (!config) return [];
|
|
792
|
+
const { apiUrl, apiKey } = config;
|
|
788
793
|
const { limit = 3, category } = options;
|
|
789
|
-
if (!apiKey) return [];
|
|
790
794
|
try {
|
|
791
795
|
const response = await fetch(`${apiUrl}/public/blog/related`, {
|
|
792
796
|
method: "POST",
|
|
@@ -872,11 +876,12 @@ function generateAllBlogSchemas(post, options = {}) {
|
|
|
872
876
|
return schemas;
|
|
873
877
|
}
|
|
874
878
|
async function getAuthorBySlug(slug) {
|
|
875
|
-
const
|
|
876
|
-
if (!
|
|
879
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
880
|
+
if (!config) {
|
|
877
881
|
console.warn("[Blog] No API key configured");
|
|
878
882
|
return null;
|
|
879
883
|
}
|
|
884
|
+
const { apiUrl, apiKey } = config;
|
|
880
885
|
try {
|
|
881
886
|
const response = await fetch(`${apiUrl}/public/blog/authors/${slug}`, {
|
|
882
887
|
headers: { "x-api-key": apiKey },
|
|
@@ -891,11 +896,12 @@ async function getAuthorBySlug(slug) {
|
|
|
891
896
|
}
|
|
892
897
|
}
|
|
893
898
|
async function getAuthorPosts(slug, limit = 20) {
|
|
894
|
-
const
|
|
895
|
-
if (!
|
|
899
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
900
|
+
if (!config) {
|
|
896
901
|
console.warn("[Blog] No API key configured");
|
|
897
902
|
return { author: null, posts: [], total: 0 };
|
|
898
903
|
}
|
|
904
|
+
const { apiUrl, apiKey } = config;
|
|
899
905
|
try {
|
|
900
906
|
const response = await fetch(`${apiUrl}/public/blog/authors/${slug}/posts?limit=${limit}`, {
|
|
901
907
|
headers: { "x-api-key": apiKey },
|
|
@@ -914,11 +920,12 @@ async function getAuthorPosts(slug, limit = 20) {
|
|
|
914
920
|
}
|
|
915
921
|
}
|
|
916
922
|
async function getAllAuthorSlugs() {
|
|
917
|
-
const
|
|
918
|
-
if (!
|
|
923
|
+
const config = chunkQPIKPWAZ_js.resolveServerApiConfig();
|
|
924
|
+
if (!config) {
|
|
919
925
|
console.warn("[Blog] No API key configured");
|
|
920
926
|
return [];
|
|
921
927
|
}
|
|
928
|
+
const { apiUrl, apiKey } = config;
|
|
922
929
|
try {
|
|
923
930
|
const response = await fetch(`${apiUrl}/public/blog/authors`, {
|
|
924
931
|
headers: { "x-api-key": apiKey },
|
|
@@ -963,48 +970,11 @@ function generateAuthorPageMetadata(author, options = {}) {
|
|
|
963
970
|
}
|
|
964
971
|
};
|
|
965
972
|
}
|
|
966
|
-
function generateAuthorSchema(author, options = {}) {
|
|
967
|
-
const { siteUrl = "", siteName } = options;
|
|
968
|
-
const sameAs = [...author.same_as || []];
|
|
969
|
-
if (author.linkedin_url) sameAs.push(author.linkedin_url);
|
|
970
|
-
if (author.twitter_url) sameAs.push(author.twitter_url);
|
|
971
|
-
if (author.website_url) sameAs.push(author.website_url);
|
|
972
|
-
if (author.social_links?.twitter) sameAs.push(`https://twitter.com/${author.social_links.twitter}`);
|
|
973
|
-
if (author.social_links?.linkedin) sameAs.push(author.social_links.linkedin);
|
|
974
|
-
if (author.social_links?.github) sameAs.push(`https://github.com/${author.social_links.github}`);
|
|
975
|
-
const uniqueSameAs = [...new Set(sameAs.filter(Boolean))];
|
|
976
|
-
const schema = {
|
|
977
|
-
"@context": "https://schema.org",
|
|
978
|
-
"@type": "Person",
|
|
979
|
-
name: author.name,
|
|
980
|
-
url: author.author_page_url || `${siteUrl}/blog/author/${author.slug}`
|
|
981
|
-
};
|
|
982
|
-
if (author.title) schema.jobTitle = author.title;
|
|
983
|
-
if (author.company || siteName) {
|
|
984
|
-
schema.worksFor = {
|
|
985
|
-
"@type": "Organization",
|
|
986
|
-
name: author.company || siteName,
|
|
987
|
-
...siteUrl ? { url: siteUrl } : {}
|
|
988
|
-
};
|
|
989
|
-
}
|
|
990
|
-
if (author.bio || author.short_bio) schema.description = author.short_bio || author.bio;
|
|
991
|
-
if (author.avatar_url) schema.image = author.avatar_url;
|
|
992
|
-
if (uniqueSameAs.length > 0) schema.sameAs = uniqueSameAs;
|
|
993
|
-
if (author.knows_about && author.knows_about.length > 0) schema.knowsAbout = author.knows_about;
|
|
994
|
-
if (author.credentials && author.credentials.length > 0) {
|
|
995
|
-
schema.hasCredential = author.credentials.map((c) => ({
|
|
996
|
-
"@type": "EducationalOccupationalCredential",
|
|
997
|
-
credentialCategory: c
|
|
998
|
-
}));
|
|
999
|
-
}
|
|
1000
|
-
return schema;
|
|
1001
|
-
}
|
|
1002
973
|
|
|
1003
974
|
exports.SEO_LIMITS = SEO_LIMITS;
|
|
1004
975
|
exports.generateAllBlogSchemas = generateAllBlogSchemas;
|
|
1005
976
|
exports.generateAtomFeed = generateAtomFeed;
|
|
1006
977
|
exports.generateAuthorPageMetadata = generateAuthorPageMetadata;
|
|
1007
|
-
exports.generateAuthorSchema = generateAuthorSchema;
|
|
1008
978
|
exports.generateAuthorStaticParams = generateAuthorStaticParams;
|
|
1009
979
|
exports.generateBlogCategoryMetadata = generateBlogCategoryMetadata;
|
|
1010
980
|
exports.generateBlogIndexMetadata = generateBlogIndexMetadata;
|
|
@@ -1039,5 +1009,5 @@ exports.identifyTopicClusters = identifyTopicClusters;
|
|
|
1039
1009
|
exports.validateBlogPostSeo = validateBlogPostSeo;
|
|
1040
1010
|
exports.validateMetaDescription = validateMetaDescription;
|
|
1041
1011
|
exports.validateSeoTitle = validateSeoTitle;
|
|
1042
|
-
//# sourceMappingURL=chunk-
|
|
1043
|
-
//# sourceMappingURL=chunk-
|
|
1012
|
+
//# sourceMappingURL=chunk-XAWB2HFQ.js.map
|
|
1013
|
+
//# sourceMappingURL=chunk-XAWB2HFQ.js.map
|