@brunoalz/smartgesti-site-editor 1.0.0 → 1.2.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/BlockSelector.d.ts.map +1 -1
- package/dist/editor/BlockSelector.js +60 -57
- package/dist/editor/BlockSelector.js.map +1 -1
- package/dist/editor/LandingPageEditor.d.ts.map +1 -1
- package/dist/editor/LandingPageEditor.js +145 -128
- package/dist/editor/LandingPageEditor.js.map +1 -1
- package/dist/editor/PageTabBar.d.ts +4 -1
- package/dist/editor/PageTabBar.d.ts.map +1 -1
- package/dist/editor/PageTabBar.js +179 -41
- package/dist/editor/PageTabBar.js.map +1 -1
- package/dist/editor/PropertyEditor/BlockPropertyEditor.d.ts +2 -0
- package/dist/editor/PropertyEditor/BlockPropertyEditor.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/BlockPropertyEditor.js +53 -45
- package/dist/editor/PropertyEditor/BlockPropertyEditor.js.map +1 -1
- package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.d.ts +2 -0
- package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.js +47 -33
- package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.js.map +1 -1
- package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/VariationSelector.js +10 -6
- package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
- package/dist/editor/PropertyEditor/index.js +20 -18
- package/dist/editor/PropertyEditor/index.js.map +1 -1
- package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.d.ts +16 -0
- package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.d.ts.map +1 -0
- package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.js +170 -0
- package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.js.map +1 -0
- package/dist/editor/PropertyEditor/inputs/ImageGridInput.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/inputs/ImageGridInput.js +148 -121
- package/dist/editor/PropertyEditor/inputs/ImageGridInput.js.map +1 -1
- package/dist/editor/PropertyEditor/inputs/index.d.ts +1 -0
- package/dist/editor/PropertyEditor/inputs/index.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/renderPropertyInput.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/renderPropertyInput.js +167 -139
- package/dist/editor/PropertyEditor/renderPropertyInput.js.map +1 -1
- package/dist/editor/components/CenterPanel.d.ts +9 -1
- package/dist/editor/components/CenterPanel.d.ts.map +1 -1
- package/dist/editor/components/CenterPanel.js +24 -14
- package/dist/editor/components/CenterPanel.js.map +1 -1
- package/dist/editor/components/RightPanel.d.ts +5 -0
- package/dist/editor/components/RightPanel.d.ts.map +1 -1
- package/dist/editor/components/RightPanel.js +18 -12
- package/dist/editor/components/RightPanel.js.map +1 -1
- package/dist/editor/components/Toolbar.d.ts +3 -0
- package/dist/editor/components/Toolbar.d.ts.map +1 -1
- package/dist/editor/components/Toolbar.js +54 -35
- package/dist/editor/components/Toolbar.js.map +1 -1
- package/dist/engine/export/exportHtml.d.ts.map +1 -1
- package/dist/engine/export/exportHtml.js +50 -50
- package/dist/engine/export/exportHtml.js.map +1 -1
- package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts +6 -0
- package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -0
- package/dist/engine/export/exporters/sections/BlogPostExporters.js +101 -0
- package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -0
- package/dist/engine/export/exporters/sections/FooterExporter.js +22 -22
- package/dist/engine/export/exporters/sections/FooterExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/HeroExporter.d.ts.map +1 -1
- package/dist/engine/export/exporters/sections/HeroExporter.js +222 -205
- package/dist/engine/export/exporters/sections/HeroExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/MarketingExporters.js +88 -88
- package/dist/engine/export/exporters/sections/MarketingExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/NavbarExporter.js +34 -34
- package/dist/engine/export/exporters/sections/NavbarExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
- package/dist/engine/export/exporters/sections/index.js +29 -22
- package/dist/engine/export/exporters/sections/index.js.map +1 -1
- package/dist/engine/index.d.ts +3 -0
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +99 -87
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/plugins/builtin/blog/index.d.ts +3 -0
- package/dist/engine/plugins/builtin/blog/index.d.ts.map +1 -0
- package/dist/engine/plugins/builtin/blog/manifest.d.ts +3 -0
- package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -0
- package/dist/engine/plugins/builtin/blog/manifest.js +273 -0
- package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -0
- package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts +7 -0
- package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts.map +1 -0
- package/dist/engine/plugins/builtin/blog/mockContentProvider.js +135 -0
- package/dist/engine/plugins/builtin/blog/mockContentProvider.js.map +1 -0
- package/dist/engine/plugins/contentHydration.d.ts +17 -0
- package/dist/engine/plugins/contentHydration.d.ts.map +1 -0
- package/dist/engine/plugins/contentHydration.js +121 -0
- package/dist/engine/plugins/contentHydration.js.map +1 -0
- package/dist/engine/plugins/dynamicPageResolver.d.ts +25 -0
- package/dist/engine/plugins/dynamicPageResolver.d.ts.map +1 -0
- package/dist/engine/plugins/dynamicPageResolver.js +32 -0
- package/dist/engine/plugins/dynamicPageResolver.js.map +1 -0
- package/dist/engine/plugins/index.d.ts +11 -0
- package/dist/engine/plugins/index.d.ts.map +1 -0
- package/dist/engine/plugins/pluginRegistry.d.ts +37 -0
- package/dist/engine/plugins/pluginRegistry.d.ts.map +1 -0
- package/dist/engine/plugins/pluginRegistry.js +134 -0
- package/dist/engine/plugins/pluginRegistry.js.map +1 -0
- package/dist/engine/plugins/types.d.ts +180 -0
- package/dist/engine/plugins/types.d.ts.map +1 -0
- package/dist/engine/presets/heroVariations.d.ts +5 -0
- package/dist/engine/presets/heroVariations.d.ts.map +1 -1
- package/dist/engine/presets/heroVariations.js +50 -6
- package/dist/engine/presets/heroVariations.js.map +1 -1
- package/dist/engine/preview/Preview.d.ts +6 -2
- package/dist/engine/preview/Preview.d.ts.map +1 -1
- package/dist/engine/preview/Preview.js +295 -125
- package/dist/engine/preview/Preview.js.map +1 -1
- package/dist/engine/registry/blocks/sections/blogPostCard.d.ts +3 -0
- package/dist/engine/registry/blocks/sections/blogPostCard.d.ts.map +1 -0
- package/dist/engine/registry/blocks/sections/blogPostCard.js +53 -0
- package/dist/engine/registry/blocks/sections/blogPostCard.js.map +1 -0
- package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts +3 -0
- package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -0
- package/dist/engine/registry/blocks/sections/blogPostDetail.js +49 -0
- package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -0
- package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts +3 -0
- package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts.map +1 -0
- package/dist/engine/registry/blocks/sections/blogPostGrid.js +89 -0
- package/dist/engine/registry/blocks/sections/blogPostGrid.js.map +1 -0
- package/dist/engine/registry/blocks/sections/hero.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/hero.js +67 -14
- package/dist/engine/registry/blocks/sections/hero.js.map +1 -1
- package/dist/engine/registry/blocks/sections/index.d.ts +3 -0
- package/dist/engine/registry/blocks/sections/index.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/navbar.d.ts.map +1 -1
- package/dist/engine/registry/blocks/sections/navbar.js +2 -1
- package/dist/engine/registry/blocks/sections/navbar.js.map +1 -1
- package/dist/engine/registry/registry.d.ts.map +1 -1
- package/dist/engine/registry/registry.js +16 -12
- package/dist/engine/registry/registry.js.map +1 -1
- package/dist/engine/registry/types.d.ts +10 -6
- package/dist/engine/registry/types.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/BlogPostCardRenderer.d.ts +3 -0
- package/dist/engine/render/renderers/sections/BlogPostCardRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js +199 -0
- package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.d.ts +3 -0
- package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +293 -0
- package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/BlogPostGridRenderer.d.ts +3 -0
- package/dist/engine/render/renderers/sections/BlogPostGridRenderer.d.ts.map +1 -0
- package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js +101 -0
- package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js.map +1 -0
- package/dist/engine/render/renderers/sections/CtaRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/CtaRenderer.js +33 -31
- package/dist/engine/render/renderers/sections/CtaRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FaqItemRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/FaqItemRenderer.js +7 -6
- package/dist/engine/render/renderers/sections/FaqItemRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FaqRenderer.js +7 -7
- package/dist/engine/render/renderers/sections/FaqRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js +19 -18
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureRenderer.js +5 -4
- package/dist/engine/render/renderers/sections/FeatureRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FooterRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/FooterRenderer.js +8 -7
- package/dist/engine/render/renderers/sections/FooterRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/HeroRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/HeroRenderer.js +295 -218
- package/dist/engine/render/renderers/sections/HeroRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/NavbarRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/NavbarRenderer.js +23 -22
- package/dist/engine/render/renderers/sections/NavbarRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/PricingCardRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js +7 -6
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/PricingRenderer.js +9 -9
- package/dist/engine/render/renderers/sections/PricingRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/TestimonialGridRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/TestimonialGridRenderer.js +17 -16
- package/dist/engine/render/renderers/sections/TestimonialGridRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/TestimonialRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/sections/TestimonialRenderer.js +11 -10
- package/dist/engine/render/renderers/sections/TestimonialRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/index.js +24 -18
- package/dist/engine/render/renderers/sections/index.js.map +1 -1
- package/dist/engine/schema/siteDocument.d.ts +104 -3
- package/dist/engine/schema/siteDocument.d.ts.map +1 -1
- package/dist/engine/schema/siteDocument.js.map +1 -1
- package/dist/engine/shared/carouselAnimation.d.ts +20 -0
- package/dist/engine/shared/carouselAnimation.d.ts.map +1 -0
- package/dist/engine/shared/carouselAnimation.js +62 -0
- package/dist/engine/shared/carouselAnimation.js.map +1 -0
- package/dist/engine/shared/imageGrid/types.d.ts +2 -0
- package/dist/engine/shared/imageGrid/types.d.ts.map +1 -1
- package/dist/engine/shared/showWhen.d.ts +44 -0
- package/dist/engine/shared/showWhen.d.ts.map +1 -0
- package/dist/engine/shared/showWhen.js +33 -0
- package/dist/engine/shared/showWhen.js.map +1 -0
- package/dist/hooks/useEditorState.d.ts +3 -0
- package/dist/hooks/useEditorState.d.ts.map +1 -1
- package/dist/hooks/useEditorState.js +106 -84
- package/dist/hooks/useEditorState.js.map +1 -1
- package/dist/index.d.ts +13 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +109 -93
- package/dist/index.js.map +1 -1
- package/dist/shared/templates/escola-blog.d.ts +3 -0
- package/dist/shared/templates/escola-blog.d.ts.map +1 -0
- package/dist/shared/templates/escola-blog.js +160 -0
- package/dist/shared/templates/escola-blog.js.map +1 -0
- package/dist/shared/templates/index.d.ts +2 -0
- package/dist/shared/templates/index.d.ts.map +1 -1
- package/dist/shared/templates/index.js +30 -12
- package/dist/shared/templates/index.js.map +1 -1
- package/dist/utils/changeDetector.d.ts +2 -1
- package/dist/utils/changeDetector.d.ts.map +1 -1
- package/dist/utils/changeDetector.js +39 -39
- package/dist/utils/changeDetector.js.map +1 -1
- package/dist/utils/sharedTemplateToEngine.d.ts +4 -5
- package/dist/utils/sharedTemplateToEngine.d.ts.map +1 -1
- package/dist/utils/sharedTemplateToEngine.js +14 -87
- package/dist/utils/sharedTemplateToEngine.js.map +1 -1
- package/dist/viewer/LandingPageViewer.d.ts +13 -6
- package/dist/viewer/LandingPageViewer.d.ts.map +1 -1
- package/dist/viewer/LandingPageViewer.js +220 -122
- package/dist/viewer/LandingPageViewer.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,58 +1,153 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useState as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import { jsx as a } from "react/jsx-runtime";
|
|
2
|
+
import { useState as H, useRef as B, useCallback as F, useEffect as L } from "react";
|
|
3
|
+
import { matchDynamicPage as W } from "../engine/plugins/dynamicPageResolver.js";
|
|
4
|
+
import { hydratePageWithContent as G } from "../engine/plugins/contentHydration.js";
|
|
5
|
+
import { logger as z } from "../utils/logger.js";
|
|
6
|
+
import { defaultThemeTokens as A } from "../engine/schema/themeTokens.js";
|
|
7
|
+
import { exportPageToHtml as _ } from "../engine/export/exportHtml.js";
|
|
8
|
+
import { createEmptySiteDocument as q } from "../engine/schema/siteDocument.js";
|
|
9
|
+
function J(o) {
|
|
10
|
+
if (!o || typeof o != "string") return !1;
|
|
11
|
+
const r = o.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
|
|
12
|
+
return (r ? r[1].trim() : "").length > 50;
|
|
10
13
|
}
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
function K(o) {
|
|
15
|
+
const r = /* @__PURE__ */ new Map();
|
|
16
|
+
if (o)
|
|
17
|
+
for (const h of o)
|
|
18
|
+
r.set(h.type, h);
|
|
19
|
+
return r;
|
|
20
|
+
}
|
|
21
|
+
function re({
|
|
22
|
+
siteId: o,
|
|
23
|
+
apiBaseUrl: r,
|
|
24
|
+
projectId: h,
|
|
25
|
+
pageSlug: n,
|
|
16
26
|
schoolSlug: g,
|
|
17
|
-
schoolData:
|
|
27
|
+
schoolData: T,
|
|
18
28
|
// reservado para header/navbar dinâmico (logo, nome da escola)
|
|
29
|
+
contentProviders: c,
|
|
30
|
+
onNavigate: P
|
|
19
31
|
}) {
|
|
20
|
-
const [
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
const [s, C] = H(null), [w, m] = H(null), [E, f] = H(!0), [V, I] = H(null), [M, y] = H(null), x = B(P);
|
|
33
|
+
x.current = P;
|
|
34
|
+
const D = F((e) => {
|
|
35
|
+
const t = `<script>
|
|
36
|
+
(function() {
|
|
37
|
+
document.addEventListener('click', function(e) {
|
|
38
|
+
var target = e.target;
|
|
39
|
+
var anchor = target;
|
|
40
|
+
while (anchor && anchor.tagName !== 'A') {
|
|
41
|
+
anchor = anchor.parentElement;
|
|
42
|
+
}
|
|
43
|
+
if (anchor && anchor.tagName === 'A') {
|
|
44
|
+
var href = anchor.getAttribute('href') || '';
|
|
45
|
+
if (href && href !== '#' && !href.startsWith('javascript:')) {
|
|
46
|
+
e.preventDefault();
|
|
47
|
+
e.stopPropagation();
|
|
48
|
+
window.parent.postMessage({ type: 'viewer-navigate', href: href }, '*');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}, true);
|
|
53
|
+
})();
|
|
54
|
+
<\/script>`;
|
|
55
|
+
return e.includes("</body>") ? e.replace("</body>", `${t}</body>`) : e + t;
|
|
56
|
+
}, []);
|
|
57
|
+
if (L(() => {
|
|
58
|
+
const e = (t) => {
|
|
59
|
+
t.data?.type === "viewer-navigate" && t.data?.href && x.current && x.current(t.data.href);
|
|
60
|
+
};
|
|
61
|
+
return window.addEventListener("message", e), () => window.removeEventListener("message", e);
|
|
62
|
+
}, []), L(() => {
|
|
63
|
+
let e = !1;
|
|
64
|
+
return f(!0), I(null), (async () => {
|
|
65
|
+
try {
|
|
66
|
+
const t = await fetch(
|
|
67
|
+
`${r}/sites/${o}?projectId=${h}`
|
|
68
|
+
);
|
|
69
|
+
if (!t.ok)
|
|
70
|
+
throw new Error("Landing page não encontrada");
|
|
71
|
+
const i = await t.json();
|
|
72
|
+
if (e) return;
|
|
73
|
+
if (i.template) {
|
|
74
|
+
const l = i.template.schemaVersion, j = i.template.pages && Array.isArray(i.template.pages);
|
|
75
|
+
if (l === 2 || l === "2" || j) {
|
|
76
|
+
const u = i.template;
|
|
77
|
+
Array.isArray(u.pages) || (u.pages = []), u.schemaVersion !== 2 && u.schemaVersion !== "2" && (u.schemaVersion = 2), C(u);
|
|
78
|
+
} else
|
|
79
|
+
throw new Error(
|
|
80
|
+
"Formato de template legado não suportado. Por favor, recrie o site."
|
|
81
|
+
);
|
|
38
82
|
} else
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
83
|
+
C(null);
|
|
84
|
+
if (i.publishedHtml && J(i.publishedHtml) ? m(i.publishedHtml) : m(null), !i.template && !i.publishedHtml)
|
|
85
|
+
throw new Error("Template não encontrado");
|
|
86
|
+
} catch (t) {
|
|
87
|
+
e || I(
|
|
88
|
+
t instanceof Error ? t.message : "Erro ao carregar landing page"
|
|
89
|
+
);
|
|
90
|
+
} finally {
|
|
91
|
+
e || f(!1);
|
|
92
|
+
}
|
|
93
|
+
})(), () => {
|
|
94
|
+
e = !0;
|
|
95
|
+
};
|
|
96
|
+
}, [o, r, h]), L(() => {
|
|
97
|
+
if (!s) {
|
|
98
|
+
y(null);
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
let e = !1;
|
|
102
|
+
const t = Array.isArray(s.pages) ? s.pages : [], i = K(c);
|
|
103
|
+
if (i.size === 0) {
|
|
104
|
+
y(null);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
let l, j = {};
|
|
108
|
+
if (n) {
|
|
109
|
+
const d = t.find(
|
|
110
|
+
(p) => p.slug === n || p.id === n
|
|
49
111
|
);
|
|
50
|
-
|
|
51
|
-
|
|
112
|
+
if (d)
|
|
113
|
+
l = d;
|
|
114
|
+
else {
|
|
115
|
+
const p = W(t, n);
|
|
116
|
+
p && (l = p.page, j = p.params);
|
|
117
|
+
}
|
|
118
|
+
} else
|
|
119
|
+
l = t.find((d) => d.id === "home") ?? t[0];
|
|
120
|
+
if (!l) {
|
|
121
|
+
y(null);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const k = !!l.dataSource, u = l.structure?.some(
|
|
125
|
+
(d) => d.type === "blogPostGrid"
|
|
126
|
+
);
|
|
127
|
+
if (!k && !u) {
|
|
128
|
+
y(null);
|
|
129
|
+
return;
|
|
52
130
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
131
|
+
let R = l;
|
|
132
|
+
return !k && u && (R = {
|
|
133
|
+
...l,
|
|
134
|
+
dataSource: { mode: "list", provider: "blog-posts" }
|
|
135
|
+
}), G(R, i, j).then((d) => {
|
|
136
|
+
if (e) return;
|
|
137
|
+
const p = N(
|
|
138
|
+
d,
|
|
139
|
+
s,
|
|
140
|
+
g,
|
|
141
|
+
t
|
|
142
|
+
);
|
|
143
|
+
y(p ?? null);
|
|
144
|
+
}).catch((d) => {
|
|
145
|
+
e || (z.error("Error hydrating page:", d), y(null));
|
|
146
|
+
}), () => {
|
|
147
|
+
e = !0;
|
|
148
|
+
};
|
|
149
|
+
}, [s, n, c, g]), E)
|
|
150
|
+
return /* @__PURE__ */ a(
|
|
56
151
|
"div",
|
|
57
152
|
{
|
|
58
153
|
style: {
|
|
@@ -61,11 +156,11 @@ function J({
|
|
|
61
156
|
justifyContent: "center",
|
|
62
157
|
minHeight: "100vh"
|
|
63
158
|
},
|
|
64
|
-
children: /* @__PURE__ */
|
|
159
|
+
children: /* @__PURE__ */ a("div", { children: "Carregando..." })
|
|
65
160
|
}
|
|
66
161
|
);
|
|
67
|
-
if (
|
|
68
|
-
return /* @__PURE__ */
|
|
162
|
+
if (V)
|
|
163
|
+
return /* @__PURE__ */ a(
|
|
69
164
|
"div",
|
|
70
165
|
{
|
|
71
166
|
style: {
|
|
@@ -74,14 +169,14 @@ function J({
|
|
|
74
169
|
justifyContent: "center",
|
|
75
170
|
minHeight: "100vh"
|
|
76
171
|
},
|
|
77
|
-
children: /* @__PURE__ */
|
|
172
|
+
children: /* @__PURE__ */ a("div", { children: V || "Landing page não encontrada" })
|
|
78
173
|
}
|
|
79
174
|
);
|
|
80
|
-
if (
|
|
81
|
-
return /* @__PURE__ */
|
|
175
|
+
if (w && (!n || n === "home") && !s)
|
|
176
|
+
return /* @__PURE__ */ a(
|
|
82
177
|
"iframe",
|
|
83
178
|
{
|
|
84
|
-
srcDoc:
|
|
179
|
+
srcDoc: D(w),
|
|
85
180
|
title: "Site publicado",
|
|
86
181
|
style: {
|
|
87
182
|
width: "100%",
|
|
@@ -91,11 +186,11 @@ function J({
|
|
|
91
186
|
}
|
|
92
187
|
}
|
|
93
188
|
);
|
|
94
|
-
if (!
|
|
189
|
+
if (!s)
|
|
95
190
|
return null;
|
|
96
|
-
const
|
|
97
|
-
if (
|
|
98
|
-
return /* @__PURE__ */
|
|
191
|
+
const v = Array.isArray(s.pages) ? s.pages : [];
|
|
192
|
+
if (v.length === 0)
|
|
193
|
+
return /* @__PURE__ */ a(
|
|
99
194
|
"div",
|
|
100
195
|
{
|
|
101
196
|
style: {
|
|
@@ -106,70 +201,55 @@ function J({
|
|
|
106
201
|
padding: "2rem",
|
|
107
202
|
textAlign: "center"
|
|
108
203
|
},
|
|
109
|
-
children: /* @__PURE__ */
|
|
204
|
+
children: /* @__PURE__ */ a("div", { children: "Nenhuma página no site. Adicione páginas no editor." })
|
|
110
205
|
}
|
|
111
206
|
);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
"div",
|
|
207
|
+
if (M)
|
|
208
|
+
return /* @__PURE__ */ a(
|
|
209
|
+
"iframe",
|
|
116
210
|
{
|
|
211
|
+
srcDoc: D(M),
|
|
212
|
+
title: "Site",
|
|
117
213
|
style: {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
children: /* @__PURE__ */ t("div", { children: "Página não encontrada" })
|
|
214
|
+
width: "100%",
|
|
215
|
+
minHeight: "100vh",
|
|
216
|
+
border: "none",
|
|
217
|
+
backgroundColor: "#ffffff"
|
|
218
|
+
}
|
|
124
219
|
}
|
|
125
220
|
);
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
typography: o.typography && typeof o.typography == "object" ? { ...d.typography, ...o.typography } : d.typography
|
|
134
|
-
} : I.theme, D = {
|
|
135
|
-
...n,
|
|
136
|
-
schemaVersion: 2,
|
|
137
|
-
theme: V
|
|
138
|
-
}, L = g ? `/site/escola/${g}` : "/site", l = s.find((e) => e.id === "home") ?? s[0], w = l && l.id !== x.id ? {
|
|
139
|
-
...l,
|
|
140
|
-
structure: Array.isArray(l.structure) ? l.structure : []
|
|
141
|
-
} : void 0;
|
|
142
|
-
let f;
|
|
143
|
-
try {
|
|
144
|
-
f = z(
|
|
145
|
-
x,
|
|
146
|
-
D,
|
|
147
|
-
!0,
|
|
148
|
-
L,
|
|
149
|
-
w ? { layoutFromPage: w } : void 0
|
|
150
|
-
);
|
|
151
|
-
} catch (e) {
|
|
152
|
-
const r = e instanceof Error ? e.message : "Erro ao gerar HTML do site";
|
|
153
|
-
return /* @__PURE__ */ t(
|
|
221
|
+
let b = (n ? v.find((e) => e.slug === n || e.id === n) : null) ?? null;
|
|
222
|
+
if (!b && n) {
|
|
223
|
+
const e = W(v, n);
|
|
224
|
+
e && (b = e.page);
|
|
225
|
+
}
|
|
226
|
+
if (b || (b = v.find((e) => e.id === "home") ?? v[0]), !b)
|
|
227
|
+
return /* @__PURE__ */ a(
|
|
154
228
|
"div",
|
|
155
229
|
{
|
|
156
230
|
style: {
|
|
157
|
-
minHeight: "100vh",
|
|
158
231
|
display: "flex",
|
|
159
232
|
alignItems: "center",
|
|
160
233
|
justifyContent: "center",
|
|
161
|
-
|
|
162
|
-
textAlign: "center",
|
|
163
|
-
fontFamily: "system-ui, sans-serif"
|
|
234
|
+
minHeight: "100vh"
|
|
164
235
|
},
|
|
165
|
-
children: /* @__PURE__ */
|
|
166
|
-
/* @__PURE__ */ t("p", { style: { marginBottom: "0.5rem", fontWeight: 600 }, children: "Erro ao renderizar o site" }),
|
|
167
|
-
/* @__PURE__ */ t("p", { style: { color: "#666", fontSize: "0.875rem" }, children: r })
|
|
168
|
-
] })
|
|
236
|
+
children: /* @__PURE__ */ a("div", { children: "Página não encontrada" })
|
|
169
237
|
}
|
|
170
238
|
);
|
|
171
|
-
|
|
172
|
-
return
|
|
239
|
+
const $ = N(b, s, g, v);
|
|
240
|
+
return $ ? /* @__PURE__ */ a(
|
|
241
|
+
"iframe",
|
|
242
|
+
{
|
|
243
|
+
srcDoc: D($),
|
|
244
|
+
title: "Site",
|
|
245
|
+
style: {
|
|
246
|
+
width: "100%",
|
|
247
|
+
minHeight: "100vh",
|
|
248
|
+
border: "none",
|
|
249
|
+
backgroundColor: "#ffffff"
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
) : /* @__PURE__ */ a(
|
|
173
253
|
"div",
|
|
174
254
|
{
|
|
175
255
|
style: {
|
|
@@ -180,23 +260,41 @@ function J({
|
|
|
180
260
|
padding: "2rem",
|
|
181
261
|
textAlign: "center"
|
|
182
262
|
},
|
|
183
|
-
children: /* @__PURE__ */
|
|
184
|
-
}
|
|
185
|
-
) : /* @__PURE__ */ t(
|
|
186
|
-
"iframe",
|
|
187
|
-
{
|
|
188
|
-
srcDoc: f,
|
|
189
|
-
title: "Site",
|
|
190
|
-
style: {
|
|
191
|
-
width: "100%",
|
|
192
|
-
minHeight: "100vh",
|
|
193
|
-
border: "none",
|
|
194
|
-
backgroundColor: "#ffffff"
|
|
195
|
-
}
|
|
263
|
+
children: /* @__PURE__ */ a("div", { children: "Conteúdo da página vazio. Adicione blocos no editor." })
|
|
196
264
|
}
|
|
197
265
|
);
|
|
198
266
|
}
|
|
267
|
+
function N(o, r, h, n) {
|
|
268
|
+
const g = {
|
|
269
|
+
...o,
|
|
270
|
+
structure: Array.isArray(o.structure) ? o.structure : []
|
|
271
|
+
}, T = q(""), c = r.theme && typeof r.theme == "object" ? r.theme : null, P = c ? {
|
|
272
|
+
...A,
|
|
273
|
+
...c,
|
|
274
|
+
colors: c.colors && typeof c.colors == "object" ? { ...A.colors, ...c.colors } : A.colors,
|
|
275
|
+
typography: c.typography && typeof c.typography == "object" ? { ...A.typography, ...c.typography } : A.typography
|
|
276
|
+
} : T.theme, s = {
|
|
277
|
+
...r,
|
|
278
|
+
schemaVersion: 2,
|
|
279
|
+
theme: P
|
|
280
|
+
}, C = h ? `/site/escola/${h}` : "/site", w = n ?? r.pages, m = w.find((f) => f.id === "home") ?? w[0], E = m && m.id !== g.id ? {
|
|
281
|
+
...m,
|
|
282
|
+
structure: Array.isArray(m.structure) ? m.structure : []
|
|
283
|
+
} : void 0;
|
|
284
|
+
try {
|
|
285
|
+
const f = _(
|
|
286
|
+
g,
|
|
287
|
+
s,
|
|
288
|
+
!0,
|
|
289
|
+
C,
|
|
290
|
+
E ? { layoutFromPage: E } : void 0
|
|
291
|
+
);
|
|
292
|
+
return !f || !f.trim() ? null : f;
|
|
293
|
+
} catch (f) {
|
|
294
|
+
return z.error("Error generating HTML:", f), null;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
199
297
|
export {
|
|
200
|
-
|
|
298
|
+
re as LandingPageViewer
|
|
201
299
|
};
|
|
202
300
|
//# sourceMappingURL=LandingPageViewer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LandingPageViewer.js","sources":["../../src/viewer/LandingPageViewer.tsx"],"sourcesContent":["/**\n * Landing Page Viewer\n * Visualização pública da landing page.\n * Usa o mesmo mecanismo do Preview (editor): exportPageToHtml + iframe srcdoc.\n */\n\nimport { useState, useEffect } from \"react\";\nimport {\n SiteDocument,\n exportPageToHtml,\n createEmptySiteDocument,\n defaultThemeTokens,\n} from \"../engine\";\n\n/** Verifica se o HTML tem conteúdo real no body (evita usar publishedHtml vazio) */\nfunction hasBodyContent(html: string): boolean {\n if (!html || typeof html !== \"string\") return false;\n const match = html.match(/<body[^>]*>([\\s\\S]*?)<\\/body>/i);\n const bodyInner = match ? match[1].trim() : \"\";\n return bodyInner.length > 50;\n}\n\nexport interface SchoolData {\n id: string;\n name: string;\n slug: string;\n logo_url?: string;\n}\n\ninterface LandingPageViewerProps {\n siteId: string;\n apiBaseUrl: string;\n projectId: string;\n /** Slug da página (ex.: avisos). Se não informado, usa home. */\n pageSlug?: string;\n /** Slug da escola no contexto /site/escola/:schoolSlug */\n schoolSlug?: string;\n /** Dados da escola para header/navbar dinâmico (quando em contexto escola) */\n schoolData?: SchoolData;\n}\n\nexport function LandingPageViewer({\n siteId,\n apiBaseUrl,\n projectId,\n pageSlug,\n schoolSlug,\n schoolData: _schoolData, // reservado para header/navbar dinâmico (logo, nome da escola)\n}: LandingPageViewerProps) {\n const [document, setDocument] = useState<SiteDocument | null>(null);\n const [publishedHtml, setPublishedHtml] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n loadLandingPage();\n }, [siteId]);\n\n const loadLandingPage = async () => {\n setIsLoading(true);\n setError(null);\n\n try {\n const response = await fetch(\n `${apiBaseUrl}/sites/${siteId}?projectId=${projectId}`,\n );\n if (!response.ok) {\n throw new Error(\"Landing page não encontrada\");\n }\n\n const data = await response.json();\n\n // Sempre guardar template quando existir (para fallback se publishedHtml estiver vazio)\n if (data.template) {\n const schemaVersion = data.template.schemaVersion;\n const hasPages =\n data.template.pages && Array.isArray(data.template.pages);\n const isV2 = schemaVersion === 2 || schemaVersion === \"2\" || hasPages;\n\n if (isV2) {\n const template = data.template as SiteDocument;\n if (!Array.isArray(template.pages)) {\n template.pages = [];\n }\n if (template.schemaVersion !== 2 && template.schemaVersion !== \"2\") {\n template.schemaVersion = 2;\n }\n setDocument(template);\n } else {\n throw new Error(\n \"Formato de template legado não suportado. Por favor, recrie o site.\",\n );\n }\n } else {\n setDocument(null);\n }\n\n // publishedHtml só é usado se tiver conteúdo no body (evita tela em branco quando salvo vazio)\n if (data.publishedHtml && hasBodyContent(data.publishedHtml)) {\n setPublishedHtml(data.publishedHtml);\n } else {\n setPublishedHtml(null);\n }\n\n if (!data.template && !data.publishedHtml) {\n throw new Error(\"Template não encontrado\");\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : \"Erro ao carregar landing page\",\n );\n } finally {\n setIsLoading(false);\n }\n };\n\n if (isLoading) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n }}\n >\n <div>Carregando...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n }}\n >\n <div>{error || \"Landing page não encontrada\"}</div>\n </div>\n );\n }\n\n // Preferir renderização via template (client-side) quando disponível.\n // Isso garante que o viewer usa exatamente o mesmo exportPageToHtml() do editor,\n // evitando diferenças de hover effects, CSS, etc. entre editor e site publicado.\n // publishedHtml do servidor é usado apenas como fallback quando não há template.\n const isHomeRoute = !pageSlug || pageSlug === \"home\";\n if (publishedHtml && isHomeRoute && !document) {\n return (\n <iframe\n srcDoc={publishedHtml}\n title=\"Site publicado\"\n style={{\n width: \"100%\",\n minHeight: \"100vh\",\n border: \"none\",\n backgroundColor: \"#ffffff\",\n }}\n />\n );\n }\n\n // Renderizar documento (template) — mesmo pipeline do editor\n if (!document) {\n return null;\n }\n\n // Garantir que pages seja array (evita crash se API retornar formato inesperado)\n const pages = Array.isArray(document.pages) ? document.pages : [];\n\n if (pages.length === 0) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n padding: \"2rem\",\n textAlign: \"center\",\n }}\n >\n <div>Nenhuma página no site. Adicione páginas no editor.</div>\n </div>\n );\n }\n\n // Resolver página por slug ou id; fallback para home\n const page =\n (pageSlug\n ? pages.find((p) => p.slug === pageSlug || p.id === pageSlug)\n : null) ??\n pages.find((p) => p.id === \"home\") ??\n pages[0];\n\n if (!page) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n }}\n >\n <div>Página não encontrada</div>\n </div>\n );\n }\n\n // Garantir structure para o export (evita erro se página vier sem structure)\n const pageWithStructure = {\n ...page,\n structure: Array.isArray(page.structure) ? page.structure : [],\n };\n\n // Garantir theme completo para o export (merge com default evita theme parcial quebrar CSS)\n const defaultDoc = createEmptySiteDocument(\"\");\n const rawTheme =\n document.theme && typeof document.theme === \"object\"\n ? document.theme\n : null;\n const theme = rawTheme\n ? {\n ...defaultThemeTokens,\n ...rawTheme,\n colors:\n rawTheme.colors && typeof rawTheme.colors === \"object\"\n ? { ...defaultThemeTokens.colors, ...rawTheme.colors }\n : defaultThemeTokens.colors,\n typography:\n rawTheme.typography && typeof rawTheme.typography === \"object\"\n ? { ...defaultThemeTokens.typography, ...rawTheme.typography }\n : defaultThemeTokens.typography,\n }\n : defaultDoc.theme;\n\n const documentWithTheme: SiteDocument = {\n ...document,\n schemaVersion: 2,\n theme,\n };\n\n // basePath para links (ex.: /site ou /site/escola/:slug)\n const basePath = schoolSlug ? `/site/escola/${schoolSlug}` : \"/site\";\n\n const homePage = pages.find((p) => p.id === \"home\") ?? pages[0];\n const layoutFromPage =\n homePage && homePage.id !== pageWithStructure.id\n ? {\n ...homePage,\n structure: Array.isArray(homePage.structure)\n ? homePage.structure\n : [],\n }\n : undefined;\n\n let html: string;\n try {\n html = exportPageToHtml(\n pageWithStructure,\n documentWithTheme,\n true,\n basePath,\n layoutFromPage ? { layoutFromPage } : undefined,\n );\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Erro ao gerar HTML do site\";\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n textAlign: \"center\",\n fontFamily: \"system-ui, sans-serif\",\n }}\n >\n <div>\n <p style={{ marginBottom: \"0.5rem\", fontWeight: 600 }}>\n Erro ao renderizar o site\n </p>\n <p style={{ color: \"#666\", fontSize: \"0.875rem\" }}>{message}</p>\n </div>\n </div>\n );\n }\n\n if (!html || !html.trim()) {\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n textAlign: \"center\",\n }}\n >\n <div>Conteúdo da página vazio. Adicione blocos no editor.</div>\n </div>\n );\n }\n\n // Mesmo mecanismo do Preview (editor): iframe com srcdoc = HTML completo\n return (\n <iframe\n srcDoc={html}\n title=\"Site\"\n style={{\n width: \"100%\",\n minHeight: \"100vh\",\n border: \"none\",\n backgroundColor: \"#ffffff\",\n }}\n />\n );\n}\n"],"names":["hasBodyContent","html","match","LandingPageViewer","siteId","apiBaseUrl","projectId","pageSlug","schoolSlug","_schoolData","document","setDocument","useState","publishedHtml","setPublishedHtml","isLoading","setIsLoading","error","setError","useEffect","loadLandingPage","response","data","schemaVersion","hasPages","template","err","jsx","pages","page","p","pageWithStructure","defaultDoc","createEmptySiteDocument","rawTheme","theme","defaultThemeTokens","documentWithTheme","basePath","homePage","layoutFromPage","exportPageToHtml","message"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LandingPageViewer.js","sources":["../../src/viewer/LandingPageViewer.tsx"],"sourcesContent":["/**\n * Landing Page Viewer\n * Visualização pública da landing page.\n * Usa o mesmo mecanismo do Preview (editor): exportPageToHtml + iframe srcdoc.\n *\n * Supports dynamic pages via ContentProvider (Sprint 3):\n * - Optional `contentProviders` prop allows consumer to supply data providers\n * - Dynamic page resolution (e.g., \"blog/:slug\")\n * - Automatic content hydration before rendering\n */\n\nimport { useState, useEffect, useRef, useCallback } from \"react\";\nimport {\n SiteDocument,\n SitePage,\n exportPageToHtml,\n createEmptySiteDocument,\n defaultThemeTokens,\n} from \"../engine\";\nimport type { ContentProvider } from \"../engine/plugins/types\";\nimport { matchDynamicPage } from \"../engine/plugins/dynamicPageResolver\";\nimport {\n hydratePageWithContent,\n type ContentProviderMap,\n} from \"../engine/plugins/contentHydration\";\nimport { logger } from \"../utils/logger\";\n\n/** Verifica se o HTML tem conteúdo real no body (evita usar publishedHtml vazio) */\nfunction hasBodyContent(html: string): boolean {\n if (!html || typeof html !== \"string\") return false;\n const match = html.match(/<body[^>]*>([\\s\\S]*?)<\\/body>/i);\n const bodyInner = match ? match[1].trim() : \"\";\n return bodyInner.length > 50;\n}\n\nexport interface SchoolData {\n id: string;\n name: string;\n slug: string;\n logo_url?: string;\n}\n\ninterface LandingPageViewerProps {\n siteId: string;\n apiBaseUrl: string;\n projectId: string;\n /** Slug da página (ex.: avisos). Se não informado, usa home. */\n pageSlug?: string;\n /** Slug da escola no contexto /site/escola/:schoolSlug */\n schoolSlug?: string;\n /** Dados da escola para header/navbar dinâmico (quando em contexto escola) */\n schoolData?: SchoolData;\n /**\n * Content providers for dynamic pages (e.g., blog posts, products).\n * Supplied by the consumer project to connect plugin data to the viewer.\n */\n contentProviders?: ContentProvider[];\n /**\n * Callback for internal navigation (link clicks inside iframe).\n * Receives the href from clicked links. Consumer should use router navigation.\n */\n onNavigate?: (href: string) => void;\n}\n\n/**\n * Builds a ContentProviderMap from an array of providers.\n */\nfunction buildProviderMap(providers?: ContentProvider[]): ContentProviderMap {\n const map: ContentProviderMap = new Map();\n if (providers) {\n for (const p of providers) {\n map.set(p.type, p);\n }\n }\n return map;\n}\n\nexport function LandingPageViewer({\n siteId,\n apiBaseUrl,\n projectId,\n pageSlug,\n schoolSlug,\n schoolData: _schoolData, // reservado para header/navbar dinâmico (logo, nome da escola)\n contentProviders,\n onNavigate,\n}: LandingPageViewerProps) {\n const [document, setDocument] = useState<SiteDocument | null>(null);\n const [publishedHtml, setPublishedHtml] = useState<string | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [hydratedHtml, setHydratedHtml] = useState<string | null>(null);\n\n const onNavigateRef = useRef(onNavigate);\n onNavigateRef.current = onNavigate;\n\n // Inject click interceptor into iframe HTML so link clicks propagate to parent\n const injectClickInterceptor = useCallback((html: string): string => {\n const script = `<script>\n(function() {\n document.addEventListener('click', function(e) {\n var target = e.target;\n var anchor = target;\n while (anchor && anchor.tagName !== 'A') {\n anchor = anchor.parentElement;\n }\n if (anchor && anchor.tagName === 'A') {\n var href = anchor.getAttribute('href') || '';\n if (href && href !== '#' && !href.startsWith('javascript:')) {\n e.preventDefault();\n e.stopPropagation();\n window.parent.postMessage({ type: 'viewer-navigate', href: href }, '*');\n return;\n }\n }\n }, true);\n})();\n</script>`;\n if (html.includes(\"</body>\")) {\n return html.replace(\"</body>\", `${script}</body>`);\n }\n return html + script;\n }, []);\n\n // Listen for navigation messages from iframe\n useEffect(() => {\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === \"viewer-navigate\" && event.data?.href) {\n if (onNavigateRef.current) {\n onNavigateRef.current(event.data.href);\n }\n }\n };\n window.addEventListener(\"message\", handleMessage);\n return () => window.removeEventListener(\"message\", handleMessage);\n }, []);\n\n // Load site document from API. Uses stale flag to prevent\n // React Strict Mode double-mount from causing duplicate state updates.\n useEffect(() => {\n let stale = false;\n\n setIsLoading(true);\n setError(null);\n\n (async () => {\n try {\n const response = await fetch(\n `${apiBaseUrl}/sites/${siteId}?projectId=${projectId}`,\n );\n if (!response.ok) {\n throw new Error(\"Landing page não encontrada\");\n }\n\n const data = await response.json();\n if (stale) return;\n\n if (data.template) {\n const schemaVersion = data.template.schemaVersion;\n const hasPages =\n data.template.pages && Array.isArray(data.template.pages);\n const isV2 =\n schemaVersion === 2 || schemaVersion === \"2\" || hasPages;\n\n if (isV2) {\n const template = data.template as SiteDocument;\n if (!Array.isArray(template.pages)) {\n template.pages = [];\n }\n if (\n template.schemaVersion !== 2 &&\n template.schemaVersion !== \"2\"\n ) {\n template.schemaVersion = 2;\n }\n setDocument(template);\n } else {\n throw new Error(\n \"Formato de template legado não suportado. Por favor, recrie o site.\",\n );\n }\n } else {\n setDocument(null);\n }\n\n if (data.publishedHtml && hasBodyContent(data.publishedHtml)) {\n setPublishedHtml(data.publishedHtml);\n } else {\n setPublishedHtml(null);\n }\n\n if (!data.template && !data.publishedHtml) {\n throw new Error(\"Template não encontrado\");\n }\n } catch (err) {\n if (!stale) {\n setError(\n err instanceof Error\n ? err.message\n : \"Erro ao carregar landing page\",\n );\n }\n } finally {\n if (!stale) {\n setIsLoading(false);\n }\n }\n })();\n\n return () => {\n stale = true;\n };\n }, [siteId, apiBaseUrl, projectId]);\n\n // Hydrate pages when document + contentProviders are available.\n // Supports both: pages with explicit dataSource AND pages with blogPostGrid blocks.\n // Does NOT reset hydratedHtml at the start to avoid flash of mock data.\n // Only clears it when navigating to a page that doesn't need hydration.\n useEffect(() => {\n if (!document) {\n setHydratedHtml(null);\n return;\n }\n\n let stale = false;\n\n const pages = Array.isArray(document.pages) ? document.pages : [];\n const providerMap = buildProviderMap(contentProviders);\n\n if (providerMap.size === 0) {\n setHydratedHtml(null);\n return;\n }\n\n // Resolve the current page\n let resolvedPage: SitePage | undefined;\n let urlParams: Record<string, string> = {};\n\n if (pageSlug) {\n const exactPage = pages.find(\n (p) => p.slug === pageSlug || p.id === pageSlug,\n );\n if (exactPage) {\n resolvedPage = exactPage;\n } else {\n const match = matchDynamicPage(pages, pageSlug);\n if (match) {\n resolvedPage = match.page;\n urlParams = match.params;\n }\n }\n } else {\n resolvedPage = pages.find((p) => p.id === \"home\") ?? pages[0];\n }\n\n if (!resolvedPage) {\n setHydratedHtml(null);\n return;\n }\n\n // Check if page needs hydration:\n // 1. Has explicit dataSource (blog page, blog-post page)\n // 2. Has blogPostGrid blocks but no dataSource (home page with blog widget)\n const hasDataSource = !!resolvedPage.dataSource;\n const hasBlogBlocks = resolvedPage.structure?.some(\n (b) => b.type === \"blogPostGrid\",\n );\n\n if (!hasDataSource && !hasBlogBlocks) {\n setHydratedHtml(null);\n return;\n }\n\n // For pages without dataSource but with blog blocks, create synthetic dataSource\n let pageToHydrate = resolvedPage;\n if (!hasDataSource && hasBlogBlocks) {\n pageToHydrate = {\n ...resolvedPage,\n dataSource: { mode: \"list\" as const, provider: \"blog-posts\" },\n };\n }\n\n hydratePageWithContent(pageToHydrate, providerMap, urlParams)\n .then((hydratedPage) => {\n if (stale) return;\n const html = renderPageToHtml(\n hydratedPage,\n document,\n schoolSlug,\n pages,\n );\n setHydratedHtml(html ?? null);\n })\n .catch((err) => {\n if (!stale) {\n logger.error(\"Error hydrating page:\", err);\n setHydratedHtml(null);\n }\n });\n\n return () => {\n stale = true;\n };\n }, [document, pageSlug, contentProviders, schoolSlug]);\n\n if (isLoading) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n }}\n >\n <div>Carregando...</div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n }}\n >\n <div>{error || \"Landing page não encontrada\"}</div>\n </div>\n );\n }\n\n // Preferir renderização via template (client-side) quando disponível.\n // Isso garante que o viewer usa exatamente o mesmo exportPageToHtml() do editor,\n // evitando diferenças de hover effects, CSS, etc. entre editor e site publicado.\n // publishedHtml do servidor é usado apenas como fallback quando não há template.\n const isHomeRoute = !pageSlug || pageSlug === \"home\";\n if (publishedHtml && isHomeRoute && !document) {\n return (\n <iframe\n srcDoc={injectClickInterceptor(publishedHtml)}\n title=\"Site publicado\"\n style={{\n width: \"100%\",\n minHeight: \"100vh\",\n border: \"none\",\n backgroundColor: \"#ffffff\",\n }}\n />\n );\n }\n\n // Renderizar documento (template) — mesmo pipeline do editor\n if (!document) {\n return null;\n }\n\n // Garantir que pages seja array (evita crash se API retornar formato inesperado)\n const pages = Array.isArray(document.pages) ? document.pages : [];\n\n if (pages.length === 0) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n padding: \"2rem\",\n textAlign: \"center\",\n }}\n >\n <div>Nenhuma página no site. Adicione páginas no editor.</div>\n </div>\n );\n }\n\n // If we have hydrated HTML from ContentProvider, use it\n if (hydratedHtml) {\n return (\n <iframe\n srcDoc={injectClickInterceptor(hydratedHtml)}\n title=\"Site\"\n style={{\n width: \"100%\",\n minHeight: \"100vh\",\n border: \"none\",\n backgroundColor: \"#ffffff\",\n }}\n />\n );\n }\n\n // Resolver página por slug ou id; fallback para home\n // Also try dynamic page resolution\n let page =\n (pageSlug\n ? pages.find((p) => p.slug === pageSlug || p.id === pageSlug)\n : null) ??\n null;\n\n if (!page && pageSlug) {\n const match = matchDynamicPage(pages, pageSlug);\n if (match) {\n page = match.page;\n }\n }\n\n if (!page) {\n page = pages.find((p) => p.id === \"home\") ?? pages[0];\n }\n\n if (!page) {\n return (\n <div\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n minHeight: \"100vh\",\n }}\n >\n <div>Página não encontrada</div>\n </div>\n );\n }\n\n const html = renderPageToHtml(page, document, schoolSlug, pages);\n if (!html) {\n return (\n <div\n style={{\n minHeight: \"100vh\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n padding: \"2rem\",\n textAlign: \"center\",\n }}\n >\n <div>Conteúdo da página vazio. Adicione blocos no editor.</div>\n </div>\n );\n }\n\n // Mesmo mecanismo do Preview (editor): iframe com srcdoc = HTML completo\n return (\n <iframe\n srcDoc={injectClickInterceptor(html)}\n title=\"Site\"\n style={{\n width: \"100%\",\n minHeight: \"100vh\",\n border: \"none\",\n backgroundColor: \"#ffffff\",\n }}\n />\n );\n}\n\n/**\n * Generates HTML from a page using the standard export pipeline.\n * Extracted to reuse for both static and hydrated pages.\n */\nfunction renderPageToHtml(\n page: SitePage,\n document: SiteDocument,\n schoolSlug?: string,\n allPages?: SitePage[],\n): string | null {\n // Garantir structure para o export (evita erro se página vier sem structure)\n const pageWithStructure = {\n ...page,\n structure: Array.isArray(page.structure) ? page.structure : [],\n };\n\n // Garantir theme completo para o export (merge com default evita theme parcial quebrar CSS)\n const defaultDoc = createEmptySiteDocument(\"\");\n const rawTheme =\n document.theme && typeof document.theme === \"object\"\n ? document.theme\n : null;\n const theme = rawTheme\n ? {\n ...defaultThemeTokens,\n ...rawTheme,\n colors:\n rawTheme.colors && typeof rawTheme.colors === \"object\"\n ? { ...defaultThemeTokens.colors, ...rawTheme.colors }\n : defaultThemeTokens.colors,\n typography:\n rawTheme.typography && typeof rawTheme.typography === \"object\"\n ? { ...defaultThemeTokens.typography, ...rawTheme.typography }\n : defaultThemeTokens.typography,\n }\n : defaultDoc.theme;\n\n const documentWithTheme: SiteDocument = {\n ...document,\n schemaVersion: 2,\n theme,\n };\n\n // basePath para links (ex.: /site ou /site/escola/:slug)\n const basePath = schoolSlug ? `/site/escola/${schoolSlug}` : \"/site\";\n\n const pages = allPages ?? document.pages;\n const homePage = pages.find((p) => p.id === \"home\") ?? pages[0];\n const layoutFromPage =\n homePage && homePage.id !== pageWithStructure.id\n ? {\n ...homePage,\n structure: Array.isArray(homePage.structure)\n ? homePage.structure\n : [],\n }\n : undefined;\n\n try {\n const html = exportPageToHtml(\n pageWithStructure,\n documentWithTheme,\n true,\n basePath,\n layoutFromPage ? { layoutFromPage } : undefined,\n );\n\n if (!html || !html.trim()) {\n return null;\n }\n\n return html;\n } catch (err) {\n logger.error(\"Error generating HTML:\", err);\n return null;\n }\n}\n"],"names":["hasBodyContent","html","match","buildProviderMap","providers","map","p","LandingPageViewer","siteId","apiBaseUrl","projectId","pageSlug","schoolSlug","_schoolData","contentProviders","onNavigate","document","setDocument","useState","publishedHtml","setPublishedHtml","isLoading","setIsLoading","error","setError","hydratedHtml","setHydratedHtml","onNavigateRef","useRef","injectClickInterceptor","useCallback","script","useEffect","handleMessage","event","stale","response","data","schemaVersion","hasPages","template","err","pages","providerMap","resolvedPage","urlParams","exactPage","matchDynamicPage","hasDataSource","hasBlogBlocks","b","pageToHydrate","hydratePageWithContent","hydratedPage","renderPageToHtml","logger","jsx","page","allPages","pageWithStructure","defaultDoc","createEmptySiteDocument","rawTheme","theme","defaultThemeTokens","documentWithTheme","basePath","homePage","layoutFromPage","exportPageToHtml"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@brunoalz/smartgesti-site-editor",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Site editor component for SmartGesti platform",
|
|
@@ -27,7 +27,8 @@
|
|
|
27
27
|
"*.css",
|
|
28
28
|
"./src/engine/registry/blocks/**",
|
|
29
29
|
"./src/engine/render/renderers/**",
|
|
30
|
-
"./src/engine/export/exporters/**"
|
|
30
|
+
"./src/engine/export/exporters/**",
|
|
31
|
+
"./src/engine/plugins/builtin/**"
|
|
31
32
|
],
|
|
32
33
|
"main": "./dist/index.js",
|
|
33
34
|
"types": "./dist/index.d.ts",
|