@highjumpdigitalsoftware/blog-kit 0.6.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 (397) hide show
  1. package/INTEGRATION.md +76 -0
  2. package/LICENSE +74 -0
  3. package/README.md +102 -0
  4. package/astro/AdPreview.astro +64 -0
  5. package/astro/AdPreviewPair.astro +10 -0
  6. package/astro/AuditFindings.astro +29 -0
  7. package/astro/AuditScores.astro +60 -0
  8. package/astro/AuthorCard.astro +32 -0
  9. package/astro/BeforeAfter.astro +26 -0
  10. package/astro/BlogBehaviors.astro +15 -0
  11. package/astro/CTABanner.astro +28 -0
  12. package/astro/CalloutBox.astro +28 -0
  13. package/astro/CaseStudyHero.astro +45 -0
  14. package/astro/ChannelMixBars.astro +33 -0
  15. package/astro/Checklist.astro +24 -0
  16. package/astro/ChecklistItem.astro +15 -0
  17. package/astro/CodeSnippet.astro +20 -0
  18. package/astro/ComparisonTable.astro +103 -0
  19. package/astro/Definition.astro +30 -0
  20. package/astro/DeliveryComparison.astro +40 -0
  21. package/astro/FAQList.astro +43 -0
  22. package/astro/FurtherReading.astro +34 -0
  23. package/astro/ImageFeature.astro +22 -0
  24. package/astro/Infographic.astro +12 -0
  25. package/astro/KeyMetric.astro +40 -0
  26. package/astro/KeywordTable.astro +69 -0
  27. package/astro/List.astro +46 -0
  28. package/astro/MetricHighlight.astro +77 -0
  29. package/astro/NewsletterCTA.astro +40 -0
  30. package/astro/NumberedCard.astro +6 -0
  31. package/astro/ProConBlock.astro +38 -0
  32. package/astro/ProseList.astro +46 -0
  33. package/astro/QuoteBlock.astro +72 -0
  34. package/astro/RegionCallout.astro +24 -0
  35. package/astro/RelatedPosts.astro +47 -0
  36. package/astro/ResultsStrip.astro +59 -0
  37. package/astro/ScoreBar.astro +19 -0
  38. package/astro/SerpPreview.astro +35 -0
  39. package/astro/ServicePromoCard.astro +21 -0
  40. package/astro/StatCard.astro +48 -0
  41. package/astro/StepBlock.astro +5 -0
  42. package/astro/TableOfContents.astro +12 -0
  43. package/astro/TimelineBlock.astro +30 -0
  44. package/astro/TipBox.astro +14 -0
  45. package/astro/TrafficChart.astro +61 -0
  46. package/astro/VerdictCard.astro +48 -0
  47. package/astro/blogkit/Article.astro +63 -0
  48. package/astro/blogkit/BlogIndex.astro +144 -0
  49. package/core/behaviors/code.js +78 -0
  50. package/core/behaviors/comparison.js +52 -0
  51. package/core/behaviors/delivery-comparison.js +52 -0
  52. package/core/behaviors/faq.js +61 -0
  53. package/core/behaviors/index.d.ts +3 -0
  54. package/core/behaviors/index.js +35 -0
  55. package/core/behaviors/keyword-table.js +52 -0
  56. package/core/behaviors/toc.js +130 -0
  57. package/core/css/base.css +146 -0
  58. package/core/css/components.css +2632 -0
  59. package/core/css/index-listing.css +207 -0
  60. package/core/css/index.css +13 -0
  61. package/core/css/tokens.css +127 -0
  62. package/core/icons.ts +20 -0
  63. package/core/lib.ts +70 -0
  64. package/core/manifest/components.json +573 -0
  65. package/core/manifest/frontmatter.json +19 -0
  66. package/core/manifest/templates.json +77 -0
  67. package/dist/core/behaviors/code.js +78 -0
  68. package/dist/core/behaviors/comparison.js +52 -0
  69. package/dist/core/behaviors/delivery-comparison.js +52 -0
  70. package/dist/core/behaviors/faq.js +61 -0
  71. package/dist/core/behaviors/index.d.ts +3 -0
  72. package/dist/core/behaviors/index.js +35 -0
  73. package/dist/core/behaviors/keyword-table.js +52 -0
  74. package/dist/core/behaviors/toc.js +130 -0
  75. package/dist/core/css/base.css +146 -0
  76. package/dist/core/css/components.css +2632 -0
  77. package/dist/core/css/index-listing.css +207 -0
  78. package/dist/core/css/index.css +13 -0
  79. package/dist/core/css/tokens.css +127 -0
  80. package/dist/core/icons.d.ts +2 -0
  81. package/dist/core/icons.d.ts.map +1 -0
  82. package/dist/core/icons.js +20 -0
  83. package/dist/core/icons.js.map +1 -0
  84. package/dist/core/lib.d.ts +21 -0
  85. package/dist/core/lib.d.ts.map +1 -0
  86. package/dist/core/lib.js +57 -0
  87. package/dist/core/lib.js.map +1 -0
  88. package/dist/core/manifest/components.json +573 -0
  89. package/dist/core/manifest/frontmatter.json +19 -0
  90. package/dist/core/manifest/templates.json +77 -0
  91. package/dist/package/adapters/hjd-api.d.ts +14 -0
  92. package/dist/package/adapters/hjd-api.d.ts.map +1 -0
  93. package/dist/package/adapters/hjd-api.js +57 -0
  94. package/dist/package/adapters/hjd-api.js.map +1 -0
  95. package/dist/package/adapters/index.d.ts +13 -0
  96. package/dist/package/adapters/index.d.ts.map +1 -0
  97. package/dist/package/adapters/index.js +16 -0
  98. package/dist/package/adapters/index.js.map +1 -0
  99. package/dist/package/adapters/local.d.ts +13 -0
  100. package/dist/package/adapters/local.d.ts.map +1 -0
  101. package/dist/package/adapters/local.js +72 -0
  102. package/dist/package/adapters/local.js.map +1 -0
  103. package/dist/package/adapters/source.d.ts +39 -0
  104. package/dist/package/adapters/source.d.ts.map +1 -0
  105. package/dist/package/adapters/source.js +19 -0
  106. package/dist/package/adapters/source.js.map +1 -0
  107. package/dist/package/article.d.ts +17 -0
  108. package/dist/package/article.d.ts.map +1 -0
  109. package/dist/package/article.js +37 -0
  110. package/dist/package/article.js.map +1 -0
  111. package/dist/package/astro/data.d.ts +45 -0
  112. package/dist/package/astro/data.d.ts.map +1 -0
  113. package/dist/package/astro/data.js +81 -0
  114. package/dist/package/astro/data.js.map +1 -0
  115. package/dist/package/astro/freshness.d.ts +11 -0
  116. package/dist/package/astro/freshness.d.ts.map +1 -0
  117. package/dist/package/astro/freshness.js +48 -0
  118. package/dist/package/astro/freshness.js.map +1 -0
  119. package/dist/package/astro/index.d.ts +12 -0
  120. package/dist/package/astro/index.d.ts.map +1 -0
  121. package/dist/package/astro/index.js +31 -0
  122. package/dist/package/astro/index.js.map +1 -0
  123. package/dist/package/blog-index.d.ts +10 -0
  124. package/dist/package/blog-index.d.ts.map +1 -0
  125. package/dist/package/blog-index.js +27 -0
  126. package/dist/package/blog-index.js.map +1 -0
  127. package/dist/package/cli/exchange.d.ts +27 -0
  128. package/dist/package/cli/exchange.d.ts.map +1 -0
  129. package/dist/package/cli/exchange.js +94 -0
  130. package/dist/package/cli/exchange.js.map +1 -0
  131. package/dist/package/cli/index.d.ts +3 -0
  132. package/dist/package/cli/index.d.ts.map +1 -0
  133. package/dist/package/cli/index.js +301 -0
  134. package/dist/package/cli/index.js.map +1 -0
  135. package/dist/package/config/define.d.ts +13 -0
  136. package/dist/package/config/define.d.ts.map +1 -0
  137. package/dist/package/config/define.js +14 -0
  138. package/dist/package/config/define.js.map +1 -0
  139. package/dist/package/config/resolve.d.ts +11 -0
  140. package/dist/package/config/resolve.d.ts.map +1 -0
  141. package/dist/package/config/resolve.js +43 -0
  142. package/dist/package/config/resolve.js.map +1 -0
  143. package/dist/package/config/types.d.ts +74 -0
  144. package/dist/package/config/types.d.ts.map +1 -0
  145. package/dist/package/config/types.js +13 -0
  146. package/dist/package/config/types.js.map +1 -0
  147. package/dist/package/index-core.d.ts +28 -0
  148. package/dist/package/index-core.d.ts.map +1 -0
  149. package/dist/package/index-core.js +102 -0
  150. package/dist/package/index-core.js.map +1 -0
  151. package/dist/package/index.d.ts +13 -0
  152. package/dist/package/index.d.ts.map +1 -0
  153. package/dist/package/index.js +25 -0
  154. package/dist/package/index.js.map +1 -0
  155. package/dist/package/mdx/render-astro.d.ts +18 -0
  156. package/dist/package/mdx/render-astro.d.ts.map +1 -0
  157. package/dist/package/mdx/render-astro.js +75 -0
  158. package/dist/package/mdx/render-astro.js.map +1 -0
  159. package/dist/package/mdx/render.d.ts +13 -0
  160. package/dist/package/mdx/render.d.ts.map +1 -0
  161. package/dist/package/mdx/render.js +37 -0
  162. package/dist/package/mdx/render.js.map +1 -0
  163. package/dist/react/AdPreview.d.ts +26 -0
  164. package/dist/react/AdPreview.d.ts.map +1 -0
  165. package/dist/react/AdPreview.js +8 -0
  166. package/dist/react/AdPreview.js.map +1 -0
  167. package/dist/react/AdPreviewPair.d.ts +7 -0
  168. package/dist/react/AdPreviewPair.d.ts.map +1 -0
  169. package/dist/react/AdPreviewPair.js +5 -0
  170. package/dist/react/AdPreviewPair.js.map +1 -0
  171. package/dist/react/AuditFindings.d.ts +14 -0
  172. package/dist/react/AuditFindings.d.ts.map +1 -0
  173. package/dist/react/AuditFindings.js +5 -0
  174. package/dist/react/AuditFindings.js.map +1 -0
  175. package/dist/react/AuditScores.d.ts +12 -0
  176. package/dist/react/AuditScores.d.ts.map +1 -0
  177. package/dist/react/AuditScores.js +25 -0
  178. package/dist/react/AuditScores.js.map +1 -0
  179. package/dist/react/AuthorCard.d.ts +10 -0
  180. package/dist/react/AuthorCard.d.ts.map +1 -0
  181. package/dist/react/AuthorCard.js +6 -0
  182. package/dist/react/AuthorCard.js.map +1 -0
  183. package/dist/react/BeforeAfter.d.ts +12 -0
  184. package/dist/react/BeforeAfter.d.ts.map +1 -0
  185. package/dist/react/BeforeAfter.js +7 -0
  186. package/dist/react/BeforeAfter.js.map +1 -0
  187. package/dist/react/BlogBehaviors.d.ts +10 -0
  188. package/dist/react/BlogBehaviors.d.ts.map +1 -0
  189. package/dist/react/BlogBehaviors.js +20 -0
  190. package/dist/react/BlogBehaviors.js.map +1 -0
  191. package/dist/react/CTABanner.d.ts +8 -0
  192. package/dist/react/CTABanner.d.ts.map +1 -0
  193. package/dist/react/CTABanner.js +9 -0
  194. package/dist/react/CTABanner.js.map +1 -0
  195. package/dist/react/CalloutBox.d.ts +13 -0
  196. package/dist/react/CalloutBox.d.ts.map +1 -0
  197. package/dist/react/CalloutBox.js +9 -0
  198. package/dist/react/CalloutBox.js.map +1 -0
  199. package/dist/react/CaseStudyHero.d.ts +20 -0
  200. package/dist/react/CaseStudyHero.d.ts.map +1 -0
  201. package/dist/react/CaseStudyHero.js +7 -0
  202. package/dist/react/CaseStudyHero.js.map +1 -0
  203. package/dist/react/ChannelMixBars.d.ts +18 -0
  204. package/dist/react/ChannelMixBars.d.ts.map +1 -0
  205. package/dist/react/ChannelMixBars.js +6 -0
  206. package/dist/react/ChannelMixBars.js.map +1 -0
  207. package/dist/react/Checklist.d.ts +10 -0
  208. package/dist/react/Checklist.d.ts.map +1 -0
  209. package/dist/react/Checklist.js +7 -0
  210. package/dist/react/Checklist.js.map +1 -0
  211. package/dist/react/ChecklistItem.d.ts +7 -0
  212. package/dist/react/ChecklistItem.d.ts.map +1 -0
  213. package/dist/react/ChecklistItem.js +5 -0
  214. package/dist/react/ChecklistItem.js.map +1 -0
  215. package/dist/react/CodeSnippet.d.ts +17 -0
  216. package/dist/react/CodeSnippet.d.ts.map +1 -0
  217. package/dist/react/CodeSnippet.js +14 -0
  218. package/dist/react/CodeSnippet.js.map +1 -0
  219. package/dist/react/ComparisonTable.d.ts +22 -0
  220. package/dist/react/ComparisonTable.d.ts.map +1 -0
  221. package/dist/react/ComparisonTable.js +35 -0
  222. package/dist/react/ComparisonTable.js.map +1 -0
  223. package/dist/react/Definition.d.ts +9 -0
  224. package/dist/react/Definition.d.ts.map +1 -0
  225. package/dist/react/Definition.js +19 -0
  226. package/dist/react/Definition.js.map +1 -0
  227. package/dist/react/DeliveryComparison.d.ts +16 -0
  228. package/dist/react/DeliveryComparison.d.ts.map +1 -0
  229. package/dist/react/DeliveryComparison.js +7 -0
  230. package/dist/react/DeliveryComparison.js.map +1 -0
  231. package/dist/react/FAQList.d.ts +20 -0
  232. package/dist/react/FAQList.d.ts.map +1 -0
  233. package/dist/react/FAQList.js +19 -0
  234. package/dist/react/FAQList.js.map +1 -0
  235. package/dist/react/FurtherReading.d.ts +21 -0
  236. package/dist/react/FurtherReading.d.ts.map +1 -0
  237. package/dist/react/FurtherReading.js +13 -0
  238. package/dist/react/FurtherReading.js.map +1 -0
  239. package/dist/react/ImageFeature.d.ts +9 -0
  240. package/dist/react/ImageFeature.d.ts.map +1 -0
  241. package/dist/react/ImageFeature.js +6 -0
  242. package/dist/react/ImageFeature.js.map +1 -0
  243. package/dist/react/Infographic.d.ts +6 -0
  244. package/dist/react/Infographic.d.ts.map +1 -0
  245. package/dist/react/Infographic.js +7 -0
  246. package/dist/react/Infographic.js.map +1 -0
  247. package/dist/react/KeyMetric.d.ts +16 -0
  248. package/dist/react/KeyMetric.d.ts.map +1 -0
  249. package/dist/react/KeyMetric.js +15 -0
  250. package/dist/react/KeyMetric.js.map +1 -0
  251. package/dist/react/KeywordTable.d.ts +18 -0
  252. package/dist/react/KeywordTable.d.ts.map +1 -0
  253. package/dist/react/KeywordTable.js +23 -0
  254. package/dist/react/KeywordTable.js.map +1 -0
  255. package/dist/react/List.d.ts +11 -0
  256. package/dist/react/List.d.ts.map +1 -0
  257. package/dist/react/List.js +21 -0
  258. package/dist/react/List.js.map +1 -0
  259. package/dist/react/MetricHighlight.d.ts +15 -0
  260. package/dist/react/MetricHighlight.d.ts.map +1 -0
  261. package/dist/react/MetricHighlight.js +26 -0
  262. package/dist/react/MetricHighlight.js.map +1 -0
  263. package/dist/react/NewsletterCTA.d.ts +9 -0
  264. package/dist/react/NewsletterCTA.d.ts.map +1 -0
  265. package/dist/react/NewsletterCTA.js +5 -0
  266. package/dist/react/NewsletterCTA.js.map +1 -0
  267. package/dist/react/NumberedCard.d.ts +9 -0
  268. package/dist/react/NumberedCard.d.ts.map +1 -0
  269. package/dist/react/NumberedCard.js +7 -0
  270. package/dist/react/NumberedCard.js.map +1 -0
  271. package/dist/react/ProConBlock.d.ts +6 -0
  272. package/dist/react/ProConBlock.d.ts.map +1 -0
  273. package/dist/react/ProConBlock.js +7 -0
  274. package/dist/react/ProConBlock.js.map +1 -0
  275. package/dist/react/ProseList.d.ts +17 -0
  276. package/dist/react/ProseList.d.ts.map +1 -0
  277. package/dist/react/ProseList.js +26 -0
  278. package/dist/react/ProseList.js.map +1 -0
  279. package/dist/react/QuoteBlock.d.ts +17 -0
  280. package/dist/react/QuoteBlock.d.ts.map +1 -0
  281. package/dist/react/QuoteBlock.js +26 -0
  282. package/dist/react/QuoteBlock.js.map +1 -0
  283. package/dist/react/RegionCallout.d.ts +13 -0
  284. package/dist/react/RegionCallout.d.ts.map +1 -0
  285. package/dist/react/RegionCallout.js +5 -0
  286. package/dist/react/RegionCallout.js.map +1 -0
  287. package/dist/react/RelatedPosts.d.ts +20 -0
  288. package/dist/react/RelatedPosts.d.ts.map +1 -0
  289. package/dist/react/RelatedPosts.js +7 -0
  290. package/dist/react/RelatedPosts.js.map +1 -0
  291. package/dist/react/ResultsStrip.d.ts +18 -0
  292. package/dist/react/ResultsStrip.d.ts.map +1 -0
  293. package/dist/react/ResultsStrip.js +22 -0
  294. package/dist/react/ResultsStrip.js.map +1 -0
  295. package/dist/react/ScoreBar.d.ts +8 -0
  296. package/dist/react/ScoreBar.d.ts.map +1 -0
  297. package/dist/react/ScoreBar.js +6 -0
  298. package/dist/react/ScoreBar.js.map +1 -0
  299. package/dist/react/SerpPreview.d.ts +18 -0
  300. package/dist/react/SerpPreview.d.ts.map +1 -0
  301. package/dist/react/SerpPreview.js +13 -0
  302. package/dist/react/SerpPreview.js.map +1 -0
  303. package/dist/react/ServicePromoCard.d.ts +14 -0
  304. package/dist/react/ServicePromoCard.d.ts.map +1 -0
  305. package/dist/react/ServicePromoCard.js +12 -0
  306. package/dist/react/ServicePromoCard.js.map +1 -0
  307. package/dist/react/StatCard.d.ts +13 -0
  308. package/dist/react/StatCard.d.ts.map +1 -0
  309. package/dist/react/StatCard.js +20 -0
  310. package/dist/react/StatCard.js.map +1 -0
  311. package/dist/react/StepBlock.d.ts +8 -0
  312. package/dist/react/StepBlock.d.ts.map +1 -0
  313. package/dist/react/StepBlock.js +5 -0
  314. package/dist/react/StepBlock.js.map +1 -0
  315. package/dist/react/TableOfContents.d.ts +14 -0
  316. package/dist/react/TableOfContents.d.ts.map +1 -0
  317. package/dist/react/TableOfContents.js +12 -0
  318. package/dist/react/TableOfContents.js.map +1 -0
  319. package/dist/react/TimelineBlock.d.ts +14 -0
  320. package/dist/react/TimelineBlock.d.ts.map +1 -0
  321. package/dist/react/TimelineBlock.js +8 -0
  322. package/dist/react/TimelineBlock.js.map +1 -0
  323. package/dist/react/TipBox.d.ts +6 -0
  324. package/dist/react/TipBox.d.ts.map +1 -0
  325. package/dist/react/TipBox.js +5 -0
  326. package/dist/react/TipBox.js.map +1 -0
  327. package/dist/react/TrafficChart.d.ts +16 -0
  328. package/dist/react/TrafficChart.d.ts.map +1 -0
  329. package/dist/react/TrafficChart.js +14 -0
  330. package/dist/react/TrafficChart.js.map +1 -0
  331. package/dist/react/VerdictCard.d.ts +15 -0
  332. package/dist/react/VerdictCard.d.ts.map +1 -0
  333. package/dist/react/VerdictCard.js +5 -0
  334. package/dist/react/VerdictCard.js.map +1 -0
  335. package/dist/react/components-map.d.ts +133 -0
  336. package/dist/react/components-map.d.ts.map +1 -0
  337. package/dist/react/components-map.js +120 -0
  338. package/dist/react/components-map.js.map +1 -0
  339. package/dist/react/index.d.ts +5 -0
  340. package/dist/react/index.d.ts.map +1 -0
  341. package/dist/react/index.js +13 -0
  342. package/dist/react/index.js.map +1 -0
  343. package/package.json +116 -0
  344. package/react/AdPreview.tsx +94 -0
  345. package/react/AdPreviewPair.tsx +16 -0
  346. package/react/AuditFindings.tsx +43 -0
  347. package/react/AuditScores.tsx +73 -0
  348. package/react/AuthorCard.tsx +35 -0
  349. package/react/BeforeAfter.tsx +27 -0
  350. package/react/BlogBehaviors.tsx +21 -0
  351. package/react/CTABanner.tsx +32 -0
  352. package/react/CalloutBox.tsx +31 -0
  353. package/react/CaseStudyHero.tsx +71 -0
  354. package/react/ChannelMixBars.tsx +50 -0
  355. package/react/Checklist.tsx +31 -0
  356. package/react/ChecklistItem.tsx +19 -0
  357. package/react/CodeSnippet.tsx +36 -0
  358. package/react/ComparisonTable.tsx +114 -0
  359. package/react/Definition.tsx +36 -0
  360. package/react/DeliveryComparison.tsx +62 -0
  361. package/react/FAQList.tsx +61 -0
  362. package/react/FurtherReading.tsx +46 -0
  363. package/react/ImageFeature.tsx +26 -0
  364. package/react/Infographic.tsx +18 -0
  365. package/react/KeyMetric.tsx +61 -0
  366. package/react/KeywordTable.tsx +92 -0
  367. package/react/List.tsx +58 -0
  368. package/react/MetricHighlight.tsx +86 -0
  369. package/react/NewsletterCTA.tsx +48 -0
  370. package/react/NumberedCard.tsx +7 -0
  371. package/react/ProConBlock.tsx +42 -0
  372. package/react/ProseList.tsx +72 -0
  373. package/react/QuoteBlock.tsx +89 -0
  374. package/react/RegionCallout.tsx +38 -0
  375. package/react/RelatedPosts.tsx +58 -0
  376. package/react/ResultsStrip.tsx +77 -0
  377. package/react/ScoreBar.tsx +27 -0
  378. package/react/SerpPreview.tsx +59 -0
  379. package/react/ServicePromoCard.tsx +43 -0
  380. package/react/StatCard.tsx +62 -0
  381. package/react/StepBlock.tsx +5 -0
  382. package/react/TableOfContents.tsx +27 -0
  383. package/react/TimelineBlock.tsx +35 -0
  384. package/react/TipBox.tsx +16 -0
  385. package/react/TrafficChart.tsx +79 -0
  386. package/react/VerdictCard.tsx +60 -0
  387. package/react/components-map.ts +122 -0
  388. package/react/index.ts +13 -0
  389. package/templates/blogkit/app/api/blogkit/revalidate/route.ts.tmpl +32 -0
  390. package/templates/blogkit/app/blog/[slug]/page.tsx.tmpl +41 -0
  391. package/templates/blogkit/app/blog/page.tsx.tmpl +18 -0
  392. package/templates/blogkit/blogkit.config.ts.tmpl +23 -0
  393. package/templates/blogkit-astro/BLOGKIT_ASTRO_SETUP.md.tmpl +49 -0
  394. package/templates/blogkit-astro/src/blogkit.config.ts.tmpl +29 -0
  395. package/templates/blogkit-astro/src/pages/api/blogkit/revalidate.ts.tmpl +46 -0
  396. package/templates/blogkit-astro/src/pages/blog/[slug].astro.tmpl +39 -0
  397. package/templates/blogkit-astro/src/pages/blog/index.astro.tmpl +29 -0
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function RelatedPosts({ posts, heading = "Keep reading", hrefBase = "/blog/" }) {
3
+ if (!posts || posts.length === 0)
4
+ return null;
5
+ return (_jsxs("div", { className: "bk-related", children: [_jsx("p", { className: "bk-related__eyebrow", children: heading }), _jsx("div", { className: "bk-related__grid", children: posts.map((post, i) => (_jsxs("a", { className: "bk-related__card", href: `${hrefBase}${post.slug}`, children: [_jsx("div", { className: `bk-related__thumb${post.featuredImage ? "" : ` bk-related__thumb--g${(i % 3) + 1}`}`, "aria-hidden": post.featuredImage ? undefined : true, children: post.featuredImage && (_jsx("img", { className: "bk-related__img", src: post.featuredImage, alt: post.featuredImageAlt || "", loading: "lazy", decoding: "async" })) }), _jsxs("div", { className: "bk-related__body", children: [post.category && _jsx("span", { className: "bk-related__cat", children: post.category }), _jsx("h5", { className: "bk-related__title", children: post.title }), post.excerpt && _jsx("p", { className: "bk-related__excerpt", children: post.excerpt })] })] }, post.slug))) })] }));
6
+ }
7
+ //# sourceMappingURL=RelatedPosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelatedPosts.js","sourceRoot":"","sources":["../../react/RelatedPosts.tsx"],"names":[],"mappings":";AAyBA,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE,QAAQ,GAAG,QAAQ,EAAqB;IACtG,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,CACL,eAAK,SAAS,EAAC,YAAY,aACzB,YAAG,SAAS,EAAC,qBAAqB,YAAE,OAAO,GAAK,EAChD,cAAK,SAAS,EAAC,kBAAkB,YAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,aAAmB,SAAS,EAAC,kBAAkB,EAAC,IAAI,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,aAC7E,cACE,SAAS,EAAE,oBAAoB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,iBACnF,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,YAEjD,IAAI,CAAC,aAAa,IAAI,CACrB,cACE,SAAS,EAAC,iBAAiB,EAC3B,GAAG,EAAE,IAAI,CAAC,aAAa,EACvB,GAAG,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAChC,OAAO,EAAC,MAAM,EACd,QAAQ,EAAC,OAAO,GAChB,CACH,GACG,EACN,eAAK,SAAS,EAAC,kBAAkB,aAC9B,IAAI,CAAC,QAAQ,IAAI,eAAM,SAAS,EAAC,iBAAiB,YAAE,IAAI,CAAC,QAAQ,GAAQ,EAC1E,aAAI,SAAS,EAAC,mBAAmB,YAAE,IAAI,CAAC,KAAK,GAAM,EAClD,IAAI,CAAC,OAAO,IAAI,YAAG,SAAS,EAAC,qBAAqB,YAAE,IAAI,CAAC,OAAO,GAAK,IAClE,KAnBA,IAAI,CAAC,IAAI,CAoBb,CACL,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ interface Kpi {
2
+ label: string;
3
+ num: string;
4
+ /** Optional change indicator, e.g. "+182%". Rendered in mono. */
5
+ delta?: string;
6
+ /** "up" (green, default) or "down" (red). */
7
+ deltaDirection?: "up" | "down";
8
+ /** Optional source attribution, shown below in a dashed-divider row. */
9
+ source?: string;
10
+ /** Optional URL — when set alongside `source`, the row becomes a link. */
11
+ sourceUrl?: string;
12
+ }
13
+ export interface ResultsStripProps {
14
+ kpis?: Kpi[];
15
+ }
16
+ export declare function ResultsStrip({ kpis }: ResultsStripProps): import("react").JSX.Element | null;
17
+ export {};
18
+ //# sourceMappingURL=ResultsStrip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultsStrip.d.ts","sourceRoot":"","sources":["../../react/ResultsStrip.tsx"],"names":[],"mappings":"AAQA,UAAU,GAAG;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,cAAc,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/B,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;CACd;AA8BD,wBAAgB,YAAY,CAAC,EAAE,IAAS,EAAE,EAAE,iBAAiB,sCAuB5D"}
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* blog-kit React adapter — ResultsStrip
3
+ Thin wrapper: all styling lives in core/css/components.css (.bk-results-strip).
4
+ A horizontal strip of bordered KPI cells — each an uppercase label, a big
5
+ brand-coloured number, an optional mono delta (green up / red down), and an
6
+ optional dashed-divider "SOURCE" attribution row (links out when sourceUrl
7
+ is set). Collapses to a 2-up grid on narrow screens. */
8
+ import { ICONS } from "../core/icons.js";
9
+ function SourceRow({ source, sourceUrl }) {
10
+ if (!source)
11
+ return null;
12
+ if (sourceUrl) {
13
+ return (_jsxs("a", { className: "bk-results-strip__source bk-results-strip__source--link", href: sourceUrl, target: "_blank", rel: "nofollow noopener noreferrer", children: [_jsx("span", { className: "bk-results-strip__source-kicker", children: "Source" }), source, _jsx("span", { className: "bk-results-strip__source-icon", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: ICONS["external"] } })] }));
14
+ }
15
+ return (_jsxs("div", { className: "bk-results-strip__source", children: [_jsx("span", { className: "bk-results-strip__source-kicker", children: "Source" }), source] }));
16
+ }
17
+ export function ResultsStrip({ kpis = [] }) {
18
+ if (!kpis || kpis.length === 0)
19
+ return null;
20
+ return (_jsx("div", { className: "bk-results-strip", children: kpis.map((k, i) => (_jsxs("div", { className: "bk-results-strip__cell", children: [_jsx("div", { className: "bk-results-strip__label", children: k.label }), _jsx("div", { className: "bk-results-strip__num", children: k.num }), k.delta && (_jsx("div", { className: `bk-results-strip__delta${k.deltaDirection === "down" ? " bk-results-strip__delta--down" : ""}`, children: k.delta })), _jsx(SourceRow, { source: k.source, sourceUrl: k.sourceUrl })] }, i))) }));
21
+ }
22
+ //# sourceMappingURL=ResultsStrip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultsStrip.js","sourceRoot":"","sources":["../../react/ResultsStrip.tsx"],"names":[],"mappings":";AAAA;;;;;0DAK0D;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAmBtC,SAAS,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAA2C;IAC/E,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,aACE,SAAS,EAAC,yDAAyD,EACnE,IAAI,EAAE,SAAS,EACf,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,8BAA8B,aAElC,eAAM,SAAS,EAAC,iCAAiC,uBAAc,EAC9D,MAAM,EACP,eACE,SAAS,EAAC,+BAA+B,iBAC7B,MAAM,EAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,GACtD,IACA,CACL,CAAC;IACJ,CAAC;IACD,OAAO,CACL,eAAK,SAAS,EAAC,0BAA0B,aACvC,eAAM,SAAS,EAAC,iCAAiC,uBAAc,EAC9D,MAAM,IACH,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,GAAG,EAAE,EAAqB;IAC3D,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,OAAO,CACL,cAAK,SAAS,EAAC,kBAAkB,YAC9B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAClB,eAAK,SAAS,EAAC,wBAAwB,aACrC,cAAK,SAAS,EAAC,yBAAyB,YAAE,CAAC,CAAC,KAAK,GAAO,EACxD,cAAK,SAAS,EAAC,uBAAuB,YAAE,CAAC,CAAC,GAAG,GAAO,EACnD,CAAC,CAAC,KAAK,IAAI,CACV,cACE,SAAS,EAAE,0BACT,CAAC,CAAC,cAAc,KAAK,MAAM,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,EACnE,EAAE,YAED,CAAC,CAAC,KAAK,GACJ,CACP,EACD,KAAC,SAAS,IAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAI,KAZZ,CAAC,CAaxC,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ScoreBarProps {
2
+ label: string;
3
+ score: number;
4
+ /** Denominator the score is out of (default 10). */
5
+ maxScore?: number;
6
+ }
7
+ export declare function ScoreBar({ label, score, maxScore }: ScoreBarProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=ScoreBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScoreBar.d.ts","sourceRoot":"","sources":["../../react/ScoreBar.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAa,EAAE,EAAE,aAAa,+BActE"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function ScoreBar({ label, score, maxScore = 10 }) {
3
+ const percentage = Math.max(0, Math.min(100, (score / maxScore) * 100));
4
+ return (_jsxs("div", { className: "bk-score-bar", children: [_jsxs("div", { className: "bk-score-bar__head", children: [_jsx("span", { className: "bk-score-bar__label", children: label }), _jsx("span", { className: "bk-score-bar__score", children: score })] }), _jsx("div", { className: "bk-score-bar__track", children: _jsx("div", { className: "bk-score-bar__fill", style: { width: `${percentage}%` } }) })] }));
5
+ }
6
+ //# sourceMappingURL=ScoreBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScoreBar.js","sourceRoot":"","sources":["../../react/ScoreBar.tsx"],"names":[],"mappings":";AAYA,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,GAAG,EAAE,EAAiB;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;IAExE,OAAO,CACL,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,oBAAoB,aACjC,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,EACpD,eAAM,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAQ,IAChD,EACN,cAAK,SAAS,EAAC,qBAAqB,YAClC,cAAK,SAAS,EAAC,oBAAoB,EAAC,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,UAAU,GAAG,EAAE,GAAI,GACtE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface SerpResult {
2
+ /** Result title (the blue clickable heading). Plain text. */
3
+ title: string;
4
+ /** URL breadcrumb line. HTML allowed — wrap the domain in <strong>. */
5
+ url: string;
6
+ /** Snippet/description. HTML allowed — <em> bolds the matched terms. */
7
+ description: string;
8
+ /** When true, the row is flagged with a "Sponsored" tag. */
9
+ ad?: boolean;
10
+ }
11
+ export interface SerpPreviewProps {
12
+ /** The text shown in the search bar. */
13
+ query: string;
14
+ /** The list of result rows. */
15
+ results?: SerpResult[];
16
+ }
17
+ export declare function SerpPreview({ query, results }: SerpPreviewProps): import("react").JSX.Element;
18
+ //# sourceMappingURL=SerpPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerpPreview.d.ts","sourceRoot":"","sources":["../../react/SerpPreview.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,UAAU;IACzB,6DAA6D;IAC7D,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,OAAY,EAAE,EAAE,gBAAgB,+BA+BpE"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* blog-kit React adapter — SerpPreview
3
+ Thin wrapper: all styling lives in core/css/components.css (.bk-serp-preview).
4
+ A mock search-engine results page: a rounded search bar showing the query,
5
+ followed by a stack of result rows (URL breadcrumb, blue heading, snippet),
6
+ with an optional "Sponsored" tag for ad results. Ported from hjd's b-serp
7
+ (cyan/dark mapped to neutral --blog-* tokens; the Google-blue link colour
8
+ maps to --blog-info). */
9
+ import { ICONS } from "../core/icons.js";
10
+ export function SerpPreview({ query, results = [] }) {
11
+ return (_jsxs("div", { className: "bk-serp-preview", children: [_jsxs("div", { className: "bk-serp-preview__bar", children: [_jsx("span", { className: "bk-serp-preview__bar-icon", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: ICONS["search"] } }), _jsx("input", { className: "bk-serp-preview__input", defaultValue: query, readOnly: true })] }), _jsx("div", { className: "bk-serp-preview__results", children: results.map((r, i) => (_jsxs("div", { className: "bk-serp-preview__result", children: [r.ad && (_jsx("span", { className: "bk-serp-preview__tag bk-serp-preview__tag--ad", children: "Sponsored" })), _jsx("span", { className: "bk-serp-preview__url", dangerouslySetInnerHTML: { __html: r.url } }), _jsx("h4", { className: "bk-serp-preview__heading", children: r.title }), _jsx("p", { className: "bk-serp-preview__desc", dangerouslySetInnerHTML: { __html: r.description } })] }, i))) })] }));
12
+ }
13
+ //# sourceMappingURL=SerpPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SerpPreview.js","sourceRoot":"","sources":["../../react/SerpPreview.tsx"],"names":[],"mappings":";AAAA;;;;;;2BAM2B;AAC3B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAoBtC,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAE,OAAO,GAAG,EAAE,EAAoB;IACnE,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,aAC9B,eAAK,SAAS,EAAC,sBAAsB,aACnC,eACE,SAAS,EAAC,2BAA2B,iBACzB,MAAM,EAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,GACpD,EACF,gBAAO,SAAS,EAAC,wBAAwB,EAAC,YAAY,EAAE,KAAK,EAAE,QAAQ,SAAG,IACtE,EACN,cAAK,SAAS,EAAC,0BAA0B,YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,eAAa,SAAS,EAAC,yBAAyB,aAC7C,CAAC,CAAC,EAAE,IAAI,CACP,eAAM,SAAS,EAAC,+CAA+C,0BAAiB,CACjF,EACD,eACE,SAAS,EAAC,sBAAsB,EAChC,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,EAAE,GAC1C,EACF,aAAI,SAAS,EAAC,0BAA0B,YAAE,CAAC,CAAC,KAAK,GAAM,EACvD,YACE,SAAS,EAAC,uBAAuB,EACjC,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,WAAW,EAAE,GAClD,KAZM,CAAC,CAaL,CACP,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface ServicePromoCardProps {
2
+ /** Title line, rendered bold uppercase. */
3
+ title: string;
4
+ /** Optional sub-line below the title. */
5
+ sub?: string;
6
+ /** Link target for the whole card. */
7
+ href?: string;
8
+ /** Optional raw SVG string for the icon tile; defaults to a search glyph. */
9
+ icon?: string;
10
+ /** Brand-coloured arrow label on the right. */
11
+ arrowLabel?: string;
12
+ }
13
+ export declare function ServicePromoCard({ title, sub, href, icon, arrowLabel, }: ServicePromoCardProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=ServicePromoCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServicePromoCard.d.ts","sourceRoot":"","sources":["../../react/ServicePromoCard.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,GAAG,EACH,IAAU,EACV,IAAI,EACJ,UAA2B,GAC5B,EAAE,qBAAqB,+BAevB"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* blog-kit React adapter — ServicePromoCard
3
+ Thin wrapper: all styling lives in core/css/components.css (.bk-service-promo-card).
4
+ A linked promo row: an icon tile, a title + optional sub-line, and a
5
+ brand-coloured uppercase arrow label. The whole card is a single link.
6
+ Ported from hjd ServicePromoCard (.b-svc). Cyan accents → --blog-brand
7
+ and the brand tint/soft tokens; greys → ink/mute tokens. */
8
+ import { ICONS } from "../core/icons.js";
9
+ export function ServicePromoCard({ title, sub, href = "#", icon, arrowLabel = "Learn more →", }) {
10
+ return (_jsxs("a", { className: "bk-service-promo-card", href: href, children: [_jsx("span", { className: "bk-service-promo-card__icon", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: icon || ICONS["search"] } }), _jsxs("span", { className: "bk-service-promo-card__body", children: [_jsx("span", { className: "bk-service-promo-card__title", children: title }), sub && _jsx("span", { className: "bk-service-promo-card__sub", children: sub })] }), _jsx("span", { className: "bk-service-promo-card__arrow", children: arrowLabel })] }));
11
+ }
12
+ //# sourceMappingURL=ServicePromoCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ServicePromoCard.js","sourceRoot":"","sources":["../../react/ServicePromoCard.tsx"],"names":[],"mappings":";AAAA;;;;;8DAK8D;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAetC,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,GAAG,EACH,IAAI,GAAG,GAAG,EACV,IAAI,EACJ,UAAU,GAAG,cAAc,GACL;IACtB,OAAO,CACL,aAAG,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAE,IAAI,aAC7C,eACE,SAAS,EAAC,6BAA6B,iBAC3B,MAAM,EAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,GAC5D,EACF,gBAAM,SAAS,EAAC,6BAA6B,aAC3C,eAAM,SAAS,EAAC,8BAA8B,YAAE,KAAK,GAAQ,EAC5D,GAAG,IAAI,eAAM,SAAS,EAAC,4BAA4B,YAAE,GAAG,GAAQ,IAC5D,EACP,eAAM,SAAS,EAAC,8BAA8B,YAAE,UAAU,GAAQ,IAChE,CACL,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface StatCardProps {
2
+ value: string;
3
+ label: string;
4
+ description?: string;
5
+ /** Optional unit rendered slightly smaller after the value, e.g. "×" or "s". */
6
+ unit?: string;
7
+ /** Optional source attribution, shown below in a dashed-divider row. */
8
+ source?: string;
9
+ /** Optional URL — when set alongside `source`, the row becomes a link. */
10
+ sourceUrl?: string;
11
+ }
12
+ export declare function StatCard({ value, label, description, unit, source, sourceUrl }: StatCardProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=StatCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatCard.d.ts","sourceRoot":"","sources":["../../react/StatCard.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AASD,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,aAAa,+BAmC7F"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* blog-kit React adapter — StatCard
3
+ Thin wrapper: all styling lives in core/css/components.css (.bk-stat-card).
4
+ A single highlighted metric — big brand-coloured number (+ optional unit),
5
+ an uppercase label, optional description, and an optional dashed-divider
6
+ "SOURCE" attribution row (links out when sourceUrl is set). */
7
+ import { ICONS } from "../core/icons.js";
8
+ /** Split a raw value like "3.2×" into its numeric head and trailing unit. */
9
+ function splitValue(raw) {
10
+ const m = raw.match(/^([\d.,\-+]+)(.*)$/);
11
+ if (!m)
12
+ return { num: raw, unit: "" };
13
+ return { num: m[1], unit: m[2].trim() };
14
+ }
15
+ export function StatCard({ value, label, description, unit, source, sourceUrl }) {
16
+ const parts = unit !== undefined ? { num: value, unit } : splitValue(value);
17
+ return (_jsxs("div", { className: "bk-stat-card", children: [_jsxs("div", { className: "bk-stat-card__value", children: [_jsx("span", { className: "bk-stat-card__num", children: parts.num }), parts.unit && _jsx("span", { className: "bk-stat-card__unit", children: parts.unit })] }), _jsx("div", { className: "bk-stat-card__label", children: label }), description && _jsx("div", { className: "bk-stat-card__desc", children: description }), source &&
18
+ (sourceUrl ? (_jsxs("a", { className: "bk-stat-card__source bk-stat-card__source--link", href: sourceUrl, target: "_blank", rel: "nofollow noopener noreferrer", children: [_jsx("span", { className: "bk-stat-card__source-kicker", children: "Source" }), source, _jsx("span", { className: "bk-stat-card__source-icon", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: ICONS["external"] } })] })) : (_jsxs("div", { className: "bk-stat-card__source", children: [_jsx("span", { className: "bk-stat-card__source-kicker", children: "Source" }), source] })))] }));
19
+ }
20
+ //# sourceMappingURL=StatCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatCard.js","sourceRoot":"","sources":["../../react/StatCard.tsx"],"names":[],"mappings":";AAAA;;;;iEAIiE;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AActC,6EAA6E;AAC7E,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC1C,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IACtC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAiB;IAC5F,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAE5E,OAAO,CACL,eAAK,SAAS,EAAC,cAAc,aAC3B,eAAK,SAAS,EAAC,qBAAqB,aAClC,eAAM,SAAS,EAAC,mBAAmB,YAAE,KAAK,CAAC,GAAG,GAAQ,EACrD,KAAK,CAAC,IAAI,IAAI,eAAM,SAAS,EAAC,oBAAoB,YAAE,KAAK,CAAC,IAAI,GAAQ,IACnE,EACN,cAAK,SAAS,EAAC,qBAAqB,YAAE,KAAK,GAAO,EACjD,WAAW,IAAI,cAAK,SAAS,EAAC,oBAAoB,YAAE,WAAW,GAAO,EACtE,MAAM;gBACL,CAAC,SAAS,CAAC,CAAC,CAAC,CACX,aACE,SAAS,EAAC,iDAAiD,EAC3D,IAAI,EAAE,SAAS,EACf,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,8BAA8B,aAElC,eAAM,SAAS,EAAC,6BAA6B,uBAAc,EAC1D,MAAM,EACP,eACE,SAAS,EAAC,2BAA2B,iBACzB,MAAM,EAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,GACtD,IACA,CACL,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,sBAAsB,aACnC,eAAM,SAAS,EAAC,6BAA6B,uBAAc,EAC1D,MAAM,IACH,CACP,CAAC,IACA,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ReactNode } from "react";
2
+ export interface StepBlockProps {
3
+ stepNumber?: number | string;
4
+ title?: string;
5
+ children?: ReactNode;
6
+ }
7
+ export declare function StepBlock({ stepNumber, title, children }: StepBlockProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=StepBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepBlock.d.ts","sourceRoot":"","sources":["../../react/StepBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,MAAM,WAAW,cAAc;IAAG,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAAE;AACvG,wBAAgB,SAAS,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,+BAExE"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function StepBlock({ stepNumber, title, children }) {
3
+ return (_jsxs("div", { className: "bk-step", children: [_jsx("div", { className: "bk-step__num", children: stepNumber }), _jsxs("div", { className: "bk-step__main", children: [title ? _jsx("h3", { className: "bk-step__title", children: title }) : null, _jsx("div", { className: "bk-step__body", children: children })] })] }));
4
+ }
5
+ //# sourceMappingURL=StepBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StepBlock.js","sourceRoot":"","sources":["../../react/StepBlock.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,SAAS,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAkB;IACvE,OAAO,CAAC,eAAK,SAAS,EAAC,SAAS,aAAC,cAAK,SAAS,EAAC,cAAc,YAAE,UAAU,GAAO,EAAA,eAAK,SAAS,EAAC,eAAe,aAAE,KAAK,CAAC,CAAC,CAAC,aAAI,SAAS,EAAC,gBAAgB,YAAE,KAAK,GAAM,CAAC,CAAC,CAAC,IAAI,EAAC,cAAK,SAAS,EAAC,eAAe,YAAE,QAAQ,GAAO,IAAM,IAAM,CAAC,CAAC;AAC3O,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface TableOfContentsProps {
2
+ /** Heading rendered above the list. Defaults to "In this article". */
3
+ heading?: string;
4
+ /** CSS selector for the element whose <h2>s become entries. Defaults to "article". */
5
+ scope?: string;
6
+ }
7
+ /**
8
+ * Sticky-friendly "in this article" navigation. The list is built at runtime
9
+ * by the toc behaviour, which scans the article for <h2> headings, numbers
10
+ * them, smooth-scrolls on click, and runs a scrollspy that flags the heading
11
+ * in view. The container hides itself when the article has no <h2>s.
12
+ */
13
+ export declare function TableOfContents({ heading, scope }: TableOfContentsProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=TableOfContents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.d.ts","sourceRoot":"","sources":["../../react/TableOfContents.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,oBAAoB,+BAavE"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Sticky-friendly "in this article" navigation. The list is built at runtime
4
+ * by the toc behaviour, which scans the article for <h2> headings, numbers
5
+ * them, smooth-scrolls on click, and runs a scrollspy that flags the heading
6
+ * in view. The container hides itself when the article has no <h2>s.
7
+ */
8
+ export function TableOfContents({ heading, scope }) {
9
+ const label = heading ?? "In this article";
10
+ return (_jsxs("nav", { className: "bk-toc", "data-bk-toc": true, "data-bk-toc-scope": scope ?? "article", "aria-label": label, children: [_jsx("p", { className: "bk-toc__heading", children: label }), _jsx("ul", { className: "bk-toc__list" })] }));
11
+ }
12
+ //# sourceMappingURL=TableOfContents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableOfContents.js","sourceRoot":"","sources":["../../react/TableOfContents.tsx"],"names":[],"mappings":";AAOA;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAwB;IACtE,MAAM,KAAK,GAAG,OAAO,IAAI,iBAAiB,CAAC;IAC3C,OAAO,CACL,eACE,SAAS,EAAC,QAAQ,4CAEC,KAAK,IAAI,SAAS,gBACzB,KAAK,aAEjB,YAAG,SAAS,EAAC,iBAAiB,YAAE,KAAK,GAAK,EAC1C,aAAI,SAAS,EAAC,cAAc,GAAG,IAC3B,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ReactNode } from "react";
2
+ export interface TimelineEvent {
3
+ date: string;
4
+ title: string;
5
+ description: string;
6
+ }
7
+ export interface TimelineBlockProps {
8
+ /** Chronological events, oldest → newest. */
9
+ events?: TimelineEvent[];
10
+ children?: ReactNode;
11
+ }
12
+ /** Vertical timeline / recap — dated milestones connected by a rail. */
13
+ export declare function TimelineBlock({ events, children }: TimelineBlockProps): import("react").JSX.Element | null;
14
+ //# sourceMappingURL=TimelineBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineBlock.d.ts","sourceRoot":"","sources":["../../react/TimelineBlock.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,6CAA6C;IAC7C,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,EAAE,MAAW,EAAE,QAAQ,EAAE,EAAE,kBAAkB,sCAgB1E"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Vertical timeline / recap — dated milestones connected by a rail. */
3
+ export function TimelineBlock({ events = [], children }) {
4
+ if (!events.length)
5
+ return children ? _jsx("div", { className: "bk-timeline", children: children }) : null;
6
+ return (_jsxs("div", { className: "bk-timeline", children: [_jsx("span", { className: "bk-timeline__rail", "aria-hidden": "true" }), events.map((event, i) => (_jsxs("div", { className: "bk-timeline__item", children: [_jsx("span", { className: "bk-timeline__dot", "aria-hidden": "true" }), _jsx("div", { className: "bk-timeline__date", children: event.date }), _jsx("h4", { className: "bk-timeline__title", children: event.title }), _jsx("p", { className: "bk-timeline__desc", children: event.description })] }, i)))] }));
7
+ }
8
+ //# sourceMappingURL=TimelineBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimelineBlock.js","sourceRoot":"","sources":["../../react/TimelineBlock.tsx"],"names":[],"mappings":";AAiBA,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,GAAG,EAAE,EAAE,QAAQ,EAAsB;IACzE,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,cAAK,SAAS,EAAC,aAAa,YAAE,QAAQ,GAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3F,OAAO,CACL,eAAK,SAAS,EAAC,aAAa,aAC1B,eAAM,SAAS,EAAC,mBAAmB,iBAAa,MAAM,GAAG,EACxD,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CACxB,eAAK,SAAS,EAAC,mBAAmB,aAChC,eAAM,SAAS,EAAC,kBAAkB,iBAAa,MAAM,GAAG,EACxD,cAAK,SAAS,EAAC,mBAAmB,YAAE,KAAK,CAAC,IAAI,GAAO,EACrD,aAAI,SAAS,EAAC,oBAAoB,YAAE,KAAK,CAAC,KAAK,GAAM,EACrD,YAAG,SAAS,EAAC,mBAAmB,YAAE,KAAK,CAAC,WAAW,GAAK,KAJlB,CAAC,CAKnC,CACP,CAAC,IACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface TipBoxProps {
2
+ tip: string;
3
+ context?: string;
4
+ }
5
+ export declare function TipBox({ tip, context }: TipBoxProps): import("react").JSX.Element;
6
+ //# sourceMappingURL=TipBox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TipBox.d.ts","sourceRoot":"","sources":["../../react/TipBox.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,WAAW,+BAUnD"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function TipBox({ tip, context }) {
3
+ return (_jsxs("div", { className: "bk-tip", children: [_jsx("span", { className: "bk-tip__badge", children: "Pro tip" }), _jsxs("p", { className: "bk-tip__body", children: [_jsx("strong", { className: "bk-tip__lead", children: tip }), context ? _jsxs("span", { className: "bk-tip__context", children: [" ", context] }) : null] })] }));
4
+ }
5
+ //# sourceMappingURL=TipBox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TipBox.js","sourceRoot":"","sources":["../../react/TipBox.tsx"],"names":[],"mappings":";AAKA,MAAM,UAAU,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAe;IAClD,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,aACrB,eAAM,SAAS,EAAC,eAAe,wBAAe,EAC9C,aAAG,SAAS,EAAC,cAAc,aACzB,iBAAQ,SAAS,EAAC,cAAc,YAAE,GAAG,GAAU,EAC9C,OAAO,CAAC,CAAC,CAAC,gBAAM,SAAS,EAAC,iBAAiB,kBAAG,OAAO,IAAQ,CAAC,CAAC,CAAC,IAAI,IACnE,IACA,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface TrafficChartSeries {
2
+ /** Current-period values; rendered as the solid brand line + markers. */
3
+ current?: number[];
4
+ /** Previous-period values; rendered as the dashed neutral line. */
5
+ previous?: number[];
6
+ }
7
+ export interface TrafficChartProps {
8
+ /** Uppercase heading (defaults to "Organic sessions · 6 months"). */
9
+ title?: string;
10
+ /** The two comparable series. */
11
+ series?: TrafficChartSeries;
12
+ /** X-axis tick labels, one per data point. */
13
+ labels?: string[];
14
+ }
15
+ export declare function TrafficChart({ title, series, labels, }: TrafficChartProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=TrafficChart.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrafficChart.d.ts","sourceRoot":"","sources":["../../react/TrafficChart.tsx"],"names":[],"mappings":"AAWA,MAAM,WAAW,kBAAkB;IACjC,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,qEAAqE;IACrE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD,wBAAgB,YAAY,CAAC,EAC3B,KAAqC,EACrC,MAAW,EACX,MAAW,GACZ,EAAE,iBAAiB,+BA2CnB"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const W = 600;
3
+ const H = 220;
4
+ const PAD = 40;
5
+ export function TrafficChart({ title = "Organic sessions · 6 months", series = {}, labels = [], }) {
6
+ const current = series.current || [];
7
+ const previous = series.previous || [];
8
+ const max = Math.max(...current, ...previous, 1);
9
+ const xs = (i, len) => PAD + 20 + ((W - PAD - 30) * i) / Math.max(len - 1, 1);
10
+ const ys = (v) => H - 30 - ((H - 50) * v) / max;
11
+ const points = (arr) => arr.map((v, i) => `${xs(i, arr.length)},${ys(v)}`).join(" ");
12
+ return (_jsxs("div", { className: "bk-traffic-chart", children: [_jsxs("div", { className: "bk-traffic-chart__head", children: [_jsx("div", { className: "bk-traffic-chart__title", children: title }), _jsxs("div", { className: "bk-traffic-chart__legend", children: [_jsxs("span", { className: "bk-traffic-chart__item", children: [_jsx("span", { className: "bk-traffic-chart__dot" }), "This period"] }), _jsxs("span", { className: "bk-traffic-chart__item", children: [_jsx("span", { className: "bk-traffic-chart__dot bk-traffic-chart__dot--prev" }), "Previous period"] })] })] }), _jsxs("svg", { className: "bk-traffic-chart__svg", viewBox: `0 0 ${W} ${H}`, role: "img", children: [_jsx("line", { className: "bk-traffic-chart__axis", x1: PAD, y1: 20, x2: PAD, y2: H - 30 }), _jsx("line", { className: "bk-traffic-chart__axis", x1: PAD, y1: H - 30, x2: W - 10, y2: H - 30 }), previous.length > 0 && (_jsx("polyline", { className: "bk-traffic-chart__line bk-traffic-chart__line--prev", points: points(previous) })), current.length > 0 && (_jsx("polyline", { className: "bk-traffic-chart__line", points: points(current) })), current.map((v, i) => (_jsx("circle", { className: "bk-traffic-chart__pt", cx: xs(i, current.length), cy: ys(v), r: 4 }, i))), _jsx("g", { className: "bk-traffic-chart__labels", children: labels.map((l, i) => (_jsx("text", { x: xs(i, labels.length) - 10, y: H - 10, children: l }, i))) })] })] }));
13
+ }
14
+ //# sourceMappingURL=TrafficChart.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrafficChart.js","sourceRoot":"","sources":["../../react/TrafficChart.tsx"],"names":[],"mappings":";AA2BA,MAAM,CAAC,GAAG,GAAG,CAAC;AACd,MAAM,CAAC,GAAG,GAAG,CAAC;AACd,MAAM,GAAG,GAAG,EAAE,CAAC;AAEf,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,GAAG,6BAA6B,EACrC,MAAM,GAAG,EAAE,EACX,MAAM,GAAG,EAAE,GACO;IAClB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,EAAE,CACpC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;IACxD,MAAM,MAAM,GAAG,CAAC,GAAa,EAAE,EAAE,CAC/B,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE/D,OAAO,CACL,eAAK,SAAS,EAAC,kBAAkB,aAC/B,eAAK,SAAS,EAAC,wBAAwB,aACrC,cAAK,SAAS,EAAC,yBAAyB,YAAE,KAAK,GAAO,EACtD,eAAK,SAAS,EAAC,0BAA0B,aACvC,gBAAM,SAAS,EAAC,wBAAwB,aACtC,eAAM,SAAS,EAAC,uBAAuB,GAAG,mBACrC,EACP,gBAAM,SAAS,EAAC,wBAAwB,aACtC,eAAM,SAAS,EAAC,mDAAmD,GAAG,uBACjE,IACH,IACF,EACN,eAAK,SAAS,EAAC,uBAAuB,EAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAC,KAAK,aACzE,eAAM,SAAS,EAAC,wBAAwB,EAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAI,EACjF,eAAM,SAAS,EAAC,wBAAwB,EAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,GAAI,EACvF,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,mBAAU,SAAS,EAAC,qDAAqD,EAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAI,CACvG,EACA,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CACrB,mBAAU,SAAS,EAAC,wBAAwB,EAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAI,CACzE,EACA,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,iBAAgB,SAAS,EAAC,sBAAsB,EAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAA9E,CAAC,CAAiF,CAChG,CAAC,EACF,YAAG,SAAS,EAAC,0BAA0B,YACpC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,eAAc,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,YAAG,CAAC,IAA9C,CAAC,CAAqD,CAClE,CAAC,GACA,IACA,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ReactNode } from "react";
2
+ export interface VerdictCardProps {
3
+ verdict: string;
4
+ score?: number;
5
+ summary: string;
6
+ /** Short uppercase kicker above the verdict. Defaults to "The verdict". */
7
+ kicker?: string;
8
+ /** Optional bullet chips shown under the summary. */
9
+ bullets?: string[];
10
+ /** Legacy — renders as a leading pill if supplied. */
11
+ winner?: string;
12
+ children?: ReactNode;
13
+ }
14
+ export declare function VerdictCard({ verdict, score, summary, kicker, bullets, winner, }: VerdictCardProps): import("react").JSX.Element;
15
+ //# sourceMappingURL=VerdictCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerdictCard.d.ts","sourceRoot":"","sources":["../../react/VerdictCard.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,OAAO,EACP,MAAsB,EACtB,OAAO,EACP,MAAM,GACP,EAAE,gBAAgB,+BAgClB"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function VerdictCard({ verdict, score, summary, kicker = "The verdict", bullets, winner, }) {
3
+ return (_jsxs("div", { className: "bk-verdict-card", children: [_jsxs("div", { className: "bk-verdict-card__header", children: [_jsx("span", { className: "bk-verdict-card__kicker", children: kicker }), score !== undefined && (_jsxs("span", { className: "bk-verdict-card__score", children: [score, _jsx("span", { className: "bk-verdict-card__score-max", children: "/10" })] }))] }), _jsxs("div", { className: "bk-verdict-card__body", children: [winner && (_jsxs("div", { className: "bk-verdict-card__winner", children: ["Winner: ", _jsx("span", { className: "bk-verdict-card__winner-name", children: winner })] })), _jsx("h3", { className: "bk-verdict-card__verdict", children: verdict }), _jsx("p", { className: "bk-verdict-card__summary", children: summary }), bullets && bullets.length > 0 && (_jsx("div", { className: "bk-verdict-card__bullets", children: bullets.map((b, i) => (_jsx("span", { className: "bk-verdict-card__chip", children: b }, i))) }))] })] }));
4
+ }
5
+ //# sourceMappingURL=VerdictCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VerdictCard.js","sourceRoot":"","sources":["../../react/VerdictCard.tsx"],"names":[],"mappings":";AAoBA,MAAM,UAAU,WAAW,CAAC,EAC1B,OAAO,EACP,KAAK,EACL,OAAO,EACP,MAAM,GAAG,aAAa,EACtB,OAAO,EACP,MAAM,GACW;IACjB,OAAO,CACL,eAAK,SAAS,EAAC,iBAAiB,aAC9B,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,yBAAyB,YAAE,MAAM,GAAQ,EACxD,KAAK,KAAK,SAAS,IAAI,CACtB,gBAAM,SAAS,EAAC,wBAAwB,aACrC,KAAK,EACN,eAAM,SAAS,EAAC,4BAA4B,oBAAW,IAClD,CACR,IACG,EACN,eAAK,SAAS,EAAC,uBAAuB,aACnC,MAAM,IAAI,CACT,eAAK,SAAS,EAAC,yBAAyB,yBAC9B,eAAM,SAAS,EAAC,8BAA8B,YAAE,MAAM,GAAQ,IAClE,CACP,EACD,aAAI,SAAS,EAAC,0BAA0B,YAAE,OAAO,GAAM,EACvD,YAAG,SAAS,EAAC,0BAA0B,YAAE,OAAO,GAAK,EACpD,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAChC,cAAK,SAAS,EAAC,0BAA0B,YACtC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,eAAc,SAAS,EAAC,uBAAuB,YAC5C,CAAC,IADO,CAAC,CAEL,CACR,CAAC,GACE,CACP,IACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,133 @@
1
+ import { AdPreview } from "./AdPreview";
2
+ import { AdPreviewPair } from "./AdPreviewPair";
3
+ import { AuditFindings } from "./AuditFindings";
4
+ import { AuditScores } from "./AuditScores";
5
+ import { AuthorCard } from "./AuthorCard";
6
+ import { BeforeAfter } from "./BeforeAfter";
7
+ import { CTABanner } from "./CTABanner";
8
+ import { CalloutBox } from "./CalloutBox";
9
+ import { CaseStudyHero } from "./CaseStudyHero";
10
+ import { ChannelMixBars } from "./ChannelMixBars";
11
+ import { Checklist } from "./Checklist";
12
+ import { ChecklistItem } from "./ChecklistItem";
13
+ import { CodeSnippet } from "./CodeSnippet";
14
+ import { ComparisonTable } from "./ComparisonTable";
15
+ import { Definition } from "./Definition";
16
+ import { DeliveryComparison } from "./DeliveryComparison";
17
+ import { FAQList } from "./FAQList";
18
+ import { FurtherReading } from "./FurtherReading";
19
+ import { ImageFeature } from "./ImageFeature";
20
+ import { Infographic } from "./Infographic";
21
+ import { KeyMetric } from "./KeyMetric";
22
+ import { KeywordTable } from "./KeywordTable";
23
+ import { List } from "./List";
24
+ import { MetricHighlight } from "./MetricHighlight";
25
+ import { NewsletterCTA } from "./NewsletterCTA";
26
+ import { NumberedCard } from "./NumberedCard";
27
+ import { ProConBlock } from "./ProConBlock";
28
+ import { ProseList } from "./ProseList";
29
+ import { QuoteBlock } from "./QuoteBlock";
30
+ import { RegionCallout } from "./RegionCallout";
31
+ import { RelatedPosts } from "./RelatedPosts";
32
+ import { ResultsStrip } from "./ResultsStrip";
33
+ import { ScoreBar } from "./ScoreBar";
34
+ import { SerpPreview } from "./SerpPreview";
35
+ import { ServicePromoCard } from "./ServicePromoCard";
36
+ import { StatCard } from "./StatCard";
37
+ import { StepBlock } from "./StepBlock";
38
+ import { TableOfContents } from "./TableOfContents";
39
+ import { TimelineBlock } from "./TimelineBlock";
40
+ import { TipBox } from "./TipBox";
41
+ import { TrafficChart } from "./TrafficChart";
42
+ import { VerdictCard } from "./VerdictCard";
43
+ export declare const kitComponents: {
44
+ AdPreview: typeof AdPreview;
45
+ AdPreviewPair: typeof AdPreviewPair;
46
+ AuditFindings: typeof AuditFindings;
47
+ AuditScores: typeof AuditScores;
48
+ AuthorCard: typeof AuthorCard;
49
+ BeforeAfter: typeof BeforeAfter;
50
+ CTABanner: typeof CTABanner;
51
+ CalloutBox: typeof CalloutBox;
52
+ CaseStudyHero: typeof CaseStudyHero;
53
+ ChannelMixBars: typeof ChannelMixBars;
54
+ Checklist: typeof Checklist;
55
+ ChecklistItem: typeof ChecklistItem;
56
+ CodeSnippet: typeof CodeSnippet;
57
+ ComparisonTable: typeof ComparisonTable;
58
+ Definition: typeof Definition;
59
+ DeliveryComparison: typeof DeliveryComparison;
60
+ FAQList: typeof FAQList;
61
+ FurtherReading: typeof FurtherReading;
62
+ ImageFeature: typeof ImageFeature;
63
+ Infographic: typeof Infographic;
64
+ KeyMetric: typeof KeyMetric;
65
+ KeywordTable: typeof KeywordTable;
66
+ List: typeof List;
67
+ MetricHighlight: typeof MetricHighlight;
68
+ NewsletterCTA: typeof NewsletterCTA;
69
+ NumberedCard: typeof NumberedCard;
70
+ ProConBlock: typeof ProConBlock;
71
+ ProseList: typeof ProseList;
72
+ QuoteBlock: typeof QuoteBlock;
73
+ RegionCallout: typeof RegionCallout;
74
+ RelatedPosts: typeof RelatedPosts;
75
+ ResultsStrip: typeof ResultsStrip;
76
+ ScoreBar: typeof ScoreBar;
77
+ SerpPreview: typeof SerpPreview;
78
+ ServicePromoCard: typeof ServicePromoCard;
79
+ StatCard: typeof StatCard;
80
+ StepBlock: typeof StepBlock;
81
+ TableOfContents: typeof TableOfContents;
82
+ TimelineBlock: typeof TimelineBlock;
83
+ TipBox: typeof TipBox;
84
+ TrafficChart: typeof TrafficChart;
85
+ VerdictCard: typeof VerdictCard;
86
+ };
87
+ /** Old MDX names kept renderable during migration → canonical component. */
88
+ export declare const aliasComponents: Record<string, unknown>;
89
+ export declare const blogComponents: {
90
+ AdPreview: typeof AdPreview;
91
+ AdPreviewPair: typeof AdPreviewPair;
92
+ AuditFindings: typeof AuditFindings;
93
+ AuditScores: typeof AuditScores;
94
+ AuthorCard: typeof AuthorCard;
95
+ BeforeAfter: typeof BeforeAfter;
96
+ CTABanner: typeof CTABanner;
97
+ CalloutBox: typeof CalloutBox;
98
+ CaseStudyHero: typeof CaseStudyHero;
99
+ ChannelMixBars: typeof ChannelMixBars;
100
+ Checklist: typeof Checklist;
101
+ ChecklistItem: typeof ChecklistItem;
102
+ CodeSnippet: typeof CodeSnippet;
103
+ ComparisonTable: typeof ComparisonTable;
104
+ Definition: typeof Definition;
105
+ DeliveryComparison: typeof DeliveryComparison;
106
+ FAQList: typeof FAQList;
107
+ FurtherReading: typeof FurtherReading;
108
+ ImageFeature: typeof ImageFeature;
109
+ Infographic: typeof Infographic;
110
+ KeyMetric: typeof KeyMetric;
111
+ KeywordTable: typeof KeywordTable;
112
+ List: typeof List;
113
+ MetricHighlight: typeof MetricHighlight;
114
+ NewsletterCTA: typeof NewsletterCTA;
115
+ NumberedCard: typeof NumberedCard;
116
+ ProConBlock: typeof ProConBlock;
117
+ ProseList: typeof ProseList;
118
+ QuoteBlock: typeof QuoteBlock;
119
+ RegionCallout: typeof RegionCallout;
120
+ RelatedPosts: typeof RelatedPosts;
121
+ ResultsStrip: typeof ResultsStrip;
122
+ ScoreBar: typeof ScoreBar;
123
+ SerpPreview: typeof SerpPreview;
124
+ ServicePromoCard: typeof ServicePromoCard;
125
+ StatCard: typeof StatCard;
126
+ StepBlock: typeof StepBlock;
127
+ TableOfContents: typeof TableOfContents;
128
+ TimelineBlock: typeof TimelineBlock;
129
+ TipBox: typeof TipBox;
130
+ TrafficChart: typeof TrafficChart;
131
+ VerdictCard: typeof VerdictCard;
132
+ };
133
+ //# sourceMappingURL=components-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components-map.d.ts","sourceRoot":"","sources":["../../react/components-map.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CzB,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAenD,CAAC;AAEF,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAA2C,CAAC"}