@uptrademedia/site-kit 1.0.5 → 1.0.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/dist/analytics/index.js +7 -7
- package/dist/analytics/index.mjs +3 -3
- package/dist/api-QUIPJJCX.js +77 -0
- package/dist/api-QUIPJJCX.js.map +1 -0
- package/dist/api-V3BA5PMX.mjs +4 -0
- package/dist/api-V3BA5PMX.mjs.map +1 -0
- package/dist/blog/index.d.mts +2 -2
- package/dist/blog/index.d.ts +2 -2
- package/dist/blog/index.js +40 -6
- package/dist/blog/index.js.map +1 -1
- package/dist/blog/index.mjs +40 -6
- package/dist/blog/index.mjs.map +1 -1
- package/dist/blog/server.d.mts +3 -2
- package/dist/blog/server.d.ts +3 -2
- package/dist/blog/server.js +13 -6
- package/dist/blog/server.js.map +1 -1
- package/dist/blog/server.mjs +13 -6
- package/dist/blog/server.mjs.map +1 -1
- package/dist/{chunk-FKVJOT2F.mjs → chunk-42EXHJTC.mjs} +196 -7
- package/dist/chunk-42EXHJTC.mjs.map +1 -0
- package/dist/{scanner-AZV5I6US.mjs → chunk-44OMJFCG.mjs} +354 -14
- package/dist/chunk-44OMJFCG.mjs.map +1 -0
- package/dist/chunk-4TGJYNHV.js +981 -0
- package/dist/chunk-4TGJYNHV.js.map +1 -0
- package/dist/chunk-4XPGGLVP.mjs +53 -0
- package/dist/{chunk-NYKRE2FL.mjs.map → chunk-4XPGGLVP.mjs.map} +1 -1
- package/dist/{generators-TO2FKJR6.mjs → chunk-6ONUXZDO.mjs} +26 -9
- package/dist/chunk-6ONUXZDO.mjs.map +1 -0
- package/dist/chunk-CG53ASWX.mjs +729 -0
- package/dist/chunk-CG53ASWX.mjs.map +1 -0
- package/dist/{scanner-ETJAMIT7.js → chunk-DERI27QC.js} +448 -102
- package/dist/chunk-DERI27QC.js.map +1 -0
- package/dist/chunk-DYM5ML2V.mjs +1518 -0
- package/dist/chunk-DYM5ML2V.mjs.map +1 -0
- package/dist/chunk-FLZZOX44.js +1526 -0
- package/dist/chunk-FLZZOX44.js.map +1 -0
- package/dist/{chunk-7H6I3ECV.mjs → chunk-FQVGK746.mjs} +63 -3
- package/dist/chunk-FQVGK746.mjs.map +1 -0
- package/dist/{chunk-GQ6ZOU2N.mjs → chunk-JGQPAXTL.mjs} +4 -4
- package/dist/{chunk-GQ6ZOU2N.mjs.map → chunk-JGQPAXTL.mjs.map} +1 -1
- package/dist/{chunk-V3F5J6CV.js → chunk-JUEVN4Q4.js} +196 -7
- package/dist/chunk-JUEVN4Q4.js.map +1 -0
- package/dist/chunk-KKMGTT7F.mjs +968 -0
- package/dist/chunk-KKMGTT7F.mjs.map +1 -0
- package/dist/{chunk-XQJX252G.mjs → chunk-MB3WR5KJ.mjs} +28 -18
- package/dist/chunk-MB3WR5KJ.mjs.map +1 -0
- package/dist/{chunk-2IHTEKHU.mjs → chunk-QD5CN2OI.mjs} +16 -7
- package/dist/chunk-QD5CN2OI.mjs.map +1 -0
- package/dist/{chunk-SBVEYCSV.js → chunk-QQB4FO4Q.js} +7 -7
- package/dist/{chunk-SBVEYCSV.js.map → chunk-QQB4FO4Q.js.map} +1 -1
- package/dist/{generators-YZWIGHCO.js → chunk-S2GXR5HY.js} +26 -9
- package/dist/chunk-S2GXR5HY.js.map +1 -0
- package/dist/{chunk-O2OHHBUD.js → chunk-TDK7DLCH.js} +30 -20
- package/dist/chunk-TDK7DLCH.js.map +1 -0
- package/dist/{chunk-QP5NCO2E.js → chunk-VDI7KYME.js} +67 -2
- package/dist/chunk-VDI7KYME.js.map +1 -0
- package/dist/chunk-VOR53RUR.js +753 -0
- package/dist/chunk-VOR53RUR.js.map +1 -0
- package/dist/{chunk-GAJLEDRD.js → chunk-ZKJ7JKFV.js} +16 -7
- package/dist/chunk-ZKJ7JKFV.js.map +1 -0
- package/dist/chunk-ZSMWDLMK.js +63 -0
- package/dist/{chunk-EQCVQC35.js.map → chunk-ZSMWDLMK.js.map} +1 -1
- package/dist/cli/index.js +37269 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/index.mjs +37233 -0
- package/dist/cli/index.mjs.map +1 -0
- package/dist/commerce/index.js +1 -1
- package/dist/commerce/index.mjs +1 -1
- package/dist/commerce/server.d.mts +12 -3
- package/dist/commerce/server.d.ts +12 -3
- package/dist/commerce/server.js +71 -70
- package/dist/commerce/server.js.map +1 -1
- package/dist/commerce/server.mjs +71 -70
- package/dist/commerce/server.mjs.map +1 -1
- package/dist/engage/index.d.mts +6 -4
- package/dist/engage/index.d.ts +6 -4
- package/dist/engage/index.js +8 -4
- package/dist/engage/index.mjs +2 -2
- package/dist/forms/index.js +1 -1
- package/dist/forms/index.mjs +1 -1
- package/dist/generators-5EU4PTVF.js +33 -0
- package/dist/generators-5EU4PTVF.js.map +1 -0
- package/dist/generators-TYPILCWD.mjs +4 -0
- package/dist/generators-TYPILCWD.mjs.map +1 -0
- package/dist/images/index.js +11 -11
- package/dist/images/index.mjs +4 -4
- package/dist/index.d.mts +154 -5
- package/dist/index.d.ts +154 -5
- package/dist/index.js +940 -24
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +819 -7
- package/dist/index.mjs.map +1 -1
- package/dist/llms/index.d.mts +657 -0
- package/dist/llms/index.d.ts +657 -0
- package/dist/llms/index.js +101 -0
- package/dist/llms/index.js.map +1 -0
- package/dist/llms/index.mjs +4 -0
- package/dist/llms/index.mjs.map +1 -0
- package/dist/migrator-ARLHUNB3.mjs +4 -0
- package/dist/migrator-ARLHUNB3.mjs.map +1 -0
- package/dist/migrator-VZLBH3VY.js +37 -0
- package/dist/migrator-VZLBH3VY.js.map +1 -0
- package/dist/redirects/index.js +1 -1
- package/dist/redirects/index.mjs +1 -1
- package/dist/reputation/index.js +1 -1
- package/dist/reputation/index.mjs +1 -1
- package/dist/{routing-BWjUF7lp.d.ts → routing-CF91y6NO.d.ts} +1 -1
- package/dist/{routing-CgmRi9tD.d.mts → routing-CIOFpFCB.d.mts} +1 -1
- package/dist/scanner-7ZMUM2P5.mjs +4 -0
- package/dist/scanner-7ZMUM2P5.mjs.map +1 -0
- package/dist/scanner-OY7UF3WA.js +53 -0
- package/dist/scanner-OY7UF3WA.js.map +1 -0
- package/dist/seo/index.d.mts +267 -7
- package/dist/seo/index.d.ts +267 -7
- package/dist/seo/index.js +432 -24
- package/dist/seo/index.js.map +1 -1
- package/dist/seo/index.mjs +400 -11
- package/dist/seo/index.mjs.map +1 -1
- package/dist/seo/server.d.mts +11 -4
- package/dist/seo/server.d.ts +11 -4
- package/dist/seo/server.js +17 -17
- package/dist/seo/server.mjs +3 -3
- package/dist/setup/client.js +1 -1
- package/dist/setup/client.mjs +1 -1
- package/dist/setup/index.js +3 -3
- package/dist/setup/index.mjs +2 -2
- package/dist/setup/server.js +3 -3
- package/dist/setup/server.mjs +2 -2
- package/dist/sitemap/index.js +2 -2
- package/dist/sitemap/index.js.map +1 -1
- package/dist/sitemap/index.mjs +2 -2
- package/dist/sitemap/index.mjs.map +1 -1
- package/dist/{types-C0pJGfbH.d.mts → types-D6FHAVWX.d.mts} +99 -3
- package/dist/{types-C0pJGfbH.d.ts → types-D6FHAVWX.d.ts} +99 -3
- package/dist/{types-BN4OwtCO.d.mts → types-DI0jnhjJ.d.mts} +2 -0
- package/dist/{types-BN4OwtCO.d.ts → types-DI0jnhjJ.d.ts} +2 -0
- package/dist/{types-BmzutFwy.d.ts → types-j8X4vUhB.d.mts} +19 -2
- package/dist/{types-BmzutFwy.d.mts → types-j8X4vUhB.d.ts} +19 -2
- package/dist/{web-vitals-BH55V7EJ.js → web-vitals-444RLW3B.js} +11 -11
- package/dist/{web-vitals-BH55V7EJ.js.map → web-vitals-444RLW3B.js.map} +1 -1
- package/dist/{web-vitals-RJYPWAR3.mjs → web-vitals-KPICZIEF.mjs} +3 -3
- package/dist/{web-vitals-RJYPWAR3.mjs.map → web-vitals-KPICZIEF.mjs.map} +1 -1
- package/package.json +9 -2
- package/dist/api-N35S3EES.js +0 -57
- package/dist/api-N35S3EES.js.map +0 -1
- package/dist/api-SYBTK7Z7.mjs +0 -4
- package/dist/api-SYBTK7Z7.mjs.map +0 -1
- package/dist/chunk-2IHTEKHU.mjs.map +0 -1
- package/dist/chunk-7H6I3ECV.mjs.map +0 -1
- package/dist/chunk-BGJLOJ7T.mjs +0 -605
- package/dist/chunk-BGJLOJ7T.mjs.map +0 -1
- package/dist/chunk-EQCVQC35.js +0 -35
- package/dist/chunk-FKVJOT2F.mjs.map +0 -1
- package/dist/chunk-GAJLEDRD.js.map +0 -1
- package/dist/chunk-NYKRE2FL.mjs +0 -31
- package/dist/chunk-O2OHHBUD.js.map +0 -1
- package/dist/chunk-QAYJV4KK.js +0 -608
- package/dist/chunk-QAYJV4KK.js.map +0 -1
- package/dist/chunk-QP5NCO2E.js.map +0 -1
- package/dist/chunk-V3F5J6CV.js.map +0 -1
- package/dist/chunk-XQJX252G.mjs.map +0 -1
- package/dist/generators-TO2FKJR6.mjs.map +0 -1
- package/dist/generators-YZWIGHCO.js.map +0 -1
- package/dist/migrator-V6KS75EA.mjs +0 -265
- package/dist/migrator-V6KS75EA.mjs.map +0 -1
- package/dist/migrator-XKM7YQCY.js +0 -272
- package/dist/migrator-XKM7YQCY.js.map +0 -1
- package/dist/scanner-AZV5I6US.mjs.map +0 -1
- package/dist/scanner-ETJAMIT7.js.map +0 -1
package/dist/blog/index.mjs.map
CHANGED
|
@@ -1 +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 * @uptrade/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\nimport React from 'react'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor } from './types'\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 */\n className?: 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.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 children,\n}: BlogPostServerProps) {\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 className={className} style={{ textAlign: 'center', padding: 60 }}>\n <h1 style={{ fontSize: 24, marginBottom: 16 }}>Post Not Found</h1>\n <p style={{ color: '#6b7280' }}>\n The blog post you're looking for doesn't exist or has been removed.\n </p>\n <a\n href={basePath}\n style={{\n display: 'inline-block',\n marginTop: 24,\n padding: '12px 24px',\n backgroundColor: '#3b82f6',\n color: '#fff',\n borderRadius: 8,\n textDecoration: 'none',\n }}\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={className}>\n {/* Header */}\n <header style={{ marginBottom: 32 }}>\n {/* Breadcrumb */}\n <nav style={{ marginBottom: 16, fontSize: 14, color: '#6b7280' }}>\n <a href={basePath} style={{ color: '#3b82f6', textDecoration: 'none' }}>\n Blog\n </a>\n {post.category && (\n <>\n <span style={{ margin: '0 8px' }}>/</span>\n <a\n href={`${basePath}?category=${post.category}`}\n style={{ color: '#3b82f6', textDecoration: 'none' }}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n {/* Title */}\n <h1 style={{ fontSize: 36, fontWeight: 700, lineHeight: 1.2, marginBottom: 16 }}>\n {post.title}\n </h1>\n\n {/* Subtitle */}\n {post.subtitle && (\n <p style={{ fontSize: 20, color: '#6b7280', marginBottom: 16 }}>\n {post.subtitle}\n </p>\n )}\n\n {/* Meta */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 16, flexWrap: 'wrap' }}>\n {post.author && (\n <span style={{ fontSize: 14, color: '#374151' }}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {date && (\n <span style={{ fontSize: 14, color: '#6b7280' }}>{date}</span>\n )}\n {post.reading_time_minutes && (\n <span style={{ fontSize: 14, color: '#9ca3af' }}>\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </header>\n\n {/* Featured Image */}\n {post.featured_image && (\n <figure style={{ margin: '0 0 32px' }}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n style={{\n width: '100%',\n maxHeight: 500,\n objectFit: 'cover',\n borderRadius: 12,\n }}\n />\n </figure>\n )}\n\n {/* Content Layout with TOC */}\n <div\n style={{\n display: showToc && tableOfContents.length > 0 ? 'grid' : 'block',\n gridTemplateColumns: showToc && tableOfContents.length > 0 ? '1fr 250px' : undefined,\n gap: 48,\n }}\n >\n {/* Main Content */}\n <div\n className=\"blog-content\"\n style={{\n fontSize: 17,\n lineHeight: 1.8,\n color: '#374151',\n }}\n dangerouslySetInnerHTML={{ __html: content }}\n />\n\n {/* Table of Contents Sidebar */}\n {showToc && tableOfContents.length > 0 && (\n <aside\n style={{\n position: 'sticky',\n top: 100,\n alignSelf: 'start',\n padding: 20,\n backgroundColor: '#f9fafb',\n borderRadius: 12,\n }}\n >\n <h4\n style={{\n margin: '0 0 12px',\n fontSize: 12,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: '#6b7280',\n }}\n >\n On This Page\n </h4>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n style={{\n paddingLeft: (item.level - 2) * 12,\n marginBottom: 8,\n }}\n >\n <a\n href={`#${item.id}`}\n style={{\n fontSize: 14,\n color: '#6b7280',\n textDecoration: 'none',\n }}\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 style={{ marginTop: 32, display: 'flex', gap: 8, flexWrap: 'wrap' }}>\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 style={{\n padding: '4px 12px',\n backgroundColor: '#f3f4f6',\n borderRadius: 9999,\n fontSize: 13,\n color: '#374151',\n textDecoration: 'none',\n }}\n >\n #{tagName}\n </a>\n );\n })}\n </div>\n )}\n\n {/* FAQ Section */}\n {post.faq_items && Array.isArray(post.faq_items) && post.faq_items.length > 0 && (\n <section style={{ marginTop: 48 }}>\n <h2 style={{ fontSize: 24, fontWeight: 600, marginBottom: 24 }}>\n Frequently Asked Questions\n </h2>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {post.faq_items.map((faq: { question: string; answer: string }, index: number) => (\n <details\n key={index}\n style={{\n padding: 16,\n backgroundColor: '#f9fafb',\n borderRadius: 8,\n }}\n >\n <summary\n style={{\n fontWeight: 500,\n cursor: 'pointer',\n listStyle: 'none',\n }}\n >\n {faq.question}\n </summary>\n <p style={{ marginTop: 12, color: '#6b7280' }}>{faq.answer}</p>\n </details>\n ))}\n </div>\n </section>\n )}\n\n {/* Author Card */}\n {showAuthor && post.author && typeof post.author === 'object' && (\n <AuthorSection author={post.author as BlogAuthor} />\n )}\n\n {/* Related Posts */}\n {showRelated && relatedPosts.length > 0 && (\n <section style={{ marginTop: 48 }}>\n <h2 style={{ fontSize: 24, fontWeight: 600, marginBottom: 24 }}>\n Related Posts\n </h2>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',\n gap: 24,\n }}\n >\n {relatedPosts.map((relatedPost) => (\n <article\n key={relatedPost.id}\n style={{\n backgroundColor: '#fff',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }}\n >\n {relatedPost.featured_image && (\n <a href={`${basePath}/${relatedPost.slug}`}>\n <img\n src={relatedPost.featured_image}\n alt={relatedPost.title}\n style={{ width: '100%', height: 150, objectFit: 'cover' }}\n />\n </a>\n )}\n <div style={{ padding: 16 }}>\n <h3 style={{ fontSize: 16, fontWeight: 600, marginBottom: 8 }}>\n <a\n href={`${basePath}/${relatedPost.slug}`}\n style={{ color: 'inherit', textDecoration: 'none' }}\n >\n {relatedPost.title}\n </a>\n </h3>\n {relatedPost.excerpt && (\n <p style={{ fontSize: 14, color: '#6b7280', margin: 0 }}>\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 SECTION\n// ============================================================================\n\nfunction AuthorSection({ author }: { author: BlogAuthor }) {\n return (\n <section\n style={{\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={{\n width: 80,\n height: 80,\n borderRadius: '50%',\n objectFit: 'cover',\n }}\n />\n )}\n <div>\n <h3 style={{ margin: '0 0 4px', fontSize: 18, fontWeight: 600 }}>\n {author.name}\n </h3>\n {author.bio && (\n <p style={{ margin: '0 0 12px', color: '#6b7280', fontSize: 14 }}>\n {author.bio}\n </p>\n )}\n {author.social_links && (\n <div style={{ 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={{ 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={{ color: '#3b82f6', fontSize: 14 }}\n >\n LinkedIn\n </a>\n )}\n </div>\n )}\n </div>\n </section>\n )\n}","/**\n * @uptrade/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\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\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 */\n className?: string\n /** Base URL for post links */\n basePath?: string\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 renderPost,\n children,\n}: BlogListServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\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 className={className} style={{ textAlign: 'center', padding: 40 }}>\n <p style={{ color: '#6b7280' }}>No posts found.</p>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav style={{ marginBottom: 24, display: 'flex', gap: 8, flexWrap: 'wrap' }}>\n <a\n href={basePath}\n style={{\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: !category ? '#3b82f6' : '#f3f4f6',\n color: !category ? '#fff' : '#374151',\n }}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={`${basePath}?category=${cat.slug}`}\n style={{\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 }}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 24,\n }}\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} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav\n style={{\n marginTop: 40,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n }}\n >\n {pagination.hasPrev && (\n <a\n href={buildPaginationUrl(basePath, page - 1, category)}\n style={paginationLinkStyle}\n >\n ← Previous\n </a>\n )}\n \n <span style={{ padding: '8px 16px', color: '#6b7280' }}>\n Page {pagination.page} of {pagination.totalPages}\n </span>\n \n {pagination.hasNext && (\n <a\n href={buildPaginationUrl(basePath, page + 1, category)}\n style={paginationLinkStyle}\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}\n\nfunction BlogPostCard({ post, basePath }: 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 return (\n <article\n style={{\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 }}\n >\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n style={{\n width: '100%',\n height: 200,\n objectFit: 'cover',\n }}\n />\n </a>\n )}\n \n <div style={{ padding: 20 }}>\n {/* Meta */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }}>\n {post.category && (\n <span\n style={{\n padding: '2px 8px',\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: '#eff6ff',\n color: '#3b82f6',\n textTransform: 'uppercase',\n }}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {date && (\n <span style={{ fontSize: 13, color: '#6b7280' }}>{date}</span>\n )}\n </div>\n\n {/* Title */}\n <h3 style={{ margin: '0 0 8px', fontSize: 18, fontWeight: 600, lineHeight: 1.4 }}>\n <a\n href={`${basePath}/${post.slug}`}\n style={{ color: 'inherit', textDecoration: 'none' }}\n >\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p\n style={{\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 }}\n >\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {post.author && (\n <span style={{ fontSize: 13, color: '#6b7280' }}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.reading_time_minutes && (\n <span style={{ fontSize: 13, color: '#9ca3af' }}>\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 * @uptrade/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 * @uptrade/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 * @uptrade/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 * @uptrade/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 * @uptrade/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"]}
|
|
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 * @uptrade/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\nimport React from 'react'\nimport type { BlogPost as BlogPostType, TocItem, BlogAuthor } from './types'\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 */\n className?: 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.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 children,\n}: BlogPostServerProps) {\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 className={className} style={{ textAlign: 'center', padding: 60 }}>\n <h1 style={{ fontSize: 24, marginBottom: 16 }}>Post Not Found</h1>\n <p style={{ color: '#6b7280' }}>\n The blog post you're looking for doesn't exist or has been removed.\n </p>\n <a\n href={basePath}\n style={{\n display: 'inline-block',\n marginTop: 24,\n padding: '12px 24px',\n backgroundColor: '#3b82f6',\n color: '#fff',\n borderRadius: 8,\n textDecoration: 'none',\n }}\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={className}>\n {/* Header */}\n <header style={{ marginBottom: 32 }}>\n {/* Breadcrumb */}\n <nav style={{ marginBottom: 16, fontSize: 14, color: '#6b7280' }}>\n <a href={basePath} style={{ color: '#3b82f6', textDecoration: 'none' }}>\n Blog\n </a>\n {post.category && (\n <>\n <span style={{ margin: '0 8px' }}>/</span>\n <a\n href={`${basePath}?category=${post.category}`}\n style={{ color: '#3b82f6', textDecoration: 'none' }}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </a>\n </>\n )}\n </nav>\n\n {/* Title */}\n <h1 style={{ fontSize: 36, fontWeight: 700, lineHeight: 1.2, marginBottom: 16 }}>\n {post.title}\n </h1>\n\n {/* Subtitle */}\n {post.subtitle && (\n <p style={{ fontSize: 20, color: '#6b7280', marginBottom: 16 }}>\n {post.subtitle}\n </p>\n )}\n\n {/* Meta */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 16, flexWrap: 'wrap' }}>\n {post.author && (\n <span style={{ fontSize: 14, color: '#374151' }}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {date && (\n <span style={{ fontSize: 14, color: '#6b7280' }}>{date}</span>\n )}\n {post.reading_time_minutes && (\n <span style={{ fontSize: 14, color: '#9ca3af' }}>\n {post.reading_time_minutes} min read\n </span>\n )}\n </div>\n </header>\n\n {/* Featured Image */}\n {post.featured_image && (\n <figure style={{ margin: '0 0 32px' }}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n style={{\n width: '100%',\n maxHeight: 500,\n objectFit: 'cover',\n borderRadius: 12,\n }}\n />\n </figure>\n )}\n\n {/* Content Layout with TOC */}\n <div\n style={{\n display: showToc && tableOfContents.length > 0 ? 'grid' : 'block',\n gridTemplateColumns: showToc && tableOfContents.length > 0 ? '1fr 250px' : undefined,\n gap: 48,\n }}\n >\n {/* Main Content */}\n <div\n className=\"blog-content\"\n style={{\n fontSize: 17,\n lineHeight: 1.8,\n color: '#374151',\n }}\n dangerouslySetInnerHTML={{ __html: content }}\n />\n\n {/* Table of Contents Sidebar */}\n {showToc && tableOfContents.length > 0 && (\n <aside\n style={{\n position: 'sticky',\n top: 100,\n alignSelf: 'start',\n padding: 20,\n backgroundColor: '#f9fafb',\n borderRadius: 12,\n }}\n >\n <h4\n style={{\n margin: '0 0 12px',\n fontSize: 12,\n fontWeight: 600,\n textTransform: 'uppercase',\n letterSpacing: '0.05em',\n color: '#6b7280',\n }}\n >\n On This Page\n </h4>\n <ul style={{ listStyle: 'none', margin: 0, padding: 0 }}>\n {tableOfContents.map((item) => (\n <li\n key={item.id}\n style={{\n paddingLeft: (item.level - 2) * 12,\n marginBottom: 8,\n }}\n >\n <a\n href={`#${item.id}`}\n style={{\n fontSize: 14,\n color: '#6b7280',\n textDecoration: 'none',\n }}\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 style={{ marginTop: 32, display: 'flex', gap: 8, flexWrap: 'wrap' }}>\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 style={{\n padding: '4px 12px',\n backgroundColor: '#f3f4f6',\n borderRadius: 9999,\n fontSize: 13,\n color: '#374151',\n textDecoration: 'none',\n }}\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 style={{ marginTop: 48 }}>\n <h2 style={{ fontSize: 24, fontWeight: 600, marginBottom: 24 }}>\n Frequently Asked Questions\n </h2>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 16 }}>\n {(post.faq_items ?? (post as any).faqItems).map((faq: { question: string; answer: string }, index: number) => (\n <details\n key={index}\n style={{\n padding: 16,\n backgroundColor: '#f9fafb',\n borderRadius: 8,\n }}\n >\n <summary\n style={{\n fontWeight: 500,\n cursor: 'pointer',\n listStyle: 'none',\n }}\n >\n {faq.question}\n </summary>\n <p style={{ marginTop: 12, color: '#6b7280' }}>{faq.answer}</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)} />\n )}\n\n {/* Related Posts */}\n {showRelated && relatedPosts.length > 0 && (\n <section style={{ marginTop: 48 }}>\n <h2 style={{ fontSize: 24, fontWeight: 600, marginBottom: 24 }}>\n Related Posts\n </h2>\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(280px, 1fr))',\n gap: 24,\n }}\n >\n {relatedPosts.map((relatedPost) => (\n <article\n key={relatedPost.id}\n style={{\n backgroundColor: '#fff',\n borderRadius: 12,\n overflow: 'hidden',\n boxShadow: '0 1px 3px rgba(0,0,0,0.1)',\n }}\n >\n {relatedPost.featured_image && (\n <a href={`${basePath}/${relatedPost.slug}`}>\n <img\n src={relatedPost.featured_image}\n alt={relatedPost.title}\n style={{ width: '100%', height: 150, objectFit: 'cover' }}\n />\n </a>\n )}\n <div style={{ padding: 16 }}>\n <h3 style={{ fontSize: 16, fontWeight: 600, marginBottom: 8 }}>\n <a\n href={`${basePath}/${relatedPost.slug}`}\n style={{ color: 'inherit', textDecoration: 'none' }}\n >\n {relatedPost.title}\n </a>\n </h3>\n {relatedPost.excerpt && (\n <p style={{ fontSize: 14, color: '#6b7280', margin: 0 }}>\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}: {\n author: BlogAuthor & { sameAs?: string[]; title?: string }\n}) {\n return (\n <section\n style={{\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={{\n width: 80,\n height: 80,\n borderRadius: '50%',\n objectFit: 'cover',\n }}\n />\n )}\n <div>\n <h3 style={{ margin: '0 0 4px', fontSize: 18, fontWeight: 600 }}>\n {author.name}\n </h3>\n {'title' in author && author.title && (\n <p style={{ margin: '0 0 4px', fontSize: 14, color: '#6b7280' }}>\n {author.title}\n </p>\n )}\n {author.bio && (\n <p style={{ margin: '0 0 12px', color: '#6b7280', fontSize: 14 }}>\n {author.bio}\n </p>\n )}\n {author.social_links && (\n <div style={{ 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={{ 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={{ 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 * @uptrade/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\nimport React from 'react'\nimport type { BlogListResult, BlogPost, BlogCategory } from './types'\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 */\n className?: string\n /** Base URL for post links */\n basePath?: string\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 renderPost,\n children,\n}: BlogListServerProps) {\n if (!apiKey) {\n console.warn('[Blog] No API key configured')\n return null\n }\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 className={className} style={{ textAlign: 'center', padding: 40 }}>\n <p style={{ color: '#6b7280' }}>No posts found.</p>\n </div>\n )\n }\n\n return (\n <div className={className}>\n {/* Category Filter */}\n {showCategoryFilter && categories.length > 0 && (\n <nav style={{ marginBottom: 24, display: 'flex', gap: 8, flexWrap: 'wrap' }}>\n <a\n href={basePath}\n style={{\n padding: '6px 12px',\n borderRadius: 9999,\n fontSize: 14,\n textDecoration: 'none',\n backgroundColor: !category ? '#3b82f6' : '#f3f4f6',\n color: !category ? '#fff' : '#374151',\n }}\n >\n All\n </a>\n {categories.map((cat) => (\n <a\n key={cat.slug}\n href={`${basePath}?category=${cat.slug}`}\n style={{\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 }}\n >\n {cat.name} ({cat.post_count})\n </a>\n ))}\n </nav>\n )}\n\n {/* Blog Grid */}\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(320px, 1fr))',\n gap: 24,\n }}\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} />\n )\n )}\n </div>\n\n {/* Pagination */}\n {showPagination && pagination.totalPages > 1 && (\n <nav\n style={{\n marginTop: 40,\n display: 'flex',\n justifyContent: 'center',\n gap: 8,\n }}\n >\n {pagination.hasPrev && (\n <a\n href={buildPaginationUrl(basePath, page - 1, category)}\n style={paginationLinkStyle}\n >\n ← Previous\n </a>\n )}\n \n <span style={{ padding: '8px 16px', color: '#6b7280' }}>\n Page {pagination.page} of {pagination.totalPages}\n </span>\n \n {pagination.hasNext && (\n <a\n href={buildPaginationUrl(basePath, page + 1, category)}\n style={paginationLinkStyle}\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}\n\nfunction BlogPostCard({ post, basePath }: 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 return (\n <article\n style={{\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 }}\n >\n {post.featured_image && (\n <a href={`${basePath}/${post.slug}`}>\n <img\n src={post.featured_image}\n alt={post.featured_image_alt || post.title}\n style={{\n width: '100%',\n height: 200,\n objectFit: 'cover',\n }}\n />\n </a>\n )}\n \n <div style={{ padding: 20 }}>\n {/* Meta */}\n <div style={{ display: 'flex', alignItems: 'center', gap: 12, marginBottom: 12 }}>\n {post.category && (\n <span\n style={{\n padding: '2px 8px',\n borderRadius: 4,\n fontSize: 12,\n fontWeight: 500,\n backgroundColor: '#eff6ff',\n color: '#3b82f6',\n textTransform: 'uppercase',\n }}\n >\n {typeof post.category === 'string' ? post.category : post.category?.name || 'Uncategorized'}\n </span>\n )}\n {date && (\n <span style={{ fontSize: 13, color: '#6b7280' }}>{date}</span>\n )}\n </div>\n\n {/* Title */}\n <h3 style={{ margin: '0 0 8px', fontSize: 18, fontWeight: 600, lineHeight: 1.4 }}>\n <a\n href={`${basePath}/${post.slug}`}\n style={{ color: 'inherit', textDecoration: 'none' }}\n >\n {post.title}\n </a>\n </h3>\n\n {/* Excerpt */}\n {post.excerpt && (\n <p\n style={{\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 }}\n >\n {post.excerpt}\n </p>\n )}\n\n {/* Footer */}\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>\n {post.author && (\n <span style={{ fontSize: 13, color: '#6b7280' }}>\n By {typeof post.author === 'string' ? post.author : post.author.name}\n </span>\n )}\n {post.reading_time_minutes && (\n <span style={{ fontSize: 13, color: '#9ca3af' }}>\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 * @uptrade/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 * @uptrade/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 * @uptrade/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 * @uptrade/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 * @uptrade/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"]}
|
package/dist/blog/server.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Metadata } from 'next';
|
|
2
|
-
import { B as BlogPost } from '../types-
|
|
2
|
+
import { B as BlogPost } from '../types-DI0jnhjJ.mjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @uptrade/site-kit/blog/server
|
|
@@ -217,7 +217,8 @@ declare function generateBreadcrumbSchema(post: BlogPost, options?: {
|
|
|
217
217
|
}): object;
|
|
218
218
|
/**
|
|
219
219
|
* Generate all relevant schemas for a blog post in a single array
|
|
220
|
-
* This is the recommended way to include multiple schemas
|
|
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.
|
|
221
222
|
*/
|
|
222
223
|
declare function generateAllBlogSchemas(post: BlogPost, options?: {
|
|
223
224
|
siteUrl?: string;
|
package/dist/blog/server.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Metadata } from 'next';
|
|
2
|
-
import { B as BlogPost } from '../types-
|
|
2
|
+
import { B as BlogPost } from '../types-DI0jnhjJ.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* @uptrade/site-kit/blog/server
|
|
@@ -217,7 +217,8 @@ declare function generateBreadcrumbSchema(post: BlogPost, options?: {
|
|
|
217
217
|
}): object;
|
|
218
218
|
/**
|
|
219
219
|
* Generate all relevant schemas for a blog post in a single array
|
|
220
|
-
* This is the recommended way to include multiple schemas
|
|
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.
|
|
221
222
|
*/
|
|
222
223
|
declare function generateAllBlogSchemas(post: BlogPost, options?: {
|
|
223
224
|
siteUrl?: string;
|
package/dist/blog/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
require('../chunk-
|
|
3
|
+
require('../chunk-ZSMWDLMK.js');
|
|
4
4
|
|
|
5
5
|
// src/blog/server.ts
|
|
6
6
|
function getConfig() {
|
|
@@ -647,12 +647,19 @@ function generateBreadcrumbSchema(post, options = {}) {
|
|
|
647
647
|
}
|
|
648
648
|
function generateAllBlogSchemas(post, options = {}) {
|
|
649
649
|
const schemas = [];
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
650
|
+
const eeatSchema = post.schema;
|
|
651
|
+
if (eeatSchema) {
|
|
652
|
+
const arr = Array.isArray(eeatSchema) ? eeatSchema : [eeatSchema];
|
|
653
|
+
schemas.push(...arr);
|
|
654
|
+
} else {
|
|
655
|
+
schemas.push(generateBlogPostSchema(post, options));
|
|
656
|
+
const faqItems = post.faq_items ?? post.faqItems;
|
|
657
|
+
if (faqItems && faqItems.length > 0) {
|
|
658
|
+
const faqSchema = generateFaqSchema(faqItems);
|
|
659
|
+
if (faqSchema) schemas.push(faqSchema);
|
|
660
|
+
}
|
|
655
661
|
}
|
|
662
|
+
schemas.push(generateBreadcrumbSchema(post, options));
|
|
656
663
|
return schemas;
|
|
657
664
|
}
|
|
658
665
|
|