@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.
- package/INTEGRATION.md +76 -0
- package/LICENSE +74 -0
- package/README.md +102 -0
- package/astro/AdPreview.astro +64 -0
- package/astro/AdPreviewPair.astro +10 -0
- package/astro/AuditFindings.astro +29 -0
- package/astro/AuditScores.astro +60 -0
- package/astro/AuthorCard.astro +32 -0
- package/astro/BeforeAfter.astro +26 -0
- package/astro/BlogBehaviors.astro +15 -0
- package/astro/CTABanner.astro +28 -0
- package/astro/CalloutBox.astro +28 -0
- package/astro/CaseStudyHero.astro +45 -0
- package/astro/ChannelMixBars.astro +33 -0
- package/astro/Checklist.astro +24 -0
- package/astro/ChecklistItem.astro +15 -0
- package/astro/CodeSnippet.astro +20 -0
- package/astro/ComparisonTable.astro +103 -0
- package/astro/Definition.astro +30 -0
- package/astro/DeliveryComparison.astro +40 -0
- package/astro/FAQList.astro +43 -0
- package/astro/FurtherReading.astro +34 -0
- package/astro/ImageFeature.astro +22 -0
- package/astro/Infographic.astro +12 -0
- package/astro/KeyMetric.astro +40 -0
- package/astro/KeywordTable.astro +69 -0
- package/astro/List.astro +46 -0
- package/astro/MetricHighlight.astro +77 -0
- package/astro/NewsletterCTA.astro +40 -0
- package/astro/NumberedCard.astro +6 -0
- package/astro/ProConBlock.astro +38 -0
- package/astro/ProseList.astro +46 -0
- package/astro/QuoteBlock.astro +72 -0
- package/astro/RegionCallout.astro +24 -0
- package/astro/RelatedPosts.astro +47 -0
- package/astro/ResultsStrip.astro +59 -0
- package/astro/ScoreBar.astro +19 -0
- package/astro/SerpPreview.astro +35 -0
- package/astro/ServicePromoCard.astro +21 -0
- package/astro/StatCard.astro +48 -0
- package/astro/StepBlock.astro +5 -0
- package/astro/TableOfContents.astro +12 -0
- package/astro/TimelineBlock.astro +30 -0
- package/astro/TipBox.astro +14 -0
- package/astro/TrafficChart.astro +61 -0
- package/astro/VerdictCard.astro +48 -0
- package/astro/blogkit/Article.astro +63 -0
- package/astro/blogkit/BlogIndex.astro +144 -0
- package/core/behaviors/code.js +78 -0
- package/core/behaviors/comparison.js +52 -0
- package/core/behaviors/delivery-comparison.js +52 -0
- package/core/behaviors/faq.js +61 -0
- package/core/behaviors/index.d.ts +3 -0
- package/core/behaviors/index.js +35 -0
- package/core/behaviors/keyword-table.js +52 -0
- package/core/behaviors/toc.js +130 -0
- package/core/css/base.css +146 -0
- package/core/css/components.css +2632 -0
- package/core/css/index-listing.css +207 -0
- package/core/css/index.css +13 -0
- package/core/css/tokens.css +127 -0
- package/core/icons.ts +20 -0
- package/core/lib.ts +70 -0
- package/core/manifest/components.json +573 -0
- package/core/manifest/frontmatter.json +19 -0
- package/core/manifest/templates.json +77 -0
- package/dist/core/behaviors/code.js +78 -0
- package/dist/core/behaviors/comparison.js +52 -0
- package/dist/core/behaviors/delivery-comparison.js +52 -0
- package/dist/core/behaviors/faq.js +61 -0
- package/dist/core/behaviors/index.d.ts +3 -0
- package/dist/core/behaviors/index.js +35 -0
- package/dist/core/behaviors/keyword-table.js +52 -0
- package/dist/core/behaviors/toc.js +130 -0
- package/dist/core/css/base.css +146 -0
- package/dist/core/css/components.css +2632 -0
- package/dist/core/css/index-listing.css +207 -0
- package/dist/core/css/index.css +13 -0
- package/dist/core/css/tokens.css +127 -0
- package/dist/core/icons.d.ts +2 -0
- package/dist/core/icons.d.ts.map +1 -0
- package/dist/core/icons.js +20 -0
- package/dist/core/icons.js.map +1 -0
- package/dist/core/lib.d.ts +21 -0
- package/dist/core/lib.d.ts.map +1 -0
- package/dist/core/lib.js +57 -0
- package/dist/core/lib.js.map +1 -0
- package/dist/core/manifest/components.json +573 -0
- package/dist/core/manifest/frontmatter.json +19 -0
- package/dist/core/manifest/templates.json +77 -0
- package/dist/package/adapters/hjd-api.d.ts +14 -0
- package/dist/package/adapters/hjd-api.d.ts.map +1 -0
- package/dist/package/adapters/hjd-api.js +57 -0
- package/dist/package/adapters/hjd-api.js.map +1 -0
- package/dist/package/adapters/index.d.ts +13 -0
- package/dist/package/adapters/index.d.ts.map +1 -0
- package/dist/package/adapters/index.js +16 -0
- package/dist/package/adapters/index.js.map +1 -0
- package/dist/package/adapters/local.d.ts +13 -0
- package/dist/package/adapters/local.d.ts.map +1 -0
- package/dist/package/adapters/local.js +72 -0
- package/dist/package/adapters/local.js.map +1 -0
- package/dist/package/adapters/source.d.ts +39 -0
- package/dist/package/adapters/source.d.ts.map +1 -0
- package/dist/package/adapters/source.js +19 -0
- package/dist/package/adapters/source.js.map +1 -0
- package/dist/package/article.d.ts +17 -0
- package/dist/package/article.d.ts.map +1 -0
- package/dist/package/article.js +37 -0
- package/dist/package/article.js.map +1 -0
- package/dist/package/astro/data.d.ts +45 -0
- package/dist/package/astro/data.d.ts.map +1 -0
- package/dist/package/astro/data.js +81 -0
- package/dist/package/astro/data.js.map +1 -0
- package/dist/package/astro/freshness.d.ts +11 -0
- package/dist/package/astro/freshness.d.ts.map +1 -0
- package/dist/package/astro/freshness.js +48 -0
- package/dist/package/astro/freshness.js.map +1 -0
- package/dist/package/astro/index.d.ts +12 -0
- package/dist/package/astro/index.d.ts.map +1 -0
- package/dist/package/astro/index.js +31 -0
- package/dist/package/astro/index.js.map +1 -0
- package/dist/package/blog-index.d.ts +10 -0
- package/dist/package/blog-index.d.ts.map +1 -0
- package/dist/package/blog-index.js +27 -0
- package/dist/package/blog-index.js.map +1 -0
- package/dist/package/cli/exchange.d.ts +27 -0
- package/dist/package/cli/exchange.d.ts.map +1 -0
- package/dist/package/cli/exchange.js +94 -0
- package/dist/package/cli/exchange.js.map +1 -0
- package/dist/package/cli/index.d.ts +3 -0
- package/dist/package/cli/index.d.ts.map +1 -0
- package/dist/package/cli/index.js +301 -0
- package/dist/package/cli/index.js.map +1 -0
- package/dist/package/config/define.d.ts +13 -0
- package/dist/package/config/define.d.ts.map +1 -0
- package/dist/package/config/define.js +14 -0
- package/dist/package/config/define.js.map +1 -0
- package/dist/package/config/resolve.d.ts +11 -0
- package/dist/package/config/resolve.d.ts.map +1 -0
- package/dist/package/config/resolve.js +43 -0
- package/dist/package/config/resolve.js.map +1 -0
- package/dist/package/config/types.d.ts +74 -0
- package/dist/package/config/types.d.ts.map +1 -0
- package/dist/package/config/types.js +13 -0
- package/dist/package/config/types.js.map +1 -0
- package/dist/package/index-core.d.ts +28 -0
- package/dist/package/index-core.d.ts.map +1 -0
- package/dist/package/index-core.js +102 -0
- package/dist/package/index-core.js.map +1 -0
- package/dist/package/index.d.ts +13 -0
- package/dist/package/index.d.ts.map +1 -0
- package/dist/package/index.js +25 -0
- package/dist/package/index.js.map +1 -0
- package/dist/package/mdx/render-astro.d.ts +18 -0
- package/dist/package/mdx/render-astro.d.ts.map +1 -0
- package/dist/package/mdx/render-astro.js +75 -0
- package/dist/package/mdx/render-astro.js.map +1 -0
- package/dist/package/mdx/render.d.ts +13 -0
- package/dist/package/mdx/render.d.ts.map +1 -0
- package/dist/package/mdx/render.js +37 -0
- package/dist/package/mdx/render.js.map +1 -0
- package/dist/react/AdPreview.d.ts +26 -0
- package/dist/react/AdPreview.d.ts.map +1 -0
- package/dist/react/AdPreview.js +8 -0
- package/dist/react/AdPreview.js.map +1 -0
- package/dist/react/AdPreviewPair.d.ts +7 -0
- package/dist/react/AdPreviewPair.d.ts.map +1 -0
- package/dist/react/AdPreviewPair.js +5 -0
- package/dist/react/AdPreviewPair.js.map +1 -0
- package/dist/react/AuditFindings.d.ts +14 -0
- package/dist/react/AuditFindings.d.ts.map +1 -0
- package/dist/react/AuditFindings.js +5 -0
- package/dist/react/AuditFindings.js.map +1 -0
- package/dist/react/AuditScores.d.ts +12 -0
- package/dist/react/AuditScores.d.ts.map +1 -0
- package/dist/react/AuditScores.js +25 -0
- package/dist/react/AuditScores.js.map +1 -0
- package/dist/react/AuthorCard.d.ts +10 -0
- package/dist/react/AuthorCard.d.ts.map +1 -0
- package/dist/react/AuthorCard.js +6 -0
- package/dist/react/AuthorCard.js.map +1 -0
- package/dist/react/BeforeAfter.d.ts +12 -0
- package/dist/react/BeforeAfter.d.ts.map +1 -0
- package/dist/react/BeforeAfter.js +7 -0
- package/dist/react/BeforeAfter.js.map +1 -0
- package/dist/react/BlogBehaviors.d.ts +10 -0
- package/dist/react/BlogBehaviors.d.ts.map +1 -0
- package/dist/react/BlogBehaviors.js +20 -0
- package/dist/react/BlogBehaviors.js.map +1 -0
- package/dist/react/CTABanner.d.ts +8 -0
- package/dist/react/CTABanner.d.ts.map +1 -0
- package/dist/react/CTABanner.js +9 -0
- package/dist/react/CTABanner.js.map +1 -0
- package/dist/react/CalloutBox.d.ts +13 -0
- package/dist/react/CalloutBox.d.ts.map +1 -0
- package/dist/react/CalloutBox.js +9 -0
- package/dist/react/CalloutBox.js.map +1 -0
- package/dist/react/CaseStudyHero.d.ts +20 -0
- package/dist/react/CaseStudyHero.d.ts.map +1 -0
- package/dist/react/CaseStudyHero.js +7 -0
- package/dist/react/CaseStudyHero.js.map +1 -0
- package/dist/react/ChannelMixBars.d.ts +18 -0
- package/dist/react/ChannelMixBars.d.ts.map +1 -0
- package/dist/react/ChannelMixBars.js +6 -0
- package/dist/react/ChannelMixBars.js.map +1 -0
- package/dist/react/Checklist.d.ts +10 -0
- package/dist/react/Checklist.d.ts.map +1 -0
- package/dist/react/Checklist.js +7 -0
- package/dist/react/Checklist.js.map +1 -0
- package/dist/react/ChecklistItem.d.ts +7 -0
- package/dist/react/ChecklistItem.d.ts.map +1 -0
- package/dist/react/ChecklistItem.js +5 -0
- package/dist/react/ChecklistItem.js.map +1 -0
- package/dist/react/CodeSnippet.d.ts +17 -0
- package/dist/react/CodeSnippet.d.ts.map +1 -0
- package/dist/react/CodeSnippet.js +14 -0
- package/dist/react/CodeSnippet.js.map +1 -0
- package/dist/react/ComparisonTable.d.ts +22 -0
- package/dist/react/ComparisonTable.d.ts.map +1 -0
- package/dist/react/ComparisonTable.js +35 -0
- package/dist/react/ComparisonTable.js.map +1 -0
- package/dist/react/Definition.d.ts +9 -0
- package/dist/react/Definition.d.ts.map +1 -0
- package/dist/react/Definition.js +19 -0
- package/dist/react/Definition.js.map +1 -0
- package/dist/react/DeliveryComparison.d.ts +16 -0
- package/dist/react/DeliveryComparison.d.ts.map +1 -0
- package/dist/react/DeliveryComparison.js +7 -0
- package/dist/react/DeliveryComparison.js.map +1 -0
- package/dist/react/FAQList.d.ts +20 -0
- package/dist/react/FAQList.d.ts.map +1 -0
- package/dist/react/FAQList.js +19 -0
- package/dist/react/FAQList.js.map +1 -0
- package/dist/react/FurtherReading.d.ts +21 -0
- package/dist/react/FurtherReading.d.ts.map +1 -0
- package/dist/react/FurtherReading.js +13 -0
- package/dist/react/FurtherReading.js.map +1 -0
- package/dist/react/ImageFeature.d.ts +9 -0
- package/dist/react/ImageFeature.d.ts.map +1 -0
- package/dist/react/ImageFeature.js +6 -0
- package/dist/react/ImageFeature.js.map +1 -0
- package/dist/react/Infographic.d.ts +6 -0
- package/dist/react/Infographic.d.ts.map +1 -0
- package/dist/react/Infographic.js +7 -0
- package/dist/react/Infographic.js.map +1 -0
- package/dist/react/KeyMetric.d.ts +16 -0
- package/dist/react/KeyMetric.d.ts.map +1 -0
- package/dist/react/KeyMetric.js +15 -0
- package/dist/react/KeyMetric.js.map +1 -0
- package/dist/react/KeywordTable.d.ts +18 -0
- package/dist/react/KeywordTable.d.ts.map +1 -0
- package/dist/react/KeywordTable.js +23 -0
- package/dist/react/KeywordTable.js.map +1 -0
- package/dist/react/List.d.ts +11 -0
- package/dist/react/List.d.ts.map +1 -0
- package/dist/react/List.js +21 -0
- package/dist/react/List.js.map +1 -0
- package/dist/react/MetricHighlight.d.ts +15 -0
- package/dist/react/MetricHighlight.d.ts.map +1 -0
- package/dist/react/MetricHighlight.js +26 -0
- package/dist/react/MetricHighlight.js.map +1 -0
- package/dist/react/NewsletterCTA.d.ts +9 -0
- package/dist/react/NewsletterCTA.d.ts.map +1 -0
- package/dist/react/NewsletterCTA.js +5 -0
- package/dist/react/NewsletterCTA.js.map +1 -0
- package/dist/react/NumberedCard.d.ts +9 -0
- package/dist/react/NumberedCard.d.ts.map +1 -0
- package/dist/react/NumberedCard.js +7 -0
- package/dist/react/NumberedCard.js.map +1 -0
- package/dist/react/ProConBlock.d.ts +6 -0
- package/dist/react/ProConBlock.d.ts.map +1 -0
- package/dist/react/ProConBlock.js +7 -0
- package/dist/react/ProConBlock.js.map +1 -0
- package/dist/react/ProseList.d.ts +17 -0
- package/dist/react/ProseList.d.ts.map +1 -0
- package/dist/react/ProseList.js +26 -0
- package/dist/react/ProseList.js.map +1 -0
- package/dist/react/QuoteBlock.d.ts +17 -0
- package/dist/react/QuoteBlock.d.ts.map +1 -0
- package/dist/react/QuoteBlock.js +26 -0
- package/dist/react/QuoteBlock.js.map +1 -0
- package/dist/react/RegionCallout.d.ts +13 -0
- package/dist/react/RegionCallout.d.ts.map +1 -0
- package/dist/react/RegionCallout.js +5 -0
- package/dist/react/RegionCallout.js.map +1 -0
- package/dist/react/RelatedPosts.d.ts +20 -0
- package/dist/react/RelatedPosts.d.ts.map +1 -0
- package/dist/react/RelatedPosts.js +7 -0
- package/dist/react/RelatedPosts.js.map +1 -0
- package/dist/react/ResultsStrip.d.ts +18 -0
- package/dist/react/ResultsStrip.d.ts.map +1 -0
- package/dist/react/ResultsStrip.js +22 -0
- package/dist/react/ResultsStrip.js.map +1 -0
- package/dist/react/ScoreBar.d.ts +8 -0
- package/dist/react/ScoreBar.d.ts.map +1 -0
- package/dist/react/ScoreBar.js +6 -0
- package/dist/react/ScoreBar.js.map +1 -0
- package/dist/react/SerpPreview.d.ts +18 -0
- package/dist/react/SerpPreview.d.ts.map +1 -0
- package/dist/react/SerpPreview.js +13 -0
- package/dist/react/SerpPreview.js.map +1 -0
- package/dist/react/ServicePromoCard.d.ts +14 -0
- package/dist/react/ServicePromoCard.d.ts.map +1 -0
- package/dist/react/ServicePromoCard.js +12 -0
- package/dist/react/ServicePromoCard.js.map +1 -0
- package/dist/react/StatCard.d.ts +13 -0
- package/dist/react/StatCard.d.ts.map +1 -0
- package/dist/react/StatCard.js +20 -0
- package/dist/react/StatCard.js.map +1 -0
- package/dist/react/StepBlock.d.ts +8 -0
- package/dist/react/StepBlock.d.ts.map +1 -0
- package/dist/react/StepBlock.js +5 -0
- package/dist/react/StepBlock.js.map +1 -0
- package/dist/react/TableOfContents.d.ts +14 -0
- package/dist/react/TableOfContents.d.ts.map +1 -0
- package/dist/react/TableOfContents.js +12 -0
- package/dist/react/TableOfContents.js.map +1 -0
- package/dist/react/TimelineBlock.d.ts +14 -0
- package/dist/react/TimelineBlock.d.ts.map +1 -0
- package/dist/react/TimelineBlock.js +8 -0
- package/dist/react/TimelineBlock.js.map +1 -0
- package/dist/react/TipBox.d.ts +6 -0
- package/dist/react/TipBox.d.ts.map +1 -0
- package/dist/react/TipBox.js +5 -0
- package/dist/react/TipBox.js.map +1 -0
- package/dist/react/TrafficChart.d.ts +16 -0
- package/dist/react/TrafficChart.d.ts.map +1 -0
- package/dist/react/TrafficChart.js +14 -0
- package/dist/react/TrafficChart.js.map +1 -0
- package/dist/react/VerdictCard.d.ts +15 -0
- package/dist/react/VerdictCard.d.ts.map +1 -0
- package/dist/react/VerdictCard.js +5 -0
- package/dist/react/VerdictCard.js.map +1 -0
- package/dist/react/components-map.d.ts +133 -0
- package/dist/react/components-map.d.ts.map +1 -0
- package/dist/react/components-map.js +120 -0
- package/dist/react/components-map.js.map +1 -0
- package/dist/react/index.d.ts +5 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +13 -0
- package/dist/react/index.js.map +1 -0
- package/package.json +116 -0
- package/react/AdPreview.tsx +94 -0
- package/react/AdPreviewPair.tsx +16 -0
- package/react/AuditFindings.tsx +43 -0
- package/react/AuditScores.tsx +73 -0
- package/react/AuthorCard.tsx +35 -0
- package/react/BeforeAfter.tsx +27 -0
- package/react/BlogBehaviors.tsx +21 -0
- package/react/CTABanner.tsx +32 -0
- package/react/CalloutBox.tsx +31 -0
- package/react/CaseStudyHero.tsx +71 -0
- package/react/ChannelMixBars.tsx +50 -0
- package/react/Checklist.tsx +31 -0
- package/react/ChecklistItem.tsx +19 -0
- package/react/CodeSnippet.tsx +36 -0
- package/react/ComparisonTable.tsx +114 -0
- package/react/Definition.tsx +36 -0
- package/react/DeliveryComparison.tsx +62 -0
- package/react/FAQList.tsx +61 -0
- package/react/FurtherReading.tsx +46 -0
- package/react/ImageFeature.tsx +26 -0
- package/react/Infographic.tsx +18 -0
- package/react/KeyMetric.tsx +61 -0
- package/react/KeywordTable.tsx +92 -0
- package/react/List.tsx +58 -0
- package/react/MetricHighlight.tsx +86 -0
- package/react/NewsletterCTA.tsx +48 -0
- package/react/NumberedCard.tsx +7 -0
- package/react/ProConBlock.tsx +42 -0
- package/react/ProseList.tsx +72 -0
- package/react/QuoteBlock.tsx +89 -0
- package/react/RegionCallout.tsx +38 -0
- package/react/RelatedPosts.tsx +58 -0
- package/react/ResultsStrip.tsx +77 -0
- package/react/ScoreBar.tsx +27 -0
- package/react/SerpPreview.tsx +59 -0
- package/react/ServicePromoCard.tsx +43 -0
- package/react/StatCard.tsx +62 -0
- package/react/StepBlock.tsx +5 -0
- package/react/TableOfContents.tsx +27 -0
- package/react/TimelineBlock.tsx +35 -0
- package/react/TipBox.tsx +16 -0
- package/react/TrafficChart.tsx +79 -0
- package/react/VerdictCard.tsx +60 -0
- package/react/components-map.ts +122 -0
- package/react/index.ts +13 -0
- package/templates/blogkit/app/api/blogkit/revalidate/route.ts.tmpl +32 -0
- package/templates/blogkit/app/blog/[slug]/page.tsx.tmpl +41 -0
- package/templates/blogkit/app/blog/page.tsx.tmpl +18 -0
- package/templates/blogkit/blogkit.config.ts.tmpl +23 -0
- package/templates/blogkit-astro/BLOGKIT_ASTRO_SETUP.md.tmpl +49 -0
- package/templates/blogkit-astro/src/blogkit.config.ts.tmpl +29 -0
- package/templates/blogkit-astro/src/pages/api/blogkit/revalidate.ts.tmpl +46 -0
- package/templates/blogkit-astro/src/pages/blog/[slug].astro.tmpl +39 -0
- package/templates/blogkit-astro/src/pages/blog/index.astro.tmpl +29 -0
|
@@ -0,0 +1,573 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Canonical component catalogue — the SINGLE source of truth. The blog-publisher MCP reads this at boot to build list_components; the React/Astro adapters implement these names. Per-site customComponents (in the MCP's sites/*.json) merge on top. Shape is a superset of the MCP's ComponentDoc {description, props, example, role, recommendedFor} plus kit metadata {pack, frameworks, aliases}.",
|
|
3
|
+
"components": {
|
|
4
|
+
"CalloutBox": {
|
|
5
|
+
"description": "Highlighted aside for a tip, note, warning, or important caveat. Use sparingly to flag something the reader must not miss.",
|
|
6
|
+
"props": "tone: 'info' | 'tip' | 'success' | 'warn' | 'danger' (default 'info'). Aliases accepted: type, variant, and friendly values like note/warning/caution/error. title?: string (defaults to a per-tone label). Children: MDX content.",
|
|
7
|
+
"example": "<CalloutBox tone=\"warn\" title=\"Watch out\">\nSkipping the verification step is the #1 cause of failed migrations.\n</CalloutBox>",
|
|
8
|
+
"role": "editorial",
|
|
9
|
+
"recommendedFor": "any",
|
|
10
|
+
"pack": "core",
|
|
11
|
+
"frameworks": [
|
|
12
|
+
"react",
|
|
13
|
+
"astro"
|
|
14
|
+
],
|
|
15
|
+
"aliases": []
|
|
16
|
+
},
|
|
17
|
+
"TipBox": {
|
|
18
|
+
"description": "Inline \"Pro tip\" callout: a brand-tinted strip with a small uppercase brand badge, a bold lead tip line, and optional supporting context. Lighter-weight than CalloutBox; meant to sit inline within prose.",
|
|
19
|
+
"props": "tip: string (required, bold lead line); context?: string (optional supporting sentence shown after the lead).",
|
|
20
|
+
"example": "<TipBox tip=\"Resize images before upload.\" context=\"Anything over 2000px wastes bandwidth and slows your page.\" />",
|
|
21
|
+
"role": "An inline emphasis callout for a single actionable pro tip within blog body content.",
|
|
22
|
+
"pack": "core",
|
|
23
|
+
"frameworks": [
|
|
24
|
+
"react",
|
|
25
|
+
"astro"
|
|
26
|
+
],
|
|
27
|
+
"aliases": [],
|
|
28
|
+
"recommendedFor": "Highlighting a short, single actionable tip mid-article without the visual weight of a full CalloutBox."
|
|
29
|
+
},
|
|
30
|
+
"QuoteBlock": {
|
|
31
|
+
"description": "Pull-quote / testimonial block — a large quote with a brand left-border and faded quote mark, an author + role/company caption (with optional source-favicon avatar), and an optional dashed-divider source attribution row that can link to the original.",
|
|
32
|
+
"props": "quote (string; or use children for the body), author (string), role (string), company (string), source (string — attribution text), sourceUrl (string — makes the source row a link and derives a favicon avatar), avatarUrl (string — overrides the derived favicon)",
|
|
33
|
+
"example": "<QuoteBlock quote=\"AI handles 80% of our inbound before a human ever sees it.\" author=\"Jane Doe\" role=\"VP Support\" company=\"Acme\" source=\"Forrester AI Study, 2024\" sourceUrl=\"https://forrester.com/report\" />",
|
|
34
|
+
"role": "A standout pull-quote or testimonial inside long-form blog body copy, with optional attribution and source citation.",
|
|
35
|
+
"pack": "core",
|
|
36
|
+
"frameworks": [
|
|
37
|
+
"react",
|
|
38
|
+
"astro"
|
|
39
|
+
],
|
|
40
|
+
"aliases": [
|
|
41
|
+
"PullQuote"
|
|
42
|
+
],
|
|
43
|
+
"recommendedFor": "Testimonials, expert quotes, and cited pull-quotes within an article body."
|
|
44
|
+
},
|
|
45
|
+
"Definition": {
|
|
46
|
+
"description": "A term/definition block: a brand-colored monogram tile beside a term name, optional phonetic pronunciation, and the definition text. Use to gloss a key term or acronym inline in a blog post.",
|
|
47
|
+
"props": "term (string, required — short monogram/acronym; a longer phrase is auto-reduced to up to 3 initials), name (string, optional — full term label shown bold; defaults to the phrase when term is a phrase), pronunciation (string, optional — italic phonetic spelling), children (slot — the definition body text)",
|
|
48
|
+
"example": "<Definition term=\"API\" name=\"Application Programming Interface\" pronunciation=\"/ˌeɪ.piːˈaɪ/\">A set of rules that lets one piece of software talk to another.</Definition>",
|
|
49
|
+
"role": "Inline glossary / term-definition callout for explaining a key term or acronym within post body content.",
|
|
50
|
+
"pack": "core",
|
|
51
|
+
"frameworks": [
|
|
52
|
+
"react",
|
|
53
|
+
"astro"
|
|
54
|
+
],
|
|
55
|
+
"aliases": [],
|
|
56
|
+
"recommendedFor": "Defining jargon, acronyms, or domain terms inside an article."
|
|
57
|
+
},
|
|
58
|
+
"FAQList": {
|
|
59
|
+
"description": "Expandable Q&A list built on native <details>/<summary> for accessibility and SEO. The first item is open by default; every pair is also emitted as FAQPage JSON-LD so search engines can lift it. Use for an FAQ section at the foot of an article.",
|
|
60
|
+
"props": "items?: Array<{ q: string; a: string }> — questions and answers; answer bodies split into paragraphs on blank lines and render inline HTML. heading?: string — optional eyebrow label above the list. Children: when items is omitted, MDX content (your own <details> rows) is rendered instead.",
|
|
61
|
+
"example": "<FAQList heading=\"Common questions\" items={[\n { q: \"How long does setup take?\", a: \"Most teams are live in under an hour.\\n\\nNo code changes are required.\" },\n { q: \"Can I cancel anytime?\", a: \"Yes — there is no lock-in contract.\" }\n]} />",
|
|
62
|
+
"role": "editorial",
|
|
63
|
+
"recommendedFor": "any",
|
|
64
|
+
"pack": "core",
|
|
65
|
+
"frameworks": [
|
|
66
|
+
"react",
|
|
67
|
+
"astro"
|
|
68
|
+
],
|
|
69
|
+
"aliases": []
|
|
70
|
+
},
|
|
71
|
+
"Checklist": {
|
|
72
|
+
"description": "A task/done checklist of rows, each with a title, optional sub-line, and a done state. Completed rows get a filled brand tick box and a struck-through title. Use for step recaps, requirement lists, or 'what you'll need' boxes. For a single standalone checkbox row, use the sibling ChecklistItem.",
|
|
73
|
+
"props": "items: Array<{ title: string; sub?: string; done?: boolean }> (required). Renders nothing when empty. ChecklistItem (single row) takes: checked: boolean; label: string; description?: string.",
|
|
74
|
+
"example": "<Checklist items={[\n { title: \"Connect your domain\", sub: \"DNS verified\", done: true },\n { title: \"Add your first source\", done: false },\n { title: \"Invite a teammate\" }\n]} />",
|
|
75
|
+
"role": "editorial",
|
|
76
|
+
"recommendedFor": "any",
|
|
77
|
+
"pack": "core",
|
|
78
|
+
"frameworks": [
|
|
79
|
+
"react",
|
|
80
|
+
"astro"
|
|
81
|
+
],
|
|
82
|
+
"aliases": []
|
|
83
|
+
},
|
|
84
|
+
"List": {
|
|
85
|
+
"description": "Branded vertical list with three marker styles: ordered (zero-padded 01/02 display-font counters in brand colour), bullet (brand dot), or check (brand tick inside a tinted brand-soft circle). Items are HTML strings supporting <strong> bold lead-ins; optional uppercase brand heading above the list.",
|
|
86
|
+
"props": "variant?: \"ordered\" | \"bullet\" | \"check\" (default \"bullet\"; aliases numbered/number→ordered, bulleted/dot→bullet, checked/checklist→check); items: string[] (each an HTML string); heading?: string",
|
|
87
|
+
"example": "<List variant=\"check\" heading=\"What you get\" items={[\"<strong>Fast setup</strong> in under five minutes\", \"No code required\", \"Cancel anytime\"]} />",
|
|
88
|
+
"role": "A list of related points, steps, or benefits with a consistent branded marker. Use ordered for sequential steps, bullet for general points, check for benefits/requirements/wins.",
|
|
89
|
+
"pack": "core",
|
|
90
|
+
"frameworks": [
|
|
91
|
+
"react",
|
|
92
|
+
"astro"
|
|
93
|
+
],
|
|
94
|
+
"aliases": [],
|
|
95
|
+
"recommendedFor": "steps, benefits lists, requirements, feature bullets"
|
|
96
|
+
},
|
|
97
|
+
"StepBlock": {
|
|
98
|
+
"description": "A numbered step in a how-to or sequence: an orange brand badge with the step number beside an uppercase title and body content. Use inside ordered procedures or walkthroughs.",
|
|
99
|
+
"props": "stepNumber (number|string, shown in the badge), title (string, uppercase heading), children/slot (step body content)",
|
|
100
|
+
"example": "<StepBlock stepNumber={1} title=\"Install the snippet\">Paste the script tag into your site's <head>.</StepBlock>",
|
|
101
|
+
"role": "A single numbered step card for procedures and walkthroughs.",
|
|
102
|
+
"pack": "core",
|
|
103
|
+
"frameworks": [
|
|
104
|
+
"react",
|
|
105
|
+
"astro"
|
|
106
|
+
],
|
|
107
|
+
"aliases": [],
|
|
108
|
+
"recommendedFor": "step-by-step instructions, how-to sequences, setup guides"
|
|
109
|
+
},
|
|
110
|
+
"ComparisonTable": {
|
|
111
|
+
"description": "Side-by-side comparison of two options (e.g. products, plans, approaches) across a set of features, with an optional per-row winner highlight. Renders as stacked cards on mobile and a table on wider screens. Cells reading 'yes'/'✓' or 'no'/'✕' display as green/red marks. Use to help readers choose between two clear alternatives.",
|
|
112
|
+
"props": "title?: string (optional heading above the table). optionALabel: string, optionBLabel: string (the two column headers). items: { feature: string; optionA: string; optionB: string; winner?: 'a' | 'b' | 'tie' }[] — one row per feature; winner highlights the winning column for that row. Renders nothing if items is empty.",
|
|
113
|
+
"example": "<ComparisonTable\n title=\"Capture AI vs a generic chatbot\"\n optionALabel=\"Capture AI\"\n optionBLabel=\"Generic bot\"\n items={[\n { feature: \"Lead capture\", optionA: \"yes\", optionB: \"no\", winner: \"a\" },\n { feature: \"Setup time\", optionA: \"5 minutes\", optionB: \"2+ hours\", winner: \"a\" },\n { feature: \"Free tier\", optionA: \"yes\", optionB: \"yes\", winner: \"tie\" }\n ]}\n/>",
|
|
114
|
+
"role": "data",
|
|
115
|
+
"recommendedFor": "any",
|
|
116
|
+
"pack": "core",
|
|
117
|
+
"frameworks": [
|
|
118
|
+
"react",
|
|
119
|
+
"astro"
|
|
120
|
+
],
|
|
121
|
+
"aliases": []
|
|
122
|
+
},
|
|
123
|
+
"ProConBlock": {
|
|
124
|
+
"description": "Side-by-side Pros and Cons cards — a green pros column with checkmarks and a red cons column with crosses. Either column is omitted when its list is empty.",
|
|
125
|
+
"props": "pros?: string[]; cons?: string[]",
|
|
126
|
+
"example": "<ProConBlock pros={[\"Fast setup\", \"Great support\"]} cons={[\"Pricey at scale\"]} />",
|
|
127
|
+
"role": "Compare the upsides and downsides of a thing in two color-coded columns.",
|
|
128
|
+
"pack": "core",
|
|
129
|
+
"frameworks": [
|
|
130
|
+
"react",
|
|
131
|
+
"astro"
|
|
132
|
+
],
|
|
133
|
+
"aliases": [
|
|
134
|
+
"ProsCons"
|
|
135
|
+
],
|
|
136
|
+
"recommendedFor": "Reviews, comparisons, and buying-guide sections where you weigh advantages against drawbacks."
|
|
137
|
+
},
|
|
138
|
+
"BeforeAfter": {
|
|
139
|
+
"description": "Two-card side-by-side comparison contrasting a muted \"before\" state against a brand-coloured \"after\" state, each with an optional large headline number.",
|
|
140
|
+
"props": "before: { title: string; content: string; value?: string } (required) — the muted left/top card. after: { title: string; content: string; value?: string } (required) — the brand-coloured right/bottom card. `value` renders an optional big display number between the title and body. Renders nothing if either side is missing.",
|
|
141
|
+
"example": "<BeforeAfter before={{ title: \"Before\", value: \"2%\", content: \"Manual follow-up, leads slip through the cracks.\" }} after={{ title: \"After\", value: \"18%\", content: \"Automated capture converts every visitor.\" }} />",
|
|
142
|
+
"role": "Comparison / stat contrast block for blog body content.",
|
|
143
|
+
"pack": "core",
|
|
144
|
+
"frameworks": [
|
|
145
|
+
"react",
|
|
146
|
+
"astro"
|
|
147
|
+
],
|
|
148
|
+
"aliases": [],
|
|
149
|
+
"recommendedFor": "Contrasting a before/after metric, outcome, or state within a post."
|
|
150
|
+
},
|
|
151
|
+
"ImageFeature": {
|
|
152
|
+
"description": "A captioned image figure with an optional photo credit and a float position (left, right, or full width). Renders a 16/9 framed image with an optional caption/credit footer bar; left/right float the figure beside text on wider screens.",
|
|
153
|
+
"props": "src (string, required image URL), alt (string, required alt text), caption?: string, credit?: string, position?: \"left\" | \"right\" | \"full\" (default \"full\")",
|
|
154
|
+
"example": "<ImageFeature src=\"/images/dashboard.png\" alt=\"Analytics dashboard\" caption=\"The redesigned analytics view.\" credit=\"Photo: Acme\" position=\"right\" />",
|
|
155
|
+
"role": "Embed a captioned image inside article body copy, optionally floated beside the text.",
|
|
156
|
+
"pack": "core",
|
|
157
|
+
"frameworks": [
|
|
158
|
+
"react",
|
|
159
|
+
"astro"
|
|
160
|
+
],
|
|
161
|
+
"aliases": [],
|
|
162
|
+
"recommendedFor": "Inline article imagery with captions/credits; floated callout images alongside prose."
|
|
163
|
+
},
|
|
164
|
+
"Infographic": {
|
|
165
|
+
"description": "AI-generated, brand-locked infographic image. Frameless and borderless on purpose — the image carries all the information and renders at its natural aspect ratio (full width, auto height) so nothing is cropped. Use for full-bleed data/visual graphics where a caption strip or frame would distract. For framed, captioned, or floated photos use ImageFeature instead.",
|
|
166
|
+
"props": "src: string (required, image URL); alt: string (required, accessible description). Renders nothing when src is empty.",
|
|
167
|
+
"example": "<Infographic src=\"https://cdn.example.com/blog/how-it-works.png\" alt=\"Flow diagram showing the three-step capture process\" />",
|
|
168
|
+
"role": "media",
|
|
169
|
+
"pack": "core",
|
|
170
|
+
"frameworks": [
|
|
171
|
+
"react",
|
|
172
|
+
"astro"
|
|
173
|
+
],
|
|
174
|
+
"aliases": [],
|
|
175
|
+
"recommendedFor": "Full-width AI-generated infographics or data visualisations embedded in article body."
|
|
176
|
+
},
|
|
177
|
+
"CodeSnippet": {
|
|
178
|
+
"description": "A dark, copyable code block with a header bar showing the filename or language and a one-click copy button. Use for terminal commands, config snippets, and short code samples in a post.",
|
|
179
|
+
"props": "code: string (required) — the raw code to display and copy. language?: string (default 'text') — sets the header label and the language-* class for highlighters. filename?: string — shown in the header instead of the language when provided.",
|
|
180
|
+
"example": "<CodeSnippet language=\"bash\" filename=\"install.sh\" code={`npm install blog-kit\nnpm run build`} />",
|
|
181
|
+
"role": "editorial",
|
|
182
|
+
"recommendedFor": "any",
|
|
183
|
+
"pack": "core",
|
|
184
|
+
"frameworks": [
|
|
185
|
+
"react",
|
|
186
|
+
"astro"
|
|
187
|
+
],
|
|
188
|
+
"aliases": []
|
|
189
|
+
},
|
|
190
|
+
"CTABanner": {
|
|
191
|
+
"description": "Dark, attention-grabbing call-to-action banner with a brand-coloured radial glow, a bold uppercase heading, a short supporting line, and a solid brand CTA button. Use once near the end of a post to drive the reader to a demo, signup, or contact action.",
|
|
192
|
+
"props": "heading?: string (default 'See it on your own site'). description?: string (default a short supporting sentence). ctaText?: string (default 'Book a demo'). ctaHref?: string (default '/book-demo'). No children.",
|
|
193
|
+
"example": "<CTABanner heading=\"Ready to capture more leads?\" description=\"Deploy in under ten minutes — paste a tag and watch leads land.\" ctaText=\"Book a demo\" ctaHref=\"/book-demo\" />",
|
|
194
|
+
"role": "conversion",
|
|
195
|
+
"pack": "core",
|
|
196
|
+
"frameworks": [
|
|
197
|
+
"react",
|
|
198
|
+
"astro"
|
|
199
|
+
],
|
|
200
|
+
"aliases": [],
|
|
201
|
+
"recommendedFor": "any"
|
|
202
|
+
},
|
|
203
|
+
"NewsletterCTA": {
|
|
204
|
+
"description": "Dark email-capture block with a brand radial glow: heading + description on one side and an inline subscribe form (email field + honeypot + submit button) on the other. The form posts natively to its action URL.",
|
|
205
|
+
"props": "heading?: string (default 'One email, once a week.'); description?: string (default 'Field-tested ideas for turning chat traffic into revenue. No filler.'); action?: string (form POST target, default '/api/newsletter'); placeholder?: string (email input placeholder, default 'you@studio.com'); buttonText?: string (default 'Subscribe')",
|
|
206
|
+
"example": "<NewsletterCTA heading=\"One email, once a week.\" description=\"Field-tested ideas for turning chat traffic into revenue.\" action=\"/api/newsletter\" buttonText=\"Subscribe\" />",
|
|
207
|
+
"role": "Inline newsletter / email-signup call-to-action for placing within or at the end of blog posts.",
|
|
208
|
+
"pack": "core",
|
|
209
|
+
"frameworks": [
|
|
210
|
+
"react",
|
|
211
|
+
"astro"
|
|
212
|
+
],
|
|
213
|
+
"aliases": [],
|
|
214
|
+
"recommendedFor": "Mid-article or end-of-article email capture in long-form blog content."
|
|
215
|
+
},
|
|
216
|
+
"AuthorCard": {
|
|
217
|
+
"description": "Author byline card showing an avatar (or initials fallback), name, role, optional bio, and optional labelled links. Used at the foot of a post or in an author sidebar.",
|
|
218
|
+
"props": "name: string (required); role?: string; avatar?: string (image URL — falls back to name initials when absent); bio?: string; links?: { label: string; href: string }[]",
|
|
219
|
+
"example": "<AuthorCard name=\"Jane Doe\" role=\"Head of Content\" avatar=\"/team/jane.jpg\" bio=\"Jane writes about growth and lifecycle marketing.\" links={[{ label: \"Twitter\", href: \"https://x.com/jane\" }]} />",
|
|
220
|
+
"role": "Author attribution / byline block for blog posts.",
|
|
221
|
+
"pack": "core",
|
|
222
|
+
"frameworks": [
|
|
223
|
+
"react",
|
|
224
|
+
"astro"
|
|
225
|
+
],
|
|
226
|
+
"aliases": [],
|
|
227
|
+
"recommendedFor": "Post footers and author bios."
|
|
228
|
+
},
|
|
229
|
+
"RelatedPosts": {
|
|
230
|
+
"description": "\"Keep reading\" grid of related-post cards shown at the end of an article. Each card links to another post with an optional featured-image thumbnail (a tokenised gradient placeholder is used when no image is given), an optional category pill, a title, and a clamped two-line excerpt.",
|
|
231
|
+
"props": "posts: { slug: string; title: string; excerpt?: string; date?: string; category?: string; featuredImage?: string; featuredImageAlt?: string }[] (required; renders nothing when empty). heading?: string (default 'Keep reading'). hrefBase?: string (default '/blog/' — prepended to each post's slug for the card link). No children.",
|
|
232
|
+
"example": "<RelatedPosts heading=\"Keep reading\" posts={[\n { slug: \"verify-before-launch\", title: \"Verify before you launch\", excerpt: \"The one step most teams skip.\", category: \"Guides\", featuredImage: \"/img/verify.jpg\" },\n { slug: \"migration-checklist\", title: \"The migration checklist\", excerpt: \"Everything to confirm before cutover.\", category: \"Playbooks\" }\n]} />",
|
|
233
|
+
"role": "navigation",
|
|
234
|
+
"recommendedFor": "any",
|
|
235
|
+
"pack": "core",
|
|
236
|
+
"frameworks": [
|
|
237
|
+
"react",
|
|
238
|
+
"astro"
|
|
239
|
+
],
|
|
240
|
+
"aliases": []
|
|
241
|
+
},
|
|
242
|
+
"FurtherReading": {
|
|
243
|
+
"description": "Card listing external resources for further reading. Each row pairs a title that links out (new tab, nofollow) with a short source/publisher label. Renders nothing when no sources are supplied.",
|
|
244
|
+
"props": "sources: { title: string; source: string; url: string }[] — the resources to list (renders nothing when empty). heading?: string — optional heading override (default \"Further reading\"). No children.",
|
|
245
|
+
"example": "<FurtherReading\n sources={[\n { title: \"The 2024 State of AI Report\", source: \"Stanford HAI\", url: \"https://example.com/report\" },\n { title: \"Original benchmark methodology\", source: \"arXiv\", url: \"https://example.com/paper\" },\n ]}\n/>",
|
|
246
|
+
"role": "reference",
|
|
247
|
+
"recommendedFor": "any",
|
|
248
|
+
"pack": "core",
|
|
249
|
+
"frameworks": [
|
|
250
|
+
"react",
|
|
251
|
+
"astro"
|
|
252
|
+
],
|
|
253
|
+
"aliases": []
|
|
254
|
+
},
|
|
255
|
+
"TableOfContents": {
|
|
256
|
+
"description": "Auto-generated 'In this article' navigation. Scans the article's <h2> headings at runtime, lists them numbered, smooth-scrolls on click, and highlights the heading currently in view (scrollspy). Renders nothing if the article has no <h2>s.",
|
|
257
|
+
"props": "heading?: string (label above the list, default 'In this article'). scope?: string (CSS selector for the element whose <h2>s become entries, default 'article'). No children — the list is built from the live document by the toc behaviour.",
|
|
258
|
+
"example": "<TableOfContents />",
|
|
259
|
+
"role": "navigation",
|
|
260
|
+
"recommendedFor": "long-form",
|
|
261
|
+
"pack": "core",
|
|
262
|
+
"frameworks": [
|
|
263
|
+
"react",
|
|
264
|
+
"astro"
|
|
265
|
+
],
|
|
266
|
+
"aliases": []
|
|
267
|
+
},
|
|
268
|
+
"TimelineBlock": {
|
|
269
|
+
"description": "Vertical timeline of dated milestones connected by a rail — a chronological recap. Use to summarise a sequence of events, a project history, or a step-by-step story over time.",
|
|
270
|
+
"props": "events: { date: string; title: string; description: string }[] (chronological, oldest to newest). Renders nothing when empty. Children: optional MDX fallback used only when no events are passed.",
|
|
271
|
+
"example": "<TimelineBlock events={[\n { date: \"Jan 2024\", title: \"Kickoff\", description: \"Scoped the migration and audited the old site.\" },\n { date: \"Mar 2024\", title: \"Build\", description: \"Rebuilt every template on the new stack.\" },\n { date: \"May 2024\", title: \"Launch\", description: \"Cut over with zero ranking loss.\" }\n]} />",
|
|
272
|
+
"role": "editorial",
|
|
273
|
+
"recommendedFor": "any",
|
|
274
|
+
"pack": "core",
|
|
275
|
+
"frameworks": [
|
|
276
|
+
"react",
|
|
277
|
+
"astro"
|
|
278
|
+
],
|
|
279
|
+
"aliases": [
|
|
280
|
+
"TimelineRecap"
|
|
281
|
+
]
|
|
282
|
+
},
|
|
283
|
+
"StatCard": {
|
|
284
|
+
"description": "A single highlighted statistic — a big brand-coloured number (with an optional unit), an uppercase label, optional supporting description, and an optional dashed-divider source attribution row that links out when a URL is given. Use to make one striking metric stand out in the flow of an article.",
|
|
285
|
+
"props": "value: string (the metric, e.g. \"3.2×\" or \"87%\"; if no explicit unit is given the trailing non-numeric part is auto-split off as the unit). label: string (short uppercase caption). description?: string (supporting line under the label). unit?: string (overrides the auto-split unit, e.g. \"×\", \"s\", \"%\"). source?: string (attribution text shown in a dashed-divider row, e.g. \"Forrester, 2024\"). sourceUrl?: string (when set alongside source, the row becomes an outbound link). No children.",
|
|
286
|
+
"example": "<StatCard value=\"3.2×\" label=\"More qualified leads\" description=\"Average lift across the first 90 days.\" source=\"Capture AI customer data, 2024\" sourceUrl=\"https://example.com/report\" />",
|
|
287
|
+
"role": "data",
|
|
288
|
+
"recommendedFor": "any",
|
|
289
|
+
"pack": "capture",
|
|
290
|
+
"frameworks": [
|
|
291
|
+
"react",
|
|
292
|
+
"astro"
|
|
293
|
+
],
|
|
294
|
+
"aliases": []
|
|
295
|
+
},
|
|
296
|
+
"VerdictCard": {
|
|
297
|
+
"description": "A dark, brand-bordered verdict panel for reviews and comparisons: an uppercase kicker with an optional /10 score, then a big verdict headline, a one-line summary, and optional bullet chips. Use once near the top or bottom of a review to deliver the bottom-line call.",
|
|
298
|
+
"props": "verdict: string (the headline call). summary: string (one-line rationale). score?: number (shown as <score>/10 in the header). kicker?: string (uppercase label above; default 'The verdict'). bullets?: string[] (chip row under the summary). winner?: string (legacy — renders a 'Winner: <name>' pill above the verdict).",
|
|
299
|
+
"example": "<VerdictCard\n verdict=\"Worth every penny\"\n score={9}\n kicker=\"The verdict\"\n summary=\"The best lead-capture widget we tested — fast to deploy and genuinely converts.\"\n bullets={[\"Easy setup\", \"Great support\", \"Fair pricing\"]}\n/>",
|
|
300
|
+
"role": "editorial",
|
|
301
|
+
"recommendedFor": "review",
|
|
302
|
+
"pack": "capture",
|
|
303
|
+
"frameworks": [
|
|
304
|
+
"react",
|
|
305
|
+
"astro"
|
|
306
|
+
],
|
|
307
|
+
"aliases": []
|
|
308
|
+
},
|
|
309
|
+
"ScoreBar": {
|
|
310
|
+
"description": "A labelled rating row with a numeric score and a gradient-filled progress bar. Use to visualise a single criterion's rating (e.g. an out-of-10 review score) so readers can compare strengths at a glance.",
|
|
311
|
+
"props": "label: string (uppercase criterion name). score: number (the value shown and used for the fill). maxScore?: number (denominator the fill is computed against, default 10). No children.",
|
|
312
|
+
"example": "<ScoreBar label=\"Battery life\" score={8.5} maxScore={10} />",
|
|
313
|
+
"role": "data",
|
|
314
|
+
"recommendedFor": "reviews",
|
|
315
|
+
"pack": "capture",
|
|
316
|
+
"frameworks": [
|
|
317
|
+
"react",
|
|
318
|
+
"astro"
|
|
319
|
+
],
|
|
320
|
+
"aliases": []
|
|
321
|
+
},
|
|
322
|
+
"NumberedCard": {
|
|
323
|
+
"description": "A card with a floating zero-padded number badge, an uppercase title, and a short body paragraph — used to enumerate steps, features, or ranked points within prose.",
|
|
324
|
+
"props": "number (number|string, zero-padded to 2 digits), title (string), description (string body text; or use children/slot for body content)",
|
|
325
|
+
"example": "<NumberedCard number={1} title=\"Map Your Funnel\" description=\"Identify every stage a visitor passes through before converting.\" />",
|
|
326
|
+
"role": "Numbered enumeration card for steps, features, or ranked points",
|
|
327
|
+
"pack": "capture",
|
|
328
|
+
"frameworks": [
|
|
329
|
+
"react",
|
|
330
|
+
"astro"
|
|
331
|
+
],
|
|
332
|
+
"aliases": [],
|
|
333
|
+
"recommendedFor": "Numbered lists of steps or features that need more visual weight than a plain ordered list"
|
|
334
|
+
},
|
|
335
|
+
"MetricHighlight": {
|
|
336
|
+
"description": "One or more headline metrics. A single metric renders as a big brand-filled hero (giant number + label + optional change note + optional source attribution). Two or more render as a responsive grid of bordered stat cards (2, 3, or 4-up). Use for the punchy 'numbers that matter' moment in a post.",
|
|
337
|
+
"props": "metrics: Array<{ value: string; label: string; change?: string; source?: string; sourceUrl?: string }>. value is the big number (e.g. '68%' or '3.2x'); label is the uppercase caption; change is an optional secondary note (e.g. 'vs. industry avg'); source/sourceUrl add a dashed-divider attribution row that links out when sourceUrl is set. No children.",
|
|
338
|
+
"example": "<MetricHighlight metrics={[\n { value: \"68%\", label: \"Forms abandoned\", change: \"before optimisation\", source: \"Zuko benchmarks, 2026\", sourceUrl: \"https://example.com\" },\n { value: \"3.2x\", label: \"Lead lift\", change: \"after redesign\" }\n]} />",
|
|
339
|
+
"role": "data",
|
|
340
|
+
"recommendedFor": "any",
|
|
341
|
+
"pack": "capture",
|
|
342
|
+
"frameworks": [
|
|
343
|
+
"react",
|
|
344
|
+
"astro"
|
|
345
|
+
],
|
|
346
|
+
"aliases": []
|
|
347
|
+
},
|
|
348
|
+
"ChecklistItem": {
|
|
349
|
+
"description": "A single checklist row — a checkbox state, a bold label, and optional supporting text. Authored inside <Checklist>.",
|
|
350
|
+
"props": "checked: boolean (required) — ticked/filled when true. label: string (required) — the row label. description?: string — optional supporting line beneath the label.",
|
|
351
|
+
"example": "<Checklist>\n <ChecklistItem checked={true} label=\"Domain verified\" />\n <ChecklistItem checked={false} label=\"DNS propagated\" description=\"Can take up to 48h.\" />\n</Checklist>",
|
|
352
|
+
"role": "editorial",
|
|
353
|
+
"recommendedFor": "any",
|
|
354
|
+
"pack": "core",
|
|
355
|
+
"frameworks": [
|
|
356
|
+
"react",
|
|
357
|
+
"astro"
|
|
358
|
+
],
|
|
359
|
+
"aliases": []
|
|
360
|
+
},
|
|
361
|
+
"CaseStudyHero": {
|
|
362
|
+
"description": "A dark, full-width case-study banner: a light logo plate (a client logo image, an HTML/text wordmark, or the auto-broken client name) beside a body with uppercase tag chips, a headline, a sub-line, and a row of brand-coloured result tiles (big number + uppercase label). Use to open or anchor a case study / results write-up with the client's headline outcomes.",
|
|
363
|
+
"props": "logoImage?: string (client logo URL — preferred plate content). logo?: string (HTML/text wordmark, supports <br/>, used when no logoImage). client?: string (client name — used for the logo img alt, and as a last-resort plate auto-broken at spaces). chips?: string[] (uppercase tag chips above the headline). title?: string (the headline). sub?: string (one-line sub under the headline). results?: { num: string; label: string }[] (result tiles — each a big number + an uppercase label). No children.",
|
|
364
|
+
"example": "<CaseStudyHero\n client=\"Northwind Logistics\"\n chips={[\"B2B\", \"Lead gen\", \"6 months\"]}\n title=\"3.4× more booked demos\"\n sub=\"A rebuilt funnel and tighter qualification turned cold traffic into pipeline.\"\n results={[\n { num: \"+218%\", label: \"Qualified leads\" },\n { num: \"3.4×\", label: \"Demos booked\" },\n { num: \"-41%\", label: \"Cost per lead\" }\n ]}\n/>",
|
|
365
|
+
"role": "editorial",
|
|
366
|
+
"recommendedFor": "case-study",
|
|
367
|
+
"pack": "hjd",
|
|
368
|
+
"frameworks": [
|
|
369
|
+
"react",
|
|
370
|
+
"astro"
|
|
371
|
+
],
|
|
372
|
+
"aliases": [
|
|
373
|
+
"CaseStudy",
|
|
374
|
+
"CaseStudyBanner"
|
|
375
|
+
]
|
|
376
|
+
},
|
|
377
|
+
"ResultsStrip": {
|
|
378
|
+
"description": "A horizontal strip of bordered KPI cells — each with an uppercase label, a big brand-coloured number, an optional change delta (mono, green for up / red for down), and an optional dashed-divider source attribution row. Use for the at-a-glance 'results / outcomes' moment in a case-study or report post. Collapses to a 2-up grid on narrow screens.",
|
|
379
|
+
"props": "kpis: Array<{ label: string; num: string; delta?: string; deltaDirection?: 'up' | 'down'; source?: string; sourceUrl?: string }>. label is the uppercase caption; num is the big brand number (e.g. '+182%' or '4.1x'); delta is an optional change indicator rendered in mono (deltaDirection 'down' turns it red, otherwise green); source/sourceUrl add a dashed-divider attribution row that links out when sourceUrl is set. No children.",
|
|
380
|
+
"example": "<ResultsStrip kpis={[\n { label: \"Organic traffic\", num: \"+182%\", delta: \"YoY\", deltaDirection: \"up\", source: \"GA4, 2026\", sourceUrl: \"https://example.com\" },\n { label: \"Conversions\", num: \"4.1x\", delta: \"vs. baseline\" },\n { label: \"Cost per lead\", num: \"-43%\", delta: \"down\", deltaDirection: \"down\" },\n { label: \"Keywords top 3\", num: \"57\" }\n]} />",
|
|
381
|
+
"role": "data",
|
|
382
|
+
"recommendedFor": "any",
|
|
383
|
+
"pack": "hjd",
|
|
384
|
+
"frameworks": [
|
|
385
|
+
"react",
|
|
386
|
+
"astro"
|
|
387
|
+
],
|
|
388
|
+
"aliases": []
|
|
389
|
+
},
|
|
390
|
+
"KeyMetric": {
|
|
391
|
+
"description": "A dark, full-width hero metric panel for the standout number in an article: one oversized brand-coloured figure beside a copy column with an optional uppercase label, a rich-text title (accepts inline HTML), a supporting sub-line, and an optional dashed-divider source attribution row that links out when a URL is given. Use once to make a single headline statistic land with weight.",
|
|
392
|
+
"props": "number: string (the oversized headline figure, e.g. \"3.2×\" or \"87%\"). label?: string (short uppercase caption above the title). title?: string (rich-text headline; accepts inline HTML, rendered as markup). sub?: string (supporting line under the title). source?: string (attribution text shown in a dashed-divider row, e.g. \"HubSpot, 2024\"). sourceUrl?: string (when set alongside source, the row becomes an outbound link). No children.",
|
|
393
|
+
"example": "<KeyMetric\n number=\"3.2×\"\n label=\"More qualified leads\"\n title=\"Teams using lead capture saw <strong>3.2× more qualified leads</strong> in 90 days\"\n sub=\"Average lift across the first quarter after launch.\"\n source=\"HubSpot benchmark, 2024\"\n sourceUrl=\"https://example.com/report\"\n/>",
|
|
394
|
+
"role": "data",
|
|
395
|
+
"recommendedFor": "any",
|
|
396
|
+
"pack": "hjd",
|
|
397
|
+
"frameworks": [
|
|
398
|
+
"react",
|
|
399
|
+
"astro"
|
|
400
|
+
],
|
|
401
|
+
"aliases": []
|
|
402
|
+
},
|
|
403
|
+
"KeywordTable": {
|
|
404
|
+
"description": "An SEO keyword-ranking table. Each row shows a keyword, its monthly search volume, a colour-coded difficulty pill (low/medium/high), the previous and current rank positions, and a coloured up/down rank-change delta with an arrow. Scrolls horizontally on narrow screens with edge-fade hints. Use to report keyword performance or ranking movement in an SEO/marketing post. Renders nothing if rows is empty.",
|
|
405
|
+
"props": "rows: { keyword: string; volume: string; difficulty: number; was?: number | string; now: number | string; delta: number | string }[]. keyword is the term; volume is the pre-formatted monthly search volume (e.g. '1.2k'); difficulty is a 0–100 score bucketed into low (<40, green) / med (<60, amber) / high (≥60, red); was is the prior rank (defaults to an em dash if omitted); now is the current rank; delta is the signed rank change — a negative value renders as a red down-arrow, otherwise a green up-arrow, and the magnitude is shown. No children.",
|
|
406
|
+
"example": "<KeywordTable rows={[\n { keyword: \"ai chatbot for small business\", volume: \"2.4k\", difficulty: 38, was: 14, now: 6, delta: 8 },\n { keyword: \"lead capture software\", volume: \"1.1k\", difficulty: 55, was: 9, now: 11, delta: -2 },\n { keyword: \"website chat widget\", volume: \"880\", difficulty: 72, was: \"—\", now: 19, delta: 5 }\n]} />",
|
|
407
|
+
"role": "data",
|
|
408
|
+
"recommendedFor": "any",
|
|
409
|
+
"pack": "hjd",
|
|
410
|
+
"frameworks": [
|
|
411
|
+
"react",
|
|
412
|
+
"astro"
|
|
413
|
+
],
|
|
414
|
+
"aliases": []
|
|
415
|
+
},
|
|
416
|
+
"ChannelMixBars": {
|
|
417
|
+
"description": "A horizontal bar breakdown of a single metric across channels (e.g. traffic or spend by source). Shows an uppercase heading with an optional total, then one labelled row per channel with a proportional fill and a right-aligned value. The first channel uses the brand fill; later channels step through a neutral colour ramp so the leading channel stands out. Use to show how a total splits across a handful of named channels.",
|
|
418
|
+
"props": "rows: { name: string; value: number; display?: string }[] — one row per channel; name is the uppercase row label, value sets the bar width (relative to the largest value), and display is an optional pre-formatted figure shown on the right (falls back to value). total?: string (shown in the header after 'Total · '). period?: string (header label, default 'Channel split'). No children.",
|
|
419
|
+
"example": "<ChannelMixBars\n period=\"Sessions by channel\"\n total=\"48,200\"\n rows={[\n { name: \"Organic\", value: 21800, display: \"21.8k\" },\n { name: \"Direct\", value: 12400, display: \"12.4k\" },\n { name: \"Paid\", value: 8600, display: \"8.6k\" },\n { name: \"Social\", value: 3500, display: \"3.5k\" },\n { name: \"Referral\", value: 1900, display: \"1.9k\" }\n ]}\n/>",
|
|
420
|
+
"role": "data",
|
|
421
|
+
"recommendedFor": "any",
|
|
422
|
+
"pack": "hjd",
|
|
423
|
+
"frameworks": [
|
|
424
|
+
"react",
|
|
425
|
+
"astro"
|
|
426
|
+
],
|
|
427
|
+
"aliases": []
|
|
428
|
+
},
|
|
429
|
+
"TrafficChart": {
|
|
430
|
+
"description": "A compact SVG line chart that compares a metric across two periods over time — an uppercase title and a two-item legend (this period / previous period), then a small chart with a solid brand line plus point markers for the current series and a dashed neutral line for the previous series, with mono-font x-axis labels. Use to visualise a trend (organic sessions, traffic, signups) and its period-over-period comparison inside an article or case study.",
|
|
431
|
+
"props": "title?: string (uppercase heading; defaults to \"Organic sessions · 6 months\"). series?: { current?: number[]; previous?: number[] } (the two comparable series; current renders as the solid brand line with point markers, previous as the dashed neutral line — either may be omitted). labels?: string[] (x-axis tick labels, one per data point). No children.",
|
|
432
|
+
"example": "<TrafficChart title=\"Organic sessions · 6 months\" series={{ current: [4200, 5100, 6800, 9300, 12400, 15800], previous: [3900, 4100, 4400, 4800, 5200, 5600] }} labels={[\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\"]} />",
|
|
433
|
+
"role": "data",
|
|
434
|
+
"recommendedFor": "case studies and reports where you show a trend over time and its period-over-period comparison",
|
|
435
|
+
"pack": "hjd",
|
|
436
|
+
"frameworks": [
|
|
437
|
+
"react",
|
|
438
|
+
"astro"
|
|
439
|
+
],
|
|
440
|
+
"aliases": [
|
|
441
|
+
"LineChart",
|
|
442
|
+
"TrendChart"
|
|
443
|
+
]
|
|
444
|
+
},
|
|
445
|
+
"SerpPreview": {
|
|
446
|
+
"description": "A mock search-engine results page (SERP): a rounded search bar showing the query, followed by a stack of result rows — each with a URL breadcrumb, a blue clickable-looking heading, and a snippet. Any row can be flagged as a 'Sponsored' ad. Use to illustrate how a page, keyword, or competitor appears in Google search results.",
|
|
447
|
+
"props": "query: string (text shown in the search bar). results?: Array<{ title: string; url: string; description: string; ad?: boolean }> — title is the blue heading (plain text); url is the breadcrumb line (HTML allowed, wrap the domain in <strong>); description is the snippet (HTML allowed, <em> bolds matched terms); ad: true flags the row with a 'Sponsored' tag. No children.",
|
|
448
|
+
"example": "<SerpPreview\n query=\"best crm for small business\"\n results={[\n { ad: true, url: \"<strong>acme.com</strong> › crm\", title: \"Acme CRM — Built for Small Teams\", description: \"The <em>best CRM for small business</em>. Free 14-day trial.\" },\n { url: \"<strong>example.com</strong> › blog › crm-guide\", title: \"7 Best CRMs for Small Business (2026 Guide)\", description: \"We tested 20 tools to find the <em>best CRM</em> for growing teams.\" }\n ]}\n/>",
|
|
449
|
+
"role": "data",
|
|
450
|
+
"recommendedFor": "seo",
|
|
451
|
+
"pack": "hjd",
|
|
452
|
+
"frameworks": [
|
|
453
|
+
"react",
|
|
454
|
+
"astro"
|
|
455
|
+
],
|
|
456
|
+
"aliases": [
|
|
457
|
+
"SearchPreview",
|
|
458
|
+
"GoogleResult"
|
|
459
|
+
]
|
|
460
|
+
},
|
|
461
|
+
"AdPreview": {
|
|
462
|
+
"description": "A mock paid-ad creative shown in one of two platform styles. \"meta\" renders a social-feed ad: a round brand avatar (seeded from the brand's first two letters), a \"Sponsored\" line, body copy, a 1.91:1 media panel, and a footer with the display site plus a call-to-action button. \"google\" renders a search ad: an \"Ad\" pill with the site, a display-URL breadcrumb, a blue headline, a description, and optional sitelinks in a dashed-divider row. Use to illustrate ad copy, landing-page messaging, or PPC examples inside an article.",
|
|
463
|
+
"props": "platform?: 'meta' | 'google' (which ad style; defaults to 'meta'). For meta: brand?: string (advertiser name; first two letters seed the avatar), sponsored?: string (small label under the brand, defaults to 'Sponsored'), copy?: string (ad body; HTML allowed), image?: string (creative image URL for the media panel), buttonText?: string (CTA label, defaults to 'Learn more'). Shared: site?: string (display site/domain). For google: url?: string (display URL breadcrumb; HTML allowed — wrap the domain in <strong>), headline?: string (the blue clickable headline), description?: string (line under the headline), sitelinks?: string[] (optional sitelink labels). No children.",
|
|
464
|
+
"example": "<AdPreview\n platform=\"meta\"\n brand=\"Capture AI\"\n sponsored=\"Sponsored\"\n copy=\"Turn website visitors into booked leads — <strong>24/7</strong>.\"\n image=\"https://example.com/ad.jpg\"\n site=\"captureai.com\"\n buttonText=\"Get a demo\"\n/>",
|
|
465
|
+
"role": "data",
|
|
466
|
+
"recommendedFor": "any",
|
|
467
|
+
"pack": "hjd",
|
|
468
|
+
"frameworks": [
|
|
469
|
+
"react",
|
|
470
|
+
"astro"
|
|
471
|
+
],
|
|
472
|
+
"aliases": []
|
|
473
|
+
},
|
|
474
|
+
"AdPreviewPair": {
|
|
475
|
+
"description": "A layout container that lays two ad-mockup cards side by side (for example a Meta creative beside a Google text ad), collapsing to a single column on narrow screens. It owns only the responsive two-up grid; the ad cards themselves are passed as children.",
|
|
476
|
+
"props": "children (required) — the ad cards to lay out side by side, typically two. No other props; AdPreviewPair has no styling of its own beyond the grid.",
|
|
477
|
+
"example": "<AdPreviewPair>\n <div className=\"bk-serp-preview\">…meta ad mockup…</div>\n <div className=\"bk-serp-preview\">…google ad mockup…</div>\n</AdPreviewPair>",
|
|
478
|
+
"role": "layout",
|
|
479
|
+
"recommendedFor": "Showing two paid-ad creatives next to each other in advertising / paid-media posts.",
|
|
480
|
+
"pack": "hjd",
|
|
481
|
+
"frameworks": [
|
|
482
|
+
"react",
|
|
483
|
+
"astro"
|
|
484
|
+
],
|
|
485
|
+
"aliases": []
|
|
486
|
+
},
|
|
487
|
+
"AuditScores": {
|
|
488
|
+
"description": "A responsive row of semicircular score gauges (0–100) for audit / scorecard sections. Each card draws a faint track arc plus a coloured progress arc whose sweep reflects the score, a big number, an uppercase label, and an optional sub-line. Tone is automatic from the score: 80+ shows the brand colour, 50–79 a warning amber, below 50 a danger red. Use to summarise a handful of graded dimensions (e.g. SEO, performance, accessibility) at a glance.",
|
|
489
|
+
"props": "items: { label: string; score: number (0–100); sub?: string }[] (each gauge: a short uppercase label, the 0–100 score that drives both the arc sweep and the good/warn/bad tone, and an optional secondary line under the label). No children. Renders nothing when items is empty.",
|
|
490
|
+
"example": "<AuditScores items={[\n { label: \"Performance\", score: 92, sub: \"Core Web Vitals\" },\n { label: \"SEO\", score: 64, sub: \"On-page\" },\n { label: \"Accessibility\", score: 38, sub: \"WCAG AA\" }\n]} />",
|
|
491
|
+
"role": "data",
|
|
492
|
+
"recommendedFor": "review",
|
|
493
|
+
"pack": "hjd",
|
|
494
|
+
"frameworks": [
|
|
495
|
+
"react",
|
|
496
|
+
"astro"
|
|
497
|
+
],
|
|
498
|
+
"aliases": []
|
|
499
|
+
},
|
|
500
|
+
"AuditFindings": {
|
|
501
|
+
"description": "A bordered, divided list of audit findings. Each row leads with a small colour-coded severity dot (high / med / low), then a title and supporting description, with a pill-shaped count on the right. Use to summarise the issues surfaced by an audit — SEO, performance, accessibility, security — as a scannable severity-ranked list.",
|
|
502
|
+
"props": "rows?: AuditFindingRow[] where each row is { title: string (uppercase finding name), description?: string (one-line explanation), count?: string | number (pill-shaped count on the right, e.g. number of affected pages), severity?: \"high\" | \"med\" | \"low\" (tone of the leading dot — danger / warn / success; defaults to \"med\") }. No children.",
|
|
503
|
+
"example": "<AuditFindings rows={[{ title: \"Missing meta descriptions\", description: \"Pages with no description tag.\", count: 14, severity: \"high\" }, { title: \"Slow LCP\", description: \"Largest Contentful Paint over 2.5s.\", count: 6, severity: \"med\" }, { title: \"Image alt text\", description: \"All images have descriptive alt text.\", count: 0, severity: \"low\" }]} />",
|
|
504
|
+
"role": "data",
|
|
505
|
+
"recommendedFor": "any",
|
|
506
|
+
"pack": "hjd",
|
|
507
|
+
"frameworks": [
|
|
508
|
+
"react",
|
|
509
|
+
"astro"
|
|
510
|
+
],
|
|
511
|
+
"aliases": [
|
|
512
|
+
"AuditTable",
|
|
513
|
+
"FindingsList",
|
|
514
|
+
"IssueList"
|
|
515
|
+
]
|
|
516
|
+
},
|
|
517
|
+
"DeliveryComparison": {
|
|
518
|
+
"description": "A flexible multi-column comparison matrix for weighing several options across a set of criteria (e.g. delivery models, pricing tiers, vendors). The first column lists the criterion (with an optional sub-line); each remaining column is one option, with a header label. Use when comparing three or more things, or when a side-by-side of two isn't enough — for exactly two options prefer ComparisonTable. The table scrolls horizontally on narrow screens with edge-fade hints.",
|
|
519
|
+
"props": "columns: string[] — the option/column headers (rendered across the top; a blank header sits above the criterion column). rows: { label: string; sub?: string; values: string[] }[] — one row per criterion; `label` is the bold left-hand cell, optional `sub` is a secondary line beneath it, and `values` holds one cell per column (same order as `columns`). Renders nothing if rows is empty.",
|
|
520
|
+
"example": "<DeliveryComparison\n columns={[\"In-house\", \"Agency\", \"High Jump Digital\"]}\n rows={[\n { label: \"Time to launch\", sub: \"From kickoff\", values: [\"3+ months\", \"6–8 weeks\", \"2 weeks\"] },\n { label: \"Monthly cost\", values: [\"£8k+\", \"£5k\", \"£2.5k\"] },\n { label: \"Reporting\", values: [\"Manual\", \"Monthly deck\", \"Live dashboard\"] }\n ]}\n/>",
|
|
521
|
+
"role": "data",
|
|
522
|
+
"recommendedFor": "any",
|
|
523
|
+
"pack": "hjd",
|
|
524
|
+
"frameworks": [
|
|
525
|
+
"react",
|
|
526
|
+
"astro"
|
|
527
|
+
],
|
|
528
|
+
"aliases": []
|
|
529
|
+
},
|
|
530
|
+
"RegionCallout": {
|
|
531
|
+
"description": "A bordered grid of office / region cells, each pairing a flag-or-colour swatch with an uppercase office name and a brand-coloured monospace phone number. Use to surface multiple regional contact points (e.g. UK / US / EU offices) inside an article.",
|
|
532
|
+
"props": "offices?: Array<{ name: string; phone?: string; flag?: string }>. name: office/region label (rendered uppercase). phone: optional phone number (brand monospace). flag: optional CSS background for the swatch — a colour, gradient, or url(...).",
|
|
533
|
+
"example": "<RegionCallout offices={[{ name: \"London\", phone: \"+44 20 7946 0000\", flag: \"linear-gradient(180deg,#012169 33%,#fff 33%,#fff 66%,#C8102E 66%)\" }, { name: \"New York\", phone: \"+1 212 555 0100\" }]} />",
|
|
534
|
+
"role": "Regional contact / office-directory callout for displaying multiple location phone numbers within blog body content.",
|
|
535
|
+
"pack": "hjd",
|
|
536
|
+
"frameworks": [
|
|
537
|
+
"react",
|
|
538
|
+
"astro"
|
|
539
|
+
],
|
|
540
|
+
"aliases": [
|
|
541
|
+
"OfficeGrid",
|
|
542
|
+
"RegionContacts"
|
|
543
|
+
],
|
|
544
|
+
"recommendedFor": "Listing a handful of regional offices with their phone numbers in a compact bordered grid."
|
|
545
|
+
},
|
|
546
|
+
"ServicePromoCard": {
|
|
547
|
+
"description": "Linked promo row that points readers to a service or related page: an icon tile on the left, a bold uppercase title with an optional sub-line in the middle, and a brand-coloured uppercase arrow label on the right. The entire card is a single link with a brand-tint gradient background and a brand hover border. Use inline within a post to surface a relevant service or next step.",
|
|
548
|
+
"props": "title: string (required, rendered bold uppercase). sub?: string (optional sub-line under the title). href?: string (link target for the whole card, default '#'). icon?: string (raw inline SVG string for the icon tile; defaults to a search glyph). arrowLabel?: string (right-hand call-to-action label, default 'Learn more →'). No children.",
|
|
549
|
+
"example": "<ServicePromoCard title=\"AI chat for your site\" sub=\"See how Capture turns visitors into leads\" href=\"/services/ai-chat\" arrowLabel=\"Learn more →\" />",
|
|
550
|
+
"role": "conversion",
|
|
551
|
+
"pack": "hjd",
|
|
552
|
+
"frameworks": [
|
|
553
|
+
"react",
|
|
554
|
+
"astro"
|
|
555
|
+
],
|
|
556
|
+
"aliases": [],
|
|
557
|
+
"recommendedFor": "Inline mid- or end-of-article link to a service or related page in long-form blog content."
|
|
558
|
+
},
|
|
559
|
+
"ProseList": {
|
|
560
|
+
"description": "A body-copy bullet or ordered list with branded markers — \"ul\" shows a small brand dash before each line, \"ol\" shows zero-padded display-font counters (01, 02, …) in the brand colour. Items are HTML strings (supporting <strong> bold lead-ins), or {title, description} objects — any object item flips the whole list into a two-column grid that aligns bold titles against their descriptions across every row. Optional dashed dividers add breathing room between long items.",
|
|
561
|
+
"props": "variant?: \"ul\" | \"ol\" (default \"ul\"; ul = dash markers, ol = zero-padded counters). items: Array of HTML strings, or {title?: string, description?: string} objects — passing any object with a title or description switches the list to aligned two-column grid mode. divided?: boolean (default false; adds a dashed divider between items). No children.",
|
|
562
|
+
"example": "<ProseList variant=\"ol\" divided items={[{ title: \"Audit the content\", description: \"Map every existing page to a target keyword and intent.\" }, { title: \"Fix the gaps\", description: \"Brief and publish for the queries with no matching page.\" }]} />",
|
|
563
|
+
"role": "structure",
|
|
564
|
+
"recommendedFor": "any",
|
|
565
|
+
"pack": "hjd",
|
|
566
|
+
"frameworks": [
|
|
567
|
+
"react",
|
|
568
|
+
"astro"
|
|
569
|
+
],
|
|
570
|
+
"aliases": []
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$comment": "Frontmatter field docs surfaced by the MCP's get_frontmatter_schema. Allowed categories/templates and validation bounds remain per-site in sites/*.json; the field DOCS live here as the single source of truth. Phase 1 reconciles against the MCP's FRONTMATTER_FIELD_DOCS / OPTIONAL_FRONTMATTER_FIELDS.",
|
|
3
|
+
"required": {
|
|
4
|
+
"title": "50–65 chars. Keyword-first headline.",
|
|
5
|
+
"slug": "URL-safe identifier; the canonical URL key. Never change it after publish (breaks the live URL).",
|
|
6
|
+
"description": "150–160 char meta description.",
|
|
7
|
+
"date": "ISO date (YYYY-MM-DD).",
|
|
8
|
+
"author": "Author display name.",
|
|
9
|
+
"category": "One of the site's allowed categories.",
|
|
10
|
+
"tags": "Array of topical tags.",
|
|
11
|
+
"template": "One of the site's allowed templates (a suggestion, not a constraint).",
|
|
12
|
+
"seoKeyword": "Primary target keyword for the post."
|
|
13
|
+
},
|
|
14
|
+
"optional": {
|
|
15
|
+
"featuredImage": "Absolute URL of the card/hero image.",
|
|
16
|
+
"featuredImageAlt": "Alt text for the featured image.",
|
|
17
|
+
"draft": "true hides the post from the live site on next build."
|
|
18
|
+
}
|
|
19
|
+
}
|