@sonordev/site-kit 2.2.3 → 2.2.4

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.
@@ -3,7 +3,7 @@
3
3
 
4
4
  var chunkUJQYSVYV_js = require('../chunk-UJQYSVYV.js');
5
5
  var chunkGQKBGL2W_js = require('../chunk-GQKBGL2W.js');
6
- var chunkSFX24S3T_js = require('../chunk-SFX24S3T.js');
6
+ var chunkQ5MDMKXC_js = require('../chunk-Q5MDMKXC.js');
7
7
  require('../chunk-ZSMWDLMK.js');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
  var react = require('react');
@@ -883,31 +883,31 @@ Object.defineProperty(exports, "BlogFAQ", {
883
883
  });
884
884
  Object.defineProperty(exports, "BlogList", {
885
885
  enumerable: true,
886
- get: function () { return chunkSFX24S3T_js.BlogList; }
886
+ get: function () { return chunkQ5MDMKXC_js.BlogList; }
887
887
  });
888
888
  Object.defineProperty(exports, "BlogPost", {
889
889
  enumerable: true,
890
- get: function () { return chunkSFX24S3T_js.BlogPost; }
890
+ get: function () { return chunkQ5MDMKXC_js.BlogPost; }
891
891
  });
892
892
  Object.defineProperty(exports, "ServiceCallout", {
893
893
  enumerable: true,
894
- get: function () { return chunkSFX24S3T_js.ServiceCallout; }
894
+ get: function () { return chunkQ5MDMKXC_js.ServiceCallout; }
895
895
  });
896
896
  Object.defineProperty(exports, "ServiceCallouts", {
897
897
  enumerable: true,
898
- get: function () { return chunkSFX24S3T_js.ServiceCallouts; }
898
+ get: function () { return chunkQ5MDMKXC_js.ServiceCallouts; }
899
899
  });
900
900
  Object.defineProperty(exports, "addExternalLinkTargets", {
901
901
  enumerable: true,
902
- get: function () { return chunkSFX24S3T_js.addExternalLinkTargets; }
902
+ get: function () { return chunkQ5MDMKXC_js.addExternalLinkTargets; }
903
903
  });
904
904
  Object.defineProperty(exports, "normalizeSiteHost", {
905
905
  enumerable: true,
906
- get: function () { return chunkSFX24S3T_js.normalizeSiteHost; }
906
+ get: function () { return chunkQ5MDMKXC_js.normalizeSiteHost; }
907
907
  });
908
908
  Object.defineProperty(exports, "resolveBlogSiteUrl", {
909
909
  enumerable: true,
910
- get: function () { return chunkSFX24S3T_js.resolveBlogSiteUrl; }
910
+ get: function () { return chunkQ5MDMKXC_js.resolveBlogSiteUrl; }
911
911
  });
912
912
  exports.AuthorCard = AuthorCard;
913
913
  exports.AuthorPage = AuthorPage;
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  export { BlogFAQ } from '../chunk-PST3NOEM.mjs';
3
3
  import { generateAuthorSchema } from '../chunk-WRCX2NKY.mjs';
4
- export { BlogList, BlogPost, ServiceCallout, ServiceCallouts, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl } from '../chunk-X55IGEXW.mjs';
4
+ export { BlogList, BlogPost, ServiceCallout, ServiceCallouts, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl } from '../chunk-HTP3T36O.mjs';
5
5
  import '../chunk-4XPGGLVP.mjs';
6
6
  import { jsxs, jsx } from 'react/jsx-runtime';
7
7
  import { useState, useEffect } from 'react';
@@ -1,17 +1,17 @@
1
1
  'use strict';
2
2
 
3
- var chunkSFX24S3T_js = require('../chunk-SFX24S3T.js');
3
+ var chunkQ5MDMKXC_js = require('../chunk-Q5MDMKXC.js');
4
4
  require('../chunk-ZSMWDLMK.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "BlogList", {
9
9
  enumerable: true,
10
- get: function () { return chunkSFX24S3T_js.BlogList; }
10
+ get: function () { return chunkQ5MDMKXC_js.BlogList; }
11
11
  });
12
12
  Object.defineProperty(exports, "BlogPost", {
13
13
  enumerable: true,
14
- get: function () { return chunkSFX24S3T_js.BlogPost; }
14
+ get: function () { return chunkQ5MDMKXC_js.BlogPost; }
15
15
  });
16
16
  //# sourceMappingURL=server-ui.js.map
17
17
  //# sourceMappingURL=server-ui.js.map
@@ -1,4 +1,4 @@
1
- export { BlogList, BlogPost } from '../chunk-X55IGEXW.mjs';
1
+ export { BlogList, BlogPost } from '../chunk-HTP3T36O.mjs';
2
2
  import '../chunk-4XPGGLVP.mjs';
3
3
  //# sourceMappingURL=server-ui.mjs.map
4
4
  //# sourceMappingURL=server-ui.mjs.map
@@ -1,4 +1,5 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { marked } from 'marked';
2
3
  import React from 'react';
3
4
 
4
5
  // src/blog/ServiceCallout.tsx
@@ -243,6 +244,17 @@ function addExternalLinkTargets(html, siteUrl) {
243
244
  }
244
245
  });
245
246
  }
247
+ function looksLikeMarkdown(text) {
248
+ if (text.trimStart().startsWith("<")) return false;
249
+ const markers = [/^#{1,6}\s/m, /\*\*[^*]+\*\*/, /\[([^\]]+)\]\([^)]+\)/, /^[-*]\s/m, /^>\s/m];
250
+ let hits = 0;
251
+ for (const re of markers) if (re.test(text)) hits++;
252
+ return hits >= 2;
253
+ }
254
+ function ensureHtml(raw) {
255
+ if (!raw || !looksLikeMarkdown(raw)) return raw;
256
+ return marked.parse(raw, { gfm: true, breaks: false, async: false });
257
+ }
246
258
  async function fetchBlogPost(apiUrl, apiKey, slug) {
247
259
  try {
248
260
  const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {
@@ -346,7 +358,8 @@ async function BlogPost({
346
358
  }
347
359
  );
348
360
  }
349
- const content = post.content_html || post.content || "";
361
+ const rawContent = post.content_html || post.content || "";
362
+ const content = ensureHtml(rawContent);
350
363
  const siteUrlResolved = resolveBlogSiteUrl(siteUrl);
351
364
  const contentWithExternalTargets = addExternalLinkTargets(content, siteUrlResolved);
352
365
  const tableOfContents = showToc ? generateTableOfContents(content) : [];
@@ -1193,5 +1206,5 @@ var paginationLinkStyle = {
1193
1206
  };
1194
1207
 
1195
1208
  export { BlogList, BlogPost, ServiceCallout, ServiceCallouts, addExternalLinkTargets, normalizeSiteHost, resolveBlogSiteUrl };
1196
- //# sourceMappingURL=chunk-X55IGEXW.mjs.map
1197
- //# sourceMappingURL=chunk-X55IGEXW.mjs.map
1209
+ //# sourceMappingURL=chunk-HTP3T36O.mjs.map
1210
+ //# sourceMappingURL=chunk-HTP3T36O.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blog/ServiceCallout.tsx","../src/blog/processBlogHtml.ts","../src/blog/BlogPost.tsx","../src/blog/BlogList.tsx"],"names":["jsxs","jsx","Fragment"],"mappings":"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","file":"chunk-HTP3T36O.mjs","sourcesContent":["/**\n * @sonordev/site-kit/blog - Service Callout / CTA Component\n *\n * Renders a promotional call-to-action section within blog posts.\n * Automatically generated by Signal AI during blog creation, linking\n * article content to the business's relevant services.\n *\n * Two variants:\n * - 'featured' (default): Full-width gradient banner with button\n * - 'inline': Compact card with icon accent\n *\n * Uses site-kit brand tokens (--sk-primary, --sk-bg, etc.) for theming.\n * Supports full Tailwind override via `styles` prop.\n *\n * @example\n * ```tsx\n * <ServiceCallout\n * title=\"Ready to build your MVP?\"\n * description=\"Our team specializes in lean SaaS builds.\"\n * cta=\"Get Started\"\n * url=\"/services/application-development\"\n * />\n * ```\n */\n\nimport React from 'react'\n\nexport interface ServiceCalloutProps {\n title: string\n description?: string\n cta?: string\n url: string\n variant?: 'featured' | 'inline'\n /** Override default styles with Tailwind classes */\n styles?: {\n wrapper?: string\n title?: string\n description?: string\n button?: string\n }\n /** Strip all default styles (BYO Tailwind) */\n unstyled?: boolean\n}\n\n// Default inline styles using CSS custom properties for brand theming\nconst defaults = {\n featured: {\n wrapper: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1.5rem',\n padding: '2rem 2.5rem',\n margin: '3rem 0',\n borderRadius: '1rem',\n background: 'linear-gradient(135deg, color-mix(in srgb, var(--sk-primary, #3b82f6) 8%, transparent), color-mix(in srgb, var(--sk-primary, #3b82f6) 15%, transparent))',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 25%, transparent)',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 700,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.9375rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.5rem',\n maxWidth: '40rem',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.75rem 1.75rem',\n borderRadius: '0.5rem',\n fontWeight: 600,\n fontSize: '0.9375rem',\n color: '#ffffff',\n background: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n transition: 'transform 0.15s, box-shadow 0.15s',\n whiteSpace: 'nowrap' as const,\n },\n },\n inline: {\n wrapper: {\n display: 'flex',\n gap: '1rem',\n padding: '1.25rem 1.5rem',\n margin: '2rem 0',\n borderRadius: '0.75rem',\n background: 'var(--sk-bg-elevated, #f8fafc)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 20%, var(--sk-surface-border, #e2e8f0))',\n },\n icon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.625rem',\n background: 'var(--sk-primary, #3b82f6)',\n color: '#ffffff',\n flexShrink: 0,\n fontSize: '1.125rem',\n },\n title: {\n fontSize: '1rem',\n fontWeight: 600,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.875rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.25rem',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n marginTop: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n },\n },\n}\n\nexport function ServiceCallout({\n title,\n description,\n cta = 'Learn More',\n url,\n variant = 'featured',\n styles,\n unstyled = false,\n}: ServiceCalloutProps) {\n if (variant === 'inline') {\n return (\n <aside\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.inline.wrapper}\n role=\"complementary\"\n aria-label=\"Related service\"\n >\n <div style={unstyled ? undefined : defaults.inline.icon}>→</div>\n <div>\n <h4\n className={styles?.title}\n style={unstyled ? undefined : defaults.inline.title}\n >\n {title}\n </h4>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.inline.description}\n >\n {description}\n </p>\n )}\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.inline.link}\n >\n {cta} →\n </a>\n </div>\n </aside>\n )\n }\n\n // Featured variant (default)\n return (\n <section\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.featured.wrapper}\n role=\"complementary\"\n aria-label=\"Call to action\"\n >\n <div>\n <h3\n className={styles?.title}\n style={unstyled ? undefined : defaults.featured.title}\n >\n {title}\n </h3>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.featured.description}\n >\n {description}\n </p>\n )}\n </div>\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.featured.button}\n >\n {cta} →\n </a>\n </section>\n )\n}\n\n/**\n * Renders all service callouts for a blog post.\n * First callout uses 'featured' variant, subsequent use 'inline'.\n */\nexport function ServiceCallouts({\n callouts,\n styles,\n unstyled,\n}: {\n callouts: Array<{ title: string; description?: string; cta?: string; url: string }>\n styles?: ServiceCalloutProps['styles']\n unstyled?: boolean\n}) {\n if (!callouts || callouts.length === 0) return null\n\n return (\n <>\n {callouts.map((callout, i) => (\n <ServiceCallout\n key={callout.url + i}\n {...callout}\n variant={i === 0 ? 'featured' : 'inline'}\n styles={styles}\n unstyled={unstyled}\n />\n ))}\n </>\n )\n}\n","/**\n * Post-process Portal/blog HTML for safe, consistent link behavior.\n * Server-safe string transforms only (no DOM).\n */\n\n/** Normalize hostname for same-site detection (strips leading www). */\nexport function normalizeSiteHost(siteUrl: string): string {\n try {\n const base = siteUrl.startsWith('http') ? siteUrl : `https://${siteUrl}`\n const u = new URL(base)\n return u.hostname.replace(/^www\\./i, '').toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * Resolve canonical site URL for link classification.\n * Pass `explicit` from props when env vars are not set (e.g. non-Vercel hosts).\n */\nexport function resolveBlogSiteUrl(explicit?: string): string {\n const fromProp = explicit?.trim()\n if (fromProp) return fromProp\n const next = process.env.NEXT_PUBLIC_SITE_URL?.trim()\n if (next) return next\n const site = process.env.SITE_URL?.trim()\n if (site) return site\n const vercel = process.env.VERCEL_URL?.trim()\n if (vercel) return vercel.startsWith('http') ? vercel : `https://${vercel}`\n return ''\n}\n\n/**\n * Add `target=\"_blank\"` and `rel=\"noopener noreferrer\"` to external http(s) links.\n * Same registrable host (with or without `www`) is treated as internal.\n * Skips anchors that already set `target`.\n */\nexport function addExternalLinkTargets(html: string, siteUrl: string): string {\n if (!html || !siteUrl) return html\n const siteHost = normalizeSiteHost(siteUrl)\n if (!siteHost) return html\n\n return html.replace(/<a\\b([^>]*)>/gi, (_full, attrs: string) => {\n const hrefMatch = attrs.match(/\\bhref\\s*=\\s*([\"'])([^\"']*)\\1/i)\n if (!hrefMatch) return `<a${attrs}>`\n const href = hrefMatch[2].trim()\n if (!/^https?:\\/\\//i.test(href)) return `<a${attrs}>`\n\n try {\n const url = new URL(href)\n const linkHost = url.hostname.replace(/^www\\./i, '').toLowerCase()\n if (linkHost === siteHost) return `<a${attrs}>`\n if (/\\btarget\\s*=/i.test(attrs)) return `<a${attrs}>`\n const trimmed = attrs.trim()\n return `<a ${trimmed} target=\"_blank\" rel=\"noopener noreferrer\">`\n } catch {\n return `<a${attrs}>`\n }\n })\n}\n","/**\n * @sonordev/site-kit/blog - Blog Post Component\n * \n * Fetches and displays a single blog post with full content, table of contents,\n * author info, related posts, and SEO metadata support.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogPost\n * slug={params.slug}\n * unstyled\n * styles={{\n * article: 'max-w-4xl mx-auto',\n * header: 'mb-8',\n * breadcrumb: 'text-sm text-gray-500 mb-4',\n * title: 'text-4xl font-bold text-gray-900',\n * subtitle: 'text-xl text-gray-600 mt-4',\n * meta: 'flex gap-4 text-sm text-gray-500 mt-4',\n * featuredImage: 'w-full h-auto rounded-xl',\n * content: 'prose prose-lg max-w-none',\n * tocSidebar: 'sticky top-24 p-4 bg-gray-50 rounded-lg',\n * tocTitle: 'text-sm font-semibold uppercase text-gray-500',\n * tocList: 'space-y-2 mt-3',\n * tocLink: 'text-sm text-gray-600 hover:text-primary-600',\n * tags: 'flex gap-2 mt-8',\n * tag: 'px-3 py-1 bg-gray-100 rounded-full text-sm',\n * faqSection: 'mt-12',\n * faqTitle: 'text-2xl font-bold mb-6',\n * faqItem: 'p-4 bg-gray-50 rounded-lg',\n * authorCard: 'mt-12 p-6 bg-gray-50 rounded-xl',\n * relatedSection: 'mt-12',\n * relatedTitle: 'text-2xl font-bold mb-6',\n * relatedGrid: 'grid md:grid-cols-3 gap-6',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport { marked } from 'marked'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor } from './types'\nimport { ServiceCallouts } from './ServiceCallout'\nimport { addExternalLinkTargets, resolveBlogSiteUrl } from './processBlogHtml'\n\nfunction looksLikeMarkdown(text: string): boolean {\n if (text.trimStart().startsWith('<')) return false\n const markers = [/^#{1,6}\\s/m, /\\*\\*[^*]+\\*\\*/, /\\[([^\\]]+)\\]\\([^)]+\\)/, /^[-*]\\s/m, /^>\\s/m]\n let hits = 0\n for (const re of markers) if (re.test(text)) hits++\n return hits >= 2\n}\n\nfunction ensureHtml(raw: string): string {\n if (!raw || !looksLikeMarkdown(raw)) return raw\n return marked.parse(raw, { gfm: true, breaks: false, async: false }) as string\n}\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogPostStyles {\n /** Article wrapper */\n article?: string\n /** Header section */\n header?: string\n /** Breadcrumb navigation */\n breadcrumb?: string\n /** Breadcrumb link */\n breadcrumbLink?: string\n /** Post title (h1) */\n title?: string\n /** Post subtitle */\n subtitle?: string\n /** Meta info row */\n meta?: string\n /** Meta item */\n metaItem?: string\n /** Featured image wrapper */\n featuredImageWrapper?: string\n /** Featured image */\n featuredImage?: string\n /** Content layout (grid with TOC) */\n contentLayout?: string\n /** Main content wrapper */\n content?: string\n /** Table of contents sidebar */\n tocSidebar?: string\n /** TOC title */\n tocTitle?: string\n /** TOC list */\n tocList?: string\n /** TOC list item */\n tocItem?: string\n /** TOC link */\n tocLink?: string\n /** Tags container */\n tags?: string\n /** Individual tag */\n tag?: string\n /** FAQ section */\n faqSection?: string\n /** FAQ title */\n faqTitle?: string\n /** FAQ item container */\n faqItem?: string\n /** FAQ question (summary) */\n faqQuestion?: string\n /** FAQ answer */\n faqAnswer?: string\n /** Author card section */\n authorCard?: string\n /** Related posts section */\n relatedSection?: string\n /** Related posts title */\n relatedTitle?: string\n /** Related posts grid */\n relatedGrid?: string\n /** Related post card */\n relatedCard?: string\n /** Not found state */\n notFound?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchBlogPost(\n apiUrl: string,\n apiKey: string,\n slug: string\n): Promise<BlogPostType | null> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) {\n if (response.status === 404) return null\n console.error('[Blog] Failed to fetch post:', response.statusText)\n return null\n }\n\n const data = await response.json()\n return data.post\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\nasync function fetchRelatedPosts(\n apiUrl: string,\n apiKey: string,\n postId: string,\n limit: number = 3\n): Promise<BlogPostType[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ current_post_id: postId, limit }),\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// TOC GENERATION\n// ============================================================================\n\nfunction generateTableOfContents(html: string): TocItem[] {\n const headingRegex = /<h([2-4])[^>]*(?:id=\"([^\"]*)\")?[^>]*>(.*?)<\\/h[2-4]>/gi\n const items: TocItem[] = []\n let match\n\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const existingId = match[2]\n const text = match[3].replace(/<[^>]*>/g, '') // Strip nested HTML\n const id = existingId || slugify(text)\n\n items.push({ id, text, level })\n }\n\n return items\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n}\n\n// ============================================================================\n// BLOG POST COMPONENT\n// ============================================================================\n\nexport interface BlogPostServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Blog post slug */\n slug: string\n /** Show table of contents sidebar */\n showToc?: boolean\n /** Show related posts */\n showRelated?: boolean\n /** Number of related posts */\n relatedCount?: number\n /** Show author card */\n showAuthor?: boolean\n /** Base URL for blog links */\n basePath?: string\n /** Custom class name (applied to article) */\n className?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogPostStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /**\n * Canonical site URL (e.g. https://example.com) for classifying internal vs external links in post body and FAQ HTML.\n * Defaults to NEXT_PUBLIC_SITE_URL, SITE_URL, or VERCEL_URL.\n */\n siteUrl?: string\n /** Custom render function */\n children?: (props: {\n post: BlogPostType\n tableOfContents: TocItem[]\n relatedPosts: BlogPostType[]\n }) => React.ReactNode\n}\n\nexport async function BlogPost({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n slug,\n showToc = true,\n showRelated = true,\n relatedCount = 3,\n showAuthor = true,\n basePath = '/blog',\n className,\n styles = {},\n unstyled = false,\n siteUrl,\n children,\n}: BlogPostServerProps) {\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogPostStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n const post = await fetchBlogPost(apiUrl, apiKey, slug)\n\n if (!post) {\n return (\n <div \n className={`${styles.notFound || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 60 }, 'notFound')}\n >\n <h1 style={inlineStyle({ fontSize: 24, marginBottom: 16 }, 'notFound')}>Post Not Found</h1>\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'notFound')}>\n The blog post you're looking for doesn't exist or has been removed.\n </p>\n <a\n href={basePath}\n style={inlineStyle({\n display: 'inline-block',\n marginTop: 24,\n padding: '12px 24px',\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n borderRadius: 8,\n textDecoration: 'none',\n }, 'notFound')}\n >\n ← Back to Blog\n </a>\n </div>\n )\n }\n\n const rawContent = post.content_html || post.content || ''\n const content = ensureHtml(rawContent)\n const siteUrlResolved = resolveBlogSiteUrl(siteUrl)\n const contentWithExternalTargets = addExternalLinkTargets(content, siteUrlResolved)\n const tableOfContents = showToc ? generateTableOfContents(content) : []\n const relatedPosts = showRelated\n ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount)\n : []\n\n const faqRaw = (post.faq_items ?? (post as { faqItems?: unknown }).faqItems) as\n | Array<{ question: string; answer: string }>\n | undefined\n const faqItemsProcessed =\n faqRaw?.map((item) => ({\n ...item,\n answer: addExternalLinkTargets(item.answer || '', siteUrlResolved),\n })) ?? faqRaw\n\n // Custom render\n if (children) {\n return children({ post, tableOfContents, relatedPosts })\n }\n\n const { BlogPostFaqSection } = await import('./BlogPostFaqSection')\n\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n return (\n <article className={`${styles.article || ''} ${className || ''}`.trim() || undefined}>\n {/* Header */}\n <header \n className={styles.header}\n style={inlineStyle({ marginBottom: 32 }, 'header')}\n >\n {/* Breadcrumb */}\n <nav \n className={styles.breadcrumb}\n style={inlineStyle({ marginBottom: 16, fontSize: 14, color: 'var(--sk-text-secondary)' }, 'breadcrumb')}\n >\n <a \n href={basePath} \n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n Blog\n </a>\n {post.category && (\n <>\n <span style={inlineStyle({ margin: '0 8px' }, 'breadcrumb')}>/</span>\n <a\n href={`${basePath}?category=${post.category}`}\n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n {/* Title */}\n <h1 \n className={styles.title}\n style={inlineStyle({ fontSize: 36, fontWeight: 700, lineHeight: 1.2, marginBottom: 16 }, 'title')}\n >\n {post.title}\n </h1>\n\n {/* Subtitle */}\n {post.subtitle && (\n <p \n className={styles.subtitle}\n style={inlineStyle({ fontSize: 20, color: 'var(--sk-text-secondary)', marginBottom: 16 }, 'subtitle')}\n >\n {post.subtitle}\n </p>\n )}\n\n {/* Meta */}\n <div \n className={styles.meta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 16, flexWrap: 'wrap' }, 'meta')}\n >\n {post.author && (\n <span \n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-primary)' }, 'metaItem')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {date && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)' }, 'metaItem')}\n >\n {date}\n </span>\n )}\n {post.reading_time_minutes && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-tertiary)' }, 'metaItem')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </header>\n\n {/* Featured Image */}\n {post.featured_image && (\n <figure \n className={styles.featuredImageWrapper}\n style={inlineStyle({ margin: '0 0 32px' }, 'featuredImageWrapper')}\n >\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.featuredImage}\n style={inlineStyle({\n width: '100%',\n maxHeight: 500,\n objectFit: 'cover',\n borderRadius: 12,\n }, 'featuredImage')}\n />\n </figure>\n )}\n\n {/* Content Layout with TOC */}\n <div\n className={styles.contentLayout}\n style={inlineStyle({\n display: showToc && tableOfContents.length > 0 ? 'grid' : 'block',\n gridTemplateColumns: showToc && tableOfContents.length > 0 ? '1fr 250px' : undefined,\n gap: 48,\n }, 'contentLayout')}\n >\n {/* Main Content */}\n <div\n className={`blog-content ${styles.content || ''}`.trim()}\n style={inlineStyle({\n fontSize: 17,\n lineHeight: 1.8,\n color: 'var(--sk-text-primary)',\n }, 'content')}\n dangerouslySetInnerHTML={{ __html: contentWithExternalTargets }}\n />\n\n {/* Table of Contents Sidebar */}\n {showToc && tableOfContents.length > 0 && (\n <aside\n className={styles.tocSidebar}\n style={inlineStyle({\n position: 'sticky',\n top: 100,\n alignSelf: 'start',\n padding: 20,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n }, 'tocSidebar')}\n >\n <h4\n className={styles.tocTitle}\n style={inlineStyle({\n margin: '0 0 12px',\n fontSize: 12,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--sk-text-secondary)',\n }, 'tocTitle')}\n >\n On This Page\n </h4>\n <ul \n className={styles.tocList}\n style={inlineStyle({ listStyle: 'none', margin: 0, padding: 0 }, 'tocList')}\n >\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n className={styles.tocItem}\n style={inlineStyle({\n paddingLeft: (item.level - 2) * 12,\n marginBottom: 8,\n }, 'tocItem')}\n >\n <a\n href={`#${item.id}`}\n className={styles.tocLink}\n style={inlineStyle({\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n textDecoration: 'none',\n }, 'tocLink')}\n >\n {item.text}\n </a>\n </li>\n ))}\n </ul>\n </aside>\n )}\n </div>\n\n {/* Tags */}\n {post.tags && post.tags.length > 0 && (\n <div \n className={styles.tags}\n style={inlineStyle({ marginTop: 32, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'tags')}\n >\n {post.tags.map((tag, index) => {\n const tagName = typeof tag === 'string' ? tag : tag?.name || '';\n return (\n <a\n key={`${tagName}-${index}`}\n href={`${basePath}?tag=${tagName}`}\n className={styles.tag}\n style={inlineStyle({\n padding: '4px 12px',\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 9999,\n fontSize: 13,\n color: 'var(--sk-text-primary)',\n textDecoration: 'none',\n }, 'tag')}\n >\n #{tagName}\n </a>\n );\n })}\n </div>\n )}\n\n {/* Service Callouts / CTAs (generated by Signal AI from business offerings) */}\n <ServiceCallouts\n callouts={(post as any).service_callouts ?? (post as any).serviceCallouts ?? []}\n unstyled={unstyled}\n />\n\n {/* FAQ Section — interactive accordion (SEO: content in DOM, not hidden) */}\n <BlogPostFaqSection\n items={(faqItemsProcessed ?? []) as any[]}\n unstyled={unstyled}\n styles={unstyled ? {\n section: styles.faqSection,\n title: styles.faqTitle,\n item: styles.faqItem,\n question: styles.faqQuestion,\n answerInner: styles.faqAnswer,\n } : undefined}\n />\n\n {/* Author Card (supports BlogAuthor or E-E-A-T author shape) */}\n {showAuthor && post.author && typeof post.author === 'object' && (\n <AuthorSection author={normalizeAuthorForDisplay(post.author)} className={styles.authorCard} unstyled={unstyled} />\n )}\n\n {/* Related Posts */}\n {showRelated && relatedPosts.length > 0 && (\n <section \n className={styles.relatedSection}\n style={inlineStyle({ marginTop: 48 }, 'relatedSection')}\n >\n <h2 \n className={styles.relatedTitle}\n style={inlineStyle({ fontSize: 24, fontWeight: 600, marginBottom: 24 }, 'relatedTitle')}\n >\n Related Posts\n </h2>\n <div\n className={styles.relatedGrid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',\n gap: 24,\n }, 'relatedGrid')}\n >\n {relatedPosts.map((relatedPost) => (\n <article\n key={relatedPost.id}\n className={styles.relatedCard}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }, 'relatedCard')}\n >\n {relatedPost.featured_image && (\n <a href={`${basePath}/${relatedPost.slug}`}>\n <img\n src={relatedPost.featured_image}\n alt={relatedPost.title}\n style={inlineStyle({ width: '100%', height: 150, objectFit: 'cover' }, 'relatedCard')}\n />\n </a>\n )}\n <div style={inlineStyle({ padding: 16 }, 'relatedCard')}>\n <h3 style={inlineStyle({ fontSize: 16, fontWeight: 600, marginBottom: 8 }, 'relatedCard')}>\n <a\n href={`${basePath}/${relatedPost.slug}`}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'relatedCard')}\n >\n {relatedPost.title}\n </a>\n </h3>\n {relatedPost.excerpt && (\n <p style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)', margin: 0 }, 'relatedCard')}>\n {relatedPost.excerpt.slice(0, 100)}...\n </p>\n )}\n </div>\n </article>\n ))}\n </div>\n </section>\n )}\n </article>\n )\n}\n\n// ============================================================================\n// AUTHOR NORMALIZATION (BlogAuthor + E-E-A-T shapes)\n// ============================================================================\n\n/** Normalize author from Portal: supports BlogAuthor (avatar_url, social_links) or E-E-A-T (image, url, socialProfiles) */\nfunction normalizeAuthorForDisplay(\n author: Record<string, unknown> | BlogAuthor\n): BlogAuthor & { sameAs?: string[]; title?: string } {\n const a = author as Record<string, unknown>\n const avatarUrl =\n (a.avatar_url as string) ?? (a.image as string) ?? (a.image_url as string)\n const socialLinks = a.social_links as BlogAuthor['social_links'] | undefined\n const socialProfiles = a.socialProfiles as string[] | undefined\n return {\n id: (a.id as string) ?? 'author',\n project_id: (a.project_id as string) ?? '',\n name: (a.name as string) ?? 'Author',\n slug: (a.slug as string) ?? 'author',\n bio: (a.bio as string) ?? undefined,\n avatar_url: avatarUrl ?? undefined,\n email: (a.email as string) ?? undefined,\n website: (a.website as string) ?? (a.url as string) ?? undefined,\n social_links: socialLinks ?? undefined,\n is_active: (a.is_active as boolean) ?? true,\n ...(socialProfiles?.length ? { sameAs: socialProfiles } : {}),\n ...(a.title ? { title: a.title as string } : {}),\n } as BlogAuthor & { sameAs?: string[]; title?: string }\n}\n\n// ============================================================================\n// AUTHOR SECTION\n// ============================================================================\n\nfunction AuthorSection({\n author,\n className,\n unstyled = false,\n}: {\n author: BlogAuthor & { sameAs?: string[]; title?: string }\n className?: string\n unstyled?: boolean\n}) {\n return (\n <section\n className={className}\n style={unstyled || className ? undefined : {\n marginTop: 48,\n padding: 24,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n display: 'flex',\n gap: 20,\n alignItems: 'flex-start',\n }}\n >\n {author.avatar_url && (\n <img\n src={author.avatar_url}\n alt={author.name}\n style={unstyled || className ? undefined : {\n width: 80,\n height: 80,\n borderRadius: '50%',\n objectFit: 'cover',\n }}\n />\n )}\n <div>\n <h3 style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 18, fontWeight: 600 }}>\n {author.name}\n </h3>\n {'title' in author && author.title && (\n <p style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 14, color: 'var(--sk-text-secondary)' }}>\n {author.title}\n </p>\n )}\n {author.bio && (\n <p style={unstyled || className ? undefined : { margin: '0 0 12px', color: 'var(--sk-text-secondary)', fontSize: 14 }}>\n {author.bio}\n </p>\n )}\n {author.social_links && (\n <div style={unstyled || className ? undefined : { display: 'flex', gap: 16 }}>\n {author.social_links.twitter && (\n <a\n href={`https://twitter.com/${author.social_links.twitter}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Twitter\n </a>\n )}\n {author.social_links.linkedin && (\n <a\n href={author.social_links.linkedin}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n LinkedIn\n </a>\n )}\n </div>\n )}\n {'sameAs' in author && author.sameAs && author.sameAs.length > 0 && !author.social_links && (\n <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap' }}>\n {author.sameAs.map((url, i) => (\n <a\n key={i}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Profile\n </a>\n ))}\n </div>\n )}\n </div>\n </section>\n )\n}","/**\n * @sonordev/site-kit/blog - Blog List Component\n * \n * Fetches and displays a list of blog posts with pagination, filtering, and sorting.\n * Supports both server-side and client-side rendering.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogList\n * styles={{\n * container: 'max-w-7xl mx-auto px-4',\n * categoryNav: 'flex flex-wrap gap-2 mb-8',\n * categoryLink: 'px-4 py-2 rounded-full text-sm font-medium',\n * categoryLinkActive: 'bg-primary-600 text-white',\n * categoryLinkInactive: 'bg-gray-100 text-gray-700 hover:bg-gray-200',\n * grid: 'grid md:grid-cols-2 lg:grid-cols-3 gap-8',\n * card: 'bg-white rounded-xl shadow-sm hover:shadow-lg transition-shadow',\n * cardImage: 'w-full h-48 object-cover',\n * cardBody: 'p-6',\n * cardTitle: 'text-xl font-bold text-gray-900',\n * cardExcerpt: 'text-gray-600 line-clamp-3',\n * cardMeta: 'text-sm text-gray-500',\n * pagination: 'flex justify-center gap-4 mt-12',\n * paginationLink: 'px-6 py-3 bg-primary-600 text-white rounded-lg',\n * emptyState: 'text-center py-12 text-gray-500',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogListStyles {\n /** Container wrapper */\n container?: string\n /** Category navigation wrapper */\n categoryNav?: string\n /** Individual category link */\n categoryLink?: string\n /** Active category link (combined with categoryLink) */\n categoryLinkActive?: string\n /** Inactive category link (combined with categoryLink) */\n categoryLinkInactive?: string\n /** Posts grid container */\n grid?: string\n /** Individual post card */\n card?: string\n /** Card image wrapper */\n cardImageWrapper?: string\n /** Card image */\n cardImage?: string\n /** Card body/content area */\n cardBody?: string\n /** Card meta row (date, category) */\n cardMeta?: string\n /** Card category badge */\n cardCategory?: string\n /** Card date */\n cardDate?: string\n /** Card title */\n cardTitle?: string\n /** Card title link */\n cardTitleLink?: string\n /** Card excerpt */\n cardExcerpt?: string\n /** Card footer */\n cardFooter?: string\n /** Card author */\n cardAuthor?: string\n /** Card reading time */\n cardReadingTime?: string\n /** Card read more link */\n cardReadMore?: string\n /** Pagination container */\n pagination?: string\n /** Pagination link */\n paginationLink?: string\n /** Pagination info text */\n paginationInfo?: string\n /** Empty state */\n emptyState?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\ninterface FetchBlogListParams {\n apiUrl: string\n apiKey: string\n category?: string\n tag?: string\n author?: string\n featured?: boolean\n search?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n}\n\nasync function fetchBlogList(params: FetchBlogListParams): Promise<BlogListResult> {\n const {\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n } = params\n\n const queryParams = new URLSearchParams()\n if (category) queryParams.set('category', category)\n if (tag) queryParams.set('tag', tag)\n if (author) queryParams.set('author', author)\n if (featured) queryParams.set('featured', 'true')\n if (search) queryParams.set('search', search)\n queryParams.set('page', String(page))\n queryParams.set('per_page', String(perPage))\n queryParams.set('order_by', orderBy)\n queryParams.set('order', order)\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts?${queryParams}`, {\n headers: {\n 'x-api-key': apiKey,\n },\n next: { revalidate: 60 }, // Revalidate every 60 seconds\n })\n\n if (!response.ok) {\n console.error('[Blog] Failed to fetch posts:', response.statusText)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n\n const data = await response.json()\n \n return {\n posts: data.posts || [],\n pagination: {\n page: data.pagination?.page || 1,\n perPage: data.pagination?.per_page || 12,\n total: data.pagination?.total || 0,\n totalPages: data.pagination?.total_pages || 0,\n hasNext: data.pagination?.has_next || false,\n hasPrev: data.pagination?.has_prev || false,\n },\n }\n } catch (error) {\n console.error('[Blog] Error fetching posts:', error)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n}\n\nasync function fetchCategories(apiUrl: string, apiKey: string): Promise<BlogCategory[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 }, // Cache for 5 minutes\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n// ============================================================================\n// BLOG LIST COMPONENT\n// ============================================================================\n\nexport interface BlogListServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Filter by category slug */\n category?: string\n /** Filter by tag */\n tag?: string\n /** Filter by author */\n author?: string\n /** Only featured posts */\n featured?: boolean\n /** Search query */\n search?: string\n /** Page number (1-indexed) */\n page?: number\n /** Items per page */\n perPage?: number\n /** Sort field */\n orderBy?: 'published_at' | 'title' | 'view_count'\n /** Sort direction */\n order?: 'asc' | 'desc'\n /** Show category filter UI */\n showCategoryFilter?: boolean\n /** Show pagination */\n showPagination?: boolean\n /** Custom class name (applied to container) */\n className?: string\n /** Base URL for post links */\n basePath?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogListStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /** Custom render function for post card */\n renderPost?: (post: BlogPost) => React.ReactNode\n /** Custom render function for entire grid */\n children?: (props: {\n posts: BlogPost[]\n pagination: BlogListResult['pagination']\n categories: BlogCategory[]\n }) => React.ReactNode\n}\n\nexport async function BlogList({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n showCategoryFilter = false,\n showPagination = true,\n className,\n basePath = '/blog',\n styles = {},\n unstyled = false,\n renderPost,\n children,\n}: BlogListServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n // Fetch data in parallel\n const [blogData, categories] = await Promise.all([\n fetchBlogList({\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page,\n perPage,\n orderBy,\n order,\n }),\n showCategoryFilter ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n ])\n\n // Use custom render function if provided\n if (children) {\n return children({ posts: blogData.posts, pagination: blogData.pagination, categories })\n }\n\n const { posts, pagination } = blogData\n\n if (posts.length === 0) {\n return (\n <div \n className={`${styles.container || ''} ${styles.emptyState || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 40 }, 'emptyState')}\n >\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'emptyState')}>No posts found.</p>\n </div>\n )\n }\n\n return (\n <div className={`${styles.container || ''} ${className || ''}`.trim() || undefined}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav \n className={styles.categoryNav}\n style={inlineStyle({ marginBottom: 24, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'categoryNav')}\n >\n <a\n href={basePath}\n className={`${styles.categoryLink || ''} ${!category ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: !category ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: !category ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={`${basePath}?category=${cat.slug}`}\n className={`${styles.categoryLink || ''} ${category === cat.slug ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: category === cat.slug ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: category === cat.slug ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div\n className={styles.grid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 24,\n }, 'grid')}\n >\n {posts.map((post) =>\n renderPost ? (\n <React.Fragment key={post.id}>{renderPost(post)}</React.Fragment>\n ) : (\n <BlogPostCard key={post.id} post={post} basePath={basePath} styles={styles} unstyled={unstyled} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav\n className={styles.pagination}\n style={inlineStyle({\n marginTop: 40,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n }, 'pagination')}\n >\n {pagination.hasPrev && (\n <a\n href={buildPaginationUrl(basePath, page - 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n ← Previous\n </a>\n )}\n \n <span \n className={styles.paginationInfo}\n style={inlineStyle({ padding: '8px 16px', color: 'var(--sk-text-secondary)' }, 'paginationInfo')}\n >\n Page {pagination.page} of {pagination.totalPages}\n </span>\n \n {pagination.hasNext && (\n <a\n href={buildPaginationUrl(basePath, page + 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n Next →\n </a>\n )}\n </nav>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// BLOG POST CARD (Default rendering)\n// ============================================================================\n\ninterface BlogPostCardProps {\n post: BlogPost\n basePath: string\n styles?: BlogListStyles\n unstyled?: boolean\n}\n\nfunction BlogPostCard({ post, basePath, styles = {}, unstyled = false }: BlogPostCardProps) {\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n return (\n <article\n className={styles.card}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n transition: 'box-shadow 0.2s, transform 0.2s',\n }, 'card')}\n >\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`} className={styles.cardImageWrapper}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.cardImage}\n style={inlineStyle({\n width: '100%',\n height: 200,\n objectFit: 'cover',\n }, 'cardImage')}\n />\n </a>\n )}\n \n <div \n className={styles.cardBody}\n style={inlineStyle({ padding: 20 }, 'cardBody')}\n >\n {/* Meta */}\n <div \n className={styles.cardMeta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }, 'cardMeta')}\n >\n {post.category && (\n <span\n className={styles.cardCategory}\n style={inlineStyle({\n padding: '2px 8px',\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: 'rgba(var(--sk-primary-rgb), 0.1)',\n color: 'var(--sk-primary)',\n textTransform: 'uppercase',\n }, 'cardCategory')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {date && (\n <span \n className={styles.cardDate}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardDate')}\n >\n {date}\n </span>\n )}\n </div>\n\n {/* Title */}\n <h3 \n className={styles.cardTitle}\n style={inlineStyle({ margin: '0 0 8px', fontSize: 18, fontWeight: 600, lineHeight: 1.4 }, 'cardTitle')}\n >\n <a\n href={`${basePath}/${post.slug}`}\n className={styles.cardTitleLink}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'cardTitleLink')}\n >\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p\n className={styles.cardExcerpt}\n style={inlineStyle({\n margin: '0 0 16px',\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n lineHeight: 1.6,\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }, 'cardExcerpt')}\n >\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div \n className={styles.cardFooter}\n style={inlineStyle({ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, 'cardFooter')}\n >\n {post.author && (\n <span \n className={styles.cardAuthor}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardAuthor')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.reading_time_minutes && (\n <span \n className={styles.cardReadingTime}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-tertiary)' }, 'cardReadingTime')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction buildPaginationUrl(basePath: string, page: number, category?: string): string {\n const params = new URLSearchParams()\n params.set('page', String(page))\n if (category) params.set('category', category)\n return `${basePath}?${params}`\n}\n\nconst paginationLinkStyle: React.CSSProperties = {\n padding: '8px 16px',\n borderRadius: 8,\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n textDecoration: 'none',\n fontSize: 14,\n fontWeight: 500,\n}"]}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
+ var marked = require('marked');
4
5
  var React = require('react');
5
6
 
6
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -249,6 +250,17 @@ function addExternalLinkTargets(html, siteUrl) {
249
250
  }
250
251
  });
251
252
  }
253
+ function looksLikeMarkdown(text) {
254
+ if (text.trimStart().startsWith("<")) return false;
255
+ const markers = [/^#{1,6}\s/m, /\*\*[^*]+\*\*/, /\[([^\]]+)\]\([^)]+\)/, /^[-*]\s/m, /^>\s/m];
256
+ let hits = 0;
257
+ for (const re of markers) if (re.test(text)) hits++;
258
+ return hits >= 2;
259
+ }
260
+ function ensureHtml(raw) {
261
+ if (!raw || !looksLikeMarkdown(raw)) return raw;
262
+ return marked.marked.parse(raw, { gfm: true, breaks: false, async: false });
263
+ }
252
264
  async function fetchBlogPost(apiUrl, apiKey, slug) {
253
265
  try {
254
266
  const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {
@@ -352,7 +364,8 @@ async function BlogPost({
352
364
  }
353
365
  );
354
366
  }
355
- const content = post.content_html || post.content || "";
367
+ const rawContent = post.content_html || post.content || "";
368
+ const content = ensureHtml(rawContent);
356
369
  const siteUrlResolved = resolveBlogSiteUrl(siteUrl);
357
370
  const contentWithExternalTargets = addExternalLinkTargets(content, siteUrlResolved);
358
371
  const tableOfContents = showToc ? generateTableOfContents(content) : [];
@@ -1205,5 +1218,5 @@ exports.ServiceCallouts = ServiceCallouts;
1205
1218
  exports.addExternalLinkTargets = addExternalLinkTargets;
1206
1219
  exports.normalizeSiteHost = normalizeSiteHost;
1207
1220
  exports.resolveBlogSiteUrl = resolveBlogSiteUrl;
1208
- //# sourceMappingURL=chunk-SFX24S3T.js.map
1209
- //# sourceMappingURL=chunk-SFX24S3T.js.map
1221
+ //# sourceMappingURL=chunk-Q5MDMKXC.js.map
1222
+ //# sourceMappingURL=chunk-Q5MDMKXC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/blog/ServiceCallout.tsx","../src/blog/processBlogHtml.ts","../src/blog/BlogPost.tsx","../src/blog/BlogList.tsx"],"names":["jsxs","jsx","Fragment","marked","React"],"mappings":"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","file":"chunk-Q5MDMKXC.js","sourcesContent":["/**\n * @sonordev/site-kit/blog - Service Callout / CTA Component\n *\n * Renders a promotional call-to-action section within blog posts.\n * Automatically generated by Signal AI during blog creation, linking\n * article content to the business's relevant services.\n *\n * Two variants:\n * - 'featured' (default): Full-width gradient banner with button\n * - 'inline': Compact card with icon accent\n *\n * Uses site-kit brand tokens (--sk-primary, --sk-bg, etc.) for theming.\n * Supports full Tailwind override via `styles` prop.\n *\n * @example\n * ```tsx\n * <ServiceCallout\n * title=\"Ready to build your MVP?\"\n * description=\"Our team specializes in lean SaaS builds.\"\n * cta=\"Get Started\"\n * url=\"/services/application-development\"\n * />\n * ```\n */\n\nimport React from 'react'\n\nexport interface ServiceCalloutProps {\n title: string\n description?: string\n cta?: string\n url: string\n variant?: 'featured' | 'inline'\n /** Override default styles with Tailwind classes */\n styles?: {\n wrapper?: string\n title?: string\n description?: string\n button?: string\n }\n /** Strip all default styles (BYO Tailwind) */\n unstyled?: boolean\n}\n\n// Default inline styles using CSS custom properties for brand theming\nconst defaults = {\n featured: {\n wrapper: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1.5rem',\n padding: '2rem 2.5rem',\n margin: '3rem 0',\n borderRadius: '1rem',\n background: 'linear-gradient(135deg, color-mix(in srgb, var(--sk-primary, #3b82f6) 8%, transparent), color-mix(in srgb, var(--sk-primary, #3b82f6) 15%, transparent))',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 25%, transparent)',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 700,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.9375rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.5rem',\n maxWidth: '40rem',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.75rem 1.75rem',\n borderRadius: '0.5rem',\n fontWeight: 600,\n fontSize: '0.9375rem',\n color: '#ffffff',\n background: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n transition: 'transform 0.15s, box-shadow 0.15s',\n whiteSpace: 'nowrap' as const,\n },\n },\n inline: {\n wrapper: {\n display: 'flex',\n gap: '1rem',\n padding: '1.25rem 1.5rem',\n margin: '2rem 0',\n borderRadius: '0.75rem',\n background: 'var(--sk-bg-elevated, #f8fafc)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 20%, var(--sk-surface-border, #e2e8f0))',\n },\n icon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.625rem',\n background: 'var(--sk-primary, #3b82f6)',\n color: '#ffffff',\n flexShrink: 0,\n fontSize: '1.125rem',\n },\n title: {\n fontSize: '1rem',\n fontWeight: 600,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.875rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.25rem',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n marginTop: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n },\n },\n}\n\nexport function ServiceCallout({\n title,\n description,\n cta = 'Learn More',\n url,\n variant = 'featured',\n styles,\n unstyled = false,\n}: ServiceCalloutProps) {\n if (variant === 'inline') {\n return (\n <aside\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.inline.wrapper}\n role=\"complementary\"\n aria-label=\"Related service\"\n >\n <div style={unstyled ? undefined : defaults.inline.icon}>→</div>\n <div>\n <h4\n className={styles?.title}\n style={unstyled ? undefined : defaults.inline.title}\n >\n {title}\n </h4>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.inline.description}\n >\n {description}\n </p>\n )}\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.inline.link}\n >\n {cta} →\n </a>\n </div>\n </aside>\n )\n }\n\n // Featured variant (default)\n return (\n <section\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.featured.wrapper}\n role=\"complementary\"\n aria-label=\"Call to action\"\n >\n <div>\n <h3\n className={styles?.title}\n style={unstyled ? undefined : defaults.featured.title}\n >\n {title}\n </h3>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.featured.description}\n >\n {description}\n </p>\n )}\n </div>\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.featured.button}\n >\n {cta} →\n </a>\n </section>\n )\n}\n\n/**\n * Renders all service callouts for a blog post.\n * First callout uses 'featured' variant, subsequent use 'inline'.\n */\nexport function ServiceCallouts({\n callouts,\n styles,\n unstyled,\n}: {\n callouts: Array<{ title: string; description?: string; cta?: string; url: string }>\n styles?: ServiceCalloutProps['styles']\n unstyled?: boolean\n}) {\n if (!callouts || callouts.length === 0) return null\n\n return (\n <>\n {callouts.map((callout, i) => (\n <ServiceCallout\n key={callout.url + i}\n {...callout}\n variant={i === 0 ? 'featured' : 'inline'}\n styles={styles}\n unstyled={unstyled}\n />\n ))}\n </>\n )\n}\n","/**\n * Post-process Portal/blog HTML for safe, consistent link behavior.\n * Server-safe string transforms only (no DOM).\n */\n\n/** Normalize hostname for same-site detection (strips leading www). */\nexport function normalizeSiteHost(siteUrl: string): string {\n try {\n const base = siteUrl.startsWith('http') ? siteUrl : `https://${siteUrl}`\n const u = new URL(base)\n return u.hostname.replace(/^www\\./i, '').toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * Resolve canonical site URL for link classification.\n * Pass `explicit` from props when env vars are not set (e.g. non-Vercel hosts).\n */\nexport function resolveBlogSiteUrl(explicit?: string): string {\n const fromProp = explicit?.trim()\n if (fromProp) return fromProp\n const next = process.env.NEXT_PUBLIC_SITE_URL?.trim()\n if (next) return next\n const site = process.env.SITE_URL?.trim()\n if (site) return site\n const vercel = process.env.VERCEL_URL?.trim()\n if (vercel) return vercel.startsWith('http') ? vercel : `https://${vercel}`\n return ''\n}\n\n/**\n * Add `target=\"_blank\"` and `rel=\"noopener noreferrer\"` to external http(s) links.\n * Same registrable host (with or without `www`) is treated as internal.\n * Skips anchors that already set `target`.\n */\nexport function addExternalLinkTargets(html: string, siteUrl: string): string {\n if (!html || !siteUrl) return html\n const siteHost = normalizeSiteHost(siteUrl)\n if (!siteHost) return html\n\n return html.replace(/<a\\b([^>]*)>/gi, (_full, attrs: string) => {\n const hrefMatch = attrs.match(/\\bhref\\s*=\\s*([\"'])([^\"']*)\\1/i)\n if (!hrefMatch) return `<a${attrs}>`\n const href = hrefMatch[2].trim()\n if (!/^https?:\\/\\//i.test(href)) return `<a${attrs}>`\n\n try {\n const url = new URL(href)\n const linkHost = url.hostname.replace(/^www\\./i, '').toLowerCase()\n if (linkHost === siteHost) return `<a${attrs}>`\n if (/\\btarget\\s*=/i.test(attrs)) return `<a${attrs}>`\n const trimmed = attrs.trim()\n return `<a ${trimmed} target=\"_blank\" rel=\"noopener noreferrer\">`\n } catch {\n return `<a${attrs}>`\n }\n })\n}\n","/**\n * @sonordev/site-kit/blog - Blog Post Component\n * \n * Fetches and displays a single blog post with full content, table of contents,\n * author info, related posts, and SEO metadata support.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogPost\n * slug={params.slug}\n * unstyled\n * styles={{\n * article: 'max-w-4xl mx-auto',\n * header: 'mb-8',\n * breadcrumb: 'text-sm text-gray-500 mb-4',\n * title: 'text-4xl font-bold text-gray-900',\n * subtitle: 'text-xl text-gray-600 mt-4',\n * meta: 'flex gap-4 text-sm text-gray-500 mt-4',\n * featuredImage: 'w-full h-auto rounded-xl',\n * content: 'prose prose-lg max-w-none',\n * tocSidebar: 'sticky top-24 p-4 bg-gray-50 rounded-lg',\n * tocTitle: 'text-sm font-semibold uppercase text-gray-500',\n * tocList: 'space-y-2 mt-3',\n * tocLink: 'text-sm text-gray-600 hover:text-primary-600',\n * tags: 'flex gap-2 mt-8',\n * tag: 'px-3 py-1 bg-gray-100 rounded-full text-sm',\n * faqSection: 'mt-12',\n * faqTitle: 'text-2xl font-bold mb-6',\n * faqItem: 'p-4 bg-gray-50 rounded-lg',\n * authorCard: 'mt-12 p-6 bg-gray-50 rounded-xl',\n * relatedSection: 'mt-12',\n * relatedTitle: 'text-2xl font-bold mb-6',\n * relatedGrid: 'grid md:grid-cols-3 gap-6',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport { marked } from 'marked'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor } from './types'\nimport { ServiceCallouts } from './ServiceCallout'\nimport { addExternalLinkTargets, resolveBlogSiteUrl } from './processBlogHtml'\n\nfunction looksLikeMarkdown(text: string): boolean {\n if (text.trimStart().startsWith('<')) return false\n const markers = [/^#{1,6}\\s/m, /\\*\\*[^*]+\\*\\*/, /\\[([^\\]]+)\\]\\([^)]+\\)/, /^[-*]\\s/m, /^>\\s/m]\n let hits = 0\n for (const re of markers) if (re.test(text)) hits++\n return hits >= 2\n}\n\nfunction ensureHtml(raw: string): string {\n if (!raw || !looksLikeMarkdown(raw)) return raw\n return marked.parse(raw, { gfm: true, breaks: false, async: false }) as string\n}\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogPostStyles {\n /** Article wrapper */\n article?: string\n /** Header section */\n header?: string\n /** Breadcrumb navigation */\n breadcrumb?: string\n /** Breadcrumb link */\n breadcrumbLink?: string\n /** Post title (h1) */\n title?: string\n /** Post subtitle */\n subtitle?: string\n /** Meta info row */\n meta?: string\n /** Meta item */\n metaItem?: string\n /** Featured image wrapper */\n featuredImageWrapper?: string\n /** Featured image */\n featuredImage?: string\n /** Content layout (grid with TOC) */\n contentLayout?: string\n /** Main content wrapper */\n content?: string\n /** Table of contents sidebar */\n tocSidebar?: string\n /** TOC title */\n tocTitle?: string\n /** TOC list */\n tocList?: string\n /** TOC list item */\n tocItem?: string\n /** TOC link */\n tocLink?: string\n /** Tags container */\n tags?: string\n /** Individual tag */\n tag?: string\n /** FAQ section */\n faqSection?: string\n /** FAQ title */\n faqTitle?: string\n /** FAQ item container */\n faqItem?: string\n /** FAQ question (summary) */\n faqQuestion?: string\n /** FAQ answer */\n faqAnswer?: string\n /** Author card section */\n authorCard?: string\n /** Related posts section */\n relatedSection?: string\n /** Related posts title */\n relatedTitle?: string\n /** Related posts grid */\n relatedGrid?: string\n /** Related post card */\n relatedCard?: string\n /** Not found state */\n notFound?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchBlogPost(\n apiUrl: string,\n apiKey: string,\n slug: string\n): Promise<BlogPostType | null> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) {\n if (response.status === 404) return null\n console.error('[Blog] Failed to fetch post:', response.statusText)\n return null\n }\n\n const data = await response.json()\n return data.post\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\nasync function fetchRelatedPosts(\n apiUrl: string,\n apiKey: string,\n postId: string,\n limit: number = 3\n): Promise<BlogPostType[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ current_post_id: postId, limit }),\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// TOC GENERATION\n// ============================================================================\n\nfunction generateTableOfContents(html: string): TocItem[] {\n const headingRegex = /<h([2-4])[^>]*(?:id=\"([^\"]*)\")?[^>]*>(.*?)<\\/h[2-4]>/gi\n const items: TocItem[] = []\n let match\n\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const existingId = match[2]\n const text = match[3].replace(/<[^>]*>/g, '') // Strip nested HTML\n const id = existingId || slugify(text)\n\n items.push({ id, text, level })\n }\n\n return items\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n}\n\n// ============================================================================\n// BLOG POST COMPONENT\n// ============================================================================\n\nexport interface BlogPostServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Blog post slug */\n slug: string\n /** Show table of contents sidebar */\n showToc?: boolean\n /** Show related posts */\n showRelated?: boolean\n /** Number of related posts */\n relatedCount?: number\n /** Show author card */\n showAuthor?: boolean\n /** Base URL for blog links */\n basePath?: string\n /** Custom class name (applied to article) */\n className?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogPostStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /**\n * Canonical site URL (e.g. https://example.com) for classifying internal vs external links in post body and FAQ HTML.\n * Defaults to NEXT_PUBLIC_SITE_URL, SITE_URL, or VERCEL_URL.\n */\n siteUrl?: string\n /** Custom render function */\n children?: (props: {\n post: BlogPostType\n tableOfContents: TocItem[]\n relatedPosts: BlogPostType[]\n }) => React.ReactNode\n}\n\nexport async function BlogPost({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n slug,\n showToc = true,\n showRelated = true,\n relatedCount = 3,\n showAuthor = true,\n basePath = '/blog',\n className,\n styles = {},\n unstyled = false,\n siteUrl,\n children,\n}: BlogPostServerProps) {\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogPostStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n const post = await fetchBlogPost(apiUrl, apiKey, slug)\n\n if (!post) {\n return (\n <div \n className={`${styles.notFound || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 60 }, 'notFound')}\n >\n <h1 style={inlineStyle({ fontSize: 24, marginBottom: 16 }, 'notFound')}>Post Not Found</h1>\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'notFound')}>\n The blog post you're looking for doesn't exist or has been removed.\n </p>\n <a\n href={basePath}\n style={inlineStyle({\n display: 'inline-block',\n marginTop: 24,\n padding: '12px 24px',\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n borderRadius: 8,\n textDecoration: 'none',\n }, 'notFound')}\n >\n ← Back to Blog\n </a>\n </div>\n )\n }\n\n const rawContent = post.content_html || post.content || ''\n const content = ensureHtml(rawContent)\n const siteUrlResolved = resolveBlogSiteUrl(siteUrl)\n const contentWithExternalTargets = addExternalLinkTargets(content, siteUrlResolved)\n const tableOfContents = showToc ? generateTableOfContents(content) : []\n const relatedPosts = showRelated\n ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount)\n : []\n\n const faqRaw = (post.faq_items ?? (post as { faqItems?: unknown }).faqItems) as\n | Array<{ question: string; answer: string }>\n | undefined\n const faqItemsProcessed =\n faqRaw?.map((item) => ({\n ...item,\n answer: addExternalLinkTargets(item.answer || '', siteUrlResolved),\n })) ?? faqRaw\n\n // Custom render\n if (children) {\n return children({ post, tableOfContents, relatedPosts })\n }\n\n const { BlogPostFaqSection } = await import('./BlogPostFaqSection')\n\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n return (\n <article className={`${styles.article || ''} ${className || ''}`.trim() || undefined}>\n {/* Header */}\n <header \n className={styles.header}\n style={inlineStyle({ marginBottom: 32 }, 'header')}\n >\n {/* Breadcrumb */}\n <nav \n className={styles.breadcrumb}\n style={inlineStyle({ marginBottom: 16, fontSize: 14, color: 'var(--sk-text-secondary)' }, 'breadcrumb')}\n >\n <a \n href={basePath} \n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n Blog\n </a>\n {post.category && (\n <>\n <span style={inlineStyle({ margin: '0 8px' }, 'breadcrumb')}>/</span>\n <a\n href={`${basePath}?category=${post.category}`}\n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n {/* Title */}\n <h1 \n className={styles.title}\n style={inlineStyle({ fontSize: 36, fontWeight: 700, lineHeight: 1.2, marginBottom: 16 }, 'title')}\n >\n {post.title}\n </h1>\n\n {/* Subtitle */}\n {post.subtitle && (\n <p \n className={styles.subtitle}\n style={inlineStyle({ fontSize: 20, color: 'var(--sk-text-secondary)', marginBottom: 16 }, 'subtitle')}\n >\n {post.subtitle}\n </p>\n )}\n\n {/* Meta */}\n <div \n className={styles.meta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 16, flexWrap: 'wrap' }, 'meta')}\n >\n {post.author && (\n <span \n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-primary)' }, 'metaItem')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {date && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)' }, 'metaItem')}\n >\n {date}\n </span>\n )}\n {post.reading_time_minutes && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-tertiary)' }, 'metaItem')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </header>\n\n {/* Featured Image */}\n {post.featured_image && (\n <figure \n className={styles.featuredImageWrapper}\n style={inlineStyle({ margin: '0 0 32px' }, 'featuredImageWrapper')}\n >\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.featuredImage}\n style={inlineStyle({\n width: '100%',\n maxHeight: 500,\n objectFit: 'cover',\n borderRadius: 12,\n }, 'featuredImage')}\n />\n </figure>\n )}\n\n {/* Content Layout with TOC */}\n <div\n className={styles.contentLayout}\n style={inlineStyle({\n display: showToc && tableOfContents.length > 0 ? 'grid' : 'block',\n gridTemplateColumns: showToc && tableOfContents.length > 0 ? '1fr 250px' : undefined,\n gap: 48,\n }, 'contentLayout')}\n >\n {/* Main Content */}\n <div\n className={`blog-content ${styles.content || ''}`.trim()}\n style={inlineStyle({\n fontSize: 17,\n lineHeight: 1.8,\n color: 'var(--sk-text-primary)',\n }, 'content')}\n dangerouslySetInnerHTML={{ __html: contentWithExternalTargets }}\n />\n\n {/* Table of Contents Sidebar */}\n {showToc && tableOfContents.length > 0 && (\n <aside\n className={styles.tocSidebar}\n style={inlineStyle({\n position: 'sticky',\n top: 100,\n alignSelf: 'start',\n padding: 20,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n }, 'tocSidebar')}\n >\n <h4\n className={styles.tocTitle}\n style={inlineStyle({\n margin: '0 0 12px',\n fontSize: 12,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--sk-text-secondary)',\n }, 'tocTitle')}\n >\n On This Page\n </h4>\n <ul \n className={styles.tocList}\n style={inlineStyle({ listStyle: 'none', margin: 0, padding: 0 }, 'tocList')}\n >\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n className={styles.tocItem}\n style={inlineStyle({\n paddingLeft: (item.level - 2) * 12,\n marginBottom: 8,\n }, 'tocItem')}\n >\n <a\n href={`#${item.id}`}\n className={styles.tocLink}\n style={inlineStyle({\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n textDecoration: 'none',\n }, 'tocLink')}\n >\n {item.text}\n </a>\n </li>\n ))}\n </ul>\n </aside>\n )}\n </div>\n\n {/* Tags */}\n {post.tags && post.tags.length > 0 && (\n <div \n className={styles.tags}\n style={inlineStyle({ marginTop: 32, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'tags')}\n >\n {post.tags.map((tag, index) => {\n const tagName = typeof tag === 'string' ? tag : tag?.name || '';\n return (\n <a\n key={`${tagName}-${index}`}\n href={`${basePath}?tag=${tagName}`}\n className={styles.tag}\n style={inlineStyle({\n padding: '4px 12px',\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 9999,\n fontSize: 13,\n color: 'var(--sk-text-primary)',\n textDecoration: 'none',\n }, 'tag')}\n >\n #{tagName}\n </a>\n );\n })}\n </div>\n )}\n\n {/* Service Callouts / CTAs (generated by Signal AI from business offerings) */}\n <ServiceCallouts\n callouts={(post as any).service_callouts ?? (post as any).serviceCallouts ?? []}\n unstyled={unstyled}\n />\n\n {/* FAQ Section — interactive accordion (SEO: content in DOM, not hidden) */}\n <BlogPostFaqSection\n items={(faqItemsProcessed ?? []) as any[]}\n unstyled={unstyled}\n styles={unstyled ? {\n section: styles.faqSection,\n title: styles.faqTitle,\n item: styles.faqItem,\n question: styles.faqQuestion,\n answerInner: styles.faqAnswer,\n } : undefined}\n />\n\n {/* Author Card (supports BlogAuthor or E-E-A-T author shape) */}\n {showAuthor && post.author && typeof post.author === 'object' && (\n <AuthorSection author={normalizeAuthorForDisplay(post.author)} className={styles.authorCard} unstyled={unstyled} />\n )}\n\n {/* Related Posts */}\n {showRelated && relatedPosts.length > 0 && (\n <section \n className={styles.relatedSection}\n style={inlineStyle({ marginTop: 48 }, 'relatedSection')}\n >\n <h2 \n className={styles.relatedTitle}\n style={inlineStyle({ fontSize: 24, fontWeight: 600, marginBottom: 24 }, 'relatedTitle')}\n >\n Related Posts\n </h2>\n <div\n className={styles.relatedGrid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',\n gap: 24,\n }, 'relatedGrid')}\n >\n {relatedPosts.map((relatedPost) => (\n <article\n key={relatedPost.id}\n className={styles.relatedCard}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }, 'relatedCard')}\n >\n {relatedPost.featured_image && (\n <a href={`${basePath}/${relatedPost.slug}`}>\n <img\n src={relatedPost.featured_image}\n alt={relatedPost.title}\n style={inlineStyle({ width: '100%', height: 150, objectFit: 'cover' }, 'relatedCard')}\n />\n </a>\n )}\n <div style={inlineStyle({ padding: 16 }, 'relatedCard')}>\n <h3 style={inlineStyle({ fontSize: 16, fontWeight: 600, marginBottom: 8 }, 'relatedCard')}>\n <a\n href={`${basePath}/${relatedPost.slug}`}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'relatedCard')}\n >\n {relatedPost.title}\n </a>\n </h3>\n {relatedPost.excerpt && (\n <p style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)', margin: 0 }, 'relatedCard')}>\n {relatedPost.excerpt.slice(0, 100)}...\n </p>\n )}\n </div>\n </article>\n ))}\n </div>\n </section>\n )}\n </article>\n )\n}\n\n// ============================================================================\n// AUTHOR NORMALIZATION (BlogAuthor + E-E-A-T shapes)\n// ============================================================================\n\n/** Normalize author from Portal: supports BlogAuthor (avatar_url, social_links) or E-E-A-T (image, url, socialProfiles) */\nfunction normalizeAuthorForDisplay(\n author: Record<string, unknown> | BlogAuthor\n): BlogAuthor & { sameAs?: string[]; title?: string } {\n const a = author as Record<string, unknown>\n const avatarUrl =\n (a.avatar_url as string) ?? (a.image as string) ?? (a.image_url as string)\n const socialLinks = a.social_links as BlogAuthor['social_links'] | undefined\n const socialProfiles = a.socialProfiles as string[] | undefined\n return {\n id: (a.id as string) ?? 'author',\n project_id: (a.project_id as string) ?? '',\n name: (a.name as string) ?? 'Author',\n slug: (a.slug as string) ?? 'author',\n bio: (a.bio as string) ?? undefined,\n avatar_url: avatarUrl ?? undefined,\n email: (a.email as string) ?? undefined,\n website: (a.website as string) ?? (a.url as string) ?? undefined,\n social_links: socialLinks ?? undefined,\n is_active: (a.is_active as boolean) ?? true,\n ...(socialProfiles?.length ? { sameAs: socialProfiles } : {}),\n ...(a.title ? { title: a.title as string } : {}),\n } as BlogAuthor & { sameAs?: string[]; title?: string }\n}\n\n// ============================================================================\n// AUTHOR SECTION\n// ============================================================================\n\nfunction AuthorSection({\n author,\n className,\n unstyled = false,\n}: {\n author: BlogAuthor & { sameAs?: string[]; title?: string }\n className?: string\n unstyled?: boolean\n}) {\n return (\n <section\n className={className}\n style={unstyled || className ? undefined : {\n marginTop: 48,\n padding: 24,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n display: 'flex',\n gap: 20,\n alignItems: 'flex-start',\n }}\n >\n {author.avatar_url && (\n <img\n src={author.avatar_url}\n alt={author.name}\n style={unstyled || className ? undefined : {\n width: 80,\n height: 80,\n borderRadius: '50%',\n objectFit: 'cover',\n }}\n />\n )}\n <div>\n <h3 style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 18, fontWeight: 600 }}>\n {author.name}\n </h3>\n {'title' in author && author.title && (\n <p style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 14, color: 'var(--sk-text-secondary)' }}>\n {author.title}\n </p>\n )}\n {author.bio && (\n <p style={unstyled || className ? undefined : { margin: '0 0 12px', color: 'var(--sk-text-secondary)', fontSize: 14 }}>\n {author.bio}\n </p>\n )}\n {author.social_links && (\n <div style={unstyled || className ? undefined : { display: 'flex', gap: 16 }}>\n {author.social_links.twitter && (\n <a\n href={`https://twitter.com/${author.social_links.twitter}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Twitter\n </a>\n )}\n {author.social_links.linkedin && (\n <a\n href={author.social_links.linkedin}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n LinkedIn\n </a>\n )}\n </div>\n )}\n {'sameAs' in author && author.sameAs && author.sameAs.length > 0 && !author.social_links && (\n <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap' }}>\n {author.sameAs.map((url, i) => (\n <a\n key={i}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Profile\n </a>\n ))}\n </div>\n )}\n </div>\n </section>\n )\n}","/**\n * @sonordev/site-kit/blog - Blog List Component\n * \n * Fetches and displays a list of blog posts with pagination, filtering, and sorting.\n * Supports both server-side and client-side rendering.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogList\n * styles={{\n * container: 'max-w-7xl mx-auto px-4',\n * categoryNav: 'flex flex-wrap gap-2 mb-8',\n * categoryLink: 'px-4 py-2 rounded-full text-sm font-medium',\n * categoryLinkActive: 'bg-primary-600 text-white',\n * categoryLinkInactive: 'bg-gray-100 text-gray-700 hover:bg-gray-200',\n * grid: 'grid md:grid-cols-2 lg:grid-cols-3 gap-8',\n * card: 'bg-white rounded-xl shadow-sm hover:shadow-lg transition-shadow',\n * cardImage: 'w-full h-48 object-cover',\n * cardBody: 'p-6',\n * cardTitle: 'text-xl font-bold text-gray-900',\n * cardExcerpt: 'text-gray-600 line-clamp-3',\n * cardMeta: 'text-sm text-gray-500',\n * pagination: 'flex justify-center gap-4 mt-12',\n * paginationLink: 'px-6 py-3 bg-primary-600 text-white rounded-lg',\n * emptyState: 'text-center py-12 text-gray-500',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogListStyles {\n /** Container wrapper */\n container?: string\n /** Category navigation wrapper */\n categoryNav?: string\n /** Individual category link */\n categoryLink?: string\n /** Active category link (combined with categoryLink) */\n categoryLinkActive?: string\n /** Inactive category link (combined with categoryLink) */\n categoryLinkInactive?: string\n /** Posts grid container */\n grid?: string\n /** Individual post card */\n card?: string\n /** Card image wrapper */\n cardImageWrapper?: string\n /** Card image */\n cardImage?: string\n /** Card body/content area */\n cardBody?: string\n /** Card meta row (date, category) */\n cardMeta?: string\n /** Card category badge */\n cardCategory?: string\n /** Card date */\n cardDate?: string\n /** Card title */\n cardTitle?: string\n /** Card title link */\n cardTitleLink?: string\n /** Card excerpt */\n cardExcerpt?: string\n /** Card footer */\n cardFooter?: string\n /** Card author */\n cardAuthor?: string\n /** Card reading time */\n cardReadingTime?: string\n /** Card read more link */\n cardReadMore?: string\n /** Pagination container */\n pagination?: string\n /** Pagination link */\n paginationLink?: string\n /** Pagination info text */\n paginationInfo?: string\n /** Empty state */\n emptyState?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\ninterface FetchBlogListParams {\n apiUrl: string\n apiKey: string\n category?: string\n tag?: string\n author?: string\n featured?: boolean\n search?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n}\n\nasync function fetchBlogList(params: FetchBlogListParams): Promise<BlogListResult> {\n const {\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n } = params\n\n const queryParams = new URLSearchParams()\n if (category) queryParams.set('category', category)\n if (tag) queryParams.set('tag', tag)\n if (author) queryParams.set('author', author)\n if (featured) queryParams.set('featured', 'true')\n if (search) queryParams.set('search', search)\n queryParams.set('page', String(page))\n queryParams.set('per_page', String(perPage))\n queryParams.set('order_by', orderBy)\n queryParams.set('order', order)\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts?${queryParams}`, {\n headers: {\n 'x-api-key': apiKey,\n },\n next: { revalidate: 60 }, // Revalidate every 60 seconds\n })\n\n if (!response.ok) {\n console.error('[Blog] Failed to fetch posts:', response.statusText)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n\n const data = await response.json()\n \n return {\n posts: data.posts || [],\n pagination: {\n page: data.pagination?.page || 1,\n perPage: data.pagination?.per_page || 12,\n total: data.pagination?.total || 0,\n totalPages: data.pagination?.total_pages || 0,\n hasNext: data.pagination?.has_next || false,\n hasPrev: data.pagination?.has_prev || false,\n },\n }\n } catch (error) {\n console.error('[Blog] Error fetching posts:', error)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n}\n\nasync function fetchCategories(apiUrl: string, apiKey: string): Promise<BlogCategory[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 }, // Cache for 5 minutes\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n// ============================================================================\n// BLOG LIST COMPONENT\n// ============================================================================\n\nexport interface BlogListServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Filter by category slug */\n category?: string\n /** Filter by tag */\n tag?: string\n /** Filter by author */\n author?: string\n /** Only featured posts */\n featured?: boolean\n /** Search query */\n search?: string\n /** Page number (1-indexed) */\n page?: number\n /** Items per page */\n perPage?: number\n /** Sort field */\n orderBy?: 'published_at' | 'title' | 'view_count'\n /** Sort direction */\n order?: 'asc' | 'desc'\n /** Show category filter UI */\n showCategoryFilter?: boolean\n /** Show pagination */\n showPagination?: boolean\n /** Custom class name (applied to container) */\n className?: string\n /** Base URL for post links */\n basePath?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogListStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /** Custom render function for post card */\n renderPost?: (post: BlogPost) => React.ReactNode\n /** Custom render function for entire grid */\n children?: (props: {\n posts: BlogPost[]\n pagination: BlogListResult['pagination']\n categories: BlogCategory[]\n }) => React.ReactNode\n}\n\nexport async function BlogList({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n showCategoryFilter = false,\n showPagination = true,\n className,\n basePath = '/blog',\n styles = {},\n unstyled = false,\n renderPost,\n children,\n}: BlogListServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n // Fetch data in parallel\n const [blogData, categories] = await Promise.all([\n fetchBlogList({\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page,\n perPage,\n orderBy,\n order,\n }),\n showCategoryFilter ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n ])\n\n // Use custom render function if provided\n if (children) {\n return children({ posts: blogData.posts, pagination: blogData.pagination, categories })\n }\n\n const { posts, pagination } = blogData\n\n if (posts.length === 0) {\n return (\n <div \n className={`${styles.container || ''} ${styles.emptyState || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 40 }, 'emptyState')}\n >\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'emptyState')}>No posts found.</p>\n </div>\n )\n }\n\n return (\n <div className={`${styles.container || ''} ${className || ''}`.trim() || undefined}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav \n className={styles.categoryNav}\n style={inlineStyle({ marginBottom: 24, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'categoryNav')}\n >\n <a\n href={basePath}\n className={`${styles.categoryLink || ''} ${!category ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: !category ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: !category ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={`${basePath}?category=${cat.slug}`}\n className={`${styles.categoryLink || ''} ${category === cat.slug ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: category === cat.slug ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: category === cat.slug ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div\n className={styles.grid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 24,\n }, 'grid')}\n >\n {posts.map((post) =>\n renderPost ? (\n <React.Fragment key={post.id}>{renderPost(post)}</React.Fragment>\n ) : (\n <BlogPostCard key={post.id} post={post} basePath={basePath} styles={styles} unstyled={unstyled} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav\n className={styles.pagination}\n style={inlineStyle({\n marginTop: 40,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n }, 'pagination')}\n >\n {pagination.hasPrev && (\n <a\n href={buildPaginationUrl(basePath, page - 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n ← Previous\n </a>\n )}\n \n <span \n className={styles.paginationInfo}\n style={inlineStyle({ padding: '8px 16px', color: 'var(--sk-text-secondary)' }, 'paginationInfo')}\n >\n Page {pagination.page} of {pagination.totalPages}\n </span>\n \n {pagination.hasNext && (\n <a\n href={buildPaginationUrl(basePath, page + 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n Next →\n </a>\n )}\n </nav>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// BLOG POST CARD (Default rendering)\n// ============================================================================\n\ninterface BlogPostCardProps {\n post: BlogPost\n basePath: string\n styles?: BlogListStyles\n unstyled?: boolean\n}\n\nfunction BlogPostCard({ post, basePath, styles = {}, unstyled = false }: BlogPostCardProps) {\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n return (\n <article\n className={styles.card}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n transition: 'box-shadow 0.2s, transform 0.2s',\n }, 'card')}\n >\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`} className={styles.cardImageWrapper}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.cardImage}\n style={inlineStyle({\n width: '100%',\n height: 200,\n objectFit: 'cover',\n }, 'cardImage')}\n />\n </a>\n )}\n \n <div \n className={styles.cardBody}\n style={inlineStyle({ padding: 20 }, 'cardBody')}\n >\n {/* Meta */}\n <div \n className={styles.cardMeta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }, 'cardMeta')}\n >\n {post.category && (\n <span\n className={styles.cardCategory}\n style={inlineStyle({\n padding: '2px 8px',\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: 'rgba(var(--sk-primary-rgb), 0.1)',\n color: 'var(--sk-primary)',\n textTransform: 'uppercase',\n }, 'cardCategory')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {date && (\n <span \n className={styles.cardDate}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardDate')}\n >\n {date}\n </span>\n )}\n </div>\n\n {/* Title */}\n <h3 \n className={styles.cardTitle}\n style={inlineStyle({ margin: '0 0 8px', fontSize: 18, fontWeight: 600, lineHeight: 1.4 }, 'cardTitle')}\n >\n <a\n href={`${basePath}/${post.slug}`}\n className={styles.cardTitleLink}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'cardTitleLink')}\n >\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p\n className={styles.cardExcerpt}\n style={inlineStyle({\n margin: '0 0 16px',\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n lineHeight: 1.6,\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }, 'cardExcerpt')}\n >\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div \n className={styles.cardFooter}\n style={inlineStyle({ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, 'cardFooter')}\n >\n {post.author && (\n <span \n className={styles.cardAuthor}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardAuthor')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.reading_time_minutes && (\n <span \n className={styles.cardReadingTime}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-tertiary)' }, 'cardReadingTime')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction buildPaginationUrl(basePath: string, page: number, category?: string): string {\n const params = new URLSearchParams()\n params.set('page', String(page))\n if (category) params.set('category', category)\n return `${basePath}?${params}`\n}\n\nconst paginationLinkStyle: React.CSSProperties = {\n padding: '8px 16px',\n borderRadius: 8,\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n textDecoration: 'none',\n fontSize: 14,\n fontWeight: 500,\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sonordev/site-kit",
3
- "version": "2.2.3",
3
+ "version": "2.2.4",
4
4
  "description": "Complete client-side integration kit for Sonor - SEO, Analytics, Engage, Forms, Blog",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
@@ -187,6 +187,7 @@
187
187
  "dotenv": "^17.2.3",
188
188
  "glob": "^10.3.0",
189
189
  "inquirer": "^9.2.0",
190
+ "marked": "^17.0.5",
190
191
  "open": "^10.0.0",
191
192
  "ora": "^8.0.0",
192
193
  "react-markdown": "^9.0.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/blog/ServiceCallout.tsx","../src/blog/processBlogHtml.ts","../src/blog/BlogPost.tsx","../src/blog/BlogList.tsx"],"names":["jsxs","jsx","Fragment","React"],"mappings":"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","file":"chunk-SFX24S3T.js","sourcesContent":["/**\n * @sonordev/site-kit/blog - Service Callout / CTA Component\n *\n * Renders a promotional call-to-action section within blog posts.\n * Automatically generated by Signal AI during blog creation, linking\n * article content to the business's relevant services.\n *\n * Two variants:\n * - 'featured' (default): Full-width gradient banner with button\n * - 'inline': Compact card with icon accent\n *\n * Uses site-kit brand tokens (--sk-primary, --sk-bg, etc.) for theming.\n * Supports full Tailwind override via `styles` prop.\n *\n * @example\n * ```tsx\n * <ServiceCallout\n * title=\"Ready to build your MVP?\"\n * description=\"Our team specializes in lean SaaS builds.\"\n * cta=\"Get Started\"\n * url=\"/services/application-development\"\n * />\n * ```\n */\n\nimport React from 'react'\n\nexport interface ServiceCalloutProps {\n title: string\n description?: string\n cta?: string\n url: string\n variant?: 'featured' | 'inline'\n /** Override default styles with Tailwind classes */\n styles?: {\n wrapper?: string\n title?: string\n description?: string\n button?: string\n }\n /** Strip all default styles (BYO Tailwind) */\n unstyled?: boolean\n}\n\n// Default inline styles using CSS custom properties for brand theming\nconst defaults = {\n featured: {\n wrapper: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1.5rem',\n padding: '2rem 2.5rem',\n margin: '3rem 0',\n borderRadius: '1rem',\n background: 'linear-gradient(135deg, color-mix(in srgb, var(--sk-primary, #3b82f6) 8%, transparent), color-mix(in srgb, var(--sk-primary, #3b82f6) 15%, transparent))',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 25%, transparent)',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 700,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.9375rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.5rem',\n maxWidth: '40rem',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.75rem 1.75rem',\n borderRadius: '0.5rem',\n fontWeight: 600,\n fontSize: '0.9375rem',\n color: '#ffffff',\n background: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n transition: 'transform 0.15s, box-shadow 0.15s',\n whiteSpace: 'nowrap' as const,\n },\n },\n inline: {\n wrapper: {\n display: 'flex',\n gap: '1rem',\n padding: '1.25rem 1.5rem',\n margin: '2rem 0',\n borderRadius: '0.75rem',\n background: 'var(--sk-bg-elevated, #f8fafc)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 20%, var(--sk-surface-border, #e2e8f0))',\n },\n icon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.625rem',\n background: 'var(--sk-primary, #3b82f6)',\n color: '#ffffff',\n flexShrink: 0,\n fontSize: '1.125rem',\n },\n title: {\n fontSize: '1rem',\n fontWeight: 600,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.875rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.25rem',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n marginTop: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n },\n },\n}\n\nexport function ServiceCallout({\n title,\n description,\n cta = 'Learn More',\n url,\n variant = 'featured',\n styles,\n unstyled = false,\n}: ServiceCalloutProps) {\n if (variant === 'inline') {\n return (\n <aside\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.inline.wrapper}\n role=\"complementary\"\n aria-label=\"Related service\"\n >\n <div style={unstyled ? undefined : defaults.inline.icon}>→</div>\n <div>\n <h4\n className={styles?.title}\n style={unstyled ? undefined : defaults.inline.title}\n >\n {title}\n </h4>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.inline.description}\n >\n {description}\n </p>\n )}\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.inline.link}\n >\n {cta} →\n </a>\n </div>\n </aside>\n )\n }\n\n // Featured variant (default)\n return (\n <section\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.featured.wrapper}\n role=\"complementary\"\n aria-label=\"Call to action\"\n >\n <div>\n <h3\n className={styles?.title}\n style={unstyled ? undefined : defaults.featured.title}\n >\n {title}\n </h3>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.featured.description}\n >\n {description}\n </p>\n )}\n </div>\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.featured.button}\n >\n {cta} →\n </a>\n </section>\n )\n}\n\n/**\n * Renders all service callouts for a blog post.\n * First callout uses 'featured' variant, subsequent use 'inline'.\n */\nexport function ServiceCallouts({\n callouts,\n styles,\n unstyled,\n}: {\n callouts: Array<{ title: string; description?: string; cta?: string; url: string }>\n styles?: ServiceCalloutProps['styles']\n unstyled?: boolean\n}) {\n if (!callouts || callouts.length === 0) return null\n\n return (\n <>\n {callouts.map((callout, i) => (\n <ServiceCallout\n key={callout.url + i}\n {...callout}\n variant={i === 0 ? 'featured' : 'inline'}\n styles={styles}\n unstyled={unstyled}\n />\n ))}\n </>\n )\n}\n","/**\n * Post-process Portal/blog HTML for safe, consistent link behavior.\n * Server-safe string transforms only (no DOM).\n */\n\n/** Normalize hostname for same-site detection (strips leading www). */\nexport function normalizeSiteHost(siteUrl: string): string {\n try {\n const base = siteUrl.startsWith('http') ? siteUrl : `https://${siteUrl}`\n const u = new URL(base)\n return u.hostname.replace(/^www\\./i, '').toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * Resolve canonical site URL for link classification.\n * Pass `explicit` from props when env vars are not set (e.g. non-Vercel hosts).\n */\nexport function resolveBlogSiteUrl(explicit?: string): string {\n const fromProp = explicit?.trim()\n if (fromProp) return fromProp\n const next = process.env.NEXT_PUBLIC_SITE_URL?.trim()\n if (next) return next\n const site = process.env.SITE_URL?.trim()\n if (site) return site\n const vercel = process.env.VERCEL_URL?.trim()\n if (vercel) return vercel.startsWith('http') ? vercel : `https://${vercel}`\n return ''\n}\n\n/**\n * Add `target=\"_blank\"` and `rel=\"noopener noreferrer\"` to external http(s) links.\n * Same registrable host (with or without `www`) is treated as internal.\n * Skips anchors that already set `target`.\n */\nexport function addExternalLinkTargets(html: string, siteUrl: string): string {\n if (!html || !siteUrl) return html\n const siteHost = normalizeSiteHost(siteUrl)\n if (!siteHost) return html\n\n return html.replace(/<a\\b([^>]*)>/gi, (_full, attrs: string) => {\n const hrefMatch = attrs.match(/\\bhref\\s*=\\s*([\"'])([^\"']*)\\1/i)\n if (!hrefMatch) return `<a${attrs}>`\n const href = hrefMatch[2].trim()\n if (!/^https?:\\/\\//i.test(href)) return `<a${attrs}>`\n\n try {\n const url = new URL(href)\n const linkHost = url.hostname.replace(/^www\\./i, '').toLowerCase()\n if (linkHost === siteHost) return `<a${attrs}>`\n if (/\\btarget\\s*=/i.test(attrs)) return `<a${attrs}>`\n const trimmed = attrs.trim()\n return `<a ${trimmed} target=\"_blank\" rel=\"noopener noreferrer\">`\n } catch {\n return `<a${attrs}>`\n }\n })\n}\n","/**\n * @sonordev/site-kit/blog - Blog Post Component\n * \n * Fetches and displays a single blog post with full content, table of contents,\n * author info, related posts, and SEO metadata support.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogPost\n * slug={params.slug}\n * unstyled\n * styles={{\n * article: 'max-w-4xl mx-auto',\n * header: 'mb-8',\n * breadcrumb: 'text-sm text-gray-500 mb-4',\n * title: 'text-4xl font-bold text-gray-900',\n * subtitle: 'text-xl text-gray-600 mt-4',\n * meta: 'flex gap-4 text-sm text-gray-500 mt-4',\n * featuredImage: 'w-full h-auto rounded-xl',\n * content: 'prose prose-lg max-w-none',\n * tocSidebar: 'sticky top-24 p-4 bg-gray-50 rounded-lg',\n * tocTitle: 'text-sm font-semibold uppercase text-gray-500',\n * tocList: 'space-y-2 mt-3',\n * tocLink: 'text-sm text-gray-600 hover:text-primary-600',\n * tags: 'flex gap-2 mt-8',\n * tag: 'px-3 py-1 bg-gray-100 rounded-full text-sm',\n * faqSection: 'mt-12',\n * faqTitle: 'text-2xl font-bold mb-6',\n * faqItem: 'p-4 bg-gray-50 rounded-lg',\n * authorCard: 'mt-12 p-6 bg-gray-50 rounded-xl',\n * relatedSection: 'mt-12',\n * relatedTitle: 'text-2xl font-bold mb-6',\n * relatedGrid: 'grid md:grid-cols-3 gap-6',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor } from './types'\nimport { ServiceCallouts } from './ServiceCallout'\nimport { addExternalLinkTargets, resolveBlogSiteUrl } from './processBlogHtml'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogPostStyles {\n /** Article wrapper */\n article?: string\n /** Header section */\n header?: string\n /** Breadcrumb navigation */\n breadcrumb?: string\n /** Breadcrumb link */\n breadcrumbLink?: string\n /** Post title (h1) */\n title?: string\n /** Post subtitle */\n subtitle?: string\n /** Meta info row */\n meta?: string\n /** Meta item */\n metaItem?: string\n /** Featured image wrapper */\n featuredImageWrapper?: string\n /** Featured image */\n featuredImage?: string\n /** Content layout (grid with TOC) */\n contentLayout?: string\n /** Main content wrapper */\n content?: string\n /** Table of contents sidebar */\n tocSidebar?: string\n /** TOC title */\n tocTitle?: string\n /** TOC list */\n tocList?: string\n /** TOC list item */\n tocItem?: string\n /** TOC link */\n tocLink?: string\n /** Tags container */\n tags?: string\n /** Individual tag */\n tag?: string\n /** FAQ section */\n faqSection?: string\n /** FAQ title */\n faqTitle?: string\n /** FAQ item container */\n faqItem?: string\n /** FAQ question (summary) */\n faqQuestion?: string\n /** FAQ answer */\n faqAnswer?: string\n /** Author card section */\n authorCard?: string\n /** Related posts section */\n relatedSection?: string\n /** Related posts title */\n relatedTitle?: string\n /** Related posts grid */\n relatedGrid?: string\n /** Related post card */\n relatedCard?: string\n /** Not found state */\n notFound?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchBlogPost(\n apiUrl: string,\n apiKey: string,\n slug: string\n): Promise<BlogPostType | null> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) {\n if (response.status === 404) return null\n console.error('[Blog] Failed to fetch post:', response.statusText)\n return null\n }\n\n const data = await response.json()\n return data.post\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\nasync function fetchRelatedPosts(\n apiUrl: string,\n apiKey: string,\n postId: string,\n limit: number = 3\n): Promise<BlogPostType[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ current_post_id: postId, limit }),\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// TOC GENERATION\n// ============================================================================\n\nfunction generateTableOfContents(html: string): TocItem[] {\n const headingRegex = /<h([2-4])[^>]*(?:id=\"([^\"]*)\")?[^>]*>(.*?)<\\/h[2-4]>/gi\n const items: TocItem[] = []\n let match\n\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const existingId = match[2]\n const text = match[3].replace(/<[^>]*>/g, '') // Strip nested HTML\n const id = existingId || slugify(text)\n\n items.push({ id, text, level })\n }\n\n return items\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n}\n\n// ============================================================================\n// BLOG POST COMPONENT\n// ============================================================================\n\nexport interface BlogPostServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Blog post slug */\n slug: string\n /** Show table of contents sidebar */\n showToc?: boolean\n /** Show related posts */\n showRelated?: boolean\n /** Number of related posts */\n relatedCount?: number\n /** Show author card */\n showAuthor?: boolean\n /** Base URL for blog links */\n basePath?: string\n /** Custom class name (applied to article) */\n className?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogPostStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /**\n * Canonical site URL (e.g. https://example.com) for classifying internal vs external links in post body and FAQ HTML.\n * Defaults to NEXT_PUBLIC_SITE_URL, SITE_URL, or VERCEL_URL.\n */\n siteUrl?: string\n /** Custom render function */\n children?: (props: {\n post: BlogPostType\n tableOfContents: TocItem[]\n relatedPosts: BlogPostType[]\n }) => React.ReactNode\n}\n\nexport async function BlogPost({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n slug,\n showToc = true,\n showRelated = true,\n relatedCount = 3,\n showAuthor = true,\n basePath = '/blog',\n className,\n styles = {},\n unstyled = false,\n siteUrl,\n children,\n}: BlogPostServerProps) {\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogPostStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n const post = await fetchBlogPost(apiUrl, apiKey, slug)\n\n if (!post) {\n return (\n <div \n className={`${styles.notFound || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 60 }, 'notFound')}\n >\n <h1 style={inlineStyle({ fontSize: 24, marginBottom: 16 }, 'notFound')}>Post Not Found</h1>\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'notFound')}>\n The blog post you're looking for doesn't exist or has been removed.\n </p>\n <a\n href={basePath}\n style={inlineStyle({\n display: 'inline-block',\n marginTop: 24,\n padding: '12px 24px',\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n borderRadius: 8,\n textDecoration: 'none',\n }, 'notFound')}\n >\n ← Back to Blog\n </a>\n </div>\n )\n }\n\n const content = post.content_html || post.content || ''\n const siteUrlResolved = resolveBlogSiteUrl(siteUrl)\n const contentWithExternalTargets = addExternalLinkTargets(content, siteUrlResolved)\n const tableOfContents = showToc ? generateTableOfContents(content) : []\n const relatedPosts = showRelated\n ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount)\n : []\n\n const faqRaw = (post.faq_items ?? (post as { faqItems?: unknown }).faqItems) as\n | Array<{ question: string; answer: string }>\n | undefined\n const faqItemsProcessed =\n faqRaw?.map((item) => ({\n ...item,\n answer: addExternalLinkTargets(item.answer || '', siteUrlResolved),\n })) ?? faqRaw\n\n // Custom render\n if (children) {\n return children({ post, tableOfContents, relatedPosts })\n }\n\n const { BlogPostFaqSection } = await import('./BlogPostFaqSection')\n\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n return (\n <article className={`${styles.article || ''} ${className || ''}`.trim() || undefined}>\n {/* Header */}\n <header \n className={styles.header}\n style={inlineStyle({ marginBottom: 32 }, 'header')}\n >\n {/* Breadcrumb */}\n <nav \n className={styles.breadcrumb}\n style={inlineStyle({ marginBottom: 16, fontSize: 14, color: 'var(--sk-text-secondary)' }, 'breadcrumb')}\n >\n <a \n href={basePath} \n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n Blog\n </a>\n {post.category && (\n <>\n <span style={inlineStyle({ margin: '0 8px' }, 'breadcrumb')}>/</span>\n <a\n href={`${basePath}?category=${post.category}`}\n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n {/* Title */}\n <h1 \n className={styles.title}\n style={inlineStyle({ fontSize: 36, fontWeight: 700, lineHeight: 1.2, marginBottom: 16 }, 'title')}\n >\n {post.title}\n </h1>\n\n {/* Subtitle */}\n {post.subtitle && (\n <p \n className={styles.subtitle}\n style={inlineStyle({ fontSize: 20, color: 'var(--sk-text-secondary)', marginBottom: 16 }, 'subtitle')}\n >\n {post.subtitle}\n </p>\n )}\n\n {/* Meta */}\n <div \n className={styles.meta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 16, flexWrap: 'wrap' }, 'meta')}\n >\n {post.author && (\n <span \n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-primary)' }, 'metaItem')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {date && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)' }, 'metaItem')}\n >\n {date}\n </span>\n )}\n {post.reading_time_minutes && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-tertiary)' }, 'metaItem')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </header>\n\n {/* Featured Image */}\n {post.featured_image && (\n <figure \n className={styles.featuredImageWrapper}\n style={inlineStyle({ margin: '0 0 32px' }, 'featuredImageWrapper')}\n >\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.featuredImage}\n style={inlineStyle({\n width: '100%',\n maxHeight: 500,\n objectFit: 'cover',\n borderRadius: 12,\n }, 'featuredImage')}\n />\n </figure>\n )}\n\n {/* Content Layout with TOC */}\n <div\n className={styles.contentLayout}\n style={inlineStyle({\n display: showToc && tableOfContents.length > 0 ? 'grid' : 'block',\n gridTemplateColumns: showToc && tableOfContents.length > 0 ? '1fr 250px' : undefined,\n gap: 48,\n }, 'contentLayout')}\n >\n {/* Main Content */}\n <div\n className={`blog-content ${styles.content || ''}`.trim()}\n style={inlineStyle({\n fontSize: 17,\n lineHeight: 1.8,\n color: 'var(--sk-text-primary)',\n }, 'content')}\n dangerouslySetInnerHTML={{ __html: contentWithExternalTargets }}\n />\n\n {/* Table of Contents Sidebar */}\n {showToc && tableOfContents.length > 0 && (\n <aside\n className={styles.tocSidebar}\n style={inlineStyle({\n position: 'sticky',\n top: 100,\n alignSelf: 'start',\n padding: 20,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n }, 'tocSidebar')}\n >\n <h4\n className={styles.tocTitle}\n style={inlineStyle({\n margin: '0 0 12px',\n fontSize: 12,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--sk-text-secondary)',\n }, 'tocTitle')}\n >\n On This Page\n </h4>\n <ul \n className={styles.tocList}\n style={inlineStyle({ listStyle: 'none', margin: 0, padding: 0 }, 'tocList')}\n >\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n className={styles.tocItem}\n style={inlineStyle({\n paddingLeft: (item.level - 2) * 12,\n marginBottom: 8,\n }, 'tocItem')}\n >\n <a\n href={`#${item.id}`}\n className={styles.tocLink}\n style={inlineStyle({\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n textDecoration: 'none',\n }, 'tocLink')}\n >\n {item.text}\n </a>\n </li>\n ))}\n </ul>\n </aside>\n )}\n </div>\n\n {/* Tags */}\n {post.tags && post.tags.length > 0 && (\n <div \n className={styles.tags}\n style={inlineStyle({ marginTop: 32, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'tags')}\n >\n {post.tags.map((tag, index) => {\n const tagName = typeof tag === 'string' ? tag : tag?.name || '';\n return (\n <a\n key={`${tagName}-${index}`}\n href={`${basePath}?tag=${tagName}`}\n className={styles.tag}\n style={inlineStyle({\n padding: '4px 12px',\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 9999,\n fontSize: 13,\n color: 'var(--sk-text-primary)',\n textDecoration: 'none',\n }, 'tag')}\n >\n #{tagName}\n </a>\n );\n })}\n </div>\n )}\n\n {/* Service Callouts / CTAs (generated by Signal AI from business offerings) */}\n <ServiceCallouts\n callouts={(post as any).service_callouts ?? (post as any).serviceCallouts ?? []}\n unstyled={unstyled}\n />\n\n {/* FAQ Section — interactive accordion (SEO: content in DOM, not hidden) */}\n <BlogPostFaqSection\n items={(faqItemsProcessed ?? []) as any[]}\n unstyled={unstyled}\n styles={unstyled ? {\n section: styles.faqSection,\n title: styles.faqTitle,\n item: styles.faqItem,\n question: styles.faqQuestion,\n answerInner: styles.faqAnswer,\n } : undefined}\n />\n\n {/* Author Card (supports BlogAuthor or E-E-A-T author shape) */}\n {showAuthor && post.author && typeof post.author === 'object' && (\n <AuthorSection author={normalizeAuthorForDisplay(post.author)} className={styles.authorCard} unstyled={unstyled} />\n )}\n\n {/* Related Posts */}\n {showRelated && relatedPosts.length > 0 && (\n <section \n className={styles.relatedSection}\n style={inlineStyle({ marginTop: 48 }, 'relatedSection')}\n >\n <h2 \n className={styles.relatedTitle}\n style={inlineStyle({ fontSize: 24, fontWeight: 600, marginBottom: 24 }, 'relatedTitle')}\n >\n Related Posts\n </h2>\n <div\n className={styles.relatedGrid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',\n gap: 24,\n }, 'relatedGrid')}\n >\n {relatedPosts.map((relatedPost) => (\n <article\n key={relatedPost.id}\n className={styles.relatedCard}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }, 'relatedCard')}\n >\n {relatedPost.featured_image && (\n <a href={`${basePath}/${relatedPost.slug}`}>\n <img\n src={relatedPost.featured_image}\n alt={relatedPost.title}\n style={inlineStyle({ width: '100%', height: 150, objectFit: 'cover' }, 'relatedCard')}\n />\n </a>\n )}\n <div style={inlineStyle({ padding: 16 }, 'relatedCard')}>\n <h3 style={inlineStyle({ fontSize: 16, fontWeight: 600, marginBottom: 8 }, 'relatedCard')}>\n <a\n href={`${basePath}/${relatedPost.slug}`}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'relatedCard')}\n >\n {relatedPost.title}\n </a>\n </h3>\n {relatedPost.excerpt && (\n <p style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)', margin: 0 }, 'relatedCard')}>\n {relatedPost.excerpt.slice(0, 100)}...\n </p>\n )}\n </div>\n </article>\n ))}\n </div>\n </section>\n )}\n </article>\n )\n}\n\n// ============================================================================\n// AUTHOR NORMALIZATION (BlogAuthor + E-E-A-T shapes)\n// ============================================================================\n\n/** Normalize author from Portal: supports BlogAuthor (avatar_url, social_links) or E-E-A-T (image, url, socialProfiles) */\nfunction normalizeAuthorForDisplay(\n author: Record<string, unknown> | BlogAuthor\n): BlogAuthor & { sameAs?: string[]; title?: string } {\n const a = author as Record<string, unknown>\n const avatarUrl =\n (a.avatar_url as string) ?? (a.image as string) ?? (a.image_url as string)\n const socialLinks = a.social_links as BlogAuthor['social_links'] | undefined\n const socialProfiles = a.socialProfiles as string[] | undefined\n return {\n id: (a.id as string) ?? 'author',\n project_id: (a.project_id as string) ?? '',\n name: (a.name as string) ?? 'Author',\n slug: (a.slug as string) ?? 'author',\n bio: (a.bio as string) ?? undefined,\n avatar_url: avatarUrl ?? undefined,\n email: (a.email as string) ?? undefined,\n website: (a.website as string) ?? (a.url as string) ?? undefined,\n social_links: socialLinks ?? undefined,\n is_active: (a.is_active as boolean) ?? true,\n ...(socialProfiles?.length ? { sameAs: socialProfiles } : {}),\n ...(a.title ? { title: a.title as string } : {}),\n } as BlogAuthor & { sameAs?: string[]; title?: string }\n}\n\n// ============================================================================\n// AUTHOR SECTION\n// ============================================================================\n\nfunction AuthorSection({\n author,\n className,\n unstyled = false,\n}: {\n author: BlogAuthor & { sameAs?: string[]; title?: string }\n className?: string\n unstyled?: boolean\n}) {\n return (\n <section\n className={className}\n style={unstyled || className ? undefined : {\n marginTop: 48,\n padding: 24,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n display: 'flex',\n gap: 20,\n alignItems: 'flex-start',\n }}\n >\n {author.avatar_url && (\n <img\n src={author.avatar_url}\n alt={author.name}\n style={unstyled || className ? undefined : {\n width: 80,\n height: 80,\n borderRadius: '50%',\n objectFit: 'cover',\n }}\n />\n )}\n <div>\n <h3 style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 18, fontWeight: 600 }}>\n {author.name}\n </h3>\n {'title' in author && author.title && (\n <p style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 14, color: 'var(--sk-text-secondary)' }}>\n {author.title}\n </p>\n )}\n {author.bio && (\n <p style={unstyled || className ? undefined : { margin: '0 0 12px', color: 'var(--sk-text-secondary)', fontSize: 14 }}>\n {author.bio}\n </p>\n )}\n {author.social_links && (\n <div style={unstyled || className ? undefined : { display: 'flex', gap: 16 }}>\n {author.social_links.twitter && (\n <a\n href={`https://twitter.com/${author.social_links.twitter}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Twitter\n </a>\n )}\n {author.social_links.linkedin && (\n <a\n href={author.social_links.linkedin}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n LinkedIn\n </a>\n )}\n </div>\n )}\n {'sameAs' in author && author.sameAs && author.sameAs.length > 0 && !author.social_links && (\n <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap' }}>\n {author.sameAs.map((url, i) => (\n <a\n key={i}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Profile\n </a>\n ))}\n </div>\n )}\n </div>\n </section>\n )\n}","/**\n * @sonordev/site-kit/blog - Blog List Component\n * \n * Fetches and displays a list of blog posts with pagination, filtering, and sorting.\n * Supports both server-side and client-side rendering.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogList\n * styles={{\n * container: 'max-w-7xl mx-auto px-4',\n * categoryNav: 'flex flex-wrap gap-2 mb-8',\n * categoryLink: 'px-4 py-2 rounded-full text-sm font-medium',\n * categoryLinkActive: 'bg-primary-600 text-white',\n * categoryLinkInactive: 'bg-gray-100 text-gray-700 hover:bg-gray-200',\n * grid: 'grid md:grid-cols-2 lg:grid-cols-3 gap-8',\n * card: 'bg-white rounded-xl shadow-sm hover:shadow-lg transition-shadow',\n * cardImage: 'w-full h-48 object-cover',\n * cardBody: 'p-6',\n * cardTitle: 'text-xl font-bold text-gray-900',\n * cardExcerpt: 'text-gray-600 line-clamp-3',\n * cardMeta: 'text-sm text-gray-500',\n * pagination: 'flex justify-center gap-4 mt-12',\n * paginationLink: 'px-6 py-3 bg-primary-600 text-white rounded-lg',\n * emptyState: 'text-center py-12 text-gray-500',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogListStyles {\n /** Container wrapper */\n container?: string\n /** Category navigation wrapper */\n categoryNav?: string\n /** Individual category link */\n categoryLink?: string\n /** Active category link (combined with categoryLink) */\n categoryLinkActive?: string\n /** Inactive category link (combined with categoryLink) */\n categoryLinkInactive?: string\n /** Posts grid container */\n grid?: string\n /** Individual post card */\n card?: string\n /** Card image wrapper */\n cardImageWrapper?: string\n /** Card image */\n cardImage?: string\n /** Card body/content area */\n cardBody?: string\n /** Card meta row (date, category) */\n cardMeta?: string\n /** Card category badge */\n cardCategory?: string\n /** Card date */\n cardDate?: string\n /** Card title */\n cardTitle?: string\n /** Card title link */\n cardTitleLink?: string\n /** Card excerpt */\n cardExcerpt?: string\n /** Card footer */\n cardFooter?: string\n /** Card author */\n cardAuthor?: string\n /** Card reading time */\n cardReadingTime?: string\n /** Card read more link */\n cardReadMore?: string\n /** Pagination container */\n pagination?: string\n /** Pagination link */\n paginationLink?: string\n /** Pagination info text */\n paginationInfo?: string\n /** Empty state */\n emptyState?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\ninterface FetchBlogListParams {\n apiUrl: string\n apiKey: string\n category?: string\n tag?: string\n author?: string\n featured?: boolean\n search?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n}\n\nasync function fetchBlogList(params: FetchBlogListParams): Promise<BlogListResult> {\n const {\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n } = params\n\n const queryParams = new URLSearchParams()\n if (category) queryParams.set('category', category)\n if (tag) queryParams.set('tag', tag)\n if (author) queryParams.set('author', author)\n if (featured) queryParams.set('featured', 'true')\n if (search) queryParams.set('search', search)\n queryParams.set('page', String(page))\n queryParams.set('per_page', String(perPage))\n queryParams.set('order_by', orderBy)\n queryParams.set('order', order)\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts?${queryParams}`, {\n headers: {\n 'x-api-key': apiKey,\n },\n next: { revalidate: 60 }, // Revalidate every 60 seconds\n })\n\n if (!response.ok) {\n console.error('[Blog] Failed to fetch posts:', response.statusText)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n\n const data = await response.json()\n \n return {\n posts: data.posts || [],\n pagination: {\n page: data.pagination?.page || 1,\n perPage: data.pagination?.per_page || 12,\n total: data.pagination?.total || 0,\n totalPages: data.pagination?.total_pages || 0,\n hasNext: data.pagination?.has_next || false,\n hasPrev: data.pagination?.has_prev || false,\n },\n }\n } catch (error) {\n console.error('[Blog] Error fetching posts:', error)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n}\n\nasync function fetchCategories(apiUrl: string, apiKey: string): Promise<BlogCategory[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 }, // Cache for 5 minutes\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n// ============================================================================\n// BLOG LIST COMPONENT\n// ============================================================================\n\nexport interface BlogListServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Filter by category slug */\n category?: string\n /** Filter by tag */\n tag?: string\n /** Filter by author */\n author?: string\n /** Only featured posts */\n featured?: boolean\n /** Search query */\n search?: string\n /** Page number (1-indexed) */\n page?: number\n /** Items per page */\n perPage?: number\n /** Sort field */\n orderBy?: 'published_at' | 'title' | 'view_count'\n /** Sort direction */\n order?: 'asc' | 'desc'\n /** Show category filter UI */\n showCategoryFilter?: boolean\n /** Show pagination */\n showPagination?: boolean\n /** Custom class name (applied to container) */\n className?: string\n /** Base URL for post links */\n basePath?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogListStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /** Custom render function for post card */\n renderPost?: (post: BlogPost) => React.ReactNode\n /** Custom render function for entire grid */\n children?: (props: {\n posts: BlogPost[]\n pagination: BlogListResult['pagination']\n categories: BlogCategory[]\n }) => React.ReactNode\n}\n\nexport async function BlogList({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n showCategoryFilter = false,\n showPagination = true,\n className,\n basePath = '/blog',\n styles = {},\n unstyled = false,\n renderPost,\n children,\n}: BlogListServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n // Fetch data in parallel\n const [blogData, categories] = await Promise.all([\n fetchBlogList({\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page,\n perPage,\n orderBy,\n order,\n }),\n showCategoryFilter ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n ])\n\n // Use custom render function if provided\n if (children) {\n return children({ posts: blogData.posts, pagination: blogData.pagination, categories })\n }\n\n const { posts, pagination } = blogData\n\n if (posts.length === 0) {\n return (\n <div \n className={`${styles.container || ''} ${styles.emptyState || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 40 }, 'emptyState')}\n >\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'emptyState')}>No posts found.</p>\n </div>\n )\n }\n\n return (\n <div className={`${styles.container || ''} ${className || ''}`.trim() || undefined}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav \n className={styles.categoryNav}\n style={inlineStyle({ marginBottom: 24, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'categoryNav')}\n >\n <a\n href={basePath}\n className={`${styles.categoryLink || ''} ${!category ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: !category ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: !category ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={`${basePath}?category=${cat.slug}`}\n className={`${styles.categoryLink || ''} ${category === cat.slug ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: category === cat.slug ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: category === cat.slug ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div\n className={styles.grid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 24,\n }, 'grid')}\n >\n {posts.map((post) =>\n renderPost ? (\n <React.Fragment key={post.id}>{renderPost(post)}</React.Fragment>\n ) : (\n <BlogPostCard key={post.id} post={post} basePath={basePath} styles={styles} unstyled={unstyled} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav\n className={styles.pagination}\n style={inlineStyle({\n marginTop: 40,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n }, 'pagination')}\n >\n {pagination.hasPrev && (\n <a\n href={buildPaginationUrl(basePath, page - 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n ← Previous\n </a>\n )}\n \n <span \n className={styles.paginationInfo}\n style={inlineStyle({ padding: '8px 16px', color: 'var(--sk-text-secondary)' }, 'paginationInfo')}\n >\n Page {pagination.page} of {pagination.totalPages}\n </span>\n \n {pagination.hasNext && (\n <a\n href={buildPaginationUrl(basePath, page + 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n Next →\n </a>\n )}\n </nav>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// BLOG POST CARD (Default rendering)\n// ============================================================================\n\ninterface BlogPostCardProps {\n post: BlogPost\n basePath: string\n styles?: BlogListStyles\n unstyled?: boolean\n}\n\nfunction BlogPostCard({ post, basePath, styles = {}, unstyled = false }: BlogPostCardProps) {\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n return (\n <article\n className={styles.card}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n transition: 'box-shadow 0.2s, transform 0.2s',\n }, 'card')}\n >\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`} className={styles.cardImageWrapper}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.cardImage}\n style={inlineStyle({\n width: '100%',\n height: 200,\n objectFit: 'cover',\n }, 'cardImage')}\n />\n </a>\n )}\n \n <div \n className={styles.cardBody}\n style={inlineStyle({ padding: 20 }, 'cardBody')}\n >\n {/* Meta */}\n <div \n className={styles.cardMeta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }, 'cardMeta')}\n >\n {post.category && (\n <span\n className={styles.cardCategory}\n style={inlineStyle({\n padding: '2px 8px',\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: 'rgba(var(--sk-primary-rgb), 0.1)',\n color: 'var(--sk-primary)',\n textTransform: 'uppercase',\n }, 'cardCategory')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {date && (\n <span \n className={styles.cardDate}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardDate')}\n >\n {date}\n </span>\n )}\n </div>\n\n {/* Title */}\n <h3 \n className={styles.cardTitle}\n style={inlineStyle({ margin: '0 0 8px', fontSize: 18, fontWeight: 600, lineHeight: 1.4 }, 'cardTitle')}\n >\n <a\n href={`${basePath}/${post.slug}`}\n className={styles.cardTitleLink}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'cardTitleLink')}\n >\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p\n className={styles.cardExcerpt}\n style={inlineStyle({\n margin: '0 0 16px',\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n lineHeight: 1.6,\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }, 'cardExcerpt')}\n >\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div \n className={styles.cardFooter}\n style={inlineStyle({ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, 'cardFooter')}\n >\n {post.author && (\n <span \n className={styles.cardAuthor}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardAuthor')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.reading_time_minutes && (\n <span \n className={styles.cardReadingTime}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-tertiary)' }, 'cardReadingTime')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction buildPaginationUrl(basePath: string, page: number, category?: string): string {\n const params = new URLSearchParams()\n params.set('page', String(page))\n if (category) params.set('category', category)\n return `${basePath}?${params}`\n}\n\nconst paginationLinkStyle: React.CSSProperties = {\n padding: '8px 16px',\n borderRadius: 8,\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n textDecoration: 'none',\n fontSize: 14,\n fontWeight: 500,\n}"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/blog/ServiceCallout.tsx","../src/blog/processBlogHtml.ts","../src/blog/BlogPost.tsx","../src/blog/BlogList.tsx"],"names":["jsxs","jsx","Fragment"],"mappings":"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","file":"chunk-X55IGEXW.mjs","sourcesContent":["/**\n * @sonordev/site-kit/blog - Service Callout / CTA Component\n *\n * Renders a promotional call-to-action section within blog posts.\n * Automatically generated by Signal AI during blog creation, linking\n * article content to the business's relevant services.\n *\n * Two variants:\n * - 'featured' (default): Full-width gradient banner with button\n * - 'inline': Compact card with icon accent\n *\n * Uses site-kit brand tokens (--sk-primary, --sk-bg, etc.) for theming.\n * Supports full Tailwind override via `styles` prop.\n *\n * @example\n * ```tsx\n * <ServiceCallout\n * title=\"Ready to build your MVP?\"\n * description=\"Our team specializes in lean SaaS builds.\"\n * cta=\"Get Started\"\n * url=\"/services/application-development\"\n * />\n * ```\n */\n\nimport React from 'react'\n\nexport interface ServiceCalloutProps {\n title: string\n description?: string\n cta?: string\n url: string\n variant?: 'featured' | 'inline'\n /** Override default styles with Tailwind classes */\n styles?: {\n wrapper?: string\n title?: string\n description?: string\n button?: string\n }\n /** Strip all default styles (BYO Tailwind) */\n unstyled?: boolean\n}\n\n// Default inline styles using CSS custom properties for brand theming\nconst defaults = {\n featured: {\n wrapper: {\n display: 'flex',\n flexWrap: 'wrap' as const,\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: '1.5rem',\n padding: '2rem 2.5rem',\n margin: '3rem 0',\n borderRadius: '1rem',\n background: 'linear-gradient(135deg, color-mix(in srgb, var(--sk-primary, #3b82f6) 8%, transparent), color-mix(in srgb, var(--sk-primary, #3b82f6) 15%, transparent))',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 25%, transparent)',\n },\n title: {\n fontSize: '1.25rem',\n fontWeight: 700,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.9375rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.5rem',\n maxWidth: '40rem',\n },\n button: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.5rem',\n padding: '0.75rem 1.75rem',\n borderRadius: '0.5rem',\n fontWeight: 600,\n fontSize: '0.9375rem',\n color: '#ffffff',\n background: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n transition: 'transform 0.15s, box-shadow 0.15s',\n whiteSpace: 'nowrap' as const,\n },\n },\n inline: {\n wrapper: {\n display: 'flex',\n gap: '1rem',\n padding: '1.25rem 1.5rem',\n margin: '2rem 0',\n borderRadius: '0.75rem',\n background: 'var(--sk-bg-elevated, #f8fafc)',\n border: '1px solid color-mix(in srgb, var(--sk-primary, #3b82f6) 20%, var(--sk-surface-border, #e2e8f0))',\n },\n icon: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: '2.5rem',\n height: '2.5rem',\n borderRadius: '0.625rem',\n background: 'var(--sk-primary, #3b82f6)',\n color: '#ffffff',\n flexShrink: 0,\n fontSize: '1.125rem',\n },\n title: {\n fontSize: '1rem',\n fontWeight: 600,\n color: 'var(--sk-text-primary, #0f172a)',\n margin: 0,\n },\n description: {\n fontSize: '0.875rem',\n color: 'var(--sk-text-secondary, #475569)',\n marginTop: '0.25rem',\n },\n link: {\n display: 'inline-flex',\n alignItems: 'center',\n gap: '0.25rem',\n marginTop: '0.5rem',\n fontSize: '0.875rem',\n fontWeight: 600,\n color: 'var(--sk-primary, #3b82f6)',\n textDecoration: 'none',\n },\n },\n}\n\nexport function ServiceCallout({\n title,\n description,\n cta = 'Learn More',\n url,\n variant = 'featured',\n styles,\n unstyled = false,\n}: ServiceCalloutProps) {\n if (variant === 'inline') {\n return (\n <aside\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.inline.wrapper}\n role=\"complementary\"\n aria-label=\"Related service\"\n >\n <div style={unstyled ? undefined : defaults.inline.icon}>→</div>\n <div>\n <h4\n className={styles?.title}\n style={unstyled ? undefined : defaults.inline.title}\n >\n {title}\n </h4>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.inline.description}\n >\n {description}\n </p>\n )}\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.inline.link}\n >\n {cta} →\n </a>\n </div>\n </aside>\n )\n }\n\n // Featured variant (default)\n return (\n <section\n className={styles?.wrapper}\n style={unstyled ? undefined : defaults.featured.wrapper}\n role=\"complementary\"\n aria-label=\"Call to action\"\n >\n <div>\n <h3\n className={styles?.title}\n style={unstyled ? undefined : defaults.featured.title}\n >\n {title}\n </h3>\n {description && (\n <p\n className={styles?.description}\n style={unstyled ? undefined : defaults.featured.description}\n >\n {description}\n </p>\n )}\n </div>\n <a\n href={url}\n className={styles?.button}\n style={unstyled ? undefined : defaults.featured.button}\n >\n {cta} →\n </a>\n </section>\n )\n}\n\n/**\n * Renders all service callouts for a blog post.\n * First callout uses 'featured' variant, subsequent use 'inline'.\n */\nexport function ServiceCallouts({\n callouts,\n styles,\n unstyled,\n}: {\n callouts: Array<{ title: string; description?: string; cta?: string; url: string }>\n styles?: ServiceCalloutProps['styles']\n unstyled?: boolean\n}) {\n if (!callouts || callouts.length === 0) return null\n\n return (\n <>\n {callouts.map((callout, i) => (\n <ServiceCallout\n key={callout.url + i}\n {...callout}\n variant={i === 0 ? 'featured' : 'inline'}\n styles={styles}\n unstyled={unstyled}\n />\n ))}\n </>\n )\n}\n","/**\n * Post-process Portal/blog HTML for safe, consistent link behavior.\n * Server-safe string transforms only (no DOM).\n */\n\n/** Normalize hostname for same-site detection (strips leading www). */\nexport function normalizeSiteHost(siteUrl: string): string {\n try {\n const base = siteUrl.startsWith('http') ? siteUrl : `https://${siteUrl}`\n const u = new URL(base)\n return u.hostname.replace(/^www\\./i, '').toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * Resolve canonical site URL for link classification.\n * Pass `explicit` from props when env vars are not set (e.g. non-Vercel hosts).\n */\nexport function resolveBlogSiteUrl(explicit?: string): string {\n const fromProp = explicit?.trim()\n if (fromProp) return fromProp\n const next = process.env.NEXT_PUBLIC_SITE_URL?.trim()\n if (next) return next\n const site = process.env.SITE_URL?.trim()\n if (site) return site\n const vercel = process.env.VERCEL_URL?.trim()\n if (vercel) return vercel.startsWith('http') ? vercel : `https://${vercel}`\n return ''\n}\n\n/**\n * Add `target=\"_blank\"` and `rel=\"noopener noreferrer\"` to external http(s) links.\n * Same registrable host (with or without `www`) is treated as internal.\n * Skips anchors that already set `target`.\n */\nexport function addExternalLinkTargets(html: string, siteUrl: string): string {\n if (!html || !siteUrl) return html\n const siteHost = normalizeSiteHost(siteUrl)\n if (!siteHost) return html\n\n return html.replace(/<a\\b([^>]*)>/gi, (_full, attrs: string) => {\n const hrefMatch = attrs.match(/\\bhref\\s*=\\s*([\"'])([^\"']*)\\1/i)\n if (!hrefMatch) return `<a${attrs}>`\n const href = hrefMatch[2].trim()\n if (!/^https?:\\/\\//i.test(href)) return `<a${attrs}>`\n\n try {\n const url = new URL(href)\n const linkHost = url.hostname.replace(/^www\\./i, '').toLowerCase()\n if (linkHost === siteHost) return `<a${attrs}>`\n if (/\\btarget\\s*=/i.test(attrs)) return `<a${attrs}>`\n const trimmed = attrs.trim()\n return `<a ${trimmed} target=\"_blank\" rel=\"noopener noreferrer\">`\n } catch {\n return `<a${attrs}>`\n }\n })\n}\n","/**\n * @sonordev/site-kit/blog - Blog Post Component\n * \n * Fetches and displays a single blog post with full content, table of contents,\n * author info, related posts, and SEO metadata support.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogPost\n * slug={params.slug}\n * unstyled\n * styles={{\n * article: 'max-w-4xl mx-auto',\n * header: 'mb-8',\n * breadcrumb: 'text-sm text-gray-500 mb-4',\n * title: 'text-4xl font-bold text-gray-900',\n * subtitle: 'text-xl text-gray-600 mt-4',\n * meta: 'flex gap-4 text-sm text-gray-500 mt-4',\n * featuredImage: 'w-full h-auto rounded-xl',\n * content: 'prose prose-lg max-w-none',\n * tocSidebar: 'sticky top-24 p-4 bg-gray-50 rounded-lg',\n * tocTitle: 'text-sm font-semibold uppercase text-gray-500',\n * tocList: 'space-y-2 mt-3',\n * tocLink: 'text-sm text-gray-600 hover:text-primary-600',\n * tags: 'flex gap-2 mt-8',\n * tag: 'px-3 py-1 bg-gray-100 rounded-full text-sm',\n * faqSection: 'mt-12',\n * faqTitle: 'text-2xl font-bold mb-6',\n * faqItem: 'p-4 bg-gray-50 rounded-lg',\n * authorCard: 'mt-12 p-6 bg-gray-50 rounded-xl',\n * relatedSection: 'mt-12',\n * relatedTitle: 'text-2xl font-bold mb-6',\n * relatedGrid: 'grid md:grid-cols-3 gap-6',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor } from './types'\nimport { ServiceCallouts } from './ServiceCallout'\nimport { addExternalLinkTargets, resolveBlogSiteUrl } from './processBlogHtml'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogPostStyles {\n /** Article wrapper */\n article?: string\n /** Header section */\n header?: string\n /** Breadcrumb navigation */\n breadcrumb?: string\n /** Breadcrumb link */\n breadcrumbLink?: string\n /** Post title (h1) */\n title?: string\n /** Post subtitle */\n subtitle?: string\n /** Meta info row */\n meta?: string\n /** Meta item */\n metaItem?: string\n /** Featured image wrapper */\n featuredImageWrapper?: string\n /** Featured image */\n featuredImage?: string\n /** Content layout (grid with TOC) */\n contentLayout?: string\n /** Main content wrapper */\n content?: string\n /** Table of contents sidebar */\n tocSidebar?: string\n /** TOC title */\n tocTitle?: string\n /** TOC list */\n tocList?: string\n /** TOC list item */\n tocItem?: string\n /** TOC link */\n tocLink?: string\n /** Tags container */\n tags?: string\n /** Individual tag */\n tag?: string\n /** FAQ section */\n faqSection?: string\n /** FAQ title */\n faqTitle?: string\n /** FAQ item container */\n faqItem?: string\n /** FAQ question (summary) */\n faqQuestion?: string\n /** FAQ answer */\n faqAnswer?: string\n /** Author card section */\n authorCard?: string\n /** Related posts section */\n relatedSection?: string\n /** Related posts title */\n relatedTitle?: string\n /** Related posts grid */\n relatedGrid?: string\n /** Related post card */\n relatedCard?: string\n /** Not found state */\n notFound?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchBlogPost(\n apiUrl: string,\n apiKey: string,\n slug: string\n): Promise<BlogPostType | null> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts/${slug}`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 60 },\n })\n\n if (!response.ok) {\n if (response.status === 404) return null\n console.error('[Blog] Failed to fetch post:', response.statusText)\n return null\n }\n\n const data = await response.json()\n return data.post\n } catch (error) {\n console.error('[Blog] Error fetching post:', error)\n return null\n }\n}\n\nasync function fetchRelatedPosts(\n apiUrl: string,\n apiKey: string,\n postId: string,\n limit: number = 3\n): Promise<BlogPostType[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/related`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({ current_post_id: postId, limit }),\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('[Blog] Error fetching related posts:', error)\n return []\n }\n}\n\n// ============================================================================\n// TOC GENERATION\n// ============================================================================\n\nfunction generateTableOfContents(html: string): TocItem[] {\n const headingRegex = /<h([2-4])[^>]*(?:id=\"([^\"]*)\")?[^>]*>(.*?)<\\/h[2-4]>/gi\n const items: TocItem[] = []\n let match\n\n while ((match = headingRegex.exec(html)) !== null) {\n const level = parseInt(match[1])\n const existingId = match[2]\n const text = match[3].replace(/<[^>]*>/g, '') // Strip nested HTML\n const id = existingId || slugify(text)\n\n items.push({ id, text, level })\n }\n\n return items\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '')\n}\n\n// ============================================================================\n// BLOG POST COMPONENT\n// ============================================================================\n\nexport interface BlogPostServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Blog post slug */\n slug: string\n /** Show table of contents sidebar */\n showToc?: boolean\n /** Show related posts */\n showRelated?: boolean\n /** Number of related posts */\n relatedCount?: number\n /** Show author card */\n showAuthor?: boolean\n /** Base URL for blog links */\n basePath?: string\n /** Custom class name (applied to article) */\n className?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogPostStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /**\n * Canonical site URL (e.g. https://example.com) for classifying internal vs external links in post body and FAQ HTML.\n * Defaults to NEXT_PUBLIC_SITE_URL, SITE_URL, or VERCEL_URL.\n */\n siteUrl?: string\n /** Custom render function */\n children?: (props: {\n post: BlogPostType\n tableOfContents: TocItem[]\n relatedPosts: BlogPostType[]\n }) => React.ReactNode\n}\n\nexport async function BlogPost({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n slug,\n showToc = true,\n showRelated = true,\n relatedCount = 3,\n showAuthor = true,\n basePath = '/blog',\n className,\n styles = {},\n unstyled = false,\n siteUrl,\n children,\n}: BlogPostServerProps) {\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogPostStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n const post = await fetchBlogPost(apiUrl, apiKey, slug)\n\n if (!post) {\n return (\n <div \n className={`${styles.notFound || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 60 }, 'notFound')}\n >\n <h1 style={inlineStyle({ fontSize: 24, marginBottom: 16 }, 'notFound')}>Post Not Found</h1>\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'notFound')}>\n The blog post you're looking for doesn't exist or has been removed.\n </p>\n <a\n href={basePath}\n style={inlineStyle({\n display: 'inline-block',\n marginTop: 24,\n padding: '12px 24px',\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n borderRadius: 8,\n textDecoration: 'none',\n }, 'notFound')}\n >\n ← Back to Blog\n </a>\n </div>\n )\n }\n\n const content = post.content_html || post.content || ''\n const siteUrlResolved = resolveBlogSiteUrl(siteUrl)\n const contentWithExternalTargets = addExternalLinkTargets(content, siteUrlResolved)\n const tableOfContents = showToc ? generateTableOfContents(content) : []\n const relatedPosts = showRelated\n ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount)\n : []\n\n const faqRaw = (post.faq_items ?? (post as { faqItems?: unknown }).faqItems) as\n | Array<{ question: string; answer: string }>\n | undefined\n const faqItemsProcessed =\n faqRaw?.map((item) => ({\n ...item,\n answer: addExternalLinkTargets(item.answer || '', siteUrlResolved),\n })) ?? faqRaw\n\n // Custom render\n if (children) {\n return children({ post, tableOfContents, relatedPosts })\n }\n\n const { BlogPostFaqSection } = await import('./BlogPostFaqSection')\n\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n return (\n <article className={`${styles.article || ''} ${className || ''}`.trim() || undefined}>\n {/* Header */}\n <header \n className={styles.header}\n style={inlineStyle({ marginBottom: 32 }, 'header')}\n >\n {/* Breadcrumb */}\n <nav \n className={styles.breadcrumb}\n style={inlineStyle({ marginBottom: 16, fontSize: 14, color: 'var(--sk-text-secondary)' }, 'breadcrumb')}\n >\n <a \n href={basePath} \n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n Blog\n </a>\n {post.category && (\n <>\n <span style={inlineStyle({ margin: '0 8px' }, 'breadcrumb')}>/</span>\n <a\n href={`${basePath}?category=${post.category}`}\n className={styles.breadcrumbLink}\n style={inlineStyle({ color: 'var(--sk-primary)', textDecoration: 'none' }, 'breadcrumbLink')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n {/* Title */}\n <h1 \n className={styles.title}\n style={inlineStyle({ fontSize: 36, fontWeight: 700, lineHeight: 1.2, marginBottom: 16 }, 'title')}\n >\n {post.title}\n </h1>\n\n {/* Subtitle */}\n {post.subtitle && (\n <p \n className={styles.subtitle}\n style={inlineStyle({ fontSize: 20, color: 'var(--sk-text-secondary)', marginBottom: 16 }, 'subtitle')}\n >\n {post.subtitle}\n </p>\n )}\n\n {/* Meta */}\n <div \n className={styles.meta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 16, flexWrap: 'wrap' }, 'meta')}\n >\n {post.author && (\n <span \n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-primary)' }, 'metaItem')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {date && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)' }, 'metaItem')}\n >\n {date}\n </span>\n )}\n {post.reading_time_minutes && (\n <span\n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-tertiary)' }, 'metaItem')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </header>\n\n {/* Featured Image */}\n {post.featured_image && (\n <figure \n className={styles.featuredImageWrapper}\n style={inlineStyle({ margin: '0 0 32px' }, 'featuredImageWrapper')}\n >\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.featuredImage}\n style={inlineStyle({\n width: '100%',\n maxHeight: 500,\n objectFit: 'cover',\n borderRadius: 12,\n }, 'featuredImage')}\n />\n </figure>\n )}\n\n {/* Content Layout with TOC */}\n <div\n className={styles.contentLayout}\n style={inlineStyle({\n display: showToc && tableOfContents.length > 0 ? 'grid' : 'block',\n gridTemplateColumns: showToc && tableOfContents.length > 0 ? '1fr 250px' : undefined,\n gap: 48,\n }, 'contentLayout')}\n >\n {/* Main Content */}\n <div\n className={`blog-content ${styles.content || ''}`.trim()}\n style={inlineStyle({\n fontSize: 17,\n lineHeight: 1.8,\n color: 'var(--sk-text-primary)',\n }, 'content')}\n dangerouslySetInnerHTML={{ __html: contentWithExternalTargets }}\n />\n\n {/* Table of Contents Sidebar */}\n {showToc && tableOfContents.length > 0 && (\n <aside\n className={styles.tocSidebar}\n style={inlineStyle({\n position: 'sticky',\n top: 100,\n alignSelf: 'start',\n padding: 20,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n }, 'tocSidebar')}\n >\n <h4\n className={styles.tocTitle}\n style={inlineStyle({\n margin: '0 0 12px',\n fontSize: 12,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: 'var(--sk-text-secondary)',\n }, 'tocTitle')}\n >\n On This Page\n </h4>\n <ul \n className={styles.tocList}\n style={inlineStyle({ listStyle: 'none', margin: 0, padding: 0 }, 'tocList')}\n >\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n className={styles.tocItem}\n style={inlineStyle({\n paddingLeft: (item.level - 2) * 12,\n marginBottom: 8,\n }, 'tocItem')}\n >\n <a\n href={`#${item.id}`}\n className={styles.tocLink}\n style={inlineStyle({\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n textDecoration: 'none',\n }, 'tocLink')}\n >\n {item.text}\n </a>\n </li>\n ))}\n </ul>\n </aside>\n )}\n </div>\n\n {/* Tags */}\n {post.tags && post.tags.length > 0 && (\n <div \n className={styles.tags}\n style={inlineStyle({ marginTop: 32, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'tags')}\n >\n {post.tags.map((tag, index) => {\n const tagName = typeof tag === 'string' ? tag : tag?.name || '';\n return (\n <a\n key={`${tagName}-${index}`}\n href={`${basePath}?tag=${tagName}`}\n className={styles.tag}\n style={inlineStyle({\n padding: '4px 12px',\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 9999,\n fontSize: 13,\n color: 'var(--sk-text-primary)',\n textDecoration: 'none',\n }, 'tag')}\n >\n #{tagName}\n </a>\n );\n })}\n </div>\n )}\n\n {/* Service Callouts / CTAs (generated by Signal AI from business offerings) */}\n <ServiceCallouts\n callouts={(post as any).service_callouts ?? (post as any).serviceCallouts ?? []}\n unstyled={unstyled}\n />\n\n {/* FAQ Section — interactive accordion (SEO: content in DOM, not hidden) */}\n <BlogPostFaqSection\n items={(faqItemsProcessed ?? []) as any[]}\n unstyled={unstyled}\n styles={unstyled ? {\n section: styles.faqSection,\n title: styles.faqTitle,\n item: styles.faqItem,\n question: styles.faqQuestion,\n answerInner: styles.faqAnswer,\n } : undefined}\n />\n\n {/* Author Card (supports BlogAuthor or E-E-A-T author shape) */}\n {showAuthor && post.author && typeof post.author === 'object' && (\n <AuthorSection author={normalizeAuthorForDisplay(post.author)} className={styles.authorCard} unstyled={unstyled} />\n )}\n\n {/* Related Posts */}\n {showRelated && relatedPosts.length > 0 && (\n <section \n className={styles.relatedSection}\n style={inlineStyle({ marginTop: 48 }, 'relatedSection')}\n >\n <h2 \n className={styles.relatedTitle}\n style={inlineStyle({ fontSize: 24, fontWeight: 600, marginBottom: 24 }, 'relatedTitle')}\n >\n Related Posts\n </h2>\n <div\n className={styles.relatedGrid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',\n gap: 24,\n }, 'relatedGrid')}\n >\n {relatedPosts.map((relatedPost) => (\n <article\n key={relatedPost.id}\n className={styles.relatedCard}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }, 'relatedCard')}\n >\n {relatedPost.featured_image && (\n <a href={`${basePath}/${relatedPost.slug}`}>\n <img\n src={relatedPost.featured_image}\n alt={relatedPost.title}\n style={inlineStyle({ width: '100%', height: 150, objectFit: 'cover' }, 'relatedCard')}\n />\n </a>\n )}\n <div style={inlineStyle({ padding: 16 }, 'relatedCard')}>\n <h3 style={inlineStyle({ fontSize: 16, fontWeight: 600, marginBottom: 8 }, 'relatedCard')}>\n <a\n href={`${basePath}/${relatedPost.slug}`}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'relatedCard')}\n >\n {relatedPost.title}\n </a>\n </h3>\n {relatedPost.excerpt && (\n <p style={inlineStyle({ fontSize: 14, color: 'var(--sk-text-secondary)', margin: 0 }, 'relatedCard')}>\n {relatedPost.excerpt.slice(0, 100)}...\n </p>\n )}\n </div>\n </article>\n ))}\n </div>\n </section>\n )}\n </article>\n )\n}\n\n// ============================================================================\n// AUTHOR NORMALIZATION (BlogAuthor + E-E-A-T shapes)\n// ============================================================================\n\n/** Normalize author from Portal: supports BlogAuthor (avatar_url, social_links) or E-E-A-T (image, url, socialProfiles) */\nfunction normalizeAuthorForDisplay(\n author: Record<string, unknown> | BlogAuthor\n): BlogAuthor & { sameAs?: string[]; title?: string } {\n const a = author as Record<string, unknown>\n const avatarUrl =\n (a.avatar_url as string) ?? (a.image as string) ?? (a.image_url as string)\n const socialLinks = a.social_links as BlogAuthor['social_links'] | undefined\n const socialProfiles = a.socialProfiles as string[] | undefined\n return {\n id: (a.id as string) ?? 'author',\n project_id: (a.project_id as string) ?? '',\n name: (a.name as string) ?? 'Author',\n slug: (a.slug as string) ?? 'author',\n bio: (a.bio as string) ?? undefined,\n avatar_url: avatarUrl ?? undefined,\n email: (a.email as string) ?? undefined,\n website: (a.website as string) ?? (a.url as string) ?? undefined,\n social_links: socialLinks ?? undefined,\n is_active: (a.is_active as boolean) ?? true,\n ...(socialProfiles?.length ? { sameAs: socialProfiles } : {}),\n ...(a.title ? { title: a.title as string } : {}),\n } as BlogAuthor & { sameAs?: string[]; title?: string }\n}\n\n// ============================================================================\n// AUTHOR SECTION\n// ============================================================================\n\nfunction AuthorSection({\n author,\n className,\n unstyled = false,\n}: {\n author: BlogAuthor & { sameAs?: string[]; title?: string }\n className?: string\n unstyled?: boolean\n}) {\n return (\n <section\n className={className}\n style={unstyled || className ? undefined : {\n marginTop: 48,\n padding: 24,\n backgroundColor: 'var(--sk-bg-elevated)',\n borderRadius: 12,\n display: 'flex',\n gap: 20,\n alignItems: 'flex-start',\n }}\n >\n {author.avatar_url && (\n <img\n src={author.avatar_url}\n alt={author.name}\n style={unstyled || className ? undefined : {\n width: 80,\n height: 80,\n borderRadius: '50%',\n objectFit: 'cover',\n }}\n />\n )}\n <div>\n <h3 style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 18, fontWeight: 600 }}>\n {author.name}\n </h3>\n {'title' in author && author.title && (\n <p style={unstyled || className ? undefined : { margin: '0 0 4px', fontSize: 14, color: 'var(--sk-text-secondary)' }}>\n {author.title}\n </p>\n )}\n {author.bio && (\n <p style={unstyled || className ? undefined : { margin: '0 0 12px', color: 'var(--sk-text-secondary)', fontSize: 14 }}>\n {author.bio}\n </p>\n )}\n {author.social_links && (\n <div style={unstyled || className ? undefined : { display: 'flex', gap: 16 }}>\n {author.social_links.twitter && (\n <a\n href={`https://twitter.com/${author.social_links.twitter}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Twitter\n </a>\n )}\n {author.social_links.linkedin && (\n <a\n href={author.social_links.linkedin}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={unstyled || className ? undefined : { color: 'var(--sk-primary)', fontSize: 14 }}\n >\n LinkedIn\n </a>\n )}\n </div>\n )}\n {'sameAs' in author && author.sameAs && author.sameAs.length > 0 && !author.social_links && (\n <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap' }}>\n {author.sameAs.map((url, i) => (\n <a\n key={i}\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ color: 'var(--sk-primary)', fontSize: 14 }}\n >\n Profile\n </a>\n ))}\n </div>\n )}\n </div>\n </section>\n )\n}","/**\n * @sonordev/site-kit/blog - Blog List Component\n * \n * Fetches and displays a list of blog posts with pagination, filtering, and sorting.\n * Supports both server-side and client-side rendering.\n * \n * @example Tailwind styling\n * ```tsx\n * <BlogList\n * styles={{\n * container: 'max-w-7xl mx-auto px-4',\n * categoryNav: 'flex flex-wrap gap-2 mb-8',\n * categoryLink: 'px-4 py-2 rounded-full text-sm font-medium',\n * categoryLinkActive: 'bg-primary-600 text-white',\n * categoryLinkInactive: 'bg-gray-100 text-gray-700 hover:bg-gray-200',\n * grid: 'grid md:grid-cols-2 lg:grid-cols-3 gap-8',\n * card: 'bg-white rounded-xl shadow-sm hover:shadow-lg transition-shadow',\n * cardImage: 'w-full h-48 object-cover',\n * cardBody: 'p-6',\n * cardTitle: 'text-xl font-bold text-gray-900',\n * cardExcerpt: 'text-gray-600 line-clamp-3',\n * cardMeta: 'text-sm text-gray-500',\n * pagination: 'flex justify-center gap-4 mt-12',\n * paginationLink: 'px-6 py-3 bg-primary-600 text-white rounded-lg',\n * emptyState: 'text-center py-12 text-gray-500',\n * }}\n * />\n * ```\n */\n\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\n\n// ============================================================================\n// STYLE TYPES\n// ============================================================================\n\nexport interface BlogListStyles {\n /** Container wrapper */\n container?: string\n /** Category navigation wrapper */\n categoryNav?: string\n /** Individual category link */\n categoryLink?: string\n /** Active category link (combined with categoryLink) */\n categoryLinkActive?: string\n /** Inactive category link (combined with categoryLink) */\n categoryLinkInactive?: string\n /** Posts grid container */\n grid?: string\n /** Individual post card */\n card?: string\n /** Card image wrapper */\n cardImageWrapper?: string\n /** Card image */\n cardImage?: string\n /** Card body/content area */\n cardBody?: string\n /** Card meta row (date, category) */\n cardMeta?: string\n /** Card category badge */\n cardCategory?: string\n /** Card date */\n cardDate?: string\n /** Card title */\n cardTitle?: string\n /** Card title link */\n cardTitleLink?: string\n /** Card excerpt */\n cardExcerpt?: string\n /** Card footer */\n cardFooter?: string\n /** Card author */\n cardAuthor?: string\n /** Card reading time */\n cardReadingTime?: string\n /** Card read more link */\n cardReadMore?: string\n /** Pagination container */\n pagination?: string\n /** Pagination link */\n paginationLink?: string\n /** Pagination info text */\n paginationInfo?: string\n /** Empty state */\n emptyState?: string\n}\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\ninterface FetchBlogListParams {\n apiUrl: string\n apiKey: string\n category?: string\n tag?: string\n author?: string\n featured?: boolean\n search?: string\n page?: number\n perPage?: number\n orderBy?: 'published_at' | 'title' | 'view_count'\n order?: 'asc' | 'desc'\n}\n\nasync function fetchBlogList(params: FetchBlogListParams): Promise<BlogListResult> {\n const {\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n } = params\n\n const queryParams = new URLSearchParams()\n if (category) queryParams.set('category', category)\n if (tag) queryParams.set('tag', tag)\n if (author) queryParams.set('author', author)\n if (featured) queryParams.set('featured', 'true')\n if (search) queryParams.set('search', search)\n queryParams.set('page', String(page))\n queryParams.set('per_page', String(perPage))\n queryParams.set('order_by', orderBy)\n queryParams.set('order', order)\n\n try {\n const response = await fetch(`${apiUrl}/public/blog/posts?${queryParams}`, {\n headers: {\n 'x-api-key': apiKey,\n },\n next: { revalidate: 60 }, // Revalidate every 60 seconds\n })\n\n if (!response.ok) {\n console.error('[Blog] Failed to fetch posts:', response.statusText)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n\n const data = await response.json()\n \n return {\n posts: data.posts || [],\n pagination: {\n page: data.pagination?.page || 1,\n perPage: data.pagination?.per_page || 12,\n total: data.pagination?.total || 0,\n totalPages: data.pagination?.total_pages || 0,\n hasNext: data.pagination?.has_next || false,\n hasPrev: data.pagination?.has_prev || false,\n },\n }\n } catch (error) {\n console.error('[Blog] Error fetching posts:', error)\n return {\n posts: [],\n pagination: {\n page: 1,\n perPage: 12,\n total: 0,\n totalPages: 0,\n hasNext: false,\n hasPrev: false,\n },\n }\n }\n}\n\nasync function fetchCategories(apiUrl: string, apiKey: string): Promise<BlogCategory[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/categories`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 }, // Cache for 5 minutes\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.categories || []\n } catch (error) {\n console.error('[Blog] Error fetching categories:', error)\n return []\n }\n}\n\n// ============================================================================\n// BLOG LIST COMPONENT\n// ============================================================================\n\nexport interface BlogListServerProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Filter by category slug */\n category?: string\n /** Filter by tag */\n tag?: string\n /** Filter by author */\n author?: string\n /** Only featured posts */\n featured?: boolean\n /** Search query */\n search?: string\n /** Page number (1-indexed) */\n page?: number\n /** Items per page */\n perPage?: number\n /** Sort field */\n orderBy?: 'published_at' | 'title' | 'view_count'\n /** Sort direction */\n order?: 'asc' | 'desc'\n /** Show category filter UI */\n showCategoryFilter?: boolean\n /** Show pagination */\n showPagination?: boolean\n /** Custom class name (applied to container) */\n className?: string\n /** Base URL for post links */\n basePath?: string\n /** \n * Custom Tailwind/CSS classes for each element.\n * When provided, inline styles are disabled for that element.\n */\n styles?: BlogListStyles\n /** Use CSS classes only (no inline styles) - set to true for Tailwind sites */\n unstyled?: boolean\n /** Custom render function for post card */\n renderPost?: (post: BlogPost) => React.ReactNode\n /** Custom render function for entire grid */\n children?: (props: {\n posts: BlogPost[]\n pagination: BlogListResult['pagination']\n categories: BlogCategory[]\n }) => React.ReactNode\n}\n\nexport async function BlogList({\n apiUrl = process.env.SONOR_API_URL || 'https://api.sonor.io',\n apiKey = process.env.SONOR_API_KEY || '',\n category,\n tag,\n author,\n featured,\n search,\n page = 1,\n perPage = 12,\n orderBy = 'published_at',\n order = 'desc',\n showCategoryFilter = false,\n showPagination = true,\n className,\n basePath = '/blog',\n styles = {},\n unstyled = false,\n renderPost,\n children,\n}: BlogListServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n // Fetch data in parallel\n const [blogData, categories] = await Promise.all([\n fetchBlogList({\n apiUrl,\n apiKey,\n category,\n tag,\n author,\n featured,\n search,\n page,\n perPage,\n orderBy,\n order,\n }),\n showCategoryFilter ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n ])\n\n // Use custom render function if provided\n if (children) {\n return children({ posts: blogData.posts, pagination: blogData.pagination, categories })\n }\n\n const { posts, pagination } = blogData\n\n if (posts.length === 0) {\n return (\n <div \n className={`${styles.container || ''} ${styles.emptyState || ''} ${className || ''}`.trim() || undefined}\n style={inlineStyle({ textAlign: 'center', padding: 40 }, 'emptyState')}\n >\n <p style={inlineStyle({ color: 'var(--sk-text-secondary)' }, 'emptyState')}>No posts found.</p>\n </div>\n )\n }\n\n return (\n <div className={`${styles.container || ''} ${className || ''}`.trim() || undefined}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav \n className={styles.categoryNav}\n style={inlineStyle({ marginBottom: 24, display: 'flex', gap: 8, flexWrap: 'wrap' }, 'categoryNav')}\n >\n <a\n href={basePath}\n className={`${styles.categoryLink || ''} ${!category ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: !category ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: !category ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={`${basePath}?category=${cat.slug}`}\n className={`${styles.categoryLink || ''} ${category === cat.slug ? styles.categoryLinkActive || '' : styles.categoryLinkInactive || ''}`.trim() || undefined}\n style={inlineStyle({\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: category === cat.slug ? 'var(--sk-primary)' : 'var(--sk-bg-elevated)',\n color: category === cat.slug ? 'var(--sk-bg)' : 'var(--sk-text-primary)',\n }, 'categoryLink')}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div\n className={styles.grid}\n style={inlineStyle({\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 24,\n }, 'grid')}\n >\n {posts.map((post) =>\n renderPost ? (\n <React.Fragment key={post.id}>{renderPost(post)}</React.Fragment>\n ) : (\n <BlogPostCard key={post.id} post={post} basePath={basePath} styles={styles} unstyled={unstyled} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav\n className={styles.pagination}\n style={inlineStyle({\n marginTop: 40,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n }, 'pagination')}\n >\n {pagination.hasPrev && (\n <a\n href={buildPaginationUrl(basePath, page - 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n ← Previous\n </a>\n )}\n \n <span \n className={styles.paginationInfo}\n style={inlineStyle({ padding: '8px 16px', color: 'var(--sk-text-secondary)' }, 'paginationInfo')}\n >\n Page {pagination.page} of {pagination.totalPages}\n </span>\n \n {pagination.hasNext && (\n <a\n href={buildPaginationUrl(basePath, page + 1, category)}\n className={styles.paginationLink}\n style={inlineStyle(paginationLinkStyle, 'paginationLink')}\n >\n Next →\n </a>\n )}\n </nav>\n )}\n </div>\n )\n}\n\n// ============================================================================\n// BLOG POST CARD (Default rendering)\n// ============================================================================\n\ninterface BlogPostCardProps {\n post: BlogPost\n basePath: string\n styles?: BlogListStyles\n unstyled?: boolean\n}\n\nfunction BlogPostCard({ post, basePath, styles = {}, unstyled = false }: BlogPostCardProps) {\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'long',\n day: 'numeric',\n year: 'numeric',\n })\n : null\n\n // Helper to conditionally apply inline styles\n const inlineStyle = (defaultStyle: React.CSSProperties, classKey: keyof BlogListStyles) =>\n unstyled || styles[classKey] ? undefined : defaultStyle\n\n return (\n <article\n className={styles.card}\n style={inlineStyle({\n backgroundColor: 'var(--sk-bg)',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n transition: 'box-shadow 0.2s, transform 0.2s',\n }, 'card')}\n >\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`} className={styles.cardImageWrapper}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n className={styles.cardImage}\n style={inlineStyle({\n width: '100%',\n height: 200,\n objectFit: 'cover',\n }, 'cardImage')}\n />\n </a>\n )}\n \n <div \n className={styles.cardBody}\n style={inlineStyle({ padding: 20 }, 'cardBody')}\n >\n {/* Meta */}\n <div \n className={styles.cardMeta}\n style={inlineStyle({ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }, 'cardMeta')}\n >\n {post.category && (\n <span\n className={styles.cardCategory}\n style={inlineStyle({\n padding: '2px 8px',\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: 'rgba(var(--sk-primary-rgb), 0.1)',\n color: 'var(--sk-primary)',\n textTransform: 'uppercase',\n }, 'cardCategory')}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {date && (\n <span \n className={styles.cardDate}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardDate')}\n >\n {date}\n </span>\n )}\n </div>\n\n {/* Title */}\n <h3 \n className={styles.cardTitle}\n style={inlineStyle({ margin: '0 0 8px', fontSize: 18, fontWeight: 600, lineHeight: 1.4 }, 'cardTitle')}\n >\n <a\n href={`${basePath}/${post.slug}`}\n className={styles.cardTitleLink}\n style={inlineStyle({ color: 'inherit', textDecoration: 'none' }, 'cardTitleLink')}\n >\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p\n className={styles.cardExcerpt}\n style={inlineStyle({\n margin: '0 0 16px',\n fontSize: 14,\n color: 'var(--sk-text-secondary)',\n lineHeight: 1.6,\n display: '-webkit-box',\n WebkitLineClamp: 3,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }, 'cardExcerpt')}\n >\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div \n className={styles.cardFooter}\n style={inlineStyle({ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, 'cardFooter')}\n >\n {post.author && (\n <span \n className={styles.cardAuthor}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-secondary)' }, 'cardAuthor')}\n >\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.reading_time_minutes && (\n <span \n className={styles.cardReadingTime}\n style={inlineStyle({ fontSize: 13, color: 'var(--sk-text-tertiary)' }, 'cardReadingTime')}\n >\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </div>\n </article>\n )\n}\n\n// ============================================================================\n// HELPERS\n// ============================================================================\n\nfunction buildPaginationUrl(basePath: string, page: number, category?: string): string {\n const params = new URLSearchParams()\n params.set('page', String(page))\n if (category) params.set('category', category)\n return `${basePath}?${params}`\n}\n\nconst paginationLinkStyle: React.CSSProperties = {\n padding: '8px 16px',\n borderRadius: 8,\n backgroundColor: 'var(--sk-primary)',\n color: 'var(--sk-bg)',\n textDecoration: 'none',\n fontSize: 14,\n fontWeight: 500,\n}"]}