@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,36 +1,42 @@
|
|
|
1
|
-
import { jsx as e, jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { LoadingSpinner as
|
|
4
|
-
const
|
|
1
|
+
import { jsx as e, jsxs as m } from "react/jsx-runtime";
|
|
2
|
+
import f, { Suspense as h, lazy as o } from "react";
|
|
3
|
+
import { LoadingSpinner as p } from "./LoadingSpinner.js";
|
|
4
|
+
const x = o(
|
|
5
5
|
() => import("../PropertyEditor/index.js").then((r) => ({ default: r.BlockPropertyEditor }))
|
|
6
|
-
),
|
|
6
|
+
), g = o(
|
|
7
7
|
() => import("../PaletteSelector.js").then((r) => ({ default: r.PaletteSelector }))
|
|
8
|
-
),
|
|
8
|
+
), v = f.memo(function({
|
|
9
9
|
isPaletteSelected: a,
|
|
10
10
|
selectedBlock: t,
|
|
11
11
|
onPaletteChange: l,
|
|
12
12
|
onUpdateBlock: d,
|
|
13
|
-
uploadConfig: i
|
|
13
|
+
uploadConfig: i,
|
|
14
|
+
document: n,
|
|
15
|
+
currentPageId: c,
|
|
16
|
+
focusedGroup: s
|
|
14
17
|
}) {
|
|
15
|
-
return /* @__PURE__ */ e("div", { className: "w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col", children: /* @__PURE__ */ e(
|
|
18
|
+
return /* @__PURE__ */ e("div", { className: "w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col", children: /* @__PURE__ */ e(h, { fallback: /* @__PURE__ */ e(p, {}), children: a ? /* @__PURE__ */ m("div", { className: "p-4 overflow-y-auto", children: [
|
|
16
19
|
/* @__PURE__ */ e("h2", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100 mb-4", children: "Escolha uma Paleta de Cores" }),
|
|
17
20
|
/* @__PURE__ */ e(
|
|
18
|
-
|
|
21
|
+
g,
|
|
19
22
|
{
|
|
20
23
|
selectedPalette: void 0,
|
|
21
24
|
onPaletteChange: l
|
|
22
25
|
}
|
|
23
26
|
)
|
|
24
27
|
] }) : t ? /* @__PURE__ */ e("div", { className: "overflow-y-auto overflow-x-hidden flex-1", children: /* @__PURE__ */ e(
|
|
25
|
-
|
|
28
|
+
x,
|
|
26
29
|
{
|
|
27
30
|
block: t,
|
|
31
|
+
document: n,
|
|
32
|
+
currentPageId: c,
|
|
28
33
|
onUpdate: d,
|
|
29
|
-
uploadConfig: i
|
|
34
|
+
uploadConfig: i,
|
|
35
|
+
focusedGroup: s
|
|
30
36
|
}
|
|
31
37
|
) }) : /* @__PURE__ */ e("div", { className: "p-4 text-center text-gray-500 dark:text-gray-400", children: "Selecione um bloco para editar" }) }) });
|
|
32
38
|
});
|
|
33
39
|
export {
|
|
34
|
-
|
|
40
|
+
v as RightPanel
|
|
35
41
|
};
|
|
36
42
|
//# sourceMappingURL=RightPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RightPanel.js","sources":["../../../src/editor/components/RightPanel.tsx"],"sourcesContent":["import React, { lazy, Suspense } from \"react\";\nimport { LoadingSpinner } from \"./LoadingSpinner\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\n\n// Lazy load componentes pesados do editor\nconst BlockPropertyEditor = lazy(() =>\n import(\"../PropertyEditor\").then(module => ({ default: module.BlockPropertyEditor }))\n);\nconst PaletteSelector = lazy(() =>\n import(\"../PaletteSelector\").then(module => ({ default: module.PaletteSelector }))\n);\n\ninterface RightPanelProps {\n isPaletteSelected: boolean;\n selectedBlock: any;\n onPaletteChange: (palette: any) => void;\n onUpdateBlock: (updates: Record<string, any>) => void;\n uploadConfig?: UploadConfig;\n}\n\nexport const RightPanel = React.memo(function RightPanel({\n isPaletteSelected,\n selectedBlock,\n onPaletteChange,\n onUpdateBlock,\n uploadConfig,\n}: RightPanelProps) {\n return (\n <div className=\"w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col\">\n <Suspense fallback={<LoadingSpinner />}>\n {isPaletteSelected ? (\n <div className=\"p-4 overflow-y-auto\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100 mb-4\">\n Escolha uma Paleta de Cores\n </h2>\n <PaletteSelector\n selectedPalette={undefined}\n onPaletteChange={onPaletteChange}\n />\n </div>\n ) : selectedBlock ? (\n <div className=\"overflow-y-auto overflow-x-hidden flex-1\">\n <BlockPropertyEditor\n block={selectedBlock}\n onUpdate={onUpdateBlock}\n uploadConfig={uploadConfig}\n />\n </div>\n ) : (\n <div className=\"p-4 text-center text-gray-500 dark:text-gray-400\">\n Selecione um bloco para editar\n </div>\n )}\n </Suspense>\n </div>\n );\n});\n"],"names":["BlockPropertyEditor","lazy","module","PaletteSelector","RightPanel","React","isPaletteSelected","selectedBlock","onPaletteChange","onUpdateBlock","uploadConfig","jsx","Suspense","LoadingSpinner","jsxs"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"RightPanel.js","sources":["../../../src/editor/components/RightPanel.tsx"],"sourcesContent":["import React, { lazy, Suspense } from \"react\";\nimport { LoadingSpinner } from \"./LoadingSpinner\";\nimport type { UploadConfig } from \"../LandingPageEditor\";\nimport type { SiteDocument } from \"../../engine\";\n\n// Lazy load componentes pesados do editor\nconst BlockPropertyEditor = lazy(() =>\n import(\"../PropertyEditor\").then(module => ({ default: module.BlockPropertyEditor }))\n);\nconst PaletteSelector = lazy(() =>\n import(\"../PaletteSelector\").then(module => ({ default: module.PaletteSelector }))\n);\n\ninterface RightPanelProps {\n isPaletteSelected: boolean;\n selectedBlock: any;\n onPaletteChange: (palette: any) => void;\n onUpdateBlock: (updates: Record<string, any>) => void;\n uploadConfig?: UploadConfig;\n document?: SiteDocument;\n currentPageId?: string;\n /** When set, the matching property group opens and scrolls into view */\n focusedGroup?: string | null;\n}\n\nexport const RightPanel = React.memo(function RightPanel({\n isPaletteSelected,\n selectedBlock,\n onPaletteChange,\n onUpdateBlock,\n uploadConfig,\n document,\n currentPageId,\n focusedGroup,\n}: RightPanelProps) {\n return (\n <div className=\"w-80 flex-shrink-0 border-l border-gray-200 dark:border-gray-700 bg-white dark:bg-gray-900 overflow-hidden flex flex-col\">\n <Suspense fallback={<LoadingSpinner />}>\n {isPaletteSelected ? (\n <div className=\"p-4 overflow-y-auto\">\n <h2 className=\"text-sm font-semibold text-gray-800 dark:text-gray-100 mb-4\">\n Escolha uma Paleta de Cores\n </h2>\n <PaletteSelector\n selectedPalette={undefined}\n onPaletteChange={onPaletteChange}\n />\n </div>\n ) : selectedBlock ? (\n <div className=\"overflow-y-auto overflow-x-hidden flex-1\">\n <BlockPropertyEditor\n block={selectedBlock}\n document={document}\n currentPageId={currentPageId}\n onUpdate={onUpdateBlock}\n uploadConfig={uploadConfig}\n focusedGroup={focusedGroup}\n />\n </div>\n ) : (\n <div className=\"p-4 text-center text-gray-500 dark:text-gray-400\">\n Selecione um bloco para editar\n </div>\n )}\n </Suspense>\n </div>\n );\n});\n"],"names":["BlockPropertyEditor","lazy","module","PaletteSelector","RightPanel","React","isPaletteSelected","selectedBlock","onPaletteChange","onUpdateBlock","uploadConfig","document","currentPageId","focusedGroup","jsx","Suspense","LoadingSpinner","jsxs"],"mappings":";;;AAMA,MAAMA,IAAsBC;AAAA,EAAK,MAC/B,OAAO,4BAAmB,EAAE,KAAK,QAAW,EAAE,SAASC,EAAO,sBAAsB;AACtF,GACMC,IAAkBF;AAAA,EAAK,MAC3B,OAAO,uBAAoB,EAAE,KAAK,QAAW,EAAE,SAASC,EAAO,kBAAkB;AACnF,GAcaE,IAAaC,EAAM,KAAK,SAAoB;AAAA,EACvD,mBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAC;AAAA,EACA,eAAAC;AAAA,EACA,cAAAC;AACF,GAAoB;AAClB,SACE,gBAAAC,EAAC,OAAA,EAAI,WAAU,4HACb,4BAACC,GAAA,EAAS,UAAU,gBAAAD,EAACE,GAAA,CAAA,CAAe,GACjC,UAAAV,IACC,gBAAAW,EAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,gBAAAH,EAAC,MAAA,EAAG,WAAU,+DAA8D,UAAA,+BAE5E;AAAA,IACA,gBAAAA;AAAA,MAACX;AAAA,MAAA;AAAA,QACC,iBAAiB;AAAA,QACjB,iBAAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF,IACED,IACF,gBAAAO,EAAC,OAAA,EAAI,WAAU,4CACb,UAAA,gBAAAA;AAAA,IAACd;AAAA,IAAA;AAAA,MACC,OAAOO;AAAA,MACP,UAAAI;AAAA,MACA,eAAAC;AAAA,MACA,UAAUH;AAAA,MACV,cAAAC;AAAA,MACA,cAAAG;AAAA,IAAA;AAAA,EAAA,EACF,CACF,IAEA,gBAAAC,EAAC,OAAA,EAAI,WAAU,oDAAmD,UAAA,iCAAA,CAElE,GAEJ,GACF;AAEJ,CAAC;"}
|
|
@@ -7,6 +7,9 @@ interface ToolbarProps {
|
|
|
7
7
|
onSave: () => void;
|
|
8
8
|
onPublish?: () => void;
|
|
9
9
|
onReset: () => void;
|
|
10
|
+
/** Mostrar hover/seleção visual no preview */
|
|
11
|
+
showSelectionOverlay?: boolean;
|
|
12
|
+
onToggleSelectionOverlay?: () => void;
|
|
10
13
|
}
|
|
11
14
|
export declare const Toolbar: React.NamedExoticComponent<ToolbarProps>;
|
|
12
15
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/editor/components/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,YAAY;IACpB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../../../src/editor/components/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,UAAU,YAAY;IACpB,OAAO,EAAE,GAAG,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8CAA8C;IAC9C,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,wBAAwB,CAAC,EAAE,MAAM,IAAI,CAAC;CACvC;AAiCD,eAAO,MAAM,OAAO,0CA+FlB,CAAC"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import
|
|
3
|
-
import { Undo as
|
|
4
|
-
import { cn as
|
|
5
|
-
function
|
|
1
|
+
import { jsxs as a, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import u from "react";
|
|
3
|
+
import { Undo as x, Redo as h, RotateCcw as p, MousePointer2 as f, Save as k, Eye as y } from "lucide-react";
|
|
4
|
+
import { cn as o } from "../../utils/cn.js";
|
|
5
|
+
function l({
|
|
6
6
|
onClick: s,
|
|
7
|
-
disabled:
|
|
7
|
+
disabled: t,
|
|
8
8
|
title: r,
|
|
9
|
-
icon:
|
|
9
|
+
icon: d
|
|
10
10
|
}) {
|
|
11
11
|
return /* @__PURE__ */ e(
|
|
12
12
|
"button",
|
|
13
13
|
{
|
|
14
14
|
onClick: s,
|
|
15
|
-
disabled:
|
|
16
|
-
className:
|
|
15
|
+
disabled: t,
|
|
16
|
+
className: o(
|
|
17
17
|
"h-8 w-8 rounded-md text-xs font-medium transition-all cursor-pointer",
|
|
18
18
|
"border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300",
|
|
19
19
|
"hover:bg-gray-100 dark:hover:bg-gray-800",
|
|
@@ -21,71 +21,90 @@ function d({
|
|
|
21
21
|
"flex items-center justify-center"
|
|
22
22
|
),
|
|
23
23
|
title: r,
|
|
24
|
-
children:
|
|
24
|
+
children: d
|
|
25
25
|
}
|
|
26
26
|
);
|
|
27
27
|
}
|
|
28
|
-
const
|
|
29
|
-
history:
|
|
28
|
+
const R = u.memo(function({
|
|
29
|
+
history: t,
|
|
30
30
|
isSaving: r,
|
|
31
|
-
onUndo:
|
|
32
|
-
onRedo:
|
|
33
|
-
onSave:
|
|
31
|
+
onUndo: d,
|
|
32
|
+
onRedo: c,
|
|
33
|
+
onSave: b,
|
|
34
34
|
onPublish: n,
|
|
35
|
-
onReset: m
|
|
35
|
+
onReset: m,
|
|
36
|
+
showSelectionOverlay: g,
|
|
37
|
+
onToggleSelectionOverlay: i
|
|
36
38
|
}) {
|
|
37
|
-
return /* @__PURE__ */
|
|
39
|
+
return /* @__PURE__ */ a("div", { className: "h-12 flex-shrink-0 border-b border-gray-200 dark:border-gray-700 bg-white/80 dark:bg-gray-900/80 backdrop-blur-md flex items-center justify-between px-4", children: [
|
|
38
40
|
/* @__PURE__ */ e("h1", { className: "text-base font-semibold text-gray-800 dark:text-gray-100", children: "Editor de Landing Page" }),
|
|
39
|
-
/* @__PURE__ */
|
|
41
|
+
/* @__PURE__ */ a("div", { className: "flex items-center gap-2", children: [
|
|
40
42
|
/* @__PURE__ */ e(
|
|
41
|
-
|
|
43
|
+
l,
|
|
42
44
|
{
|
|
43
|
-
onClick:
|
|
44
|
-
disabled: !
|
|
45
|
+
onClick: d,
|
|
46
|
+
disabled: !t.canUndo(),
|
|
45
47
|
title: "Desfazer",
|
|
46
|
-
icon: /* @__PURE__ */ e(
|
|
48
|
+
icon: /* @__PURE__ */ e(x, { className: "w-4 h-4" })
|
|
47
49
|
}
|
|
48
50
|
),
|
|
49
51
|
/* @__PURE__ */ e(
|
|
50
|
-
|
|
52
|
+
l,
|
|
51
53
|
{
|
|
52
|
-
onClick:
|
|
53
|
-
disabled: !
|
|
54
|
+
onClick: c,
|
|
55
|
+
disabled: !t.canRedo(),
|
|
54
56
|
title: "Refazer",
|
|
55
57
|
icon: /* @__PURE__ */ e(h, { className: "w-4 h-4" })
|
|
56
58
|
}
|
|
57
59
|
),
|
|
58
60
|
/* @__PURE__ */ e(
|
|
59
|
-
|
|
61
|
+
l,
|
|
60
62
|
{
|
|
61
63
|
onClick: m,
|
|
62
64
|
title: "Resetar Template",
|
|
63
|
-
icon: /* @__PURE__ */ e(
|
|
65
|
+
icon: /* @__PURE__ */ e(p, { className: "w-4 h-4" })
|
|
64
66
|
}
|
|
65
67
|
),
|
|
66
|
-
/* @__PURE__ */
|
|
68
|
+
/* @__PURE__ */ e("div", { className: "w-px h-5 bg-gray-300 dark:bg-gray-600 mx-0.5" }),
|
|
69
|
+
i && /* @__PURE__ */ a(
|
|
67
70
|
"button",
|
|
68
71
|
{
|
|
69
|
-
onClick:
|
|
72
|
+
onClick: i,
|
|
73
|
+
className: o(
|
|
74
|
+
"h-8 px-2 rounded-md text-xs font-medium transition-all cursor-pointer",
|
|
75
|
+
"flex items-center gap-1.5",
|
|
76
|
+
g ? "bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 border border-blue-300 dark:border-blue-700" : "border border-gray-300 dark:border-gray-600 text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800"
|
|
77
|
+
),
|
|
78
|
+
title: "Mostrar Seleção",
|
|
79
|
+
children: [
|
|
80
|
+
/* @__PURE__ */ e(f, { className: "w-3.5 h-3.5" }),
|
|
81
|
+
/* @__PURE__ */ e("span", { className: "hidden sm:inline", children: "Seleção" })
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
),
|
|
85
|
+
/* @__PURE__ */ a(
|
|
86
|
+
"button",
|
|
87
|
+
{
|
|
88
|
+
onClick: b,
|
|
70
89
|
disabled: r,
|
|
71
|
-
className:
|
|
90
|
+
className: o(
|
|
72
91
|
"h-8 px-3 rounded-md text-xs font-medium transition-all cursor-pointer",
|
|
73
92
|
"bg-gradient-to-r from-green-500 to-emerald-600 hover:from-green-600 hover:to-emerald-700 text-white shadow-lg hover:shadow-xl",
|
|
74
93
|
"disabled:opacity-60 disabled:cursor-not-allowed",
|
|
75
94
|
"flex items-center gap-1.5 hover:scale-[1.02] active:scale-[0.98]"
|
|
76
95
|
),
|
|
77
96
|
children: [
|
|
78
|
-
/* @__PURE__ */ e(
|
|
97
|
+
/* @__PURE__ */ e(k, { className: "w-3.5 h-3.5" }),
|
|
79
98
|
r ? "Salvando..." : "Salvar"
|
|
80
99
|
]
|
|
81
100
|
}
|
|
82
101
|
),
|
|
83
|
-
n && /* @__PURE__ */
|
|
102
|
+
n && /* @__PURE__ */ a(
|
|
84
103
|
"button",
|
|
85
104
|
{
|
|
86
105
|
onClick: n,
|
|
87
106
|
disabled: r,
|
|
88
|
-
className:
|
|
107
|
+
className: o(
|
|
89
108
|
"h-8 px-3 rounded-md text-xs font-medium transition-all cursor-pointer",
|
|
90
109
|
"border-2 border-purple-500 text-purple-600 dark:text-purple-400 bg-transparent",
|
|
91
110
|
"hover:bg-purple-50 dark:hover:bg-purple-950/50",
|
|
@@ -93,7 +112,7 @@ const v = b.memo(function({
|
|
|
93
112
|
"flex items-center gap-1.5 hover:scale-[1.02] active:scale-[0.98]"
|
|
94
113
|
),
|
|
95
114
|
children: [
|
|
96
|
-
/* @__PURE__ */ e(
|
|
115
|
+
/* @__PURE__ */ e(y, { className: "w-3.5 h-3.5" }),
|
|
97
116
|
"Publicar"
|
|
98
117
|
]
|
|
99
118
|
}
|
|
@@ -102,6 +121,6 @@ const v = b.memo(function({
|
|
|
102
121
|
] });
|
|
103
122
|
});
|
|
104
123
|
export {
|
|
105
|
-
|
|
124
|
+
R as Toolbar
|
|
106
125
|
};
|
|
107
126
|
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Toolbar.js","sources":["../../../src/editor/components/Toolbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Save, Eye, Undo, Redo, RotateCcw } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\n\ninterface ToolbarProps {\n history: any;\n isSaving: boolean;\n onUndo: () => void;\n onRedo: () => void;\n onSave: () => void;\n onPublish?: () => void;\n onReset: () => void;\n}\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n disabled?: boolean;\n title: string;\n icon: React.ReactNode;\n}\n\nfunction ToolbarButton({\n onClick,\n disabled,\n title,\n icon,\n}: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n \"h-8 w-8 rounded-md text-xs font-medium transition-all cursor-pointer\",\n \"border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300\",\n \"hover:bg-gray-100 dark:hover:bg-gray-800\",\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\n \"flex items-center justify-center\",\n )}\n title={title}\n >\n {icon}\n </button>\n );\n}\n\nexport const Toolbar = React.memo(function Toolbar({\n history,\n isSaving,\n onUndo,\n onRedo,\n onSave,\n onPublish,\n onReset,\n}: ToolbarProps) {\n return (\n <div className=\"h-12 flex-shrink-0 border-b border-gray-200 dark:border-gray-700 bg-white/80 dark:bg-gray-900/80 backdrop-blur-md flex items-center justify-between px-4\">\n <h1 className=\"text-base font-semibold text-gray-800 dark:text-gray-100\">\n Editor de Landing Page\n </h1>\n\n <div className=\"flex items-center gap-2\">\n {/* Undo/Redo */}\n <ToolbarButton\n onClick={onUndo}\n disabled={!history.canUndo()}\n title=\"Desfazer\"\n icon={<Undo className=\"w-4 h-4\" />}\n />\n <ToolbarButton\n onClick={onRedo}\n disabled={!history.canRedo()}\n title=\"Refazer\"\n icon={<Redo className=\"w-4 h-4\" />}\n />\n\n {/* Reset */}\n <ToolbarButton\n onClick={onReset}\n title=\"Resetar Template\"\n icon={<RotateCcw className=\"w-4 h-4\" />}\n />\n\n {/* Save */}\n <button\n onClick={onSave}\n disabled={isSaving}\n className={cn(\n \"h-8 px-3 rounded-md text-xs font-medium transition-all cursor-pointer\",\n \"bg-gradient-to-r from-green-500 to-emerald-600 hover:from-green-600 hover:to-emerald-700 text-white shadow-lg hover:shadow-xl\",\n \"disabled:opacity-60 disabled:cursor-not-allowed\",\n \"flex items-center gap-1.5 hover:scale-[1.02] active:scale-[0.98]\",\n )}\n >\n <Save className=\"w-3.5 h-3.5\" />\n {isSaving ? \"Salvando...\" : \"Salvar\"}\n </button>\n\n {/* Publish */}\n {onPublish && (\n <button\n onClick={onPublish}\n disabled={isSaving}\n className={cn(\n \"h-8 px-3 rounded-md text-xs font-medium transition-all cursor-pointer\",\n \"border-2 border-purple-500 text-purple-600 dark:text-purple-400 bg-transparent\",\n \"hover:bg-purple-50 dark:hover:bg-purple-950/50\",\n \"disabled:opacity-60 disabled:cursor-not-allowed\",\n \"flex items-center gap-1.5 hover:scale-[1.02] active:scale-[0.98]\",\n )}\n >\n <Eye className=\"w-3.5 h-3.5\" />\n Publicar\n </button>\n )}\n </div>\n </div>\n );\n});\n"],"names":["ToolbarButton","onClick","disabled","title","icon","jsx","cn","Toolbar","React","history","isSaving","onUndo","onRedo","onSave","onPublish","onReset","jsxs","Undo","Redo","RotateCcw","Save","Eye"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sources":["../../../src/editor/components/Toolbar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Save, Eye, Undo, Redo, RotateCcw, MousePointer2 } from \"lucide-react\";\nimport { cn } from \"../../utils/cn\";\n\ninterface ToolbarProps {\n history: any;\n isSaving: boolean;\n onUndo: () => void;\n onRedo: () => void;\n onSave: () => void;\n onPublish?: () => void;\n onReset: () => void;\n /** Mostrar hover/seleção visual no preview */\n showSelectionOverlay?: boolean;\n onToggleSelectionOverlay?: () => void;\n}\n\ninterface ToolbarButtonProps {\n onClick: () => void;\n disabled?: boolean;\n title: string;\n icon: React.ReactNode;\n}\n\nfunction ToolbarButton({\n onClick,\n disabled,\n title,\n icon,\n}: ToolbarButtonProps) {\n return (\n <button\n onClick={onClick}\n disabled={disabled}\n className={cn(\n \"h-8 w-8 rounded-md text-xs font-medium transition-all cursor-pointer\",\n \"border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300\",\n \"hover:bg-gray-100 dark:hover:bg-gray-800\",\n \"disabled:opacity-40 disabled:cursor-not-allowed\",\n \"flex items-center justify-center\",\n )}\n title={title}\n >\n {icon}\n </button>\n );\n}\n\nexport const Toolbar = React.memo(function Toolbar({\n history,\n isSaving,\n onUndo,\n onRedo,\n onSave,\n onPublish,\n onReset,\n showSelectionOverlay,\n onToggleSelectionOverlay,\n}: ToolbarProps) {\n return (\n <div className=\"h-12 flex-shrink-0 border-b border-gray-200 dark:border-gray-700 bg-white/80 dark:bg-gray-900/80 backdrop-blur-md flex items-center justify-between px-4\">\n <h1 className=\"text-base font-semibold text-gray-800 dark:text-gray-100\">\n Editor de Landing Page\n </h1>\n\n <div className=\"flex items-center gap-2\">\n {/* Undo/Redo */}\n <ToolbarButton\n onClick={onUndo}\n disabled={!history.canUndo()}\n title=\"Desfazer\"\n icon={<Undo className=\"w-4 h-4\" />}\n />\n <ToolbarButton\n onClick={onRedo}\n disabled={!history.canRedo()}\n title=\"Refazer\"\n icon={<Redo className=\"w-4 h-4\" />}\n />\n\n {/* Reset */}\n <ToolbarButton\n onClick={onReset}\n title=\"Resetar Template\"\n icon={<RotateCcw className=\"w-4 h-4\" />}\n />\n\n {/* Separator */}\n <div className=\"w-px h-5 bg-gray-300 dark:bg-gray-600 mx-0.5\" />\n\n {/* Selection Overlay Toggle */}\n {onToggleSelectionOverlay && (\n <button\n onClick={onToggleSelectionOverlay}\n className={cn(\n \"h-8 px-2 rounded-md text-xs font-medium transition-all cursor-pointer\",\n \"flex items-center gap-1.5\",\n showSelectionOverlay\n ? \"bg-blue-100 dark:bg-blue-900/50 text-blue-700 dark:text-blue-300 border border-blue-300 dark:border-blue-700\"\n : \"border border-gray-300 dark:border-gray-600 text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-800\",\n )}\n title=\"Mostrar Seleção\"\n >\n <MousePointer2 className=\"w-3.5 h-3.5\" />\n <span className=\"hidden sm:inline\">Seleção</span>\n </button>\n )}\n\n {/* Save */}\n <button\n onClick={onSave}\n disabled={isSaving}\n className={cn(\n \"h-8 px-3 rounded-md text-xs font-medium transition-all cursor-pointer\",\n \"bg-gradient-to-r from-green-500 to-emerald-600 hover:from-green-600 hover:to-emerald-700 text-white shadow-lg hover:shadow-xl\",\n \"disabled:opacity-60 disabled:cursor-not-allowed\",\n \"flex items-center gap-1.5 hover:scale-[1.02] active:scale-[0.98]\",\n )}\n >\n <Save className=\"w-3.5 h-3.5\" />\n {isSaving ? \"Salvando...\" : \"Salvar\"}\n </button>\n\n {/* Publish */}\n {onPublish && (\n <button\n onClick={onPublish}\n disabled={isSaving}\n className={cn(\n \"h-8 px-3 rounded-md text-xs font-medium transition-all cursor-pointer\",\n \"border-2 border-purple-500 text-purple-600 dark:text-purple-400 bg-transparent\",\n \"hover:bg-purple-50 dark:hover:bg-purple-950/50\",\n \"disabled:opacity-60 disabled:cursor-not-allowed\",\n \"flex items-center gap-1.5 hover:scale-[1.02] active:scale-[0.98]\",\n )}\n >\n <Eye className=\"w-3.5 h-3.5\" />\n Publicar\n </button>\n )}\n </div>\n </div>\n );\n});\n"],"names":["ToolbarButton","onClick","disabled","title","icon","jsx","cn","Toolbar","React","history","isSaving","onUndo","onRedo","onSave","onPublish","onReset","showSelectionOverlay","onToggleSelectionOverlay","jsxs","Undo","Redo","RotateCcw","MousePointer2","Save","Eye"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportHtml.d.ts","sourceRoot":"","sources":["../../../src/engine/export/exportHtml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAA6B,WAAW,EAAE,MAAM,uBAAuB,CAAC;AA4Y/E,MAAM,WAAW,uBAAuB;IACtC,mIAAmI;IACnI,cAAc,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAE,OAAc,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,
|
|
1
|
+
{"version":3,"file":"exportHtml.d.ts","sourceRoot":"","sources":["../../../src/engine/export/exportHtml.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,EAA6B,WAAW,EAAE,MAAM,uBAAuB,CAAC;AA4Y/E,MAAM,WAAW,uBAAuB;IACtC,mIAAmI;IACnI,cAAc,CAAC,EAAE,QAAQ,CAAC;CAC3B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,YAAY,EACtB,QAAQ,GAAE,OAAc,EACxB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,uBAAuB,GAChC,MAAM,CA2HR;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,EACZ,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAER;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,YAAY,EACtB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAUR;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,YAAY,GACrB,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBtC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { generateThemeCSSVariables as
|
|
2
|
-
import { hashDocument as
|
|
3
|
-
import { initializeExporters as
|
|
4
|
-
import { htmlExportRegistry as
|
|
5
|
-
const
|
|
1
|
+
import { generateThemeCSSVariables as z } from "../schema/themeTokens.js";
|
|
2
|
+
import { hashDocument as E } from "../../utils/documentHash.js";
|
|
3
|
+
import { initializeExporters as S } from "./exporters/index.js";
|
|
4
|
+
import { htmlExportRegistry as H } from "./exporters/HtmlExporter.js";
|
|
5
|
+
const C = `
|
|
6
6
|
/* Navbar engine (sg-navbar) - base e variações */
|
|
7
7
|
.sg-navbar {
|
|
8
8
|
display: flex;
|
|
@@ -301,41 +301,41 @@ const S = `
|
|
|
301
301
|
font-size: 0.9rem;
|
|
302
302
|
}
|
|
303
303
|
}
|
|
304
|
-
`,
|
|
305
|
-
function
|
|
306
|
-
if (
|
|
307
|
-
const r = Array.from(
|
|
308
|
-
(
|
|
304
|
+
`, s = /* @__PURE__ */ new Map(), h = 50;
|
|
305
|
+
function D() {
|
|
306
|
+
if (s.size <= h) return;
|
|
307
|
+
const r = Array.from(s.entries()).sort(
|
|
308
|
+
(t, a) => t[1].timestamp - a[1].timestamp
|
|
309
309
|
);
|
|
310
|
-
r.slice(0, r.length -
|
|
310
|
+
r.slice(0, r.length - h).forEach(([t]) => s.delete(t));
|
|
311
311
|
}
|
|
312
|
-
let
|
|
313
|
-
function
|
|
314
|
-
|
|
315
|
-
const
|
|
316
|
-
return
|
|
312
|
+
let u = !1;
|
|
313
|
+
function l(r, e = 0, t, a) {
|
|
314
|
+
u || (S(l), u = !0);
|
|
315
|
+
const d = H.get(r.type);
|
|
316
|
+
return d ? d(r, e, t, a) : `<div data-block-id="${r.id}" style="color: red; padding: 1rem; border: 2px dashed red;">Bloco desconhecido: ${r.type}</div>`;
|
|
317
317
|
}
|
|
318
|
-
function
|
|
318
|
+
function j(r) {
|
|
319
319
|
return r ? String(r).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'") : "";
|
|
320
320
|
}
|
|
321
|
-
function
|
|
322
|
-
const o =
|
|
323
|
-
if (
|
|
324
|
-
const n =
|
|
321
|
+
function $(r, e, t = !0, a, d) {
|
|
322
|
+
const o = d?.layoutFromPage, w = E(e), y = o?.id ?? "", c = `${w}-${r.id}-${a ?? ""}-${y}`;
|
|
323
|
+
if (t && s.has(c)) {
|
|
324
|
+
const n = s.get(c);
|
|
325
325
|
return n.timestamp = Date.now(), n.html;
|
|
326
326
|
}
|
|
327
|
-
const
|
|
328
|
-
let p = r.structure.map((n) =>
|
|
327
|
+
const x = z(e.theme);
|
|
328
|
+
let p = r.structure.map((n) => l(n, 0, a, e.theme)).join("");
|
|
329
329
|
if (o && o.id !== r.id && o.structure?.length) {
|
|
330
|
-
const n = o.structure,
|
|
331
|
-
p =
|
|
330
|
+
const n = o.structure, _ = r.structure.some((i) => i.type === "navbar"), k = r.structure.some((i) => i.type === "footer"), m = _ ? null : n.find((i) => i.type === "navbar"), v = m ? l(m, 0, a, e.theme) : "", b = k ? null : n.find((i) => i.type === "footer"), f = b && b.type !== "navbar" ? l(b, 0, a, e.theme) : "";
|
|
331
|
+
(v || f) && (p = v + p + f);
|
|
332
332
|
}
|
|
333
|
-
const
|
|
333
|
+
const g = `<!DOCTYPE html>
|
|
334
334
|
<html lang="pt-BR">
|
|
335
335
|
<head>
|
|
336
336
|
<meta charset="UTF-8">
|
|
337
337
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
338
|
-
<title>${
|
|
338
|
+
<title>${j(r.name)}</title>
|
|
339
339
|
<style>
|
|
340
340
|
* {
|
|
341
341
|
margin: 0;
|
|
@@ -350,10 +350,10 @@ function D(r, e, a = !0, t, s) {
|
|
|
350
350
|
line-height: 1.6;
|
|
351
351
|
color: var(--sg-text, #1f2937);
|
|
352
352
|
}
|
|
353
|
-
${
|
|
353
|
+
${x}
|
|
354
354
|
|
|
355
355
|
/* Landing Page Styles */
|
|
356
|
-
${
|
|
356
|
+
${C}
|
|
357
357
|
</style>
|
|
358
358
|
<script>
|
|
359
359
|
// Smooth scroll para âncoras sem reload
|
|
@@ -394,38 +394,38 @@ function D(r, e, a = !0, t, s) {
|
|
|
394
394
|
${p}
|
|
395
395
|
</body>
|
|
396
396
|
</html>`;
|
|
397
|
-
return
|
|
397
|
+
return t && (s.set(c, { html: g, timestamp: Date.now() }), D()), g;
|
|
398
398
|
}
|
|
399
|
-
function
|
|
400
|
-
return
|
|
399
|
+
function F(r, e, t) {
|
|
400
|
+
return l(r, 0, e, t);
|
|
401
401
|
}
|
|
402
|
-
function
|
|
403
|
-
|
|
402
|
+
function P() {
|
|
403
|
+
s.clear();
|
|
404
404
|
}
|
|
405
|
-
function
|
|
406
|
-
const
|
|
407
|
-
if (!
|
|
405
|
+
function R(r, e) {
|
|
406
|
+
const t = e ? r.pages.find((a) => a.id === e) : r.pages[0];
|
|
407
|
+
if (!t)
|
|
408
408
|
throw new Error("Page not found");
|
|
409
|
-
return
|
|
409
|
+
return $(t, r);
|
|
410
410
|
}
|
|
411
|
-
function
|
|
411
|
+
function L(r) {
|
|
412
412
|
const e = [];
|
|
413
|
-
function a
|
|
414
|
-
if (
|
|
415
|
-
const o =
|
|
413
|
+
function t(a) {
|
|
414
|
+
if (a.type === "image") {
|
|
415
|
+
const o = a.props.src;
|
|
416
416
|
o && e.push({ type: "image", url: o });
|
|
417
417
|
}
|
|
418
|
-
(
|
|
418
|
+
(a.props?.children || []).forEach(t);
|
|
419
419
|
}
|
|
420
|
-
return r.pages.forEach((
|
|
421
|
-
|
|
420
|
+
return r.pages.forEach((a) => {
|
|
421
|
+
a.structure.forEach(t);
|
|
422
422
|
}), e;
|
|
423
423
|
}
|
|
424
424
|
export {
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
425
|
+
P as clearHtmlCache,
|
|
426
|
+
F as exportBlockToHtml,
|
|
427
|
+
R as exportDocumentToHtml,
|
|
428
|
+
$ as exportPageToHtml,
|
|
429
|
+
L as generateAssetsManifest
|
|
430
430
|
};
|
|
431
431
|
//# sourceMappingURL=exportHtml.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exportHtml.js","sources":["../../../src/engine/export/exportHtml.ts"],"sourcesContent":["/**\n * HTML Exporter\n * Exporta SiteDocument para HTML estático\n */\n\nimport { SiteDocument, SitePage, Block } from \"../schema/siteDocument\";\nimport { generateThemeCSSVariables, ThemeTokens } from \"../schema/themeTokens\";\nimport { hashDocument } from \"../../utils/documentHash\";\nimport { htmlExportRegistry, initializeExporters } from \"./exporters\";\n\n/**\n * Landing Page CSS crítico para navbar e outros componentes\n * Incluído inline para garantir que sempre esteja disponível\n */\nconst landingPageCSS = `\n/* Navbar engine (sg-navbar) - base e variações */\n.sg-navbar {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 4.5rem;\n color: var(--sg-text, #1f2937);\n position: relative;\n transition: all 0.2s ease;\n background-color: var(--navbar-bg, var(--sg-bg, #fff));\n border-radius: var(--navbar-border-radius, 0);\n box-shadow: var(--navbar-shadow, 0 1px 2px 0 rgba(0, 0, 0, 0.05));\n}\n\n.sg-navbar::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: inherit;\n opacity: var(--navbar-blur-opacity, 0);\n border-radius: inherit;\n z-index: 0;\n pointer-events: none;\n backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n -webkit-backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n}\n\n.sg-navbar--floating {\n margin: 1rem;\n max-width: calc(100% - 2rem);\n border-radius: var(--navbar-border-radius, 12px);\n box-shadow: var(--navbar-shadow, 0 10px 40px rgba(0, 0, 0, 0.15));\n}\n\n/* Compact mode - 20% smaller height and smaller elements */\n.sg-navbar--compact {\n height: 3.6rem;\n}\n\n.sg-navbar--compact .sg-navbar__link {\n font-size: 0.875rem;\n padding: 0.375rem 0.5rem;\n}\n\n.sg-navbar--compact .sg-navbar__btn {\n font-size: 0.875rem;\n padding: 0.375rem 0.875rem;\n}\n\n.sg-navbar__container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1.5rem;\n max-width: 1200px;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n padding: 0 1rem;\n position: relative;\n z-index: 1;\n}\n\n.sg-navbar__brand {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: 100%;\n}\n\n.sg-navbar__brand a {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: 100%;\n text-decoration: none;\n color: var(--sg-primary, #3b82f6);\n font-weight: 700;\n font-size: 1.25rem;\n}\n\n.sg-navbar__brand img {\n object-fit: contain;\n object-position: left center;\n}\n\n.sg-navbar__brand-text {\n color: var(--sg-primary, #3b82f6);\n font-weight: 700;\n font-size: 1.25rem;\n}\n\n.sg-navbar__menu {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n}\n\n.sg-navbar__link {\n color: var(--navbar-link-color, var(--sg-text, #1f2937));\n font-size: var(--navbar-link-size, 1rem);\n text-decoration: none;\n font-weight: 500;\n transition: color 0.2s ease;\n}\n\n.sg-navbar__link:hover {\n color: var(--navbar-link-hover-color, var(--sg-primary, #3b82f6));\n}\n\n.sg-navbar__btn {\n padding: 0.5rem 1rem;\n font-weight: 500;\n text-decoration: none;\n display: inline-block;\n transition: all 0.2s ease;\n border-radius: var(--navbar-btn-radius, 0.5rem);\n}\n\n.sg-navbar__btn--solid {\n background-color: var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n color: var(--navbar-btn-text, var(--sg-primary-text, #fff));\n border: none;\n}\n\n/* Hover effects are now controlled by the hover effects system */\n\n.sg-navbar__btn--outline {\n background-color: transparent;\n color: var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n border: 2px solid var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n}\n\n.sg-navbar__btn--ghost {\n background-color: transparent;\n color: var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n border: none;\n}\n\n.sg-navbar--classic.sg-navbar--floating {\n padding: 1rem 0;\n border-bottom: 1px solid var(--sg-border, #e5e7eb);\n}\n\n.sg-navbar--centered.sg-navbar--floating {\n padding: 1rem 0;\n border-bottom: 1px solid var(--sg-border, #e5e7eb);\n}\n\n.sg-navbar--centered .sg-navbar__container {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n align-items: center;\n}\n\n.sg-navbar--centered .sg-navbar__brand {\n justify-self: start;\n}\n\n.sg-navbar--centered .sg-navbar__menu {\n justify-self: center;\n}\n\n.sg-navbar--centered .sg-navbar__actions {\n justify-self: end;\n}\n\n/* Dropdown wrapper */\n.sg-navbar__dropdown-wrapper {\n position: relative;\n display: inline-block;\n}\n\n/* Hover bridge invisível - conecta o botão ao dropdown (16px gap + overlap) */\n.sg-navbar__dropdown-wrapper::before {\n content: \"\";\n position: absolute;\n top: 100%;\n left: -1rem;\n right: -1rem;\n height: 20px;\n background: transparent;\n}\n\n.sg-navbar__link--has-dropdown {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n position: relative;\n text-decoration: none;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n/* Chevron-down icon (▼) */\n.sg-navbar__link--has-dropdown::after {\n content: \"\";\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.25rem;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 5px solid currentColor;\n transition: transform 0.2s ease;\n}\n\n.sg-navbar__dropdown-wrapper:hover .sg-navbar__link--has-dropdown::after {\n transform: rotate(180deg);\n}\n\n/* Dropdown container */\n.sg-navbar-dropdown {\n display: none;\n opacity: 0;\n position: absolute;\n top: calc(100% + 16px); /* Pequeno gap visual abaixo do navbar */\n left: 0;\n z-index: 1000;\n min-width: 200px;\n padding: 0.5rem 0;\n transform: translateY(-5px);\n transition: opacity 0.2s ease, transform 0.2s ease;\n overflow: visible;\n}\n\n/* Frost layer do dropdown - cobre todo o dropdown */\n.sg-navbar-dropdown::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--dropdown-bg, rgba(255, 255, 255, 0.9));\n border-radius: var(--dropdown-radius, 25px);\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n pointer-events: none;\n z-index: 0;\n backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n -webkit-backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n}\n\n/* Dropdown items acima do frost layer */\n.sg-navbar-dropdown > * {\n position: relative;\n z-index: 1;\n}\n\n/* Show dropdown on hover/focus with animation */\n.sg-navbar__dropdown-wrapper:hover .sg-navbar-dropdown,\n.sg-navbar__dropdown-wrapper:focus-within .sg-navbar-dropdown {\n display: block;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Dropdown items */\n.sg-navbar-dropdown__item {\n display: block;\n white-space: nowrap;\n}\n\n/* Mobile - dropdowns sempre visíveis no sidebar */\n@media (max-width: 768px) {\n .sg-navbar-dropdown {\n position: static;\n display: block !important;\n opacity: 1 !important;\n transform: none !important;\n min-width: auto;\n padding-left: 1rem;\n background: transparent !important;\n box-shadow: none !important;\n margin-top: 0.25rem;\n }\n\n .sg-navbar__link--has-dropdown::after {\n content: none;\n }\n\n .sg-navbar-dropdown__item {\n padding: 0.5rem 1.25rem;\n font-size: 0.9rem;\n }\n}\n`;\n\n/**\n * Cache de HTML com limite LRU (Last Recently Used)\n * Limite de 50 entradas para evitar memory leak\n */\nconst htmlCache = new Map<string, { html: string; timestamp: number }>();\nconst MAX_CACHE_SIZE = 50;\n\n/**\n * Limpa entradas antigas do cache quando excede o limite\n */\nfunction cleanCache() {\n if (htmlCache.size <= MAX_CACHE_SIZE) return;\n\n // Ordenar por timestamp e remover os mais antigos\n const entries = Array.from(htmlCache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp,\n );\n\n const toRemove = entries.slice(0, entries.length - MAX_CACHE_SIZE);\n toRemove.forEach(([key]) => htmlCache.delete(key));\n}\n\n// Inicializar exporters com referência à função de renderização\nlet exportersInitialized = false;\n\n/**\n * Renderiza um bloco diretamente para HTML (sem React)\n * Usa registry pattern para despachar para exporters modulares\n */\nfunction blockToHtmlDirect(\n block: Block,\n depth: number = 0,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n // Inicializar exporters na primeira execução\n if (!exportersInitialized) {\n initializeExporters(blockToHtmlDirect);\n exportersInitialized = true;\n }\n\n // Buscar exporter no registry\n const exporter = htmlExportRegistry.get(block.type);\n\n if (!exporter) {\n // Fallback para blocos desconhecidos\n return `<div data-block-id=\"${block.id}\" style=\"color: red; padding: 1rem; border: 2px dashed red;\">Bloco desconhecido: ${block.type}</div>`;\n }\n\n // Executar exporter\n return exporter(block, depth, basePath, theme);\n}\n\n/**\n * Escapa HTML para prevenir XSS\n * NOTA: Esta função foi mantida aqui por compatibilidade, mas está duplicada\n * em shared/htmlHelpers.ts onde é usada pelos exporters\n */\nfunction escapeHtml(text: string): string {\n if (!text) return \"\";\n return String(text)\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n// ============================================================================\n// CÓDIGO ANTIGO REMOVIDO - Agora usamos Registry Pattern\n// ============================================================================\n// Todo o switch gigante de blockToHtmlDirect foi refatorado para exporters\n// modulares em /exporters/. Mantido apenas as linhas abaixo para referência\n// do que foi removido:\n//\n// - ~1200 linhas de código de switch/case\n// - 40+ casos de tipos de blocos\n// - Lógica de renderização HTML inline\n//\n// Agora distribuído em:\n// - /exporters/layout/*.ts (Container, Stack, Grid, Box, Section)\n// - /exporters/content/*.ts (Heading, Text, Image, Button, Link, etc)\n// - /exporters/sections/*.ts (Hero, Navbar, Footer, Marketing sections)\n// - /exporters/forms/*.ts (Form, Input, Textarea, FormSelect)\n// ============================================================================\n\n\nexport interface ExportPageToHtmlOptions {\n /** Página de referência para layout (navbar + footer). Quando a página atual não é a home, inclui navbar e footer desta página. */\n layoutFromPage?: SitePage;\n}\n\n/**\n * Exporta uma página para HTML (com cache)\n * @param basePath - Base path para links (ex.: /site ou /site/escola/:slug)\n * @param options - layoutFromPage: quando informado e diferente da página atual, inclui navbar (primeiro bloco navbar) e footer (último bloco) da página de referência\n */\nexport function exportPageToHtml(\n page: SitePage,\n document: SiteDocument,\n useCache: boolean = true,\n basePath?: string,\n options?: ExportPageToHtmlOptions,\n): string {\n const layoutFromPage = options?.layoutFromPage;\n const docHash = hashDocument(document);\n const layoutId = layoutFromPage?.id ?? \"\";\n const cacheKey = `${docHash}-${page.id}-${basePath ?? \"\"}-${layoutId}`;\n\n // Verificar cache\n if (useCache && htmlCache.has(cacheKey)) {\n const cached = htmlCache.get(cacheKey)!;\n cached.timestamp = Date.now();\n return cached.html;\n }\n\n // Gerar HTML\n const themeCSS = generateThemeCSSVariables(document.theme);\n let bodyHtml = page.structure\n .map((block) => blockToHtmlDirect(block, 0, basePath, document.theme))\n .join(\"\");\n\n // Layout compartilhado: em páginas não-home, incluir navbar e footer da página de referência (ex.: home)\n if (\n layoutFromPage &&\n layoutFromPage.id !== page.id &&\n layoutFromPage.structure?.length\n ) {\n const layoutStructure = layoutFromPage.structure;\n const navbarBlock = layoutStructure.find((b) => b.type === \"navbar\");\n const navbarHtml = navbarBlock\n ? blockToHtmlDirect(navbarBlock, 0, basePath, document.theme)\n : \"\";\n const footerBlock =\n layoutStructure.length > 1\n ? layoutStructure[layoutStructure.length - 1]\n : null;\n const footerHtml =\n footerBlock && footerBlock.type !== \"navbar\"\n ? blockToHtmlDirect(footerBlock, 0, basePath, document.theme)\n : \"\";\n bodyHtml = navbarHtml + bodyHtml + footerHtml;\n }\n\n const html = `<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(page.name)}</title>\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n html {\n scroll-behavior: smooth;\n }\n body {\n font-family: var(--sg-font-body, system-ui, -apple-system, sans-serif);\n line-height: 1.6;\n color: var(--sg-text, #1f2937);\n }\n ${themeCSS}\n\n /* Landing Page Styles */\n ${landingPageCSS}\n </style>\n <script>\n // Smooth scroll para âncoras sem reload\n document.addEventListener('DOMContentLoaded', function() {\n // Interceptar cliques em links com âncoras\n document.querySelectorAll('a[href^=\"#\"]').forEach(function(anchor) {\n anchor.addEventListener('click', function(e) {\n const href = this.getAttribute('href');\n\n // Ignorar # vazio\n if (!href || href === '#') return;\n\n // Prevenir comportamento padrão (reload)\n e.preventDefault();\n\n // Encontrar o elemento alvo\n const targetId = href.substring(1); // Remove o #\n const targetElement = document.getElementById(targetId);\n\n if (targetElement) {\n // Scroll suave até o elemento\n targetElement.scrollIntoView({\n behavior: 'smooth',\n block: 'start'\n });\n\n // Atualizar URL sem reload (para manter histórico de navegação)\n if (history.pushState) {\n history.pushState(null, '', href);\n }\n }\n });\n });\n });\n </script>\n</head>\n<body>\n ${bodyHtml}\n</body>\n</html>`;\n\n // Armazenar no cache\n if (useCache) {\n htmlCache.set(cacheKey, { html, timestamp: Date.now() });\n cleanCache();\n }\n\n return html;\n}\n\n/**\n * Exporta apenas um bloco para HTML (para atualização parcial)\n */\nexport function exportBlockToHtml(\n block: Block,\n basePath?: string,\n theme?: ThemeTokens\n): string {\n return blockToHtmlDirect(block, 0, basePath, theme);\n}\n\n/**\n * Limpa o cache de HTML\n */\nexport function clearHtmlCache(): void {\n htmlCache.clear();\n}\n\n/**\n * Exporta documento completo para HTML\n *\n * Nota: Não sanitiza o HTML pois exportPageToHtml() já gera HTML seguro\n * (conteúdo de usuário é escapado via escapeHtml nos exporters).\n * A sanitização anterior (sanitizeHtml) removia o <head> inteiro,\n * perdendo CSS de tema, hover effects e landing page styles.\n */\nexport function exportDocumentToHtml(\n document: SiteDocument,\n pageId?: string,\n): string {\n const page = pageId\n ? document.pages.find((p) => p.id === pageId)\n : document.pages[0];\n\n if (!page) {\n throw new Error(\"Page not found\");\n }\n\n return exportPageToHtml(page, document);\n}\n\n/**\n * Gera manifest de assets (imagens, fontes, etc)\n */\nexport function generateAssetsManifest(\n document: SiteDocument,\n): Array<{ type: string; url: string }> {\n const assets: Array<{ type: string; url: string }> = [];\n\n function extractAssetsFromBlock(block: Block) {\n if (block.type === \"image\") {\n const src = (block as any).props.src;\n if (src) {\n assets.push({ type: \"image\", url: src });\n }\n }\n\n // Recursivamente extrair de children\n const children = (block as any).props?.children || [];\n children.forEach(extractAssetsFromBlock);\n }\n\n document.pages.forEach((page) => {\n page.structure.forEach(extractAssetsFromBlock);\n });\n\n return assets;\n}\n"],"names":["landingPageCSS","htmlCache","MAX_CACHE_SIZE","cleanCache","entries","b","key","exportersInitialized","blockToHtmlDirect","block","depth","basePath","theme","initializeExporters","exporter","htmlExportRegistry","escapeHtml","text","exportPageToHtml","page","document","useCache","options","layoutFromPage","docHash","hashDocument","layoutId","cacheKey","cached","themeCSS","generateThemeCSSVariables","bodyHtml","layoutStructure","navbarBlock","navbarHtml","footerBlock","footerHtml","html","exportBlockToHtml","clearHtmlCache","exportDocumentToHtml","pageId","p","generateAssetsManifest","assets","extractAssetsFromBlock","src"],"mappings":";;;;AAcA,MAAMA,IAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
|
|
1
|
+
{"version":3,"file":"exportHtml.js","sources":["../../../src/engine/export/exportHtml.ts"],"sourcesContent":["/**\n * HTML Exporter\n * Exporta SiteDocument para HTML estático\n */\n\nimport { SiteDocument, SitePage, Block } from \"../schema/siteDocument\";\nimport { generateThemeCSSVariables, ThemeTokens } from \"../schema/themeTokens\";\nimport { hashDocument } from \"../../utils/documentHash\";\nimport { htmlExportRegistry, initializeExporters } from \"./exporters\";\n\n/**\n * Landing Page CSS crítico para navbar e outros componentes\n * Incluído inline para garantir que sempre esteja disponível\n */\nconst landingPageCSS = `\n/* Navbar engine (sg-navbar) - base e variações */\n.sg-navbar {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 100%;\n height: 4.5rem;\n color: var(--sg-text, #1f2937);\n position: relative;\n transition: all 0.2s ease;\n background-color: var(--navbar-bg, var(--sg-bg, #fff));\n border-radius: var(--navbar-border-radius, 0);\n box-shadow: var(--navbar-shadow, 0 1px 2px 0 rgba(0, 0, 0, 0.05));\n}\n\n.sg-navbar::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: inherit;\n opacity: var(--navbar-blur-opacity, 0);\n border-radius: inherit;\n z-index: 0;\n pointer-events: none;\n backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n -webkit-backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n}\n\n.sg-navbar--floating {\n margin: 1rem;\n max-width: calc(100% - 2rem);\n border-radius: var(--navbar-border-radius, 12px);\n box-shadow: var(--navbar-shadow, 0 10px 40px rgba(0, 0, 0, 0.15));\n}\n\n/* Compact mode - 20% smaller height and smaller elements */\n.sg-navbar--compact {\n height: 3.6rem;\n}\n\n.sg-navbar--compact .sg-navbar__link {\n font-size: 0.875rem;\n padding: 0.375rem 0.5rem;\n}\n\n.sg-navbar--compact .sg-navbar__btn {\n font-size: 0.875rem;\n padding: 0.375rem 0.875rem;\n}\n\n.sg-navbar__container {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 1.5rem;\n max-width: 1200px;\n width: 100%;\n height: 100%;\n margin: 0 auto;\n padding: 0 1rem;\n position: relative;\n z-index: 1;\n}\n\n.sg-navbar__brand {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: 100%;\n}\n\n.sg-navbar__brand a {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n height: 100%;\n text-decoration: none;\n color: var(--sg-primary, #3b82f6);\n font-weight: 700;\n font-size: 1.25rem;\n}\n\n.sg-navbar__brand img {\n object-fit: contain;\n object-position: left center;\n}\n\n.sg-navbar__brand-text {\n color: var(--sg-primary, #3b82f6);\n font-weight: 700;\n font-size: 1.25rem;\n}\n\n.sg-navbar__menu {\n display: flex;\n align-items: center;\n gap: 1.5rem;\n}\n\n.sg-navbar__link {\n color: var(--navbar-link-color, var(--sg-text, #1f2937));\n font-size: var(--navbar-link-size, 1rem);\n text-decoration: none;\n font-weight: 500;\n transition: color 0.2s ease;\n}\n\n.sg-navbar__link:hover {\n color: var(--navbar-link-hover-color, var(--sg-primary, #3b82f6));\n}\n\n.sg-navbar__btn {\n padding: 0.5rem 1rem;\n font-weight: 500;\n text-decoration: none;\n display: inline-block;\n transition: all 0.2s ease;\n border-radius: var(--navbar-btn-radius, 0.5rem);\n}\n\n.sg-navbar__btn--solid {\n background-color: var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n color: var(--navbar-btn-text, var(--sg-primary-text, #fff));\n border: none;\n}\n\n/* Hover effects are now controlled by the hover effects system */\n\n.sg-navbar__btn--outline {\n background-color: transparent;\n color: var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n border: 2px solid var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n}\n\n.sg-navbar__btn--ghost {\n background-color: transparent;\n color: var(--navbar-btn-bg, var(--sg-primary, #3b82f6));\n border: none;\n}\n\n.sg-navbar--classic.sg-navbar--floating {\n padding: 1rem 0;\n border-bottom: 1px solid var(--sg-border, #e5e7eb);\n}\n\n.sg-navbar--centered.sg-navbar--floating {\n padding: 1rem 0;\n border-bottom: 1px solid var(--sg-border, #e5e7eb);\n}\n\n.sg-navbar--centered .sg-navbar__container {\n display: grid;\n grid-template-columns: 1fr auto 1fr;\n align-items: center;\n}\n\n.sg-navbar--centered .sg-navbar__brand {\n justify-self: start;\n}\n\n.sg-navbar--centered .sg-navbar__menu {\n justify-self: center;\n}\n\n.sg-navbar--centered .sg-navbar__actions {\n justify-self: end;\n}\n\n/* Dropdown wrapper */\n.sg-navbar__dropdown-wrapper {\n position: relative;\n display: inline-block;\n}\n\n/* Hover bridge invisível - conecta o botão ao dropdown (16px gap + overlap) */\n.sg-navbar__dropdown-wrapper::before {\n content: \"\";\n position: absolute;\n top: 100%;\n left: -1rem;\n right: -1rem;\n height: 20px;\n background: transparent;\n}\n\n.sg-navbar__link--has-dropdown {\n display: inline-flex;\n align-items: center;\n gap: 0.375rem;\n background: none;\n border: none;\n cursor: pointer;\n font: inherit;\n color: inherit;\n padding: 0.5rem 0.75rem;\n border-radius: 6px;\n position: relative;\n text-decoration: none;\n font-weight: 500;\n transition: all 0.2s ease;\n}\n\n/* Chevron-down icon (▼) */\n.sg-navbar__link--has-dropdown::after {\n content: \"\";\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 0.25rem;\n border-left: 4px solid transparent;\n border-right: 4px solid transparent;\n border-top: 5px solid currentColor;\n transition: transform 0.2s ease;\n}\n\n.sg-navbar__dropdown-wrapper:hover .sg-navbar__link--has-dropdown::after {\n transform: rotate(180deg);\n}\n\n/* Dropdown container */\n.sg-navbar-dropdown {\n display: none;\n opacity: 0;\n position: absolute;\n top: calc(100% + 16px); /* Pequeno gap visual abaixo do navbar */\n left: 0;\n z-index: 1000;\n min-width: 200px;\n padding: 0.5rem 0;\n transform: translateY(-5px);\n transition: opacity 0.2s ease, transform 0.2s ease;\n overflow: visible;\n}\n\n/* Frost layer do dropdown - cobre todo o dropdown */\n.sg-navbar-dropdown::before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-color: var(--dropdown-bg, rgba(255, 255, 255, 0.9));\n border-radius: var(--dropdown-radius, 25px);\n box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);\n pointer-events: none;\n z-index: 0;\n backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n -webkit-backdrop-filter: blur(var(--navbar-blur-amount, 0px));\n}\n\n/* Dropdown items acima do frost layer */\n.sg-navbar-dropdown > * {\n position: relative;\n z-index: 1;\n}\n\n/* Show dropdown on hover/focus with animation */\n.sg-navbar__dropdown-wrapper:hover .sg-navbar-dropdown,\n.sg-navbar__dropdown-wrapper:focus-within .sg-navbar-dropdown {\n display: block;\n opacity: 1;\n transform: translateY(0);\n}\n\n/* Dropdown items */\n.sg-navbar-dropdown__item {\n display: block;\n white-space: nowrap;\n}\n\n/* Mobile - dropdowns sempre visíveis no sidebar */\n@media (max-width: 768px) {\n .sg-navbar-dropdown {\n position: static;\n display: block !important;\n opacity: 1 !important;\n transform: none !important;\n min-width: auto;\n padding-left: 1rem;\n background: transparent !important;\n box-shadow: none !important;\n margin-top: 0.25rem;\n }\n\n .sg-navbar__link--has-dropdown::after {\n content: none;\n }\n\n .sg-navbar-dropdown__item {\n padding: 0.5rem 1.25rem;\n font-size: 0.9rem;\n }\n}\n`;\n\n/**\n * Cache de HTML com limite LRU (Last Recently Used)\n * Limite de 50 entradas para evitar memory leak\n */\nconst htmlCache = new Map<string, { html: string; timestamp: number }>();\nconst MAX_CACHE_SIZE = 50;\n\n/**\n * Limpa entradas antigas do cache quando excede o limite\n */\nfunction cleanCache() {\n if (htmlCache.size <= MAX_CACHE_SIZE) return;\n\n // Ordenar por timestamp e remover os mais antigos\n const entries = Array.from(htmlCache.entries()).sort(\n (a, b) => a[1].timestamp - b[1].timestamp,\n );\n\n const toRemove = entries.slice(0, entries.length - MAX_CACHE_SIZE);\n toRemove.forEach(([key]) => htmlCache.delete(key));\n}\n\n// Inicializar exporters com referência à função de renderização\nlet exportersInitialized = false;\n\n/**\n * Renderiza um bloco diretamente para HTML (sem React)\n * Usa registry pattern para despachar para exporters modulares\n */\nfunction blockToHtmlDirect(\n block: Block,\n depth: number = 0,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n // Inicializar exporters na primeira execução\n if (!exportersInitialized) {\n initializeExporters(blockToHtmlDirect);\n exportersInitialized = true;\n }\n\n // Buscar exporter no registry\n const exporter = htmlExportRegistry.get(block.type);\n\n if (!exporter) {\n // Fallback para blocos desconhecidos\n return `<div data-block-id=\"${block.id}\" style=\"color: red; padding: 1rem; border: 2px dashed red;\">Bloco desconhecido: ${block.type}</div>`;\n }\n\n // Executar exporter\n return exporter(block, depth, basePath, theme);\n}\n\n/**\n * Escapa HTML para prevenir XSS\n * NOTA: Esta função foi mantida aqui por compatibilidade, mas está duplicada\n * em shared/htmlHelpers.ts onde é usada pelos exporters\n */\nfunction escapeHtml(text: string): string {\n if (!text) return \"\";\n return String(text)\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n// ============================================================================\n// CÓDIGO ANTIGO REMOVIDO - Agora usamos Registry Pattern\n// ============================================================================\n// Todo o switch gigante de blockToHtmlDirect foi refatorado para exporters\n// modulares em /exporters/. Mantido apenas as linhas abaixo para referência\n// do que foi removido:\n//\n// - ~1200 linhas de código de switch/case\n// - 40+ casos de tipos de blocos\n// - Lógica de renderização HTML inline\n//\n// Agora distribuído em:\n// - /exporters/layout/*.ts (Container, Stack, Grid, Box, Section)\n// - /exporters/content/*.ts (Heading, Text, Image, Button, Link, etc)\n// - /exporters/sections/*.ts (Hero, Navbar, Footer, Marketing sections)\n// - /exporters/forms/*.ts (Form, Input, Textarea, FormSelect)\n// ============================================================================\n\n\nexport interface ExportPageToHtmlOptions {\n /** Página de referência para layout (navbar + footer). Quando a página atual não é a home, inclui navbar e footer desta página. */\n layoutFromPage?: SitePage;\n}\n\n/**\n * Exporta uma página para HTML (com cache)\n * @param basePath - Base path para links (ex.: /site ou /site/escola/:slug)\n * @param options - layoutFromPage: quando informado e diferente da página atual, inclui navbar (primeiro bloco navbar) e footer (último bloco) da página de referência\n */\nexport function exportPageToHtml(\n page: SitePage,\n document: SiteDocument,\n useCache: boolean = true,\n basePath?: string,\n options?: ExportPageToHtmlOptions,\n): string {\n const layoutFromPage = options?.layoutFromPage;\n const docHash = hashDocument(document);\n const layoutId = layoutFromPage?.id ?? \"\";\n const cacheKey = `${docHash}-${page.id}-${basePath ?? \"\"}-${layoutId}`;\n\n // Verificar cache\n if (useCache && htmlCache.has(cacheKey)) {\n const cached = htmlCache.get(cacheKey)!;\n cached.timestamp = Date.now();\n return cached.html;\n }\n\n // Gerar HTML\n const themeCSS = generateThemeCSSVariables(document.theme);\n let bodyHtml = page.structure\n .map((block) => blockToHtmlDirect(block, 0, basePath, document.theme))\n .join(\"\");\n\n // Layout compartilhado: em páginas não-home, incluir navbar e footer da página de referência (ex.: home)\n // Pula injeção se a página já possui seu próprio navbar/footer (ex.: páginas de plugin)\n if (\n layoutFromPage &&\n layoutFromPage.id !== page.id &&\n layoutFromPage.structure?.length\n ) {\n const layoutStructure = layoutFromPage.structure;\n\n const pageHasNavbar = page.structure.some((b) => b.type === \"navbar\");\n const pageHasFooter = page.structure.some((b) => b.type === \"footer\");\n\n const navbarBlock = !pageHasNavbar\n ? layoutStructure.find((b) => b.type === \"navbar\")\n : null;\n const navbarHtml = navbarBlock\n ? blockToHtmlDirect(navbarBlock, 0, basePath, document.theme)\n : \"\";\n\n const footerBlock = !pageHasFooter\n ? layoutStructure.find((b) => b.type === \"footer\")\n : null;\n const footerHtml =\n footerBlock && footerBlock.type !== \"navbar\"\n ? blockToHtmlDirect(footerBlock, 0, basePath, document.theme)\n : \"\";\n\n if (navbarHtml || footerHtml) {\n bodyHtml = navbarHtml + bodyHtml + footerHtml;\n }\n }\n\n const html = `<!DOCTYPE html>\n<html lang=\"pt-BR\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${escapeHtml(page.name)}</title>\n <style>\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n html {\n scroll-behavior: smooth;\n }\n body {\n font-family: var(--sg-font-body, system-ui, -apple-system, sans-serif);\n line-height: 1.6;\n color: var(--sg-text, #1f2937);\n }\n ${themeCSS}\n\n /* Landing Page Styles */\n ${landingPageCSS}\n </style>\n <script>\n // Smooth scroll para âncoras sem reload\n document.addEventListener('DOMContentLoaded', function() {\n // Interceptar cliques em links com âncoras\n document.querySelectorAll('a[href^=\"#\"]').forEach(function(anchor) {\n anchor.addEventListener('click', function(e) {\n const href = this.getAttribute('href');\n\n // Ignorar # vazio\n if (!href || href === '#') return;\n\n // Prevenir comportamento padrão (reload)\n e.preventDefault();\n\n // Encontrar o elemento alvo\n const targetId = href.substring(1); // Remove o #\n const targetElement = document.getElementById(targetId);\n\n if (targetElement) {\n // Scroll suave até o elemento\n targetElement.scrollIntoView({\n behavior: 'smooth',\n block: 'start'\n });\n\n // Atualizar URL sem reload (para manter histórico de navegação)\n if (history.pushState) {\n history.pushState(null, '', href);\n }\n }\n });\n });\n });\n </script>\n</head>\n<body>\n ${bodyHtml}\n</body>\n</html>`;\n\n // Armazenar no cache\n if (useCache) {\n htmlCache.set(cacheKey, { html, timestamp: Date.now() });\n cleanCache();\n }\n\n return html;\n}\n\n/**\n * Exporta apenas um bloco para HTML (para atualização parcial)\n */\nexport function exportBlockToHtml(\n block: Block,\n basePath?: string,\n theme?: ThemeTokens\n): string {\n return blockToHtmlDirect(block, 0, basePath, theme);\n}\n\n/**\n * Limpa o cache de HTML\n */\nexport function clearHtmlCache(): void {\n htmlCache.clear();\n}\n\n/**\n * Exporta documento completo para HTML\n *\n * Nota: Não sanitiza o HTML pois exportPageToHtml() já gera HTML seguro\n * (conteúdo de usuário é escapado via escapeHtml nos exporters).\n * A sanitização anterior (sanitizeHtml) removia o <head> inteiro,\n * perdendo CSS de tema, hover effects e landing page styles.\n */\nexport function exportDocumentToHtml(\n document: SiteDocument,\n pageId?: string,\n): string {\n const page = pageId\n ? document.pages.find((p) => p.id === pageId)\n : document.pages[0];\n\n if (!page) {\n throw new Error(\"Page not found\");\n }\n\n return exportPageToHtml(page, document);\n}\n\n/**\n * Gera manifest de assets (imagens, fontes, etc)\n */\nexport function generateAssetsManifest(\n document: SiteDocument,\n): Array<{ type: string; url: string }> {\n const assets: Array<{ type: string; url: string }> = [];\n\n function extractAssetsFromBlock(block: Block) {\n if (block.type === \"image\") {\n const src = (block as any).props.src;\n if (src) {\n assets.push({ type: \"image\", url: src });\n }\n }\n\n // Recursivamente extrair de children\n const children = (block as any).props?.children || [];\n children.forEach(extractAssetsFromBlock);\n }\n\n document.pages.forEach((page) => {\n page.structure.forEach(extractAssetsFromBlock);\n });\n\n return assets;\n}\n"],"names":["landingPageCSS","htmlCache","MAX_CACHE_SIZE","cleanCache","entries","a","b","key","exportersInitialized","blockToHtmlDirect","block","depth","basePath","theme","initializeExporters","exporter","htmlExportRegistry","escapeHtml","text","exportPageToHtml","page","document","useCache","options","layoutFromPage","docHash","hashDocument","layoutId","cacheKey","cached","themeCSS","generateThemeCSSVariables","bodyHtml","layoutStructure","pageHasNavbar","pageHasFooter","navbarBlock","navbarHtml","footerBlock","footerHtml","html","exportBlockToHtml","clearHtmlCache","exportDocumentToHtml","pageId","p","generateAssetsManifest","assets","extractAssetsFromBlock","src"],"mappings":";;;;AAcA,MAAMA,IAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { Block } from '../../../schema/siteDocument';
|
|
2
|
+
import { ThemeTokens } from '../../../schema/themeTokens';
|
|
3
|
+
export declare function exportBlogPostCard(block: Block, depth: number, basePath?: string, theme?: ThemeTokens): string;
|
|
4
|
+
export declare function exportBlogPostGrid(block: Block, depth: number, basePath?: string, theme?: ThemeTokens, renderChild?: (block: Block, _depth: number, basePath?: string, theme?: ThemeTokens) => string): string;
|
|
5
|
+
export declare function exportBlogPostDetail(block: Block, depth: number, basePath?: string, theme?: ThemeTokens): string;
|
|
6
|
+
//# sourceMappingURL=BlogPostExporters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BlogPostExporters.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/BlogPostExporters.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAY1D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAgGR;AAMD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAoDR;AAMD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CAyER"}
|