@brunoalz/smartgesti-site-editor 0.2.2 → 1.1.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 +2 -1
- package/dist/editor/BlockSelector.d.ts.map +1 -1
- package/dist/editor/BlockSelector.js +55 -64
- package/dist/editor/BlockSelector.js.map +1 -1
- package/dist/editor/LandingPageEditor.d.ts +19 -0
- package/dist/editor/LandingPageEditor.d.ts.map +1 -0
- package/dist/editor/LandingPageEditor.js +239 -0
- package/dist/editor/LandingPageEditor.js.map +1 -0
- 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 +5 -3
- package/dist/editor/PropertyEditor/BlockPropertyEditor.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/BlockPropertyEditor.js +60 -113
- package/dist/editor/PropertyEditor/BlockPropertyEditor.js.map +1 -1
- package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.d.ts +3 -1
- 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/PropertyGroup.d.ts +1 -1
- package/dist/editor/PropertyEditor/PropertyGroup.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/VariationSelector.d.ts +2 -1
- package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/VariationSelector.js +35 -31
- package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
- package/dist/editor/PropertyEditor/index.js +30 -28
- 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 +1 -1
- 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/ImageInput.d.ts.map +1 -0
- package/dist/{components → editor/PropertyEditor}/inputs/ImageInput.js +41 -39
- package/dist/editor/PropertyEditor/inputs/ImageInput.js.map +1 -0
- package/dist/editor/PropertyEditor/inputs/TypographyInput.js +41 -44
- package/dist/editor/PropertyEditor/inputs/TypographyInput.js.map +1 -1
- package/dist/editor/PropertyEditor/inputs/index.d.ts +2 -0
- package/dist/editor/PropertyEditor/inputs/index.d.ts.map +1 -1
- package/dist/editor/PropertyEditor/renderPropertyInput.d.ts +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 +13 -4
- package/dist/editor/components/CenterPanel.d.ts.map +1 -1
- package/dist/editor/components/CenterPanel.js +40 -31
- package/dist/editor/components/CenterPanel.js.map +1 -1
- package/dist/editor/components/LeftPanel.d.ts +2 -1
- package/dist/editor/components/LeftPanel.d.ts.map +1 -1
- package/dist/editor/components/LeftPanel.js +13 -12
- package/dist/editor/components/LeftPanel.js.map +1 -1
- package/dist/editor/components/LoadingSpinner.d.ts.map +1 -0
- package/dist/editor/components/LoadingSpinner.js.map +1 -0
- package/dist/editor/components/RightPanel.d.ts +8 -2
- package/dist/editor/components/RightPanel.d.ts.map +1 -1
- package/dist/editor/components/RightPanel.js +24 -19
- package/dist/editor/components/RightPanel.js.map +1 -1
- package/dist/editor/components/Toolbar.d.ts +5 -1
- package/dist/editor/components/Toolbar.d.ts.map +1 -1
- package/dist/editor/components/Toolbar.js +56 -40
- package/dist/editor/components/Toolbar.js.map +1 -1
- package/dist/engine/export/exportHtml.d.ts +10 -5
- package/dist/engine/export/exportHtml.d.ts.map +1 -1
- package/dist/engine/export/exportHtml.js +38 -40
- package/dist/engine/export/exportHtml.js.map +1 -1
- package/dist/engine/export/exporters/content/HeadingExporter.d.ts.map +1 -1
- package/dist/engine/export/exporters/content/HeadingExporter.js +6 -6
- package/dist/engine/export/exporters/content/HeadingExporter.js.map +1 -1
- package/dist/engine/export/exporters/content/LinkExporter.d.ts.map +1 -1
- package/dist/engine/export/exporters/content/LinkExporter.js +6 -6
- package/dist/engine/export/exporters/content/LinkExporter.js.map +1 -1
- package/dist/engine/export/exporters/content/TextExporter.d.ts.map +1 -1
- package/dist/engine/export/exporters/content/TextExporter.js +7 -7
- package/dist/engine/export/exporters/content/TextExporter.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.d.ts.map +1 -1
- package/dist/engine/export/exporters/sections/FooterExporter.js +33 -40
- 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 -218
- 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/export/sanitizeHtml.d.ts.map +1 -1
- package/dist/engine/export/sanitizeHtml.js +65 -18
- package/dist/engine/export/sanitizeHtml.js.map +1 -1
- package/dist/engine/export/styleResolver.d.ts.map +1 -1
- package/dist/engine/export/styleResolver.js +33 -33
- package/dist/engine/export/styleResolver.js.map +1 -1
- package/dist/engine/generators/generateLandingPage.d.ts +4 -4
- package/dist/engine/generators/generateLandingPage.d.ts.map +1 -1
- package/dist/engine/generators/generateLandingPage.js.map +1 -1
- package/dist/engine/index.d.ts +6 -3
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js +99 -89
- package/dist/engine/index.js.map +1 -1
- package/dist/engine/patch/PatchBuilder.d.ts +11 -11
- package/dist/engine/patch/PatchBuilder.d.ts.map +1 -1
- package/dist/engine/patch/PatchBuilder.js +92 -93
- package/dist/engine/patch/PatchBuilder.js.map +1 -1
- package/dist/engine/patch/applyPatch.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 +19 -0
- package/dist/engine/preview/Preview.d.ts.map +1 -0
- package/dist/engine/preview/Preview.js +418 -0
- package/dist/engine/preview/Preview.js.map +1 -0
- 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 +39 -36
- package/dist/engine/registry/registry.js.map +1 -1
- package/dist/engine/registry/types.d.ts +17 -13
- package/dist/engine/registry/types.d.ts.map +1 -1
- package/dist/engine/render/renderNodeImpl.js +85 -85
- package/dist/engine/render/renderNodeImpl.js.map +1 -1
- package/dist/engine/render/renderPage.d.ts +3 -3
- package/dist/engine/render/renderPage.d.ts.map +1 -1
- package/dist/engine/render/renderPage.js.map +1 -1
- package/dist/engine/render/renderers/composition/CardRenderer.js +4 -4
- package/dist/engine/render/renderers/content/LinkRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/content/LinkRenderer.js +41 -16
- package/dist/engine/render/renderers/content/LinkRenderer.js.map +1 -1
- package/dist/engine/render/renderers/content/SocialLinksRenderer.d.ts.map +1 -1
- package/dist/engine/render/renderers/content/SocialLinksRenderer.js +16 -23
- package/dist/engine/render/renderers/content/SocialLinksRenderer.js.map +1 -1
- package/dist/engine/render/renderers/forms/FormRenderer.js +6 -6
- package/dist/engine/render/renderers/layout/GridRenderer.js +3 -3
- 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 +25 -30
- 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 +293 -229
- 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 +118 -7
- package/dist/engine/schema/siteDocument.d.ts.map +1 -1
- package/dist/engine/schema/siteDocument.js +1 -1
- package/dist/engine/schema/siteDocument.js.map +1 -1
- package/dist/engine/schema/themeTokens.d.ts +1 -1
- package/dist/engine/schema/themeTokens.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/presets.js +4 -12
- package/dist/engine/shared/imageGrid/presets.js.map +1 -1
- 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/layoutConstants.d.ts +13 -0
- package/dist/engine/shared/layoutConstants.d.ts.map +1 -0
- package/dist/engine/shared/layoutConstants.js +14 -0
- package/dist/engine/shared/layoutConstants.js.map +1 -0
- package/dist/engine/shared/shadowConstants.d.ts +5 -0
- package/dist/engine/shared/shadowConstants.d.ts.map +1 -0
- package/dist/engine/shared/shadowConstants.js +11 -0
- package/dist/engine/shared/shadowConstants.js.map +1 -0
- 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/engine/shared/socialIcons.d.ts +6 -0
- package/dist/engine/shared/socialIcons.d.ts.map +1 -0
- package/dist/engine/shared/socialIcons.js +13 -0
- package/dist/engine/shared/socialIcons.js.map +1 -0
- package/dist/engine/shared/typeGuards.d.ts +11 -0
- package/dist/engine/shared/typeGuards.d.ts.map +1 -0
- package/dist/hooks/useEditorState.d.ts +8 -5
- package/dist/hooks/useEditorState.d.ts.map +1 -1
- package/dist/hooks/useEditorState.js +150 -194
- package/dist/hooks/useEditorState.js.map +1 -1
- package/dist/hooks/useNavbarAutoSync.d.ts +2 -2
- package/dist/hooks/useNavbarAutoSync.d.ts.map +1 -1
- package/dist/hooks/useNavbarAutoSync.js.map +1 -1
- package/dist/index.d.ts +60 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +109 -124
- package/dist/index.js.map +1 -1
- package/dist/shared/index.d.ts +2 -2
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/schema.d.ts +4 -4
- package/dist/shared/schema.d.ts.map +1 -1
- package/dist/shared/schema.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/escola-edvi.d.ts +2 -2
- package/dist/shared/templates/escola-edvi.d.ts.map +1 -1
- package/dist/shared/templates/escola-edvi.js.map +1 -1
- package/dist/shared/templates/escola-premium.d.ts +2 -2
- package/dist/shared/templates/escola-premium.d.ts.map +1 -1
- package/dist/shared/templates/escola-premium.js.map +1 -1
- package/dist/shared/templates/escola-zilom.d.ts +2 -2
- package/dist/shared/templates/escola-zilom.d.ts.map +1 -1
- package/dist/shared/templates/escola-zilom.js.map +1 -1
- package/dist/shared/templates/index.d.ts +7 -5
- 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/shared/validators.d.ts +3 -3
- package/dist/shared/validators.d.ts.map +1 -1
- package/dist/shared/validators.js.map +1 -1
- package/dist/site/BlockRenderer.d.ts +1 -1
- package/dist/site/BlockRenderer.d.ts.map +1 -1
- package/dist/site/BlockRenderer.js +22 -26
- package/dist/site/BlockRenderer.js.map +1 -1
- package/dist/site/blocks/Button.js +15 -17
- package/dist/site/blocks/Button.js.map +1 -1
- package/dist/site/blocks/Card.js +13 -15
- package/dist/site/blocks/Card.js.map +1 -1
- package/dist/site/blocks/Features.js +15 -17
- package/dist/site/blocks/Features.js.map +1 -1
- package/dist/site/blocks/Footer.js +10 -12
- package/dist/site/blocks/Footer.js.map +1 -1
- package/dist/site/blocks/Hero.js +12 -14
- package/dist/site/blocks/Hero.js.map +1 -1
- package/dist/site/blocks/Navbar.js +13 -15
- package/dist/site/blocks/Navbar.js.map +1 -1
- package/dist/site/blocks/Section.js +9 -11
- package/dist/site/blocks/Section.js.map +1 -1
- package/dist/site/blocks/SectionHeader.js +9 -11
- package/dist/site/blocks/SectionHeader.js.map +1 -1
- package/dist/site/blocks/SiteRoot.js +9 -12
- package/dist/site/blocks/SiteRoot.js.map +1 -1
- package/dist/site/index.js +73 -73
- package/dist/styles/site/sections.css.d.ts +1 -1
- package/dist/utils/blockUtils.d.ts +2 -2
- package/dist/utils/blockUtils.d.ts.map +1 -1
- package/dist/utils/blockUtils.js.map +1 -1
- package/dist/utils/changeDetector.d.ts +3 -2
- 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/cn.js +2 -2
- package/dist/utils/dataURLUtils.d.ts +24 -0
- package/dist/utils/dataURLUtils.d.ts.map +1 -0
- package/dist/utils/dataURLUtils.js +47 -0
- package/dist/utils/dataURLUtils.js.map +1 -0
- package/dist/utils/documentHash.d.ts +2 -2
- package/dist/utils/documentHash.d.ts.map +1 -1
- package/dist/utils/documentHash.js +8 -7
- package/dist/utils/documentHash.js.map +1 -1
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +13 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/navbarSync.d.ts +3 -3
- package/dist/utils/navbarSync.d.ts.map +1 -1
- package/dist/utils/navbarSync.js +25 -24
- package/dist/utils/navbarSync.js.map +1 -1
- package/dist/utils/sharedTemplateToEngine.d.ts +7 -8
- 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 +32 -0
- package/dist/viewer/LandingPageViewer.d.ts.map +1 -0
- package/dist/viewer/LandingPageViewer.js +300 -0
- package/dist/viewer/LandingPageViewer.js.map +1 -0
- package/package.json +10 -5
- package/dist/components/ComponentPalette/definitions.d.ts +0 -3
- package/dist/components/ComponentPalette/definitions.d.ts.map +0 -1
- package/dist/components/ComponentPalette/definitions.js +0 -206
- package/dist/components/ComponentPalette/definitions.js.map +0 -1
- package/dist/components/ComponentPalette/index.d.ts +0 -7
- package/dist/components/ComponentPalette/index.d.ts.map +0 -1
- package/dist/components/ComponentPalette/index.js +0 -86
- package/dist/components/ComponentPalette/index.js.map +0 -1
- package/dist/components/LoadingSpinner.d.ts.map +0 -1
- package/dist/components/LoadingSpinner.js.map +0 -1
- package/dist/components/PreviewPanel/index.d.ts +0 -12
- package/dist/components/PreviewPanel/index.d.ts.map +0 -1
- package/dist/components/PreviewPanel/index.js +0 -140
- package/dist/components/PreviewPanel/index.js.map +0 -1
- package/dist/components/PropertyPanel/index.d.ts +0 -8
- package/dist/components/PropertyPanel/index.d.ts.map +0 -1
- package/dist/components/PropertyPanel/index.js +0 -223
- package/dist/components/PropertyPanel/index.js.map +0 -1
- package/dist/components/SiteEditor/index.d.ts +0 -3
- package/dist/components/SiteEditor/index.d.ts.map +0 -1
- package/dist/components/SiteEditor/index.js +0 -251
- package/dist/components/SiteEditor/index.js.map +0 -1
- package/dist/components/SiteViewer/index.d.ts +0 -3
- package/dist/components/SiteViewer/index.d.ts.map +0 -1
- package/dist/components/SiteViewer/index.js +0 -55
- package/dist/components/SiteViewer/index.js.map +0 -1
- package/dist/components/TemplateSelector/index.d.ts +0 -7
- package/dist/components/TemplateSelector/index.d.ts.map +0 -1
- package/dist/components/TemplateSelector/index.js +0 -109
- package/dist/components/TemplateSelector/index.js.map +0 -1
- package/dist/components/Toolbar/index.d.ts +0 -15
- package/dist/components/Toolbar/index.d.ts.map +0 -1
- package/dist/components/Toolbar/index.js +0 -113
- package/dist/components/Toolbar/index.js.map +0 -1
- package/dist/components/editors/PaletteSelector.d.ts +0 -14
- package/dist/components/editors/PaletteSelector.d.ts.map +0 -1
- package/dist/components/editors/PaletteSelector.js +0 -175
- package/dist/components/editors/PaletteSelector.js.map +0 -1
- package/dist/components/effects/SectionGlow.d.ts +0 -12
- package/dist/components/effects/SectionGlow.d.ts.map +0 -1
- package/dist/components/effects/SectionGlow.js +0 -139
- package/dist/components/effects/SectionGlow.js.map +0 -1
- package/dist/components/inputs/CheckboxInput.d.ts +0 -3
- package/dist/components/inputs/CheckboxInput.d.ts.map +0 -1
- package/dist/components/inputs/CheckboxInput.js +0 -46
- package/dist/components/inputs/CheckboxInput.js.map +0 -1
- package/dist/components/inputs/ColorInput.d.ts +0 -7
- package/dist/components/inputs/ColorInput.d.ts.map +0 -1
- package/dist/components/inputs/ColorInput.js +0 -180
- package/dist/components/inputs/ColorInput.js.map +0 -1
- package/dist/components/inputs/GradientInput.d.ts +0 -7
- package/dist/components/inputs/GradientInput.d.ts.map +0 -1
- package/dist/components/inputs/GradientInput.js +0 -78
- package/dist/components/inputs/GradientInput.js.map +0 -1
- package/dist/components/inputs/ImageInput.d.ts.map +0 -1
- package/dist/components/inputs/ImageInput.js.map +0 -1
- package/dist/components/inputs/SelectInput.d.ts +0 -7
- package/dist/components/inputs/SelectInput.d.ts.map +0 -1
- package/dist/components/inputs/SelectInput.js +0 -97
- package/dist/components/inputs/SelectInput.js.map +0 -1
- package/dist/components/inputs/SliderInput.d.ts +0 -8
- package/dist/components/inputs/SliderInput.d.ts.map +0 -1
- package/dist/components/inputs/SliderInput.js +0 -77
- package/dist/components/inputs/SliderInput.js.map +0 -1
- package/dist/components/inputs/index.d.ts +0 -11
- package/dist/components/inputs/index.d.ts.map +0 -1
- package/dist/components/inputs/types.d.ts +0 -48
- package/dist/components/inputs/types.d.ts.map +0 -1
- package/dist/components/inputs/types.js +0 -9
- package/dist/components/inputs/types.js.map +0 -1
- package/dist/components/renderers/ComponentRenderer.d.ts +0 -8
- package/dist/components/renderers/ComponentRenderer.d.ts.map +0 -1
- package/dist/components/renderers/ComponentRenderer.js +0 -13
- package/dist/components/renderers/ComponentRenderer.js.map +0 -1
- package/dist/components/renderers/HeroRenderer.d.ts +0 -3
- package/dist/components/renderers/HeroRenderer.d.ts.map +0 -1
- package/dist/components/renderers/HeroRenderer.js +0 -10
- package/dist/components/renderers/HeroRenderer.js.map +0 -1
- package/dist/components/renderers/hero/HeroBanner.d.ts +0 -3
- package/dist/components/renderers/hero/HeroBanner.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroBanner.js +0 -122
- package/dist/components/renderers/hero/HeroBanner.js.map +0 -1
- package/dist/components/renderers/hero/HeroCinematic.d.ts +0 -3
- package/dist/components/renderers/hero/HeroCinematic.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroCinematic.js +0 -141
- package/dist/components/renderers/hero/HeroCinematic.js.map +0 -1
- package/dist/components/renderers/hero/HeroClassic.d.ts +0 -3
- package/dist/components/renderers/hero/HeroClassic.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroClassic.js +0 -241
- package/dist/components/renderers/hero/HeroClassic.js.map +0 -1
- package/dist/components/renderers/hero/HeroCollage.d.ts +0 -3
- package/dist/components/renderers/hero/HeroCollage.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroCollage.js +0 -131
- package/dist/components/renderers/hero/HeroCollage.js.map +0 -1
- package/dist/components/renderers/hero/HeroColumns.d.ts +0 -3
- package/dist/components/renderers/hero/HeroColumns.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroColumns.js +0 -114
- package/dist/components/renderers/hero/HeroColumns.js.map +0 -1
- package/dist/components/renderers/hero/HeroGlass.d.ts +0 -3
- package/dist/components/renderers/hero/HeroGlass.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroGlass.js +0 -119
- package/dist/components/renderers/hero/HeroGlass.js.map +0 -1
- package/dist/components/renderers/hero/HeroNeon.d.ts +0 -3
- package/dist/components/renderers/hero/HeroNeon.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroNeon.js +0 -136
- package/dist/components/renderers/hero/HeroNeon.js.map +0 -1
- package/dist/components/renderers/hero/HeroParallax.d.ts +0 -3
- package/dist/components/renderers/hero/HeroParallax.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroParallax.js +0 -99
- package/dist/components/renderers/hero/HeroParallax.js.map +0 -1
- package/dist/components/renderers/hero/HeroSplit.d.ts +0 -3
- package/dist/components/renderers/hero/HeroSplit.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroSplit.js +0 -142
- package/dist/components/renderers/hero/HeroSplit.js.map +0 -1
- package/dist/components/renderers/hero/HeroSpotlight.d.ts +0 -3
- package/dist/components/renderers/hero/HeroSpotlight.d.ts.map +0 -1
- package/dist/components/renderers/hero/HeroSpotlight.js +0 -213
- package/dist/components/renderers/hero/HeroSpotlight.js.map +0 -1
- package/dist/components/renderers/hero/index.d.ts +0 -14
- package/dist/components/renderers/hero/index.d.ts.map +0 -1
- package/dist/components/renderers/index.d.ts +0 -8
- package/dist/components/renderers/index.d.ts.map +0 -1
- package/dist/components/renderers/index.js +0 -89
- package/dist/components/renderers/index.js.map +0 -1
- package/dist/components/renderers/types.d.ts +0 -11
- package/dist/components/renderers/types.d.ts.map +0 -1
- package/dist/editor/LandingPageEditorV2.d.ts +0 -19
- package/dist/editor/LandingPageEditorV2.d.ts.map +0 -1
- package/dist/editor/LandingPageEditorV2.js +0 -311
- package/dist/editor/LandingPageEditorV2.js.map +0 -1
- package/dist/editor/PropertyEditor/PropertyGroup.js +0 -23
- package/dist/editor/PropertyEditor/PropertyGroup.js.map +0 -1
- package/dist/engine/preview/PreviewV2.d.ts +0 -15
- package/dist/engine/preview/PreviewV2.d.ts.map +0 -1
- package/dist/engine/preview/PreviewV2.js +0 -242
- package/dist/engine/preview/PreviewV2.js.map +0 -1
- package/dist/modules/registry.d.ts +0 -31
- package/dist/modules/registry.d.ts.map +0 -1
- package/dist/modules/registry.js +0 -67
- package/dist/modules/registry.js.map +0 -1
- package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -57
- package/dist/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
- package/dist/node_modules/@dnd-kit/core/dist/core.esm.js +0 -2345
- package/dist/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
- package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -440
- package/dist/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
- package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -236
- package/dist/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
- package/dist/node_modules/clsx/dist/clsx.js +0 -17
- package/dist/node_modules/clsx/dist/clsx.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/Icon.js +0 -35
- package/dist/node_modules/lucide-react/dist/esm/Icon.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js +0 -18
- package/dist/node_modules/lucide-react/dist/esm/createLucideIcon.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js +0 -15
- package/dist/node_modules/lucide-react/dist/esm/defaultAttributes.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-right.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/arrow-right.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/briefcase.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/check.js +0 -6
- package/dist/node_modules/lucide-react/dist/esm/icons/check.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js +0 -8
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-down.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js +0 -8
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-right.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js +0 -6
- package/dist/node_modules/lucide-react/dist/esm/icons/chevron-up.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js +0 -15
- package/dist/node_modules/lucide-react/dist/esm/icons/eye.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js +0 -12
- package/dist/node_modules/lucide-react/dist/esm/icons/file-text.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/globe.js +0 -10
- package/dist/node_modules/lucide-react/dist/esm/icons/globe.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/grid-3x3.js +0 -12
- package/dist/node_modules/lucide-react/dist/esm/icons/grid-3x3.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.js +0 -13
- package/dist/node_modules/lucide-react/dist/esm/icons/grip-vertical.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/heading.js +0 -10
- package/dist/node_modules/lucide-react/dist/esm/icons/heading.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/image.js +0 -10
- package/dist/node_modules/lucide-react/dist/esm/icons/image.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/images.js +0 -11
- package/dist/node_modules/lucide-react/dist/esm/icons/images.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/list.js +0 -13
- package/dist/node_modules/lucide-react/dist/esm/icons/list.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js +0 -8
- package/dist/node_modules/lucide-react/dist/esm/icons/loader-circle.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/minus.js +0 -6
- package/dist/node_modules/lucide-react/dist/esm/icons/minus.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js +0 -18
- package/dist/node_modules/lucide-react/dist/esm/icons/mouse-pointer-click.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/navigation.js +0 -8
- package/dist/node_modules/lucide-react/dist/esm/icons/navigation.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js +0 -10
- package/dist/node_modules/lucide-react/dist/esm/icons/panels-top-left.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/phone.js +0 -14
- package/dist/node_modules/lucide-react/dist/esm/icons/phone.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/redo-2.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/redo-2.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/redo.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/redo.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/rotate-ccw.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/save.js +0 -16
- package/dist/node_modules/lucide-react/dist/esm/icons/save.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/square.js +0 -8
- package/dist/node_modules/lucide-react/dist/esm/icons/square.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/star.js +0 -14
- package/dist/node_modules/lucide-react/dist/esm/icons/star.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/trash-2.js +0 -12
- package/dist/node_modules/lucide-react/dist/esm/icons/trash-2.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/type.js +0 -10
- package/dist/node_modules/lucide-react/dist/esm/icons/type.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/undo-2.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/undo-2.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/undo.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/undo.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/user.js +0 -9
- package/dist/node_modules/lucide-react/dist/esm/icons/user.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js +0 -6
- package/dist/node_modules/lucide-react/dist/esm/shared/src/utils.js.map +0 -1
- package/dist/node_modules/react-colorful/dist/index.js +0 -167
- package/dist/node_modules/react-colorful/dist/index.js.map +0 -1
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +0 -2266
- package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +0 -1
- package/dist/types/index.d.ts +0 -99
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/module.d.ts +0 -25
- package/dist/types/module.d.ts.map +0 -1
- package/dist/utils/htmlExporter.d.ts +0 -6
- package/dist/utils/htmlExporter.d.ts.map +0 -1
- package/dist/utils/htmlExporter.js +0 -92
- package/dist/utils/htmlExporter.js.map +0 -1
- package/dist/utils/themeApplier.d.ts +0 -11
- package/dist/utils/themeApplier.d.ts.map +0 -1
- package/dist/utils/themeApplier.js +0 -29
- package/dist/utils/themeApplier.js.map +0 -1
- package/dist/utils/useDebounce.d.ts +0 -12
- package/dist/utils/useDebounce.d.ts.map +0 -1
- package/dist/viewer/LandingPageViewerV2.d.ts +0 -25
- package/dist/viewer/LandingPageViewerV2.d.ts.map +0 -1
- package/dist/viewer/LandingPageViewerV2.js +0 -253
- package/dist/viewer/LandingPageViewerV2.js.map +0 -1
- /package/dist/{components → editor/PropertyEditor}/inputs/ImageInput.d.ts +0 -0
- /package/dist/{components → editor/components}/LoadingSpinner.d.ts +0 -0
- /package/dist/{components → editor/components}/LoadingSpinner.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siteDocument.js","sources":["../../../src/engine/schema/siteDocument.ts"],"sourcesContent":["/**\n * Site Document V2 Schema\n * Documento componível baseado em blocos (Lovable-like)\n */\n\nimport { ThemeTokens } from \"./themeTokens\";\nimport type { ImageGridItem, ImageGridPreset } from \"../shared/imageGrid\";\nimport type { TypographyConfig } from \"../shared/typography\";\n\n// Re-export shared types for convenience\nexport type { ImageGridItem, ImageGridPreset } from \"../shared/imageGrid\";\nexport type { TypographyConfig } from \"../shared/typography\";\n\n/**\n * Tipos de blocos disponíveis\n */\nexport type BlockType =\n // Layout primitives\n | \"container\"\n | \"stack\"\n | \"grid\"\n | \"box\"\n | \"spacer\"\n // Conteúdo básico\n | \"heading\"\n | \"text\"\n | \"image\"\n | \"button\"\n | \"link\"\n | \"divider\"\n // Conteúdo avançado\n | \"badge\"\n | \"icon\"\n | \"avatar\"\n | \"video\"\n | \"socialLinks\"\n // Composição básica\n | \"card\"\n | \"section\"\n // Seções compostas (Landing Page)\n | \"hero\"\n | \"feature\"\n | \"featureGrid\"\n | \"pricing\"\n | \"pricingCard\"\n | \"testimonial\"\n | \"testimonialGrid\"\n | \"faq\"\n | \"faqItem\"\n | \"cta\"\n | \"stats\"\n | \"statItem\"\n | \"logoCloud\"\n | \"navbar\"\n | \"footer\"\n // Novos blocos reutilizáveis\n | \"countdown\"\n | \"carousel\"\n | \"blogCard\"\n | \"blogCardGrid\"\n | \"teamCard\"\n | \"teamGrid\"\n | \"courseCardGrid\"\n | \"categoryCardGrid\"\n // Formulários\n | \"form\"\n | \"input\"\n | \"textarea\"\n | \"formSelect\";\n\n/**\n * Props base de um bloco\n */\nexport interface BlockBase {\n id: string;\n type: BlockType;\n}\n\n/**\n * Container - Define largura máxima e padding\n */\nexport interface ContainerBlock extends BlockBase {\n type: \"container\";\n props: {\n maxWidth?: string; // ex: '1200px', '100%'\n padding?: string; // ex: '1rem', '2rem'\n children?: Block[];\n };\n}\n\n/**\n * Stack - Layout flex (row/col) com gap\n */\nexport interface StackBlock extends BlockBase {\n type: \"stack\";\n props: {\n direction?: \"row\" | \"col\";\n gap?: string; // ex: '1rem', '2rem'\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n justify?: \"start\" | \"center\" | \"end\" | \"space-between\" | \"space-around\";\n wrap?: boolean;\n children?: Block[];\n };\n}\n\n/**\n * Grid - Layout em grid responsivo\n */\nexport interface GridBlock extends BlockBase {\n type: \"grid\";\n props: {\n cols?: number | { sm?: number; md?: number; lg?: number };\n gap?: string;\n children?: Block[];\n };\n}\n\n/**\n * Box - Container genérico com estilos\n */\nexport interface BoxBlock extends BlockBase {\n type: \"box\";\n props: {\n bg?: string;\n border?: string;\n radius?: string;\n shadow?: string;\n padding?: string;\n children?: Block[];\n };\n}\n\n/**\n * Heading - Título (H1-H6)\n */\nexport interface HeadingBlock extends BlockBase {\n type: \"heading\";\n props: {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n text: string;\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n };\n}\n\n/**\n * Text - Parágrafo de texto\n */\nexport interface TextBlock extends BlockBase {\n type: \"text\";\n props: {\n text: string;\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n };\n}\n\n/**\n * Image - Imagem\n */\nexport interface ImageBlock extends BlockBase {\n type: \"image\";\n props: {\n src: string;\n alt?: string;\n width?: string;\n height?: string;\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | \"scale-down\";\n };\n}\n\n/**\n * Button - Botão\n */\nexport interface ButtonBlock extends BlockBase {\n type: \"button\";\n props: {\n text: string;\n href?: string;\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n // Hover effects (principal)\n /** Efeito de hover no botão */\n hoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito (10-100) */\n hoverIntensity?: number;\n // Hover overlay (adicional - combina com o principal)\n /** Efeito visual adicional no hover */\n hoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n hoverIconName?: string;\n };\n}\n\n/**\n * Link - Link\n */\nexport interface LinkBlock extends BlockBase {\n type: \"link\";\n props: {\n text: string;\n href: string;\n target?: \"_blank\" | \"_self\";\n // Hover effects\n /** Efeito de hover no link */\n hoverEffect?: \"none\" | \"background\" | \"underline\" | \"underline-center\" | \"scale\" | \"glow\";\n /** Intensidade do efeito (10-100) */\n hoverIntensity?: number;\n /** Cor do hover */\n hoverColor?: string;\n };\n}\n\n/**\n * Divider - Divisor horizontal\n */\nexport interface DividerBlock extends BlockBase {\n type: \"divider\";\n props: {\n color?: string;\n thickness?: string;\n };\n}\n\n/**\n * Card - Card com slots (header/content/footer)\n */\nexport interface CardBlock extends BlockBase {\n type: \"card\";\n props: {\n header?: Block[];\n content?: Block[];\n footer?: Block[];\n padding?: string;\n bg?: string;\n border?: string;\n radius?: string;\n shadow?: string;\n };\n}\n\n/**\n * Section - Seção container\n */\nexport interface SectionBlock extends BlockBase {\n type: \"section\";\n props: {\n id?: string;\n bg?: string;\n padding?: string;\n children?: Block[];\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - LAYOUT AVANÇADO\n// ============================================================================\n\n/**\n * Spacer - Espaçador flexível\n */\nexport interface SpacerBlock extends BlockBase {\n type: \"spacer\";\n props: {\n height?: string;\n responsive?: { sm?: string; md?: string; lg?: string };\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - CONTEÚDO AVANÇADO\n// ============================================================================\n\n/**\n * Badge - Tag/badge com variantes\n */\nexport interface BadgeBlock extends BlockBase {\n type: \"badge\";\n props: {\n text: string;\n variant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"info\";\n size?: \"sm\" | \"md\" | \"lg\";\n };\n}\n\n/**\n * Icon - Ícone SVG\n */\nexport interface IconBlock extends BlockBase {\n type: \"icon\";\n props: {\n name: string; // nome do ícone (ex: 'check', 'star', 'arrow-right')\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n color?: string;\n };\n}\n\n/**\n * Avatar - Imagem circular com fallback\n */\nexport interface AvatarBlock extends BlockBase {\n type: \"avatar\";\n props: {\n src?: string;\n alt?: string;\n name?: string; // Para gerar iniciais se não houver imagem\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n };\n}\n\n/**\n * Video - Embed de vídeo\n */\nexport interface VideoBlock extends BlockBase {\n type: \"video\";\n props: {\n src: string; // URL do YouTube, Vimeo ou MP4\n poster?: string;\n autoplay?: boolean;\n controls?: boolean;\n aspectRatio?: \"16:9\" | \"4:3\" | \"1:1\" | \"9:16\";\n };\n}\n\n/**\n * SocialLinks - Links de redes sociais\n */\nexport interface SocialLinksBlock extends BlockBase {\n type: \"socialLinks\";\n props: {\n links: Array<{\n platform:\n | \"facebook\"\n | \"twitter\"\n | \"instagram\"\n | \"linkedin\"\n | \"youtube\"\n | \"tiktok\"\n | \"github\"\n | \"whatsapp\";\n url: string;\n }>;\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"default\" | \"filled\" | \"outline\";\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - SEÇÕES COMPOSTAS\n// ============================================================================\n\n/**\n * Hero - Seção hero completa\n */\nexport type HeroVariationId =\n | \"hero-split\"\n | \"hero-parallax\"\n | \"hero-overlay\"\n | \"hero-gradient\"\n | \"hero-minimal\"\n | \"hero-card\";\n\nexport interface HeroBlock extends BlockBase {\n type: \"hero\";\n props: {\n variation?: HeroVariationId;\n variant?: \"centered\" | \"split\" | \"image-bg\" | \"video-bg\";\n title: string;\n subtitle?: string;\n description?: string;\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n image?: string;\n video?: string;\n badge?: string;\n align?: \"left\" | \"center\" | \"right\";\n /** Posição horizontal do container de conteúdo no layout */\n contentPosition?: \"left\" | \"center\" | \"right\";\n /** Espaçamento entre elementos do conteúdo (título, subtítulo, descrição, botões) */\n contentSpacing?: \"compact\" | \"default\" | \"spacious\";\n /** Distância entre o bloco de conteúdo e o bloco de imagem (layouts divididos) */\n blockGap?: \"default\" | \"wide\" | \"x-wide\";\n minHeight?: string;\n overlay?: boolean;\n /** Cor/gradiente do overlay (ex.: linear-gradient). Se omitido, usa fallback do CSS. */\n overlayColor?: string;\n /** Cor ou gradiente no layout split (lado do conteúdo). */\n background?: string;\n\n // === Typography Colors (legacy - mantido para retrocompatibilidade) ===\n /** Cor do título */\n titleColor?: string;\n /** Cor do subtítulo */\n subtitleColor?: string;\n /** Cor da descrição */\n descriptionColor?: string;\n\n // === Typography Config (novo sistema completo) ===\n /** Configuração completa de tipografia do título */\n titleTypography?: TypographyConfig;\n /** Configuração completa de tipografia do subtítulo */\n subtitleTypography?: TypographyConfig;\n /** Configuração completa de tipografia da descrição */\n descriptionTypography?: TypographyConfig;\n\n // === Badge Styling ===\n /** Cor de fundo do badge */\n badgeColor?: string;\n /** Cor do texto do badge */\n badgeTextColor?: string;\n\n // === Layout & Spacing ===\n /** Largura máxima do conteúdo */\n contentMaxWidth?: string;\n /** Espaçamento interno vertical */\n paddingY?: string;\n\n // === Image Styling ===\n /** Border radius da imagem (px) */\n imageRadius?: number;\n /** Sombra da imagem */\n imageShadow?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Posição da imagem no split */\n imagePosition?: \"left\" | \"right\";\n\n // === Button Size ===\n /** Tamanho dos botões */\n buttonSize?: \"sm\" | \"md\" | \"lg\";\n\n // === Primary Button Styling ===\n /** Variante do botão primário */\n primaryButtonVariant?: \"solid\" | \"outline\" | \"ghost\";\n /** Cor do botão primário */\n primaryButtonColor?: string;\n /** Cor do texto do botão primário */\n primaryButtonTextColor?: string;\n /** Border radius do botão primário */\n primaryButtonRadius?: number;\n\n // === Secondary Button Styling ===\n /** Variante do botão secundário */\n secondaryButtonVariant?: \"solid\" | \"outline\" | \"ghost\";\n /** Cor do botão secundário */\n secondaryButtonColor?: string;\n /** Cor do texto do botão secundário */\n secondaryButtonTextColor?: string;\n /** Border radius do botão secundário */\n secondaryButtonRadius?: number;\n\n // === Button Hover Effects (principal) ===\n /** Efeito de hover nos botões */\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito (10-100) */\n buttonHoverIntensity?: number;\n\n // === Button Hover Overlay (adicional) ===\n /** Efeito visual adicional nos botões */\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n buttonHoverIconName?: string;\n\n // === Decorative Elements ===\n /** Mostrar elemento decorativo de onda no fundo */\n showWave?: boolean;\n /** Cor da onda decorativa */\n waveColor?: string;\n\n // === Image Grid System ===\n /** Habilita grid de imagens no lugar da imagem única (split layout) */\n imageGridEnabled?: boolean;\n /** Preset de layout da grid */\n imageGridPreset?: ImageGridPreset;\n /** Array de imagens da grid (até 4) */\n imageGridImages?: ImageGridItem[];\n /** Espaçamento entre imagens em pixels */\n imageGridGap?: number;\n };\n}\n\n/**\n * Feature - Card de feature individual\n */\nexport interface FeatureBlock extends BlockBase {\n type: \"feature\";\n props: {\n icon?: string;\n title: string;\n description: string;\n link?: { text: string; href: string };\n };\n}\n\n/**\n * FeatureGrid - Grid de features\n */\nexport interface FeatureGridBlock extends BlockBase {\n type: \"featureGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n variant?: \"default\" | \"cards\" | \"image-cards\";\n features: Array<{\n icon?: string;\n title: string;\n description: string;\n image?: string;\n link?: { text: string; href?: string };\n }>;\n };\n}\n\n/**\n * PricingCard - Card de preço individual\n */\nexport interface PricingCardBlock extends BlockBase {\n type: \"pricingCard\";\n props: {\n name: string;\n price: string;\n period?: string;\n description?: string;\n features: string[];\n buttonText?: string;\n buttonHref?: string;\n highlighted?: boolean;\n badge?: string;\n };\n}\n\n/**\n * Pricing - Seção de preços completa\n */\nexport interface PricingBlock extends BlockBase {\n type: \"pricing\";\n props: {\n title?: string;\n subtitle?: string;\n plans: Array<{\n name: string;\n price: string;\n period?: string;\n description?: string;\n features: string[];\n buttonText?: string;\n buttonHref?: string;\n highlighted?: boolean;\n badge?: string;\n }>;\n };\n}\n\n/**\n * Testimonial - Card de depoimento individual\n */\nexport interface TestimonialBlock extends BlockBase {\n type: \"testimonial\";\n props: {\n quote: string;\n authorName: string;\n authorRole?: string;\n authorCompany?: string;\n authorAvatar?: string;\n rating?: number; // 1-5 estrelas\n };\n}\n\n/**\n * TestimonialGrid - Grid de depoimentos\n */\nexport interface TestimonialGridBlock extends BlockBase {\n type: \"testimonialGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n testimonials: Array<{\n quote: string;\n authorName: string;\n authorRole?: string;\n authorCompany?: string;\n authorAvatar?: string;\n rating?: number;\n }>;\n };\n}\n\n/**\n * FaqItem - Item individual do FAQ\n */\nexport interface FaqItemBlock extends BlockBase {\n type: \"faqItem\";\n props: {\n question: string;\n answer: string;\n defaultOpen?: boolean;\n };\n}\n\n/**\n * Faq - Seção FAQ completa (accordion)\n */\nexport interface FaqBlock extends BlockBase {\n type: \"faq\";\n props: {\n title?: string;\n subtitle?: string;\n items: Array<{\n question: string;\n answer: string;\n }>;\n };\n}\n\n/**\n * CTA - Seção Call-to-Action\n */\nexport interface CtaBlock extends BlockBase {\n type: \"cta\";\n props: {\n title: string;\n description?: string;\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n variant?: \"default\" | \"centered\" | \"split\" | \"gradient\";\n bg?: string;\n // Button Size\n /** Tamanho dos botões */\n buttonSize?: \"sm\" | \"md\" | \"lg\";\n // Button Hover Effects (principal)\n /** Efeito de hover nos botões */\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito (10-100) */\n buttonHoverIntensity?: number;\n // Button Hover Overlay (adicional)\n /** Efeito visual adicional nos botões */\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * StatItem - Item individual de estatística\n */\nexport interface StatItemBlock extends BlockBase {\n type: \"statItem\";\n props: {\n value: string;\n label: string;\n prefix?: string;\n suffix?: string;\n };\n}\n\n/**\n * Stats - Seção de estatísticas\n */\nexport interface StatsBlock extends BlockBase {\n type: \"stats\";\n props: {\n title?: string;\n subtitle?: string;\n items: Array<{\n value: string;\n label: string;\n prefix?: string;\n suffix?: string;\n }>;\n };\n}\n\n/**\n * LogoCloud - Grid de logos\n */\nexport interface LogoCloudBlock extends BlockBase {\n type: \"logoCloud\";\n props: {\n title?: string;\n logos: Array<{\n src: string;\n alt: string;\n href?: string;\n }>;\n grayscale?: boolean;\n };\n}\n\n/**\n * Link da Navbar - pode ser um link simples ou ter um dropdown com subitems\n */\nexport type NavbarLink = {\n text: string;\n href?: string;\n dropdown?: Array<{ text: string; href: string }>;\n};\n\n/**\n * IDs das variações visuais do bloco Navbar\n */\nexport type NavbarVariationId =\n | \"navbar-simples\"\n | \"navbar-moderno\"\n | \"navbar-glass\"\n | \"navbar-elegante\"\n | \"navbar-pill\";\n\n/**\n * Navbar - Barra de navegação\n */\nexport interface NavbarBlock extends BlockBase {\n type: \"navbar\";\n props: {\n variation?: NavbarVariationId;\n /** URL da imagem do logo ou objeto com src, alt e href */\n logo?: string | { src: string; alt?: string; href?: string };\n logoText?: string;\n links: Array<NavbarLink>;\n ctaButton?: { text: string; href?: string };\n sticky?: boolean;\n /** Cor de fundo customizada (suporta gradientes) */\n bg?: string;\n\n // Layout Options\n /** Distribuição do navbar: expandido, centralizado ou compacto */\n layout?: \"expanded\" | \"centered\" | \"compact\";\n /** Modo flutuante: navbar com margem lateral e mais destaque */\n floating?: boolean;\n\n // Visual Customization\n /** Border radius em pixels (0-24) */\n borderRadius?: number;\n /** Sombra do navbar */\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Opacidade do navbar (0-100) */\n opacity?: number;\n /** Intensidade do desfoque/blur (0-100) para efeito de vidro fosco */\n blurOpacity?: number;\n /** Altura do logo em pixels (30-120) */\n logoHeight?: number;\n /** Posição da borda: nenhuma, completa, superior, inferior, esquerda, direita */\n borderPosition?: \"none\" | \"all\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Espessura da borda em pixels (1-4) */\n borderWidth?: number;\n /** Cor da borda */\n borderColor?: string;\n\n // Link Styling\n /** Cor dos links */\n linkColor?: string;\n /** Cor dos links no hover */\n linkHoverColor?: string;\n /** Tamanho da fonte dos links */\n linkFontSize?: \"sm\" | \"md\" | \"lg\";\n /** Efeito de hover nos links */\n linkHoverEffect?: \"background\" | \"underline\" | \"underline-center\" | \"slide-bg\" | \"scale\" | \"glow\";\n /** Intensidade do efeito de hover nos links (0-100) */\n linkHoverIntensity?: number;\n\n // Button/CTA Styling\n /** Variante do botão CTA */\n buttonVariant?: \"solid\" | \"outline\" | \"ghost\";\n /** Tamanho do botão CTA */\n buttonSize?: \"sm\" | \"md\" | \"lg\";\n /** Cor do botão CTA */\n buttonColor?: string;\n /** Cor do texto do botão CTA */\n buttonTextColor?: string;\n /** Border radius do botão em pixels (0-24) */\n buttonBorderRadius?: number;\n /** Efeito de hover no botão CTA */\n buttonHoverEffect?: \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito de hover no botão (0-100) */\n buttonHoverIntensity?: number;\n /** Efeito visual adicional no botão CTA */\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * Footer - Rodapé do site\n */\nexport interface FooterBlock extends BlockBase {\n type: \"footer\";\n props: {\n logo?: string | { src: string; alt?: string };\n logoText?: string;\n description?: string;\n columns?: Array<{\n title: string;\n links: Array<{\n text: string;\n href: string;\n }>;\n }>;\n social?: Array<{\n platform: string;\n href: string;\n }>;\n copyright?: string;\n variant?: \"simple\" | \"multi-column\";\n // Link Hover Effects\n /** Efeito de hover nos links */\n linkHoverEffect?: \"none\" | \"background\" | \"underline\" | \"underline-center\" | \"scale\" | \"glow\";\n /** Intensidade do efeito (10-100) */\n linkHoverIntensity?: number;\n /** Cor do link no hover */\n linkHoverColor?: string;\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS REUTILIZÁVEIS\n// ============================================================================\n\n/**\n * Countdown - Contador regressivo (eventos, matrículas, promoções)\n */\nexport interface CountdownBlock extends BlockBase {\n type: \"countdown\";\n props: {\n title?: string;\n description?: string;\n /** Data final em ISO string para cálculo real */\n endDate?: string;\n /** Exibir labels Days/Hours/Minutes/Seconds com valores 00 quando sem endDate */\n showPlaceholders?: boolean;\n buttonText?: string;\n buttonHref?: string;\n variant?: \"default\" | \"banner\";\n /** Texto no círculo decorativo (ex.: \"Admission on Going\") */\n badgeText?: string;\n bg?: string;\n };\n}\n\n/**\n * Carousel - Slider de slides (programas, destaques, depoimentos)\n */\nexport interface CarouselBlock extends BlockBase {\n type: \"carousel\";\n props: {\n slides: Array<{\n image?: string;\n title?: string;\n description?: string;\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n }>;\n autoplay?: boolean;\n showArrows?: boolean;\n showDots?: boolean;\n };\n}\n\n/**\n * BlogCard - Card de post/notícia individual\n */\nexport interface BlogCardBlock extends BlockBase {\n type: \"blogCard\";\n props: {\n image?: string;\n date?: string;\n category?: string;\n title: string;\n excerpt?: string;\n linkText?: string;\n linkHref?: string;\n };\n}\n\n/**\n * BlogCardGrid - Grid de cards de blog/notícias\n */\nexport interface BlogCardGridBlock extends BlockBase {\n type: \"blogCardGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n cards: Array<{\n image?: string;\n date?: string;\n category?: string;\n title: string;\n excerpt?: string;\n linkText?: string;\n linkHref?: string;\n }>;\n };\n}\n\n/**\n * TeamCard - Card de membro da equipe/professor\n */\nexport interface TeamCardBlock extends BlockBase {\n type: \"teamCard\";\n props: {\n avatar?: string;\n name: string;\n role?: string;\n };\n}\n\n/**\n * TeamGrid - Grid de membros da equipe\n */\nexport interface TeamGridBlock extends BlockBase {\n type: \"teamGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n members: Array<{\n avatar?: string;\n name: string;\n role?: string;\n }>;\n };\n}\n\n/**\n * CourseCardGrid - Grid de cards de curso (thumbnail, título, preço, rating, View Course)\n */\nexport interface CourseCardGridBlock extends BlockBase {\n type: \"courseCardGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n cards: Array<{\n image?: string;\n title: string;\n price?: string;\n period?: string;\n rating?: number;\n meta?: string[];\n buttonText?: string;\n buttonHref?: string;\n }>;\n };\n}\n\n/**\n * CategoryCardGrid - Grid de categorias (imagem de fundo + título overlay + link)\n */\nexport interface CategoryCardGridBlock extends BlockBase {\n type: \"categoryCardGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n categories: Array<{\n image: string;\n title: string;\n href?: string;\n }>;\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - FORMULÁRIOS\n// ============================================================================\n\n/**\n * Form - Container de formulário\n */\nexport interface FormBlock extends BlockBase {\n type: \"form\";\n props: {\n action?: string;\n method?: \"get\" | \"post\";\n children?: Block[];\n submitText?: string;\n };\n}\n\n/**\n * Input - Campo de entrada\n */\nexport interface InputBlock extends BlockBase {\n type: \"input\";\n props: {\n name: string;\n label?: string;\n placeholder?: string;\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"url\" | \"number\";\n required?: boolean;\n };\n}\n\n/**\n * Textarea - Campo de texto longo\n */\nexport interface TextareaBlock extends BlockBase {\n type: \"textarea\";\n props: {\n name: string;\n label?: string;\n placeholder?: string;\n rows?: number;\n required?: boolean;\n };\n}\n\n/**\n * FormSelect - Dropdown de formulário\n */\nexport interface FormSelectBlock extends BlockBase {\n type: \"formSelect\";\n props: {\n name: string;\n label?: string;\n placeholder?: string;\n options: Array<{ value: string; label: string }>;\n required?: boolean;\n };\n}\n\n// ============================================================================\n// UNION TYPE DE TODOS OS BLOCOS\n// ============================================================================\n\n/**\n * Union type de todos os blocos\n */\nexport type Block =\n // Layout\n | ContainerBlock\n | StackBlock\n | GridBlock\n | BoxBlock\n | SpacerBlock\n // Conteúdo básico\n | HeadingBlock\n | TextBlock\n | ImageBlock\n | ButtonBlock\n | LinkBlock\n | DividerBlock\n // Conteúdo avançado\n | BadgeBlock\n | IconBlock\n | AvatarBlock\n | VideoBlock\n | SocialLinksBlock\n // Composição básica\n | CardBlock\n | SectionBlock\n // Seções compostas\n | HeroBlock\n | FeatureBlock\n | FeatureGridBlock\n | PricingBlock\n | PricingCardBlock\n | TestimonialBlock\n | TestimonialGridBlock\n | FaqBlock\n | FaqItemBlock\n | CtaBlock\n | StatsBlock\n | StatItemBlock\n | LogoCloudBlock\n | NavbarBlock\n | FooterBlock\n // Novos blocos reutilizáveis\n | CountdownBlock\n | CarouselBlock\n | BlogCardBlock\n | BlogCardGridBlock\n | TeamCardBlock\n | TeamGridBlock\n | CourseCardGridBlock\n | CategoryCardGridBlock\n // Formulários\n | FormBlock\n | InputBlock\n | TextareaBlock\n | FormSelectBlock;\n\n/**\n * Página do site\n */\nexport interface SitePage {\n id: string;\n name: string;\n slug: string;\n structure: Block[]; // Árvore de blocos\n}\n\n/**\n * Coleções de conteúdo (testimonials, faq, posts, etc)\n */\nexport interface ContentCollection {\n id: string;\n type: \"testimonials\" | \"faq\" | \"posts\" | \"services\" | \"team\" | \"custom\";\n items: Array<Record<string, any>>;\n}\n\n/**\n * Documento completo do site V2\n */\nexport interface SiteDocumentV2 {\n schemaVersion: 2;\n theme: ThemeTokens;\n content?: {\n collections?: ContentCollection[];\n };\n pages: SitePage[];\n}\n\n/**\n * Helper para criar um documento V2 vazio\n */\nexport function createEmptySiteDocumentV2(\n _name: string = \"Novo Site\",\n): SiteDocumentV2 {\n return {\n schemaVersion: 2,\n theme: {\n colors: {\n bg: \"#ffffff\",\n surface: \"#f9fafb\",\n border: \"#e5e7eb\",\n text: \"#1f2937\",\n mutedText: \"#6b7280\",\n primary: \"#3b82f6\",\n primaryText: \"#ffffff\",\n secondary: \"#6b7280\",\n accent: \"#8b5cf6\",\n ring: \"#3b82f6\",\n },\n radiusScale: \"md\",\n shadowScale: \"soft\",\n spacingScale: \"normal\",\n motion: \"subtle\",\n backgroundStyle: \"flat\",\n typography: {\n fontFamily: {\n heading: \"system-ui, -apple-system, sans-serif\",\n body: \"system-ui, -apple-system, sans-serif\",\n },\n baseSize: \"16px\",\n headingScale: {\n h1: \"2.5rem\",\n h2: \"2rem\",\n h3: \"1.75rem\",\n h4: \"1.5rem\",\n h5: \"1.25rem\",\n h6: \"1rem\",\n },\n },\n },\n pages: [\n {\n id: \"home\",\n name: \"Home\",\n slug: \"home\",\n structure: [],\n },\n ],\n };\n}\n"],"names":["createEmptySiteDocumentV2","_name"],"mappings":"AAomCO,SAASA,EACdC,IAAgB,aACA;AAChB,SAAO;AAAA,IACL,eAAe;AAAA,IACf,OAAO;AAAA,MACL,QAAQ;AAAA,QACN,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA;AAAA,MAER,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,YAAY;AAAA,QACV,YAAY;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,QAAA;AAAA,QAER,UAAU;AAAA,QACV,cAAc;AAAA,UACZ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QAAA;AAAA,MACN;AAAA,IACF;AAAA,IAEF,OAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,CAAA;AAAA,MAAC;AAAA,IACd;AAAA,EACF;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"siteDocument.js","sources":["../../../src/engine/schema/siteDocument.ts"],"sourcesContent":["/**\n * Site Document Schema\n * Documento componível baseado em blocos\n */\n\nimport { ThemeTokens } from \"./themeTokens\";\nimport type { ImageGridItem, ImageGridPreset } from \"../shared/imageGrid\";\nimport type { TypographyConfig } from \"../shared/typography\";\nimport type { SitePluginsConfig, PageDataSource, PageEditRestrictions } from \"../plugins/types\";\n\n// Re-export shared types for convenience\nexport type { ImageGridItem, ImageGridPreset } from \"../shared/imageGrid\";\nexport type { TypographyConfig } from \"../shared/typography\";\n\n/**\n * Tipos de blocos disponíveis\n */\nexport type BlockType =\n // Layout primitives\n | \"container\"\n | \"stack\"\n | \"grid\"\n | \"box\"\n | \"spacer\"\n // Conteúdo básico\n | \"heading\"\n | \"text\"\n | \"image\"\n | \"button\"\n | \"link\"\n | \"divider\"\n // Conteúdo avançado\n | \"badge\"\n | \"icon\"\n | \"avatar\"\n | \"video\"\n | \"socialLinks\"\n // Composição básica\n | \"card\"\n | \"section\"\n // Seções compostas (Landing Page)\n | \"hero\"\n | \"feature\"\n | \"featureGrid\"\n | \"pricing\"\n | \"pricingCard\"\n | \"testimonial\"\n | \"testimonialGrid\"\n | \"faq\"\n | \"faqItem\"\n | \"cta\"\n | \"stats\"\n | \"statItem\"\n | \"logoCloud\"\n | \"navbar\"\n | \"footer\"\n // Novos blocos reutilizáveis\n | \"countdown\"\n | \"carousel\"\n | \"blogCard\"\n | \"blogCardGrid\"\n | \"teamCard\"\n | \"teamGrid\"\n | \"courseCardGrid\"\n | \"categoryCardGrid\"\n // Blog plugin (dinâmico)\n | \"blogPostCard\"\n | \"blogPostGrid\"\n | \"blogPostDetail\"\n // Formulários\n | \"form\"\n | \"input\"\n | \"textarea\"\n | \"formSelect\";\n\n/**\n * Props base de um bloco\n */\nexport interface BlockBase {\n id: string;\n type: BlockType;\n}\n\n/**\n * Container - Define largura máxima e padding\n */\nexport interface ContainerBlock extends BlockBase {\n type: \"container\";\n props: {\n maxWidth?: string; // ex: '1200px', '100%'\n padding?: string; // ex: '1rem', '2rem'\n children?: Block[];\n };\n}\n\n/**\n * Stack - Layout flex (row/col) com gap\n */\nexport interface StackBlock extends BlockBase {\n type: \"stack\";\n props: {\n direction?: \"row\" | \"col\";\n gap?: string; // ex: '1rem', '2rem'\n align?: \"start\" | \"center\" | \"end\" | \"stretch\";\n justify?: \"start\" | \"center\" | \"end\" | \"space-between\" | \"space-around\";\n wrap?: boolean;\n children?: Block[];\n };\n}\n\n/**\n * Grid - Layout em grid responsivo\n */\nexport interface GridBlock extends BlockBase {\n type: \"grid\";\n props: {\n cols?: number | { sm?: number; md?: number; lg?: number };\n gap?: string;\n children?: Block[];\n };\n}\n\n/**\n * Box - Container genérico com estilos\n */\nexport interface BoxBlock extends BlockBase {\n type: \"box\";\n props: {\n bg?: string;\n border?: string;\n radius?: string;\n shadow?: string;\n padding?: string;\n children?: Block[];\n };\n}\n\n/**\n * Heading - Título (H1-H6)\n */\nexport interface HeadingBlock extends BlockBase {\n type: \"heading\";\n props: {\n level: 1 | 2 | 3 | 4 | 5 | 6;\n text: string;\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n };\n}\n\n/**\n * Text - Parágrafo de texto\n */\nexport interface TextBlock extends BlockBase {\n type: \"text\";\n props: {\n text: string;\n align?: \"left\" | \"center\" | \"right\";\n color?: string;\n size?: \"sm\" | \"md\" | \"lg\";\n };\n}\n\n/**\n * Image - Imagem\n */\nexport interface ImageBlock extends BlockBase {\n type: \"image\";\n props: {\n src: string;\n alt?: string;\n width?: string;\n height?: string;\n objectFit?: \"contain\" | \"cover\" | \"fill\" | \"none\" | \"scale-down\";\n };\n}\n\n/**\n * Button - Botão\n */\nexport interface ButtonBlock extends BlockBase {\n type: \"button\";\n props: {\n text: string;\n href?: string;\n variant?: \"primary\" | \"secondary\" | \"outline\" | \"ghost\";\n size?: \"sm\" | \"md\" | \"lg\";\n // Hover effects (principal)\n /** Efeito de hover no botão */\n hoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito (10-100) */\n hoverIntensity?: number;\n // Hover overlay (adicional - combina com o principal)\n /** Efeito visual adicional no hover */\n hoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n hoverIconName?: string;\n };\n}\n\n/**\n * Link - Link\n */\nexport interface LinkBlock extends BlockBase {\n type: \"link\";\n props: {\n text: string;\n href: string;\n target?: \"_blank\" | \"_self\";\n // Hover effects\n /** Efeito de hover no link */\n hoverEffect?: \"none\" | \"background\" | \"underline\" | \"underline-center\" | \"scale\" | \"glow\";\n /** Intensidade do efeito (10-100) */\n hoverIntensity?: number;\n /** Cor do hover */\n hoverColor?: string;\n };\n}\n\n/**\n * Divider - Divisor horizontal\n */\nexport interface DividerBlock extends BlockBase {\n type: \"divider\";\n props: {\n color?: string;\n thickness?: string;\n };\n}\n\n/**\n * Card - Card com slots (header/content/footer)\n */\nexport interface CardBlock extends BlockBase {\n type: \"card\";\n props: {\n header?: Block[];\n content?: Block[];\n footer?: Block[];\n padding?: string;\n bg?: string;\n border?: string;\n radius?: string;\n shadow?: string;\n };\n}\n\n/**\n * Section - Seção container\n */\nexport interface SectionBlock extends BlockBase {\n type: \"section\";\n props: {\n id?: string;\n bg?: string;\n padding?: string;\n children?: Block[];\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - LAYOUT AVANÇADO\n// ============================================================================\n\n/**\n * Spacer - Espaçador flexível\n */\nexport interface SpacerBlock extends BlockBase {\n type: \"spacer\";\n props: {\n height?: string;\n responsive?: { sm?: string; md?: string; lg?: string };\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - CONTEÚDO AVANÇADO\n// ============================================================================\n\n/**\n * Badge - Tag/badge com variantes\n */\nexport interface BadgeBlock extends BlockBase {\n type: \"badge\";\n props: {\n text: string;\n variant?:\n | \"default\"\n | \"primary\"\n | \"secondary\"\n | \"success\"\n | \"warning\"\n | \"danger\"\n | \"info\";\n size?: \"sm\" | \"md\" | \"lg\";\n };\n}\n\n/**\n * Icon - Ícone SVG\n */\nexport interface IconBlock extends BlockBase {\n type: \"icon\";\n props: {\n name: string; // nome do ícone (ex: 'check', 'star', 'arrow-right')\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n color?: string;\n };\n}\n\n/**\n * Avatar - Imagem circular com fallback\n */\nexport interface AvatarBlock extends BlockBase {\n type: \"avatar\";\n props: {\n src?: string;\n alt?: string;\n name?: string; // Para gerar iniciais se não houver imagem\n size?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n };\n}\n\n/**\n * Video - Embed de vídeo\n */\nexport interface VideoBlock extends BlockBase {\n type: \"video\";\n props: {\n src: string; // URL do YouTube, Vimeo ou MP4\n poster?: string;\n autoplay?: boolean;\n controls?: boolean;\n aspectRatio?: \"16:9\" | \"4:3\" | \"1:1\" | \"9:16\";\n };\n}\n\n/**\n * SocialLinks - Links de redes sociais\n */\nexport interface SocialLinksBlock extends BlockBase {\n type: \"socialLinks\";\n props: {\n links: Array<{\n platform:\n | \"facebook\"\n | \"twitter\"\n | \"instagram\"\n | \"linkedin\"\n | \"youtube\"\n | \"tiktok\"\n | \"github\"\n | \"whatsapp\";\n url: string;\n }>;\n size?: \"sm\" | \"md\" | \"lg\";\n variant?: \"default\" | \"filled\" | \"outline\";\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - SEÇÕES COMPOSTAS\n// ============================================================================\n\n/**\n * Hero - Seção hero completa\n */\nexport type HeroVariationId =\n | \"hero-split\"\n | \"hero-parallax\"\n | \"hero-overlay\"\n | \"hero-gradient\"\n | \"hero-minimal\"\n | \"hero-card\"\n | \"hero-carousel\";\n\nexport interface HeroBlock extends BlockBase {\n type: \"hero\";\n props: {\n variation?: HeroVariationId;\n variant?: \"centered\" | \"split\" | \"image-bg\" | \"video-bg\";\n title: string;\n subtitle?: string;\n description?: string;\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n image?: string;\n video?: string;\n badge?: string;\n align?: \"left\" | \"center\" | \"right\";\n /** Posição horizontal do container de conteúdo no layout */\n contentPosition?: \"left\" | \"center\" | \"right\";\n /** Espaçamento entre elementos do conteúdo (título, subtítulo, descrição, botões) */\n contentSpacing?: \"compact\" | \"default\" | \"spacious\";\n /** Distância entre o bloco de conteúdo e o bloco de imagem (layouts divididos) */\n blockGap?: \"default\" | \"wide\" | \"x-wide\";\n minHeight?: string;\n overlay?: boolean;\n /** Cor/gradiente do overlay (ex.: linear-gradient). Se omitido, usa fallback do CSS. */\n overlayColor?: string;\n /** Cor ou gradiente no layout split (lado do conteúdo). */\n background?: string;\n\n // === Typography Colors (legacy - mantido para retrocompatibilidade) ===\n /** Cor do título */\n titleColor?: string;\n /** Cor do subtítulo */\n subtitleColor?: string;\n /** Cor da descrição */\n descriptionColor?: string;\n\n // === Typography Config (novo sistema completo) ===\n /** Configuração completa de tipografia do título */\n titleTypography?: TypographyConfig;\n /** Configuração completa de tipografia do subtítulo */\n subtitleTypography?: TypographyConfig;\n /** Configuração completa de tipografia da descrição */\n descriptionTypography?: TypographyConfig;\n\n // === Badge Styling ===\n /** Cor de fundo do badge */\n badgeColor?: string;\n /** Cor do texto do badge */\n badgeTextColor?: string;\n\n // === Layout & Spacing ===\n /** Largura máxima do conteúdo */\n contentMaxWidth?: string;\n /** Espaçamento interno vertical */\n paddingY?: string;\n\n // === Image Styling ===\n /** Border radius da imagem (px) */\n imageRadius?: number;\n /** Sombra da imagem */\n imageShadow?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Posição da imagem no split */\n imagePosition?: \"left\" | \"right\";\n\n // === Button Size ===\n /** Tamanho dos botões */\n buttonSize?: \"sm\" | \"md\" | \"lg\";\n\n // === Primary Button Styling ===\n /** Variante do botão primário */\n primaryButtonVariant?: \"solid\" | \"outline\" | \"ghost\";\n /** Cor do botão primário */\n primaryButtonColor?: string;\n /** Cor do texto do botão primário */\n primaryButtonTextColor?: string;\n /** Border radius do botão primário */\n primaryButtonRadius?: number;\n\n // === Secondary Button Styling ===\n /** Variante do botão secundário */\n secondaryButtonVariant?: \"solid\" | \"outline\" | \"ghost\";\n /** Cor do botão secundário */\n secondaryButtonColor?: string;\n /** Cor do texto do botão secundário */\n secondaryButtonTextColor?: string;\n /** Border radius do botão secundário */\n secondaryButtonRadius?: number;\n\n // === Button Hover Effects (principal) ===\n /** Efeito de hover nos botões */\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito (10-100) */\n buttonHoverIntensity?: number;\n\n // === Button Hover Overlay (adicional) ===\n /** Efeito visual adicional nos botões */\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n buttonHoverIconName?: string;\n\n // === Decorative Elements ===\n /** Mostrar elemento decorativo de onda no fundo */\n showWave?: boolean;\n /** Cor da onda decorativa */\n waveColor?: string;\n\n // === Image Grid System ===\n /** Habilita grid de imagens no lugar da imagem única (split layout) */\n imageGridEnabled?: boolean;\n /** Preset de layout da grid */\n imageGridPreset?: ImageGridPreset;\n /** Array de imagens da grid (até 4) */\n imageGridImages?: ImageGridItem[];\n /** Espaçamento entre imagens em pixels */\n imageGridGap?: number;\n\n // === Carousel System ===\n /** Array de imagens do carrossel de fundo */\n carouselImages?: string[];\n /** Intervalo entre slides em segundos */\n carouselInterval?: number;\n /** Tipo de transição do carrossel */\n carouselTransition?: \"crossfade\" | \"slide\";\n };\n}\n\n/**\n * Feature - Card de feature individual\n */\nexport interface FeatureBlock extends BlockBase {\n type: \"feature\";\n props: {\n icon?: string;\n title: string;\n description: string;\n link?: { text: string; href: string };\n };\n}\n\n/**\n * FeatureGrid - Grid de features\n */\nexport interface FeatureGridBlock extends BlockBase {\n type: \"featureGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n variant?: \"default\" | \"cards\" | \"image-cards\";\n features: Array<{\n icon?: string;\n title: string;\n description: string;\n image?: string;\n link?: { text: string; href?: string };\n }>;\n };\n}\n\n/**\n * PricingCard - Card de preço individual\n */\nexport interface PricingCardBlock extends BlockBase {\n type: \"pricingCard\";\n props: {\n name: string;\n price: string;\n period?: string;\n description?: string;\n features: string[];\n buttonText?: string;\n buttonHref?: string;\n highlighted?: boolean;\n badge?: string;\n };\n}\n\n/**\n * Pricing - Seção de preços completa\n */\nexport interface PricingBlock extends BlockBase {\n type: \"pricing\";\n props: {\n title?: string;\n subtitle?: string;\n plans: Array<{\n name: string;\n price: string;\n period?: string;\n description?: string;\n features: string[];\n buttonText?: string;\n buttonHref?: string;\n highlighted?: boolean;\n badge?: string;\n }>;\n };\n}\n\n/**\n * Testimonial - Card de depoimento individual\n */\nexport interface TestimonialBlock extends BlockBase {\n type: \"testimonial\";\n props: {\n quote: string;\n authorName: string;\n authorRole?: string;\n authorCompany?: string;\n authorAvatar?: string;\n rating?: number; // 1-5 estrelas\n };\n}\n\n/**\n * TestimonialGrid - Grid de depoimentos\n */\nexport interface TestimonialGridBlock extends BlockBase {\n type: \"testimonialGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n testimonials: Array<{\n quote: string;\n authorName: string;\n authorRole?: string;\n authorCompany?: string;\n authorAvatar?: string;\n rating?: number;\n }>;\n };\n}\n\n/**\n * FaqItem - Item individual do FAQ\n */\nexport interface FaqItemBlock extends BlockBase {\n type: \"faqItem\";\n props: {\n question: string;\n answer: string;\n defaultOpen?: boolean;\n };\n}\n\n/**\n * Faq - Seção FAQ completa (accordion)\n */\nexport interface FaqBlock extends BlockBase {\n type: \"faq\";\n props: {\n title?: string;\n subtitle?: string;\n items: Array<{\n question: string;\n answer: string;\n }>;\n };\n}\n\n/**\n * CTA - Seção Call-to-Action\n */\nexport interface CtaBlock extends BlockBase {\n type: \"cta\";\n props: {\n title: string;\n description?: string;\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n variant?: \"default\" | \"centered\" | \"split\" | \"gradient\";\n bg?: string;\n // Button Size\n /** Tamanho dos botões */\n buttonSize?: \"sm\" | \"md\" | \"lg\";\n // Button Hover Effects (principal)\n /** Efeito de hover nos botões */\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito (10-100) */\n buttonHoverIntensity?: number;\n // Button Hover Overlay (adicional)\n /** Efeito visual adicional nos botões */\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * StatItem - Item individual de estatística\n */\nexport interface StatItemBlock extends BlockBase {\n type: \"statItem\";\n props: {\n value: string;\n label: string;\n prefix?: string;\n suffix?: string;\n };\n}\n\n/**\n * Stats - Seção de estatísticas\n */\nexport interface StatsBlock extends BlockBase {\n type: \"stats\";\n props: {\n title?: string;\n subtitle?: string;\n items: Array<{\n value: string;\n label: string;\n prefix?: string;\n suffix?: string;\n }>;\n };\n}\n\n/**\n * LogoCloud - Grid de logos\n */\nexport interface LogoCloudBlock extends BlockBase {\n type: \"logoCloud\";\n props: {\n title?: string;\n logos: Array<{\n src: string;\n alt: string;\n href?: string;\n }>;\n grayscale?: boolean;\n };\n}\n\n/**\n * Link da Navbar - pode ser um link simples ou ter um dropdown com subitems\n */\nexport type NavbarLink = {\n text: string;\n href?: string;\n dropdown?: Array<{ text: string; href: string }>;\n};\n\n/**\n * IDs das variações visuais do bloco Navbar\n */\nexport type NavbarVariationId =\n | \"navbar-simples\"\n | \"navbar-moderno\"\n | \"navbar-glass\"\n | \"navbar-elegante\"\n | \"navbar-pill\";\n\n/**\n * Navbar - Barra de navegação\n */\nexport interface NavbarBlock extends BlockBase {\n type: \"navbar\";\n props: {\n variation?: NavbarVariationId;\n /** URL da imagem do logo ou objeto com src, alt e href */\n logo?: string | { src: string; alt?: string; href?: string };\n logoText?: string;\n links: Array<NavbarLink>;\n ctaButton?: { text: string; href?: string };\n sticky?: boolean;\n /** Cor de fundo customizada (suporta gradientes) */\n bg?: string;\n\n // Layout Options\n /** Distribuição do navbar: expandido, centralizado ou compacto */\n layout?: \"expanded\" | \"centered\" | \"compact\";\n /** Modo flutuante: navbar com margem lateral e mais destaque */\n floating?: boolean;\n\n // Visual Customization\n /** Border radius em pixels (0-24) */\n borderRadius?: number;\n /** Sombra do navbar */\n shadow?: \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n /** Opacidade do navbar (0-100) */\n opacity?: number;\n /** Intensidade do desfoque/blur (0-100) para efeito de vidro fosco */\n blurOpacity?: number;\n /** Altura do logo em pixels (30-120) */\n logoHeight?: number;\n /** Posição da borda: nenhuma, completa, superior, inferior, esquerda, direita */\n borderPosition?: \"none\" | \"all\" | \"top\" | \"bottom\" | \"left\" | \"right\";\n /** Espessura da borda em pixels (1-4) */\n borderWidth?: number;\n /** Cor da borda */\n borderColor?: string;\n\n // Link Styling\n /** Cor dos links */\n linkColor?: string;\n /** Cor dos links no hover */\n linkHoverColor?: string;\n /** Tamanho da fonte dos links */\n linkFontSize?: \"sm\" | \"md\" | \"lg\";\n /** Efeito de hover nos links */\n linkHoverEffect?: \"background\" | \"underline\" | \"underline-center\" | \"slide-bg\" | \"scale\" | \"glow\";\n /** Intensidade do efeito de hover nos links (0-100) */\n linkHoverIntensity?: number;\n\n // Button/CTA Styling\n /** Variante do botão CTA */\n buttonVariant?: \"solid\" | \"outline\" | \"ghost\";\n /** Tamanho do botão CTA */\n buttonSize?: \"sm\" | \"md\" | \"lg\";\n /** Cor do botão CTA */\n buttonColor?: string;\n /** Cor do texto do botão CTA */\n buttonTextColor?: string;\n /** Border radius do botão em pixels (0-24) */\n buttonBorderRadius?: number;\n /** Efeito de hover no botão CTA */\n buttonHoverEffect?: \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n /** Intensidade do efeito de hover no botão (0-100) */\n buttonHoverIntensity?: number;\n /** Efeito visual adicional no botão CTA */\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n /** Nome do ícone para o efeito \"icon\" */\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * Footer - Rodapé do site\n */\nexport interface FooterBlock extends BlockBase {\n type: \"footer\";\n props: {\n logo?: string | { src: string; alt?: string };\n logoText?: string;\n description?: string;\n columns?: Array<{\n title: string;\n links: Array<{\n text: string;\n href: string;\n }>;\n }>;\n social?: Array<{\n platform: string;\n href: string;\n }>;\n copyright?: string;\n variant?: \"simple\" | \"multi-column\";\n // Link Hover Effects\n /** Efeito de hover nos links */\n linkHoverEffect?: \"none\" | \"background\" | \"underline\" | \"underline-center\" | \"scale\" | \"glow\";\n /** Intensidade do efeito (10-100) */\n linkHoverIntensity?: number;\n /** Cor do link no hover */\n linkHoverColor?: string;\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS REUTILIZÁVEIS\n// ============================================================================\n\n/**\n * Countdown - Contador regressivo (eventos, matrículas, promoções)\n */\nexport interface CountdownBlock extends BlockBase {\n type: \"countdown\";\n props: {\n title?: string;\n description?: string;\n /** Data final em ISO string para cálculo real */\n endDate?: string;\n /** Exibir labels Days/Hours/Minutes/Seconds com valores 00 quando sem endDate */\n showPlaceholders?: boolean;\n buttonText?: string;\n buttonHref?: string;\n variant?: \"default\" | \"banner\";\n /** Texto no círculo decorativo (ex.: \"Admission on Going\") */\n badgeText?: string;\n bg?: string;\n };\n}\n\n/**\n * Carousel - Slider de slides (programas, destaques, depoimentos)\n */\nexport interface CarouselBlock extends BlockBase {\n type: \"carousel\";\n props: {\n slides: Array<{\n image?: string;\n title?: string;\n description?: string;\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n }>;\n autoplay?: boolean;\n showArrows?: boolean;\n showDots?: boolean;\n };\n}\n\n/**\n * BlogCard - Card de post/notícia individual\n */\nexport interface BlogCardBlock extends BlockBase {\n type: \"blogCard\";\n props: {\n image?: string;\n date?: string;\n category?: string;\n title: string;\n excerpt?: string;\n linkText?: string;\n linkHref?: string;\n };\n}\n\n/**\n * BlogCardGrid - Grid de cards de blog/notícias\n */\nexport interface BlogCardGridBlock extends BlockBase {\n type: \"blogCardGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n cards: Array<{\n image?: string;\n date?: string;\n category?: string;\n title: string;\n excerpt?: string;\n linkText?: string;\n linkHref?: string;\n }>;\n };\n}\n\n/**\n * TeamCard - Card de membro da equipe/professor\n */\nexport interface TeamCardBlock extends BlockBase {\n type: \"teamCard\";\n props: {\n avatar?: string;\n name: string;\n role?: string;\n };\n}\n\n/**\n * TeamGrid - Grid de membros da equipe\n */\nexport interface TeamGridBlock extends BlockBase {\n type: \"teamGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n members: Array<{\n avatar?: string;\n name: string;\n role?: string;\n }>;\n };\n}\n\n/**\n * CourseCardGrid - Grid de cards de curso (thumbnail, título, preço, rating, View Course)\n */\nexport interface CourseCardGridBlock extends BlockBase {\n type: \"courseCardGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n cards: Array<{\n image?: string;\n title: string;\n price?: string;\n period?: string;\n rating?: number;\n meta?: string[];\n buttonText?: string;\n buttonHref?: string;\n }>;\n };\n}\n\n/**\n * CategoryCardGrid - Grid de categorias (imagem de fundo + título overlay + link)\n */\nexport interface CategoryCardGridBlock extends BlockBase {\n type: \"categoryCardGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n categories: Array<{\n image: string;\n title: string;\n href?: string;\n }>;\n };\n}\n\n// ============================================================================\n// BLOCOS DE PLUGIN - BLOG (dinâmico, conectado a ContentProvider)\n// ============================================================================\n\n/**\n * BlogPostCard - Card individual de post (versão dinâmica do blogCard)\n * Pode receber dados de ContentProvider ou ter conteúdo estático\n */\nexport interface BlogPostCardBlock extends BlockBase {\n type: \"blogPostCard\";\n props: {\n title: string;\n excerpt?: string;\n image?: string;\n date?: string;\n category?: string;\n authorName?: string;\n authorAvatar?: string;\n readingTime?: string;\n linkHref?: string;\n linkText?: string;\n variant?: \"default\" | \"horizontal\" | \"minimal\";\n showImage?: boolean;\n showCategory?: boolean;\n showDate?: boolean;\n showAuthor?: boolean;\n showReadingTime?: boolean;\n };\n}\n\n/**\n * BlogPostGrid - Grid de posts com suporte a dados dinâmicos\n * Pode usar dataSource para buscar do ContentProvider ou cards estáticos\n */\nexport interface BlogPostGridBlock extends BlockBase {\n type: \"blogPostGrid\";\n props: {\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n /** Cards estáticos (quando não há dataSource) */\n cards?: Array<{\n title: string;\n excerpt?: string;\n image?: string;\n date?: string;\n category?: string;\n authorName?: string;\n linkHref?: string;\n linkText?: string;\n }>;\n /** Fonte de dados dinâmica (ContentProvider) */\n dataSource?: {\n provider: string;\n limit?: number;\n filter?: Record<string, unknown>;\n };\n variant?: \"default\" | \"featured\" | \"minimal\";\n showViewAll?: boolean;\n viewAllText?: string;\n viewAllHref?: string;\n };\n}\n\n/**\n * BlogPostDetail - Conteúdo completo de um post (para página blog/:slug)\n * Recebe dados do ContentProvider na página dinâmica\n */\nexport interface BlogPostDetailBlock extends BlockBase {\n type: \"blogPostDetail\";\n props: {\n title: string;\n content: string;\n featuredImage?: string;\n date?: string;\n category?: string;\n /** Variante visual do bloco autor: \"inline\" | \"card\" | \"minimal\" */\n authorVariant?: \"inline\" | \"card\" | \"minimal\";\n readingTime?: string;\n tags?: string[];\n showFeaturedImage?: boolean;\n showAuthor?: boolean;\n showDate?: boolean;\n showTags?: boolean;\n showReadingTime?: boolean;\n contentMaxWidth?: string;\n };\n}\n\n// ============================================================================\n// NOVOS BLOCOS - FORMULÁRIOS\n// ============================================================================\n\n/**\n * Form - Container de formulário\n */\nexport interface FormBlock extends BlockBase {\n type: \"form\";\n props: {\n action?: string;\n method?: \"get\" | \"post\";\n children?: Block[];\n submitText?: string;\n };\n}\n\n/**\n * Input - Campo de entrada\n */\nexport interface InputBlock extends BlockBase {\n type: \"input\";\n props: {\n name: string;\n label?: string;\n placeholder?: string;\n type?: \"text\" | \"email\" | \"password\" | \"tel\" | \"url\" | \"number\";\n required?: boolean;\n };\n}\n\n/**\n * Textarea - Campo de texto longo\n */\nexport interface TextareaBlock extends BlockBase {\n type: \"textarea\";\n props: {\n name: string;\n label?: string;\n placeholder?: string;\n rows?: number;\n required?: boolean;\n };\n}\n\n/**\n * FormSelect - Dropdown de formulário\n */\nexport interface FormSelectBlock extends BlockBase {\n type: \"formSelect\";\n props: {\n name: string;\n label?: string;\n placeholder?: string;\n options: Array<{ value: string; label: string }>;\n required?: boolean;\n };\n}\n\n// ============================================================================\n// UNION TYPE DE TODOS OS BLOCOS\n// ============================================================================\n\n/**\n * Union type de todos os blocos\n */\nexport type Block =\n // Layout\n | ContainerBlock\n | StackBlock\n | GridBlock\n | BoxBlock\n | SpacerBlock\n // Conteúdo básico\n | HeadingBlock\n | TextBlock\n | ImageBlock\n | ButtonBlock\n | LinkBlock\n | DividerBlock\n // Conteúdo avançado\n | BadgeBlock\n | IconBlock\n | AvatarBlock\n | VideoBlock\n | SocialLinksBlock\n // Composição básica\n | CardBlock\n | SectionBlock\n // Seções compostas\n | HeroBlock\n | FeatureBlock\n | FeatureGridBlock\n | PricingBlock\n | PricingCardBlock\n | TestimonialBlock\n | TestimonialGridBlock\n | FaqBlock\n | FaqItemBlock\n | CtaBlock\n | StatsBlock\n | StatItemBlock\n | LogoCloudBlock\n | NavbarBlock\n | FooterBlock\n // Novos blocos reutilizáveis\n | CountdownBlock\n | CarouselBlock\n | BlogCardBlock\n | BlogCardGridBlock\n | TeamCardBlock\n | TeamGridBlock\n | CourseCardGridBlock\n | CategoryCardGridBlock\n // Blog plugin (dinâmico)\n | BlogPostCardBlock\n | BlogPostGridBlock\n | BlogPostDetailBlock\n // Formulários\n | FormBlock\n | InputBlock\n | TextareaBlock\n | FormSelectBlock;\n\n/**\n * Utility type: extract the block interface for a given BlockType\n */\nexport type BlockOfType<T extends BlockType> = Extract<Block, { type: T }>;\n\n/**\n * Utility type: extract the props type for a given BlockType\n */\nexport type BlockPropsFor<T extends BlockType> = BlockOfType<T>[\"props\"];\n\n/**\n * Página do site\n */\nexport interface SitePage {\n id: string;\n name: string;\n slug: string;\n structure: Block[]; // Árvore de blocos\n /** ID do plugin que criou esta página (se for uma página de plugin) */\n pluginId?: string;\n /** ID do template de página do plugin */\n pageTemplateId?: string;\n /** Página dinâmica com dados de backend (ex.: blog/:slug) */\n isDynamic?: boolean;\n /** Configuração de dados dinâmicos (provider, modo, mapeamento) */\n dataSource?: PageDataSource;\n /** Restrições de edição impostas pelo plugin */\n editRestrictions?: PageEditRestrictions;\n}\n\n/**\n * Coleções de conteúdo (testimonials, faq, posts, etc)\n */\nexport interface ContentCollection {\n id: string;\n type: \"testimonials\" | \"faq\" | \"posts\" | \"services\" | \"team\" | \"custom\";\n items: Array<Record<string, any>>;\n}\n\n/**\n * Documento completo do site\n */\nexport interface SiteDocument {\n schemaVersion: 2;\n theme: ThemeTokens;\n content?: {\n collections?: ContentCollection[];\n };\n pages: SitePage[];\n /** Configuração de plugins ativos e suas opções */\n plugins?: SitePluginsConfig;\n}\n\n/**\n * Helper para criar um documento vazio\n */\nexport function createEmptySiteDocument(\n _name: string = \"Novo Site\",\n): SiteDocument {\n return {\n schemaVersion: 2,\n theme: {\n colors: {\n bg: \"#ffffff\",\n surface: \"#f9fafb\",\n border: \"#e5e7eb\",\n text: \"#1f2937\",\n mutedText: \"#6b7280\",\n primary: \"#3b82f6\",\n primaryText: \"#ffffff\",\n secondary: \"#6b7280\",\n accent: \"#8b5cf6\",\n ring: \"#3b82f6\",\n },\n radiusScale: \"md\",\n shadowScale: \"soft\",\n spacingScale: \"normal\",\n motion: \"subtle\",\n backgroundStyle: \"flat\",\n typography: {\n fontFamily: {\n heading: \"system-ui, -apple-system, sans-serif\",\n body: \"system-ui, -apple-system, sans-serif\",\n },\n baseSize: \"16px\",\n headingScale: {\n h1: \"2.5rem\",\n h2: \"2rem\",\n h3: \"1.75rem\",\n h4: \"1.5rem\",\n h5: \"1.25rem\",\n h6: \"1rem\",\n },\n },\n },\n pages: [\n {\n id: \"home\",\n name: \"Home\",\n slug: \"home\",\n structure: [],\n },\n ],\n };\n}\n"],"names":["createEmptySiteDocument","_name"],"mappings":"AAquCO,SAASA,EACdC,IAAgB,aACF;AACd,SAAO;AAAA,IACL,eAAe;AAAA,IACf,OAAO;AAAA,MACL,QAAQ;AAAA,QACN,IAAI;AAAA,QACJ,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,WAAW;AAAA,QACX,SAAS;AAAA,QACT,aAAa;AAAA,QACb,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,MAAM;AAAA,MAAA;AAAA,MAER,aAAa;AAAA,MACb,aAAa;AAAA,MACb,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,iBAAiB;AAAA,MACjB,YAAY;AAAA,QACV,YAAY;AAAA,UACV,SAAS;AAAA,UACT,MAAM;AAAA,QAAA;AAAA,QAER,UAAU;AAAA,QACV,cAAc;AAAA,UACZ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,IAAI;AAAA,QAAA;AAAA,MACN;AAAA,IACF;AAAA,IAEF,OAAO;AAAA,MACL;AAAA,QACE,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,CAAA;AAAA,MAAC;AAAA,IACd;AAAA,EACF;AAEJ;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"themeTokens.js","sources":["../../../src/engine/schema/themeTokens.ts"],"sourcesContent":["/**\n * Theme Tokens Schema V2\n * Define tokens semânticos para temas (cores, tipografia, espaçamento, efeitos, layout)\n * Inspirado em design systems modernos (Tailwind, Radix, shadcn/ui)\n */\n\n// ============================================================================\n// TIPOS DE ESCALA\n// ============================================================================\n\nexport type RadiusScale = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"pill\";\nexport type ShadowScale = \"none\" | \"soft\" | \"md\" | \"strong\" | \"glow\";\nexport type SpacingScale = \"compact\" | \"normal\" | \"comfy\" | \"spacious\";\nexport type MotionLevel = \"none\" | \"subtle\" | \"moderate\" | \"bold\";\nexport type BackgroundStyle =\n | \"flat\"\n | \"gradient\"\n | \"glass\"\n | \"texture\"\n | \"mesh\";\nexport type GradientDirection =\n | \"to-t\"\n | \"to-tr\"\n | \"to-r\"\n | \"to-br\"\n | \"to-b\"\n | \"to-bl\"\n | \"to-l\"\n | \"to-tl\";\n\n// ============================================================================\n// INTERFACES DE TOKENS\n// ============================================================================\n\n/**\n * Tokens de Cores - Sistema de cores semânticas expandido\n */\nexport interface ColorTokens {\n // Backgrounds\n bg: string;\n surface: string;\n surface2?: string;\n surface3?: string;\n overlay?: string;\n\n // Borders\n border: string;\n borderHover?: string;\n\n // Text\n text: string;\n mutedText: string;\n invertedText?: string;\n\n // Primary/Accent\n primary: string;\n primaryHover?: string;\n primaryText: string;\n secondary: string;\n secondaryHover?: string;\n accent: string;\n accentHover?: string;\n ring: string;\n\n // Links\n link?: string;\n linkHover?: string;\n linkColor?: string; // Cor específica para links em geral\n menuLinkColor?: string; // Cor específica para links do menu navbar (derivada do primary)\n\n // Inputs\n inputBg?: string;\n inputBorder?: string;\n inputFocus?: string;\n\n // Status\n success?: string;\n successLight?: string;\n warning?: string;\n warningLight?: string;\n danger?: string;\n dangerLight?: string;\n info?: string;\n infoLight?: string;\n\n // Gradient\n gradient?: {\n start: string;\n middle?: string;\n end: string;\n direction: GradientDirection;\n };\n}\n\n/**\n * Tokens de Tipografia - Sistema tipográfico expandido\n */\nexport interface TypographyTokens {\n fontFamily: {\n heading: string;\n body: string;\n mono?: string;\n accent?: string;\n };\n baseSize: string;\n headingScale: {\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n };\n fontWeight?: {\n light: number;\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n lineHeight?: {\n tight: string;\n normal: string;\n relaxed: string;\n };\n letterSpacing?: {\n tighter: string;\n tight: string;\n normal: string;\n wide: string;\n wider: string;\n };\n}\n\n/**\n * Tokens de Efeitos - Blur, opacidade, transições\n */\nexport interface EffectTokens {\n blur?: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n opacity?: {\n overlay: number;\n disabled: number;\n muted: number;\n };\n transition?: {\n fast: string;\n normal: string;\n slow: string;\n };\n animation?: {\n duration: string;\n easing: string;\n };\n}\n\n/**\n * Tokens de Layout - Larguras, paddings, gaps\n */\nexport interface LayoutTokens {\n maxWidth?: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n \"2xl\": string;\n full: string;\n };\n sectionPadding?: {\n sm: string;\n md: string;\n lg: string;\n };\n containerPadding?: string;\n}\n\n/**\n * Tokens de Componentes - Estilos específicos por componente\n */\nexport interface ComponentTokens {\n button?: {\n borderRadius?: string;\n fontWeight?: string;\n paddingSm?: string;\n paddingMd?: string;\n paddingLg?: string;\n };\n card?: {\n borderRadius?: string;\n padding?: string;\n shadow?: string;\n };\n input?: {\n borderRadius?: string;\n padding?: string;\n borderWidth?: string;\n };\n badge?: {\n borderRadius?: string;\n padding?: string;\n fontSize?: string;\n };\n avatar?: {\n sizeSm?: string;\n sizeMd?: string;\n sizeLg?: string;\n sizeXl?: string;\n };\n}\n\n/**\n * Theme Tokens - Interface principal expandida\n */\nexport interface ThemeTokens {\n // Cores semânticas\n colors: ColorTokens;\n\n // Escalas de estilo\n radiusScale: RadiusScale;\n shadowScale: ShadowScale;\n spacingScale: SpacingScale;\n motion: MotionLevel;\n backgroundStyle: BackgroundStyle;\n\n // Tipografia\n typography: TypographyTokens;\n\n // Novos tokens (opcionais para retrocompatibilidade)\n effects?: EffectTokens;\n layout?: LayoutTokens;\n components?: ComponentTokens;\n}\n\n// ============================================================================\n// MAPEAMENTOS DE ESCALA\n// ============================================================================\n\nexport const radiusScaleMap: Record<RadiusScale, string> = {\n none: \"0\",\n sm: \"0.25rem\",\n md: \"0.5rem\",\n lg: \"1rem\",\n xl: \"1.5rem\",\n pill: \"9999px\",\n};\n\nexport const shadowScaleMap: Record<ShadowScale, string> = {\n none: \"none\",\n soft: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n strong:\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n glow: \"0 0 20px rgba(59, 130, 246, 0.5)\",\n};\n\nexport const spacingScaleMap: Record<SpacingScale, Record<string, string>> = {\n compact: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"0.75rem\",\n lg: \"1rem\",\n xl: \"1.5rem\",\n \"2xl\": \"2rem\",\n },\n normal: {\n xs: \"0.5rem\",\n sm: \"0.75rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n \"2xl\": \"3rem\",\n },\n comfy: {\n xs: \"0.75rem\",\n sm: \"1rem\",\n md: \"1.5rem\",\n lg: \"2rem\",\n xl: \"3rem\",\n \"2xl\": \"4rem\",\n },\n spacious: {\n xs: \"1rem\",\n sm: \"1.5rem\",\n md: \"2rem\",\n lg: \"3rem\",\n xl: \"4rem\",\n \"2xl\": \"6rem\",\n },\n};\n\nexport const gradientDirectionMap: Record<GradientDirection, string> = {\n \"to-t\": \"to top\",\n \"to-tr\": \"to top right\",\n \"to-r\": \"to right\",\n \"to-br\": \"to bottom right\",\n \"to-b\": \"to bottom\",\n \"to-bl\": \"to bottom left\",\n \"to-l\": \"to left\",\n \"to-tl\": \"to top left\",\n};\n\n// ============================================================================\n// VALORES PADRÃO PARA TOKENS OPCIONAIS\n// ============================================================================\n\nexport const defaultEffectTokens: EffectTokens = {\n blur: {\n sm: \"4px\",\n md: \"8px\",\n lg: \"16px\",\n xl: \"24px\",\n },\n opacity: {\n overlay: 0.5,\n disabled: 0.5,\n muted: 0.7,\n },\n transition: {\n fast: \"150ms ease\",\n normal: \"300ms ease\",\n slow: \"500ms ease\",\n },\n animation: {\n duration: \"300ms\",\n easing: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n};\n\nexport const defaultLayoutTokens: LayoutTokens = {\n maxWidth: {\n sm: \"640px\",\n md: \"768px\",\n lg: \"1024px\",\n xl: \"1280px\",\n \"2xl\": \"1536px\",\n full: \"100%\",\n },\n sectionPadding: {\n sm: \"2rem 0\",\n md: \"4rem 0\",\n lg: \"6rem 0\",\n },\n containerPadding: \"1rem\",\n};\n\nexport const defaultComponentTokens: ComponentTokens = {\n button: {\n borderRadius: \"0.5rem\",\n fontWeight: \"500\",\n paddingSm: \"0.5rem 1rem\",\n paddingMd: \"0.625rem 1.25rem\",\n paddingLg: \"0.75rem 1.5rem\",\n },\n card: {\n borderRadius: \"0.75rem\",\n padding: \"1.5rem\",\n shadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n },\n input: {\n borderRadius: \"0.5rem\",\n padding: \"0.625rem 0.875rem\",\n borderWidth: \"1px\",\n },\n badge: {\n borderRadius: \"9999px\",\n padding: \"0.25rem 0.75rem\",\n fontSize: \"0.75rem\",\n },\n avatar: {\n sizeSm: \"2rem\",\n sizeMd: \"2.5rem\",\n sizeLg: \"3rem\",\n sizeXl: \"4rem\",\n },\n};\n\n// ============================================================================\n// GERADOR DE CSS VARIABLES\n// ============================================================================\n\n/**\n * Gera CSS variables a partir dos theme tokens (versão expandida).\n * Aceita undefined/null para documentos sem theme (ex.: API retorna template sem theme).\n */\nexport function generateThemeCSSVariables(\n tokens: ThemeTokens | null | undefined,\n): string {\n const t = tokens ?? defaultThemeTokens;\n const {\n colors,\n radiusScale,\n shadowScale,\n spacingScale,\n typography,\n effects,\n layout,\n components,\n } = t;\n\n const radius = radiusScaleMap[radiusScale];\n const shadow = shadowScaleMap[shadowScale];\n const spacing = spacingScaleMap[spacingScale];\n const fx = effects || defaultEffectTokens;\n const lay = layout || defaultLayoutTokens;\n const comp = components || defaultComponentTokens;\n\n // Gerar gradient CSS se existir\n const gradientCss = colors.gradient\n ? `linear-gradient(${gradientDirectionMap[colors.gradient.direction]}, ${colors.gradient.start}${colors.gradient.middle ? `, ${colors.gradient.middle}` : \"\"}, ${colors.gradient.end})`\n : \"none\";\n\n return `\n :root {\n /* ===== COLORS ===== */\n --sg-bg: ${colors.bg};\n --sg-surface: ${colors.surface};\n --sg-surface2: ${colors.surface2 || colors.surface};\n --sg-surface3: ${colors.surface3 || colors.surface2 || colors.surface};\n --sg-overlay: ${colors.overlay || \"rgba(0, 0, 0, 0.5)\"};\n --sg-border: ${colors.border};\n --sg-border-hover: ${colors.borderHover || colors.border};\n --sg-text: ${colors.text};\n --sg-muted-text: ${colors.mutedText};\n --sg-inverted-text: ${colors.invertedText || \"#ffffff\"};\n --sg-primary: ${colors.primary};\n --sg-primary-hover: ${colors.primaryHover || colors.primary};\n --sg-primary-text: ${colors.primaryText};\n --sg-secondary: ${colors.secondary};\n --sg-secondary-hover: ${colors.secondaryHover || colors.secondary};\n --sg-accent: ${colors.accent};\n --sg-accent-hover: ${colors.accentHover || colors.accent};\n --sg-ring: ${colors.ring};\n --sg-link: ${colors.link || colors.primary};\n --sg-link-hover: ${colors.linkHover || colors.primary};\n --sg-link-color: ${colors.linkColor || colors.link || colors.primary};\n --sg-menu-link-color: ${colors.menuLinkColor || colors.primary};\n --sg-input-bg: ${colors.inputBg || colors.bg};\n --sg-input-border: ${colors.inputBorder || colors.border};\n --sg-input-focus: ${colors.inputFocus || colors.ring};\n --sg-success: ${colors.success || \"#10b981\"};\n --sg-success-light: ${colors.successLight || \"#d1fae5\"};\n --sg-warning: ${colors.warning || \"#f59e0b\"};\n --sg-warning-light: ${colors.warningLight || \"#fef3c7\"};\n --sg-danger: ${colors.danger || \"#ef4444\"};\n --sg-danger-light: ${colors.dangerLight || \"#fee2e2\"};\n --sg-info: ${colors.info || \"#3b82f6\"};\n --sg-info-light: ${colors.infoLight || \"#dbeafe\"};\n --sg-gradient: ${gradientCss};\n \n /* ===== RADIUS ===== */\n --sg-radius: ${radius};\n --sg-radius-sm: ${radiusScaleMap.sm};\n --sg-radius-md: ${radiusScaleMap.md};\n --sg-radius-lg: ${radiusScaleMap.lg};\n --sg-radius-xl: ${radiusScaleMap.xl};\n --sg-radius-pill: ${radiusScaleMap.pill};\n \n /* ===== SHADOW ===== */\n --sg-shadow: ${shadow};\n --sg-shadow-soft: ${shadowScaleMap.soft};\n --sg-shadow-md: ${shadowScaleMap.md};\n --sg-shadow-strong: ${shadowScaleMap.strong};\n --sg-shadow-glow: ${shadowScaleMap.glow};\n \n /* ===== SPACING ===== */\n --sg-spacing-xs: ${spacing.xs};\n --sg-spacing-sm: ${spacing.sm};\n --sg-spacing-md: ${spacing.md};\n --sg-spacing-lg: ${spacing.lg};\n --sg-spacing-xl: ${spacing.xl};\n --sg-spacing-2xl: ${spacing[\"2xl\"]};\n \n /* ===== TYPOGRAPHY ===== */\n --sg-font-heading: ${typography.fontFamily.heading};\n --sg-font-body: ${typography.fontFamily.body};\n --sg-font-mono: ${typography.fontFamily.mono || \"ui-monospace, monospace\"};\n --sg-font-accent: ${typography.fontFamily.accent || typography.fontFamily.heading};\n --sg-font-size-base: ${typography.baseSize};\n --sg-heading-h1: ${typography.headingScale.h1};\n --sg-heading-h2: ${typography.headingScale.h2};\n --sg-heading-h3: ${typography.headingScale.h3};\n --sg-heading-h4: ${typography.headingScale.h4};\n --sg-heading-h5: ${typography.headingScale.h5};\n --sg-heading-h6: ${typography.headingScale.h6};\n --sg-font-weight-light: ${typography.fontWeight?.light || 300};\n --sg-font-weight-normal: ${typography.fontWeight?.normal || 400};\n --sg-font-weight-medium: ${typography.fontWeight?.medium || 500};\n --sg-font-weight-semibold: ${typography.fontWeight?.semibold || 600};\n --sg-font-weight-bold: ${typography.fontWeight?.bold || 700};\n --sg-line-height-tight: ${typography.lineHeight?.tight || \"1.25\"};\n --sg-line-height-normal: ${typography.lineHeight?.normal || \"1.5\"};\n --sg-line-height-relaxed: ${typography.lineHeight?.relaxed || \"1.75\"};\n --sg-letter-spacing-tight: ${typography.letterSpacing?.tight || \"-0.025em\"};\n --sg-letter-spacing-normal: ${typography.letterSpacing?.normal || \"0\"};\n --sg-letter-spacing-wide: ${typography.letterSpacing?.wide || \"0.025em\"};\n \n /* ===== EFFECTS ===== */\n --sg-blur-sm: ${fx.blur?.sm || \"4px\"};\n --sg-blur-md: ${fx.blur?.md || \"8px\"};\n --sg-blur-lg: ${fx.blur?.lg || \"16px\"};\n --sg-blur-xl: ${fx.blur?.xl || \"24px\"};\n --sg-opacity-overlay: ${fx.opacity?.overlay || 0.5};\n --sg-opacity-disabled: ${fx.opacity?.disabled || 0.5};\n --sg-opacity-muted: ${fx.opacity?.muted || 0.7};\n --sg-transition-fast: ${fx.transition?.fast || \"150ms ease\"};\n --sg-transition-normal: ${fx.transition?.normal || \"300ms ease\"};\n --sg-transition-slow: ${fx.transition?.slow || \"500ms ease\"};\n --sg-animation-duration: ${fx.animation?.duration || \"300ms\"};\n --sg-animation-easing: ${fx.animation?.easing || \"cubic-bezier(0.4, 0, 0.2, 1)\"};\n \n /* ===== LAYOUT ===== */\n --sg-max-width-sm: ${lay.maxWidth?.sm || \"640px\"};\n --sg-max-width-md: ${lay.maxWidth?.md || \"768px\"};\n --sg-max-width-lg: ${lay.maxWidth?.lg || \"1024px\"};\n --sg-max-width-xl: ${lay.maxWidth?.xl || \"1280px\"};\n --sg-max-width-2xl: ${lay.maxWidth?.[\"2xl\"] || \"1536px\"};\n --sg-section-padding-sm: ${lay.sectionPadding?.sm || \"2rem 0\"};\n --sg-section-padding-md: ${lay.sectionPadding?.md || \"4rem 0\"};\n --sg-section-padding-lg: ${lay.sectionPadding?.lg || \"6rem 0\"};\n --sg-container-padding: ${lay.containerPadding || \"1rem\"};\n \n /* ===== COMPONENT TOKENS ===== */\n --sg-button-radius: ${comp.button?.borderRadius || \"0.5rem\"};\n --sg-button-font-weight: ${comp.button?.fontWeight || \"500\"};\n --sg-button-padding-sm: ${comp.button?.paddingSm || \"0.5rem 1rem\"};\n --sg-button-padding-md: ${comp.button?.paddingMd || \"0.625rem 1.25rem\"};\n --sg-button-padding-lg: ${comp.button?.paddingLg || \"0.75rem 1.5rem\"};\n --sg-card-radius: ${comp.card?.borderRadius || \"0.75rem\"};\n --sg-card-padding: ${comp.card?.padding || \"1.5rem\"};\n --sg-card-shadow: ${comp.card?.shadow || shadowScaleMap.md};\n --sg-input-radius: ${comp.input?.borderRadius || \"0.5rem\"};\n --sg-input-padding: ${comp.input?.padding || \"0.625rem 0.875rem\"};\n --sg-input-border-width: ${comp.input?.borderWidth || \"1px\"};\n --sg-badge-radius: ${comp.badge?.borderRadius || \"9999px\"};\n --sg-badge-padding: ${comp.badge?.padding || \"0.25rem 0.75rem\"};\n --sg-badge-font-size: ${comp.badge?.fontSize || \"0.75rem\"};\n --sg-avatar-sm: ${comp.avatar?.sizeSm || \"2rem\"};\n --sg-avatar-md: ${comp.avatar?.sizeMd || \"2.5rem\"};\n --sg-avatar-lg: ${comp.avatar?.sizeLg || \"3rem\"};\n --sg-avatar-xl: ${comp.avatar?.sizeXl || \"4rem\"};\n }\n `.trim();\n}\n\n// ============================================================================\n// TEMA PADRÃO\n// ============================================================================\n\n/**\n * Theme tokens padrão (Light Modern)\n */\nexport const defaultThemeTokens: ThemeTokens = {\n colors: {\n bg: \"#ffffff\",\n surface: \"#f9fafb\",\n surface2: \"#f3f4f6\",\n surface3: \"#e5e7eb\",\n overlay: \"rgba(0, 0, 0, 0.5)\",\n border: \"#e5e7eb\",\n borderHover: \"#d1d5db\",\n text: \"#1f2937\",\n mutedText: \"#6b7280\",\n invertedText: \"#ffffff\",\n primary: \"#3b82f6\",\n primaryHover: \"#2563eb\",\n primaryText: \"#ffffff\",\n secondary: \"#6b7280\",\n secondaryHover: \"#4b5563\",\n accent: \"#8b5cf6\",\n accentHover: \"#7c3aed\",\n ring: \"#3b82f6\",\n link: \"#3b82f6\",\n linkHover: \"#2563eb\",\n linkColor: \"#1e40af\", // Azul mais escuro para contraste em fundo claro\n menuLinkColor: \"#2563eb\", // Links do menu - tom do primary mais escuro\n inputBg: \"#ffffff\",\n inputBorder: \"#d1d5db\",\n inputFocus: \"#3b82f6\",\n success: \"#10b981\",\n successLight: \"#d1fae5\",\n warning: \"#f59e0b\",\n warningLight: \"#fef3c7\",\n danger: \"#ef4444\",\n dangerLight: \"#fee2e2\",\n info: \"#3b82f6\",\n infoLight: \"#dbeafe\",\n },\n radiusScale: \"md\",\n shadowScale: \"soft\",\n spacingScale: \"normal\",\n motion: \"subtle\",\n backgroundStyle: \"flat\",\n typography: {\n fontFamily: {\n heading: \"system-ui, -apple-system, sans-serif\",\n body: \"system-ui, -apple-system, sans-serif\",\n mono: \"ui-monospace, SFMono-Regular, monospace\",\n },\n baseSize: \"16px\",\n headingScale: {\n h1: \"3rem\",\n h2: \"2.25rem\",\n h3: \"1.875rem\",\n h4: \"1.5rem\",\n h5: \"1.25rem\",\n h6: \"1rem\",\n },\n fontWeight: {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n tight: \"1.25\",\n normal: \"1.5\",\n relaxed: \"1.75\",\n },\n letterSpacing: {\n tighter: \"-0.05em\",\n tight: \"-0.025em\",\n normal: \"0\",\n wide: \"0.025em\",\n wider: \"0.05em\",\n },\n },\n effects: defaultEffectTokens,\n layout: defaultLayoutTokens,\n components: defaultComponentTokens,\n};\n\n// ============================================================================\n// PRESETS DE TEMAS\n// ============================================================================\n\n/**\n * Tema Dark Modern\n */\nexport const darkThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n colors: {\n bg: \"#0a0a0a\",\n surface: \"#171717\",\n surface2: \"#262626\",\n surface3: \"#404040\",\n overlay: \"rgba(0, 0, 0, 0.7)\",\n border: \"#404040\",\n borderHover: \"#525252\",\n text: \"#fafafa\",\n mutedText: \"#a3a3a3\",\n invertedText: \"#0a0a0a\",\n primary: \"#3b82f6\",\n primaryHover: \"#60a5fa\",\n primaryText: \"#ffffff\",\n secondary: \"#737373\",\n secondaryHover: \"#a3a3a3\",\n accent: \"#a78bfa\",\n accentHover: \"#c4b5fd\",\n ring: \"#3b82f6\",\n link: \"#60a5fa\",\n linkHover: \"#93c5fd\",\n linkColor: \"#93c5fd\", // Azul claro para contraste em fundo escuro\n menuLinkColor: \"#93c5fd\", // Links do menu - tom do primary mais claro\n inputBg: \"#171717\",\n inputBorder: \"#404040\",\n inputFocus: \"#3b82f6\",\n success: \"#34d399\",\n successLight: \"#064e3b\",\n warning: \"#fbbf24\",\n warningLight: \"#78350f\",\n danger: \"#f87171\",\n dangerLight: \"#7f1d1d\",\n info: \"#60a5fa\",\n infoLight: \"#1e3a8a\",\n },\n};\n\n/**\n * Tema Gradient (com gradiente de fundo)\n */\nexport const gradientThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n backgroundStyle: \"gradient\",\n colors: {\n ...defaultThemeTokens.colors,\n gradient: {\n start: \"#667eea\",\n middle: \"#764ba2\",\n end: \"#f093fb\",\n direction: \"to-br\",\n },\n },\n};\n\n/**\n * Tema Corporate (profissional)\n */\nexport const corporateThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n radiusScale: \"sm\",\n shadowScale: \"soft\",\n colors: {\n ...defaultThemeTokens.colors,\n primary: \"#1e40af\",\n primaryHover: \"#1e3a8a\",\n accent: \"#0ea5e9\",\n accentHover: \"#0284c7\",\n },\n typography: {\n ...defaultThemeTokens.typography,\n fontFamily: {\n heading: \"Inter, system-ui, sans-serif\",\n body: \"Inter, system-ui, sans-serif\",\n mono: \"ui-monospace, monospace\",\n },\n },\n};\n\n/**\n * Tema Playful (vibrante)\n */\nexport const playfulThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n radiusScale: \"lg\",\n shadowScale: \"md\",\n colors: {\n ...defaultThemeTokens.colors,\n primary: \"#ec4899\",\n primaryHover: \"#db2777\",\n accent: \"#f59e0b\",\n accentHover: \"#d97706\",\n success: \"#22c55e\",\n },\n typography: {\n ...defaultThemeTokens.typography,\n fontFamily: {\n heading: \"Poppins, system-ui, sans-serif\",\n body: \"Inter, system-ui, sans-serif\",\n mono: \"ui-monospace, monospace\",\n },\n },\n};\n"],"names":["radiusScaleMap","shadowScaleMap","spacingScaleMap","gradientDirectionMap","defaultEffectTokens","defaultLayoutTokens","defaultComponentTokens","generateThemeCSSVariables","tokens","t","defaultThemeTokens","colors","radiusScale","shadowScale","spacingScale","typography","effects","layout","components","radius","shadow","spacing","fx","lay","comp","gradientCss","darkThemeTokens","gradientThemeTokens","corporateThemeTokens","playfulThemeTokens"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"themeTokens.js","sources":["../../../src/engine/schema/themeTokens.ts"],"sourcesContent":["/**\n * Theme Tokens Schema\n * Define tokens semânticos para temas (cores, tipografia, espaçamento, efeitos, layout)\n * Inspirado em design systems modernos (Tailwind, Radix, shadcn/ui)\n */\n\n// ============================================================================\n// TIPOS DE ESCALA\n// ============================================================================\n\nexport type RadiusScale = \"none\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"pill\";\nexport type ShadowScale = \"none\" | \"soft\" | \"md\" | \"strong\" | \"glow\";\nexport type SpacingScale = \"compact\" | \"normal\" | \"comfy\" | \"spacious\";\nexport type MotionLevel = \"none\" | \"subtle\" | \"moderate\" | \"bold\";\nexport type BackgroundStyle =\n | \"flat\"\n | \"gradient\"\n | \"glass\"\n | \"texture\"\n | \"mesh\";\nexport type GradientDirection =\n | \"to-t\"\n | \"to-tr\"\n | \"to-r\"\n | \"to-br\"\n | \"to-b\"\n | \"to-bl\"\n | \"to-l\"\n | \"to-tl\";\n\n// ============================================================================\n// INTERFACES DE TOKENS\n// ============================================================================\n\n/**\n * Tokens de Cores - Sistema de cores semânticas expandido\n */\nexport interface ColorTokens {\n // Backgrounds\n bg: string;\n surface: string;\n surface2?: string;\n surface3?: string;\n overlay?: string;\n\n // Borders\n border: string;\n borderHover?: string;\n\n // Text\n text: string;\n mutedText: string;\n invertedText?: string;\n\n // Primary/Accent\n primary: string;\n primaryHover?: string;\n primaryText: string;\n secondary: string;\n secondaryHover?: string;\n accent: string;\n accentHover?: string;\n ring: string;\n\n // Links\n link?: string;\n linkHover?: string;\n linkColor?: string; // Cor específica para links em geral\n menuLinkColor?: string; // Cor específica para links do menu navbar (derivada do primary)\n\n // Inputs\n inputBg?: string;\n inputBorder?: string;\n inputFocus?: string;\n\n // Status\n success?: string;\n successLight?: string;\n warning?: string;\n warningLight?: string;\n danger?: string;\n dangerLight?: string;\n info?: string;\n infoLight?: string;\n\n // Gradient\n gradient?: {\n start: string;\n middle?: string;\n end: string;\n direction: GradientDirection;\n };\n}\n\n/**\n * Tokens de Tipografia - Sistema tipográfico expandido\n */\nexport interface TypographyTokens {\n fontFamily: {\n heading: string;\n body: string;\n mono?: string;\n accent?: string;\n };\n baseSize: string;\n headingScale: {\n h1: string;\n h2: string;\n h3: string;\n h4: string;\n h5: string;\n h6: string;\n };\n fontWeight?: {\n light: number;\n normal: number;\n medium: number;\n semibold: number;\n bold: number;\n };\n lineHeight?: {\n tight: string;\n normal: string;\n relaxed: string;\n };\n letterSpacing?: {\n tighter: string;\n tight: string;\n normal: string;\n wide: string;\n wider: string;\n };\n}\n\n/**\n * Tokens de Efeitos - Blur, opacidade, transições\n */\nexport interface EffectTokens {\n blur?: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n };\n opacity?: {\n overlay: number;\n disabled: number;\n muted: number;\n };\n transition?: {\n fast: string;\n normal: string;\n slow: string;\n };\n animation?: {\n duration: string;\n easing: string;\n };\n}\n\n/**\n * Tokens de Layout - Larguras, paddings, gaps\n */\nexport interface LayoutTokens {\n maxWidth?: {\n sm: string;\n md: string;\n lg: string;\n xl: string;\n \"2xl\": string;\n full: string;\n };\n sectionPadding?: {\n sm: string;\n md: string;\n lg: string;\n };\n containerPadding?: string;\n}\n\n/**\n * Tokens de Componentes - Estilos específicos por componente\n */\nexport interface ComponentTokens {\n button?: {\n borderRadius?: string;\n fontWeight?: string;\n paddingSm?: string;\n paddingMd?: string;\n paddingLg?: string;\n };\n card?: {\n borderRadius?: string;\n padding?: string;\n shadow?: string;\n };\n input?: {\n borderRadius?: string;\n padding?: string;\n borderWidth?: string;\n };\n badge?: {\n borderRadius?: string;\n padding?: string;\n fontSize?: string;\n };\n avatar?: {\n sizeSm?: string;\n sizeMd?: string;\n sizeLg?: string;\n sizeXl?: string;\n };\n}\n\n/**\n * Theme Tokens - Interface principal expandida\n */\nexport interface ThemeTokens {\n // Cores semânticas\n colors: ColorTokens;\n\n // Escalas de estilo\n radiusScale: RadiusScale;\n shadowScale: ShadowScale;\n spacingScale: SpacingScale;\n motion: MotionLevel;\n backgroundStyle: BackgroundStyle;\n\n // Tipografia\n typography: TypographyTokens;\n\n // Novos tokens (opcionais para retrocompatibilidade)\n effects?: EffectTokens;\n layout?: LayoutTokens;\n components?: ComponentTokens;\n}\n\n// ============================================================================\n// MAPEAMENTOS DE ESCALA\n// ============================================================================\n\nexport const radiusScaleMap: Record<RadiusScale, string> = {\n none: \"0\",\n sm: \"0.25rem\",\n md: \"0.5rem\",\n lg: \"1rem\",\n xl: \"1.5rem\",\n pill: \"9999px\",\n};\n\nexport const shadowScaleMap: Record<ShadowScale, string> = {\n none: \"none\",\n soft: \"0 1px 2px 0 rgba(0, 0, 0, 0.05)\",\n md: \"0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)\",\n strong:\n \"0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)\",\n glow: \"0 0 20px rgba(59, 130, 246, 0.5)\",\n};\n\nexport const spacingScaleMap: Record<SpacingScale, Record<string, string>> = {\n compact: {\n xs: \"0.25rem\",\n sm: \"0.5rem\",\n md: \"0.75rem\",\n lg: \"1rem\",\n xl: \"1.5rem\",\n \"2xl\": \"2rem\",\n },\n normal: {\n xs: \"0.5rem\",\n sm: \"0.75rem\",\n md: \"1rem\",\n lg: \"1.5rem\",\n xl: \"2rem\",\n \"2xl\": \"3rem\",\n },\n comfy: {\n xs: \"0.75rem\",\n sm: \"1rem\",\n md: \"1.5rem\",\n lg: \"2rem\",\n xl: \"3rem\",\n \"2xl\": \"4rem\",\n },\n spacious: {\n xs: \"1rem\",\n sm: \"1.5rem\",\n md: \"2rem\",\n lg: \"3rem\",\n xl: \"4rem\",\n \"2xl\": \"6rem\",\n },\n};\n\nexport const gradientDirectionMap: Record<GradientDirection, string> = {\n \"to-t\": \"to top\",\n \"to-tr\": \"to top right\",\n \"to-r\": \"to right\",\n \"to-br\": \"to bottom right\",\n \"to-b\": \"to bottom\",\n \"to-bl\": \"to bottom left\",\n \"to-l\": \"to left\",\n \"to-tl\": \"to top left\",\n};\n\n// ============================================================================\n// VALORES PADRÃO PARA TOKENS OPCIONAIS\n// ============================================================================\n\nexport const defaultEffectTokens: EffectTokens = {\n blur: {\n sm: \"4px\",\n md: \"8px\",\n lg: \"16px\",\n xl: \"24px\",\n },\n opacity: {\n overlay: 0.5,\n disabled: 0.5,\n muted: 0.7,\n },\n transition: {\n fast: \"150ms ease\",\n normal: \"300ms ease\",\n slow: \"500ms ease\",\n },\n animation: {\n duration: \"300ms\",\n easing: \"cubic-bezier(0.4, 0, 0.2, 1)\",\n },\n};\n\nexport const defaultLayoutTokens: LayoutTokens = {\n maxWidth: {\n sm: \"640px\",\n md: \"768px\",\n lg: \"1024px\",\n xl: \"1280px\",\n \"2xl\": \"1536px\",\n full: \"100%\",\n },\n sectionPadding: {\n sm: \"2rem 0\",\n md: \"4rem 0\",\n lg: \"6rem 0\",\n },\n containerPadding: \"1rem\",\n};\n\nexport const defaultComponentTokens: ComponentTokens = {\n button: {\n borderRadius: \"0.5rem\",\n fontWeight: \"500\",\n paddingSm: \"0.5rem 1rem\",\n paddingMd: \"0.625rem 1.25rem\",\n paddingLg: \"0.75rem 1.5rem\",\n },\n card: {\n borderRadius: \"0.75rem\",\n padding: \"1.5rem\",\n shadow: \"0 4px 6px -1px rgba(0, 0, 0, 0.1)\",\n },\n input: {\n borderRadius: \"0.5rem\",\n padding: \"0.625rem 0.875rem\",\n borderWidth: \"1px\",\n },\n badge: {\n borderRadius: \"9999px\",\n padding: \"0.25rem 0.75rem\",\n fontSize: \"0.75rem\",\n },\n avatar: {\n sizeSm: \"2rem\",\n sizeMd: \"2.5rem\",\n sizeLg: \"3rem\",\n sizeXl: \"4rem\",\n },\n};\n\n// ============================================================================\n// GERADOR DE CSS VARIABLES\n// ============================================================================\n\n/**\n * Gera CSS variables a partir dos theme tokens (versão expandida).\n * Aceita undefined/null para documentos sem theme (ex.: API retorna template sem theme).\n */\nexport function generateThemeCSSVariables(\n tokens: ThemeTokens | null | undefined,\n): string {\n const t = tokens ?? defaultThemeTokens;\n const {\n colors,\n radiusScale,\n shadowScale,\n spacingScale,\n typography,\n effects,\n layout,\n components,\n } = t;\n\n const radius = radiusScaleMap[radiusScale];\n const shadow = shadowScaleMap[shadowScale];\n const spacing = spacingScaleMap[spacingScale];\n const fx = effects || defaultEffectTokens;\n const lay = layout || defaultLayoutTokens;\n const comp = components || defaultComponentTokens;\n\n // Gerar gradient CSS se existir\n const gradientCss = colors.gradient\n ? `linear-gradient(${gradientDirectionMap[colors.gradient.direction]}, ${colors.gradient.start}${colors.gradient.middle ? `, ${colors.gradient.middle}` : \"\"}, ${colors.gradient.end})`\n : \"none\";\n\n return `\n :root {\n /* ===== COLORS ===== */\n --sg-bg: ${colors.bg};\n --sg-surface: ${colors.surface};\n --sg-surface2: ${colors.surface2 || colors.surface};\n --sg-surface3: ${colors.surface3 || colors.surface2 || colors.surface};\n --sg-overlay: ${colors.overlay || \"rgba(0, 0, 0, 0.5)\"};\n --sg-border: ${colors.border};\n --sg-border-hover: ${colors.borderHover || colors.border};\n --sg-text: ${colors.text};\n --sg-muted-text: ${colors.mutedText};\n --sg-inverted-text: ${colors.invertedText || \"#ffffff\"};\n --sg-primary: ${colors.primary};\n --sg-primary-hover: ${colors.primaryHover || colors.primary};\n --sg-primary-text: ${colors.primaryText};\n --sg-secondary: ${colors.secondary};\n --sg-secondary-hover: ${colors.secondaryHover || colors.secondary};\n --sg-accent: ${colors.accent};\n --sg-accent-hover: ${colors.accentHover || colors.accent};\n --sg-ring: ${colors.ring};\n --sg-link: ${colors.link || colors.primary};\n --sg-link-hover: ${colors.linkHover || colors.primary};\n --sg-link-color: ${colors.linkColor || colors.link || colors.primary};\n --sg-menu-link-color: ${colors.menuLinkColor || colors.primary};\n --sg-input-bg: ${colors.inputBg || colors.bg};\n --sg-input-border: ${colors.inputBorder || colors.border};\n --sg-input-focus: ${colors.inputFocus || colors.ring};\n --sg-success: ${colors.success || \"#10b981\"};\n --sg-success-light: ${colors.successLight || \"#d1fae5\"};\n --sg-warning: ${colors.warning || \"#f59e0b\"};\n --sg-warning-light: ${colors.warningLight || \"#fef3c7\"};\n --sg-danger: ${colors.danger || \"#ef4444\"};\n --sg-danger-light: ${colors.dangerLight || \"#fee2e2\"};\n --sg-info: ${colors.info || \"#3b82f6\"};\n --sg-info-light: ${colors.infoLight || \"#dbeafe\"};\n --sg-gradient: ${gradientCss};\n \n /* ===== RADIUS ===== */\n --sg-radius: ${radius};\n --sg-radius-sm: ${radiusScaleMap.sm};\n --sg-radius-md: ${radiusScaleMap.md};\n --sg-radius-lg: ${radiusScaleMap.lg};\n --sg-radius-xl: ${radiusScaleMap.xl};\n --sg-radius-pill: ${radiusScaleMap.pill};\n \n /* ===== SHADOW ===== */\n --sg-shadow: ${shadow};\n --sg-shadow-soft: ${shadowScaleMap.soft};\n --sg-shadow-md: ${shadowScaleMap.md};\n --sg-shadow-strong: ${shadowScaleMap.strong};\n --sg-shadow-glow: ${shadowScaleMap.glow};\n \n /* ===== SPACING ===== */\n --sg-spacing-xs: ${spacing.xs};\n --sg-spacing-sm: ${spacing.sm};\n --sg-spacing-md: ${spacing.md};\n --sg-spacing-lg: ${spacing.lg};\n --sg-spacing-xl: ${spacing.xl};\n --sg-spacing-2xl: ${spacing[\"2xl\"]};\n \n /* ===== TYPOGRAPHY ===== */\n --sg-font-heading: ${typography.fontFamily.heading};\n --sg-font-body: ${typography.fontFamily.body};\n --sg-font-mono: ${typography.fontFamily.mono || \"ui-monospace, monospace\"};\n --sg-font-accent: ${typography.fontFamily.accent || typography.fontFamily.heading};\n --sg-font-size-base: ${typography.baseSize};\n --sg-heading-h1: ${typography.headingScale.h1};\n --sg-heading-h2: ${typography.headingScale.h2};\n --sg-heading-h3: ${typography.headingScale.h3};\n --sg-heading-h4: ${typography.headingScale.h4};\n --sg-heading-h5: ${typography.headingScale.h5};\n --sg-heading-h6: ${typography.headingScale.h6};\n --sg-font-weight-light: ${typography.fontWeight?.light || 300};\n --sg-font-weight-normal: ${typography.fontWeight?.normal || 400};\n --sg-font-weight-medium: ${typography.fontWeight?.medium || 500};\n --sg-font-weight-semibold: ${typography.fontWeight?.semibold || 600};\n --sg-font-weight-bold: ${typography.fontWeight?.bold || 700};\n --sg-line-height-tight: ${typography.lineHeight?.tight || \"1.25\"};\n --sg-line-height-normal: ${typography.lineHeight?.normal || \"1.5\"};\n --sg-line-height-relaxed: ${typography.lineHeight?.relaxed || \"1.75\"};\n --sg-letter-spacing-tight: ${typography.letterSpacing?.tight || \"-0.025em\"};\n --sg-letter-spacing-normal: ${typography.letterSpacing?.normal || \"0\"};\n --sg-letter-spacing-wide: ${typography.letterSpacing?.wide || \"0.025em\"};\n \n /* ===== EFFECTS ===== */\n --sg-blur-sm: ${fx.blur?.sm || \"4px\"};\n --sg-blur-md: ${fx.blur?.md || \"8px\"};\n --sg-blur-lg: ${fx.blur?.lg || \"16px\"};\n --sg-blur-xl: ${fx.blur?.xl || \"24px\"};\n --sg-opacity-overlay: ${fx.opacity?.overlay || 0.5};\n --sg-opacity-disabled: ${fx.opacity?.disabled || 0.5};\n --sg-opacity-muted: ${fx.opacity?.muted || 0.7};\n --sg-transition-fast: ${fx.transition?.fast || \"150ms ease\"};\n --sg-transition-normal: ${fx.transition?.normal || \"300ms ease\"};\n --sg-transition-slow: ${fx.transition?.slow || \"500ms ease\"};\n --sg-animation-duration: ${fx.animation?.duration || \"300ms\"};\n --sg-animation-easing: ${fx.animation?.easing || \"cubic-bezier(0.4, 0, 0.2, 1)\"};\n \n /* ===== LAYOUT ===== */\n --sg-max-width-sm: ${lay.maxWidth?.sm || \"640px\"};\n --sg-max-width-md: ${lay.maxWidth?.md || \"768px\"};\n --sg-max-width-lg: ${lay.maxWidth?.lg || \"1024px\"};\n --sg-max-width-xl: ${lay.maxWidth?.xl || \"1280px\"};\n --sg-max-width-2xl: ${lay.maxWidth?.[\"2xl\"] || \"1536px\"};\n --sg-section-padding-sm: ${lay.sectionPadding?.sm || \"2rem 0\"};\n --sg-section-padding-md: ${lay.sectionPadding?.md || \"4rem 0\"};\n --sg-section-padding-lg: ${lay.sectionPadding?.lg || \"6rem 0\"};\n --sg-container-padding: ${lay.containerPadding || \"1rem\"};\n \n /* ===== COMPONENT TOKENS ===== */\n --sg-button-radius: ${comp.button?.borderRadius || \"0.5rem\"};\n --sg-button-font-weight: ${comp.button?.fontWeight || \"500\"};\n --sg-button-padding-sm: ${comp.button?.paddingSm || \"0.5rem 1rem\"};\n --sg-button-padding-md: ${comp.button?.paddingMd || \"0.625rem 1.25rem\"};\n --sg-button-padding-lg: ${comp.button?.paddingLg || \"0.75rem 1.5rem\"};\n --sg-card-radius: ${comp.card?.borderRadius || \"0.75rem\"};\n --sg-card-padding: ${comp.card?.padding || \"1.5rem\"};\n --sg-card-shadow: ${comp.card?.shadow || shadowScaleMap.md};\n --sg-input-radius: ${comp.input?.borderRadius || \"0.5rem\"};\n --sg-input-padding: ${comp.input?.padding || \"0.625rem 0.875rem\"};\n --sg-input-border-width: ${comp.input?.borderWidth || \"1px\"};\n --sg-badge-radius: ${comp.badge?.borderRadius || \"9999px\"};\n --sg-badge-padding: ${comp.badge?.padding || \"0.25rem 0.75rem\"};\n --sg-badge-font-size: ${comp.badge?.fontSize || \"0.75rem\"};\n --sg-avatar-sm: ${comp.avatar?.sizeSm || \"2rem\"};\n --sg-avatar-md: ${comp.avatar?.sizeMd || \"2.5rem\"};\n --sg-avatar-lg: ${comp.avatar?.sizeLg || \"3rem\"};\n --sg-avatar-xl: ${comp.avatar?.sizeXl || \"4rem\"};\n }\n `.trim();\n}\n\n// ============================================================================\n// TEMA PADRÃO\n// ============================================================================\n\n/**\n * Theme tokens padrão (Light Modern)\n */\nexport const defaultThemeTokens: ThemeTokens = {\n colors: {\n bg: \"#ffffff\",\n surface: \"#f9fafb\",\n surface2: \"#f3f4f6\",\n surface3: \"#e5e7eb\",\n overlay: \"rgba(0, 0, 0, 0.5)\",\n border: \"#e5e7eb\",\n borderHover: \"#d1d5db\",\n text: \"#1f2937\",\n mutedText: \"#6b7280\",\n invertedText: \"#ffffff\",\n primary: \"#3b82f6\",\n primaryHover: \"#2563eb\",\n primaryText: \"#ffffff\",\n secondary: \"#6b7280\",\n secondaryHover: \"#4b5563\",\n accent: \"#8b5cf6\",\n accentHover: \"#7c3aed\",\n ring: \"#3b82f6\",\n link: \"#3b82f6\",\n linkHover: \"#2563eb\",\n linkColor: \"#1e40af\", // Azul mais escuro para contraste em fundo claro\n menuLinkColor: \"#2563eb\", // Links do menu - tom do primary mais escuro\n inputBg: \"#ffffff\",\n inputBorder: \"#d1d5db\",\n inputFocus: \"#3b82f6\",\n success: \"#10b981\",\n successLight: \"#d1fae5\",\n warning: \"#f59e0b\",\n warningLight: \"#fef3c7\",\n danger: \"#ef4444\",\n dangerLight: \"#fee2e2\",\n info: \"#3b82f6\",\n infoLight: \"#dbeafe\",\n },\n radiusScale: \"md\",\n shadowScale: \"soft\",\n spacingScale: \"normal\",\n motion: \"subtle\",\n backgroundStyle: \"flat\",\n typography: {\n fontFamily: {\n heading: \"system-ui, -apple-system, sans-serif\",\n body: \"system-ui, -apple-system, sans-serif\",\n mono: \"ui-monospace, SFMono-Regular, monospace\",\n },\n baseSize: \"16px\",\n headingScale: {\n h1: \"3rem\",\n h2: \"2.25rem\",\n h3: \"1.875rem\",\n h4: \"1.5rem\",\n h5: \"1.25rem\",\n h6: \"1rem\",\n },\n fontWeight: {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n },\n lineHeight: {\n tight: \"1.25\",\n normal: \"1.5\",\n relaxed: \"1.75\",\n },\n letterSpacing: {\n tighter: \"-0.05em\",\n tight: \"-0.025em\",\n normal: \"0\",\n wide: \"0.025em\",\n wider: \"0.05em\",\n },\n },\n effects: defaultEffectTokens,\n layout: defaultLayoutTokens,\n components: defaultComponentTokens,\n};\n\n// ============================================================================\n// PRESETS DE TEMAS\n// ============================================================================\n\n/**\n * Tema Dark Modern\n */\nexport const darkThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n colors: {\n bg: \"#0a0a0a\",\n surface: \"#171717\",\n surface2: \"#262626\",\n surface3: \"#404040\",\n overlay: \"rgba(0, 0, 0, 0.7)\",\n border: \"#404040\",\n borderHover: \"#525252\",\n text: \"#fafafa\",\n mutedText: \"#a3a3a3\",\n invertedText: \"#0a0a0a\",\n primary: \"#3b82f6\",\n primaryHover: \"#60a5fa\",\n primaryText: \"#ffffff\",\n secondary: \"#737373\",\n secondaryHover: \"#a3a3a3\",\n accent: \"#a78bfa\",\n accentHover: \"#c4b5fd\",\n ring: \"#3b82f6\",\n link: \"#60a5fa\",\n linkHover: \"#93c5fd\",\n linkColor: \"#93c5fd\", // Azul claro para contraste em fundo escuro\n menuLinkColor: \"#93c5fd\", // Links do menu - tom do primary mais claro\n inputBg: \"#171717\",\n inputBorder: \"#404040\",\n inputFocus: \"#3b82f6\",\n success: \"#34d399\",\n successLight: \"#064e3b\",\n warning: \"#fbbf24\",\n warningLight: \"#78350f\",\n danger: \"#f87171\",\n dangerLight: \"#7f1d1d\",\n info: \"#60a5fa\",\n infoLight: \"#1e3a8a\",\n },\n};\n\n/**\n * Tema Gradient (com gradiente de fundo)\n */\nexport const gradientThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n backgroundStyle: \"gradient\",\n colors: {\n ...defaultThemeTokens.colors,\n gradient: {\n start: \"#667eea\",\n middle: \"#764ba2\",\n end: \"#f093fb\",\n direction: \"to-br\",\n },\n },\n};\n\n/**\n * Tema Corporate (profissional)\n */\nexport const corporateThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n radiusScale: \"sm\",\n shadowScale: \"soft\",\n colors: {\n ...defaultThemeTokens.colors,\n primary: \"#1e40af\",\n primaryHover: \"#1e3a8a\",\n accent: \"#0ea5e9\",\n accentHover: \"#0284c7\",\n },\n typography: {\n ...defaultThemeTokens.typography,\n fontFamily: {\n heading: \"Inter, system-ui, sans-serif\",\n body: \"Inter, system-ui, sans-serif\",\n mono: \"ui-monospace, monospace\",\n },\n },\n};\n\n/**\n * Tema Playful (vibrante)\n */\nexport const playfulThemeTokens: ThemeTokens = {\n ...defaultThemeTokens,\n radiusScale: \"lg\",\n shadowScale: \"md\",\n colors: {\n ...defaultThemeTokens.colors,\n primary: \"#ec4899\",\n primaryHover: \"#db2777\",\n accent: \"#f59e0b\",\n accentHover: \"#d97706\",\n success: \"#22c55e\",\n },\n typography: {\n ...defaultThemeTokens.typography,\n fontFamily: {\n heading: \"Poppins, system-ui, sans-serif\",\n body: \"Inter, system-ui, sans-serif\",\n mono: \"ui-monospace, monospace\",\n },\n },\n};\n"],"names":["radiusScaleMap","shadowScaleMap","spacingScaleMap","gradientDirectionMap","defaultEffectTokens","defaultLayoutTokens","defaultComponentTokens","generateThemeCSSVariables","tokens","t","defaultThemeTokens","colors","radiusScale","shadowScale","spacingScale","typography","effects","layout","components","radius","shadow","spacing","fx","lay","comp","gradientCss","darkThemeTokens","gradientThemeTokens","corporateThemeTokens","playfulThemeTokens"],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Carousel Animation CSS Generator
|
|
3
|
+
* Gera CSS keyframes para crossfade de N imagens (puro CSS, sem JS)
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Gera CSS completo para um carrossel de crossfade com N imagens + indicadores (dots).
|
|
7
|
+
*
|
|
8
|
+
* Fórmula:
|
|
9
|
+
* - Ciclo total = N × intervalSeconds
|
|
10
|
+
* - Cada imagem: fade in → hold → fade out, escalonada por animation-delay: i * T
|
|
11
|
+
* - Primeira imagem começa com opacity: 1 inline (visível antes do CSS carregar)
|
|
12
|
+
* - Dots seguem a mesma animação para indicar o slide ativo
|
|
13
|
+
*
|
|
14
|
+
* @param scopeSelector - Seletor CSS para escopo (ex: "#hero-carousel-abc")
|
|
15
|
+
* @param imageCount - Número de imagens no carrossel (mín 2)
|
|
16
|
+
* @param intervalSeconds - Duração de exibição de cada imagem em segundos
|
|
17
|
+
* @returns String CSS com keyframes e estilos das imagens e dots
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateCarouselCSS(scopeSelector: string, imageCount: number, intervalSeconds?: number): string;
|
|
20
|
+
//# sourceMappingURL=carouselAnimation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carouselAnimation.d.ts","sourceRoot":"","sources":["../../../src/engine/shared/carouselAnimation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CACjC,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,GAAE,MAAU,GAC1B,MAAM,CA8ER"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
function u(a, o, i = 5) {
|
|
2
|
+
if (o < 2) return "";
|
|
3
|
+
const n = o * i, t = 10 / o, e = 100 / o - t * 2, c = `
|
|
4
|
+
@keyframes sg-carousel-fade {
|
|
5
|
+
0% { opacity: 0; }
|
|
6
|
+
${t.toFixed(1)}% { opacity: 1; }
|
|
7
|
+
${(t + e).toFixed(1)}% { opacity: 1; }
|
|
8
|
+
${(t * 2 + e).toFixed(1)}% { opacity: 0; }
|
|
9
|
+
100% { opacity: 0; }
|
|
10
|
+
}`, d = `
|
|
11
|
+
@keyframes sg-carousel-dot-active {
|
|
12
|
+
0% { opacity: 0.4; transform: scale(1); }
|
|
13
|
+
${t.toFixed(1)}% { opacity: 1; transform: scale(1); }
|
|
14
|
+
${(t + e).toFixed(1)}% { opacity: 1; transform: scale(1); }
|
|
15
|
+
${(t * 2 + e).toFixed(1)}% { opacity: 0.4; transform: scale(1); }
|
|
16
|
+
100% { opacity: 0.4; transform: scale(1); }
|
|
17
|
+
}`, l = `
|
|
18
|
+
${a} .sg-carousel__img {
|
|
19
|
+
position: absolute;
|
|
20
|
+
inset: 0;
|
|
21
|
+
width: 100%;
|
|
22
|
+
height: 100%;
|
|
23
|
+
object-fit: cover;
|
|
24
|
+
opacity: 0;
|
|
25
|
+
animation: sg-carousel-fade ${n}s infinite;
|
|
26
|
+
}`, y = `
|
|
27
|
+
${a} .sg-carousel__dots {
|
|
28
|
+
position: absolute;
|
|
29
|
+
bottom: 1.5rem;
|
|
30
|
+
left: 50%;
|
|
31
|
+
transform: translateX(-50%);
|
|
32
|
+
display: flex;
|
|
33
|
+
gap: 0.5rem;
|
|
34
|
+
z-index: 3;
|
|
35
|
+
}
|
|
36
|
+
${a} .sg-carousel__dot {
|
|
37
|
+
width: 10px;
|
|
38
|
+
height: 10px;
|
|
39
|
+
border-radius: 50%;
|
|
40
|
+
background: rgba(255, 255, 255, 0.9);
|
|
41
|
+
border: none;
|
|
42
|
+
padding: 0;
|
|
43
|
+
cursor: default;
|
|
44
|
+
opacity: 0.4;
|
|
45
|
+
transition: opacity 0.3s;
|
|
46
|
+
animation: sg-carousel-dot-active ${n}s infinite;
|
|
47
|
+
}`, $ = Array.from({ length: o }, (p, s) => {
|
|
48
|
+
const r = s * i, f = `${a} .sg-carousel__img:nth-child(${s + 1}) { animation-delay: ${r}s;${s === 0 ? " opacity: 1;" : ""} }`, m = `${a} .sg-carousel__dot:nth-child(${s + 1}) { animation-delay: ${r}s;${s === 0 ? " opacity: 1;" : ""} }`;
|
|
49
|
+
return `${f}
|
|
50
|
+
${m}`;
|
|
51
|
+
}).join(`
|
|
52
|
+
`);
|
|
53
|
+
return `${c}
|
|
54
|
+
${d}
|
|
55
|
+
${l}
|
|
56
|
+
${y}
|
|
57
|
+
${$}`;
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
u as generateCarouselCSS
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=carouselAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"carouselAnimation.js","sources":["../../../src/engine/shared/carouselAnimation.ts"],"sourcesContent":["/**\n * Carousel Animation CSS Generator\n * Gera CSS keyframes para crossfade de N imagens (puro CSS, sem JS)\n */\n\n/**\n * Gera CSS completo para um carrossel de crossfade com N imagens + indicadores (dots).\n *\n * Fórmula:\n * - Ciclo total = N × intervalSeconds\n * - Cada imagem: fade in → hold → fade out, escalonada por animation-delay: i * T\n * - Primeira imagem começa com opacity: 1 inline (visível antes do CSS carregar)\n * - Dots seguem a mesma animação para indicar o slide ativo\n *\n * @param scopeSelector - Seletor CSS para escopo (ex: \"#hero-carousel-abc\")\n * @param imageCount - Número de imagens no carrossel (mín 2)\n * @param intervalSeconds - Duração de exibição de cada imagem em segundos\n * @returns String CSS com keyframes e estilos das imagens e dots\n */\nexport function generateCarouselCSS(\n scopeSelector: string,\n imageCount: number,\n intervalSeconds: number = 5,\n): string {\n if (imageCount < 2) return \"\";\n\n const totalDuration = imageCount * intervalSeconds;\n\n // Percentuais para a animação de cada imagem:\n // fadeIn: 0% → holdStart\n // hold: holdStart → holdEnd\n // fadeOut: holdEnd → fadeOutEnd\n // invisible: fadeOutEnd → 100%\n const fadePercent = 10 / imageCount; // ~fade in/out como % do ciclo\n const holdPercent = (100 / imageCount) - (fadePercent * 2);\n\n // Image crossfade keyframes\n const imageKeyframes = `\n@keyframes sg-carousel-fade {\n 0% { opacity: 0; }\n ${fadePercent.toFixed(1)}% { opacity: 1; }\n ${(fadePercent + holdPercent).toFixed(1)}% { opacity: 1; }\n ${(fadePercent * 2 + holdPercent).toFixed(1)}% { opacity: 0; }\n 100% { opacity: 0; }\n}`;\n\n // Dot indicator keyframes (active = bright/scaled, inactive = dim)\n const dotKeyframes = `\n@keyframes sg-carousel-dot-active {\n 0% { opacity: 0.4; transform: scale(1); }\n ${fadePercent.toFixed(1)}% { opacity: 1; transform: scale(1); }\n ${(fadePercent + holdPercent).toFixed(1)}% { opacity: 1; transform: scale(1); }\n ${(fadePercent * 2 + holdPercent).toFixed(1)}% { opacity: 0.4; transform: scale(1); }\n 100% { opacity: 0.4; transform: scale(1); }\n}`;\n\n // Image styles: all stacked with position absolute\n const imageStyles = `\n${scopeSelector} .sg-carousel__img {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: cover;\n opacity: 0;\n animation: sg-carousel-fade ${totalDuration}s infinite;\n}`;\n\n // Dot container styles\n const dotContainerStyles = `\n${scopeSelector} .sg-carousel__dots {\n position: absolute;\n bottom: 1.5rem;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n gap: 0.5rem;\n z-index: 3;\n}\n${scopeSelector} .sg-carousel__dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: rgba(255, 255, 255, 0.9);\n border: none;\n padding: 0;\n cursor: default;\n opacity: 0.4;\n transition: opacity 0.3s;\n animation: sg-carousel-dot-active ${totalDuration}s infinite;\n}`;\n\n // Staggered delays for images and dots\n const delays = Array.from({ length: imageCount }, (_, i) => {\n const delay = i * intervalSeconds;\n const imgRule = `${scopeSelector} .sg-carousel__img:nth-child(${i + 1}) { animation-delay: ${delay}s;${i === 0 ? \" opacity: 1;\" : \"\"} }`;\n const dotRule = `${scopeSelector} .sg-carousel__dot:nth-child(${i + 1}) { animation-delay: ${delay}s;${i === 0 ? \" opacity: 1;\" : \"\"} }`;\n return `${imgRule}\\n${dotRule}`;\n }).join(\"\\n\");\n\n return `${imageKeyframes}\\n${dotKeyframes}\\n${imageStyles}\\n${dotContainerStyles}\\n${delays}`;\n}\n"],"names":["generateCarouselCSS","scopeSelector","imageCount","intervalSeconds","totalDuration","fadePercent","holdPercent","imageKeyframes","dotKeyframes","imageStyles","dotContainerStyles","delays","_","i","delay","imgRule","dotRule"],"mappings":"AAmBO,SAASA,EACdC,GACAC,GACAC,IAA0B,GAClB;AACR,MAAID,IAAa,EAAG,QAAO;AAE3B,QAAME,IAAgBF,IAAaC,GAO7BE,IAAc,KAAKH,GACnBI,IAAe,MAAMJ,IAAeG,IAAc,GAGlDE,IAAiB;AAAA;AAAA;AAAA,IAGrBF,EAAY,QAAQ,CAAC,CAAC;AAAA,KACrBA,IAAcC,GAAa,QAAQ,CAAC,CAAC;AAAA,KACrCD,IAAc,IAAIC,GAAa,QAAQ,CAAC,CAAC;AAAA;AAAA,IAKtCE,IAAe;AAAA;AAAA;AAAA,IAGnBH,EAAY,QAAQ,CAAC,CAAC;AAAA,KACrBA,IAAcC,GAAa,QAAQ,CAAC,CAAC;AAAA,KACrCD,IAAc,IAAIC,GAAa,QAAQ,CAAC,CAAC;AAAA;AAAA,IAKtCG,IAAc;AAAA,EACpBR,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gCAOiBG,CAAa;AAAA,IAIrCM,IAAqB;AAAA,EAC3BT,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASbA,CAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAUuBG,CAAa;AAAA,IAI3CO,IAAS,MAAM,KAAK,EAAE,QAAQT,EAAA,GAAc,CAACU,GAAGC,MAAM;AAC1D,UAAMC,IAAQD,IAAIV,GACZY,IAAU,GAAGd,CAAa,gCAAgCY,IAAI,CAAC,wBAAwBC,CAAK,KAAKD,MAAM,IAAI,iBAAiB,EAAE,MAC9HG,IAAU,GAAGf,CAAa,gCAAgCY,IAAI,CAAC,wBAAwBC,CAAK,KAAKD,MAAM,IAAI,iBAAiB,EAAE;AACpI,WAAO,GAAGE,CAAO;AAAA,EAAKC,CAAO;AAAA,EAC/B,CAAC,EAAE,KAAK;AAAA,CAAI;AAEZ,SAAO,GAAGT,CAAc;AAAA,EAAKC,CAAY;AAAA,EAAKC,CAAW;AAAA,EAAKC,CAAkB;AAAA,EAAKC,CAAM;AAC7F;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const
|
|
1
|
+
const o = {
|
|
2
2
|
/**
|
|
3
3
|
* Single: 1 imagem ocupando toda a grid
|
|
4
4
|
* ┌───────────────────┐
|
|
@@ -136,7 +136,7 @@ const r = {
|
|
|
136
136
|
name: "4 Iguais",
|
|
137
137
|
icon: "▚▞"
|
|
138
138
|
}
|
|
139
|
-
},
|
|
139
|
+
}, r = [
|
|
140
140
|
"single",
|
|
141
141
|
"two-horizontal",
|
|
142
142
|
"two-vertical",
|
|
@@ -145,16 +145,8 @@ const r = {
|
|
|
145
145
|
"three-top",
|
|
146
146
|
"four-equal"
|
|
147
147
|
];
|
|
148
|
-
function t(o) {
|
|
149
|
-
return r[o];
|
|
150
|
-
}
|
|
151
|
-
function i(o) {
|
|
152
|
-
return r[o].maxImages;
|
|
153
|
-
}
|
|
154
148
|
export {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
r as gridPresetMap,
|
|
158
|
-
e as imageGridPresetIds
|
|
149
|
+
o as gridPresetMap,
|
|
150
|
+
r as imageGridPresetIds
|
|
159
151
|
};
|
|
160
152
|
//# sourceMappingURL=presets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.js","sources":["../../../../src/engine/shared/imageGrid/presets.ts"],"sourcesContent":["/**\n * Image Grid Presets\n * Configurações de layout para cada preset da grid de imagens\n */\n\nimport type { ImageGridPreset, GridPresetConfig } from \"./types\";\n\n/**\n * Mapeamento de presets para configurações de CSS Grid\n *\n * Cada preset define:\n * - gridTemplate: Template do grid CSS\n * - positions: Posições de cada imagem no grid\n * - maxImages: Número máximo de imagens\n * - name: Nome para exibição\n * - icon: Representação visual simplificada\n */\nexport const gridPresetMap: Record<ImageGridPreset, GridPresetConfig> = {\n /**\n * Single: 1 imagem ocupando toda a grid\n * ┌───────────────────┐\n * │ │\n * │ Img 1 (2x2) │\n * │ │\n * └───────────────────┘\n */\n single: {\n gridTemplate: \"1fr / 1fr\",\n positions: [{ col: \"1 / -1\", row: \"1 / -1\" }],\n maxImages: 1,\n name: \"Única\",\n icon: \"■\",\n },\n\n /**\n * Two Horizontal: 2 imagens lado a lado\n * ┌─────────┬─────────┐\n * │ │ │\n * │ Img 1 │ Img 2 │\n * │ │ │\n * └─────────┴─────────┘\n */\n \"two-horizontal\": {\n gridTemplate: \"1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / -1\" },\n { col: \"2 / 3\", row: \"1 / -1\" },\n ],\n maxImages: 2,\n name: \"2 Horizontal\",\n icon: \"▌▐\",\n },\n\n /**\n * Two Vertical: 2 imagens empilhadas\n * ┌───────────────────┐\n * │ Img 1 │\n * ├───────────────────┤\n * │ Img 2 │\n * └───────────────────┘\n */\n \"two-vertical\": {\n gridTemplate: \"1fr 1fr / 1fr\",\n positions: [\n { col: \"1 / -1\", row: \"1 / 2\" },\n { col: \"1 / -1\", row: \"2 / 3\" },\n ],\n maxImages: 2,\n name: \"2 Vertical\",\n icon: \"▀▄\",\n },\n\n /**\n * Three Left: 1 grande à esquerda + 2 pequenas à direita\n * ┌─────────┬─────────┐\n * │ │ Img 2 │\n * │ Img 1 ├─────────┤\n * │ (1x2) │ Img 3 │\n * └─────────┴─────────┘\n */\n \"three-left\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / 3\" }, // Grande esquerda\n { col: \"2 / 3\", row: \"1 / 2\" }, // Pequena superior direita\n { col: \"2 / 3\", row: \"2 / 3\" }, // Pequena inferior direita\n ],\n maxImages: 3,\n name: \"3 Esquerda\",\n icon: \"█▐\",\n },\n\n /**\n * Three Right: 2 pequenas à esquerda + 1 grande à direita\n * ┌─────────┬─────────┐\n * │ Img 1 │ │\n * ├─────────┤ Img 3 │\n * │ Img 2 │ (1x2) │\n * └─────────┴─────────┘\n */\n \"three-right\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / 2\" }, // Pequena superior esquerda\n { col: \"1 / 2\", row: \"2 / 3\" }, // Pequena inferior esquerda\n { col: \"2 / 3\", row: \"1 / 3\" }, // Grande direita\n ],\n maxImages: 3,\n name: \"3 Direita\",\n icon: \"▌█\",\n },\n\n /**\n * Three Top: 1 grande no topo + 2 pequenas embaixo\n * ┌───────────────────┐\n * │ Img 1 (2x1) │\n * ├─────────┬─────────┤\n * │ Img 2 │ Img 3 │\n * └─────────┴─────────┘\n */\n \"three-top\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 3\", row: \"1 / 2\" }, // Grande topo\n { col: \"1 / 2\", row: \"2 / 3\" }, // Pequena inferior esquerda\n { col: \"2 / 3\", row: \"2 / 3\" }, // Pequena inferior direita\n ],\n maxImages: 3,\n name: \"3 Topo\",\n icon: \"▀▀\",\n },\n\n /**\n * Four Equal: 4 imagens iguais (2x2)\n * ┌─────────┬─────────┐\n * │ Img 1 │ Img 2 │\n * ├─────────┼─────────┤\n * │ Img 3 │ Img 4 │\n * └─────────┴─────────┘\n */\n \"four-equal\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / 2\" },\n { col: \"2 / 3\", row: \"1 / 2\" },\n { col: \"1 / 2\", row: \"2 / 3\" },\n { col: \"2 / 3\", row: \"2 / 3\" },\n ],\n maxImages: 4,\n name: \"4 Iguais\",\n icon: \"▚▞\",\n },\n};\n\n/**\n * Lista ordenada de presets para exibição no seletor\n */\nexport const imageGridPresetIds: ImageGridPreset[] = [\n \"single\",\n \"two-horizontal\",\n \"two-vertical\",\n \"three-left\",\n \"three-right\",\n \"three-top\",\n \"four-equal\",\n];\n\n/**\n * Obtém a configuração de um preset\n */\nexport function getGridPresetConfig(preset: ImageGridPreset): GridPresetConfig {\n return gridPresetMap[preset];\n}\n\n/**\n * Obtém o número máximo de imagens para um preset\n */\nexport function getMaxImagesForPreset(preset: ImageGridPreset): number {\n return gridPresetMap[preset].maxImages;\n}\n"],"names":["gridPresetMap","imageGridPresetIds"
|
|
1
|
+
{"version":3,"file":"presets.js","sources":["../../../../src/engine/shared/imageGrid/presets.ts"],"sourcesContent":["/**\n * Image Grid Presets\n * Configurações de layout para cada preset da grid de imagens\n */\n\nimport type { ImageGridPreset, GridPresetConfig } from \"./types\";\n\n/**\n * Mapeamento de presets para configurações de CSS Grid\n *\n * Cada preset define:\n * - gridTemplate: Template do grid CSS\n * - positions: Posições de cada imagem no grid\n * - maxImages: Número máximo de imagens\n * - name: Nome para exibição\n * - icon: Representação visual simplificada\n */\nexport const gridPresetMap: Record<ImageGridPreset, GridPresetConfig> = {\n /**\n * Single: 1 imagem ocupando toda a grid\n * ┌───────────────────┐\n * │ │\n * │ Img 1 (2x2) │\n * │ │\n * └───────────────────┘\n */\n single: {\n gridTemplate: \"1fr / 1fr\",\n positions: [{ col: \"1 / -1\", row: \"1 / -1\" }],\n maxImages: 1,\n name: \"Única\",\n icon: \"■\",\n },\n\n /**\n * Two Horizontal: 2 imagens lado a lado\n * ┌─────────┬─────────┐\n * │ │ │\n * │ Img 1 │ Img 2 │\n * │ │ │\n * └─────────┴─────────┘\n */\n \"two-horizontal\": {\n gridTemplate: \"1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / -1\" },\n { col: \"2 / 3\", row: \"1 / -1\" },\n ],\n maxImages: 2,\n name: \"2 Horizontal\",\n icon: \"▌▐\",\n },\n\n /**\n * Two Vertical: 2 imagens empilhadas\n * ┌───────────────────┐\n * │ Img 1 │\n * ├───────────────────┤\n * │ Img 2 │\n * └───────────────────┘\n */\n \"two-vertical\": {\n gridTemplate: \"1fr 1fr / 1fr\",\n positions: [\n { col: \"1 / -1\", row: \"1 / 2\" },\n { col: \"1 / -1\", row: \"2 / 3\" },\n ],\n maxImages: 2,\n name: \"2 Vertical\",\n icon: \"▀▄\",\n },\n\n /**\n * Three Left: 1 grande à esquerda + 2 pequenas à direita\n * ┌─────────┬─────────┐\n * │ │ Img 2 │\n * │ Img 1 ├─────────┤\n * │ (1x2) │ Img 3 │\n * └─────────┴─────────┘\n */\n \"three-left\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / 3\" }, // Grande esquerda\n { col: \"2 / 3\", row: \"1 / 2\" }, // Pequena superior direita\n { col: \"2 / 3\", row: \"2 / 3\" }, // Pequena inferior direita\n ],\n maxImages: 3,\n name: \"3 Esquerda\",\n icon: \"█▐\",\n },\n\n /**\n * Three Right: 2 pequenas à esquerda + 1 grande à direita\n * ┌─────────┬─────────┐\n * │ Img 1 │ │\n * ├─────────┤ Img 3 │\n * │ Img 2 │ (1x2) │\n * └─────────┴─────────┘\n */\n \"three-right\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / 2\" }, // Pequena superior esquerda\n { col: \"1 / 2\", row: \"2 / 3\" }, // Pequena inferior esquerda\n { col: \"2 / 3\", row: \"1 / 3\" }, // Grande direita\n ],\n maxImages: 3,\n name: \"3 Direita\",\n icon: \"▌█\",\n },\n\n /**\n * Three Top: 1 grande no topo + 2 pequenas embaixo\n * ┌───────────────────┐\n * │ Img 1 (2x1) │\n * ├─────────┬─────────┤\n * │ Img 2 │ Img 3 │\n * └─────────┴─────────┘\n */\n \"three-top\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 3\", row: \"1 / 2\" }, // Grande topo\n { col: \"1 / 2\", row: \"2 / 3\" }, // Pequena inferior esquerda\n { col: \"2 / 3\", row: \"2 / 3\" }, // Pequena inferior direita\n ],\n maxImages: 3,\n name: \"3 Topo\",\n icon: \"▀▀\",\n },\n\n /**\n * Four Equal: 4 imagens iguais (2x2)\n * ┌─────────┬─────────┐\n * │ Img 1 │ Img 2 │\n * ├─────────┼─────────┤\n * │ Img 3 │ Img 4 │\n * └─────────┴─────────┘\n */\n \"four-equal\": {\n gridTemplate: \"1fr 1fr / 1fr 1fr\",\n positions: [\n { col: \"1 / 2\", row: \"1 / 2\" },\n { col: \"2 / 3\", row: \"1 / 2\" },\n { col: \"1 / 2\", row: \"2 / 3\" },\n { col: \"2 / 3\", row: \"2 / 3\" },\n ],\n maxImages: 4,\n name: \"4 Iguais\",\n icon: \"▚▞\",\n },\n};\n\n/**\n * Lista ordenada de presets para exibição no seletor\n */\nexport const imageGridPresetIds: ImageGridPreset[] = [\n \"single\",\n \"two-horizontal\",\n \"two-vertical\",\n \"three-left\",\n \"three-right\",\n \"three-top\",\n \"four-equal\",\n];\n\n/**\n * Obtém a configuração de um preset\n */\nexport function getGridPresetConfig(preset: ImageGridPreset): GridPresetConfig {\n return gridPresetMap[preset];\n}\n\n/**\n * Obtém o número máximo de imagens para um preset\n */\nexport function getMaxImagesForPreset(preset: ImageGridPreset): number {\n return gridPresetMap[preset].maxImages;\n}\n"],"names":["gridPresetMap","imageGridPresetIds"],"mappings":"AAiBO,MAAMA,IAA2D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAStE,QAAQ;AAAA,IACN,cAAc;AAAA,IACd,WAAW,CAAC,EAAE,KAAK,UAAU,KAAK,UAAU;AAAA,IAC5C,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,kBAAkB;AAAA,IAChB,cAAc;AAAA,IACd,WAAW;AAAA,MACT,EAAE,KAAK,SAAS,KAAK,SAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,SAAA;AAAA,IAAS;AAAA,IAEhC,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,gBAAgB;AAAA,IACd,cAAc;AAAA,IACd,WAAW;AAAA,MACT,EAAE,KAAK,UAAU,KAAK,QAAA;AAAA,MACtB,EAAE,KAAK,UAAU,KAAK,QAAA;AAAA,IAAQ;AAAA,IAEhC,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,cAAc;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,MACT,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,IAAQ;AAAA,IAE/B,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,eAAe;AAAA,IACb,cAAc;AAAA,IACd,WAAW;AAAA,MACT,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,IAAQ;AAAA,IAE/B,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,aAAa;AAAA,IACX,cAAc;AAAA,IACd,WAAW;AAAA,MACT,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA;AAAA,IAAQ;AAAA,IAE/B,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWR,cAAc;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,MACT,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA,MACrB,EAAE,KAAK,SAAS,KAAK,QAAA;AAAA,IAAQ;AAAA,IAE/B,WAAW;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,EAAA;AAEV,GAKaC,IAAwC;AAAA,EACnD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/engine/shared/imageGrid/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/engine/shared/imageGrid/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oBAAoB;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,4CAA4C;IAC5C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,QAAQ,GACR,gBAAgB,GAChB,cAAc,GACd,YAAY,GACZ,aAAa,GACb,WAAW,GACX,YAAY,CAAC;AAEjB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,YAAY,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,gDAAgD;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layout constants compartilhados entre renderers e exporters
|
|
3
|
+
*/
|
|
4
|
+
/** Maps content position to CSS flexbox justify-content */
|
|
5
|
+
export declare const contentPositionMap: Record<string, string>;
|
|
6
|
+
/** Block gap presets for two-block layouts (hero split, etc.) */
|
|
7
|
+
export declare const blockGapConfig: Record<string, {
|
|
8
|
+
justify: string;
|
|
9
|
+
blockMaxWidth: string;
|
|
10
|
+
containerMaxWidth: string;
|
|
11
|
+
gap: string;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=layoutConstants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutConstants.d.ts","sourceRoot":"","sources":["../../../src/engine/shared/layoutConstants.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,2DAA2D;AAC3D,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIrD,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,GAAG,EAAE,MAAM,CAAC;CACb,CAIA,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const e = {
|
|
2
|
+
left: "flex-start",
|
|
3
|
+
center: "center",
|
|
4
|
+
right: "flex-end"
|
|
5
|
+
}, t = {
|
|
6
|
+
default: { justify: "center", blockMaxWidth: "45%", containerMaxWidth: "1200px", gap: "4rem" },
|
|
7
|
+
wide: { justify: "space-between", blockMaxWidth: "45%", containerMaxWidth: "1400px", gap: "2rem" },
|
|
8
|
+
"x-wide": { justify: "space-between", blockMaxWidth: "43%", containerMaxWidth: "100%", gap: "2rem" }
|
|
9
|
+
};
|
|
10
|
+
export {
|
|
11
|
+
t as blockGapConfig,
|
|
12
|
+
e as contentPositionMap
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=layoutConstants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layoutConstants.js","sources":["../../../src/engine/shared/layoutConstants.ts"],"sourcesContent":["/**\n * Layout constants compartilhados entre renderers e exporters\n */\n\n/** Maps content position to CSS flexbox justify-content */\nexport const contentPositionMap: Record<string, string> = {\n left: \"flex-start\",\n center: \"center\",\n right: \"flex-end\",\n};\n\n/** Block gap presets for two-block layouts (hero split, etc.) */\nexport const blockGapConfig: Record<string, {\n justify: string;\n blockMaxWidth: string;\n containerMaxWidth: string;\n gap: string;\n}> = {\n default: { justify: \"center\", blockMaxWidth: \"45%\", containerMaxWidth: \"1200px\", gap: \"4rem\" },\n wide: { justify: \"space-between\", blockMaxWidth: \"45%\", containerMaxWidth: \"1400px\", gap: \"2rem\" },\n \"x-wide\": { justify: \"space-between\", blockMaxWidth: \"43%\", containerMaxWidth: \"100%\", gap: \"2rem\" },\n};\n"],"names":["contentPositionMap","blockGapConfig"],"mappings":"AAKO,MAAMA,IAA6C;AAAA,EACxD,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT,GAGaC,IAKR;AAAA,EACH,SAAS,EAAE,SAAS,UAAU,eAAe,OAAO,mBAAmB,UAAU,KAAK,OAAA;AAAA,EACtF,MAAM,EAAE,SAAS,iBAAiB,eAAe,OAAO,mBAAmB,UAAU,KAAK,OAAA;AAAA,EAC1F,UAAU,EAAE,SAAS,iBAAiB,eAAe,OAAO,mBAAmB,QAAQ,KAAK,OAAA;AAC9F;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadowConstants.d.ts","sourceRoot":"","sources":["../../../src/engine/shared/shadowConstants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAMjD,CAAC"}
|