@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.
Files changed (237) hide show
  1. package/dist/editor/BlockPalette.d.ts +3 -1
  2. package/dist/editor/BlockPalette.d.ts.map +1 -1
  3. package/dist/editor/BlockPalette.js +111 -0
  4. package/dist/editor/BlockPalette.js.map +1 -0
  5. package/dist/editor/LandingPageEditor.d.ts.map +1 -1
  6. package/dist/editor/LandingPageEditor.js +99 -96
  7. package/dist/editor/LandingPageEditor.js.map +1 -1
  8. package/dist/editor/components/LeftPanel.d.ts +3 -0
  9. package/dist/editor/components/LeftPanel.d.ts.map +1 -1
  10. package/dist/editor/components/LeftPanel.js +65 -22
  11. package/dist/editor/components/LeftPanel.js.map +1 -1
  12. package/dist/engine/export/exporters/layout/ContainerExporter.js.map +1 -1
  13. package/dist/engine/export/exporters/layout/SectionExporter.js.map +1 -1
  14. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.d.ts +3 -0
  15. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.d.ts.map +1 -0
  16. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.js +18 -0
  17. package/dist/engine/export/exporters/sections/CategoryCardGridExporter.js.map +1 -0
  18. package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
  19. package/dist/engine/export/exporters/sections/index.js +15 -13
  20. package/dist/engine/export/exporters/sections/index.js.map +1 -1
  21. package/dist/engine/export/styleResolver.d.ts.map +1 -1
  22. package/dist/engine/export/styleResolver.js.map +1 -1
  23. package/dist/engine/plugins/pluginRegistry.d.ts.map +1 -1
  24. package/dist/engine/plugins/pluginRegistry.js.map +1 -1
  25. package/dist/engine/plugins/types.d.ts.map +1 -1
  26. package/dist/engine/registry/blocks/composition/card.d.ts.map +1 -1
  27. package/dist/engine/registry/blocks/composition/card.js +2 -1
  28. package/dist/engine/registry/blocks/composition/card.js.map +1 -1
  29. package/dist/engine/registry/blocks/composition/section.d.ts.map +1 -1
  30. package/dist/engine/registry/blocks/composition/section.js +3 -2
  31. package/dist/engine/registry/blocks/composition/section.js.map +1 -1
  32. package/dist/engine/registry/blocks/content/avatar.d.ts.map +1 -1
  33. package/dist/engine/registry/blocks/content/avatar.js +1 -0
  34. package/dist/engine/registry/blocks/content/avatar.js.map +1 -1
  35. package/dist/engine/registry/blocks/content/badge.d.ts.map +1 -1
  36. package/dist/engine/registry/blocks/content/badge.js +3 -2
  37. package/dist/engine/registry/blocks/content/badge.js.map +1 -1
  38. package/dist/engine/registry/blocks/content/button.d.ts.map +1 -1
  39. package/dist/engine/registry/blocks/content/button.js +2 -1
  40. package/dist/engine/registry/blocks/content/button.js.map +1 -1
  41. package/dist/engine/registry/blocks/content/divider.d.ts.map +1 -1
  42. package/dist/engine/registry/blocks/content/divider.js +2 -1
  43. package/dist/engine/registry/blocks/content/divider.js.map +1 -1
  44. package/dist/engine/registry/blocks/content/heading.d.ts.map +1 -1
  45. package/dist/engine/registry/blocks/content/heading.js +2 -1
  46. package/dist/engine/registry/blocks/content/heading.js.map +1 -1
  47. package/dist/engine/registry/blocks/content/icon.d.ts.map +1 -1
  48. package/dist/engine/registry/blocks/content/icon.js +2 -1
  49. package/dist/engine/registry/blocks/content/icon.js.map +1 -1
  50. package/dist/engine/registry/blocks/content/image.d.ts.map +1 -1
  51. package/dist/engine/registry/blocks/content/image.js +2 -1
  52. package/dist/engine/registry/blocks/content/image.js.map +1 -1
  53. package/dist/engine/registry/blocks/content/link.d.ts.map +1 -1
  54. package/dist/engine/registry/blocks/content/link.js +1 -0
  55. package/dist/engine/registry/blocks/content/link.js.map +1 -1
  56. package/dist/engine/registry/blocks/content/socialLinks.d.ts.map +1 -1
  57. package/dist/engine/registry/blocks/content/socialLinks.js +5 -4
  58. package/dist/engine/registry/blocks/content/socialLinks.js.map +1 -1
  59. package/dist/engine/registry/blocks/content/text.d.ts.map +1 -1
  60. package/dist/engine/registry/blocks/content/text.js +2 -1
  61. package/dist/engine/registry/blocks/content/text.js.map +1 -1
  62. package/dist/engine/registry/blocks/content/video.d.ts.map +1 -1
  63. package/dist/engine/registry/blocks/content/video.js +2 -1
  64. package/dist/engine/registry/blocks/content/video.js.map +1 -1
  65. package/dist/engine/registry/blocks/forms/form.d.ts.map +1 -1
  66. package/dist/engine/registry/blocks/forms/form.js +7 -6
  67. package/dist/engine/registry/blocks/forms/form.js.map +1 -1
  68. package/dist/engine/registry/blocks/forms/input.d.ts.map +1 -1
  69. package/dist/engine/registry/blocks/forms/input.js +2 -1
  70. package/dist/engine/registry/blocks/forms/input.js.map +1 -1
  71. package/dist/engine/registry/blocks/forms/select.d.ts.map +1 -1
  72. package/dist/engine/registry/blocks/forms/select.js +3 -2
  73. package/dist/engine/registry/blocks/forms/select.js.map +1 -1
  74. package/dist/engine/registry/blocks/forms/textarea.d.ts.map +1 -1
  75. package/dist/engine/registry/blocks/forms/textarea.js +3 -2
  76. package/dist/engine/registry/blocks/forms/textarea.js.map +1 -1
  77. package/dist/engine/registry/blocks/layout/box.d.ts.map +1 -1
  78. package/dist/engine/registry/blocks/layout/box.js +7 -6
  79. package/dist/engine/registry/blocks/layout/box.js.map +1 -1
  80. package/dist/engine/registry/blocks/layout/container.d.ts.map +1 -1
  81. package/dist/engine/registry/blocks/layout/container.js +6 -5
  82. package/dist/engine/registry/blocks/layout/container.js.map +1 -1
  83. package/dist/engine/registry/blocks/layout/grid.d.ts.map +1 -1
  84. package/dist/engine/registry/blocks/layout/grid.js +3 -2
  85. package/dist/engine/registry/blocks/layout/grid.js.map +1 -1
  86. package/dist/engine/registry/blocks/layout/spacer.d.ts.map +1 -1
  87. package/dist/engine/registry/blocks/layout/spacer.js +3 -2
  88. package/dist/engine/registry/blocks/layout/spacer.js.map +1 -1
  89. package/dist/engine/registry/blocks/layout/stack.d.ts.map +1 -1
  90. package/dist/engine/registry/blocks/layout/stack.js +3 -2
  91. package/dist/engine/registry/blocks/layout/stack.js.map +1 -1
  92. package/dist/engine/registry/blocks/sections/aboutSection.d.ts.map +1 -1
  93. package/dist/engine/registry/blocks/sections/aboutSection.js +3 -2
  94. package/dist/engine/registry/blocks/sections/aboutSection.js.map +1 -1
  95. package/dist/engine/registry/blocks/sections/blogCard.d.ts.map +1 -1
  96. package/dist/engine/registry/blocks/sections/blogCard.js +3 -2
  97. package/dist/engine/registry/blocks/sections/blogCard.js.map +1 -1
  98. package/dist/engine/registry/blocks/sections/blogCardGrid.d.ts.map +1 -1
  99. package/dist/engine/registry/blocks/sections/blogCardGrid.js +2 -1
  100. package/dist/engine/registry/blocks/sections/blogCardGrid.js.map +1 -1
  101. package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -1
  102. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +3 -2
  103. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -1
  104. package/dist/engine/registry/blocks/sections/blogPostCard.d.ts.map +1 -1
  105. package/dist/engine/registry/blocks/sections/blogPostCard.js +3 -2
  106. package/dist/engine/registry/blocks/sections/blogPostCard.js.map +1 -1
  107. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
  108. package/dist/engine/registry/blocks/sections/blogPostDetail.js +3 -2
  109. package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
  110. package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts.map +1 -1
  111. package/dist/engine/registry/blocks/sections/blogPostGrid.js +3 -2
  112. package/dist/engine/registry/blocks/sections/blogPostGrid.js.map +1 -1
  113. package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -1
  114. package/dist/engine/registry/blocks/sections/blogRecentPosts.js +1 -0
  115. package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -1
  116. package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -1
  117. package/dist/engine/registry/blocks/sections/blogSearchBar.js +3 -2
  118. package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -1
  119. package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -1
  120. package/dist/engine/registry/blocks/sections/blogTagCloud.js +1 -0
  121. package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -1
  122. package/dist/engine/registry/blocks/sections/carousel.d.ts.map +1 -1
  123. package/dist/engine/registry/blocks/sections/carousel.js +3 -2
  124. package/dist/engine/registry/blocks/sections/carousel.js.map +1 -1
  125. package/dist/engine/registry/blocks/sections/categoryCardGrid.d.ts.map +1 -1
  126. package/dist/engine/registry/blocks/sections/categoryCardGrid.js +3 -2
  127. package/dist/engine/registry/blocks/sections/categoryCardGrid.js.map +1 -1
  128. package/dist/engine/registry/blocks/sections/contactSection.d.ts.map +1 -1
  129. package/dist/engine/registry/blocks/sections/contactSection.js +3 -2
  130. package/dist/engine/registry/blocks/sections/contactSection.js.map +1 -1
  131. package/dist/engine/registry/blocks/sections/countdown.d.ts.map +1 -1
  132. package/dist/engine/registry/blocks/sections/countdown.js +6 -5
  133. package/dist/engine/registry/blocks/sections/countdown.js.map +1 -1
  134. package/dist/engine/registry/blocks/sections/courseCardGrid.d.ts.map +1 -1
  135. package/dist/engine/registry/blocks/sections/courseCardGrid.js +3 -2
  136. package/dist/engine/registry/blocks/sections/courseCardGrid.js.map +1 -1
  137. package/dist/engine/registry/blocks/sections/cta.d.ts.map +1 -1
  138. package/dist/engine/registry/blocks/sections/cta.js +3 -2
  139. package/dist/engine/registry/blocks/sections/cta.js.map +1 -1
  140. package/dist/engine/registry/blocks/sections/faq.d.ts.map +1 -1
  141. package/dist/engine/registry/blocks/sections/faq.js +6 -5
  142. package/dist/engine/registry/blocks/sections/faq.js.map +1 -1
  143. package/dist/engine/registry/blocks/sections/faqItem.d.ts.map +1 -1
  144. package/dist/engine/registry/blocks/sections/faqItem.js +3 -1
  145. package/dist/engine/registry/blocks/sections/faqItem.js.map +1 -1
  146. package/dist/engine/registry/blocks/sections/feature.d.ts.map +1 -1
  147. package/dist/engine/registry/blocks/sections/feature.js +7 -5
  148. package/dist/engine/registry/blocks/sections/feature.js.map +1 -1
  149. package/dist/engine/registry/blocks/sections/featureGrid.d.ts.map +1 -1
  150. package/dist/engine/registry/blocks/sections/featureGrid.js +3 -2
  151. package/dist/engine/registry/blocks/sections/featureGrid.js.map +1 -1
  152. package/dist/engine/registry/blocks/sections/footer.d.ts.map +1 -1
  153. package/dist/engine/registry/blocks/sections/footer.js +3 -2
  154. package/dist/engine/registry/blocks/sections/footer.js.map +1 -1
  155. package/dist/engine/registry/blocks/sections/hero.d.ts.map +1 -1
  156. package/dist/engine/registry/blocks/sections/hero.js +3 -2
  157. package/dist/engine/registry/blocks/sections/hero.js.map +1 -1
  158. package/dist/engine/registry/blocks/sections/imageGallery.d.ts.map +1 -1
  159. package/dist/engine/registry/blocks/sections/imageGallery.js +1 -0
  160. package/dist/engine/registry/blocks/sections/imageGallery.js.map +1 -1
  161. package/dist/engine/registry/blocks/sections/logoCloud.d.ts.map +1 -1
  162. package/dist/engine/registry/blocks/sections/logoCloud.js +3 -2
  163. package/dist/engine/registry/blocks/sections/logoCloud.js.map +1 -1
  164. package/dist/engine/registry/blocks/sections/navbar.d.ts.map +1 -1
  165. package/dist/engine/registry/blocks/sections/navbar.js +3 -2
  166. package/dist/engine/registry/blocks/sections/navbar.js.map +1 -1
  167. package/dist/engine/registry/blocks/sections/pricing.d.ts.map +1 -1
  168. package/dist/engine/registry/blocks/sections/pricing.js +3 -2
  169. package/dist/engine/registry/blocks/sections/pricing.js.map +1 -1
  170. package/dist/engine/registry/blocks/sections/pricingCard.d.ts.map +1 -1
  171. package/dist/engine/registry/blocks/sections/pricingCard.js +4 -2
  172. package/dist/engine/registry/blocks/sections/pricingCard.js.map +1 -1
  173. package/dist/engine/registry/blocks/sections/productShowcase.d.ts.map +1 -1
  174. package/dist/engine/registry/blocks/sections/productShowcase.js +3 -2
  175. package/dist/engine/registry/blocks/sections/productShowcase.js.map +1 -1
  176. package/dist/engine/registry/blocks/sections/statItem.d.ts.map +1 -1
  177. package/dist/engine/registry/blocks/sections/statItem.js +3 -1
  178. package/dist/engine/registry/blocks/sections/statItem.js.map +1 -1
  179. package/dist/engine/registry/blocks/sections/stats.d.ts.map +1 -1
  180. package/dist/engine/registry/blocks/sections/stats.js +3 -2
  181. package/dist/engine/registry/blocks/sections/stats.js.map +1 -1
  182. package/dist/engine/registry/blocks/sections/teamCard.d.ts.map +1 -1
  183. package/dist/engine/registry/blocks/sections/teamCard.js +4 -2
  184. package/dist/engine/registry/blocks/sections/teamCard.js.map +1 -1
  185. package/dist/engine/registry/blocks/sections/teamGrid.d.ts.map +1 -1
  186. package/dist/engine/registry/blocks/sections/teamGrid.js +3 -2
  187. package/dist/engine/registry/blocks/sections/teamGrid.js.map +1 -1
  188. package/dist/engine/registry/blocks/sections/testimonial.d.ts.map +1 -1
  189. package/dist/engine/registry/blocks/sections/testimonial.js +4 -2
  190. package/dist/engine/registry/blocks/sections/testimonial.js.map +1 -1
  191. package/dist/engine/registry/blocks/sections/testimonialGrid.d.ts.map +1 -1
  192. package/dist/engine/registry/blocks/sections/testimonialGrid.js +3 -2
  193. package/dist/engine/registry/blocks/sections/testimonialGrid.js.map +1 -1
  194. package/dist/engine/registry/types.d.ts +4 -0
  195. package/dist/engine/registry/types.d.ts.map +1 -1
  196. package/dist/engine/render/registry/renderRegistry.d.ts.map +1 -1
  197. package/dist/engine/render/registry/renderRegistry.js.map +1 -1
  198. package/dist/engine/render/renderNodeImpl.d.ts.map +1 -1
  199. package/dist/engine/render/renderNodeImpl.js +14 -503
  200. package/dist/engine/render/renderNodeImpl.js.map +1 -1
  201. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.d.ts +4 -0
  202. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.d.ts.map +1 -0
  203. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.js +38 -0
  204. package/dist/engine/render/renderers/sections/BlogCardGridRenderer.js.map +1 -0
  205. package/dist/engine/render/renderers/sections/BlogCardRenderer.d.ts +4 -0
  206. package/dist/engine/render/renderers/sections/BlogCardRenderer.d.ts.map +1 -0
  207. package/dist/engine/render/renderers/sections/BlogCardRenderer.js +90 -0
  208. package/dist/engine/render/renderers/sections/BlogCardRenderer.js.map +1 -0
  209. package/dist/engine/render/renderers/sections/CarouselRenderer.d.ts +4 -0
  210. package/dist/engine/render/renderers/sections/CarouselRenderer.d.ts.map +1 -0
  211. package/dist/engine/render/renderers/sections/CarouselRenderer.js +64 -0
  212. package/dist/engine/render/renderers/sections/CarouselRenderer.js.map +1 -0
  213. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.d.ts +4 -0
  214. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.d.ts.map +1 -0
  215. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.js +54 -0
  216. package/dist/engine/render/renderers/sections/CategoryCardGridRenderer.js.map +1 -0
  217. package/dist/engine/render/renderers/sections/CountdownRenderer.d.ts +4 -0
  218. package/dist/engine/render/renderers/sections/CountdownRenderer.d.ts.map +1 -0
  219. package/dist/engine/render/renderers/sections/CountdownRenderer.js +91 -0
  220. package/dist/engine/render/renderers/sections/CountdownRenderer.js.map +1 -0
  221. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.d.ts +4 -0
  222. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.d.ts.map +1 -0
  223. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.js +76 -0
  224. package/dist/engine/render/renderers/sections/CourseCardGridRenderer.js.map +1 -0
  225. package/dist/engine/render/renderers/sections/TeamCardRenderer.d.ts +4 -0
  226. package/dist/engine/render/renderers/sections/TeamCardRenderer.d.ts.map +1 -0
  227. package/dist/engine/render/renderers/sections/TeamCardRenderer.js +59 -0
  228. package/dist/engine/render/renderers/sections/TeamCardRenderer.js.map +1 -0
  229. package/dist/engine/render/renderers/sections/TeamGridRenderer.d.ts +4 -0
  230. package/dist/engine/render/renderers/sections/TeamGridRenderer.d.ts.map +1 -0
  231. package/dist/engine/render/renderers/sections/TeamGridRenderer.js +38 -0
  232. package/dist/engine/render/renderers/sections/TeamGridRenderer.js.map +1 -0
  233. package/dist/engine/render/renderers/sections/index.js +54 -38
  234. package/dist/engine/render/renderers/sections/index.js.map +1 -1
  235. package/dist/engine/shared/hoverEffects/buttonHover.d.ts.map +1 -1
  236. package/dist/engine/shared/hoverEffects/buttonHover.js.map +1 -1
  237. 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;AAKvD,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;CACvC;AAED,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,qBAAqB,GACtB,EAAE,iBAAiB,2CA+LnB"}
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;AAQH,OAAO,EAAE,YAAY,EAAuB,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,sBAAsB,2CA6VxB"}
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 h, jsxs as j } from "react/jsx-runtime";
2
- import { useState as C, useCallback as y, useEffect as F } from "react";
3
- import { TemplatePicker as pe } from "./TemplatePicker.js";
4
- import { useEditorState as de } from "../hooks/useEditorState.js";
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 W, templateDefaultPalette as K } from "../shared/templates/index.js";
7
- import { findPaletteByName as he } from "./PaletteSelector.js";
8
- import { sharedTemplateToEngineDocument as M } from "../utils/sharedTemplateToEngine.js";
9
- import { findBlockInStructure as me } from "../utils/blockUtils.js";
10
- import { derivePaletteColors as fe } from "../utils/colorUtils.js";
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 ge } from "../utils/dataURLUtils.js";
13
- import { Toolbar as ve } from "./components/Toolbar.js";
14
- import { LeftPanel as ke } from "./components/LeftPanel.js";
15
- import { CenterPanel as Pe } from "./components/CenterPanel.js";
16
- import { RightPanel as Ce } from "./components/RightPanel.js";
17
- import { PatchBuilder as ye } from "../engine/patch/PatchBuilder.js";
18
- function Oe({
19
- initialData: V,
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: q,
31
- history: z,
30
+ selectedBlock: z,
31
+ history: J,
32
32
  setCurrentPageId: v,
33
- addPage: J,
34
- removePage: Q,
35
- canRemovePage: X,
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: Y,
41
+ handleUpdateBlock: _,
41
42
  applyChange: k,
42
- resetToTemplate: Z,
43
+ resetToTemplate: ee,
43
44
  isPaletteSelected: I,
44
- loadDocument: B,
45
+ loadDocument: $,
45
46
  selectedPalette: L,
46
47
  setSelectedPalette: f,
47
- activePlugins: _,
48
- activatePlugin: ee,
49
- deactivatePlugin: oe
50
- } = de({ initialData: V }), [te, P] = C(!1), [x, re] = C(
48
+ activePlugins: N,
49
+ activatePlugin: oe,
50
+ deactivatePlugin: te
51
+ } = he({ initialData: q }), [re, P] = C(!1), [x, ae] = C(
51
52
  null
52
- ), [N, G] = C(null), [A, ae] = C(!1), H = y(
53
+ ), [A, G] = C(null), [H, le] = C(!1), O = y(
53
54
  (o) => {
54
- const e = W(o);
55
+ const e = K(o);
55
56
  if (!e) return;
56
- const r = M(e);
57
- B(r), re(o);
58
- const a = K[o];
57
+ const r = V(e);
58
+ $(r), ae(o);
59
+ const a = M[o];
59
60
  a && f(a);
60
61
  },
61
- [B, f]
62
+ [$, f]
62
63
  );
63
- F(() => {
64
- !t && b && H(b);
64
+ W(() => {
65
+ !t && b && O(b);
65
66
  }, [b]);
66
- const O = async () => {
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) => ge(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
- }, le = async () => {
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
- }, ne = y(
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 = ye.updateBlockProps(
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
- ), se = y((o) => {
118
+ ), ce = y((o) => {
118
119
  if (!t) return;
119
- const e = fe(o), r = [];
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
- ]), u = /* @__PURE__ */ new Set([
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
- u.has(p.type) && r.push(
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 ie = p.props?.variation || "";
147
- a.has(ie) && r.push(
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]), ce = y((o, e) => {
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: O,
174
+ onSave: j,
174
175
  onDelete: () => {
175
176
  g && R(g);
176
177
  },
177
178
  onDeselect: () => d(null)
178
- }), F(() => {
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 u = a[1], c = t.pages.find((n) => n.slug === u);
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 u = r.slice(1);
191
+ const h = r.slice(1);
191
192
  for (const c of t.pages)
192
- if (me(c.structure || [], u)) {
193
- v(c.id), d(u);
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__ */ j("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: [
200
- /* @__PURE__ */ h(
201
- ve,
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: z,
204
- isSaving: te,
204
+ history: J,
205
+ isSaving: re,
205
206
  onUndo: E,
206
207
  onRedo: U,
207
- onSave: O,
208
- onPublish: S ? le : void 0,
208
+ onSave: j,
209
+ onPublish: S ? ne : void 0,
209
210
  onReset: x ? () => {
210
- const o = W(x);
211
+ const o = K(x);
211
212
  if (o) {
212
- B(M(o));
213
- const e = K[x];
213
+ $(V(o));
214
+ const e = M[x];
214
215
  e && f(e);
215
216
  }
216
- } : Z,
217
- showSelectionOverlay: A,
218
- onToggleSelectionOverlay: () => ae((o) => !o)
217
+ } : ee,
218
+ showSelectionOverlay: H,
219
+ onToggleSelectionOverlay: () => le((o) => !o)
219
220
  }
220
221
  ),
221
- /* @__PURE__ */ j("div", { className: "flex-1 flex overflow-hidden min-h-0 max-h-full", children: [
222
- /* @__PURE__ */ h(
223
- ke,
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__ */ h(
235
- Pe,
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: ce,
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
- J(e, o, e);
250
+ Q(e, o, e);
248
251
  },
249
- onRemovePage: Q,
250
- canRemovePage: X,
251
- onUpdateBlock: ne,
252
- activePlugins: _,
253
- onActivatePlugin: ee,
254
- onDeactivatePlugin: oe,
255
- showSelectionOverlay: A,
256
- focusedGroup: N
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__ */ h(
260
- Ce,
262
+ /* @__PURE__ */ u(
263
+ ye,
261
264
  {
262
265
  isPaletteSelected: I,
263
- selectedBlock: q,
264
- selectedPalette: L ? he(L) : void 0,
265
- onPaletteChange: se,
266
- onUpdateBlock: Y,
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: N
273
+ focusedGroup: A
271
274
  }
272
275
  )
273
276
  ] })
274
- ] }) : /* @__PURE__ */ h("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: /* @__PURE__ */ h(pe, { onSelectTemplate: H }) });
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
- Oe as LandingPageEditor
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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"}