@brunoalz/smartgesti-site-editor 1.12.0 → 1.13.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 (58) hide show
  1. package/dist/editor/LandingPageEditor.d.ts.map +1 -1
  2. package/dist/editor/LandingPageEditor.js.map +1 -1
  3. package/dist/engine/export/exporters/layout/ContainerExporter.js.map +1 -1
  4. package/dist/engine/export/exporters/layout/SectionExporter.js.map +1 -1
  5. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.d.ts +3 -0
  6. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.d.ts.map +1 -0
  7. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.js +18 -0
  8. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.js.map +1 -0
  9. package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
  10. package/dist/engine/export/exporters/sections/index.js +15 -13
  11. package/dist/engine/export/exporters/sections/index.js.map +1 -1
  12. package/dist/engine/export/styleResolver.d.ts.map +1 -1
  13. package/dist/engine/export/styleResolver.js.map +1 -1
  14. package/dist/engine/plugins/pluginRegistry.d.ts.map +1 -1
  15. package/dist/engine/plugins/pluginRegistry.js.map +1 -1
  16. package/dist/engine/plugins/types.d.ts.map +1 -1
  17. package/dist/engine/render/registry/renderRegistry.d.ts.map +1 -1
  18. package/dist/engine/render/registry/renderRegistry.js.map +1 -1
  19. package/dist/engine/render/renderNodeImpl.d.ts.map +1 -1
  20. package/dist/engine/render/renderNodeImpl.js +14 -503
  21. package/dist/engine/render/renderNodeImpl.js.map +1 -1
  22. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.d.ts +4 -0
  23. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.d.ts.map +1 -0
  24. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.js +38 -0
  25. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.js.map +1 -0
  26. package/dist/engine/render/renderers/sections/BlogCardRenderer.d.ts +4 -0
  27. package/dist/engine/render/renderers/sections/BlogCardRenderer.d.ts.map +1 -0
  28. package/dist/engine/render/renderers/sections/BlogCardRenderer.js +90 -0
  29. package/dist/engine/render/renderers/sections/BlogCardRenderer.js.map +1 -0
  30. package/dist/engine/render/renderers/sections/CarouselRenderer.d.ts +4 -0
  31. package/dist/engine/render/renderers/sections/CarouselRenderer.d.ts.map +1 -0
  32. package/dist/engine/render/renderers/sections/CarouselRenderer.js +64 -0
  33. package/dist/engine/render/renderers/sections/CarouselRenderer.js.map +1 -0
  34. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.d.ts +4 -0
  35. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.d.ts.map +1 -0
  36. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.js +54 -0
  37. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.js.map +1 -0
  38. package/dist/engine/render/renderers/sections/CountdownRenderer.d.ts +4 -0
  39. package/dist/engine/render/renderers/sections/CountdownRenderer.d.ts.map +1 -0
  40. package/dist/engine/render/renderers/sections/CountdownRenderer.js +91 -0
  41. package/dist/engine/render/renderers/sections/CountdownRenderer.js.map +1 -0
  42. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.d.ts +4 -0
  43. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.d.ts.map +1 -0
  44. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.js +76 -0
  45. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.js.map +1 -0
  46. package/dist/engine/render/renderers/sections/TeamCardRenderer.d.ts +4 -0
  47. package/dist/engine/render/renderers/sections/TeamCardRenderer.d.ts.map +1 -0
  48. package/dist/engine/render/renderers/sections/TeamCardRenderer.js +59 -0
  49. package/dist/engine/render/renderers/sections/TeamCardRenderer.js.map +1 -0
  50. package/dist/engine/render/renderers/sections/TeamGridRenderer.d.ts +4 -0
  51. package/dist/engine/render/renderers/sections/TeamGridRenderer.d.ts.map +1 -0
  52. package/dist/engine/render/renderers/sections/TeamGridRenderer.js +38 -0
  53. package/dist/engine/render/renderers/sections/TeamGridRenderer.js.map +1 -0
  54. package/dist/engine/render/renderers/sections/index.js +54 -38
  55. package/dist/engine/render/renderers/sections/index.js.map +1 -1
  56. package/dist/engine/shared/hoverEffects/buttonHover.d.ts.map +1 -1
  57. package/dist/engine/shared/hoverEffects/buttonHover.js.map +1 -1
  58. package/package.json +5 -2
@@ -1 +1 @@
1
- {"version":3,"file":"LandingPageEditor.d.ts","sourceRoot":"","sources":["../../src/editor/LandingPageEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,YAAY,EAAuB,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,sBAAsB,2CAgWxB"}
1
+ {"version":3,"file":"LandingPageEditor.d.ts","sourceRoot":"","sources":["../../src/editor/LandingPageEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAgB,MAAM,WAAW,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,sBAAsB,2CAgWxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"LandingPageEditor.js","sources":["../../src/editor/LandingPageEditor.tsx"],"sourcesContent":["/**\n * Landing Page Editor\n * Editor de landing pages usando block engine\n */\n\nimport { useState, useCallback, useEffect, lazy, Suspense } from \"react\";\nimport { TemplatePicker } from \"./TemplatePicker\";\nimport { Toolbar, LeftPanel, CenterPanel, RightPanel } from \"./components\";\nimport { useEditorState } from \"../hooks/useEditorState\";\nimport { useKeyboardShortcuts } from \"../hooks/useKeyboardShortcuts\";\nimport { LoadingSpinner } from \"./components/LoadingSpinner\";\nimport { SiteDocument, PatchBuilder, Block } from \"../engine\";\nimport { getTemplate, templateDefaultPalette } from \"../shared/templates\";\nimport type { TemplateId } from \"../shared/templates\";\nimport { findPaletteByName } from \"./PaletteSelector\";\nimport { sharedTemplateToEngineDocument } from \"../utils/sharedTemplateToEngine\";\nimport { findBlockInStructure } from \"../utils/blockUtils\";\nimport { derivePaletteColors } from \"../utils/colorUtils\";\nimport { logger } from \"../utils/logger\";\nimport { processBlockDataURLs } from \"../utils/dataURLUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UploadConfig {\n tenantId?: string;\n schoolId?: string;\n siteId?: string | null;\n authToken?: string;\n}\n\nexport interface LandingPageEditorProps {\n initialData?: SiteDocument;\n /** ID do template a carregar quando não houver initialData (ex.: \"escola-edvi\") */\n defaultTemplateId?: TemplateId;\n onSave?: (data: SiteDocument) => Promise<void>;\n onPublish?: (data: SiteDocument) => Promise<void>;\n /** Configuração para upload seguro de imagens/vídeos */\n uploadConfig?: UploadConfig;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LandingPageEditor({\n initialData,\n defaultTemplateId,\n onSave,\n onPublish,\n uploadConfig,\n}: LandingPageEditorProps) {\n // Hook de estado do editor (edição por páginas; sem navegação)\n const {\n document,\n currentPageId,\n currentPage,\n selectedBlockId,\n selectedBlock,\n history,\n setCurrentPageId,\n addPage,\n removePage,\n canRemovePage,\n setSelectedBlockId,\n handleUndo,\n handleRedo,\n handleAddBlock,\n handleDeleteBlock,\n handleUpdateBlock,\n applyChange,\n resetToTemplate,\n isPaletteSelected,\n loadDocument,\n selectedPalette,\n setSelectedPalette,\n activePlugins,\n activatePlugin,\n deactivatePlugin,\n } = useEditorState({ initialData });\n\n // Estado local da UI\n const [isSaving, setIsSaving] = useState(false);\n const [currentTemplateId, setCurrentTemplateId] = useState<TemplateId | null>(\n null,\n );\n const [focusedGroup, setFocusedGroup] = useState<string | null>(null);\n const [showSelectionOverlay, setShowSelectionOverlay] = useState(false);\n\n // Carregar template escolhido (converter shared → engine e carregar no editor)\n const handleSelectTemplate = useCallback(\n (templateId: TemplateId) => {\n const sharedDoc = getTemplate(templateId);\n if (!sharedDoc) return;\n const engineDoc = sharedTemplateToEngineDocument(sharedDoc);\n loadDocument(engineDoc);\n setCurrentTemplateId(templateId);\n\n // Auto-selecionar paleta correspondente ao template\n const paletteName = templateDefaultPalette[templateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n },\n [loadDocument, setSelectedPalette],\n );\n\n // Ao montar sem documento: carregar defaultTemplateId se informado\n useEffect(() => {\n if (!document && defaultTemplateId) {\n handleSelectTemplate(defaultTemplateId);\n }\n }, [defaultTemplateId]); // eslint-disable-line react-hooks/exhaustive-deps -- carregar só uma vez quando defaultTemplateId existe\n\n // Handlers de save/publish\n const handleSave = async () => {\n if (!document || !onSave || !uploadConfig) return;\n setIsSaving(true);\n try {\n // Processar o documento para fazer upload de todos os Data URLs\n const processedPages = await Promise.all(\n (document.pages || []).map(async (page) => ({\n ...page,\n structure: await Promise.all(\n (page.structure || []).map((block) => processBlockDataURLs(block, uploadConfig))\n ),\n }))\n );\n\n const processedDocument = {\n ...document,\n pages: processedPages,\n };\n\n await onSave(processedDocument);\n } catch (error) {\n logger.error(\"Error saving:\", error);\n throw error;\n } finally {\n setIsSaving(false);\n }\n };\n\n const handlePublish = async () => {\n if (!document || !onPublish) return;\n setIsSaving(true);\n try {\n await onPublish(document);\n } catch (error) {\n logger.error(\"Error publishing:\", error);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Handler para atualizar um bloco específico\n const handleUpdateBlockById = useCallback(\n (blockId: string, updates: Record<string, any>) => {\n if (!document || !currentPage) return;\n const pageId = (currentPage as any).id;\n if (!pageId) return;\n\n try {\n const patch = PatchBuilder.updateBlockProps(\n document,\n pageId,\n blockId,\n updates\n );\n if (patch?.length) {\n applyChange(patch, \"Update block properties\");\n }\n } catch (error) {\n logger.error(\"Error updating block:\", error);\n }\n },\n [document, currentPage, applyChange]\n );\n\n // Handler para atualizar paleta de cores\n // Usa derivePaletteColors() para derivar todas as cores e patcha Hero/Navbar/Footer alem do theme\n const handlePaletteChange = useCallback((palette: any) => {\n if (!document) return;\n const derived = derivePaletteColors(palette);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allPatches: Array<{ op: \"replace\"; path: string; value: any }> = [];\n\n // 1. Theme color updates\n for (const [key, value] of Object.entries(derived.themeColors)) {\n allPatches.push({ op: \"replace\", path: `/theme/colors/${key}`, value });\n }\n\n // 2. Block-level patches (todas as paginas)\n // Hero variations that use dark gradient backgrounds\n const darkGradientVariations = new Set([\n \"hero-gradient\", \"hero-parallax\", \"hero-overlay\", \"hero-carousel\",\n ]);\n // Blog widget types que recebem cores da paleta\n const blogWidgetTypes = new Set([\n \"blogCategoryFilter\", \"blogRecentPosts\", \"blogTagCloud\",\n ]);\n\n // Recursivamente patcha blog widgets em children de grid/stack\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const patchNestedBlocks = (blocks: any[], basePath: string) => {\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n const bPath = `${basePath}/${i}/props`;\n if (blogWidgetTypes.has(b.type)) {\n allPatches.push(\n { op: \"replace\", path: `${bPath}/linkColor`, value: derived.themeColors.text },\n { op: \"replace\", path: `${bPath}/linkHoverColor`, value: derived.themeColors.primary },\n );\n }\n if (Array.isArray(b.props?.children)) {\n patchNestedBlocks(b.props.children, `${bPath}/children`);\n }\n }\n };\n\n for (let pageIdx = 0; pageIdx < document.pages.length; pageIdx++) {\n const page = document.pages[pageIdx];\n if (!page?.structure) continue;\n for (let blockIdx = 0; blockIdx < page.structure.length; blockIdx++) {\n const block = page.structure[blockIdx];\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n\n if (block.type === \"hero\") {\n const variation = (block.props as any)?.variation || \"\";\n if (darkGradientVariations.has(variation)) {\n allPatches.push(\n { op: \"replace\", path: `${base}/background`, value: `linear-gradient(135deg, ${derived.heroGradientStart} 0%, ${derived.heroGradientEnd} 100%)` },\n { op: \"replace\", path: `${base}/titleColor`, value: derived.heroTitleColor },\n { op: \"replace\", path: `${base}/subtitleColor`, value: derived.heroSubtitleColor },\n { op: \"replace\", path: `${base}/descriptionColor`, value: derived.heroDescColor },\n );\n }\n } else if (block.type === \"navbar\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/bg`, value: derived.navbarBg },\n { op: \"replace\", path: `${base}/linkColor`, value: derived.themeColors.menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: derived.themeColors.primaryText },\n );\n } else if (block.type === \"footer\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.footerLinkHover },\n );\n }\n }\n // Patchar blog widgets aninhados (dentro de grid/stack children)\n patchNestedBlocks(page.structure, `/pages/${pageIdx}/structure`);\n }\n\n applyChange(allPatches, \"Update color palette\");\n setSelectedPalette(palette.name ?? null);\n }, [document, applyChange, setSelectedPalette]);\n\n // Handler para clique no preview (com grupo opcional para scroll-to-group)\n const handleBlockClick = useCallback((blockId: string, group?: string) => {\n setSelectedBlockId(blockId);\n setFocusedGroup(group || null);\n }, [setSelectedBlockId]);\n\n // Limpar focusedGroup quando o bloco selecionado muda (via seleção no painel esquerdo, etc.)\n // Nota: handleBlockClick já define o focusedGroup corretamente quando vem do preview\n\n // No editor: cliques em links no preview não navegam; trocam a página em edição\n // Keyboard shortcuts\n useKeyboardShortcuts({\n onUndo: handleUndo,\n onRedo: handleRedo,\n onSave: handleSave,\n onDelete: () => {\n if (selectedBlockId) {\n handleDeleteBlock(selectedBlockId);\n }\n },\n onDeselect: () => setSelectedBlockId(null),\n });\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== \"editor-navigate\" || !event.data.href) return;\n const href = String(event.data.href);\n if (!document) return;\n // Links internos: /site/p/:slug ou /p/:slug\n const match = href.match(/^(?:\\/site)?\\/p\\/([^#?]+)/);\n if (match) {\n const slug = match[1];\n const page = document.pages.find((p) => p.slug === slug);\n if (page) setCurrentPageId(page.id);\n return;\n }\n // Âncora #id: selecionar bloco com esse id e trocar para a página que o contém\n if (href.startsWith(\"#\")) {\n const id = href.slice(1);\n for (const p of document.pages) {\n if (findBlockInStructure(p.structure || [], id)) {\n setCurrentPageId(p.id);\n setSelectedBlockId(id);\n break;\n }\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [document, setCurrentPageId, setSelectedBlockId]);\n\n // Sem documento: mostrar seletor de templates\n if (!document) {\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n <TemplatePicker onSelectTemplate={handleSelectTemplate} />\n </div>\n );\n }\n\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n {/* Toolbar */}\n <Toolbar\n history={history}\n isSaving={isSaving}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onSave={handleSave}\n onPublish={onPublish ? handlePublish : undefined}\n onReset={\n currentTemplateId\n ? () => {\n // Recarregar o mesmo template\n const sharedDoc = getTemplate(currentTemplateId);\n if (sharedDoc) {\n loadDocument(sharedTemplateToEngineDocument(sharedDoc));\n const paletteName = templateDefaultPalette[currentTemplateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n }\n }\n : resetToTemplate\n }\n showSelectionOverlay={showSelectionOverlay}\n onToggleSelectionOverlay={() => setShowSelectionOverlay(prev => !prev)}\n />\n\n {/* Main Content - 3 Columns */}\n <div className=\"flex-1 flex overflow-hidden min-h-0 max-h-full\">\n {/* Left: Block Selector + Paletas */}\n <LeftPanel\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n isPaletteSelected={isPaletteSelected}\n onSelectBlock={(id) => { setSelectedBlockId(id); setFocusedGroup(null); }}\n onDeleteBlock={handleDeleteBlock}\n onAddBlock={handleAddBlock}\n activePlugins={activePlugins}\n />\n\n {/* Center: Preview (apenas a página em edição) */}\n <CenterPanel\n document={document}\n currentPageId={currentPageId}\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n onBlockClick={handleBlockClick}\n onSelectPage={setCurrentPageId}\n onAddPage={() => {\n const name = prompt(\"Nome da página:\");\n if (!name) return;\n const slug = name.toLowerCase().replace(/\\s+/g, \"-\");\n const id = slug;\n addPage(id, name, slug);\n }}\n onRemovePage={removePage}\n canRemovePage={canRemovePage}\n onUpdateBlock={handleUpdateBlockById}\n activePlugins={activePlugins}\n onActivatePlugin={activatePlugin}\n onDeactivatePlugin={deactivatePlugin}\n showSelectionOverlay={showSelectionOverlay}\n focusedGroup={focusedGroup}\n />\n\n {/* Right: Editor Panel */}\n <RightPanel\n isPaletteSelected={isPaletteSelected}\n selectedBlock={selectedBlock}\n selectedPalette={selectedPalette ? findPaletteByName(selectedPalette) : undefined}\n onPaletteChange={handlePaletteChange}\n onUpdateBlock={handleUpdateBlock}\n uploadConfig={uploadConfig}\n document={document}\n currentPageId={currentPageId}\n focusedGroup={focusedGroup}\n />\n </div>\n </div>\n );\n}\n"],"names":["LandingPageEditor","initialData","defaultTemplateId","onSave","onPublish","uploadConfig","document","currentPageId","currentPage","selectedBlockId","selectedBlock","history","setCurrentPageId","addPage","removePage","canRemovePage","setSelectedBlockId","handleUndo","handleRedo","handleAddBlock","handleDeleteBlock","handleUpdateBlock","applyChange","resetToTemplate","isPaletteSelected","loadDocument","selectedPalette","setSelectedPalette","activePlugins","activatePlugin","deactivatePlugin","useEditorState","isSaving","setIsSaving","useState","currentTemplateId","setCurrentTemplateId","focusedGroup","setFocusedGroup","showSelectionOverlay","setShowSelectionOverlay","handleSelectTemplate","useCallback","templateId","sharedDoc","getTemplate","engineDoc","sharedTemplateToEngineDocument","paletteName","templateDefaultPalette","useEffect","handleSave","processedPages","page","block","processBlockDataURLs","processedDocument","error","logger","handlePublish","handleUpdateBlockById","blockId","updates","pageId","patch","PatchBuilder","handlePaletteChange","palette","derived","derivePaletteColors","allPatches","key","value","darkGradientVariations","blogWidgetTypes","patchNestedBlocks","blocks","basePath","i","b","bPath","pageIdx","blockIdx","base","variation","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","findPaletteByName","TemplatePicker"],"mappings":"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"}
1
+ {"version":3,"file":"LandingPageEditor.js","sources":["../../src/editor/LandingPageEditor.tsx"],"sourcesContent":["/**\n * Landing Page Editor\n * Editor de landing pages usando block engine\n */\n\nimport { useState, useCallback, useEffect } from \"react\";\nimport { TemplatePicker } from \"./TemplatePicker\";\nimport { Toolbar, LeftPanel, CenterPanel, RightPanel } from \"./components\";\nimport { useEditorState } from \"../hooks/useEditorState\";\nimport { useKeyboardShortcuts } from \"../hooks/useKeyboardShortcuts\";\nimport { SiteDocument, PatchBuilder } from \"../engine\";\nimport { getTemplate, templateDefaultPalette } from \"../shared/templates\";\nimport type { TemplateId } from \"../shared/templates\";\nimport { findPaletteByName } from \"./PaletteSelector\";\nimport { sharedTemplateToEngineDocument } from \"../utils/sharedTemplateToEngine\";\nimport { findBlockInStructure } from \"../utils/blockUtils\";\nimport { derivePaletteColors } from \"../utils/colorUtils\";\nimport { logger } from \"../utils/logger\";\nimport { processBlockDataURLs } from \"../utils/dataURLUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UploadConfig {\n tenantId?: string;\n schoolId?: string;\n siteId?: string | null;\n authToken?: string;\n}\n\nexport interface LandingPageEditorProps {\n initialData?: SiteDocument;\n /** ID do template a carregar quando não houver initialData (ex.: \"escola-edvi\") */\n defaultTemplateId?: TemplateId;\n onSave?: (data: SiteDocument) => Promise<void>;\n onPublish?: (data: SiteDocument) => Promise<void>;\n /** Configuração para upload seguro de imagens/vídeos */\n uploadConfig?: UploadConfig;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LandingPageEditor({\n initialData,\n defaultTemplateId,\n onSave,\n onPublish,\n uploadConfig,\n}: LandingPageEditorProps) {\n // Hook de estado do editor (edição por páginas; sem navegação)\n const {\n document,\n currentPageId,\n currentPage,\n selectedBlockId,\n selectedBlock,\n history,\n setCurrentPageId,\n addPage,\n removePage,\n canRemovePage,\n setSelectedBlockId,\n handleUndo,\n handleRedo,\n handleAddBlock,\n handleDeleteBlock,\n handleUpdateBlock,\n applyChange,\n resetToTemplate,\n isPaletteSelected,\n loadDocument,\n selectedPalette,\n setSelectedPalette,\n activePlugins,\n activatePlugin,\n deactivatePlugin,\n } = useEditorState({ initialData });\n\n // Estado local da UI\n const [isSaving, setIsSaving] = useState(false);\n const [currentTemplateId, setCurrentTemplateId] = useState<TemplateId | null>(\n null,\n );\n const [focusedGroup, setFocusedGroup] = useState<string | null>(null);\n const [showSelectionOverlay, setShowSelectionOverlay] = useState(false);\n\n // Carregar template escolhido (converter shared → engine e carregar no editor)\n const handleSelectTemplate = useCallback(\n (templateId: TemplateId) => {\n const sharedDoc = getTemplate(templateId);\n if (!sharedDoc) return;\n const engineDoc = sharedTemplateToEngineDocument(sharedDoc);\n loadDocument(engineDoc);\n setCurrentTemplateId(templateId);\n\n // Auto-selecionar paleta correspondente ao template\n const paletteName = templateDefaultPalette[templateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n },\n [loadDocument, setSelectedPalette],\n );\n\n // Ao montar sem documento: carregar defaultTemplateId se informado\n useEffect(() => {\n if (!document && defaultTemplateId) {\n handleSelectTemplate(defaultTemplateId);\n }\n }, [defaultTemplateId]); // eslint-disable-line react-hooks/exhaustive-deps -- carregar só uma vez quando defaultTemplateId existe\n\n // Handlers de save/publish\n const handleSave = async () => {\n if (!document || !onSave || !uploadConfig) return;\n setIsSaving(true);\n try {\n // Processar o documento para fazer upload de todos os Data URLs\n const processedPages = await Promise.all(\n (document.pages || []).map(async (page) => ({\n ...page,\n structure: await Promise.all(\n (page.structure || []).map((block) => processBlockDataURLs(block, uploadConfig))\n ),\n }))\n );\n\n const processedDocument = {\n ...document,\n pages: processedPages,\n };\n\n await onSave(processedDocument);\n } catch (error) {\n logger.error(\"Error saving:\", error);\n throw error;\n } finally {\n setIsSaving(false);\n }\n };\n\n const handlePublish = async () => {\n if (!document || !onPublish) return;\n setIsSaving(true);\n try {\n await onPublish(document);\n } catch (error) {\n logger.error(\"Error publishing:\", error);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Handler para atualizar um bloco específico\n const handleUpdateBlockById = useCallback(\n (blockId: string, updates: Record<string, any>) => {\n if (!document || !currentPage) return;\n const pageId = (currentPage as any).id;\n if (!pageId) return;\n\n try {\n const patch = PatchBuilder.updateBlockProps(\n document,\n pageId,\n blockId,\n updates\n );\n if (patch?.length) {\n applyChange(patch, \"Update block properties\");\n }\n } catch (error) {\n logger.error(\"Error updating block:\", error);\n }\n },\n [document, currentPage, applyChange]\n );\n\n // Handler para atualizar paleta de cores\n // Usa derivePaletteColors() para derivar todas as cores e patcha Hero/Navbar/Footer alem do theme\n const handlePaletteChange = useCallback((palette: any) => {\n if (!document) return;\n const derived = derivePaletteColors(palette);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allPatches: Array<{ op: \"replace\"; path: string; value: any }> = [];\n\n // 1. Theme color updates\n for (const [key, value] of Object.entries(derived.themeColors)) {\n allPatches.push({ op: \"replace\", path: `/theme/colors/${key}`, value });\n }\n\n // 2. Block-level patches (todas as paginas)\n // Hero variations that use dark gradient backgrounds\n const darkGradientVariations = new Set([\n \"hero-gradient\", \"hero-parallax\", \"hero-overlay\", \"hero-carousel\",\n ]);\n // Blog widget types que recebem cores da paleta\n const blogWidgetTypes = new Set([\n \"blogCategoryFilter\", \"blogRecentPosts\", \"blogTagCloud\",\n ]);\n\n // Recursivamente patcha blog widgets em children de grid/stack\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const patchNestedBlocks = (blocks: any[], basePath: string) => {\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n const bPath = `${basePath}/${i}/props`;\n if (blogWidgetTypes.has(b.type)) {\n allPatches.push(\n { op: \"replace\", path: `${bPath}/linkColor`, value: derived.themeColors.text },\n { op: \"replace\", path: `${bPath}/linkHoverColor`, value: derived.themeColors.primary },\n );\n }\n if (Array.isArray(b.props?.children)) {\n patchNestedBlocks(b.props.children, `${bPath}/children`);\n }\n }\n };\n\n for (let pageIdx = 0; pageIdx < document.pages.length; pageIdx++) {\n const page = document.pages[pageIdx];\n if (!page?.structure) continue;\n for (let blockIdx = 0; blockIdx < page.structure.length; blockIdx++) {\n const block = page.structure[blockIdx];\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n\n if (block.type === \"hero\") {\n const variation = (block.props as any)?.variation || \"\";\n if (darkGradientVariations.has(variation)) {\n allPatches.push(\n { op: \"replace\", path: `${base}/background`, value: `linear-gradient(135deg, ${derived.heroGradientStart} 0%, ${derived.heroGradientEnd} 100%)` },\n { op: \"replace\", path: `${base}/titleColor`, value: derived.heroTitleColor },\n { op: \"replace\", path: `${base}/subtitleColor`, value: derived.heroSubtitleColor },\n { op: \"replace\", path: `${base}/descriptionColor`, value: derived.heroDescColor },\n );\n }\n } else if (block.type === \"navbar\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/bg`, value: derived.navbarBg },\n { op: \"replace\", path: `${base}/linkColor`, value: derived.themeColors.menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: derived.themeColors.primaryText },\n );\n } else if (block.type === \"footer\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.footerLinkHover },\n );\n }\n }\n // Patchar blog widgets aninhados (dentro de grid/stack children)\n patchNestedBlocks(page.structure, `/pages/${pageIdx}/structure`);\n }\n\n applyChange(allPatches, \"Update color palette\");\n setSelectedPalette(palette.name ?? null);\n }, [document, applyChange, setSelectedPalette]);\n\n // Handler para clique no preview (com grupo opcional para scroll-to-group)\n const handleBlockClick = useCallback((blockId: string, group?: string) => {\n setSelectedBlockId(blockId);\n setFocusedGroup(group || null);\n }, [setSelectedBlockId]);\n\n // Limpar focusedGroup quando o bloco selecionado muda (via seleção no painel esquerdo, etc.)\n // Nota: handleBlockClick já define o focusedGroup corretamente quando vem do preview\n\n // No editor: cliques em links no preview não navegam; trocam a página em edição\n // Keyboard shortcuts\n useKeyboardShortcuts({\n onUndo: handleUndo,\n onRedo: handleRedo,\n onSave: handleSave,\n onDelete: () => {\n if (selectedBlockId) {\n handleDeleteBlock(selectedBlockId);\n }\n },\n onDeselect: () => setSelectedBlockId(null),\n });\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== \"editor-navigate\" || !event.data.href) return;\n const href = String(event.data.href);\n if (!document) return;\n // Links internos: /site/p/:slug ou /p/:slug\n const match = href.match(/^(?:\\/site)?\\/p\\/([^#?]+)/);\n if (match) {\n const slug = match[1];\n const page = document.pages.find((p) => p.slug === slug);\n if (page) setCurrentPageId(page.id);\n return;\n }\n // Âncora #id: selecionar bloco com esse id e trocar para a página que o contém\n if (href.startsWith(\"#\")) {\n const id = href.slice(1);\n for (const p of document.pages) {\n if (findBlockInStructure(p.structure || [], id)) {\n setCurrentPageId(p.id);\n setSelectedBlockId(id);\n break;\n }\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [document, setCurrentPageId, setSelectedBlockId]);\n\n // Sem documento: mostrar seletor de templates\n if (!document) {\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n <TemplatePicker onSelectTemplate={handleSelectTemplate} />\n </div>\n );\n }\n\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n {/* Toolbar */}\n <Toolbar\n history={history}\n isSaving={isSaving}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onSave={handleSave}\n onPublish={onPublish ? handlePublish : undefined}\n onReset={\n currentTemplateId\n ? () => {\n // Recarregar o mesmo template\n const sharedDoc = getTemplate(currentTemplateId);\n if (sharedDoc) {\n loadDocument(sharedTemplateToEngineDocument(sharedDoc));\n const paletteName = templateDefaultPalette[currentTemplateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n }\n }\n : resetToTemplate\n }\n showSelectionOverlay={showSelectionOverlay}\n onToggleSelectionOverlay={() => setShowSelectionOverlay(prev => !prev)}\n />\n\n {/* Main Content - 3 Columns */}\n <div className=\"flex-1 flex overflow-hidden min-h-0 max-h-full\">\n {/* Left: Block Selector + Paletas */}\n <LeftPanel\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n isPaletteSelected={isPaletteSelected}\n onSelectBlock={(id) => { setSelectedBlockId(id); setFocusedGroup(null); }}\n onDeleteBlock={handleDeleteBlock}\n onAddBlock={handleAddBlock}\n activePlugins={activePlugins}\n />\n\n {/* Center: Preview (apenas a página em edição) */}\n <CenterPanel\n document={document}\n currentPageId={currentPageId}\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n onBlockClick={handleBlockClick}\n onSelectPage={setCurrentPageId}\n onAddPage={() => {\n const name = prompt(\"Nome da página:\");\n if (!name) return;\n const slug = name.toLowerCase().replace(/\\s+/g, \"-\");\n const id = slug;\n addPage(id, name, slug);\n }}\n onRemovePage={removePage}\n canRemovePage={canRemovePage}\n onUpdateBlock={handleUpdateBlockById}\n activePlugins={activePlugins}\n onActivatePlugin={activatePlugin}\n onDeactivatePlugin={deactivatePlugin}\n showSelectionOverlay={showSelectionOverlay}\n focusedGroup={focusedGroup}\n />\n\n {/* Right: Editor Panel */}\n <RightPanel\n isPaletteSelected={isPaletteSelected}\n selectedBlock={selectedBlock}\n selectedPalette={selectedPalette ? findPaletteByName(selectedPalette) : undefined}\n onPaletteChange={handlePaletteChange}\n onUpdateBlock={handleUpdateBlock}\n uploadConfig={uploadConfig}\n document={document}\n currentPageId={currentPageId}\n focusedGroup={focusedGroup}\n />\n </div>\n </div>\n );\n}\n"],"names":["LandingPageEditor","initialData","defaultTemplateId","onSave","onPublish","uploadConfig","document","currentPageId","currentPage","selectedBlockId","selectedBlock","history","setCurrentPageId","addPage","removePage","canRemovePage","setSelectedBlockId","handleUndo","handleRedo","handleAddBlock","handleDeleteBlock","handleUpdateBlock","applyChange","resetToTemplate","isPaletteSelected","loadDocument","selectedPalette","setSelectedPalette","activePlugins","activatePlugin","deactivatePlugin","useEditorState","isSaving","setIsSaving","useState","currentTemplateId","setCurrentTemplateId","focusedGroup","setFocusedGroup","showSelectionOverlay","setShowSelectionOverlay","handleSelectTemplate","useCallback","templateId","sharedDoc","getTemplate","engineDoc","sharedTemplateToEngineDocument","paletteName","templateDefaultPalette","useEffect","handleSave","processedPages","page","block","processBlockDataURLs","processedDocument","error","logger","handlePublish","handleUpdateBlockById","blockId","updates","pageId","patch","PatchBuilder","handlePaletteChange","palette","derived","derivePaletteColors","allPatches","key","value","darkGradientVariations","blogWidgetTypes","patchNestedBlocks","blocks","basePath","i","b","bPath","pageIdx","blockIdx","base","variation","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","findPaletteByName","TemplatePicker"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ContainerExporter.js","sources":["../../../../../src/engine/export/exporters/layout/ContainerExporter.ts"],"sourcesContent":["/**\n * Container Block Exporter\n * Responsive padding: increases from mobile to desktop\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateContainerId } from \"../../shared/idGenerator\";\nimport { generatePaddingMediaQueries, BREAKPOINTS } from \"../../shared/responsiveGridHelper\";\n\nexport function exportContainer(\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 maxWidth = \"1200px\",\n padding = \"1rem\",\n children = [],\n } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportContainer requires renderChild function\");\n }\n\n const containerId = generateContainerId(block.id || \"\");\n\n // Responsive padding: 1rem (mobile) → 1.5rem (tablet) → 2rem (desktop)\n const paddingValue = typeof padding === \"string\" ? padding : \"1rem\";\n const smPadding = paddingValue;\n const mdPadding = \"1.5rem\";\n const lgPadding = \"2rem\";\n\n const mediaQueries = generatePaddingMediaQueries(\n containerId,\n smPadding,\n mdPadding,\n lgPadding,\n );\n\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n const inlineStyles = `max-width: ${maxWidth}; padding: ${smPadding}; margin: 0 auto;`;\n\n return `<style>${mediaQueries}</style><div id=\"${containerId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n}\n"],"names":["exportContainer","block","depth","basePath","theme","renderChild","maxWidth","padding","children","containerId","generateContainerId","smPadding","mediaQueries","generatePaddingMediaQueries","childrenHtml","c","inlineStyles","dataBlockIdAttr"],"mappings":";;;AAWO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,UAAAC,IAAW;AAAA,IACX,SAAAC,IAAU;AAAA,IACV,UAAAC,IAAW,CAAA;AAAA,EAAC,IACTP,EAAc;AAEnB,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,+CAA+C;AAGjE,QAAMI,IAAcC,EAAoBT,EAAM,MAAM,EAAE,GAIhDU,IADe,OAAOJ,KAAY,WAAWA,IAAU,QAKvDK,IAAeC;AAAA,IACnBJ;AAAA,IACAE;AAAA,IALgB;AAAA,IACA;AAAA,EAMhB,GAGIG,IAAeN,EAClB,IAAI,CAACO,MAAaV,EAAYU,GAAGb,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE,GAEJY,IAAe,cAAcV,CAAQ,cAAcK,CAAS;AAElE,SAAO,UAAUC,CAAY,oBAAoBH,CAAW,KAAKQ,EAAgBhB,EAAM,EAAE,CAAC,WAAWe,CAAY,KAAKF,CAAY;AACpI;"}
1
+ {"version":3,"file":"ContainerExporter.js","sources":["../../../../../src/engine/export/exporters/layout/ContainerExporter.ts"],"sourcesContent":["/**\n * Container Block Exporter\n * Responsive padding: increases from mobile to desktop\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateContainerId } from \"../../shared/idGenerator\";\nimport { generatePaddingMediaQueries } from \"../../shared/responsiveGridHelper\";\n\nexport function exportContainer(\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 maxWidth = \"1200px\",\n padding = \"1rem\",\n children = [],\n } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportContainer requires renderChild function\");\n }\n\n const containerId = generateContainerId(block.id || \"\");\n\n // Responsive padding: 1rem (mobile) → 1.5rem (tablet) → 2rem (desktop)\n const paddingValue = typeof padding === \"string\" ? padding : \"1rem\";\n const smPadding = paddingValue;\n const mdPadding = \"1.5rem\";\n const lgPadding = \"2rem\";\n\n const mediaQueries = generatePaddingMediaQueries(\n containerId,\n smPadding,\n mdPadding,\n lgPadding,\n );\n\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n const inlineStyles = `max-width: ${maxWidth}; padding: ${smPadding}; margin: 0 auto;`;\n\n return `<style>${mediaQueries}</style><div id=\"${containerId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n}\n"],"names":["exportContainer","block","depth","basePath","theme","renderChild","maxWidth","padding","children","containerId","generateContainerId","smPadding","mediaQueries","generatePaddingMediaQueries","childrenHtml","c","inlineStyles","dataBlockIdAttr"],"mappings":";;;AAWO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,UAAAC,IAAW;AAAA,IACX,SAAAC,IAAU;AAAA,IACV,UAAAC,IAAW,CAAA;AAAA,EAAC,IACTP,EAAc;AAEnB,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,+CAA+C;AAGjE,QAAMI,IAAcC,EAAoBT,EAAM,MAAM,EAAE,GAIhDU,IADe,OAAOJ,KAAY,WAAWA,IAAU,QAKvDK,IAAeC;AAAA,IACnBJ;AAAA,IACAE;AAAA,IALgB;AAAA,IACA;AAAA,EAMhB,GAGIG,IAAeN,EAClB,IAAI,CAACO,MAAaV,EAAYU,GAAGb,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE,GAEJY,IAAe,cAAcV,CAAQ,cAAcK,CAAS;AAElE,SAAO,UAAUC,CAAY,oBAAoBH,CAAW,KAAKQ,EAAgBhB,EAAM,EAAE,CAAC,WAAWe,CAAY,KAAKF,CAAY;AACpI;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SectionExporter.js","sources":["../../../../../src/engine/export/exporters/layout/SectionExporter.ts"],"sourcesContent":["/**\n * Section Block Exporter\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, blockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\n\nexport function exportSection(\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 { bg, padding = \"2rem\", children = [] } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportSection requires renderChild function\");\n }\n\n const style = [\n bg\n ? `background-color: ${bg}`\n : \"background-color: var(--sg-bg, #ffffff)\",\n `padding: ${padding}`,\n ]\n .filter(Boolean)\n .join(\"; \");\n\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n return `<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"${style}\">${childrenHtml}</section>`;\n}\n"],"names":["exportSection","block","depth","basePath","theme","renderChild","bg","padding","children","style","childrenHtml","c","blockIdAttr","dataBlockIdAttr"],"mappings":";AAQO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM,EAAE,IAAAC,GAAI,SAAAC,IAAU,QAAQ,UAAAC,IAAW,CAAA,EAAC,IAAOP,EAAc;AAE/D,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,6CAA6C;AAG/D,QAAMI,IAAQ;AAAA,IACZH,IACI,qBAAqBA,CAAE,KACvB;AAAA,IACJ,YAAYC,CAAO;AAAA,EAAA,EAElB,OAAO,OAAO,EACd,KAAK,IAAI,GAENG,IAAeF,EAClB,IAAI,CAACG,MAAaN,EAAYM,GAAGT,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE;AAEV,SAAO,YAAYQ,EAAYX,EAAM,EAAE,CAAC,IAAIY,EAAgBZ,EAAM,EAAE,CAAC,WAAWQ,CAAK,KAAKC,CAAY;AACxG;"}
1
+ {"version":3,"file":"SectionExporter.js","sources":["../../../../../src/engine/export/exporters/layout/SectionExporter.ts"],"sourcesContent":["/**\n * Section Block Exporter\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, blockIdAttr } from \"../../shared/htmlHelpers\";\n\nexport function exportSection(\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 { bg, padding = \"2rem\", children = [] } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportSection requires renderChild function\");\n }\n\n const style = [\n bg\n ? `background-color: ${bg}`\n : \"background-color: var(--sg-bg, #ffffff)\",\n `padding: ${padding}`,\n ]\n .filter(Boolean)\n .join(\"; \");\n\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n return `<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"${style}\">${childrenHtml}</section>`;\n}\n"],"names":["exportSection","block","depth","basePath","theme","renderChild","bg","padding","children","style","childrenHtml","c","blockIdAttr","dataBlockIdAttr"],"mappings":";AAQO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM,EAAE,IAAAC,GAAI,SAAAC,IAAU,QAAQ,UAAAC,IAAW,CAAA,EAAC,IAAOP,EAAc;AAE/D,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,6CAA6C;AAG/D,QAAMI,IAAQ;AAAA,IACZH,IACI,qBAAqBA,CAAE,KACvB;AAAA,IACJ,YAAYC,CAAO;AAAA,EAAA,EAElB,OAAO,OAAO,EACd,KAAK,IAAI,GAENG,IAAeF,EAClB,IAAI,CAACG,MAAaN,EAAYM,GAAGT,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE;AAEV,SAAO,YAAYQ,EAAYX,EAAM,EAAE,CAAC,IAAIY,EAAgBZ,EAAM,EAAE,CAAC,WAAWQ,CAAK,KAAKC,CAAY;AACxG;"}
@@ -0,0 +1,3 @@
1
+ import { Block } from '../../../schema/siteDocument';
2
+ export declare function exportCategoryCardGrid(block: Block, _depth: number, _basePath?: string): string;
3
+ //# sourceMappingURL=CategoryCardGridExporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategoryCardGridExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/CategoryCardGridExporter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAQrD,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,MAAM,CAiCR"}
@@ -0,0 +1,18 @@
1
+ import { escapeHtml as r, dataBlockIdAttr as y } from "../../shared/htmlHelpers.js";
2
+ import { generateScopedId as $ } from "../../shared/idGenerator.js";
3
+ import { resolveResponsiveColumns as h, generateResponsiveGridStyles as b } from "../../shared/responsiveGridHelper.js";
4
+ function C(t, f, x) {
5
+ const { title: o, subtitle: i, columns: n = 4, categories: d = [] } = t.props, s = $(t.id || "", "category-grid"), a = h(n, 1, 2, n), { inlineStyles: m, mediaQueries: g } = b(
6
+ s,
7
+ a,
8
+ "1.5rem"
9
+ ), l = o || i ? `<div style="text-align: center; margin-bottom: 3rem;">${o ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;">${r(o)}</h2>` : ""}${i ? `<p style="color: var(--sg-muted-text);">${r(i)}</p>` : ""}</div>` : "", c = d.map((e) => {
10
+ const u = e.icon ? `<div style="font-size: 3rem; margin-bottom: 1rem;">${r(e.icon)}</div>` : "", p = e.image ? `<div style="height: 120px; background-image: url(${r(e.image)}); background-size: cover; background-position: center; border-radius: var(--sg-card-radius) var(--sg-card-radius) 0 0; margin: -2rem -1.5rem 1rem;"></div>` : "", v = e.count != null ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem;">${r(String(e.count))} cursos</p>` : "";
11
+ return `<a href="${r(e.href || "#")}" style="background-color: var(--sg-surface); border-radius: var(--sg-card-radius); padding: 2rem 1.5rem; text-align: center; text-decoration: none; color: inherit; display: block; overflow: hidden;">${p}${u}<h3 style="font-size: 1.125rem; margin-bottom: 0.5rem;">${r(e.title || e.name || "")}</h3>${v}</a>`;
12
+ }).join("");
13
+ return `<style>${g}</style><section ${y(t.id)} style="padding: 4rem 0; background-color: var(--sg-bg);"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${l}<div id="${s}" style="${m}">${c}</div></div></section>`;
14
+ }
15
+ export {
16
+ C as exportCategoryCardGrid
17
+ };
18
+ //# sourceMappingURL=CategoryCardGridExporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CategoryCardGridExporter.js","sources":["../../../../../src/engine/export/exporters/sections/CategoryCardGridExporter.ts"],"sourcesContent":["/**\n * CategoryCardGrid Exporter\n * Grid de categorias com imagem de fundo — HTML export\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { dataBlockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n} from \"../../shared/responsiveGridHelper\";\n\nexport function exportCategoryCardGrid(\n block: Block,\n _depth: number,\n _basePath?: string,\n): string {\n const { title, subtitle, columns = 4, categories = [] } = (block as any).props;\n\n const gridId = generateScopedId(block.id || \"\", \"category-grid\");\n const responsiveConfig = resolveResponsiveColumns(columns, 1, 2, columns);\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(\n gridId,\n responsiveConfig,\n \"1.5rem\",\n );\n\n const headerHtml =\n title || subtitle\n ? `<div 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 const cardsHtml = categories\n .map((cat: any) => {\n const iconHtml = cat.icon\n ? `<div style=\"font-size: 3rem; margin-bottom: 1rem;\">${escapeHtml(cat.icon)}</div>`\n : \"\";\n const imgHtml = cat.image\n ? `<div style=\"height: 120px; background-image: url(${escapeHtml(cat.image)}); background-size: cover; background-position: center; border-radius: var(--sg-card-radius) var(--sg-card-radius) 0 0; margin: -2rem -1.5rem 1rem;\"></div>`\n : \"\";\n const countHtml = cat.count != null\n ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem;\">${escapeHtml(String(cat.count))} cursos</p>`\n : \"\";\n\n return `<a href=\"${escapeHtml(cat.href || \"#\")}\" style=\"background-color: var(--sg-surface); border-radius: var(--sg-card-radius); padding: 2rem 1.5rem; text-align: center; text-decoration: none; color: inherit; display: block; overflow: hidden;\">${imgHtml}${iconHtml}<h3 style=\"font-size: 1.125rem; margin-bottom: 0.5rem;\">${escapeHtml(cat.title || cat.name || \"\")}</h3>${countHtml}</a>`;\n })\n .join(\"\");\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 id=\"${gridId}\" style=\"${inlineStyles}\">${cardsHtml}</div></div></section>`;\n}\n"],"names":["exportCategoryCardGrid","block","_depth","_basePath","title","subtitle","columns","categories","gridId","generateScopedId","responsiveConfig","resolveResponsiveColumns","inlineStyles","mediaQueries","generateResponsiveGridStyles","headerHtml","escapeHtml","cardsHtml","cat","iconHtml","imgHtml","countHtml","dataBlockIdAttr"],"mappings":";;;AAaO,SAASA,EACdC,GACAC,GACAC,GACQ;AACR,QAAM,EAAE,OAAAC,GAAO,UAAAC,GAAU,SAAAC,IAAU,GAAG,YAAAC,IAAa,CAAA,MAAQN,EAAc,OAEnEO,IAASC,EAAiBR,EAAM,MAAM,IAAI,eAAe,GACzDS,IAAmBC,EAAyBL,GAAS,GAAG,GAAGA,CAAO,GAClE,EAAE,cAAAM,GAAc,cAAAC,EAAA,IAAiBC;AAAA,IACrCN;AAAA,IACAE;AAAA,IACA;AAAA,EAAA,GAGIK,IACJX,KAASC,IACL,yDAAyDD,IAAQ,uEAAuEY,EAAWZ,CAAK,CAAC,UAAU,EAAE,GAAGC,IAAW,2CAA2CW,EAAWX,CAAQ,CAAC,SAAS,EAAE,WAC7P,IAEAY,IAAYV,EACf,IAAI,CAACW,MAAa;AACjB,UAAMC,IAAWD,EAAI,OACjB,sDAAsDF,EAAWE,EAAI,IAAI,CAAC,WAC1E,IACEE,IAAUF,EAAI,QAChB,oDAAoDF,EAAWE,EAAI,KAAK,CAAC,gKACzE,IACEG,IAAYH,EAAI,SAAS,OAC3B,gEAAgEF,EAAW,OAAOE,EAAI,KAAK,CAAC,CAAC,gBAC7F;AAEJ,WAAO,YAAYF,EAAWE,EAAI,QAAQ,GAAG,CAAC,2MAA2ME,CAAO,GAAGD,CAAQ,2DAA2DH,EAAWE,EAAI,SAASA,EAAI,QAAQ,EAAE,CAAC,QAAQG,CAAS;AAAA,EAChY,CAAC,EACA,KAAK,EAAE;AAEV,SAAO,UAAUR,CAAY,oBAAoBS,EAAgBrB,EAAM,EAAE,CAAC,8HAA8Hc,CAAU,YAAYP,CAAM,YAAYI,CAAY,KAAKK,CAAS;AAC5Q;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI1D,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,QAGpF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgDH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAI1D,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,QAGpF"}
@@ -2,20 +2,21 @@ import { htmlExportRegistry as r } from "../HtmlExporter.js";
2
2
  import { exportHero as g } from "./HeroExporter.js";
3
3
  import { exportNavbar as s } from "./NavbarExporter.js";
4
4
  import { exportFooter as n } from "./FooterExporter.js";
5
- import { exportFeature as l, exportCta as d, exportPricingCard as p, exportTestimonial as x, exportFaqItem as m, exportStats as C, exportStatItem as c, exportLogoCloud as u, exportSocialLinks as h, exportFeatureGrid as f, exportPricing as w, exportTestimonialGrid as b, exportFaq as G } from "./MarketingExporters.js";
6
- import { exportBlogCard as P, exportTeamCard as S, exportCourseCardGrid as B, exportCountdown as E, exportCarousel as z, exportBlogCardGrid as F, exportTeamGrid as T } from "./ContentGridExporters.js";
7
- import { exportBlogPostCard as y, exportBlogPostDetail as I, exportBlogCategoryFilter as R, exportBlogSearchBar as q, exportBlogRecentPosts as L, exportBlogTagCloud as k, exportBlogPostGrid as v } from "./BlogPostExporters.js";
5
+ import { exportFeature as d, exportCta as l, exportPricingCard as p, exportTestimonial as x, exportFaqItem as m, exportStats as C, exportStatItem as c, exportLogoCloud as u, exportSocialLinks as h, exportFeatureGrid as f, exportPricing as w, exportTestimonialGrid as G, exportFaq as b } from "./MarketingExporters.js";
6
+ import { exportBlogCard as P, exportTeamCard as S, exportCourseCardGrid as B, exportCountdown as E, exportCarousel as y, exportBlogCardGrid as z, exportTeamGrid as F } from "./ContentGridExporters.js";
7
+ import { exportBlogPostCard as T, exportBlogPostDetail as I, exportBlogCategoryFilter as R, exportBlogSearchBar as q, exportBlogRecentPosts as L, exportBlogTagCloud as k, exportBlogPostGrid as v } from "./BlogPostExporters.js";
8
8
  import { exportProductShowcase as D, exportAboutSection as A, exportContactSection as H } from "./AdminSectionExporters.js";
9
9
  import { exportImageGallery as N } from "./ImageGalleryExporter.js";
10
+ import { exportCategoryCardGrid as j } from "./CategoryCardGridExporter.js";
10
11
  let t = null;
11
- function X(e) {
12
+ function Z(e) {
12
13
  t = e;
13
14
  }
14
15
  r.register("hero", g);
15
16
  r.register("navbar", s);
16
17
  r.register("footer", n);
17
- r.register("feature", l);
18
- r.register("cta", d);
18
+ r.register("feature", d);
19
+ r.register("cta", l);
19
20
  r.register("pricingCard", p);
20
21
  r.register("testimonial", x);
21
22
  r.register("faqItem", m);
@@ -24,7 +25,7 @@ r.register("statItem", c);
24
25
  r.register("logoCloud", u);
25
26
  r.register("socialLinks", h);
26
27
  r.register("blogCard", P);
27
- r.register("blogPostCard", y);
28
+ r.register("blogPostCard", T);
28
29
  r.register("blogPostDetail", I);
29
30
  r.register("blogCategoryFilter", R);
30
31
  r.register("blogSearchBar", q);
@@ -33,11 +34,12 @@ r.register("blogTagCloud", k);
33
34
  r.register("teamCard", S);
34
35
  r.register("courseCardGrid", B);
35
36
  r.register("countdown", E);
36
- r.register("carousel", z);
37
+ r.register("carousel", y);
37
38
  r.register("productShowcase", D);
38
39
  r.register("aboutSection", A);
39
40
  r.register("contactSection", H);
40
41
  r.register("imageGallery", N);
42
+ r.register("categoryCardGrid", j);
41
43
  r.register("featureGrid", (e, o, i, a) => {
42
44
  if (!t) throw new Error("renderChild not initialized");
43
45
  return f(e);
@@ -48,15 +50,15 @@ r.register("pricing", (e, o, i, a) => {
48
50
  });
49
51
  r.register("testimonialGrid", (e, o, i, a) => {
50
52
  if (!t) throw new Error("renderChild not initialized");
51
- return b(e, o, i, a, t);
53
+ return G(e, o, i, a, t);
52
54
  });
53
55
  r.register("faq", (e, o, i, a) => {
54
56
  if (!t) throw new Error("renderChild not initialized");
55
- return G(e, o, i, a, t);
57
+ return b(e, o, i, a, t);
56
58
  });
57
59
  r.register("blogCardGrid", (e, o, i, a) => {
58
60
  if (!t) throw new Error("renderChild not initialized");
59
- return F(e, o, i, a, t);
61
+ return z(e, o, i, a, t);
60
62
  });
61
63
  r.register("blogPostGrid", (e, o, i, a) => {
62
64
  if (!t) throw new Error("renderChild not initialized");
@@ -64,9 +66,9 @@ r.register("blogPostGrid", (e, o, i, a) => {
64
66
  });
65
67
  r.register("teamGrid", (e, o, i, a) => {
66
68
  if (!t) throw new Error("renderChild not initialized");
67
- return T(e, o, i, a, t);
69
+ return F(e, o, i, a, t);
68
70
  });
69
71
  export {
70
- X as setSectionExportersRenderChild
72
+ Z as setSectionExportersRenderChild
71
73
  };
72
74
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../../../src/engine/export/exporters/sections/index.ts"],"sourcesContent":["/**\n * Section Exporters Auto-Registration\n */\n\nimport { htmlExportRegistry } from \"../HtmlExporter\";\nimport { exportHero } from \"./HeroExporter\";\nimport { exportNavbar } from \"./NavbarExporter\";\nimport { exportFooter } from \"./FooterExporter\";\nimport {\n exportFeature,\n exportFeatureGrid,\n exportCta,\n exportPricingCard,\n exportPricing,\n exportTestimonial,\n exportTestimonialGrid,\n exportFaqItem,\n exportFaq,\n exportStats,\n exportStatItem,\n exportLogoCloud,\n exportSocialLinks,\n} from \"./MarketingExporters\";\nimport {\n exportBlogCard,\n exportBlogCardGrid,\n exportTeamCard,\n exportTeamGrid,\n exportCourseCardGrid,\n exportCountdown,\n exportCarousel,\n} from \"./ContentGridExporters\";\nimport {\n exportBlogPostCard,\n exportBlogPostGrid,\n exportBlogPostDetail,\n exportBlogCategoryFilter,\n exportBlogSearchBar,\n exportBlogRecentPosts,\n exportBlogTagCloud,\n} from \"./BlogPostExporters\";\nimport {\n exportProductShowcase,\n exportAboutSection,\n exportContactSection,\n} from \"./AdminSectionExporters\";\nimport { exportImageGallery } from \"./ImageGalleryExporter\";\n\n// Referência para renderChild\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\n\nlet renderChildRef: ((block: Block, depth: number, basePath?: string, theme?: ThemeTokens) => string) | null = null;\n\nexport function setSectionExportersRenderChild(\n fn: (block: Block, depth: number, basePath?: string, theme?: ThemeTokens) => string\n) {\n renderChildRef = fn;\n}\n\n// Exporters simples (sem children)\nhtmlExportRegistry.register(\"hero\", exportHero);\nhtmlExportRegistry.register(\"navbar\", exportNavbar);\nhtmlExportRegistry.register(\"footer\", exportFooter);\nhtmlExportRegistry.register(\"feature\", exportFeature);\nhtmlExportRegistry.register(\"cta\", exportCta);\nhtmlExportRegistry.register(\"pricingCard\", exportPricingCard);\nhtmlExportRegistry.register(\"testimonial\", exportTestimonial);\nhtmlExportRegistry.register(\"faqItem\", exportFaqItem);\nhtmlExportRegistry.register(\"stats\", exportStats);\nhtmlExportRegistry.register(\"statItem\", exportStatItem);\nhtmlExportRegistry.register(\"logoCloud\", exportLogoCloud);\nhtmlExportRegistry.register(\"socialLinks\", exportSocialLinks);\nhtmlExportRegistry.register(\"blogCard\", exportBlogCard);\nhtmlExportRegistry.register(\"blogPostCard\", exportBlogPostCard);\nhtmlExportRegistry.register(\"blogPostDetail\", exportBlogPostDetail);\nhtmlExportRegistry.register(\"blogCategoryFilter\", exportBlogCategoryFilter);\nhtmlExportRegistry.register(\"blogSearchBar\", exportBlogSearchBar);\nhtmlExportRegistry.register(\"blogRecentPosts\", exportBlogRecentPosts);\nhtmlExportRegistry.register(\"blogTagCloud\", exportBlogTagCloud);\nhtmlExportRegistry.register(\"teamCard\", exportTeamCard);\nhtmlExportRegistry.register(\"courseCardGrid\", exportCourseCardGrid);\nhtmlExportRegistry.register(\"countdown\", exportCountdown);\nhtmlExportRegistry.register(\"carousel\", exportCarousel);\nhtmlExportRegistry.register(\"productShowcase\", exportProductShowcase);\nhtmlExportRegistry.register(\"aboutSection\", exportAboutSection);\nhtmlExportRegistry.register(\"contactSection\", exportContactSection);\nhtmlExportRegistry.register(\"imageGallery\", exportImageGallery);\n\n// Exporters que precisam de renderChild\nhtmlExportRegistry.register(\"featureGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportFeatureGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"pricing\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportPricing(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"testimonialGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportTestimonialGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"faq\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportFaq(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"blogCardGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportBlogCardGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"blogPostGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportBlogPostGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"teamGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportTeamGrid(block, depth, basePath, theme, renderChildRef);\n});\n"],"names":["renderChildRef","setSectionExportersRenderChild","fn","htmlExportRegistry","exportHero","exportNavbar","exportFooter","exportFeature","exportCta","exportPricingCard","exportTestimonial","exportFaqItem","exportStats","exportStatItem","exportLogoCloud","exportSocialLinks","exportBlogCard","exportBlogPostCard","exportBlogPostDetail","exportBlogCategoryFilter","exportBlogSearchBar","exportBlogRecentPosts","exportBlogTagCloud","exportTeamCard","exportCourseCardGrid","exportCountdown","exportCarousel","exportProductShowcase","exportAboutSection","exportContactSection","exportImageGallery","block","depth","basePath","theme","exportFeatureGrid","exportPricing","exportTestimonialGrid","exportFaq","exportBlogCardGrid","exportBlogPostGrid","exportTeamGrid"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../../../../src/engine/export/exporters/sections/index.ts"],"sourcesContent":["/**\n * Section Exporters Auto-Registration\n */\n\nimport { htmlExportRegistry } from \"../HtmlExporter\";\nimport { exportHero } from \"./HeroExporter\";\nimport { exportNavbar } from \"./NavbarExporter\";\nimport { exportFooter } from \"./FooterExporter\";\nimport {\n exportFeature,\n exportFeatureGrid,\n exportCta,\n exportPricingCard,\n exportPricing,\n exportTestimonial,\n exportTestimonialGrid,\n exportFaqItem,\n exportFaq,\n exportStats,\n exportStatItem,\n exportLogoCloud,\n exportSocialLinks,\n} from \"./MarketingExporters\";\nimport {\n exportBlogCard,\n exportBlogCardGrid,\n exportTeamCard,\n exportTeamGrid,\n exportCourseCardGrid,\n exportCountdown,\n exportCarousel,\n} from \"./ContentGridExporters\";\nimport {\n exportBlogPostCard,\n exportBlogPostGrid,\n exportBlogPostDetail,\n exportBlogCategoryFilter,\n exportBlogSearchBar,\n exportBlogRecentPosts,\n exportBlogTagCloud,\n} from \"./BlogPostExporters\";\nimport {\n exportProductShowcase,\n exportAboutSection,\n exportContactSection,\n} from \"./AdminSectionExporters\";\nimport { exportImageGallery } from \"./ImageGalleryExporter\";\nimport { exportCategoryCardGrid } from \"./CategoryCardGridExporter\";\n\n// Referência para renderChild\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\n\nlet renderChildRef: ((block: Block, depth: number, basePath?: string, theme?: ThemeTokens) => string) | null = null;\n\nexport function setSectionExportersRenderChild(\n fn: (block: Block, depth: number, basePath?: string, theme?: ThemeTokens) => string\n) {\n renderChildRef = fn;\n}\n\n// Exporters simples (sem children)\nhtmlExportRegistry.register(\"hero\", exportHero);\nhtmlExportRegistry.register(\"navbar\", exportNavbar);\nhtmlExportRegistry.register(\"footer\", exportFooter);\nhtmlExportRegistry.register(\"feature\", exportFeature);\nhtmlExportRegistry.register(\"cta\", exportCta);\nhtmlExportRegistry.register(\"pricingCard\", exportPricingCard);\nhtmlExportRegistry.register(\"testimonial\", exportTestimonial);\nhtmlExportRegistry.register(\"faqItem\", exportFaqItem);\nhtmlExportRegistry.register(\"stats\", exportStats);\nhtmlExportRegistry.register(\"statItem\", exportStatItem);\nhtmlExportRegistry.register(\"logoCloud\", exportLogoCloud);\nhtmlExportRegistry.register(\"socialLinks\", exportSocialLinks);\nhtmlExportRegistry.register(\"blogCard\", exportBlogCard);\nhtmlExportRegistry.register(\"blogPostCard\", exportBlogPostCard);\nhtmlExportRegistry.register(\"blogPostDetail\", exportBlogPostDetail);\nhtmlExportRegistry.register(\"blogCategoryFilter\", exportBlogCategoryFilter);\nhtmlExportRegistry.register(\"blogSearchBar\", exportBlogSearchBar);\nhtmlExportRegistry.register(\"blogRecentPosts\", exportBlogRecentPosts);\nhtmlExportRegistry.register(\"blogTagCloud\", exportBlogTagCloud);\nhtmlExportRegistry.register(\"teamCard\", exportTeamCard);\nhtmlExportRegistry.register(\"courseCardGrid\", exportCourseCardGrid);\nhtmlExportRegistry.register(\"countdown\", exportCountdown);\nhtmlExportRegistry.register(\"carousel\", exportCarousel);\nhtmlExportRegistry.register(\"productShowcase\", exportProductShowcase);\nhtmlExportRegistry.register(\"aboutSection\", exportAboutSection);\nhtmlExportRegistry.register(\"contactSection\", exportContactSection);\nhtmlExportRegistry.register(\"imageGallery\", exportImageGallery);\nhtmlExportRegistry.register(\"categoryCardGrid\", exportCategoryCardGrid);\n\n// Exporters que precisam de renderChild\nhtmlExportRegistry.register(\"featureGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportFeatureGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"pricing\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportPricing(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"testimonialGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportTestimonialGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"faq\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportFaq(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"blogCardGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportBlogCardGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"blogPostGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportBlogPostGrid(block, depth, basePath, theme, renderChildRef);\n});\n\nhtmlExportRegistry.register(\"teamGrid\", (block, depth, basePath, theme) => {\n if (!renderChildRef) throw new Error(\"renderChild not initialized\");\n return exportTeamGrid(block, depth, basePath, theme, renderChildRef);\n});\n"],"names":["renderChildRef","setSectionExportersRenderChild","fn","htmlExportRegistry","exportHero","exportNavbar","exportFooter","exportFeature","exportCta","exportPricingCard","exportTestimonial","exportFaqItem","exportStats","exportStatItem","exportLogoCloud","exportSocialLinks","exportBlogCard","exportBlogPostCard","exportBlogPostDetail","exportBlogCategoryFilter","exportBlogSearchBar","exportBlogRecentPosts","exportBlogTagCloud","exportTeamCard","exportCourseCardGrid","exportCountdown","exportCarousel","exportProductShowcase","exportAboutSection","exportContactSection","exportImageGallery","exportCategoryCardGrid","block","depth","basePath","theme","exportFeatureGrid","exportPricing","exportTestimonialGrid","exportFaq","exportBlogCardGrid","exportBlogPostGrid","exportTeamGrid"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"styleResolver.d.ts","sourceRoot":"","sources":["../../../src/engine/export/styleResolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAKH,QAAQ,EACR,SAAS,EACT,WAAW,EAId,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAM5C;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI5C,CAAC;AAMF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;CACf;AAsED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,oBAAoB,CAiTlH;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAqC3H;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoC1E;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAS/F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAMrE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAsBhE"}
1
+ {"version":3,"file":"styleResolver.d.ts","sourceRoot":"","sources":["../../../src/engine/export/styleResolver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAKH,QAAQ,EACR,SAAS,EACT,WAAW,EAEd,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AAM5C;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAM/C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAI5C,CAAC;AAMF;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACjC,iCAAiC;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;CACf;AAsED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,GAAG,GAAG,oBAAoB,CAiTlH;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAqC3H;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoC1E;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAS/F;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAMrE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,CAsBhE"}
@@ -1 +1 @@
1
- {"version":3,"file":"styleResolver.js","sources":["../../../src/engine/export/styleResolver.ts"],"sourcesContent":["/**\n * Style Resolver\n *\n * Sistema centralizado de resolução de estilos que combina\n * valores default com customizações do usuário, gerando\n * estilos inline completos para HTML export.\n */\n\n// Import hover effects from shared module\nimport {\n generateLinkHoverStyles,\n generateButtonHoverStyles,\n generateButtonOverlayCSS,\n getButtonHoverKeyframes,\n hexToRgb,\n hexToRgba,\n adjustColor,\n type LinkHoverConfig,\n type ButtonHoverConfig,\n type ButtonHoverOverlay,\n} from \"../shared/hoverEffects\";\nimport { logger } from \"../../utils/logger\";\n\n// Re-export for backwards compatibility\nexport { hexToRgb, hexToRgba, adjustColor };\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Shadow values mapping\n */\nexport const shadowValues: 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 -2px rgba(0, 0, 0, 0.1)\",\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)\",\n xl: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)\",\n};\n\n/**\n * Font size values mapping\n */\nexport const fontSizes: Record<string, string> = {\n sm: \"0.875rem\",\n md: \"1rem\",\n lg: \"1.125rem\",\n};\n\n// ============================================================================\n// NAVBAR STYLE RESOLVER\n// ============================================================================\n\n/**\n * Resolved styles for navbar components\n */\nexport interface NavbarResolvedStyles {\n /** Styles for the nav element */\n nav: string;\n /** Styles for navigation links */\n link: string;\n /** Styles for the CTA button */\n button: string;\n /** Styles for the brand text */\n brandText: string;\n /** Styles for dropdown container */\n dropdown: string;\n /** Styles for dropdown items */\n dropdownItem: string;\n /** Dynamic CSS block for hover states and media queries */\n css: string;\n}\n\n/**\n * Default navbar styles (garantem aparência mesmo sem CSS externo)\n */\nconst navbarDefaults = {\n bg: \"#ffffff\",\n opacity: 100,\n borderRadius: 0,\n shadow: \"sm\" as const,\n linkColor: \"#1f2937\",\n linkFontSize: \"md\" as const,\n buttonColor: \"#3b82f6\",\n buttonTextColor: \"#ffffff\",\n buttonBorderRadius: 8,\n buttonVariant: \"solid\" as const,\n};\n\n/**\n * Resolve button styles based on variant\n */\nfunction resolveButtonStyle(\n variant: string,\n bgColor: string,\n textColor: string,\n borderRadius: number,\n padding: string = \"0.5rem 1rem\",\n fontSize: string = \"1rem\",\n): string {\n const baseStyles = [\n `padding: ${padding}`,\n `font-size: ${fontSize}`,\n `border-radius: ${borderRadius}px`,\n \"text-decoration: none\",\n \"font-weight: 500\",\n \"display: inline-block\",\n \"transition: all 0.2s ease\",\n \"cursor: pointer\",\n \"position: relative\", // Needed for shine effect\n \"overflow: hidden\", // Needed for shine effect\n ];\n\n switch (variant) {\n case \"outline\":\n return [\n ...baseStyles,\n \"background-color: transparent\",\n `color: ${bgColor}`,\n `border: 2px solid ${bgColor}`,\n ].join(\"; \");\n\n case \"ghost\":\n return [\n ...baseStyles,\n \"background-color: transparent\",\n `color: ${bgColor}`,\n \"border: none\",\n ].join(\"; \");\n\n case \"solid\":\n default:\n return [\n ...baseStyles,\n `background-color: ${bgColor}`,\n `color: ${textColor}`,\n \"border: none\",\n ].join(\"; \");\n }\n}\n\n/**\n * Resolve all navbar styles from block props\n *\n * @param props - Block props from navbar\n * @param blockId - Unique block ID for scoping CSS\n * @param theme - Theme tokens for palette colors\n * @returns Resolved inline style strings and dynamic CSS\n */\nexport function resolveNavbarStyles(props: Record<string, any>, blockId: string, theme?: any): NavbarResolvedStyles {\n // Use theme colors if available, otherwise use defaults\n const themePrimaryColor = theme?.colors?.primary || navbarDefaults.buttonColor;\n const themePrimaryText = theme?.colors?.primaryText || navbarDefaults.buttonTextColor;\n\n // Priorizar menuLinkColor da paleta (cor específica para links do menu)\n // menuLinkColor já vem otimizado para contraste, então não precisa verificação adicional\n const themeLinkColor = theme?.colors?.menuLinkColor || theme?.colors?.primary || navbarDefaults.linkColor;\n\n // Usar a cor do tema diretamente (menuLinkColor já foi calculado para ter contraste adequado)\n const safeLinkColor = themeLinkColor;\n\n // Merge props with defaults (theme-aware)\n const {\n opacity = navbarDefaults.opacity,\n blurOpacity = 15,\n borderRadius = navbarDefaults.borderRadius,\n shadow = navbarDefaults.shadow,\n linkColor = safeLinkColor,\n linkFontSize = navbarDefaults.linkFontSize,\n linkHoverEffect = \"background\",\n linkHoverIntensity = 50,\n buttonColor = themePrimaryColor,\n buttonTextColor = themePrimaryText,\n buttonBorderRadius = navbarDefaults.buttonBorderRadius,\n buttonVariant = navbarDefaults.buttonVariant,\n buttonSize = \"md\",\n buttonHoverEffect = \"darken\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n floating = false,\n sticky = true,\n transparent = false,\n variation = \"navbar-classic\",\n layout = \"expanded\",\n } = props;\n\n const isMinimal = variation === \"navbar-minimal\";\n const isCompact = layout === \"compact\";\n\n // Resolve nav styles\n const navStyles: string[] = [];\n const cssRules: string[] = [];\n\n // Navbar height - compact is 20% smaller (3.6rem vs 4.5rem)\n navStyles.push(`height: ${isCompact ? \"3.6rem\" : \"4.5rem\"}`);\n\n // Determine effective background\n const rawBg = props.bg;\n const effectiveBg = rawBg !== undefined ? rawBg : (transparent ? \"transparent\" : navbarDefaults.bg);\n\n // Apply background\n if (effectiveBg === \"transparent\") {\n navStyles.push(\"background-color: transparent\");\n } else {\n const isGradient = effectiveBg.includes(\"gradient\") ||\n effectiveBg.includes(\"linear\") ||\n effectiveBg.includes(\"radial\");\n\n if (isGradient) {\n navStyles.push(`background: ${effectiveBg}`);\n if (opacity < 100) {\n navStyles.push(`opacity: ${opacity / 100}`);\n }\n } else {\n // Apply background with user-chosen opacity\n const bgWithOpacity = applyOpacityToColor(effectiveBg, opacity);\n navStyles.push(`background-color: ${bgWithOpacity}`);\n }\n }\n\n // Apply blur intensity as CSS variable for glass effect (ALWAYS, independent of positioning)\n // Convert 0-100 to 0px-30px blur amount\n const blurAmount = Math.round((blurOpacity / 100) * 30); // 0-30px\n const blurBgOpacity = blurOpacity / 100; // 0-1 opacity for frosted glass effect (0% to 100%)\n navStyles.push(`--navbar-blur-amount: ${blurAmount}px`);\n navStyles.push(`--navbar-blur-opacity: ${blurBgOpacity}`);\n\n // Layout specific logic (positioning, not styles)\n if (floating) {\n // Floating navbar - fixed with margins\n navStyles.push(\"position: fixed\");\n navStyles.push(\"top: 20px\");\n navStyles.push(\"left: 20px\");\n navStyles.push(\"right: 20px\");\n navStyles.push(\"width: calc(100% - 40px)\");\n navStyles.push(\"z-index: 1000\");\n\n const effectiveRadius = Math.max(borderRadius, 12);\n if (effectiveRadius > 0) {\n navStyles.push(`border-radius: ${effectiveRadius}px`);\n }\n } else if (sticky) {\n // Sticky navbar - fixed at top, scrolls content only\n navStyles.push(\"position: fixed\");\n navStyles.push(\"top: 0\");\n navStyles.push(\"left: 0\");\n navStyles.push(\"right: 0\");\n navStyles.push(\"width: 100%\");\n navStyles.push(\"z-index: 1000\");\n\n if (borderRadius > 0) {\n navStyles.push(`border-bottom-left-radius: ${borderRadius}px`);\n navStyles.push(`border-bottom-right-radius: ${borderRadius}px`);\n }\n } else {\n // Non-sticky navbar - absolute position, scrolls with page but stays on top of hero\n navStyles.push(\"position: absolute\");\n navStyles.push(\"top: 0\");\n navStyles.push(\"left: 0\");\n navStyles.push(\"right: 0\");\n navStyles.push(\"width: 100%\");\n navStyles.push(\"z-index: 1000\");\n\n if (borderRadius > 0) {\n navStyles.push(`border-bottom-left-radius: ${borderRadius}px`);\n navStyles.push(`border-bottom-right-radius: ${borderRadius}px`);\n }\n }\n\n // Shadow\n // For classic/minimal, shadow behaves normally\n const shadowValue = shadowValues[shadow] || shadowValues.sm;\n if (shadow !== \"none\") {\n navStyles.push(`box-shadow: ${shadowValue}`);\n }\n\n // Padding adjustments\n if (isMinimal) {\n navStyles.push(\"padding: 0.5rem 1rem\"); // Smaller padding\n } else {\n // handled by exportHtml defaults usually, but we can enforce\n }\n\n // Resolve link styles\n // Transição mais longa para efeitos animados de underline\n const transitionDuration = (linkHoverEffect === \"underline\" || linkHoverEffect === \"underline-center\" || linkHoverEffect === \"slide-bg\")\n ? \"0.3s\"\n : \"0.2s\";\n\n // Link font size - compact mode uses smaller sizes\n const getLinkFontSize = () => {\n if (isMinimal || isCompact) return fontSizes.sm;\n return fontSizes[linkFontSize] || fontSizes.md;\n };\n\n // Link padding - compact mode uses smaller padding\n const linkPadding = isCompact ? \"0.375rem 0.5rem\" : \"0.5rem 0.75rem\";\n\n const linkStyles = [\n `color: ${linkColor}`,\n `font-size: ${getLinkFontSize()}`,\n \"text-decoration: none\",\n `font-weight: ${isCompact ? \"400\" : \"500\"}`,\n `transition: all ${transitionDuration} ease`,\n `padding: ${linkPadding}`,\n \"border-radius: 6px\",\n \"display: inline-block\",\n ];\n\n // Hover Effects CSS\n // Generate a unique selector based on blockId\n const scope = `[data-block-id=\"${blockId}\"]`;\n\n // Get linkHoverColor from props (default to buttonColor for backwards compatibility)\n const linkHoverColor = props.linkHoverColor || buttonColor;\n\n // Link Hover - gerar CSS baseado no efeito selecionado\n // Nota: normalização de intensidade é feita internamente pelo módulo hoverEffects\n const linkHoverResult = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n\n // Adicionar estilos base se necessário (para animações como underline)\n if (linkHoverResult.base) {\n cssRules.push(`\n ${scope} .sg-navbar__link {\n ${linkHoverResult.base}\n }\n `);\n }\n\n cssRules.push(`\n ${scope} .sg-navbar__link:hover {\n ${linkHoverResult.hover}\n }\n `);\n\n // Button Hover - gerar CSS baseado no efeito selecionado\n const buttonHoverResult = generateButtonHoverStyles({\n effect: buttonHoverEffect as any,\n intensity: buttonHoverIntensity,\n buttonColor,\n buttonTextColor,\n variant: buttonVariant as any,\n });\n\n // Adicionar estilos base se necessário (para animações como pulse, shine)\n if (buttonHoverResult.base) {\n cssRules.push(`\n ${scope} .sg-navbar__btn {\n ${buttonHoverResult.base}\n }\n `);\n }\n\n cssRules.push(`\n ${scope} .sg-navbar__btn:hover {\n ${buttonHoverResult.hover}\n }\n `);\n\n // Adicionar keyframes para animações (pulse)\n cssRules.push(getButtonHoverKeyframes());\n\n // Adicionar CSS para efeito overlay (se configurado)\n if (buttonHoverOverlay && buttonHoverOverlay !== \"none\") {\n cssRules.push(generateButtonOverlayCSS(`${scope} .sg-navbar__btn`, {\n overlay: buttonHoverOverlay as ButtonHoverOverlay,\n primaryColor: buttonColor,\n iconName: buttonHoverIconName,\n textColor: buttonTextColor,\n }));\n }\n\n // Resolve button styles based on buttonSize prop\n const buttonSizeStyles: Record<string, { padding: string; fontSize: string }> = {\n sm: { padding: \"0.375rem 0.875rem\", fontSize: \"0.875rem\" },\n md: { padding: \"0.5rem 1rem\", fontSize: \"1rem\" },\n lg: { padding: \"0.625rem 1.25rem\", fontSize: \"1.125rem\" },\n };\n\n // Use buttonSize from props, fallback to sm for minimal or compact variations\n const effectiveButtonSize = (isMinimal || isCompact) ? \"sm\" : buttonSize;\n const btnSizeConfig = buttonSizeStyles[effectiveButtonSize] || buttonSizeStyles.md;\n const btnPadding = btnSizeConfig.padding;\n const btnSize = btnSizeConfig.fontSize;\n\n const buttonStyle = resolveButtonStyle(\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonBorderRadius,\n btnPadding,\n btnSize\n );\n\n // Resolve brand text styles\n const brandTextStyles = [\n `color: ${buttonColor}`,\n \"font-weight: 700\",\n \"font-size: 1.25rem\",\n ];\n\n // Resolve dropdown styles - herda EXATAMENTE a mesma opacidade/blur da navbar\n // NOTA: backdrop-filter é aplicado via CSS: .sg-navbar--sticky .sg-navbar-dropdown\n const dropdownBg = applyOpacityToColor(effectiveBg === \"transparent\" ? navbarDefaults.bg : effectiveBg, opacity);\n\n const dropdownStyles = [\n // Background via CSS variable - o ::before usa essa variável e começa após o hover bridge\n `--dropdown-bg: ${dropdownBg}`,\n `--dropdown-radius: ${borderRadius}px`,\n `border-radius: ${borderRadius}px`,\n \"min-width: 220px\",\n \"padding: 0.5rem 0\",\n ];\n\n // Resolve dropdown item styles - herda linkColor\n const linkFontSizeValue = fontSizes[linkFontSize] || fontSizes.md;\n const dropdownItemStyles = [\n `color: ${linkColor}`,\n `font-size: ${linkFontSizeValue}`,\n \"text-decoration: none\",\n \"font-weight: 500\",\n \"padding: 0.75rem 1.25rem\",\n \"display: block\",\n \"white-space: nowrap\",\n \"transition: background-color 0.2s ease, color 0.2s ease\",\n ];\n\n // Dropdown item hover CSS - usa mesma lógica dos links com fundo sutil\n const dropdownHoverBg = linkHoverColor.startsWith('#')\n ? `${linkHoverColor}15` // Adiciona 15 no final (opacity ~8%)\n : linkHoverColor.replace('rgb(', 'rgba(').replace(')', ', 0.08)');\n\n cssRules.push(`\n ${scope} .sg-navbar-dropdown__item:hover {\n background-color: ${dropdownHoverBg} !important;\n color: ${linkHoverColor} !important;\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n `);\n\n return {\n nav: navStyles.join(\"; \"),\n link: linkStyles.join(\"; \"),\n button: buttonStyle,\n brandText: brandTextStyles.join(\"; \"),\n dropdown: dropdownStyles.join(\"; \"),\n dropdownItem: dropdownItemStyles.join(\"; \"),\n css: cssRules.join(\"\\n\"),\n };\n}\n\n/**\n * Resolve hero button styles based on theme\n */\nexport function resolveHeroButtonStyles(theme?: any, _blockId?: string): { primary: string; secondary: string; css: string } {\n const primaryColor = theme?.colors?.primary || \"#3b82f6\";\n const primaryText = theme?.colors?.primaryText || \"#ffffff\";\n\n const primaryStyles = [\n `background-color: ${primaryColor}`,\n `color: ${primaryText}`,\n \"padding: 0.875rem 2rem\",\n \"border-radius: 0.5rem\",\n \"font-weight: 600\",\n \"font-size: 1rem\",\n \"text-decoration: none\",\n \"display: inline-block\",\n \"transition: all 0.2s ease\",\n \"border: none\",\n ].join(\"; \");\n\n const secondaryStyles = [\n \"background-color: transparent\",\n `color: ${primaryColor}`,\n \"padding: 0.875rem 2rem\",\n \"border-radius: 0.5rem\",\n \"font-weight: 600\",\n \"font-size: 1rem\",\n \"text-decoration: none\",\n \"display: inline-block\",\n \"transition: all 0.2s ease\",\n `border: 2px solid ${primaryColor}`,\n ].join(\"; \");\n\n // Hover effects are now controlled by the hover effects system\n // This function returns empty CSS - use resolveHeroButtonStylesWithHover for hover effects\n return {\n primary: primaryStyles,\n secondary: secondaryStyles,\n css: \"\",\n };\n}\n\n/**\n * Convert a color to rgba with opacity\n * Supports hex (#fff, #ffffff) and rgb() formats\n */\nexport function applyOpacityToColor(color: string, opacity: number): string {\n if (opacity >= 100) return color;\n\n const alpha = opacity / 100;\n\n // Handle hex colors\n if (color.startsWith(\"#\")) {\n let hex = color.slice(1);\n\n // Convert 3-char hex to 6-char\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n\n // Handle rgb() colors\n if (color.startsWith(\"rgb(\")) {\n const match = color.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\n if (match) {\n return `rgba(${match[1]}, ${match[2]}, ${match[3]}, ${alpha})`;\n }\n }\n\n // Handle rgba() - just update alpha\n if (color.startsWith(\"rgba(\")) {\n return color.replace(/,\\s*[\\d.]+\\s*\\)$/, `, ${alpha})`);\n }\n\n // Fallback: use CSS opacity (not ideal for backgrounds)\n return color;\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Convert style object to inline style string\n */\nexport function styleObjectToString(styles: Record<string, string | number | undefined>): string {\n return Object.entries(styles)\n .filter(([, value]) => value !== undefined && value !== \"\")\n .map(([key, value]) => {\n // Convert camelCase to kebab-case\n const cssKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n return `${cssKey}: ${value}`;\n })\n .join(\"; \");\n}\n\n/**\n * Merge multiple style strings\n */\nexport function mergeStyles(...styles: (string | undefined)[]): string {\n return styles\n .filter(Boolean)\n .join(\"; \")\n .replace(/;+/g, \";\")\n .replace(/;\\s*$/, \"\");\n}\n\n/**\n * Convert inline style string to React CSSProperties object\n */\nexport function styleStringToReactStyle(styleString: string): any {\n if (!styleString) return {};\n\n return styleString\n .split(\";\")\n .reduce((acc, rule) => {\n const [rawKey, rawValue] = rule.split(\":\");\n const key = rawKey?.trim();\n const value = rawValue?.trim();\n\n if (key && value) {\n // ✅ Não camelCase CSS variables (React precisa da chave EXATA)\n if (key.startsWith(\"--\")) {\n acc[key] = value;\n } else {\n // Convert kebab-case to camelCase\n const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n acc[camelKey] = value;\n }\n }\n return acc;\n }, {} as any);\n}\n"],"names":["shadowValues","fontSizes","navbarDefaults","resolveButtonStyle","variant","bgColor","textColor","borderRadius","padding","fontSize","baseStyles","resolveNavbarStyles","props","blockId","theme","themePrimaryColor","themePrimaryText","safeLinkColor","opacity","blurOpacity","shadow","linkColor","linkFontSize","linkHoverEffect","linkHoverIntensity","buttonColor","buttonTextColor","buttonBorderRadius","buttonVariant","buttonSize","buttonHoverEffect","buttonHoverIntensity","buttonHoverOverlay","buttonHoverIconName","floating","sticky","transparent","variation","layout","isMinimal","isCompact","navStyles","cssRules","rawBg","effectiveBg","bgWithOpacity","applyOpacityToColor","blurAmount","blurBgOpacity","effectiveRadius","shadowValue","transitionDuration","getLinkFontSize","linkPadding","linkStyles","scope","linkHoverColor","linkHoverResult","generateLinkHoverStyles","buttonHoverResult","generateButtonHoverStyles","getButtonHoverKeyframes","generateButtonOverlayCSS","buttonSizeStyles","btnSizeConfig","btnPadding","btnSize","buttonStyle","brandTextStyles","dropdownStyles","linkFontSizeValue","dropdownItemStyles","dropdownHoverBg","color","alpha","hex","r","g","b","match","mergeStyles","styles","styleStringToReactStyle","styleString","acc","rule","rawKey","rawValue","key","value","camelKey"],"mappings":"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"}
1
+ {"version":3,"file":"styleResolver.js","sources":["../../../src/engine/export/styleResolver.ts"],"sourcesContent":["/**\n * Style Resolver\n *\n * Sistema centralizado de resolução de estilos que combina\n * valores default com customizações do usuário, gerando\n * estilos inline completos para HTML export.\n */\n\n// Import hover effects from shared module\nimport {\n generateLinkHoverStyles,\n generateButtonHoverStyles,\n generateButtonOverlayCSS,\n getButtonHoverKeyframes,\n hexToRgb,\n hexToRgba,\n adjustColor,\n type ButtonHoverOverlay,\n} from \"../shared/hoverEffects\";\n\n// Re-export for backwards compatibility\nexport { hexToRgb, hexToRgba, adjustColor };\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Shadow values mapping\n */\nexport const shadowValues: 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 -2px rgba(0, 0, 0, 0.1)\",\n lg: \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1)\",\n xl: \"0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1)\",\n};\n\n/**\n * Font size values mapping\n */\nexport const fontSizes: Record<string, string> = {\n sm: \"0.875rem\",\n md: \"1rem\",\n lg: \"1.125rem\",\n};\n\n// ============================================================================\n// NAVBAR STYLE RESOLVER\n// ============================================================================\n\n/**\n * Resolved styles for navbar components\n */\nexport interface NavbarResolvedStyles {\n /** Styles for the nav element */\n nav: string;\n /** Styles for navigation links */\n link: string;\n /** Styles for the CTA button */\n button: string;\n /** Styles for the brand text */\n brandText: string;\n /** Styles for dropdown container */\n dropdown: string;\n /** Styles for dropdown items */\n dropdownItem: string;\n /** Dynamic CSS block for hover states and media queries */\n css: string;\n}\n\n/**\n * Default navbar styles (garantem aparência mesmo sem CSS externo)\n */\nconst navbarDefaults = {\n bg: \"#ffffff\",\n opacity: 100,\n borderRadius: 0,\n shadow: \"sm\" as const,\n linkColor: \"#1f2937\",\n linkFontSize: \"md\" as const,\n buttonColor: \"#3b82f6\",\n buttonTextColor: \"#ffffff\",\n buttonBorderRadius: 8,\n buttonVariant: \"solid\" as const,\n};\n\n/**\n * Resolve button styles based on variant\n */\nfunction resolveButtonStyle(\n variant: string,\n bgColor: string,\n textColor: string,\n borderRadius: number,\n padding: string = \"0.5rem 1rem\",\n fontSize: string = \"1rem\",\n): string {\n const baseStyles = [\n `padding: ${padding}`,\n `font-size: ${fontSize}`,\n `border-radius: ${borderRadius}px`,\n \"text-decoration: none\",\n \"font-weight: 500\",\n \"display: inline-block\",\n \"transition: all 0.2s ease\",\n \"cursor: pointer\",\n \"position: relative\", // Needed for shine effect\n \"overflow: hidden\", // Needed for shine effect\n ];\n\n switch (variant) {\n case \"outline\":\n return [\n ...baseStyles,\n \"background-color: transparent\",\n `color: ${bgColor}`,\n `border: 2px solid ${bgColor}`,\n ].join(\"; \");\n\n case \"ghost\":\n return [\n ...baseStyles,\n \"background-color: transparent\",\n `color: ${bgColor}`,\n \"border: none\",\n ].join(\"; \");\n\n case \"solid\":\n default:\n return [\n ...baseStyles,\n `background-color: ${bgColor}`,\n `color: ${textColor}`,\n \"border: none\",\n ].join(\"; \");\n }\n}\n\n/**\n * Resolve all navbar styles from block props\n *\n * @param props - Block props from navbar\n * @param blockId - Unique block ID for scoping CSS\n * @param theme - Theme tokens for palette colors\n * @returns Resolved inline style strings and dynamic CSS\n */\nexport function resolveNavbarStyles(props: Record<string, any>, blockId: string, theme?: any): NavbarResolvedStyles {\n // Use theme colors if available, otherwise use defaults\n const themePrimaryColor = theme?.colors?.primary || navbarDefaults.buttonColor;\n const themePrimaryText = theme?.colors?.primaryText || navbarDefaults.buttonTextColor;\n\n // Priorizar menuLinkColor da paleta (cor específica para links do menu)\n // menuLinkColor já vem otimizado para contraste, então não precisa verificação adicional\n const themeLinkColor = theme?.colors?.menuLinkColor || theme?.colors?.primary || navbarDefaults.linkColor;\n\n // Usar a cor do tema diretamente (menuLinkColor já foi calculado para ter contraste adequado)\n const safeLinkColor = themeLinkColor;\n\n // Merge props with defaults (theme-aware)\n const {\n opacity = navbarDefaults.opacity,\n blurOpacity = 15,\n borderRadius = navbarDefaults.borderRadius,\n shadow = navbarDefaults.shadow,\n linkColor = safeLinkColor,\n linkFontSize = navbarDefaults.linkFontSize,\n linkHoverEffect = \"background\",\n linkHoverIntensity = 50,\n buttonColor = themePrimaryColor,\n buttonTextColor = themePrimaryText,\n buttonBorderRadius = navbarDefaults.buttonBorderRadius,\n buttonVariant = navbarDefaults.buttonVariant,\n buttonSize = \"md\",\n buttonHoverEffect = \"darken\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n floating = false,\n sticky = true,\n transparent = false,\n variation = \"navbar-classic\",\n layout = \"expanded\",\n } = props;\n\n const isMinimal = variation === \"navbar-minimal\";\n const isCompact = layout === \"compact\";\n\n // Resolve nav styles\n const navStyles: string[] = [];\n const cssRules: string[] = [];\n\n // Navbar height - compact is 20% smaller (3.6rem vs 4.5rem)\n navStyles.push(`height: ${isCompact ? \"3.6rem\" : \"4.5rem\"}`);\n\n // Determine effective background\n const rawBg = props.bg;\n const effectiveBg = rawBg !== undefined ? rawBg : (transparent ? \"transparent\" : navbarDefaults.bg);\n\n // Apply background\n if (effectiveBg === \"transparent\") {\n navStyles.push(\"background-color: transparent\");\n } else {\n const isGradient = effectiveBg.includes(\"gradient\") ||\n effectiveBg.includes(\"linear\") ||\n effectiveBg.includes(\"radial\");\n\n if (isGradient) {\n navStyles.push(`background: ${effectiveBg}`);\n if (opacity < 100) {\n navStyles.push(`opacity: ${opacity / 100}`);\n }\n } else {\n // Apply background with user-chosen opacity\n const bgWithOpacity = applyOpacityToColor(effectiveBg, opacity);\n navStyles.push(`background-color: ${bgWithOpacity}`);\n }\n }\n\n // Apply blur intensity as CSS variable for glass effect (ALWAYS, independent of positioning)\n // Convert 0-100 to 0px-30px blur amount\n const blurAmount = Math.round((blurOpacity / 100) * 30); // 0-30px\n const blurBgOpacity = blurOpacity / 100; // 0-1 opacity for frosted glass effect (0% to 100%)\n navStyles.push(`--navbar-blur-amount: ${blurAmount}px`);\n navStyles.push(`--navbar-blur-opacity: ${blurBgOpacity}`);\n\n // Layout specific logic (positioning, not styles)\n if (floating) {\n // Floating navbar - fixed with margins\n navStyles.push(\"position: fixed\");\n navStyles.push(\"top: 20px\");\n navStyles.push(\"left: 20px\");\n navStyles.push(\"right: 20px\");\n navStyles.push(\"width: calc(100% - 40px)\");\n navStyles.push(\"z-index: 1000\");\n\n const effectiveRadius = Math.max(borderRadius, 12);\n if (effectiveRadius > 0) {\n navStyles.push(`border-radius: ${effectiveRadius}px`);\n }\n } else if (sticky) {\n // Sticky navbar - fixed at top, scrolls content only\n navStyles.push(\"position: fixed\");\n navStyles.push(\"top: 0\");\n navStyles.push(\"left: 0\");\n navStyles.push(\"right: 0\");\n navStyles.push(\"width: 100%\");\n navStyles.push(\"z-index: 1000\");\n\n if (borderRadius > 0) {\n navStyles.push(`border-bottom-left-radius: ${borderRadius}px`);\n navStyles.push(`border-bottom-right-radius: ${borderRadius}px`);\n }\n } else {\n // Non-sticky navbar - absolute position, scrolls with page but stays on top of hero\n navStyles.push(\"position: absolute\");\n navStyles.push(\"top: 0\");\n navStyles.push(\"left: 0\");\n navStyles.push(\"right: 0\");\n navStyles.push(\"width: 100%\");\n navStyles.push(\"z-index: 1000\");\n\n if (borderRadius > 0) {\n navStyles.push(`border-bottom-left-radius: ${borderRadius}px`);\n navStyles.push(`border-bottom-right-radius: ${borderRadius}px`);\n }\n }\n\n // Shadow\n // For classic/minimal, shadow behaves normally\n const shadowValue = shadowValues[shadow] || shadowValues.sm;\n if (shadow !== \"none\") {\n navStyles.push(`box-shadow: ${shadowValue}`);\n }\n\n // Padding adjustments\n if (isMinimal) {\n navStyles.push(\"padding: 0.5rem 1rem\"); // Smaller padding\n } else {\n // handled by exportHtml defaults usually, but we can enforce\n }\n\n // Resolve link styles\n // Transição mais longa para efeitos animados de underline\n const transitionDuration = (linkHoverEffect === \"underline\" || linkHoverEffect === \"underline-center\" || linkHoverEffect === \"slide-bg\")\n ? \"0.3s\"\n : \"0.2s\";\n\n // Link font size - compact mode uses smaller sizes\n const getLinkFontSize = () => {\n if (isMinimal || isCompact) return fontSizes.sm;\n return fontSizes[linkFontSize] || fontSizes.md;\n };\n\n // Link padding - compact mode uses smaller padding\n const linkPadding = isCompact ? \"0.375rem 0.5rem\" : \"0.5rem 0.75rem\";\n\n const linkStyles = [\n `color: ${linkColor}`,\n `font-size: ${getLinkFontSize()}`,\n \"text-decoration: none\",\n `font-weight: ${isCompact ? \"400\" : \"500\"}`,\n `transition: all ${transitionDuration} ease`,\n `padding: ${linkPadding}`,\n \"border-radius: 6px\",\n \"display: inline-block\",\n ];\n\n // Hover Effects CSS\n // Generate a unique selector based on blockId\n const scope = `[data-block-id=\"${blockId}\"]`;\n\n // Get linkHoverColor from props (default to buttonColor for backwards compatibility)\n const linkHoverColor = props.linkHoverColor || buttonColor;\n\n // Link Hover - gerar CSS baseado no efeito selecionado\n // Nota: normalização de intensidade é feita internamente pelo módulo hoverEffects\n const linkHoverResult = generateLinkHoverStyles({\n effect: linkHoverEffect as any,\n intensity: linkHoverIntensity,\n hoverColor: linkHoverColor,\n });\n\n // Adicionar estilos base se necessário (para animações como underline)\n if (linkHoverResult.base) {\n cssRules.push(`\n ${scope} .sg-navbar__link {\n ${linkHoverResult.base}\n }\n `);\n }\n\n cssRules.push(`\n ${scope} .sg-navbar__link:hover {\n ${linkHoverResult.hover}\n }\n `);\n\n // Button Hover - gerar CSS baseado no efeito selecionado\n const buttonHoverResult = generateButtonHoverStyles({\n effect: buttonHoverEffect as any,\n intensity: buttonHoverIntensity,\n buttonColor,\n buttonTextColor,\n variant: buttonVariant as any,\n });\n\n // Adicionar estilos base se necessário (para animações como pulse, shine)\n if (buttonHoverResult.base) {\n cssRules.push(`\n ${scope} .sg-navbar__btn {\n ${buttonHoverResult.base}\n }\n `);\n }\n\n cssRules.push(`\n ${scope} .sg-navbar__btn:hover {\n ${buttonHoverResult.hover}\n }\n `);\n\n // Adicionar keyframes para animações (pulse)\n cssRules.push(getButtonHoverKeyframes());\n\n // Adicionar CSS para efeito overlay (se configurado)\n if (buttonHoverOverlay && buttonHoverOverlay !== \"none\") {\n cssRules.push(generateButtonOverlayCSS(`${scope} .sg-navbar__btn`, {\n overlay: buttonHoverOverlay as ButtonHoverOverlay,\n primaryColor: buttonColor,\n iconName: buttonHoverIconName,\n textColor: buttonTextColor,\n }));\n }\n\n // Resolve button styles based on buttonSize prop\n const buttonSizeStyles: Record<string, { padding: string; fontSize: string }> = {\n sm: { padding: \"0.375rem 0.875rem\", fontSize: \"0.875rem\" },\n md: { padding: \"0.5rem 1rem\", fontSize: \"1rem\" },\n lg: { padding: \"0.625rem 1.25rem\", fontSize: \"1.125rem\" },\n };\n\n // Use buttonSize from props, fallback to sm for minimal or compact variations\n const effectiveButtonSize = (isMinimal || isCompact) ? \"sm\" : buttonSize;\n const btnSizeConfig = buttonSizeStyles[effectiveButtonSize] || buttonSizeStyles.md;\n const btnPadding = btnSizeConfig.padding;\n const btnSize = btnSizeConfig.fontSize;\n\n const buttonStyle = resolveButtonStyle(\n buttonVariant,\n buttonColor,\n buttonTextColor,\n buttonBorderRadius,\n btnPadding,\n btnSize\n );\n\n // Resolve brand text styles\n const brandTextStyles = [\n `color: ${buttonColor}`,\n \"font-weight: 700\",\n \"font-size: 1.25rem\",\n ];\n\n // Resolve dropdown styles - herda EXATAMENTE a mesma opacidade/blur da navbar\n // NOTA: backdrop-filter é aplicado via CSS: .sg-navbar--sticky .sg-navbar-dropdown\n const dropdownBg = applyOpacityToColor(effectiveBg === \"transparent\" ? navbarDefaults.bg : effectiveBg, opacity);\n\n const dropdownStyles = [\n // Background via CSS variable - o ::before usa essa variável e começa após o hover bridge\n `--dropdown-bg: ${dropdownBg}`,\n `--dropdown-radius: ${borderRadius}px`,\n `border-radius: ${borderRadius}px`,\n \"min-width: 220px\",\n \"padding: 0.5rem 0\",\n ];\n\n // Resolve dropdown item styles - herda linkColor\n const linkFontSizeValue = fontSizes[linkFontSize] || fontSizes.md;\n const dropdownItemStyles = [\n `color: ${linkColor}`,\n `font-size: ${linkFontSizeValue}`,\n \"text-decoration: none\",\n \"font-weight: 500\",\n \"padding: 0.75rem 1.25rem\",\n \"display: block\",\n \"white-space: nowrap\",\n \"transition: background-color 0.2s ease, color 0.2s ease\",\n ];\n\n // Dropdown item hover CSS - usa mesma lógica dos links com fundo sutil\n const dropdownHoverBg = linkHoverColor.startsWith('#')\n ? `${linkHoverColor}15` // Adiciona 15 no final (opacity ~8%)\n : linkHoverColor.replace('rgb(', 'rgba(').replace(')', ', 0.08)');\n\n cssRules.push(`\n ${scope} .sg-navbar-dropdown__item:hover {\n background-color: ${dropdownHoverBg} !important;\n color: ${linkHoverColor} !important;\n transition: background-color 0.2s ease, color 0.2s ease;\n }\n `);\n\n return {\n nav: navStyles.join(\"; \"),\n link: linkStyles.join(\"; \"),\n button: buttonStyle,\n brandText: brandTextStyles.join(\"; \"),\n dropdown: dropdownStyles.join(\"; \"),\n dropdownItem: dropdownItemStyles.join(\"; \"),\n css: cssRules.join(\"\\n\"),\n };\n}\n\n/**\n * Resolve hero button styles based on theme\n */\nexport function resolveHeroButtonStyles(theme?: any, _blockId?: string): { primary: string; secondary: string; css: string } {\n const primaryColor = theme?.colors?.primary || \"#3b82f6\";\n const primaryText = theme?.colors?.primaryText || \"#ffffff\";\n\n const primaryStyles = [\n `background-color: ${primaryColor}`,\n `color: ${primaryText}`,\n \"padding: 0.875rem 2rem\",\n \"border-radius: 0.5rem\",\n \"font-weight: 600\",\n \"font-size: 1rem\",\n \"text-decoration: none\",\n \"display: inline-block\",\n \"transition: all 0.2s ease\",\n \"border: none\",\n ].join(\"; \");\n\n const secondaryStyles = [\n \"background-color: transparent\",\n `color: ${primaryColor}`,\n \"padding: 0.875rem 2rem\",\n \"border-radius: 0.5rem\",\n \"font-weight: 600\",\n \"font-size: 1rem\",\n \"text-decoration: none\",\n \"display: inline-block\",\n \"transition: all 0.2s ease\",\n `border: 2px solid ${primaryColor}`,\n ].join(\"; \");\n\n // Hover effects are now controlled by the hover effects system\n // This function returns empty CSS - use resolveHeroButtonStylesWithHover for hover effects\n return {\n primary: primaryStyles,\n secondary: secondaryStyles,\n css: \"\",\n };\n}\n\n/**\n * Convert a color to rgba with opacity\n * Supports hex (#fff, #ffffff) and rgb() formats\n */\nexport function applyOpacityToColor(color: string, opacity: number): string {\n if (opacity >= 100) return color;\n\n const alpha = opacity / 100;\n\n // Handle hex colors\n if (color.startsWith(\"#\")) {\n let hex = color.slice(1);\n\n // Convert 3-char hex to 6-char\n if (hex.length === 3) {\n hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2];\n }\n\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n\n // Handle rgb() colors\n if (color.startsWith(\"rgb(\")) {\n const match = color.match(/rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/);\n if (match) {\n return `rgba(${match[1]}, ${match[2]}, ${match[3]}, ${alpha})`;\n }\n }\n\n // Handle rgba() - just update alpha\n if (color.startsWith(\"rgba(\")) {\n return color.replace(/,\\s*[\\d.]+\\s*\\)$/, `, ${alpha})`);\n }\n\n // Fallback: use CSS opacity (not ideal for backgrounds)\n return color;\n}\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Convert style object to inline style string\n */\nexport function styleObjectToString(styles: Record<string, string | number | undefined>): string {\n return Object.entries(styles)\n .filter(([, value]) => value !== undefined && value !== \"\")\n .map(([key, value]) => {\n // Convert camelCase to kebab-case\n const cssKey = key.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n return `${cssKey}: ${value}`;\n })\n .join(\"; \");\n}\n\n/**\n * Merge multiple style strings\n */\nexport function mergeStyles(...styles: (string | undefined)[]): string {\n return styles\n .filter(Boolean)\n .join(\"; \")\n .replace(/;+/g, \";\")\n .replace(/;\\s*$/, \"\");\n}\n\n/**\n * Convert inline style string to React CSSProperties object\n */\nexport function styleStringToReactStyle(styleString: string): any {\n if (!styleString) return {};\n\n return styleString\n .split(\";\")\n .reduce((acc, rule) => {\n const [rawKey, rawValue] = rule.split(\":\");\n const key = rawKey?.trim();\n const value = rawValue?.trim();\n\n if (key && value) {\n // ✅ Não camelCase CSS variables (React precisa da chave EXATA)\n if (key.startsWith(\"--\")) {\n acc[key] = value;\n } else {\n // Convert kebab-case to camelCase\n const camelKey = key.replace(/-([a-z])/g, (g) => g[1].toUpperCase());\n acc[camelKey] = value;\n }\n }\n return acc;\n }, {} as any);\n}\n"],"names":["shadowValues","fontSizes","navbarDefaults","resolveButtonStyle","variant","bgColor","textColor","borderRadius","padding","fontSize","baseStyles","resolveNavbarStyles","props","blockId","theme","themePrimaryColor","themePrimaryText","safeLinkColor","opacity","blurOpacity","shadow","linkColor","linkFontSize","linkHoverEffect","linkHoverIntensity","buttonColor","buttonTextColor","buttonBorderRadius","buttonVariant","buttonSize","buttonHoverEffect","buttonHoverIntensity","buttonHoverOverlay","buttonHoverIconName","floating","sticky","transparent","variation","layout","isMinimal","isCompact","navStyles","cssRules","rawBg","effectiveBg","bgWithOpacity","applyOpacityToColor","blurAmount","blurBgOpacity","effectiveRadius","shadowValue","transitionDuration","getLinkFontSize","linkPadding","linkStyles","scope","linkHoverColor","linkHoverResult","generateLinkHoverStyles","buttonHoverResult","generateButtonHoverStyles","getButtonHoverKeyframes","generateButtonOverlayCSS","buttonSizeStyles","btnSizeConfig","btnPadding","btnSize","buttonStyle","brandTextStyles","dropdownStyles","linkFontSizeValue","dropdownItemStyles","dropdownHoverBg","color","alpha","hex","r","g","b","match","mergeStyles","styles","styleStringToReactStyle","styleString","acc","rule","rawKey","rawValue","key","value","camelKey"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pluginRegistry.d.ts","sourceRoot":"","sources":["../../../src/engine/plugins/pluginRegistry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,KAAK,EAEV,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,UAAU,EAEX,MAAM,SAAS,CAAC;AAMjB,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAE3C,0CAA0C;IAC1C,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IAEtD,2CAA2C;IAC3C,MAAM,IAAI,kBAAkB,EAAE,CAAC;IAE/B,mDAAmD;IACnD,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;IAE5C,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAEjE,sEAAsE;IACtE,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAEnE,wEAAwE;IACxE,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAEzD,2CAA2C;IAC3C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAE9D,qDAAqD;IACrD,sBAAsB,IAAI,eAAe,EAAE,CAAC;IAE5C,+DAA+D;IAC/D,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAEnG,yEAAyE;IACzE,gBAAgB,IAAI,YAAY,EAAE,CAAC;IAEnC,qDAAqD;IACrD,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAE5D,2DAA2D;IAC3D,cAAc,IAAI,UAAU,EAAE,CAAC;IAE/B,yDAAyD;IACzD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAChF;AA8OD,eAAO,MAAM,cAAc,EAAE,cAAyC,CAAC"}
1
+ {"version":3,"file":"pluginRegistry.d.ts","sourceRoot":"","sources":["../../../src/engine/plugins/pluginRegistry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtE,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,UAAU,EAEX,MAAM,SAAS,CAAC;AAMjB,MAAM,WAAW,cAAc;IAC7B,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAE3C,0CAA0C;IAC1C,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAAC;IAEtD,2CAA2C;IAC3C,MAAM,IAAI,kBAAkB,EAAE,CAAC;IAE/B,mDAAmD;IACnD,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;IAE5C,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAEjE,sEAAsE;IACtE,UAAU,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CAAC;IAEnE,wEAAwE;IACxE,uBAAuB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAEzD,2CAA2C;IAC3C,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAAC;IAE9D,qDAAqD;IACrD,sBAAsB,IAAI,eAAe,EAAE,CAAC;IAE5C,+DAA+D;IAC/D,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,GAAG,iBAAiB,GAAG,SAAS,CAAC;IAEnG,yEAAyE;IACzE,gBAAgB,IAAI,YAAY,EAAE,CAAC;IAEnC,qDAAqD;IACrD,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAAC;IAE5D,2DAA2D;IAC3D,cAAc,IAAI,UAAU,EAAE,CAAC;IAE/B,yDAAyD;IACzD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAChF;AA8OD,eAAO,MAAM,cAAc,EAAE,cAAyC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"pluginRegistry.js","sources":["../../../src/engine/plugins/pluginRegistry.ts"],"sourcesContent":["/**\n * Plugin Registry\n * Registry centralizado para gerenciamento de plugins\n */\n\nimport { logger } from \"../../utils/logger\";\nimport type { BlockType, SiteDocument } from \"../schema/siteDocument\";\nimport type { BlockDefinition } from \"../registry/types\";\nimport { componentRegistry } from \"../registry/registry\";\nimport type {\n PluginManifest,\n PluginRegistration,\n ContentProvider,\n EditorRestriction,\n PageTemplate,\n DataSchema,\n SitePluginsConfig,\n} from \"./types\";\n\n// ============================================================================\n// Plugin Registry Interface\n// ============================================================================\n\nexport interface PluginRegistry {\n /** Registra um plugin (manifest + hooks) */\n register(plugin: PluginRegistration): void;\n\n /** Retorna um plugin registrado por ID */\n get(pluginId: string): PluginRegistration | undefined;\n\n /** Retorna todos os plugins registrados */\n getAll(): PluginRegistration[];\n\n /** Retorna IDs dos plugins ativos num documento */\n getActive(document: SiteDocument): string[];\n\n /** Ativa um plugin num documento (retorna documento atualizado) */\n activate(document: SiteDocument, pluginId: string): SiteDocument;\n\n /** Desativa um plugin num documento (retorna documento atualizado) */\n deactivate(document: SiteDocument, pluginId: string): SiteDocument;\n\n /** Registra um content provider (implementado pelo consumer project) */\n registerContentProvider(provider: ContentProvider): void;\n\n /** Retorna um content provider por tipo */\n getContentProvider(type: string): ContentProvider | undefined;\n\n /** Retorna todos os content providers registrados */\n getAllContentProviders(): ContentProvider[];\n\n /** Retorna restrições de edição para um bloco num documento */\n getEditorRestrictions(document: SiteDocument, blockType: BlockType): EditorRestriction | undefined;\n\n /** Retorna todos os page templates disponíveis de plugins registrados */\n getPageTemplates(): PageTemplate[];\n\n /** Retorna page templates de um plugin específico */\n getPageTemplatesForPlugin(pluginId: string): PageTemplate[];\n\n /** Retorna todos os data schemas de plugins registrados */\n getDataSchemas(): DataSchema[];\n\n /** Verifica se um plugin tem dependências satisfeitas */\n checkDependencies(pluginId: string): { satisfied: boolean; missing: string[] };\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nclass PluginRegistryImpl implements PluginRegistry {\n private plugins: Map<string, PluginRegistration> = new Map();\n private contentProviders: Map<string, ContentProvider> = new Map();\n\n register(plugin: PluginRegistration): void {\n const { id } = plugin.manifest;\n if (this.plugins.has(id)) {\n logger.warn(`Plugin \"${id}\" is already registered. Overwriting...`);\n }\n this.plugins.set(id, plugin);\n\n // Registrar block definitions do plugin no componentRegistry\n if (plugin.getBlockDefinitions) {\n const definitions = plugin.getBlockDefinitions();\n for (const def of definitions) {\n componentRegistry.register(def);\n }\n }\n\n logger.debug(`Plugin \"${id}\" v${plugin.manifest.version} registered`);\n }\n\n get(pluginId: string): PluginRegistration | undefined {\n return this.plugins.get(pluginId);\n }\n\n getAll(): PluginRegistration[] {\n return Array.from(this.plugins.values());\n }\n\n getActive(document: SiteDocument): string[] {\n return document.plugins?.active ?? [];\n }\n\n activate(document: SiteDocument, pluginId: string): SiteDocument {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n logger.error(`Plugin \"${pluginId}\" not found in registry`);\n return document;\n }\n\n // Verificar dependências\n const deps = this.checkDependencies(pluginId);\n if (!deps.satisfied) {\n logger.error(\n `Plugin \"${pluginId}\" has unsatisfied dependencies: ${deps.missing.join(\", \")}`\n );\n return document;\n }\n\n // Verificar se já está ativo\n const activePlugins = document.plugins?.active ?? [];\n if (activePlugins.includes(pluginId)) {\n logger.warn(`Plugin \"${pluginId}\" is already active`);\n return document;\n }\n\n // Criar plugins config se não existir\n const pluginsConfig: SitePluginsConfig = {\n active: [...activePlugins, pluginId],\n config: document.plugins?.config ?? {},\n };\n\n // Aplicar config padrão se não existir\n if (plugin.manifest.defaultConfig && !pluginsConfig.config?.[pluginId]) {\n pluginsConfig.config = {\n ...pluginsConfig.config,\n [pluginId]: { ...plugin.manifest.defaultConfig },\n };\n }\n\n let updatedDocument: SiteDocument = {\n ...document,\n plugins: pluginsConfig,\n };\n\n // Chamar hook onActivate\n if (plugin.onActivate) {\n updatedDocument = plugin.onActivate(updatedDocument);\n }\n\n logger.debug(`Plugin \"${pluginId}\" activated`);\n return updatedDocument;\n }\n\n deactivate(document: SiteDocument, pluginId: string): SiteDocument {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n logger.error(`Plugin \"${pluginId}\" not found in registry`);\n return document;\n }\n\n const activePlugins = document.plugins?.active ?? [];\n if (!activePlugins.includes(pluginId)) {\n logger.warn(`Plugin \"${pluginId}\" is not active`);\n return document;\n }\n\n // Verificar se outros plugins dependem deste\n for (const active of activePlugins) {\n if (active === pluginId) continue;\n const activePlugin = this.plugins.get(active);\n if (activePlugin?.manifest.dependencies?.includes(pluginId)) {\n logger.error(\n `Cannot deactivate \"${pluginId}\": plugin \"${active}\" depends on it`\n );\n return document;\n }\n }\n\n const pluginsConfig: SitePluginsConfig = {\n active: activePlugins.filter((id) => id !== pluginId),\n config: document.plugins?.config ?? {},\n };\n\n let updatedDocument: SiteDocument = {\n ...document,\n plugins: pluginsConfig,\n };\n\n // Chamar hook onDeactivate\n if (plugin.onDeactivate) {\n updatedDocument = plugin.onDeactivate(updatedDocument);\n }\n\n logger.debug(`Plugin \"${pluginId}\" deactivated`);\n return updatedDocument;\n }\n\n registerContentProvider(provider: ContentProvider): void {\n if (this.contentProviders.has(provider.type)) {\n logger.warn(\n `ContentProvider \"${provider.type}\" is already registered. Overwriting...`\n );\n }\n this.contentProviders.set(provider.type, provider);\n logger.debug(`ContentProvider \"${provider.type}\" registered`);\n }\n\n getContentProvider(type: string): ContentProvider | undefined {\n return this.contentProviders.get(type);\n }\n\n getAllContentProviders(): ContentProvider[] {\n return Array.from(this.contentProviders.values());\n }\n\n getEditorRestrictions(\n document: SiteDocument,\n blockType: BlockType\n ): EditorRestriction | undefined {\n const activePlugins = this.getActive(document);\n\n // Merge restrictions from all active plugins\n let merged: EditorRestriction | undefined;\n\n for (const pluginId of activePlugins) {\n const plugin = this.plugins.get(pluginId);\n if (!plugin?.getEditorRestrictions) continue;\n\n const restriction = plugin.getEditorRestrictions(blockType);\n if (!restriction) continue;\n\n if (!merged) {\n merged = { ...restriction };\n } else {\n // Merge locked fields (union)\n if (restriction.lockedFields) {\n merged.lockedFields = [\n ...new Set([\n ...(merged.lockedFields ?? []),\n ...restriction.lockedFields,\n ]),\n ];\n }\n // Merge editable fields (intersection se ambos definem)\n if (restriction.editableFields) {\n if (merged.editableFields) {\n merged.editableFields = merged.editableFields.filter((f) =>\n restriction.editableFields!.includes(f)\n );\n } else {\n merged.editableFields = [...restriction.editableFields];\n }\n }\n }\n }\n\n return merged;\n }\n\n getPageTemplates(): PageTemplate[] {\n const templates: PageTemplate[] = [];\n for (const plugin of this.plugins.values()) {\n templates.push(...plugin.manifest.capabilities.pageTemplates);\n }\n return templates;\n }\n\n getPageTemplatesForPlugin(pluginId: string): PageTemplate[] {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) return [];\n return plugin.manifest.capabilities.pageTemplates;\n }\n\n getDataSchemas(): DataSchema[] {\n const schemas: DataSchema[] = [];\n for (const plugin of this.plugins.values()) {\n schemas.push(...plugin.manifest.capabilities.dataSchemas);\n }\n return schemas;\n }\n\n checkDependencies(\n pluginId: string\n ): { satisfied: boolean; missing: string[] } {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n return { satisfied: false, missing: [pluginId] };\n }\n\n const deps = plugin.manifest.dependencies ?? [];\n const missing = deps.filter((dep) => !this.plugins.has(dep));\n\n return {\n satisfied: missing.length === 0,\n missing,\n };\n }\n}\n\n// Singleton instance\nexport const pluginRegistry: PluginRegistry = new PluginRegistryImpl();\n"],"names":["PluginRegistryImpl","plugin","id","logger","definitions","def","componentRegistry","pluginId","document","deps","activePlugins","pluginsConfig","updatedDocument","active","provider","type","blockType","merged","restriction","f","templates","schemas","missing","dep","pluginRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"pluginRegistry.js","sources":["../../../src/engine/plugins/pluginRegistry.ts"],"sourcesContent":["/**\n * Plugin Registry\n * Registry centralizado para gerenciamento de plugins\n */\n\nimport { logger } from \"../../utils/logger\";\nimport type { BlockType, SiteDocument } from \"../schema/siteDocument\";\nimport { componentRegistry } from \"../registry/registry\";\nimport type {\n PluginRegistration,\n ContentProvider,\n EditorRestriction,\n PageTemplate,\n DataSchema,\n SitePluginsConfig,\n} from \"./types\";\n\n// ============================================================================\n// Plugin Registry Interface\n// ============================================================================\n\nexport interface PluginRegistry {\n /** Registra um plugin (manifest + hooks) */\n register(plugin: PluginRegistration): void;\n\n /** Retorna um plugin registrado por ID */\n get(pluginId: string): PluginRegistration | undefined;\n\n /** Retorna todos os plugins registrados */\n getAll(): PluginRegistration[];\n\n /** Retorna IDs dos plugins ativos num documento */\n getActive(document: SiteDocument): string[];\n\n /** Ativa um plugin num documento (retorna documento atualizado) */\n activate(document: SiteDocument, pluginId: string): SiteDocument;\n\n /** Desativa um plugin num documento (retorna documento atualizado) */\n deactivate(document: SiteDocument, pluginId: string): SiteDocument;\n\n /** Registra um content provider (implementado pelo consumer project) */\n registerContentProvider(provider: ContentProvider): void;\n\n /** Retorna um content provider por tipo */\n getContentProvider(type: string): ContentProvider | undefined;\n\n /** Retorna todos os content providers registrados */\n getAllContentProviders(): ContentProvider[];\n\n /** Retorna restrições de edição para um bloco num documento */\n getEditorRestrictions(document: SiteDocument, blockType: BlockType): EditorRestriction | undefined;\n\n /** Retorna todos os page templates disponíveis de plugins registrados */\n getPageTemplates(): PageTemplate[];\n\n /** Retorna page templates de um plugin específico */\n getPageTemplatesForPlugin(pluginId: string): PageTemplate[];\n\n /** Retorna todos os data schemas de plugins registrados */\n getDataSchemas(): DataSchema[];\n\n /** Verifica se um plugin tem dependências satisfeitas */\n checkDependencies(pluginId: string): { satisfied: boolean; missing: string[] };\n}\n\n// ============================================================================\n// Implementation\n// ============================================================================\n\nclass PluginRegistryImpl implements PluginRegistry {\n private plugins: Map<string, PluginRegistration> = new Map();\n private contentProviders: Map<string, ContentProvider> = new Map();\n\n register(plugin: PluginRegistration): void {\n const { id } = plugin.manifest;\n if (this.plugins.has(id)) {\n logger.warn(`Plugin \"${id}\" is already registered. Overwriting...`);\n }\n this.plugins.set(id, plugin);\n\n // Registrar block definitions do plugin no componentRegistry\n if (plugin.getBlockDefinitions) {\n const definitions = plugin.getBlockDefinitions();\n for (const def of definitions) {\n componentRegistry.register(def);\n }\n }\n\n logger.debug(`Plugin \"${id}\" v${plugin.manifest.version} registered`);\n }\n\n get(pluginId: string): PluginRegistration | undefined {\n return this.plugins.get(pluginId);\n }\n\n getAll(): PluginRegistration[] {\n return Array.from(this.plugins.values());\n }\n\n getActive(document: SiteDocument): string[] {\n return document.plugins?.active ?? [];\n }\n\n activate(document: SiteDocument, pluginId: string): SiteDocument {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n logger.error(`Plugin \"${pluginId}\" not found in registry`);\n return document;\n }\n\n // Verificar dependências\n const deps = this.checkDependencies(pluginId);\n if (!deps.satisfied) {\n logger.error(\n `Plugin \"${pluginId}\" has unsatisfied dependencies: ${deps.missing.join(\", \")}`\n );\n return document;\n }\n\n // Verificar se já está ativo\n const activePlugins = document.plugins?.active ?? [];\n if (activePlugins.includes(pluginId)) {\n logger.warn(`Plugin \"${pluginId}\" is already active`);\n return document;\n }\n\n // Criar plugins config se não existir\n const pluginsConfig: SitePluginsConfig = {\n active: [...activePlugins, pluginId],\n config: document.plugins?.config ?? {},\n };\n\n // Aplicar config padrão se não existir\n if (plugin.manifest.defaultConfig && !pluginsConfig.config?.[pluginId]) {\n pluginsConfig.config = {\n ...pluginsConfig.config,\n [pluginId]: { ...plugin.manifest.defaultConfig },\n };\n }\n\n let updatedDocument: SiteDocument = {\n ...document,\n plugins: pluginsConfig,\n };\n\n // Chamar hook onActivate\n if (plugin.onActivate) {\n updatedDocument = plugin.onActivate(updatedDocument);\n }\n\n logger.debug(`Plugin \"${pluginId}\" activated`);\n return updatedDocument;\n }\n\n deactivate(document: SiteDocument, pluginId: string): SiteDocument {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n logger.error(`Plugin \"${pluginId}\" not found in registry`);\n return document;\n }\n\n const activePlugins = document.plugins?.active ?? [];\n if (!activePlugins.includes(pluginId)) {\n logger.warn(`Plugin \"${pluginId}\" is not active`);\n return document;\n }\n\n // Verificar se outros plugins dependem deste\n for (const active of activePlugins) {\n if (active === pluginId) continue;\n const activePlugin = this.plugins.get(active);\n if (activePlugin?.manifest.dependencies?.includes(pluginId)) {\n logger.error(\n `Cannot deactivate \"${pluginId}\": plugin \"${active}\" depends on it`\n );\n return document;\n }\n }\n\n const pluginsConfig: SitePluginsConfig = {\n active: activePlugins.filter((id) => id !== pluginId),\n config: document.plugins?.config ?? {},\n };\n\n let updatedDocument: SiteDocument = {\n ...document,\n plugins: pluginsConfig,\n };\n\n // Chamar hook onDeactivate\n if (plugin.onDeactivate) {\n updatedDocument = plugin.onDeactivate(updatedDocument);\n }\n\n logger.debug(`Plugin \"${pluginId}\" deactivated`);\n return updatedDocument;\n }\n\n registerContentProvider(provider: ContentProvider): void {\n if (this.contentProviders.has(provider.type)) {\n logger.warn(\n `ContentProvider \"${provider.type}\" is already registered. Overwriting...`\n );\n }\n this.contentProviders.set(provider.type, provider);\n logger.debug(`ContentProvider \"${provider.type}\" registered`);\n }\n\n getContentProvider(type: string): ContentProvider | undefined {\n return this.contentProviders.get(type);\n }\n\n getAllContentProviders(): ContentProvider[] {\n return Array.from(this.contentProviders.values());\n }\n\n getEditorRestrictions(\n document: SiteDocument,\n blockType: BlockType\n ): EditorRestriction | undefined {\n const activePlugins = this.getActive(document);\n\n // Merge restrictions from all active plugins\n let merged: EditorRestriction | undefined;\n\n for (const pluginId of activePlugins) {\n const plugin = this.plugins.get(pluginId);\n if (!plugin?.getEditorRestrictions) continue;\n\n const restriction = plugin.getEditorRestrictions(blockType);\n if (!restriction) continue;\n\n if (!merged) {\n merged = { ...restriction };\n } else {\n // Merge locked fields (union)\n if (restriction.lockedFields) {\n merged.lockedFields = [\n ...new Set([\n ...(merged.lockedFields ?? []),\n ...restriction.lockedFields,\n ]),\n ];\n }\n // Merge editable fields (intersection se ambos definem)\n if (restriction.editableFields) {\n if (merged.editableFields) {\n merged.editableFields = merged.editableFields.filter((f) =>\n restriction.editableFields!.includes(f)\n );\n } else {\n merged.editableFields = [...restriction.editableFields];\n }\n }\n }\n }\n\n return merged;\n }\n\n getPageTemplates(): PageTemplate[] {\n const templates: PageTemplate[] = [];\n for (const plugin of this.plugins.values()) {\n templates.push(...plugin.manifest.capabilities.pageTemplates);\n }\n return templates;\n }\n\n getPageTemplatesForPlugin(pluginId: string): PageTemplate[] {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) return [];\n return plugin.manifest.capabilities.pageTemplates;\n }\n\n getDataSchemas(): DataSchema[] {\n const schemas: DataSchema[] = [];\n for (const plugin of this.plugins.values()) {\n schemas.push(...plugin.manifest.capabilities.dataSchemas);\n }\n return schemas;\n }\n\n checkDependencies(\n pluginId: string\n ): { satisfied: boolean; missing: string[] } {\n const plugin = this.plugins.get(pluginId);\n if (!plugin) {\n return { satisfied: false, missing: [pluginId] };\n }\n\n const deps = plugin.manifest.dependencies ?? [];\n const missing = deps.filter((dep) => !this.plugins.has(dep));\n\n return {\n satisfied: missing.length === 0,\n missing,\n };\n }\n}\n\n// Singleton instance\nexport const pluginRegistry: PluginRegistry = new PluginRegistryImpl();\n"],"names":["PluginRegistryImpl","plugin","id","logger","definitions","def","componentRegistry","pluginId","document","deps","activePlugins","pluginsConfig","updatedDocument","active","provider","type","blockType","merged","restriction","f","templates","schemas","missing","dep","pluginRegistry"],"mappings":"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"}