@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,37 +1,61 @@
|
|
|
1
|
-
import { jsxs as t, jsx as r } from "react/jsx-runtime";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import { jsxs as t, jsx as r, Fragment as f } from "react/jsx-runtime";
|
|
2
|
+
import { useState as $, useRef as M, useEffect as L, useMemo as c, useCallback as j } from "react";
|
|
3
|
+
import { pluginRegistry as A } from "../engine/plugins/pluginRegistry.js";
|
|
4
|
+
function R({
|
|
5
|
+
pages: n,
|
|
6
|
+
currentPageId: h,
|
|
7
|
+
onSelectPage: u,
|
|
8
|
+
onAddPage: k,
|
|
9
|
+
onRemovePage: v,
|
|
10
|
+
canRemovePage: y,
|
|
11
|
+
activePlugins: w,
|
|
12
|
+
onActivatePlugin: g,
|
|
13
|
+
onDeactivatePlugin: m
|
|
9
14
|
}) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
+
const [l, o] = $(!1), d = M(null);
|
|
16
|
+
L(() => {
|
|
17
|
+
if (!l) return;
|
|
18
|
+
const e = (a) => {
|
|
19
|
+
d.current && !d.current.contains(a.target) && o(!1);
|
|
20
|
+
};
|
|
21
|
+
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
22
|
+
}, [l]);
|
|
23
|
+
const p = c(() => A.getAll(), []), N = c(
|
|
24
|
+
() => n.filter((e) => !e.pluginId),
|
|
25
|
+
[n]
|
|
26
|
+
), x = c(
|
|
27
|
+
() => n.filter((e) => !!e.pluginId),
|
|
28
|
+
[n]
|
|
29
|
+
), C = j(
|
|
30
|
+
(e, a) => {
|
|
31
|
+
a ? m(e) : g(e);
|
|
32
|
+
},
|
|
33
|
+
[g, m]
|
|
34
|
+
);
|
|
35
|
+
return /* @__PURE__ */ t("div", { className: "flex items-center border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 px-4 py-2.5", children: [
|
|
36
|
+
/* @__PURE__ */ t("div", { className: "flex-1 flex items-center gap-2 overflow-x-auto min-w-0 scrollbar-thin scrollbar-thumb-gray-300 dark:scrollbar-thumb-gray-600 pr-2", children: [
|
|
37
|
+
N.map((e) => {
|
|
38
|
+
const a = e.id === h;
|
|
15
39
|
return /* @__PURE__ */ t(
|
|
16
40
|
"div",
|
|
17
41
|
{
|
|
18
42
|
className: `
|
|
19
|
-
group relative flex items-center gap-2 px-
|
|
20
|
-
rounded-
|
|
21
|
-
${
|
|
43
|
+
group relative flex items-center gap-2 px-4 py-2
|
|
44
|
+
rounded-lg cursor-pointer transition-all duration-150 flex-shrink-0
|
|
45
|
+
${a ? "bg-blue-500 text-white shadow-md shadow-blue-500/25" : "bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700"}
|
|
22
46
|
`,
|
|
23
|
-
onClick: () =>
|
|
24
|
-
title:
|
|
47
|
+
onClick: () => u(e.id),
|
|
48
|
+
title: `${e.name} (/${e.slug})`,
|
|
25
49
|
children: [
|
|
26
50
|
/* @__PURE__ */ t(
|
|
27
51
|
"svg",
|
|
28
52
|
{
|
|
29
|
-
width: "
|
|
30
|
-
height: "
|
|
53
|
+
width: "15",
|
|
54
|
+
height: "15",
|
|
31
55
|
viewBox: "0 0 16 16",
|
|
32
56
|
fill: "none",
|
|
33
57
|
stroke: "currentColor",
|
|
34
|
-
strokeWidth: "
|
|
58
|
+
strokeWidth: "1.5",
|
|
35
59
|
strokeLinecap: "round",
|
|
36
60
|
strokeLinejoin: "round",
|
|
37
61
|
children: [
|
|
@@ -40,19 +64,19 @@ function g({
|
|
|
40
64
|
]
|
|
41
65
|
}
|
|
42
66
|
),
|
|
43
|
-
/* @__PURE__ */ r("span", { className: "text-
|
|
44
|
-
|
|
67
|
+
/* @__PURE__ */ r("span", { className: "text-sm font-medium whitespace-nowrap", children: e.name }),
|
|
68
|
+
y(e.id) && /* @__PURE__ */ r(
|
|
45
69
|
"button",
|
|
46
70
|
{
|
|
47
|
-
onClick: (
|
|
48
|
-
|
|
71
|
+
onClick: (s) => {
|
|
72
|
+
s.stopPropagation(), v(e.id);
|
|
49
73
|
},
|
|
50
74
|
className: `
|
|
51
|
-
flex-shrink-0 w-
|
|
75
|
+
flex-shrink-0 w-5 h-5 rounded flex items-center justify-center
|
|
52
76
|
transition-all duration-150
|
|
53
|
-
${
|
|
77
|
+
${a ? "opacity-60 hover:opacity-100 hover:bg-white/20" : "opacity-0 group-hover:opacity-60 hover:!opacity-100 hover:bg-red-500 hover:text-white"}
|
|
54
78
|
`,
|
|
55
|
-
title: `Remover
|
|
79
|
+
title: `Remover ${e.name}`,
|
|
56
80
|
children: /* @__PURE__ */ r(
|
|
57
81
|
"svg",
|
|
58
82
|
{
|
|
@@ -73,25 +97,48 @@ function g({
|
|
|
73
97
|
e.id
|
|
74
98
|
);
|
|
75
99
|
}),
|
|
100
|
+
x.length > 0 && /* @__PURE__ */ t(f, { children: [
|
|
101
|
+
/* @__PURE__ */ r("div", { className: "w-px h-6 bg-gray-200 dark:bg-gray-700 flex-shrink-0" }),
|
|
102
|
+
x.map((e) => {
|
|
103
|
+
const a = e.id === h;
|
|
104
|
+
return /* @__PURE__ */ t(
|
|
105
|
+
"div",
|
|
106
|
+
{
|
|
107
|
+
className: `
|
|
108
|
+
flex items-center gap-2 px-4 py-2
|
|
109
|
+
rounded-lg cursor-pointer transition-all duration-150 flex-shrink-0
|
|
110
|
+
${a ? "bg-purple-500 text-white shadow-md shadow-purple-500/25" : "bg-purple-50 dark:bg-purple-900/20 text-purple-700 dark:text-purple-300 hover:bg-purple-100 dark:hover:bg-purple-900/40"}
|
|
111
|
+
`,
|
|
112
|
+
onClick: () => u(e.id),
|
|
113
|
+
title: `Plugin: ${e.name} (/${e.slug})`,
|
|
114
|
+
children: [
|
|
115
|
+
/* @__PURE__ */ r("span", { className: "text-sm flex-shrink-0", children: "🧩" }),
|
|
116
|
+
/* @__PURE__ */ r("span", { className: "text-sm font-medium whitespace-nowrap", children: e.name })
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
e.id
|
|
120
|
+
);
|
|
121
|
+
})
|
|
122
|
+
] })
|
|
123
|
+
] }),
|
|
124
|
+
/* @__PURE__ */ t("div", { className: "flex-shrink-0 ml-3 relative", ref: d, children: [
|
|
76
125
|
/* @__PURE__ */ t(
|
|
77
126
|
"button",
|
|
78
127
|
{
|
|
79
|
-
onClick:
|
|
128
|
+
onClick: () => o((e) => !e),
|
|
80
129
|
className: `
|
|
81
|
-
flex items-center
|
|
82
|
-
text-
|
|
83
|
-
bg-
|
|
84
|
-
|
|
85
|
-
border border-dashed border-gray-300 dark:border-gray-600
|
|
86
|
-
rounded-md transition-all duration-150 flex-shrink-0
|
|
130
|
+
flex items-center gap-2 px-4 py-2
|
|
131
|
+
text-sm font-medium rounded-lg transition-all duration-150
|
|
132
|
+
bg-blue-500 text-white hover:bg-blue-600
|
|
133
|
+
shadow-sm hover:shadow-md
|
|
87
134
|
`,
|
|
88
|
-
title: "Adicionar
|
|
135
|
+
title: "Adicionar página ou ativar plugin",
|
|
89
136
|
children: [
|
|
90
137
|
/* @__PURE__ */ r(
|
|
91
138
|
"svg",
|
|
92
139
|
{
|
|
93
|
-
width: "
|
|
94
|
-
height: "
|
|
140
|
+
width: "16",
|
|
141
|
+
height: "16",
|
|
95
142
|
viewBox: "0 0 16 16",
|
|
96
143
|
fill: "none",
|
|
97
144
|
stroke: "currentColor",
|
|
@@ -100,14 +147,105 @@ function g({
|
|
|
100
147
|
children: /* @__PURE__ */ r("path", { d: "M8 3V13M3 8H13" })
|
|
101
148
|
}
|
|
102
149
|
),
|
|
103
|
-
/* @__PURE__ */ r("span", { className: "whitespace-nowrap", children: "
|
|
150
|
+
/* @__PURE__ */ r("span", { className: "whitespace-nowrap", children: "Adicionar" }),
|
|
151
|
+
/* @__PURE__ */ r(
|
|
152
|
+
"svg",
|
|
153
|
+
{
|
|
154
|
+
className: `w-3.5 h-3.5 transition-transform ${l ? "rotate-180" : ""}`,
|
|
155
|
+
fill: "none",
|
|
156
|
+
viewBox: "0 0 24 24",
|
|
157
|
+
stroke: "currentColor",
|
|
158
|
+
strokeWidth: 2,
|
|
159
|
+
children: /* @__PURE__ */ r("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M19 9l-7 7-7-7" })
|
|
160
|
+
}
|
|
161
|
+
)
|
|
104
162
|
]
|
|
105
163
|
}
|
|
106
|
-
)
|
|
164
|
+
),
|
|
165
|
+
l && /* @__PURE__ */ t("div", { className: "absolute top-full right-0 mt-2 w-72 bg-white dark:bg-gray-800 rounded-xl shadow-xl border border-gray-200 dark:border-gray-700 z-50 overflow-hidden", children: [
|
|
166
|
+
/* @__PURE__ */ t(
|
|
167
|
+
"button",
|
|
168
|
+
{
|
|
169
|
+
onClick: () => {
|
|
170
|
+
o(!1), k();
|
|
171
|
+
},
|
|
172
|
+
className: "w-full flex items-center gap-3 px-4 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors",
|
|
173
|
+
children: [
|
|
174
|
+
/* @__PURE__ */ r("div", { className: "w-8 h-8 rounded-lg bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center flex-shrink-0", children: /* @__PURE__ */ r(
|
|
175
|
+
"svg",
|
|
176
|
+
{
|
|
177
|
+
width: "16",
|
|
178
|
+
height: "16",
|
|
179
|
+
viewBox: "0 0 16 16",
|
|
180
|
+
fill: "none",
|
|
181
|
+
stroke: "currentColor",
|
|
182
|
+
strokeWidth: "2",
|
|
183
|
+
strokeLinecap: "round",
|
|
184
|
+
className: "text-blue-600 dark:text-blue-400",
|
|
185
|
+
children: /* @__PURE__ */ r("path", { d: "M8 3V13M3 8H13" })
|
|
186
|
+
}
|
|
187
|
+
) }),
|
|
188
|
+
/* @__PURE__ */ t("div", { children: [
|
|
189
|
+
/* @__PURE__ */ r("p", { className: "text-sm font-medium text-gray-800 dark:text-gray-200", children: "Nova Página" }),
|
|
190
|
+
/* @__PURE__ */ r("p", { className: "text-xs text-gray-500 dark:text-gray-400", children: "Criar uma página em branco" })
|
|
191
|
+
] })
|
|
192
|
+
]
|
|
193
|
+
}
|
|
194
|
+
),
|
|
195
|
+
p.length > 0 && /* @__PURE__ */ t(f, { children: [
|
|
196
|
+
/* @__PURE__ */ r("div", { className: "border-t border-gray-200 dark:border-gray-700" }),
|
|
197
|
+
/* @__PURE__ */ r("div", { className: "px-4 py-2", children: /* @__PURE__ */ r("p", { className: "text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wider", children: "Plugins" }) }),
|
|
198
|
+
p.map((e) => {
|
|
199
|
+
const { id: a, name: s, description: b } = e.manifest, i = w.includes(a);
|
|
200
|
+
return /* @__PURE__ */ t(
|
|
201
|
+
"div",
|
|
202
|
+
{
|
|
203
|
+
className: "flex items-center gap-3 px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors",
|
|
204
|
+
children: [
|
|
205
|
+
/* @__PURE__ */ r(
|
|
206
|
+
"div",
|
|
207
|
+
{
|
|
208
|
+
className: `w-8 h-8 rounded-lg flex items-center justify-center flex-shrink-0 transition-colors ${i ? "bg-purple-100 dark:bg-purple-900/30" : "bg-gray-100 dark:bg-gray-800"}`,
|
|
209
|
+
children: /* @__PURE__ */ r("span", { className: "text-base", children: "🧩" })
|
|
210
|
+
}
|
|
211
|
+
),
|
|
212
|
+
/* @__PURE__ */ t("div", { className: "flex-1 min-w-0", children: [
|
|
213
|
+
/* @__PURE__ */ r("p", { className: "text-sm font-medium text-gray-800 dark:text-gray-200", children: s }),
|
|
214
|
+
b && /* @__PURE__ */ r("p", { className: "text-xs text-gray-500 dark:text-gray-400 truncate", children: b })
|
|
215
|
+
] }),
|
|
216
|
+
/* @__PURE__ */ r(
|
|
217
|
+
"button",
|
|
218
|
+
{
|
|
219
|
+
onClick: () => C(a, i),
|
|
220
|
+
className: `
|
|
221
|
+
relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors
|
|
222
|
+
${i ? "bg-purple-500" : "bg-gray-300 dark:bg-gray-600"}
|
|
223
|
+
`,
|
|
224
|
+
role: "switch",
|
|
225
|
+
"aria-checked": i,
|
|
226
|
+
"aria-label": `${i ? "Desativar" : "Ativar"} ${s}`,
|
|
227
|
+
children: /* @__PURE__ */ r(
|
|
228
|
+
"span",
|
|
229
|
+
{
|
|
230
|
+
className: `
|
|
231
|
+
pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow transform transition-transform
|
|
232
|
+
${i ? "translate-x-5" : "translate-x-0"}
|
|
233
|
+
`
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
}
|
|
237
|
+
)
|
|
238
|
+
]
|
|
239
|
+
},
|
|
240
|
+
a
|
|
241
|
+
);
|
|
242
|
+
})
|
|
243
|
+
] })
|
|
244
|
+
] })
|
|
107
245
|
] })
|
|
108
246
|
] });
|
|
109
247
|
}
|
|
110
248
|
export {
|
|
111
|
-
|
|
249
|
+
R as PageTabBar
|
|
112
250
|
};
|
|
113
251
|
//# sourceMappingURL=PageTabBar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageTabBar.js","sources":["../../src/editor/PageTabBar.tsx"],"sourcesContent":["/**\n * PageTabBar - Barra de abas para navegação entre páginas\n * Componente inspirado em abas de browser para switching entre páginas do site\n */\n\nimport { SitePage } from \"@/engine/schema/siteDocument\";\n\nexport interface PageTabBarProps {\n pages: SitePage[];\n currentPageId: string;\n onSelectPage: (id: string) => void;\n onAddPage: () => void;\n onRemovePage: (id: string) => void;\n canRemovePage: (id: string) => boolean;\n}\n\nexport function PageTabBar({\n pages,\n currentPageId,\n onSelectPage,\n onAddPage,\n onRemovePage,\n canRemovePage,\n}: PageTabBarProps) {\n return (\n <div className=\"flex items-center gap-2 border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 px-3 py-2\">\n <div className=\"text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider\">\n Módulos:\n </div>\n\n {/* Container com scroll horizontal para módulos */}\n <div className=\"flex-1 flex items-center gap-2 overflow-x-auto scrollbar-thin scrollbar-thumb-gray-300 dark:scrollbar-thumb-gray-600\">\n {pages.map((page) => {\n const isActive = page.id === currentPageId;\n\n return (\n <div\n key={page.id}\n className={`\n group relative flex items-center gap-2 px-3 py-1.5\n rounded-md cursor-pointer transition-all duration-150 flex-shrink-0\n ${\n isActive\n ? \"bg-blue-500 text-white shadow-sm\"\n : \"bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700\"\n }\n `}\n onClick={() => onSelectPage(page.id)}\n title={`Módulo: ${page.name} (${page.slug})`}\n >\n {/* Ícone de módulo */}\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" rx=\"2\" />\n <path d=\"M2 6h12M6 2v12\" />\n </svg>\n\n {/* Nome da página */}\n <span className=\"text-xs font-medium whitespace-nowrap\">\n {page.name}\n </span>\n\n {/* Botão de remover (apenas para páginas removíveis) */}\n {canRemovePage(page.id) && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemovePage(page.id);\n }}\n className={`\n flex-shrink-0 w-4 h-4 rounded flex items-center justify-center\n transition-all duration-150\n ${\n isActive\n ? \"opacity-70 hover:opacity-100 hover:bg-red-600\"\n : \"opacity-0 group-hover:opacity-70 hover:!opacity-100 hover:bg-red-500 hover:text-white\"\n }\n `}\n title={`Remover módulo ${page.name}`}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2L10 10M10 2L2 10\" />\n </svg>\n </button>\n )}\n </div>\n );\n })}\n\n {/* Botão de adicionar módulo */}\n <button\n onClick={onAddPage}\n className=\"\n flex items-center justify-center gap-1.5 px-3 py-1.5\n text-xs font-medium text-gray-600 dark:text-gray-400\n bg-gray-100 dark:bg-gray-800\n hover:bg-blue-50 hover:text-blue-600 dark:hover:bg-blue-950 dark:hover:text-blue-400\n border border-dashed border-gray-300 dark:border-gray-600\n rounded-md transition-all duration-150 flex-shrink-0\n \"\n title=\"Adicionar novo módulo\"\n >\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M8 3V13M3 8H13\" />\n </svg>\n <span className=\"whitespace-nowrap\">Novo Módulo</span>\n </button>\n </div>\n </div>\n );\n}\n"],"names":["PageTabBar","pages","currentPageId","onSelectPage","onAddPage","onRemovePage","canRemovePage","jsxs","jsx","page","isActive","e"],"mappings":";AAgBO,SAASA,EAAW;AAAA,EACzB,OAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,WAAAC;AAAA,EACA,cAAAC;AAAA,EACA,eAAAC;AACF,GAAoB;AAClB,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,6GACb,UAAA;AAAA,IAAA,gBAAAC,EAAC,OAAA,EAAI,WAAU,mFAAkF,UAAA,YAEjG;AAAA,IAGA,gBAAAD,EAAC,OAAA,EAAI,WAAU,wHACZ,UAAA;AAAA,MAAAN,EAAM,IAAI,CAACQ,MAAS;AACnB,cAAMC,IAAWD,EAAK,OAAOP;AAE7B,eACE,gBAAAK;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAW;AAAA;AAAA;AAAA,kBAIPG,IACI,qCACA,wGACN;AAAA;AAAA,YAEF,SAAS,MAAMP,EAAaM,EAAK,EAAE;AAAA,YACnC,OAAO,WAAWA,EAAK,IAAI,KAAKA,EAAK,IAAI;AAAA,YAGzC,UAAA;AAAA,cAAA,gBAAAF;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAM;AAAA,kBACN,QAAO;AAAA,kBACP,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,QAAO;AAAA,kBACP,aAAY;AAAA,kBACZ,eAAc;AAAA,kBACd,gBAAe;AAAA,kBAEf,UAAA;AAAA,oBAAA,gBAAAC,EAAC,QAAA,EAAK,GAAE,KAAI,GAAE,KAAI,OAAM,MAAK,QAAO,MAAK,IAAG,IAAA,CAAI;AAAA,oBAChD,gBAAAA,EAAC,QAAA,EAAK,GAAE,iBAAA,CAAiB;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,cAI3B,gBAAAA,EAAC,QAAA,EAAK,WAAU,yCACb,YAAK,MACR;AAAA,cAGCF,EAAcG,EAAK,EAAE,KACpB,gBAAAD;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,SAAS,CAACG,MAAM;AACd,oBAAAA,EAAE,gBAAA,GACFN,EAAaI,EAAK,EAAE;AAAA,kBACtB;AAAA,kBACA,WAAW;AAAA;AAAA;AAAA,sBAIPC,IACI,kDACA,uFACN;AAAA;AAAA,kBAEF,OAAO,kBAAkBD,EAAK,IAAI;AAAA,kBAElC,UAAA,gBAAAD;AAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,OAAM;AAAA,sBACN,QAAO;AAAA,sBACP,SAAQ;AAAA,sBACR,MAAK;AAAA,sBACL,QAAO;AAAA,sBACP,aAAY;AAAA,sBACZ,eAAc;AAAA,sBAEd,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,uBAAA,CAAuB;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBACjC;AAAA,cAAA;AAAA,YACF;AAAA,UAAA;AAAA,UA9DGC,EAAK;AAAA,QAAA;AAAA,MAkEhB,CAAC;AAAA,MAGD,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,SAASH;AAAA,UACT,WAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAQV,OAAM;AAAA,UAEN,UAAA;AAAA,YAAA,gBAAAI;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,OAAM;AAAA,gBACN,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,MAAK;AAAA,gBACL,QAAO;AAAA,gBACP,aAAY;AAAA,gBACZ,eAAc;AAAA,gBAEd,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,iBAAA,CAAiB;AAAA,cAAA;AAAA,YAAA;AAAA,YAE3B,gBAAAA,EAAC,QAAA,EAAK,WAAU,qBAAoB,UAAA,cAAA,CAAW;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACjD,EAAA,CACF;AAAA,EAAA,GACF;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"PageTabBar.js","sources":["../../src/editor/PageTabBar.tsx"],"sourcesContent":["/**\n * PageTabBar - Barra de abas para navegação entre páginas e ativação de plugins\n *\n * Layout expandido:\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ [Home] [🧩 Blog] [🧩 Post] [+ Adicionar] │\n * └─────────────────────────────────────────────────────────────────┘\n *\n * O botão [+ Adicionar] abre um dropdown com:\n * - Nova Página (cria página em branco)\n * - Seção Plugins com toggles para ativar/desativar\n */\n\nimport { useState, useRef, useEffect, useMemo, useCallback } from \"react\";\nimport { SitePage } from \"@/engine/schema/siteDocument\";\nimport { pluginRegistry } from \"../engine\";\n\nexport interface PageTabBarProps {\n pages: SitePage[];\n currentPageId: string;\n onSelectPage: (id: string) => void;\n onAddPage: () => void;\n onRemovePage: (id: string) => void;\n canRemovePage: (id: string) => boolean;\n activePlugins: string[];\n onActivatePlugin: (pluginId: string) => void;\n onDeactivatePlugin: (pluginId: string) => void;\n}\n\nexport function PageTabBar({\n pages,\n currentPageId,\n onSelectPage,\n onAddPage,\n onRemovePage,\n canRemovePage,\n activePlugins,\n onActivatePlugin,\n onDeactivatePlugin,\n}: PageTabBarProps) {\n const [showMenu, setShowMenu] = useState(false);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Fechar dropdown ao clicar fora\n useEffect(() => {\n if (!showMenu) return;\n const handleClick = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) {\n setShowMenu(false);\n }\n };\n document.addEventListener(\"mousedown\", handleClick);\n return () => document.removeEventListener(\"mousedown\", handleClick);\n }, [showMenu]);\n\n const availablePlugins = useMemo(() => pluginRegistry.getAll(), []);\n\n // Separar páginas: regulares vs plugins\n const regularPages = useMemo(\n () => pages.filter((p) => !p.pluginId),\n [pages],\n );\n const pluginPages = useMemo(\n () => pages.filter((p) => !!p.pluginId),\n [pages],\n );\n\n const handleTogglePlugin = useCallback(\n (pluginId: string, isActive: boolean) => {\n if (isActive) {\n onDeactivatePlugin(pluginId);\n } else {\n onActivatePlugin(pluginId);\n }\n },\n [onActivatePlugin, onDeactivatePlugin],\n );\n\n return (\n <div className=\"flex items-center border-b border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 px-4 py-2.5\">\n {/* ── Área scrollável: tabs de páginas ── */}\n <div className=\"flex-1 flex items-center gap-2 overflow-x-auto min-w-0 scrollbar-thin scrollbar-thumb-gray-300 dark:scrollbar-thumb-gray-600 pr-2\">\n {/* Páginas regulares */}\n {regularPages.map((page) => {\n const isActive = page.id === currentPageId;\n return (\n <div\n key={page.id}\n className={`\n group relative flex items-center gap-2 px-4 py-2\n rounded-lg cursor-pointer transition-all duration-150 flex-shrink-0\n ${\n isActive\n ? \"bg-blue-500 text-white shadow-md shadow-blue-500/25\"\n : \"bg-gray-100 dark:bg-gray-800 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700\"\n }\n `}\n onClick={() => onSelectPage(page.id)}\n title={`${page.name} (/${page.slug})`}\n >\n <svg\n width=\"15\"\n height=\"15\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" rx=\"2\" />\n <path d=\"M2 6h12M6 2v12\" />\n </svg>\n <span className=\"text-sm font-medium whitespace-nowrap\">\n {page.name}\n </span>\n\n {/* Botão de remover (hover) */}\n {canRemovePage(page.id) && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemovePage(page.id);\n }}\n className={`\n flex-shrink-0 w-5 h-5 rounded flex items-center justify-center\n transition-all duration-150\n ${\n isActive\n ? \"opacity-60 hover:opacity-100 hover:bg-white/20\"\n : \"opacity-0 group-hover:opacity-60 hover:!opacity-100 hover:bg-red-500 hover:text-white\"\n }\n `}\n title={`Remover ${page.name}`}\n >\n <svg\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 12 12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M2 2L10 10M10 2L2 10\" />\n </svg>\n </button>\n )}\n </div>\n );\n })}\n\n {/* Páginas de plugins ativos */}\n {pluginPages.length > 0 && (\n <>\n <div className=\"w-px h-6 bg-gray-200 dark:bg-gray-700 flex-shrink-0\" />\n {pluginPages.map((page) => {\n const isActive = page.id === currentPageId;\n return (\n <div\n key={page.id}\n className={`\n flex items-center gap-2 px-4 py-2\n rounded-lg cursor-pointer transition-all duration-150 flex-shrink-0\n ${\n isActive\n ? \"bg-purple-500 text-white shadow-md shadow-purple-500/25\"\n : \"bg-purple-50 dark:bg-purple-900/20 text-purple-700 dark:text-purple-300 hover:bg-purple-100 dark:hover:bg-purple-900/40\"\n }\n `}\n onClick={() => onSelectPage(page.id)}\n title={`Plugin: ${page.name} (/${page.slug})`}\n >\n <span className=\"text-sm flex-shrink-0\">🧩</span>\n <span className=\"text-sm font-medium whitespace-nowrap\">\n {page.name}\n </span>\n </div>\n );\n })}\n </>\n )}\n </div>\n\n {/* ── Botão \"+ Adicionar\" fixo no canto direito ── */}\n <div className=\"flex-shrink-0 ml-3 relative\" ref={menuRef}>\n <button\n onClick={() => setShowMenu((prev) => !prev)}\n className={`\n flex items-center gap-2 px-4 py-2\n text-sm font-medium rounded-lg transition-all duration-150\n bg-blue-500 text-white hover:bg-blue-600\n shadow-sm hover:shadow-md\n `}\n title=\"Adicionar página ou ativar plugin\"\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n >\n <path d=\"M8 3V13M3 8H13\" />\n </svg>\n <span className=\"whitespace-nowrap\">Adicionar</span>\n <svg\n className={`w-3.5 h-3.5 transition-transform ${showMenu ? \"rotate-180\" : \"\"}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={2}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {/* Dropdown */}\n {showMenu && (\n <div className=\"absolute top-full right-0 mt-2 w-72 bg-white dark:bg-gray-800 rounded-xl shadow-xl border border-gray-200 dark:border-gray-700 z-50 overflow-hidden\">\n {/* Nova Página */}\n <button\n onClick={() => {\n setShowMenu(false);\n onAddPage();\n }}\n className=\"w-full flex items-center gap-3 px-4 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors\"\n >\n <div className=\"w-8 h-8 rounded-lg bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center flex-shrink-0\">\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n className=\"text-blue-600 dark:text-blue-400\"\n >\n <path d=\"M8 3V13M3 8H13\" />\n </svg>\n </div>\n <div>\n <p className=\"text-sm font-medium text-gray-800 dark:text-gray-200\">\n Nova Página\n </p>\n <p className=\"text-xs text-gray-500 dark:text-gray-400\">\n Criar uma página em branco\n </p>\n </div>\n </button>\n\n {/* Plugins */}\n {availablePlugins.length > 0 && (\n <>\n <div className=\"border-t border-gray-200 dark:border-gray-700\" />\n <div className=\"px-4 py-2\">\n <p className=\"text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wider\">\n Plugins\n </p>\n </div>\n {availablePlugins.map((plugin) => {\n const { id, name, description } = plugin.manifest;\n const isActive = activePlugins.includes(id);\n\n return (\n <div\n key={id}\n className=\"flex items-center gap-3 px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-700/50 transition-colors\"\n >\n <div\n className={`w-8 h-8 rounded-lg flex items-center justify-center flex-shrink-0 transition-colors ${\n isActive\n ? \"bg-purple-100 dark:bg-purple-900/30\"\n : \"bg-gray-100 dark:bg-gray-800\"\n }`}\n >\n <span className=\"text-base\">🧩</span>\n </div>\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium text-gray-800 dark:text-gray-200\">\n {name}\n </p>\n {description && (\n <p className=\"text-xs text-gray-500 dark:text-gray-400 truncate\">\n {description}\n </p>\n )}\n </div>\n {/* Toggle switch */}\n <button\n onClick={() => handleTogglePlugin(id, isActive)}\n className={`\n relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors\n ${\n isActive\n ? \"bg-purple-500\"\n : \"bg-gray-300 dark:bg-gray-600\"\n }\n `}\n role=\"switch\"\n aria-checked={isActive}\n aria-label={`${isActive ? \"Desativar\" : \"Ativar\"} ${name}`}\n >\n <span\n className={`\n pointer-events-none inline-block h-5 w-5 rounded-full bg-white shadow transform transition-transform\n ${isActive ? \"translate-x-5\" : \"translate-x-0\"}\n `}\n />\n </button>\n </div>\n );\n })}\n </>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n"],"names":["PageTabBar","pages","currentPageId","onSelectPage","onAddPage","onRemovePage","canRemovePage","activePlugins","onActivatePlugin","onDeactivatePlugin","showMenu","setShowMenu","useState","menuRef","useRef","useEffect","handleClick","e","availablePlugins","useMemo","pluginRegistry","regularPages","p","pluginPages","handleTogglePlugin","useCallback","pluginId","isActive","jsxs","page","jsx","Fragment","prev","plugin","id","name","description"],"mappings":"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"}
|
|
@@ -6,6 +6,8 @@ interface BlockPropertyEditorProps {
|
|
|
6
6
|
currentPageId?: string;
|
|
7
7
|
onUpdate: (updates: Record<string, any>) => void;
|
|
8
8
|
uploadConfig?: UploadConfig;
|
|
9
|
+
/** When set, the matching property group opens and scrolls into view */
|
|
10
|
+
focusedGroup?: string | null;
|
|
9
11
|
}
|
|
10
12
|
/**
|
|
11
13
|
* Componente principal do editor de propriedades
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockPropertyEditor.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/BlockPropertyEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"BlockPropertyEditor.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/BlockPropertyEditor.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,YAAY,EAAsE,MAAM,cAAc,CAAC;AAKvH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,wBAAwB;IAChC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IACjD,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,wEAAwE;IACxE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gEAyI9B,CAAC"}
|
|
@@ -1,68 +1,76 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { memo as
|
|
3
|
-
import { VariationSelector as
|
|
4
|
-
import { BlockHeader as
|
|
5
|
-
import { CollapsiblePropertyGroup as
|
|
6
|
-
import {
|
|
7
|
-
|
|
1
|
+
import { jsx as p, jsxs as g } from "react/jsx-runtime";
|
|
2
|
+
import { memo as S, useMemo as l, useCallback as j } from "react";
|
|
3
|
+
import { VariationSelector as M } from "./VariationSelector.js";
|
|
4
|
+
import { BlockHeader as O } from "./BlockHeader.js";
|
|
5
|
+
import { CollapsiblePropertyGroup as W } from "./CollapsiblePropertyGroup.js";
|
|
6
|
+
import { evaluateShowWhen as B } from "../../engine/shared/showWhen.js";
|
|
7
|
+
import { componentRegistry as E } from "../../engine/registry/registry.js";
|
|
8
|
+
import { pluginRegistry as R } from "../../engine/plugins/pluginRegistry.js";
|
|
9
|
+
const I = S(function({
|
|
8
10
|
block: e,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
+
document: i,
|
|
12
|
+
currentPageId: f,
|
|
13
|
+
onUpdate: n,
|
|
14
|
+
uploadConfig: x,
|
|
15
|
+
focusedGroup: v
|
|
11
16
|
}) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
const o = l(() => e ? E.get(e.type) : null, [e]), m = l(
|
|
18
|
+
() => ({ document: i, currentPageId: f }),
|
|
19
|
+
[i, f]
|
|
20
|
+
), h = l(() => {
|
|
21
|
+
if (!e || !i) return /* @__PURE__ */ new Set();
|
|
22
|
+
const t = R.getEditorRestrictions(i, e.type);
|
|
23
|
+
return t?.lockedFields ? new Set(t.lockedFields) : /* @__PURE__ */ new Set();
|
|
24
|
+
}, [e, i]), y = l(() => {
|
|
25
|
+
if (!e || !o?.inspectorMeta) return {};
|
|
26
|
+
const t = e.props, r = o.defaultProps || {}, c = {};
|
|
27
|
+
for (const [a, s] of Object.entries(
|
|
28
|
+
o.inspectorMeta
|
|
17
29
|
)) {
|
|
18
|
-
if (
|
|
30
|
+
if (s.showWhen && !B(s.showWhen, t, r, m))
|
|
19
31
|
continue;
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const l = t[p], P = n.inputType === "color" || n.inputType === "color-advanced", j = l === void 0 || P && l === "" ? o[p] : l;
|
|
28
|
-
c[a].push({
|
|
29
|
-
propName: p,
|
|
30
|
-
meta: n,
|
|
31
|
-
value: j
|
|
32
|
+
const d = s.group || "Geral";
|
|
33
|
+
c[d] || (c[d] = []);
|
|
34
|
+
const u = t[a], w = s.inputType === "color" || s.inputType === "color-advanced", C = u === void 0 || w && u === "" ? r[a] : u, F = h.has(a) ? { ...s, readOnly: !0 } : s;
|
|
35
|
+
c[d].push({
|
|
36
|
+
propName: a,
|
|
37
|
+
meta: F,
|
|
38
|
+
value: C
|
|
32
39
|
});
|
|
33
40
|
}
|
|
34
41
|
return c;
|
|
35
|
-
}, [e,
|
|
36
|
-
|
|
37
|
-
}, [
|
|
38
|
-
return e ?
|
|
39
|
-
/* @__PURE__ */
|
|
40
|
-
|
|
42
|
+
}, [e, o, m, h]), P = j((t, r) => {
|
|
43
|
+
n(t === "logo" && (r === void 0 || r === "") ? { [t]: r, logoHeight: 70 } : { [t]: r });
|
|
44
|
+
}, [n]);
|
|
45
|
+
return e ? o ? /* @__PURE__ */ g("div", { className: "p-3 space-y-4", children: [
|
|
46
|
+
/* @__PURE__ */ p(
|
|
47
|
+
O,
|
|
41
48
|
{
|
|
42
49
|
type: e.type,
|
|
43
|
-
name:
|
|
44
|
-
description:
|
|
50
|
+
name: o.name,
|
|
51
|
+
description: o.description
|
|
45
52
|
}
|
|
46
53
|
),
|
|
47
|
-
|
|
48
|
-
Object.keys(
|
|
49
|
-
|
|
54
|
+
o.variations && /* @__PURE__ */ p(M, { block: e, onUpdate: n }),
|
|
55
|
+
Object.keys(y).length === 0 ? /* @__PURE__ */ p("div", { className: "text-center text-gray-500 dark:text-gray-400 text-xs py-4", children: "Nenhuma propriedade configurável" }) : Object.entries(y).map(([t, r]) => /* @__PURE__ */ p(
|
|
56
|
+
W,
|
|
50
57
|
{
|
|
51
58
|
groupName: t,
|
|
52
|
-
props:
|
|
53
|
-
onPropChange:
|
|
54
|
-
onMultiUpdate:
|
|
59
|
+
props: r,
|
|
60
|
+
onPropChange: P,
|
|
61
|
+
onMultiUpdate: n,
|
|
55
62
|
allProps: e?.props,
|
|
56
|
-
uploadConfig: x
|
|
63
|
+
uploadConfig: x,
|
|
64
|
+
isFocused: t === v
|
|
57
65
|
},
|
|
58
66
|
t
|
|
59
67
|
))
|
|
60
|
-
] }) : /* @__PURE__ */
|
|
68
|
+
] }) : /* @__PURE__ */ g("div", { className: "p-4 text-center text-red-500 text-sm", children: [
|
|
61
69
|
"Tipo de bloco desconhecido: ",
|
|
62
70
|
e.type
|
|
63
|
-
] }) : /* @__PURE__ */
|
|
71
|
+
] }) : /* @__PURE__ */ p("div", { className: "p-4 text-center text-gray-500 dark:text-gray-400 text-sm", children: "Selecione um bloco para editar" });
|
|
64
72
|
});
|
|
65
73
|
export {
|
|
66
|
-
|
|
74
|
+
I as BlockPropertyEditor
|
|
67
75
|
};
|
|
68
76
|
//# sourceMappingURL=BlockPropertyEditor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BlockPropertyEditor.js","sources":["../../../src/editor/PropertyEditor/BlockPropertyEditor.tsx"],"sourcesContent":["/**\n * Block Property Editor - Refatorado\n * Editor dinâmico de propriedades baseado em inspectorMeta\n */\n\nimport { memo, useMemo, useCallback } from \"react\";\nimport { Block, SiteDocument, componentRegistry, InspectorMeta } from \"../../engine\";\nimport { VariationSelector } from \"./VariationSelector\";\nimport { BlockHeader } from \"./BlockHeader\";\nimport { CollapsiblePropertyGroup } from \"./CollapsiblePropertyGroup\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\n\ninterface BlockPropertyEditorProps {\n block: Block | null;\n document?: SiteDocument;\n currentPageId?: string;\n onUpdate: (updates: Record<string, any>) => void;\n uploadConfig?: UploadConfig;\n}\n\n/**\n * Componente principal do editor de propriedades\n * Memoizado para performance\n */\nexport const BlockPropertyEditor = memo(function BlockPropertyEditor({\n block,\n onUpdate,\n uploadConfig,\n}: BlockPropertyEditorProps) {\n // Obter definição do bloco do registry\n const blockDefinition = useMemo(() => {\n if (!block) return null;\n return componentRegistry.get(block.type);\n }, [block]);\n\n // Agrupar propriedades por grupo\n const groupedProps = useMemo(() => {\n if (!block || !blockDefinition?.inspectorMeta) return {};\n\n const props = block.props as Record<string, any>;\n const defaultProps = (blockDefinition.defaultProps || {}) as Record<string, any>;\n const groups: Record<\n string,\n Array<{ propName: string; meta: InspectorMeta; value: any }>\n > = {};\n\n for (const [propName, meta] of Object.entries(\n blockDefinition.inspectorMeta,\n )) {\n //
|
|
1
|
+
{"version":3,"file":"BlockPropertyEditor.js","sources":["../../../src/editor/PropertyEditor/BlockPropertyEditor.tsx"],"sourcesContent":["/**\n * Block Property Editor - Refatorado\n * Editor dinâmico de propriedades baseado em inspectorMeta\n */\n\nimport { memo, useMemo, useCallback } from \"react\";\nimport { Block, SiteDocument, componentRegistry, InspectorMeta, evaluateShowWhen, pluginRegistry } from \"../../engine\";\nimport type { ShowWhenContext } from \"../../engine\";\nimport { VariationSelector } from \"./VariationSelector\";\nimport { BlockHeader } from \"./BlockHeader\";\nimport { CollapsiblePropertyGroup } from \"./CollapsiblePropertyGroup\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\n\ninterface BlockPropertyEditorProps {\n block: Block | null;\n document?: SiteDocument;\n currentPageId?: string;\n onUpdate: (updates: Record<string, any>) => void;\n uploadConfig?: UploadConfig;\n /** When set, the matching property group opens and scrolls into view */\n focusedGroup?: string | null;\n}\n\n/**\n * Componente principal do editor de propriedades\n * Memoizado para performance\n */\nexport const BlockPropertyEditor = memo(function BlockPropertyEditor({\n block,\n document,\n currentPageId,\n onUpdate,\n uploadConfig,\n focusedGroup,\n}: BlockPropertyEditorProps) {\n // Obter definição do bloco do registry\n const blockDefinition = useMemo(() => {\n if (!block) return null;\n return componentRegistry.get(block.type);\n }, [block]);\n\n // Contexto para cross-block showWhen\n const showWhenContext = useMemo<ShowWhenContext>(\n () => ({ document, currentPageId }),\n [document, currentPageId],\n );\n\n // Obter restrições de edição do plugin (se houver)\n const lockedFields = useMemo(() => {\n if (!block || !document) return new Set<string>();\n const restriction = pluginRegistry.getEditorRestrictions(document, block.type);\n if (!restriction?.lockedFields) return new Set<string>();\n return new Set(restriction.lockedFields);\n }, [block, document]);\n\n // Agrupar propriedades por grupo\n const groupedProps = useMemo(() => {\n if (!block || !blockDefinition?.inspectorMeta) return {};\n\n const props = block.props as Record<string, any>;\n const defaultProps = (blockDefinition.defaultProps || {}) as Record<string, any>;\n const groups: Record<\n string,\n Array<{ propName: string; meta: InspectorMeta; value: any }>\n > = {};\n\n for (const [propName, meta] of Object.entries(\n blockDefinition.inspectorMeta,\n )) {\n // Visibilidade condicional via showWhen\n if (meta.showWhen) {\n if (!evaluateShowWhen(meta.showWhen, props, defaultProps, showWhenContext)) {\n continue;\n }\n }\n\n const group = meta.group || \"Geral\";\n if (!groups[group]) {\n groups[group] = [];\n }\n\n // Usar valor atual ou fallback para defaultProps\n const currentValue = props[propName];\n // Para campos de cor, também fazer fallback se o valor for string vazia\n const isColorInput = meta.inputType === \"color\" || meta.inputType === \"color-advanced\";\n const shouldUseFallback = currentValue === undefined || (isColorInput && currentValue === \"\");\n const value = shouldUseFallback ? defaultProps[propName] : currentValue;\n\n // Aplicar readOnly de plugin restrictions\n const effectiveMeta = lockedFields.has(propName)\n ? { ...meta, readOnly: true }\n : meta;\n\n groups[group].push({\n propName,\n meta: effectiveMeta,\n value,\n });\n }\n\n return groups;\n }, [block, blockDefinition, showWhenContext, lockedFields]);\n\n // IMPORTANTE: todos os hooks devem ser chamados ANTES de qualquer early return\n const handlePropChange = useCallback((propName: string, value: any) => {\n // Se remover o logo (definir como undefined), resetar logoHeight para padrão\n if (propName === \"logo\" && (value === undefined || value === \"\")) {\n onUpdate({ [propName]: value, logoHeight: 70 });\n } else {\n onUpdate({ [propName]: value });\n }\n }, [onUpdate]);\n\n if (!block) {\n return (\n <div className=\"p-4 text-center text-gray-500 dark:text-gray-400 text-sm\">\n Selecione um bloco para editar\n </div>\n );\n }\n\n if (!blockDefinition) {\n return (\n <div className=\"p-4 text-center text-red-500 text-sm\">\n Tipo de bloco desconhecido: {block.type}\n </div>\n );\n }\n\n return (\n <div className=\"p-3 space-y-4\">\n {/* Header com ícone centralizado */}\n <BlockHeader\n type={block.type}\n name={blockDefinition.name}\n description={blockDefinition.description}\n />\n\n {/* Seletor de variações (Hero/Navbar) */}\n {blockDefinition.variations && (\n <VariationSelector block={block} onUpdate={onUpdate} />\n )}\n\n {/* Propriedades agrupadas com collapse */}\n {Object.keys(groupedProps).length === 0 ? (\n <div className=\"text-center text-gray-500 dark:text-gray-400 text-xs py-4\">\n Nenhuma propriedade configurável\n </div>\n ) : (\n Object.entries(groupedProps).map(([groupName, props]) => (\n <CollapsiblePropertyGroup\n key={groupName}\n groupName={groupName}\n props={props}\n onPropChange={handlePropChange}\n onMultiUpdate={onUpdate}\n allProps={block?.props as Record<string, any>}\n uploadConfig={uploadConfig}\n isFocused={groupName === focusedGroup}\n />\n ))\n )}\n </div>\n );\n});\n"],"names":["BlockPropertyEditor","memo","block","document","currentPageId","onUpdate","uploadConfig","focusedGroup","blockDefinition","useMemo","componentRegistry","showWhenContext","lockedFields","restriction","pluginRegistry","groupedProps","props","defaultProps","groups","propName","meta","evaluateShowWhen","group","currentValue","isColorInput","value","effectiveMeta","handlePropChange","useCallback","jsxs","jsx","BlockHeader","VariationSelector","groupName","CollapsiblePropertyGroup"],"mappings":"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"}
|
|
@@ -14,6 +14,8 @@ interface CollapsiblePropertyGroupProps {
|
|
|
14
14
|
allProps?: Record<string, any>;
|
|
15
15
|
uploadConfig?: UploadConfig;
|
|
16
16
|
defaultOpen?: boolean;
|
|
17
|
+
/** When true, opens the group and scrolls it into view */
|
|
18
|
+
isFocused?: boolean;
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
21
|
* Grupo de propriedades colapsável
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CollapsiblePropertyGroup.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/CollapsiblePropertyGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,6BAA6B;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,aAAa,CAAC;QACpB,KAAK,EAAE,GAAG,CAAC;KACZ,CAAC,CAAC;IACH,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACrD,qFAAqF;IACrF,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IACvD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"CollapsiblePropertyGroup.d.ts","sourceRoot":"","sources":["../../../src/editor/PropertyEditor/CollapsiblePropertyGroup.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,6BAA6B;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,aAAa,CAAC;QACpB,KAAK,EAAE,GAAG,CAAC;KACZ,CAAC,CAAC;IACH,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IACrD,qFAAqF;IACrF,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IACvD,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,qEA6FnC,CAAC"}
|