@brunoalz/smartgesti-site-editor 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
  2. package/dist/engine/export/exporters/sections/BlogPostExporters.js +585 -227
  3. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
  4. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
  5. package/dist/engine/plugins/builtin/blog/manifest.js +264 -112
  6. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
  7. package/dist/engine/plugins/contentHydration.js +93 -77
  8. package/dist/engine/plugins/contentHydration.js.map +1 -1
  9. package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -1
  10. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +0 -1
  11. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -1
  12. package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts.map +1 -1
  13. package/dist/engine/registry/blocks/sections/blogPostGrid.js +321 -6
  14. package/dist/engine/registry/blocks/sections/blogPostGrid.js.map +1 -1
  15. package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -1
  16. package/dist/engine/registry/blocks/sections/blogRecentPosts.js +11 -2
  17. package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -1
  18. package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -1
  19. package/dist/engine/registry/blocks/sections/blogTagCloud.js +0 -1
  20. package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -1
  21. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.d.ts.map +1 -1
  22. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js +35 -33
  23. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js.map +1 -1
  24. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.d.ts.map +1 -1
  25. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js +251 -66
  26. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js.map +1 -1
  27. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.d.ts.map +1 -1
  28. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js +31 -30
  29. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js.map +1 -1
  30. package/dist/engine/schema/siteDocument.d.ts +36 -1
  31. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  32. package/dist/engine/schema/siteDocument.js.map +1 -1
  33. package/dist/engine/shared/iconUtils.d.ts +25 -0
  34. package/dist/engine/shared/iconUtils.d.ts.map +1 -0
  35. package/dist/engine/shared/iconUtils.js +43 -0
  36. package/dist/engine/shared/iconUtils.js.map +1 -0
  37. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"BlogPostExporters.js","sources":["../../../../../src/engine/export/exporters/sections/BlogPostExporters.ts"],"sourcesContent":["/**\n * Blog Post Exporters\n * BlogPostCard, BlogPostGrid, BlogPostDetail\n * Mobile-first responsive layouts for blog plugin blocks\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n} from \"../../shared/responsiveGridHelper\";\nimport { resolveWidgetShadow } from \"../../../shared/widgetStyles\";\nimport { generateLinkHoverStyles } from \"../../../shared/hoverEffects\";\n\n// ---------------------------------------------------------------------------\n// BlogPostCard\n// ---------------------------------------------------------------------------\n\nexport function exportBlogPostCard(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n excerpt,\n image,\n date,\n category,\n authorName,\n authorAvatar,\n readingTime,\n linkHref,\n linkText,\n variant = \"default\",\n showImage = true,\n showCategory = true,\n showDate = true,\n showAuthor = false,\n showReadingTime = false,\n } = (block as any).props;\n\n // ---------- variant: horizontal ----------\n if (variant === \"horizontal\") {\n const imgHtml =\n showImage && image\n ? `<div style=\"width: 260px; min-height: 180px; flex-shrink: 0; background-image: url(${escapeHtml(image)}); background-size: cover; background-position: center;\"></div>`\n : \"\";\n\n const metaParts: string[] = [];\n if (showCategory && category) metaParts.push(escapeHtml(category));\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n const authorHtml =\n showAuthor && authorName\n ? `<div style=\"display: flex; align-items: center; gap: 0.5rem; margin-top: auto; padding-top: 0.75rem;\">${\n authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${escapeHtml(authorName)}\" style=\"width: 28px; height: 28px; border-radius: 50%; object-fit: cover;\" />`\n : \"\"\n }<span style=\"font-size: 0.8rem; color: var(--sg-muted-text);\">${escapeHtml(authorName)}</span></div>`\n : \"\";\n\n const linkHtml = linkText\n ? `<a href=\"${escapeHtml(linkHref || \"#\")}\" style=\"color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;\">${escapeHtml(linkText)}</a>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-card\" style=\"display: flex; background-color: var(--sg-bg); border-radius: var(--sg-card-radius); overflow: hidden; box-shadow: var(--sg-card-shadow);\" data-variant=\"horizontal\">${imgHtml}<div style=\"padding: 1.25rem; display: flex; flex-direction: column; flex: 1;\">${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;\">${escapeHtml(title)}</h3>${excerpt ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.75rem;\">${escapeHtml(excerpt)}</p>` : \"\"}${linkHtml}${authorHtml}</div></article>`;\n }\n\n // ---------- variant: minimal ----------\n if (variant === \"minimal\") {\n const metaParts: string[] = [];\n if (showCategory && category) metaParts.push(escapeHtml(category));\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n const linkHtml = linkText\n ? `<a href=\"${escapeHtml(linkHref || \"#\")}\" style=\"color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;\">${escapeHtml(linkText)}</a>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-card\" style=\"padding: 1.25rem 0; border-bottom: 1px solid var(--sg-border, #e5e7eb);\" data-variant=\"minimal\">${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.25rem;\">${escapeHtml(title)}</h3>${excerpt ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.5rem;\">${escapeHtml(excerpt)}</p>` : \"\"}${linkHtml}</article>`;\n }\n\n // ---------- variant: default ----------\n const imgHtml =\n showImage && image\n ? `<div style=\"height: 200px; background-image: url(${escapeHtml(image)}); background-size: cover; background-position: center;\"></div>`\n : \"\";\n\n const metaParts: string[] = [];\n if (showCategory && category) metaParts.push(escapeHtml(category));\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n const authorHtml =\n showAuthor && authorName\n ? `<div style=\"display: flex; align-items: center; gap: 0.5rem; margin-top: 1rem;\">${\n authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${escapeHtml(authorName)}\" style=\"width: 32px; height: 32px; border-radius: 50%; object-fit: cover;\" />`\n : \"\"\n }<span style=\"font-size: 0.8rem; color: var(--sg-muted-text);\">${escapeHtml(authorName)}</span></div>`\n : \"\";\n\n const linkHtml = linkText\n ? `<a href=\"${escapeHtml(linkHref || \"#\")}\" style=\"color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;\">${escapeHtml(linkText)}</a>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-card\" style=\"background-color: var(--sg-bg); border-radius: var(--sg-card-radius); overflow: hidden; box-shadow: var(--sg-card-shadow);\" data-variant=\"default\">${imgHtml}<div style=\"padding: 1.5rem;\">${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;\">${escapeHtml(title)}</h3>${excerpt ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1rem;\">${escapeHtml(excerpt)}</p>` : \"\"}${linkHtml}${authorHtml}</div></article>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogPostGrid\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a pagination URL appending ?pagina=N (or &pagina=N if URL has params).\n * Page 1 returns base URL without param (cleaner URL).\n */\nfunction buildPageUrl(baseUrl: string, page: number): string {\n if (page <= 1) return baseUrl;\n const separator = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${separator}pagina=${page}`;\n}\n\n/**\n * Generates an array of page numbers to display, with -1 for ellipsis.\n */\nfunction getPageNumbers(current: number, total: number): number[] {\n if (total <= 7) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n const pages: number[] = [1];\n if (current > 3) pages.push(-1);\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n for (let i = start; i <= end; i++) pages.push(i);\n if (current < total - 2) pages.push(-1);\n if (pages[pages.length - 1] !== total) pages.push(total);\n return pages;\n}\n\n/**\n * Generates pagination HTML nav element.\n */\nfunction generatePaginationHtml(\n currentPage: number,\n totalPages: number,\n paginationBaseUrl: string,\n): string {\n if (totalPages <= 1) return \"\";\n\n const btnBase = \"display:inline-flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:var(--sg-card-radius, 0.5rem);text-decoration:none;font-size:0.875rem;\";\n const borderNormal = \"border:1px solid var(--sg-border, #e5e7eb);\";\n const borderActive = \"border:1px solid var(--sg-primary);\";\n\n // Previous\n const prevHtml = currentPage > 1\n ? `<a href=\"${escapeHtml(buildPageUrl(paginationBaseUrl, currentPage - 1))}\" style=\"${btnBase}${borderNormal}color:var(--sg-text);\">&lsaquo;</a>`\n : `<span style=\"${btnBase}${borderNormal}color:var(--sg-muted-text);opacity:0.4;\">&lsaquo;</span>`;\n\n // Page numbers\n const pageNumbers = getPageNumbers(currentPage, totalPages);\n const pagesHtml = pageNumbers.map((page, idx) => {\n if (page === -1) {\n return `<span style=\"${btnBase}color:var(--sg-muted-text);\">&hellip;</span>`;\n }\n const isActive = page === currentPage;\n return `<a href=\"${escapeHtml(buildPageUrl(paginationBaseUrl, page))}\" style=\"${btnBase}${isActive ? borderActive : borderNormal}background-color:${isActive ? \"var(--sg-primary)\" : \"transparent\"};color:${isActive ? \"var(--sg-primary-text, #fff)\" : \"var(--sg-text)\"};font-weight:${isActive ? \"600\" : \"400\"};\">${page}</a>`;\n }).join(\"\");\n\n // Next\n const nextHtml = currentPage < totalPages\n ? `<a href=\"${escapeHtml(buildPageUrl(paginationBaseUrl, currentPage + 1))}\" style=\"${btnBase}${borderNormal}color:var(--sg-text);\">&rsaquo;</a>`\n : `<span style=\"${btnBase}${borderNormal}color:var(--sg-muted-text);opacity:0.4;\">&rsaquo;</span>`;\n\n return `<nav data-block-group=\"Paginação\" style=\"display:flex;justify-content:center;align-items:center;gap:0.375rem;margin-top:2.5rem;\">${prevHtml}${pagesHtml}${nextHtml}</nav>`;\n}\n\nexport function exportBlogPostGrid(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n renderChild?: (block: Block, _depth: number, basePath?: string, theme?: ThemeTokens) => string,\n): string {\n const {\n title,\n subtitle,\n columns = 3,\n cards = [],\n showViewAll = false,\n viewAllText,\n viewAllHref,\n currentPage = 1,\n totalPages = 1,\n paginationBaseUrl = \"#\",\n } = (block as any).props;\n\n // Responsive grid: 1 col (mobile) -> 2 cols (tablet) -> N cols (desktop)\n const gridId = generateScopedId(block.id || \"\", \"blog-post-grid\");\n const responsiveConfig = resolveResponsiveColumns(columns, 1, 2, columns);\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(\n gridId,\n responsiveConfig,\n \"2rem\",\n );\n\n const headerHtml =\n title || subtitle\n ? `<div data-block-group=\"Cabeçalho\" style=\"text-align: center; margin-bottom: 3rem;\">${title ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;\">${escapeHtml(title)}</h2>` : \"\"}${subtitle ? `<p style=\"color: var(--sg-muted-text);\">${escapeHtml(subtitle)}</p>` : \"\"}</div>`\n : \"\";\n\n if (!renderChild) {\n throw new Error(\"exportBlogPostGrid requires renderChild function\");\n }\n\n const cardsHtml = cards.length > 0\n ? cards\n .map((c: any, i: number) =>\n renderChild(\n {\n id: `${block.id}-card-${i}`,\n type: \"blogPostCard\",\n props: c,\n } as Block,\n depth + 1,\n basePath,\n theme,\n ),\n )\n .join(\"\")\n : `<div style=\"grid-column: 1 / -1; text-align: center; padding: 3rem 1rem; color: var(--sg-muted-text); border: 2px dashed var(--sg-border, #e5e7eb); border-radius: var(--sg-card-radius, 0.5rem);\"><p style=\"font-size: 1rem; margin-bottom: 0.5rem;\">Nenhum post encontrado</p><p style=\"font-size: 0.875rem;\">Os posts aparecerão aqui quando forem publicados.</p></div>`;\n\n const viewAllHtml =\n showViewAll && viewAllText\n ? `<div data-block-group=\"Rodapé\" style=\"text-align: center; margin-top: 2.5rem;\"><a href=\"${escapeHtml(viewAllHref || \"#\")}\" style=\"display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); font-weight: 600; border-radius: var(--sg-button-radius); text-decoration: none;\">${escapeHtml(viewAllText)}</a></div>`\n : \"\";\n\n const paginationHtml = generatePaginationHtml(currentPage, totalPages, paginationBaseUrl);\n\n return `<style>${mediaQueries}</style><section ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; background-color: var(--sg-bg);\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div data-block-group=\"Layout\" id=\"${gridId}\" style=\"${inlineStyles}\">${cardsHtml}</div>${viewAllHtml}${paginationHtml}</div></section>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogPostDetail\n// ---------------------------------------------------------------------------\n\nexport function exportBlogPostDetail(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n content,\n featuredImage,\n date,\n category,\n readingTime,\n tags = [],\n showFeaturedImage = true,\n showAuthor = true,\n authorVariant = \"inline\",\n showDate = true,\n showTags = true,\n showReadingTime = true,\n contentMaxWidth = \"720px\",\n authorName,\n authorAvatar,\n authorBio,\n } = (block as any).props;\n\n const displayName = escapeHtml(authorName || \"Nome do Autor\");\n const displayBio = authorBio ? escapeHtml(authorBio) : \"\";\n\n // Featured image banner\n const featuredImageHtml =\n showFeaturedImage && featuredImage\n ? `<div data-block-group=\"Mídia\" style=\"width: 100%; margin: 0 auto 2.5rem auto; border-radius: var(--sg-card-radius); overflow: hidden;\"><img src=\"${escapeHtml(featuredImage)}\" alt=\"${escapeHtml(title || \"\")}\" style=\"width: 100%; height: auto; max-height: 520px; object-fit: cover; display: block;\" /></div>`\n : \"\";\n\n // Category badge\n const categoryHtml = category\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 1rem;\">${escapeHtml(category)}</span>`\n : \"\";\n\n // Meta line (date + reading time)\n const metaParts: string[] = [];\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n // Title\n const titleHtml = `<h1 data-block-group=\"Conteúdo\" style=\"font-size: var(--sg-heading-h1, 2.25rem); font-weight: 700; margin-bottom: 0.75rem; line-height: 1.2;\">${escapeHtml(title)}</h1>`;\n\n // Content — trusted HTML from backend, not escaped\n const contentHtml = content\n ? `<div class=\"sg-blog-post-content\" style=\"font-size: 1.0625rem; line-height: 1.75; color: var(--sg-text);\">${content}</div>`\n : \"\";\n\n // Author avatar — real image or placeholder\n const avatarLargeHtml = authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${displayName}\" style=\"width:56px;height:56px;border-radius:50%;object-fit:cover;flex-shrink:0;\" />`\n : `<div style=\"width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--sg-primary-text, #fff);font-size:1.5rem;font-weight:700;\">${displayName.charAt(0).toUpperCase()}</div>`;\n const avatarSmallHtml = authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${displayName}\" style=\"width:40px;height:40px;border-radius:50%;object-fit:cover;flex-shrink:0;\" />`\n : `<div style=\"width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--sg-primary-text, #fff);font-size:1.1rem;font-weight:700;\">${displayName.charAt(0).toUpperCase()}</div>`;\n\n let authorHtml = \"\";\n if (showAuthor) {\n const bioHtml = displayBio ? `<p style=\"color:var(--sg-muted-text);font-size:0.875rem;margin:0.25rem 0 0;\">${displayBio}</p>` : \"\";\n if (authorVariant === \"card\") {\n authorHtml = `<div data-block-group=\"Autor\" style=\"display:flex;align-items:flex-start;gap:1rem;margin-top:3rem;padding:1.25rem;border-radius:var(--sg-card-radius, 0.75rem);background-color:var(--sg-surface, #f9fafb);\">${avatarLargeHtml}<div><div style=\"font-size:0.75rem;color:var(--sg-muted-text);text-transform:uppercase;letter-spacing:0.05em;margin-bottom:0.125rem;\">Escrito por</div><div style=\"font-weight:600;font-size:1rem;\">${displayName}</div>${bioHtml}</div></div>`;\n } else if (authorVariant === \"minimal\") {\n authorHtml = `<p data-block-group=\"Autor\" style=\"margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);color:var(--sg-muted-text);font-size:0.9375rem;\">Escrito por <span style=\"font-weight:600;color:var(--sg-text);\">${displayName}</span></p>`;\n } else {\n // inline (default)\n authorHtml = `<div data-block-group=\"Autor\" style=\"display:flex;align-items:center;gap:0.75rem;margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);\">${avatarSmallHtml}<div><div style=\"font-size:0.75rem;color:var(--sg-muted-text);\">Escrito por</div><div style=\"font-weight:600;font-size:0.9375rem;\">${displayName}</div></div></div>`;\n }\n }\n\n // Tags\n const tagsHtml =\n showTags && tags.length > 0\n ? `<div data-block-group=\"Visibilidade\" style=\"margin-top: 2rem; display: flex; flex-wrap: wrap; gap: 0.5rem;\">${tags\n .map(\n (tag: string) =>\n `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-surface, #f3f4f6); color: var(--sg-text); border-radius: 999px; font-size: 0.75rem;\">${escapeHtml(tag)}</span>`,\n )\n .join(\"\")}</div>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-detail\" style=\"padding: 0; padding-bottom: 6rem;\">${featuredImageHtml}<div style=\"max-width: ${escapeHtml(contentMaxWidth)}; margin: 0 auto; padding: 0 1rem;\">${categoryHtml}${titleHtml}${metaHtml}${contentHtml}${authorHtml}${tagsHtml}</div></article>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogCategoryFilter\n// ---------------------------------------------------------------------------\n\nexport function exportBlogCategoryFilter(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n title,\n categories = [],\n variant = \"chips\",\n showCount = true,\n showAll = true,\n allLabel = \"Todas\",\n activeCategory,\n filterUrl = \"#\",\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n linkColor: linkColorProp,\n } = (block as any).props;\n\n const linkColor = linkColorProp || \"var(--sg-text)\";\n const widgetId = `widget-cat-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n\n const buildHref = (slug?: string) => {\n if (!slug) return escapeHtml(filterUrl);\n return escapeHtml(`${filterUrl}?categoria=${slug}`);\n };\n\n // Hover CSS\n const linkHoverColor = (block as any).props.linkHoverColor || \"\";\n const linkHoverEffect = (block as any).props.linkHoverEffect || \"background\";\n const linkHoverIntensity = (block as any).props.linkHoverIntensity ?? 50;\n\n let hoverCSS = \"\";\n if (linkHoverColor) {\n const styles = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n const baseRule = styles.base\n ? `#${widgetId} .sg-cat-chip:not(.sg-cat-active), #${widgetId} .sg-cat-btn:not(.sg-cat-active), #${widgetId} .sg-cat-list-item { ${styles.base}; transition: all 0.3s ease; }`\n : `#${widgetId} .sg-cat-chip, #${widgetId} .sg-cat-btn, #${widgetId} .sg-cat-list-item { transition: all 0.3s ease; }`;\n const hoverRule = `#${widgetId} .sg-cat-chip:hover:not(.sg-cat-active), #${widgetId} .sg-cat-btn:hover:not(.sg-cat-active), #${widgetId} .sg-cat-list-item:hover { ${styles.hover}; transition: all 0.3s ease; }`;\n hoverCSS = `<style>${baseRule}\\n${hoverRule}</style>`;\n } else {\n hoverCSS = `<style>\n #${widgetId} .sg-cat-chip:hover { opacity:0.8; transform:translateY(-1px); }\n #${widgetId} .sg-cat-btn:hover { border-color:var(--sg-primary) !important; color:var(--sg-primary) !important; }\n #${widgetId} .sg-cat-list-item:hover { background-color:rgba(0,0,0,0.04); }\n </style>`;\n }\n\n let itemsHtml = \"\";\n\n if (variant === \"chips\") {\n const chipStyle = (isActive: boolean) => `display:inline-flex;align-items:center;gap:0.375rem;padding:0.375rem 0.875rem;border-radius:9999px;font-size:0.875rem;font-weight:500;text-decoration:none;background-color:${isActive ? \"var(--sg-primary)\" : \"var(--sg-bg)\"};color:${isActive ? \"var(--sg-primary-text, #fff)\" : linkColor};transition:all 0.2s ease;`;\n const allChip = showAll ? `<a href=\"${escapeHtml(filterUrl)}\" class=\"sg-cat-chip\" style=\"${chipStyle(!activeCategory)}\">${escapeHtml(allLabel)}</a>` : \"\";\n const chips = categories.map((cat: any) => {\n const isActive = activeCategory === cat.slug;\n const countHtml = showCount && cat.count != null ? `<span style=\"font-size:0.75rem;opacity:0.7;\">(${cat.count})</span>` : \"\";\n return `<a href=\"${buildHref(cat.slug)}\" class=\"${isActive ? \"sg-cat-active\" : \"sg-cat-chip\"}\" style=\"${chipStyle(isActive)}\">${escapeHtml(cat.name)}${countHtml}</a>`;\n }).join(\"\");\n itemsHtml = `<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;\">${allChip}${chips}</div>`;\n } else if (variant === \"buttons\") {\n const btnStyle = (isActive: boolean) => `display:inline-flex;align-items:center;gap:0.375rem;padding:0.5rem 1rem;border-radius:calc(${borderRadius} * 0.6);font-size:0.875rem;font-weight:500;text-decoration:none;border:1px solid ${isActive ? \"var(--sg-primary)\" : \"var(--sg-border, #e5e7eb)\"};background-color:${isActive ? \"var(--sg-primary)\" : \"transparent\"};color:${isActive ? \"var(--sg-primary-text, #fff)\" : linkColor};transition:all 0.2s ease;`;\n const allBtn = showAll ? `<a href=\"${escapeHtml(filterUrl)}\" class=\"sg-cat-btn\" style=\"${btnStyle(!activeCategory)}\">${escapeHtml(allLabel)}</a>` : \"\";\n const btns = categories.map((cat: any) => {\n const isActive = activeCategory === cat.slug;\n const countHtml = showCount && cat.count != null ? `<span style=\"font-size:0.75rem;opacity:0.7;\">(${cat.count})</span>` : \"\";\n return `<a href=\"${buildHref(cat.slug)}\" class=\"${isActive ? \"sg-cat-active\" : \"sg-cat-btn\"}\" style=\"${btnStyle(isActive)}\">${escapeHtml(cat.name)}${countHtml}</a>`;\n }).join(\"\");\n itemsHtml = `<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;\">${allBtn}${btns}</div>`;\n } else {\n const listStyle = (isActive: boolean) => `display:flex;align-items:center;justify-content:space-between;padding:0.625rem 0.75rem;border-radius:calc(${borderRadius} * 0.5);font-size:0.875rem;font-weight:${isActive ? \"600\" : \"400\"};text-decoration:none;background-color:${isActive ? \"var(--sg-bg)\" : \"transparent\"};color:${isActive ? \"var(--sg-primary)\" : linkColor};transition:all 0.2s ease;`;\n const allItem = showAll ? `<a href=\"${escapeHtml(filterUrl)}\" class=\"sg-cat-list-item\" style=\"${listStyle(!activeCategory)}\">${escapeHtml(allLabel)}</a>` : \"\";\n const items = categories.map((cat: any) => {\n const isActive = activeCategory === cat.slug;\n const countHtml = showCount && cat.count != null ? `<span style=\"font-size:0.75rem;color:var(--sg-muted-text);background-color:var(--sg-bg);padding:0.125rem 0.5rem;border-radius:9999px;\">${cat.count}</span>` : \"\";\n return `<a href=\"${buildHref(cat.slug)}\" class=\"sg-cat-list-item\" style=\"${listStyle(isActive)}\">${escapeHtml(cat.name)}${countHtml}</a>`;\n }).join(\"\");\n itemsHtml = `<div style=\"display:flex;flex-direction:column;gap:0.125rem;\">${allItem}${items}</div>`;\n }\n\n const titleHtml = title\n ? `<div style=\"padding:1rem 1.25rem;border-bottom:1px solid var(--sg-border, #e5e7eb);\"><h3 style=\"font-size:1rem;font-weight:600;margin:0;color:var(--sg-text);\">${escapeHtml(title)}</h3></div>`\n : \"\";\n\n const contentPad = variant === \"list\" ? \"padding:0.5rem 0.75rem;\" : \"padding:1rem 1.25rem;\";\n\n return `${hoverCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border:1px solid var(--sg-border, #e5e7eb);border-radius:${borderRadius};${shadowStyle}overflow:hidden;\">${titleHtml}<div style=\"${contentPad}\">${itemsHtml}</div></div>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogSearchBar\n// ---------------------------------------------------------------------------\n\nexport function exportBlogSearchBar(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n placeholder = \"Buscar posts...\",\n variant = \"simple\",\n showIcon = true,\n searchUrl = \"#\",\n filterCategories = false,\n filterTags = false,\n filterDate = false,\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n } = (block as any).props;\n\n const widgetId = `widget-search-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n const inputRadius = `calc(${borderRadius} * 0.6)`;\n\n const focusCSS = `<style>\n #${widgetId} input:focus, #${widgetId} select:focus {\n border-color: var(--sg-primary);\n box-shadow: 0 0 0 3px rgba(var(--sg-primary-rgb, 59, 130, 246), 0.15);\n }\n </style>`;\n\n const searchIconSvg = showIcon\n ? `<svg style=\"position:absolute;left:0.75rem;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;color:var(--sg-muted-text);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\" stroke-linecap=\"round\"/></svg>`\n : \"\";\n\n const inputPadding = showIcon ? \"padding-left:2.5rem;\" : \"\";\n const isExpanded = variant === \"expanded\";\n const inputBorder = isExpanded ? \"2px\" : \"1px\";\n const inputFontSize = isExpanded ? \"1.0625rem\" : \"0.875rem\";\n const inputPadY = isExpanded ? \"0.875rem\" : \"0.625rem\";\n\n const inputStyle = `width:100%;${inputPadding}padding-right:1rem;padding-top:${inputPadY};padding-bottom:${inputPadY};font-size:${inputFontSize};border:${inputBorder} solid var(--sg-border, #e5e7eb);border-radius:${inputRadius};background-color:var(--sg-bg);color:var(--sg-text);outline:none;transition:border-color 0.2s, box-shadow 0.2s;`;\n const selectStyle = `padding:0.625rem 0.75rem;font-size:0.875rem;border:1px solid var(--sg-border, #e5e7eb);border-radius:${inputRadius};background-color:var(--sg-bg);color:var(--sg-text);transition:border-color 0.2s;`;\n\n const inputHtml = `<div style=\"position:relative;\">${searchIconSvg}<input type=\"search\" name=\"busca\" placeholder=\"${escapeHtml(placeholder)}\" style=\"${inputStyle}\" /></div>`;\n\n let formContent = inputHtml;\n if (variant === \"with-filters\") {\n const filters: string[] = [];\n if (filterCategories) filters.push(`<select name=\"categoria\" style=\"${selectStyle}\"><option value=\"\">Categoria</option></select>`);\n if (filterTags) filters.push(`<select name=\"tag\" style=\"${selectStyle}\"><option value=\"\">Tag</option></select>`);\n if (filterDate) filters.push(`<select name=\"periodo\" style=\"${selectStyle}\"><option value=\"\">Período</option></select>`);\n formContent = `${inputHtml}<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;margin-top:0.75rem;\">${filters.join(\"\")}</div>`;\n }\n\n return `${focusCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border:1px solid var(--sg-border, #e5e7eb);border-radius:${borderRadius};${shadowStyle}overflow:hidden;\"><form action=\"${escapeHtml(searchUrl)}\" method=\"get\" style=\"padding:1.25rem;\">${formContent}</form></div>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogRecentPosts\n// ---------------------------------------------------------------------------\n\nexport function exportBlogRecentPosts(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n title = \"Posts Recentes\",\n posts = [],\n showThumbnail = true,\n showDate = true,\n showCategory = false,\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n linkColor: linkColorProp,\n } = (block as any).props;\n\n const linkColor = linkColorProp || \"var(--sg-text)\";\n const widgetId = `widget-recent-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n\n const linkHoverColor = (block as any).props.linkHoverColor || \"\";\n const linkHoverEffect = (block as any).props.linkHoverEffect || \"background\";\n const linkHoverIntensity = (block as any).props.linkHoverIntensity ?? 50;\n\n let hoverCSS = \"\";\n if (linkHoverColor) {\n const styles = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n const baseRule = styles.base\n ? `#${widgetId} .sg-recent-post { ${styles.base}; transition: all 0.3s ease; }`\n : `#${widgetId} .sg-recent-post { transition: all 0.3s ease; }`;\n const hoverRule = `#${widgetId} .sg-recent-post:hover { ${styles.hover}; transition: all 0.3s ease; }\n #${widgetId} .sg-recent-post:hover .sg-recent-title { color: ${linkHoverColor}; }`;\n hoverCSS = `<style>${baseRule}\\n${hoverRule}</style>`;\n } else {\n hoverCSS = `<style>\n #${widgetId} .sg-recent-post:hover { background-color:rgba(0,0,0,0.04); }\n #${widgetId} .sg-recent-post:hover .sg-recent-title { color:var(--sg-primary); }\n </style>`;\n }\n\n const titleHtml = title\n ? `<div style=\"padding:1rem 1.25rem;border-bottom:1px solid var(--sg-border, #e5e7eb);\"><h3 style=\"font-size:1rem;font-weight:600;margin:0;color:var(--sg-text);\">${escapeHtml(title)}</h3></div>`\n : \"\";\n\n let contentHtml = \"\";\n if (posts.length === 0) {\n contentHtml = `<p style=\"padding:1.5rem 1.25rem;color:var(--sg-muted-text);font-size:0.875rem;text-align:center;margin:0;\">Nenhum post recente</p>`;\n } else {\n contentHtml = posts\n .map((post: any) => {\n const imgHtml =\n showThumbnail && post.image\n ? `<img src=\"${escapeHtml(post.image)}\" alt=\"${escapeHtml(post.title)}\" style=\"width:64px;height:64px;object-fit:cover;border-radius:calc(${borderRadius} * 0.5);flex-shrink:0;\" />`\n : \"\";\n\n const metaParts: string[] = [];\n if (showDate && post.date) metaParts.push(escapeHtml(post.date));\n if (showCategory && post.category) metaParts.push(`<span style=\"font-size:0.6875rem;color:var(--sg-primary);font-weight:600;text-transform:uppercase;letter-spacing:0.03em;\">${escapeHtml(post.category)}</span>`);\n const metaHtml = metaParts.length\n ? `<div style=\"display:flex;align-items:center;gap:0.5rem;margin-top:0.25rem;font-size:0.75rem;color:var(--sg-muted-text);\">${metaParts.join(\"\")}</div>`\n : \"\";\n\n return `<a href=\"/site/p/blog/${escapeHtml(post.slug)}\" class=\"sg-recent-post\" style=\"display:flex;align-items:center;gap:0.75rem;padding:0.75rem 1.25rem;text-decoration:none;color:inherit;transition:background-color 0.2s;\">${imgHtml}<div style=\"flex:1;min-width:0;\"><div class=\"sg-recent-title\" style=\"font-size:0.875rem;font-weight:500;color:${linkColor};line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;transition:color 0.2s;\">${escapeHtml(post.title)}</div>${metaHtml}</div></a>`;\n })\n .join(\"\");\n }\n\n return `${hoverCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border-radius:${borderRadius};border:1px solid var(--sg-border, #e5e7eb);${shadowStyle}overflow:hidden;\">${titleHtml}<div style=\"padding:0.5rem 0;\">${contentHtml}</div></div>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogTagCloud\n// ---------------------------------------------------------------------------\n\nexport function exportBlogTagCloud(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n title = \"Tags\",\n tags = [],\n variant = \"badges\",\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n linkColor: linkColorProp,\n } = (block as any).props;\n\n const linkColor = linkColorProp || \"var(--sg-text)\";\n const widgetId = `widget-tags-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n\n const linkHoverColor = (block as any).props.linkHoverColor || \"\";\n const linkHoverEffect = (block as any).props.linkHoverEffect || \"background\";\n const linkHoverIntensity = (block as any).props.linkHoverIntensity ?? 50;\n\n let hoverCSS = \"\";\n if (linkHoverColor) {\n const styles = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n const baseRule = styles.base\n ? `#${widgetId} .sg-tag-badge, #${widgetId} .sg-tag-list-item { ${styles.base}; transition: all 0.3s ease; }`\n : `#${widgetId} .sg-tag-badge, #${widgetId} .sg-tag-list-item { transition: all 0.3s ease; }`;\n const hoverRule = `#${widgetId} .sg-tag-badge:hover, #${widgetId} .sg-tag-list-item:hover { ${styles.hover}; transition: all 0.3s ease; }`;\n hoverCSS = `<style>${baseRule}\\n${hoverRule}</style>`;\n } else {\n hoverCSS = `<style>\n #${widgetId} .sg-tag-badge:hover { opacity:0.8; transform:translateY(-1px); }\n #${widgetId} .sg-tag-list-item:hover { background-color:rgba(0,0,0,0.04); }\n </style>`;\n }\n\n const titleHtml = title\n ? `<div style=\"padding:1rem 1.25rem;border-bottom:1px solid var(--sg-border, #e5e7eb);\"><h3 style=\"font-size:1rem;font-weight:600;margin:0;color:var(--sg-text);\">${escapeHtml(title)}</h3></div>`\n : \"\";\n\n let contentHtml = \"\";\n if (tags.length === 0) {\n contentHtml = `<p style=\"color:var(--sg-muted-text);font-size:0.875rem;text-align:center;margin:0;\">Nenhuma tag encontrada</p>`;\n } else if (variant === \"badges\") {\n const badgesHtml = tags\n .map(\n (tag: any) =>\n `<span class=\"sg-tag-badge\" style=\"display:inline-flex;align-items:center;gap:0.375rem;padding:0.3rem 0.75rem;border-radius:9999px;font-size:0.8125rem;font-weight:500;background-color:var(--sg-bg);color:${linkColor};cursor:pointer;transition:all 0.2s ease;\">${escapeHtml(tag.name)}<span style=\"font-size:0.6875rem;color:var(--sg-muted-text);opacity:0.7;\">(${tag.count})</span></span>`,\n )\n .join(\"\");\n contentHtml = `<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;\">${badgesHtml}</div>`;\n } else {\n const listHtml = tags\n .map(\n (tag: any) =>\n `<div class=\"sg-tag-list-item\" style=\"display:flex;align-items:center;justify-content:space-between;padding:0.5rem 0.75rem;border-radius:calc(${borderRadius} * 0.5);font-size:0.875rem;color:${linkColor};cursor:pointer;transition:background-color 0.2s;\"><span>${escapeHtml(tag.name)}</span><span style=\"font-size:0.75rem;color:var(--sg-muted-text);background-color:var(--sg-bg);padding:0.125rem 0.5rem;border-radius:9999px;\">${tag.count}</span></div>`,\n )\n .join(\"\");\n contentHtml = `<div style=\"display:flex;flex-direction:column;gap:0.25rem;\">${listHtml}</div>`;\n }\n\n return `${hoverCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border-radius:${borderRadius};border:1px solid var(--sg-border, #e5e7eb);${shadowStyle}overflow:hidden;\">${titleHtml}<div style=\"padding:1rem 1.25rem;\">${contentHtml}</div></div>`;\n}\n"],"names":["exportBlogPostCard","block","depth","basePath","theme","title","excerpt","image","date","category","authorName","authorAvatar","readingTime","linkHref","linkText","variant","showImage","showCategory","showDate","showAuthor","showReadingTime","imgHtml","escapeHtml","metaParts","metaHtml","authorHtml","linkHtml","dataBlockIdAttr","buildPageUrl","baseUrl","page","separator","getPageNumbers","current","total","_","i","pages","start","end","generatePaginationHtml","currentPage","totalPages","paginationBaseUrl","btnBase","borderNormal","borderActive","prevHtml","pagesHtml","idx","isActive","nextHtml","exportBlogPostGrid","renderChild","subtitle","columns","cards","showViewAll","viewAllText","viewAllHref","gridId","generateScopedId","responsiveConfig","resolveResponsiveColumns","inlineStyles","mediaQueries","generateResponsiveGridStyles","headerHtml","cardsHtml","c","viewAllHtml","paginationHtml","exportBlogPostDetail","content","featuredImage","tags","showFeaturedImage","authorVariant","showTags","contentMaxWidth","authorBio","displayName","displayBio","featuredImageHtml","categoryHtml","titleHtml","contentHtml","avatarLargeHtml","avatarSmallHtml","bioHtml","tagsHtml","tag","exportBlogCategoryFilter","_depth","_basePath","_theme","categories","showCount","showAll","allLabel","activeCategory","filterUrl","borderRadius","shadow","linkColorProp","linkColor","widgetId","boxShadow","resolveWidgetShadow","shadowStyle","buildHref","slug","linkHoverColor","linkHoverEffect","linkHoverIntensity","hoverCSS","styles","generateLinkHoverStyles","baseRule","hoverRule","itemsHtml","chipStyle","allChip","chips","cat","countHtml","btnStyle","allBtn","btns","listStyle","allItem","items","contentPad","exportBlogSearchBar","placeholder","showIcon","searchUrl","filterCategories","filterTags","filterDate","inputRadius","focusCSS","searchIconSvg","inputPadding","isExpanded","inputBorder","inputFontSize","inputPadY","inputStyle","selectStyle","inputHtml","formContent","filters","exportBlogRecentPosts","posts","showThumbnail","post","exportBlogTagCloud"],"mappings":"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"}
1
+ {"version":3,"file":"BlogPostExporters.js","sources":["../../../../../src/engine/export/exporters/sections/BlogPostExporters.ts"],"sourcesContent":["/**\n * Blog Post Exporters\n * BlogPostCard, BlogPostGrid, BlogPostDetail\n * Mobile-first responsive layouts for blog plugin blocks\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n} from \"../../shared/responsiveGridHelper\";\nimport { resolveWidgetShadow } from \"../../../shared/widgetStyles\";\nimport {\n generateLinkHoverStyles,\n generateButtonHoverStyles,\n generateButtonOverlayCSS,\n getButtonHoverKeyframes,\n type ButtonHoverEffect,\n type ButtonHoverOverlay,\n} from \"../../../shared/hoverEffects\";\nimport { renderInlineSvgIcon } from \"../../../shared/iconUtils\";\n\n// ---------------------------------------------------------------------------\n// Helper Functions for Card Customization\n// ---------------------------------------------------------------------------\n\n/**\n * Trunca texto com ellipsis (...)\n */\nfunction truncateText(text: string, maxLength: number): string {\n if (!text || text.length <= maxLength) return text;\n return text.substring(0, maxLength).trim() + \"...\";\n}\n\n/**\n * Resolve card shadow CSS value\n */\nfunction resolveCardShadow(shadow: string): string {\n const shadowMap: Record<string, string> = {\n none: \"none\",\n sm: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n xl: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)\",\n };\n return shadowMap[shadow] || shadowMap.md;\n}\n\n/**\n * Generate card hover effect CSS\n */\nfunction generateCardHoverCSS(\n cardId: string,\n hoverEffect: string,\n shadow: string,\n): string {\n if (hoverEffect === \"none\") return \"\";\n\n let hoverStyles = \"\";\n switch (hoverEffect) {\n case \"lift\":\n hoverStyles = \"transform: translateY(-4px); box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.15), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\";\n break;\n case \"scale\":\n hoverStyles = \"transform: scale(1.02);\";\n break;\n case \"glow\":\n hoverStyles = \"box-shadow: 0 0 20px rgba(59, 130, 246, 0.4);\";\n break;\n default:\n return \"\";\n }\n\n return `\n #${cardId} { transition: all 0.3s ease; }\n #${cardId}:hover { ${hoverStyles} }\n `;\n}\n\n/**\n * Generate image hover effect CSS\n */\nfunction generateImageHoverCSS(\n cardId: string,\n imageId: string,\n effect: string,\n): string {\n if (effect === \"none\") return \"\";\n\n let imageStyles = \"\";\n switch (effect) {\n case \"zoom\":\n imageStyles = \"transform: scale(1.1);\";\n break;\n case \"brightness\":\n imageStyles = \"filter: brightness(1.1);\";\n break;\n default:\n return \"\";\n }\n\n return `\n #${imageId} { transition: transform 0.3s ease, filter 0.3s ease; }\n #${cardId}:hover #${imageId} { ${imageStyles} }\n `;\n}\n\n/**\n * Generate CTA (link or button) styles and hover CSS\n */\nfunction generateCTAStyles(config: {\n cardId: string;\n ctaId: string;\n ctaVariation: string;\n linkColor: string;\n linkHoverColor: string;\n linkHoverEffect: string;\n linkHoverIntensity: number;\n linkIconName: string;\n linkIconPosition: string;\n buttonVariant: string;\n buttonColor: string;\n buttonTextColor: string;\n buttonRadius: number;\n buttonSize: string;\n buttonHoverEffect: string;\n buttonHoverIntensity: number;\n buttonHoverOverlay: string;\n buttonHoverIconName: string;\n}): { inlineStyles: string; hoverCSS: string; iconHtml: string } {\n const {\n cardId,\n ctaId,\n ctaVariation,\n linkColor,\n linkHoverColor,\n linkHoverEffect,\n linkHoverIntensity,\n linkIconName,\n linkIconPosition,\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonRadius,\n buttonSize,\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n } = config;\n\n // Link variation\n if (ctaVariation === \"link\") {\n const inlineStyles = `color: ${linkColor}; font-weight: 600; text-decoration: none; font-size: 0.875rem; display: inline-flex; align-items: center; gap: 0.25rem; transition: all 0.2s ease; position: relative;`;\n\n // Generate link hover styles using shared utility\n const linkHoverResult = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n\n let hoverCSS = \"\";\n if (linkHoverResult.base) {\n hoverCSS += `#${ctaId} { ${linkHoverResult.base} }\\n`;\n }\n hoverCSS += `#${ctaId}:hover { ${linkHoverResult.hover} }`;\n\n // Gerar HTML do ícone (se definido)\n const iconHtml = linkIconName ? renderInlineSvgIcon(linkIconName, \"0.9em\") : \"\";\n\n return { inlineStyles, hoverCSS, iconHtml };\n }\n\n // Button variation\n const sizeStyles: Record<string, { padding: string; fontSize: string }> = {\n sm: { padding: \"0.5rem 1rem\", fontSize: \"0.875rem\" },\n md: { padding: \"0.625rem 1.5rem\", fontSize: \"0.9375rem\" },\n lg: { padding: \"0.75rem 2rem\", fontSize: \"1rem\" },\n };\n const size = sizeStyles[buttonSize] || sizeStyles.md;\n\n const baseStyles = [\n `padding: ${size.padding}`,\n `font-size: ${size.fontSize}`,\n \"font-weight: 600\",\n \"text-decoration: none\",\n \"display: inline-flex\",\n \"align-items: center\",\n \"justify-content: center\",\n \"gap: 0.5rem\",\n `border-radius: ${buttonRadius}px`,\n \"transition: all 0.2s ease\",\n \"cursor: pointer\",\n ];\n\n // Variant-specific styles\n switch (buttonVariant) {\n case \"outline\":\n baseStyles.push(`background-color: transparent`, `border: 2px solid ${buttonColor}`, `color: ${buttonColor}`);\n break;\n case \"ghost\":\n baseStyles.push(`background-color: transparent`, `border: none`, `color: ${buttonColor}`);\n break;\n default: // solid\n baseStyles.push(`background-color: ${buttonColor}`, `border: 2px solid ${buttonColor}`, `color: ${buttonTextColor}`);\n }\n\n const inlineStyles = baseStyles.join(\"; \");\n\n // Hover effects\n let hoverCSS = \"\";\n if (buttonHoverEffect !== \"none\") {\n const hoverResult = generateButtonHoverStyles({\n effect: buttonHoverEffect as ButtonHoverEffect,\n intensity: buttonHoverIntensity,\n buttonColor,\n buttonTextColor: buttonVariant === \"solid\" ? buttonTextColor : buttonColor,\n variant: buttonVariant as \"solid\" | \"outline\" | \"ghost\",\n });\n\n if (hoverResult.base) {\n hoverCSS += `#${ctaId} { ${hoverResult.base} }\\n`;\n }\n hoverCSS += `#${ctaId}:hover { ${hoverResult.hover} }\\n`;\n\n // Add keyframes if needed (for pulse effect)\n if (buttonHoverEffect === \"pulse\") {\n hoverCSS += getButtonHoverKeyframes();\n }\n }\n\n // Overlay effects (shine, fill, bounce, icon, border-glow)\n if (buttonHoverOverlay && buttonHoverOverlay !== \"none\") {\n hoverCSS += generateButtonOverlayCSS(`#${ctaId}`, {\n overlay: buttonHoverOverlay as ButtonHoverOverlay,\n primaryColor: buttonColor,\n iconName: buttonHoverIconName,\n textColor: buttonVariant === \"solid\" ? buttonTextColor : buttonColor,\n });\n }\n\n return { inlineStyles, hoverCSS, iconHtml: \"\" }; // Buttons não usam iconHtml inline\n}\n\n// ---------------------------------------------------------------------------\n// BlogPostCard\n// ---------------------------------------------------------------------------\n\nexport function exportBlogPostCard(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n excerpt,\n image,\n date,\n category,\n authorName,\n authorAvatar,\n readingTime,\n linkHref,\n linkText = \"Ler mais\",\n variant = \"default\",\n showImage = true,\n showReadingTime = false,\n // Card customization\n cardBorderRadius = \"0.75rem\",\n cardShadow = \"md\",\n cardHoverEffect = \"lift\",\n cardBorder = true,\n cardBorderColor = \"#e5e7eb\",\n cardBorderWidth = 1,\n // Image effects\n imageHoverEffect = \"zoom\",\n imageBorderRadius = \"0.75rem\",\n // Card content controls\n showCategory = true,\n categoryStyle = \"badge\",\n showDate = true,\n showAuthor = false,\n excerptMaxLength = 150,\n // CTA customization\n ctaVariation = \"link\",\n linkColor = \"#2563eb\",\n linkHoverColor = \"#1d4ed8\",\n linkHoverEffect = \"underline\",\n linkHoverIntensity = 50,\n linkIconName = \"\",\n linkIconPosition = \"right\",\n buttonVariant = \"solid\",\n buttonColor = \"#2563eb\",\n buttonTextColor = \"#ffffff\",\n buttonRadius = 8,\n buttonSize = \"md\",\n buttonHoverEffect = \"darken\",\n buttonHoverIntensity = 20,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n // ---------- variant: horizontal ----------\n if (variant === \"horizontal\") {\n const cardId = `card-${block.id}`;\n const imageId = `img-${block.id}`;\n const ctaId = `cta-${block.id}`;\n\n const cardShadowValue = resolveCardShadow(cardShadow);\n const cardBorderStyle = cardBorder ? `${cardBorderWidth}px solid ${cardBorderColor}` : \"none\";\n\n const cardHoverCSS = generateCardHoverCSS(cardId, cardHoverEffect, cardShadow);\n const imageHoverCSS = generateImageHoverCSS(cardId, imageId, imageHoverEffect);\n const ctaStyles = generateCTAStyles({\n cardId,\n ctaId,\n ctaVariation,\n linkColor,\n linkHoverColor,\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonRadius,\n buttonSize,\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n });\n\n const allHoverCSS = cardHoverCSS + imageHoverCSS + ctaStyles.hoverCSS;\n\n const imgHtml =\n showImage && image\n ? `<div style=\"width: 40%; min-width: 200px; overflow: hidden; flex-shrink: 0;\"><img id=\"${imageId}\" src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(title)}\" style=\"width: 100%; height: 100%; min-height: 200px; object-fit: cover; display: block;\" /></div>`\n : \"\";\n\n // Header com badge (esquerda) e avatar (direita) na mesma linha\n let headerHtmlH = \"\";\n const hasBadgeOrAuthorH = (showCategory && category) || showAuthor;\n\n if (hasBadgeOrAuthorH) {\n let badgeHtmlH = \"\";\n if (showCategory && category) {\n if (categoryStyle === \"badge\") {\n badgeHtmlH = `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary, #3b82f6); color: white; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; border-radius: 9999px;\">${escapeHtml(category)}</span>`;\n } else {\n badgeHtmlH = `<span style=\"display: inline-block; font-size: 0.75rem; font-weight: 600; color: var(--sg-primary); text-transform: uppercase; letter-spacing: 0.05em;\">${escapeHtml(category)}</span>`;\n }\n }\n\n let avatarHtmlH = \"\";\n if (showAuthor) {\n const avatarSrc = authorAvatar || \"https://i.pravatar.cc/150?img=68\";\n avatarHtmlH = `<img src=\"${escapeHtml(avatarSrc)}\" alt=\"${escapeHtml(authorName || \"Autor\")}\" style=\"width: 28px; height: 28px; border-radius: 50%; object-fit: cover;\" />`;\n }\n\n headerHtmlH = `<div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.75rem;\"><div>${badgeHtmlH}</div><div>${avatarHtmlH}</div></div>`;\n }\n\n const metaParts: string[] = [];\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n\n const metaHtml = metaParts.length\n ? `<div style=\"display: flex; align-items: center; gap: 0.5rem; font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.75rem;\">${metaParts.join(' <span>·</span> ')}</div>`\n : \"\";\n\n const truncatedExcerptH = excerpt ? truncateText(excerpt, excerptMaxLength) : \"\";\n\n // CTA para horizontal (mesma estrutura do default)\n const ctaStylesH = generateCTAStyles({\n cardId,\n ctaId,\n ctaVariation,\n linkColor,\n linkHoverColor,\n linkHoverEffect,\n linkHoverIntensity,\n linkIconName,\n linkIconPosition,\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonRadius,\n buttonSize,\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n });\n\n let ctaContentH = \"\";\n if (ctaVariation === \"link\") {\n const iconLeft = ctaStylesH.iconHtml && linkIconPosition === \"left\" ? ctaStylesH.iconHtml + \" \" : \"\";\n const iconRight = ctaStylesH.iconHtml && linkIconPosition === \"right\" ? \" \" + ctaStylesH.iconHtml : \"\";\n const defaultArrow = !ctaStylesH.iconHtml ? \" →\" : \"\";\n ctaContentH = iconLeft + escapeHtml(linkText) + iconRight + defaultArrow;\n } else {\n ctaContentH = escapeHtml(linkText);\n }\n\n const ctaHtmlH = linkText && linkHref\n ? `<a id=\"${ctaId}\" href=\"${escapeHtml(linkHref)}\" style=\"${ctaStylesH.inlineStyles}\">${ctaContentH}</a>`\n : \"\";\n\n return `${allHoverCSS ? `<style>${allHoverCSS}</style>` : \"\"}<article id=\"${cardId}\" class=\"sg-blog-post-card\" style=\"display: flex; background-color: var(--sg-surface, #ffffff); border-radius: ${cardBorderRadius}; overflow: hidden; box-shadow: ${cardShadowValue}; border: ${cardBorderStyle};\" data-variant=\"horizontal\" data-block-group=\"Card\">${imgHtml}<div style=\"padding: 1.5rem; display: flex; flex-direction: column; flex: 1;\">${headerHtmlH}${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;\">${linkHref ? `<a href=\"${escapeHtml(linkHref)}\" style=\"color: inherit; text-decoration: none;\">${escapeHtml(title)}</a>` : escapeHtml(title)}</h3>${truncatedExcerptH ? `<p style=\"color: var(--sg-muted-text); font-size: 0.9375rem; margin-bottom: 1rem;\">${escapeHtml(truncatedExcerptH)}</p>` : \"\"}<div style=\"margin-top: auto;\">${ctaHtmlH}</div></div></article>`;\n }\n\n // ---------- variant: minimal ----------\n if (variant === \"minimal\") {\n const cardId = `card-${block.id}`;\n const ctaId = `cta-${block.id}`;\n\n const ctaStyles = generateCTAStyles({\n cardId,\n ctaId,\n ctaVariation,\n linkColor,\n linkHoverColor,\n linkHoverEffect,\n linkHoverIntensity,\n linkIconName,\n linkIconPosition,\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonRadius,\n buttonSize,\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n });\n\n // Header com badge (esquerda) e avatar (direita) na mesma linha\n let headerHtmlM = \"\";\n const hasBadgeOrAuthorM = (showCategory && category) || showAuthor;\n\n if (hasBadgeOrAuthorM) {\n let badgeHtmlM = \"\";\n if (showCategory && category) {\n if (categoryStyle === \"badge\") {\n badgeHtmlM = `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary, #3b82f6); color: white; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; border-radius: 9999px;\">${escapeHtml(category)}</span>`;\n } else {\n badgeHtmlM = `<span style=\"display: inline-block; font-size: 0.75rem; font-weight: 600; color: var(--sg-primary); text-transform: uppercase; letter-spacing: 0.05em;\">${escapeHtml(category)}</span>`;\n }\n }\n\n let avatarHtmlM = \"\";\n if (showAuthor) {\n const avatarSrc = authorAvatar || \"https://i.pravatar.cc/150?img=68\";\n avatarHtmlM = `<img src=\"${escapeHtml(avatarSrc)}\" alt=\"${escapeHtml(authorName || \"Autor\")}\" style=\"width: 24px; height: 24px; border-radius: 50%; object-fit: cover;\" />`;\n }\n\n headerHtmlM = `<div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.5rem;\"><div>${badgeHtmlM}</div><div>${avatarHtmlM}</div></div>`;\n }\n\n const metaParts: string[] = [];\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n\n const metaHtml = metaParts.length\n ? `<div style=\"display: flex; align-items: center; gap: 0.5rem; font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;\">${metaParts.join(' <span>·</span> ')}</div>`\n : \"\";\n\n const truncatedExcerptM = excerpt ? truncateText(excerpt, excerptMaxLength) : \"\";\n\n // CTA HTML with icon support\n let ctaContentM = \"\";\n if (ctaVariation === \"link\") {\n const iconLeft = ctaStyles.iconHtml && linkIconPosition === \"left\" ? ctaStyles.iconHtml + \" \" : \"\";\n const iconRight = ctaStyles.iconHtml && linkIconPosition === \"right\" ? \" \" + ctaStyles.iconHtml : \"\";\n const defaultArrow = !ctaStyles.iconHtml ? \" →\" : \"\";\n ctaContentM = iconLeft + escapeHtml(linkText) + iconRight + defaultArrow;\n } else {\n ctaContentM = escapeHtml(linkText);\n }\n\n const ctaHtml = linkText && linkHref\n ? `<a id=\"${ctaId}\" href=\"${escapeHtml(linkHref)}\" style=\"${ctaStyles.inlineStyles}\">${ctaContentM}</a>`\n : \"\";\n\n return `${ctaStyles.hoverCSS ? `<style>${ctaStyles.hoverCSS}</style>` : \"\"}<article id=\"${cardId}\" class=\"sg-blog-post-card\" style=\"padding: 1.25rem 0; border-bottom: 1px solid var(--sg-border, #e5e7eb);\" data-variant=\"minimal\" data-block-group=\"Card\">${headerHtmlM}${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;\">${linkHref ? `<a href=\"${escapeHtml(linkHref)}\" style=\"color: inherit; text-decoration: none;\">${escapeHtml(title)}</a>` : escapeHtml(title)}</h3>${truncatedExcerptM ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.75rem;\">${escapeHtml(truncatedExcerptM)}</p>` : \"\"}${ctaHtml}</article>`;\n }\n\n // ---------- variant: default ----------\n\n // Generate unique IDs for CSS selectors\n const cardId = `card-${block.id}`;\n const imageId = `img-${block.id}`;\n const ctaId = `cta-${block.id}`;\n\n // Resolve card shadow\n const cardShadowValue = resolveCardShadow(cardShadow);\n const cardBorderStyle = cardBorder ? \"1px solid var(--sg-border, #e5e7eb)\" : \"none\";\n\n // Generate hover CSS\n const cardHoverCSS = generateCardHoverCSS(cardId, cardHoverEffect, cardShadow);\n const imageHoverCSS = generateImageHoverCSS(cardId, imageId, imageHoverEffect);\n const ctaStyles = generateCTAStyles({\n cardId,\n ctaId,\n ctaVariation,\n linkColor,\n linkHoverColor,\n linkHoverEffect,\n linkHoverIntensity,\n linkIconName,\n linkIconPosition,\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonRadius,\n buttonSize,\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n });\n\n // Combine all hover CSS\n const allHoverCSS = cardHoverCSS + imageHoverCSS + ctaStyles.hoverCSS;\n\n // Image HTML with customization\n const imgHtml =\n showImage && image\n ? `<div style=\"height: 200px; overflow: hidden; border-radius: ${imageBorderRadius} ${imageBorderRadius} 0 0;\"><img id=\"${imageId}\" src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(title)}\" style=\"width: 100%; height: 100%; object-fit: cover; display: block;\" /></div>`\n : \"\";\n\n // Header com badge (esquerda) e avatar (direita) na mesma linha\n let headerHtml = \"\";\n const hasBadgeOrAuthor = (showCategory && category) || showAuthor;\n\n if (hasBadgeOrAuthor) {\n let badgeHtml = \"\";\n if (showCategory && category) {\n if (categoryStyle === \"badge\") {\n badgeHtml = `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary, #3b82f6); color: white; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; border-radius: 9999px;\">${escapeHtml(category)}</span>`;\n } else {\n badgeHtml = `<span style=\"display: inline-block; font-size: 0.75rem; font-weight: 600; color: var(--sg-primary); text-transform: uppercase; letter-spacing: 0.05em;\">${escapeHtml(category)}</span>`;\n }\n }\n\n let avatarHtml = \"\";\n if (showAuthor) {\n const avatarSrc = authorAvatar || \"https://i.pravatar.cc/150?img=68\";\n avatarHtml = `<img src=\"${escapeHtml(avatarSrc)}\" alt=\"${escapeHtml(authorName || \"Autor\")}\" style=\"width: 28px; height: 28px; border-radius: 50%; object-fit: cover;\" />`;\n }\n\n headerHtml = `<div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 0.75rem;\"><div>${badgeHtml}</div><div>${avatarHtml}</div></div>`;\n }\n\n // Meta parts (date, reading time)\n const metaParts: string[] = [];\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n\n const metaHtml = metaParts.length\n ? `<div style=\"display: flex; align-items: center; gap: 0.5rem; font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.75rem; flex-wrap: wrap;\">${metaParts.join(' <span style=\"color: var(--sg-muted-text);\">·</span> ')}</div>`\n : \"\";\n\n // CTA HTML (link or button)\n let ctaContent = \"\";\n if (ctaVariation === \"link\") {\n // Link com ícone opcional\n const iconLeft = ctaStyles.iconHtml && linkIconPosition === \"left\" ? ctaStyles.iconHtml + \" \" : \"\";\n const iconRight = ctaStyles.iconHtml && linkIconPosition === \"right\" ? \" \" + ctaStyles.iconHtml : \"\";\n const defaultArrow = !ctaStyles.iconHtml ? \" →\" : \"\"; // Seta padrão apenas se não tiver ícone customizado\n ctaContent = iconLeft + escapeHtml(linkText) + iconRight + defaultArrow;\n } else {\n // Button sem ícone inline (ícone vem do overlay effect)\n ctaContent = escapeHtml(linkText);\n }\n\n const ctaHtml = linkText && linkHref\n ? `<a id=\"${ctaId}\" href=\"${escapeHtml(linkHref)}\" style=\"${ctaStyles.inlineStyles}\">${ctaContent}</a>`\n : \"\";\n\n // Truncate excerpt\n const truncatedExcerpt = excerpt ? truncateText(excerpt, excerptMaxLength) : \"\";\n\n // Full card HTML (sem dataBlockIdAttr para que o clique selecione o parent blogPostGrid)\n return `${allHoverCSS ? `<style>${allHoverCSS}</style>` : \"\"}<article id=\"${cardId}\" class=\"sg-blog-post-card\" style=\"background-color: var(--sg-surface, #ffffff); border-radius: ${cardBorderRadius}; overflow: hidden; box-shadow: ${cardShadowValue}; border: ${cardBorderStyle}; display: flex; flex-direction: column;\" data-variant=\"default\" data-block-group=\"Card\">${imgHtml}<div style=\"padding: 1.5rem; display: flex; flex-direction: column; flex: 1;\">${headerHtml}${metaHtml}<h3 style=\"font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem; line-height: 1.3;\">${linkHref ? `<a href=\"${escapeHtml(linkHref)}\" style=\"color: inherit; text-decoration: none;\">${escapeHtml(title)}</a>` : escapeHtml(title)}</h3>${truncatedExcerpt ? `<p style=\"color: var(--sg-muted-text); font-size: 0.9375rem; line-height: 1.6; margin-bottom: 1rem; flex: 1;\">${escapeHtml(truncatedExcerpt)}</p>` : \"\"}<div style=\"margin-top: auto;\">${ctaHtml}</div></div></article>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogPostGrid\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a pagination URL appending ?pagina=N (or &pagina=N if URL has params).\n * Page 1 returns base URL without param (cleaner URL).\n */\nfunction buildPageUrl(baseUrl: string, page: number): string {\n if (page <= 1) return baseUrl;\n const separator = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${separator}pagina=${page}`;\n}\n\n/**\n * Generates an array of page numbers to display, with -1 for ellipsis.\n */\nfunction getPageNumbers(current: number, total: number): number[] {\n if (total <= 7) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n const pages: number[] = [1];\n if (current > 3) pages.push(-1);\n const start = Math.max(2, current - 1);\n const end = Math.min(total - 1, current + 1);\n for (let i = start; i <= end; i++) pages.push(i);\n if (current < total - 2) pages.push(-1);\n if (pages[pages.length - 1] !== total) pages.push(total);\n return pages;\n}\n\n/**\n * Generates pagination HTML nav element.\n */\nfunction generatePaginationHtml(\n currentPage: number,\n totalPages: number,\n paginationBaseUrl: string,\n): string {\n if (totalPages <= 1) return \"\";\n\n const btnBase = \"display:inline-flex;align-items:center;justify-content:center;width:2.25rem;height:2.25rem;border-radius:var(--sg-card-radius, 0.5rem);text-decoration:none;font-size:0.875rem;\";\n const borderNormal = \"border:1px solid var(--sg-border, #e5e7eb);\";\n const borderActive = \"border:1px solid var(--sg-primary);\";\n\n // Previous\n const prevHtml = currentPage > 1\n ? `<a href=\"${escapeHtml(buildPageUrl(paginationBaseUrl, currentPage - 1))}\" style=\"${btnBase}${borderNormal}color:var(--sg-text);\">&lsaquo;</a>`\n : `<span style=\"${btnBase}${borderNormal}color:var(--sg-muted-text);opacity:0.4;\">&lsaquo;</span>`;\n\n // Page numbers\n const pageNumbers = getPageNumbers(currentPage, totalPages);\n const pagesHtml = pageNumbers.map((page, idx) => {\n if (page === -1) {\n return `<span style=\"${btnBase}color:var(--sg-muted-text);\">&hellip;</span>`;\n }\n const isActive = page === currentPage;\n return `<a href=\"${escapeHtml(buildPageUrl(paginationBaseUrl, page))}\" style=\"${btnBase}${isActive ? borderActive : borderNormal}background-color:${isActive ? \"var(--sg-primary)\" : \"transparent\"};color:${isActive ? \"var(--sg-primary-text, #fff)\" : \"var(--sg-text)\"};font-weight:${isActive ? \"600\" : \"400\"};\">${page}</a>`;\n }).join(\"\");\n\n // Next\n const nextHtml = currentPage < totalPages\n ? `<a href=\"${escapeHtml(buildPageUrl(paginationBaseUrl, currentPage + 1))}\" style=\"${btnBase}${borderNormal}color:var(--sg-text);\">&rsaquo;</a>`\n : `<span style=\"${btnBase}${borderNormal}color:var(--sg-muted-text);opacity:0.4;\">&rsaquo;</span>`;\n\n return `<nav data-block-group=\"Paginação\" style=\"display:flex;justify-content:center;align-items:center;gap:0.375rem;margin-top:2.5rem;\">${prevHtml}${pagesHtml}${nextHtml}</nav>`;\n}\n\n/**\n * Generates the magazine hero card HTML (first post with image overlay).\n */\nfunction generateMagazineHeroHtml(card: any): string {\n const imgHtml = card.image\n ? `<img src=\"${escapeHtml(card.image)}\" alt=\"${escapeHtml(card.title || \"\")}\" style=\"position:absolute;top:0;left:0;width:100%;height:100%;object-fit:cover;\" />`\n : \"\";\n\n const categoryHtml = card.category\n ? `<span style=\"display:inline-block;padding:0.25rem 0.75rem;background-color:var(--sg-primary);color:var(--sg-primary-text, #fff);font-size:0.75rem;font-weight:600;text-transform:uppercase;letter-spacing:0.05em;border-radius:0.25rem;margin-bottom:0.75rem;\">${escapeHtml(card.category)}</span>`\n : \"\";\n\n const excerptHtml = card.excerpt\n ? `<p style=\"font-size:1rem;line-height:1.5;color:rgba(255,255,255,0.85);margin-bottom:0.75rem;max-width:600px;\">${escapeHtml(card.excerpt)}</p>`\n : \"\";\n\n const authorParts: string[] = [];\n if (card.authorAvatar) {\n authorParts.push(`<img src=\"${escapeHtml(card.authorAvatar)}\" alt=\"${escapeHtml(card.authorName || \"\")}\" style=\"width:1.75rem;height:1.75rem;border-radius:50%;object-fit:cover;\" />`);\n }\n if (card.authorName) {\n authorParts.push(`<span style=\"font-weight:500;\">${escapeHtml(card.authorName)}</span>`);\n }\n if (card.authorName && card.date) {\n authorParts.push(`<span>&middot;</span>`);\n }\n if (card.date) {\n authorParts.push(`<span>${escapeHtml(card.date)}</span>`);\n }\n const metaHtml = authorParts.length\n ? `<div style=\"display:flex;align-items:center;gap:0.5rem;font-size:0.875rem;color:rgba(255,255,255,0.8);\">${authorParts.join(\"\")}</div>`\n : \"\";\n\n return `<a href=\"${escapeHtml(card.linkHref || \"#\")}\" data-block-group=\"Post em Destaque\" style=\"display:block;position:relative;width:100%;min-height:420px;border-radius:var(--sg-card-radius, 0.75rem);overflow:hidden;margin-bottom:2.5rem;text-decoration:none;color:#fff;background-color:#1a1a2e;\">${imgHtml}<div style=\"position:absolute;inset:0;background:linear-gradient(to top, rgba(0,0,0,0.85) 0%, rgba(0,0,0,0.4) 50%, rgba(0,0,0,0.15) 100%);\"></div><div style=\"position:absolute;bottom:0;left:0;right:0;padding:2rem 2.5rem;\">${categoryHtml}<h2 style=\"font-size:2rem;font-weight:700;line-height:1.2;margin-bottom:0.5rem;color:#fff;\">${escapeHtml(card.title || \"\")}</h2>${excerptHtml}${metaHtml}</div></a>`;\n}\n\nexport function exportBlogPostGrid(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n renderChild?: (block: Block, _depth: number, basePath?: string, theme?: ThemeTokens) => string,\n): string {\n const {\n title,\n subtitle,\n columns = 3,\n cards = [],\n variant = \"default\",\n showViewAll = false,\n viewAllText,\n viewAllHref,\n currentPage = 1,\n totalPages = 1,\n paginationBaseUrl = \"#\",\n // Card customization\n cardBorderRadius = \"0.75rem\",\n cardShadow = \"md\",\n cardHoverEffect = \"lift\",\n cardBorder = true,\n cardBorderColor = \"#e5e7eb\",\n cardBorderWidth = 1,\n // Image effects\n imageHoverEffect = \"zoom\",\n imageBorderRadius = \"0.75rem\",\n // Card content controls\n showCategory = true,\n categoryStyle = \"badge\",\n showDate = true,\n showAuthor = false,\n excerptMaxLength = 150,\n // CTA customization\n ctaVariation = \"link\",\n linkColor = \"#2563eb\",\n linkHoverColor = \"#1d4ed8\",\n linkHoverEffect = \"underline\",\n linkHoverIntensity = 50,\n linkIconName = \"\",\n linkIconPosition = \"right\",\n buttonVariant = \"solid\",\n buttonColor = \"#2563eb\",\n buttonTextColor = \"#ffffff\",\n buttonRadius = 8,\n buttonSize = \"md\",\n buttonHoverEffect = \"darken\",\n buttonHoverIntensity = 20,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n const isMagazine = variant === \"magazine\";\n const heroCard = isMagazine && cards.length > 0 ? cards[0] : null;\n const gridCards: any[] = isMagazine ? cards.slice(1) : cards;\n\n // Responsive grid: 1 col (mobile) -> 2 cols (tablet) -> N cols (desktop)\n const gridId = generateScopedId(block.id || \"\", \"blog-post-grid\");\n const responsiveConfig = resolveResponsiveColumns(columns, 1, 2, columns);\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(\n gridId,\n responsiveConfig,\n \"2rem\",\n );\n\n // Magazine hero\n const heroHtml = heroCard ? generateMagazineHeroHtml(heroCard) : \"\";\n\n // Header: magazine uses a different heading style\n let headerHtml = \"\";\n if (isMagazine) {\n if (gridCards.length > 0) {\n headerHtml = `<div data-block-group=\"Cabeçalho\" style=\"margin-bottom:2rem;\"><h3 style=\"font-size:0.875rem;font-weight:700;text-transform:uppercase;letter-spacing:0.1em;color:var(--sg-text);margin-bottom:0.75rem;\">Posts Recentes</h3><div style=\"height:2px;background-color:var(--sg-primary);width:3rem;\"></div></div>`;\n }\n } else if (title || subtitle) {\n headerHtml = `<div data-block-group=\"Cabeçalho\" style=\"text-align: center; margin-bottom: 3rem;\">${title ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;\">${escapeHtml(title)}</h2>` : \"\"}${subtitle ? `<p style=\"color: var(--sg-muted-text);\">${escapeHtml(subtitle)}</p>` : \"\"}</div>`;\n }\n\n if (!renderChild) {\n throw new Error(\"exportBlogPostGrid requires renderChild function\");\n }\n\n // Resolve card variant for rendering\n const resolveCardVariant = (index: number): string => {\n if (variant === \"featured\" && index === 0) return \"horizontal\";\n if (variant === \"minimal\") return \"minimal\";\n return \"default\";\n };\n\n let gridContentHtml = \"\";\n if (gridCards.length > 0) {\n gridContentHtml = gridCards\n .map((c: any, i: number) =>\n renderChild(\n {\n id: `${block.id}-card-${isMagazine ? i + 1 : i}`,\n type: \"blogPostCard\",\n props: {\n ...c,\n variant: resolveCardVariant(i),\n // Pass customization props from grid to card\n cardBorderRadius,\n cardShadow,\n cardHoverEffect,\n cardBorder,\n cardBorderColor,\n cardBorderWidth,\n imageHoverEffect,\n imageBorderRadius,\n showCategory,\n categoryStyle,\n showDate,\n showAuthor,\n excerptMaxLength,\n ctaVariation,\n linkColor,\n linkHoverColor,\n linkHoverEffect,\n linkHoverIntensity,\n linkIconName,\n linkIconPosition,\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonRadius,\n buttonSize,\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n },\n } as Block,\n depth + 1,\n basePath,\n theme,\n ),\n )\n .join(\"\");\n } else if (!heroCard) {\n gridContentHtml = `<div style=\"grid-column: 1 / -1; text-align: center; padding: 3rem 1rem; color: var(--sg-muted-text); border: 2px dashed var(--sg-border, #e5e7eb); border-radius: var(--sg-card-radius, 0.5rem);\"><p style=\"font-size: 1rem; margin-bottom: 0.5rem;\">Nenhum post encontrado</p><p style=\"font-size: 0.875rem;\">Os posts aparecerão aqui quando forem publicados.</p></div>`;\n }\n\n const gridHtml = gridContentHtml\n ? `<div data-block-group=\"Layout\" id=\"${gridId}\" style=\"${inlineStyles}\">${gridContentHtml}</div>`\n : \"\";\n\n const viewAllHtml =\n showViewAll && viewAllText\n ? `<div data-block-group=\"Rodapé\" style=\"text-align: center; margin-top: 2.5rem;\"><a href=\"${escapeHtml(viewAllHref || \"#\")}\" style=\"display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); font-weight: 600; border-radius: var(--sg-button-radius); text-decoration: none;\">${escapeHtml(viewAllText)}</a></div>`\n : \"\";\n\n const paginationHtml = generatePaginationHtml(currentPage, totalPages, paginationBaseUrl);\n\n const sectionPadding = isMagazine ? \"0\" : \"4rem 0\";\n const innerStyle = isMagazine ? \"\" : \"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\";\n\n return `<style>${mediaQueries}</style><section ${dataBlockIdAttr(block.id)} style=\"padding: ${sectionPadding}; background-color: var(--sg-bg);\"><div style=\"${innerStyle}\">${heroHtml}${headerHtml}${gridHtml}${viewAllHtml}${paginationHtml}</div></section>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogPostDetail\n// ---------------------------------------------------------------------------\n\nexport function exportBlogPostDetail(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n content,\n featuredImage,\n date,\n category,\n readingTime,\n tags = [],\n showFeaturedImage = true,\n showAuthor = true,\n authorVariant = \"inline\",\n showDate = true,\n showTags = true,\n showReadingTime = true,\n contentMaxWidth = \"720px\",\n authorName,\n authorAvatar,\n authorBio,\n } = (block as any).props;\n\n const displayName = escapeHtml(authorName || \"Nome do Autor\");\n const displayBio = authorBio ? escapeHtml(authorBio) : \"\";\n\n // Featured image banner\n const featuredImageHtml =\n showFeaturedImage && featuredImage\n ? `<div data-block-group=\"Mídia\" style=\"width: 100%; margin: 0 auto 2.5rem auto; border-radius: var(--sg-card-radius); overflow: hidden;\"><img src=\"${escapeHtml(featuredImage)}\" alt=\"${escapeHtml(title || \"\")}\" style=\"width: 100%; height: auto; max-height: 520px; object-fit: cover; display: block;\" /></div>`\n : \"\";\n\n // Category badge\n const categoryHtml = category\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 1rem;\">${escapeHtml(category)}</span>`\n : \"\";\n\n // Meta line (date + reading time)\n const metaParts: string[] = [];\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n // Title\n const titleHtml = `<h1 data-block-group=\"Conteúdo\" style=\"font-size: var(--sg-heading-h1, 2.25rem); font-weight: 700; margin-bottom: 0.75rem; line-height: 1.2;\">${escapeHtml(title)}</h1>`;\n\n // Content — trusted HTML from backend, not escaped\n const contentHtml = content\n ? `<div class=\"sg-blog-post-content\" style=\"font-size: 1.0625rem; line-height: 1.75; color: var(--sg-text);\">${content}</div>`\n : \"\";\n\n // Author avatar — real image or placeholder\n const avatarLargeHtml = authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${displayName}\" style=\"width:56px;height:56px;border-radius:50%;object-fit:cover;flex-shrink:0;\" />`\n : `<div style=\"width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--sg-primary-text, #fff);font-size:1.5rem;font-weight:700;\">${displayName.charAt(0).toUpperCase()}</div>`;\n const avatarSmallHtml = authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${displayName}\" style=\"width:40px;height:40px;border-radius:50%;object-fit:cover;flex-shrink:0;\" />`\n : `<div style=\"width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--sg-primary-text, #fff);font-size:1.1rem;font-weight:700;\">${displayName.charAt(0).toUpperCase()}</div>`;\n\n let authorHtml = \"\";\n if (showAuthor) {\n const bioHtml = displayBio ? `<p style=\"color:var(--sg-muted-text);font-size:0.875rem;margin:0.25rem 0 0;\">${displayBio}</p>` : \"\";\n if (authorVariant === \"card\") {\n authorHtml = `<div data-block-group=\"Autor\" style=\"display:flex;align-items:flex-start;gap:1rem;margin-top:3rem;padding:1.25rem;border-radius:var(--sg-card-radius, 0.75rem);background-color:var(--sg-surface, #f9fafb);\">${avatarLargeHtml}<div><div style=\"font-size:0.75rem;color:var(--sg-muted-text);text-transform:uppercase;letter-spacing:0.05em;margin-bottom:0.125rem;\">Escrito por</div><div style=\"font-weight:600;font-size:1rem;\">${displayName}</div>${bioHtml}</div></div>`;\n } else if (authorVariant === \"minimal\") {\n authorHtml = `<p data-block-group=\"Autor\" style=\"margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);color:var(--sg-muted-text);font-size:0.9375rem;\">Escrito por <span style=\"font-weight:600;color:var(--sg-text);\">${displayName}</span></p>`;\n } else {\n // inline (default)\n authorHtml = `<div data-block-group=\"Autor\" style=\"display:flex;align-items:center;gap:0.75rem;margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);\">${avatarSmallHtml}<div><div style=\"font-size:0.75rem;color:var(--sg-muted-text);\">Escrito por</div><div style=\"font-weight:600;font-size:0.9375rem;\">${displayName}</div></div></div>`;\n }\n }\n\n // Tags\n const tagsHtml =\n showTags && tags.length > 0\n ? `<div data-block-group=\"Visibilidade\" style=\"margin-top: 2rem; display: flex; flex-wrap: wrap; gap: 0.5rem;\">${tags\n .map(\n (tag: string) =>\n `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-surface, #f3f4f6); color: var(--sg-text); border-radius: 999px; font-size: 0.75rem;\">${escapeHtml(tag)}</span>`,\n )\n .join(\"\")}</div>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-detail\" style=\"padding: 0; padding-bottom: 6rem;\">${featuredImageHtml}<div style=\"max-width: ${escapeHtml(contentMaxWidth)}; margin: 0 auto; padding: 0 1rem;\">${categoryHtml}${titleHtml}${metaHtml}${contentHtml}${authorHtml}${tagsHtml}</div></article>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogCategoryFilter\n// ---------------------------------------------------------------------------\n\nexport function exportBlogCategoryFilter(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n title,\n categories = [],\n variant = \"chips\",\n showCount = true,\n showAll = true,\n allLabel = \"Todas\",\n activeCategory,\n filterUrl = \"#\",\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n linkColor: linkColorProp,\n } = (block as any).props;\n\n const linkColor = linkColorProp || \"var(--sg-text)\";\n const widgetId = `widget-cat-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n\n const buildHref = (slug?: string) => {\n if (!slug) return escapeHtml(filterUrl);\n return escapeHtml(`${filterUrl}?categoria=${slug}`);\n };\n\n // Hover CSS\n const linkHoverColor = (block as any).props.linkHoverColor || \"\";\n const linkHoverEffect = (block as any).props.linkHoverEffect || \"background\";\n const linkHoverIntensity = (block as any).props.linkHoverIntensity ?? 50;\n\n let hoverCSS = \"\";\n if (linkHoverColor) {\n const styles = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n const baseRule = styles.base\n ? `#${widgetId} .sg-cat-chip:not(.sg-cat-active), #${widgetId} .sg-cat-btn:not(.sg-cat-active), #${widgetId} .sg-cat-list-item { ${styles.base}; transition: all 0.3s ease; }`\n : `#${widgetId} .sg-cat-chip, #${widgetId} .sg-cat-btn, #${widgetId} .sg-cat-list-item { transition: all 0.3s ease; }`;\n const hoverRule = `#${widgetId} .sg-cat-chip:hover:not(.sg-cat-active), #${widgetId} .sg-cat-btn:hover:not(.sg-cat-active), #${widgetId} .sg-cat-list-item:hover { ${styles.hover}; transition: all 0.3s ease; }`;\n hoverCSS = `<style>${baseRule}\\n${hoverRule}</style>`;\n } else {\n hoverCSS = `<style>\n #${widgetId} .sg-cat-chip:hover { opacity:0.8; transform:translateY(-1px); }\n #${widgetId} .sg-cat-btn:hover { border-color:var(--sg-primary) !important; color:var(--sg-primary) !important; }\n #${widgetId} .sg-cat-list-item:hover { background-color:rgba(0,0,0,0.04); }\n </style>`;\n }\n\n let itemsHtml = \"\";\n\n if (variant === \"chips\") {\n const chipStyle = (isActive: boolean) => `display:inline-flex;align-items:center;gap:0.375rem;padding:0.375rem 0.875rem;border-radius:9999px;font-size:0.875rem;font-weight:500;text-decoration:none;background-color:${isActive ? \"var(--sg-primary)\" : \"var(--sg-bg)\"};color:${isActive ? \"var(--sg-primary-text, #fff)\" : linkColor};transition:all 0.2s ease;`;\n const allChip = showAll ? `<a href=\"${escapeHtml(filterUrl)}\" class=\"sg-cat-chip\" style=\"${chipStyle(!activeCategory)}\">${escapeHtml(allLabel)}</a>` : \"\";\n const chips = categories.map((cat: any) => {\n const isActive = activeCategory === cat.slug;\n const countHtml = showCount && cat.count != null ? `<span style=\"font-size:0.75rem;opacity:0.7;\">(${cat.count})</span>` : \"\";\n return `<a href=\"${buildHref(cat.slug)}\" class=\"${isActive ? \"sg-cat-active\" : \"sg-cat-chip\"}\" style=\"${chipStyle(isActive)}\">${escapeHtml(cat.name)}${countHtml}</a>`;\n }).join(\"\");\n itemsHtml = `<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;\">${allChip}${chips}</div>`;\n } else if (variant === \"buttons\") {\n const btnStyle = (isActive: boolean) => `display:inline-flex;align-items:center;gap:0.375rem;padding:0.5rem 1rem;border-radius:calc(${borderRadius} * 0.6);font-size:0.875rem;font-weight:500;text-decoration:none;border:1px solid ${isActive ? \"var(--sg-primary)\" : \"var(--sg-border, #e5e7eb)\"};background-color:${isActive ? \"var(--sg-primary)\" : \"transparent\"};color:${isActive ? \"var(--sg-primary-text, #fff)\" : linkColor};transition:all 0.2s ease;`;\n const allBtn = showAll ? `<a href=\"${escapeHtml(filterUrl)}\" class=\"sg-cat-btn\" style=\"${btnStyle(!activeCategory)}\">${escapeHtml(allLabel)}</a>` : \"\";\n const btns = categories.map((cat: any) => {\n const isActive = activeCategory === cat.slug;\n const countHtml = showCount && cat.count != null ? `<span style=\"font-size:0.75rem;opacity:0.7;\">(${cat.count})</span>` : \"\";\n return `<a href=\"${buildHref(cat.slug)}\" class=\"${isActive ? \"sg-cat-active\" : \"sg-cat-btn\"}\" style=\"${btnStyle(isActive)}\">${escapeHtml(cat.name)}${countHtml}</a>`;\n }).join(\"\");\n itemsHtml = `<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;\">${allBtn}${btns}</div>`;\n } else {\n const listStyle = (isActive: boolean) => `display:flex;align-items:center;justify-content:space-between;padding:0.625rem 0.75rem;border-radius:calc(${borderRadius} * 0.5);font-size:0.875rem;font-weight:${isActive ? \"600\" : \"400\"};text-decoration:none;background-color:${isActive ? \"var(--sg-bg)\" : \"transparent\"};color:${isActive ? \"var(--sg-primary)\" : linkColor};transition:all 0.2s ease;`;\n const allItem = showAll ? `<a href=\"${escapeHtml(filterUrl)}\" class=\"sg-cat-list-item\" style=\"${listStyle(!activeCategory)}\">${escapeHtml(allLabel)}</a>` : \"\";\n const items = categories.map((cat: any) => {\n const isActive = activeCategory === cat.slug;\n const countHtml = showCount && cat.count != null ? `<span style=\"font-size:0.75rem;color:var(--sg-muted-text);background-color:var(--sg-bg);padding:0.125rem 0.5rem;border-radius:9999px;\">${cat.count}</span>` : \"\";\n return `<a href=\"${buildHref(cat.slug)}\" class=\"sg-cat-list-item\" style=\"${listStyle(isActive)}\">${escapeHtml(cat.name)}${countHtml}</a>`;\n }).join(\"\");\n itemsHtml = `<div style=\"display:flex;flex-direction:column;gap:0.125rem;\">${allItem}${items}</div>`;\n }\n\n const titleHtml = title\n ? `<div style=\"padding:1rem 1.25rem;border-bottom:1px solid var(--sg-border, #e5e7eb);\"><h3 style=\"font-size:1rem;font-weight:600;margin:0;color:var(--sg-text);\">${escapeHtml(title)}</h3></div>`\n : \"\";\n\n const contentPad = variant === \"list\" ? \"padding:0.5rem 0.75rem;\" : \"padding:1rem 1.25rem;\";\n\n return `${hoverCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border:1px solid var(--sg-border, #e5e7eb);border-radius:${borderRadius};${shadowStyle}overflow:hidden;\">${titleHtml}<div style=\"${contentPad}\">${itemsHtml}</div></div>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogSearchBar\n// ---------------------------------------------------------------------------\n\nexport function exportBlogSearchBar(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n placeholder = \"Buscar posts...\",\n variant = \"simple\",\n showIcon = true,\n searchUrl = \"#\",\n filterCategories = false,\n filterTags = false,\n filterDate = false,\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n } = (block as any).props;\n\n const widgetId = `widget-search-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n const inputRadius = `calc(${borderRadius} * 0.6)`;\n\n const focusCSS = `<style>\n #${widgetId} input:focus, #${widgetId} select:focus {\n border-color: var(--sg-primary);\n box-shadow: 0 0 0 3px rgba(var(--sg-primary-rgb, 59, 130, 246), 0.15);\n }\n </style>`;\n\n const searchIconSvg = showIcon\n ? `<svg style=\"position:absolute;left:0.75rem;top:50%;transform:translateY(-50%);width:1.25rem;height:1.25rem;color:var(--sg-muted-text);\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"m21 21-4.35-4.35\" stroke-linecap=\"round\"/></svg>`\n : \"\";\n\n const inputPadding = showIcon ? \"padding-left:2.5rem;\" : \"\";\n const isExpanded = variant === \"expanded\";\n const inputBorder = isExpanded ? \"2px\" : \"1px\";\n const inputFontSize = isExpanded ? \"1.0625rem\" : \"0.875rem\";\n const inputPadY = isExpanded ? \"0.875rem\" : \"0.625rem\";\n\n const inputStyle = `width:100%;${inputPadding}padding-right:1rem;padding-top:${inputPadY};padding-bottom:${inputPadY};font-size:${inputFontSize};border:${inputBorder} solid var(--sg-border, #e5e7eb);border-radius:${inputRadius};background-color:var(--sg-bg);color:var(--sg-text);outline:none;transition:border-color 0.2s, box-shadow 0.2s;`;\n const selectStyle = `padding:0.625rem 0.75rem;font-size:0.875rem;border:1px solid var(--sg-border, #e5e7eb);border-radius:${inputRadius};background-color:var(--sg-bg);color:var(--sg-text);transition:border-color 0.2s;`;\n\n const inputHtml = `<div style=\"position:relative;\">${searchIconSvg}<input type=\"search\" name=\"busca\" placeholder=\"${escapeHtml(placeholder)}\" style=\"${inputStyle}\" /></div>`;\n\n let formContent = inputHtml;\n if (variant === \"with-filters\") {\n const filters: string[] = [];\n if (filterCategories) filters.push(`<select name=\"categoria\" style=\"${selectStyle}\"><option value=\"\">Categoria</option></select>`);\n if (filterTags) filters.push(`<select name=\"tag\" style=\"${selectStyle}\"><option value=\"\">Tag</option></select>`);\n if (filterDate) filters.push(`<select name=\"periodo\" style=\"${selectStyle}\"><option value=\"\">Período</option></select>`);\n formContent = `${inputHtml}<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;margin-top:0.75rem;\">${filters.join(\"\")}</div>`;\n }\n\n return `${focusCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border:1px solid var(--sg-border, #e5e7eb);border-radius:${borderRadius};${shadowStyle}overflow:hidden;\"><form action=\"${escapeHtml(searchUrl)}\" method=\"get\" style=\"padding:1.25rem;\">${formContent}</form></div>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogRecentPosts\n// ---------------------------------------------------------------------------\n\nexport function exportBlogRecentPosts(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n title = \"Posts Recentes\",\n posts = [],\n count = 5,\n showThumbnail = true,\n showDate = true,\n showCategory = false,\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n linkColor: linkColorProp,\n } = (block as any).props;\n\n // Limitar posts pela quantidade configurada\n const limitedPosts = posts.slice(0, count);\n\n const linkColor = linkColorProp || \"var(--sg-text)\";\n const widgetId = `widget-recent-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n\n const linkHoverColor = (block as any).props.linkHoverColor || \"\";\n const linkHoverEffect = (block as any).props.linkHoverEffect || \"background\";\n const linkHoverIntensity = (block as any).props.linkHoverIntensity ?? 50;\n\n let hoverCSS = \"\";\n if (linkHoverColor) {\n const styles = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n const baseRule = styles.base\n ? `#${widgetId} .sg-recent-post { ${styles.base}; transition: all 0.3s ease; }`\n : `#${widgetId} .sg-recent-post { transition: all 0.3s ease; }`;\n const hoverRule = `#${widgetId} .sg-recent-post:hover { ${styles.hover}; transition: all 0.3s ease; }\n #${widgetId} .sg-recent-post:hover .sg-recent-title { color: ${linkHoverColor}; }`;\n hoverCSS = `<style>${baseRule}\\n${hoverRule}</style>`;\n } else {\n hoverCSS = `<style>\n #${widgetId} .sg-recent-post:hover { background-color:rgba(0,0,0,0.04); }\n #${widgetId} .sg-recent-post:hover .sg-recent-title { color:var(--sg-primary); }\n </style>`;\n }\n\n const titleHtml = title\n ? `<div style=\"padding:1rem 1.25rem;border-bottom:1px solid var(--sg-border, #e5e7eb);\"><h3 style=\"font-size:1rem;font-weight:600;margin:0;color:var(--sg-text);\">${escapeHtml(title)}</h3></div>`\n : \"\";\n\n let contentHtml = \"\";\n if (limitedPosts.length === 0) {\n contentHtml = `<p style=\"padding:1.5rem 1.25rem;color:var(--sg-muted-text);font-size:0.875rem;text-align:center;margin:0;\">Nenhum post recente</p>`;\n } else {\n contentHtml = limitedPosts\n .map((post: any) => {\n const imgHtml =\n showThumbnail && post.image\n ? `<img src=\"${escapeHtml(post.image)}\" alt=\"${escapeHtml(post.title)}\" style=\"width:64px;height:64px;object-fit:cover;border-radius:calc(${borderRadius} * 0.5);flex-shrink:0;\" />`\n : \"\";\n\n const metaParts: string[] = [];\n if (showDate && post.date) metaParts.push(escapeHtml(post.date));\n if (showCategory && post.category) metaParts.push(`<span style=\"font-size:0.6875rem;color:var(--sg-primary);font-weight:600;text-transform:uppercase;letter-spacing:0.03em;\">${escapeHtml(post.category)}</span>`);\n const metaHtml = metaParts.length\n ? `<div style=\"display:flex;align-items:center;gap:0.5rem;margin-top:0.25rem;font-size:0.75rem;color:var(--sg-muted-text);\">${metaParts.join(\"\")}</div>`\n : \"\";\n\n return `<a href=\"/site/p/blog/${escapeHtml(post.slug)}\" class=\"sg-recent-post\" style=\"display:flex;align-items:center;gap:0.75rem;padding:0.75rem 1.25rem;text-decoration:none;color:inherit;transition:background-color 0.2s;\">${imgHtml}<div style=\"flex:1;min-width:0;\"><div class=\"sg-recent-title\" style=\"font-size:0.875rem;font-weight:500;color:${linkColor};line-height:1.4;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;transition:color 0.2s;\">${escapeHtml(post.title)}</div>${metaHtml}</div></a>`;\n })\n .join(\"\");\n }\n\n return `${hoverCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border-radius:${borderRadius};border:1px solid var(--sg-border, #e5e7eb);${shadowStyle}overflow:hidden;\">${titleHtml}<div style=\"padding:0.5rem 0;\">${contentHtml}</div></div>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogTagCloud\n// ---------------------------------------------------------------------------\n\nexport function exportBlogTagCloud(\n block: Block,\n _depth: number,\n _basePath?: string,\n _theme?: ThemeTokens,\n): string {\n const {\n title = \"Tags\",\n tags = [],\n variant = \"badges\",\n borderRadius = \"0.75rem\",\n shadow = \"none\",\n linkColor: linkColorProp,\n } = (block as any).props;\n\n const linkColor = linkColorProp || \"var(--sg-text)\";\n const widgetId = `widget-tags-${block.id || \"\"}`;\n const boxShadow = resolveWidgetShadow(shadow);\n const shadowStyle = boxShadow !== \"none\" ? `box-shadow:${boxShadow};` : \"\";\n\n const linkHoverColor = (block as any).props.linkHoverColor || \"\";\n const linkHoverEffect = (block as any).props.linkHoverEffect || \"background\";\n const linkHoverIntensity = (block as any).props.linkHoverIntensity ?? 50;\n\n let hoverCSS = \"\";\n if (linkHoverColor) {\n const styles = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n const baseRule = styles.base\n ? `#${widgetId} .sg-tag-badge, #${widgetId} .sg-tag-list-item { ${styles.base}; transition: all 0.3s ease; }`\n : `#${widgetId} .sg-tag-badge, #${widgetId} .sg-tag-list-item { transition: all 0.3s ease; }`;\n const hoverRule = `#${widgetId} .sg-tag-badge:hover, #${widgetId} .sg-tag-list-item:hover { ${styles.hover}; transition: all 0.3s ease; }`;\n hoverCSS = `<style>${baseRule}\\n${hoverRule}</style>`;\n } else {\n hoverCSS = `<style>\n #${widgetId} .sg-tag-badge:hover { opacity:0.8; transform:translateY(-1px); }\n #${widgetId} .sg-tag-list-item:hover { background-color:rgba(0,0,0,0.04); }\n </style>`;\n }\n\n const titleHtml = title\n ? `<div style=\"padding:1rem 1.25rem;border-bottom:1px solid var(--sg-border, #e5e7eb);\"><h3 style=\"font-size:1rem;font-weight:600;margin:0;color:var(--sg-text);\">${escapeHtml(title)}</h3></div>`\n : \"\";\n\n let contentHtml = \"\";\n if (tags.length === 0) {\n contentHtml = `<p style=\"color:var(--sg-muted-text);font-size:0.875rem;text-align:center;margin:0;\">Nenhuma tag encontrada</p>`;\n } else if (variant === \"badges\") {\n const badgesHtml = tags\n .map(\n (tag: any) =>\n `<span class=\"sg-tag-badge\" style=\"display:inline-flex;align-items:center;gap:0.375rem;padding:0.3rem 0.75rem;border-radius:9999px;font-size:0.8125rem;font-weight:500;background-color:var(--sg-bg);color:${linkColor};cursor:pointer;transition:all 0.2s ease;\">${escapeHtml(tag.name)}<span style=\"font-size:0.6875rem;color:var(--sg-muted-text);opacity:0.7;\">(${tag.count})</span></span>`,\n )\n .join(\"\");\n contentHtml = `<div style=\"display:flex;flex-wrap:wrap;gap:0.5rem;\">${badgesHtml}</div>`;\n } else {\n const listHtml = tags\n .map(\n (tag: any) =>\n `<div class=\"sg-tag-list-item\" style=\"display:flex;align-items:center;justify-content:space-between;padding:0.5rem 0.75rem;border-radius:calc(${borderRadius} * 0.5);font-size:0.875rem;color:${linkColor};cursor:pointer;transition:background-color 0.2s;\"><span>${escapeHtml(tag.name)}</span><span style=\"font-size:0.75rem;color:var(--sg-muted-text);background-color:var(--sg-bg);padding:0.125rem 0.5rem;border-radius:9999px;\">${tag.count}</span></div>`,\n )\n .join(\"\");\n contentHtml = `<div style=\"display:flex;flex-direction:column;gap:0.25rem;\">${listHtml}</div>`;\n }\n\n return `${hoverCSS}<div id=\"${widgetId}\" ${dataBlockIdAttr(block.id)} data-block-group=\"Conteúdo\" style=\"background-color:var(--sg-surface, var(--sg-bg));border-radius:${borderRadius};border:1px solid var(--sg-border, #e5e7eb);${shadowStyle}overflow:hidden;\">${titleHtml}<div style=\"padding:1rem 1.25rem;\">${contentHtml}</div></div>`;\n}\n"],"names":["truncateText","text","maxLength","resolveCardShadow","shadow","shadowMap","generateCardHoverCSS","cardId","hoverEffect","hoverStyles","generateImageHoverCSS","imageId","effect","imageStyles","generateCTAStyles","config","ctaId","ctaVariation","linkColor","linkHoverColor","linkHoverEffect","linkHoverIntensity","linkIconName","linkIconPosition","buttonVariant","buttonColor","buttonTextColor","buttonRadius","buttonSize","buttonHoverEffect","buttonHoverIntensity","buttonHoverOverlay","buttonHoverIconName","inlineStyles","linkHoverResult","generateLinkHoverStyles","hoverCSS","iconHtml","renderInlineSvgIcon","sizeStyles","size","baseStyles","hoverResult","generateButtonHoverStyles","getButtonHoverKeyframes","generateButtonOverlayCSS","exportBlogPostCard","block","depth","basePath","theme","title","excerpt","image","date","category","authorName","authorAvatar","readingTime","linkHref","linkText","variant","showImage","showReadingTime","cardBorderRadius","cardShadow","cardHoverEffect","cardBorder","cardBorderColor","cardBorderWidth","imageHoverEffect","imageBorderRadius","showCategory","categoryStyle","showDate","showAuthor","excerptMaxLength","cardShadowValue","cardBorderStyle","cardHoverCSS","imageHoverCSS","ctaStyles","allHoverCSS","imgHtml","escapeHtml","headerHtmlH","badgeHtmlH","avatarHtmlH","metaParts","metaHtml","truncatedExcerptH","ctaStylesH","ctaContentH","iconLeft","iconRight","defaultArrow","ctaHtmlH","headerHtmlM","badgeHtmlM","avatarHtmlM","truncatedExcerptM","ctaContentM","ctaHtml","headerHtml","badgeHtml","avatarHtml","ctaContent","truncatedExcerpt","buildPageUrl","baseUrl","page","separator","getPageNumbers","current","total","_","i","pages","start","end","generatePaginationHtml","currentPage","totalPages","paginationBaseUrl","btnBase","borderNormal","borderActive","prevHtml","pagesHtml","idx","isActive","nextHtml","generateMagazineHeroHtml","card","categoryHtml","excerptHtml","authorParts","exportBlogPostGrid","renderChild","subtitle","columns","cards","showViewAll","viewAllText","viewAllHref","isMagazine","heroCard","gridCards","gridId","generateScopedId","responsiveConfig","resolveResponsiveColumns","mediaQueries","generateResponsiveGridStyles","heroHtml","resolveCardVariant","index","gridContentHtml","c","gridHtml","viewAllHtml","paginationHtml","sectionPadding","innerStyle","dataBlockIdAttr","exportBlogPostDetail","content","featuredImage","tags","showFeaturedImage","authorVariant","showTags","contentMaxWidth","authorBio","displayName","displayBio","featuredImageHtml","titleHtml","contentHtml","avatarLargeHtml","avatarSmallHtml","authorHtml","bioHtml","tagsHtml","tag","exportBlogCategoryFilter","_depth","_basePath","_theme","categories","showCount","showAll","allLabel","activeCategory","filterUrl","borderRadius","linkColorProp","widgetId","boxShadow","resolveWidgetShadow","shadowStyle","buildHref","slug","styles","baseRule","hoverRule","itemsHtml","chipStyle","allChip","chips","cat","countHtml","btnStyle","allBtn","btns","listStyle","allItem","items","contentPad","exportBlogSearchBar","placeholder","showIcon","searchUrl","filterCategories","filterTags","filterDate","inputRadius","focusCSS","searchIconSvg","inputPadding","isExpanded","inputBorder","inputFontSize","inputPadY","inputStyle","selectStyle","inputHtml","formContent","filters","exportBlogRecentPosts","posts","count","showThumbnail","limitedPosts","post","exportBlogTagCloud"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../../../src/engine/plugins/builtin/blog/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAqFtD,eAAO,MAAM,UAAU,EAAE,kBAifxB,CAAC"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../../../src/engine/plugins/builtin/blog/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAmMtD,eAAO,MAAM,UAAU,EAAE,kBA0iBxB,CAAC"}