@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
|
@@ -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 } from \"../shared/templates\";\nimport type { TemplateId } from \"../shared/templates\";\nimport { sharedTemplateToEngineDocument } from \"../utils/sharedTemplateToEngine\";\nimport { findBlockInStructure } from \"../utils/blockUtils\";\nimport { isLightColor } 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 handleDeleteBlock,\n handleUpdateBlock,\n applyChange,\n resetToTemplate,\n isPaletteSelected,\n loadDocument,\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 [loadDocument],\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 (inclui mutedText, primaryText, linkColor e menuLinkColor)\n // Também atualiza links e botões do navbar para refletir a paleta escolhida\n const handlePaletteChange = useCallback((palette: any) => {\n if (!document) return;\n const bgLight = isLightColor(palette.background ?? \"#ffffff\");\n const primaryLight = isLightColor(palette.primary ?? \"#3b82f6\");\n const mutedText = bgLight ? \"#6b7280\" : \"#9ca3af\";\n const primaryText = primaryLight ? \"#1f2937\" : \"#ffffff\";\n const menuLinkColor = palette.menuLinkColor || palette.primary;\n\n // Construir todas as operações de patch em um único array\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 const themeColors = document.theme.colors;\n const newColors: Record<string, string> = {\n primary: palette.primary,\n secondary: palette.secondary,\n accent: palette.accent,\n bg: palette.background,\n surface: palette.surface || themeColors.surface || \"#f8fafc\",\n text: palette.text || themeColors.text || \"#1e293b\",\n mutedText,\n primaryText,\n linkColor: palette.linkColor || palette.primary,\n menuLinkColor,\n };\n for (const [key, value] of Object.entries(newColors)) {\n allPatches.push({ op: \"replace\", path: `/theme/colors/${key}`, value });\n }\n\n // 2. Navbar link/button color updates (todas as páginas)\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 if (page.structure[blockIdx].type === \"navbar\") {\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n allPatches.push(\n { op: \"replace\", path: `${base}/linkColor`, value: menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: palette.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: palette.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: primaryText },\n );\n }\n }\n }\n\n applyChange(allPatches, \"Update color palette\");\n }, [document, applyChange]);\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 }\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 />\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 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","handleDeleteBlock","handleUpdateBlock","applyChange","resetToTemplate","isPaletteSelected","loadDocument","activePlugins","activatePlugin","deactivatePlugin","useEditorState","isSaving","setIsSaving","useState","currentTemplateId","setCurrentTemplateId","focusedGroup","setFocusedGroup","showSelectionOverlay","setShowSelectionOverlay","handleSelectTemplate","useCallback","templateId","sharedDoc","getTemplate","engineDoc","sharedTemplateToEngineDocument","useEffect","handleSave","processedPages","page","block","processBlockDataURLs","processedDocument","error","logger","handlePublish","handleUpdateBlockById","blockId","updates","pageId","patch","PatchBuilder","handlePaletteChange","palette","bgLight","isLightColor","primaryLight","mutedText","primaryText","menuLinkColor","allPatches","themeColors","newColors","key","value","pageIdx","blockIdx","base","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","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, 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 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\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 }\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 />\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","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","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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"}
|
|
@@ -13,8 +13,11 @@ export interface ColorPalette {
|
|
|
13
13
|
linkColor?: string;
|
|
14
14
|
menuLinkColor?: string;
|
|
15
15
|
gradient: string[];
|
|
16
|
+
heroGradientStart?: string;
|
|
17
|
+
heroGradientEnd?: string;
|
|
16
18
|
}
|
|
17
19
|
export declare const colorPalettes: ColorPalette[];
|
|
20
|
+
export declare function findPaletteByName(name: string): ColorPalette | undefined;
|
|
18
21
|
interface PaletteSelectorProps {
|
|
19
22
|
selectedPalette?: ColorPalette;
|
|
20
23
|
onPaletteChange: (palette: ColorPalette) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaletteSelector.d.ts","sourceRoot":"","sources":["../../src/editor/PaletteSelector.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"PaletteSelector.d.ts","sourceRoot":"","sources":["../../src/editor/PaletteSelector.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAGnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,eAAO,MAAM,aAAa,EAAE,YAAY,EAwOvC,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAExE;AAMD,UAAU,oBAAoB;IAC5B,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,eAAe,CAAC,EAC9B,eAAe,EACf,eAAe,GAChB,EAAE,oBAAoB,2CAyCtB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { jsx as a, jsxs as
|
|
2
|
-
import { cn as
|
|
3
|
-
const
|
|
1
|
+
import { jsx as a, jsxs as f } from "react/jsx-runtime";
|
|
2
|
+
import { cn as i } from "../utils/cn.js";
|
|
3
|
+
const d = [
|
|
4
4
|
// Azuis
|
|
5
5
|
{
|
|
6
6
|
name: "Blue Serenity",
|
|
@@ -14,7 +14,9 @@ const i = [
|
|
|
14
14
|
// Links gerais - azul escuro
|
|
15
15
|
menuLinkColor: "#2563eb",
|
|
16
16
|
// Links do menu - tom do primary mais escuro
|
|
17
|
-
gradient: ["#3b82f6", "#60a5fa", "#93c5fd"]
|
|
17
|
+
gradient: ["#3b82f6", "#60a5fa", "#93c5fd"],
|
|
18
|
+
heroGradientStart: "#1e3a5f",
|
|
19
|
+
heroGradientEnd: "#2d5a8e"
|
|
18
20
|
},
|
|
19
21
|
{
|
|
20
22
|
name: "Ocean Deep",
|
|
@@ -28,7 +30,9 @@ const i = [
|
|
|
28
30
|
// Links gerais - azul claro
|
|
29
31
|
menuLinkColor: "#38bdf8",
|
|
30
32
|
// Links do menu - tom do primary mais claro
|
|
31
|
-
gradient: ["#0284c7", "#0369a1", "#38bdf8"]
|
|
33
|
+
gradient: ["#0284c7", "#0369a1", "#38bdf8"],
|
|
34
|
+
heroGradientStart: "#0a1628",
|
|
35
|
+
heroGradientEnd: "#0c2d4d"
|
|
32
36
|
},
|
|
33
37
|
// Verdes
|
|
34
38
|
{
|
|
@@ -43,7 +47,9 @@ const i = [
|
|
|
43
47
|
// Links gerais - verde escuro
|
|
44
48
|
menuLinkColor: "#059669",
|
|
45
49
|
// Links do menu - tom do primary mais escuro
|
|
46
|
-
gradient: ["#10b981", "#059669", "#34d399"]
|
|
50
|
+
gradient: ["#10b981", "#059669", "#34d399"],
|
|
51
|
+
heroGradientStart: "#0d3320",
|
|
52
|
+
heroGradientEnd: "#1a5c3a"
|
|
47
53
|
},
|
|
48
54
|
{
|
|
49
55
|
name: "Forest",
|
|
@@ -57,7 +63,9 @@ const i = [
|
|
|
57
63
|
// Links gerais - verde claro
|
|
58
64
|
menuLinkColor: "#4ade80",
|
|
59
65
|
// Links do menu - tom do primary mais claro
|
|
60
|
-
gradient: ["#22c55e", "#16a34a", "#4ade80"]
|
|
66
|
+
gradient: ["#22c55e", "#16a34a", "#4ade80"],
|
|
67
|
+
heroGradientStart: "#0a1f12",
|
|
68
|
+
heroGradientEnd: "#153d25"
|
|
61
69
|
},
|
|
62
70
|
// Roxos
|
|
63
71
|
{
|
|
@@ -72,7 +80,9 @@ const i = [
|
|
|
72
80
|
// Links gerais - roxo escuro
|
|
73
81
|
menuLinkColor: "#7c3aed",
|
|
74
82
|
// Links do menu - tom do primary mais escuro
|
|
75
|
-
gradient: ["#8b5cf6", "#7c3aed", "#a78bfa"]
|
|
83
|
+
gradient: ["#8b5cf6", "#7c3aed", "#a78bfa"],
|
|
84
|
+
heroGradientStart: "#2d1b69",
|
|
85
|
+
heroGradientEnd: "#4c2889"
|
|
76
86
|
},
|
|
77
87
|
{
|
|
78
88
|
name: "Midnight",
|
|
@@ -86,7 +96,9 @@ const i = [
|
|
|
86
96
|
// Links gerais - roxo claro
|
|
87
97
|
menuLinkColor: "#c084fc",
|
|
88
98
|
// Links do menu - tom do primary mais claro
|
|
89
|
-
gradient: ["#a855f7", "#9333ea", "#c084fc"]
|
|
99
|
+
gradient: ["#a855f7", "#9333ea", "#c084fc"],
|
|
100
|
+
heroGradientStart: "#1e1b4b",
|
|
101
|
+
heroGradientEnd: "#312e81"
|
|
90
102
|
},
|
|
91
103
|
// Laranjas/Amarelos
|
|
92
104
|
{
|
|
@@ -101,7 +113,9 @@ const i = [
|
|
|
101
113
|
// Links gerais - laranja escuro
|
|
102
114
|
menuLinkColor: "#ea580c",
|
|
103
115
|
// Links do menu - tom do primary mais escuro
|
|
104
|
-
gradient: ["#f97316", "#ea580c", "#fb923c"]
|
|
116
|
+
gradient: ["#f97316", "#ea580c", "#fb923c"],
|
|
117
|
+
heroGradientStart: "#4a1d0a",
|
|
118
|
+
heroGradientEnd: "#7a3012"
|
|
105
119
|
},
|
|
106
120
|
{
|
|
107
121
|
name: "Golden",
|
|
@@ -115,7 +129,9 @@ const i = [
|
|
|
115
129
|
// Links gerais - amarelo claro
|
|
116
130
|
menuLinkColor: "#fde047",
|
|
117
131
|
// Links do menu - amarelo bem claro para contraste
|
|
118
|
-
gradient: ["#eab308", "#ca8a04", "#facc15"]
|
|
132
|
+
gradient: ["#eab308", "#ca8a04", "#facc15"],
|
|
133
|
+
heroGradientStart: "#1a1500",
|
|
134
|
+
heroGradientEnd: "#3d3005"
|
|
119
135
|
},
|
|
120
136
|
// Vermelhos/Rosas
|
|
121
137
|
{
|
|
@@ -130,7 +146,9 @@ const i = [
|
|
|
130
146
|
// Links gerais - rosa escuro
|
|
131
147
|
menuLinkColor: "#e11d48",
|
|
132
148
|
// Links do menu - tom do primary mais escuro
|
|
133
|
-
gradient: ["#f43f5e", "#e11d48", "#fb7185"]
|
|
149
|
+
gradient: ["#f43f5e", "#e11d48", "#fb7185"],
|
|
150
|
+
heroGradientStart: "#4a0a1a",
|
|
151
|
+
heroGradientEnd: "#7a1230"
|
|
134
152
|
},
|
|
135
153
|
{
|
|
136
154
|
name: "Berry",
|
|
@@ -144,7 +162,9 @@ const i = [
|
|
|
144
162
|
// Links gerais - amarelo para contraste
|
|
145
163
|
menuLinkColor: "#fda4d0",
|
|
146
164
|
// Links do menu - rosa bem claro para contraste
|
|
147
|
-
gradient: ["#ec4899", "#db2777", "#f472b6"]
|
|
165
|
+
gradient: ["#ec4899", "#db2777", "#f472b6"],
|
|
166
|
+
heroGradientStart: "#3d0724",
|
|
167
|
+
heroGradientEnd: "#6b1040"
|
|
148
168
|
},
|
|
149
169
|
// Neutros
|
|
150
170
|
{
|
|
@@ -159,7 +179,9 @@ const i = [
|
|
|
159
179
|
// Links gerais - cinza escuro
|
|
160
180
|
menuLinkColor: "#334155",
|
|
161
181
|
// Links do menu - tom do primary mais escuro
|
|
162
|
-
gradient: ["#475569", "#334155", "#64748b"]
|
|
182
|
+
gradient: ["#475569", "#334155", "#64748b"],
|
|
183
|
+
heroGradientStart: "#1a1a2e",
|
|
184
|
+
heroGradientEnd: "#2d2d4a"
|
|
163
185
|
},
|
|
164
186
|
{
|
|
165
187
|
name: "Dark Mode",
|
|
@@ -173,29 +195,95 @@ const i = [
|
|
|
173
195
|
// Links gerais - índigo claro
|
|
174
196
|
menuLinkColor: "#818cf8",
|
|
175
197
|
// Links do menu - tom do primary mais claro
|
|
176
|
-
gradient: ["#6366f1", "#4f46e5", "#818cf8"]
|
|
198
|
+
gradient: ["#6366f1", "#4f46e5", "#818cf8"],
|
|
199
|
+
heroGradientStart: "#0f0a2e",
|
|
200
|
+
heroGradientEnd: "#1a1552"
|
|
201
|
+
},
|
|
202
|
+
// Template-specific palettes
|
|
203
|
+
{
|
|
204
|
+
name: "Indigo & Cyan",
|
|
205
|
+
primary: "#6366f1",
|
|
206
|
+
secondary: "#0ea5e9",
|
|
207
|
+
accent: "#f97316",
|
|
208
|
+
background: "#ffffff",
|
|
209
|
+
surface: "#f8fafc",
|
|
210
|
+
text: "#0f172a",
|
|
211
|
+
linkColor: "#4338ca",
|
|
212
|
+
menuLinkColor: "#6366f1",
|
|
213
|
+
gradient: ["#6366f1", "#0ea5e9", "#f97316"],
|
|
214
|
+
heroGradientStart: "#3730a3",
|
|
215
|
+
heroGradientEnd: "#0369a1"
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
name: "Blue Academy",
|
|
219
|
+
primary: "#2563eb",
|
|
220
|
+
secondary: "#1d4ed8",
|
|
221
|
+
accent: "#3b82f6",
|
|
222
|
+
background: "#ffffff",
|
|
223
|
+
surface: "#f8fafc",
|
|
224
|
+
text: "#0f172a",
|
|
225
|
+
linkColor: "#1e40af",
|
|
226
|
+
menuLinkColor: "#2563eb",
|
|
227
|
+
gradient: ["#2563eb", "#1d4ed8", "#3b82f6"],
|
|
228
|
+
heroGradientStart: "#1e3a8a",
|
|
229
|
+
heroGradientEnd: "#1e40af"
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
name: "Indigo Amber",
|
|
233
|
+
primary: "#4f46e5",
|
|
234
|
+
secondary: "#6366f1",
|
|
235
|
+
accent: "#f59e0b",
|
|
236
|
+
background: "#ffffff",
|
|
237
|
+
surface: "#f9fafb",
|
|
238
|
+
text: "#111827",
|
|
239
|
+
linkColor: "#4338ca",
|
|
240
|
+
menuLinkColor: "#4f46e5",
|
|
241
|
+
gradient: ["#4f46e5", "#6366f1", "#f59e0b"],
|
|
242
|
+
heroGradientStart: "#312e81",
|
|
243
|
+
heroGradientEnd: "#3730a3"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
name: "Indigo Pro",
|
|
247
|
+
primary: "#6366f1",
|
|
248
|
+
secondary: "#4f46e5",
|
|
249
|
+
accent: "#8b5cf6",
|
|
250
|
+
background: "#ffffff",
|
|
251
|
+
surface: "#f8fafc",
|
|
252
|
+
text: "#0f172a",
|
|
253
|
+
linkColor: "#4338ca",
|
|
254
|
+
menuLinkColor: "#6366f1",
|
|
255
|
+
gradient: ["#6366f1", "#4f46e5", "#8b5cf6"],
|
|
256
|
+
heroGradientStart: "#1e1b4b",
|
|
257
|
+
heroGradientEnd: "#312e81"
|
|
177
258
|
}
|
|
178
259
|
];
|
|
179
|
-
function m({
|
|
260
|
+
function m(r) {
|
|
261
|
+
return d.find((n) => n.name === r);
|
|
262
|
+
}
|
|
263
|
+
function s({
|
|
180
264
|
selectedPalette: r,
|
|
181
|
-
onPaletteChange:
|
|
265
|
+
onPaletteChange: n
|
|
182
266
|
}) {
|
|
183
|
-
const
|
|
184
|
-
return /* @__PURE__ */ a("div", { className: "grid grid-cols-2 gap-3", children:
|
|
267
|
+
const o = (e) => r?.name === e.name;
|
|
268
|
+
return /* @__PURE__ */ a("div", { className: "grid grid-cols-2 gap-3", children: d.map((e) => /* @__PURE__ */ f(
|
|
185
269
|
"button",
|
|
186
270
|
{
|
|
187
|
-
onClick: () =>
|
|
188
|
-
className:
|
|
271
|
+
onClick: () => n(e),
|
|
272
|
+
className: i(
|
|
189
273
|
"rounded-lg cursor-pointer transition-all p-2",
|
|
190
274
|
"flex flex-col items-center gap-1.5",
|
|
191
275
|
"border-2",
|
|
192
|
-
|
|
276
|
+
o(e) ? "border-blue-500 bg-blue-50 dark:bg-blue-950/30 shadow-sm" : "border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600",
|
|
193
277
|
"bg-white dark:bg-gray-800",
|
|
194
278
|
"hover:scale-[1.02] active:scale-[0.98]"
|
|
195
279
|
),
|
|
196
280
|
title: e.name,
|
|
197
281
|
children: [
|
|
198
|
-
/* @__PURE__ */
|
|
282
|
+
/* @__PURE__ */ f("div", { className: "w-full h-8 rounded-md flex overflow-hidden mb-1.5", children: [
|
|
283
|
+
e.gradient.map((c, t) => /* @__PURE__ */ a("span", { className: "flex-1", style: { background: c } }, t)),
|
|
284
|
+
e.heroGradientStart && /* @__PURE__ */ a("span", { className: "flex-1", style: { background: e.heroGradientStart } }),
|
|
285
|
+
e.heroGradientEnd && /* @__PURE__ */ a("span", { className: "flex-1", style: { background: e.heroGradientEnd } })
|
|
286
|
+
] }),
|
|
199
287
|
/* @__PURE__ */ a("span", { className: "text-xs font-medium text-gray-700 dark:text-gray-300 text-center leading-tight px-1", children: e.name })
|
|
200
288
|
]
|
|
201
289
|
},
|
|
@@ -203,7 +291,8 @@ function m({
|
|
|
203
291
|
)) });
|
|
204
292
|
}
|
|
205
293
|
export {
|
|
206
|
-
|
|
207
|
-
|
|
294
|
+
s as PaletteSelector,
|
|
295
|
+
d as colorPalettes,
|
|
296
|
+
m as findPaletteByName
|
|
208
297
|
};
|
|
209
298
|
//# sourceMappingURL=PaletteSelector.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaletteSelector.js","sources":["../../src/editor/PaletteSelector.tsx"],"sourcesContent":["/**\r\n * Palette Selector\r\n * Seletor de paletas de cores para o editor\r\n */\r\n\r\nimport { cn } from \"../utils/cn\";\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface ColorPalette {\r\n name: string;\r\n primary: string;\r\n secondary: string;\r\n accent: string;\r\n background: string;\r\n surface?: string;\r\n text: string;\r\n linkColor?: string; // Cor específica para links em geral (dropdowns, etc)\r\n menuLinkColor?: string; // Cor específica para links do menu navbar (derivada do primary)\r\n gradient: string[];\r\n}\r\n\r\n// ============================================================================\r\n// Palettes (text e background devem ter contraste adequado; evitar text === background)\r\n// ============================================================================\r\n\r\nexport const colorPalettes: ColorPalette[] = [\r\n // Azuis\r\n {\r\n name: \"Blue Serenity\",\r\n primary: \"#3b82f6\",\r\n secondary: \"#60a5fa\",\r\n accent: \"#93c5fd\",\r\n background: \"#ffffff\",\r\n surface: \"#f8fafc\",\r\n text: \"#1e293b\",\r\n linkColor: \"#1e40af\", // Links gerais - azul escuro\r\n menuLinkColor: \"#2563eb\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#3b82f6\", \"#60a5fa\", \"#93c5fd\"],\r\n },\r\n {\r\n name: \"Ocean Deep\",\r\n primary: \"#0284c7\",\r\n secondary: \"#0369a1\",\r\n accent: \"#38bdf8\",\r\n background: \"#0f172a\",\r\n surface: \"#1e293b\",\r\n text: \"#f8fafc\",\r\n linkColor: \"#7dd3fc\", // Links gerais - azul claro\r\n menuLinkColor: \"#38bdf8\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#0284c7\", \"#0369a1\", \"#38bdf8\"],\r\n },\r\n // Verdes\r\n {\r\n name: \"Emerald\",\r\n primary: \"#10b981\",\r\n secondary: \"#059669\",\r\n accent: \"#34d399\",\r\n background: \"#ffffff\",\r\n surface: \"#f0fdf4\",\r\n text: \"#166534\",\r\n linkColor: \"#047857\", // Links gerais - verde escuro\r\n menuLinkColor: \"#059669\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#10b981\", \"#059669\", \"#34d399\"],\r\n },\r\n {\r\n name: \"Forest\",\r\n primary: \"#22c55e\",\r\n secondary: \"#16a34a\",\r\n accent: \"#4ade80\",\r\n background: \"#052e16\",\r\n surface: \"#14532d\",\r\n text: \"#f0fdf4\",\r\n linkColor: \"#86efac\", // Links gerais - verde claro\r\n menuLinkColor: \"#4ade80\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#22c55e\", \"#16a34a\", \"#4ade80\"],\r\n },\r\n // Roxos\r\n {\r\n name: \"Purple Dream\",\r\n primary: \"#8b5cf6\",\r\n secondary: \"#7c3aed\",\r\n accent: \"#a78bfa\",\r\n background: \"#ffffff\",\r\n surface: \"#faf5ff\",\r\n text: \"#4c1d95\",\r\n linkColor: \"#6d28d9\", // Links gerais - roxo escuro\r\n menuLinkColor: \"#7c3aed\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#8b5cf6\", \"#7c3aed\", \"#a78bfa\"],\r\n },\r\n {\r\n name: \"Midnight\",\r\n primary: \"#a855f7\",\r\n secondary: \"#9333ea\",\r\n accent: \"#c084fc\",\r\n background: \"#1e1b4b\",\r\n surface: \"#312e81\",\r\n text: \"#f5f3ff\",\r\n linkColor: \"#d8b4fe\", // Links gerais - roxo claro\r\n menuLinkColor: \"#c084fc\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#a855f7\", \"#9333ea\", \"#c084fc\"],\r\n },\r\n // Laranjas/Amarelos\r\n {\r\n name: \"Sunset\",\r\n primary: \"#f97316\",\r\n secondary: \"#ea580c\",\r\n accent: \"#fb923c\",\r\n background: \"#ffffff\",\r\n surface: \"#fff7ed\",\r\n text: \"#7c2d12\",\r\n linkColor: \"#c2410c\", // Links gerais - laranja escuro\r\n menuLinkColor: \"#ea580c\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#f97316\", \"#ea580c\", \"#fb923c\"],\r\n },\r\n {\r\n name: \"Golden\",\r\n primary: \"#eab308\",\r\n secondary: \"#ca8a04\",\r\n accent: \"#facc15\",\r\n background: \"#1a1a1a\",\r\n surface: \"#262626\",\r\n text: \"#fefce8\",\r\n linkColor: \"#fde047\", // Links gerais - amarelo claro\r\n menuLinkColor: \"#fde047\", // Links do menu - amarelo bem claro para contraste\r\n gradient: [\"#eab308\", \"#ca8a04\", \"#facc15\"],\r\n },\r\n // Vermelhos/Rosas\r\n {\r\n name: \"Rose\",\r\n primary: \"#f43f5e\",\r\n secondary: \"#e11d48\",\r\n accent: \"#fb7185\",\r\n background: \"#ffffff\",\r\n surface: \"#fff1f2\",\r\n text: \"#881337\",\r\n linkColor: \"#be123c\", // Links gerais - rosa escuro\r\n menuLinkColor: \"#e11d48\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#f43f5e\", \"#e11d48\", \"#fb7185\"],\r\n },\r\n {\r\n name: \"Berry\",\r\n primary: \"#ec4899\",\r\n secondary: \"#db2777\",\r\n accent: \"#f472b6\",\r\n background: \"#500724\",\r\n surface: \"#831843\",\r\n text: \"#fdf2f8\",\r\n linkColor: \"#fbbf24\", // Links gerais - amarelo para contraste\r\n menuLinkColor: \"#fda4d0\", // Links do menu - rosa bem claro para contraste\r\n gradient: [\"#ec4899\", \"#db2777\", \"#f472b6\"],\r\n },\r\n // Neutros\r\n {\r\n name: \"Slate Modern\",\r\n primary: \"#475569\",\r\n secondary: \"#334155\",\r\n accent: \"#64748b\",\r\n background: \"#ffffff\",\r\n surface: \"#f8fafc\",\r\n text: \"#0f172a\",\r\n linkColor: \"#1e293b\", // Links gerais - cinza escuro\r\n menuLinkColor: \"#334155\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#475569\", \"#334155\", \"#64748b\"],\r\n },\r\n {\r\n name: \"Dark Mode\",\r\n primary: \"#6366f1\",\r\n secondary: \"#4f46e5\",\r\n accent: \"#818cf8\",\r\n background: \"#0f0f0f\",\r\n surface: \"#1a1a1a\",\r\n text: \"#fafafa\",\r\n linkColor: \"#a5b4fc\", // Links gerais - índigo claro\r\n menuLinkColor: \"#818cf8\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#6366f1\", \"#4f46e5\", \"#818cf8\"],\r\n },\r\n];\r\n\r\n// ============================================================================\r\n// Component\r\n// ============================================================================\r\n\r\ninterface PaletteSelectorProps {\r\n selectedPalette?: ColorPalette;\r\n onPaletteChange: (palette: ColorPalette) => void;\r\n}\r\n\r\nexport function PaletteSelector({\r\n selectedPalette,\r\n onPaletteChange,\r\n}: PaletteSelectorProps) {\r\n const isSelected = (palette: ColorPalette) => {\r\n return selectedPalette?.name === palette.name;\r\n };\r\n\r\n return (\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n {colorPalettes.map((palette) => (\r\n <button\r\n key={palette.name}\r\n onClick={() => onPaletteChange(palette)}\r\n className={cn(\r\n \"rounded-lg cursor-pointer transition-all p-2\",\r\n \"flex flex-col items-center gap-1.5\",\r\n \"border-2\",\r\n isSelected(palette)\r\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-950/30 shadow-sm\"\r\n : \"border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600\",\r\n \"bg-white dark:bg-gray-800\",\r\n \"hover:scale-[1.02] active:scale-[0.98]\",\r\n )}\r\n title={palette.name}\r\n >\r\n <div className=\"w-full h-8 rounded-md flex overflow-hidden mb-1.5\">\r\n {palette.gradient.map((color, i) => (\r\n <span key={i} className=\"flex-1\" style={{ background: color }} />\r\n ))}\r\n </div>\r\n <span className=\"text-xs font-medium text-gray-700 dark:text-gray-300 text-center leading-tight px-1\">\r\n {palette.name}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"names":["colorPalettes","PaletteSelector","selectedPalette","onPaletteChange","isSelected","palette","jsxs","cn","jsx","color","i"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PaletteSelector.js","sources":["../../src/editor/PaletteSelector.tsx"],"sourcesContent":["/**\r\n * Palette Selector\r\n * Seletor de paletas de cores para o editor\r\n */\r\n\r\nimport { cn } from \"../utils/cn\";\r\n\r\n// ============================================================================\r\n// Types\r\n// ============================================================================\r\n\r\nexport interface ColorPalette {\r\n name: string;\r\n primary: string;\r\n secondary: string;\r\n accent: string;\r\n background: string;\r\n surface?: string;\r\n text: string;\r\n linkColor?: string; // Cor específica para links em geral (dropdowns, etc)\r\n menuLinkColor?: string; // Cor específica para links do menu navbar (derivada do primary)\r\n gradient: string[];\r\n\r\n // Hero gradient overrides (derivados automaticamente se ausentes)\r\n heroGradientStart?: string;\r\n heroGradientEnd?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Palettes (text e background devem ter contraste adequado; evitar text === background)\r\n// ============================================================================\r\n\r\nexport const colorPalettes: ColorPalette[] = [\r\n // Azuis\r\n {\r\n name: \"Blue Serenity\",\r\n primary: \"#3b82f6\",\r\n secondary: \"#60a5fa\",\r\n accent: \"#93c5fd\",\r\n background: \"#ffffff\",\r\n surface: \"#f8fafc\",\r\n text: \"#1e293b\",\r\n linkColor: \"#1e40af\", // Links gerais - azul escuro\r\n menuLinkColor: \"#2563eb\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#3b82f6\", \"#60a5fa\", \"#93c5fd\"],\r\n heroGradientStart: \"#1e3a5f\",\r\n heroGradientEnd: \"#2d5a8e\",\r\n },\r\n {\r\n name: \"Ocean Deep\",\r\n primary: \"#0284c7\",\r\n secondary: \"#0369a1\",\r\n accent: \"#38bdf8\",\r\n background: \"#0f172a\",\r\n surface: \"#1e293b\",\r\n text: \"#f8fafc\",\r\n linkColor: \"#7dd3fc\", // Links gerais - azul claro\r\n menuLinkColor: \"#38bdf8\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#0284c7\", \"#0369a1\", \"#38bdf8\"],\r\n heroGradientStart: \"#0a1628\",\r\n heroGradientEnd: \"#0c2d4d\",\r\n },\r\n // Verdes\r\n {\r\n name: \"Emerald\",\r\n primary: \"#10b981\",\r\n secondary: \"#059669\",\r\n accent: \"#34d399\",\r\n background: \"#ffffff\",\r\n surface: \"#f0fdf4\",\r\n text: \"#166534\",\r\n linkColor: \"#047857\", // Links gerais - verde escuro\r\n menuLinkColor: \"#059669\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#10b981\", \"#059669\", \"#34d399\"],\r\n heroGradientStart: \"#0d3320\",\r\n heroGradientEnd: \"#1a5c3a\",\r\n },\r\n {\r\n name: \"Forest\",\r\n primary: \"#22c55e\",\r\n secondary: \"#16a34a\",\r\n accent: \"#4ade80\",\r\n background: \"#052e16\",\r\n surface: \"#14532d\",\r\n text: \"#f0fdf4\",\r\n linkColor: \"#86efac\", // Links gerais - verde claro\r\n menuLinkColor: \"#4ade80\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#22c55e\", \"#16a34a\", \"#4ade80\"],\r\n heroGradientStart: \"#0a1f12\",\r\n heroGradientEnd: \"#153d25\",\r\n },\r\n // Roxos\r\n {\r\n name: \"Purple Dream\",\r\n primary: \"#8b5cf6\",\r\n secondary: \"#7c3aed\",\r\n accent: \"#a78bfa\",\r\n background: \"#ffffff\",\r\n surface: \"#faf5ff\",\r\n text: \"#4c1d95\",\r\n linkColor: \"#6d28d9\", // Links gerais - roxo escuro\r\n menuLinkColor: \"#7c3aed\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#8b5cf6\", \"#7c3aed\", \"#a78bfa\"],\r\n heroGradientStart: \"#2d1b69\",\r\n heroGradientEnd: \"#4c2889\",\r\n },\r\n {\r\n name: \"Midnight\",\r\n primary: \"#a855f7\",\r\n secondary: \"#9333ea\",\r\n accent: \"#c084fc\",\r\n background: \"#1e1b4b\",\r\n surface: \"#312e81\",\r\n text: \"#f5f3ff\",\r\n linkColor: \"#d8b4fe\", // Links gerais - roxo claro\r\n menuLinkColor: \"#c084fc\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#a855f7\", \"#9333ea\", \"#c084fc\"],\r\n heroGradientStart: \"#1e1b4b\",\r\n heroGradientEnd: \"#312e81\",\r\n },\r\n // Laranjas/Amarelos\r\n {\r\n name: \"Sunset\",\r\n primary: \"#f97316\",\r\n secondary: \"#ea580c\",\r\n accent: \"#fb923c\",\r\n background: \"#ffffff\",\r\n surface: \"#fff7ed\",\r\n text: \"#7c2d12\",\r\n linkColor: \"#c2410c\", // Links gerais - laranja escuro\r\n menuLinkColor: \"#ea580c\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#f97316\", \"#ea580c\", \"#fb923c\"],\r\n heroGradientStart: \"#4a1d0a\",\r\n heroGradientEnd: \"#7a3012\",\r\n },\r\n {\r\n name: \"Golden\",\r\n primary: \"#eab308\",\r\n secondary: \"#ca8a04\",\r\n accent: \"#facc15\",\r\n background: \"#1a1a1a\",\r\n surface: \"#262626\",\r\n text: \"#fefce8\",\r\n linkColor: \"#fde047\", // Links gerais - amarelo claro\r\n menuLinkColor: \"#fde047\", // Links do menu - amarelo bem claro para contraste\r\n gradient: [\"#eab308\", \"#ca8a04\", \"#facc15\"],\r\n heroGradientStart: \"#1a1500\",\r\n heroGradientEnd: \"#3d3005\",\r\n },\r\n // Vermelhos/Rosas\r\n {\r\n name: \"Rose\",\r\n primary: \"#f43f5e\",\r\n secondary: \"#e11d48\",\r\n accent: \"#fb7185\",\r\n background: \"#ffffff\",\r\n surface: \"#fff1f2\",\r\n text: \"#881337\",\r\n linkColor: \"#be123c\", // Links gerais - rosa escuro\r\n menuLinkColor: \"#e11d48\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#f43f5e\", \"#e11d48\", \"#fb7185\"],\r\n heroGradientStart: \"#4a0a1a\",\r\n heroGradientEnd: \"#7a1230\",\r\n },\r\n {\r\n name: \"Berry\",\r\n primary: \"#ec4899\",\r\n secondary: \"#db2777\",\r\n accent: \"#f472b6\",\r\n background: \"#500724\",\r\n surface: \"#831843\",\r\n text: \"#fdf2f8\",\r\n linkColor: \"#fbbf24\", // Links gerais - amarelo para contraste\r\n menuLinkColor: \"#fda4d0\", // Links do menu - rosa bem claro para contraste\r\n gradient: [\"#ec4899\", \"#db2777\", \"#f472b6\"],\r\n heroGradientStart: \"#3d0724\",\r\n heroGradientEnd: \"#6b1040\",\r\n },\r\n // Neutros\r\n {\r\n name: \"Slate Modern\",\r\n primary: \"#475569\",\r\n secondary: \"#334155\",\r\n accent: \"#64748b\",\r\n background: \"#ffffff\",\r\n surface: \"#f8fafc\",\r\n text: \"#0f172a\",\r\n linkColor: \"#1e293b\", // Links gerais - cinza escuro\r\n menuLinkColor: \"#334155\", // Links do menu - tom do primary mais escuro\r\n gradient: [\"#475569\", \"#334155\", \"#64748b\"],\r\n heroGradientStart: \"#1a1a2e\",\r\n heroGradientEnd: \"#2d2d4a\",\r\n },\r\n {\r\n name: \"Dark Mode\",\r\n primary: \"#6366f1\",\r\n secondary: \"#4f46e5\",\r\n accent: \"#818cf8\",\r\n background: \"#0f0f0f\",\r\n surface: \"#1a1a1a\",\r\n text: \"#fafafa\",\r\n linkColor: \"#a5b4fc\", // Links gerais - índigo claro\r\n menuLinkColor: \"#818cf8\", // Links do menu - tom do primary mais claro\r\n gradient: [\"#6366f1\", \"#4f46e5\", \"#818cf8\"],\r\n heroGradientStart: \"#0f0a2e\",\r\n heroGradientEnd: \"#1a1552\",\r\n },\r\n // Template-specific palettes\r\n {\r\n name: \"Indigo & Cyan\",\r\n primary: \"#6366f1\",\r\n secondary: \"#0ea5e9\",\r\n accent: \"#f97316\",\r\n background: \"#ffffff\",\r\n surface: \"#f8fafc\",\r\n text: \"#0f172a\",\r\n linkColor: \"#4338ca\",\r\n menuLinkColor: \"#6366f1\",\r\n gradient: [\"#6366f1\", \"#0ea5e9\", \"#f97316\"],\r\n heroGradientStart: \"#3730a3\",\r\n heroGradientEnd: \"#0369a1\",\r\n },\r\n {\r\n name: \"Blue Academy\",\r\n primary: \"#2563eb\",\r\n secondary: \"#1d4ed8\",\r\n accent: \"#3b82f6\",\r\n background: \"#ffffff\",\r\n surface: \"#f8fafc\",\r\n text: \"#0f172a\",\r\n linkColor: \"#1e40af\",\r\n menuLinkColor: \"#2563eb\",\r\n gradient: [\"#2563eb\", \"#1d4ed8\", \"#3b82f6\"],\r\n heroGradientStart: \"#1e3a8a\",\r\n heroGradientEnd: \"#1e40af\",\r\n },\r\n {\r\n name: \"Indigo Amber\",\r\n primary: \"#4f46e5\",\r\n secondary: \"#6366f1\",\r\n accent: \"#f59e0b\",\r\n background: \"#ffffff\",\r\n surface: \"#f9fafb\",\r\n text: \"#111827\",\r\n linkColor: \"#4338ca\",\r\n menuLinkColor: \"#4f46e5\",\r\n gradient: [\"#4f46e5\", \"#6366f1\", \"#f59e0b\"],\r\n heroGradientStart: \"#312e81\",\r\n heroGradientEnd: \"#3730a3\",\r\n },\r\n {\r\n name: \"Indigo Pro\",\r\n primary: \"#6366f1\",\r\n secondary: \"#4f46e5\",\r\n accent: \"#8b5cf6\",\r\n background: \"#ffffff\",\r\n surface: \"#f8fafc\",\r\n text: \"#0f172a\",\r\n linkColor: \"#4338ca\",\r\n menuLinkColor: \"#6366f1\",\r\n gradient: [\"#6366f1\", \"#4f46e5\", \"#8b5cf6\"],\r\n heroGradientStart: \"#1e1b4b\",\r\n heroGradientEnd: \"#312e81\",\r\n },\r\n];\r\n\r\n// ============================================================================\r\n// Utilities\r\n// ============================================================================\r\n\r\nexport function findPaletteByName(name: string): ColorPalette | undefined {\r\n return colorPalettes.find(p => p.name === name);\r\n}\r\n\r\n// ============================================================================\r\n// Component\r\n// ============================================================================\r\n\r\ninterface PaletteSelectorProps {\r\n selectedPalette?: ColorPalette;\r\n onPaletteChange: (palette: ColorPalette) => void;\r\n}\r\n\r\nexport function PaletteSelector({\r\n selectedPalette,\r\n onPaletteChange,\r\n}: PaletteSelectorProps) {\r\n const isSelected = (palette: ColorPalette) => {\r\n return selectedPalette?.name === palette.name;\r\n };\r\n\r\n return (\r\n <div className=\"grid grid-cols-2 gap-3\">\r\n {colorPalettes.map((palette) => (\r\n <button\r\n key={palette.name}\r\n onClick={() => onPaletteChange(palette)}\r\n className={cn(\r\n \"rounded-lg cursor-pointer transition-all p-2\",\r\n \"flex flex-col items-center gap-1.5\",\r\n \"border-2\",\r\n isSelected(palette)\r\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-950/30 shadow-sm\"\r\n : \"border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600\",\r\n \"bg-white dark:bg-gray-800\",\r\n \"hover:scale-[1.02] active:scale-[0.98]\",\r\n )}\r\n title={palette.name}\r\n >\r\n <div className=\"w-full h-8 rounded-md flex overflow-hidden mb-1.5\">\r\n {palette.gradient.map((color, i) => (\r\n <span key={i} className=\"flex-1\" style={{ background: color }} />\r\n ))}\r\n {palette.heroGradientStart && (\r\n <span className=\"flex-1\" style={{ background: palette.heroGradientStart }} />\r\n )}\r\n {palette.heroGradientEnd && (\r\n <span className=\"flex-1\" style={{ background: palette.heroGradientEnd }} />\r\n )}\r\n </div>\r\n <span className=\"text-xs font-medium text-gray-700 dark:text-gray-300 text-center leading-tight px-1\">\r\n {palette.name}\r\n </span>\r\n </button>\r\n ))}\r\n </div>\r\n );\r\n}\r\n"],"names":["colorPalettes","findPaletteByName","name","p","PaletteSelector","selectedPalette","onPaletteChange","isSelected","palette","jsxs","cn","color","i","jsx"],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { default as React } from 'react';
|
|
2
2
|
import { UploadConfig } from '../LandingPageEditor';
|
|
3
3
|
import { SiteDocument } from '../../engine';
|
|
4
|
+
import { ColorPalette } from '../PaletteSelector';
|
|
4
5
|
interface RightPanelProps {
|
|
5
6
|
isPaletteSelected: boolean;
|
|
6
7
|
selectedBlock: any;
|
|
8
|
+
selectedPalette?: ColorPalette;
|
|
7
9
|
onPaletteChange: (palette: any) => void;
|
|
8
10
|
onUpdateBlock: (updates: Record<string, any>) => void;
|
|
9
11
|
uploadConfig?: UploadConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RightPanel.d.ts","sourceRoot":"","sources":["../../../src/editor/components/RightPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyB,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"RightPanel.d.ts","sourceRoot":"","sources":["../../../src/editor/components/RightPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAyB,MAAM,OAAO,CAAC;AAE9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAUvD,UAAU,eAAe;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,GAAG,CAAC;IACnB,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACxC,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IACtD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,eAAO,MAAM,UAAU,6CA2CrB,CAAC"}
|
|
@@ -1,38 +1,39 @@
|
|
|
1
|
-
import { jsx as e, jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { LoadingSpinner as
|
|
4
|
-
const
|
|
1
|
+
import { jsx as e, jsxs as f } from "react/jsx-runtime";
|
|
2
|
+
import h, { Suspense as p, lazy as o } from "react";
|
|
3
|
+
import { LoadingSpinner as x } from "./LoadingSpinner.js";
|
|
4
|
+
const g = o(
|
|
5
5
|
() => import("../PropertyEditor/index.js").then((r) => ({ default: r.BlockPropertyEditor }))
|
|
6
|
-
),
|
|
6
|
+
), y = o(
|
|
7
7
|
() => import("../PaletteSelector.js").then((r) => ({ default: r.PaletteSelector }))
|
|
8
|
-
), v =
|
|
8
|
+
), v = h.memo(function({
|
|
9
9
|
isPaletteSelected: a,
|
|
10
10
|
selectedBlock: t,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
selectedPalette: l,
|
|
12
|
+
onPaletteChange: d,
|
|
13
|
+
onUpdateBlock: i,
|
|
14
|
+
uploadConfig: n,
|
|
15
|
+
document: c,
|
|
16
|
+
currentPageId: s,
|
|
17
|
+
focusedGroup: m
|
|
17
18
|
}) {
|
|
18
|
-
return /* @__PURE__ */ e("div", { className: "w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col", children: /* @__PURE__ */ e(
|
|
19
|
+
return /* @__PURE__ */ e("div", { className: "w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col", children: /* @__PURE__ */ e(p, { fallback: /* @__PURE__ */ e(x, {}), children: a ? /* @__PURE__ */ f("div", { className: "p-4 overflow-y-auto", children: [
|
|
19
20
|
/* @__PURE__ */ e("h2", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100 mb-4", children: "Escolha uma Paleta de Cores" }),
|
|
20
21
|
/* @__PURE__ */ e(
|
|
21
|
-
|
|
22
|
+
y,
|
|
22
23
|
{
|
|
23
|
-
selectedPalette:
|
|
24
|
-
onPaletteChange:
|
|
24
|
+
selectedPalette: l,
|
|
25
|
+
onPaletteChange: d
|
|
25
26
|
}
|
|
26
27
|
)
|
|
27
28
|
] }) : t ? /* @__PURE__ */ e("div", { className: "overflow-y-auto overflow-x-hidden flex-1", children: /* @__PURE__ */ e(
|
|
28
|
-
|
|
29
|
+
g,
|
|
29
30
|
{
|
|
30
31
|
block: t,
|
|
31
|
-
document:
|
|
32
|
-
currentPageId:
|
|
33
|
-
onUpdate:
|
|
34
|
-
uploadConfig:
|
|
35
|
-
focusedGroup:
|
|
32
|
+
document: c,
|
|
33
|
+
currentPageId: s,
|
|
34
|
+
onUpdate: i,
|
|
35
|
+
uploadConfig: n,
|
|
36
|
+
focusedGroup: m
|
|
36
37
|
}
|
|
37
38
|
) }) : /* @__PURE__ */ e("div", { className: "p-4 text-center text-gray-500 dark:text-gray-400", children: "Selecione um bloco para editar" }) }) });
|
|
38
39
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RightPanel.js","sources":["../../../src/editor/components/RightPanel.tsx"],"sourcesContent":["import React, { lazy, Suspense } from \"react\";\nimport { LoadingSpinner } from \"./LoadingSpinner\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\nimport type { SiteDocument } from \"../../engine\";\n\n// Lazy load componentes pesados do editor\nconst BlockPropertyEditor = lazy(() =>\n import(\"../PropertyEditor\").then(module => ({ default: module.BlockPropertyEditor }))\n);\nconst PaletteSelector = lazy(() =>\n import(\"../PaletteSelector\").then(module => ({ default: module.PaletteSelector }))\n);\n\ninterface RightPanelProps {\n isPaletteSelected: boolean;\n selectedBlock: any;\n onPaletteChange: (palette: any) => void;\n onUpdateBlock: (updates: Record<string, any>) => void;\n uploadConfig?: UploadConfig;\n document?: SiteDocument;\n currentPageId?: string;\n /** When set, the matching property group opens and scrolls into view */\n focusedGroup?: string | null;\n}\n\nexport const RightPanel = React.memo(function RightPanel({\n isPaletteSelected,\n selectedBlock,\n onPaletteChange,\n onUpdateBlock,\n uploadConfig,\n document,\n currentPageId,\n focusedGroup,\n}: RightPanelProps) {\n return (\n <div className=\"w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col\">\n <Suspense fallback={<LoadingSpinner />}>\n {isPaletteSelected ? (\n <div className=\"p-4 overflow-y-auto\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100 mb-4\">\n Escolha uma Paleta de Cores\n </h2>\n <PaletteSelector\n selectedPalette={
|
|
1
|
+
{"version":3,"file":"RightPanel.js","sources":["../../../src/editor/components/RightPanel.tsx"],"sourcesContent":["import React, { lazy, Suspense } from \"react\";\nimport { LoadingSpinner } from \"./LoadingSpinner\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\nimport type { SiteDocument } from \"../../engine\";\nimport type { ColorPalette } from \"../PaletteSelector\";\n\n// Lazy load componentes pesados do editor\nconst BlockPropertyEditor = lazy(() =>\n import(\"../PropertyEditor\").then(module => ({ default: module.BlockPropertyEditor }))\n);\nconst PaletteSelector = lazy(() =>\n import(\"../PaletteSelector\").then(module => ({ default: module.PaletteSelector }))\n);\n\ninterface RightPanelProps {\n isPaletteSelected: boolean;\n selectedBlock: any;\n selectedPalette?: ColorPalette;\n onPaletteChange: (palette: any) => void;\n onUpdateBlock: (updates: Record<string, any>) => void;\n uploadConfig?: UploadConfig;\n document?: SiteDocument;\n currentPageId?: string;\n /** When set, the matching property group opens and scrolls into view */\n focusedGroup?: string | null;\n}\n\nexport const RightPanel = React.memo(function RightPanel({\n isPaletteSelected,\n selectedBlock,\n selectedPalette,\n onPaletteChange,\n onUpdateBlock,\n uploadConfig,\n document,\n currentPageId,\n focusedGroup,\n}: RightPanelProps) {\n return (\n <div className=\"w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col\">\n <Suspense fallback={<LoadingSpinner />}>\n {isPaletteSelected ? (\n <div className=\"p-4 overflow-y-auto\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100 mb-4\">\n Escolha uma Paleta de Cores\n </h2>\n <PaletteSelector\n selectedPalette={selectedPalette}\n onPaletteChange={onPaletteChange}\n />\n </div>\n ) : selectedBlock ? (\n <div className=\"overflow-y-auto overflow-x-hidden flex-1\">\n <BlockPropertyEditor\n block={selectedBlock}\n document={document}\n currentPageId={currentPageId}\n onUpdate={onUpdateBlock}\n uploadConfig={uploadConfig}\n focusedGroup={focusedGroup}\n />\n </div>\n ) : (\n <div className=\"p-4 text-center text-gray-500 dark:text-gray-400\">\n Selecione um bloco para editar\n </div>\n )}\n </Suspense>\n </div>\n );\n});\n"],"names":["BlockPropertyEditor","lazy","module","PaletteSelector","RightPanel","React","isPaletteSelected","selectedBlock","selectedPalette","onPaletteChange","onUpdateBlock","uploadConfig","document","currentPageId","focusedGroup","jsx","Suspense","LoadingSpinner","jsxs"],"mappings":";;;AAOA,MAAMA,IAAsBC;AAAA,EAAK,MAC/B,OAAO,4BAAmB,EAAE,KAAK,QAAW,EAAE,SAASC,EAAO,sBAAsB;AACtF,GACMC,IAAkBF;AAAA,EAAK,MAC3B,OAAO,uBAAoB,EAAE,KAAK,QAAW,EAAE,SAASC,EAAO,kBAAkB;AACnF,GAeaE,IAAaC,EAAM,KAAK,SAAoB;AAAA,EACvD,mBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AACF,GAAoB;AAClB,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,4HACb,4BAACC,GAAA,EAAS,UAAU,gBAAAD,EAACE,GAAA,CAAA,CAAe,GACjC,UAAAX,IACC,gBAAAY,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,+DAA8D,UAAA,+BAE5E;AAAA,IACA,gBAAAA;AAAA,MAACZ;AAAA,MAAA;AAAA,QACC,iBAAAK;AAAA,QACA,iBAAAC;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF,IACEF,IACF,gBAAAQ,EAAC,OAAA,EAAI,WAAU,4CACb,UAAA,gBAAAA;AAAA,IAACf;AAAA,IAAA;AAAA,MACC,OAAOO;AAAA,MACP,UAAAK;AAAA,MACA,eAAAC;AAAA,MACA,UAAUH;AAAA,MACV,cAAAC;AAAA,MACA,cAAAG;AAAA,IAAA;AAAA,EAAA,EACF,CACF,IAEA,gBAAAC,EAAC,OAAA,EAAI,WAAU,oDAAmD,UAAA,iCAAA,CAElE,GAEJ,GACF;AAEJ,CAAC;"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
-
import { SiteDocument, SitePage, Block } from '../schema/siteDocument';
|
|
1
|
+
import { SiteDocument, SitePage, Block, PageSeoConfig, SiteMetadata } from '../schema/siteDocument';
|
|
2
2
|
import { ThemeTokens } from '../schema/themeTokens';
|
|
3
3
|
export interface ExportPageToHtmlOptions {
|
|
4
4
|
/** Página de referência para layout (navbar + footer). Quando a página atual não é a home, inclui navbar e footer desta página. */
|
|
5
5
|
layoutFromPage?: SitePage;
|
|
6
|
+
/** SEO overrides for this page (highest priority) */
|
|
7
|
+
seo?: PageSeoConfig;
|
|
8
|
+
/** Global site metadata */
|
|
9
|
+
siteMetadata?: SiteMetadata;
|
|
6
10
|
}
|
|
7
11
|
/**
|
|
8
12
|
* Exporta uma página para HTML (com cache)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportHtml.d.ts","sourceRoot":"","sources":["../../../src/engine/export/exportHtml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"exportHtml.d.ts","sourceRoot":"","sources":["../../../src/engine/export/exportHtml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACpG,OAAO,EAA6B,WAAW,EAAE,MAAM,uBAAuB,CAAC;AA4Y/E,MAAM,WAAW,uBAAuB;IACtC,mIAAmI;IACnI,cAAc,CAAC,EAAE,QAAQ,CAAC;IAC1B,qDAAqD;IACrD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,2BAA2B;IAC3B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAuFD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAE,OAAc,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,CA8HR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,GACrB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBtC"}
|