@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.
- package/dist/editor/LandingPageEditor.d.ts.map +1 -1
- package/dist/editor/LandingPageEditor.js +199 -185
- package/dist/editor/LandingPageEditor.js.map +1 -1
- package/dist/editor/PropertyEditor/VariationSelector.d.ts +1 -1
- package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/VariationSelector.js +262 -93
- package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
- package/dist/engine/export/exporters/layout/GridExporter.d.ts.map +1 -1
- package/dist/engine/export/exporters/layout/GridExporter.js +47 -31
- package/dist/engine/export/exporters/layout/GridExporter.js.map +1 -1
- package/dist/engine/export/exporters/layout/StackExporter.d.ts.map +1 -1
- package/dist/engine/export/exporters/layout/StackExporter.js +17 -16
- package/dist/engine/export/exporters/layout/StackExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
- package/dist/engine/export/exporters/sections/BlogPostExporters.js +246 -186
- package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
- package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
- package/dist/engine/plugins/builtin/blog/manifest.js +59 -36
- package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
- package/dist/engine/presets/blogVariations.d.ts +51 -0
- package/dist/engine/presets/blogVariations.d.ts.map +1 -0
- package/dist/engine/presets/blogVariations.js +267 -0
- package/dist/engine/presets/blogVariations.js.map +1 -0
- package/dist/engine/registry/blocks/layout/grid.d.ts.map +1 -1
- package/dist/engine/registry/blocks/layout/grid.js +108 -22
- package/dist/engine/registry/blocks/layout/grid.js.map +1 -1
- package/dist/engine/registry/blocks/layout/stack.d.ts.map +1 -1
- package/dist/engine/registry/blocks/layout/stack.js +25 -9
- package/dist/engine/registry/blocks/layout/stack.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +62 -5
- package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostDetail.js +16 -4
- package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogRecentPosts.js +62 -5
- package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogSearchBar.js +23 -1
- package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/blogTagCloud.js +63 -6
- package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -1
- package/dist/engine/render/renderers/layout/GridRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/layout/GridRenderer.js +51 -18
- package/dist/engine/render/renderers/layout/GridRenderer.js.map +1 -1
- package/dist/engine/render/renderers/layout/StackRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/layout/StackRenderer.js +30 -25
- package/dist/engine/render/renderers/layout/StackRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js +157 -132
- package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +17 -17
- package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js +168 -136
- package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js +59 -102
- package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js +158 -122
- package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js.map +1 -1
- package/dist/engine/schema/siteDocument.d.ts +61 -3
- package/dist/engine/schema/siteDocument.d.ts.map +1 -1
- package/dist/engine/schema/siteDocument.js.map +1 -1
- package/dist/engine/shared/hoverEffects/colorUtils.d.ts +2 -1
- package/dist/engine/shared/hoverEffects/colorUtils.d.ts.map +1 -1
- package/dist/engine/shared/hoverEffects/colorUtils.js +16 -12
- package/dist/engine/shared/hoverEffects/colorUtils.js.map +1 -1
- package/dist/engine/shared/widgetStyles.d.ts +9 -0
- package/dist/engine/shared/widgetStyles.d.ts.map +1 -0
- package/dist/engine/shared/widgetStyles.js +13 -0
- package/dist/engine/shared/widgetStyles.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +84 -71
- package/dist/index.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;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,
|
|
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
|
|
2
|
-
import { useState as
|
|
3
|
-
import { TemplatePicker as
|
|
4
|
-
import { useEditorState as
|
|
5
|
-
import { useKeyboardShortcuts as
|
|
6
|
-
import { getTemplate as
|
|
7
|
-
import { findPaletteByName as
|
|
8
|
-
import { sharedTemplateToEngineDocument as
|
|
9
|
-
import { findBlockInStructure as
|
|
10
|
-
import { derivePaletteColors as
|
|
11
|
-
import { logger as
|
|
12
|
-
import { processBlockDataURLs as
|
|
13
|
-
import { Toolbar as
|
|
14
|
-
import { LeftPanel as
|
|
15
|
-
import { CenterPanel as
|
|
16
|
-
import { RightPanel as
|
|
17
|
-
import { PatchBuilder as
|
|
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:
|
|
20
|
-
defaultTemplateId:
|
|
21
|
-
onSave:
|
|
22
|
-
onPublish:
|
|
23
|
-
uploadConfig:
|
|
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:
|
|
29
|
-
selectedBlockId:
|
|
30
|
-
selectedBlock:
|
|
31
|
-
history:
|
|
32
|
-
setCurrentPageId:
|
|
33
|
-
addPage:
|
|
34
|
-
removePage:
|
|
35
|
-
canRemovePage:
|
|
36
|
-
setSelectedBlockId:
|
|
37
|
-
handleUndo:
|
|
38
|
-
handleRedo:
|
|
39
|
-
handleDeleteBlock:
|
|
40
|
-
handleUpdateBlock:
|
|
41
|
-
applyChange:
|
|
42
|
-
resetToTemplate:
|
|
43
|
-
isPaletteSelected:
|
|
44
|
-
loadDocument:
|
|
45
|
-
selectedPalette:
|
|
46
|
-
setSelectedPalette:
|
|
47
|
-
activePlugins:
|
|
48
|
-
activatePlugin:
|
|
49
|
-
deactivatePlugin:
|
|
50
|
-
} =
|
|
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
|
-
), [
|
|
53
|
-
(
|
|
54
|
-
const
|
|
55
|
-
if (!
|
|
56
|
-
const r =
|
|
57
|
-
|
|
58
|
-
const a =
|
|
59
|
-
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
|
-
[
|
|
61
|
+
[B, f]
|
|
62
62
|
);
|
|
63
|
-
|
|
64
|
-
!t &&
|
|
65
|
-
}, [
|
|
63
|
+
F(() => {
|
|
64
|
+
!t && b && H(b);
|
|
65
|
+
}, [b]);
|
|
66
66
|
const O = async () => {
|
|
67
|
-
if (!(!t || !
|
|
68
|
-
|
|
67
|
+
if (!(!t || !T || !$)) {
|
|
68
|
+
P(!0);
|
|
69
69
|
try {
|
|
70
|
-
const
|
|
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) =>
|
|
74
|
+
(r.structure || []).map((a) => ge(a, $))
|
|
75
75
|
)
|
|
76
76
|
}))
|
|
77
|
-
),
|
|
77
|
+
), e = {
|
|
78
78
|
...t,
|
|
79
|
-
pages:
|
|
79
|
+
pages: o
|
|
80
80
|
};
|
|
81
|
-
await
|
|
82
|
-
} catch (
|
|
83
|
-
throw
|
|
81
|
+
await T(e);
|
|
82
|
+
} catch (o) {
|
|
83
|
+
throw w.error("Error saving:", o), o;
|
|
84
84
|
} finally {
|
|
85
|
-
|
|
85
|
+
P(!1);
|
|
86
86
|
}
|
|
87
87
|
}
|
|
88
|
-
},
|
|
89
|
-
if (!(!t || !
|
|
90
|
-
|
|
88
|
+
}, le = async () => {
|
|
89
|
+
if (!(!t || !S)) {
|
|
90
|
+
P(!0);
|
|
91
91
|
try {
|
|
92
|
-
await
|
|
93
|
-
} catch (
|
|
94
|
-
|
|
92
|
+
await S(t);
|
|
93
|
+
} catch (o) {
|
|
94
|
+
w.error("Error publishing:", o);
|
|
95
95
|
} finally {
|
|
96
|
-
|
|
96
|
+
P(!1);
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
|
-
},
|
|
100
|
-
(
|
|
101
|
-
if (!t || !
|
|
102
|
-
const r =
|
|
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 =
|
|
105
|
+
const a = ye.updateBlockProps(
|
|
106
106
|
t,
|
|
107
107
|
r,
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
o,
|
|
109
|
+
e
|
|
110
110
|
);
|
|
111
|
-
a?.length &&
|
|
111
|
+
a?.length && k(a, "Update block properties");
|
|
112
112
|
} catch (a) {
|
|
113
|
-
|
|
113
|
+
w.error("Error updating block:", a);
|
|
114
114
|
}
|
|
115
115
|
},
|
|
116
|
-
[t,
|
|
117
|
-
),
|
|
116
|
+
[t, m, k]
|
|
117
|
+
), se = y((o) => {
|
|
118
118
|
if (!t) return;
|
|
119
|
-
const
|
|
120
|
-
for (const [
|
|
121
|
-
r.push({ op: "replace", path: `/theme/colors/${
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
|
142
|
-
{ op: "replace", path: `${
|
|
143
|
-
{ op: "replace", path: `${
|
|
144
|
-
{ op: "replace", path: `${
|
|
145
|
-
{ op: "replace", path: `${
|
|
146
|
-
{ op: "replace", path: `${
|
|
147
|
-
) :
|
|
148
|
-
{ op: "replace", path: `${
|
|
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
|
-
|
|
153
|
-
}, [t,
|
|
154
|
-
|
|
155
|
-
}, [
|
|
156
|
-
return
|
|
157
|
-
onUndo:
|
|
158
|
-
onRedo:
|
|
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
|
-
|
|
175
|
+
g && R(g);
|
|
162
176
|
},
|
|
163
|
-
onDeselect: () =>
|
|
164
|
-
}),
|
|
165
|
-
const
|
|
166
|
-
if (
|
|
167
|
-
const r = String(
|
|
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
|
|
172
|
-
|
|
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
|
|
177
|
-
for (const
|
|
178
|
-
if (
|
|
179
|
-
|
|
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",
|
|
185
|
-
}, [t,
|
|
186
|
-
/* @__PURE__ */
|
|
187
|
-
|
|
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:
|
|
190
|
-
isSaving:
|
|
191
|
-
onUndo:
|
|
192
|
-
onRedo:
|
|
203
|
+
history: z,
|
|
204
|
+
isSaving: te,
|
|
205
|
+
onUndo: E,
|
|
206
|
+
onRedo: U,
|
|
193
207
|
onSave: O,
|
|
194
|
-
onPublish:
|
|
195
|
-
onReset:
|
|
196
|
-
const
|
|
197
|
-
if (
|
|
198
|
-
|
|
199
|
-
const
|
|
200
|
-
|
|
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
|
-
} :
|
|
203
|
-
showSelectionOverlay:
|
|
204
|
-
onToggleSelectionOverlay: () =>
|
|
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__ */
|
|
209
|
-
|
|
222
|
+
/* @__PURE__ */ h(
|
|
223
|
+
ke,
|
|
210
224
|
{
|
|
211
|
-
currentPage:
|
|
212
|
-
selectedBlockId:
|
|
213
|
-
isPaletteSelected:
|
|
214
|
-
onSelectBlock: (
|
|
215
|
-
|
|
225
|
+
currentPage: m,
|
|
226
|
+
selectedBlockId: g,
|
|
227
|
+
isPaletteSelected: I,
|
|
228
|
+
onSelectBlock: (o) => {
|
|
229
|
+
d(o), G(null);
|
|
216
230
|
},
|
|
217
|
-
onDeleteBlock:
|
|
231
|
+
onDeleteBlock: R
|
|
218
232
|
}
|
|
219
233
|
),
|
|
220
|
-
/* @__PURE__ */
|
|
221
|
-
|
|
234
|
+
/* @__PURE__ */ h(
|
|
235
|
+
Pe,
|
|
222
236
|
{
|
|
223
237
|
document: t,
|
|
224
|
-
currentPageId:
|
|
225
|
-
currentPage:
|
|
226
|
-
selectedBlockId:
|
|
227
|
-
onBlockClick:
|
|
228
|
-
onSelectPage:
|
|
238
|
+
currentPageId: D,
|
|
239
|
+
currentPage: m,
|
|
240
|
+
selectedBlockId: g,
|
|
241
|
+
onBlockClick: ce,
|
|
242
|
+
onSelectPage: v,
|
|
229
243
|
onAddPage: () => {
|
|
230
|
-
const
|
|
231
|
-
if (!
|
|
232
|
-
const
|
|
233
|
-
|
|
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:
|
|
236
|
-
canRemovePage:
|
|
237
|
-
onUpdateBlock:
|
|
238
|
-
activePlugins:
|
|
239
|
-
onActivatePlugin:
|
|
240
|
-
onDeactivatePlugin:
|
|
241
|
-
showSelectionOverlay:
|
|
242
|
-
focusedGroup:
|
|
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__ */
|
|
246
|
-
|
|
259
|
+
/* @__PURE__ */ h(
|
|
260
|
+
Ce,
|
|
247
261
|
{
|
|
248
|
-
isPaletteSelected:
|
|
249
|
-
selectedBlock:
|
|
250
|
-
selectedPalette:
|
|
251
|
-
onPaletteChange:
|
|
252
|
-
onUpdateBlock:
|
|
253
|
-
uploadConfig:
|
|
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:
|
|
269
|
+
currentPageId: D,
|
|
270
|
+
focusedGroup: N
|
|
257
271
|
}
|
|
258
272
|
)
|
|
259
273
|
] })
|
|
260
|
-
] }) : /* @__PURE__ */
|
|
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":";;;;;;;;;;;;;;;;;AA8CO,SAASA,GAAkB;AAAA,EAChC,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AACF,GAA2B;AAEzB,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,SAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,kBAAAC;AAAA,EAAA,IACEC,GAAe,EAAE,aAAA7B,GAAa,GAG5B,CAAC8B,IAAUC,CAAW,IAAIC,EAAS,EAAK,GACxC,CAACC,GAAmBC,EAAoB,IAAIF;AAAA,IAChD;AAAA,EAAA,GAEI,CAACG,GAAcC,CAAe,IAAIJ,EAAwB,IAAI,GAC9D,CAACK,GAAsBC,EAAuB,IAAIN,EAAS,EAAK,GAGhEO,IAAuBC;AAAA,IAC3B,CAACC,MAA2B;AAC1B,YAAMC,IAAYC,EAAYF,CAAU;AACxC,UAAI,CAACC,EAAW;AAChB,YAAME,IAAYC,EAA+BH,CAAS;AAC1D,MAAAnB,EAAaqB,CAAS,GACtBV,GAAqBO,CAAU;AAG/B,YAAMK,IAAcC,EAAuBN,CAAU;AACrD,MAAIK,KACFrB,EAAmBqB,CAAW;AAAA,IAElC;AAAA,IACA,CAACvB,GAAcE,CAAkB;AAAA,EAAA;AAInC,EAAAuB,EAAU,MAAM;AACd,IAAI,CAAC3C,KAAYJ,KACfsC,EAAqBtC,CAAiB;AAAA,EAE1C,GAAG,CAACA,CAAiB,CAAC;AAGtB,QAAMgD,IAAa,YAAY;AAC7B,QAAI,GAAC5C,KAAY,CAACH,KAAU,CAACE,IAC7B;AAAA,MAAA2B,EAAY,EAAI;AAChB,UAAI;AAEF,cAAMmB,IAAiB,MAAM,QAAQ;AAAA,WAClC7C,EAAS,SAAS,CAAA,GAAI,IAAI,OAAO8C,OAAU;AAAA,YAC1C,GAAGA;AAAA,YACH,WAAW,MAAM,QAAQ;AAAA,eACtBA,EAAK,aAAa,IAAI,IAAI,CAACC,MAAUC,GAAqBD,GAAOhD,CAAY,CAAC;AAAA,YAAA;AAAA,UACjF,EACA;AAAA,QAAA,GAGEkD,IAAoB;AAAA,UACxB,GAAGjD;AAAA,UACH,OAAO6C;AAAA,QAAA;AAGT,cAAMhD,EAAOoD,CAAiB;AAAA,MAChC,SAASC,GAAO;AACd,cAAAC,EAAO,MAAM,iBAAiBD,CAAK,GAC7BA;AAAA,MACR,UAAA;AACE,QAAAxB,EAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF,GAEM0B,KAAgB,YAAY;AAChC,QAAI,GAACpD,KAAY,CAACF,IAClB;AAAA,MAAA4B,EAAY,EAAI;AAChB,UAAI;AACF,cAAM5B,EAAUE,CAAQ;AAAA,MAC1B,SAASkD,GAAO;AACd,QAAAC,EAAO,MAAM,qBAAqBD,CAAK;AAAA,MACzC,UAAA;AACE,QAAAxB,EAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF,GAGM2B,KAAwBlB;AAAA,IAC5B,CAACmB,GAAiBC,MAAiC;AACjD,UAAI,CAACvD,KAAY,CAACE,EAAa;AAC/B,YAAMsD,IAAUtD,EAAoB;AACpC,UAAKsD;AAEL,YAAI;AACF,gBAAMC,IAAQC,GAAa;AAAA,YACzB1D;AAAA,YACAwD;AAAA,YACAF;AAAA,YACAC;AAAA,UAAA;AAEF,UAAIE,GAAO,UACT1C,EAAY0C,GAAO,yBAAyB;AAAA,QAEhD,SAASP,GAAO;AACd,UAAAC,EAAO,MAAM,yBAAyBD,CAAK;AAAA,QAC7C;AAAA,IACF;AAAA,IACA,CAAClD,GAAUE,GAAaa,CAAW;AAAA,EAAA,GAK/B4C,KAAsBxB,EAAY,CAACyB,MAAiB;AACxD,QAAI,CAAC5D,EAAU;AACf,UAAM6D,IAAUC,GAAoBF,CAAO,GAGrCG,IAAiE,CAAA;AAGvE,eAAW,CAACC,GAAKC,CAAK,KAAK,OAAO,QAAQJ,EAAQ,WAAW;AAC3D,MAAAE,EAAW,KAAK,EAAE,IAAI,WAAW,MAAM,iBAAiBC,CAAG,IAAI,OAAAC,GAAO;AAKxE,UAAMC,wBAA6B,IAAI;AAAA,MACrC;AAAA,MAAiB;AAAA,MAAiB;AAAA,MAAgB;AAAA,IAAA,CACnD;AAED,aAASC,IAAU,GAAGA,IAAUnE,EAAS,MAAM,QAAQmE,KAAW;AAChE,YAAMrB,IAAO9C,EAAS,MAAMmE,CAAO;AACnC,UAAKrB,GAAM;AACX,iBAASsB,IAAW,GAAGA,IAAWtB,EAAK,UAAU,QAAQsB,KAAY;AACnE,gBAAMrB,IAAQD,EAAK,UAAUsB,CAAQ,GAC/BC,IAAO,UAAUF,CAAO,cAAcC,CAAQ;AAEpD,cAAIrB,EAAM,SAAS,QAAQ;AACzB,kBAAMuB,KAAavB,EAAM,OAAe,aAAa;AACrD,YAAImB,EAAuB,IAAII,EAAS,KACtCP,EAAW;AAAA,cACT,EAAE,IAAI,WAAW,MAAM,GAAGM,CAAI,eAAe,OAAO,2BAA2BR,EAAQ,iBAAiB,QAAQA,EAAQ,eAAe,SAAA;AAAA,cACvI,EAAE,IAAI,WAAW,MAAM,GAAGQ,CAAI,eAAe,OAAOR,EAAQ,eAAA;AAAA,cAC5D,EAAE,IAAI,WAAW,MAAM,GAAGQ,CAAI,kBAAkB,OAAOR,EAAQ,kBAAA;AAAA,cAC/D,EAAE,IAAI,WAAW,MAAM,GAAGQ,CAAI,qBAAqB,OAAOR,EAAQ,cAAA;AAAA,YAAc;AAAA,UAGtF,MAAA,CAAWd,EAAM,SAAS,WACxBgB,EAAW;AAAA,YACT,EAAE,IAAI,WAAW,MAAM,GAAGM,CAAI,OAAO,OAAOR,EAAQ,SAAA;AAAA,YACpD,EAAE,IAAI,WAAW,MAAM,GAAGQ,CAAI,cAAc,OAAOR,EAAQ,YAAY,cAAA;AAAA,YACvE,EAAE,IAAI,WAAW,MAAM,GAAGQ,CAAI,mBAAmB,OAAOR,EAAQ,YAAY,QAAA;AAAA,YAC5E,EAAE,IAAI,WAAW,MAAM,GAAGQ,CAAI,gBAAgB,OAAOR,EAAQ,YAAY,QAAA;AAAA,YACzE,EAAE,IAAI,WAAW,MAAM,GAAGQ,CAAI,oBAAoB,OAAOR,EAAQ,YAAY,YAAA;AAAA,UAAY,IAElFd,EAAM,SAAS,YACxBgB,EAAW;AAAA,YACT,EAAE,IAAI,WAAW,MAAM,GAAGM,CAAI,mBAAmB,OAAOR,EAAQ,gBAAA;AAAA,UAAgB;AAAA,QAGtF;AAAA,IACF;AAEA,IAAA9C,EAAYgD,GAAY,sBAAsB,GAC9C3C,EAAmBwC,EAAQ,QAAQ,IAAI;AAAA,EACzC,GAAG,CAAC5D,GAAUe,GAAaK,CAAkB,CAAC,GAGxCmD,KAAmBpC,EAAY,CAACmB,GAAiBkB,MAAmB;AACxE,IAAA9D,EAAmB4C,CAAO,GAC1BvB,EAAgByC,KAAS,IAAI;AAAA,EAC/B,GAAG,CAAC9D,CAAkB,CAAC;AAiDvB,SA1CA+D,GAAqB;AAAA,IACnB,QAAQ9D;AAAA,IACR,QAAQC;AAAA,IACR,QAAQgC;AAAA,IACR,UAAU,MAAM;AACd,MAAIzC,KACFU,EAAkBV,CAAe;AAAA,IAErC;AAAA,IACA,YAAY,MAAMO,EAAmB,IAAI;AAAA,EAAA,CAC1C,GAEDiC,EAAU,MAAM;AACd,UAAM+B,IAAgB,CAACC,MAAwB;AAC7C,UAAIA,EAAM,MAAM,SAAS,qBAAqB,CAACA,EAAM,KAAK,KAAM;AAChE,YAAMC,IAAO,OAAOD,EAAM,KAAK,IAAI;AACnC,UAAI,CAAC3E,EAAU;AAEf,YAAM6E,IAAQD,EAAK,MAAM,2BAA2B;AACpD,UAAIC,GAAO;AACT,cAAMC,IAAOD,EAAM,CAAC,GACd/B,IAAO9C,EAAS,MAAM,KAAK,CAAC+E,MAAMA,EAAE,SAASD,CAAI;AACvD,QAAIhC,KAAMxC,EAAiBwC,EAAK,EAAE;AAClC;AAAA,MACF;AAEA,UAAI8B,EAAK,WAAW,GAAG,GAAG;AACxB,cAAMI,IAAKJ,EAAK,MAAM,CAAC;AACvB,mBAAWG,KAAK/E,EAAS;AACvB,cAAIiF,GAAqBF,EAAE,aAAa,CAAA,GAAIC,CAAE,GAAG;AAC/C,YAAA1E,EAAiByE,EAAE,EAAE,GACrBrE,EAAmBsE,CAAE;AACrB;AAAA,UACF;AAAA,MAEJ;AAAA,IACF;AACA,kBAAO,iBAAiB,WAAWN,CAAa,GACzC,MAAM,OAAO,oBAAoB,WAAWA,CAAa;AAAA,EAClE,GAAG,CAAC1E,GAAUM,GAAkBI,CAAkB,CAAC,GAG9CV,IASH,gBAAAkF,EAAC,OAAA,EAAI,WAAU,qEAEb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAA/E;AAAA,QACA,UAAAoB;AAAA,QACA,QAAQd;AAAA,QACR,QAAQC;AAAA,QACR,QAAQgC;AAAA,QACR,WAAW9C,IAAYsD,KAAgB;AAAA,QACvC,SACExB,IACI,MAAM;AAEJ,gBAAMS,IAAYC,EAAYV,CAAiB;AAC/C,cAAIS,GAAW;AACb,YAAAnB,EAAasB,EAA+BH,CAAS,CAAC;AACtD,kBAAMI,IAAcC,EAAuBd,CAAiB;AAC5D,YAAIa,KACFrB,EAAmBqB,CAAW;AAAA,UAElC;AAAA,QACF,IACAzB;AAAA,QAEN,sBAAAgB;AAAA,QACA,0BAA0B,MAAMC,GAAwB,CAAAoD,MAAQ,CAACA,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAIvE,gBAAAH,EAAC,OAAA,EAAI,WAAU,kDAEb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,aAAApF;AAAA,UACA,iBAAAC;AAAA,UACA,mBAAAc;AAAA,UACA,eAAe,CAAC+D,MAAO;AAAE,YAAAtE,EAAmBsE,CAAE,GAAGjD,EAAgB,IAAI;AAAA,UAAG;AAAA,UACxE,eAAelB;AAAA,QAAA;AAAA,MAAA;AAAA,MAIjB,gBAAAsE;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,UAAAvF;AAAA,UACA,eAAAC;AAAA,UACA,aAAAC;AAAA,UACA,iBAAAC;AAAA,UACA,cAAcoE;AAAA,UACd,cAAcjE;AAAA,UACd,WAAW,MAAM;AACf,kBAAMkF,IAAO,OAAO,iBAAiB;AACrC,gBAAI,CAACA,EAAM;AACX,kBAAMV,IAAOU,EAAK,YAAA,EAAc,QAAQ,QAAQ,GAAG;AAEnD,YAAAjF,EADWuE,GACCU,GAAMV,CAAI;AAAA,UACxB;AAAA,UACA,cAActE;AAAA,UACd,eAAAC;AAAA,UACA,eAAe4C;AAAA,UACf,eAAAhC;AAAA,UACA,kBAAkBC;AAAA,UAClB,oBAAoBC;AAAA,UACpB,sBAAAS;AAAA,UACA,cAAAF;AAAA,QAAA;AAAA,MAAA;AAAA,MAIF,gBAAAqD;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,mBAAAxE;AAAA,UACA,eAAAb;AAAA,UACA,iBAAiBe,IAAkBuE,GAAkBvE,CAAe,IAAI;AAAA,UACxE,iBAAiBwC;AAAA,UACjB,eAAe7C;AAAA,UACf,cAAAf;AAAA,UACA,UAAAC;AAAA,UACA,eAAAC;AAAA,UACA,cAAA6B;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF;AAAA,EAAA,GACF,IApFE,gBAAAqD,EAAC,SAAI,WAAU,qEACb,4BAACQ,IAAA,EAAe,kBAAkBzD,GAAsB,EAAA,CAC1D;AAoFN;"}
|
|
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":";;;;;;;;;;;;;;;;;AA8CO,SAASA,GAAkB;AAAA,EAChC,aAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AACF,GAA2B;AAEzB,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,SAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,YAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,kBAAAC;AAAA,EAAA,IACEC,GAAe,EAAE,aAAA7B,GAAa,GAG5B,CAAC8B,IAAUC,CAAW,IAAIC,EAAS,EAAK,GACxC,CAACC,GAAmBC,EAAoB,IAAIF;AAAA,IAChD;AAAA,EAAA,GAEI,CAACG,GAAcC,CAAe,IAAIJ,EAAwB,IAAI,GAC9D,CAACK,GAAsBC,EAAuB,IAAIN,EAAS,EAAK,GAGhEO,IAAuBC;AAAA,IAC3B,CAACC,MAA2B;AAC1B,YAAMC,IAAYC,EAAYF,CAAU;AACxC,UAAI,CAACC,EAAW;AAChB,YAAME,IAAYC,EAA+BH,CAAS;AAC1D,MAAAnB,EAAaqB,CAAS,GACtBV,GAAqBO,CAAU;AAG/B,YAAMK,IAAcC,EAAuBN,CAAU;AACrD,MAAIK,KACFrB,EAAmBqB,CAAW;AAAA,IAElC;AAAA,IACA,CAACvB,GAAcE,CAAkB;AAAA,EAAA;AAInC,EAAAuB,EAAU,MAAM;AACd,IAAI,CAAC3C,KAAYJ,KACfsC,EAAqBtC,CAAiB;AAAA,EAE1C,GAAG,CAACA,CAAiB,CAAC;AAGtB,QAAMgD,IAAa,YAAY;AAC7B,QAAI,GAAC5C,KAAY,CAACH,KAAU,CAACE,IAC7B;AAAA,MAAA2B,EAAY,EAAI;AAChB,UAAI;AAEF,cAAMmB,IAAiB,MAAM,QAAQ;AAAA,WAClC7C,EAAS,SAAS,CAAA,GAAI,IAAI,OAAO8C,OAAU;AAAA,YAC1C,GAAGA;AAAA,YACH,WAAW,MAAM,QAAQ;AAAA,eACtBA,EAAK,aAAa,IAAI,IAAI,CAACC,MAAUC,GAAqBD,GAAOhD,CAAY,CAAC;AAAA,YAAA;AAAA,UACjF,EACA;AAAA,QAAA,GAGEkD,IAAoB;AAAA,UACxB,GAAGjD;AAAA,UACH,OAAO6C;AAAA,QAAA;AAGT,cAAMhD,EAAOoD,CAAiB;AAAA,MAChC,SAASC,GAAO;AACd,cAAAC,EAAO,MAAM,iBAAiBD,CAAK,GAC7BA;AAAA,MACR,UAAA;AACE,QAAAxB,EAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF,GAEM0B,KAAgB,YAAY;AAChC,QAAI,GAACpD,KAAY,CAACF,IAClB;AAAA,MAAA4B,EAAY,EAAI;AAChB,UAAI;AACF,cAAM5B,EAAUE,CAAQ;AAAA,MAC1B,SAASkD,GAAO;AACd,QAAAC,EAAO,MAAM,qBAAqBD,CAAK;AAAA,MACzC,UAAA;AACE,QAAAxB,EAAY,EAAK;AAAA,MACnB;AAAA;AAAA,EACF,GAGM2B,KAAwBlB;AAAA,IAC5B,CAACmB,GAAiBC,MAAiC;AACjD,UAAI,CAACvD,KAAY,CAACE,EAAa;AAC/B,YAAMsD,IAAUtD,EAAoB;AACpC,UAAKsD;AAEL,YAAI;AACF,gBAAMC,IAAQC,GAAa;AAAA,YACzB1D;AAAA,YACAwD;AAAA,YACAF;AAAA,YACAC;AAAA,UAAA;AAEF,UAAIE,GAAO,UACT1C,EAAY0C,GAAO,yBAAyB;AAAA,QAEhD,SAASP,GAAO;AACd,UAAAC,EAAO,MAAM,yBAAyBD,CAAK;AAAA,QAC7C;AAAA,IACF;AAAA,IACA,CAAClD,GAAUE,GAAaa,CAAW;AAAA,EAAA,GAK/B4C,KAAsBxB,EAAY,CAACyB,MAAiB;AACxD,QAAI,CAAC5D,EAAU;AACf,UAAM6D,IAAUC,GAAoBF,CAAO,GAGrCG,IAAiE,CAAA;AAGvE,eAAW,CAACC,GAAKC,CAAK,KAAK,OAAO,QAAQJ,EAAQ,WAAW;AAC3D,MAAAE,EAAW,KAAK,EAAE,IAAI,WAAW,MAAM,iBAAiBC,CAAG,IAAI,OAAAC,GAAO;AAKxE,UAAMC,wBAA6B,IAAI;AAAA,MACrC;AAAA,MAAiB;AAAA,MAAiB;AAAA,MAAgB;AAAA,IAAA,CACnD,GAEKC,wBAAsB,IAAI;AAAA,MAC9B;AAAA,MAAsB;AAAA,MAAmB;AAAA,IAAA,CAC1C,GAIKC,IAAoB,CAACC,GAAeC,MAAqB;AAC7D,eAASC,IAAI,GAAGA,IAAIF,EAAO,QAAQE,KAAK;AACtC,cAAMC,IAAIH,EAAOE,CAAC,GACZE,IAAQ,GAAGH,CAAQ,IAAIC,CAAC;AAC9B,QAAIJ,EAAgB,IAAIK,EAAE,IAAI,KAC5BT,EAAW;AAAA,UACT,EAAE,IAAI,WAAW,MAAM,GAAGU,CAAK,cAAc,OAAOZ,EAAQ,YAAY,KAAA;AAAA,UACxE,EAAE,IAAI,WAAW,MAAM,GAAGY,CAAK,mBAAmB,OAAOZ,EAAQ,YAAY,QAAA;AAAA,QAAQ,GAGrF,MAAM,QAAQW,EAAE,OAAO,QAAQ,KACjCJ,EAAkBI,EAAE,MAAM,UAAU,GAAGC,CAAK,WAAW;AAAA,MAE3D;AAAA,IACF;AAEA,aAASC,IAAU,GAAGA,IAAU1E,EAAS,MAAM,QAAQ0E,KAAW;AAChE,YAAM5B,IAAO9C,EAAS,MAAM0E,CAAO;AACnC,UAAK5B,GAAM,WACX;AAAA,iBAAS6B,IAAW,GAAGA,IAAW7B,EAAK,UAAU,QAAQ6B,KAAY;AACnE,gBAAM5B,IAAQD,EAAK,UAAU6B,CAAQ,GAC/BC,IAAO,UAAUF,CAAO,cAAcC,CAAQ;AAEpD,cAAI5B,EAAM,SAAS,QAAQ;AACzB,kBAAM8B,KAAa9B,EAAM,OAAe,aAAa;AACrD,YAAImB,EAAuB,IAAIW,EAAS,KACtCd,EAAW;AAAA,cACT,EAAE,IAAI,WAAW,MAAM,GAAGa,CAAI,eAAe,OAAO,2BAA2Bf,EAAQ,iBAAiB,QAAQA,EAAQ,eAAe,SAAA;AAAA,cACvI,EAAE,IAAI,WAAW,MAAM,GAAGe,CAAI,eAAe,OAAOf,EAAQ,eAAA;AAAA,cAC5D,EAAE,IAAI,WAAW,MAAM,GAAGe,CAAI,kBAAkB,OAAOf,EAAQ,kBAAA;AAAA,cAC/D,EAAE,IAAI,WAAW,MAAM,GAAGe,CAAI,qBAAqB,OAAOf,EAAQ,cAAA;AAAA,YAAc;AAAA,UAGtF,MAAA,CAAWd,EAAM,SAAS,WACxBgB,EAAW;AAAA,YACT,EAAE,IAAI,WAAW,MAAM,GAAGa,CAAI,OAAO,OAAOf,EAAQ,SAAA;AAAA,YACpD,EAAE,IAAI,WAAW,MAAM,GAAGe,CAAI,cAAc,OAAOf,EAAQ,YAAY,cAAA;AAAA,YACvE,EAAE,IAAI,WAAW,MAAM,GAAGe,CAAI,mBAAmB,OAAOf,EAAQ,YAAY,QAAA;AAAA,YAC5E,EAAE,IAAI,WAAW,MAAM,GAAGe,CAAI,gBAAgB,OAAOf,EAAQ,YAAY,QAAA;AAAA,YACzE,EAAE,IAAI,WAAW,MAAM,GAAGe,CAAI,oBAAoB,OAAOf,EAAQ,YAAY,YAAA;AAAA,UAAY,IAElFd,EAAM,SAAS,YACxBgB,EAAW;AAAA,YACT,EAAE,IAAI,WAAW,MAAM,GAAGa,CAAI,mBAAmB,OAAOf,EAAQ,gBAAA;AAAA,UAAgB;AAAA,QAGtF;AAEA,QAAAO,EAAkBtB,EAAK,WAAW,UAAU4B,CAAO,YAAY;AAAA;AAAA,IACjE;AAEA,IAAA3D,EAAYgD,GAAY,sBAAsB,GAC9C3C,EAAmBwC,EAAQ,QAAQ,IAAI;AAAA,EACzC,GAAG,CAAC5D,GAAUe,GAAaK,CAAkB,CAAC,GAGxC0D,KAAmB3C,EAAY,CAACmB,GAAiByB,MAAmB;AACxE,IAAArE,EAAmB4C,CAAO,GAC1BvB,EAAgBgD,KAAS,IAAI;AAAA,EAC/B,GAAG,CAACrE,CAAkB,CAAC;AAiDvB,SA1CAsE,GAAqB;AAAA,IACnB,QAAQrE;AAAA,IACR,QAAQC;AAAA,IACR,QAAQgC;AAAA,IACR,UAAU,MAAM;AACd,MAAIzC,KACFU,EAAkBV,CAAe;AAAA,IAErC;AAAA,IACA,YAAY,MAAMO,EAAmB,IAAI;AAAA,EAAA,CAC1C,GAEDiC,EAAU,MAAM;AACd,UAAMsC,IAAgB,CAACC,MAAwB;AAC7C,UAAIA,EAAM,MAAM,SAAS,qBAAqB,CAACA,EAAM,KAAK,KAAM;AAChE,YAAMC,IAAO,OAAOD,EAAM,KAAK,IAAI;AACnC,UAAI,CAAClF,EAAU;AAEf,YAAMoF,IAAQD,EAAK,MAAM,2BAA2B;AACpD,UAAIC,GAAO;AACT,cAAMC,IAAOD,EAAM,CAAC,GACdtC,IAAO9C,EAAS,MAAM,KAAK,CAACsF,MAAMA,EAAE,SAASD,CAAI;AACvD,QAAIvC,KAAMxC,EAAiBwC,EAAK,EAAE;AAClC;AAAA,MACF;AAEA,UAAIqC,EAAK,WAAW,GAAG,GAAG;AACxB,cAAMI,IAAKJ,EAAK,MAAM,CAAC;AACvB,mBAAWG,KAAKtF,EAAS;AACvB,cAAIwF,GAAqBF,EAAE,aAAa,CAAA,GAAIC,CAAE,GAAG;AAC/C,YAAAjF,EAAiBgF,EAAE,EAAE,GACrB5E,EAAmB6E,CAAE;AACrB;AAAA,UACF;AAAA,MAEJ;AAAA,IACF;AACA,kBAAO,iBAAiB,WAAWN,CAAa,GACzC,MAAM,OAAO,oBAAoB,WAAWA,CAAa;AAAA,EAClE,GAAG,CAACjF,GAAUM,GAAkBI,CAAkB,CAAC,GAG9CV,IASH,gBAAAyF,EAAC,OAAA,EAAI,WAAU,qEAEb,UAAA;AAAA,IAAA,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,SAAAtF;AAAA,QACA,UAAAoB;AAAA,QACA,QAAQd;AAAA,QACR,QAAQC;AAAA,QACR,QAAQgC;AAAA,QACR,WAAW9C,IAAYsD,KAAgB;AAAA,QACvC,SACExB,IACI,MAAM;AAEJ,gBAAMS,IAAYC,EAAYV,CAAiB;AAC/C,cAAIS,GAAW;AACb,YAAAnB,EAAasB,EAA+BH,CAAS,CAAC;AACtD,kBAAMI,IAAcC,EAAuBd,CAAiB;AAC5D,YAAIa,KACFrB,EAAmBqB,CAAW;AAAA,UAElC;AAAA,QACF,IACAzB;AAAA,QAEN,sBAAAgB;AAAA,QACA,0BAA0B,MAAMC,GAAwB,CAAA2D,MAAQ,CAACA,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAIvE,gBAAAH,EAAC,OAAA,EAAI,WAAU,kDAEb,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAACG;AAAA,QAAA;AAAA,UACC,aAAA3F;AAAA,UACA,iBAAAC;AAAA,UACA,mBAAAc;AAAA,UACA,eAAe,CAACsE,MAAO;AAAE,YAAA7E,EAAmB6E,CAAE,GAAGxD,EAAgB,IAAI;AAAA,UAAG;AAAA,UACxE,eAAelB;AAAA,QAAA;AAAA,MAAA;AAAA,MAIjB,gBAAA6E;AAAA,QAACI;AAAA,QAAA;AAAA,UACC,UAAA9F;AAAA,UACA,eAAAC;AAAA,UACA,aAAAC;AAAA,UACA,iBAAAC;AAAA,UACA,cAAc2E;AAAA,UACd,cAAcxE;AAAA,UACd,WAAW,MAAM;AACf,kBAAMyF,IAAO,OAAO,iBAAiB;AACrC,gBAAI,CAACA,EAAM;AACX,kBAAMV,IAAOU,EAAK,YAAA,EAAc,QAAQ,QAAQ,GAAG;AAEnD,YAAAxF,EADW8E,GACCU,GAAMV,CAAI;AAAA,UACxB;AAAA,UACA,cAAc7E;AAAA,UACd,eAAAC;AAAA,UACA,eAAe4C;AAAA,UACf,eAAAhC;AAAA,UACA,kBAAkBC;AAAA,UAClB,oBAAoBC;AAAA,UACpB,sBAAAS;AAAA,UACA,cAAAF;AAAA,QAAA;AAAA,MAAA;AAAA,MAIF,gBAAA4D;AAAA,QAACM;AAAA,QAAA;AAAA,UACC,mBAAA/E;AAAA,UACA,eAAAb;AAAA,UACA,iBAAiBe,IAAkB8E,GAAkB9E,CAAe,IAAI;AAAA,UACxE,iBAAiBwC;AAAA,UACjB,eAAe7C;AAAA,UACf,cAAAf;AAAA,UACA,UAAAC;AAAA,UACA,eAAAC;AAAA,UACA,cAAA6B;AAAA,QAAA;AAAA,MAAA;AAAA,IACF,EAAA,CACF;AAAA,EAAA,GACF,IApFE,gBAAA4D,EAAC,SAAI,WAAU,qEACb,4BAACQ,IAAA,EAAe,kBAAkBhE,GAAsB,EAAA,CAC1D;AAoFN;"}
|
|
@@ -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
|
|
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;
|
|
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"}
|