@brunoalz/smartgesti-site-editor 1.11.1 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editor/BlockPalette.d.ts +3 -1
- package/dist/editor/BlockPalette.d.ts.map +1 -1
- package/dist/editor/BlockPalette.js +111 -0
- package/dist/editor/BlockPalette.js.map +1 -0
- package/dist/editor/LandingPageEditor.d.ts.map +1 -1
- package/dist/editor/LandingPageEditor.js +99 -96
- package/dist/editor/LandingPageEditor.js.map +1 -1
- package/dist/editor/components/LeftPanel.d.ts +3 -0
- package/dist/editor/components/LeftPanel.d.ts.map +1 -1
- package/dist/editor/components/LeftPanel.js +65 -22
- package/dist/editor/components/LeftPanel.js.map +1 -1
- package/dist/engine/export/exporters/layout/ContainerExporter.js.map +1 -1
- package/dist/engine/export/exporters/layout/SectionExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/CategoryCardGridExporter.d.ts +3 -0
- package/dist/engine/export/exporters/sections/CategoryCardGridExporter.d.ts.map +1 -0
- package/dist/engine/export/exporters/sections/CategoryCardGridExporter.js +18 -0
- package/dist/engine/export/exporters/sections/CategoryCardGridExporter.js.map +1 -0
- package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
- package/dist/engine/export/exporters/sections/index.js +15 -13
- package/dist/engine/export/exporters/sections/index.js.map +1 -1
- package/dist/engine/export/styleResolver.d.ts.map +1 -1
- package/dist/engine/export/styleResolver.js.map +1 -1
- package/dist/engine/plugins/pluginRegistry.d.ts.map +1 -1
- package/dist/engine/plugins/pluginRegistry.js.map +1 -1
- package/dist/engine/plugins/types.d.ts.map +1 -1
- package/dist/engine/registry/blocks/composition/card.d.ts.map +1 -1
- package/dist/engine/registry/blocks/composition/card.js +2 -1
- package/dist/engine/registry/blocks/composition/card.js.map +1 -1
- package/dist/engine/registry/blocks/composition/section.d.ts.map +1 -1
- package/dist/engine/registry/blocks/composition/section.js +3 -2
- package/dist/engine/registry/blocks/composition/section.js.map +1 -1
- package/dist/engine/registry/blocks/content/avatar.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/avatar.js +1 -0
- package/dist/engine/registry/blocks/content/avatar.js.map +1 -1
- package/dist/engine/registry/blocks/content/badge.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/badge.js +3 -2
- package/dist/engine/registry/blocks/content/badge.js.map +1 -1
- package/dist/engine/registry/blocks/content/button.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/button.js +2 -1
- package/dist/engine/registry/blocks/content/button.js.map +1 -1
- package/dist/engine/registry/blocks/content/divider.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/divider.js +2 -1
- package/dist/engine/registry/blocks/content/divider.js.map +1 -1
- package/dist/engine/registry/blocks/content/heading.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/heading.js +2 -1
- package/dist/engine/registry/blocks/content/heading.js.map +1 -1
- package/dist/engine/registry/blocks/content/icon.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/icon.js +2 -1
- package/dist/engine/registry/blocks/content/icon.js.map +1 -1
- package/dist/engine/registry/blocks/content/image.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/image.js +2 -1
- package/dist/engine/registry/blocks/content/image.js.map +1 -1
- package/dist/engine/registry/blocks/content/link.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/link.js +1 -0
- package/dist/engine/registry/blocks/content/link.js.map +1 -1
- package/dist/engine/registry/blocks/content/socialLinks.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/socialLinks.js +5 -4
- package/dist/engine/registry/blocks/content/socialLinks.js.map +1 -1
- package/dist/engine/registry/blocks/content/text.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/text.js +2 -1
- package/dist/engine/registry/blocks/content/text.js.map +1 -1
- package/dist/engine/registry/blocks/content/video.d.ts.map +1 -1
- package/dist/engine/registry/blocks/content/video.js +2 -1
- package/dist/engine/registry/blocks/content/video.js.map +1 -1
- package/dist/engine/registry/blocks/forms/form.d.ts.map +1 -1
- package/dist/engine/registry/blocks/forms/form.js +7 -6
- package/dist/engine/registry/blocks/forms/form.js.map +1 -1
- package/dist/engine/registry/blocks/forms/input.d.ts.map +1 -1
- package/dist/engine/registry/blocks/forms/input.js +2 -1
- package/dist/engine/registry/blocks/forms/input.js.map +1 -1
- package/dist/engine/registry/blocks/forms/select.d.ts.map +1 -1
- package/dist/engine/registry/blocks/forms/select.js +3 -2
- package/dist/engine/registry/blocks/forms/select.js.map +1 -1
- package/dist/engine/registry/blocks/forms/textarea.d.ts.map +1 -1
- package/dist/engine/registry/blocks/forms/textarea.js +3 -2
- package/dist/engine/registry/blocks/forms/textarea.js.map +1 -1
- package/dist/engine/registry/blocks/layout/box.d.ts.map +1 -1
- package/dist/engine/registry/blocks/layout/box.js +7 -6
- package/dist/engine/registry/blocks/layout/box.js.map +1 -1
- package/dist/engine/registry/blocks/layout/container.d.ts.map +1 -1
- package/dist/engine/registry/blocks/layout/container.js +6 -5
- package/dist/engine/registry/blocks/layout/container.js.map +1 -1
- package/dist/engine/registry/blocks/layout/grid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/layout/grid.js +3 -2
- package/dist/engine/registry/blocks/layout/grid.js.map +1 -1
- package/dist/engine/registry/blocks/layout/spacer.d.ts.map +1 -1
- package/dist/engine/registry/blocks/layout/spacer.js +3 -2
- package/dist/engine/registry/blocks/layout/spacer.js.map +1 -1
- package/dist/engine/registry/blocks/layout/stack.d.ts.map +1 -1
- package/dist/engine/registry/blocks/layout/stack.js +3 -2
- package/dist/engine/registry/blocks/layout/stack.js.map +1 -1
- package/dist/engine/registry/blocks/sections/aboutSection.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/aboutSection.js +3 -2
- package/dist/engine/registry/blocks/sections/aboutSection.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCard.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCard.js +3 -2
- package/dist/engine/registry/blocks/sections/blogCard.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCardGrid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCardGrid.js +2 -1
- package/dist/engine/registry/blocks/sections/blogCardGrid.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +3 -2
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostCard.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostCard.js +3 -2
- package/dist/engine/registry/blocks/sections/blogPostCard.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostDetail.js +3 -2
- package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostGrid.js +3 -2
- package/dist/engine/registry/blocks/sections/blogPostGrid.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogRecentPosts.js +1 -0
- package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogSearchBar.js +3 -2
- package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogTagCloud.js +1 -0
- package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -1
- package/dist/engine/registry/blocks/sections/carousel.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/carousel.js +3 -2
- package/dist/engine/registry/blocks/sections/carousel.js.map +1 -1
- package/dist/engine/registry/blocks/sections/categoryCardGrid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/categoryCardGrid.js +3 -2
- package/dist/engine/registry/blocks/sections/categoryCardGrid.js.map +1 -1
- package/dist/engine/registry/blocks/sections/contactSection.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/contactSection.js +3 -2
- package/dist/engine/registry/blocks/sections/contactSection.js.map +1 -1
- package/dist/engine/registry/blocks/sections/countdown.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/countdown.js +6 -5
- package/dist/engine/registry/blocks/sections/countdown.js.map +1 -1
- package/dist/engine/registry/blocks/sections/courseCardGrid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/courseCardGrid.js +3 -2
- package/dist/engine/registry/blocks/sections/courseCardGrid.js.map +1 -1
- package/dist/engine/registry/blocks/sections/cta.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/cta.js +3 -2
- package/dist/engine/registry/blocks/sections/cta.js.map +1 -1
- package/dist/engine/registry/blocks/sections/faq.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/faq.js +6 -5
- package/dist/engine/registry/blocks/sections/faq.js.map +1 -1
- package/dist/engine/registry/blocks/sections/faqItem.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/faqItem.js +3 -1
- package/dist/engine/registry/blocks/sections/faqItem.js.map +1 -1
- package/dist/engine/registry/blocks/sections/feature.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/feature.js +7 -5
- package/dist/engine/registry/blocks/sections/feature.js.map +1 -1
- package/dist/engine/registry/blocks/sections/featureGrid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/featureGrid.js +3 -2
- package/dist/engine/registry/blocks/sections/featureGrid.js.map +1 -1
- package/dist/engine/registry/blocks/sections/footer.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/footer.js +3 -2
- package/dist/engine/registry/blocks/sections/footer.js.map +1 -1
- package/dist/engine/registry/blocks/sections/hero.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/hero.js +3 -2
- package/dist/engine/registry/blocks/sections/hero.js.map +1 -1
- package/dist/engine/registry/blocks/sections/imageGallery.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/imageGallery.js +1 -0
- package/dist/engine/registry/blocks/sections/imageGallery.js.map +1 -1
- package/dist/engine/registry/blocks/sections/logoCloud.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/logoCloud.js +3 -2
- package/dist/engine/registry/blocks/sections/logoCloud.js.map +1 -1
- package/dist/engine/registry/blocks/sections/navbar.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/navbar.js +3 -2
- package/dist/engine/registry/blocks/sections/navbar.js.map +1 -1
- package/dist/engine/registry/blocks/sections/pricing.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/pricing.js +3 -2
- package/dist/engine/registry/blocks/sections/pricing.js.map +1 -1
- package/dist/engine/registry/blocks/sections/pricingCard.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/pricingCard.js +4 -2
- package/dist/engine/registry/blocks/sections/pricingCard.js.map +1 -1
- package/dist/engine/registry/blocks/sections/productShowcase.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/productShowcase.js +3 -2
- package/dist/engine/registry/blocks/sections/productShowcase.js.map +1 -1
- package/dist/engine/registry/blocks/sections/statItem.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/statItem.js +3 -1
- package/dist/engine/registry/blocks/sections/statItem.js.map +1 -1
- package/dist/engine/registry/blocks/sections/stats.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/stats.js +3 -2
- package/dist/engine/registry/blocks/sections/stats.js.map +1 -1
- package/dist/engine/registry/blocks/sections/teamCard.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/teamCard.js +4 -2
- package/dist/engine/registry/blocks/sections/teamCard.js.map +1 -1
- package/dist/engine/registry/blocks/sections/teamGrid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/teamGrid.js +3 -2
- package/dist/engine/registry/blocks/sections/teamGrid.js.map +1 -1
- package/dist/engine/registry/blocks/sections/testimonial.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/testimonial.js +4 -2
- package/dist/engine/registry/blocks/sections/testimonial.js.map +1 -1
- package/dist/engine/registry/blocks/sections/testimonialGrid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/testimonialGrid.js +3 -2
- package/dist/engine/registry/blocks/sections/testimonialGrid.js.map +1 -1
- package/dist/engine/registry/types.d.ts +4 -0
- package/dist/engine/registry/types.d.ts.map +1 -1
- package/dist/engine/render/registry/renderRegistry.d.ts.map +1 -1
- package/dist/engine/render/registry/renderRegistry.js.map +1 -1
- package/dist/engine/render/renderNodeImpl.d.ts.map +1 -1
- package/dist/engine/render/renderNodeImpl.js +14 -503
- package/dist/engine/render/renderNodeImpl.js.map +1 -1
- package/dist/engine/render/renderers/sections/BlogCardGridRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/BlogCardGridRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/BlogCardGridRenderer.js +38 -0
- package/dist/engine/render/renderers/sections/BlogCardGridRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/BlogCardRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/BlogCardRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/BlogCardRenderer.js +90 -0
- package/dist/engine/render/renderers/sections/BlogCardRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/CarouselRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/CarouselRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/CarouselRenderer.js +64 -0
- package/dist/engine/render/renderers/sections/CarouselRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.js +54 -0
- package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/CountdownRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/CountdownRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/CountdownRenderer.js +91 -0
- package/dist/engine/render/renderers/sections/CountdownRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/CourseCardGridRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/CourseCardGridRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/CourseCardGridRenderer.js +76 -0
- package/dist/engine/render/renderers/sections/CourseCardGridRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/TeamCardRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/TeamCardRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/TeamCardRenderer.js +59 -0
- package/dist/engine/render/renderers/sections/TeamCardRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/TeamGridRenderer.d.ts +4 -0
- package/dist/engine/render/renderers/sections/TeamGridRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/TeamGridRenderer.js +38 -0
- package/dist/engine/render/renderers/sections/TeamGridRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/index.js +54 -38
- package/dist/engine/render/renderers/sections/index.js.map +1 -1
- package/dist/engine/shared/hoverEffects/buttonHover.d.ts.map +1 -1
- package/dist/engine/shared/hoverEffects/buttonHover.js.map +1 -1
- package/package.json +5 -2
|
@@ -2,7 +2,9 @@ import { BlockType } from '../engine';
|
|
|
2
2
|
interface BlockPaletteProps {
|
|
3
3
|
onAddBlock: (blockType: BlockType, parentBlockId?: string, position?: number) => void;
|
|
4
4
|
selectedParentBlockId?: string | null;
|
|
5
|
+
activePlugins?: string[];
|
|
6
|
+
existingBlockTypes?: string[];
|
|
5
7
|
}
|
|
6
|
-
export declare function BlockPalette({ onAddBlock, selectedParentBlockId, }: BlockPaletteProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export declare function BlockPalette({ onAddBlock, selectedParentBlockId, activePlugins, existingBlockTypes, }: BlockPaletteProps): import("react/jsx-runtime").JSX.Element;
|
|
7
9
|
export {};
|
|
8
10
|
//# sourceMappingURL=BlockPalette.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockPalette.d.ts","sourceRoot":"","sources":["../../src/editor/BlockPalette.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"BlockPalette.d.ts","sourceRoot":"","sources":["../../src/editor/BlockPalette.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,SAAS,EAAmB,MAAM,WAAW,CAAC;AAyBvD,UAAU,iBAAiB;IACzB,UAAU,EAAE,CACV,SAAS,EAAE,SAAS,EACpB,aAAa,CAAC,EAAE,MAAM,EACtB,QAAQ,CAAC,EAAE,MAAM,KACd,IAAI,CAAC;IACV,qBAAqB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC/B;AAED,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,qBAAqB,EACrB,aAAa,EACb,kBAAkB,GACnB,EAAE,iBAAiB,2CAiJnB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { jsxs as l, jsx as s } from "react/jsx-runtime";
|
|
2
|
+
import { useState as w, useMemo as i } from "react";
|
|
3
|
+
import { cn as d } from "../utils/cn.js";
|
|
4
|
+
import { getBlockIcon as B } from "../utils/blockIcons.js";
|
|
5
|
+
import { Search as C } from "lucide-react";
|
|
6
|
+
import { componentRegistry as E } from "../engine/registry/registry.js";
|
|
7
|
+
const y = [
|
|
8
|
+
"Banner e Navegação",
|
|
9
|
+
"Marketing",
|
|
10
|
+
"Prova Social",
|
|
11
|
+
"Galeria e Mídia",
|
|
12
|
+
"Equipe",
|
|
13
|
+
"Institucional",
|
|
14
|
+
"Blog e Notícias",
|
|
15
|
+
"Blog (Plugin)",
|
|
16
|
+
"Educação",
|
|
17
|
+
"Texto e Mídia",
|
|
18
|
+
"Estrutura",
|
|
19
|
+
"Formulários"
|
|
20
|
+
], O = /* @__PURE__ */ new Set(["navbar", "footer"]);
|
|
21
|
+
function q({
|
|
22
|
+
onAddBlock: p,
|
|
23
|
+
selectedParentBlockId: b,
|
|
24
|
+
activePlugins: u,
|
|
25
|
+
existingBlockTypes: x
|
|
26
|
+
}) {
|
|
27
|
+
const [n, h] = w(""), g = i(() => E.getAll().filter((e) => !(e.isChildBlock || e.pluginId && !u?.includes(e.pluginId))), [u]), c = i(() => {
|
|
28
|
+
const e = n.toLowerCase().trim(), t = {};
|
|
29
|
+
for (const r of g) {
|
|
30
|
+
if (e) {
|
|
31
|
+
const a = r.name.toLowerCase().includes(e), v = r.description.toLowerCase().includes(e), N = r.type.toLowerCase().includes(e);
|
|
32
|
+
if (!a && !v && !N) continue;
|
|
33
|
+
}
|
|
34
|
+
const o = r.userCategory || "Outros";
|
|
35
|
+
t[o] || (t[o] = []), t[o].push(r);
|
|
36
|
+
}
|
|
37
|
+
return t;
|
|
38
|
+
}, [g, n]), f = i(() => Object.keys(c).sort((t, r) => {
|
|
39
|
+
const o = y.indexOf(t), a = y.indexOf(r);
|
|
40
|
+
return o === -1 && a === -1 ? t.localeCompare(r) : o === -1 ? 1 : a === -1 ? -1 : o - a;
|
|
41
|
+
}), [c]), k = (e) => {
|
|
42
|
+
p(e, b || void 0);
|
|
43
|
+
}, m = Object.values(c).reduce(
|
|
44
|
+
(e, t) => e + t.length,
|
|
45
|
+
0
|
|
46
|
+
);
|
|
47
|
+
return /* @__PURE__ */ l("div", { className: "h-full flex flex-col overflow-hidden", children: [
|
|
48
|
+
/* @__PURE__ */ l("div", { className: "flex-shrink-0 p-3 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900", children: [
|
|
49
|
+
/* @__PURE__ */ s("h2", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100", children: "Adicionar Bloco" }),
|
|
50
|
+
/* @__PURE__ */ l("p", { className: "text-xs text-gray-500 dark:text-gray-400 mt-1", children: [
|
|
51
|
+
m,
|
|
52
|
+
" blocos disponíveis"
|
|
53
|
+
] }),
|
|
54
|
+
/* @__PURE__ */ l("div", { className: "relative mt-2", children: [
|
|
55
|
+
/* @__PURE__ */ s(C, { className: "absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400" }),
|
|
56
|
+
/* @__PURE__ */ s(
|
|
57
|
+
"input",
|
|
58
|
+
{
|
|
59
|
+
type: "text",
|
|
60
|
+
placeholder: "Buscar blocos...",
|
|
61
|
+
value: n,
|
|
62
|
+
onChange: (e) => h(e.target.value),
|
|
63
|
+
className: d(
|
|
64
|
+
"w-full pl-8 pr-3 py-1.5 text-xs rounded-lg border transition-colors",
|
|
65
|
+
"bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700",
|
|
66
|
+
"focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500",
|
|
67
|
+
"text-gray-700 dark:text-gray-300 placeholder-gray-400"
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
)
|
|
71
|
+
] })
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ l("div", { className: "flex-1 overflow-y-auto p-3 space-y-4", children: [
|
|
74
|
+
f.map((e) => {
|
|
75
|
+
const t = c[e];
|
|
76
|
+
return !t || t.length === 0 ? null : /* @__PURE__ */ l("div", { children: [
|
|
77
|
+
/* @__PURE__ */ s("h3", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide mb-2", children: e }),
|
|
78
|
+
/* @__PURE__ */ s("div", { className: "grid grid-cols-2 gap-2", children: t.map((r) => {
|
|
79
|
+
const a = O.has(r.type) && x?.includes(r.type);
|
|
80
|
+
return /* @__PURE__ */ l(
|
|
81
|
+
"button",
|
|
82
|
+
{
|
|
83
|
+
onClick: () => !a && k(r.type),
|
|
84
|
+
disabled: !!a,
|
|
85
|
+
className: d(
|
|
86
|
+
"flex flex-col items-center gap-2 p-3 rounded-lg border-2 transition-all",
|
|
87
|
+
a ? "opacity-40 cursor-not-allowed bg-gray-100 dark:bg-gray-800 border-gray-200 dark:border-gray-700" : d(
|
|
88
|
+
"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700 cursor-pointer",
|
|
89
|
+
"hover:border-blue-500 dark:hover:border-blue-500 hover:bg-blue-50 dark:hover:bg-blue-950/20",
|
|
90
|
+
"hover:scale-[1.02] active:scale-[0.98]"
|
|
91
|
+
)
|
|
92
|
+
),
|
|
93
|
+
title: a ? `${r.name} já existe na página` : r.description,
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ s("div", { className: "text-2xl", children: B(r.type) }),
|
|
96
|
+
/* @__PURE__ */ s("div", { className: "text-xs font-medium text-gray-700 dark:text-gray-300 text-center", children: r.name })
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
r.type
|
|
100
|
+
);
|
|
101
|
+
}) })
|
|
102
|
+
] }, e);
|
|
103
|
+
}),
|
|
104
|
+
m === 0 && /* @__PURE__ */ s("div", { className: "text-center text-gray-500 dark:text-gray-400 text-xs py-8", children: n ? "Nenhum bloco encontrado" : "Nenhum bloco disponível" })
|
|
105
|
+
] })
|
|
106
|
+
] });
|
|
107
|
+
}
|
|
108
|
+
export {
|
|
109
|
+
q as BlockPalette
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=BlockPalette.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlockPalette.js","sources":["../../src/editor/BlockPalette.tsx"],"sourcesContent":["/**\n * Block Palette\n * Paleta de blocos disponíveis para adicionar, agrupados por userCategory\n */\n\nimport { useMemo, useState } from \"react\";\nimport { BlockType, BlockDefinition } from \"../engine\";\nimport { componentRegistry } from \"../engine\";\nimport { cn } from \"../utils/cn\";\nimport { getBlockIcon } from \"../utils/blockIcons\";\nimport { Search } from \"lucide-react\";\n\n/** Ordem fixa das categorias na paleta */\nconst CATEGORY_ORDER = [\n \"Banner e Navegação\",\n \"Marketing\",\n \"Prova Social\",\n \"Galeria e Mídia\",\n \"Equipe\",\n \"Institucional\",\n \"Blog e Notícias\",\n \"Blog (Plugin)\",\n \"Educação\",\n \"Texto e Mídia\",\n \"Estrutura\",\n \"Formulários\",\n];\n\n/** Blocos que só podem existir uma vez por página */\nconst UNIQUE_BLOCK_TYPES = new Set<string>([\"navbar\", \"footer\"]);\n\ninterface BlockPaletteProps {\n onAddBlock: (\n blockType: BlockType,\n parentBlockId?: string,\n position?: number,\n ) => void;\n selectedParentBlockId?: string | null;\n activePlugins?: string[];\n existingBlockTypes?: string[];\n}\n\nexport function BlockPalette({\n onAddBlock,\n selectedParentBlockId,\n activePlugins,\n existingBlockTypes,\n}: BlockPaletteProps) {\n const [searchQuery, setSearchQuery] = useState(\"\");\n\n // Filtrar blocos disponíveis\n const availableBlocks = useMemo(() => {\n return componentRegistry.getAll().filter((def) => {\n if (def.isChildBlock) return false;\n if (def.pluginId && !activePlugins?.includes(def.pluginId)) return false;\n return true;\n });\n }, [activePlugins]);\n\n // Agrupar por userCategory e filtrar por busca\n const blocksByUserCategory = useMemo(() => {\n const query = searchQuery.toLowerCase().trim();\n const groups: Record<string, BlockDefinition[]> = {};\n\n for (const def of availableBlocks) {\n // Filtrar por busca\n if (query) {\n const matchesName = def.name.toLowerCase().includes(query);\n const matchesDesc = def.description.toLowerCase().includes(query);\n const matchesType = def.type.toLowerCase().includes(query);\n if (!matchesName && !matchesDesc && !matchesType) continue;\n }\n\n const cat = def.userCategory || \"Outros\";\n if (!groups[cat]) groups[cat] = [];\n groups[cat].push(def);\n }\n\n return groups;\n }, [availableBlocks, searchQuery]);\n\n // Categorias ordenadas\n const sortedCategories = useMemo(() => {\n const cats = Object.keys(blocksByUserCategory);\n return cats.sort((a, b) => {\n const idxA = CATEGORY_ORDER.indexOf(a);\n const idxB = CATEGORY_ORDER.indexOf(b);\n if (idxA === -1 && idxB === -1) return a.localeCompare(b);\n if (idxA === -1) return 1;\n if (idxB === -1) return -1;\n return idxA - idxB;\n });\n }, [blocksByUserCategory]);\n\n const handleAddBlock = (blockType: BlockType) => {\n onAddBlock(blockType, selectedParentBlockId || undefined);\n };\n\n const totalAvailable = Object.values(blocksByUserCategory).reduce(\n (sum, arr) => sum + arr.length,\n 0,\n );\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\">\n Adicionar Bloco\n </h2>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n {totalAvailable} blocos disponíveis\n </p>\n\n {/* Campo de busca */}\n <div className=\"relative mt-2\">\n <Search className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-gray-400\" />\n <input\n type=\"text\"\n placeholder=\"Buscar blocos...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className={cn(\n \"w-full pl-8 pr-3 py-1.5 text-xs rounded-lg border transition-colors\",\n \"bg-gray-50 dark:bg-gray-800 border-gray-200 dark:border-gray-700\",\n \"focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\",\n \"text-gray-700 dark:text-gray-300 placeholder-gray-400\",\n )}\n />\n </div>\n </div>\n\n {/* Lista de blocos por userCategory */}\n <div className=\"flex-1 overflow-y-auto p-3 space-y-4\">\n {sortedCategories.map((category) => {\n const blocks = blocksByUserCategory[category];\n if (!blocks || blocks.length === 0) return null;\n\n return (\n <div key={category}>\n <h3 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide mb-2\">\n {category}\n </h3>\n <div className=\"grid grid-cols-2 gap-2\">\n {blocks.map((def) => {\n const isUnique = UNIQUE_BLOCK_TYPES.has(def.type);\n const alreadyExists =\n isUnique && existingBlockTypes?.includes(def.type);\n\n return (\n <button\n key={def.type}\n onClick={() => !alreadyExists && handleAddBlock(def.type)}\n disabled={!!alreadyExists}\n className={cn(\n \"flex flex-col items-center gap-2 p-3 rounded-lg border-2 transition-all\",\n alreadyExists\n ? \"opacity-40 cursor-not-allowed bg-gray-100 dark:bg-gray-800 border-gray-200 dark:border-gray-700\"\n : cn(\n \"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700 cursor-pointer\",\n \"hover:border-blue-500 dark:hover:border-blue-500 hover:bg-blue-50 dark:hover:bg-blue-950/20\",\n \"hover:scale-[1.02] active:scale-[0.98]\",\n ),\n )}\n title={\n alreadyExists\n ? `${def.name} já existe na página`\n : def.description\n }\n >\n <div className=\"text-2xl\">{getBlockIcon(def.type)}</div>\n <div className=\"text-xs font-medium text-gray-700 dark:text-gray-300 text-center\">\n {def.name}\n </div>\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n {totalAvailable === 0 && (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-8\">\n {searchQuery\n ? \"Nenhum bloco encontrado\"\n : \"Nenhum bloco disponível\"}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["CATEGORY_ORDER","UNIQUE_BLOCK_TYPES","BlockPalette","onAddBlock","selectedParentBlockId","activePlugins","existingBlockTypes","searchQuery","setSearchQuery","useState","availableBlocks","useMemo","componentRegistry","def","blocksByUserCategory","query","groups","matchesName","matchesDesc","matchesType","cat","sortedCategories","a","b","idxA","idxB","handleAddBlock","blockType","totalAvailable","sum","arr","jsxs","jsx","Search","cn","category","blocks","alreadyExists","getBlockIcon"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LandingPageEditor.d.ts","sourceRoot":"","sources":["../../src/editor/LandingPageEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"LandingPageEditor.d.ts","sourceRoot":"","sources":["../../src/editor/LandingPageEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,EAAE,YAAY,EAAgB,MAAM,WAAW,CAAC;AAEvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,sBAAsB,2CAgWxB"}
|
|
@@ -1,77 +1,78 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as C, useCallback as y, useEffect as
|
|
3
|
-
import { TemplatePicker as
|
|
4
|
-
import { useEditorState as
|
|
1
|
+
import { jsx as u, jsxs as F } from "react/jsx-runtime";
|
|
2
|
+
import { useState as C, useCallback as y, useEffect as W } from "react";
|
|
3
|
+
import { TemplatePicker as de } from "./TemplatePicker.js";
|
|
4
|
+
import { useEditorState as he } from "../hooks/useEditorState.js";
|
|
5
5
|
import { useKeyboardShortcuts as ue } from "../hooks/useKeyboardShortcuts.js";
|
|
6
|
-
import { getTemplate as
|
|
7
|
-
import { findPaletteByName as
|
|
8
|
-
import { sharedTemplateToEngineDocument as
|
|
9
|
-
import { findBlockInStructure as
|
|
10
|
-
import { derivePaletteColors as
|
|
6
|
+
import { getTemplate as K, templateDefaultPalette as M } from "../shared/templates/index.js";
|
|
7
|
+
import { findPaletteByName as me } from "./PaletteSelector.js";
|
|
8
|
+
import { sharedTemplateToEngineDocument as V } from "../utils/sharedTemplateToEngine.js";
|
|
9
|
+
import { findBlockInStructure as fe } from "../utils/blockUtils.js";
|
|
10
|
+
import { derivePaletteColors as ge } from "../utils/colorUtils.js";
|
|
11
11
|
import { logger as w } from "../utils/logger.js";
|
|
12
|
-
import { processBlockDataURLs as
|
|
13
|
-
import { Toolbar as
|
|
14
|
-
import { LeftPanel as
|
|
15
|
-
import { CenterPanel as
|
|
16
|
-
import { RightPanel as
|
|
17
|
-
import { PatchBuilder as
|
|
18
|
-
function
|
|
19
|
-
initialData:
|
|
12
|
+
import { processBlockDataURLs as ve } from "../utils/dataURLUtils.js";
|
|
13
|
+
import { Toolbar as ke } from "./components/Toolbar.js";
|
|
14
|
+
import { LeftPanel as Pe } from "./components/LeftPanel.js";
|
|
15
|
+
import { CenterPanel as Ce } from "./components/CenterPanel.js";
|
|
16
|
+
import { RightPanel as ye } from "./components/RightPanel.js";
|
|
17
|
+
import { PatchBuilder as be } from "../engine/patch/PatchBuilder.js";
|
|
18
|
+
function je({
|
|
19
|
+
initialData: q,
|
|
20
20
|
defaultTemplateId: b,
|
|
21
21
|
onSave: T,
|
|
22
22
|
onPublish: S,
|
|
23
|
-
uploadConfig:
|
|
23
|
+
uploadConfig: B
|
|
24
24
|
}) {
|
|
25
25
|
const {
|
|
26
26
|
document: t,
|
|
27
27
|
currentPageId: D,
|
|
28
28
|
currentPage: m,
|
|
29
29
|
selectedBlockId: g,
|
|
30
|
-
selectedBlock:
|
|
31
|
-
history:
|
|
30
|
+
selectedBlock: z,
|
|
31
|
+
history: J,
|
|
32
32
|
setCurrentPageId: v,
|
|
33
|
-
addPage:
|
|
34
|
-
removePage:
|
|
35
|
-
canRemovePage:
|
|
33
|
+
addPage: Q,
|
|
34
|
+
removePage: X,
|
|
35
|
+
canRemovePage: Y,
|
|
36
36
|
setSelectedBlockId: d,
|
|
37
37
|
handleUndo: E,
|
|
38
38
|
handleRedo: U,
|
|
39
|
+
handleAddBlock: Z,
|
|
39
40
|
handleDeleteBlock: R,
|
|
40
|
-
handleUpdateBlock:
|
|
41
|
+
handleUpdateBlock: _,
|
|
41
42
|
applyChange: k,
|
|
42
|
-
resetToTemplate:
|
|
43
|
+
resetToTemplate: ee,
|
|
43
44
|
isPaletteSelected: I,
|
|
44
|
-
loadDocument:
|
|
45
|
+
loadDocument: $,
|
|
45
46
|
selectedPalette: L,
|
|
46
47
|
setSelectedPalette: f,
|
|
47
|
-
activePlugins:
|
|
48
|
-
activatePlugin:
|
|
49
|
-
deactivatePlugin:
|
|
50
|
-
} =
|
|
48
|
+
activePlugins: N,
|
|
49
|
+
activatePlugin: oe,
|
|
50
|
+
deactivatePlugin: te
|
|
51
|
+
} = he({ initialData: q }), [re, P] = C(!1), [x, ae] = C(
|
|
51
52
|
null
|
|
52
|
-
), [
|
|
53
|
+
), [A, G] = C(null), [H, le] = C(!1), O = y(
|
|
53
54
|
(o) => {
|
|
54
|
-
const e =
|
|
55
|
+
const e = K(o);
|
|
55
56
|
if (!e) return;
|
|
56
|
-
const r =
|
|
57
|
-
|
|
58
|
-
const a =
|
|
57
|
+
const r = V(e);
|
|
58
|
+
$(r), ae(o);
|
|
59
|
+
const a = M[o];
|
|
59
60
|
a && f(a);
|
|
60
61
|
},
|
|
61
|
-
[
|
|
62
|
+
[$, f]
|
|
62
63
|
);
|
|
63
|
-
|
|
64
|
-
!t && b &&
|
|
64
|
+
W(() => {
|
|
65
|
+
!t && b && O(b);
|
|
65
66
|
}, [b]);
|
|
66
|
-
const
|
|
67
|
-
if (!(!t || !T ||
|
|
67
|
+
const j = async () => {
|
|
68
|
+
if (!(!t || !T || !B)) {
|
|
68
69
|
P(!0);
|
|
69
70
|
try {
|
|
70
71
|
const o = await Promise.all(
|
|
71
72
|
(t.pages || []).map(async (r) => ({
|
|
72
73
|
...r,
|
|
73
74
|
structure: await Promise.all(
|
|
74
|
-
(r.structure || []).map((a) =>
|
|
75
|
+
(r.structure || []).map((a) => ve(a, B))
|
|
75
76
|
)
|
|
76
77
|
}))
|
|
77
78
|
), e = {
|
|
@@ -85,7 +86,7 @@ function Oe({
|
|
|
85
86
|
P(!1);
|
|
86
87
|
}
|
|
87
88
|
}
|
|
88
|
-
},
|
|
89
|
+
}, ne = async () => {
|
|
89
90
|
if (!(!t || !S)) {
|
|
90
91
|
P(!0);
|
|
91
92
|
try {
|
|
@@ -96,13 +97,13 @@ function Oe({
|
|
|
96
97
|
P(!1);
|
|
97
98
|
}
|
|
98
99
|
}
|
|
99
|
-
},
|
|
100
|
+
}, se = y(
|
|
100
101
|
(o, e) => {
|
|
101
102
|
if (!t || !m) return;
|
|
102
103
|
const r = m.id;
|
|
103
104
|
if (r)
|
|
104
105
|
try {
|
|
105
|
-
const a =
|
|
106
|
+
const a = be.updateBlockProps(
|
|
106
107
|
t,
|
|
107
108
|
r,
|
|
108
109
|
o,
|
|
@@ -114,9 +115,9 @@ function Oe({
|
|
|
114
115
|
}
|
|
115
116
|
},
|
|
116
117
|
[t, m, k]
|
|
117
|
-
),
|
|
118
|
+
), ce = y((o) => {
|
|
118
119
|
if (!t) return;
|
|
119
|
-
const e =
|
|
120
|
+
const e = ge(o), r = [];
|
|
120
121
|
for (const [n, i] of Object.entries(e.themeColors))
|
|
121
122
|
r.push({ op: "replace", path: `/theme/colors/${n}`, value: i });
|
|
122
123
|
const a = /* @__PURE__ */ new Set([
|
|
@@ -124,14 +125,14 @@ function Oe({
|
|
|
124
125
|
"hero-parallax",
|
|
125
126
|
"hero-overlay",
|
|
126
127
|
"hero-carousel"
|
|
127
|
-
]),
|
|
128
|
+
]), h = /* @__PURE__ */ new Set([
|
|
128
129
|
"blogCategoryFilter",
|
|
129
130
|
"blogRecentPosts",
|
|
130
131
|
"blogTagCloud"
|
|
131
132
|
]), c = (n, i) => {
|
|
132
133
|
for (let s = 0; s < n.length; s++) {
|
|
133
134
|
const p = n[s], l = `${i}/${s}/props`;
|
|
134
|
-
|
|
135
|
+
h.has(p.type) && r.push(
|
|
135
136
|
{ op: "replace", path: `${l}/linkColor`, value: e.themeColors.text },
|
|
136
137
|
{ op: "replace", path: `${l}/linkHoverColor`, value: e.themeColors.primary }
|
|
137
138
|
), Array.isArray(p.props?.children) && c(p.props.children, `${l}/children`);
|
|
@@ -143,8 +144,8 @@ function Oe({
|
|
|
143
144
|
for (let s = 0; s < i.structure.length; s++) {
|
|
144
145
|
const p = i.structure[s], l = `/pages/${n}/structure/${s}/props`;
|
|
145
146
|
if (p.type === "hero") {
|
|
146
|
-
const
|
|
147
|
-
a.has(
|
|
147
|
+
const pe = p.props?.variation || "";
|
|
148
|
+
a.has(pe) && r.push(
|
|
148
149
|
{ op: "replace", path: `${l}/background`, value: `linear-gradient(135deg, ${e.heroGradientStart} 0%, ${e.heroGradientEnd} 100%)` },
|
|
149
150
|
{ op: "replace", path: `${l}/titleColor`, value: e.heroTitleColor },
|
|
150
151
|
{ op: "replace", path: `${l}/subtitleColor`, value: e.heroSubtitleColor },
|
|
@@ -164,63 +165,63 @@ function Oe({
|
|
|
164
165
|
}
|
|
165
166
|
}
|
|
166
167
|
k(r, "Update color palette"), f(o.name ?? null);
|
|
167
|
-
}, [t, k, f]),
|
|
168
|
+
}, [t, k, f]), ie = y((o, e) => {
|
|
168
169
|
d(o), G(e || null);
|
|
169
170
|
}, [d]);
|
|
170
171
|
return ue({
|
|
171
172
|
onUndo: E,
|
|
172
173
|
onRedo: U,
|
|
173
|
-
onSave:
|
|
174
|
+
onSave: j,
|
|
174
175
|
onDelete: () => {
|
|
175
176
|
g && R(g);
|
|
176
177
|
},
|
|
177
178
|
onDeselect: () => d(null)
|
|
178
|
-
}),
|
|
179
|
+
}), W(() => {
|
|
179
180
|
const o = (e) => {
|
|
180
181
|
if (e.data?.type !== "editor-navigate" || !e.data.href) return;
|
|
181
182
|
const r = String(e.data.href);
|
|
182
183
|
if (!t) return;
|
|
183
184
|
const a = r.match(/^(?:\/site)?\/p\/([^#?]+)/);
|
|
184
185
|
if (a) {
|
|
185
|
-
const
|
|
186
|
+
const h = a[1], c = t.pages.find((n) => n.slug === h);
|
|
186
187
|
c && v(c.id);
|
|
187
188
|
return;
|
|
188
189
|
}
|
|
189
190
|
if (r.startsWith("#")) {
|
|
190
|
-
const
|
|
191
|
+
const h = r.slice(1);
|
|
191
192
|
for (const c of t.pages)
|
|
192
|
-
if (
|
|
193
|
-
v(c.id), d(
|
|
193
|
+
if (fe(c.structure || [], h)) {
|
|
194
|
+
v(c.id), d(h);
|
|
194
195
|
break;
|
|
195
196
|
}
|
|
196
197
|
}
|
|
197
198
|
};
|
|
198
199
|
return window.addEventListener("message", o), () => window.removeEventListener("message", o);
|
|
199
|
-
}, [t, v, d]), t ? /* @__PURE__ */
|
|
200
|
-
/* @__PURE__ */
|
|
201
|
-
|
|
200
|
+
}, [t, v, d]), t ? /* @__PURE__ */ F("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: [
|
|
201
|
+
/* @__PURE__ */ u(
|
|
202
|
+
ke,
|
|
202
203
|
{
|
|
203
|
-
history:
|
|
204
|
-
isSaving:
|
|
204
|
+
history: J,
|
|
205
|
+
isSaving: re,
|
|
205
206
|
onUndo: E,
|
|
206
207
|
onRedo: U,
|
|
207
|
-
onSave:
|
|
208
|
-
onPublish: S ?
|
|
208
|
+
onSave: j,
|
|
209
|
+
onPublish: S ? ne : void 0,
|
|
209
210
|
onReset: x ? () => {
|
|
210
|
-
const o =
|
|
211
|
+
const o = K(x);
|
|
211
212
|
if (o) {
|
|
212
|
-
|
|
213
|
-
const e =
|
|
213
|
+
$(V(o));
|
|
214
|
+
const e = M[x];
|
|
214
215
|
e && f(e);
|
|
215
216
|
}
|
|
216
|
-
} :
|
|
217
|
-
showSelectionOverlay:
|
|
218
|
-
onToggleSelectionOverlay: () =>
|
|
217
|
+
} : ee,
|
|
218
|
+
showSelectionOverlay: H,
|
|
219
|
+
onToggleSelectionOverlay: () => le((o) => !o)
|
|
219
220
|
}
|
|
220
221
|
),
|
|
221
|
-
/* @__PURE__ */
|
|
222
|
-
/* @__PURE__ */
|
|
223
|
-
|
|
222
|
+
/* @__PURE__ */ F("div", { className: "flex-1 flex overflow-hidden min-h-0 max-h-full", children: [
|
|
223
|
+
/* @__PURE__ */ u(
|
|
224
|
+
Pe,
|
|
224
225
|
{
|
|
225
226
|
currentPage: m,
|
|
226
227
|
selectedBlockId: g,
|
|
@@ -228,52 +229,54 @@ function Oe({
|
|
|
228
229
|
onSelectBlock: (o) => {
|
|
229
230
|
d(o), G(null);
|
|
230
231
|
},
|
|
231
|
-
onDeleteBlock: R
|
|
232
|
+
onDeleteBlock: R,
|
|
233
|
+
onAddBlock: Z,
|
|
234
|
+
activePlugins: N
|
|
232
235
|
}
|
|
233
236
|
),
|
|
234
|
-
/* @__PURE__ */
|
|
235
|
-
|
|
237
|
+
/* @__PURE__ */ u(
|
|
238
|
+
Ce,
|
|
236
239
|
{
|
|
237
240
|
document: t,
|
|
238
241
|
currentPageId: D,
|
|
239
242
|
currentPage: m,
|
|
240
243
|
selectedBlockId: g,
|
|
241
|
-
onBlockClick:
|
|
244
|
+
onBlockClick: ie,
|
|
242
245
|
onSelectPage: v,
|
|
243
246
|
onAddPage: () => {
|
|
244
247
|
const o = prompt("Nome da página:");
|
|
245
248
|
if (!o) return;
|
|
246
249
|
const e = o.toLowerCase().replace(/\s+/g, "-");
|
|
247
|
-
|
|
250
|
+
Q(e, o, e);
|
|
248
251
|
},
|
|
249
|
-
onRemovePage:
|
|
250
|
-
canRemovePage:
|
|
251
|
-
onUpdateBlock:
|
|
252
|
-
activePlugins:
|
|
253
|
-
onActivatePlugin:
|
|
254
|
-
onDeactivatePlugin:
|
|
255
|
-
showSelectionOverlay:
|
|
256
|
-
focusedGroup:
|
|
252
|
+
onRemovePage: X,
|
|
253
|
+
canRemovePage: Y,
|
|
254
|
+
onUpdateBlock: se,
|
|
255
|
+
activePlugins: N,
|
|
256
|
+
onActivatePlugin: oe,
|
|
257
|
+
onDeactivatePlugin: te,
|
|
258
|
+
showSelectionOverlay: H,
|
|
259
|
+
focusedGroup: A
|
|
257
260
|
}
|
|
258
261
|
),
|
|
259
|
-
/* @__PURE__ */
|
|
260
|
-
|
|
262
|
+
/* @__PURE__ */ u(
|
|
263
|
+
ye,
|
|
261
264
|
{
|
|
262
265
|
isPaletteSelected: I,
|
|
263
|
-
selectedBlock:
|
|
264
|
-
selectedPalette: L ?
|
|
265
|
-
onPaletteChange:
|
|
266
|
-
onUpdateBlock:
|
|
267
|
-
uploadConfig:
|
|
266
|
+
selectedBlock: z,
|
|
267
|
+
selectedPalette: L ? me(L) : void 0,
|
|
268
|
+
onPaletteChange: ce,
|
|
269
|
+
onUpdateBlock: _,
|
|
270
|
+
uploadConfig: B,
|
|
268
271
|
document: t,
|
|
269
272
|
currentPageId: D,
|
|
270
|
-
focusedGroup:
|
|
273
|
+
focusedGroup: A
|
|
271
274
|
}
|
|
272
275
|
)
|
|
273
276
|
] })
|
|
274
|
-
] }) : /* @__PURE__ */
|
|
277
|
+
] }) : /* @__PURE__ */ u("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: /* @__PURE__ */ u(de, { onSelectTemplate: O }) });
|
|
275
278
|
}
|
|
276
279
|
export {
|
|
277
|
-
|
|
280
|
+
je as LandingPageEditor
|
|
278
281
|
};
|
|
279
282
|
//# sourceMappingURL=LandingPageEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LandingPageEditor.js","sources":["../../src/editor/LandingPageEditor.tsx"],"sourcesContent":["/**\n * Landing Page Editor\n * Editor de landing pages usando block engine\n */\n\nimport { useState, useCallback, useEffect, lazy, Suspense } from \"react\";\nimport { TemplatePicker } from \"./TemplatePicker\";\nimport { Toolbar, LeftPanel, CenterPanel, RightPanel } from \"./components\";\nimport { useEditorState } from \"../hooks/useEditorState\";\nimport { useKeyboardShortcuts } from \"../hooks/useKeyboardShortcuts\";\nimport { LoadingSpinner } from \"./components/LoadingSpinner\";\nimport { SiteDocument, PatchBuilder, Block } from \"../engine\";\nimport { getTemplate, templateDefaultPalette } from \"../shared/templates\";\nimport type { TemplateId } from \"../shared/templates\";\nimport { findPaletteByName } from \"./PaletteSelector\";\nimport { sharedTemplateToEngineDocument } from \"../utils/sharedTemplateToEngine\";\nimport { findBlockInStructure } from \"../utils/blockUtils\";\nimport { derivePaletteColors } from \"../utils/colorUtils\";\nimport { logger } from \"../utils/logger\";\nimport { processBlockDataURLs } from \"../utils/dataURLUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UploadConfig {\n tenantId?: string;\n schoolId?: string;\n siteId?: string | null;\n authToken?: string;\n}\n\nexport interface LandingPageEditorProps {\n initialData?: SiteDocument;\n /** ID do template a carregar quando não houver initialData (ex.: \"escola-edvi\") */\n defaultTemplateId?: TemplateId;\n onSave?: (data: SiteDocument) => Promise<void>;\n onPublish?: (data: SiteDocument) => Promise<void>;\n /** Configuração para upload seguro de imagens/vídeos */\n uploadConfig?: UploadConfig;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LandingPageEditor({\n initialData,\n defaultTemplateId,\n onSave,\n onPublish,\n uploadConfig,\n}: LandingPageEditorProps) {\n // Hook de estado do editor (edição por páginas; sem navegação)\n const {\n document,\n currentPageId,\n currentPage,\n selectedBlockId,\n selectedBlock,\n history,\n setCurrentPageId,\n addPage,\n removePage,\n canRemovePage,\n setSelectedBlockId,\n handleUndo,\n handleRedo,\n handleDeleteBlock,\n handleUpdateBlock,\n applyChange,\n resetToTemplate,\n isPaletteSelected,\n loadDocument,\n selectedPalette,\n setSelectedPalette,\n activePlugins,\n activatePlugin,\n deactivatePlugin,\n } = useEditorState({ initialData });\n\n // Estado local da UI\n const [isSaving, setIsSaving] = useState(false);\n const [currentTemplateId, setCurrentTemplateId] = useState<TemplateId | null>(\n null,\n );\n const [focusedGroup, setFocusedGroup] = useState<string | null>(null);\n const [showSelectionOverlay, setShowSelectionOverlay] = useState(false);\n\n // Carregar template escolhido (converter shared → engine e carregar no editor)\n const handleSelectTemplate = useCallback(\n (templateId: TemplateId) => {\n const sharedDoc = getTemplate(templateId);\n if (!sharedDoc) return;\n const engineDoc = sharedTemplateToEngineDocument(sharedDoc);\n loadDocument(engineDoc);\n setCurrentTemplateId(templateId);\n\n // Auto-selecionar paleta correspondente ao template\n const paletteName = templateDefaultPalette[templateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n },\n [loadDocument, setSelectedPalette],\n );\n\n // Ao montar sem documento: carregar defaultTemplateId se informado\n useEffect(() => {\n if (!document && defaultTemplateId) {\n handleSelectTemplate(defaultTemplateId);\n }\n }, [defaultTemplateId]); // eslint-disable-line react-hooks/exhaustive-deps -- carregar só uma vez quando defaultTemplateId existe\n\n // Handlers de save/publish\n const handleSave = async () => {\n if (!document || !onSave || !uploadConfig) return;\n setIsSaving(true);\n try {\n // Processar o documento para fazer upload de todos os Data URLs\n const processedPages = await Promise.all(\n (document.pages || []).map(async (page) => ({\n ...page,\n structure: await Promise.all(\n (page.structure || []).map((block) => processBlockDataURLs(block, uploadConfig))\n ),\n }))\n );\n\n const processedDocument = {\n ...document,\n pages: processedPages,\n };\n\n await onSave(processedDocument);\n } catch (error) {\n logger.error(\"Error saving:\", error);\n throw error;\n } finally {\n setIsSaving(false);\n }\n };\n\n const handlePublish = async () => {\n if (!document || !onPublish) return;\n setIsSaving(true);\n try {\n await onPublish(document);\n } catch (error) {\n logger.error(\"Error publishing:\", error);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Handler para atualizar um bloco específico\n const handleUpdateBlockById = useCallback(\n (blockId: string, updates: Record<string, any>) => {\n if (!document || !currentPage) return;\n const pageId = (currentPage as any).id;\n if (!pageId) return;\n\n try {\n const patch = PatchBuilder.updateBlockProps(\n document,\n pageId,\n blockId,\n updates\n );\n if (patch?.length) {\n applyChange(patch, \"Update block properties\");\n }\n } catch (error) {\n logger.error(\"Error updating block:\", error);\n }\n },\n [document, currentPage, applyChange]\n );\n\n // Handler para atualizar paleta de cores\n // Usa derivePaletteColors() para derivar todas as cores e patcha Hero/Navbar/Footer alem do theme\n const handlePaletteChange = useCallback((palette: any) => {\n if (!document) return;\n const derived = derivePaletteColors(palette);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allPatches: Array<{ op: \"replace\"; path: string; value: any }> = [];\n\n // 1. Theme color updates\n for (const [key, value] of Object.entries(derived.themeColors)) {\n allPatches.push({ op: \"replace\", path: `/theme/colors/${key}`, value });\n }\n\n // 2. Block-level patches (todas as paginas)\n // Hero variations that use dark gradient backgrounds\n const darkGradientVariations = new Set([\n \"hero-gradient\", \"hero-parallax\", \"hero-overlay\", \"hero-carousel\",\n ]);\n // Blog widget types que recebem cores da paleta\n const blogWidgetTypes = new Set([\n \"blogCategoryFilter\", \"blogRecentPosts\", \"blogTagCloud\",\n ]);\n\n // Recursivamente patcha blog widgets em children de grid/stack\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const patchNestedBlocks = (blocks: any[], basePath: string) => {\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n const bPath = `${basePath}/${i}/props`;\n if (blogWidgetTypes.has(b.type)) {\n allPatches.push(\n { op: \"replace\", path: `${bPath}/linkColor`, value: derived.themeColors.text },\n { op: \"replace\", path: `${bPath}/linkHoverColor`, value: derived.themeColors.primary },\n );\n }\n if (Array.isArray(b.props?.children)) {\n patchNestedBlocks(b.props.children, `${bPath}/children`);\n }\n }\n };\n\n for (let pageIdx = 0; pageIdx < document.pages.length; pageIdx++) {\n const page = document.pages[pageIdx];\n if (!page?.structure) continue;\n for (let blockIdx = 0; blockIdx < page.structure.length; blockIdx++) {\n const block = page.structure[blockIdx];\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n\n if (block.type === \"hero\") {\n const variation = (block.props as any)?.variation || \"\";\n if (darkGradientVariations.has(variation)) {\n allPatches.push(\n { op: \"replace\", path: `${base}/background`, value: `linear-gradient(135deg, ${derived.heroGradientStart} 0%, ${derived.heroGradientEnd} 100%)` },\n { op: \"replace\", path: `${base}/titleColor`, value: derived.heroTitleColor },\n { op: \"replace\", path: `${base}/subtitleColor`, value: derived.heroSubtitleColor },\n { op: \"replace\", path: `${base}/descriptionColor`, value: derived.heroDescColor },\n );\n }\n } else if (block.type === \"navbar\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/bg`, value: derived.navbarBg },\n { op: \"replace\", path: `${base}/linkColor`, value: derived.themeColors.menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: derived.themeColors.primaryText },\n );\n } else if (block.type === \"footer\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.footerLinkHover },\n );\n }\n }\n // Patchar blog widgets aninhados (dentro de grid/stack children)\n patchNestedBlocks(page.structure, `/pages/${pageIdx}/structure`);\n }\n\n applyChange(allPatches, \"Update color palette\");\n setSelectedPalette(palette.name ?? null);\n }, [document, applyChange, setSelectedPalette]);\n\n // Handler para clique no preview (com grupo opcional para scroll-to-group)\n const handleBlockClick = useCallback((blockId: string, group?: string) => {\n setSelectedBlockId(blockId);\n setFocusedGroup(group || null);\n }, [setSelectedBlockId]);\n\n // Limpar focusedGroup quando o bloco selecionado muda (via seleção no painel esquerdo, etc.)\n // Nota: handleBlockClick já define o focusedGroup corretamente quando vem do preview\n\n // No editor: cliques em links no preview não navegam; trocam a página em edição\n // Keyboard shortcuts\n useKeyboardShortcuts({\n onUndo: handleUndo,\n onRedo: handleRedo,\n onSave: handleSave,\n onDelete: () => {\n if (selectedBlockId) {\n handleDeleteBlock(selectedBlockId);\n }\n },\n onDeselect: () => setSelectedBlockId(null),\n });\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== \"editor-navigate\" || !event.data.href) return;\n const href = String(event.data.href);\n if (!document) return;\n // Links internos: /site/p/:slug ou /p/:slug\n const match = href.match(/^(?:\\/site)?\\/p\\/([^#?]+)/);\n if (match) {\n const slug = match[1];\n const page = document.pages.find((p) => p.slug === slug);\n if (page) setCurrentPageId(page.id);\n return;\n }\n // Âncora #id: selecionar bloco com esse id e trocar para a página que o contém\n if (href.startsWith(\"#\")) {\n const id = href.slice(1);\n for (const p of document.pages) {\n if (findBlockInStructure(p.structure || [], id)) {\n setCurrentPageId(p.id);\n setSelectedBlockId(id);\n break;\n }\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [document, setCurrentPageId, setSelectedBlockId]);\n\n // Sem documento: mostrar seletor de templates\n if (!document) {\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n <TemplatePicker onSelectTemplate={handleSelectTemplate} />\n </div>\n );\n }\n\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n {/* Toolbar */}\n <Toolbar\n history={history}\n isSaving={isSaving}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onSave={handleSave}\n onPublish={onPublish ? handlePublish : undefined}\n onReset={\n currentTemplateId\n ? () => {\n // Recarregar o mesmo template\n const sharedDoc = getTemplate(currentTemplateId);\n if (sharedDoc) {\n loadDocument(sharedTemplateToEngineDocument(sharedDoc));\n const paletteName = templateDefaultPalette[currentTemplateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n }\n }\n : resetToTemplate\n }\n showSelectionOverlay={showSelectionOverlay}\n onToggleSelectionOverlay={() => setShowSelectionOverlay(prev => !prev)}\n />\n\n {/* Main Content - 3 Columns */}\n <div className=\"flex-1 flex overflow-hidden min-h-0 max-h-full\">\n {/* Left: Block Selector + Paletas */}\n <LeftPanel\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n isPaletteSelected={isPaletteSelected}\n onSelectBlock={(id) => { setSelectedBlockId(id); setFocusedGroup(null); }}\n onDeleteBlock={handleDeleteBlock}\n />\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","blogWidgetTypes","patchNestedBlocks","blocks","basePath","i","b","bPath","pageIdx","blockIdx","base","variation","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","findPaletteByName","TemplatePicker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LandingPageEditor.js","sources":["../../src/editor/LandingPageEditor.tsx"],"sourcesContent":["/**\n * Landing Page Editor\n * Editor de landing pages usando block engine\n */\n\nimport { useState, useCallback, useEffect } from \"react\";\nimport { TemplatePicker } from \"./TemplatePicker\";\nimport { Toolbar, LeftPanel, CenterPanel, RightPanel } from \"./components\";\nimport { useEditorState } from \"../hooks/useEditorState\";\nimport { useKeyboardShortcuts } from \"../hooks/useKeyboardShortcuts\";\nimport { SiteDocument, PatchBuilder } from \"../engine\";\nimport { getTemplate, templateDefaultPalette } from \"../shared/templates\";\nimport type { TemplateId } from \"../shared/templates\";\nimport { findPaletteByName } from \"./PaletteSelector\";\nimport { sharedTemplateToEngineDocument } from \"../utils/sharedTemplateToEngine\";\nimport { findBlockInStructure } from \"../utils/blockUtils\";\nimport { derivePaletteColors } from \"../utils/colorUtils\";\nimport { logger } from \"../utils/logger\";\nimport { processBlockDataURLs } from \"../utils/dataURLUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UploadConfig {\n tenantId?: string;\n schoolId?: string;\n siteId?: string | null;\n authToken?: string;\n}\n\nexport interface LandingPageEditorProps {\n initialData?: SiteDocument;\n /** ID do template a carregar quando não houver initialData (ex.: \"escola-edvi\") */\n defaultTemplateId?: TemplateId;\n onSave?: (data: SiteDocument) => Promise<void>;\n onPublish?: (data: SiteDocument) => Promise<void>;\n /** Configuração para upload seguro de imagens/vídeos */\n uploadConfig?: UploadConfig;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LandingPageEditor({\n initialData,\n defaultTemplateId,\n onSave,\n onPublish,\n uploadConfig,\n}: LandingPageEditorProps) {\n // Hook de estado do editor (edição por páginas; sem navegação)\n const {\n document,\n currentPageId,\n currentPage,\n selectedBlockId,\n selectedBlock,\n history,\n setCurrentPageId,\n addPage,\n removePage,\n canRemovePage,\n setSelectedBlockId,\n handleUndo,\n handleRedo,\n handleAddBlock,\n handleDeleteBlock,\n handleUpdateBlock,\n applyChange,\n resetToTemplate,\n isPaletteSelected,\n loadDocument,\n selectedPalette,\n setSelectedPalette,\n activePlugins,\n activatePlugin,\n deactivatePlugin,\n } = useEditorState({ initialData });\n\n // Estado local da UI\n const [isSaving, setIsSaving] = useState(false);\n const [currentTemplateId, setCurrentTemplateId] = useState<TemplateId | null>(\n null,\n );\n const [focusedGroup, setFocusedGroup] = useState<string | null>(null);\n const [showSelectionOverlay, setShowSelectionOverlay] = useState(false);\n\n // Carregar template escolhido (converter shared → engine e carregar no editor)\n const handleSelectTemplate = useCallback(\n (templateId: TemplateId) => {\n const sharedDoc = getTemplate(templateId);\n if (!sharedDoc) return;\n const engineDoc = sharedTemplateToEngineDocument(sharedDoc);\n loadDocument(engineDoc);\n setCurrentTemplateId(templateId);\n\n // Auto-selecionar paleta correspondente ao template\n const paletteName = templateDefaultPalette[templateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n },\n [loadDocument, setSelectedPalette],\n );\n\n // Ao montar sem documento: carregar defaultTemplateId se informado\n useEffect(() => {\n if (!document && defaultTemplateId) {\n handleSelectTemplate(defaultTemplateId);\n }\n }, [defaultTemplateId]); // eslint-disable-line react-hooks/exhaustive-deps -- carregar só uma vez quando defaultTemplateId existe\n\n // Handlers de save/publish\n const handleSave = async () => {\n if (!document || !onSave || !uploadConfig) return;\n setIsSaving(true);\n try {\n // Processar o documento para fazer upload de todos os Data URLs\n const processedPages = await Promise.all(\n (document.pages || []).map(async (page) => ({\n ...page,\n structure: await Promise.all(\n (page.structure || []).map((block) => processBlockDataURLs(block, uploadConfig))\n ),\n }))\n );\n\n const processedDocument = {\n ...document,\n pages: processedPages,\n };\n\n await onSave(processedDocument);\n } catch (error) {\n logger.error(\"Error saving:\", error);\n throw error;\n } finally {\n setIsSaving(false);\n }\n };\n\n const handlePublish = async () => {\n if (!document || !onPublish) return;\n setIsSaving(true);\n try {\n await onPublish(document);\n } catch (error) {\n logger.error(\"Error publishing:\", error);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Handler para atualizar um bloco específico\n const handleUpdateBlockById = useCallback(\n (blockId: string, updates: Record<string, any>) => {\n if (!document || !currentPage) return;\n const pageId = (currentPage as any).id;\n if (!pageId) return;\n\n try {\n const patch = PatchBuilder.updateBlockProps(\n document,\n pageId,\n blockId,\n updates\n );\n if (patch?.length) {\n applyChange(patch, \"Update block properties\");\n }\n } catch (error) {\n logger.error(\"Error updating block:\", error);\n }\n },\n [document, currentPage, applyChange]\n );\n\n // Handler para atualizar paleta de cores\n // Usa derivePaletteColors() para derivar todas as cores e patcha Hero/Navbar/Footer alem do theme\n const handlePaletteChange = useCallback((palette: any) => {\n if (!document) return;\n const derived = derivePaletteColors(palette);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allPatches: Array<{ op: \"replace\"; path: string; value: any }> = [];\n\n // 1. Theme color updates\n for (const [key, value] of Object.entries(derived.themeColors)) {\n allPatches.push({ op: \"replace\", path: `/theme/colors/${key}`, value });\n }\n\n // 2. Block-level patches (todas as paginas)\n // Hero variations that use dark gradient backgrounds\n const darkGradientVariations = new Set([\n \"hero-gradient\", \"hero-parallax\", \"hero-overlay\", \"hero-carousel\",\n ]);\n // Blog widget types que recebem cores da paleta\n const blogWidgetTypes = new Set([\n \"blogCategoryFilter\", \"blogRecentPosts\", \"blogTagCloud\",\n ]);\n\n // Recursivamente patcha blog widgets em children de grid/stack\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const patchNestedBlocks = (blocks: any[], basePath: string) => {\n for (let i = 0; i < blocks.length; i++) {\n const b = blocks[i];\n const bPath = `${basePath}/${i}/props`;\n if (blogWidgetTypes.has(b.type)) {\n allPatches.push(\n { op: \"replace\", path: `${bPath}/linkColor`, value: derived.themeColors.text },\n { op: \"replace\", path: `${bPath}/linkHoverColor`, value: derived.themeColors.primary },\n );\n }\n if (Array.isArray(b.props?.children)) {\n patchNestedBlocks(b.props.children, `${bPath}/children`);\n }\n }\n };\n\n for (let pageIdx = 0; pageIdx < document.pages.length; pageIdx++) {\n const page = document.pages[pageIdx];\n if (!page?.structure) continue;\n for (let blockIdx = 0; blockIdx < page.structure.length; blockIdx++) {\n const block = page.structure[blockIdx];\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n\n if (block.type === \"hero\") {\n const variation = (block.props as any)?.variation || \"\";\n if (darkGradientVariations.has(variation)) {\n allPatches.push(\n { op: \"replace\", path: `${base}/background`, value: `linear-gradient(135deg, ${derived.heroGradientStart} 0%, ${derived.heroGradientEnd} 100%)` },\n { op: \"replace\", path: `${base}/titleColor`, value: derived.heroTitleColor },\n { op: \"replace\", path: `${base}/subtitleColor`, value: derived.heroSubtitleColor },\n { op: \"replace\", path: `${base}/descriptionColor`, value: derived.heroDescColor },\n );\n }\n } else if (block.type === \"navbar\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/bg`, value: derived.navbarBg },\n { op: \"replace\", path: `${base}/linkColor`, value: derived.themeColors.menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: derived.themeColors.primaryText },\n );\n } else if (block.type === \"footer\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.footerLinkHover },\n );\n }\n }\n // Patchar blog widgets aninhados (dentro de grid/stack children)\n patchNestedBlocks(page.structure, `/pages/${pageIdx}/structure`);\n }\n\n applyChange(allPatches, \"Update color palette\");\n setSelectedPalette(palette.name ?? null);\n }, [document, applyChange, setSelectedPalette]);\n\n // Handler para clique no preview (com grupo opcional para scroll-to-group)\n const handleBlockClick = useCallback((blockId: string, group?: string) => {\n setSelectedBlockId(blockId);\n setFocusedGroup(group || null);\n }, [setSelectedBlockId]);\n\n // Limpar focusedGroup quando o bloco selecionado muda (via seleção no painel esquerdo, etc.)\n // Nota: handleBlockClick já define o focusedGroup corretamente quando vem do preview\n\n // No editor: cliques em links no preview não navegam; trocam a página em edição\n // Keyboard shortcuts\n useKeyboardShortcuts({\n onUndo: handleUndo,\n onRedo: handleRedo,\n onSave: handleSave,\n onDelete: () => {\n if (selectedBlockId) {\n handleDeleteBlock(selectedBlockId);\n }\n },\n onDeselect: () => setSelectedBlockId(null),\n });\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== \"editor-navigate\" || !event.data.href) return;\n const href = String(event.data.href);\n if (!document) return;\n // Links internos: /site/p/:slug ou /p/:slug\n const match = href.match(/^(?:\\/site)?\\/p\\/([^#?]+)/);\n if (match) {\n const slug = match[1];\n const page = document.pages.find((p) => p.slug === slug);\n if (page) setCurrentPageId(page.id);\n return;\n }\n // Âncora #id: selecionar bloco com esse id e trocar para a página que o contém\n if (href.startsWith(\"#\")) {\n const id = href.slice(1);\n for (const p of document.pages) {\n if (findBlockInStructure(p.structure || [], id)) {\n setCurrentPageId(p.id);\n setSelectedBlockId(id);\n break;\n }\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [document, setCurrentPageId, setSelectedBlockId]);\n\n // Sem documento: mostrar seletor de templates\n if (!document) {\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n <TemplatePicker onSelectTemplate={handleSelectTemplate} />\n </div>\n );\n }\n\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n {/* Toolbar */}\n <Toolbar\n history={history}\n isSaving={isSaving}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onSave={handleSave}\n onPublish={onPublish ? handlePublish : undefined}\n onReset={\n currentTemplateId\n ? () => {\n // Recarregar o mesmo template\n const sharedDoc = getTemplate(currentTemplateId);\n if (sharedDoc) {\n loadDocument(sharedTemplateToEngineDocument(sharedDoc));\n const paletteName = templateDefaultPalette[currentTemplateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n }\n }\n : resetToTemplate\n }\n showSelectionOverlay={showSelectionOverlay}\n onToggleSelectionOverlay={() => setShowSelectionOverlay(prev => !prev)}\n />\n\n {/* Main Content - 3 Columns */}\n <div className=\"flex-1 flex overflow-hidden min-h-0 max-h-full\">\n {/* Left: Block Selector + Paletas */}\n <LeftPanel\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n isPaletteSelected={isPaletteSelected}\n onSelectBlock={(id) => { setSelectedBlockId(id); setFocusedGroup(null); }}\n onDeleteBlock={handleDeleteBlock}\n onAddBlock={handleAddBlock}\n activePlugins={activePlugins}\n />\n\n {/* Center: Preview (apenas a página em edição) */}\n <CenterPanel\n document={document}\n currentPageId={currentPageId}\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n onBlockClick={handleBlockClick}\n onSelectPage={setCurrentPageId}\n onAddPage={() => {\n const name = prompt(\"Nome da página:\");\n if (!name) return;\n const slug = name.toLowerCase().replace(/\\s+/g, \"-\");\n const id = slug;\n addPage(id, name, slug);\n }}\n onRemovePage={removePage}\n canRemovePage={canRemovePage}\n onUpdateBlock={handleUpdateBlockById}\n activePlugins={activePlugins}\n onActivatePlugin={activatePlugin}\n onDeactivatePlugin={deactivatePlugin}\n showSelectionOverlay={showSelectionOverlay}\n focusedGroup={focusedGroup}\n />\n\n {/* Right: Editor Panel */}\n <RightPanel\n isPaletteSelected={isPaletteSelected}\n selectedBlock={selectedBlock}\n selectedPalette={selectedPalette ? findPaletteByName(selectedPalette) : undefined}\n onPaletteChange={handlePaletteChange}\n onUpdateBlock={handleUpdateBlock}\n uploadConfig={uploadConfig}\n document={document}\n currentPageId={currentPageId}\n focusedGroup={focusedGroup}\n />\n </div>\n </div>\n );\n}\n"],"names":["LandingPageEditor","initialData","defaultTemplateId","onSave","onPublish","uploadConfig","document","currentPageId","currentPage","selectedBlockId","selectedBlock","history","setCurrentPageId","addPage","removePage","canRemovePage","setSelectedBlockId","handleUndo","handleRedo","handleAddBlock","handleDeleteBlock","handleUpdateBlock","applyChange","resetToTemplate","isPaletteSelected","loadDocument","selectedPalette","setSelectedPalette","activePlugins","activatePlugin","deactivatePlugin","useEditorState","isSaving","setIsSaving","useState","currentTemplateId","setCurrentTemplateId","focusedGroup","setFocusedGroup","showSelectionOverlay","setShowSelectionOverlay","handleSelectTemplate","useCallback","templateId","sharedDoc","getTemplate","engineDoc","sharedTemplateToEngineDocument","paletteName","templateDefaultPalette","useEffect","handleSave","processedPages","page","block","processBlockDataURLs","processedDocument","error","logger","handlePublish","handleUpdateBlockById","blockId","updates","pageId","patch","PatchBuilder","handlePaletteChange","palette","derived","derivePaletteColors","allPatches","key","value","darkGradientVariations","blogWidgetTypes","patchNestedBlocks","blocks","basePath","i","b","bPath","pageIdx","blockIdx","base","variation","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","findPaletteByName","TemplatePicker"],"mappings":"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"}
|