@sonordev/site-kit 1.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +376 -0
- package/dist/SetupWizard-Cki06kB0.d.mts +12 -0
- package/dist/SetupWizard-Cki06kB0.d.ts +12 -0
- package/dist/analytics/index.d.mts +93 -0
- package/dist/analytics/index.d.ts +93 -0
- package/dist/analytics/index.js +89 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +71 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/api-CWtoFJCO.d.mts +137 -0
- package/dist/api-CWtoFJCO.d.ts +137 -0
- package/dist/blog/index.d.mts +305 -0
- package/dist/blog/index.d.ts +305 -0
- package/dist/blog/index.js +1578 -0
- package/dist/blog/index.js.map +1 -0
- package/dist/blog/index.mjs +1562 -0
- package/dist/blog/index.mjs.map +1 -0
- package/dist/blog/server.d.mts +229 -0
- package/dist/blog/server.d.ts +229 -0
- package/dist/blog/server.js +692 -0
- package/dist/blog/server.js.map +1 -0
- package/dist/blog/server.mjs +666 -0
- package/dist/blog/server.mjs.map +1 -0
- package/dist/chunk-24277A3Q.mjs +968 -0
- package/dist/chunk-24277A3Q.mjs.map +1 -0
- package/dist/chunk-373TK6TZ.js +321 -0
- package/dist/chunk-373TK6TZ.js.map +1 -0
- package/dist/chunk-3MYZS6PD.js +30 -0
- package/dist/chunk-3MYZS6PD.js.map +1 -0
- package/dist/chunk-43GBM4SX.js +283 -0
- package/dist/chunk-43GBM4SX.js.map +1 -0
- package/dist/chunk-4XPGGLVP.mjs +53 -0
- package/dist/chunk-4XPGGLVP.mjs.map +1 -0
- package/dist/chunk-622GAQP5.js +2008 -0
- package/dist/chunk-622GAQP5.js.map +1 -0
- package/dist/chunk-6BIPAKL4.mjs +28 -0
- package/dist/chunk-6BIPAKL4.mjs.map +1 -0
- package/dist/chunk-6ZCISNAB.mjs +343 -0
- package/dist/chunk-6ZCISNAB.mjs.map +1 -0
- package/dist/chunk-72MQFHYJ.js +1429 -0
- package/dist/chunk-72MQFHYJ.js.map +1 -0
- package/dist/chunk-7557OTHW.js +62 -0
- package/dist/chunk-7557OTHW.js.map +1 -0
- package/dist/chunk-7FUV73JZ.js +981 -0
- package/dist/chunk-7FUV73JZ.js.map +1 -0
- package/dist/chunk-7RF6PVHA.mjs +324 -0
- package/dist/chunk-7RF6PVHA.mjs.map +1 -0
- package/dist/chunk-7RYCHO6D.mjs +134 -0
- package/dist/chunk-7RYCHO6D.mjs.map +1 -0
- package/dist/chunk-7UKPRW25.mjs +1999 -0
- package/dist/chunk-7UKPRW25.mjs.map +1 -0
- package/dist/chunk-7URAOG2M.js +14864 -0
- package/dist/chunk-7URAOG2M.js.map +1 -0
- package/dist/chunk-AFAO3TGS.mjs +810 -0
- package/dist/chunk-AFAO3TGS.mjs.map +1 -0
- package/dist/chunk-BYLIU6XG.js +343 -0
- package/dist/chunk-BYLIU6XG.js.map +1 -0
- package/dist/chunk-D63MUKZ6.mjs +4423 -0
- package/dist/chunk-D63MUKZ6.mjs.map +1 -0
- package/dist/chunk-DDKW2FNA.js +390 -0
- package/dist/chunk-DDKW2FNA.js.map +1 -0
- package/dist/chunk-DQYMKR27.mjs +341 -0
- package/dist/chunk-DQYMKR27.mjs.map +1 -0
- package/dist/chunk-DW5UJKHH.js +221 -0
- package/dist/chunk-DW5UJKHH.js.map +1 -0
- package/dist/chunk-EEZCR6E6.js +50 -0
- package/dist/chunk-EEZCR6E6.js.map +1 -0
- package/dist/chunk-GCJXQ4AG.mjs +59 -0
- package/dist/chunk-GCJXQ4AG.mjs.map +1 -0
- package/dist/chunk-JGNQK2G6.mjs +14845 -0
- package/dist/chunk-JGNQK2G6.mjs.map +1 -0
- package/dist/chunk-JTLOJLWQ.mjs +563 -0
- package/dist/chunk-JTLOJLWQ.mjs.map +1 -0
- package/dist/chunk-K23A4G76.mjs +202 -0
- package/dist/chunk-K23A4G76.mjs.map +1 -0
- package/dist/chunk-KKU3K7RG.js +336 -0
- package/dist/chunk-KKU3K7RG.js.map +1 -0
- package/dist/chunk-KUGMH4ZF.js +571 -0
- package/dist/chunk-KUGMH4ZF.js.map +1 -0
- package/dist/chunk-LBVWVP72.js +110 -0
- package/dist/chunk-LBVWVP72.js.map +1 -0
- package/dist/chunk-LIVWLY2P.js +138 -0
- package/dist/chunk-LIVWLY2P.js.map +1 -0
- package/dist/chunk-M2T6R7BA.mjs +1003 -0
- package/dist/chunk-M2T6R7BA.mjs.map +1 -0
- package/dist/chunk-MV3QN7PW.mjs +47 -0
- package/dist/chunk-MV3QN7PW.mjs.map +1 -0
- package/dist/chunk-OB7E654K.js +72 -0
- package/dist/chunk-OB7E654K.js.map +1 -0
- package/dist/chunk-OIIKTGRL.mjs +380 -0
- package/dist/chunk-OIIKTGRL.mjs.map +1 -0
- package/dist/chunk-P3UWIUJS.mjs +1427 -0
- package/dist/chunk-P3UWIUJS.mjs.map +1 -0
- package/dist/chunk-PKN27UMH.mjs +136 -0
- package/dist/chunk-PKN27UMH.mjs.map +1 -0
- package/dist/chunk-QXV4667R.mjs +105 -0
- package/dist/chunk-QXV4667R.mjs.map +1 -0
- package/dist/chunk-S7FRYNSU.mjs +315 -0
- package/dist/chunk-S7FRYNSU.mjs.map +1 -0
- package/dist/chunk-TFLQX7K7.mjs +68 -0
- package/dist/chunk-TFLQX7K7.mjs.map +1 -0
- package/dist/chunk-UWE5PCYJ.mjs +279 -0
- package/dist/chunk-UWE5PCYJ.mjs.map +1 -0
- package/dist/chunk-UYFDNX2F.js +4469 -0
- package/dist/chunk-UYFDNX2F.js.map +1 -0
- package/dist/chunk-W4PALSGM.js +350 -0
- package/dist/chunk-W4PALSGM.js.map +1 -0
- package/dist/chunk-WECQ6KOB.js +1008 -0
- package/dist/chunk-WECQ6KOB.js.map +1 -0
- package/dist/chunk-XQQWI6WB.js +814 -0
- package/dist/chunk-XQQWI6WB.js.map +1 -0
- package/dist/chunk-XZJOZJB6.js +140 -0
- package/dist/chunk-XZJOZJB6.js.map +1 -0
- package/dist/chunk-ZSMWDLMK.js +63 -0
- package/dist/chunk-ZSMWDLMK.js.map +1 -0
- package/dist/cli/index.js +37243 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +37209 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/commerce/index.d.mts +170 -0
- package/dist/commerce/index.d.ts +170 -0
- package/dist/commerce/index.js +174 -0
- package/dist/commerce/index.js.map +1 -0
- package/dist/commerce/index.mjs +5 -0
- package/dist/commerce/index.mjs.map +1 -0
- package/dist/commerce/server.d.mts +107 -0
- package/dist/commerce/server.d.ts +107 -0
- package/dist/commerce/server.js +187 -0
- package/dist/commerce/server.js.map +1 -0
- package/dist/commerce/server.mjs +177 -0
- package/dist/commerce/server.mjs.map +1 -0
- package/dist/config/index.d.mts +43 -0
- package/dist/config/index.d.ts +43 -0
- package/dist/config/index.js +66 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +64 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/engage/index.d.mts +33 -0
- package/dist/engage/index.d.ts +33 -0
- package/dist/engage/index.js +22 -0
- package/dist/engage/index.js.map +1 -0
- package/dist/engage/index.mjs +5 -0
- package/dist/engage/index.mjs.map +1 -0
- package/dist/forms/index.d.mts +437 -0
- package/dist/forms/index.d.ts +437 -0
- package/dist/forms/index.js +1168 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/index.mjs +1142 -0
- package/dist/forms/index.mjs.map +1 -0
- package/dist/generators-2XKQMPKH.mjs +4 -0
- package/dist/generators-2XKQMPKH.mjs.map +1 -0
- package/dist/generators-DTMO36DV.js +33 -0
- package/dist/generators-DTMO36DV.js.map +1 -0
- package/dist/images/index.d.mts +4 -0
- package/dist/images/index.d.ts +4 -0
- package/dist/images/index.js +46 -0
- package/dist/images/index.js.map +1 -0
- package/dist/images/index.mjs +5 -0
- package/dist/images/index.mjs.map +1 -0
- package/dist/images/server.d.mts +69 -0
- package/dist/images/server.d.ts +69 -0
- package/dist/images/server.js +21 -0
- package/dist/images/server.js.map +1 -0
- package/dist/images/server.mjs +4 -0
- package/dist/images/server.mjs.map +1 -0
- package/dist/index.d.mts +846 -0
- package/dist/index.d.ts +846 -0
- package/dist/index.js +2623 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2416 -0
- package/dist/index.mjs.map +1 -0
- package/dist/layout/index.d.mts +53 -0
- package/dist/layout/index.d.ts +53 -0
- package/dist/layout/index.js +187 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/layout/index.mjs +185 -0
- package/dist/layout/index.mjs.map +1 -0
- package/dist/llms/index.d.mts +448 -0
- package/dist/llms/index.d.ts +448 -0
- package/dist/llms/index.js +581 -0
- package/dist/llms/index.js.map +1 -0
- package/dist/llms/index.mjs +529 -0
- package/dist/llms/index.mjs.map +1 -0
- package/dist/manifest/index.d.mts +62 -0
- package/dist/manifest/index.d.ts +62 -0
- package/dist/manifest/index.js +85 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/index.mjs +83 -0
- package/dist/manifest/index.mjs.map +1 -0
- package/dist/middleware/index.d.mts +63 -0
- package/dist/middleware/index.d.ts +63 -0
- package/dist/middleware/index.js +54 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/index.mjs +51 -0
- package/dist/middleware/index.mjs.map +1 -0
- package/dist/migrator-2MQHOFDQ.mjs +4 -0
- package/dist/migrator-2MQHOFDQ.mjs.map +1 -0
- package/dist/migrator-THJCF6MZ.js +37 -0
- package/dist/migrator-THJCF6MZ.js.map +1 -0
- package/dist/redirects/index.d.mts +78 -0
- package/dist/redirects/index.d.ts +78 -0
- package/dist/redirects/index.js +26 -0
- package/dist/redirects/index.js.map +1 -0
- package/dist/redirects/index.mjs +5 -0
- package/dist/redirects/index.mjs.map +1 -0
- package/dist/reputation/index.d.mts +57 -0
- package/dist/reputation/index.d.ts +57 -0
- package/dist/reputation/index.js +21 -0
- package/dist/reputation/index.js.map +1 -0
- package/dist/reputation/index.mjs +4 -0
- package/dist/reputation/index.mjs.map +1 -0
- package/dist/robots/index.d.mts +38 -0
- package/dist/robots/index.d.ts +38 -0
- package/dist/robots/index.js +52 -0
- package/dist/robots/index.js.map +1 -0
- package/dist/robots/index.mjs +50 -0
- package/dist/robots/index.mjs.map +1 -0
- package/dist/routing-B5XS-6_W.d.mts +118 -0
- package/dist/routing-DZYzyDHw.d.ts +118 -0
- package/dist/scanner-GAF5PO5F.js +53 -0
- package/dist/scanner-GAF5PO5F.js.map +1 -0
- package/dist/scanner-LKJKW7IT.mjs +4 -0
- package/dist/scanner-LKJKW7IT.mjs.map +1 -0
- package/dist/securityHeaders-nwZ6nP4g.d.mts +24 -0
- package/dist/securityHeaders-nwZ6nP4g.d.ts +24 -0
- package/dist/seo/index.d.mts +600 -0
- package/dist/seo/index.d.ts +600 -0
- package/dist/seo/index.js +883 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/index.mjs +773 -0
- package/dist/seo/index.mjs.map +1 -0
- package/dist/seo/register-sitemap-cli.js +151 -0
- package/dist/seo/register-sitemap-cli.js.map +1 -0
- package/dist/seo/register-sitemap-cli.mjs +144 -0
- package/dist/seo/register-sitemap-cli.mjs.map +1 -0
- package/dist/seo/server.d.mts +107 -0
- package/dist/seo/server.d.ts +107 -0
- package/dist/seo/server.js +207 -0
- package/dist/seo/server.js.map +1 -0
- package/dist/seo/server.mjs +186 -0
- package/dist/seo/server.mjs.map +1 -0
- package/dist/server-api-EWXKOQZA.mjs +4 -0
- package/dist/server-api-EWXKOQZA.mjs.map +1 -0
- package/dist/server-api-GJPNRYUP.js +81 -0
- package/dist/server-api-GJPNRYUP.js.map +1 -0
- package/dist/setup/client.d.mts +60 -0
- package/dist/setup/client.d.ts +60 -0
- package/dist/setup/client.js +31 -0
- package/dist/setup/client.js.map +1 -0
- package/dist/setup/client.mjs +6 -0
- package/dist/setup/client.mjs.map +1 -0
- package/dist/setup/index.d.mts +5 -0
- package/dist/setup/index.d.ts +5 -0
- package/dist/setup/index.js +35 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/index.mjs +6 -0
- package/dist/setup/index.mjs.map +1 -0
- package/dist/setup/server.d.mts +14 -0
- package/dist/setup/server.d.ts +14 -0
- package/dist/setup/server.js +13 -0
- package/dist/setup/server.js.map +1 -0
- package/dist/setup/server.mjs +4 -0
- package/dist/setup/server.mjs.map +1 -0
- package/dist/site-config/index.d.mts +24 -0
- package/dist/site-config/index.d.ts +24 -0
- package/dist/site-config/index.js +17 -0
- package/dist/site-config/index.js.map +1 -0
- package/dist/site-config/index.mjs +4 -0
- package/dist/site-config/index.mjs.map +1 -0
- package/dist/sitemap/index.d.mts +96 -0
- package/dist/sitemap/index.d.ts +96 -0
- package/dist/sitemap/index.js +288 -0
- package/dist/sitemap/index.js.map +1 -0
- package/dist/sitemap/index.mjs +285 -0
- package/dist/sitemap/index.mjs.map +1 -0
- package/dist/socket-loader-J26QHHOB.js +16 -0
- package/dist/socket-loader-J26QHHOB.js.map +1 -0
- package/dist/socket-loader-R7S2YJ2J.mjs +14 -0
- package/dist/socket-loader-R7S2YJ2J.mjs.map +1 -0
- package/dist/types-0dmq3k20.d.mts +168 -0
- package/dist/types-0dmq3k20.d.ts +168 -0
- package/dist/types-Blb2QNkV.d.mts +263 -0
- package/dist/types-Blb2QNkV.d.ts +263 -0
- package/dist/types-BnCwwUX3.d.mts +250 -0
- package/dist/types-BnCwwUX3.d.ts +250 -0
- package/dist/types-CGlnp43R.d.mts +312 -0
- package/dist/types-CGlnp43R.d.ts +312 -0
- package/dist/types-D08004rU.d.mts +179 -0
- package/dist/types-D08004rU.d.ts +179 -0
- package/dist/types-DNSYU7qI.d.mts +127 -0
- package/dist/types-DNSYU7qI.d.ts +127 -0
- package/dist/types-KZP_VWZp.d.mts +266 -0
- package/dist/types-KZP_VWZp.d.ts +266 -0
- package/dist/useEventModal-BVTx69XE.d.mts +274 -0
- package/dist/useEventModal-Dx1dItTJ.d.ts +274 -0
- package/dist/web-vitals-444RLW3B.js +252 -0
- package/dist/web-vitals-444RLW3B.js.map +1 -0
- package/dist/web-vitals-KPICZIEF.mjs +241 -0
- package/dist/web-vitals-KPICZIEF.mjs.map +1 -0
- package/package.json +192 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/blog/BlogPost.tsx","../../src/blog/BlogList.tsx","../../src/blog/BlogSidebar.tsx","../../src/blog/BlogLayout.tsx","../../src/blog/AuthorCard.tsx","../../src/blog/RelatedPosts.tsx","../../src/blog/TableOfContents.tsx"],"names":["jsx","jsxs","fetchCategories","fetchRelatedPosts"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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'\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 /** 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.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com',\n apiKey = process.env.NEXT_PUBLIC_UPTRADE_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 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: '#6b7280' }, '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: '#3b82f6',\n color: '#fff',\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 tableOfContents = showToc ? generateTableOfContents(content) : []\n const relatedPosts = showRelated\n ? await fetchRelatedPosts(apiUrl, apiKey, post.id, relatedCount)\n : []\n\n // Custom render\n if (children) {\n return children({ post, tableOfContents, relatedPosts })\n }\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: '#6b7280' }, 'breadcrumb')}\n >\n <a \n href={basePath} \n className={styles.breadcrumbLink}\n style={inlineStyle({ color: '#3b82f6', 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: '#3b82f6', 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: '#6b7280', 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: '#374151' }, '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: '#6b7280' }, 'metaItem')}\n >\n {date}\n </span>\n )}\n {post.reading_time_minutes && (\n <span \n className={styles.metaItem}\n style={inlineStyle({ fontSize: 14, color: '#9ca3af' }, '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: '#374151',\n }, 'content')}\n dangerouslySetInnerHTML={{ __html: content }}\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: '#f9fafb',\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: '#6b7280',\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: '#6b7280',\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: '#f3f4f6',\n borderRadius: 9999,\n fontSize: 13,\n color: '#374151',\n textDecoration: 'none',\n }, 'tag')}\n >\n #{tagName}\n </a>\n );\n })}\n </div>\n )}\n\n {/* FAQ Section (supports faq_items or faqItems from Portal / E-E-A-T) */}\n {(post.faq_items ?? (post as any).faqItems) && Array.isArray(post.faq_items ?? (post as any).faqItems) && (post.faq_items ?? (post as any).faqItems).length > 0 && (\n <section \n className={styles.faqSection}\n style={inlineStyle({ marginTop: 48 }, 'faqSection')}\n >\n <h2 \n className={styles.faqTitle}\n style={inlineStyle({ fontSize: 24, fontWeight: 600, marginBottom: 24 }, 'faqTitle')}\n >\n Frequently Asked Questions\n </h2>\n <div style={inlineStyle({ display: 'flex', flexDirection: 'column', gap: 16 }, 'faqSection')}>\n {(post.faq_items ?? (post as any).faqItems).map((faq: { question: string; answer: string }, index: number) => (\n <details\n key={index}\n className={styles.faqItem}\n style={inlineStyle({\n padding: 16,\n backgroundColor: '#f9fafb',\n borderRadius: 8,\n }, 'faqItem')}\n >\n <summary\n className={styles.faqQuestion}\n style={inlineStyle({\n fontWeight: 500,\n cursor: 'pointer',\n listStyle: 'none',\n }, 'faqQuestion')}\n >\n {faq.question}\n </summary>\n <p \n className={styles.faqAnswer}\n style={inlineStyle({ marginTop: 12, color: '#6b7280' }, 'faqAnswer')}\n >\n {faq.answer}\n </p>\n </details>\n ))}\n </div>\n </section>\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: '#fff',\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: '#6b7280', 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: '#f9fafb',\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: '#6b7280' }}>\n {author.title}\n </p>\n )}\n {author.bio && (\n <p style={unstyled || className ? undefined : { margin: '0 0 12px', color: '#6b7280', 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: '#3b82f6', 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: '#3b82f6', 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: '#3b82f6', 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.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com',\n apiKey = process.env.NEXT_PUBLIC_UPTRADE_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: '#6b7280' }, '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 ? '#3b82f6' : '#f3f4f6',\n color: !category ? '#fff' : '#374151',\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 ? '#3b82f6' : '#f3f4f6',\n color: category === cat.slug ? '#fff' : '#374151',\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: '#6b7280' }, '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: '#fff',\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: '#eff6ff',\n color: '#3b82f6',\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: '#6b7280' }, '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: '#6b7280',\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: '#6b7280' }, '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: '#9ca3af' }, '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: '#3b82f6',\n color: '#fff',\n textDecoration: 'none',\n fontSize: 14,\n fontWeight: 500,\n}","/**\n * @sonordev/site-kit/blog - Blog Sidebar Component\n * \n * A reusable sidebar for blog pages with categories, recent posts,\n * tags, newsletter signup, and custom widgets.\n */\n\nimport React from 'react'\nimport type { BlogPost, BlogCategory, BlogTag } from './types'\n\n// ============================================================================\n// DATA FETCHING\n// ============================================================================\n\nasync function fetchRecentPosts(\n apiUrl: string,\n apiKey: string,\n limit: number = 5\n): Promise<BlogPost[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/recent?limit=${limit}`, {\n headers: { 'x-api-key': apiKey },\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 recent posts:', error)\n return []\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 },\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\nasync function fetchTags(apiUrl: string, apiKey: string): Promise<BlogTag[]> {\n try {\n const response = await fetch(`${apiUrl}/public/blog/tags`, {\n headers: { 'x-api-key': apiKey },\n next: { revalidate: 300 },\n })\n\n if (!response.ok) return []\n\n const data = await response.json()\n return data.tags || []\n } catch (error) {\n console.error('[Blog] Error fetching tags:', error)\n return []\n }\n}\n\n// ============================================================================\n// BLOG SIDEBAR COMPONENT\n// ============================================================================\n\nexport interface BlogSidebarProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Show categories widget */\n showCategories?: boolean\n /** Show recent posts widget */\n showRecentPosts?: boolean\n /** Number of recent posts to show */\n recentPostsCount?: number\n /** Show tags widget */\n showTags?: boolean\n /** Show search widget */\n showSearch?: boolean\n /** Base URL for blog links */\n basePath?: string\n /** Custom class name */\n className?: string\n /** Current category filter (for highlighting) */\n currentCategory?: string\n /** Additional widgets to render */\n children?: React.ReactNode\n}\n\nexport async function BlogSidebar({\n apiUrl = process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com',\n apiKey = process.env.NEXT_PUBLIC_UPTRADE_API_KEY || '',\n showCategories = true,\n showRecentPosts = true,\n recentPostsCount = 5,\n showTags = true,\n showSearch = true,\n basePath = '/blog',\n className,\n currentCategory,\n children,\n}: BlogSidebarProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured for sidebar')\n return null\n }\n\n // Fetch data in parallel\n const [categories, recentPosts, tags] = await Promise.all([\n showCategories ? fetchCategories(apiUrl, apiKey) : Promise.resolve([]),\n showRecentPosts ? fetchRecentPosts(apiUrl, apiKey, recentPostsCount) : Promise.resolve([]),\n showTags ? fetchTags(apiUrl, apiKey) : Promise.resolve([]),\n ])\n\n return (\n <aside className={className} style={{ display: 'flex', flexDirection: 'column', gap: 32 }}>\n {/* Search Widget */}\n {showSearch && <SearchWidget basePath={basePath} />}\n\n {/* Categories Widget */}\n {showCategories && categories.length > 0 && (\n <CategoriesWidget\n categories={categories}\n basePath={basePath}\n currentCategory={currentCategory}\n />\n )}\n\n {/* Recent Posts Widget */}\n {showRecentPosts && recentPosts.length > 0 && (\n <RecentPostsWidget posts={recentPosts} basePath={basePath} />\n )}\n\n {/* Tags Widget */}\n {showTags && tags.length > 0 && (\n <TagsWidget tags={tags} basePath={basePath} />\n )}\n\n {/* Custom Widgets */}\n {children}\n </aside>\n )\n}\n\n// ============================================================================\n// WIDGET COMPONENTS\n// ============================================================================\n\nfunction SearchWidget({ basePath }: { basePath: string }) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Search</h4>\n <form action={basePath} method=\"get\">\n <input\n type=\"search\"\n name=\"search\"\n placeholder=\"Search posts...\"\n style={{\n width: '100%',\n padding: '10px 12px',\n border: '1px solid #e5e7eb',\n borderRadius: 8,\n fontSize: 14,\n }}\n />\n </form>\n </div>\n )\n}\n\nfunction CategoriesWidget({\n categories,\n basePath,\n currentCategory,\n}: {\n categories: BlogCategory[]\n basePath: string\n currentCategory?: string\n}) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Categories</h4>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n <li style={{ marginBottom: 8 }}>\n <a\n href={basePath}\n style={{\n ...categoryLinkStyle,\n fontWeight: !currentCategory ? 600 : 400,\n color: !currentCategory ? '#3b82f6' : '#374151',\n }}\n >\n All Posts\n </a>\n </li>\n {categories.map((cat) => (\n <li key={cat.slug} style={{ marginBottom: 8 }}>\n <a\n href={`${basePath}?category=${cat.slug}`}\n style={{\n ...categoryLinkStyle,\n fontWeight: currentCategory === cat.slug ? 600 : 400,\n color: currentCategory === cat.slug ? '#3b82f6' : '#374151',\n }}\n >\n {cat.name}\n <span style={{ color: '#9ca3af', marginLeft: 8 }}>({cat.post_count})</span>\n </a>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nfunction RecentPostsWidget({\n posts,\n basePath,\n}: {\n posts: BlogPost[]\n basePath: string\n}) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Recent Posts</h4>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {posts.map((post) => {\n const date = post.published_at\n ? new Date(post.published_at).toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n })\n : null\n\n return (\n <li\n key={post.id}\n style={{\n marginBottom: 16,\n paddingBottom: 16,\n borderBottom: '1px solid #e5e7eb',\n }}\n >\n <div style={{ display: 'flex', gap: 12 }}>\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`}>\n <img\n src={post.featured_image}\n alt=\"\"\n style={{\n width: 64,\n height: 48,\n objectFit: 'cover',\n borderRadius: 6,\n flexShrink: 0,\n }}\n />\n </a>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <a\n href={`${basePath}/${post.slug}`}\n style={{\n fontSize: 14,\n fontWeight: 500,\n color: '#374151',\n textDecoration: 'none',\n display: '-webkit-box',\n WebkitLineClamp: 2,\n WebkitBoxOrient: 'vertical',\n overflow: 'hidden',\n }}\n >\n {post.title}\n </a>\n {date && (\n <span style={{ fontSize: 12, color: '#9ca3af', display: 'block', marginTop: 4 }}>\n {date}\n </span>\n )}\n </div>\n </div>\n </li>\n )\n })}\n </ul>\n </div>\n )\n}\n\nfunction TagsWidget({\n tags,\n basePath,\n}: {\n tags: BlogTag[]\n basePath: string\n}) {\n return (\n <div style={widgetStyle}>\n <h4 style={widgetTitleStyle}>Popular Tags</h4>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 8 }}>\n {tags.slice(0, 15).map((tag) => (\n <a\n key={tag.slug}\n href={`${basePath}?tag=${tag.slug}`}\n style={{\n padding: '4px 10px',\n backgroundColor: '#f3f4f6',\n borderRadius: 9999,\n fontSize: 12,\n color: '#374151',\n textDecoration: 'none',\n transition: 'background-color 0.2s',\n }}\n >\n {tag.name}\n </a>\n ))}\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// NEWSLETTER WIDGET (Client Component for forms)\n// ============================================================================\n\nexport interface NewsletterWidgetProps {\n title?: string\n description?: string\n buttonText?: string\n onSubmit?: (email: string) => Promise<void>\n}\n\nexport function NewsletterWidget({\n title = 'Subscribe to Our Newsletter',\n description = 'Get the latest posts delivered straight to your inbox.',\n buttonText = 'Subscribe',\n}: NewsletterWidgetProps) {\n return (\n <div style={{ ...widgetStyle, backgroundColor: '#eff6ff' }}>\n <h4 style={{ ...widgetTitleStyle, color: '#1e40af' }}>{title}</h4>\n <p style={{ fontSize: 14, color: '#6b7280', marginBottom: 16 }}>{description}</p>\n <form\n onSubmit={(e) => {\n e.preventDefault()\n // Handle form submission via parent onSubmit or inline\n }}\n style={{ display: 'flex', gap: 8 }}\n >\n <input\n type=\"email\"\n name=\"email\"\n placeholder=\"Enter your email\"\n required\n style={{\n flex: 1,\n padding: '10px 12px',\n border: '1px solid #bfdbfe',\n borderRadius: 8,\n fontSize: 14,\n }}\n />\n <button\n type=\"submit\"\n style={{\n padding: '10px 16px',\n backgroundColor: '#3b82f6',\n color: '#fff',\n border: 'none',\n borderRadius: 8,\n fontSize: 14,\n fontWeight: 500,\n cursor: 'pointer',\n }}\n >\n {buttonText}\n </button>\n </form>\n </div>\n )\n}\n\n// ============================================================================\n// STYLES\n// ============================================================================\n\nconst widgetStyle: React.CSSProperties = {\n padding: 20,\n backgroundColor: '#f9fafb',\n borderRadius: 12,\n}\n\nconst widgetTitleStyle: React.CSSProperties = {\n margin: '0 0 16px',\n fontSize: 16,\n fontWeight: 600,\n color: '#111827',\n}\n\nconst categoryLinkStyle: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n fontSize: 14,\n textDecoration: 'none',\n}\n","/**\n * @sonordev/site-kit/blog - Blog Layout Component\n * \n * A complete blog layout with sidebar, responsive design, and optional hero.\n * Use this to wrap your blog pages for consistent styling.\n */\n\nimport React from 'react'\nimport { BlogSidebar, BlogSidebarProps } from './BlogSidebar'\n\n// ============================================================================\n// BLOG LAYOUT COMPONENT\n// ============================================================================\n\nexport interface BlogLayoutProps {\n /** Portal API URL */\n apiUrl?: string\n /** Project API key */\n apiKey?: string\n /** Layout style: 'sidebar-right', 'sidebar-left', 'full-width' */\n layout?: 'sidebar-right' | 'sidebar-left' | 'full-width'\n /** Show sidebar */\n showSidebar?: boolean\n /** Sidebar props */\n sidebarProps?: Partial<BlogSidebarProps>\n /** Hero section config */\n hero?: {\n title?: string\n subtitle?: string\n backgroundImage?: string\n backgroundColor?: string\n }\n /** Max width for content */\n maxWidth?: number\n /** Base URL for blog links */\n basePath?: string\n /** Custom class name */\n className?: string\n /** Current category (for sidebar highlighting) */\n currentCategory?: string\n /** Main content */\n children: React.ReactNode\n}\n\nexport async function BlogLayout({\n apiUrl = process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com',\n apiKey = process.env.NEXT_PUBLIC_UPTRADE_API_KEY || '',\n layout = 'sidebar-right',\n showSidebar = true,\n sidebarProps = {},\n hero,\n maxWidth = 1280,\n basePath = '/blog',\n className,\n currentCategory,\n children,\n}: BlogLayoutProps) {\n const hasSidebar = showSidebar && layout !== 'full-width'\n\n return (\n <div className={className}>\n {/* Hero Section */}\n {hero && (\n <section\n style={{\n padding: '60px 20px',\n backgroundColor: hero.backgroundColor || '#1e3a5f',\n backgroundImage: hero.backgroundImage ? `url(${hero.backgroundImage})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n color: '#fff',\n textAlign: 'center',\n }}\n >\n <div style={{ maxWidth, margin: '0 auto' }}>\n {hero.title && (\n <h1\n style={{\n fontSize: 'clamp(32px, 5vw, 48px)',\n fontWeight: 700,\n marginBottom: 16,\n }}\n >\n {hero.title}\n </h1>\n )}\n {hero.subtitle && (\n <p\n style={{\n fontSize: 'clamp(16px, 2vw, 20px)',\n opacity: 0.9,\n maxWidth: 600,\n margin: '0 auto',\n }}\n >\n {hero.subtitle}\n </p>\n )}\n </div>\n </section>\n )}\n\n {/* Main Content Area */}\n <div\n style={{\n maxWidth,\n margin: '0 auto',\n padding: '40px 20px',\n }}\n >\n <div\n style={{\n display: hasSidebar ? 'grid' : 'block',\n gridTemplateColumns: hasSidebar\n ? layout === 'sidebar-left'\n ? '300px 1fr'\n : '1fr 300px'\n : undefined,\n gap: 48,\n }}\n >\n {/* Sidebar (Left Position) */}\n {hasSidebar && layout === 'sidebar-left' && (\n <BlogSidebar\n apiUrl={apiUrl}\n apiKey={apiKey}\n basePath={basePath}\n currentCategory={currentCategory}\n {...sidebarProps}\n />\n )}\n\n {/* Main Content */}\n <main style={{ minWidth: 0 }}>{children}</main>\n\n {/* Sidebar (Right Position) */}\n {hasSidebar && layout === 'sidebar-right' && (\n <BlogSidebar\n apiUrl={apiUrl}\n apiKey={apiKey}\n basePath={basePath}\n currentCategory={currentCategory}\n {...sidebarProps}\n />\n )}\n </div>\n </div>\n </div>\n )\n}\n\n// ============================================================================\n// BLOG PAGE WRAPPER\n// ============================================================================\n\n/**\n * Convenience wrapper for a complete blog index page\n */\nexport interface BlogPageProps extends Omit<BlogLayoutProps, 'children'> {\n /** List component to render */\n listComponent: React.ReactNode\n}\n\nexport async function BlogPage({ listComponent, ...layoutProps }: BlogPageProps) {\n return <BlogLayout {...layoutProps}>{listComponent}</BlogLayout>\n}\n\n/**\n * Convenience wrapper for a single blog post page\n */\nexport interface BlogPostPageProps extends Omit<BlogLayoutProps, 'children'> {\n /** Post component to render */\n postComponent: React.ReactNode\n}\n\nexport async function BlogPostPage({ postComponent, ...layoutProps }: BlogPostPageProps) {\n return (\n <BlogLayout {...layoutProps} showSidebar={false} layout=\"full-width\">\n <div style={{ maxWidth: 800, margin: '0 auto' }}>{postComponent}</div>\n </BlogLayout>\n )\n}\n\n// ============================================================================\n// CATEGORY PAGE WRAPPER\n// ============================================================================\n\nexport interface CategoryPageProps extends BlogLayoutProps {\n /** Category slug being viewed */\n category: string\n /** Category display name */\n categoryName?: string\n /** List component */\n listComponent: React.ReactNode\n}\n\nexport async function CategoryPage({\n category,\n categoryName,\n listComponent,\n hero,\n ...layoutProps\n}: CategoryPageProps) {\n const categoryHero = hero || {\n title: categoryName || category,\n subtitle: `Browse all posts in ${categoryName || category}`,\n backgroundColor: '#1e3a5f',\n }\n\n return (\n <BlogLayout {...layoutProps} hero={categoryHero} currentCategory={category}>\n {listComponent}\n </BlogLayout>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Author Card Component\n */\n\nimport React from 'react'\nimport type { AuthorCardProps } from './types'\n\nexport function AuthorCard({ author, showBio = true, showSocial = true, className }: AuthorCardProps) {\n return (\n <div className={className} style={{ display: 'flex', gap: 16, alignItems: 'flex-start' }}>\n {author.avatar_url && (\n <img\n src={author.avatar_url}\n alt={author.name}\n style={{\n width: 64,\n height: 64,\n borderRadius: '50%',\n objectFit: 'cover',\n }}\n />\n )}\n <div>\n <h4 style={{ margin: 0 }}>{author.name}</h4>\n {showBio && author.bio && (\n <p style={{ margin: '4px 0', color: '#6b7280', fontSize: 14 }}>{author.bio}</p>\n )}\n {showSocial && author.social_links && (\n <div style={{ display: 'flex', gap: 12, marginTop: 8 }}>\n {author.social_links.twitter && (\n <a href={`https://twitter.com/${author.social_links.twitter}`} target=\"_blank\" rel=\"noopener noreferrer\">\n Twitter\n </a>\n )}\n {author.social_links.linkedin && (\n <a href={author.social_links.linkedin} target=\"_blank\" rel=\"noopener noreferrer\">\n LinkedIn\n </a>\n )}\n {author.social_links.github && (\n <a href={`https://github.com/${author.social_links.github}`} target=\"_blank\" rel=\"noopener noreferrer\">\n GitHub\n </a>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Related Posts Component\n * \n * Fetches and displays related blog posts via Portal API\n */\n\nimport React from 'react'\nimport type { RelatedPostsProps, BlogPost } from './types'\n\nasync function fetchRelatedPosts(\n apiUrl: string,\n apiKey: string,\n currentPostId: string,\n limit: number\n): Promise<BlogPost[]> {\n try {\n const response = await fetch(`${apiUrl}/api/public/blog/related`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': apiKey,\n },\n body: JSON.stringify({\n currentPostId,\n limit,\n }),\n })\n \n if (!response.ok) {\n console.error('Failed to fetch related posts:', response.statusText)\n return []\n }\n \n const data = await response.json()\n return data.posts || []\n } catch (error) {\n console.error('Failed to fetch related posts:', error)\n return []\n }\n}\n\ninterface RelatedPostsServerProps {\n apiUrl?: string\n apiKey?: string\n currentPostId: string\n limit?: number\n className?: string\n renderItem?: (post: BlogPost) => React.ReactNode\n}\n\nexport async function RelatedPosts({\n apiUrl = process.env.NEXT_PUBLIC_UPTRADE_API_URL || 'https://api.uptrademedia.com',\n apiKey = process.env.NEXT_PUBLIC_UPTRADE_API_KEY || '',\n currentPostId,\n limit = 3,\n className,\n renderItem,\n}: RelatedPostsServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured for RelatedPosts')\n return null\n }\n \n const posts = await fetchRelatedPosts(apiUrl, apiKey, currentPostId, limit)\n\n if (posts.length === 0) return null\n\n return (\n <section className={className}>\n <h3 style={{ marginBottom: 16 }}>Related Posts</h3>\n <div style={{ display: 'grid', gap: 16 }}>\n {posts.map((post) =>\n renderItem ? (\n renderItem(post)\n ) : (\n <article key={post.id} style={{ borderBottom: '1px solid #e5e7eb', paddingBottom: 16 }}>\n {post.featured_image && (\n <img\n src={post.featured_image}\n alt={post.title}\n style={{\n width: '100%',\n height: 120,\n objectFit: 'cover',\n borderRadius: 8,\n marginBottom: 8,\n }}\n />\n )}\n <a href={`/blog/${post.slug}`} style={{ textDecoration: 'none' }}>\n <h4 style={{ margin: 0, color: 'inherit' }}>{post.title}</h4>\n </a>\n {post.excerpt && (\n <p style={{ margin: '4px 0 0', fontSize: 14, color: '#6b7280' }}>\n {post.excerpt}\n </p>\n )}\n </article>\n )\n )}\n </div>\n </section>\n )\n}\n","/**\n * @sonordev/site-kit/blog - Table of Contents Component\n */\n\n'use client'\n\nimport React, { useState, useEffect } from 'react'\nimport type { TableOfContentsProps } from './types'\n\ninterface TocItem {\n id: string\n text: string\n level: number\n}\n\nfunction parseHeadings(content: string): TocItem[] {\n // Extract headings from HTML content\n const headingRegex = /<h([2-4])[^>]*id=\"([^\"]*)\"[^>]*>(.*?)<\\/h[2-4]>/gi\n const items: TocItem[] = []\n let match\n\n while ((match = headingRegex.exec(content)) !== null) {\n items.push({\n level: parseInt(match[1]),\n id: match[2],\n text: match[3].replace(/<[^>]*>/g, ''), // Strip any nested HTML\n })\n }\n\n return items\n}\n\nexport function TableOfContents({\n content,\n className,\n maxDepth = 3,\n}: TableOfContentsProps) {\n const [activeId, setActiveId] = useState<string>('')\n const items = parseHeadings(content).filter((item) => item.level <= maxDepth)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id)\n }\n })\n },\n {\n rootMargin: '-20% 0% -35% 0%',\n threshold: 0,\n }\n )\n\n // Observe all headings\n items.forEach((item) => {\n const element = document.getElementById(item.id)\n if (element) {\n observer.observe(element)\n }\n })\n\n return () => observer.disconnect()\n }, [items])\n\n if (items.length === 0) return null\n\n const handleClick = (id: string) => {\n const element = document.getElementById(id)\n if (element) {\n element.scrollIntoView({ behavior: 'smooth' })\n }\n }\n\n return (\n <nav className={className} aria-label=\"Table of contents\">\n <h4 style={{ margin: '0 0 12px', fontSize: 14, fontWeight: 600, textTransform: 'uppercase', letterSpacing: '0.05em' }}>\n On This Page\n </h4>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {items.map((item) => (\n <li\n key={item.id}\n style={{\n paddingLeft: (item.level - 2) * 12,\n marginBottom: 8,\n }}\n >\n <button\n onClick={() => handleClick(item.id)}\n style={{\n all: 'unset',\n cursor: 'pointer',\n fontSize: 14,\n color: activeId === item.id ? '#2563eb' : '#6b7280',\n fontWeight: activeId === item.id ? 500 : 400,\n transition: 'color 0.2s',\n }}\n >\n {item.text}\n </button>\n </li>\n ))}\n </ul>\n </nav>\n )\n}\n"]}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { Metadata } from 'next';
|
|
2
|
+
import { B as BlogPost } from '../types-D08004rU.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @sonordev/site-kit/blog/server
|
|
6
|
+
*
|
|
7
|
+
* Server-side functions for Next.js blog pages.
|
|
8
|
+
* Includes metadata generation, sitemap, RSS feeds, and static params for SSG.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
declare const SEO_LIMITS: {
|
|
12
|
+
readonly title: {
|
|
13
|
+
readonly min: 30;
|
|
14
|
+
readonly max: 60;
|
|
15
|
+
readonly recommended: 55;
|
|
16
|
+
};
|
|
17
|
+
readonly metaDescription: {
|
|
18
|
+
readonly min: 120;
|
|
19
|
+
readonly max: 160;
|
|
20
|
+
readonly recommended: 155;
|
|
21
|
+
};
|
|
22
|
+
readonly excerpt: {
|
|
23
|
+
readonly min: 100;
|
|
24
|
+
readonly max: 300;
|
|
25
|
+
readonly recommended: 200;
|
|
26
|
+
};
|
|
27
|
+
readonly slug: {
|
|
28
|
+
readonly max: 75;
|
|
29
|
+
};
|
|
30
|
+
readonly focusKeyphrase: {
|
|
31
|
+
readonly min: 2;
|
|
32
|
+
readonly max: 4;
|
|
33
|
+
readonly words: true;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
interface SeoValidationResult {
|
|
37
|
+
field: string;
|
|
38
|
+
value: string;
|
|
39
|
+
length: number;
|
|
40
|
+
limit: {
|
|
41
|
+
min?: number;
|
|
42
|
+
max: number;
|
|
43
|
+
recommended?: number;
|
|
44
|
+
};
|
|
45
|
+
status: 'good' | 'warning' | 'error';
|
|
46
|
+
message: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Validate SEO title (60 chars max, keyword-first recommended)
|
|
50
|
+
*/
|
|
51
|
+
declare function validateSeoTitle(title: string, focusKeyphrase?: string): SeoValidationResult;
|
|
52
|
+
/**
|
|
53
|
+
* Validate meta description (150-160 chars, benefit-driven)
|
|
54
|
+
*/
|
|
55
|
+
declare function validateMetaDescription(description: string, focusKeyphrase?: string): SeoValidationResult;
|
|
56
|
+
/**
|
|
57
|
+
* Full SEO validation for a blog post
|
|
58
|
+
*/
|
|
59
|
+
declare function validateBlogPostSeo(post: Partial<BlogPost>): SeoValidationResult[];
|
|
60
|
+
/**
|
|
61
|
+
* Fetch a blog post by slug (server-side)
|
|
62
|
+
*/
|
|
63
|
+
declare function getBlogPost(slug: string): Promise<BlogPost | null>;
|
|
64
|
+
/**
|
|
65
|
+
* Fetch all blog post slugs for static generation
|
|
66
|
+
*/
|
|
67
|
+
declare function getAllBlogSlugs(): Promise<{
|
|
68
|
+
slug: string;
|
|
69
|
+
last_modified?: string;
|
|
70
|
+
}[]>;
|
|
71
|
+
/**
|
|
72
|
+
* Fetch blog categories
|
|
73
|
+
*/
|
|
74
|
+
declare function getBlogCategories(): Promise<{
|
|
75
|
+
name: string;
|
|
76
|
+
slug: string;
|
|
77
|
+
post_count: number;
|
|
78
|
+
}[]>;
|
|
79
|
+
interface BlogMetadataOptions {
|
|
80
|
+
/** Site name for og:site_name */
|
|
81
|
+
siteName?: string;
|
|
82
|
+
/** Base URL of the site */
|
|
83
|
+
siteUrl?: string;
|
|
84
|
+
/** Default OG image */
|
|
85
|
+
defaultImage?: string;
|
|
86
|
+
/** Twitter handle */
|
|
87
|
+
twitterHandle?: string;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Generate metadata for a blog post page
|
|
91
|
+
*/
|
|
92
|
+
declare function generateBlogPostMetadata(slug: string, options?: BlogMetadataOptions): Promise<Metadata>;
|
|
93
|
+
/**
|
|
94
|
+
* Generate metadata for the blog index page
|
|
95
|
+
*/
|
|
96
|
+
declare function generateBlogIndexMetadata(options: BlogMetadataOptions & {
|
|
97
|
+
title?: string;
|
|
98
|
+
description?: string;
|
|
99
|
+
}): Metadata;
|
|
100
|
+
/**
|
|
101
|
+
* Generate metadata for a category page
|
|
102
|
+
*/
|
|
103
|
+
declare function generateBlogCategoryMetadata(categoryName: string, options?: BlogMetadataOptions): Metadata;
|
|
104
|
+
/**
|
|
105
|
+
* Generate static params for blog post pages
|
|
106
|
+
* Usage: export const generateStaticParams = generateBlogStaticParams
|
|
107
|
+
*/
|
|
108
|
+
declare function generateBlogStaticParams(): Promise<{
|
|
109
|
+
slug: string;
|
|
110
|
+
}[]>;
|
|
111
|
+
/**
|
|
112
|
+
* Generate static params for category pages
|
|
113
|
+
* Usage: export const generateStaticParams = generateCategoryStaticParams
|
|
114
|
+
*/
|
|
115
|
+
declare function generateCategoryStaticParams(): Promise<{
|
|
116
|
+
category: string;
|
|
117
|
+
}[]>;
|
|
118
|
+
interface SitemapEntry {
|
|
119
|
+
url: string;
|
|
120
|
+
lastModified?: Date;
|
|
121
|
+
changeFrequency?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';
|
|
122
|
+
priority?: number;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Generate sitemap entries for blog posts
|
|
126
|
+
*/
|
|
127
|
+
declare function generateBlogSitemap(siteUrl: string): Promise<SitemapEntry[]>;
|
|
128
|
+
/**
|
|
129
|
+
* Generate JSON-LD schema for a blog post
|
|
130
|
+
*/
|
|
131
|
+
declare function generateBlogPostSchema(post: BlogPost, options?: {
|
|
132
|
+
siteUrl?: string;
|
|
133
|
+
siteName?: string;
|
|
134
|
+
logoUrl?: string;
|
|
135
|
+
}): object;
|
|
136
|
+
/**
|
|
137
|
+
* Generate JSON-LD schema for blog index/listing page
|
|
138
|
+
*/
|
|
139
|
+
declare function generateBlogListSchema(options?: {
|
|
140
|
+
siteUrl?: string;
|
|
141
|
+
siteName?: string;
|
|
142
|
+
description?: string;
|
|
143
|
+
}): object;
|
|
144
|
+
/**
|
|
145
|
+
* Generate standalone FAQ schema (great for PAA inclusion)
|
|
146
|
+
*/
|
|
147
|
+
declare function generateFaqSchema(faqItems: {
|
|
148
|
+
question: string;
|
|
149
|
+
answer: string;
|
|
150
|
+
}[]): object | null;
|
|
151
|
+
interface HowToStep {
|
|
152
|
+
name: string;
|
|
153
|
+
text: string;
|
|
154
|
+
image?: string;
|
|
155
|
+
url?: string;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Generate HowTo schema for step-by-step posts
|
|
159
|
+
*/
|
|
160
|
+
declare function generateHowToSchema(post: BlogPost, steps: HowToStep[], options?: {
|
|
161
|
+
siteUrl?: string;
|
|
162
|
+
}): object;
|
|
163
|
+
interface RssFeedOptions {
|
|
164
|
+
siteUrl: string;
|
|
165
|
+
siteName: string;
|
|
166
|
+
description?: string;
|
|
167
|
+
language?: string;
|
|
168
|
+
copyright?: string;
|
|
169
|
+
managingEditor?: string;
|
|
170
|
+
webMaster?: string;
|
|
171
|
+
ttl?: number;
|
|
172
|
+
imageUrl?: string;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Fetch all published blog posts for RSS feed
|
|
176
|
+
*/
|
|
177
|
+
declare function getAllBlogPosts(): Promise<BlogPost[]>;
|
|
178
|
+
/**
|
|
179
|
+
* Generate RSS 2.0 feed XML
|
|
180
|
+
*/
|
|
181
|
+
declare function generateRssFeed(options: RssFeedOptions): Promise<string>;
|
|
182
|
+
/**
|
|
183
|
+
* Generate Atom feed XML
|
|
184
|
+
*/
|
|
185
|
+
declare function generateAtomFeed(options: RssFeedOptions): Promise<string>;
|
|
186
|
+
interface TopicCluster {
|
|
187
|
+
pillar: BlogPost;
|
|
188
|
+
supportingPosts: BlogPost[];
|
|
189
|
+
internalLinks: Array<{
|
|
190
|
+
from: string;
|
|
191
|
+
to: string;
|
|
192
|
+
anchor: string;
|
|
193
|
+
}>;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Fetch posts by category for topic cluster organization
|
|
197
|
+
*/
|
|
198
|
+
declare function getPostsByCategory(categorySlug: string): Promise<BlogPost[]>;
|
|
199
|
+
/**
|
|
200
|
+
* Identify topic clusters based on category grouping
|
|
201
|
+
* Assumes the longest/most comprehensive post is the pillar
|
|
202
|
+
*/
|
|
203
|
+
declare function identifyTopicClusters(categorySlug: string): Promise<TopicCluster | null>;
|
|
204
|
+
/**
|
|
205
|
+
* Generate "Related Insights" section data
|
|
206
|
+
*/
|
|
207
|
+
declare function getRelatedInsights(currentSlug: string, options?: {
|
|
208
|
+
limit?: number;
|
|
209
|
+
category?: string;
|
|
210
|
+
}): Promise<BlogPost[]>;
|
|
211
|
+
/**
|
|
212
|
+
* Generate BreadcrumbList schema for blog navigation
|
|
213
|
+
*/
|
|
214
|
+
declare function generateBreadcrumbSchema(post: BlogPost, options?: {
|
|
215
|
+
siteUrl?: string;
|
|
216
|
+
siteName?: string;
|
|
217
|
+
}): object;
|
|
218
|
+
/**
|
|
219
|
+
* Generate all relevant schemas for a blog post in a single array
|
|
220
|
+
* This is the recommended way to include multiple schemas.
|
|
221
|
+
* When post has E-E-A-T schema (post.schema), use it instead of generating Article/FAQ.
|
|
222
|
+
*/
|
|
223
|
+
declare function generateAllBlogSchemas(post: BlogPost, options?: {
|
|
224
|
+
siteUrl?: string;
|
|
225
|
+
siteName?: string;
|
|
226
|
+
logoUrl?: string;
|
|
227
|
+
}): object[];
|
|
228
|
+
|
|
229
|
+
export { type HowToStep, SEO_LIMITS, type SeoValidationResult, type TopicCluster, generateAllBlogSchemas, generateAtomFeed, generateBlogCategoryMetadata, generateBlogIndexMetadata, generateBlogListSchema, generateBlogPostMetadata, generateBlogPostSchema, generateBlogSitemap, generateBlogStaticParams, generateBreadcrumbSchema, generateCategoryStaticParams, generateFaqSchema, generateHowToSchema, generateRssFeed, getAllBlogPosts, getAllBlogSlugs, getBlogCategories, getBlogPost, getPostsByCategory, getRelatedInsights, identifyTopicClusters, validateBlogPostSeo, validateMetaDescription, validateSeoTitle };
|