@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,43 @@
1
+ /**
2
+ * Resolve a user config (+ env) into a fully-defaulted shape.
3
+ *
4
+ * Env precedence for the remote source: an explicit value in the config
5
+ * file wins; otherwise BLOGKIT_CONTENT_URL / BLOGKIT_SITE_TOKEN are used.
6
+ * This lets a site commit `mode: "hjd-api"` while keeping the URL+token
7
+ * out of source control (host Secrets / Vercel Env).
8
+ */
9
+ export function resolveConfig(cfg) {
10
+ const source = resolveSource(cfg.source);
11
+ const l = cfg.listing ?? {};
12
+ return {
13
+ source,
14
+ brand: { name: cfg.brand.name, siteUrl: cfg.brand.siteUrl },
15
+ listing: {
16
+ listingBasePath: l.listingBasePath ?? "/blog",
17
+ articleBasePath: l.articleBasePath ?? "/blog",
18
+ pageSize: l.pageSize ?? 12,
19
+ showFeaturedHero: l.showFeaturedHero ?? true,
20
+ showCategoryNav: l.showCategoryNav ?? true,
21
+ dateLocale: l.dateLocale ?? "en-GB",
22
+ categoryLabels: l.categoryLabels ?? {},
23
+ categoryOrder: l.categoryOrder ?? [],
24
+ pinnedSlug: l.pinnedSlug,
25
+ },
26
+ freshness: { revalidate: cfg.freshness?.revalidate ?? 60 },
27
+ };
28
+ }
29
+ function resolveSource(source) {
30
+ if (source.mode === "local") {
31
+ return { mode: "local", postsDir: source.postsDir ?? "content/posts" };
32
+ }
33
+ // hjd-api: fall back to env for URL + token so they stay out of git.
34
+ const contentUrl = source.contentUrl ?? process.env.BLOGKIT_CONTENT_URL ?? "";
35
+ const siteToken = source.siteToken ?? process.env.BLOGKIT_SITE_TOKEN ?? "";
36
+ return {
37
+ mode: "hjd-api",
38
+ contentUrl: contentUrl.replace(/\/+$/, ""),
39
+ siteToken,
40
+ fetchRevalidate: source.fetchRevalidate ?? 60,
41
+ };
42
+ }
43
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../../package/config/resolve.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,GAAkB;IAC9C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAC5B,OAAO;QACL,MAAM;QACN,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE;QAC3D,OAAO,EAAE;YACP,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,OAAO;YAC7C,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,OAAO;YAC7C,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI;YAC5C,eAAe,EAAE,CAAC,CAAC,eAAe,IAAI,IAAI;YAC1C,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,OAAO;YACnC,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,EAAE;YACtC,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,EAAE;YACpC,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB;QACD,SAAS,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,EAAE,UAAU,IAAI,EAAE,EAAE;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,MAAoB;IACzC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,eAAe,EAAE,CAAC;IACzE,CAAC;IACD,qEAAqE;IACrE,MAAM,UAAU,GACd,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC;IAC3E,OAAO;QACL,IAAI,EAAE,SAAS;QACf,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC1C,SAAS;QACT,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,EAAE;KAC9C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,74 @@
1
+ /** Which content source the routes pull from. */
2
+ export type SourceMode = "local" | "hjd-api";
3
+ export interface LocalSourceConfig {
4
+ mode: "local";
5
+ /** Directory of `.mdx` files, relative to process.cwd(). Default: "content/posts". */
6
+ postsDir?: string;
7
+ }
8
+ export interface HjdApiSourceConfig {
9
+ mode: "hjd-api";
10
+ /**
11
+ * The per-tenant content endpoint (no trailing slash).
12
+ * Resolved from BLOGKIT_CONTENT_URL when omitted.
13
+ */
14
+ contentUrl?: string;
15
+ /**
16
+ * The per-site bearer token authenticating pulls.
17
+ * Resolved from BLOGKIT_SITE_TOKEN when omitted. NEVER hard-code it.
18
+ */
19
+ siteToken?: string;
20
+ /** ISR revalidation window in seconds for fetch() to our API. Default 60. */
21
+ fetchRevalidate?: number;
22
+ }
23
+ export type SourceConfig = LocalSourceConfig | HjdApiSourceConfig;
24
+ /** Per-site brand identity surfaced in titles/metadata. Colours/fonts
25
+ * are CSS tokens (see theme), not config. */
26
+ export interface BrandConfig {
27
+ /** Display name, used in <title> and author fallbacks. */
28
+ name: string;
29
+ /** Absolute or root-relative URL of the site, for canonical/OG. */
30
+ siteUrl?: string;
31
+ }
32
+ /** Listing/route knobs (mirror of the proven blog-index.config.ts). */
33
+ export interface ListingConfig {
34
+ /** URL base for the listing index. Default "/blog". */
35
+ listingBasePath?: string;
36
+ /** URL base for a single article. "" => /<slug>; "/blog" => /blog/<slug>. Default "/blog". */
37
+ articleBasePath?: string;
38
+ /** Posts per page. Default 12. */
39
+ pageSize?: number;
40
+ /** Show the featured hero on page 1 of the index. Default true. */
41
+ showFeaturedHero?: boolean;
42
+ /** Show the category nav strip. Default true. */
43
+ showCategoryNav?: boolean;
44
+ /** Date locale for formatting. Default "en-GB". */
45
+ dateLocale?: string;
46
+ /** slug -> display label overrides for categories. */
47
+ categoryLabels?: Record<string, string>;
48
+ /** Preferred category ordering by slug. */
49
+ categoryOrder?: string[];
50
+ /** An explicit pinned/featured slug; else newest is featured. */
51
+ pinnedSlug?: string;
52
+ }
53
+ /**
54
+ * ISR freshness. `revalidate` is the seconds value the kit's routes
55
+ * export as `export const revalidate`. Static HTML, refreshed in the
56
+ * background — SEO-correct, no redeploy. Default 60.
57
+ */
58
+ export interface FreshnessConfig {
59
+ revalidate?: number;
60
+ }
61
+ export interface BlogKitConfig {
62
+ source: SourceConfig;
63
+ brand: BrandConfig;
64
+ listing?: ListingConfig;
65
+ freshness?: FreshnessConfig;
66
+ }
67
+ /** Fully-defaulted, internal shape the routes actually consume. */
68
+ export interface ResolvedConfig {
69
+ source: SourceConfig;
70
+ brand: Required<Pick<BrandConfig, "name">> & BrandConfig;
71
+ listing: Required<Pick<ListingConfig, "listingBasePath" | "articleBasePath" | "pageSize" | "showFeaturedHero" | "showCategoryNav" | "dateLocale" | "categoryLabels" | "categoryOrder">> & Pick<ListingConfig, "pinnedSlug">;
72
+ freshness: Required<FreshnessConfig>;
73
+ }
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../package/config/types.ts"],"names":[],"mappings":"AAYA,iDAAiD;AACjD,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;AAE7C,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,sFAAsF;IACtF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,CAAC;IAChB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,YAAY,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAElE;8CAC8C;AAC9C,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,+FAA+F;IAC/F,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iDAAiD;IACjD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sDAAsD;IACtD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC;IACzD,OAAO,EAAE,QAAQ,CACf,IAAI,CACF,aAAa,EACX,iBAAiB,GACjB,iBAAiB,GACjB,UAAU,GACV,kBAAkB,GAClB,iBAAiB,GACjB,YAAY,GACZ,gBAAgB,GAChB,eAAe,CAClB,CACF,GACC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IACpC,SAAS,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;CACtC"}
@@ -0,0 +1,13 @@
1
+ /* ============================================================
2
+ @highjumpdigitalsoftware/blog-kit — configuration types
3
+ ------------------------------------------------------------
4
+ A site configures the kit once (in app/blog/blogkit.config.ts).
5
+ The config selects the content SOURCE (local files vs our
6
+ hjd-api), wires the per-site theme/brand, and tunes the
7
+ listing. Everything else is defaulted.
8
+
9
+ The SOURCE is the one swap point that makes "eject" a one-line
10
+ flip: source.mode: "hjd-api" → source.mode: "local".
11
+ ============================================================ */
12
+ export {};
13
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../package/config/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;kEAUkE"}
@@ -0,0 +1,28 @@
1
+ import type { PostMeta } from "./adapters";
2
+ export type ListPost = PostMeta;
3
+ export interface CategoryRef {
4
+ slug: string;
5
+ label: string;
6
+ count: number;
7
+ }
8
+ export interface Paged<T> {
9
+ items: T[];
10
+ page: number;
11
+ totalPages: number;
12
+ total: number;
13
+ pageSize: number;
14
+ }
15
+ export declare function toCategorySlug(value: string): string;
16
+ export declare function categoryLabel(slug: string, labels?: Record<string, string>): string;
17
+ export declare function getCategories(posts: ListPost[], labels?: Record<string, string>, order?: string[]): CategoryRef[];
18
+ export declare function postsInCategory(posts: ListPost[], categorySlug: string): ListPost[];
19
+ export declare function getFeatured(posts: ListPost[], pinnedSlug?: string): ListPost | null;
20
+ export declare function paginate<T>(items: T[], page: number, pageSize: number): Paged<T>;
21
+ export declare function isValidPage(page: number, totalPages: number): boolean;
22
+ export declare function listingHref(base: string, page: number): string;
23
+ export declare function categoryHref(base: string, categorySlug: string, page?: number): string;
24
+ export declare function articleHref(articleBase: string, slug: string): string;
25
+ export declare function readingLabel(min?: number): string;
26
+ export declare function formatDate(date: string, locale: string): string;
27
+ export declare function authorInitials(name: string): string;
28
+ //# sourceMappingURL=index-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-core.d.ts","sourceRoot":"","sources":["../../package/index-core.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,KAAK,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AAUD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAClC,MAAM,CAER;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,QAAQ,EAAE,EACjB,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,EACnC,KAAK,GAAE,MAAM,EAAO,GACnB,WAAW,EAAE,CAwBf;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,QAAQ,EAAE,EACjB,YAAY,EAAE,MAAM,GACnB,QAAQ,EAAE,CAEZ;AAED,wBAAgB,WAAW,CACzB,KAAK,EAAE,QAAQ,EAAE,EACjB,UAAU,CAAC,EAAE,MAAM,GAClB,QAAQ,GAAG,IAAI,CAOjB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAMhF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAErE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,MAAM,CAGjF;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKnD"}
@@ -0,0 +1,102 @@
1
+ const trimSlashes = (s) => s.replace(/^\/+|\/+$/g, "");
2
+ export function toCategorySlug(value) {
3
+ return trimSlashes(String(value || "")
4
+ .toLowerCase()
5
+ .trim()
6
+ .replace(/&/g, " and ")
7
+ .replace(/[^a-z0-9]+/g, "-"));
8
+ }
9
+ function titleCaseSlug(slug) {
10
+ return slug
11
+ .split("-")
12
+ .filter(Boolean)
13
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
14
+ .join(" ");
15
+ }
16
+ export function categoryLabel(slug, labels = {}) {
17
+ return labels[slug] ?? titleCaseSlug(slug);
18
+ }
19
+ export function getCategories(posts, labels = {}, order = []) {
20
+ const counts = new Map();
21
+ for (const p of posts) {
22
+ if (!p.category)
23
+ continue;
24
+ const slug = toCategorySlug(p.category);
25
+ counts.set(slug, (counts.get(slug) ?? 0) + 1);
26
+ }
27
+ const refs = [...counts.entries()].map(([slug, count]) => ({
28
+ slug,
29
+ label: categoryLabel(slug, labels),
30
+ count,
31
+ }));
32
+ refs.sort((a, b) => {
33
+ const ia = order.indexOf(a.slug);
34
+ const ib = order.indexOf(b.slug);
35
+ if (ia !== -1 || ib !== -1) {
36
+ if (ia === -1)
37
+ return 1;
38
+ if (ib === -1)
39
+ return -1;
40
+ return ia - ib;
41
+ }
42
+ if (b.count !== a.count)
43
+ return b.count - a.count;
44
+ return a.label.localeCompare(b.label);
45
+ });
46
+ return refs;
47
+ }
48
+ export function postsInCategory(posts, categorySlug) {
49
+ return posts.filter((p) => toCategorySlug(p.category) === categorySlug);
50
+ }
51
+ export function getFeatured(posts, pinnedSlug) {
52
+ if (!posts.length)
53
+ return null;
54
+ if (pinnedSlug) {
55
+ const hit = posts.find((p) => p.slug === pinnedSlug);
56
+ if (hit)
57
+ return hit;
58
+ }
59
+ return posts[0];
60
+ }
61
+ export function paginate(items, page, pageSize) {
62
+ const total = items.length;
63
+ const totalPages = Math.max(1, Math.ceil(total / Math.max(1, pageSize)));
64
+ const p = Math.max(1, Math.floor(page) || 1);
65
+ const start = (p - 1) * pageSize;
66
+ return { items: items.slice(start, start + pageSize), page: p, totalPages, total, pageSize };
67
+ }
68
+ export function isValidPage(page, totalPages) {
69
+ return Number.isInteger(page) && page >= 1 && page <= totalPages;
70
+ }
71
+ export function listingHref(base, page) {
72
+ const root = "/" + trimSlashes(base);
73
+ return page <= 1 ? root : `${root}/page/${page}`;
74
+ }
75
+ export function categoryHref(base, categorySlug, page = 1) {
76
+ const root = `/${trimSlashes(base)}/category/${categorySlug}`;
77
+ return page <= 1 ? root : `${root}/page/${page}`;
78
+ }
79
+ export function articleHref(articleBase, slug) {
80
+ const root = trimSlashes(articleBase);
81
+ return root ? `/${root}/${slug}` : `/${slug}`;
82
+ }
83
+ export function readingLabel(min) {
84
+ if (!min || min < 1)
85
+ return "";
86
+ return `${Math.round(min)} min read`;
87
+ }
88
+ export function formatDate(date, locale) {
89
+ const d = new Date(date);
90
+ if (isNaN(d.getTime()))
91
+ return String(date ?? "");
92
+ return d.toLocaleDateString(locale, { year: "numeric", month: "short", day: "numeric" });
93
+ }
94
+ export function authorInitials(name) {
95
+ const parts = String(name || "").trim().split(/\s+/).filter(Boolean);
96
+ if (!parts.length)
97
+ return "?";
98
+ if (parts.length === 1)
99
+ return parts[0].slice(0, 2).toUpperCase();
100
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
101
+ }
102
+ //# sourceMappingURL=index-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-core.js","sourceRoot":"","sources":["../../package/index-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export { defineConfig } from "./config/define";
2
+ export { resolveConfig } from "./config/resolve";
3
+ export type { BlogKitConfig, ResolvedConfig, SourceConfig, SourceMode, LocalSourceConfig, HjdApiSourceConfig, BrandConfig, ListingConfig, FreshnessConfig, } from "./config/types";
4
+ export { Article, getArticle } from "./article";
5
+ export type { ArticleProps } from "./article";
6
+ export { BlogIndex } from "./blog-index";
7
+ export type { BlogIndexProps } from "./blog-index";
8
+ export { createSource, LocalSource, HjdApiSource } from "./adapters";
9
+ export type { ContentSource, PostMeta, PostWithBody, PostFrontmatter, } from "./adapters";
10
+ export { RenderArticleBody } from "./mdx/render";
11
+ export { blogComponents, kitComponents, aliasComponents, BlogBehaviors } from "../react";
12
+ export * from "./index-core";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../package/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EACV,aAAa,EACb,cAAc,EACd,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrE,YAAY,EACV,aAAa,EACb,QAAQ,EACR,YAAY,EACZ,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzF,cAAc,cAAc,CAAC"}
@@ -0,0 +1,25 @@
1
+ /* ============================================================
2
+ @highjumpdigitalsoftware/blog-kit — public entry
3
+ ------------------------------------------------------------
4
+ A site uses this to build its /blog routes:
5
+
6
+ import { defineConfig, Article, BlogIndex } from "@highjumpdigitalsoftware/blog-kit";
7
+ import "@highjumpdigitalsoftware/blog-kit/styles.css"; // kit CSS once
8
+
9
+ The component map + <BlogBehaviors> are also exported for sites
10
+ that hand-roll their own route around <MDXRemote>.
11
+ ============================================================ */
12
+ // Config
13
+ export { defineConfig } from "./config/define.js";
14
+ export { resolveConfig } from "./config/resolve.js";
15
+ // Route surfaces (RSC)
16
+ export { Article, getArticle } from "./article.js";
17
+ export { BlogIndex } from "./blog-index.js";
18
+ // Source adapters (the swap point)
19
+ export { createSource, LocalSource, HjdApiSource } from "./adapters/index.js";
20
+ // MDX render surface + the component map (for hand-rolled routes)
21
+ export { RenderArticleBody } from "./mdx/render.js";
22
+ export { blogComponents, kitComponents, aliasComponents, BlogBehaviors } from "../react/index.js";
23
+ // Pure listing helpers (re-exported for category/pagination routes)
24
+ export * from "./index-core.js";
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../package/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;kEAUkE;AAElE,SAAS;AACT,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAajD,uBAAuB;AACvB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEhD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,mCAAmC;AACnC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQrE,kEAAkE;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzF,oEAAoE;AACpE,cAAc,cAAc,CAAC"}
@@ -0,0 +1,18 @@
1
+ export interface RenderMdxToHtmlOptions {
2
+ /** Extra/override components merged over the kit map (per-site customs). */
3
+ components?: Record<string, unknown>;
4
+ }
5
+ /**
6
+ * Compile + render a raw MDX-with-components body to a static HTML string,
7
+ * using the kit's React component map. Safe to call per request on an SSR
8
+ * host (Astro `output: 'server'`/hybrid). Returns ready-to-inject HTML for
9
+ * `<div class="blog-root"><div class="bk-prose" set:html={html} /></div>`.
10
+ *
11
+ * NB: rehype-pretty-code is intentionally omitted here (it is heavyweight and
12
+ * the kit's CodeSnippet behaviour styles code blocks client-side anyway). The
13
+ * remark/rehype set matches the kit's slug + autolink headings so the
14
+ * TableOfContents scrollspy finds anchored headings, identical to the Next
15
+ * render path minus the syntax-highlight pass.
16
+ */
17
+ export declare function renderMdxToHtml(source: string, opts?: RenderMdxToHtmlOptions): Promise<string>;
18
+ //# sourceMappingURL=render-astro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-astro.d.ts","sourceRoot":"","sources":["../../../package/mdx/render-astro.ts"],"names":[],"mappings":"AAyCA,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
@@ -0,0 +1,75 @@
1
+ /* ============================================================
2
+ Runtime MDX render for ASTRO (and any non-Next SSR host).
3
+ ------------------------------------------------------------
4
+ THE hard part of the Astro managed path. Astro's first-party
5
+ MDX (@astrojs/mdx) is a BUILD-TIME Vite plugin — it compiles
6
+ `.mdx` files in the project tree into Astro components at build,
7
+ and CANNOT compile a remote MDX *string* fetched at request time.
8
+ The managed promise ("new posts appear with no redeploy") needs
9
+ a string compiled at request/refresh time.
10
+
11
+ So this path compiles the MDX with @mdx-js/mdx at request time and
12
+ renders it with the kit's React component map (byte-identical to
13
+ the Astro components — same core/ CSS + markup) to a static HTML
14
+ string, which the Astro route injects via `set:html`. No Vite, no
15
+ content collection, no build step, no React hydration island: the
16
+ output is pure server-rendered HTML, so it is eject-identical and
17
+ SEO-correct. Interactive components are activated by
18
+ astro/BlogBehaviors.astro (vanilla JS), exactly as in the vendored
19
+ Astro path.
20
+
21
+ Why React components and not the .astro ones? `.astro` components
22
+ can only be rendered through Astro's own renderer (build/Vite). The
23
+ kit's React components emit the SAME markup + classes as the .astro
24
+ ones (the kit is deliberately dual-framework over one shared core),
25
+ so rendering the React map server-side yields identical HTML — and
26
+ reuses the proven runtime-MDX pipeline (the same @mdx-js/mdx engine
27
+ that next-mdx-remote uses under the hood on the Next path).
28
+
29
+ blockJS is NOT a concept here (that's a next-mdx-remote option);
30
+ @mdx-js/mdx passes JSX-expression attributes (`score={8}`) through
31
+ natively, which is the behaviour the kit components rely on.
32
+ ============================================================ */
33
+ import { compile, run } from "@mdx-js/mdx";
34
+ import * as runtime from "react/jsx-runtime";
35
+ import { createElement } from "react";
36
+ import { renderToStaticMarkup } from "react-dom/server";
37
+ import remarkGfm from "remark-gfm";
38
+ import rehypeSlug from "rehype-slug";
39
+ import rehypeAutolinkHeadings from "rehype-autolink-headings";
40
+ import { blogComponents } from "../../react/components-map.js";
41
+ /**
42
+ * Compile + render a raw MDX-with-components body to a static HTML string,
43
+ * using the kit's React component map. Safe to call per request on an SSR
44
+ * host (Astro `output: 'server'`/hybrid). Returns ready-to-inject HTML for
45
+ * `<div class="blog-root"><div class="bk-prose" set:html={html} /></div>`.
46
+ *
47
+ * NB: rehype-pretty-code is intentionally omitted here (it is heavyweight and
48
+ * the kit's CodeSnippet behaviour styles code blocks client-side anyway). The
49
+ * remark/rehype set matches the kit's slug + autolink headings so the
50
+ * TableOfContents scrollspy finds anchored headings, identical to the Next
51
+ * render path minus the syntax-highlight pass.
52
+ */
53
+ export async function renderMdxToHtml(source, opts = {}) {
54
+ const map = opts.components
55
+ ? { ...blogComponents, ...opts.components }
56
+ : blogComponents;
57
+ const compiled = await compile(source, {
58
+ outputFormat: "function-body",
59
+ // development:false keeps the runtime import surface to react/jsx-runtime
60
+ development: false,
61
+ remarkPlugins: [remarkGfm],
62
+ rehypePlugins: [
63
+ rehypeSlug,
64
+ [rehypeAutolinkHeadings, { behavior: "wrap" }],
65
+ ],
66
+ });
67
+ // `run` evaluates the compiled function-body against the React jsx runtime.
68
+ const mod = (await run(String(compiled), {
69
+ ...runtime,
70
+ baseUrl: import.meta.url,
71
+ }));
72
+ const element = createElement(mod.default, { components: map });
73
+ return renderToStaticMarkup(element);
74
+ }
75
+ //# sourceMappingURL=render-astro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-astro.js","sourceRoot":"","sources":["../../../package/mdx/render-astro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kEA+BkE;AAClE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAO5D;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAc,EACd,OAA+B,EAAE;IAEjC,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU;QACzB,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE;QAC3C,CAAC,CAAC,cAAc,CAAC;IAEnB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;QACrC,YAAY,EAAE,eAAe;QAC7B,0EAA0E;QAC1E,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,CAAC,SAAS,CAAC;QAC1B,aAAa,EAAE;YACb,UAAU;YACV,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;SAC/C;KACF,CAAC,CAAC;IAEH,4EAA4E;IAC5E,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QACvC,GAAI,OAAmC;QACvC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;KAChB,CAAC,CAA8E,CAAC;IAE1F,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,OAAgB,EAAE,EAAE,UAAU,EAAE,GAAG,EAAW,CAAC,CAAC;IAClF,OAAO,oBAAoB,CAAC,OAAgB,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface RenderArticleBodyProps {
2
+ /** Raw MDX-with-components source (frontmatter already stripped). */
3
+ source: string;
4
+ /** Extra/override components to merge over the kit map (per-site customs). */
5
+ components?: Record<string, unknown>;
6
+ }
7
+ /**
8
+ * Render an MDX body with the blog-kit component map. This is the
9
+ * single compile path shared by every source mode — local OR remote
10
+ * MDX flows through here, which is why eject renders identically.
11
+ */
12
+ export declare function RenderArticleBody({ source, components }: RenderArticleBodyProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../package/mdx/render.tsx"],"names":[],"mappings":"AAgBA,MAAM,WAAW,sBAAsB;IACrC,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,8EAA8E;IAC9E,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,sBAAsB,+BAoB/E"}
@@ -0,0 +1,37 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /* ============================================================
3
+ MDX render surface (RSC).
4
+ Wraps next-mdx-remote/rsc <MDXRemote> with the EXACT options
5
+ the two live consumers use, so MDX-with-components compiled at
6
+ request/build time renders identically here.
7
+
8
+ blockJS:false is load-bearing — it lets JSX-expression attrs
9
+ like score={8} pass through (proven in hjd-website's route).
10
+ ============================================================ */
11
+ import { MDXRemote } from "next-mdx-remote/rsc";
12
+ import remarkGfm from "remark-gfm";
13
+ import rehypeSlug from "rehype-slug";
14
+ import rehypeAutolinkHeadings from "rehype-autolink-headings";
15
+ import rehypePrettyCode from "rehype-pretty-code";
16
+ import { blogComponents } from "../../react/index.js";
17
+ /**
18
+ * Render an MDX body with the blog-kit component map. This is the
19
+ * single compile path shared by every source mode — local OR remote
20
+ * MDX flows through here, which is why eject renders identically.
21
+ */
22
+ export function RenderArticleBody({ source, components }) {
23
+ const map = components ? { ...blogComponents, ...components } : blogComponents;
24
+ return (_jsx(MDXRemote, { source: source, components: map, options: {
25
+ // v6 + blockJS:false so JSX-expression attributes pass through.
26
+ blockJS: false,
27
+ mdxOptions: {
28
+ remarkPlugins: [remarkGfm],
29
+ rehypePlugins: [
30
+ rehypeSlug,
31
+ [rehypeAutolinkHeadings, { behavior: "wrap" }],
32
+ [rehypePrettyCode, { theme: "one-dark-pro" }],
33
+ ],
34
+ },
35
+ } }));
36
+ }
37
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../package/mdx/render.tsx"],"names":[],"mappings":";AAAA;;;;;;;;kEAQkE;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,SAAS,MAAM,YAAY,CAAC;AACnC,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,sBAAsB,MAAM,0BAA0B,CAAC;AAC9D,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAS7C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,MAAM,EAAE,UAAU,EAA0B;IAC9E,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC;IAC/E,OAAO,CACL,KAAC,SAAS,IACR,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,GAAU,EACtB,OAAO,EAAE;YACP,gEAAgE;YAChE,OAAO,EAAE,KAAK;YACd,UAAU,EAAE;gBACV,aAAa,EAAE,CAAC,SAAS,CAAC;gBAC1B,aAAa,EAAE;oBACb,UAAU;oBACV,CAAC,sBAAsB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;oBAC9C,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC;iBAC9C;aACF;SACF,GACD,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ export interface AdPreviewProps {
2
+ /** Which ad style to render. Defaults to "meta". */
3
+ platform?: "meta" | "google";
4
+ /** Advertiser name; its first two letters seed the round avatar. */
5
+ brand?: string;
6
+ /** Small label under the brand name. Defaults to "Sponsored". */
7
+ sponsored?: string;
8
+ /** Ad body copy. HTML allowed (e.g. <strong>, <br/>). */
9
+ copy?: string;
10
+ /** Optional creative image URL for the media panel. */
11
+ image?: string;
12
+ /** CTA button label. Defaults to "Learn more". */
13
+ buttonText?: string;
14
+ /** Display site/domain (footer for meta, header line for google). */
15
+ site?: string;
16
+ /** Display URL breadcrumb. HTML allowed — wrap the domain in <strong>. */
17
+ url?: string;
18
+ /** The blue clickable headline. Plain text. */
19
+ headline?: string;
20
+ /** Description line under the headline. Plain text. */
21
+ description?: string;
22
+ /** Optional sitelink labels shown in a dashed-divider row. */
23
+ sitelinks?: string[];
24
+ }
25
+ export declare function AdPreview({ platform, brand, sponsored, copy, image, site, buttonText, headline, url, description, sitelinks, }: AdPreviewProps): import("react").JSX.Element;
26
+ //# sourceMappingURL=AdPreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdPreview.d.ts","sourceRoot":"","sources":["../../react/AdPreview.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAG7B,oEAAoE;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yDAAyD;IACzD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IAGd,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,SAAS,CAAC,EACxB,QAAiB,EACjB,KAAK,EACL,SAAuB,EACvB,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,GAAG,EACH,WAAW,EACX,SAAS,GACV,EAAE,cAAc,+BAwChB"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function AdPreview({ platform = "meta", brand, sponsored = "Sponsored", copy, image, site, buttonText, headline, url, description, sitelinks, }) {
3
+ if (platform === "google") {
4
+ return (_jsxs("div", { className: "bk-ad-preview bk-ad-preview--google", children: [_jsxs("div", { className: "bk-ad-preview__g-head", children: [_jsx("span", { className: "bk-ad-preview__g-tag", children: "Ad" }), _jsx("span", { className: "bk-ad-preview__g-dot", "aria-hidden": "true", children: "\u00B7" }), _jsx("span", { className: "bk-ad-preview__g-site", children: site })] }), _jsx("div", { className: "bk-ad-preview__g-url", dangerouslySetInnerHTML: { __html: url || "" } }), _jsx("h4", { className: "bk-ad-preview__g-headline", children: headline }), _jsx("p", { className: "bk-ad-preview__g-desc", children: description }), sitelinks && sitelinks.length > 0 && (_jsx("div", { className: "bk-ad-preview__g-sitelinks", children: sitelinks.map((s) => (_jsx("span", { className: "bk-ad-preview__g-sitelink", children: s }, s))) }))] }));
5
+ }
6
+ return (_jsxs("div", { className: "bk-ad-preview", children: [_jsxs("div", { className: "bk-ad-preview__head", children: [_jsx("div", { className: "bk-ad-preview__avatar", children: (brand || "").slice(0, 2).toUpperCase() }), _jsxs("div", { className: "bk-ad-preview__head-text", children: [_jsx("div", { className: "bk-ad-preview__brand", children: brand }), _jsx("div", { className: "bk-ad-preview__sponsored", children: sponsored })] })] }), _jsx("div", { className: "bk-ad-preview__copy", dangerouslySetInnerHTML: { __html: copy || "" } }), _jsx("div", { className: "bk-ad-preview__media", children: image && _jsx("img", { src: image, alt: "" }) }), _jsxs("div", { className: "bk-ad-preview__cta", children: [_jsx("div", { className: "bk-ad-preview__site", children: _jsx("strong", { children: site }) }), _jsx("button", { className: "bk-ad-preview__btn", type: "button", children: buttonText || "Learn more" })] })] }));
7
+ }
8
+ //# sourceMappingURL=AdPreview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdPreview.js","sourceRoot":"","sources":["../../react/AdPreview.tsx"],"names":[],"mappings":";AAyCA,MAAM,UAAU,SAAS,CAAC,EACxB,QAAQ,GAAG,MAAM,EACjB,KAAK,EACL,SAAS,GAAG,WAAW,EACvB,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,GAAG,EACH,WAAW,EACX,SAAS,GACM;IACf,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,CACL,eAAK,SAAS,EAAC,qCAAqC,aAClD,eAAK,SAAS,EAAC,uBAAuB,aACpC,eAAM,SAAS,EAAC,sBAAsB,mBAAU,EAChD,eAAM,SAAS,EAAC,sBAAsB,iBAAa,MAAM,uBAAS,EAClE,eAAM,SAAS,EAAC,uBAAuB,YAAE,IAAI,GAAQ,IACjD,EACN,cAAK,SAAS,EAAC,sBAAsB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,EAAE,GAAI,EACxF,aAAI,SAAS,EAAC,2BAA2B,YAAE,QAAQ,GAAM,EACzD,YAAG,SAAS,EAAC,uBAAuB,YAAE,WAAW,GAAK,EACrD,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CACpC,cAAK,SAAS,EAAC,4BAA4B,YACxC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACpB,eAAc,SAAS,EAAC,2BAA2B,YAAE,CAAC,IAA3C,CAAC,CAAkD,CAC/D,CAAC,GACE,CACP,IACG,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAC,eAAe,aAC5B,eAAK,SAAS,EAAC,qBAAqB,aAClC,cAAK,SAAS,EAAC,uBAAuB,YAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,GAAO,EACtF,eAAK,SAAS,EAAC,0BAA0B,aACvC,cAAK,SAAS,EAAC,sBAAsB,YAAE,KAAK,GAAO,EACnD,cAAK,SAAS,EAAC,0BAA0B,YAAE,SAAS,GAAO,IACvD,IACF,EACN,cAAK,SAAS,EAAC,qBAAqB,EAAC,uBAAuB,EAAE,EAAE,MAAM,EAAE,IAAI,IAAI,EAAE,EAAE,GAAI,EACxF,cAAK,SAAS,EAAC,sBAAsB,YAAE,KAAK,IAAI,cAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAC,EAAE,GAAG,GAAO,EACjF,eAAK,SAAS,EAAC,oBAAoB,aACjC,cAAK,SAAS,EAAC,qBAAqB,YAAC,2BAAS,IAAI,GAAU,GAAM,EAClE,iBAAQ,SAAS,EAAC,oBAAoB,EAAC,IAAI,EAAC,QAAQ,YAAE,UAAU,IAAI,YAAY,GAAU,IACtF,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { ReactNode } from "react";
2
+ export interface AdPreviewPairProps {
3
+ /** The ad cards to lay out side by side (typically two). */
4
+ children?: ReactNode;
5
+ }
6
+ export declare function AdPreviewPair({ children }: AdPreviewPairProps): import("react").JSX.Element;
7
+ //# sourceMappingURL=AdPreviewPair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdPreviewPair.d.ts","sourceRoot":"","sources":["../../react/AdPreviewPair.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB,+BAE7D"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export function AdPreviewPair({ children }) {
3
+ return _jsx("div", { className: "bk-ad-preview-pair", children: children });
4
+ }
5
+ //# sourceMappingURL=AdPreviewPair.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdPreviewPair.js","sourceRoot":"","sources":["../../react/AdPreviewPair.tsx"],"names":[],"mappings":";AAaA,MAAM,UAAU,aAAa,CAAC,EAAE,QAAQ,EAAsB;IAC5D,OAAO,cAAK,SAAS,EAAC,oBAAoB,YAAE,QAAQ,GAAO,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type AuditFindingSeverity = "high" | "med" | "low";
2
+ export interface AuditFindingRow {
3
+ title: string;
4
+ description?: string;
5
+ /** Pill-shaped count shown on the right (string or number). */
6
+ count?: string | number;
7
+ /** Severity tone of the leading dot. Defaults to "med". */
8
+ severity?: AuditFindingSeverity;
9
+ }
10
+ export interface AuditFindingsProps {
11
+ rows?: AuditFindingRow[];
12
+ }
13
+ export declare function AuditFindings({ rows }: AuditFindingsProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=AuditFindings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditFindings.d.ts","sourceRoot":"","sources":["../../react/AuditFindings.tsx"],"names":[],"mappings":"AASA,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAS,EAAE,EAAE,kBAAkB,+BAkB9D"}
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ export function AuditFindings({ rows = [] }) {
3
+ return (_jsx("div", { className: "bk-audit-findings", children: rows.map((r, i) => (_jsxs("div", { className: "bk-audit-findings__row", children: [_jsx("span", { className: `bk-audit-findings__sev bk-audit-findings__sev--${r.severity || "med"}`, "aria-hidden": "true" }), _jsxs("div", { className: "bk-audit-findings__body", children: [_jsx("div", { className: "bk-audit-findings__title", children: r.title }), r.description && _jsx("div", { className: "bk-audit-findings__desc", children: r.description })] }), r.count != null && _jsx("span", { className: "bk-audit-findings__count", children: r.count })] }, i))) }));
4
+ }
5
+ //# sourceMappingURL=AuditFindings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditFindings.js","sourceRoot":"","sources":["../../react/AuditFindings.tsx"],"names":[],"mappings":";AAwBA,MAAM,UAAU,aAAa,CAAC,EAAE,IAAI,GAAG,EAAE,EAAsB;IAC7D,OAAO,CACL,cAAK,SAAS,EAAC,mBAAmB,YAC/B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAClB,eAAa,SAAS,EAAC,wBAAwB,aAC7C,eACE,SAAS,EAAE,kDAAkD,CAAC,CAAC,QAAQ,IAAI,KAAK,EAAE,iBACtE,MAAM,GAClB,EACF,eAAK,SAAS,EAAC,yBAAyB,aACtC,cAAK,SAAS,EAAC,0BAA0B,YAAE,CAAC,CAAC,KAAK,GAAO,EACxD,CAAC,CAAC,WAAW,IAAI,cAAK,SAAS,EAAC,yBAAyB,YAAE,CAAC,CAAC,WAAW,GAAO,IAC5E,EACL,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,eAAM,SAAS,EAAC,0BAA0B,YAAE,CAAC,CAAC,KAAK,GAAQ,KATvE,CAAC,CAUL,CACP,CAAC,GACE,CACP,CAAC;AACJ,CAAC"}