@brunoalz/smartgesti-site-editor 1.4.3 → 1.5.1

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 (65) hide show
  1. package/dist/editor/BlockSelector.js +4 -2
  2. package/dist/editor/BlockSelector.js.map +1 -1
  3. package/dist/engine/export/exporters/layout/GridExporter.d.ts.map +1 -1
  4. package/dist/engine/export/exporters/layout/GridExporter.js +32 -13
  5. package/dist/engine/export/exporters/layout/GridExporter.js.map +1 -1
  6. package/dist/engine/export/exporters/layout/StackExporter.d.ts.map +1 -1
  7. package/dist/engine/export/exporters/layout/StackExporter.js +26 -14
  8. package/dist/engine/export/exporters/layout/StackExporter.js.map +1 -1
  9. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts +2 -0
  10. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
  11. package/dist/engine/export/exporters/sections/BlogPostExporters.js +166 -129
  12. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
  13. package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
  14. package/dist/engine/export/exporters/sections/index.js +26 -24
  15. package/dist/engine/export/exporters/sections/index.js.map +1 -1
  16. package/dist/engine/index.js +97 -95
  17. package/dist/engine/index.js.map +1 -1
  18. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
  19. package/dist/engine/plugins/builtin/blog/manifest.js +165 -74
  20. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
  21. package/dist/engine/plugins/contentHydration.js +145 -82
  22. package/dist/engine/plugins/contentHydration.js.map +1 -1
  23. package/dist/engine/registry/blocks/layout/grid.d.ts.map +1 -1
  24. package/dist/engine/registry/blocks/layout/grid.js +22 -4
  25. package/dist/engine/registry/blocks/layout/grid.js.map +1 -1
  26. package/dist/engine/registry/blocks/layout/stack.d.ts.map +1 -1
  27. package/dist/engine/registry/blocks/layout/stack.js +15 -1
  28. package/dist/engine/registry/blocks/layout/stack.js.map +1 -1
  29. package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts +3 -0
  30. package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -0
  31. package/dist/engine/registry/blocks/sections/blogRecentPosts.js +29 -0
  32. package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -0
  33. package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts +3 -0
  34. package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -0
  35. package/dist/engine/registry/blocks/sections/blogTagCloud.js +31 -0
  36. package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -0
  37. package/dist/engine/registry/blocks/sections/index.d.ts +2 -0
  38. package/dist/engine/registry/blocks/sections/index.d.ts.map +1 -1
  39. package/dist/engine/render/renderers/layout/GridRenderer.d.ts.map +1 -1
  40. package/dist/engine/render/renderers/layout/GridRenderer.js +17 -12
  41. package/dist/engine/render/renderers/layout/GridRenderer.js.map +1 -1
  42. package/dist/engine/render/renderers/layout/StackRenderer.d.ts.map +1 -1
  43. package/dist/engine/render/renderers/layout/StackRenderer.js +36 -25
  44. package/dist/engine/render/renderers/layout/StackRenderer.js.map +1 -1
  45. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.d.ts.map +1 -1
  46. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +66 -47
  47. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -1
  48. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.d.ts +3 -0
  49. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.d.ts.map +1 -0
  50. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js +148 -0
  51. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js.map +1 -0
  52. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.d.ts +3 -0
  53. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.d.ts.map +1 -0
  54. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js +134 -0
  55. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js.map +1 -0
  56. package/dist/engine/render/renderers/sections/index.js +20 -16
  57. package/dist/engine/render/renderers/sections/index.js.map +1 -1
  58. package/dist/engine/schema/siteDocument.d.ts +61 -2
  59. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  60. package/dist/engine/schema/siteDocument.js.map +1 -1
  61. package/dist/index.d.ts +1 -1
  62. package/dist/index.d.ts.map +1 -1
  63. package/dist/index.js +108 -106
  64. package/dist/index.js.map +1 -1
  65. package/package.json +1 -1
@@ -52,6 +52,8 @@ import "../engine/registry/blocks/sections/blogSearchBar.js";
52
52
  import "../engine/registry/blocks/sections/productShowcase.js";
53
53
  import "../engine/registry/blocks/sections/aboutSection.js";
54
54
  import "../engine/registry/blocks/sections/contactSection.js";
55
+ import "../engine/registry/blocks/sections/blogRecentPosts.js";
56
+ import "../engine/registry/blocks/sections/blogTagCloud.js";
55
57
  import "../engine/registry/blocks/forms/form.js";
56
58
  import "../engine/registry/blocks/forms/input.js";
57
59
  import "../engine/registry/blocks/forms/textarea.js";
@@ -153,7 +155,7 @@ function b(t, r, c, d, l) {
153
155
  ) })
154
156
  ] }, t.id);
155
157
  }
156
- const It = A.memo(function({
158
+ const Lt = A.memo(function({
157
159
  structure: r,
158
160
  selectedBlockId: c,
159
161
  onSelectBlock: d,
@@ -204,6 +206,6 @@ const It = A.memo(function({
204
206
  ] });
205
207
  });
206
208
  export {
207
- It as BlockSelector
209
+ Lt as BlockSelector
208
210
  };
209
211
  //# sourceMappingURL=BlockSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlockSelector.js","sources":["../../src/editor/BlockSelector.tsx"],"sourcesContent":["/**\n * Block Selector\n * Lista blocos da estrutura de forma hierárquica\n */\n\nimport React, { useMemo } from 'react'\nimport { Block } from '../engine'\nimport { componentRegistry } from '../engine'\nimport { Trash2, ChevronRight } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ninterface BlockSelectorProps {\n structure: Block[]\n selectedBlockId: string | null\n onSelectBlock: (blockId: string) => void\n onDeleteBlock: (blockId: string) => void\n}\n\n/**\n * Obtém nome amigável do tipo de bloco\n */\nfunction getBlockTypeName(type: Block['type']): string {\n const definition = componentRegistry.get(type)\n return definition?.name || type\n}\n\n/**\n * Obtém preview do bloco (texto ou propriedade relevante)\n */\nfunction getBlockPreview(block: Block): string {\n const props = block.props as Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- dynamic access for preview\n\n switch (block.type) {\n case 'heading':\n return props.text || 'Heading'\n case 'text':\n return props.text ? String(props.text).substring(0, 30) + (String(props.text).length > 30 ? '...' : '') : 'Text'\n case 'button':\n return props.text || 'Button'\n case 'link':\n return props.text || 'Link'\n case 'image':\n return props.alt || props.src ? 'Image' : 'Image'\n case 'container':\n case 'stack':\n case 'grid':\n case 'box':\n return `${getBlockTypeName(block.type)} (${Array.isArray(props.children) ? props.children.length : 0} children)`\n case 'section':\n return props.id ? `Section: ${props.id}` : 'Section'\n case 'card':\n return 'Card'\n case 'divider':\n return 'Divider'\n default:\n return getBlockTypeName(block.type)\n }\n}\n\n/**\n * Renderiza um bloco e seus children recursivamente\n */\nfunction renderBlockTree(\n block: Block,\n depth: number,\n selectedBlockId: string | null,\n onSelectBlock: (blockId: string) => void,\n onDeleteBlock: (blockId: string) => void\n): React.ReactNode {\n // Verificar se o bloco é válido\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n return null\n }\n\n const isSelected = block.id === selectedBlockId\n const props = block.props as Record<string, any>\n const hasChildren = props && typeof props === 'object' && props.children && Array.isArray(props.children) && props.children.length > 0\n\n return (\n <div key={block.id}>\n <div\n className={cn(\n 'flex items-center gap-2 p-2 rounded-lg transition-all cursor-pointer group',\n 'hover:scale-[1.01] active:scale-[0.99]',\n isSelected\n ? 'bg-blue-500 text-white shadow-md shadow-blue-500/20'\n : 'bg-gray-100/50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n depth > 0 && 'ml-4'\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectBlock(block.id)}\n >\n {/* Indentação visual */}\n {depth > 0 && (\n <div className=\"flex-shrink-0 w-4 flex items-center justify-center\">\n <ChevronRight className=\"w-3 h-3 opacity-50\" />\n </div>\n )}\n\n {/* Badge de tipo */}\n <div\n className={cn(\n 'flex-shrink-0 w-6 h-6 rounded text-xs font-semibold flex items-center justify-center',\n isSelected\n ? 'bg-white/20 text-white'\n : componentRegistry.get(block.type)?.pluginId\n ? 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400'\n : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400'\n )}\n title={getBlockTypeName(block.type)}\n >\n {componentRegistry.get(block.type)?.pluginId ? '🧩' : block.type.substring(0, 2).toUpperCase()}\n </div>\n\n {/* Nome e preview */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">{getBlockTypeName(block.type)}</div>\n <div\n className={cn(\n 'text-xs truncate',\n isSelected ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {getBlockPreview(block)}\n </div>\n </div>\n\n {/* Botão deletar */}\n <button\n onClick={(e) => {\n e.stopPropagation()\n onDeleteBlock(block.id)\n }}\n className={cn(\n 'p-1.5 rounded-full transition-all opacity-0 group-hover:opacity-100',\n 'hover:bg-white/30 dark:hover:bg-gray-700/50',\n 'hover:scale-110 active:scale-95',\n isSelected\n ? 'text-white hover:bg-white/40'\n : 'text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n )}\n title=\"Deletar bloco\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Renderizar children recursivamente */}\n {hasChildren && (\n <div className=\"mt-1\">\n {props.children\n .filter((child: Block) => child && child.id && child.type) // Filtrar children inválidos\n .map((child: Block) =>\n renderBlockTree(child, depth + 1, selectedBlockId, onSelectBlock, onDeleteBlock)\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport const BlockSelector = React.memo(function BlockSelector({\n structure,\n selectedBlockId,\n onSelectBlock,\n onDeleteBlock,\n}: BlockSelectorProps) {\n // Filtrar estrutura inválida ANTES de usar\n const validStructure = useMemo(() => {\n if (!structure || !Array.isArray(structure)) return []\n return structure.filter((b) => b && typeof b === 'object' && b.id && b.type)\n }, [structure])\n\n // Contar total de blocos (incluindo children) - usando useMemo para evitar recálculos\n const totalBlocks = useMemo(() => {\n const count = (blocks: Block[]): number => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) return 0\n \n let total = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n \n // Verificar se o bloco é válido ANTES de acessar qualquer propriedade\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n continue\n }\n \n total++ // Contar o bloco atual\n \n // Verificar props de forma segura - SEMPRE dentro de try-catch\n try {\n if (!block.props) {\n continue\n }\n \n const props = block.props\n if (props && typeof props === 'object' && !Array.isArray(props)) {\n const children = (props as Record<string, any>).children\n if (children && Array.isArray(children) && children.length > 0) {\n // Filtrar children inválidos antes de contar recursivamente\n const validChildren = children.filter(\n (child: unknown) => child && typeof child === 'object' && (child as Block).id && (child as Block).type\n )\n if (validChildren.length > 0) {\n total += count(validChildren)\n }\n }\n }\n } catch (error) {\n // Se houver erro ao acessar props, apenas continuar\n continue\n }\n }\n return total\n }\n \n return count(validStructure)\n }, [validStructure])\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">Blocos</h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalBlocks} {totalBlocks === 1 ? 'bloco' : 'blocos'}\n </p>\n </div>\n\n {/* Lista de blocos */}\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {!validStructure || validStructure.length === 0 ? (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n Nenhum bloco adicionado ainda\n </div>\n ) : (\n validStructure.map((block) =>\n renderBlockTree(block, 0, selectedBlockId, onSelectBlock, onDeleteBlock)\n )\n )}\n </div>\n </div>\n )\n});\n"],"names":["getBlockTypeName","type","componentRegistry","getBlockPreview","block","props","renderBlockTree","depth","selectedBlockId","onSelectBlock","onDeleteBlock","isSelected","hasChildren","jsxs","cn","jsx","ChevronRight","Trash2","child","BlockSelector","React","structure","validStructure","useMemo","b","totalBlocks","count","blocks","total","i","children","validChildren"],"mappings":"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"}
1
+ {"version":3,"file":"BlockSelector.js","sources":["../../src/editor/BlockSelector.tsx"],"sourcesContent":["/**\n * Block Selector\n * Lista blocos da estrutura de forma hierárquica\n */\n\nimport React, { useMemo } from 'react'\nimport { Block } from '../engine'\nimport { componentRegistry } from '../engine'\nimport { Trash2, ChevronRight } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ninterface BlockSelectorProps {\n structure: Block[]\n selectedBlockId: string | null\n onSelectBlock: (blockId: string) => void\n onDeleteBlock: (blockId: string) => void\n}\n\n/**\n * Obtém nome amigável do tipo de bloco\n */\nfunction getBlockTypeName(type: Block['type']): string {\n const definition = componentRegistry.get(type)\n return definition?.name || type\n}\n\n/**\n * Obtém preview do bloco (texto ou propriedade relevante)\n */\nfunction getBlockPreview(block: Block): string {\n const props = block.props as Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- dynamic access for preview\n\n switch (block.type) {\n case 'heading':\n return props.text || 'Heading'\n case 'text':\n return props.text ? String(props.text).substring(0, 30) + (String(props.text).length > 30 ? '...' : '') : 'Text'\n case 'button':\n return props.text || 'Button'\n case 'link':\n return props.text || 'Link'\n case 'image':\n return props.alt || props.src ? 'Image' : 'Image'\n case 'container':\n case 'stack':\n case 'grid':\n case 'box':\n return `${getBlockTypeName(block.type)} (${Array.isArray(props.children) ? props.children.length : 0} children)`\n case 'section':\n return props.id ? `Section: ${props.id}` : 'Section'\n case 'card':\n return 'Card'\n case 'divider':\n return 'Divider'\n default:\n return getBlockTypeName(block.type)\n }\n}\n\n/**\n * Renderiza um bloco e seus children recursivamente\n */\nfunction renderBlockTree(\n block: Block,\n depth: number,\n selectedBlockId: string | null,\n onSelectBlock: (blockId: string) => void,\n onDeleteBlock: (blockId: string) => void\n): React.ReactNode {\n // Verificar se o bloco é válido\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n return null\n }\n\n const isSelected = block.id === selectedBlockId\n const props = block.props as Record<string, any>\n const hasChildren = props && typeof props === 'object' && props.children && Array.isArray(props.children) && props.children.length > 0\n\n return (\n <div key={block.id}>\n <div\n className={cn(\n 'flex items-center gap-2 p-2 rounded-lg transition-all cursor-pointer group',\n 'hover:scale-[1.01] active:scale-[0.99]',\n isSelected\n ? 'bg-blue-500 text-white shadow-md shadow-blue-500/20'\n : 'bg-gray-100/50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n depth > 0 && 'ml-4'\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectBlock(block.id)}\n >\n {/* Indentação visual */}\n {depth > 0 && (\n <div className=\"flex-shrink-0 w-4 flex items-center justify-center\">\n <ChevronRight className=\"w-3 h-3 opacity-50\" />\n </div>\n )}\n\n {/* Badge de tipo */}\n <div\n className={cn(\n 'flex-shrink-0 w-6 h-6 rounded text-xs font-semibold flex items-center justify-center',\n isSelected\n ? 'bg-white/20 text-white'\n : componentRegistry.get(block.type)?.pluginId\n ? 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400'\n : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400'\n )}\n title={getBlockTypeName(block.type)}\n >\n {componentRegistry.get(block.type)?.pluginId ? '🧩' : block.type.substring(0, 2).toUpperCase()}\n </div>\n\n {/* Nome e preview */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">{getBlockTypeName(block.type)}</div>\n <div\n className={cn(\n 'text-xs truncate',\n isSelected ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {getBlockPreview(block)}\n </div>\n </div>\n\n {/* Botão deletar */}\n <button\n onClick={(e) => {\n e.stopPropagation()\n onDeleteBlock(block.id)\n }}\n className={cn(\n 'p-1.5 rounded-full transition-all opacity-0 group-hover:opacity-100',\n 'hover:bg-white/30 dark:hover:bg-gray-700/50',\n 'hover:scale-110 active:scale-95',\n isSelected\n ? 'text-white hover:bg-white/40'\n : 'text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n )}\n title=\"Deletar bloco\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Renderizar children recursivamente */}\n {hasChildren && (\n <div className=\"mt-1\">\n {props.children\n .filter((child: Block) => child && child.id && child.type) // Filtrar children inválidos\n .map((child: Block) =>\n renderBlockTree(child, depth + 1, selectedBlockId, onSelectBlock, onDeleteBlock)\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport const BlockSelector = React.memo(function BlockSelector({\n structure,\n selectedBlockId,\n onSelectBlock,\n onDeleteBlock,\n}: BlockSelectorProps) {\n // Filtrar estrutura inválida ANTES de usar\n const validStructure = useMemo(() => {\n if (!structure || !Array.isArray(structure)) return []\n return structure.filter((b) => b && typeof b === 'object' && b.id && b.type)\n }, [structure])\n\n // Contar total de blocos (incluindo children) - usando useMemo para evitar recálculos\n const totalBlocks = useMemo(() => {\n const count = (blocks: Block[]): number => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) return 0\n \n let total = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n \n // Verificar se o bloco é válido ANTES de acessar qualquer propriedade\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n continue\n }\n \n total++ // Contar o bloco atual\n \n // Verificar props de forma segura - SEMPRE dentro de try-catch\n try {\n if (!block.props) {\n continue\n }\n \n const props = block.props\n if (props && typeof props === 'object' && !Array.isArray(props)) {\n const children = (props as Record<string, any>).children\n if (children && Array.isArray(children) && children.length > 0) {\n // Filtrar children inválidos antes de contar recursivamente\n const validChildren = children.filter(\n (child: unknown) => child && typeof child === 'object' && (child as Block).id && (child as Block).type\n )\n if (validChildren.length > 0) {\n total += count(validChildren)\n }\n }\n }\n } catch (error) {\n // Se houver erro ao acessar props, apenas continuar\n continue\n }\n }\n return total\n }\n \n return count(validStructure)\n }, [validStructure])\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">Blocos</h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalBlocks} {totalBlocks === 1 ? 'bloco' : 'blocos'}\n </p>\n </div>\n\n {/* Lista de blocos */}\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {!validStructure || validStructure.length === 0 ? (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n Nenhum bloco adicionado ainda\n </div>\n ) : (\n validStructure.map((block) =>\n renderBlockTree(block, 0, selectedBlockId, onSelectBlock, onDeleteBlock)\n )\n )}\n </div>\n </div>\n )\n});\n"],"names":["getBlockTypeName","type","componentRegistry","getBlockPreview","block","props","renderBlockTree","depth","selectedBlockId","onSelectBlock","onDeleteBlock","isSelected","hasChildren","jsxs","cn","jsx","ChevronRight","Trash2","child","BlockSelector","React","structure","validStructure","useMemo","b","totalBlocks","count","blocks","total","i","children","validChildren"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GridExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAQ1D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CA6BR"}
1
+ {"version":3,"file":"GridExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAS1D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAoER"}
@@ -1,18 +1,37 @@
1
- import { dataBlockIdAttr as u } from "../../shared/htmlHelpers.js";
2
- import { generateGridId as v } from "../../shared/idGenerator.js";
3
- import { resolveResponsiveColumns as y, generateResponsiveGridStyles as g } from "../../shared/responsiveGridHelper.js";
4
- function x(e, t, n, s, i) {
5
- const { cols: r = 3, gap: d = "1rem", children: p = [] } = e.props;
6
- if (!i)
1
+ import { dataBlockIdAttr as g } from "../../shared/htmlHelpers.js";
2
+ import { generateGridId as B } from "../../shared/idGenerator.js";
3
+ import { resolveResponsiveColumns as R, generateResponsiveGridStyles as j, BREAKPOINTS as A } from "../../shared/responsiveGridHelper.js";
4
+ function Q(i, h, f, y, d) {
5
+ const { cols: r = 3, colTemplate: o, gap: p = "1rem", maxWidth: l, padding: s, children: v = [] } = i.props;
6
+ if (!d)
7
7
  throw new Error("exportGrid requires renderChild function");
8
- const o = v(e.id || ""), m = y(r, 1, 2, typeof r == "number" ? r : 3), { inlineStyles: l, mediaQueries: c } = g(
9
- o,
10
- m,
11
- d
12
- ), f = p.map((a) => i(a, t + 1, n, s)).join("");
13
- return `<style>${c}</style><div id="${o}" ${u(e.id)} style="${l}">${f}</div>`;
8
+ const e = B(i.id || ""), a = v.map((n) => d(n, h + 1, f, y)).join(""), t = [];
9
+ l && (t.push(`max-width: ${l}`), t.push("margin-left: auto"), t.push("margin-right: auto")), s && (t.push(`padding-left: ${s}`), t.push(`padding-right: ${s}`));
10
+ const m = t.length > 0, $ = t.join("; ");
11
+ if (o) {
12
+ const n = `display: grid; gap: ${p};`, G = `
13
+ /* Base: Mobile 1 coluna */
14
+ #${e} {
15
+ grid-template-columns: 1fr;
16
+ }
17
+
18
+ /* Desktop: template customizado */
19
+ @media (min-width: ${A.md}) {
20
+ #${e} {
21
+ grid-template-columns: ${o};
22
+ }
23
+ }
24
+ `.trim(), u = `<div id="${e}" ${g(i.id)} style="${n}">${a}</div>`, I = m ? `<div style="${$}">${u}</div>` : u;
25
+ return `<style>${G}</style>${I}`;
26
+ }
27
+ const w = R(r, 1, 2, typeof r == "number" ? r : 3), { inlineStyles: x, mediaQueries: H } = j(
28
+ e,
29
+ w,
30
+ p
31
+ ), c = `<div id="${e}" ${g(i.id)} style="${x}">${a}</div>`, S = m ? `<div style="${$}">${c}</div>` : c;
32
+ return `<style>${H}</style>${S}`;
14
33
  }
15
34
  export {
16
- x as exportGrid
35
+ Q as exportGrid
17
36
  };
18
37
  //# sourceMappingURL=GridExporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GridExporter.js","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"sourcesContent":["/**\n * Grid Block Exporter\n * Sistema responsivo mobile-first com media queries\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateGridId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n} from \"../../shared/responsiveGridHelper\";\n\nexport function exportGrid(\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 { cols = 3, gap = \"1rem\", children = [] } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportGrid requires renderChild function\");\n }\n\n // Gerar ID único para este grid\n const gridId = generateGridId(block.id || \"\");\n\n // Resolver configuração responsiva\n // Se cols é número: converte para {sm: 1, md: 2, lg: cols}\n // Se cols é objeto: usa valores fornecidos com defaults\n const responsiveConfig = resolveResponsiveColumns(cols, 1, 2, typeof cols === \"number\" ? cols : 3);\n\n // Gerar estilos inline (base mobile) + media queries\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(\n gridId,\n responsiveConfig,\n gap,\n );\n\n // Renderizar filhos\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n // Retornar: <style> com media queries + grid HTML\n return `<style>${mediaQueries}</style><div id=\"${gridId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n}\n"],"names":["exportGrid","block","depth","basePath","theme","renderChild","cols","gap","children","gridId","generateGridId","responsiveConfig","resolveResponsiveColumns","inlineStyles","mediaQueries","generateResponsiveGridStyles","childrenHtml","c","dataBlockIdAttr"],"mappings":";;;AAcO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM,EAAE,MAAAC,IAAO,GAAG,KAAAC,IAAM,QAAQ,UAAAC,IAAW,CAAA,MAAQP,EAAc;AAEjE,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,0CAA0C;AAI5D,QAAMI,IAASC,EAAeT,EAAM,MAAM,EAAE,GAKtCU,IAAmBC,EAAyBN,GAAM,GAAG,GAAG,OAAOA,KAAS,WAAWA,IAAO,CAAC,GAG3F,EAAE,cAAAO,GAAc,cAAAC,EAAA,IAAiBC;AAAA,IACrCN;AAAA,IACAE;AAAA,IACAJ;AAAA,EAAA,GAIIS,IAAeR,EAClB,IAAI,CAACS,MAAaZ,EAAYY,GAAGf,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE;AAGV,SAAO,UAAUU,CAAY,oBAAoBL,CAAM,KAAKS,EAAgBjB,EAAM,EAAE,CAAC,WAAWY,CAAY,KAAKG,CAAY;AAC/H;"}
1
+ {"version":3,"file":"GridExporter.js","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"sourcesContent":["/**\n * Grid Block Exporter\n * Sistema responsivo mobile-first com media queries\n * Suporte a colTemplate para templates customizados (ex: \"1fr 320px\")\n * Suporte a maxWidth e padding para espaçamento\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateGridId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n BREAKPOINTS,\n} from \"../../shared/responsiveGridHelper\";\n\nexport function exportGrid(\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 { cols = 3, colTemplate, gap = \"1rem\", maxWidth, padding, children = [] } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportGrid requires renderChild function\");\n }\n\n // Gerar ID único para este grid\n const gridId = generateGridId(block.id || \"\");\n\n // Renderizar filhos\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n // Wrapper styles for maxWidth + padding\n const wrapperParts: string[] = [];\n if (maxWidth) {\n wrapperParts.push(`max-width: ${maxWidth}`);\n wrapperParts.push(\"margin-left: auto\");\n wrapperParts.push(\"margin-right: auto\");\n }\n if (padding) {\n wrapperParts.push(`padding-left: ${padding}`);\n wrapperParts.push(`padding-right: ${padding}`);\n }\n const hasWrapper = wrapperParts.length > 0;\n const wrapperStyle = wrapperParts.join(\"; \");\n\n // Se colTemplate está definido, usar template customizado com responsive\n if (colTemplate) {\n const inlineStyles = `display: grid; gap: ${gap};`;\n const mediaQueries = `\n /* Base: Mobile 1 coluna */\n #${gridId} {\n grid-template-columns: 1fr;\n }\n\n /* Desktop: template customizado */\n @media (min-width: ${BREAKPOINTS.md}) {\n #${gridId} {\n grid-template-columns: ${colTemplate};\n }\n }\n `.trim();\n\n const gridHtml = `<div id=\"${gridId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n const wrappedHtml = hasWrapper\n ? `<div style=\"${wrapperStyle}\">${gridHtml}</div>`\n : gridHtml;\n\n return `<style>${mediaQueries}</style>${wrappedHtml}`;\n }\n\n // Comportamento padrão: resolver configuração responsiva\n const responsiveConfig = resolveResponsiveColumns(cols, 1, 2, typeof cols === \"number\" ? cols : 3);\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(\n gridId,\n responsiveConfig,\n gap,\n );\n\n const gridHtml = `<div id=\"${gridId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n const wrappedHtml = hasWrapper\n ? `<div style=\"${wrapperStyle}\">${gridHtml}</div>`\n : gridHtml;\n\n return `<style>${mediaQueries}</style>${wrappedHtml}`;\n}\n"],"names":["exportGrid","block","depth","basePath","theme","renderChild","cols","colTemplate","gap","maxWidth","padding","children","gridId","generateGridId","childrenHtml","c","wrapperParts","hasWrapper","wrapperStyle","inlineStyles","mediaQueries","BREAKPOINTS","gridHtml","dataBlockIdAttr","wrappedHtml","responsiveConfig","resolveResponsiveColumns","generateResponsiveGridStyles"],"mappings":";;;AAiBO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM,EAAE,MAAAC,IAAO,GAAG,aAAAC,GAAa,KAAAC,IAAM,QAAQ,UAAAC,GAAU,SAAAC,GAAS,UAAAC,IAAW,GAAC,IAAOV,EAAc;AAEjG,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,0CAA0C;AAI5D,QAAMO,IAASC,EAAeZ,EAAM,MAAM,EAAE,GAGtCa,IAAeH,EAClB,IAAI,CAACI,MAAaV,EAAYU,GAAGb,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE,GAGJY,IAAyB,CAAA;AAC/B,EAAIP,MACFO,EAAa,KAAK,cAAcP,CAAQ,EAAE,GAC1CO,EAAa,KAAK,mBAAmB,GACrCA,EAAa,KAAK,oBAAoB,IAEpCN,MACFM,EAAa,KAAK,iBAAiBN,CAAO,EAAE,GAC5CM,EAAa,KAAK,kBAAkBN,CAAO,EAAE;AAE/C,QAAMO,IAAaD,EAAa,SAAS,GACnCE,IAAeF,EAAa,KAAK,IAAI;AAG3C,MAAIT,GAAa;AACf,UAAMY,IAAe,uBAAuBX,CAAG,KACzCY,IAAe;AAAA;AAAA,OAElBR,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKYS,EAAY,EAAE;AAAA,SAC9BT,CAAM;AAAA,iCACkBL,CAAW;AAAA;AAAA;AAAA,IAGxC,KAAA,GAEMe,IAAW,YAAYV,CAAM,KAAKW,EAAgBtB,EAAM,EAAE,CAAC,WAAWkB,CAAY,KAAKL,CAAY,UACnGU,IAAcP,IAChB,eAAeC,CAAY,KAAKI,CAAQ,WACxCA;AAEJ,WAAO,UAAUF,CAAY,WAAWI,CAAW;AAAA,EACrD;AAGA,QAAMC,IAAmBC,EAAyBpB,GAAM,GAAG,GAAG,OAAOA,KAAS,WAAWA,IAAO,CAAC,GAC3F,EAAE,cAAAa,GAAc,cAAAC,EAAA,IAAiBO;AAAA,IACrCf;AAAA,IACAa;AAAA,IACAjB;AAAA,EAAA,GAGIc,IAAW,YAAYV,CAAM,KAAKW,EAAgBtB,EAAM,EAAE,CAAC,WAAWkB,CAAY,KAAKL,CAAY,UACnGU,IAAcP,IAChB,eAAeC,CAAY,KAAKI,CAAQ,WACxCA;AAEJ,SAAO,UAAUF,CAAY,WAAWI,CAAW;AACrD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"StackExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/StackExporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK1D,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAsDR"}
1
+ {"version":3,"file":"StackExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/StackExporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK1D,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAuER"}
@@ -1,21 +1,33 @@
1
- import { dataBlockIdAttr as p } from "../../shared/htmlHelpers.js";
1
+ import { dataBlockIdAttr as f } from "../../shared/htmlHelpers.js";
2
2
  import { generateScopedId as v } from "../../shared/idGenerator.js";
3
- import { generateFlexDirectionMediaQueries as I } from "../../shared/responsiveGridHelper.js";
4
- function F(e, f, m, u, n) {
3
+ import { generateFlexDirectionMediaQueries as D, BREAKPOINTS as A } from "../../shared/responsiveGridHelper.js";
4
+ function M(t, m, $, x, s) {
5
5
  const {
6
- direction: i = "col",
7
- gap: $ = "1rem",
8
- align: r = "stretch",
9
- justify: t = "start",
10
- wrap: w = !1,
11
- children: x = []
12
- } = e.props;
13
- if (!n)
6
+ direction: o = "col",
7
+ gap: u = "1rem",
8
+ align: i = "stretch",
9
+ justify: e = "start",
10
+ wrap: y = !1,
11
+ sticky: c = !1,
12
+ stickyOffset: w = "80px",
13
+ children: g = []
14
+ } = t.props;
15
+ if (!s)
14
16
  throw new Error("exportStack requires renderChild function");
15
- const o = v(e.id || "", "stack"), s = i === "row", c = "column", y = i === "row" ? "row" : "column", g = r === "start" ? "flex-start" : r === "end" ? "flex-end" : r === "center" ? "center" : "stretch", h = t === "start" ? "flex-start" : t === "end" ? "flex-end" : t === "center" ? "center" : t === "space-between" ? "space-between" : "space-around", a = s ? I(o, c, y) : "", d = x.map((j) => n(j, f + 1, m, u)).join(""), l = `display: flex; flex-direction: ${c}; gap: ${$}; align-items: ${g}; justify-content: ${h}; flex-wrap: ${w ? "wrap" : "nowrap"};`;
16
- return a ? `<style>${a}</style><div id="${o}" ${p(e.id)} style="${l}">${d}</div>` : `<div ${p(e.id)} style="${l}">${d}</div>`;
17
+ const n = v(t.id || "", "stack"), a = o === "row", l = "column", h = o === "row" ? "row" : "column", k = i === "start" ? "flex-start" : i === "end" ? "flex-end" : i === "center" ? "center" : "stretch", I = e === "start" ? "flex-start" : e === "end" ? "flex-end" : e === "center" ? "center" : e === "space-between" ? "space-between" : "space-around";
18
+ let r = a ? D(n, l, h) : "";
19
+ const S = c ? ` position: sticky; top: ${w}; align-self: flex-start;` : "";
20
+ c && (r += `
21
+ @media (max-width: ${A.md}) {
22
+ #${n} {
23
+ position: static !important;
24
+ align-self: stretch !important;
25
+ }
26
+ }`);
27
+ const d = g.map((j) => s(j, m + 1, $, x)).join(""), p = `display: flex; flex-direction: ${l}; gap: ${u}; align-items: ${k}; justify-content: ${I}; flex-wrap: ${y ? "wrap" : "nowrap"};${S}`;
28
+ return r ? `<style>${r}</style><div id="${n}" ${f(t.id)} style="${p}">${d}</div>` : `<div ${f(t.id)} style="${p}">${d}</div>`;
17
29
  }
18
30
  export {
19
- F as exportStack
31
+ M as exportStack
20
32
  };
21
33
  //# sourceMappingURL=StackExporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StackExporter.js","sources":["../../../../../src/engine/export/exporters/layout/StackExporter.ts"],"sourcesContent":["/**\n * Stack Block Exporter\n * Responsive direction: column (mobile) → row (desktop) when direction=\"row\"\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport { generateFlexDirectionMediaQueries, BREAKPOINTS } from \"../../shared/responsiveGridHelper\";\n\nexport function exportStack(\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 direction = \"col\",\n gap = \"1rem\",\n align = \"stretch\",\n justify = \"start\",\n wrap = false,\n children = [],\n } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportStack requires renderChild function\");\n }\n\n const stackId = generateScopedId(block.id || \"\", \"stack\");\n\n // Mobile-first: se direction=\"row\", começa column em mobile e vira row em desktop\n const isMobileFirst = direction === \"row\";\n const mobileDirection = isMobileFirst ? \"column\" : \"column\";\n const desktopDirection = direction === \"row\" ? \"row\" : \"column\";\n\n const alignItems =\n align === \"start\"\n ? \"flex-start\"\n : align === \"end\"\n ? \"flex-end\"\n : align === \"center\"\n ? \"center\"\n : \"stretch\";\n const justifyContent =\n justify === \"start\"\n ? \"flex-start\"\n : justify === \"end\"\n ? \"flex-end\"\n : justify === \"center\"\n ? \"center\"\n : justify === \"space-between\"\n ? \"space-between\"\n : \"space-around\";\n\n // Media queries apenas se for responsivo (row em desktop)\n const mediaQueries = isMobileFirst\n ? generateFlexDirectionMediaQueries(stackId, mobileDirection as any, desktopDirection as any)\n : \"\";\n\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n const inlineStyles = `display: flex; flex-direction: ${mobileDirection}; gap: ${gap}; align-items: ${alignItems}; justify-content: ${justifyContent}; flex-wrap: ${wrap ? \"wrap\" : \"nowrap\"};`;\n\n return mediaQueries\n ? `<style>${mediaQueries}</style><div id=\"${stackId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`\n : `<div ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n}\n"],"names":["exportStack","block","depth","basePath","theme","renderChild","direction","gap","align","justify","wrap","children","stackId","generateScopedId","isMobileFirst","mobileDirection","desktopDirection","alignItems","justifyContent","mediaQueries","generateFlexDirectionMediaQueries","childrenHtml","c","inlineStyles","dataBlockIdAttr"],"mappings":";;;AAWO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,WAAAC,IAAY;AAAA,IACZ,KAAAC,IAAM;AAAA,IACN,OAAAC,IAAQ;AAAA,IACR,SAAAC,IAAU;AAAA,IACV,MAAAC,IAAO;AAAA,IACP,UAAAC,IAAW,CAAA;AAAA,EAAC,IACTV,EAAc;AAEnB,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,2CAA2C;AAG7D,QAAMO,IAAUC,EAAiBZ,EAAM,MAAM,IAAI,OAAO,GAGlDa,IAAgBR,MAAc,OAC9BS,IAAkC,UAClCC,IAAmBV,MAAc,QAAQ,QAAQ,UAEjDW,IACJT,MAAU,UACN,eACAA,MAAU,QACR,aACAA,MAAU,WACR,WACA,WACJU,IACJT,MAAY,UACR,eACAA,MAAY,QACV,aACAA,MAAY,WACV,WACAA,MAAY,kBACV,kBACA,gBAGNU,IAAeL,IACjBM,EAAkCR,GAASG,GAAwBC,CAAuB,IAC1F,IAEEK,IAAeV,EAClB,IAAI,CAACW,MAAajB,EAAYiB,GAAGpB,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE,GAEJmB,IAAe,kCAAkCR,CAAe,UAAUR,CAAG,kBAAkBU,CAAU,sBAAsBC,CAAc,gBAAgBR,IAAO,SAAS,QAAQ;AAE3L,SAAOS,IACH,UAAUA,CAAY,oBAAoBP,CAAO,KAAKY,EAAgBvB,EAAM,EAAE,CAAC,WAAWsB,CAAY,KAAKF,CAAY,WACvH,QAAQG,EAAgBvB,EAAM,EAAE,CAAC,WAAWsB,CAAY,KAAKF,CAAY;AAC/E;"}
1
+ {"version":3,"file":"StackExporter.js","sources":["../../../../../src/engine/export/exporters/layout/StackExporter.ts"],"sourcesContent":["/**\n * Stack Block Exporter\n * Responsive direction: column (mobile) → row (desktop) when direction=\"row\"\n * Suporte a sticky positioning para sidebars\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport { generateFlexDirectionMediaQueries, BREAKPOINTS } from \"../../shared/responsiveGridHelper\";\n\nexport function exportStack(\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 direction = \"col\",\n gap = \"1rem\",\n align = \"stretch\",\n justify = \"start\",\n wrap = false,\n sticky = false,\n stickyOffset = \"80px\",\n children = [],\n } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportStack requires renderChild function\");\n }\n\n const stackId = generateScopedId(block.id || \"\", \"stack\");\n\n // Mobile-first: se direction=\"row\", começa column em mobile e vira row em desktop\n const isMobileFirst = direction === \"row\";\n const mobileDirection = isMobileFirst ? \"column\" : \"column\";\n const desktopDirection = direction === \"row\" ? \"row\" : \"column\";\n\n const alignItems =\n align === \"start\"\n ? \"flex-start\"\n : align === \"end\"\n ? \"flex-end\"\n : align === \"center\"\n ? \"center\"\n : \"stretch\";\n const justifyContent =\n justify === \"start\"\n ? \"flex-start\"\n : justify === \"end\"\n ? \"flex-end\"\n : justify === \"center\"\n ? \"center\"\n : justify === \"space-between\"\n ? \"space-between\"\n : \"space-around\";\n\n // Media queries for responsive direction\n let mediaQueries = isMobileFirst\n ? generateFlexDirectionMediaQueries(stackId, mobileDirection as any, desktopDirection as any)\n : \"\";\n\n // Sticky: add position sticky on desktop, disable on mobile\n const stickyInline = sticky\n ? ` position: sticky; top: ${stickyOffset}; align-self: flex-start;`\n : \"\";\n\n if (sticky) {\n mediaQueries += `\n @media (max-width: ${BREAKPOINTS.md}) {\n #${stackId} {\n position: static !important;\n align-self: stretch !important;\n }\n }`;\n }\n\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n const inlineStyles = `display: flex; flex-direction: ${mobileDirection}; gap: ${gap}; align-items: ${alignItems}; justify-content: ${justifyContent}; flex-wrap: ${wrap ? \"wrap\" : \"nowrap\"};${stickyInline}`;\n\n return mediaQueries\n ? `<style>${mediaQueries}</style><div id=\"${stackId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`\n : `<div ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n}\n"],"names":["exportStack","block","depth","basePath","theme","renderChild","direction","gap","align","justify","wrap","sticky","stickyOffset","children","stackId","generateScopedId","isMobileFirst","mobileDirection","desktopDirection","alignItems","justifyContent","mediaQueries","generateFlexDirectionMediaQueries","stickyInline","BREAKPOINTS","childrenHtml","c","inlineStyles","dataBlockIdAttr"],"mappings":";;;AAYO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,WAAAC,IAAY;AAAA,IACZ,KAAAC,IAAM;AAAA,IACN,OAAAC,IAAQ;AAAA,IACR,SAAAC,IAAU;AAAA,IACV,MAAAC,IAAO;AAAA,IACP,QAAAC,IAAS;AAAA,IACT,cAAAC,IAAe;AAAA,IACf,UAAAC,IAAW,CAAA;AAAA,EAAC,IACTZ,EAAc;AAEnB,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,2CAA2C;AAG7D,QAAMS,IAAUC,EAAiBd,EAAM,MAAM,IAAI,OAAO,GAGlDe,IAAgBV,MAAc,OAC9BW,IAAkC,UAClCC,IAAmBZ,MAAc,QAAQ,QAAQ,UAEjDa,IACJX,MAAU,UACN,eACAA,MAAU,QACR,aACAA,MAAU,WACR,WACA,WACJY,IACJX,MAAY,UACR,eACAA,MAAY,QACV,aACAA,MAAY,WACV,WACAA,MAAY,kBACV,kBACA;AAGZ,MAAIY,IAAeL,IACfM,EAAkCR,GAASG,GAAwBC,CAAuB,IAC1F;AAGJ,QAAMK,IAAeZ,IACjB,2BAA2BC,CAAY,8BACvC;AAEJ,EAAID,MACFU,KAAgB;AAAA,yBACKG,EAAY,EAAE;AAAA,SAC9BV,CAAO;AAAA;AAAA;AAAA;AAAA;AAOd,QAAMW,IAAeZ,EAClB,IAAI,CAACa,MAAarB,EAAYqB,GAAGxB,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE,GAEJuB,IAAe,kCAAkCV,CAAe,UAAUV,CAAG,kBAAkBY,CAAU,sBAAsBC,CAAc,gBAAgBV,IAAO,SAAS,QAAQ,IAAIa,CAAY;AAE3M,SAAOF,IACH,UAAUA,CAAY,oBAAoBP,CAAO,KAAKc,EAAgB3B,EAAM,EAAE,CAAC,WAAW0B,CAAY,KAAKF,CAAY,WACvH,QAAQG,EAAgB3B,EAAM,EAAE,CAAC,WAAW0B,CAAY,KAAKF,CAAY;AAC/E;"}
@@ -5,4 +5,6 @@ export declare function exportBlogPostGrid(block: Block, depth: number, basePath
5
5
  export declare function exportBlogPostDetail(block: Block, depth: number, basePath?: string, theme?: ThemeTokens): string;
6
6
  export declare function exportBlogCategoryFilter(block: Block, _depth: number, _basePath?: string, _theme?: ThemeTokens): string;
7
7
  export declare function exportBlogSearchBar(block: Block, _depth: number, _basePath?: string, _theme?: ThemeTokens): string;
8
+ export declare function exportBlogRecentPosts(block: Block, _depth: number, _basePath?: string, _theme?: ThemeTokens): string;
9
+ export declare function exportBlogTagCloud(block: Block, _depth: number, _basePath?: string, _theme?: ThemeTokens): string;
8
10
  //# sourceMappingURL=BlogPostExporters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BlogPostExporters.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/BlogPostExporters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAY1D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAgGR;AAsED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAyDR;AAMD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAyER;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAuER;AAMD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CA4CR"}
1
+ {"version":3,"file":"BlogPostExporters.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/BlogPostExporters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAY1D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAgGR;AAsED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAyDR;AAMD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAoFR;AAMD,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAuER;AAMD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CA4CR;AAMD,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAsCR;AAMD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,WAAW,GACnB,MAAM,CAiCR"}