@brunoalz/smartgesti-site-editor 1.3.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editor/BlockSelector.js +4 -2
- package/dist/editor/BlockSelector.js.map +1 -1
- package/dist/editor/LandingPageEditor.d.ts.map +1 -1
- package/dist/editor/LandingPageEditor.js +183 -169
- package/dist/editor/LandingPageEditor.js.map +1 -1
- package/dist/editor/PaletteSelector.d.ts +3 -0
- package/dist/editor/PaletteSelector.d.ts.map +1 -1
- package/dist/editor/PaletteSelector.js +114 -25
- package/dist/editor/PaletteSelector.js.map +1 -1
- package/dist/editor/components/RightPanel.d.ts +2 -0
- package/dist/editor/components/RightPanel.d.ts.map +1 -1
- package/dist/editor/components/RightPanel.js +23 -22
- package/dist/editor/components/RightPanel.js.map +1 -1
- package/dist/engine/export/exportHtml.d.ts +5 -1
- package/dist/engine/export/exportHtml.d.ts.map +1 -1
- package/dist/engine/export/exportHtml.js +69 -51
- package/dist/engine/export/exportHtml.js.map +1 -1
- package/dist/engine/export/exporters/content/AvatarExporter.js +2 -2
- package/dist/engine/export/exporters/content/AvatarExporter.js.map +1 -1
- package/dist/engine/export/exporters/content/BadgeExporter.js +11 -11
- package/dist/engine/export/exporters/content/BadgeExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/AdminSectionExporters.js +17 -17
- package/dist/engine/export/exporters/sections/AdminSectionExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts +2 -0
- package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
- package/dist/engine/export/exporters/sections/BlogPostExporters.js +135 -78
- package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/ContentGridExporters.js +16 -16
- package/dist/engine/export/exporters/sections/ContentGridExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/MarketingExporters.js +4 -4
- package/dist/engine/export/exporters/sections/MarketingExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
- package/dist/engine/export/exporters/sections/index.js +40 -38
- package/dist/engine/export/exporters/sections/index.js.map +1 -1
- package/dist/engine/index.js +97 -95
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
- package/dist/engine/plugins/builtin/blog/manifest.js +50 -18
- package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
- package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts.map +1 -1
- package/dist/engine/plugins/builtin/blog/mockContentProvider.js +13 -9
- package/dist/engine/plugins/builtin/blog/mockContentProvider.js.map +1 -1
- package/dist/engine/plugins/contentHydration.d.ts.map +1 -1
- package/dist/engine/plugins/contentHydration.js +119 -79
- package/dist/engine/plugins/contentHydration.js.map +1 -1
- package/dist/engine/plugins/types.d.ts +5 -0
- package/dist/engine/plugins/types.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts +3 -0
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -0
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +53 -0
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -0
- package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostDetail.js +4 -1
- package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts +3 -0
- package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -0
- package/dist/engine/registry/blocks/sections/blogSearchBar.js +56 -0
- package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -0
- package/dist/engine/registry/blocks/sections/index.d.ts +2 -0
- package/dist/engine/registry/blocks/sections/index.d.ts.map +1 -1
- package/dist/engine/render/renderers/content/BadgeRenderer.js +12 -12
- package/dist/engine/render/renderers/content/BadgeRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/AboutSectionRenderer.js +8 -8
- package/dist/engine/render/renderers/sections/AboutSectionRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts +3 -0
- package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js +213 -0
- package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts +3 -0
- package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js +138 -0
- package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/ContactSectionRenderer.js +52 -52
- package/dist/engine/render/renderers/sections/ContactSectionRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js +5 -5
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureRenderer.js +9 -9
- package/dist/engine/render/renderers/sections/FeatureRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js +5 -5
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js +17 -17
- package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/index.js +28 -24
- package/dist/engine/render/renderers/sections/index.js.map +1 -1
- package/dist/engine/schema/siteDocument.d.ts +66 -2
- package/dist/engine/schema/siteDocument.d.ts.map +1 -1
- package/dist/engine/schema/siteDocument.js.map +1 -1
- package/dist/hooks/useEditorState.d.ts +2 -0
- package/dist/hooks/useEditorState.d.ts.map +1 -1
- package/dist/hooks/useEditorState.js +82 -77
- package/dist/hooks/useEditorState.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +108 -106
- package/dist/index.js.map +1 -1
- package/dist/shared/templates/index.d.ts +4 -0
- package/dist/shared/templates/index.d.ts.map +1 -1
- package/dist/shared/templates/index.js +14 -7
- package/dist/shared/templates/index.js.map +1 -1
- package/dist/shared/templates/smartgesti-admin.d.ts.map +1 -1
- package/dist/shared/templates/smartgesti-admin.js +1 -4
- package/dist/shared/templates/smartgesti-admin.js.map +1 -1
- package/dist/utils/blockIcons.d.ts.map +1 -1
- package/dist/utils/blockIcons.js +2 -0
- package/dist/utils/blockIcons.js.map +1 -1
- package/dist/utils/colorUtils.d.ts +73 -16
- package/dist/utils/colorUtils.d.ts.map +1 -1
- package/dist/utils/colorUtils.js +95 -9
- package/dist/utils/colorUtils.js.map +1 -1
- package/dist/viewer/LandingPageViewer.d.ts +7 -2
- package/dist/viewer/LandingPageViewer.d.ts.map +1 -1
- package/dist/viewer/LandingPageViewer.js +106 -92
- package/dist/viewer/LandingPageViewer.js.map +1 -1
- package/package.json +1 -1
|
@@ -47,6 +47,8 @@ import "../engine/registry/blocks/sections/categoryCardGrid.js";
|
|
|
47
47
|
import "../engine/registry/blocks/sections/blogPostCard.js";
|
|
48
48
|
import "../engine/registry/blocks/sections/blogPostGrid.js";
|
|
49
49
|
import "../engine/registry/blocks/sections/blogPostDetail.js";
|
|
50
|
+
import "../engine/registry/blocks/sections/blogCategoryFilter.js";
|
|
51
|
+
import "../engine/registry/blocks/sections/blogSearchBar.js";
|
|
50
52
|
import "../engine/registry/blocks/sections/productShowcase.js";
|
|
51
53
|
import "../engine/registry/blocks/sections/aboutSection.js";
|
|
52
54
|
import "../engine/registry/blocks/sections/contactSection.js";
|
|
@@ -151,7 +153,7 @@ function b(t, r, c, d, l) {
|
|
|
151
153
|
) })
|
|
152
154
|
] }, t.id);
|
|
153
155
|
}
|
|
154
|
-
const
|
|
156
|
+
const It = A.memo(function({
|
|
155
157
|
structure: r,
|
|
156
158
|
selectedBlockId: c,
|
|
157
159
|
onSelectBlock: d,
|
|
@@ -202,6 +204,6 @@ const Tt = A.memo(function({
|
|
|
202
204
|
] });
|
|
203
205
|
});
|
|
204
206
|
export {
|
|
205
|
-
|
|
207
|
+
It as BlockSelector
|
|
206
208
|
};
|
|
207
209
|
//# sourceMappingURL=BlockSelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockSelector.js","sources":["../../src/editor/BlockSelector.tsx"],"sourcesContent":["/**\n * Block Selector\n * Lista blocos da estrutura de forma hierárquica\n */\n\nimport React, { useMemo } from 'react'\nimport { Block } from '../engine'\nimport { componentRegistry } from '../engine'\nimport { Trash2, ChevronRight } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ninterface BlockSelectorProps {\n structure: Block[]\n selectedBlockId: string | null\n onSelectBlock: (blockId: string) => void\n onDeleteBlock: (blockId: string) => void\n}\n\n/**\n * Obtém nome amigável do tipo de bloco\n */\nfunction getBlockTypeName(type: Block['type']): string {\n const definition = componentRegistry.get(type)\n return definition?.name || type\n}\n\n/**\n * Obtém preview do bloco (texto ou propriedade relevante)\n */\nfunction getBlockPreview(block: Block): string {\n const props = block.props as Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- dynamic access for preview\n\n switch (block.type) {\n case 'heading':\n return props.text || 'Heading'\n case 'text':\n return props.text ? String(props.text).substring(0, 30) + (String(props.text).length > 30 ? '...' : '') : 'Text'\n case 'button':\n return props.text || 'Button'\n case 'link':\n return props.text || 'Link'\n case 'image':\n return props.alt || props.src ? 'Image' : 'Image'\n case 'container':\n case 'stack':\n case 'grid':\n case 'box':\n return `${getBlockTypeName(block.type)} (${Array.isArray(props.children) ? props.children.length : 0} children)`\n case 'section':\n return props.id ? `Section: ${props.id}` : 'Section'\n case 'card':\n return 'Card'\n case 'divider':\n return 'Divider'\n default:\n return getBlockTypeName(block.type)\n }\n}\n\n/**\n * Renderiza um bloco e seus children recursivamente\n */\nfunction renderBlockTree(\n block: Block,\n depth: number,\n selectedBlockId: string | null,\n onSelectBlock: (blockId: string) => void,\n onDeleteBlock: (blockId: string) => void\n): React.ReactNode {\n // Verificar se o bloco é válido\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n return null\n }\n\n const isSelected = block.id === selectedBlockId\n const props = block.props as Record<string, any>\n const hasChildren = props && typeof props === 'object' && props.children && Array.isArray(props.children) && props.children.length > 0\n\n return (\n <div key={block.id}>\n <div\n className={cn(\n 'flex items-center gap-2 p-2 rounded-lg transition-all cursor-pointer group',\n 'hover:scale-[1.01] active:scale-[0.99]',\n isSelected\n ? 'bg-blue-500 text-white shadow-md shadow-blue-500/20'\n : 'bg-gray-100/50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n depth > 0 && 'ml-4'\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectBlock(block.id)}\n >\n {/* Indentação visual */}\n {depth > 0 && (\n <div className=\"flex-shrink-0 w-4 flex items-center justify-center\">\n <ChevronRight className=\"w-3 h-3 opacity-50\" />\n </div>\n )}\n\n {/* Badge de tipo */}\n <div\n className={cn(\n 'flex-shrink-0 w-6 h-6 rounded text-xs font-semibold flex items-center justify-center',\n isSelected\n ? 'bg-white/20 text-white'\n : componentRegistry.get(block.type)?.pluginId\n ? 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400'\n : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400'\n )}\n title={getBlockTypeName(block.type)}\n >\n {componentRegistry.get(block.type)?.pluginId ? '🧩' : block.type.substring(0, 2).toUpperCase()}\n </div>\n\n {/* Nome e preview */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">{getBlockTypeName(block.type)}</div>\n <div\n className={cn(\n 'text-xs truncate',\n isSelected ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {getBlockPreview(block)}\n </div>\n </div>\n\n {/* Botão deletar */}\n <button\n onClick={(e) => {\n e.stopPropagation()\n onDeleteBlock(block.id)\n }}\n className={cn(\n 'p-1.5 rounded-full transition-all opacity-0 group-hover:opacity-100',\n 'hover:bg-white/30 dark:hover:bg-gray-700/50',\n 'hover:scale-110 active:scale-95',\n isSelected\n ? 'text-white hover:bg-white/40'\n : 'text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n )}\n title=\"Deletar bloco\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Renderizar children recursivamente */}\n {hasChildren && (\n <div className=\"mt-1\">\n {props.children\n .filter((child: Block) => child && child.id && child.type) // Filtrar children inválidos\n .map((child: Block) =>\n renderBlockTree(child, depth + 1, selectedBlockId, onSelectBlock, onDeleteBlock)\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport const BlockSelector = React.memo(function BlockSelector({\n structure,\n selectedBlockId,\n onSelectBlock,\n onDeleteBlock,\n}: BlockSelectorProps) {\n // Filtrar estrutura inválida ANTES de usar\n const validStructure = useMemo(() => {\n if (!structure || !Array.isArray(structure)) return []\n return structure.filter((b) => b && typeof b === 'object' && b.id && b.type)\n }, [structure])\n\n // Contar total de blocos (incluindo children) - usando useMemo para evitar recálculos\n const totalBlocks = useMemo(() => {\n const count = (blocks: Block[]): number => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) return 0\n \n let total = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n \n // Verificar se o bloco é válido ANTES de acessar qualquer propriedade\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n continue\n }\n \n total++ // Contar o bloco atual\n \n // Verificar props de forma segura - SEMPRE dentro de try-catch\n try {\n if (!block.props) {\n continue\n }\n \n const props = block.props\n if (props && typeof props === 'object' && !Array.isArray(props)) {\n const children = (props as Record<string, any>).children\n if (children && Array.isArray(children) && children.length > 0) {\n // Filtrar children inválidos antes de contar recursivamente\n const validChildren = children.filter(\n (child: unknown) => child && typeof child === 'object' && (child as Block).id && (child as Block).type\n )\n if (validChildren.length > 0) {\n total += count(validChildren)\n }\n }\n }\n } catch (error) {\n // Se houver erro ao acessar props, apenas continuar\n continue\n }\n }\n return total\n }\n \n return count(validStructure)\n }, [validStructure])\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">Blocos</h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalBlocks} {totalBlocks === 1 ? 'bloco' : 'blocos'}\n </p>\n </div>\n\n {/* Lista de blocos */}\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {!validStructure || validStructure.length === 0 ? (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n Nenhum bloco adicionado ainda\n </div>\n ) : (\n validStructure.map((block) =>\n renderBlockTree(block, 0, selectedBlockId, onSelectBlock, onDeleteBlock)\n )\n )}\n </div>\n </div>\n )\n});\n"],"names":["getBlockTypeName","type","componentRegistry","getBlockPreview","block","props","renderBlockTree","depth","selectedBlockId","onSelectBlock","onDeleteBlock","isSelected","hasChildren","jsxs","cn","jsx","ChevronRight","Trash2","child","BlockSelector","React","structure","validStructure","useMemo","b","totalBlocks","count","blocks","total","i","children","validChildren"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BlockSelector.js","sources":["../../src/editor/BlockSelector.tsx"],"sourcesContent":["/**\n * Block Selector\n * Lista blocos da estrutura de forma hierárquica\n */\n\nimport React, { useMemo } from 'react'\nimport { Block } from '../engine'\nimport { componentRegistry } from '../engine'\nimport { Trash2, ChevronRight } from 'lucide-react'\nimport { cn } from '../utils/cn'\n\ninterface BlockSelectorProps {\n structure: Block[]\n selectedBlockId: string | null\n onSelectBlock: (blockId: string) => void\n onDeleteBlock: (blockId: string) => void\n}\n\n/**\n * Obtém nome amigável do tipo de bloco\n */\nfunction getBlockTypeName(type: Block['type']): string {\n const definition = componentRegistry.get(type)\n return definition?.name || type\n}\n\n/**\n * Obtém preview do bloco (texto ou propriedade relevante)\n */\nfunction getBlockPreview(block: Block): string {\n const props = block.props as Record<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any -- dynamic access for preview\n\n switch (block.type) {\n case 'heading':\n return props.text || 'Heading'\n case 'text':\n return props.text ? String(props.text).substring(0, 30) + (String(props.text).length > 30 ? '...' : '') : 'Text'\n case 'button':\n return props.text || 'Button'\n case 'link':\n return props.text || 'Link'\n case 'image':\n return props.alt || props.src ? 'Image' : 'Image'\n case 'container':\n case 'stack':\n case 'grid':\n case 'box':\n return `${getBlockTypeName(block.type)} (${Array.isArray(props.children) ? props.children.length : 0} children)`\n case 'section':\n return props.id ? `Section: ${props.id}` : 'Section'\n case 'card':\n return 'Card'\n case 'divider':\n return 'Divider'\n default:\n return getBlockTypeName(block.type)\n }\n}\n\n/**\n * Renderiza um bloco e seus children recursivamente\n */\nfunction renderBlockTree(\n block: Block,\n depth: number,\n selectedBlockId: string | null,\n onSelectBlock: (blockId: string) => void,\n onDeleteBlock: (blockId: string) => void\n): React.ReactNode {\n // Verificar se o bloco é válido\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n return null\n }\n\n const isSelected = block.id === selectedBlockId\n const props = block.props as Record<string, any>\n const hasChildren = props && typeof props === 'object' && props.children && Array.isArray(props.children) && props.children.length > 0\n\n return (\n <div key={block.id}>\n <div\n className={cn(\n 'flex items-center gap-2 p-2 rounded-lg transition-all cursor-pointer group',\n 'hover:scale-[1.01] active:scale-[0.99]',\n isSelected\n ? 'bg-blue-500 text-white shadow-md shadow-blue-500/20'\n : 'bg-gray-100/50 dark:bg-gray-800/50 hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\n depth > 0 && 'ml-4'\n )}\n style={{ paddingLeft: `${depth * 12 + 8}px` }}\n onClick={() => onSelectBlock(block.id)}\n >\n {/* Indentação visual */}\n {depth > 0 && (\n <div className=\"flex-shrink-0 w-4 flex items-center justify-center\">\n <ChevronRight className=\"w-3 h-3 opacity-50\" />\n </div>\n )}\n\n {/* Badge de tipo */}\n <div\n className={cn(\n 'flex-shrink-0 w-6 h-6 rounded text-xs font-semibold flex items-center justify-center',\n isSelected\n ? 'bg-white/20 text-white'\n : componentRegistry.get(block.type)?.pluginId\n ? 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400'\n : 'bg-gray-200 dark:bg-gray-700 text-gray-600 dark:text-gray-400'\n )}\n title={getBlockTypeName(block.type)}\n >\n {componentRegistry.get(block.type)?.pluginId ? '🧩' : block.type.substring(0, 2).toUpperCase()}\n </div>\n\n {/* Nome e preview */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-medium truncate\">{getBlockTypeName(block.type)}</div>\n <div\n className={cn(\n 'text-xs truncate',\n isSelected ? 'text-white/80' : 'text-gray-500 dark:text-gray-400'\n )}\n >\n {getBlockPreview(block)}\n </div>\n </div>\n\n {/* Botão deletar */}\n <button\n onClick={(e) => {\n e.stopPropagation()\n onDeleteBlock(block.id)\n }}\n className={cn(\n 'p-1.5 rounded-full transition-all opacity-0 group-hover:opacity-100',\n 'hover:bg-white/30 dark:hover:bg-gray-700/50',\n 'hover:scale-110 active:scale-95',\n isSelected\n ? 'text-white hover:bg-white/40'\n : 'text-gray-600 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700'\n )}\n title=\"Deletar bloco\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Renderizar children recursivamente */}\n {hasChildren && (\n <div className=\"mt-1\">\n {props.children\n .filter((child: Block) => child && child.id && child.type) // Filtrar children inválidos\n .map((child: Block) =>\n renderBlockTree(child, depth + 1, selectedBlockId, onSelectBlock, onDeleteBlock)\n )}\n </div>\n )}\n </div>\n )\n}\n\nexport const BlockSelector = React.memo(function BlockSelector({\n structure,\n selectedBlockId,\n onSelectBlock,\n onDeleteBlock,\n}: BlockSelectorProps) {\n // Filtrar estrutura inválida ANTES de usar\n const validStructure = useMemo(() => {\n if (!structure || !Array.isArray(structure)) return []\n return structure.filter((b) => b && typeof b === 'object' && b.id && b.type)\n }, [structure])\n\n // Contar total de blocos (incluindo children) - usando useMemo para evitar recálculos\n const totalBlocks = useMemo(() => {\n const count = (blocks: Block[]): number => {\n if (!blocks || !Array.isArray(blocks) || blocks.length === 0) return 0\n \n let total = 0\n for (let i = 0; i < blocks.length; i++) {\n const block = blocks[i]\n \n // Verificar se o bloco é válido ANTES de acessar qualquer propriedade\n if (!block || typeof block !== 'object' || !block.id || !block.type) {\n continue\n }\n \n total++ // Contar o bloco atual\n \n // Verificar props de forma segura - SEMPRE dentro de try-catch\n try {\n if (!block.props) {\n continue\n }\n \n const props = block.props\n if (props && typeof props === 'object' && !Array.isArray(props)) {\n const children = (props as Record<string, any>).children\n if (children && Array.isArray(children) && children.length > 0) {\n // Filtrar children inválidos antes de contar recursivamente\n const validChildren = children.filter(\n (child: unknown) => child && typeof child === 'object' && (child as Block).id && (child as Block).type\n )\n if (validChildren.length > 0) {\n total += count(validChildren)\n }\n }\n }\n } catch (error) {\n // Se houver erro ao acessar props, apenas continuar\n continue\n }\n }\n return total\n }\n \n return count(validStructure)\n }, [validStructure])\n\n return (\n <div className=\"h-full flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100\">Blocos</h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalBlocks} {totalBlocks === 1 ? 'bloco' : 'blocos'}\n </p>\n </div>\n\n {/* Lista de blocos */}\n <div className=\"flex-1 overflow-y-auto p-2 space-y-1\">\n {!validStructure || validStructure.length === 0 ? (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n Nenhum bloco adicionado ainda\n </div>\n ) : (\n validStructure.map((block) =>\n renderBlockTree(block, 0, selectedBlockId, onSelectBlock, onDeleteBlock)\n )\n )}\n </div>\n </div>\n )\n});\n"],"names":["getBlockTypeName","type","componentRegistry","getBlockPreview","block","props","renderBlockTree","depth","selectedBlockId","onSelectBlock","onDeleteBlock","isSelected","hasChildren","jsxs","cn","jsx","ChevronRight","Trash2","child","BlockSelector","React","structure","validStructure","useMemo","b","totalBlocks","count","blocks","total","i","children","validChildren"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,SAASA,EAAiBC,GAA6B;AAErD,SADmBC,EAAkB,IAAID,CAAI,GAC1B,QAAQA;AAC7B;AAKA,SAASE,EAAgBC,GAAsB;AAC7C,QAAMC,IAAQD,EAAM;AAEpB,UAAQA,EAAM,MAAA;AAAA,IACZ,KAAK;AACH,aAAOC,EAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAOA,EAAM,OAAO,OAAOA,EAAM,IAAI,EAAE,UAAU,GAAG,EAAE,KAAK,OAAOA,EAAM,IAAI,EAAE,SAAS,KAAK,QAAQ,MAAM;AAAA,IAC5G,KAAK;AACH,aAAOA,EAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAOA,EAAM,QAAQ;AAAA,IACvB,KAAK;AACH,aAAOA,EAAM,OAAOA,EAAM,KAAM;AAAA,IAClC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,GAAGL,EAAiBI,EAAM,IAAI,CAAC,KAAK,MAAM,QAAQC,EAAM,QAAQ,IAAIA,EAAM,SAAS,SAAS,CAAC;AAAA,IACtG,KAAK;AACH,aAAOA,EAAM,KAAK,YAAYA,EAAM,EAAE,KAAK;AAAA,IAC7C,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAOL,EAAiBI,EAAM,IAAI;AAAA,EAAA;AAExC;AAKA,SAASE,EACPF,GACAG,GACAC,GACAC,GACAC,GACiB;AAEjB,MAAI,CAACN,KAAS,OAAOA,KAAU,YAAY,CAACA,EAAM,MAAM,CAACA,EAAM;AAC7D,WAAO;AAGT,QAAMO,IAAaP,EAAM,OAAOI,GAC1BH,IAAQD,EAAM,OACdQ,IAAcP,KAAS,OAAOA,KAAU,YAAYA,EAAM,YAAY,MAAM,QAAQA,EAAM,QAAQ,KAAKA,EAAM,SAAS,SAAS;AAErI,2BACG,OAAA,EACC,UAAA;AAAA,IAAA,gBAAAQ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC;AAAA,UACT;AAAA,UACA;AAAA,UACAH,IACI,wDACA;AAAA,UACJJ,IAAQ,KAAK;AAAA,QAAA;AAAA,QAEf,OAAO,EAAE,aAAa,GAAGA,IAAQ,KAAK,CAAC,KAAA;AAAA,QACvC,SAAS,MAAME,EAAcL,EAAM,EAAE;AAAA,QAGpC,UAAA;AAAA,UAAAG,IAAQ,uBACN,OAAA,EAAI,WAAU,sDACb,UAAA,gBAAAQ,EAACC,GAAA,EAAa,WAAU,qBAAA,CAAqB,EAAA,CAC/C;AAAA,UAIF,gBAAAD;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWD;AAAA,gBACT;AAAA,gBACAH,IACI,2BACAT,EAAkB,IAAIE,EAAM,IAAI,GAAG,WACjC,6EACA;AAAA,cAAA;AAAA,cAER,OAAOJ,EAAiBI,EAAM,IAAI;AAAA,cAEjC,UAAAF,EAAkB,IAAIE,EAAM,IAAI,GAAG,WAAW,OAAOA,EAAM,KAAK,UAAU,GAAG,CAAC,EAAE,YAAA;AAAA,YAAY;AAAA,UAAA;AAAA,UAI/F,gBAAAS,EAAC,OAAA,EAAI,WAAU,kBACb,UAAA;AAAA,YAAA,gBAAAE,EAAC,SAAI,WAAU,gCAAgC,UAAAf,EAAiBI,EAAM,IAAI,GAAE;AAAA,YAC5E,gBAAAW;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWD;AAAA,kBACT;AAAA,kBACAH,IAAa,kBAAkB;AAAA,gBAAA;AAAA,gBAGhC,YAAgBP,CAAK;AAAA,cAAA;AAAA,YAAA;AAAA,UACxB,GACF;AAAA,UAGA,gBAAAW;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,SAAS,CAAC,MAAM;AACd,kBAAE,gBAAA,GACFL,EAAcN,EAAM,EAAE;AAAA,cACxB;AAAA,cACA,WAAWU;AAAA,gBACT;AAAA,gBACA;AAAA,gBACA;AAAA,gBACAH,IACI,iCACA;AAAA,cAAA;AAAA,cAEN,OAAM;AAAA,cAEN,UAAA,gBAAAI,EAACE,GAAA,EAAO,WAAU,cAAA,CAAc;AAAA,YAAA;AAAA,UAAA;AAAA,QAClC;AAAA,MAAA;AAAA,IAAA;AAAA,IAIDL,KACC,gBAAAG,EAAC,OAAA,EAAI,WAAU,QACZ,UAAAV,EAAM,SACJ,OAAO,CAACa,MAAiBA,KAASA,EAAM,MAAMA,EAAM,IAAI,EACxD;AAAA,MAAI,CAACA,MACJZ,EAAgBY,GAAOX,IAAQ,GAAGC,GAAiBC,GAAeC,CAAa;AAAA,IAAA,EACjF,CACJ;AAAA,EAAA,EAAA,GA5EMN,EAAM,EA8EhB;AAEJ;AAEO,MAAMe,KAAgBC,EAAM,KAAK,SAAuB;AAAA,EAC7D,WAAAC;AAAA,EACA,iBAAAb;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AACF,GAAuB;AAErB,QAAMY,IAAiBC,EAAQ,MACzB,CAACF,KAAa,CAAC,MAAM,QAAQA,CAAS,IAAU,CAAA,IAC7CA,EAAU,OAAO,CAACG,MAAMA,KAAK,OAAOA,KAAM,YAAYA,EAAE,MAAMA,EAAE,IAAI,GAC1E,CAACH,CAAS,CAAC,GAGRI,IAAcF,EAAQ,MAAM;AAChC,UAAMG,IAAQ,CAACC,MAA4B;AACzC,UAAI,CAACA,KAAU,CAAC,MAAM,QAAQA,CAAM,KAAKA,EAAO,WAAW,EAAG,QAAO;AAErE,UAAIC,IAAQ;AACZ,eAASC,IAAI,GAAGA,IAAIF,EAAO,QAAQE,KAAK;AACtC,cAAMzB,IAAQuB,EAAOE,CAAC;AAGtB,YAAI,GAACzB,KAAS,OAAOA,KAAU,YAAY,CAACA,EAAM,MAAM,CAACA,EAAM,OAI/D;AAAA,UAAAwB;AAGA,cAAI;AACF,gBAAI,CAACxB,EAAM;AACT;AAGF,kBAAMC,IAAQD,EAAM;AACpB,gBAAIC,KAAS,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK,GAAG;AAC/D,oBAAMyB,IAAYzB,EAA8B;AAChD,kBAAIyB,KAAY,MAAM,QAAQA,CAAQ,KAAKA,EAAS,SAAS,GAAG;AAE9D,sBAAMC,IAAgBD,EAAS;AAAA,kBAC7B,CAACZ,MAAmBA,KAAS,OAAOA,KAAU,YAAaA,EAAgB,MAAOA,EAAgB;AAAA,gBAAA;AAEpG,gBAAIa,EAAc,SAAS,MACzBH,KAASF,EAAMK,CAAa;AAAA,cAEhC;AAAA,YACF;AAAA,UACF,QAAgB;AAEd;AAAA,UACF;AAAA;AAAA,MACF;AACA,aAAOH;AAAA,IACT;AAEA,WAAOF,EAAMJ,CAAc;AAAA,EAC7B,GAAG,CAACA,CAAc,CAAC;AAEnB,SACE,gBAAAT,EAAC,OAAA,EAAI,WAAU,wCAEb,UAAA;AAAA,IAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,6FACb,UAAA;AAAA,MAAA,gBAAAE,EAAC,MAAA,EAAG,WAAU,0DAAyD,UAAA,UAAM;AAAA,MAC7E,gBAAAF,EAAC,KAAA,EAAE,WAAU,iDACV,UAAA;AAAA,QAAAY;AAAA,QAAY;AAAA,QAAEA,MAAgB,IAAI,UAAU;AAAA,MAAA,EAAA,CAC/C;AAAA,IAAA,GACF;AAAA,IAGA,gBAAAV,EAAC,OAAA,EAAI,WAAU,wCACZ,WAACO,KAAkBA,EAAe,WAAW,sBAC3C,OAAA,EAAI,WAAU,6DAA4D,UAAA,gCAAA,CAE3E,IAEAA,EAAe;AAAA,MAAI,CAAClB,MAClBE,EAAgBF,GAAO,GAAGI,GAAiBC,GAAeC,CAAa;AAAA,IAAA,EACzE,CAEJ;AAAA,EAAA,GACF;AAEJ,CAAC;"}
|
|
@@ -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;
|
|
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,2CAqUxB"}
|
|
@@ -1,251 +1,265 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { TemplatePicker as
|
|
4
|
-
import { useEditorState as
|
|
5
|
-
import { useKeyboardShortcuts as
|
|
6
|
-
import { getTemplate as
|
|
1
|
+
import { jsx as p, jsxs as j } from "react/jsx-runtime";
|
|
2
|
+
import { useState as k, useCallback as P, useEffect as H } from "react";
|
|
3
|
+
import { TemplatePicker as ce } from "./TemplatePicker.js";
|
|
4
|
+
import { useEditorState as ie } from "../hooks/useEditorState.js";
|
|
5
|
+
import { useKeyboardShortcuts as pe } from "../hooks/useKeyboardShortcuts.js";
|
|
6
|
+
import { getTemplate as A, templateDefaultPalette as F } from "../shared/templates/index.js";
|
|
7
|
+
import { findPaletteByName as de } from "./PaletteSelector.js";
|
|
7
8
|
import { sharedTemplateToEngineDocument as K } from "../utils/sharedTemplateToEngine.js";
|
|
8
9
|
import { findBlockInStructure as ue } from "../utils/blockUtils.js";
|
|
9
|
-
import {
|
|
10
|
-
import { logger as
|
|
10
|
+
import { derivePaletteColors as he } from "../utils/colorUtils.js";
|
|
11
|
+
import { logger as x } from "../utils/logger.js";
|
|
11
12
|
import { processBlockDataURLs as me } from "../utils/dataURLUtils.js";
|
|
12
|
-
import { Toolbar as
|
|
13
|
-
import { LeftPanel as
|
|
14
|
-
import { CenterPanel as
|
|
15
|
-
import { RightPanel as
|
|
16
|
-
import { PatchBuilder as
|
|
17
|
-
function
|
|
18
|
-
initialData:
|
|
19
|
-
defaultTemplateId:
|
|
13
|
+
import { Toolbar as fe } from "./components/Toolbar.js";
|
|
14
|
+
import { LeftPanel as ge } from "./components/LeftPanel.js";
|
|
15
|
+
import { CenterPanel as ve } from "./components/CenterPanel.js";
|
|
16
|
+
import { RightPanel as ke } from "./components/RightPanel.js";
|
|
17
|
+
import { PatchBuilder as Pe } from "../engine/patch/PatchBuilder.js";
|
|
18
|
+
function Oe({
|
|
19
|
+
initialData: M,
|
|
20
|
+
defaultTemplateId: C,
|
|
20
21
|
onSave: w,
|
|
21
|
-
onPublish:
|
|
22
|
-
uploadConfig:
|
|
22
|
+
onPublish: y,
|
|
23
|
+
uploadConfig: b
|
|
23
24
|
}) {
|
|
24
25
|
const {
|
|
25
|
-
document:
|
|
26
|
-
currentPageId:
|
|
26
|
+
document: t,
|
|
27
|
+
currentPageId: $,
|
|
27
28
|
currentPage: d,
|
|
28
|
-
selectedBlockId:
|
|
29
|
-
selectedBlock:
|
|
30
|
-
history:
|
|
31
|
-
setCurrentPageId:
|
|
32
|
-
addPage:
|
|
33
|
-
removePage:
|
|
34
|
-
canRemovePage:
|
|
35
|
-
setSelectedBlockId:
|
|
29
|
+
selectedBlockId: h,
|
|
30
|
+
selectedBlock: V,
|
|
31
|
+
history: W,
|
|
32
|
+
setCurrentPageId: m,
|
|
33
|
+
addPage: q,
|
|
34
|
+
removePage: z,
|
|
35
|
+
canRemovePage: J,
|
|
36
|
+
setSelectedBlockId: c,
|
|
36
37
|
handleUndo: D,
|
|
37
|
-
handleRedo:
|
|
38
|
-
handleDeleteBlock:
|
|
39
|
-
handleUpdateBlock:
|
|
40
|
-
applyChange:
|
|
41
|
-
resetToTemplate:
|
|
42
|
-
isPaletteSelected:
|
|
38
|
+
handleRedo: T,
|
|
39
|
+
handleDeleteBlock: E,
|
|
40
|
+
handleUpdateBlock: Q,
|
|
41
|
+
applyChange: f,
|
|
42
|
+
resetToTemplate: X,
|
|
43
|
+
isPaletteSelected: U,
|
|
43
44
|
loadDocument: S,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
selectedPalette: I,
|
|
46
|
+
setSelectedPalette: u,
|
|
47
|
+
activePlugins: Y,
|
|
48
|
+
activatePlugin: Z,
|
|
49
|
+
deactivatePlugin: _
|
|
50
|
+
} = ie({ initialData: M }), [ee, g] = k(!1), [B, oe] = k(
|
|
48
51
|
null
|
|
49
|
-
), [
|
|
52
|
+
), [L, R] = k(null), [N, te] = k(!1), G = P(
|
|
50
53
|
(e) => {
|
|
51
|
-
const
|
|
52
|
-
if (!
|
|
53
|
-
const
|
|
54
|
-
S(
|
|
54
|
+
const o = A(e);
|
|
55
|
+
if (!o) return;
|
|
56
|
+
const r = K(o);
|
|
57
|
+
S(r), oe(e);
|
|
58
|
+
const a = F[e];
|
|
59
|
+
a && u(a);
|
|
55
60
|
},
|
|
56
|
-
[S]
|
|
61
|
+
[S, u]
|
|
57
62
|
);
|
|
58
|
-
|
|
59
|
-
!
|
|
60
|
-
}, [
|
|
61
|
-
const
|
|
62
|
-
if (!(!
|
|
63
|
+
H(() => {
|
|
64
|
+
!t && C && G(C);
|
|
65
|
+
}, [C]);
|
|
66
|
+
const O = async () => {
|
|
67
|
+
if (!(!t || !w || !b)) {
|
|
63
68
|
g(!0);
|
|
64
69
|
try {
|
|
65
70
|
const e = await Promise.all(
|
|
66
|
-
(
|
|
67
|
-
...
|
|
71
|
+
(t.pages || []).map(async (r) => ({
|
|
72
|
+
...r,
|
|
68
73
|
structure: await Promise.all(
|
|
69
|
-
(
|
|
74
|
+
(r.structure || []).map((a) => me(a, b))
|
|
70
75
|
)
|
|
71
76
|
}))
|
|
72
|
-
),
|
|
73
|
-
...
|
|
77
|
+
), o = {
|
|
78
|
+
...t,
|
|
74
79
|
pages: e
|
|
75
80
|
};
|
|
76
|
-
await w(
|
|
81
|
+
await w(o);
|
|
77
82
|
} catch (e) {
|
|
78
|
-
throw
|
|
83
|
+
throw x.error("Error saving:", e), e;
|
|
79
84
|
} finally {
|
|
80
85
|
g(!1);
|
|
81
86
|
}
|
|
82
87
|
}
|
|
83
|
-
},
|
|
84
|
-
if (!(!
|
|
88
|
+
}, re = async () => {
|
|
89
|
+
if (!(!t || !y)) {
|
|
85
90
|
g(!0);
|
|
86
91
|
try {
|
|
87
|
-
await
|
|
92
|
+
await y(t);
|
|
88
93
|
} catch (e) {
|
|
89
|
-
|
|
94
|
+
x.error("Error publishing:", e);
|
|
90
95
|
} finally {
|
|
91
96
|
g(!1);
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
99
|
}, ae = P(
|
|
95
|
-
(e,
|
|
96
|
-
if (!
|
|
97
|
-
const
|
|
98
|
-
if (
|
|
100
|
+
(e, o) => {
|
|
101
|
+
if (!t || !d) return;
|
|
102
|
+
const r = d.id;
|
|
103
|
+
if (r)
|
|
99
104
|
try {
|
|
100
|
-
const
|
|
101
|
-
o,
|
|
105
|
+
const a = Pe.updateBlockProps(
|
|
102
106
|
t,
|
|
107
|
+
r,
|
|
103
108
|
e,
|
|
104
|
-
|
|
109
|
+
o
|
|
105
110
|
);
|
|
106
|
-
|
|
107
|
-
} catch (
|
|
108
|
-
|
|
111
|
+
a?.length && f(a, "Update block properties");
|
|
112
|
+
} catch (a) {
|
|
113
|
+
x.error("Error updating block:", a);
|
|
109
114
|
}
|
|
110
115
|
},
|
|
111
|
-
[
|
|
112
|
-
),
|
|
113
|
-
if (!
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
{ op: "replace", path: `${k}/linkColor`, value: a },
|
|
136
|
-
{ op: "replace", path: `${k}/linkHoverColor`, value: e.primary },
|
|
137
|
-
{ op: "replace", path: `${k}/buttonColor`, value: e.primary },
|
|
138
|
-
{ op: "replace", path: `${k}/buttonTextColor`, value: c }
|
|
116
|
+
[t, d, f]
|
|
117
|
+
), le = P((e) => {
|
|
118
|
+
if (!t) return;
|
|
119
|
+
const o = he(e), r = [];
|
|
120
|
+
for (const [l, n] of Object.entries(o.themeColors))
|
|
121
|
+
r.push({ op: "replace", path: `/theme/colors/${l}`, value: n });
|
|
122
|
+
const a = /* @__PURE__ */ new Set([
|
|
123
|
+
"hero-gradient",
|
|
124
|
+
"hero-parallax",
|
|
125
|
+
"hero-overlay",
|
|
126
|
+
"hero-carousel"
|
|
127
|
+
]);
|
|
128
|
+
for (let l = 0; l < t.pages.length; l++) {
|
|
129
|
+
const n = t.pages[l];
|
|
130
|
+
if (n?.structure)
|
|
131
|
+
for (let i = 0; i < n.structure.length; i++) {
|
|
132
|
+
const v = n.structure[i], s = `/pages/${l}/structure/${i}/props`;
|
|
133
|
+
if (v.type === "hero") {
|
|
134
|
+
const se = v.props?.variation || "";
|
|
135
|
+
a.has(se) && r.push(
|
|
136
|
+
{ op: "replace", path: `${s}/background`, value: `linear-gradient(135deg, ${o.heroGradientStart} 0%, ${o.heroGradientEnd} 100%)` },
|
|
137
|
+
{ op: "replace", path: `${s}/titleColor`, value: o.heroTitleColor },
|
|
138
|
+
{ op: "replace", path: `${s}/subtitleColor`, value: o.heroSubtitleColor },
|
|
139
|
+
{ op: "replace", path: `${s}/descriptionColor`, value: o.heroDescColor }
|
|
139
140
|
);
|
|
140
|
-
}
|
|
141
|
-
|
|
141
|
+
} else v.type === "navbar" ? r.push(
|
|
142
|
+
{ op: "replace", path: `${s}/bg`, value: o.navbarBg },
|
|
143
|
+
{ op: "replace", path: `${s}/linkColor`, value: o.themeColors.menuLinkColor },
|
|
144
|
+
{ op: "replace", path: `${s}/linkHoverColor`, value: o.themeColors.primary },
|
|
145
|
+
{ op: "replace", path: `${s}/buttonColor`, value: o.themeColors.primary },
|
|
146
|
+
{ op: "replace", path: `${s}/buttonTextColor`, value: o.themeColors.primaryText }
|
|
147
|
+
) : v.type === "footer" && r.push(
|
|
148
|
+
{ op: "replace", path: `${s}/linkHoverColor`, value: o.footerLinkHover }
|
|
149
|
+
);
|
|
150
|
+
}
|
|
142
151
|
}
|
|
143
|
-
|
|
144
|
-
}, [
|
|
145
|
-
|
|
146
|
-
}, [
|
|
147
|
-
return
|
|
152
|
+
f(r, "Update color palette"), u(e.name ?? null);
|
|
153
|
+
}, [t, f, u]), ne = P((e, o) => {
|
|
154
|
+
c(e), R(o || null);
|
|
155
|
+
}, [c]);
|
|
156
|
+
return pe({
|
|
148
157
|
onUndo: D,
|
|
149
|
-
onRedo:
|
|
150
|
-
onSave:
|
|
158
|
+
onRedo: T,
|
|
159
|
+
onSave: O,
|
|
151
160
|
onDelete: () => {
|
|
152
|
-
|
|
161
|
+
h && E(h);
|
|
153
162
|
},
|
|
154
|
-
onDeselect: () =>
|
|
155
|
-
}),
|
|
156
|
-
const e = (
|
|
157
|
-
if (
|
|
158
|
-
const
|
|
159
|
-
if (!
|
|
160
|
-
const
|
|
161
|
-
if (
|
|
162
|
-
const
|
|
163
|
-
|
|
163
|
+
onDeselect: () => c(null)
|
|
164
|
+
}), H(() => {
|
|
165
|
+
const e = (o) => {
|
|
166
|
+
if (o.data?.type !== "editor-navigate" || !o.data.href) return;
|
|
167
|
+
const r = String(o.data.href);
|
|
168
|
+
if (!t) return;
|
|
169
|
+
const a = r.match(/^(?:\/site)?\/p\/([^#?]+)/);
|
|
170
|
+
if (a) {
|
|
171
|
+
const l = a[1], n = t.pages.find((i) => i.slug === l);
|
|
172
|
+
n && m(n.id);
|
|
164
173
|
return;
|
|
165
174
|
}
|
|
166
|
-
if (
|
|
167
|
-
const
|
|
168
|
-
for (const
|
|
169
|
-
if (ue(
|
|
170
|
-
|
|
175
|
+
if (r.startsWith("#")) {
|
|
176
|
+
const l = r.slice(1);
|
|
177
|
+
for (const n of t.pages)
|
|
178
|
+
if (ue(n.structure || [], l)) {
|
|
179
|
+
m(n.id), c(l);
|
|
171
180
|
break;
|
|
172
181
|
}
|
|
173
182
|
}
|
|
174
183
|
};
|
|
175
184
|
return window.addEventListener("message", e), () => window.removeEventListener("message", e);
|
|
176
|
-
}, [
|
|
177
|
-
/* @__PURE__ */
|
|
178
|
-
|
|
185
|
+
}, [t, m, c]), t ? /* @__PURE__ */ j("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: [
|
|
186
|
+
/* @__PURE__ */ p(
|
|
187
|
+
fe,
|
|
179
188
|
{
|
|
180
|
-
history:
|
|
181
|
-
isSaving:
|
|
189
|
+
history: W,
|
|
190
|
+
isSaving: ee,
|
|
182
191
|
onUndo: D,
|
|
183
|
-
onRedo:
|
|
184
|
-
onSave:
|
|
185
|
-
onPublish:
|
|
186
|
-
onReset:
|
|
187
|
-
const e =
|
|
188
|
-
|
|
189
|
-
|
|
192
|
+
onRedo: T,
|
|
193
|
+
onSave: O,
|
|
194
|
+
onPublish: y ? re : void 0,
|
|
195
|
+
onReset: B ? () => {
|
|
196
|
+
const e = A(B);
|
|
197
|
+
if (e) {
|
|
198
|
+
S(K(e));
|
|
199
|
+
const o = F[B];
|
|
200
|
+
o && u(o);
|
|
201
|
+
}
|
|
202
|
+
} : X,
|
|
190
203
|
showSelectionOverlay: N,
|
|
191
204
|
onToggleSelectionOverlay: () => te((e) => !e)
|
|
192
205
|
}
|
|
193
206
|
),
|
|
194
|
-
/* @__PURE__ */
|
|
195
|
-
/* @__PURE__ */
|
|
196
|
-
|
|
207
|
+
/* @__PURE__ */ j("div", { className: "flex-1 flex overflow-hidden min-h-0 max-h-full", children: [
|
|
208
|
+
/* @__PURE__ */ p(
|
|
209
|
+
ge,
|
|
197
210
|
{
|
|
198
211
|
currentPage: d,
|
|
199
|
-
selectedBlockId:
|
|
200
|
-
isPaletteSelected:
|
|
212
|
+
selectedBlockId: h,
|
|
213
|
+
isPaletteSelected: U,
|
|
201
214
|
onSelectBlock: (e) => {
|
|
202
|
-
|
|
215
|
+
c(e), R(null);
|
|
203
216
|
},
|
|
204
|
-
onDeleteBlock:
|
|
217
|
+
onDeleteBlock: E
|
|
205
218
|
}
|
|
206
219
|
),
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
-
|
|
220
|
+
/* @__PURE__ */ p(
|
|
221
|
+
ve,
|
|
209
222
|
{
|
|
210
|
-
document:
|
|
211
|
-
currentPageId:
|
|
223
|
+
document: t,
|
|
224
|
+
currentPageId: $,
|
|
212
225
|
currentPage: d,
|
|
213
|
-
selectedBlockId:
|
|
214
|
-
onBlockClick:
|
|
215
|
-
onSelectPage:
|
|
226
|
+
selectedBlockId: h,
|
|
227
|
+
onBlockClick: ne,
|
|
228
|
+
onSelectPage: m,
|
|
216
229
|
onAddPage: () => {
|
|
217
230
|
const e = prompt("Nome da página:");
|
|
218
231
|
if (!e) return;
|
|
219
|
-
const
|
|
220
|
-
|
|
232
|
+
const o = e.toLowerCase().replace(/\s+/g, "-");
|
|
233
|
+
q(o, e, o);
|
|
221
234
|
},
|
|
222
|
-
onRemovePage:
|
|
223
|
-
canRemovePage:
|
|
235
|
+
onRemovePage: z,
|
|
236
|
+
canRemovePage: J,
|
|
224
237
|
onUpdateBlock: ae,
|
|
225
|
-
activePlugins:
|
|
226
|
-
onActivatePlugin:
|
|
227
|
-
onDeactivatePlugin:
|
|
238
|
+
activePlugins: Y,
|
|
239
|
+
onActivatePlugin: Z,
|
|
240
|
+
onDeactivatePlugin: _,
|
|
228
241
|
showSelectionOverlay: N,
|
|
229
|
-
focusedGroup:
|
|
242
|
+
focusedGroup: L
|
|
230
243
|
}
|
|
231
244
|
),
|
|
232
|
-
/* @__PURE__ */
|
|
233
|
-
|
|
245
|
+
/* @__PURE__ */ p(
|
|
246
|
+
ke,
|
|
234
247
|
{
|
|
235
|
-
isPaletteSelected:
|
|
236
|
-
selectedBlock:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
248
|
+
isPaletteSelected: U,
|
|
249
|
+
selectedBlock: V,
|
|
250
|
+
selectedPalette: I ? de(I) : void 0,
|
|
251
|
+
onPaletteChange: le,
|
|
252
|
+
onUpdateBlock: Q,
|
|
253
|
+
uploadConfig: b,
|
|
254
|
+
document: t,
|
|
255
|
+
currentPageId: $,
|
|
256
|
+
focusedGroup: L
|
|
243
257
|
}
|
|
244
258
|
)
|
|
245
259
|
] })
|
|
246
|
-
] }) : /* @__PURE__ */
|
|
260
|
+
] }) : /* @__PURE__ */ p("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: /* @__PURE__ */ p(ce, { onSelectTemplate: G }) });
|
|
247
261
|
}
|
|
248
262
|
export {
|
|
249
|
-
|
|
263
|
+
Oe as LandingPageEditor
|
|
250
264
|
};
|
|
251
265
|
//# sourceMappingURL=LandingPageEditor.js.map
|