@brunoalz/smartgesti-site-editor 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/editor/LandingPageEditor.d.ts.map +1 -1
- package/dist/editor/LandingPageEditor.js +183 -169
- package/dist/editor/LandingPageEditor.js.map +1 -1
- package/dist/editor/PaletteSelector.d.ts +3 -0
- package/dist/editor/PaletteSelector.d.ts.map +1 -1
- package/dist/editor/PaletteSelector.js +114 -25
- package/dist/editor/PaletteSelector.js.map +1 -1
- package/dist/editor/components/RightPanel.d.ts +2 -0
- package/dist/editor/components/RightPanel.d.ts.map +1 -1
- package/dist/editor/components/RightPanel.js +23 -22
- package/dist/editor/components/RightPanel.js.map +1 -1
- package/dist/engine/export/exporters/content/AvatarExporter.js +2 -2
- package/dist/engine/export/exporters/content/AvatarExporter.js.map +1 -1
- package/dist/engine/export/exporters/content/BadgeExporter.js +11 -11
- package/dist/engine/export/exporters/content/BadgeExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/AdminSectionExporters.js +17 -17
- package/dist/engine/export/exporters/sections/AdminSectionExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/BlogPostExporters.js +34 -34
- package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/ContentGridExporters.js +16 -16
- package/dist/engine/export/exporters/sections/ContentGridExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/MarketingExporters.js +4 -4
- package/dist/engine/export/exporters/sections/MarketingExporters.js.map +1 -1
- package/dist/engine/render/renderers/content/BadgeRenderer.js +12 -12
- package/dist/engine/render/renderers/content/BadgeRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/AboutSectionRenderer.js +8 -8
- package/dist/engine/render/renderers/sections/AboutSectionRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/ContactSectionRenderer.js +52 -52
- package/dist/engine/render/renderers/sections/ContactSectionRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js +5 -5
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureRenderer.js +9 -9
- package/dist/engine/render/renderers/sections/FeatureRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js +5 -5
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js +17 -17
- package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js.map +1 -1
- package/dist/hooks/useEditorState.d.ts +2 -0
- package/dist/hooks/useEditorState.d.ts.map +1 -1
- package/dist/hooks/useEditorState.js +82 -77
- package/dist/hooks/useEditorState.js.map +1 -1
- package/dist/shared/templates/index.d.ts +4 -0
- package/dist/shared/templates/index.d.ts.map +1 -1
- package/dist/shared/templates/index.js +14 -7
- package/dist/shared/templates/index.js.map +1 -1
- package/dist/shared/templates/smartgesti-admin.d.ts.map +1 -1
- package/dist/shared/templates/smartgesti-admin.js +1 -4
- package/dist/shared/templates/smartgesti-admin.js.map +1 -1
- package/dist/utils/colorUtils.d.ts +73 -16
- package/dist/utils/colorUtils.d.ts.map +1 -1
- package/dist/utils/colorUtils.js +95 -9
- package/dist/utils/colorUtils.js.map +1 -1
- package/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;
|
|
1
|
+
{"version":3,"file":"LandingPageEditor.d.ts","sourceRoot":"","sources":["../../src/editor/LandingPageEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,EAAE,YAAY,EAAuB,MAAM,WAAW,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAYtD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,wDAAwD;IACxD,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAMD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,iBAAiB,EACjB,MAAM,EACN,SAAS,EACT,YAAY,GACb,EAAE,sBAAsB,2CAqUxB"}
|
|
@@ -1,251 +1,265 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import { TemplatePicker as
|
|
4
|
-
import { useEditorState as
|
|
5
|
-
import { useKeyboardShortcuts as
|
|
6
|
-
import { getTemplate as
|
|
1
|
+
import { jsx as p, jsxs as j } from "react/jsx-runtime";
|
|
2
|
+
import { useState as k, useCallback as P, useEffect as H } from "react";
|
|
3
|
+
import { TemplatePicker as ce } from "./TemplatePicker.js";
|
|
4
|
+
import { useEditorState as ie } from "../hooks/useEditorState.js";
|
|
5
|
+
import { useKeyboardShortcuts as pe } from "../hooks/useKeyboardShortcuts.js";
|
|
6
|
+
import { getTemplate as A, templateDefaultPalette as F } from "../shared/templates/index.js";
|
|
7
|
+
import { findPaletteByName as de } from "./PaletteSelector.js";
|
|
7
8
|
import { sharedTemplateToEngineDocument as K } from "../utils/sharedTemplateToEngine.js";
|
|
8
9
|
import { findBlockInStructure as ue } from "../utils/blockUtils.js";
|
|
9
|
-
import {
|
|
10
|
-
import { logger as
|
|
10
|
+
import { derivePaletteColors as he } from "../utils/colorUtils.js";
|
|
11
|
+
import { logger as x } from "../utils/logger.js";
|
|
11
12
|
import { processBlockDataURLs as me } from "../utils/dataURLUtils.js";
|
|
12
|
-
import { Toolbar as
|
|
13
|
-
import { LeftPanel as
|
|
14
|
-
import { CenterPanel as
|
|
15
|
-
import { RightPanel as
|
|
16
|
-
import { PatchBuilder as
|
|
17
|
-
function
|
|
18
|
-
initialData:
|
|
19
|
-
defaultTemplateId:
|
|
13
|
+
import { Toolbar as fe } from "./components/Toolbar.js";
|
|
14
|
+
import { LeftPanel as ge } from "./components/LeftPanel.js";
|
|
15
|
+
import { CenterPanel as ve } from "./components/CenterPanel.js";
|
|
16
|
+
import { RightPanel as ke } from "./components/RightPanel.js";
|
|
17
|
+
import { PatchBuilder as Pe } from "../engine/patch/PatchBuilder.js";
|
|
18
|
+
function Oe({
|
|
19
|
+
initialData: M,
|
|
20
|
+
defaultTemplateId: C,
|
|
20
21
|
onSave: w,
|
|
21
|
-
onPublish:
|
|
22
|
-
uploadConfig:
|
|
22
|
+
onPublish: y,
|
|
23
|
+
uploadConfig: b
|
|
23
24
|
}) {
|
|
24
25
|
const {
|
|
25
|
-
document:
|
|
26
|
-
currentPageId:
|
|
26
|
+
document: t,
|
|
27
|
+
currentPageId: $,
|
|
27
28
|
currentPage: d,
|
|
28
|
-
selectedBlockId:
|
|
29
|
-
selectedBlock:
|
|
30
|
-
history:
|
|
31
|
-
setCurrentPageId:
|
|
32
|
-
addPage:
|
|
33
|
-
removePage:
|
|
34
|
-
canRemovePage:
|
|
35
|
-
setSelectedBlockId:
|
|
29
|
+
selectedBlockId: h,
|
|
30
|
+
selectedBlock: V,
|
|
31
|
+
history: W,
|
|
32
|
+
setCurrentPageId: m,
|
|
33
|
+
addPage: q,
|
|
34
|
+
removePage: z,
|
|
35
|
+
canRemovePage: J,
|
|
36
|
+
setSelectedBlockId: c,
|
|
36
37
|
handleUndo: D,
|
|
37
|
-
handleRedo:
|
|
38
|
-
handleDeleteBlock:
|
|
39
|
-
handleUpdateBlock:
|
|
40
|
-
applyChange:
|
|
41
|
-
resetToTemplate:
|
|
42
|
-
isPaletteSelected:
|
|
38
|
+
handleRedo: T,
|
|
39
|
+
handleDeleteBlock: E,
|
|
40
|
+
handleUpdateBlock: Q,
|
|
41
|
+
applyChange: f,
|
|
42
|
+
resetToTemplate: X,
|
|
43
|
+
isPaletteSelected: U,
|
|
43
44
|
loadDocument: S,
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
45
|
+
selectedPalette: I,
|
|
46
|
+
setSelectedPalette: u,
|
|
47
|
+
activePlugins: Y,
|
|
48
|
+
activatePlugin: Z,
|
|
49
|
+
deactivatePlugin: _
|
|
50
|
+
} = ie({ initialData: M }), [ee, g] = k(!1), [B, oe] = k(
|
|
48
51
|
null
|
|
49
|
-
), [
|
|
52
|
+
), [L, R] = k(null), [N, te] = k(!1), G = P(
|
|
50
53
|
(e) => {
|
|
51
|
-
const
|
|
52
|
-
if (!
|
|
53
|
-
const
|
|
54
|
-
S(
|
|
54
|
+
const o = A(e);
|
|
55
|
+
if (!o) return;
|
|
56
|
+
const r = K(o);
|
|
57
|
+
S(r), oe(e);
|
|
58
|
+
const a = F[e];
|
|
59
|
+
a && u(a);
|
|
55
60
|
},
|
|
56
|
-
[S]
|
|
61
|
+
[S, u]
|
|
57
62
|
);
|
|
58
|
-
|
|
59
|
-
!
|
|
60
|
-
}, [
|
|
61
|
-
const
|
|
62
|
-
if (!(!
|
|
63
|
+
H(() => {
|
|
64
|
+
!t && C && G(C);
|
|
65
|
+
}, [C]);
|
|
66
|
+
const O = async () => {
|
|
67
|
+
if (!(!t || !w || !b)) {
|
|
63
68
|
g(!0);
|
|
64
69
|
try {
|
|
65
70
|
const e = await Promise.all(
|
|
66
|
-
(
|
|
67
|
-
...
|
|
71
|
+
(t.pages || []).map(async (r) => ({
|
|
72
|
+
...r,
|
|
68
73
|
structure: await Promise.all(
|
|
69
|
-
(
|
|
74
|
+
(r.structure || []).map((a) => me(a, b))
|
|
70
75
|
)
|
|
71
76
|
}))
|
|
72
|
-
),
|
|
73
|
-
...
|
|
77
|
+
), o = {
|
|
78
|
+
...t,
|
|
74
79
|
pages: e
|
|
75
80
|
};
|
|
76
|
-
await w(
|
|
81
|
+
await w(o);
|
|
77
82
|
} catch (e) {
|
|
78
|
-
throw
|
|
83
|
+
throw x.error("Error saving:", e), e;
|
|
79
84
|
} finally {
|
|
80
85
|
g(!1);
|
|
81
86
|
}
|
|
82
87
|
}
|
|
83
|
-
},
|
|
84
|
-
if (!(!
|
|
88
|
+
}, re = async () => {
|
|
89
|
+
if (!(!t || !y)) {
|
|
85
90
|
g(!0);
|
|
86
91
|
try {
|
|
87
|
-
await
|
|
92
|
+
await y(t);
|
|
88
93
|
} catch (e) {
|
|
89
|
-
|
|
94
|
+
x.error("Error publishing:", e);
|
|
90
95
|
} finally {
|
|
91
96
|
g(!1);
|
|
92
97
|
}
|
|
93
98
|
}
|
|
94
99
|
}, ae = P(
|
|
95
|
-
(e,
|
|
96
|
-
if (!
|
|
97
|
-
const
|
|
98
|
-
if (
|
|
100
|
+
(e, o) => {
|
|
101
|
+
if (!t || !d) return;
|
|
102
|
+
const r = d.id;
|
|
103
|
+
if (r)
|
|
99
104
|
try {
|
|
100
|
-
const
|
|
101
|
-
o,
|
|
105
|
+
const a = Pe.updateBlockProps(
|
|
102
106
|
t,
|
|
107
|
+
r,
|
|
103
108
|
e,
|
|
104
|
-
|
|
109
|
+
o
|
|
105
110
|
);
|
|
106
|
-
|
|
107
|
-
} catch (
|
|
108
|
-
|
|
111
|
+
a?.length && f(a, "Update block properties");
|
|
112
|
+
} catch (a) {
|
|
113
|
+
x.error("Error updating block:", a);
|
|
109
114
|
}
|
|
110
115
|
},
|
|
111
|
-
[
|
|
112
|
-
),
|
|
113
|
-
if (!
|
|
114
|
-
const
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
{ op: "replace", path: `${k}/linkColor`, value: a },
|
|
136
|
-
{ op: "replace", path: `${k}/linkHoverColor`, value: e.primary },
|
|
137
|
-
{ op: "replace", path: `${k}/buttonColor`, value: e.primary },
|
|
138
|
-
{ op: "replace", path: `${k}/buttonTextColor`, value: c }
|
|
116
|
+
[t, d, f]
|
|
117
|
+
), le = P((e) => {
|
|
118
|
+
if (!t) return;
|
|
119
|
+
const o = he(e), r = [];
|
|
120
|
+
for (const [l, n] of Object.entries(o.themeColors))
|
|
121
|
+
r.push({ op: "replace", path: `/theme/colors/${l}`, value: n });
|
|
122
|
+
const a = /* @__PURE__ */ new Set([
|
|
123
|
+
"hero-gradient",
|
|
124
|
+
"hero-parallax",
|
|
125
|
+
"hero-overlay",
|
|
126
|
+
"hero-carousel"
|
|
127
|
+
]);
|
|
128
|
+
for (let l = 0; l < t.pages.length; l++) {
|
|
129
|
+
const n = t.pages[l];
|
|
130
|
+
if (n?.structure)
|
|
131
|
+
for (let i = 0; i < n.structure.length; i++) {
|
|
132
|
+
const v = n.structure[i], s = `/pages/${l}/structure/${i}/props`;
|
|
133
|
+
if (v.type === "hero") {
|
|
134
|
+
const se = v.props?.variation || "";
|
|
135
|
+
a.has(se) && r.push(
|
|
136
|
+
{ op: "replace", path: `${s}/background`, value: `linear-gradient(135deg, ${o.heroGradientStart} 0%, ${o.heroGradientEnd} 100%)` },
|
|
137
|
+
{ op: "replace", path: `${s}/titleColor`, value: o.heroTitleColor },
|
|
138
|
+
{ op: "replace", path: `${s}/subtitleColor`, value: o.heroSubtitleColor },
|
|
139
|
+
{ op: "replace", path: `${s}/descriptionColor`, value: o.heroDescColor }
|
|
139
140
|
);
|
|
140
|
-
}
|
|
141
|
-
|
|
141
|
+
} else v.type === "navbar" ? r.push(
|
|
142
|
+
{ op: "replace", path: `${s}/bg`, value: o.navbarBg },
|
|
143
|
+
{ op: "replace", path: `${s}/linkColor`, value: o.themeColors.menuLinkColor },
|
|
144
|
+
{ op: "replace", path: `${s}/linkHoverColor`, value: o.themeColors.primary },
|
|
145
|
+
{ op: "replace", path: `${s}/buttonColor`, value: o.themeColors.primary },
|
|
146
|
+
{ op: "replace", path: `${s}/buttonTextColor`, value: o.themeColors.primaryText }
|
|
147
|
+
) : v.type === "footer" && r.push(
|
|
148
|
+
{ op: "replace", path: `${s}/linkHoverColor`, value: o.footerLinkHover }
|
|
149
|
+
);
|
|
150
|
+
}
|
|
142
151
|
}
|
|
143
|
-
|
|
144
|
-
}, [
|
|
145
|
-
|
|
146
|
-
}, [
|
|
147
|
-
return
|
|
152
|
+
f(r, "Update color palette"), u(e.name ?? null);
|
|
153
|
+
}, [t, f, u]), ne = P((e, o) => {
|
|
154
|
+
c(e), R(o || null);
|
|
155
|
+
}, [c]);
|
|
156
|
+
return pe({
|
|
148
157
|
onUndo: D,
|
|
149
|
-
onRedo:
|
|
150
|
-
onSave:
|
|
158
|
+
onRedo: T,
|
|
159
|
+
onSave: O,
|
|
151
160
|
onDelete: () => {
|
|
152
|
-
|
|
161
|
+
h && E(h);
|
|
153
162
|
},
|
|
154
|
-
onDeselect: () =>
|
|
155
|
-
}),
|
|
156
|
-
const e = (
|
|
157
|
-
if (
|
|
158
|
-
const
|
|
159
|
-
if (!
|
|
160
|
-
const
|
|
161
|
-
if (
|
|
162
|
-
const
|
|
163
|
-
|
|
163
|
+
onDeselect: () => c(null)
|
|
164
|
+
}), H(() => {
|
|
165
|
+
const e = (o) => {
|
|
166
|
+
if (o.data?.type !== "editor-navigate" || !o.data.href) return;
|
|
167
|
+
const r = String(o.data.href);
|
|
168
|
+
if (!t) return;
|
|
169
|
+
const a = r.match(/^(?:\/site)?\/p\/([^#?]+)/);
|
|
170
|
+
if (a) {
|
|
171
|
+
const l = a[1], n = t.pages.find((i) => i.slug === l);
|
|
172
|
+
n && m(n.id);
|
|
164
173
|
return;
|
|
165
174
|
}
|
|
166
|
-
if (
|
|
167
|
-
const
|
|
168
|
-
for (const
|
|
169
|
-
if (ue(
|
|
170
|
-
|
|
175
|
+
if (r.startsWith("#")) {
|
|
176
|
+
const l = r.slice(1);
|
|
177
|
+
for (const n of t.pages)
|
|
178
|
+
if (ue(n.structure || [], l)) {
|
|
179
|
+
m(n.id), c(l);
|
|
171
180
|
break;
|
|
172
181
|
}
|
|
173
182
|
}
|
|
174
183
|
};
|
|
175
184
|
return window.addEventListener("message", e), () => window.removeEventListener("message", e);
|
|
176
|
-
}, [
|
|
177
|
-
/* @__PURE__ */
|
|
178
|
-
|
|
185
|
+
}, [t, m, c]), t ? /* @__PURE__ */ j("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: [
|
|
186
|
+
/* @__PURE__ */ p(
|
|
187
|
+
fe,
|
|
179
188
|
{
|
|
180
|
-
history:
|
|
181
|
-
isSaving:
|
|
189
|
+
history: W,
|
|
190
|
+
isSaving: ee,
|
|
182
191
|
onUndo: D,
|
|
183
|
-
onRedo:
|
|
184
|
-
onSave:
|
|
185
|
-
onPublish:
|
|
186
|
-
onReset:
|
|
187
|
-
const e =
|
|
188
|
-
|
|
189
|
-
|
|
192
|
+
onRedo: T,
|
|
193
|
+
onSave: O,
|
|
194
|
+
onPublish: y ? re : void 0,
|
|
195
|
+
onReset: B ? () => {
|
|
196
|
+
const e = A(B);
|
|
197
|
+
if (e) {
|
|
198
|
+
S(K(e));
|
|
199
|
+
const o = F[B];
|
|
200
|
+
o && u(o);
|
|
201
|
+
}
|
|
202
|
+
} : X,
|
|
190
203
|
showSelectionOverlay: N,
|
|
191
204
|
onToggleSelectionOverlay: () => te((e) => !e)
|
|
192
205
|
}
|
|
193
206
|
),
|
|
194
|
-
/* @__PURE__ */
|
|
195
|
-
/* @__PURE__ */
|
|
196
|
-
|
|
207
|
+
/* @__PURE__ */ j("div", { className: "flex-1 flex overflow-hidden min-h-0 max-h-full", children: [
|
|
208
|
+
/* @__PURE__ */ p(
|
|
209
|
+
ge,
|
|
197
210
|
{
|
|
198
211
|
currentPage: d,
|
|
199
|
-
selectedBlockId:
|
|
200
|
-
isPaletteSelected:
|
|
212
|
+
selectedBlockId: h,
|
|
213
|
+
isPaletteSelected: U,
|
|
201
214
|
onSelectBlock: (e) => {
|
|
202
|
-
|
|
215
|
+
c(e), R(null);
|
|
203
216
|
},
|
|
204
|
-
onDeleteBlock:
|
|
217
|
+
onDeleteBlock: E
|
|
205
218
|
}
|
|
206
219
|
),
|
|
207
|
-
/* @__PURE__ */
|
|
208
|
-
|
|
220
|
+
/* @__PURE__ */ p(
|
|
221
|
+
ve,
|
|
209
222
|
{
|
|
210
|
-
document:
|
|
211
|
-
currentPageId:
|
|
223
|
+
document: t,
|
|
224
|
+
currentPageId: $,
|
|
212
225
|
currentPage: d,
|
|
213
|
-
selectedBlockId:
|
|
214
|
-
onBlockClick:
|
|
215
|
-
onSelectPage:
|
|
226
|
+
selectedBlockId: h,
|
|
227
|
+
onBlockClick: ne,
|
|
228
|
+
onSelectPage: m,
|
|
216
229
|
onAddPage: () => {
|
|
217
230
|
const e = prompt("Nome da página:");
|
|
218
231
|
if (!e) return;
|
|
219
|
-
const
|
|
220
|
-
|
|
232
|
+
const o = e.toLowerCase().replace(/\s+/g, "-");
|
|
233
|
+
q(o, e, o);
|
|
221
234
|
},
|
|
222
|
-
onRemovePage:
|
|
223
|
-
canRemovePage:
|
|
235
|
+
onRemovePage: z,
|
|
236
|
+
canRemovePage: J,
|
|
224
237
|
onUpdateBlock: ae,
|
|
225
|
-
activePlugins:
|
|
226
|
-
onActivatePlugin:
|
|
227
|
-
onDeactivatePlugin:
|
|
238
|
+
activePlugins: Y,
|
|
239
|
+
onActivatePlugin: Z,
|
|
240
|
+
onDeactivatePlugin: _,
|
|
228
241
|
showSelectionOverlay: N,
|
|
229
|
-
focusedGroup:
|
|
242
|
+
focusedGroup: L
|
|
230
243
|
}
|
|
231
244
|
),
|
|
232
|
-
/* @__PURE__ */
|
|
233
|
-
|
|
245
|
+
/* @__PURE__ */ p(
|
|
246
|
+
ke,
|
|
234
247
|
{
|
|
235
|
-
isPaletteSelected:
|
|
236
|
-
selectedBlock:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
248
|
+
isPaletteSelected: U,
|
|
249
|
+
selectedBlock: V,
|
|
250
|
+
selectedPalette: I ? de(I) : void 0,
|
|
251
|
+
onPaletteChange: le,
|
|
252
|
+
onUpdateBlock: Q,
|
|
253
|
+
uploadConfig: b,
|
|
254
|
+
document: t,
|
|
255
|
+
currentPageId: $,
|
|
256
|
+
focusedGroup: L
|
|
243
257
|
}
|
|
244
258
|
)
|
|
245
259
|
] })
|
|
246
|
-
] }) : /* @__PURE__ */
|
|
260
|
+
] }) : /* @__PURE__ */ p("div", { className: "h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden", children: /* @__PURE__ */ p(ce, { onSelectTemplate: G }) });
|
|
247
261
|
}
|
|
248
262
|
export {
|
|
249
|
-
|
|
263
|
+
Oe as LandingPageEditor
|
|
250
264
|
};
|
|
251
265
|
//# sourceMappingURL=LandingPageEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LandingPageEditor.js","sources":["../../src/editor/LandingPageEditor.tsx"],"sourcesContent":["/**\n * Landing Page Editor\n * Editor de landing pages usando block engine\n */\n\nimport { useState, useCallback, useEffect, lazy, Suspense } from \"react\";\nimport { TemplatePicker } from \"./TemplatePicker\";\nimport { Toolbar, LeftPanel, CenterPanel, RightPanel } from \"./components\";\nimport { useEditorState } from \"../hooks/useEditorState\";\nimport { useKeyboardShortcuts } from \"../hooks/useKeyboardShortcuts\";\nimport { LoadingSpinner } from \"./components/LoadingSpinner\";\nimport { SiteDocument, PatchBuilder, Block } from \"../engine\";\nimport { getTemplate } from \"../shared/templates\";\nimport type { TemplateId } from \"../shared/templates\";\nimport { sharedTemplateToEngineDocument } from \"../utils/sharedTemplateToEngine\";\nimport { findBlockInStructure } from \"../utils/blockUtils\";\nimport { isLightColor } from \"../utils/colorUtils\";\nimport { logger } from \"../utils/logger\";\nimport { processBlockDataURLs } from \"../utils/dataURLUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UploadConfig {\n tenantId?: string;\n schoolId?: string;\n siteId?: string | null;\n authToken?: string;\n}\n\nexport interface LandingPageEditorProps {\n initialData?: SiteDocument;\n /** ID do template a carregar quando não houver initialData (ex.: \"escola-edvi\") */\n defaultTemplateId?: TemplateId;\n onSave?: (data: SiteDocument) => Promise<void>;\n onPublish?: (data: SiteDocument) => Promise<void>;\n /** Configuração para upload seguro de imagens/vídeos */\n uploadConfig?: UploadConfig;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LandingPageEditor({\n initialData,\n defaultTemplateId,\n onSave,\n onPublish,\n uploadConfig,\n}: LandingPageEditorProps) {\n // Hook de estado do editor (edição por páginas; sem navegação)\n const {\n document,\n currentPageId,\n currentPage,\n selectedBlockId,\n selectedBlock,\n history,\n setCurrentPageId,\n addPage,\n removePage,\n canRemovePage,\n setSelectedBlockId,\n handleUndo,\n handleRedo,\n handleDeleteBlock,\n handleUpdateBlock,\n applyChange,\n resetToTemplate,\n isPaletteSelected,\n loadDocument,\n activePlugins,\n activatePlugin,\n deactivatePlugin,\n } = useEditorState({ initialData });\n\n // Estado local da UI\n const [isSaving, setIsSaving] = useState(false);\n const [currentTemplateId, setCurrentTemplateId] = useState<TemplateId | null>(\n null,\n );\n const [focusedGroup, setFocusedGroup] = useState<string | null>(null);\n const [showSelectionOverlay, setShowSelectionOverlay] = useState(false);\n\n // Carregar template escolhido (converter shared → engine e carregar no editor)\n const handleSelectTemplate = useCallback(\n (templateId: TemplateId) => {\n const sharedDoc = getTemplate(templateId);\n if (!sharedDoc) return;\n const engineDoc = sharedTemplateToEngineDocument(sharedDoc);\n loadDocument(engineDoc);\n setCurrentTemplateId(templateId);\n },\n [loadDocument],\n );\n\n // Ao montar sem documento: carregar defaultTemplateId se informado\n useEffect(() => {\n if (!document && defaultTemplateId) {\n handleSelectTemplate(defaultTemplateId);\n }\n }, [defaultTemplateId]); // eslint-disable-line react-hooks/exhaustive-deps -- carregar só uma vez quando defaultTemplateId existe\n\n // Handlers de save/publish\n const handleSave = async () => {\n if (!document || !onSave || !uploadConfig) return;\n setIsSaving(true);\n try {\n // Processar o documento para fazer upload de todos os Data URLs\n const processedPages = await Promise.all(\n (document.pages || []).map(async (page) => ({\n ...page,\n structure: await Promise.all(\n (page.structure || []).map((block) => processBlockDataURLs(block, uploadConfig))\n ),\n }))\n );\n\n const processedDocument = {\n ...document,\n pages: processedPages,\n };\n\n await onSave(processedDocument);\n } catch (error) {\n logger.error(\"Error saving:\", error);\n throw error;\n } finally {\n setIsSaving(false);\n }\n };\n\n const handlePublish = async () => {\n if (!document || !onPublish) return;\n setIsSaving(true);\n try {\n await onPublish(document);\n } catch (error) {\n logger.error(\"Error publishing:\", error);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Handler para atualizar um bloco específico\n const handleUpdateBlockById = useCallback(\n (blockId: string, updates: Record<string, any>) => {\n if (!document || !currentPage) return;\n const pageId = (currentPage as any).id;\n if (!pageId) return;\n\n try {\n const patch = PatchBuilder.updateBlockProps(\n document,\n pageId,\n blockId,\n updates\n );\n if (patch?.length) {\n applyChange(patch, \"Update block properties\");\n }\n } catch (error) {\n logger.error(\"Error updating block:\", error);\n }\n },\n [document, currentPage, applyChange]\n );\n\n // Handler para atualizar paleta de cores (inclui mutedText, primaryText, linkColor e menuLinkColor)\n // Também atualiza links e botões do navbar para refletir a paleta escolhida\n const handlePaletteChange = useCallback((palette: any) => {\n if (!document) return;\n const bgLight = isLightColor(palette.background ?? \"#ffffff\");\n const primaryLight = isLightColor(palette.primary ?? \"#3b82f6\");\n const mutedText = bgLight ? \"#6b7280\" : \"#9ca3af\";\n const primaryText = primaryLight ? \"#1f2937\" : \"#ffffff\";\n const menuLinkColor = palette.menuLinkColor || palette.primary;\n\n // Construir todas as operações de patch em um único array\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allPatches: Array<{ op: \"replace\"; path: string; value: any }> = [];\n\n // 1. Theme color updates\n const themeColors = document.theme.colors;\n const newColors: Record<string, string> = {\n primary: palette.primary,\n secondary: palette.secondary,\n accent: palette.accent,\n bg: palette.background,\n surface: palette.surface || themeColors.surface || \"#f8fafc\",\n text: palette.text || themeColors.text || \"#1e293b\",\n mutedText,\n primaryText,\n linkColor: palette.linkColor || palette.primary,\n menuLinkColor,\n };\n for (const [key, value] of Object.entries(newColors)) {\n allPatches.push({ op: \"replace\", path: `/theme/colors/${key}`, value });\n }\n\n // 2. Navbar link/button color updates (todas as páginas)\n for (let pageIdx = 0; pageIdx < document.pages.length; pageIdx++) {\n const page = document.pages[pageIdx];\n if (!page?.structure) continue;\n for (let blockIdx = 0; blockIdx < page.structure.length; blockIdx++) {\n if (page.structure[blockIdx].type === \"navbar\") {\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n allPatches.push(\n { op: \"replace\", path: `${base}/linkColor`, value: menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: palette.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: palette.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: primaryText },\n );\n }\n }\n }\n\n applyChange(allPatches, \"Update color palette\");\n }, [document, applyChange]);\n\n // Handler para clique no preview (com grupo opcional para scroll-to-group)\n const handleBlockClick = useCallback((blockId: string, group?: string) => {\n setSelectedBlockId(blockId);\n setFocusedGroup(group || null);\n }, [setSelectedBlockId]);\n\n // Limpar focusedGroup quando o bloco selecionado muda (via seleção no painel esquerdo, etc.)\n // Nota: handleBlockClick já define o focusedGroup corretamente quando vem do preview\n\n // No editor: cliques em links no preview não navegam; trocam a página em edição\n // Keyboard shortcuts\n useKeyboardShortcuts({\n onUndo: handleUndo,\n onRedo: handleRedo,\n onSave: handleSave,\n onDelete: () => {\n if (selectedBlockId) {\n handleDeleteBlock(selectedBlockId);\n }\n },\n onDeselect: () => setSelectedBlockId(null),\n });\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== \"editor-navigate\" || !event.data.href) return;\n const href = String(event.data.href);\n if (!document) return;\n // Links internos: /site/p/:slug ou /p/:slug\n const match = href.match(/^(?:\\/site)?\\/p\\/([^#?]+)/);\n if (match) {\n const slug = match[1];\n const page = document.pages.find((p) => p.slug === slug);\n if (page) setCurrentPageId(page.id);\n return;\n }\n // Âncora #id: selecionar bloco com esse id e trocar para a página que o contém\n if (href.startsWith(\"#\")) {\n const id = href.slice(1);\n for (const p of document.pages) {\n if (findBlockInStructure(p.structure || [], id)) {\n setCurrentPageId(p.id);\n setSelectedBlockId(id);\n break;\n }\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [document, setCurrentPageId, setSelectedBlockId]);\n\n // Sem documento: mostrar seletor de templates\n if (!document) {\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n <TemplatePicker onSelectTemplate={handleSelectTemplate} />\n </div>\n );\n }\n\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n {/* Toolbar */}\n <Toolbar\n history={history}\n isSaving={isSaving}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onSave={handleSave}\n onPublish={onPublish ? handlePublish : undefined}\n onReset={\n currentTemplateId\n ? () => {\n // Recarregar o mesmo template\n const sharedDoc = getTemplate(currentTemplateId);\n if (sharedDoc)\n loadDocument(sharedTemplateToEngineDocument(sharedDoc));\n }\n : resetToTemplate\n }\n showSelectionOverlay={showSelectionOverlay}\n onToggleSelectionOverlay={() => setShowSelectionOverlay(prev => !prev)}\n />\n\n {/* Main Content - 3 Columns */}\n <div className=\"flex-1 flex overflow-hidden min-h-0 max-h-full\">\n {/* Left: Block Selector + Paletas */}\n <LeftPanel\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n isPaletteSelected={isPaletteSelected}\n onSelectBlock={(id) => { setSelectedBlockId(id); setFocusedGroup(null); }}\n onDeleteBlock={handleDeleteBlock}\n />\n\n {/* Center: Preview (apenas a página em edição) */}\n <CenterPanel\n document={document}\n currentPageId={currentPageId}\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n onBlockClick={handleBlockClick}\n onSelectPage={setCurrentPageId}\n onAddPage={() => {\n const name = prompt(\"Nome da página:\");\n if (!name) return;\n const slug = name.toLowerCase().replace(/\\s+/g, \"-\");\n const id = slug;\n addPage(id, name, slug);\n }}\n onRemovePage={removePage}\n canRemovePage={canRemovePage}\n onUpdateBlock={handleUpdateBlockById}\n activePlugins={activePlugins}\n onActivatePlugin={activatePlugin}\n onDeactivatePlugin={deactivatePlugin}\n showSelectionOverlay={showSelectionOverlay}\n focusedGroup={focusedGroup}\n />\n\n {/* Right: Editor Panel */}\n <RightPanel\n isPaletteSelected={isPaletteSelected}\n selectedBlock={selectedBlock}\n onPaletteChange={handlePaletteChange}\n onUpdateBlock={handleUpdateBlock}\n uploadConfig={uploadConfig}\n document={document}\n currentPageId={currentPageId}\n focusedGroup={focusedGroup}\n />\n </div>\n </div>\n );\n}\n"],"names":["LandingPageEditor","initialData","defaultTemplateId","onSave","onPublish","uploadConfig","document","currentPageId","currentPage","selectedBlockId","selectedBlock","history","setCurrentPageId","addPage","removePage","canRemovePage","setSelectedBlockId","handleUndo","handleRedo","handleDeleteBlock","handleUpdateBlock","applyChange","resetToTemplate","isPaletteSelected","loadDocument","activePlugins","activatePlugin","deactivatePlugin","useEditorState","isSaving","setIsSaving","useState","currentTemplateId","setCurrentTemplateId","focusedGroup","setFocusedGroup","showSelectionOverlay","setShowSelectionOverlay","handleSelectTemplate","useCallback","templateId","sharedDoc","getTemplate","engineDoc","sharedTemplateToEngineDocument","useEffect","handleSave","processedPages","page","block","processBlockDataURLs","processedDocument","error","logger","handlePublish","handleUpdateBlockById","blockId","updates","pageId","patch","PatchBuilder","handlePaletteChange","palette","bgLight","isLightColor","primaryLight","mutedText","primaryText","menuLinkColor","allPatches","themeColors","newColors","key","value","pageIdx","blockIdx","base","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","TemplatePicker"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LandingPageEditor.js","sources":["../../src/editor/LandingPageEditor.tsx"],"sourcesContent":["/**\n * Landing Page Editor\n * Editor de landing pages usando block engine\n */\n\nimport { useState, useCallback, useEffect, lazy, Suspense } from \"react\";\nimport { TemplatePicker } from \"./TemplatePicker\";\nimport { Toolbar, LeftPanel, CenterPanel, RightPanel } from \"./components\";\nimport { useEditorState } from \"../hooks/useEditorState\";\nimport { useKeyboardShortcuts } from \"../hooks/useKeyboardShortcuts\";\nimport { LoadingSpinner } from \"./components/LoadingSpinner\";\nimport { SiteDocument, PatchBuilder, Block } from \"../engine\";\nimport { getTemplate, templateDefaultPalette } from \"../shared/templates\";\nimport type { TemplateId } from \"../shared/templates\";\nimport { findPaletteByName } from \"./PaletteSelector\";\nimport { sharedTemplateToEngineDocument } from \"../utils/sharedTemplateToEngine\";\nimport { findBlockInStructure } from \"../utils/blockUtils\";\nimport { derivePaletteColors } from \"../utils/colorUtils\";\nimport { logger } from \"../utils/logger\";\nimport { processBlockDataURLs } from \"../utils/dataURLUtils\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface UploadConfig {\n tenantId?: string;\n schoolId?: string;\n siteId?: string | null;\n authToken?: string;\n}\n\nexport interface LandingPageEditorProps {\n initialData?: SiteDocument;\n /** ID do template a carregar quando não houver initialData (ex.: \"escola-edvi\") */\n defaultTemplateId?: TemplateId;\n onSave?: (data: SiteDocument) => Promise<void>;\n onPublish?: (data: SiteDocument) => Promise<void>;\n /** Configuração para upload seguro de imagens/vídeos */\n uploadConfig?: UploadConfig;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\nexport function LandingPageEditor({\n initialData,\n defaultTemplateId,\n onSave,\n onPublish,\n uploadConfig,\n}: LandingPageEditorProps) {\n // Hook de estado do editor (edição por páginas; sem navegação)\n const {\n document,\n currentPageId,\n currentPage,\n selectedBlockId,\n selectedBlock,\n history,\n setCurrentPageId,\n addPage,\n removePage,\n canRemovePage,\n setSelectedBlockId,\n handleUndo,\n handleRedo,\n handleDeleteBlock,\n handleUpdateBlock,\n applyChange,\n resetToTemplate,\n isPaletteSelected,\n loadDocument,\n selectedPalette,\n setSelectedPalette,\n activePlugins,\n activatePlugin,\n deactivatePlugin,\n } = useEditorState({ initialData });\n\n // Estado local da UI\n const [isSaving, setIsSaving] = useState(false);\n const [currentTemplateId, setCurrentTemplateId] = useState<TemplateId | null>(\n null,\n );\n const [focusedGroup, setFocusedGroup] = useState<string | null>(null);\n const [showSelectionOverlay, setShowSelectionOverlay] = useState(false);\n\n // Carregar template escolhido (converter shared → engine e carregar no editor)\n const handleSelectTemplate = useCallback(\n (templateId: TemplateId) => {\n const sharedDoc = getTemplate(templateId);\n if (!sharedDoc) return;\n const engineDoc = sharedTemplateToEngineDocument(sharedDoc);\n loadDocument(engineDoc);\n setCurrentTemplateId(templateId);\n\n // Auto-selecionar paleta correspondente ao template\n const paletteName = templateDefaultPalette[templateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n },\n [loadDocument, setSelectedPalette],\n );\n\n // Ao montar sem documento: carregar defaultTemplateId se informado\n useEffect(() => {\n if (!document && defaultTemplateId) {\n handleSelectTemplate(defaultTemplateId);\n }\n }, [defaultTemplateId]); // eslint-disable-line react-hooks/exhaustive-deps -- carregar só uma vez quando defaultTemplateId existe\n\n // Handlers de save/publish\n const handleSave = async () => {\n if (!document || !onSave || !uploadConfig) return;\n setIsSaving(true);\n try {\n // Processar o documento para fazer upload de todos os Data URLs\n const processedPages = await Promise.all(\n (document.pages || []).map(async (page) => ({\n ...page,\n structure: await Promise.all(\n (page.structure || []).map((block) => processBlockDataURLs(block, uploadConfig))\n ),\n }))\n );\n\n const processedDocument = {\n ...document,\n pages: processedPages,\n };\n\n await onSave(processedDocument);\n } catch (error) {\n logger.error(\"Error saving:\", error);\n throw error;\n } finally {\n setIsSaving(false);\n }\n };\n\n const handlePublish = async () => {\n if (!document || !onPublish) return;\n setIsSaving(true);\n try {\n await onPublish(document);\n } catch (error) {\n logger.error(\"Error publishing:\", error);\n } finally {\n setIsSaving(false);\n }\n };\n\n // Handler para atualizar um bloco específico\n const handleUpdateBlockById = useCallback(\n (blockId: string, updates: Record<string, any>) => {\n if (!document || !currentPage) return;\n const pageId = (currentPage as any).id;\n if (!pageId) return;\n\n try {\n const patch = PatchBuilder.updateBlockProps(\n document,\n pageId,\n blockId,\n updates\n );\n if (patch?.length) {\n applyChange(patch, \"Update block properties\");\n }\n } catch (error) {\n logger.error(\"Error updating block:\", error);\n }\n },\n [document, currentPage, applyChange]\n );\n\n // Handler para atualizar paleta de cores\n // Usa derivePaletteColors() para derivar todas as cores e patcha Hero/Navbar/Footer alem do theme\n const handlePaletteChange = useCallback((palette: any) => {\n if (!document) return;\n const derived = derivePaletteColors(palette);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const allPatches: Array<{ op: \"replace\"; path: string; value: any }> = [];\n\n // 1. Theme color updates\n for (const [key, value] of Object.entries(derived.themeColors)) {\n allPatches.push({ op: \"replace\", path: `/theme/colors/${key}`, value });\n }\n\n // 2. Block-level patches (todas as paginas)\n // Hero variations that use dark gradient backgrounds\n const darkGradientVariations = new Set([\n \"hero-gradient\", \"hero-parallax\", \"hero-overlay\", \"hero-carousel\",\n ]);\n\n for (let pageIdx = 0; pageIdx < document.pages.length; pageIdx++) {\n const page = document.pages[pageIdx];\n if (!page?.structure) continue;\n for (let blockIdx = 0; blockIdx < page.structure.length; blockIdx++) {\n const block = page.structure[blockIdx];\n const base = `/pages/${pageIdx}/structure/${blockIdx}/props`;\n\n if (block.type === \"hero\") {\n const variation = (block.props as any)?.variation || \"\";\n if (darkGradientVariations.has(variation)) {\n allPatches.push(\n { op: \"replace\", path: `${base}/background`, value: `linear-gradient(135deg, ${derived.heroGradientStart} 0%, ${derived.heroGradientEnd} 100%)` },\n { op: \"replace\", path: `${base}/titleColor`, value: derived.heroTitleColor },\n { op: \"replace\", path: `${base}/subtitleColor`, value: derived.heroSubtitleColor },\n { op: \"replace\", path: `${base}/descriptionColor`, value: derived.heroDescColor },\n );\n }\n } else if (block.type === \"navbar\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/bg`, value: derived.navbarBg },\n { op: \"replace\", path: `${base}/linkColor`, value: derived.themeColors.menuLinkColor },\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonColor`, value: derived.themeColors.primary },\n { op: \"replace\", path: `${base}/buttonTextColor`, value: derived.themeColors.primaryText },\n );\n } else if (block.type === \"footer\") {\n allPatches.push(\n { op: \"replace\", path: `${base}/linkHoverColor`, value: derived.footerLinkHover },\n );\n }\n }\n }\n\n applyChange(allPatches, \"Update color palette\");\n setSelectedPalette(palette.name ?? null);\n }, [document, applyChange, setSelectedPalette]);\n\n // Handler para clique no preview (com grupo opcional para scroll-to-group)\n const handleBlockClick = useCallback((blockId: string, group?: string) => {\n setSelectedBlockId(blockId);\n setFocusedGroup(group || null);\n }, [setSelectedBlockId]);\n\n // Limpar focusedGroup quando o bloco selecionado muda (via seleção no painel esquerdo, etc.)\n // Nota: handleBlockClick já define o focusedGroup corretamente quando vem do preview\n\n // No editor: cliques em links no preview não navegam; trocam a página em edição\n // Keyboard shortcuts\n useKeyboardShortcuts({\n onUndo: handleUndo,\n onRedo: handleRedo,\n onSave: handleSave,\n onDelete: () => {\n if (selectedBlockId) {\n handleDeleteBlock(selectedBlockId);\n }\n },\n onDeselect: () => setSelectedBlockId(null),\n });\n\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type !== \"editor-navigate\" || !event.data.href) return;\n const href = String(event.data.href);\n if (!document) return;\n // Links internos: /site/p/:slug ou /p/:slug\n const match = href.match(/^(?:\\/site)?\\/p\\/([^#?]+)/);\n if (match) {\n const slug = match[1];\n const page = document.pages.find((p) => p.slug === slug);\n if (page) setCurrentPageId(page.id);\n return;\n }\n // Âncora #id: selecionar bloco com esse id e trocar para a página que o contém\n if (href.startsWith(\"#\")) {\n const id = href.slice(1);\n for (const p of document.pages) {\n if (findBlockInStructure(p.structure || [], id)) {\n setCurrentPageId(p.id);\n setSelectedBlockId(id);\n break;\n }\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, [document, setCurrentPageId, setSelectedBlockId]);\n\n // Sem documento: mostrar seletor de templates\n if (!document) {\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n <TemplatePicker onSelectTemplate={handleSelectTemplate} />\n </div>\n );\n }\n\n return (\n <div className=\"h-[91vh] max-h-[91vh] flex flex-col bg-background overflow-hidden\">\n {/* Toolbar */}\n <Toolbar\n history={history}\n isSaving={isSaving}\n onUndo={handleUndo}\n onRedo={handleRedo}\n onSave={handleSave}\n onPublish={onPublish ? handlePublish : undefined}\n onReset={\n currentTemplateId\n ? () => {\n // Recarregar o mesmo template\n const sharedDoc = getTemplate(currentTemplateId);\n if (sharedDoc) {\n loadDocument(sharedTemplateToEngineDocument(sharedDoc));\n const paletteName = templateDefaultPalette[currentTemplateId];\n if (paletteName) {\n setSelectedPalette(paletteName);\n }\n }\n }\n : resetToTemplate\n }\n showSelectionOverlay={showSelectionOverlay}\n onToggleSelectionOverlay={() => setShowSelectionOverlay(prev => !prev)}\n />\n\n {/* Main Content - 3 Columns */}\n <div className=\"flex-1 flex overflow-hidden min-h-0 max-h-full\">\n {/* Left: Block Selector + Paletas */}\n <LeftPanel\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n isPaletteSelected={isPaletteSelected}\n onSelectBlock={(id) => { setSelectedBlockId(id); setFocusedGroup(null); }}\n onDeleteBlock={handleDeleteBlock}\n />\n\n {/* Center: Preview (apenas a página em edição) */}\n <CenterPanel\n document={document}\n currentPageId={currentPageId}\n currentPage={currentPage}\n selectedBlockId={selectedBlockId}\n onBlockClick={handleBlockClick}\n onSelectPage={setCurrentPageId}\n onAddPage={() => {\n const name = prompt(\"Nome da página:\");\n if (!name) return;\n const slug = name.toLowerCase().replace(/\\s+/g, \"-\");\n const id = slug;\n addPage(id, name, slug);\n }}\n onRemovePage={removePage}\n canRemovePage={canRemovePage}\n onUpdateBlock={handleUpdateBlockById}\n activePlugins={activePlugins}\n onActivatePlugin={activatePlugin}\n onDeactivatePlugin={deactivatePlugin}\n showSelectionOverlay={showSelectionOverlay}\n focusedGroup={focusedGroup}\n />\n\n {/* Right: Editor Panel */}\n <RightPanel\n isPaletteSelected={isPaletteSelected}\n selectedBlock={selectedBlock}\n selectedPalette={selectedPalette ? findPaletteByName(selectedPalette) : undefined}\n onPaletteChange={handlePaletteChange}\n onUpdateBlock={handleUpdateBlock}\n uploadConfig={uploadConfig}\n document={document}\n currentPageId={currentPageId}\n focusedGroup={focusedGroup}\n />\n </div>\n </div>\n );\n}\n"],"names":["LandingPageEditor","initialData","defaultTemplateId","onSave","onPublish","uploadConfig","document","currentPageId","currentPage","selectedBlockId","selectedBlock","history","setCurrentPageId","addPage","removePage","canRemovePage","setSelectedBlockId","handleUndo","handleRedo","handleDeleteBlock","handleUpdateBlock","applyChange","resetToTemplate","isPaletteSelected","loadDocument","selectedPalette","setSelectedPalette","activePlugins","activatePlugin","deactivatePlugin","useEditorState","isSaving","setIsSaving","useState","currentTemplateId","setCurrentTemplateId","focusedGroup","setFocusedGroup","showSelectionOverlay","setShowSelectionOverlay","handleSelectTemplate","useCallback","templateId","sharedDoc","getTemplate","engineDoc","sharedTemplateToEngineDocument","paletteName","templateDefaultPalette","useEffect","handleSave","processedPages","page","block","processBlockDataURLs","processedDocument","error","logger","handlePublish","handleUpdateBlockById","blockId","updates","pageId","patch","PatchBuilder","handlePaletteChange","palette","derived","derivePaletteColors","allPatches","key","value","darkGradientVariations","pageIdx","blockIdx","base","variation","handleBlockClick","group","useKeyboardShortcuts","handleMessage","event","href","match","slug","p","id","findBlockInStructure","jsxs","jsx","Toolbar","prev","LeftPanel","CenterPanel","name","RightPanel","findPaletteByName","TemplatePicker"],"mappings":"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"}
|
|
@@ -13,8 +13,11 @@ export interface ColorPalette {
|
|
|
13
13
|
linkColor?: string;
|
|
14
14
|
menuLinkColor?: string;
|
|
15
15
|
gradient: string[];
|
|
16
|
+
heroGradientStart?: string;
|
|
17
|
+
heroGradientEnd?: string;
|
|
16
18
|
}
|
|
17
19
|
export declare const colorPalettes: ColorPalette[];
|
|
20
|
+
export declare function findPaletteByName(name: string): ColorPalette | undefined;
|
|
18
21
|
interface PaletteSelectorProps {
|
|
19
22
|
selectedPalette?: ColorPalette;
|
|
20
23
|
onPaletteChange: (palette: ColorPalette) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaletteSelector.d.ts","sourceRoot":"","sources":["../../src/editor/PaletteSelector.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"PaletteSelector.d.ts","sourceRoot":"","sources":["../../src/editor/PaletteSelector.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,EAAE,CAAC;IAGnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAMD,eAAO,MAAM,aAAa,EAAE,YAAY,EAwOvC,CAAC;AAMF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAExE;AAMD,UAAU,oBAAoB;IAC5B,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;CAClD;AAED,wBAAgB,eAAe,CAAC,EAC9B,eAAe,EACf,eAAe,GAChB,EAAE,oBAAoB,2CAyCtB"}
|