@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,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Split an answer body into paragraphs on blank lines. */
3
+ function toParagraphs(a) {
4
+ return String(a ?? "")
5
+ .split(/\n{2,}/)
6
+ .filter(Boolean);
7
+ }
8
+ /**
9
+ * Expandable Q&A list built on native <details> for accessibility and SEO.
10
+ * The first item is open by default to signal interaction. The behaviour
11
+ * script lifts every rendered Q&A pair into FAQPage JSON-LD on load.
12
+ */
13
+ export function FAQList({ items, heading, children }) {
14
+ const list = items ?? [];
15
+ return (_jsxs("div", { className: "bk-faq", "data-bk-faq": true, children: [heading && _jsx("p", { className: "bk-faq__heading", children: heading }), _jsx("div", { className: "bk-faq__list", children: list.length > 0
16
+ ? list.map((it, i) => (_jsxs("details", { className: "bk-faq__item", open: i === 0, children: [_jsxs("summary", { className: "bk-faq__summary", children: [_jsx("span", { className: "bk-faq__question", children: it.q }), _jsxs("span", { className: "bk-faq__toggle", "aria-hidden": "true", children: [_jsx("span", { className: "bk-faq__bar bk-faq__bar--h" }), _jsx("span", { className: "bk-faq__bar bk-faq__bar--v" })] })] }), _jsx("div", { className: "bk-faq__answer", children: toParagraphs(it.a).map((p, j) => (_jsx("p", { className: "bk-faq__para", dangerouslySetInnerHTML: { __html: p } }, j))) })] }, i)))
17
+ : children })] }));
18
+ }
19
+ //# sourceMappingURL=FAQList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FAQList.js","sourceRoot":"","sources":["../../react/FAQList.tsx"],"names":[],"mappings":";AAgBA,2DAA2D;AAC3D,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;SACnB,KAAK,CAAC,QAAQ,CAAC;SACf,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAgB;IAChE,MAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IAEzB,OAAO,CACL,eAAK,SAAS,EAAC,QAAQ,kCACpB,OAAO,IAAI,YAAG,SAAS,EAAC,iBAAiB,YAAE,OAAO,GAAK,EACxD,cAAK,SAAS,EAAC,cAAc,YAC1B,IAAI,CAAC,MAAM,GAAG,CAAC;oBACd,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAClB,mBAAS,SAAS,EAAC,cAAc,EAAS,IAAI,EAAE,CAAC,KAAK,CAAC,aACrD,mBAAS,SAAS,EAAC,iBAAiB,aAClC,eAAM,SAAS,EAAC,kBAAkB,YAAE,EAAE,CAAC,CAAC,GAAQ,EAChD,gBAAM,SAAS,EAAC,gBAAgB,iBAAa,MAAM,aACjD,eAAM,SAAS,EAAC,4BAA4B,GAAG,EAC/C,eAAM,SAAS,EAAC,4BAA4B,GAAG,IAC1C,IACC,EACV,cAAK,SAAS,EAAC,gBAAgB,YAC5B,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAChC,YACE,SAAS,EAAC,cAAc,EAExB,uBAAuB,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,IADjC,CAAC,CAEN,CACH,CAAC,GACE,KAhB+B,CAAC,CAiB9B,CACX,CAAC;oBACJ,CAAC,CAAC,QAAQ,GACR,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface FurtherReadingSource {
2
+ /** Display title of the linked resource. */
3
+ title: string;
4
+ /** Short source/publisher label shown on the right. */
5
+ source: string;
6
+ /** Destination URL (opens in a new tab, rel=nofollow). */
7
+ url: string;
8
+ }
9
+ export interface FurtherReadingProps {
10
+ /** List of external resources. Renders nothing when empty. */
11
+ sources?: FurtherReadingSource[];
12
+ /** Optional heading override (default "Further reading"). */
13
+ heading?: string;
14
+ }
15
+ /**
16
+ * Card listing external resources for further reading. Each row is a
17
+ * title linking out (new tab, nofollow) with a source label on the right.
18
+ * Rows are dashed-separated; the last row has no separator.
19
+ */
20
+ export declare function FurtherReading({ sources, heading }: FurtherReadingProps): import("react").JSX.Element | null;
21
+ //# sourceMappingURL=FurtherReading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FurtherReading.d.ts","sourceRoot":"","sources":["../../react/FurtherReading.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,mBAAmB;IAClC,8DAA8D;IAC9D,OAAO,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACjC,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,mBAAmB,sCAwBvE"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Card listing external resources for further reading. Each row is a
4
+ * title linking out (new tab, nofollow) with a source label on the right.
5
+ * Rows are dashed-separated; the last row has no separator.
6
+ */
7
+ export function FurtherReading({ sources, heading }) {
8
+ const list = sources ?? [];
9
+ if (list.length === 0)
10
+ return null;
11
+ return (_jsxs("div", { className: "bk-further-reading", children: [_jsx("p", { className: "bk-further-reading__title", children: heading ?? "Further reading" }), _jsx("ul", { className: "bk-further-reading__list", children: list.map((s, i) => (_jsxs("li", { className: "bk-further-reading__item", children: [_jsx("a", { className: "bk-further-reading__link", href: s.url, target: "_blank", rel: "nofollow noopener noreferrer", children: s.title }), _jsx("span", { className: "bk-further-reading__source", children: s.source })] }, i))) })] }));
12
+ }
13
+ //# sourceMappingURL=FurtherReading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FurtherReading.js","sourceRoot":"","sources":["../../react/FurtherReading.tsx"],"names":[],"mappings":";AAgBA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAE,OAAO,EAAE,OAAO,EAAuB;IACtE,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEnC,OAAO,CACL,eAAK,SAAS,EAAC,oBAAoB,aACjC,YAAG,SAAS,EAAC,2BAA2B,YAAE,OAAO,IAAI,iBAAiB,GAAK,EAC3E,aAAI,SAAS,EAAC,0BAA0B,YACrC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAClB,cAAI,SAAS,EAAC,0BAA0B,aACtC,YACE,SAAS,EAAC,0BAA0B,EACpC,IAAI,EAAE,CAAC,CAAC,GAAG,EACX,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,8BAA8B,YAEjC,CAAC,CAAC,KAAK,GACN,EACJ,eAAM,SAAS,EAAC,4BAA4B,YAAE,CAAC,CAAC,MAAM,GAAQ,KATlB,CAAC,CAU1C,CACN,CAAC,GACC,IACD,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface ImageFeatureProps {
2
+ src: string;
3
+ alt: string;
4
+ caption?: string;
5
+ credit?: string;
6
+ position?: "left" | "right" | "full";
7
+ }
8
+ export declare function ImageFeature({ src, alt, caption, credit, position }: ImageFeatureProps): import("react").JSX.Element;
9
+ //# sourceMappingURL=ImageFeature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageFeature.d.ts","sourceRoot":"","sources":["../../react/ImageFeature.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;CACtC;AACD,wBAAgB,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAiB,EAAE,EAAE,iBAAiB,+BAe/F"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function ImageFeature({ src, alt, caption, credit, position = "full" }) {
3
+ const pos = position === "left" || position === "right" ? position : "full";
4
+ return (_jsxs("figure", { className: `bk-image-feature bk-image-feature--${pos}`, children: [_jsx("div", { className: "bk-image-feature__frame", children: _jsx("img", { className: "bk-image-feature__img", src: src, alt: alt, loading: "lazy", decoding: "async" }) }), (caption || credit) && (_jsxs("figcaption", { className: "bk-image-feature__caption", children: [caption && _jsx("span", { className: "bk-image-feature__text", children: caption }), credit && _jsx("span", { className: "bk-image-feature__credit", children: credit })] }))] }));
5
+ }
6
+ //# sourceMappingURL=ImageFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageFeature.js","sourceRoot":"","sources":["../../react/ImageFeature.tsx"],"names":[],"mappings":";AAUA,MAAM,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAG,MAAM,EAAqB;IAC9F,MAAM,GAAG,GAAG,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5E,OAAO,CACL,kBAAQ,SAAS,EAAE,sCAAsC,GAAG,EAAE,aAC5D,cAAK,SAAS,EAAC,yBAAyB,YACtC,cAAK,SAAS,EAAC,uBAAuB,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,GAAG,GACzF,EACL,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CACtB,sBAAY,SAAS,EAAC,2BAA2B,aAC9C,OAAO,IAAI,eAAM,SAAS,EAAC,wBAAwB,YAAE,OAAO,GAAQ,EACpE,MAAM,IAAI,eAAM,SAAS,EAAC,0BAA0B,YAAE,MAAM,GAAQ,IAC1D,CACd,IACM,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface InfographicProps {
2
+ src: string;
3
+ alt: string;
4
+ }
5
+ export declare function Infographic({ src, alt }: InfographicProps): import("react").JSX.Element | null;
6
+ //# sourceMappingURL=Infographic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Infographic.d.ts","sourceRoot":"","sources":["../../react/Infographic.tsx"],"names":[],"mappings":"AAMA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACb;AACD,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,gBAAgB,sCAOzD"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export function Infographic({ src, alt }) {
3
+ if (!src)
4
+ return null;
5
+ return (_jsx("figure", { className: "bk-infographic", children: _jsx("img", { className: "bk-infographic__img", src: src, alt: alt, loading: "lazy", decoding: "async" }) }));
6
+ }
7
+ //# sourceMappingURL=Infographic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Infographic.js","sourceRoot":"","sources":["../../react/Infographic.tsx"],"names":[],"mappings":";AAUA,MAAM,UAAU,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,EAAoB;IACxD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,CACL,iBAAQ,SAAS,EAAC,gBAAgB,YAChC,cAAK,SAAS,EAAC,qBAAqB,EAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAC,MAAM,EAAC,QAAQ,EAAC,OAAO,GAAG,GACpF,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface KeyMetricProps {
2
+ /** The oversized headline figure, e.g. "3.2×" or "87%". */
3
+ number: string;
4
+ /** Short uppercase caption above the title. */
5
+ label?: string;
6
+ /** Rich-text headline; accepts inline HTML (rendered as markup). */
7
+ title?: string;
8
+ /** Supporting line under the title. */
9
+ sub?: string;
10
+ /** Optional source attribution, shown below in a dashed-divider row. */
11
+ source?: string;
12
+ /** Optional URL — when set alongside `source`, the row becomes a link. */
13
+ sourceUrl?: string;
14
+ }
15
+ export declare function KeyMetric({ number, label, title, sub, source, sourceUrl }: KeyMetricProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=KeyMetric.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyMetric.d.ts","sourceRoot":"","sources":["../../react/KeyMetric.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wEAAwE;IACxE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,cAAc,+BAmCzF"}
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* blog-kit React adapter — KeyMetric
3
+ Thin wrapper: all styling lives in core/css/components.css (.bk-key-metric).
4
+ A dark, full-width hero metric panel: one oversized brand-coloured number on
5
+ the left, and a copy column on the right (optional uppercase label, an
6
+ optional rich-text title that accepts inline HTML, an optional sub-line, and
7
+ an optional dashed-divider "SOURCE" attribution row that links out when a URL
8
+ is given). Ported from hjd's blog KeyMetric (+ inlined _StatSourceRow);
9
+ cyan/dark mapped to neutral tokens. */
10
+ import { ICONS } from "../core/icons.js";
11
+ export function KeyMetric({ number, label, title, sub, source, sourceUrl }) {
12
+ return (_jsxs("div", { className: "bk-key-metric", children: [_jsx("div", { className: "bk-key-metric__num", children: number }), _jsxs("div", { className: "bk-key-metric__copy", children: [label && _jsx("div", { className: "bk-key-metric__label", children: label }), title && (_jsx("p", { className: "bk-key-metric__title", dangerouslySetInnerHTML: { __html: title } })), sub && _jsx("p", { className: "bk-key-metric__sub", children: sub }), source &&
13
+ (sourceUrl ? (_jsxs("a", { className: "bk-key-metric__source bk-key-metric__source--link", href: sourceUrl, target: "_blank", rel: "nofollow noopener noreferrer", children: [_jsx("span", { className: "bk-key-metric__source-kicker", children: "Source" }), source, _jsx("span", { className: "bk-key-metric__source-icon", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: ICONS["external"] } })] })) : (_jsxs("div", { className: "bk-key-metric__source", children: [_jsx("span", { className: "bk-key-metric__source-kicker", children: "Source" }), source] })))] })] }));
14
+ }
15
+ //# sourceMappingURL=KeyMetric.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeyMetric.js","sourceRoot":"","sources":["../../react/KeyMetric.tsx"],"names":[],"mappings":";AAAA;;;;;;;yCAOyC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAiBtC,MAAM,UAAU,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAkB;IACxF,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC5B,cAAK,SAAS,EAAC,oBAAoB,YAAE,MAAM,GAAO,EAClD,eAAK,SAAS,EAAC,qBAAqB,aACjC,KAAK,IAAI,cAAK,SAAS,EAAC,sBAAsB,YAAE,KAAK,GAAO,EAC5D,KAAK,IAAI,CACR,YAAG,SAAS,EAAC,sBAAsB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAI,CACnF,EACA,GAAG,IAAI,YAAG,SAAS,EAAC,oBAAoB,YAAE,GAAG,GAAK,EAClD,MAAM;wBACL,CAAC,SAAS,CAAC,CAAC,CAAC,CACX,aACE,SAAS,EAAC,mDAAmD,EAC7D,IAAI,EAAE,SAAS,EACf,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,8BAA8B,aAElC,eAAM,SAAS,EAAC,8BAA8B,uBAAc,EAC3D,MAAM,EACP,eACE,SAAS,EAAC,4BAA4B,iBAC1B,MAAM,EAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,GACtD,IACA,CACL,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAM,SAAS,EAAC,8BAA8B,uBAAc,EAC3D,MAAM,IACH,CACP,CAAC,IACA,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface KeywordRow {
2
+ keyword: string;
3
+ /** Monthly search volume, pre-formatted (e.g. "1.2k"). */
4
+ volume: string;
5
+ /** Keyword difficulty 0–100; bucketed low (<40) / med (<60) / high. */
6
+ difficulty: number;
7
+ /** Previous rank position; falls back to an em dash when absent. */
8
+ was?: number | string;
9
+ /** Current rank position. */
10
+ now: number | string;
11
+ /** Signed rank change; negative renders as a red down-arrow. */
12
+ delta: number | string;
13
+ }
14
+ export interface KeywordTableProps {
15
+ rows?: KeywordRow[];
16
+ }
17
+ export declare function KeywordTable({ rows }: KeywordTableProps): import("react").JSX.Element | null;
18
+ //# sourceMappingURL=KeywordTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeywordTable.d.ts","sourceRoot":"","sources":["../../react/KeywordTable.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC;IACnB,oEAAoE;IACpE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,6BAA6B;IAC7B,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,gEAAgE;IAChE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,UAAU,EAAE,CAAC;CACrB;AAiBD,wBAAgB,YAAY,CAAC,EAAE,IAAS,EAAE,EAAE,iBAAiB,sCAmD5D"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** Bucket a 0–100 difficulty score into low / med / high. */
3
+ function difficultyBucket(difficulty) {
4
+ return difficulty < 40 ? "low" : difficulty < 60 ? "med" : "high";
5
+ }
6
+ /** A negative delta means the rank dropped (down); anything else is up. */
7
+ function deltaDirection(delta) {
8
+ return delta && String(delta).startsWith("-") ? "down" : "up";
9
+ }
10
+ /** Show the magnitude when numeric, else the raw value. */
11
+ function deltaDisplay(delta) {
12
+ return Math.abs(Number(delta)) || delta;
13
+ }
14
+ export function KeywordTable({ rows = [] }) {
15
+ if (!rows || rows.length === 0)
16
+ return null;
17
+ return (_jsx("div", { className: "bk-keyword-table", "data-bk-keyword-table": true, children: _jsx("div", { className: "bk-keyword-table__scroll", children: _jsxs("table", { className: "bk-keyword-table__table", children: [_jsx("thead", { children: _jsxs("tr", { children: [_jsx("th", { className: "bk-keyword-table__th", children: "Keyword" }), _jsx("th", { className: "bk-keyword-table__th bk-keyword-table__th--r", children: "Volume" }), _jsx("th", { className: "bk-keyword-table__th", children: "Difficulty" }), _jsx("th", { className: "bk-keyword-table__th bk-keyword-table__th--r", children: "Was" }), _jsx("th", { className: "bk-keyword-table__th bk-keyword-table__th--r", children: "Now" }), _jsx("th", { className: "bk-keyword-table__th bk-keyword-table__th--r", children: "\u0394" })] }) }), _jsx("tbody", { children: rows.map((r, i) => {
18
+ const diff = difficultyBucket(r.difficulty);
19
+ const direction = deltaDirection(r.delta);
20
+ return (_jsxs("tr", { className: "bk-keyword-table__tr", children: [_jsx("td", { className: "bk-keyword-table__td bk-keyword-table__td--kw", children: r.keyword }), _jsx("td", { className: "bk-keyword-table__td bk-keyword-table__td--r", children: r.volume }), _jsx("td", { className: "bk-keyword-table__td", children: _jsx("span", { className: `bk-keyword-table__diff bk-keyword-table__diff--${diff}`, children: r.difficulty }) }), _jsx("td", { className: "bk-keyword-table__td bk-keyword-table__td--r bk-keyword-table__rank", children: r.was ?? "—" }), _jsx("td", { className: "bk-keyword-table__td bk-keyword-table__td--r bk-keyword-table__rank", children: r.now }), _jsx("td", { className: "bk-keyword-table__td bk-keyword-table__td--r", children: _jsx("span", { className: `bk-keyword-table__delta bk-keyword-table__delta--${direction}`, children: deltaDisplay(r.delta) }) })] }, i));
21
+ }) })] }) }) }));
22
+ }
23
+ //# sourceMappingURL=KeywordTable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeywordTable.js","sourceRoot":"","sources":["../../react/KeywordTable.tsx"],"names":[],"mappings":";AAyBA,6DAA6D;AAC7D,SAAS,gBAAgB,CAAC,UAAkB;IAC1C,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AACpE,CAAC;AAED,2EAA2E;AAC3E,SAAS,cAAc,CAAC,KAAsB;IAC5C,OAAO,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAChE,CAAC;AAED,2DAA2D;AAC3D,SAAS,YAAY,CAAC,KAAsB;IAC1C,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC;AAC1C,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,2CAC/B,cAAK,SAAS,EAAC,0BAA0B,YACvC,iBAAO,SAAS,EAAC,yBAAyB,aACxC,0BACE,yBACE,aAAI,SAAS,EAAC,sBAAsB,wBAAa,EACjD,aAAI,SAAS,EAAC,8CAA8C,uBAAY,EACxE,aAAI,SAAS,EAAC,sBAAsB,2BAAgB,EACpD,aAAI,SAAS,EAAC,8CAA8C,oBAAS,EACrE,aAAI,SAAS,EAAC,8CAA8C,oBAAS,EACrE,aAAI,SAAS,EAAC,8CAA8C,uBAAO,IAChE,GACC,EACR,0BACG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;4BACjB,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;4BAC5C,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;4BAC1C,OAAO,CACL,cAAI,SAAS,EAAC,sBAAsB,aAClC,aAAI,SAAS,EAAC,+CAA+C,YAAE,CAAC,CAAC,OAAO,GAAM,EAC9E,aAAI,SAAS,EAAC,8CAA8C,YAAE,CAAC,CAAC,MAAM,GAAM,EAC5E,aAAI,SAAS,EAAC,sBAAsB,YAClC,eAAM,SAAS,EAAE,kDAAkD,IAAI,EAAE,YACtE,CAAC,CAAC,UAAU,GACR,GACJ,EACL,aAAI,SAAS,EAAC,qEAAqE,YAChF,CAAC,CAAC,GAAG,IAAI,GAAG,GACV,EACL,aAAI,SAAS,EAAC,qEAAqE,YAChF,CAAC,CAAC,GAAG,GACH,EACL,aAAI,SAAS,EAAC,8CAA8C,YAC1D,eACE,SAAS,EAAE,oDAAoD,SAAS,EAAE,YAEzE,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,GACjB,GACJ,KApBmC,CAAC,CAqBtC,CACN,CAAC;wBACJ,CAAC,CAAC,GACI,IACF,GACJ,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type ListVariant = "ordered" | "bullet" | "check";
2
+ export interface ListProps {
3
+ /** "ordered" — zero-padded counters (01, 02, …); "bullet" — dot markers; "check" — tick marks. */
4
+ variant?: ListVariant;
5
+ /** Each item is an HTML string — use <strong>…</strong> for a bold lead-in. */
6
+ items: string[];
7
+ /** Optional uppercase heading rendered above the list. */
8
+ heading?: string;
9
+ }
10
+ export declare function List({ variant, items, heading }: ListProps): import("react").JSX.Element | null;
11
+ //# sourceMappingURL=List.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.d.ts","sourceRoot":"","sources":["../../react/List.tsx"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,kGAAkG;IAClG,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAcD,wBAAgB,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,sCAgC1D"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ICONS } from "../core/icons.js";
3
+ const VARIANTS = {
4
+ ordered: "ordered",
5
+ numbered: "ordered",
6
+ number: "ordered",
7
+ bullet: "bullet",
8
+ bulleted: "bullet",
9
+ dot: "bullet",
10
+ check: "check",
11
+ checked: "check",
12
+ checklist: "check",
13
+ };
14
+ export function List({ variant, items, heading }) {
15
+ if (!Array.isArray(items) || items.length === 0)
16
+ return null;
17
+ const v = VARIANTS[(variant ?? "bullet").toLowerCase().trim()] ?? "bullet";
18
+ const Tag = v === "ordered" ? "ol" : "ul";
19
+ return (_jsxs("div", { className: `bk-list bk-list--${v}`, children: [heading && _jsx("p", { className: "bk-list__heading", children: heading }), _jsx(Tag, { className: "bk-list__items", children: items.map((item, i) => (_jsxs("li", { className: "bk-list__item", children: [v === "ordered" ? (_jsx("span", { className: "bk-list__marker", "aria-hidden": "true", children: String(i + 1).padStart(2, "0") })) : v === "check" ? (_jsx("span", { className: "bk-list__marker", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: ICONS["check-tick"] } })) : (_jsx("span", { className: "bk-list__marker", "aria-hidden": "true" })), _jsx("span", { className: "bk-list__text", dangerouslySetInnerHTML: { __html: item } })] }, i))) })] }));
20
+ }
21
+ //# sourceMappingURL=List.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.js","sourceRoot":"","sources":["../../react/List.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAatC,MAAM,QAAQ,GAAgC;IAC5C,OAAO,EAAE,SAAS;IAClB,QAAQ,EAAE,SAAS;IACnB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,QAAQ;IACb,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,OAAO;IAChB,SAAS,EAAE,OAAO;CACnB,CAAC;AAEF,MAAM,UAAU,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAa;IACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,QAAQ,CAAC;IAC3E,MAAM,GAAG,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,OAAO,CACL,eAAK,SAAS,EAAE,oBAAoB,CAAC,EAAE,aACpC,OAAO,IAAI,YAAG,SAAS,EAAC,kBAAkB,YAAE,OAAO,GAAK,EACzD,KAAC,GAAG,IAAC,SAAS,EAAC,gBAAgB,YAC5B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,cAAI,SAAS,EAAC,eAAe,aAC1B,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CACjB,eAAM,SAAS,EAAC,iBAAiB,iBAAa,MAAM,YACjD,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAC1B,CACR,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAClB,eACE,SAAS,EAAC,iBAAiB,iBACf,MAAM,EAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,GACxD,CACH,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,iBAAiB,iBAAa,MAAM,GAAG,CACxD,EACD,eACE,SAAS,EAAC,eAAe,EACzB,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,GACzC,KAjB+B,CAAC,CAkB/B,CACN,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,15 @@
1
+ interface Metric {
2
+ value: string;
3
+ label: string;
4
+ change?: string;
5
+ /** Optional source attribution, e.g. "Zuko form benchmarks, 2026". */
6
+ source?: string;
7
+ /** Optional URL — when set alongside `source`, the row becomes a link. */
8
+ sourceUrl?: string;
9
+ }
10
+ export interface MetricHighlightProps {
11
+ metrics?: Metric[];
12
+ }
13
+ export declare function MetricHighlight({ metrics }: MetricHighlightProps): import("react").JSX.Element | null;
14
+ export {};
15
+ //# sourceMappingURL=MetricHighlight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricHighlight.d.ts","sourceRoot":"","sources":["../../react/MetricHighlight.tsx"],"names":[],"mappings":"AAQA,UAAU,MAAM;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AA8BD,wBAAgB,eAAe,CAAC,EAAE,OAAY,EAAE,EAAE,oBAAoB,sCAmCrE"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* blog-kit React adapter — MetricHighlight
3
+ Thin wrapper: all styling lives in core/css/components.css (.bk-metric-highlight).
4
+ One or more headline metrics. A single metric renders as a big brand-filled
5
+ hero (giant value + label + optional change + optional SOURCE row); two or
6
+ more render as a responsive grid of bordered cards. The grid column count is
7
+ driven by a --metric-highlight--<n> modifier (2 | 3 | 4+). */
8
+ import { ICONS } from "../core/icons.js";
9
+ function SourceRow({ source, sourceUrl, dark }) {
10
+ const cls = `bk-metric-highlight__source${dark ? " bk-metric-highlight__source--dark" : ""}`;
11
+ if (sourceUrl) {
12
+ return (_jsxs("a", { className: `${cls} bk-metric-highlight__source--link`, href: sourceUrl, target: "_blank", rel: "nofollow noopener noreferrer", children: [_jsx("span", { className: "bk-metric-highlight__source-kicker", children: "Source" }), source, _jsx("span", { className: "bk-metric-highlight__source-icon", "aria-hidden": "true", dangerouslySetInnerHTML: { __html: ICONS["external"] } })] }));
13
+ }
14
+ return (_jsxs("div", { className: cls, children: [_jsx("span", { className: "bk-metric-highlight__source-kicker", children: "Source" }), source] }));
15
+ }
16
+ export function MetricHighlight({ metrics = [] }) {
17
+ if (!metrics || metrics.length === 0)
18
+ return null;
19
+ if (metrics.length === 1) {
20
+ const m = metrics[0];
21
+ return (_jsxs("div", { className: "bk-metric-highlight bk-metric-highlight--hero", children: [_jsx("div", { className: "bk-metric-highlight__hero-value", children: m.value }), _jsxs("div", { className: "bk-metric-highlight__hero-body", children: [m.change && _jsx("div", { className: "bk-metric-highlight__hero-change", children: m.change }), _jsx("div", { className: "bk-metric-highlight__hero-label", children: m.label }), m.source && _jsx(SourceRow, { source: m.source, sourceUrl: m.sourceUrl, dark: true })] })] }));
22
+ }
23
+ const cols = metrics.length === 2 ? 2 : metrics.length === 3 ? 3 : 4;
24
+ return (_jsx("div", { className: `bk-metric-highlight bk-metric-highlight--grid bk-metric-highlight--${cols}`, children: metrics.map((metric, i) => (_jsxs("div", { className: "bk-metric-highlight__card", children: [_jsx("div", { className: "bk-metric-highlight__value", children: metric.value }), _jsx("div", { className: "bk-metric-highlight__label", children: metric.label }), metric.change && _jsx("div", { className: "bk-metric-highlight__change", children: metric.change }), metric.source && (_jsx("div", { className: "bk-metric-highlight__source-wrap", children: _jsx(SourceRow, { source: metric.source, sourceUrl: metric.sourceUrl }) }))] }, i))) }));
25
+ }
26
+ //# sourceMappingURL=MetricHighlight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricHighlight.js","sourceRoot":"","sources":["../../react/MetricHighlight.tsx"],"names":[],"mappings":";AAAA;;;;;gEAKgE;AAChE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAgBtC,SAAS,SAAS,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAA0D;IACpG,MAAM,GAAG,GAAG,8BAA8B,IAAI,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC7F,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CACL,aACE,SAAS,EAAE,GAAG,GAAG,oCAAoC,EACrD,IAAI,EAAE,SAAS,EACf,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,8BAA8B,aAElC,eAAM,SAAS,EAAC,oCAAoC,uBAAc,EACjE,MAAM,EACP,eACE,SAAS,EAAC,kCAAkC,iBAChC,MAAM,EAClB,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,GACtD,IACA,CACL,CAAC;IACJ,CAAC;IACD,OAAO,CACL,eAAK,SAAS,EAAE,GAAG,aACjB,eAAM,SAAS,EAAC,oCAAoC,uBAAc,EACjE,MAAM,IACH,CACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,EAAE,OAAO,GAAG,EAAE,EAAwB;IACpE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrB,OAAO,CACL,eAAK,SAAS,EAAC,+CAA+C,aAC5D,cAAK,SAAS,EAAC,iCAAiC,YAAE,CAAC,CAAC,KAAK,GAAO,EAChE,eAAK,SAAS,EAAC,gCAAgC,aAC5C,CAAC,CAAC,MAAM,IAAI,cAAK,SAAS,EAAC,kCAAkC,YAAE,CAAC,CAAC,MAAM,GAAO,EAC/E,cAAK,SAAS,EAAC,iCAAiC,YAAE,CAAC,CAAC,KAAK,GAAO,EAC/D,CAAC,CAAC,MAAM,IAAI,KAAC,SAAS,IAAC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,SAAG,IACrE,IACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,OAAO,CACL,cAAK,SAAS,EAAE,sEAAsE,IAAI,EAAE,YACzF,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,eAAK,SAAS,EAAC,2BAA2B,aACxC,cAAK,SAAS,EAAC,4BAA4B,YAAE,MAAM,CAAC,KAAK,GAAO,EAChE,cAAK,SAAS,EAAC,4BAA4B,YAAE,MAAM,CAAC,KAAK,GAAO,EAC/D,MAAM,CAAC,MAAM,IAAI,cAAK,SAAS,EAAC,6BAA6B,YAAE,MAAM,CAAC,MAAM,GAAO,EACnF,MAAM,CAAC,MAAM,IAAI,CAChB,cAAK,SAAS,EAAC,kCAAkC,YAC/C,KAAC,SAAS,IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,GAAI,GAC7D,CACP,KAR6C,CAAC,CAS3C,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export interface NewsletterCTAProps {
2
+ heading?: string;
3
+ description?: string;
4
+ action?: string;
5
+ placeholder?: string;
6
+ buttonText?: string;
7
+ }
8
+ export declare function NewsletterCTA({ heading, description, action, placeholder, buttonText, }: NewsletterCTAProps): import("react").JSX.Element;
9
+ //# sourceMappingURL=NewsletterCTA.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewsletterCTA.d.ts","sourceRoot":"","sources":["../../react/NewsletterCTA.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,wBAAgB,aAAa,CAAC,EAC5B,OAAmC,EACnC,WAAoF,EACpF,MAA0B,EAC1B,WAA8B,EAC9B,UAAwB,GACzB,EAAE,kBAAkB,+BA6BpB"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function NewsletterCTA({ heading = "One email, once a week.", description = "Field-tested ideas for turning chat traffic into revenue. No filler.", action = "/api/newsletter", placeholder = "you@studio.com", buttonText = "Subscribe", }) {
3
+ return (_jsxs("div", { className: "bk-newsletter", children: [_jsx("span", { className: "bk-newsletter__glow", "aria-hidden": "true" }), _jsxs("div", { className: "bk-newsletter__copy", children: [_jsx("h3", { className: "bk-newsletter__heading", children: heading }), _jsx("p", { className: "bk-newsletter__desc", children: description })] }), _jsx("div", { className: "bk-newsletter__action", children: _jsxs("form", { className: "bk-newsletter__form", action: action, method: "post", children: [_jsxs("label", { className: "bk-newsletter__honeypot", "aria-hidden": "true", children: ["Leave this field empty", _jsx("input", { type: "text", name: "website", tabIndex: -1, autoComplete: "off" })] }), _jsx("input", { className: "bk-newsletter__input", type: "email", name: "email", required: true, placeholder: placeholder, autoComplete: "email" }), _jsx("button", { className: "bk-newsletter__button", type: "submit", children: buttonText })] }) })] }));
4
+ }
5
+ //# sourceMappingURL=NewsletterCTA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NewsletterCTA.js","sourceRoot":"","sources":["../../react/NewsletterCTA.tsx"],"names":[],"mappings":";AAYA,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,GAAG,yBAAyB,EACnC,WAAW,GAAG,sEAAsE,EACpF,MAAM,GAAG,iBAAiB,EAC1B,WAAW,GAAG,gBAAgB,EAC9B,UAAU,GAAG,WAAW,GACL;IACnB,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC5B,eAAM,SAAS,EAAC,qBAAqB,iBAAa,MAAM,GAAG,EAC3D,eAAK,SAAS,EAAC,qBAAqB,aAClC,aAAI,SAAS,EAAC,wBAAwB,YAAE,OAAO,GAAM,EACrD,YAAG,SAAS,EAAC,qBAAqB,YAAE,WAAW,GAAK,IAChD,EACN,cAAK,SAAS,EAAC,uBAAuB,YACpC,gBAAM,SAAS,EAAC,qBAAqB,EAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAC,MAAM,aACjE,iBAAO,SAAS,EAAC,yBAAyB,iBAAa,MAAM,uCAE3D,gBAAO,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,YAAY,EAAC,KAAK,GAAG,IAC/D,EACR,gBACE,SAAS,EAAC,sBAAsB,EAChC,IAAI,EAAC,OAAO,EACZ,IAAI,EAAC,OAAO,EACZ,QAAQ,QACR,WAAW,EAAE,WAAW,EACxB,YAAY,EAAC,OAAO,GACpB,EACF,iBAAQ,SAAS,EAAC,uBAAuB,EAAC,IAAI,EAAC,QAAQ,YACpD,UAAU,GACJ,IACJ,GACH,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ReactNode } from "react";
2
+ export interface NumberedCardProps {
3
+ number?: number | string;
4
+ title?: string;
5
+ description?: ReactNode;
6
+ children?: ReactNode;
7
+ }
8
+ export declare function NumberedCard({ number, title, description, children }: NumberedCardProps): import("react").JSX.Element;
9
+ //# sourceMappingURL=NumberedCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberedCard.d.ts","sourceRoot":"","sources":["../../react/NumberedCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,MAAM,WAAW,iBAAiB;IAAG,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;CAAE;AAC/H,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,iBAAiB,+BAIvF"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function NumberedCard({ number, title, description, children }) {
3
+ const n = String(number ?? "").padStart(2, "0");
4
+ const body = description ?? children;
5
+ return (_jsxs("div", { className: "bk-numbered-card", children: [_jsx("span", { className: "bk-numbered-card__badge", children: n }), title ? _jsx("h4", { className: "bk-numbered-card__title", children: title }) : null, body ? _jsx("p", { className: "bk-numbered-card__body", children: body }) : null] }));
6
+ }
7
+ //# sourceMappingURL=NumberedCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NumberedCard.js","sourceRoot":"","sources":["../../react/NumberedCard.tsx"],"names":[],"mappings":";AAEA,MAAM,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAqB;IACtF,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,WAAW,IAAI,QAAQ,CAAC;IACrC,OAAO,CAAC,eAAK,SAAS,EAAC,kBAAkB,aAAC,eAAM,SAAS,EAAC,yBAAyB,YAAE,CAAC,GAAQ,EAAC,KAAK,CAAC,CAAC,CAAC,aAAI,SAAS,EAAC,yBAAyB,YAAE,KAAK,GAAM,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAG,SAAS,EAAC,wBAAwB,YAAE,IAAI,GAAK,CAAC,CAAC,CAAC,IAAI,IAAO,CAAC,CAAC;AAC7O,CAAC"}
@@ -0,0 +1,6 @@
1
+ export interface ProConBlockProps {
2
+ pros?: string[];
3
+ cons?: string[];
4
+ }
5
+ export declare function ProConBlock({ pros, cons }: ProConBlockProps): import("react").JSX.Element | null;
6
+ //# sourceMappingURL=ProConBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProConBlock.d.ts","sourceRoot":"","sources":["../../react/ProConBlock.tsx"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAS,EAAE,IAAS,EAAE,EAAE,gBAAgB,sCAoCrE"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function ProConBlock({ pros = [], cons = [] }) {
3
+ if (!pros?.length && !cons?.length)
4
+ return null;
5
+ return (_jsxs("div", { className: "bk-procon", children: [pros.length > 0 && (_jsxs("div", { className: "bk-procon__card bk-procon__card--pro", "data-kind": "pro", children: [_jsx("h4", { className: "bk-procon__heading", children: "Pros" }), _jsx("ul", { className: "bk-procon__list", children: pros.map((item, i) => (_jsxs("li", { className: "bk-procon__item", children: [_jsx("span", { className: "bk-procon__mark", "aria-hidden": "true", children: "\u2713" }), _jsx("span", { className: "bk-procon__text", children: item })] }, i))) })] })), cons.length > 0 && (_jsxs("div", { className: "bk-procon__card bk-procon__card--con", "data-kind": "con", children: [_jsx("h4", { className: "bk-procon__heading", children: "Cons" }), _jsx("ul", { className: "bk-procon__list", children: cons.map((item, i) => (_jsxs("li", { className: "bk-procon__item", children: [_jsx("span", { className: "bk-procon__mark", "aria-hidden": "true", children: "\u2715" }), _jsx("span", { className: "bk-procon__text", children: item })] }, i))) })] }))] }));
6
+ }
7
+ //# sourceMappingURL=ProConBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProConBlock.js","sourceRoot":"","sources":["../../react/ProConBlock.tsx"],"names":[],"mappings":";AAKA,MAAM,UAAU,WAAW,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,EAAoB;IACpE,IAAI,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC,IAAI,EAAE,MAAM;QAAE,OAAO,IAAI,CAAC;IAChD,OAAO,CACL,eAAK,SAAS,EAAC,WAAW,aACvB,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAClB,eAAK,SAAS,EAAC,sCAAsC,eAAW,KAAK,aACnE,aAAI,SAAS,EAAC,oBAAoB,qBAAU,EAC5C,aAAI,SAAS,EAAC,iBAAiB,YAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,cAAY,SAAS,EAAC,iBAAiB,aACrC,eAAM,SAAS,EAAC,iBAAiB,iBAAa,MAAM,uBAE7C,EACP,eAAM,SAAS,EAAC,iBAAiB,YAAE,IAAI,GAAQ,KAJxC,CAAC,CAKL,CACN,CAAC,GACC,IACD,CACP,EACA,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAClB,eAAK,SAAS,EAAC,sCAAsC,eAAW,KAAK,aACnE,aAAI,SAAS,EAAC,oBAAoB,qBAAU,EAC5C,aAAI,SAAS,EAAC,iBAAiB,YAC5B,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,cAAY,SAAS,EAAC,iBAAiB,aACrC,eAAM,SAAS,EAAC,iBAAiB,iBAAa,MAAM,uBAE7C,EACP,eAAM,SAAS,EAAC,iBAAiB,YAAE,IAAI,GAAQ,KAJxC,CAAC,CAKL,CACN,CAAC,GACC,IACD,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ export type ProseListVariant = "ul" | "ol";
2
+ export interface ProseListItem {
3
+ /** Bold lead-in (HTML allowed). */
4
+ title?: string;
5
+ /** Supporting copy (HTML allowed). */
6
+ description?: string;
7
+ }
8
+ export interface ProseListProps {
9
+ /** "ul" — dash markers; "ol" — zero-padded counters (01, 02, …). */
10
+ variant?: ProseListVariant;
11
+ /** Plain HTML strings, or {title, description} objects (triggers grid mode). */
12
+ items?: Array<string | ProseListItem>;
13
+ /** Dashed divider between items. */
14
+ divided?: boolean;
15
+ }
16
+ export declare function ProseList({ variant, items, divided }: ProseListProps): import("react").JSX.Element | null;
17
+ //# sourceMappingURL=ProseList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProseList.d.ts","sourceRoot":"","sources":["../../react/ProseList.tsx"],"names":[],"mappings":"AAQA,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC;AAE3C,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,gFAAgF;IAChF,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,aAAa,CAAC,CAAC;IACtC,oCAAoC;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,OAAc,EAAE,KAAU,EAAE,OAAe,EAAE,EAAE,cAAc,sCA6CxF"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /* blog-kit React adapter — ProseList
3
+ Thin wrapper: all styling lives in core/css/components.css (.bk-prose-list).
4
+ Body-copy bullet (ul) or zero-padded ordered (ol) list. Items may be plain
5
+ HTML strings, or {title, description} objects — any title/description object
6
+ flips the whole list into a two-column grid so titles and descriptions align
7
+ across rows. Add `divided` for dashed-divider breathing room between items. */
8
+ import { cx } from "../core/lib.js";
9
+ export function ProseList({ variant = "ul", items = [], divided = false }) {
10
+ if (!Array.isArray(items) || items.length === 0)
11
+ return null;
12
+ const v = variant === "ol" ? "ol" : "ul";
13
+ const Tag = v === "ol" ? "ol" : "ul";
14
+ // Grid layout kicks in when any item is an object with title+description, so
15
+ // titles and descriptions align into consistent columns across every row.
16
+ const isGrid = items.some((it) => it && typeof it === "object" && (it.title || it.description));
17
+ const cls = cx("bk-prose-list", `bk-prose-list--${v}`, divided && "bk-prose-list--divided", isGrid && "bk-prose-list--grid");
18
+ return (_jsx(Tag, { className: cls, children: items.map((item, i) => {
19
+ if (isGrid) {
20
+ const obj = item && typeof item === "object" ? item : { description: String(item ?? "") };
21
+ return (_jsxs("li", { className: "bk-prose-list__item", children: [_jsx("span", { className: "bk-prose-list__marker", "aria-hidden": "true" }), _jsx("span", { className: "bk-prose-list__title", dangerouslySetInnerHTML: { __html: obj.title || "" } }), _jsx("span", { className: "bk-prose-list__desc", dangerouslySetInnerHTML: { __html: obj.description || "" } })] }, i));
22
+ }
23
+ return (_jsx("li", { className: "bk-prose-list__item", dangerouslySetInnerHTML: { __html: typeof item === "string" ? item : "" } }, i));
24
+ }) }));
25
+ }
26
+ //# sourceMappingURL=ProseList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProseList.js","sourceRoot":"","sources":["../../react/ProseList.tsx"],"names":[],"mappings":";AAAA;;;;;iFAKiF;AACjF,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAoBjC,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,EAAE,OAAO,GAAG,KAAK,EAAkB;IACvF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,CAAC,GAAqB,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,GAAG,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrC,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CACvB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,CACrE,CAAC;IACF,MAAM,GAAG,GAAG,EAAE,CACZ,eAAe,EACf,kBAAkB,CAAC,EAAE,EACrB,OAAO,IAAI,wBAAwB,EACnC,MAAM,IAAI,qBAAqB,CAChC,CAAC;IACF,OAAO,CACL,KAAC,GAAG,IAAC,SAAS,EAAE,GAAG,YAChB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACrB,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,GAAG,GACP,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gBAChF,OAAO,CACL,cAAY,SAAS,EAAC,qBAAqB,aACzC,eAAM,SAAS,EAAC,uBAAuB,iBAAa,MAAM,GAAG,EAC7D,eACE,SAAS,EAAC,sBAAsB,EAChC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,GACpD,EACF,eACE,SAAS,EAAC,qBAAqB,EAC/B,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,GAC1D,KATK,CAAC,CAUL,CACN,CAAC;YACJ,CAAC;YACD,OAAO,CACL,aAEE,SAAS,EAAC,qBAAqB,EAC/B,uBAAuB,EAAE,EAAE,MAAM,EAAE,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,IAFpE,CAAC,CAGN,CACH,CAAC;QACJ,CAAC,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ReactNode } from "react";
2
+ export interface QuoteBlockProps {
3
+ /** The quote text. Optional — children may carry the body instead (MDX). */
4
+ quote?: string;
5
+ author?: string;
6
+ role?: string;
7
+ company?: string;
8
+ /** Source attribution text, e.g. "Forrester AI Study, 2024". */
9
+ source?: string;
10
+ /** When set alongside `source`, the attribution row links to the original. */
11
+ sourceUrl?: string;
12
+ /** Explicit avatar URL — overrides the favicon-from-sourceUrl default. */
13
+ avatarUrl?: string;
14
+ children?: ReactNode;
15
+ }
16
+ export declare function QuoteBlock({ quote, author, role, company, source, sourceUrl, avatarUrl, children, }: QuoteBlockProps): import("react").JSX.Element;
17
+ //# sourceMappingURL=QuoteBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuoteBlock.d.ts","sourceRoot":"","sources":["../../react/QuoteBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,MAAM,WAAW,eAAe;IAC9B,4EAA4E;IAC5E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAiBD,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,IAAI,EACJ,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,+BA8CjB"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { ICONS } from "../core/icons.js";
3
+ /**
4
+ * Google's public favicon-resolver URL for the source URL's host, or null when
5
+ * the URL is missing/unparseable so the avatar slot can be dropped entirely.
6
+ */
7
+ function deriveFaviconUrl(sourceUrl) {
8
+ if (!sourceUrl)
9
+ return null;
10
+ try {
11
+ const host = new URL(sourceUrl).hostname;
12
+ if (!host)
13
+ return null;
14
+ return `https://www.google.com/s2/favicons?domain=${encodeURIComponent(host)}&sz=64`;
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ export function QuoteBlock({ quote, author, role, company, source, sourceUrl, avatarUrl, children, }) {
21
+ const subtitle = [role, company].filter(Boolean).join(" · ");
22
+ const avatarSrc = avatarUrl ?? deriveFaviconUrl(sourceUrl);
23
+ return (_jsxs("figure", { className: "bk-quote", children: [_jsx("span", { className: "bk-quote__mark", "aria-hidden": true, children: "\u201C" }), _jsx("blockquote", { className: "bk-quote__body", children: quote ?? children }), (author || subtitle) && (_jsxs("figcaption", { className: "bk-quote__cite", children: [avatarSrc && (_jsx("img", { className: "bk-quote__avatar", src: avatarSrc, alt: "", "aria-hidden": true, width: 40, height: 40 })), _jsxs("span", { className: "bk-quote__who", children: [author && _jsx("cite", { className: "bk-quote__author", children: author }), subtitle && _jsx("span", { className: "bk-quote__role", children: subtitle })] })] })), source &&
24
+ (sourceUrl ? (_jsxs("a", { className: "bk-quote__source bk-quote__source--link", href: sourceUrl, target: "_blank", rel: "nofollow noopener noreferrer", children: [_jsx("span", { className: "bk-quote__source-kicker", children: "Source" }), source, _jsx("span", { className: "bk-quote__source-icon", dangerouslySetInnerHTML: { __html: ICONS["external"] } })] })) : (_jsxs("div", { className: "bk-quote__source", children: [_jsx("span", { className: "bk-quote__source-kicker", children: "Source" }), source] })))] }));
25
+ }
26
+ //# sourceMappingURL=QuoteBlock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QuoteBlock.js","sourceRoot":"","sources":["../../react/QuoteBlock.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAiBtC;;;GAGG;AACH,SAAS,gBAAgB,CAAC,SAAkB;IAC1C,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC;QACzC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QACvB,OAAO,6CAA6C,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;IACvF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,MAAM,EACN,IAAI,EACJ,OAAO,EACP,MAAM,EACN,SAAS,EACT,SAAS,EACT,QAAQ,GACQ;IAChB,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,SAAS,GAAG,SAAS,IAAI,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAE3D,OAAO,CACL,kBAAQ,SAAS,EAAC,UAAU,aAC1B,eAAM,SAAS,EAAC,gBAAgB,4CAA2B,EAC3D,qBAAY,SAAS,EAAC,gBAAgB,YAAE,KAAK,IAAI,QAAQ,GAAc,EACtE,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,CACvB,sBAAY,SAAS,EAAC,gBAAgB,aACnC,SAAS,IAAI,CACZ,cACE,SAAS,EAAC,kBAAkB,EAC5B,GAAG,EAAE,SAAS,EACd,GAAG,EAAC,EAAE,uBAEN,KAAK,EAAE,EAAE,EACT,MAAM,EAAE,EAAE,GACV,CACH,EACD,gBAAM,SAAS,EAAC,eAAe,aAC5B,MAAM,IAAI,eAAM,SAAS,EAAC,kBAAkB,YAAE,MAAM,GAAQ,EAC5D,QAAQ,IAAI,eAAM,SAAS,EAAC,gBAAgB,YAAE,QAAQ,GAAQ,IAC1D,IACI,CACd,EACA,MAAM;gBACL,CAAC,SAAS,CAAC,CAAC,CAAC,CACX,aACE,SAAS,EAAC,yCAAyC,EACnD,IAAI,EAAE,SAAS,EACf,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,8BAA8B,aAElC,eAAM,SAAS,EAAC,yBAAyB,uBAAc,EACtD,MAAM,EACP,eAAM,SAAS,EAAC,uBAAuB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,GAAI,IAChG,CACL,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,kBAAkB,aAC/B,eAAM,SAAS,EAAC,yBAAyB,uBAAc,EACtD,MAAM,IACH,CACP,CAAC,IACG,CACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface RegionCalloutOffice {
2
+ /** Office / region name, rendered uppercase. */
3
+ name: string;
4
+ /** Phone number, shown in brand-coloured monospace. */
5
+ phone?: string;
6
+ /** Optional CSS background for the swatch (colour, gradient, or url()). */
7
+ flag?: string;
8
+ }
9
+ export interface RegionCalloutProps {
10
+ offices?: RegionCalloutOffice[];
11
+ }
12
+ export declare function RegionCallout({ offices }: RegionCalloutProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=RegionCallout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegionCallout.d.ts","sourceRoot":"","sources":["../../react/RegionCallout.tsx"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACjC;AAED,wBAAgB,aAAa,CAAC,EAAE,OAAY,EAAE,EAAE,kBAAkB,+BAiBjE"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function RegionCallout({ offices = [] }) {
3
+ return (_jsx("div", { className: "bk-region-callout", children: offices.map((o, i) => (_jsxs("div", { className: "bk-region-callout__cell", children: [_jsx("div", { className: "bk-region-callout__flag", ...(o.flag ? { style: { background: o.flag } } : {}) }), _jsxs("div", { className: "bk-region-callout__info", children: [_jsx("div", { className: "bk-region-callout__name", children: o.name }), o.phone && _jsx("div", { className: "bk-region-callout__phone", children: o.phone })] })] }, i))) }));
4
+ }
5
+ //# sourceMappingURL=RegionCallout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegionCallout.js","sourceRoot":"","sources":["../../react/RegionCallout.tsx"],"names":[],"mappings":";AAoBA,MAAM,UAAU,aAAa,CAAC,EAAE,OAAO,GAAG,EAAE,EAAsB;IAChE,OAAO,CACL,cAAK,SAAS,EAAC,mBAAmB,YAC/B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,eAAa,SAAS,EAAC,yBAAyB,aAC9C,cACE,SAAS,EAAC,yBAAyB,KAC/B,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GACrD,EACF,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,yBAAyB,YAAE,CAAC,CAAC,IAAI,GAAO,EACtD,CAAC,CAAC,KAAK,IAAI,cAAK,SAAS,EAAC,0BAA0B,YAAE,CAAC,CAAC,KAAK,GAAO,IACjE,KARE,CAAC,CASL,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface RelatedPost {
2
+ slug: string;
3
+ title: string;
4
+ excerpt?: string;
5
+ date?: string;
6
+ /** Optional category pill shown above the title. */
7
+ category?: string;
8
+ /** Featured image URL; renders as the thumbnail when present. */
9
+ featuredImage?: string;
10
+ featuredImageAlt?: string;
11
+ }
12
+ export interface RelatedPostsProps {
13
+ posts: RelatedPost[];
14
+ /** Section heading. */
15
+ heading?: string;
16
+ /** Optional override for the per-card link href; receives the slug. */
17
+ hrefBase?: string;
18
+ }
19
+ export declare function RelatedPosts({ posts, heading, hrefBase }: RelatedPostsProps): import("react").JSX.Element | null;
20
+ //# sourceMappingURL=RelatedPosts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RelatedPosts.d.ts","sourceRoot":"","sources":["../../react/RelatedPosts.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,uBAAuB;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,OAAwB,EAAE,QAAmB,EAAE,EAAE,iBAAiB,sCAgCvG"}