@brunoalz/smartgesti-site-editor 1.0.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. package/dist/editor/BlockSelector.d.ts.map +1 -1
  2. package/dist/editor/BlockSelector.js +60 -57
  3. package/dist/editor/BlockSelector.js.map +1 -1
  4. package/dist/editor/LandingPageEditor.d.ts.map +1 -1
  5. package/dist/editor/LandingPageEditor.js +145 -128
  6. package/dist/editor/LandingPageEditor.js.map +1 -1
  7. package/dist/editor/PageTabBar.d.ts +4 -1
  8. package/dist/editor/PageTabBar.d.ts.map +1 -1
  9. package/dist/editor/PageTabBar.js +179 -41
  10. package/dist/editor/PageTabBar.js.map +1 -1
  11. package/dist/editor/PropertyEditor/BlockPropertyEditor.d.ts +2 -0
  12. package/dist/editor/PropertyEditor/BlockPropertyEditor.d.ts.map +1 -1
  13. package/dist/editor/PropertyEditor/BlockPropertyEditor.js +53 -45
  14. package/dist/editor/PropertyEditor/BlockPropertyEditor.js.map +1 -1
  15. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.d.ts +2 -0
  16. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.d.ts.map +1 -1
  17. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.js +47 -33
  18. package/dist/editor/PropertyEditor/CollapsiblePropertyGroup.js.map +1 -1
  19. package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
  20. package/dist/editor/PropertyEditor/VariationSelector.js +10 -6
  21. package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
  22. package/dist/editor/PropertyEditor/index.js +20 -18
  23. package/dist/editor/PropertyEditor/index.js.map +1 -1
  24. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.d.ts +16 -0
  25. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.d.ts.map +1 -0
  26. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.js +170 -0
  27. package/dist/editor/PropertyEditor/inputs/CarouselImagesInput.js.map +1 -0
  28. package/dist/editor/PropertyEditor/inputs/ImageGridInput.d.ts.map +1 -1
  29. package/dist/editor/PropertyEditor/inputs/ImageGridInput.js +148 -121
  30. package/dist/editor/PropertyEditor/inputs/ImageGridInput.js.map +1 -1
  31. package/dist/editor/PropertyEditor/inputs/index.d.ts +1 -0
  32. package/dist/editor/PropertyEditor/inputs/index.d.ts.map +1 -1
  33. package/dist/editor/PropertyEditor/renderPropertyInput.d.ts.map +1 -1
  34. package/dist/editor/PropertyEditor/renderPropertyInput.js +167 -139
  35. package/dist/editor/PropertyEditor/renderPropertyInput.js.map +1 -1
  36. package/dist/editor/components/CenterPanel.d.ts +9 -1
  37. package/dist/editor/components/CenterPanel.d.ts.map +1 -1
  38. package/dist/editor/components/CenterPanel.js +24 -14
  39. package/dist/editor/components/CenterPanel.js.map +1 -1
  40. package/dist/editor/components/RightPanel.d.ts +5 -0
  41. package/dist/editor/components/RightPanel.d.ts.map +1 -1
  42. package/dist/editor/components/RightPanel.js +18 -12
  43. package/dist/editor/components/RightPanel.js.map +1 -1
  44. package/dist/editor/components/Toolbar.d.ts +3 -0
  45. package/dist/editor/components/Toolbar.d.ts.map +1 -1
  46. package/dist/editor/components/Toolbar.js +54 -35
  47. package/dist/editor/components/Toolbar.js.map +1 -1
  48. package/dist/engine/export/exportHtml.d.ts.map +1 -1
  49. package/dist/engine/export/exportHtml.js +50 -50
  50. package/dist/engine/export/exportHtml.js.map +1 -1
  51. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts +6 -0
  52. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -0
  53. package/dist/engine/export/exporters/sections/BlogPostExporters.js +101 -0
  54. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -0
  55. package/dist/engine/export/exporters/sections/FooterExporter.js +22 -22
  56. package/dist/engine/export/exporters/sections/FooterExporter.js.map +1 -1
  57. package/dist/engine/export/exporters/sections/HeroExporter.d.ts.map +1 -1
  58. package/dist/engine/export/exporters/sections/HeroExporter.js +222 -205
  59. package/dist/engine/export/exporters/sections/HeroExporter.js.map +1 -1
  60. package/dist/engine/export/exporters/sections/MarketingExporters.js +88 -88
  61. package/dist/engine/export/exporters/sections/MarketingExporters.js.map +1 -1
  62. package/dist/engine/export/exporters/sections/NavbarExporter.js +34 -34
  63. package/dist/engine/export/exporters/sections/NavbarExporter.js.map +1 -1
  64. package/dist/engine/export/exporters/sections/index.d.ts.map +1 -1
  65. package/dist/engine/export/exporters/sections/index.js +29 -22
  66. package/dist/engine/export/exporters/sections/index.js.map +1 -1
  67. package/dist/engine/index.d.ts +3 -0
  68. package/dist/engine/index.d.ts.map +1 -1
  69. package/dist/engine/index.js +99 -87
  70. package/dist/engine/index.js.map +1 -1
  71. package/dist/engine/plugins/builtin/blog/index.d.ts +3 -0
  72. package/dist/engine/plugins/builtin/blog/index.d.ts.map +1 -0
  73. package/dist/engine/plugins/builtin/blog/manifest.d.ts +3 -0
  74. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -0
  75. package/dist/engine/plugins/builtin/blog/manifest.js +273 -0
  76. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -0
  77. package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts +7 -0
  78. package/dist/engine/plugins/builtin/blog/mockContentProvider.d.ts.map +1 -0
  79. package/dist/engine/plugins/builtin/blog/mockContentProvider.js +135 -0
  80. package/dist/engine/plugins/builtin/blog/mockContentProvider.js.map +1 -0
  81. package/dist/engine/plugins/contentHydration.d.ts +17 -0
  82. package/dist/engine/plugins/contentHydration.d.ts.map +1 -0
  83. package/dist/engine/plugins/contentHydration.js +121 -0
  84. package/dist/engine/plugins/contentHydration.js.map +1 -0
  85. package/dist/engine/plugins/dynamicPageResolver.d.ts +25 -0
  86. package/dist/engine/plugins/dynamicPageResolver.d.ts.map +1 -0
  87. package/dist/engine/plugins/dynamicPageResolver.js +32 -0
  88. package/dist/engine/plugins/dynamicPageResolver.js.map +1 -0
  89. package/dist/engine/plugins/index.d.ts +11 -0
  90. package/dist/engine/plugins/index.d.ts.map +1 -0
  91. package/dist/engine/plugins/pluginRegistry.d.ts +37 -0
  92. package/dist/engine/plugins/pluginRegistry.d.ts.map +1 -0
  93. package/dist/engine/plugins/pluginRegistry.js +134 -0
  94. package/dist/engine/plugins/pluginRegistry.js.map +1 -0
  95. package/dist/engine/plugins/types.d.ts +180 -0
  96. package/dist/engine/plugins/types.d.ts.map +1 -0
  97. package/dist/engine/presets/heroVariations.d.ts +5 -0
  98. package/dist/engine/presets/heroVariations.d.ts.map +1 -1
  99. package/dist/engine/presets/heroVariations.js +50 -6
  100. package/dist/engine/presets/heroVariations.js.map +1 -1
  101. package/dist/engine/preview/Preview.d.ts +6 -2
  102. package/dist/engine/preview/Preview.d.ts.map +1 -1
  103. package/dist/engine/preview/Preview.js +295 -125
  104. package/dist/engine/preview/Preview.js.map +1 -1
  105. package/dist/engine/registry/blocks/sections/blogPostCard.d.ts +3 -0
  106. package/dist/engine/registry/blocks/sections/blogPostCard.d.ts.map +1 -0
  107. package/dist/engine/registry/blocks/sections/blogPostCard.js +53 -0
  108. package/dist/engine/registry/blocks/sections/blogPostCard.js.map +1 -0
  109. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts +3 -0
  110. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -0
  111. package/dist/engine/registry/blocks/sections/blogPostDetail.js +49 -0
  112. package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -0
  113. package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts +3 -0
  114. package/dist/engine/registry/blocks/sections/blogPostGrid.d.ts.map +1 -0
  115. package/dist/engine/registry/blocks/sections/blogPostGrid.js +89 -0
  116. package/dist/engine/registry/blocks/sections/blogPostGrid.js.map +1 -0
  117. package/dist/engine/registry/blocks/sections/hero.d.ts.map +1 -1
  118. package/dist/engine/registry/blocks/sections/hero.js +67 -14
  119. package/dist/engine/registry/blocks/sections/hero.js.map +1 -1
  120. package/dist/engine/registry/blocks/sections/index.d.ts +3 -0
  121. package/dist/engine/registry/blocks/sections/index.d.ts.map +1 -1
  122. package/dist/engine/registry/blocks/sections/navbar.d.ts.map +1 -1
  123. package/dist/engine/registry/blocks/sections/navbar.js +2 -1
  124. package/dist/engine/registry/blocks/sections/navbar.js.map +1 -1
  125. package/dist/engine/registry/registry.d.ts.map +1 -1
  126. package/dist/engine/registry/registry.js +16 -12
  127. package/dist/engine/registry/registry.js.map +1 -1
  128. package/dist/engine/registry/types.d.ts +10 -6
  129. package/dist/engine/registry/types.d.ts.map +1 -1
  130. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.d.ts +3 -0
  131. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.d.ts.map +1 -0
  132. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js +199 -0
  133. package/dist/engine/render/renderers/sections/BlogPostCardRenderer.js.map +1 -0
  134. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.d.ts +3 -0
  135. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.d.ts.map +1 -0
  136. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +293 -0
  137. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -0
  138. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.d.ts +3 -0
  139. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.d.ts.map +1 -0
  140. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js +101 -0
  141. package/dist/engine/render/renderers/sections/BlogPostGridRenderer.js.map +1 -0
  142. package/dist/engine/render/renderers/sections/CtaRenderer.d.ts.map +1 -1
  143. package/dist/engine/render/renderers/sections/CtaRenderer.js +33 -31
  144. package/dist/engine/render/renderers/sections/CtaRenderer.js.map +1 -1
  145. package/dist/engine/render/renderers/sections/FaqItemRenderer.d.ts.map +1 -1
  146. package/dist/engine/render/renderers/sections/FaqItemRenderer.js +7 -6
  147. package/dist/engine/render/renderers/sections/FaqItemRenderer.js.map +1 -1
  148. package/dist/engine/render/renderers/sections/FaqRenderer.js +7 -7
  149. package/dist/engine/render/renderers/sections/FaqRenderer.js.map +1 -1
  150. package/dist/engine/render/renderers/sections/FeatureGridRenderer.d.ts.map +1 -1
  151. package/dist/engine/render/renderers/sections/FeatureGridRenderer.js +19 -18
  152. package/dist/engine/render/renderers/sections/FeatureGridRenderer.js.map +1 -1
  153. package/dist/engine/render/renderers/sections/FeatureRenderer.d.ts.map +1 -1
  154. package/dist/engine/render/renderers/sections/FeatureRenderer.js +5 -4
  155. package/dist/engine/render/renderers/sections/FeatureRenderer.js.map +1 -1
  156. package/dist/engine/render/renderers/sections/FooterRenderer.d.ts.map +1 -1
  157. package/dist/engine/render/renderers/sections/FooterRenderer.js +8 -7
  158. package/dist/engine/render/renderers/sections/FooterRenderer.js.map +1 -1
  159. package/dist/engine/render/renderers/sections/HeroRenderer.d.ts.map +1 -1
  160. package/dist/engine/render/renderers/sections/HeroRenderer.js +295 -218
  161. package/dist/engine/render/renderers/sections/HeroRenderer.js.map +1 -1
  162. package/dist/engine/render/renderers/sections/NavbarRenderer.d.ts.map +1 -1
  163. package/dist/engine/render/renderers/sections/NavbarRenderer.js +23 -22
  164. package/dist/engine/render/renderers/sections/NavbarRenderer.js.map +1 -1
  165. package/dist/engine/render/renderers/sections/PricingCardRenderer.d.ts.map +1 -1
  166. package/dist/engine/render/renderers/sections/PricingCardRenderer.js +7 -6
  167. package/dist/engine/render/renderers/sections/PricingCardRenderer.js.map +1 -1
  168. package/dist/engine/render/renderers/sections/PricingRenderer.js +9 -9
  169. package/dist/engine/render/renderers/sections/PricingRenderer.js.map +1 -1
  170. package/dist/engine/render/renderers/sections/TestimonialGridRenderer.d.ts.map +1 -1
  171. package/dist/engine/render/renderers/sections/TestimonialGridRenderer.js +17 -16
  172. package/dist/engine/render/renderers/sections/TestimonialGridRenderer.js.map +1 -1
  173. package/dist/engine/render/renderers/sections/TestimonialRenderer.d.ts.map +1 -1
  174. package/dist/engine/render/renderers/sections/TestimonialRenderer.js +11 -10
  175. package/dist/engine/render/renderers/sections/TestimonialRenderer.js.map +1 -1
  176. package/dist/engine/render/renderers/sections/index.js +24 -18
  177. package/dist/engine/render/renderers/sections/index.js.map +1 -1
  178. package/dist/engine/schema/siteDocument.d.ts +104 -3
  179. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  180. package/dist/engine/schema/siteDocument.js.map +1 -1
  181. package/dist/engine/shared/carouselAnimation.d.ts +20 -0
  182. package/dist/engine/shared/carouselAnimation.d.ts.map +1 -0
  183. package/dist/engine/shared/carouselAnimation.js +62 -0
  184. package/dist/engine/shared/carouselAnimation.js.map +1 -0
  185. package/dist/engine/shared/imageGrid/types.d.ts +2 -0
  186. package/dist/engine/shared/imageGrid/types.d.ts.map +1 -1
  187. package/dist/engine/shared/showWhen.d.ts +44 -0
  188. package/dist/engine/shared/showWhen.d.ts.map +1 -0
  189. package/dist/engine/shared/showWhen.js +33 -0
  190. package/dist/engine/shared/showWhen.js.map +1 -0
  191. package/dist/hooks/useEditorState.d.ts +3 -0
  192. package/dist/hooks/useEditorState.d.ts.map +1 -1
  193. package/dist/hooks/useEditorState.js +106 -84
  194. package/dist/hooks/useEditorState.js.map +1 -1
  195. package/dist/index.d.ts +13 -2
  196. package/dist/index.d.ts.map +1 -1
  197. package/dist/index.js +109 -93
  198. package/dist/index.js.map +1 -1
  199. package/dist/shared/templates/escola-blog.d.ts +3 -0
  200. package/dist/shared/templates/escola-blog.d.ts.map +1 -0
  201. package/dist/shared/templates/escola-blog.js +160 -0
  202. package/dist/shared/templates/escola-blog.js.map +1 -0
  203. package/dist/shared/templates/index.d.ts +2 -0
  204. package/dist/shared/templates/index.d.ts.map +1 -1
  205. package/dist/shared/templates/index.js +30 -12
  206. package/dist/shared/templates/index.js.map +1 -1
  207. package/dist/utils/changeDetector.d.ts +2 -1
  208. package/dist/utils/changeDetector.d.ts.map +1 -1
  209. package/dist/utils/changeDetector.js +39 -39
  210. package/dist/utils/changeDetector.js.map +1 -1
  211. package/dist/utils/sharedTemplateToEngine.d.ts +4 -5
  212. package/dist/utils/sharedTemplateToEngine.d.ts.map +1 -1
  213. package/dist/utils/sharedTemplateToEngine.js +14 -87
  214. package/dist/utils/sharedTemplateToEngine.js.map +1 -1
  215. package/dist/viewer/LandingPageViewer.d.ts +13 -6
  216. package/dist/viewer/LandingPageViewer.d.ts.map +1 -1
  217. package/dist/viewer/LandingPageViewer.js +220 -122
  218. package/dist/viewer/LandingPageViewer.js.map +1 -1
  219. package/package.json +3 -2
@@ -0,0 +1,101 @@
1
+ import { escapeHtml as e, dataBlockIdAttr as z } from "../../shared/htmlHelpers.js";
2
+ import { generateScopedId as B } from "../../shared/idGenerator.js";
3
+ import { resolveResponsiveColumns as N, generateResponsiveGridStyles as R } from "../../shared/responsiveGridHelper.js";
4
+ function D(r, k, H, A) {
5
+ const {
6
+ title: c,
7
+ excerpt: t,
8
+ image: s,
9
+ date: o,
10
+ category: i,
11
+ authorName: d,
12
+ authorAvatar: l,
13
+ readingTime: m,
14
+ linkHref: p,
15
+ linkText: n,
16
+ variant: y = "default",
17
+ showImage: x = !0,
18
+ showCategory: f = !0,
19
+ showDate: h = !0,
20
+ showAuthor: $ = !1,
21
+ showReadingTime: v = !1
22
+ } = r.props;
23
+ if (y === "horizontal") {
24
+ const g = x && s ? `<div style="width: 260px; min-height: 180px; flex-shrink: 0; background-image: url(${e(s)}); background-size: cover; background-position: center;"></div>` : "", a = [];
25
+ f && i && a.push(e(i)), h && o && a.push(e(o)), v && m && a.push(e(m));
26
+ const w = a.length ? `<p style="font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;">${a.join(" &middot; ")}</p>` : "", I = $ && d ? `<div style="display: flex; align-items: center; gap: 0.5rem; margin-top: auto; padding-top: 0.75rem;">${l ? `<img src="${e(l)}" alt="${e(d)}" style="width: 28px; height: 28px; border-radius: 50%; object-fit: cover;" />` : ""}<span style="font-size: 0.8rem; color: var(--sg-muted-text);">${e(d)}</span></div>` : "", T = n ? `<a href="${e(p || "#")}" style="color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;">${e(n)}</a>` : "";
27
+ return `<article ${z(r.id)} class="sg-blog-post-card" style="display: flex; background-color: var(--sg-bg); border-radius: var(--sg-card-radius); overflow: hidden; box-shadow: var(--sg-card-shadow);" data-variant="horizontal">${g}<div style="padding: 1.25rem; display: flex; flex-direction: column; flex: 1;">${w}<h3 style="font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;">${e(c)}</h3>${t ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.75rem;">${e(t)}</p>` : ""}${T}${I}</div></article>`;
28
+ }
29
+ if (y === "minimal") {
30
+ const g = [];
31
+ f && i && g.push(e(i)), h && o && g.push(e(o)), v && m && g.push(e(m));
32
+ const a = g.length ? `<p style="font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;">${g.join(" &middot; ")}</p>` : "", w = n ? `<a href="${e(p || "#")}" style="color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;">${e(n)}</a>` : "";
33
+ return `<article ${z(r.id)} class="sg-blog-post-card" style="padding: 1.25rem 0; border-bottom: 1px solid var(--sg-border, #e5e7eb);" data-variant="minimal">${a}<h3 style="font-size: 1.125rem; font-weight: 600; margin-bottom: 0.25rem;">${e(c)}</h3>${t ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.5rem;">${e(t)}</p>` : ""}${w}</article>`;
34
+ }
35
+ const u = x && s ? `<div style="height: 200px; background-image: url(${e(s)}); background-size: cover; background-position: center;"></div>` : "", b = [];
36
+ f && i && b.push(e(i)), h && o && b.push(e(o)), v && m && b.push(e(m));
37
+ const P = b.length ? `<p style="font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;">${b.join(" &middot; ")}</p>` : "", j = $ && d ? `<div style="display: flex; align-items: center; gap: 0.5rem; margin-top: 1rem;">${l ? `<img src="${e(l)}" alt="${e(d)}" style="width: 32px; height: 32px; border-radius: 50%; object-fit: cover;" />` : ""}<span style="font-size: 0.8rem; color: var(--sg-muted-text);">${e(d)}</span></div>` : "", C = n ? `<a href="${e(p || "#")}" style="color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;">${e(n)}</a>` : "";
38
+ return `<article ${z(r.id)} class="sg-blog-post-card" style="background-color: var(--sg-bg); border-radius: var(--sg-card-radius); overflow: hidden; box-shadow: var(--sg-card-shadow);" data-variant="default">${u}<div style="padding: 1.5rem;">${P}<h3 style="font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;">${e(c)}</h3>${t ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1rem;">${e(t)}</p>` : ""}${C}${j}</div></article>`;
39
+ }
40
+ function G(r, k, H, A, c) {
41
+ const {
42
+ title: t,
43
+ subtitle: s,
44
+ columns: o = 3,
45
+ cards: i = [],
46
+ showViewAll: d = !1,
47
+ viewAllText: l,
48
+ viewAllHref: m
49
+ } = r.props, p = B(r.id || "", "blog-post-grid"), n = N(o, 1, 2, o), { inlineStyles: y, mediaQueries: x } = R(
50
+ p,
51
+ n,
52
+ "2rem"
53
+ ), f = t || s ? `<div data-block-group="Cabeçalho" style="text-align: center; margin-bottom: 3rem;">${t ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;">${e(t)}</h2>` : ""}${s ? `<p style="color: var(--sg-muted-text);">${e(s)}</p>` : ""}</div>` : "";
54
+ if (!c)
55
+ throw new Error("exportBlogPostGrid requires renderChild function");
56
+ const h = i.length > 0 ? i.map(
57
+ (v, u) => c(
58
+ {
59
+ id: `${r.id}-card-${u}`,
60
+ type: "blogPostCard",
61
+ props: v
62
+ },
63
+ k + 1,
64
+ H,
65
+ A
66
+ )
67
+ ).join("") : '<div style="grid-column: 1 / -1; text-align: center; padding: 3rem 1rem; color: var(--sg-muted-text); border: 2px dashed var(--sg-border, #e5e7eb); border-radius: var(--sg-card-radius, 0.5rem);"><p style="font-size: 1rem; margin-bottom: 0.5rem;">Nenhum post encontrado</p><p style="font-size: 0.875rem;">Os posts aparecerão aqui quando forem publicados.</p></div>', $ = d && l ? `<div data-block-group="Rodapé" style="text-align: center; margin-top: 2.5rem;"><a href="${e(m || "#")}" style="display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: #fff; font-weight: 600; border-radius: var(--sg-button-radius); text-decoration: none;">${e(l)}</a></div>` : "";
68
+ return `<style>${x}</style><section ${z(r.id)} style="padding: 4rem 0; background-color: var(--sg-bg);"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${f}<div data-block-group="Layout" id="${p}" style="${y}">${h}</div>${$}</div></section>`;
69
+ }
70
+ function V(r, k, H, A) {
71
+ const {
72
+ title: c,
73
+ content: t,
74
+ featuredImage: s,
75
+ date: o,
76
+ category: i,
77
+ readingTime: d,
78
+ tags: l = [],
79
+ showFeaturedImage: m = !0,
80
+ showAuthor: p = !0,
81
+ authorVariant: n = "inline",
82
+ showDate: y = !0,
83
+ showTags: x = !0,
84
+ showReadingTime: f = !0,
85
+ contentMaxWidth: h = "720px"
86
+ } = r.props, $ = m && s ? `<div data-block-group="Mídia" style="width: 100%; height: 400px; background-image: url(${e(s)}); background-size: cover; background-position: center; border-radius: var(--sg-card-radius); margin-bottom: 2rem;"></div>` : "", v = i ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 1rem;">${e(i)}</span>` : "", u = [];
87
+ y && o && u.push(e(o)), f && d && u.push(e(d));
88
+ const b = u.length ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1.5rem;">${u.join(" &middot; ")}</p>` : "", P = `<h1 data-block-group="Conteúdo" style="font-size: var(--sg-heading-h1, 2.25rem); font-weight: 700; margin-bottom: 0.75rem; line-height: 1.2;">${e(c)}</h1>`, j = t ? `<div class="sg-blog-post-content" style="font-size: 1.0625rem; line-height: 1.75; color: var(--sg-text);">${t}</div>` : "", C = '<div style="width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;font-size:1.5rem;font-weight:700;">A</div>', g = '<div style="width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;font-size:1.1rem;font-weight:700;">A</div>';
89
+ let a = "";
90
+ p && (n === "card" ? a = `<div data-block-group="Autor" style="display:flex;align-items:flex-start;gap:1rem;margin-top:3rem;padding:1.25rem;border-radius:var(--sg-card-radius, 0.75rem);background-color:var(--sg-surface, #f9fafb);">${C}<div><div style="font-size:0.75rem;color:var(--sg-muted-text);text-transform:uppercase;letter-spacing:0.05em;margin-bottom:0.125rem;">Escrito por</div><div style="font-weight:600;font-size:1rem;">Nome do Autor</div><p style="color:var(--sg-muted-text);font-size:0.875rem;margin:0.25rem 0 0;">Bio do autor carregada do banco de dados.</p></div></div>` : n === "minimal" ? a = '<p data-block-group="Autor" style="margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);color:var(--sg-muted-text);font-size:0.9375rem;">Escrito por <span style="font-weight:600;color:var(--sg-text);">Nome do Autor</span></p>' : a = `<div data-block-group="Autor" style="display:flex;align-items:center;gap:0.75rem;margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);">${g}<div><div style="font-size:0.75rem;color:var(--sg-muted-text);">Escrito por</div><div style="font-weight:600;font-size:0.9375rem;">Nome do Autor</div></div></div>`);
91
+ const w = x && l.length > 0 ? `<div data-block-group="Visibilidade" style="margin-top: 2rem; display: flex; flex-wrap: wrap; gap: 0.5rem;">${l.map(
92
+ (I) => `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-surface, #f3f4f6); color: var(--sg-text); border-radius: 999px; font-size: 0.75rem;">${e(I)}</span>`
93
+ ).join("")}</div>` : "";
94
+ return `<article ${z(r.id)} class="sg-blog-post-detail" style="padding: 4rem 0; background-color: var(--sg-bg);"><div style="max-width: ${e(h)}; margin: 0 auto; padding: 0 1rem;">${$}${v}${P}${b}${j}${a}${w}</div></article>`;
95
+ }
96
+ export {
97
+ D as exportBlogPostCard,
98
+ V as exportBlogPostDetail,
99
+ G as exportBlogPostGrid
100
+ };
101
+ //# sourceMappingURL=BlogPostExporters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlogPostExporters.js","sources":["../../../../../src/engine/export/exporters/sections/BlogPostExporters.ts"],"sourcesContent":["/**\n * Blog Post Exporters\n * BlogPostCard, BlogPostGrid, BlogPostDetail\n * Mobile-first responsive layouts for blog plugin blocks\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n} from \"../../shared/responsiveGridHelper\";\n\n// ---------------------------------------------------------------------------\n// BlogPostCard\n// ---------------------------------------------------------------------------\n\nexport function exportBlogPostCard(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n excerpt,\n image,\n date,\n category,\n authorName,\n authorAvatar,\n readingTime,\n linkHref,\n linkText,\n variant = \"default\",\n showImage = true,\n showCategory = true,\n showDate = true,\n showAuthor = false,\n showReadingTime = false,\n } = (block as any).props;\n\n // ---------- variant: horizontal ----------\n if (variant === \"horizontal\") {\n const imgHtml =\n showImage && image\n ? `<div style=\"width: 260px; min-height: 180px; flex-shrink: 0; background-image: url(${escapeHtml(image)}); background-size: cover; background-position: center;\"></div>`\n : \"\";\n\n const metaParts: string[] = [];\n if (showCategory && category) metaParts.push(escapeHtml(category));\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n const authorHtml =\n showAuthor && authorName\n ? `<div style=\"display: flex; align-items: center; gap: 0.5rem; margin-top: auto; padding-top: 0.75rem;\">${\n authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${escapeHtml(authorName)}\" style=\"width: 28px; height: 28px; border-radius: 50%; object-fit: cover;\" />`\n : \"\"\n }<span style=\"font-size: 0.8rem; color: var(--sg-muted-text);\">${escapeHtml(authorName)}</span></div>`\n : \"\";\n\n const linkHtml = linkText\n ? `<a href=\"${escapeHtml(linkHref || \"#\")}\" style=\"color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;\">${escapeHtml(linkText)}</a>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-card\" style=\"display: flex; background-color: var(--sg-bg); border-radius: var(--sg-card-radius); overflow: hidden; box-shadow: var(--sg-card-shadow);\" data-variant=\"horizontal\">${imgHtml}<div style=\"padding: 1.25rem; display: flex; flex-direction: column; flex: 1;\">${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;\">${escapeHtml(title)}</h3>${excerpt ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.75rem;\">${escapeHtml(excerpt)}</p>` : \"\"}${linkHtml}${authorHtml}</div></article>`;\n }\n\n // ---------- variant: minimal ----------\n if (variant === \"minimal\") {\n const metaParts: string[] = [];\n if (showCategory && category) metaParts.push(escapeHtml(category));\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n const linkHtml = linkText\n ? `<a href=\"${escapeHtml(linkHref || \"#\")}\" style=\"color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;\">${escapeHtml(linkText)}</a>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-card\" style=\"padding: 1.25rem 0; border-bottom: 1px solid var(--sg-border, #e5e7eb);\" data-variant=\"minimal\">${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.25rem;\">${escapeHtml(title)}</h3>${excerpt ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.5rem;\">${escapeHtml(excerpt)}</p>` : \"\"}${linkHtml}</article>`;\n }\n\n // ---------- variant: default ----------\n const imgHtml =\n showImage && image\n ? `<div style=\"height: 200px; background-image: url(${escapeHtml(image)}); background-size: cover; background-position: center;\"></div>`\n : \"\";\n\n const metaParts: string[] = [];\n if (showCategory && category) metaParts.push(escapeHtml(category));\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n const authorHtml =\n showAuthor && authorName\n ? `<div style=\"display: flex; align-items: center; gap: 0.5rem; margin-top: 1rem;\">${\n authorAvatar\n ? `<img src=\"${escapeHtml(authorAvatar)}\" alt=\"${escapeHtml(authorName)}\" style=\"width: 32px; height: 32px; border-radius: 50%; object-fit: cover;\" />`\n : \"\"\n }<span style=\"font-size: 0.8rem; color: var(--sg-muted-text);\">${escapeHtml(authorName)}</span></div>`\n : \"\";\n\n const linkHtml = linkText\n ? `<a href=\"${escapeHtml(linkHref || \"#\")}\" style=\"color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;\">${escapeHtml(linkText)}</a>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-card\" style=\"background-color: var(--sg-bg); border-radius: var(--sg-card-radius); overflow: hidden; box-shadow: var(--sg-card-shadow);\" data-variant=\"default\">${imgHtml}<div style=\"padding: 1.5rem;\">${metaHtml}<h3 style=\"font-size: 1.125rem; font-weight: 600; margin-bottom: 0.5rem;\">${escapeHtml(title)}</h3>${excerpt ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1rem;\">${escapeHtml(excerpt)}</p>` : \"\"}${linkHtml}${authorHtml}</div></article>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogPostGrid\n// ---------------------------------------------------------------------------\n\nexport function exportBlogPostGrid(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n renderChild?: (block: Block, _depth: number, basePath?: string, theme?: ThemeTokens) => string,\n): string {\n const {\n title,\n subtitle,\n columns = 3,\n cards = [],\n showViewAll = false,\n viewAllText,\n viewAllHref,\n } = (block as any).props;\n\n // Responsive grid: 1 col (mobile) -> 2 cols (tablet) -> N cols (desktop)\n const gridId = generateScopedId(block.id || \"\", \"blog-post-grid\");\n const responsiveConfig = resolveResponsiveColumns(columns, 1, 2, columns);\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(\n gridId,\n responsiveConfig,\n \"2rem\",\n );\n\n const headerHtml =\n title || subtitle\n ? `<div data-block-group=\"Cabeçalho\" style=\"text-align: center; margin-bottom: 3rem;\">${title ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;\">${escapeHtml(title)}</h2>` : \"\"}${subtitle ? `<p style=\"color: var(--sg-muted-text);\">${escapeHtml(subtitle)}</p>` : \"\"}</div>`\n : \"\";\n\n if (!renderChild) {\n throw new Error(\"exportBlogPostGrid requires renderChild function\");\n }\n\n const cardsHtml = cards.length > 0\n ? cards\n .map((c: any, i: number) =>\n renderChild(\n {\n id: `${block.id}-card-${i}`,\n type: \"blogPostCard\",\n props: c,\n } as Block,\n depth + 1,\n basePath,\n theme,\n ),\n )\n .join(\"\")\n : `<div style=\"grid-column: 1 / -1; text-align: center; padding: 3rem 1rem; color: var(--sg-muted-text); border: 2px dashed var(--sg-border, #e5e7eb); border-radius: var(--sg-card-radius, 0.5rem);\"><p style=\"font-size: 1rem; margin-bottom: 0.5rem;\">Nenhum post encontrado</p><p style=\"font-size: 0.875rem;\">Os posts aparecerão aqui quando forem publicados.</p></div>`;\n\n const viewAllHtml =\n showViewAll && viewAllText\n ? `<div data-block-group=\"Rodapé\" style=\"text-align: center; margin-top: 2.5rem;\"><a href=\"${escapeHtml(viewAllHref || \"#\")}\" style=\"display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: #fff; font-weight: 600; border-radius: var(--sg-button-radius); text-decoration: none;\">${escapeHtml(viewAllText)}</a></div>`\n : \"\";\n\n return `<style>${mediaQueries}</style><section ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; background-color: var(--sg-bg);\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div data-block-group=\"Layout\" id=\"${gridId}\" style=\"${inlineStyles}\">${cardsHtml}</div>${viewAllHtml}</div></section>`;\n}\n\n// ---------------------------------------------------------------------------\n// BlogPostDetail\n// ---------------------------------------------------------------------------\n\nexport function exportBlogPostDetail(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n content,\n featuredImage,\n date,\n category,\n readingTime,\n tags = [],\n showFeaturedImage = true,\n showAuthor = true,\n authorVariant = \"inline\",\n showDate = true,\n showTags = true,\n showReadingTime = true,\n contentMaxWidth = \"720px\",\n } = (block as any).props;\n\n // Featured image banner\n const featuredImageHtml =\n showFeaturedImage && featuredImage\n ? `<div data-block-group=\"Mídia\" style=\"width: 100%; height: 400px; background-image: url(${escapeHtml(featuredImage)}); background-size: cover; background-position: center; border-radius: var(--sg-card-radius); margin-bottom: 2rem;\"></div>`\n : \"\";\n\n // Category badge\n const categoryHtml = category\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 1rem;\">${escapeHtml(category)}</span>`\n : \"\";\n\n // Meta line (date + reading time)\n const metaParts: string[] = [];\n if (showDate && date) metaParts.push(escapeHtml(date));\n if (showReadingTime && readingTime) metaParts.push(escapeHtml(readingTime));\n const metaHtml = metaParts.length\n ? `<p style=\"color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1.5rem;\">${metaParts.join(\" &middot; \")}</p>`\n : \"\";\n\n // Title\n const titleHtml = `<h1 data-block-group=\"Conteúdo\" style=\"font-size: var(--sg-heading-h1, 2.25rem); font-weight: 700; margin-bottom: 0.75rem; line-height: 1.2;\">${escapeHtml(title)}</h1>`;\n\n // Content — trusted HTML from backend, not escaped\n const contentHtml = content\n ? `<div class=\"sg-blog-post-content\" style=\"font-size: 1.0625rem; line-height: 1.75; color: var(--sg-text);\">${content}</div>`\n : \"\";\n\n // Author — placeholder structure (real data injected by ContentProvider at runtime)\n const avatarPlaceholder = `<div style=\"width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;font-size:1.5rem;font-weight:700;\">A</div>`;\n const avatarSmall = `<div style=\"width:40px;height:40px;border-radius:50%;background:linear-gradient(135deg, var(--sg-primary, #6366f1) 0%, #818cf8 100%);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#fff;font-size:1.1rem;font-weight:700;\">A</div>`;\n\n let authorHtml = \"\";\n if (showAuthor) {\n if (authorVariant === \"card\") {\n authorHtml = `<div data-block-group=\"Autor\" style=\"display:flex;align-items:flex-start;gap:1rem;margin-top:3rem;padding:1.25rem;border-radius:var(--sg-card-radius, 0.75rem);background-color:var(--sg-surface, #f9fafb);\">${avatarPlaceholder}<div><div style=\"font-size:0.75rem;color:var(--sg-muted-text);text-transform:uppercase;letter-spacing:0.05em;margin-bottom:0.125rem;\">Escrito por</div><div style=\"font-weight:600;font-size:1rem;\">Nome do Autor</div><p style=\"color:var(--sg-muted-text);font-size:0.875rem;margin:0.25rem 0 0;\">Bio do autor carregada do banco de dados.</p></div></div>`;\n } else if (authorVariant === \"minimal\") {\n authorHtml = `<p data-block-group=\"Autor\" style=\"margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);color:var(--sg-muted-text);font-size:0.9375rem;\">Escrito por <span style=\"font-weight:600;color:var(--sg-text);\">Nome do Autor</span></p>`;\n } else {\n // inline (default)\n authorHtml = `<div data-block-group=\"Autor\" style=\"display:flex;align-items:center;gap:0.75rem;margin-top:3rem;padding-top:2rem;border-top:1px solid var(--sg-border, #e5e7eb);\">${avatarSmall}<div><div style=\"font-size:0.75rem;color:var(--sg-muted-text);\">Escrito por</div><div style=\"font-weight:600;font-size:0.9375rem;\">Nome do Autor</div></div></div>`;\n }\n }\n\n // Tags\n const tagsHtml =\n showTags && tags.length > 0\n ? `<div data-block-group=\"Visibilidade\" style=\"margin-top: 2rem; display: flex; flex-wrap: wrap; gap: 0.5rem;\">${tags\n .map(\n (tag: string) =>\n `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-surface, #f3f4f6); color: var(--sg-text); border-radius: 999px; font-size: 0.75rem;\">${escapeHtml(tag)}</span>`,\n )\n .join(\"\")}</div>`\n : \"\";\n\n return `<article ${dataBlockIdAttr(block.id)} class=\"sg-blog-post-detail\" style=\"padding: 4rem 0; background-color: var(--sg-bg);\"><div style=\"max-width: ${escapeHtml(contentMaxWidth)}; margin: 0 auto; padding: 0 1rem;\">${featuredImageHtml}${categoryHtml}${titleHtml}${metaHtml}${contentHtml}${authorHtml}${tagsHtml}</div></article>`;\n}\n"],"names":["exportBlogPostCard","block","depth","basePath","theme","title","excerpt","image","date","category","authorName","authorAvatar","readingTime","linkHref","linkText","variant","showImage","showCategory","showDate","showAuthor","showReadingTime","imgHtml","escapeHtml","metaParts","metaHtml","authorHtml","linkHtml","dataBlockIdAttr","exportBlogPostGrid","renderChild","subtitle","columns","cards","showViewAll","viewAllText","viewAllHref","gridId","generateScopedId","responsiveConfig","resolveResponsiveColumns","inlineStyles","mediaQueries","generateResponsiveGridStyles","headerHtml","cardsHtml","c","i","viewAllHtml","exportBlogPostDetail","content","featuredImage","tags","showFeaturedImage","authorVariant","showTags","contentMaxWidth","featuredImageHtml","categoryHtml","titleHtml","contentHtml","avatarPlaceholder","avatarSmall","tagsHtml","tag"],"mappings":"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"}
@@ -1,41 +1,41 @@
1
1
  import { escapeHtml as t, dataBlockIdAttr as A } from "../../shared/htmlHelpers.js";
2
2
  import { generateScopedId as B } from "../../shared/idGenerator.js";
3
- import { socialIconPaths as u } from "../../../shared/socialIcons.js";
3
+ import { socialIconPaths as y } from "../../../shared/socialIcons.js";
4
4
  import { generateLinkHoverStyles as P } from "../../../shared/hoverEffects/linkHover.js";
5
- function G(r, E, F, x) {
5
+ function G(r, E, F, b) {
6
6
  const {
7
7
  logo: o,
8
8
  description: i,
9
9
  columns: n = [],
10
10
  social: l = [],
11
- copyright: d,
12
- variant: b = "simple",
11
+ copyright: m,
12
+ variant: x = "simple",
13
13
  // Hover effects
14
- linkHoverEffect: c = "underline",
14
+ linkHoverEffect: g = "underline",
15
15
  linkHoverIntensity: k = 50,
16
16
  linkHoverColor: H
17
- } = r.props, w = H || x?.colors?.primary || "#3b82f6", s = P({
18
- effect: c,
17
+ } = r.props, w = H || b?.colors?.primary || "#3b82f6", s = P({
18
+ effect: g,
19
19
  intensity: k,
20
20
  hoverColor: w
21
- }), g = `[data-block-id="${r.id}"]`;
21
+ }), c = `[data-block-id="${r.id}"]`;
22
22
  let a = "";
23
- c !== "none" && (s.base && (a += `
24
- ${g} .sg-footer__link {
23
+ g !== "none" && (s.base && (a += `
24
+ ${c} .sg-footer__link {
25
25
  ${s.base}
26
26
  transition: all 0.3s ease;
27
27
  }
28
28
  `), a += `
29
- ${g} .sg-footer__link:hover {
29
+ ${c} .sg-footer__link:hover {
30
30
  ${s.hover}
31
31
  }
32
32
  `);
33
- const p = typeof o == "string" ? o : o?.src ?? "", C = typeof o == "string" ? "Logo" : o?.alt ?? "Logo", _ = b === "multi-column" && n.length > 0, f = l.map(
34
- (e) => `<a href="${t(e.href)}" target="_blank" rel="noopener noreferrer" style="color: var(--sg-muted-text, #64748b); text-decoration: none;"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="${u[e.platform] || u.github}"/></svg></a>`
33
+ const p = typeof o == "string" ? o : o?.src ?? "", C = typeof o == "string" ? "Logo" : o?.alt ?? "Logo", _ = x === "multi-column" && n.length > 0, f = l.map(
34
+ (e) => `<a href="${t(e.href)}" target="_blank" rel="noopener noreferrer" style="color: var(--sg-muted-text, #64748b); text-decoration: none;"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="${y[e.platform] || y.github}"/></svg></a>`
35
35
  ).join(""), v = p ? `<img src="${t(p)}" alt="${t(C)}" style="height: 2.5rem; object-fit: contain; margin-bottom: 1rem;" />` : "", $ = i ? `<p style="color: var(--sg-muted-text, #64748b); font-size: 0.875rem; line-height: 1.6; margin-bottom: 1rem;">${t(i)}</p>` : "", j = l.length > 0 ? `<div style="display: flex; gap: 0.75rem;">${f}</div>` : "";
36
- let m = "";
36
+ let d = "";
37
37
  if (_) {
38
- const e = B(r.id || "", "footer-grid"), z = `
38
+ const e = B(r.id || "", "footer-grid"), I = `
39
39
  #${e} {
40
40
  display: grid;
41
41
  grid-template-columns: 1fr;
@@ -51,17 +51,17 @@ function G(r, E, F, x) {
51
51
  grid-template-columns: 2fr repeat(${n.length}, 1fr);
52
52
  }
53
53
  }
54
- `, L = n.map((h) => {
54
+ `, z = n.map((h) => {
55
55
  const S = (h.links || []).map(
56
- (y) => `<li><a href="${t(y.href)}" class="sg-footer__link" style="color: var(--sg-muted-text, #64748b); text-decoration: none; font-size: 0.875rem; display: inline-block; padding: 0.25rem 0; transition: all 0.3s ease;">${t(y.text)}</a></li>`
56
+ (u) => `<li><a href="${t(u.href)}" class="sg-footer__link" style="color: var(--sg-muted-text, #64748b); text-decoration: none; font-size: 0.875rem; display: inline-block; padding: 0.25rem 0; transition: all 0.3s ease;">${t(u.text)}</a></li>`
57
57
  ).join("");
58
- return `<div><h4 style="font-weight: 600; margin-bottom: 1rem; color: var(--sg-text, #0f172a);">${t(h.title)}</h4><ul style="list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.5rem;">${S}</ul></div>`;
58
+ return `<div data-block-group="🔗 Links"><h4 style="font-weight: 600; margin-bottom: 1rem; color: var(--sg-text, #0f172a);">${t(h.title)}</h4><ul style="list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.5rem;">${S}</ul></div>`;
59
59
  }).join("");
60
- m = `<style>${z}${a}</style><div id="${e}" style="margin-bottom: 2rem;"><div>${v}${$}${j}</div>${L}</div>`;
60
+ d = `<style>${I}${a}</style><div id="${e}" style="margin-bottom: 2rem;"><div data-block-group="Logo">${v}${$}${j}</div>${z}</div>`;
61
61
  } else
62
- m = `<div style="text-align: center; margin-bottom: 1.5rem;">${v}${$ ? `<p style="color: var(--sg-muted-text, #64748b); font-size: 0.875rem; max-width: 400px; margin: 0 auto 1rem;">${t(i || "")}</p>` : ""}${l.length > 0 ? `<div style="display: flex; justify-content: center; gap: 1rem;">${f}</div>` : ""}</div>`;
63
- const I = d ? `<div style="border-top: 1px solid var(--sg-border, #e5e7eb); padding-top: 1.5rem; text-align: center;"><p style="color: var(--sg-muted-text, #64748b); font-size: 0.875rem; margin: 0;">${t(d)}</p></div>` : "";
64
- return `<footer ${A(r.id)} style="background-color: var(--sg-surface, #f8fafc); border-top: 1px solid var(--sg-border, #e5e7eb); padding: 3rem 0 1.5rem;"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${m}${I}</div></footer>`;
62
+ d = `<div data-block-group="Logo" style="text-align: center; margin-bottom: 1.5rem;">${v}${$ ? `<p style="color: var(--sg-muted-text, #64748b); font-size: 0.875rem; max-width: 400px; margin: 0 auto 1rem;">${t(i || "")}</p>` : ""}${l.length > 0 ? `<div style="display: flex; justify-content: center; gap: 1rem;">${f}</div>` : ""}</div>`;
63
+ const L = m ? `<div style="border-top: 1px solid var(--sg-border, #e5e7eb); padding-top: 1.5rem; text-align: center;"><p style="color: var(--sg-muted-text, #64748b); font-size: 0.875rem; margin: 0;">${t(m)}</p></div>` : "";
64
+ return `<footer ${A(r.id)} style="background-color: var(--sg-surface, #f8fafc); border-top: 1px solid var(--sg-border, #e5e7eb); padding: 3rem 0 1.5rem;"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${d}${L}</div></footer>`;
65
65
  }
66
66
  export {
67
67
  G as exportFooter
@@ -1 +1 @@
1
- {"version":3,"file":"FooterExporter.js","sources":["../../../../../src/engine/export/exporters/sections/FooterExporter.ts"],"sourcesContent":["/**\n * Footer Section Exporter\n * Mobile-first responsive: multi-column collapses to stack in mobile\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n generateLinkHoverStyles,\n type LinkHoverEffect,\n} from \"../../../shared/hoverEffects\";\nimport { socialIconPaths } from \"../../../shared/socialIcons\";\n\nexport function exportFooter(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n logo,\n description,\n columns = [],\n social = [],\n copyright,\n variant = \"simple\",\n // Hover effects\n linkHoverEffect = \"underline\",\n linkHoverIntensity = 50,\n linkHoverColor,\n } = (block as any).props;\n\n // Determinar cor do hover (usa primary do tema se não definido)\n const hoverColor = linkHoverColor || theme?.colors?.primary || \"#3b82f6\";\n\n // Gerar estilos de hover para links\n const linkHoverStyles = generateLinkHoverStyles({\n effect: linkHoverEffect as LinkHoverEffect,\n intensity: linkHoverIntensity,\n hoverColor,\n });\n\n // Gerar CSS de hover com escopo do bloco\n const scope = `[data-block-id=\"${block.id}\"]`;\n let hoverCss = \"\";\n\n if (linkHoverEffect !== \"none\") {\n // Estilos base se necessários\n if (linkHoverStyles.base) {\n hoverCss += `\n ${scope} .sg-footer__link {\n ${linkHoverStyles.base}\n transition: all 0.3s ease;\n }\n `;\n }\n // Estilos de hover\n hoverCss += `\n ${scope} .sg-footer__link:hover {\n ${linkHoverStyles.hover}\n }\n `;\n }\n\n const logoUrl = typeof logo === \"string\" ? logo : (logo?.src ?? \"\");\n const logoAlt = typeof logo === \"string\" ? \"Logo\" : (logo?.alt ?? \"Logo\");\n\n const isMultiColumn = variant === \"multi-column\" && columns.length > 0;\n\n const socialHtml = social\n .map(\n (item: any) =>\n `<a href=\"${escapeHtml(item.href)}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: var(--sg-muted-text, #64748b); text-decoration: none;\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"${socialIconPaths[item.platform] || socialIconPaths.github}\"/></svg></a>`,\n )\n .join(\"\");\n\n const logoHtml = logoUrl\n ? `<img src=\"${escapeHtml(logoUrl)}\" alt=\"${escapeHtml(logoAlt)}\" style=\"height: 2.5rem; object-fit: contain; margin-bottom: 1rem;\" />`\n : \"\";\n\n const descHtml = description\n ? `<p style=\"color: var(--sg-muted-text, #64748b); font-size: 0.875rem; line-height: 1.6; margin-bottom: 1rem;\">${escapeHtml(description)}</p>`\n : \"\";\n\n const socialContainerHtml =\n social.length > 0\n ? `<div style=\"display: flex; gap: 0.75rem;\">${socialHtml}</div>`\n : \"\";\n\n let contentHtml = \"\";\n if (isMultiColumn) {\n // Responsive footer grid: 1 col (mobile) → 2 cols (tablet) → 2fr + N×1fr (desktop)\n const footerId = generateScopedId(block.id || \"\", \"footer-grid\");\n const footerCss = `\n #${footerId} {\n display: grid;\n grid-template-columns: 1fr;\n gap: 2rem;\n }\n @media (min-width: 640px) {\n #${footerId} {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n @media (min-width: 1024px) {\n #${footerId} {\n grid-template-columns: 2fr repeat(${columns.length}, 1fr);\n }\n }\n `;\n\n const columnsHtml = columns\n .map((col: any) => {\n const linksHtml = (col.links || [])\n .map(\n (link: any) =>\n `<li><a href=\"${escapeHtml(link.href)}\" class=\"sg-footer__link\" style=\"color: var(--sg-muted-text, #64748b); text-decoration: none; font-size: 0.875rem; display: inline-block; padding: 0.25rem 0; transition: all 0.3s ease;\">${escapeHtml(link.text)}</a></li>`,\n )\n .join(\"\");\n return `<div><h4 style=\"font-weight: 600; margin-bottom: 1rem; color: var(--sg-text, #0f172a);\">${escapeHtml(col.title)}</h4><ul style=\"list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.5rem;\">${linksHtml}</ul></div>`;\n })\n .join(\"\");\n\n contentHtml = `<style>${footerCss}${hoverCss}</style><div id=\"${footerId}\" style=\"margin-bottom: 2rem;\"><div>${logoHtml}${descHtml}${socialContainerHtml}</div>${columnsHtml}</div>`;\n } else {\n contentHtml = `<div style=\"text-align: center; margin-bottom: 1.5rem;\">${logoHtml}${descHtml ? `<p style=\"color: var(--sg-muted-text, #64748b); font-size: 0.875rem; max-width: 400px; margin: 0 auto 1rem;\">${escapeHtml(description || \"\")}</p>` : \"\"}${social.length > 0 ? `<div style=\"display: flex; justify-content: center; gap: 1rem;\">${socialHtml}</div>` : \"\"}</div>`;\n }\n\n const copyrightHtml = copyright\n ? `<div style=\"border-top: 1px solid var(--sg-border, #e5e7eb); padding-top: 1.5rem; text-align: center;\"><p style=\"color: var(--sg-muted-text, #64748b); font-size: 0.875rem; margin: 0;\">${escapeHtml(copyright)}</p></div>`\n : \"\";\n\n return `<footer ${dataBlockIdAttr(block.id)} style=\"background-color: var(--sg-surface, #f8fafc); border-top: 1px solid var(--sg-border, #e5e7eb); padding: 3rem 0 1.5rem;\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${contentHtml}${copyrightHtml}</div></footer>`;\n}\n"],"names":["exportFooter","block","depth","basePath","theme","logo","description","columns","social","copyright","variant","linkHoverEffect","linkHoverIntensity","linkHoverColor","hoverColor","linkHoverStyles","generateLinkHoverStyles","scope","hoverCss","logoUrl","logoAlt","isMultiColumn","socialHtml","item","escapeHtml","socialIconPaths","logoHtml","descHtml","socialContainerHtml","contentHtml","footerId","generateScopedId","footerCss","columnsHtml","col","linksHtml","link","copyrightHtml","dataBlockIdAttr"],"mappings":";;;;AAeO,SAASA,EACdC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA,aAAAC;AAAA,IACA,SAAAC,IAAU,CAAA;AAAA,IACV,QAAAC,IAAS,CAAA;AAAA,IACT,WAAAC;AAAA,IACA,SAAAC,IAAU;AAAA;AAAA,IAEV,iBAAAC,IAAkB;AAAA,IAClB,oBAAAC,IAAqB;AAAA,IACrB,gBAAAC;AAAA,EAAA,IACGZ,EAAc,OAGba,IAAaD,KAAkBT,GAAO,QAAQ,WAAW,WAGzDW,IAAkBC,EAAwB;AAAA,IAC9C,QAAQL;AAAA,IACR,WAAWC;AAAA,IACX,YAAAE;AAAA,EAAA,CACD,GAGKG,IAAQ,mBAAmBhB,EAAM,EAAE;AACzC,MAAIiB,IAAW;AAEf,EAAIP,MAAoB,WAElBI,EAAgB,SAClBG,KAAY;AAAA,UACRD,CAAK;AAAA,YACHF,EAAgB,IAAI;AAAA;AAAA;AAAA,UAM5BG,KAAY;AAAA,QACRD,CAAK;AAAA,UACHF,EAAgB,KAAK;AAAA;AAAA;AAK7B,QAAMI,IAAU,OAAOd,KAAS,WAAWA,IAAQA,GAAM,OAAO,IAC1De,IAAU,OAAOf,KAAS,WAAW,SAAUA,GAAM,OAAO,QAE5DgB,IAAgBX,MAAY,kBAAkBH,EAAQ,SAAS,GAE/De,IAAad,EAChB;AAAA,IACC,CAACe,MACC,YAAYC,EAAWD,EAAK,IAAI,CAAC,+QAA+QE,EAAgBF,EAAK,QAAQ,KAAKE,EAAgB,MAAM;AAAA,EAAA,EAE3W,KAAK,EAAE,GAEJC,IAAWP,IACb,aAAaK,EAAWL,CAAO,CAAC,UAAUK,EAAWJ,CAAO,CAAC,2EAC7D,IAEEO,IAAWrB,IACb,gHAAgHkB,EAAWlB,CAAW,CAAC,SACvI,IAEEsB,IACJpB,EAAO,SAAS,IACZ,6CAA6Cc,CAAU,WACvD;AAEN,MAAIO,IAAc;AAClB,MAAIR,GAAe;AAEjB,UAAMS,IAAWC,EAAiB9B,EAAM,MAAM,IAAI,aAAa,GACzD+B,IAAY;AAAA,SACbF,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMNA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,WAKRA,CAAQ;AAAA,8CAC2BvB,EAAQ,MAAM;AAAA;AAAA;AAAA,OAKlD0B,IAAc1B,EACjB,IAAI,CAAC2B,MAAa;AACjB,YAAMC,KAAaD,EAAI,SAAS,CAAA,GAC7B;AAAA,QACC,CAACE,MACC,gBAAgBZ,EAAWY,EAAK,IAAI,CAAC,6LAA6LZ,EAAWY,EAAK,IAAI,CAAC;AAAA,MAAA,EAE1P,KAAK,EAAE;AACV,aAAO,2FAA2FZ,EAAWU,EAAI,KAAK,CAAC,iHAAiHC,CAAS;AAAA,IACnP,CAAC,EACA,KAAK,EAAE;AAEV,IAAAN,IAAc,UAAUG,CAAS,GAAGd,CAAQ,oBAAoBY,CAAQ,uCAAuCJ,CAAQ,GAAGC,CAAQ,GAAGC,CAAmB,SAASK,CAAW;AAAA,EAC9K;AACE,IAAAJ,IAAc,2DAA2DH,CAAQ,GAAGC,IAAW,gHAAgHH,EAAWlB,KAAe,EAAE,CAAC,SAAS,EAAE,GAAGE,EAAO,SAAS,IAAI,mEAAmEc,CAAU,WAAW,EAAE;AAG1W,QAAMe,IAAgB5B,IAClB,2LAA2Le,EAAWf,CAAS,CAAC,eAChN;AAEJ,SAAO,WAAW6B,EAAgBrC,EAAM,EAAE,CAAC,oMAAoM4B,CAAW,GAAGQ,CAAa;AAC5Q;"}
1
+ {"version":3,"file":"FooterExporter.js","sources":["../../../../../src/engine/export/exporters/sections/FooterExporter.ts"],"sourcesContent":["/**\n * Footer Section Exporter\n * Mobile-first responsive: multi-column collapses to stack in mobile\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n generateLinkHoverStyles,\n type LinkHoverEffect,\n} from \"../../../shared/hoverEffects\";\nimport { socialIconPaths } from \"../../../shared/socialIcons\";\n\nexport function exportFooter(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n logo,\n description,\n columns = [],\n social = [],\n copyright,\n variant = \"simple\",\n // Hover effects\n linkHoverEffect = \"underline\",\n linkHoverIntensity = 50,\n linkHoverColor,\n } = (block as any).props;\n\n // Determinar cor do hover (usa primary do tema se não definido)\n const hoverColor = linkHoverColor || theme?.colors?.primary || \"#3b82f6\";\n\n // Gerar estilos de hover para links\n const linkHoverStyles = generateLinkHoverStyles({\n effect: linkHoverEffect as LinkHoverEffect,\n intensity: linkHoverIntensity,\n hoverColor,\n });\n\n // Gerar CSS de hover com escopo do bloco\n const scope = `[data-block-id=\"${block.id}\"]`;\n let hoverCss = \"\";\n\n if (linkHoverEffect !== \"none\") {\n // Estilos base se necessários\n if (linkHoverStyles.base) {\n hoverCss += `\n ${scope} .sg-footer__link {\n ${linkHoverStyles.base}\n transition: all 0.3s ease;\n }\n `;\n }\n // Estilos de hover\n hoverCss += `\n ${scope} .sg-footer__link:hover {\n ${linkHoverStyles.hover}\n }\n `;\n }\n\n const logoUrl = typeof logo === \"string\" ? logo : (logo?.src ?? \"\");\n const logoAlt = typeof logo === \"string\" ? \"Logo\" : (logo?.alt ?? \"Logo\");\n\n const isMultiColumn = variant === \"multi-column\" && columns.length > 0;\n\n const socialHtml = social\n .map(\n (item: any) =>\n `<a href=\"${escapeHtml(item.href)}\" target=\"_blank\" rel=\"noopener noreferrer\" style=\"color: var(--sg-muted-text, #64748b); text-decoration: none;\"><svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"${socialIconPaths[item.platform] || socialIconPaths.github}\"/></svg></a>`,\n )\n .join(\"\");\n\n const logoHtml = logoUrl\n ? `<img src=\"${escapeHtml(logoUrl)}\" alt=\"${escapeHtml(logoAlt)}\" style=\"height: 2.5rem; object-fit: contain; margin-bottom: 1rem;\" />`\n : \"\";\n\n const descHtml = description\n ? `<p style=\"color: var(--sg-muted-text, #64748b); font-size: 0.875rem; line-height: 1.6; margin-bottom: 1rem;\">${escapeHtml(description)}</p>`\n : \"\";\n\n const socialContainerHtml =\n social.length > 0\n ? `<div style=\"display: flex; gap: 0.75rem;\">${socialHtml}</div>`\n : \"\";\n\n let contentHtml = \"\";\n if (isMultiColumn) {\n // Responsive footer grid: 1 col (mobile) → 2 cols (tablet) → 2fr + N×1fr (desktop)\n const footerId = generateScopedId(block.id || \"\", \"footer-grid\");\n const footerCss = `\n #${footerId} {\n display: grid;\n grid-template-columns: 1fr;\n gap: 2rem;\n }\n @media (min-width: 640px) {\n #${footerId} {\n grid-template-columns: repeat(2, 1fr);\n }\n }\n @media (min-width: 1024px) {\n #${footerId} {\n grid-template-columns: 2fr repeat(${columns.length}, 1fr);\n }\n }\n `;\n\n const columnsHtml = columns\n .map((col: any) => {\n const linksHtml = (col.links || [])\n .map(\n (link: any) =>\n `<li><a href=\"${escapeHtml(link.href)}\" class=\"sg-footer__link\" style=\"color: var(--sg-muted-text, #64748b); text-decoration: none; font-size: 0.875rem; display: inline-block; padding: 0.25rem 0; transition: all 0.3s ease;\">${escapeHtml(link.text)}</a></li>`,\n )\n .join(\"\");\n return `<div data-block-group=\"🔗 Links\"><h4 style=\"font-weight: 600; margin-bottom: 1rem; color: var(--sg-text, #0f172a);\">${escapeHtml(col.title)}</h4><ul style=\"list-style: none; padding: 0; margin: 0; display: flex; flex-direction: column; gap: 0.5rem;\">${linksHtml}</ul></div>`;\n })\n .join(\"\");\n\n contentHtml = `<style>${footerCss}${hoverCss}</style><div id=\"${footerId}\" style=\"margin-bottom: 2rem;\"><div data-block-group=\"Logo\">${logoHtml}${descHtml}${socialContainerHtml}</div>${columnsHtml}</div>`;\n } else {\n contentHtml = `<div data-block-group=\"Logo\" style=\"text-align: center; margin-bottom: 1.5rem;\">${logoHtml}${descHtml ? `<p style=\"color: var(--sg-muted-text, #64748b); font-size: 0.875rem; max-width: 400px; margin: 0 auto 1rem;\">${escapeHtml(description || \"\")}</p>` : \"\"}${social.length > 0 ? `<div style=\"display: flex; justify-content: center; gap: 1rem;\">${socialHtml}</div>` : \"\"}</div>`;\n }\n\n const copyrightHtml = copyright\n ? `<div style=\"border-top: 1px solid var(--sg-border, #e5e7eb); padding-top: 1.5rem; text-align: center;\"><p style=\"color: var(--sg-muted-text, #64748b); font-size: 0.875rem; margin: 0;\">${escapeHtml(copyright)}</p></div>`\n : \"\";\n\n return `<footer ${dataBlockIdAttr(block.id)} style=\"background-color: var(--sg-surface, #f8fafc); border-top: 1px solid var(--sg-border, #e5e7eb); padding: 3rem 0 1.5rem;\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${contentHtml}${copyrightHtml}</div></footer>`;\n}\n"],"names":["exportFooter","block","depth","basePath","theme","logo","description","columns","social","copyright","variant","linkHoverEffect","linkHoverIntensity","linkHoverColor","hoverColor","linkHoverStyles","generateLinkHoverStyles","scope","hoverCss","logoUrl","logoAlt","isMultiColumn","socialHtml","item","escapeHtml","socialIconPaths","logoHtml","descHtml","socialContainerHtml","contentHtml","footerId","generateScopedId","footerCss","columnsHtml","col","linksHtml","link","copyrightHtml","dataBlockIdAttr"],"mappings":";;;;AAeO,SAASA,EACdC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,MAAAC;AAAA,IACA,aAAAC;AAAA,IACA,SAAAC,IAAU,CAAA;AAAA,IACV,QAAAC,IAAS,CAAA;AAAA,IACT,WAAAC;AAAA,IACA,SAAAC,IAAU;AAAA;AAAA,IAEV,iBAAAC,IAAkB;AAAA,IAClB,oBAAAC,IAAqB;AAAA,IACrB,gBAAAC;AAAA,EAAA,IACGZ,EAAc,OAGba,IAAaD,KAAkBT,GAAO,QAAQ,WAAW,WAGzDW,IAAkBC,EAAwB;AAAA,IAC9C,QAAQL;AAAA,IACR,WAAWC;AAAA,IACX,YAAAE;AAAA,EAAA,CACD,GAGKG,IAAQ,mBAAmBhB,EAAM,EAAE;AACzC,MAAIiB,IAAW;AAEf,EAAIP,MAAoB,WAElBI,EAAgB,SAClBG,KAAY;AAAA,UACRD,CAAK;AAAA,YACHF,EAAgB,IAAI;AAAA;AAAA;AAAA,UAM5BG,KAAY;AAAA,QACRD,CAAK;AAAA,UACHF,EAAgB,KAAK;AAAA;AAAA;AAK7B,QAAMI,IAAU,OAAOd,KAAS,WAAWA,IAAQA,GAAM,OAAO,IAC1De,IAAU,OAAOf,KAAS,WAAW,SAAUA,GAAM,OAAO,QAE5DgB,IAAgBX,MAAY,kBAAkBH,EAAQ,SAAS,GAE/De,IAAad,EAChB;AAAA,IACC,CAACe,MACC,YAAYC,EAAWD,EAAK,IAAI,CAAC,+QAA+QE,EAAgBF,EAAK,QAAQ,KAAKE,EAAgB,MAAM;AAAA,EAAA,EAE3W,KAAK,EAAE,GAEJC,IAAWP,IACb,aAAaK,EAAWL,CAAO,CAAC,UAAUK,EAAWJ,CAAO,CAAC,2EAC7D,IAEEO,IAAWrB,IACb,gHAAgHkB,EAAWlB,CAAW,CAAC,SACvI,IAEEsB,IACJpB,EAAO,SAAS,IACZ,6CAA6Cc,CAAU,WACvD;AAEN,MAAIO,IAAc;AAClB,MAAIR,GAAe;AAEjB,UAAMS,IAAWC,EAAiB9B,EAAM,MAAM,IAAI,aAAa,GACzD+B,IAAY;AAAA,SACbF,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAMNA,CAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,WAKRA,CAAQ;AAAA,8CAC2BvB,EAAQ,MAAM;AAAA;AAAA;AAAA,OAKlD0B,IAAc1B,EACjB,IAAI,CAAC2B,MAAa;AACjB,YAAMC,KAAaD,EAAI,SAAS,CAAA,GAC7B;AAAA,QACC,CAACE,MACC,gBAAgBZ,EAAWY,EAAK,IAAI,CAAC,6LAA6LZ,EAAWY,EAAK,IAAI,CAAC;AAAA,MAAA,EAE1P,KAAK,EAAE;AACV,aAAO,uHAAuHZ,EAAWU,EAAI,KAAK,CAAC,iHAAiHC,CAAS;AAAA,IAC/Q,CAAC,EACA,KAAK,EAAE;AAEV,IAAAN,IAAc,UAAUG,CAAS,GAAGd,CAAQ,oBAAoBY,CAAQ,+DAA+DJ,CAAQ,GAAGC,CAAQ,GAAGC,CAAmB,SAASK,CAAW;AAAA,EACtM;AACE,IAAAJ,IAAc,mFAAmFH,CAAQ,GAAGC,IAAW,gHAAgHH,EAAWlB,KAAe,EAAE,CAAC,SAAS,EAAE,GAAGE,EAAO,SAAS,IAAI,mEAAmEc,CAAU,WAAW,EAAE;AAGlY,QAAMe,IAAgB5B,IAClB,2LAA2Le,EAAWf,CAAS,CAAC,eAChN;AAEJ,SAAO,WAAW6B,EAAgBrC,EAAM,EAAE,CAAC,oMAAoM4B,CAAW,GAAGQ,CAAa;AAC5Q;"}
@@ -1 +1 @@
1
- {"version":3,"file":"HeroExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/HeroExporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAuB1D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CA2bR"}
1
+ {"version":3,"file":"HeroExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/sections/HeroExporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAwB1D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,GAClB,MAAM,CA6eR"}