@brunoalz/smartgesti-site-editor 1.5.1 → 1.6.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 (80) hide show
  1. package/dist/editor/LandingPageEditor.d.ts.map +1 -1
  2. package/dist/editor/LandingPageEditor.js +199 -185
  3. package/dist/editor/LandingPageEditor.js.map +1 -1
  4. package/dist/editor/PropertyEditor/VariationSelector.d.ts +1 -1
  5. package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
  6. package/dist/editor/PropertyEditor/VariationSelector.js +262 -93
  7. package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
  8. package/dist/engine/export/exporters/layout/GridExporter.d.ts.map +1 -1
  9. package/dist/engine/export/exporters/layout/GridExporter.js +47 -31
  10. package/dist/engine/export/exporters/layout/GridExporter.js.map +1 -1
  11. package/dist/engine/export/exporters/layout/StackExporter.d.ts.map +1 -1
  12. package/dist/engine/export/exporters/layout/StackExporter.js +17 -16
  13. package/dist/engine/export/exporters/layout/StackExporter.js.map +1 -1
  14. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
  15. package/dist/engine/export/exporters/sections/BlogPostExporters.js +246 -186
  16. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
  17. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
  18. package/dist/engine/plugins/builtin/blog/manifest.js +59 -36
  19. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
  20. package/dist/engine/presets/blogVariations.d.ts +51 -0
  21. package/dist/engine/presets/blogVariations.d.ts.map +1 -0
  22. package/dist/engine/presets/blogVariations.js +267 -0
  23. package/dist/engine/presets/blogVariations.js.map +1 -0
  24. package/dist/engine/registry/blocks/layout/grid.d.ts.map +1 -1
  25. package/dist/engine/registry/blocks/layout/grid.js +108 -22
  26. package/dist/engine/registry/blocks/layout/grid.js.map +1 -1
  27. package/dist/engine/registry/blocks/layout/stack.d.ts.map +1 -1
  28. package/dist/engine/registry/blocks/layout/stack.js +25 -9
  29. package/dist/engine/registry/blocks/layout/stack.js.map +1 -1
  30. package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -1
  31. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +62 -5
  32. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -1
  33. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
  34. package/dist/engine/registry/blocks/sections/blogPostDetail.js +16 -4
  35. package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
  36. package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -1
  37. package/dist/engine/registry/blocks/sections/blogRecentPosts.js +62 -5
  38. package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -1
  39. package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -1
  40. package/dist/engine/registry/blocks/sections/blogSearchBar.js +23 -1
  41. package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -1
  42. package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -1
  43. package/dist/engine/registry/blocks/sections/blogTagCloud.js +63 -6
  44. package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -1
  45. package/dist/engine/render/renderers/layout/GridRenderer.d.ts.map +1 -1
  46. package/dist/engine/render/renderers/layout/GridRenderer.js +51 -18
  47. package/dist/engine/render/renderers/layout/GridRenderer.js.map +1 -1
  48. package/dist/engine/render/renderers/layout/StackRenderer.d.ts.map +1 -1
  49. package/dist/engine/render/renderers/layout/StackRenderer.js +30 -25
  50. package/dist/engine/render/renderers/layout/StackRenderer.js.map +1 -1
  51. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts.map +1 -1
  52. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js +157 -132
  53. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js.map +1 -1
  54. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +17 -17
  55. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -1
  56. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.d.ts.map +1 -1
  57. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js +168 -136
  58. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js.map +1 -1
  59. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts.map +1 -1
  60. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js +59 -102
  61. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js.map +1 -1
  62. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.d.ts.map +1 -1
  63. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js +158 -122
  64. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js.map +1 -1
  65. package/dist/engine/schema/siteDocument.d.ts +61 -3
  66. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  67. package/dist/engine/schema/siteDocument.js.map +1 -1
  68. package/dist/engine/shared/hoverEffects/colorUtils.d.ts +2 -1
  69. package/dist/engine/shared/hoverEffects/colorUtils.d.ts.map +1 -1
  70. package/dist/engine/shared/hoverEffects/colorUtils.js +16 -12
  71. package/dist/engine/shared/hoverEffects/colorUtils.js.map +1 -1
  72. package/dist/engine/shared/widgetStyles.d.ts +9 -0
  73. package/dist/engine/shared/widgetStyles.d.ts.map +1 -0
  74. package/dist/engine/shared/widgetStyles.js +13 -0
  75. package/dist/engine/shared/widgetStyles.js.map +1 -0
  76. package/dist/index.d.ts +2 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +84 -71
  79. package/dist/index.js.map +1 -1
  80. package/package.json +1 -1
@@ -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,2CAqUxB"}
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,263 +1,277 @@
1
- import { jsx as p, jsxs as j } from "react/jsx-runtime";
2
- import { useState as k, useCallback as P, useEffect as H } from "react";
3
- import { TemplatePicker as ce } from "./TemplatePicker.js";
4
- import { useEditorState as ie } from "../hooks/useEditorState.js";
5
- import { useKeyboardShortcuts as pe } from "../hooks/useKeyboardShortcuts.js";
6
- import { getTemplate as A, templateDefaultPalette as F } from "../shared/templates/index.js";
7
- import { findPaletteByName as de } from "./PaletteSelector.js";
8
- import { sharedTemplateToEngineDocument as K } from "../utils/sharedTemplateToEngine.js";
9
- import { findBlockInStructure as ue } from "../utils/blockUtils.js";
10
- import { derivePaletteColors as he } from "../utils/colorUtils.js";
11
- import { logger as x } from "../utils/logger.js";
12
- import { processBlockDataURLs as me } from "../utils/dataURLUtils.js";
13
- import { Toolbar as fe } from "./components/Toolbar.js";
14
- import { LeftPanel as ge } from "./components/LeftPanel.js";
15
- import { CenterPanel as ve } from "./components/CenterPanel.js";
16
- import { RightPanel as ke } from "./components/RightPanel.js";
17
- import { PatchBuilder as Pe } from "../engine/patch/PatchBuilder.js";
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";
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";
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
18
  function Oe({
19
- initialData: M,
20
- defaultTemplateId: C,
21
- onSave: w,
22
- onPublish: y,
23
- uploadConfig: b
19
+ initialData: V,
20
+ defaultTemplateId: b,
21
+ onSave: T,
22
+ onPublish: S,
23
+ uploadConfig: $
24
24
  }) {
25
25
  const {
26
26
  document: t,
27
- currentPageId: $,
28
- currentPage: d,
29
- selectedBlockId: h,
30
- selectedBlock: V,
31
- history: W,
32
- setCurrentPageId: m,
33
- addPage: q,
34
- removePage: z,
35
- canRemovePage: J,
36
- setSelectedBlockId: c,
37
- handleUndo: D,
38
- handleRedo: T,
39
- handleDeleteBlock: E,
40
- handleUpdateBlock: Q,
41
- applyChange: f,
42
- resetToTemplate: X,
43
- isPaletteSelected: U,
44
- loadDocument: S,
45
- selectedPalette: I,
46
- setSelectedPalette: u,
47
- activePlugins: Y,
48
- activatePlugin: Z,
49
- deactivatePlugin: _
50
- } = ie({ initialData: M }), [ee, g] = k(!1), [B, oe] = k(
27
+ currentPageId: D,
28
+ currentPage: m,
29
+ selectedBlockId: g,
30
+ selectedBlock: q,
31
+ history: z,
32
+ setCurrentPageId: v,
33
+ addPage: J,
34
+ removePage: Q,
35
+ canRemovePage: X,
36
+ setSelectedBlockId: d,
37
+ handleUndo: E,
38
+ handleRedo: U,
39
+ handleDeleteBlock: R,
40
+ handleUpdateBlock: Y,
41
+ applyChange: k,
42
+ resetToTemplate: Z,
43
+ isPaletteSelected: I,
44
+ loadDocument: B,
45
+ selectedPalette: L,
46
+ setSelectedPalette: f,
47
+ activePlugins: _,
48
+ activatePlugin: ee,
49
+ deactivatePlugin: oe
50
+ } = de({ initialData: V }), [te, P] = C(!1), [x, re] = C(
51
51
  null
52
- ), [L, R] = k(null), [N, te] = k(!1), G = P(
53
- (e) => {
54
- const o = A(e);
55
- if (!o) return;
56
- const r = K(o);
57
- S(r), oe(e);
58
- const a = F[e];
59
- a && u(a);
52
+ ), [N, G] = C(null), [A, ae] = C(!1), H = y(
53
+ (o) => {
54
+ const e = W(o);
55
+ if (!e) return;
56
+ const r = M(e);
57
+ B(r), re(o);
58
+ const a = K[o];
59
+ a && f(a);
60
60
  },
61
- [S, u]
61
+ [B, f]
62
62
  );
63
- H(() => {
64
- !t && C && G(C);
65
- }, [C]);
63
+ F(() => {
64
+ !t && b && H(b);
65
+ }, [b]);
66
66
  const O = async () => {
67
- if (!(!t || !w || !b)) {
68
- g(!0);
67
+ if (!(!t || !T || !$)) {
68
+ P(!0);
69
69
  try {
70
- const e = await Promise.all(
70
+ const o = await Promise.all(
71
71
  (t.pages || []).map(async (r) => ({
72
72
  ...r,
73
73
  structure: await Promise.all(
74
- (r.structure || []).map((a) => me(a, b))
74
+ (r.structure || []).map((a) => ge(a, $))
75
75
  )
76
76
  }))
77
- ), o = {
77
+ ), e = {
78
78
  ...t,
79
- pages: e
79
+ pages: o
80
80
  };
81
- await w(o);
82
- } catch (e) {
83
- throw x.error("Error saving:", e), e;
81
+ await T(e);
82
+ } catch (o) {
83
+ throw w.error("Error saving:", o), o;
84
84
  } finally {
85
- g(!1);
85
+ P(!1);
86
86
  }
87
87
  }
88
- }, re = async () => {
89
- if (!(!t || !y)) {
90
- g(!0);
88
+ }, le = async () => {
89
+ if (!(!t || !S)) {
90
+ P(!0);
91
91
  try {
92
- await y(t);
93
- } catch (e) {
94
- x.error("Error publishing:", e);
92
+ await S(t);
93
+ } catch (o) {
94
+ w.error("Error publishing:", o);
95
95
  } finally {
96
- g(!1);
96
+ P(!1);
97
97
  }
98
98
  }
99
- }, ae = P(
100
- (e, o) => {
101
- if (!t || !d) return;
102
- const r = d.id;
99
+ }, ne = y(
100
+ (o, e) => {
101
+ if (!t || !m) return;
102
+ const r = m.id;
103
103
  if (r)
104
104
  try {
105
- const a = Pe.updateBlockProps(
105
+ const a = ye.updateBlockProps(
106
106
  t,
107
107
  r,
108
- e,
109
- o
108
+ o,
109
+ e
110
110
  );
111
- a?.length && f(a, "Update block properties");
111
+ a?.length && k(a, "Update block properties");
112
112
  } catch (a) {
113
- x.error("Error updating block:", a);
113
+ w.error("Error updating block:", a);
114
114
  }
115
115
  },
116
- [t, d, f]
117
- ), le = P((e) => {
116
+ [t, m, k]
117
+ ), se = y((o) => {
118
118
  if (!t) return;
119
- const o = he(e), r = [];
120
- for (const [l, n] of Object.entries(o.themeColors))
121
- r.push({ op: "replace", path: `/theme/colors/${l}`, value: n });
119
+ const e = fe(o), r = [];
120
+ for (const [n, i] of Object.entries(e.themeColors))
121
+ r.push({ op: "replace", path: `/theme/colors/${n}`, value: i });
122
122
  const a = /* @__PURE__ */ new Set([
123
123
  "hero-gradient",
124
124
  "hero-parallax",
125
125
  "hero-overlay",
126
126
  "hero-carousel"
127
- ]);
128
- for (let l = 0; l < t.pages.length; l++) {
129
- const n = t.pages[l];
130
- if (n?.structure)
131
- for (let i = 0; i < n.structure.length; i++) {
132
- const v = n.structure[i], s = `/pages/${l}/structure/${i}/props`;
133
- if (v.type === "hero") {
134
- const se = v.props?.variation || "";
135
- a.has(se) && r.push(
136
- { op: "replace", path: `${s}/background`, value: `linear-gradient(135deg, ${o.heroGradientStart} 0%, ${o.heroGradientEnd} 100%)` },
137
- { op: "replace", path: `${s}/titleColor`, value: o.heroTitleColor },
138
- { op: "replace", path: `${s}/subtitleColor`, value: o.heroSubtitleColor },
139
- { op: "replace", path: `${s}/descriptionColor`, value: o.heroDescColor }
127
+ ]), u = /* @__PURE__ */ new Set([
128
+ "blogCategoryFilter",
129
+ "blogRecentPosts",
130
+ "blogTagCloud"
131
+ ]), c = (n, i) => {
132
+ for (let s = 0; s < n.length; s++) {
133
+ const p = n[s], l = `${i}/${s}/props`;
134
+ u.has(p.type) && r.push(
135
+ { op: "replace", path: `${l}/linkColor`, value: e.themeColors.text },
136
+ { op: "replace", path: `${l}/linkHoverColor`, value: e.themeColors.primary }
137
+ ), Array.isArray(p.props?.children) && c(p.props.children, `${l}/children`);
138
+ }
139
+ };
140
+ for (let n = 0; n < t.pages.length; n++) {
141
+ const i = t.pages[n];
142
+ if (i?.structure) {
143
+ for (let s = 0; s < i.structure.length; s++) {
144
+ const p = i.structure[s], l = `/pages/${n}/structure/${s}/props`;
145
+ if (p.type === "hero") {
146
+ const ie = p.props?.variation || "";
147
+ a.has(ie) && r.push(
148
+ { op: "replace", path: `${l}/background`, value: `linear-gradient(135deg, ${e.heroGradientStart} 0%, ${e.heroGradientEnd} 100%)` },
149
+ { op: "replace", path: `${l}/titleColor`, value: e.heroTitleColor },
150
+ { op: "replace", path: `${l}/subtitleColor`, value: e.heroSubtitleColor },
151
+ { op: "replace", path: `${l}/descriptionColor`, value: e.heroDescColor }
140
152
  );
141
- } else v.type === "navbar" ? r.push(
142
- { op: "replace", path: `${s}/bg`, value: o.navbarBg },
143
- { op: "replace", path: `${s}/linkColor`, value: o.themeColors.menuLinkColor },
144
- { op: "replace", path: `${s}/linkHoverColor`, value: o.themeColors.primary },
145
- { op: "replace", path: `${s}/buttonColor`, value: o.themeColors.primary },
146
- { op: "replace", path: `${s}/buttonTextColor`, value: o.themeColors.primaryText }
147
- ) : v.type === "footer" && r.push(
148
- { op: "replace", path: `${s}/linkHoverColor`, value: o.footerLinkHover }
153
+ } else p.type === "navbar" ? r.push(
154
+ { op: "replace", path: `${l}/bg`, value: e.navbarBg },
155
+ { op: "replace", path: `${l}/linkColor`, value: e.themeColors.menuLinkColor },
156
+ { op: "replace", path: `${l}/linkHoverColor`, value: e.themeColors.primary },
157
+ { op: "replace", path: `${l}/buttonColor`, value: e.themeColors.primary },
158
+ { op: "replace", path: `${l}/buttonTextColor`, value: e.themeColors.primaryText }
159
+ ) : p.type === "footer" && r.push(
160
+ { op: "replace", path: `${l}/linkHoverColor`, value: e.footerLinkHover }
149
161
  );
150
162
  }
163
+ c(i.structure, `/pages/${n}/structure`);
164
+ }
151
165
  }
152
- f(r, "Update color palette"), u(e.name ?? null);
153
- }, [t, f, u]), ne = P((e, o) => {
154
- c(e), R(o || null);
155
- }, [c]);
156
- return pe({
157
- onUndo: D,
158
- onRedo: T,
166
+ k(r, "Update color palette"), f(o.name ?? null);
167
+ }, [t, k, f]), ce = y((o, e) => {
168
+ d(o), G(e || null);
169
+ }, [d]);
170
+ return ue({
171
+ onUndo: E,
172
+ onRedo: U,
159
173
  onSave: O,
160
174
  onDelete: () => {
161
- h && E(h);
175
+ g && R(g);
162
176
  },
163
- onDeselect: () => c(null)
164
- }), H(() => {
165
- const e = (o) => {
166
- if (o.data?.type !== "editor-navigate" || !o.data.href) return;
167
- const r = String(o.data.href);
177
+ onDeselect: () => d(null)
178
+ }), F(() => {
179
+ const o = (e) => {
180
+ if (e.data?.type !== "editor-navigate" || !e.data.href) return;
181
+ const r = String(e.data.href);
168
182
  if (!t) return;
169
183
  const a = r.match(/^(?:\/site)?\/p\/([^#?]+)/);
170
184
  if (a) {
171
- const l = a[1], n = t.pages.find((i) => i.slug === l);
172
- n && m(n.id);
185
+ const u = a[1], c = t.pages.find((n) => n.slug === u);
186
+ c && v(c.id);
173
187
  return;
174
188
  }
175
189
  if (r.startsWith("#")) {
176
- const l = r.slice(1);
177
- for (const n of t.pages)
178
- if (ue(n.structure || [], l)) {
179
- m(n.id), c(l);
190
+ const u = r.slice(1);
191
+ for (const c of t.pages)
192
+ if (me(c.structure || [], u)) {
193
+ v(c.id), d(u);
180
194
  break;
181
195
  }
182
196
  }
183
197
  };
184
- return window.addEventListener("message", e), () => window.removeEventListener("message", e);
185
- }, [t, m, c]), t ? /* @__PURE__ */ j("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: [
186
- /* @__PURE__ */ p(
187
- fe,
198
+ 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,
188
202
  {
189
- history: W,
190
- isSaving: ee,
191
- onUndo: D,
192
- onRedo: T,
203
+ history: z,
204
+ isSaving: te,
205
+ onUndo: E,
206
+ onRedo: U,
193
207
  onSave: O,
194
- onPublish: y ? re : void 0,
195
- onReset: B ? () => {
196
- const e = A(B);
197
- if (e) {
198
- S(K(e));
199
- const o = F[B];
200
- o && u(o);
208
+ onPublish: S ? le : void 0,
209
+ onReset: x ? () => {
210
+ const o = W(x);
211
+ if (o) {
212
+ B(M(o));
213
+ const e = K[x];
214
+ e && f(e);
201
215
  }
202
- } : X,
203
- showSelectionOverlay: N,
204
- onToggleSelectionOverlay: () => te((e) => !e)
216
+ } : Z,
217
+ showSelectionOverlay: A,
218
+ onToggleSelectionOverlay: () => ae((o) => !o)
205
219
  }
206
220
  ),
207
221
  /* @__PURE__ */ j("div", { className: "flex-1 flex overflow-hidden min-h-0 max-h-full", children: [
208
- /* @__PURE__ */ p(
209
- ge,
222
+ /* @__PURE__ */ h(
223
+ ke,
210
224
  {
211
- currentPage: d,
212
- selectedBlockId: h,
213
- isPaletteSelected: U,
214
- onSelectBlock: (e) => {
215
- c(e), R(null);
225
+ currentPage: m,
226
+ selectedBlockId: g,
227
+ isPaletteSelected: I,
228
+ onSelectBlock: (o) => {
229
+ d(o), G(null);
216
230
  },
217
- onDeleteBlock: E
231
+ onDeleteBlock: R
218
232
  }
219
233
  ),
220
- /* @__PURE__ */ p(
221
- ve,
234
+ /* @__PURE__ */ h(
235
+ Pe,
222
236
  {
223
237
  document: t,
224
- currentPageId: $,
225
- currentPage: d,
226
- selectedBlockId: h,
227
- onBlockClick: ne,
228
- onSelectPage: m,
238
+ currentPageId: D,
239
+ currentPage: m,
240
+ selectedBlockId: g,
241
+ onBlockClick: ce,
242
+ onSelectPage: v,
229
243
  onAddPage: () => {
230
- const e = prompt("Nome da página:");
231
- if (!e) return;
232
- const o = e.toLowerCase().replace(/\s+/g, "-");
233
- q(o, e, o);
244
+ const o = prompt("Nome da página:");
245
+ if (!o) return;
246
+ const e = o.toLowerCase().replace(/\s+/g, "-");
247
+ J(e, o, e);
234
248
  },
235
- onRemovePage: z,
236
- canRemovePage: J,
237
- onUpdateBlock: ae,
238
- activePlugins: Y,
239
- onActivatePlugin: Z,
240
- onDeactivatePlugin: _,
241
- showSelectionOverlay: N,
242
- focusedGroup: L
249
+ onRemovePage: Q,
250
+ canRemovePage: X,
251
+ onUpdateBlock: ne,
252
+ activePlugins: _,
253
+ onActivatePlugin: ee,
254
+ onDeactivatePlugin: oe,
255
+ showSelectionOverlay: A,
256
+ focusedGroup: N
243
257
  }
244
258
  ),
245
- /* @__PURE__ */ p(
246
- ke,
259
+ /* @__PURE__ */ h(
260
+ Ce,
247
261
  {
248
- isPaletteSelected: U,
249
- selectedBlock: V,
250
- selectedPalette: I ? de(I) : void 0,
251
- onPaletteChange: le,
252
- onUpdateBlock: Q,
253
- uploadConfig: b,
262
+ isPaletteSelected: I,
263
+ selectedBlock: q,
264
+ selectedPalette: L ? he(L) : void 0,
265
+ onPaletteChange: se,
266
+ onUpdateBlock: Y,
267
+ uploadConfig: $,
254
268
  document: t,
255
- currentPageId: $,
256
- focusedGroup: L
269
+ currentPageId: D,
270
+ focusedGroup: N
257
271
  }
258
272
  )
259
273
  ] })
260
- ] }) : /* @__PURE__ */ p("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: /* @__PURE__ */ p(ce, { onSelectTemplate: G }) });
274
+ ] }) : /* @__PURE__ */ h("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: /* @__PURE__ */ h(pe, { onSelectTemplate: H }) });
261
275
  }
262
276
  export {
263
277
  Oe as LandingPageEditor
@@ -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\n for (let pageIdx = 0; pageIdx < document.pages.length; pageIdx++) {\n const page = document.pages[pageIdx];\n if (!page?.structure) continue;\n for (let blockIdx = 0; blockIdx < page.structure.length; blockIdx++) {\n const block = page.structure[blockIdx];\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n\n if (block.type === \"hero\") {\n const variation = (block.props as any)?.variation || \"\";\n if (darkGradientVariations.has(variation)) {\n allPatches.push(\n { op: \"replace\", path: `${base}/background`, value: `linear-gradient(135deg, ${derived.heroGradientStart} 0%, ${derived.heroGradientEnd} 100%)` },\n { op: \"replace\", path: `${base}/titleColor`, value: derived.heroTitleColor },\n { op: \"replace\", path: `${base}/subtitleColor`, value: derived.heroSubtitleColor },\n { op: \"replace\", path: `${base}/descriptionColor`, value: derived.heroDescColor },\n );\n }\n } else if (block.type === \"navbar\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/bg`, value: derived.navbarBg },\n { op: \"replace\", path: `${base}/linkColor`, value: derived.themeColors.menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: derived.themeColors.primaryText },\n );\n } else if (block.type === \"footer\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.footerLinkHover },\n );\n }\n }\n }\n\n applyChange(allPatches, \"Update color palette\");\n setSelectedPalette(palette.name ?? null);\n }, [document, applyChange, setSelectedPalette]);\n\n // Handler para clique no preview (com grupo opcional para scroll-to-group)\n const handleBlockClick = useCallback((blockId: string, group?: string) => {\n setSelectedBlockId(blockId);\n setFocusedGroup(group || null);\n }, [setSelectedBlockId]);\n\n // Limpar focusedGroup quando o bloco selecionado muda (via seleção no painel esquerdo, etc.)\n // Nota: handleBlockClick já define o focusedGroup corretamente quando vem do preview\n\n // No editor: cliques em links no preview não navegam; trocam a página em edição\n // Keyboard shortcuts\n useKeyboardShortcuts({\n onUndo: handleUndo,\n onRedo: handleRedo,\n onSave: handleSave,\n onDelete: () => {\n if (selectedBlockId) {\n handleDeleteBlock(selectedBlockId);\n }\n },\n onDeselect: () => setSelectedBlockId(null),\n });\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== \"editor-navigate\" || !event.data.href) return;\n const href = String(event.data.href);\n if (!document) return;\n // Links internos: /site/p/:slug ou /p/:slug\n const match = href.match(/^(?:\\/site)?\\/p\\/([^#?]+)/);\n if (match) {\n const slug = match[1];\n const page = document.pages.find((p) => p.slug === slug);\n if (page) setCurrentPageId(page.id);\n return;\n }\n // Âncora #id: selecionar bloco com esse id e trocar para a página que o contém\n if (href.startsWith(\"#\")) {\n const id = href.slice(1);\n for (const p of document.pages) {\n if (findBlockInStructure(p.structure || [], id)) {\n setCurrentPageId(p.id);\n setSelectedBlockId(id);\n break;\n }\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [document, setCurrentPageId, setSelectedBlockId]);\n\n // Sem documento: mostrar seletor de templates\n if (!document) {\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n <TemplatePicker onSelectTemplate={handleSelectTemplate} />\n </div>\n );\n }\n\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n {/* Toolbar */}\n <Toolbar\n history={history}\n isSaving={isSaving}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onSave={handleSave}\n onPublish={onPublish ? handlePublish : undefined}\n onReset={\n currentTemplateId\n ? () => {\n // Recarregar o mesmo template\n const sharedDoc = getTemplate(currentTemplateId);\n if (sharedDoc) {\n loadDocument(sharedTemplateToEngineDocument(sharedDoc));\n const paletteName = templateDefaultPalette[currentTemplateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n }\n }\n : resetToTemplate\n }\n showSelectionOverlay={showSelectionOverlay}\n onToggleSelectionOverlay={() => setShowSelectionOverlay(prev => !prev)}\n />\n\n {/* Main Content - 3 Columns */}\n <div className=\"flex-1 flex overflow-hidden min-h-0 max-h-full\">\n {/* Left: Block Selector + Paletas */}\n <LeftPanel\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n isPaletteSelected={isPaletteSelected}\n onSelectBlock={(id) => { setSelectedBlockId(id); setFocusedGroup(null); }}\n onDeleteBlock={handleDeleteBlock}\n />\n\n {/* Center: Preview (apenas a página em edição) */}\n <CenterPanel\n document={document}\n currentPageId={currentPageId}\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n onBlockClick={handleBlockClick}\n onSelectPage={setCurrentPageId}\n onAddPage={() => {\n const name = prompt(\"Nome da página:\");\n if (!name) return;\n const slug = name.toLowerCase().replace(/\\s+/g, \"-\");\n const id = slug;\n addPage(id, name, slug);\n }}\n onRemovePage={removePage}\n canRemovePage={canRemovePage}\n onUpdateBlock={handleUpdateBlockById}\n activePlugins={activePlugins}\n onActivatePlugin={activatePlugin}\n onDeactivatePlugin={deactivatePlugin}\n showSelectionOverlay={showSelectionOverlay}\n focusedGroup={focusedGroup}\n />\n\n {/* Right: Editor Panel */}\n <RightPanel\n isPaletteSelected={isPaletteSelected}\n selectedBlock={selectedBlock}\n selectedPalette={selectedPalette ? findPaletteByName(selectedPalette) : undefined}\n onPaletteChange={handlePaletteChange}\n onUpdateBlock={handleUpdateBlock}\n uploadConfig={uploadConfig}\n document={document}\n currentPageId={currentPageId}\n focusedGroup={focusedGroup}\n />\n </div>\n </div>\n );\n}\n"],"names":["LandingPageEditor","initialData","defaultTemplateId","onSave","onPublish","uploadConfig","document","currentPageId","currentPage","selectedBlockId","selectedBlock","history","setCurrentPageId","addPage","removePage","canRemovePage","setSelectedBlockId","handleUndo","handleRedo","handleDeleteBlock","handleUpdateBlock","applyChange","resetToTemplate","isPaletteSelected","loadDocument","selectedPalette","setSelectedPalette","activePlugins","activatePlugin","deactivatePlugin","useEditorState","isSaving","setIsSaving","useState","currentTemplateId","setCurrentTemplateId","focusedGroup","setFocusedGroup","showSelectionOverlay","setShowSelectionOverlay","handleSelectTemplate","useCallback","templateId","sharedDoc","getTemplate","engineDoc","sharedTemplateToEngineDocument","paletteName","templateDefaultPalette","useEffect","handleSave","processedPages","page","block","processBlockDataURLs","processedDocument","error","logger","handlePublish","handleUpdateBlockById","blockId","updates","pageId","patch","PatchBuilder","handlePaletteChange","palette","derived","derivePaletteColors","allPatches","key","value","darkGradientVariations","pageIdx","blockIdx","base","variation","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","findPaletteByName","TemplatePicker"],"mappings":"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"}
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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"}
@@ -5,7 +5,7 @@ interface VariationSelectorProps {
5
5
  onUpdate: (updates: Record<string, any>) => void;
6
6
  }
7
7
  /**
8
- * Componente para selecionar variações de Hero e Navbar
8
+ * Componente para selecionar variações de blocos
9
9
  * Preserva props customizadas ao trocar variação
10
10
  */
11
11
  export declare const VariationSelector: React.NamedExoticComponent<VariationSelectorProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"VariationSelector.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/VariationSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAUrC,UAAU,sBAAsB;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CAClD;AAyGD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,oDAqI5B,CAAC"}
1
+ {"version":3,"file":"VariationSelector.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/VariationSelector.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAwBrC,UAAU,sBAAsB;IAC9B,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;CAClD;AA+PD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,oDAkM5B,CAAC"}