@brunoalz/smartgesti-site-editor 1.5.2 → 1.7.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.
Files changed (80) hide show
  1. package/dist/editor/LandingPageEditor.d.ts.map +1 -1
  2. package/dist/editor/LandingPageEditor.js +199 -185
  3. package/dist/editor/LandingPageEditor.js.map +1 -1
  4. package/dist/editor/PropertyEditor/VariationSelector.d.ts +1 -1
  5. package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
  6. package/dist/editor/PropertyEditor/VariationSelector.js +262 -93
  7. package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
  8. package/dist/engine/export/exporters/layout/GridExporter.d.ts.map +1 -1
  9. package/dist/engine/export/exporters/layout/GridExporter.js +47 -31
  10. package/dist/engine/export/exporters/layout/GridExporter.js.map +1 -1
  11. package/dist/engine/export/exporters/layout/StackExporter.d.ts.map +1 -1
  12. package/dist/engine/export/exporters/layout/StackExporter.js +17 -16
  13. package/dist/engine/export/exporters/layout/StackExporter.js.map +1 -1
  14. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
  15. package/dist/engine/export/exporters/sections/BlogPostExporters.js +246 -186
  16. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
  17. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
  18. package/dist/engine/plugins/builtin/blog/manifest.js +65 -47
  19. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
  20. package/dist/engine/presets/blogVariations.d.ts +51 -0
  21. package/dist/engine/presets/blogVariations.d.ts.map +1 -0
  22. package/dist/engine/presets/blogVariations.js +267 -0
  23. package/dist/engine/presets/blogVariations.js.map +1 -0
  24. package/dist/engine/registry/blocks/layout/grid.d.ts.map +1 -1
  25. package/dist/engine/registry/blocks/layout/grid.js +84 -42
  26. package/dist/engine/registry/blocks/layout/grid.js.map +1 -1
  27. package/dist/engine/registry/blocks/layout/stack.d.ts.map +1 -1
  28. package/dist/engine/registry/blocks/layout/stack.js +14 -13
  29. package/dist/engine/registry/blocks/layout/stack.js.map +1 -1
  30. package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -1
  31. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +62 -5
  32. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -1
  33. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
  34. package/dist/engine/registry/blocks/sections/blogPostDetail.js +16 -4
  35. package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
  36. package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -1
  37. package/dist/engine/registry/blocks/sections/blogRecentPosts.js +62 -5
  38. package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -1
  39. package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -1
  40. package/dist/engine/registry/blocks/sections/blogSearchBar.js +23 -1
  41. package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -1
  42. package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -1
  43. package/dist/engine/registry/blocks/sections/blogTagCloud.js +63 -6
  44. package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -1
  45. package/dist/engine/render/renderers/layout/GridRenderer.d.ts.map +1 -1
  46. package/dist/engine/render/renderers/layout/GridRenderer.js +51 -18
  47. package/dist/engine/render/renderers/layout/GridRenderer.js.map +1 -1
  48. package/dist/engine/render/renderers/layout/StackRenderer.d.ts.map +1 -1
  49. package/dist/engine/render/renderers/layout/StackRenderer.js +30 -25
  50. package/dist/engine/render/renderers/layout/StackRenderer.js.map +1 -1
  51. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts.map +1 -1
  52. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js +157 -132
  53. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js.map +1 -1
  54. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +17 -17
  55. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -1
  56. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.d.ts.map +1 -1
  57. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js +168 -136
  58. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js.map +1 -1
  59. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts.map +1 -1
  60. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js +59 -102
  61. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js.map +1 -1
  62. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.d.ts.map +1 -1
  63. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js +158 -122
  64. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js.map +1 -1
  65. package/dist/engine/schema/siteDocument.d.ts +57 -1
  66. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  67. package/dist/engine/schema/siteDocument.js.map +1 -1
  68. package/dist/engine/shared/hoverEffects/colorUtils.d.ts +2 -1
  69. package/dist/engine/shared/hoverEffects/colorUtils.d.ts.map +1 -1
  70. package/dist/engine/shared/hoverEffects/colorUtils.js +16 -12
  71. package/dist/engine/shared/hoverEffects/colorUtils.js.map +1 -1
  72. package/dist/engine/shared/widgetStyles.d.ts +9 -0
  73. package/dist/engine/shared/widgetStyles.d.ts.map +1 -0
  74. package/dist/engine/shared/widgetStyles.js +13 -0
  75. package/dist/engine/shared/widgetStyles.js.map +1 -0
  76. package/dist/index.d.ts +2 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +84 -71
  79. package/dist/index.js.map +1 -1
  80. package/package.json +1 -1
@@ -1 +1 @@
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 | \"blogCategoryFilter\"\n | \"blogSearchBar\"\n | \"blogRecentPosts\"\n | \"blogTagCloud\"\n // Seções avançadas\n | \"productShowcase\"\n | \"aboutSection\"\n | \"contactSection\"\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 /** Sticky positioning (stays fixed while scrolling). Disabled on mobile. */\n sticky?: boolean;\n /** Top offset when sticky (ex: \"80px\" for below navbar). Default \"80px\". */\n stickyOffset?: string;\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 /** CSS grid-template-columns override (ex: \"1fr 320px\", \"2fr 1fr\"). Tem prioridade sobre cols. */\n colTemplate?: string;\n gap?: string;\n /** Max-width of the grid container. Centers with auto margin. */\n maxWidth?: string;\n /** Horizontal padding. Applied to the grid wrapper. */\n padding?: string;\n /** Top padding — useful to clear fixed/sticky navbars. */\n paddingTop?: 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 /** Pagination — set by content hydration, not user-editable */\n currentPage?: number;\n totalPages?: number;\n paginationBaseUrl?: 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 /** Nome do autor (populado pela hydration, editável no admin) */\n authorName?: string;\n /** Avatar URL do autor */\n authorAvatar?: string;\n /** Bio curta do autor */\n authorBio?: string;\n // SEO fields (populated by ContentProvider, readOnly in editor)\n metaTitle?: string;\n metaDescription?: string;\n ogImage?: string;\n };\n}\n\n/**\n * BlogCategoryFilter - Filtro de categorias para listagem do blog\n * Dados populados pelo ContentProvider (categories extraídas dos posts)\n */\nexport interface BlogCategoryFilterBlock extends BlockBase {\n type: \"blogCategoryFilter\";\n props: {\n title?: string;\n categories: Array<{ name: string; slug: string; count?: number; image?: string }>;\n variant: \"chips\" | \"buttons\" | \"list\";\n showCount?: boolean;\n showAll?: boolean;\n allLabel?: string;\n activeCategory?: string;\n filterUrl?: string;\n };\n}\n\n/**\n * BlogSearchBar - Barra de busca para o blog\n * Envia busca via form action para URL configurável\n */\nexport interface BlogSearchBarBlock extends BlockBase {\n type: \"blogSearchBar\";\n props: {\n placeholder?: string;\n variant: \"simple\" | \"expanded\" | \"with-filters\";\n showIcon?: boolean;\n searchUrl?: string;\n filterCategories?: boolean;\n filterTags?: boolean;\n filterDate?: boolean;\n };\n}\n\n/**\n * BlogRecentPosts - Widget com os posts mais recentes do blog\n */\nexport interface BlogRecentPostsBlock extends BlockBase {\n type: \"blogRecentPosts\";\n props: {\n /** Título do widget (ex: \"Posts Recentes\") */\n title?: string;\n /** Quantidade de posts a exibir */\n count?: number;\n /** Posts hidratados pela contentHydration */\n posts?: Array<{\n title: string;\n slug: string;\n date?: string;\n image?: string;\n category?: string;\n }>;\n /** Mostrar miniatura */\n showThumbnail?: boolean;\n /** Mostrar data */\n showDate?: boolean;\n /** Mostrar badge de categoria */\n showCategory?: boolean;\n };\n}\n\n/**\n * BlogTagCloud - Widget com nuvem de tags do blog\n */\nexport interface BlogTagCloudBlock extends BlockBase {\n type: \"blogTagCloud\";\n props: {\n /** Título do widget (ex: \"Tags\") */\n title?: string;\n /** Tags hidratadas pela contentHydration — array de {name, count} */\n tags?: Array<{ name: string; count: number }>;\n /** Estilo: \"badges\" | \"list\" */\n variant?: \"badges\" | \"list\";\n };\n}\n\n// ============================================================================\n// SEÇÕES AVANÇADAS\n// ============================================================================\n\n/**\n * ProductShowcase - Seção de produtos com layout alternado\n */\nexport interface ProductShowcaseBlock extends BlockBase {\n type: \"productShowcase\";\n props: {\n title?: string;\n subtitle?: string;\n products: Array<{\n image?: string;\n icon?: string;\n badge?: string;\n name: string;\n description: string;\n longDescription?: string;\n features?: string[];\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n }>;\n variant?: \"alternating\" | \"grid\" | \"stacked\";\n bg?: string;\n // Button Hover Effects\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n buttonHoverIntensity?: number;\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * AboutSection - Seção sobre com imagem decorativa + texto + achievements\n */\nexport interface AboutSectionBlock extends BlockBase {\n type: \"aboutSection\";\n props: {\n title?: string;\n subtitle?: string;\n description?: string;\n secondaryDescription?: string;\n image?: string;\n achievements?: Array<{\n text: string;\n }>;\n primaryButton?: { text: string; href?: string };\n variant?: \"image-left\" | \"image-right\" | \"centered\";\n bg?: string;\n stats?: Array<{\n value: string;\n label: string;\n }>;\n // Button Hover Effects\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n buttonHoverIntensity?: number;\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * ContactSection - Seção de contato com info cards + formulário\n */\nexport interface ContactSectionBlock extends BlockBase {\n type: \"contactSection\";\n props: {\n title?: string;\n subtitle?: string;\n description?: string;\n contactInfo?: Array<{\n icon?: string;\n label: string;\n value: string;\n }>;\n formTitle?: string;\n formFields?: Array<{\n name: string;\n label: string;\n type: \"text\" | \"email\" | \"tel\" | \"textarea\";\n placeholder?: string;\n required?: boolean;\n }>;\n submitText?: string;\n variant?: \"split\" | \"stacked\" | \"form-only\";\n bg?: string;\n // Button Hover Effects\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n buttonHoverIntensity?: number;\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n buttonHoverIconName?: 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 | BlogCategoryFilterBlock\n | BlogSearchBarBlock\n | BlogRecentPostsBlock\n | BlogTagCloudBlock\n // Seções avançadas\n | ProductShowcaseBlock\n | AboutSectionBlock\n | ContactSectionBlock\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 * SEO configuration for a page\n */\nexport interface PageSeoConfig {\n metaTitle?: string;\n metaDescription?: string;\n ogImage?: string;\n ogType?: string;\n canonicalUrl?: string;\n noIndex?: boolean;\n}\n\n/**\n * Global site metadata for SEO\n */\nexport interface SiteMetadata {\n siteName?: string;\n defaultOgImage?: string;\n language?: string;\n}\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 /** SEO configuration for this page */\n seo?: PageSeoConfig;\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 /** Global site metadata for SEO */\n metadata?: SiteMetadata;\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":"AAo9CO,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
+ {"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 | \"blogCategoryFilter\"\n | \"blogSearchBar\"\n | \"blogRecentPosts\"\n | \"blogTagCloud\"\n // Seções avançadas\n | \"productShowcase\"\n | \"aboutSection\"\n | \"contactSection\"\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 /** Sticky positioning (stays fixed while scrolling). Disabled on mobile. */\n sticky?: boolean;\n /** Top offset when sticky (ex: \"80px\" for below navbar). Default \"80px\". */\n stickyOffset?: string;\n /** Bottom padding */\n paddingBottom?: string;\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 /** CSS grid-template-columns override (ex: \"1fr 320px\"). Tem prioridade sobre cols. */\n colTemplate?: string;\n gap?: string;\n /** Max-width of the grid container. Centers with auto margin. */\n maxWidth?: string;\n /** Horizontal padding. Applied to the grid wrapper. */\n padding?: string;\n /** Top padding — useful to clear fixed/sticky navbars. */\n paddingTop?: string;\n /** Bottom padding */\n paddingBottom?: string;\n /** Grid container position when maxWidth is set. Default \"center\". */\n contentPosition?: \"left\" | \"center\" | \"right\";\n /** Background color for the full-width wrapper. */\n bg?: string;\n /** Background image URL */\n bgImage?: string;\n /** Dark overlay on background image */\n bgOverlay?: boolean;\n /** Overlay color (default \"rgba(0,0,0,0.5)\") */\n bgOverlayColor?: string;\n /** CSS gradient (applied as background) */\n bgGradient?: 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 /** Pagination — set by content hydration, not user-editable */\n currentPage?: number;\n totalPages?: number;\n paginationBaseUrl?: 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 /** Nome do autor (populado pela hydration, editável no admin) */\n authorName?: string;\n /** Avatar URL do autor */\n authorAvatar?: string;\n /** Bio curta do autor */\n authorBio?: string;\n // SEO fields (populated by ContentProvider, readOnly in editor)\n metaTitle?: string;\n metaDescription?: string;\n ogImage?: string;\n };\n}\n\n/**\n * BlogCategoryFilter - Filtro de categorias para listagem do blog\n * Dados populados pelo ContentProvider (categories extraídas dos posts)\n */\nexport interface BlogCategoryFilterBlock extends BlockBase {\n type: \"blogCategoryFilter\";\n props: {\n title?: string;\n categories: Array<{ name: string; slug: string; count?: number; image?: string }>;\n variant: \"chips\" | \"buttons\" | \"list\";\n showCount?: boolean;\n showAll?: boolean;\n allLabel?: string;\n activeCategory?: string;\n filterUrl?: string;\n /** Link text color */\n linkColor?: string;\n /** Link hover color */\n linkHoverColor?: string;\n /** Link hover effect type */\n linkHoverEffect?: string;\n /** Link hover intensity (10-100) */\n linkHoverIntensity?: number;\n /** Card border radius. Default \"0.75rem\". */\n borderRadius?: string;\n /** Card box shadow: \"none\" | \"sm\" | \"md\". Default \"none\". */\n shadow?: string;\n };\n}\n\n/**\n * BlogSearchBar - Barra de busca para o blog\n * Envia busca via form action para URL configurável\n */\nexport interface BlogSearchBarBlock extends BlockBase {\n type: \"blogSearchBar\";\n props: {\n placeholder?: string;\n variant: \"simple\" | \"expanded\" | \"with-filters\";\n showIcon?: boolean;\n searchUrl?: string;\n filterCategories?: boolean;\n filterTags?: boolean;\n filterDate?: boolean;\n /** Card border radius. Default \"0.75rem\". */\n borderRadius?: string;\n /** Card box shadow: \"none\" | \"sm\" | \"md\". Default \"none\". */\n shadow?: string;\n };\n}\n\n/**\n * BlogRecentPosts - Widget com os posts mais recentes do blog\n */\nexport interface BlogRecentPostsBlock extends BlockBase {\n type: \"blogRecentPosts\";\n props: {\n /** Título do widget (ex: \"Posts Recentes\") */\n title?: string;\n /** Quantidade de posts a exibir */\n count?: number;\n /** Posts hidratados pela contentHydration */\n posts?: Array<{\n title: string;\n slug: string;\n date?: string;\n image?: string;\n category?: string;\n }>;\n /** Mostrar miniatura */\n showThumbnail?: boolean;\n /** Mostrar data */\n showDate?: boolean;\n /** Mostrar badge de categoria */\n showCategory?: boolean;\n /** Link text color */\n linkColor?: string;\n /** Link hover color */\n linkHoverColor?: string;\n /** Link hover effect type */\n linkHoverEffect?: string;\n /** Link hover intensity (10-100) */\n linkHoverIntensity?: number;\n /** Card border radius. Default \"0.75rem\". */\n borderRadius?: string;\n /** Card box shadow: \"none\" | \"sm\" | \"md\". Default \"none\". */\n shadow?: string;\n };\n}\n\n/**\n * BlogTagCloud - Widget com nuvem de tags do blog\n */\nexport interface BlogTagCloudBlock extends BlockBase {\n type: \"blogTagCloud\";\n props: {\n /** Título do widget (ex: \"Tags\") */\n title?: string;\n /** Tags hidratadas pela contentHydration — array de {name, count} */\n tags?: Array<{ name: string; count: number }>;\n /** Estilo: \"badges\" | \"list\" */\n variant?: \"badges\" | \"list\";\n /** Link text color */\n linkColor?: string;\n /** Link hover color */\n linkHoverColor?: string;\n /** Link hover effect type */\n linkHoverEffect?: string;\n /** Link hover intensity (10-100) */\n linkHoverIntensity?: number;\n /** Card border radius. Default \"0.75rem\". */\n borderRadius?: string;\n /** Card box shadow: \"none\" | \"sm\" | \"md\". Default \"none\". */\n shadow?: string;\n };\n}\n\n// ============================================================================\n// SEÇÕES AVANÇADAS\n// ============================================================================\n\n/**\n * ProductShowcase - Seção de produtos com layout alternado\n */\nexport interface ProductShowcaseBlock extends BlockBase {\n type: \"productShowcase\";\n props: {\n title?: string;\n subtitle?: string;\n products: Array<{\n image?: string;\n icon?: string;\n badge?: string;\n name: string;\n description: string;\n longDescription?: string;\n features?: string[];\n primaryButton?: { text: string; href?: string };\n secondaryButton?: { text: string; href?: string };\n }>;\n variant?: \"alternating\" | \"grid\" | \"stacked\";\n bg?: string;\n // Button Hover Effects\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n buttonHoverIntensity?: number;\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * AboutSection - Seção sobre com imagem decorativa + texto + achievements\n */\nexport interface AboutSectionBlock extends BlockBase {\n type: \"aboutSection\";\n props: {\n title?: string;\n subtitle?: string;\n description?: string;\n secondaryDescription?: string;\n image?: string;\n achievements?: Array<{\n text: string;\n }>;\n primaryButton?: { text: string; href?: string };\n variant?: \"image-left\" | \"image-right\" | \"centered\";\n bg?: string;\n stats?: Array<{\n value: string;\n label: string;\n }>;\n // Button Hover Effects\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n buttonHoverIntensity?: number;\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n buttonHoverIconName?: string;\n };\n}\n\n/**\n * ContactSection - Seção de contato com info cards + formulário\n */\nexport interface ContactSectionBlock extends BlockBase {\n type: \"contactSection\";\n props: {\n title?: string;\n subtitle?: string;\n description?: string;\n contactInfo?: Array<{\n icon?: string;\n label: string;\n value: string;\n }>;\n formTitle?: string;\n formFields?: Array<{\n name: string;\n label: string;\n type: \"text\" | \"email\" | \"tel\" | \"textarea\";\n placeholder?: string;\n required?: boolean;\n }>;\n submitText?: string;\n variant?: \"split\" | \"stacked\" | \"form-only\";\n bg?: string;\n // Button Hover Effects\n buttonHoverEffect?: \"none\" | \"darken\" | \"lighten\" | \"scale\" | \"glow\" | \"shadow\" | \"pulse\";\n buttonHoverIntensity?: number;\n buttonHoverOverlay?: \"none\" | \"shine\" | \"fill\" | \"bounce\" | \"icon\" | \"border-glow\";\n buttonHoverIconName?: 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 | BlogCategoryFilterBlock\n | BlogSearchBarBlock\n | BlogRecentPostsBlock\n | BlogTagCloudBlock\n // Seções avançadas\n | ProductShowcaseBlock\n | AboutSectionBlock\n | ContactSectionBlock\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 * SEO configuration for a page\n */\nexport interface PageSeoConfig {\n metaTitle?: string;\n metaDescription?: string;\n ogImage?: string;\n ogType?: string;\n canonicalUrl?: string;\n noIndex?: boolean;\n}\n\n/**\n * Global site metadata for SEO\n */\nexport interface SiteMetadata {\n siteName?: string;\n defaultOgImage?: string;\n language?: string;\n}\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 /** SEO configuration for this page */\n seo?: PageSeoConfig;\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 /** Global site metadata for SEO */\n metadata?: SiteMetadata;\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":"AA4gDO,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;"}
@@ -12,7 +12,8 @@ export declare function hexToRgb(hex: string): {
12
12
  b: number;
13
13
  } | null;
14
14
  /**
15
- * Cria cor rgba a partir de hex e opacidade
15
+ * Cria cor rgba a partir de hex e opacidade.
16
+ * Para CSS variables e cores não-hex, usa color-mix() para gerar versão semi-transparente.
16
17
  */
17
18
  export declare function hexToRgba(hex: string, alpha: number): string;
18
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"colorUtils.d.ts","sourceRoot":"","sources":["../../../../src/engine/shared/hoverEffects/colorUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAehF;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAI5D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAgBnF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D"}
1
+ {"version":3,"file":"colorUtils.d.ts","sourceRoot":"","sources":["../../../../src/engine/shared/hoverEffects/colorUtils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAehF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAgBnF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -1,27 +1,31 @@
1
- function i(n) {
1
+ function o(n) {
2
2
  if (!n.startsWith("#")) return null;
3
3
  let t = n.replace("#", "");
4
4
  t.length === 3 && (t = t[0] + t[0] + t[1] + t[1] + t[2] + t[2]);
5
- const r = parseInt(t.substring(0, 2), 16), e = parseInt(t.substring(2, 4), 16), s = parseInt(t.substring(4, 6), 16);
6
- return isNaN(r) || isNaN(e) || isNaN(s) ? null : { r, g: e, b: s };
5
+ const r = parseInt(t.substring(0, 2), 16), s = parseInt(t.substring(2, 4), 16), e = parseInt(t.substring(4, 6), 16);
6
+ return isNaN(r) || isNaN(s) || isNaN(e) ? null : { r, g: s, b: e };
7
7
  }
8
- function c(n, t) {
9
- const r = i(n);
10
- return r ? `rgba(${r.r}, ${r.g}, ${r.b}, ${t.toFixed(2)})` : n;
8
+ function g(n, t) {
9
+ const r = o(n);
10
+ if (!r) {
11
+ const s = Math.round(t * 100);
12
+ return `color-mix(in srgb, ${n} ${s}%, transparent)`;
13
+ }
14
+ return `rgba(${r.r}, ${r.g}, ${r.b}, ${t.toFixed(2)})`;
11
15
  }
12
16
  function b(n, t, r) {
13
- const e = i(n);
14
- if (!e) return n;
15
- const s = (a) => r ? Math.min(255, Math.round(a + (255 - a) * t)) : Math.max(0, Math.round(a * (1 - t))), o = s(e.r).toString(16).padStart(2, "0"), u = s(e.g).toString(16).padStart(2, "0"), g = s(e.b).toString(16).padStart(2, "0");
16
- return `#${o}${u}${g}`;
17
+ const s = o(n);
18
+ if (!s) return n;
19
+ const e = (i) => r ? Math.min(255, Math.round(i + (255 - i) * t)) : Math.max(0, Math.round(i * (1 - t))), a = e(s.r).toString(16).padStart(2, "0"), u = e(s.g).toString(16).padStart(2, "0"), c = e(s.b).toString(16).padStart(2, "0");
20
+ return `#${a}${u}${c}`;
17
21
  }
18
22
  function f(n) {
19
23
  return 0.15 + Math.max(0, (n - 10) / 90) * 0.85;
20
24
  }
21
25
  export {
22
26
  b as adjustColor,
23
- i as hexToRgb,
24
- c as hexToRgba,
27
+ o as hexToRgb,
28
+ g as hexToRgba,
25
29
  f as normalizeIntensity
26
30
  };
27
31
  //# sourceMappingURL=colorUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"colorUtils.js","sources":["../../../../src/engine/shared/hoverEffects/colorUtils.ts"],"sourcesContent":["/**\n * Hover Effects - Color Utilities\n *\n * Funções para manipulação de cores usadas nos efeitos de hover.\n */\n\n/**\n * Converte cor hex para RGB\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n if (!hex.startsWith('#')) return null;\n let cleanHex = hex.replace('#', '');\n\n // Handle 3-char hex\n if (cleanHex.length === 3) {\n cleanHex = cleanHex[0] + cleanHex[0] + cleanHex[1] + cleanHex[1] + cleanHex[2] + cleanHex[2];\n }\n\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return { r, g, b };\n}\n\n/**\n * Cria cor rgba a partir de hex e opacidade\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const rgb = hexToRgb(hex);\n if (!rgb) return hex;\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha.toFixed(2)})`;\n}\n\n/**\n * Ajusta cor (escurecer ou clarear)\n *\n * @param color - Cor hex\n * @param amount - Quantidade de ajuste (0-1)\n * @param lighten - true para clarear, false para escurecer\n */\nexport function adjustColor(color: string, amount: number, lighten: boolean): string {\n const rgb = hexToRgb(color);\n if (!rgb) return color;\n\n const adjust = (val: number) => {\n if (lighten) {\n return Math.min(255, Math.round(val + (255 - val) * amount));\n } else {\n return Math.max(0, Math.round(val * (1 - amount)));\n }\n };\n\n const newR = adjust(rgb.r).toString(16).padStart(2, '0');\n const newG = adjust(rgb.g).toString(16).padStart(2, '0');\n const newB = adjust(rgb.b).toString(16).padStart(2, '0');\n return `#${newR}${newG}${newB}`;\n}\n\n/**\n * Normaliza intensidade de 10-100 para 0.15-1\n * Garante que mesmo com intensidade mínima (10), o efeito seja visível (15%)\n */\nexport function normalizeIntensity(intensity: number): number {\n return 0.15 + Math.max(0, (intensity - 10) / 90) * 0.85;\n}\n"],"names":["hexToRgb","hex","cleanHex","g","b","hexToRgba","alpha","rgb","adjustColor","color","amount","lighten","adjust","val","newR","newG","newB","normalizeIntensity","intensity"],"mappings":"AASO,SAASA,EAASC,GAAyD;AAC9E,MAAI,CAACA,EAAI,WAAW,GAAG,EAAG,QAAO;AACjC,MAAIC,IAAWD,EAAI,QAAQ,KAAK,EAAE;AAGlC,EAAIC,EAAS,WAAW,MACpBA,IAAWA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC;AAG/F,QAAM,IAAI,SAASA,EAAS,UAAU,GAAG,CAAC,GAAG,EAAE,GACzCC,IAAI,SAASD,EAAS,UAAU,GAAG,CAAC,GAAG,EAAE,GACzCE,IAAI,SAASF,EAAS,UAAU,GAAG,CAAC,GAAG,EAAE;AAE/C,SAAI,MAAM,CAAC,KAAK,MAAMC,CAAC,KAAK,MAAMC,CAAC,IAAU,OACtC,EAAE,GAAG,GAAAD,GAAG,GAAAC,EAAA;AACnB;AAKO,SAASC,EAAUJ,GAAaK,GAAuB;AAC1D,QAAMC,IAAMP,EAASC,CAAG;AACxB,SAAKM,IACE,QAAQA,EAAI,CAAC,KAAKA,EAAI,CAAC,KAAKA,EAAI,CAAC,KAAKD,EAAM,QAAQ,CAAC,CAAC,MAD5CL;AAErB;AASO,SAASO,EAAYC,GAAeC,GAAgBC,GAA0B;AACjF,QAAMJ,IAAMP,EAASS,CAAK;AAC1B,MAAI,CAACF,EAAK,QAAOE;AAEjB,QAAMG,IAAS,CAACC,MACRF,IACO,KAAK,IAAI,KAAK,KAAK,MAAME,KAAO,MAAMA,KAAOH,CAAM,CAAC,IAEpD,KAAK,IAAI,GAAG,KAAK,MAAMG,KAAO,IAAIH,EAAO,CAAC,GAInDI,IAAOF,EAAOL,EAAI,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,GACjDQ,IAAOH,EAAOL,EAAI,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,GACjDS,IAAOJ,EAAOL,EAAI,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACvD,SAAO,IAAIO,CAAI,GAAGC,CAAI,GAAGC,CAAI;AACjC;AAMO,SAASC,EAAmBC,GAA2B;AAC1D,SAAO,OAAO,KAAK,IAAI,IAAIA,IAAY,MAAM,EAAE,IAAI;AACvD;"}
1
+ {"version":3,"file":"colorUtils.js","sources":["../../../../src/engine/shared/hoverEffects/colorUtils.ts"],"sourcesContent":["/**\n * Hover Effects - Color Utilities\n *\n * Funções para manipulação de cores usadas nos efeitos de hover.\n */\n\n/**\n * Converte cor hex para RGB\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n if (!hex.startsWith('#')) return null;\n let cleanHex = hex.replace('#', '');\n\n // Handle 3-char hex\n if (cleanHex.length === 3) {\n cleanHex = cleanHex[0] + cleanHex[0] + cleanHex[1] + cleanHex[1] + cleanHex[2] + cleanHex[2];\n }\n\n const r = parseInt(cleanHex.substring(0, 2), 16);\n const g = parseInt(cleanHex.substring(2, 4), 16);\n const b = parseInt(cleanHex.substring(4, 6), 16);\n\n if (isNaN(r) || isNaN(g) || isNaN(b)) return null;\n return { r, g, b };\n}\n\n/**\n * Cria cor rgba a partir de hex e opacidade.\n * Para CSS variables e cores não-hex, usa color-mix() para gerar versão semi-transparente.\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const rgb = hexToRgb(hex);\n if (!rgb) {\n // CSS variables (var(--sg-primary)), named colors, etc. — use color-mix\n const pct = Math.round(alpha * 100);\n return `color-mix(in srgb, ${hex} ${pct}%, transparent)`;\n }\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${alpha.toFixed(2)})`;\n}\n\n/**\n * Ajusta cor (escurecer ou clarear)\n *\n * @param color - Cor hex\n * @param amount - Quantidade de ajuste (0-1)\n * @param lighten - true para clarear, false para escurecer\n */\nexport function adjustColor(color: string, amount: number, lighten: boolean): string {\n const rgb = hexToRgb(color);\n if (!rgb) return color;\n\n const adjust = (val: number) => {\n if (lighten) {\n return Math.min(255, Math.round(val + (255 - val) * amount));\n } else {\n return Math.max(0, Math.round(val * (1 - amount)));\n }\n };\n\n const newR = adjust(rgb.r).toString(16).padStart(2, '0');\n const newG = adjust(rgb.g).toString(16).padStart(2, '0');\n const newB = adjust(rgb.b).toString(16).padStart(2, '0');\n return `#${newR}${newG}${newB}`;\n}\n\n/**\n * Normaliza intensidade de 10-100 para 0.15-1\n * Garante que mesmo com intensidade mínima (10), o efeito seja visível (15%)\n */\nexport function normalizeIntensity(intensity: number): number {\n return 0.15 + Math.max(0, (intensity - 10) / 90) * 0.85;\n}\n"],"names":["hexToRgb","hex","cleanHex","g","b","hexToRgba","alpha","rgb","pct","adjustColor","color","amount","lighten","adjust","val","newR","newG","newB","normalizeIntensity","intensity"],"mappings":"AASO,SAASA,EAASC,GAAyD;AAC9E,MAAI,CAACA,EAAI,WAAW,GAAG,EAAG,QAAO;AACjC,MAAIC,IAAWD,EAAI,QAAQ,KAAK,EAAE;AAGlC,EAAIC,EAAS,WAAW,MACpBA,IAAWA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC,IAAIA,EAAS,CAAC;AAG/F,QAAM,IAAI,SAASA,EAAS,UAAU,GAAG,CAAC,GAAG,EAAE,GACzCC,IAAI,SAASD,EAAS,UAAU,GAAG,CAAC,GAAG,EAAE,GACzCE,IAAI,SAASF,EAAS,UAAU,GAAG,CAAC,GAAG,EAAE;AAE/C,SAAI,MAAM,CAAC,KAAK,MAAMC,CAAC,KAAK,MAAMC,CAAC,IAAU,OACtC,EAAE,GAAG,GAAAD,GAAG,GAAAC,EAAA;AACnB;AAMO,SAASC,EAAUJ,GAAaK,GAAuB;AAC1D,QAAMC,IAAMP,EAASC,CAAG;AACxB,MAAI,CAACM,GAAK;AAEN,UAAMC,IAAM,KAAK,MAAMF,IAAQ,GAAG;AAClC,WAAO,sBAAsBL,CAAG,IAAIO,CAAG;AAAA,EAC3C;AACA,SAAO,QAAQD,EAAI,CAAC,KAAKA,EAAI,CAAC,KAAKA,EAAI,CAAC,KAAKD,EAAM,QAAQ,CAAC,CAAC;AACjE;AASO,SAASG,EAAYC,GAAeC,GAAgBC,GAA0B;AACjF,QAAML,IAAMP,EAASU,CAAK;AAC1B,MAAI,CAACH,EAAK,QAAOG;AAEjB,QAAMG,IAAS,CAACC,MACRF,IACO,KAAK,IAAI,KAAK,KAAK,MAAME,KAAO,MAAMA,KAAOH,CAAM,CAAC,IAEpD,KAAK,IAAI,GAAG,KAAK,MAAMG,KAAO,IAAIH,EAAO,CAAC,GAInDI,IAAOF,EAAON,EAAI,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,GACjDS,IAAOH,EAAON,EAAI,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,GACjDU,IAAOJ,EAAON,EAAI,CAAC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACvD,SAAO,IAAIQ,CAAI,GAAGC,CAAI,GAAGC,CAAI;AACjC;AAMO,SAASC,EAAmBC,GAA2B;AAC1D,SAAO,OAAO,KAAK,IAAI,IAAIA,IAAY,MAAM,EAAE,IAAI;AACvD;"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Widget Styles — Shared constants for blog sidebar widgets
3
+ * Used by renderers and exporters to maintain consistency
4
+ */
5
+ /** Shadow presets for widget cards */
6
+ export declare const widgetShadowMap: Record<string, string>;
7
+ /** Resolve shadow prop to CSS value */
8
+ export declare function resolveWidgetShadow(shadow?: string): string;
9
+ //# sourceMappingURL=widgetStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgetStyles.d.ts","sourceRoot":"","sources":["../../../src/engine/shared/widgetStyles.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,sCAAsC;AACtC,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAIlD,CAAC;AAEF,uCAAuC;AACvC,wBAAgB,mBAAmB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAE3D"}
@@ -0,0 +1,13 @@
1
+ const p = {
2
+ none: "none",
3
+ sm: "0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06)",
4
+ md: "0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)"
5
+ };
6
+ function x(n) {
7
+ return p[n || "none"] || "none";
8
+ }
9
+ export {
10
+ x as resolveWidgetShadow,
11
+ p as widgetShadowMap
12
+ };
13
+ //# sourceMappingURL=widgetStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"widgetStyles.js","sources":["../../../src/engine/shared/widgetStyles.ts"],"sourcesContent":["/**\n * Widget Styles — Shared constants for blog sidebar widgets\n * Used by renderers and exporters to maintain consistency\n */\n\n/** Shadow presets for widget cards */\nexport const widgetShadowMap: Record<string, string> = {\n none: \"none\",\n sm: \"0 1px 3px rgba(0,0,0,0.08), 0 1px 2px rgba(0,0,0,0.06)\",\n md: \"0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1)\",\n};\n\n/** Resolve shadow prop to CSS value */\nexport function resolveWidgetShadow(shadow?: string): string {\n return widgetShadowMap[shadow || \"none\"] || \"none\";\n}\n"],"names":["widgetShadowMap","resolveWidgetShadow","shadow"],"mappings":"AAMO,MAAMA,IAA0C;AAAA,EACrD,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AACN;AAGO,SAASC,EAAoBC,GAAyB;AAC3D,SAAOF,EAAgBE,KAAU,MAAM,KAAK;AAC9C;"}
package/dist/index.d.ts CHANGED
@@ -35,6 +35,8 @@ export type { HeroVariationPreset, } from './engine/presets/heroVariations';
35
35
  export { heroVariations, heroVariationIds, getHeroVariation, HERO_IMAGE_NAMES, PLACEHOLDER_IMAGE_URL, CAROUSEL_PLACEHOLDER_IMAGES, } from './engine/presets/heroVariations';
36
36
  export type { NavbarVariationPreset, } from './engine/presets/navbarVariations';
37
37
  export { navbarVariations, navbarVariationIds, getNavbarVariation, } from './engine/presets/navbarVariations';
38
+ export { blogPostCardVariations, blogPostCardVariationIds, blogPostDetailVariations, blogPostDetailVariationIds, blogCategoryFilterVariations, blogCategoryFilterVariationIds, blogSearchBarVariations, blogSearchBarVariationIds, blogRecentPostsVariations, blogRecentPostsVariationIds, blogTagCloudVariations, blogTagCloudVariationIds, } from './engine/presets/blogVariations';
39
+ export type { BlogPostCardVariation, BlogPostDetailVariation, BlogCategoryFilterVariation, BlogSearchBarVariation, BlogRecentPostsVariation, BlogTagCloudVariation, } from './engine/presets/blogVariations';
38
40
  export { generateCompleteLandingPage, generatePatchesForLandingPage, generateModernLandingPage, } from './engine/generators/generateLandingPage';
39
41
  export type { ImageGridItem as EngineImageGridItem, ImageGridPreset as EngineImageGridPreset, } from './engine/shared/imageGrid';
40
42
  export { evaluateShowWhen } from './engine/shared/showWhen';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -56,108 +56,121 @@ import "./engine/registry/blocks/forms/input.js";
56
56
  import "./engine/registry/blocks/forms/textarea.js";
57
57
  import "./engine/registry/blocks/forms/select.js";
58
58
  import { componentRegistry as se, componentRegistry as ge } from "./engine/registry/registry.js";
59
- import { createEmptySiteDocument as ce, createEmptySiteDocument as de } from "./engine/schema/siteDocument.js";
60
- import { corporateThemeTokens as fe, darkThemeTokens as he, defaultComponentTokens as xe, defaultEffectTokens as Se, defaultLayoutTokens as Te, defaultThemeTokens as ye, generateThemeCSSVariables as ue, gradientDirectionMap as Ve, gradientThemeTokens as ke, playfulThemeTokens as Ee, radiusScaleMap as Le, shadowScaleMap as Ce, spacingScaleMap as Me } from "./engine/schema/themeTokens.js";
61
- import { RenderNode as be } from "./engine/render/renderNode.js";
62
- import { RenderPage as He, renderPage as Ae } from "./engine/render/renderPage.js";
63
- import { clearHtmlCache as we, exportBlockToHtml as Oe, exportDocumentToHtml as _e, exportPageToHtml as Ie, generateAssetsManifest as Ne } from "./engine/export/exportHtml.js";
64
- import { isSafeUrl as Ge, sanitizeHtml as Ue } from "./engine/export/sanitizeHtml.js";
65
- import { Preview as We, Preview as ze } from "./engine/preview/Preview.js";
59
+ import { createEmptySiteDocument as de, createEmptySiteDocument as ce } from "./engine/schema/siteDocument.js";
60
+ import { corporateThemeTokens as fe, darkThemeTokens as he, defaultComponentTokens as xe, defaultEffectTokens as Ve, defaultLayoutTokens as Se, defaultThemeTokens as Te, generateThemeCSSVariables as be, gradientDirectionMap as ye, gradientThemeTokens as Ce, playfulThemeTokens as ue, radiusScaleMap as ke, shadowScaleMap as Ee, spacingScaleMap as Le } from "./engine/schema/themeTokens.js";
61
+ import { RenderNode as Me } from "./engine/render/renderNode.js";
62
+ import { RenderPage as De, renderPage as He } from "./engine/render/renderPage.js";
63
+ import { clearHtmlCache as Ae, exportBlockToHtml as we, exportDocumentToHtml as Oe, exportPageToHtml as Be, generateAssetsManifest as _e } from "./engine/export/exportHtml.js";
64
+ import { isSafeUrl as Fe, sanitizeHtml as Ge } from "./engine/export/sanitizeHtml.js";
65
+ import { Preview as je, Preview as We } from "./engine/preview/Preview.js";
66
66
  import { applyPatch as Ke, createAddPatch as qe, createCopyPatch as Je, createMovePatch as Qe, createRemovePatch as Xe, createReplacePatch as Ye } from "./engine/patch/applyPatch.js";
67
67
  import { HistoryManager as $e, createHistoryManager as er } from "./engine/patch/history.js";
68
68
  import { PatchBuilder as tr } from "./engine/patch/PatchBuilder.js";
69
- import { applyOverrides as ar, classicPreset as ir, cleanPreset as mr, corporatePreset as pr, getAllPresets as nr, getPreset as sr, glassPreset as gr, minimalPreset as lr, neonPreset as cr, pastelPreset as dr, playfulKidsPreset as Pr, themePresets as fr, validateContrast as hr } from "./engine/presets/themePresets.js";
70
- import { CAROUSEL_PLACEHOLDER_IMAGES as Sr, HERO_IMAGE_NAMES as Tr, PLACEHOLDER_IMAGE_URL as yr, getHeroVariation as ur, heroVariationIds as Vr, heroVariations as kr } from "./engine/presets/heroVariations.js";
71
- import { getNavbarVariation as Lr, navbarVariationIds as Cr, navbarVariations as Mr } from "./engine/presets/navbarVariations.js";
72
- import { generateCompleteLandingPage as br, generateModernLandingPage as vr, generatePatchesForLandingPage as Hr } from "./engine/generators/generateLandingPage.js";
73
- import { evaluateShowWhen as Dr } from "./engine/shared/showWhen.js";
74
- import { pluginRegistry as Or } from "./engine/plugins/pluginRegistry.js";
75
- import { hydratePageWithContent as Ir } from "./engine/plugins/contentHydration.js";
76
- import { matchDynamicPage as Br } from "./engine/plugins/dynamicPageResolver.js";
77
- import { blogPlugin as Ur } from "./engine/plugins/builtin/blog/manifest.js";
78
- import { mockBlogContentProvider as Wr } from "./engine/plugins/builtin/blog/mockContentProvider.js";
79
- import { createThemeStyle as Fr, generateCSSVariables as Kr, generateCSSVariablesObject as qr, mergeThemeTokens as Jr } from "./engine/theme/generateCSSVariables.js";
80
- import { renderBlockNode as Xr } from "./engine/render/renderNodeImpl.js";
81
- import { darkTheme as Zr, defaultTheme as $r } from "./engine/theme/defaultTheme.js";
69
+ import { applyOverrides as ar, classicPreset as ir, cleanPreset as mr, corporatePreset as pr, getAllPresets as nr, getPreset as sr, glassPreset as gr, minimalPreset as lr, neonPreset as dr, pastelPreset as cr, playfulKidsPreset as Pr, themePresets as fr, validateContrast as hr } from "./engine/presets/themePresets.js";
70
+ import { CAROUSEL_PLACEHOLDER_IMAGES as Vr, HERO_IMAGE_NAMES as Sr, PLACEHOLDER_IMAGE_URL as Tr, getHeroVariation as br, heroVariationIds as yr, heroVariations as Cr } from "./engine/presets/heroVariations.js";
71
+ import { getNavbarVariation as kr, navbarVariationIds as Er, navbarVariations as Lr } from "./engine/presets/navbarVariations.js";
72
+ import { blogCategoryFilterVariationIds as Mr, blogCategoryFilterVariations as vr, blogPostCardVariationIds as Dr, blogPostCardVariations as Hr, blogPostDetailVariationIds as Ir, blogPostDetailVariations as Ar, blogRecentPostsVariationIds as wr, blogRecentPostsVariations as Or, blogSearchBarVariationIds as Br, blogSearchBarVariations as _r, blogTagCloudVariationIds as Nr, blogTagCloudVariations as Fr } from "./engine/presets/blogVariations.js";
73
+ import { generateCompleteLandingPage as Ur, generateModernLandingPage as jr, generatePatchesForLandingPage as Wr } from "./engine/generators/generateLandingPage.js";
74
+ import { evaluateShowWhen as Kr } from "./engine/shared/showWhen.js";
75
+ import { pluginRegistry as Jr } from "./engine/plugins/pluginRegistry.js";
76
+ import { hydratePageWithContent as Xr } from "./engine/plugins/contentHydration.js";
77
+ import { matchDynamicPage as Zr } from "./engine/plugins/dynamicPageResolver.js";
78
+ import { blogPlugin as et } from "./engine/plugins/builtin/blog/manifest.js";
79
+ import { mockBlogContentProvider as tt } from "./engine/plugins/builtin/blog/mockContentProvider.js";
80
+ import { createThemeStyle as at, generateCSSVariables as it, generateCSSVariablesObject as mt, mergeThemeTokens as pt } from "./engine/theme/generateCSSVariables.js";
81
+ import { renderBlockNode as st } from "./engine/render/renderNodeImpl.js";
82
+ import { darkTheme as lt, defaultTheme as dt } from "./engine/theme/defaultTheme.js";
82
83
  export {
83
- Sr as CAROUSEL_PLACEHOLDER_IMAGES,
84
- Tr as HERO_IMAGE_NAMES,
84
+ Vr as CAROUSEL_PLACEHOLDER_IMAGES,
85
+ Sr as HERO_IMAGE_NAMES,
85
86
  $e as HistoryManager,
86
87
  oe as LandingPageEditor,
87
88
  ae as LandingPageEditorV2,
88
89
  me as LandingPageViewer,
89
90
  pe as LandingPageViewerV2,
90
- yr as PLACEHOLDER_IMAGE_URL,
91
+ Tr as PLACEHOLDER_IMAGE_URL,
91
92
  tr as PatchBuilder,
92
- We as Preview,
93
- ze as PreviewV2,
94
- be as RenderNode,
95
- He as RenderPage,
93
+ je as Preview,
94
+ We as PreviewV2,
95
+ Me as RenderNode,
96
+ De as RenderPage,
96
97
  ar as applyOverrides,
97
98
  Ke as applyPatch,
98
99
  se as blockRegistry,
99
- Ur as blogPlugin,
100
+ Mr as blogCategoryFilterVariationIds,
101
+ vr as blogCategoryFilterVariations,
102
+ et as blogPlugin,
103
+ Dr as blogPostCardVariationIds,
104
+ Hr as blogPostCardVariations,
105
+ Ir as blogPostDetailVariationIds,
106
+ Ar as blogPostDetailVariations,
107
+ wr as blogRecentPostsVariationIds,
108
+ Or as blogRecentPostsVariations,
109
+ Br as blogSearchBarVariationIds,
110
+ _r as blogSearchBarVariations,
111
+ Nr as blogTagCloudVariationIds,
112
+ Fr as blogTagCloudVariations,
100
113
  ir as classicPreset,
101
114
  mr as cleanPreset,
102
- we as clearHtmlCache,
115
+ Ae as clearHtmlCache,
103
116
  ge as componentRegistry,
104
117
  pr as corporatePreset,
105
118
  fe as corporateThemeTokens,
106
119
  qe as createAddPatch,
107
120
  Je as createCopyPatch,
108
- ce as createEmptySiteDocument,
109
- de as createEmptySiteDocumentV2,
121
+ de as createEmptySiteDocument,
122
+ ce as createEmptySiteDocumentV2,
110
123
  er as createHistoryManager,
111
124
  Qe as createMovePatch,
112
125
  Xe as createRemovePatch,
113
126
  Ye as createReplacePatch,
114
- Fr as createSiteThemeStyle,
127
+ at as createSiteThemeStyle,
115
128
  he as darkThemeTokens,
116
129
  xe as defaultComponentTokens,
117
- Se as defaultEffectTokens,
118
- Te as defaultLayoutTokens,
119
- ye as defaultThemeTokens,
120
- Dr as evaluateShowWhen,
121
- Oe as exportBlockToHtml,
122
- _e as exportDocumentToHtml,
123
- Ie as exportPageToHtml,
124
- Ne as generateAssetsManifest,
125
- br as generateCompleteLandingPage,
126
- vr as generateModernLandingPage,
127
- Hr as generatePatchesForLandingPage,
128
- Kr as generateSiteCSSVariables,
129
- qr as generateSiteCSSVariablesObject,
130
- ue as generateThemeCSSVariables,
130
+ Ve as defaultEffectTokens,
131
+ Se as defaultLayoutTokens,
132
+ Te as defaultThemeTokens,
133
+ Kr as evaluateShowWhen,
134
+ we as exportBlockToHtml,
135
+ Oe as exportDocumentToHtml,
136
+ Be as exportPageToHtml,
137
+ _e as generateAssetsManifest,
138
+ Ur as generateCompleteLandingPage,
139
+ jr as generateModernLandingPage,
140
+ Wr as generatePatchesForLandingPage,
141
+ it as generateSiteCSSVariables,
142
+ mt as generateSiteCSSVariablesObject,
143
+ be as generateThemeCSSVariables,
131
144
  nr as getAllPresets,
132
- ur as getHeroVariation,
133
- Lr as getNavbarVariation,
145
+ br as getHeroVariation,
146
+ kr as getNavbarVariation,
134
147
  sr as getPreset,
135
148
  gr as glassPreset,
136
- Ve as gradientDirectionMap,
137
- ke as gradientThemeTokens,
138
- Vr as heroVariationIds,
139
- kr as heroVariations,
140
- Ir as hydratePageWithContent,
141
- Ge as isSafeUrl,
142
- Br as matchDynamicPage,
143
- Jr as mergeSiteThemeTokens,
149
+ ye as gradientDirectionMap,
150
+ Ce as gradientThemeTokens,
151
+ yr as heroVariationIds,
152
+ Cr as heroVariations,
153
+ Xr as hydratePageWithContent,
154
+ Fe as isSafeUrl,
155
+ Zr as matchDynamicPage,
156
+ pt as mergeSiteThemeTokens,
144
157
  lr as minimalPreset,
145
- Wr as mockBlogContentProvider,
146
- Cr as navbarVariationIds,
147
- Mr as navbarVariations,
148
- cr as neonPreset,
149
- dr as pastelPreset,
158
+ tt as mockBlogContentProvider,
159
+ Er as navbarVariationIds,
160
+ Lr as navbarVariations,
161
+ dr as neonPreset,
162
+ cr as pastelPreset,
150
163
  Pr as playfulKidsPreset,
151
- Ee as playfulThemeTokens,
152
- Or as pluginRegistry,
153
- Le as radiusScaleMap,
154
- Xr as renderNode,
155
- Ae as renderPage,
156
- Ue as sanitizeHtml,
157
- Ce as shadowScaleMap,
158
- Zr as siteDarkTheme,
159
- $r as siteDefaultTheme,
160
- Me as spacingScaleMap,
164
+ ue as playfulThemeTokens,
165
+ Jr as pluginRegistry,
166
+ ke as radiusScaleMap,
167
+ st as renderNode,
168
+ He as renderPage,
169
+ Ge as sanitizeHtml,
170
+ Ee as shadowScaleMap,
171
+ lt as siteDarkTheme,
172
+ dt as siteDefaultTheme,
173
+ Le as spacingScaleMap,
161
174
  fr as themePresets,
162
175
  hr as validateContrast
163
176
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brunoalz/smartgesti-site-editor",
3
- "version": "1.5.2",
3
+ "version": "1.7.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Site editor component for SmartGesti platform",