@brunoalz/smartgesti-site-editor 1.3.0 → 1.4.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 (53) hide show
  1. package/dist/editor/LandingPageEditor.d.ts.map +1 -1
  2. package/dist/editor/LandingPageEditor.js +183 -169
  3. package/dist/editor/LandingPageEditor.js.map +1 -1
  4. package/dist/editor/PaletteSelector.d.ts +3 -0
  5. package/dist/editor/PaletteSelector.d.ts.map +1 -1
  6. package/dist/editor/PaletteSelector.js +114 -25
  7. package/dist/editor/PaletteSelector.js.map +1 -1
  8. package/dist/editor/components/RightPanel.d.ts +2 -0
  9. package/dist/editor/components/RightPanel.d.ts.map +1 -1
  10. package/dist/editor/components/RightPanel.js +23 -22
  11. package/dist/editor/components/RightPanel.js.map +1 -1
  12. package/dist/engine/export/exporters/content/AvatarExporter.js +2 -2
  13. package/dist/engine/export/exporters/content/AvatarExporter.js.map +1 -1
  14. package/dist/engine/export/exporters/content/BadgeExporter.js +11 -11
  15. package/dist/engine/export/exporters/content/BadgeExporter.js.map +1 -1
  16. package/dist/engine/export/exporters/sections/AdminSectionExporters.js +17 -17
  17. package/dist/engine/export/exporters/sections/AdminSectionExporters.js.map +1 -1
  18. package/dist/engine/export/exporters/sections/BlogPostExporters.js +34 -34
  19. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
  20. package/dist/engine/export/exporters/sections/ContentGridExporters.js +16 -16
  21. package/dist/engine/export/exporters/sections/ContentGridExporters.js.map +1 -1
  22. package/dist/engine/export/exporters/sections/MarketingExporters.js +4 -4
  23. package/dist/engine/export/exporters/sections/MarketingExporters.js.map +1 -1
  24. package/dist/engine/render/renderers/content/BadgeRenderer.js +12 -12
  25. package/dist/engine/render/renderers/content/BadgeRenderer.js.map +1 -1
  26. package/dist/engine/render/renderers/sections/AboutSectionRenderer.js +8 -8
  27. package/dist/engine/render/renderers/sections/AboutSectionRenderer.js.map +1 -1
  28. package/dist/engine/render/renderers/sections/ContactSectionRenderer.js +52 -52
  29. package/dist/engine/render/renderers/sections/ContactSectionRenderer.js.map +1 -1
  30. package/dist/engine/render/renderers/sections/FeatureGridRenderer.js +5 -5
  31. package/dist/engine/render/renderers/sections/FeatureGridRenderer.js.map +1 -1
  32. package/dist/engine/render/renderers/sections/FeatureRenderer.js +9 -9
  33. package/dist/engine/render/renderers/sections/FeatureRenderer.js.map +1 -1
  34. package/dist/engine/render/renderers/sections/PricingCardRenderer.js +5 -5
  35. package/dist/engine/render/renderers/sections/PricingCardRenderer.js.map +1 -1
  36. package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js +17 -17
  37. package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js.map +1 -1
  38. package/dist/hooks/useEditorState.d.ts +2 -0
  39. package/dist/hooks/useEditorState.d.ts.map +1 -1
  40. package/dist/hooks/useEditorState.js +82 -77
  41. package/dist/hooks/useEditorState.js.map +1 -1
  42. package/dist/shared/templates/index.d.ts +4 -0
  43. package/dist/shared/templates/index.d.ts.map +1 -1
  44. package/dist/shared/templates/index.js +14 -7
  45. package/dist/shared/templates/index.js.map +1 -1
  46. package/dist/shared/templates/smartgesti-admin.d.ts.map +1 -1
  47. package/dist/shared/templates/smartgesti-admin.js +1 -4
  48. package/dist/shared/templates/smartgesti-admin.js.map +1 -1
  49. package/dist/utils/colorUtils.d.ts +73 -16
  50. package/dist/utils/colorUtils.d.ts.map +1 -1
  51. package/dist/utils/colorUtils.js +95 -9
  52. package/dist/utils/colorUtils.js.map +1 -1
  53. package/package.json +1 -1
@@ -53,7 +53,7 @@ function Y(e, $, R, x) {
53
53
  buttonHoverIntensity: s,
54
54
  buttonHoverOverlay: c,
55
55
  buttonHoverIconName: g
56
- }, x), O = l ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;">${t(l)}</span>` : "", C = n ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;">${t(n)}</h2>` : "", z = n || l ? `<div data-block-group="Conteúdo" style="text-align: center; margin-bottom: 3rem;">${O}${C}</div>` : "", j = S ? `<style>${S}</style>` : "";
56
+ }, x), O = l ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;">${t(l)}</span>` : "", C = n ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;">${t(n)}</h2>` : "", z = n || l ? `<div data-block-group="Conteúdo" style="text-align: center; margin-bottom: 3rem;">${O}${C}</div>` : "", j = S ? `<style>${S}</style>` : "";
57
57
  if (m === "grid") {
58
58
  const r = T(e.id || "", "product-grid"), h = V(
59
59
  Math.min(d.length, 3),
@@ -61,13 +61,13 @@ function Y(e, $, R, x) {
61
61
  2,
62
62
  Math.min(d.length, 3)
63
63
  ), { inlineStyles: k, mediaQueries: y } = K(r, h, "2rem"), H = d.map((i) => {
64
- const b = i.image ? `<div style="width: 100%; height: 200px; background-image: url(${t(i.image)}); background-size: cover; background-position: center;"></div>` : "", u = i.badge ? `<span style="display: inline-block; padding: 0.125rem 0.5rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.7rem; font-weight: 600; margin-bottom: 0.5rem;">${t(i.badge)}</span>` : "", p = i.icon ? `<span style="margin-right: 0.5rem;">${t(i.icon)}</span>` : "", f = i.primaryButton ? `<a href="${t(i.primaryButton.href || "#")}" class="sg-showcase__btn sg-showcase__btn--primary" style="display: inline-block; margin-top: 1rem; padding: 0.5rem 1rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; font-size: 0.875rem; ${E}">${t(i.primaryButton.text)}</a>` : "";
65
- return `<div style="background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); overflow: hidden; box-shadow: var(--sg-card-shadow);">${b}<div style="padding: 1.5rem;">${u}<h3 style="font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem;">${p}${t(i.name)}</h3><p style="color: var(--sg-muted-text); font-size: 0.875rem;">${t(i.description)}</p>${f}</div></div>`;
64
+ const b = i.image ? `<div style="width: 100%; height: 200px; background-image: url(${t(i.image)}); background-size: cover; background-position: center;"></div>` : "", p = i.badge ? `<span style="display: inline-block; padding: 0.125rem 0.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.7rem; font-weight: 600; margin-bottom: 0.5rem;">${t(i.badge)}</span>` : "", u = i.icon ? `<span style="margin-right: 0.5rem;">${t(i.icon)}</span>` : "", f = i.primaryButton ? `<a href="${t(i.primaryButton.href || "#")}" class="sg-showcase__btn sg-showcase__btn--primary" style="display: inline-block; margin-top: 1rem; padding: 0.5rem 1rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; font-size: 0.875rem; ${E}">${t(i.primaryButton.text)}</a>` : "";
65
+ return `<div style="background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); overflow: hidden; box-shadow: var(--sg-card-shadow);">${b}<div style="padding: 1.5rem;">${p}<h3 style="font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem;">${u}${t(i.name)}</h3><p style="color: var(--sg-muted-text); font-size: 0.875rem;">${t(i.description)}</p>${f}</div></div>`;
66
66
  }).join("");
67
67
  return `${j}<style>${y}</style><section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${_}"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${z}<div data-block-group="Layout" id="${r}" style="${k}">${H}</div></div></section>`;
68
68
  }
69
69
  const M = T(e.id || "", "product-showcase"), A = d.map((r, h) => {
70
- const k = m === "alternating" && h % 2 === 1, y = r.image ? `<img src="${t(r.image)}" alt="${t(r.name)}" style="width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;" />` : `<div style="width: 100%; height: 300px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 4rem;">${t(r.icon || "📦")}</div>`, H = r.badge ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 0.75rem;">${t(r.badge)}</span>` : "", i = r.icon ? `<span style="margin-right: 0.5rem;">${t(r.icon)}</span>` : "", b = r.features && r.features.length > 0 ? `<ul style="list-style: none; padding: 0; margin: 0 0 1.5rem 0;">${r.features.map((v) => `<li style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;"><span style="color: #10b981; font-weight: 700;">✓</span>${t(v)}</li>`).join("")}</ul>` : "", u = r.primaryButton ? `<a href="${t(r.primaryButton.href || "#")}" class="sg-showcase__btn sg-showcase__btn--primary" style="display: inline-block; padding: 0.625rem 1.25rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${E}">${t(r.primaryButton.text)}</a>` : "", p = r.secondaryButton ? `<a href="${t(r.secondaryButton.href || "#")}" class="sg-showcase__btn sg-showcase__btn--secondary" style="display: inline-block; padding: 0.625rem 1.25rem; background-color: transparent; color: var(--sg-primary); border: 1px solid var(--sg-primary); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${E}">${t(r.secondaryButton.text)}</a>` : "", f = u || p ? `<div style="display: flex; gap: 0.75rem; flex-wrap: wrap;">${u}${p}</div>` : "", o = `${M}-item-${h}`;
70
+ const k = m === "alternating" && h % 2 === 1, y = r.image ? `<img src="${t(r.image)}" alt="${t(r.name)}" style="width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;" />` : `<div style="width: 100%; height: 300px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 4rem;">${t(r.icon || "📦")}</div>`, H = r.badge ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 0.75rem;">${t(r.badge)}</span>` : "", i = r.icon ? `<span style="margin-right: 0.5rem;">${t(r.icon)}</span>` : "", b = r.features && r.features.length > 0 ? `<ul style="list-style: none; padding: 0; margin: 0 0 1.5rem 0;">${r.features.map((v) => `<li style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;"><span style="color: #10b981; font-weight: 700;">✓</span>${t(v)}</li>`).join("")}</ul>` : "", p = r.primaryButton ? `<a href="${t(r.primaryButton.href || "#")}" class="sg-showcase__btn sg-showcase__btn--primary" style="display: inline-block; padding: 0.625rem 1.25rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${E}">${t(r.primaryButton.text)}</a>` : "", u = r.secondaryButton ? `<a href="${t(r.secondaryButton.href || "#")}" class="sg-showcase__btn sg-showcase__btn--secondary" style="display: inline-block; padding: 0.625rem 1.25rem; background-color: transparent; color: var(--sg-primary); border: 1px solid var(--sg-primary); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${E}">${t(r.secondaryButton.text)}</a>` : "", f = p || u ? `<div style="display: flex; gap: 0.75rem; flex-wrap: wrap;">${p}${u}</div>` : "", o = `${M}-item-${h}`;
71
71
  return `<style>
72
72
  #${o} { flex-direction: column; }
73
73
  @media (min-width: 768px) { #${o} { flex-direction: ${k ? "row-reverse" : "row"}; } }
@@ -96,16 +96,16 @@ function tt(e, $, R, x) {
96
96
  buttonHoverIntensity: S,
97
97
  buttonHoverOverlay: O,
98
98
  buttonHoverIconName: C
99
- }, x), h = l ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;">${t(l)}</span>` : "", k = n ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 1rem;">${t(n)}</h2>` : "", y = d ? `<p style="color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1rem;">${t(d)}</p>` : "", H = m ? `<p style="color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1.5rem;">${t(m)}</p>` : "", i = w.length > 0 ? `<ul style="list-style: none; padding: 0; margin: 0 0 1.5rem 0;">${w.map((v) => `<li style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;"><span style="color: #10b981; font-weight: 700;">✓</span>${t(v.text)}</li>`).join("")}</ul>` : "", b = s ? `<a href="${t(s.href || "#")}" class="sg-about__btn sg-about__btn--primary" style="display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${E}">${t(s.text)}</a>` : "", u = r ? `<style>${r}</style>` : "";
99
+ }, x), h = l ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;">${t(l)}</span>` : "", k = n ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 1rem;">${t(n)}</h2>` : "", y = d ? `<p style="color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1rem;">${t(d)}</p>` : "", H = m ? `<p style="color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1.5rem;">${t(m)}</p>` : "", i = w.length > 0 ? `<ul style="list-style: none; padding: 0; margin: 0 0 1.5rem 0;">${w.map((v) => `<li style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;"><span style="color: #10b981; font-weight: 700;">✓</span>${t(v.text)}</li>`).join("")}</ul>` : "", b = s ? `<a href="${t(s.href || "#")}" class="sg-about__btn sg-about__btn--primary" style="display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${E}">${t(s.text)}</a>` : "", p = r ? `<style>${r}</style>` : "";
100
100
  if (j) {
101
101
  const v = a ? `<div data-block-group="Mídia" style="margin: 2rem 0;"><img src="${t(a)}" alt="${t(n || "About")}" style="width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;" /></div>` : "";
102
- return `${u}<section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${z}"><div style="max-width: 800px; margin: 0 auto; padding: 0 1rem; text-align: center;">${h}${k}${v}${y}${H}${i}${b}</div></section>`;
102
+ return `${p}<section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${z}"><div style="max-width: 800px; margin: 0 auto; padding: 0 1rem; text-align: center;">${h}${k}${v}${y}${H}${i}${b}</div></section>`;
103
103
  }
104
- const p = T(e.id || "", "about"), f = a ? `<img src="${t(a)}" alt="${t(n || "About")}" style="width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;" />` : '<div style="width: 100%; height: 400px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 1rem; color: var(--sg-muted-text);">Imagem</div>', o = _.length > 0 ? `<div style="display: flex; gap: 0.5rem; margin-top: 1rem;">${_.map((v) => `<div style="background-color: var(--sg-primary); color: #fff; padding: 0.75rem 1rem; border-radius: var(--sg-card-radius, 0.75rem); text-align: center; box-shadow: 0 4px 12px rgba(0,0,0,0.15); min-width: 80px;"><div style="font-size: 1.5rem; font-weight: 700;">${t(v.value)}</div><div style="font-size: 0.7rem; opacity: 0.9;">${t(v.label)}</div></div>`).join("")}</div>` : "";
105
- return `${u}<style>
106
- #${p} { flex-direction: column; }
107
- @media (min-width: 768px) { #${p} { flex-direction: ${M ? "row-reverse" : "row"}; } }
108
- </style><section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${z}"><div id="${p}" style="max-width: 1200px; margin: 0 auto; padding: 0 1rem; display: flex; gap: 3rem; align-items: center;"><div data-block-group="Mídia" style="flex: 1 1 50%; position: relative;">${f}${o}</div><div data-block-group="Conteúdo" style="flex: 1 1 50%;">${h}${k}${y}${H}${i}${b}</div></div></section>`;
104
+ const u = T(e.id || "", "about"), f = a ? `<img src="${t(a)}" alt="${t(n || "About")}" style="width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;" />` : '<div style="width: 100%; height: 400px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 1rem; color: var(--sg-muted-text);">Imagem</div>', o = _.length > 0 ? `<div style="display: flex; gap: 0.5rem; margin-top: 1rem;">${_.map((v) => `<div style="background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); padding: 0.75rem 1rem; border-radius: var(--sg-card-radius, 0.75rem); text-align: center; box-shadow: 0 4px 12px rgba(0,0,0,0.15); min-width: 80px;"><div style="font-size: 1.5rem; font-weight: 700;">${t(v.value)}</div><div style="font-size: 0.7rem; opacity: 0.9;">${t(v.label)}</div></div>`).join("")}</div>` : "";
105
+ return `${p}<style>
106
+ #${u} { flex-direction: column; }
107
+ @media (min-width: 768px) { #${u} { flex-direction: ${M ? "row-reverse" : "row"}; } }
108
+ </style><section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${z}"><div id="${u}" style="max-width: 1200px; margin: 0 auto; padding: 0 1rem; display: flex; gap: 3rem; align-items: center;"><div data-block-group="Mídia" style="flex: 1 1 50%; position: relative;">${f}${o}</div><div data-block-group="Conteúdo" style="flex: 1 1 50%;">${h}${k}${y}${H}${i}${b}</div></div></section>`;
109
109
  }
110
110
  const G = {
111
111
  mail: '<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>',
@@ -137,17 +137,17 @@ function et(e, $, R, x) {
137
137
  buttonHoverIntensity: N,
138
138
  buttonHoverOverlay: S,
139
139
  buttonHoverIconName: O
140
- }, x), r = l ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;">${t(l)}</span>` : "", h = n ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;">${t(n)}</h2>` : "", k = d ? `<p style="color: var(--sg-muted-text);">${t(d)}</p>` : "", y = n || l ? `<div data-block-group="Conteúdo" style="text-align: center; margin-bottom: 3rem;">${r}${h}${k}</div>` : "", H = w.map((o) => {
140
+ }, x), r = l ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;">${t(l)}</span>` : "", h = n ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;">${t(n)}</h2>` : "", k = d ? `<p style="color: var(--sg-muted-text);">${t(d)}</p>` : "", y = n || l ? `<div data-block-group="Conteúdo" style="text-align: center; margin-bottom: 3rem;">${r}${h}${k}</div>` : "", H = w.map((o) => {
141
141
  const v = o.label ? `<label style="display: block; font-size: 0.875rem; font-weight: 500; margin-bottom: 0.375rem; color: var(--sg-text);">${t(o.label)}${o.required ? '<span style="color: #ef4444;"> *</span>' : ""}</label>` : "", L = "width: 100%; padding: 0.625rem 0.75rem; border: 1px solid var(--sg-border); border-radius: var(--sg-button-radius, 0.5rem); font-size: 0.875rem; background-color: var(--sg-bg); color: var(--sg-text); box-sizing: border-box;", P = o.type === "textarea" ? `<textarea name="${t(o.name)}" placeholder="${t(o.placeholder || "")}" rows="4" style="${L} resize: vertical;"${o.required ? " required" : ""}></textarea>` : `<input type="${t(o.type || "text")}" name="${t(o.name)}" placeholder="${t(o.placeholder || "")}" style="${L}"${o.required ? " required" : ""} />`;
142
142
  return `<div style="margin-bottom: 1rem;">${v}${P}</div>`;
143
- }).join(""), i = `width: 100%; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border: none; border-radius: var(--sg-button-radius, 0.5rem); font-weight: 500; cursor: pointer; font-size: 1rem; ${E}`, b = `<div data-block-group="Formulário" style="background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); padding: 2rem; box-shadow: var(--sg-card-shadow);">${a ? `<h3 style="font-size: 1.25rem; font-weight: 600; margin-bottom: 1.5rem;">${t(a)}</h3>` : ""}<form>${H}<button type="submit" class="sg-contact__btn sg-contact__btn--primary" style="${i}">${t(s)}</button></form></div>`, u = A ? `<style>${A}</style>` : "";
143
+ }).join(""), i = `width: 100%; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border: none; border-radius: var(--sg-button-radius, 0.5rem); font-weight: 500; cursor: pointer; font-size: 1rem; ${E}`, b = `<div data-block-group="Formulário" style="background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); padding: 2rem; box-shadow: var(--sg-card-shadow);">${a ? `<h3 style="font-size: 1.25rem; font-weight: 600; margin-bottom: 1.5rem;">${t(a)}</h3>` : ""}<form>${H}<button type="submit" class="sg-contact__btn sg-contact__btn--primary" style="${i}">${t(s)}</button></form></div>`, p = A ? `<style>${A}</style>` : "";
144
144
  if (z)
145
- return `${u}<section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${C}"><div style="max-width: 600px; margin: 0 auto; padding: 0 1rem;">${y}${b}</div></section>`;
146
- const p = m.map((o) => `<div style="display: flex; align-items: flex-start; gap: 1rem; padding: 1.25rem; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); box-shadow: var(--sg-card-shadow);"><div style="width: 2.5rem; height: 2.5rem; background-color: var(--sg-primary); border-radius: 0.5rem; display: flex; align-items: center; justify-content: center; color: #fff; flex-shrink: 0;">${Z(o.icon || "mail")}</div><div><div style="font-weight: 600; font-size: 0.875rem; margin-bottom: 0.25rem;">${t(o.label)}</div><div style="color: var(--sg-muted-text); font-size: 0.875rem;">${t(o.value)}</div></div></div>`).join(""), f = T(e.id || "", "contact");
147
- return j ? `${u}<section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${C}"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${y}${m.length > 0 ? `<div data-block-group="Info" style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 3rem;">${p}</div>` : ""}${b}</div></section>` : `${u}<style>
145
+ return `${p}<section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${C}"><div style="max-width: 600px; margin: 0 auto; padding: 0 1rem;">${y}${b}</div></section>`;
146
+ const u = m.map((o) => `<div style="display: flex; align-items: flex-start; gap: 1rem; padding: 1.25rem; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); box-shadow: var(--sg-card-shadow);"><div style="width: 2.5rem; height: 2.5rem; background-color: var(--sg-primary); border-radius: 0.5rem; display: flex; align-items: center; justify-content: center; color: var(--sg-primary-text, #fff); flex-shrink: 0;">${Z(o.icon || "mail")}</div><div><div style="font-weight: 600; font-size: 0.875rem; margin-bottom: 0.25rem;">${t(o.label)}</div><div style="color: var(--sg-muted-text); font-size: 0.875rem;">${t(o.value)}</div></div></div>`).join(""), f = T(e.id || "", "contact");
147
+ return j ? `${p}<section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${C}"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${y}${m.length > 0 ? `<div data-block-group="Info" style="display: flex; flex-direction: column; gap: 1rem; margin-bottom: 3rem;">${u}</div>` : ""}${b}</div></section>` : `${p}<style>
148
148
  #${f} { flex-direction: column; }
149
149
  @media (min-width: 768px) { #${f} { flex-direction: row; } }
150
- </style><section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${C}"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${y}<div id="${f}" style="display: flex; gap: 3rem;">${m.length > 0 ? `<div data-block-group="Info" style="flex: 1 1 40%; display: flex; flex-direction: column; gap: 1rem;">${p}</div>` : ""}<div style="flex: 1 1 60%;">${b}</div></div></div></section>`;
150
+ </style><section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${C}"><div style="max-width: 1200px; margin: 0 auto; padding: 0 1rem;">${y}<div id="${f}" style="display: flex; gap: 3rem;">${m.length > 0 ? `<div data-block-group="Info" style="flex: 1 1 40%; display: flex; flex-direction: column; gap: 1rem;">${u}</div>` : ""}<div style="flex: 1 1 60%;">${b}</div></div></div></section>`;
151
151
  }
152
152
  export {
153
153
  tt as exportAboutSection,
@@ -1 +1 @@
1
- {"version":3,"file":"AdminSectionExporters.js","sources":["../../../../../src/engine/export/exporters/sections/AdminSectionExporters.ts"],"sourcesContent":["/**\n * Admin Section Exporters\n * ProductShowcase, AboutSection, ContactSection\n * Mobile-first responsive layouts with media queries\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, blockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n} from \"../../shared/responsiveGridHelper\";\nimport {\n generateButtonHoverStyles,\n generateButtonOverlayCSS,\n getButtonHoverKeyframes,\n type ButtonHoverEffect,\n type ButtonHoverOverlay,\n} from \"../../../shared/hoverEffects\";\n\n// ============================================================================\n// Shared: button hover CSS generator for admin sections\n// ============================================================================\n\nfunction generateAdminButtonHoverCSS(\n scope: string,\n classPrefix: string,\n props: {\n buttonHoverEffect: string;\n buttonHoverIntensity: number;\n buttonHoverOverlay: string;\n buttonHoverIconName: string;\n },\n theme?: ThemeTokens,\n): string {\n const {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n } = props;\n\n const primaryColor = theme?.colors?.primary || \"#6366f1\";\n const primaryText = theme?.colors?.primaryText || \"#ffffff\";\n let css = \"\";\n\n if (buttonHoverEffect !== \"none\") {\n const primaryResult = generateButtonHoverStyles({\n effect: buttonHoverEffect as ButtonHoverEffect,\n intensity: buttonHoverIntensity,\n buttonColor: primaryColor,\n buttonTextColor: primaryText,\n variant: \"solid\",\n });\n const outlineResult = generateButtonHoverStyles({\n effect: buttonHoverEffect as ButtonHoverEffect,\n intensity: buttonHoverIntensity,\n buttonColor: primaryColor,\n buttonTextColor: primaryColor,\n variant: \"outline\",\n });\n\n if (primaryResult.base) {\n css += `${scope} .${classPrefix}--primary { ${primaryResult.base} }`;\n }\n if (outlineResult.base) {\n css += `${scope} .${classPrefix}--secondary { ${outlineResult.base} }`;\n }\n css += `${scope} .${classPrefix}--primary:hover { ${primaryResult.hover} }`;\n css += `${scope} .${classPrefix}--secondary:hover { ${outlineResult.hover} }`;\n css += getButtonHoverKeyframes();\n }\n\n if (buttonHoverOverlay && buttonHoverOverlay !== \"none\") {\n css += generateButtonOverlayCSS(`${scope} .${classPrefix}--primary`, {\n overlay: buttonHoverOverlay as ButtonHoverOverlay,\n primaryColor,\n iconName: buttonHoverIconName,\n textColor: primaryText,\n });\n css += generateButtonOverlayCSS(`${scope} .${classPrefix}--secondary`, {\n overlay: buttonHoverOverlay as ButtonHoverOverlay,\n primaryColor,\n iconName: buttonHoverIconName,\n textColor: primaryColor,\n });\n }\n\n return css;\n}\n\nconst BTN_HOVER_BASE = \"position: relative; overflow: hidden; transition: all 0.2s ease;\";\n\n// ============================================================================\n// ProductShowcase\n// ============================================================================\n\nexport function exportProductShowcase(\n block: Block,\n _depth: number,\n _basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n subtitle,\n products = [],\n variant = \"alternating\",\n bg,\n buttonHoverEffect = \"none\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n const bgStyle = bg ? `background-color: ${escapeHtml(bg)};` : \"background-color: var(--sg-bg);\";\n const scope = `[data-block-id=\"${block.id}\"]`;\n\n // Hover CSS\n const hoverCss = generateAdminButtonHoverCSS(scope, \"sg-showcase__btn\", {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n }, theme);\n\n // Header\n const subtitleHtml = subtitle\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;\">${escapeHtml(subtitle)}</span>`\n : \"\";\n const titleHtml = title\n ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;\">${escapeHtml(title)}</h2>`\n : \"\";\n const headerHtml =\n title || subtitle\n ? `<div data-block-group=\"Conteúdo\" style=\"text-align: center; margin-bottom: 3rem;\">${subtitleHtml}${titleHtml}</div>`\n : \"\";\n\n const stylePreamble = hoverCss ? `<style>${hoverCss}</style>` : \"\";\n\n if (variant === \"grid\") {\n const gridId = generateScopedId(block.id || \"\", \"product-grid\");\n const responsiveConfig = resolveResponsiveColumns(\n Math.min(products.length, 3),\n 1,\n 2,\n Math.min(products.length, 3),\n );\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(gridId, responsiveConfig, \"2rem\");\n\n const cardsHtml = products\n .map((p: any) => {\n const imgHtml = p.image\n ? `<div style=\"width: 100%; height: 200px; background-image: url(${escapeHtml(p.image)}); background-size: cover; background-position: center;\"></div>`\n : \"\";\n const badgeHtml = p.badge\n ? `<span style=\"display: inline-block; padding: 0.125rem 0.5rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.7rem; font-weight: 600; margin-bottom: 0.5rem;\">${escapeHtml(p.badge)}</span>`\n : \"\";\n const iconHtml = p.icon ? `<span style=\"margin-right: 0.5rem;\">${escapeHtml(p.icon)}</span>` : \"\";\n const btnHtml = p.primaryButton\n ? `<a href=\"${escapeHtml(p.primaryButton.href || \"#\")}\" class=\"sg-showcase__btn sg-showcase__btn--primary\" style=\"display: inline-block; margin-top: 1rem; padding: 0.5rem 1rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; font-size: 0.875rem; ${BTN_HOVER_BASE}\">${escapeHtml(p.primaryButton.text)}</a>`\n : \"\";\n return `<div style=\"background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); overflow: hidden; box-shadow: var(--sg-card-shadow);\">${imgHtml}<div style=\"padding: 1.5rem;\">${badgeHtml}<h3 style=\"font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem;\">${iconHtml}${escapeHtml(p.name)}</h3><p style=\"color: var(--sg-muted-text); font-size: 0.875rem;\">${escapeHtml(p.description)}</p>${btnHtml}</div></div>`;\n })\n .join(\"\");\n\n return `${stylePreamble}<style>${mediaQueries}</style><section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div data-block-group=\"Layout\" id=\"${gridId}\" style=\"${inlineStyles}\">${cardsHtml}</div></div></section>`;\n }\n\n // alternating / stacked\n const scopeId = generateScopedId(block.id || \"\", \"product-showcase\");\n const productsHtml = products\n .map((p: any, index: number) => {\n const isReversed = variant === \"alternating\" && index % 2 === 1;\n\n const imgHtml = p.image\n ? `<img src=\"${escapeHtml(p.image)}\" alt=\"${escapeHtml(p.name)}\" style=\"width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;\" />`\n : `<div style=\"width: 100%; height: 300px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 4rem;\">${escapeHtml(p.icon || \"📦\")}</div>`;\n\n const badgeHtml = p.badge\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 0.75rem;\">${escapeHtml(p.badge)}</span>`\n : \"\";\n const iconHtml = p.icon ? `<span style=\"margin-right: 0.5rem;\">${escapeHtml(p.icon)}</span>` : \"\";\n\n const featuresHtml =\n p.features && p.features.length > 0\n ? `<ul style=\"list-style: none; padding: 0; margin: 0 0 1.5rem 0;\">${p.features.map((f: string) => `<li style=\"display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;\"><span style=\"color: #10b981; font-weight: 700;\">✓</span>${escapeHtml(f)}</li>`).join(\"\")}</ul>`\n : \"\";\n\n const primaryBtnHtml = p.primaryButton\n ? `<a href=\"${escapeHtml(p.primaryButton.href || \"#\")}\" class=\"sg-showcase__btn sg-showcase__btn--primary\" style=\"display: inline-block; padding: 0.625rem 1.25rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${BTN_HOVER_BASE}\">${escapeHtml(p.primaryButton.text)}</a>`\n : \"\";\n const secondaryBtnHtml = p.secondaryButton\n ? `<a href=\"${escapeHtml(p.secondaryButton.href || \"#\")}\" class=\"sg-showcase__btn sg-showcase__btn--secondary\" style=\"display: inline-block; padding: 0.625rem 1.25rem; background-color: transparent; color: var(--sg-primary); border: 1px solid var(--sg-primary); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${BTN_HOVER_BASE}\">${escapeHtml(p.secondaryButton.text)}</a>`\n : \"\";\n const buttonsHtml =\n primaryBtnHtml || secondaryBtnHtml\n ? `<div style=\"display: flex; gap: 0.75rem; flex-wrap: wrap;\">${primaryBtnHtml}${secondaryBtnHtml}</div>`\n : \"\";\n\n const itemId = `${scopeId}-item-${index}`;\n\n return `<style>\n #${itemId} { flex-direction: column; }\n @media (min-width: 768px) { #${itemId} { flex-direction: ${isReversed ? \"row-reverse\" : \"row\"}; } }\n</style><div id=\"${itemId}\" style=\"display: flex; gap: 3rem; align-items: center;\"><div style=\"flex: 1 1 50%;\">${imgHtml}</div><div style=\"flex: 1 1 50%;\">${badgeHtml}<h3 style=\"font-size: 1.5rem; font-weight: 700; margin-bottom: 0.75rem;\">${iconHtml}${escapeHtml(p.name)}</h3><p style=\"color: var(--sg-muted-text); margin-bottom: 1rem; line-height: 1.7;\">${escapeHtml(p.longDescription || p.description)}</p>${featuresHtml}${buttonsHtml}</div></div>`;\n })\n .join(\"\");\n\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div data-block-group=\"Layout\" style=\"display: flex; flex-direction: column; gap: 4rem;\">${productsHtml}</div></div></section>`;\n}\n\n// ============================================================================\n// AboutSection\n// ============================================================================\n\nexport function exportAboutSection(\n block: Block,\n _depth: number,\n _basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n subtitle,\n description,\n secondaryDescription,\n image,\n achievements = [],\n primaryButton,\n variant = \"image-left\",\n bg,\n stats = [],\n buttonHoverEffect = \"none\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n const bgStyle = bg ? `background-color: ${escapeHtml(bg)};` : \"background-color: var(--sg-bg);\";\n const isCentered = variant === \"centered\";\n const isReversed = variant === \"image-right\";\n const scope = `[data-block-id=\"${block.id}\"]`;\n\n // Hover CSS\n const hoverCss = generateAdminButtonHoverCSS(scope, \"sg-about__btn\", {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n }, theme);\n\n const subtitleHtml = subtitle\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;\">${escapeHtml(subtitle)}</span>`\n : \"\";\n const titleHtml = title\n ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 1rem;\">${escapeHtml(title)}</h2>`\n : \"\";\n const descHtml = description\n ? `<p style=\"color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1rem;\">${escapeHtml(description)}</p>`\n : \"\";\n const secondaryDescHtml = secondaryDescription\n ? `<p style=\"color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1.5rem;\">${escapeHtml(secondaryDescription)}</p>`\n : \"\";\n const achievementsHtml =\n achievements.length > 0\n ? `<ul style=\"list-style: none; padding: 0; margin: 0 0 1.5rem 0;\">${achievements.map((a: any) => `<li style=\"display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;\"><span style=\"color: #10b981; font-weight: 700;\">✓</span>${escapeHtml(a.text)}</li>`).join(\"\")}</ul>`\n : \"\";\n const buttonHtml = primaryButton\n ? `<a href=\"${escapeHtml(primaryButton.href || \"#\")}\" class=\"sg-about__btn sg-about__btn--primary\" style=\"display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${BTN_HOVER_BASE}\">${escapeHtml(primaryButton.text)}</a>`\n : \"\";\n\n const stylePreamble = hoverCss ? `<style>${hoverCss}</style>` : \"\";\n\n if (isCentered) {\n const imgHtml = image\n ? `<div data-block-group=\"Mídia\" style=\"margin: 2rem 0;\"><img src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(title || \"About\")}\" style=\"width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;\" /></div>`\n : \"\";\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 800px; margin: 0 auto; padding: 0 1rem; text-align: center;\">${subtitleHtml}${titleHtml}${imgHtml}${descHtml}${secondaryDescHtml}${achievementsHtml}${buttonHtml}</div></section>`;\n }\n\n // image-left / image-right\n const scopeId = generateScopedId(block.id || \"\", \"about\");\n const imgHtml = image\n ? `<img src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(title || \"About\")}\" style=\"width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;\" />`\n : `<div style=\"width: 100%; height: 400px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 1rem; color: var(--sg-muted-text);\">Imagem</div>`;\n\n const statsHtml =\n stats.length > 0\n ? `<div style=\"display: flex; gap: 0.5rem; margin-top: 1rem;\">${stats.map((s: any) => `<div style=\"background-color: var(--sg-primary); color: #fff; padding: 0.75rem 1rem; border-radius: var(--sg-card-radius, 0.75rem); text-align: center; box-shadow: 0 4px 12px rgba(0,0,0,0.15); min-width: 80px;\"><div style=\"font-size: 1.5rem; font-weight: 700;\">${escapeHtml(s.value)}</div><div style=\"font-size: 0.7rem; opacity: 0.9;\">${escapeHtml(s.label)}</div></div>`).join(\"\")}</div>`\n : \"\";\n\n return `${stylePreamble}<style>\n #${scopeId} { flex-direction: column; }\n @media (min-width: 768px) { #${scopeId} { flex-direction: ${isReversed ? \"row-reverse\" : \"row\"}; } }\n</style><section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div id=\"${scopeId}\" style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem; display: flex; gap: 3rem; align-items: center;\"><div data-block-group=\"Mídia\" style=\"flex: 1 1 50%; position: relative;\">${imgHtml}${statsHtml}</div><div data-block-group=\"Conteúdo\" style=\"flex: 1 1 50%;\">${subtitleHtml}${titleHtml}${descHtml}${secondaryDescHtml}${achievementsHtml}${buttonHtml}</div></div></section>`;\n}\n\n// ============================================================================\n// ContactSection\n// ============================================================================\n\nconst CONTACT_ICON_SVG: Record<string, string> = {\n mail: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"/><path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\"/></svg>`,\n phone: `<svg xmlns=\"http://www.w3.org/2000/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=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z\"/></svg>`,\n \"map-pin\": `<svg xmlns=\"http://www.w3.org/2000/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=\"M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/></svg>`,\n clock: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`,\n globe: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"/><path d=\"M2 12h20\"/></svg>`,\n};\n\nfunction getContactIconSvg(icon: string): string {\n return CONTACT_ICON_SVG[icon] || CONTACT_ICON_SVG.mail;\n}\n\nexport function exportContactSection(\n block: Block,\n _depth: number,\n _basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n subtitle,\n description,\n contactInfo = [],\n formTitle,\n formFields = [],\n submitText = \"Enviar\",\n variant = \"split\",\n bg,\n buttonHoverEffect = \"none\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n const bgStyle = bg ? `background-color: ${escapeHtml(bg)};` : \"background-color: var(--sg-bg);\";\n const isFormOnly = variant === \"form-only\";\n const isStacked = variant === \"stacked\";\n const scope = `[data-block-id=\"${block.id}\"]`;\n\n // Hover CSS — submit button uses --primary class\n const hoverCss = generateAdminButtonHoverCSS(scope, \"sg-contact__btn\", {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n }, theme);\n\n const subtitleHtml = subtitle\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: #fff; border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;\">${escapeHtml(subtitle)}</span>`\n : \"\";\n const titleHtml = title\n ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;\">${escapeHtml(title)}</h2>`\n : \"\";\n const descHtml = description\n ? `<p style=\"color: var(--sg-muted-text);\">${escapeHtml(description)}</p>`\n : \"\";\n const headerHtml =\n title || subtitle\n ? `<div data-block-group=\"Conteúdo\" style=\"text-align: center; margin-bottom: 3rem;\">${subtitleHtml}${titleHtml}${descHtml}</div>`\n : \"\";\n\n // Form HTML\n const fieldsHtml = formFields\n .map((field: any) => {\n const labelHtml = field.label\n ? `<label style=\"display: block; font-size: 0.875rem; font-weight: 500; margin-bottom: 0.375rem; color: var(--sg-text);\">${escapeHtml(field.label)}${field.required ? '<span style=\"color: #ef4444;\"> *</span>' : \"\"}</label>`\n : \"\";\n const inputStyle = `width: 100%; padding: 0.625rem 0.75rem; border: 1px solid var(--sg-border); border-radius: var(--sg-button-radius, 0.5rem); font-size: 0.875rem; background-color: var(--sg-bg); color: var(--sg-text); box-sizing: border-box;`;\n const inputHtml =\n field.type === \"textarea\"\n ? `<textarea name=\"${escapeHtml(field.name)}\" placeholder=\"${escapeHtml(field.placeholder || \"\")}\" rows=\"4\" style=\"${inputStyle} resize: vertical;\"${field.required ? \" required\" : \"\"}></textarea>`\n : `<input type=\"${escapeHtml(field.type || \"text\")}\" name=\"${escapeHtml(field.name)}\" placeholder=\"${escapeHtml(field.placeholder || \"\")}\" style=\"${inputStyle}\"${field.required ? \" required\" : \"\"} />`;\n return `<div style=\"margin-bottom: 1rem;\">${labelHtml}${inputHtml}</div>`;\n })\n .join(\"\");\n\n const submitBtnStyle = `width: 100%; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border: none; border-radius: var(--sg-button-radius, 0.5rem); font-weight: 500; cursor: pointer; font-size: 1rem; ${BTN_HOVER_BASE}`;\n\n const formHtml = `<div data-block-group=\"Formulário\" style=\"background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); padding: 2rem; box-shadow: var(--sg-card-shadow);\">${formTitle ? `<h3 style=\"font-size: 1.25rem; font-weight: 600; margin-bottom: 1.5rem;\">${escapeHtml(formTitle)}</h3>` : \"\"}<form>${fieldsHtml}<button type=\"submit\" class=\"sg-contact__btn sg-contact__btn--primary\" style=\"${submitBtnStyle}\">${escapeHtml(submitText)}</button></form></div>`;\n\n const stylePreamble = hoverCss ? `<style>${hoverCss}</style>` : \"\";\n\n if (isFormOnly) {\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 600px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}${formHtml}</div></section>`;\n }\n\n // Contact info cards\n const contactCardsHtml = contactInfo\n .map((info: any) => {\n const iconSvg = getContactIconSvg(info.icon || \"mail\");\n return `<div style=\"display: flex; align-items: flex-start; gap: 1rem; padding: 1.25rem; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); box-shadow: var(--sg-card-shadow);\"><div style=\"width: 2.5rem; height: 2.5rem; background-color: var(--sg-primary); border-radius: 0.5rem; display: flex; align-items: center; justify-content: center; color: #fff; flex-shrink: 0;\">${iconSvg}</div><div><div style=\"font-weight: 600; font-size: 0.875rem; margin-bottom: 0.25rem;\">${escapeHtml(info.label)}</div><div style=\"color: var(--sg-muted-text); font-size: 0.875rem;\">${escapeHtml(info.value)}</div></div></div>`;\n })\n .join(\"\");\n\n const scopeId = generateScopedId(block.id || \"\", \"contact\");\n\n if (isStacked) {\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}${contactInfo.length > 0 ? `<div data-block-group=\"Info\" style=\"display: flex; flex-direction: column; gap: 1rem; margin-bottom: 3rem;\">${contactCardsHtml}</div>` : \"\"}${formHtml}</div></section>`;\n }\n\n // split layout\n return `${stylePreamble}<style>\n #${scopeId} { flex-direction: column; }\n @media (min-width: 768px) { #${scopeId} { flex-direction: row; } }\n</style><section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div id=\"${scopeId}\" style=\"display: flex; gap: 3rem;\">${contactInfo.length > 0 ? `<div data-block-group=\"Info\" style=\"flex: 1 1 40%; display: flex; flex-direction: column; gap: 1rem;\">${contactCardsHtml}</div>` : \"\"}<div style=\"flex: 1 1 60%;\">${formHtml}</div></div></div></section>`;\n}\n"],"names":["generateAdminButtonHoverCSS","scope","classPrefix","props","theme","buttonHoverEffect","buttonHoverIntensity","buttonHoverOverlay","buttonHoverIconName","primaryColor","primaryText","css","primaryResult","generateButtonHoverStyles","outlineResult","getButtonHoverKeyframes","generateButtonOverlayCSS","BTN_HOVER_BASE","exportProductShowcase","block","_depth","_basePath","title","subtitle","products","variant","bg","bgStyle","escapeHtml","hoverCss","subtitleHtml","titleHtml","headerHtml","stylePreamble","gridId","generateScopedId","responsiveConfig","resolveResponsiveColumns","inlineStyles","mediaQueries","generateResponsiveGridStyles","cardsHtml","p","imgHtml","badgeHtml","iconHtml","btnHtml","blockIdAttr","dataBlockIdAttr","scopeId","productsHtml","index","isReversed","featuresHtml","f","primaryBtnHtml","secondaryBtnHtml","buttonsHtml","itemId","exportAboutSection","description","secondaryDescription","image","achievements","primaryButton","stats","isCentered","descHtml","secondaryDescHtml","achievementsHtml","a","buttonHtml","statsHtml","s","CONTACT_ICON_SVG","getContactIconSvg","icon","exportContactSection","contactInfo","formTitle","formFields","submitText","isFormOnly","isStacked","fieldsHtml","field","labelHtml","inputStyle","inputHtml","submitBtnStyle","formHtml","contactCardsHtml","info"],"mappings":"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"}
1
+ {"version":3,"file":"AdminSectionExporters.js","sources":["../../../../../src/engine/export/exporters/sections/AdminSectionExporters.ts"],"sourcesContent":["/**\n * Admin Section Exporters\n * ProductShowcase, AboutSection, ContactSection\n * Mobile-first responsive layouts with media queries\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr, blockIdAttr, escapeHtml } from \"../../shared/htmlHelpers\";\nimport { generateScopedId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n} from \"../../shared/responsiveGridHelper\";\nimport {\n generateButtonHoverStyles,\n generateButtonOverlayCSS,\n getButtonHoverKeyframes,\n type ButtonHoverEffect,\n type ButtonHoverOverlay,\n} from \"../../../shared/hoverEffects\";\n\n// ============================================================================\n// Shared: button hover CSS generator for admin sections\n// ============================================================================\n\nfunction generateAdminButtonHoverCSS(\n scope: string,\n classPrefix: string,\n props: {\n buttonHoverEffect: string;\n buttonHoverIntensity: number;\n buttonHoverOverlay: string;\n buttonHoverIconName: string;\n },\n theme?: ThemeTokens,\n): string {\n const {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n } = props;\n\n const primaryColor = theme?.colors?.primary || \"#6366f1\";\n const primaryText = theme?.colors?.primaryText || \"#ffffff\";\n let css = \"\";\n\n if (buttonHoverEffect !== \"none\") {\n const primaryResult = generateButtonHoverStyles({\n effect: buttonHoverEffect as ButtonHoverEffect,\n intensity: buttonHoverIntensity,\n buttonColor: primaryColor,\n buttonTextColor: primaryText,\n variant: \"solid\",\n });\n const outlineResult = generateButtonHoverStyles({\n effect: buttonHoverEffect as ButtonHoverEffect,\n intensity: buttonHoverIntensity,\n buttonColor: primaryColor,\n buttonTextColor: primaryColor,\n variant: \"outline\",\n });\n\n if (primaryResult.base) {\n css += `${scope} .${classPrefix}--primary { ${primaryResult.base} }`;\n }\n if (outlineResult.base) {\n css += `${scope} .${classPrefix}--secondary { ${outlineResult.base} }`;\n }\n css += `${scope} .${classPrefix}--primary:hover { ${primaryResult.hover} }`;\n css += `${scope} .${classPrefix}--secondary:hover { ${outlineResult.hover} }`;\n css += getButtonHoverKeyframes();\n }\n\n if (buttonHoverOverlay && buttonHoverOverlay !== \"none\") {\n css += generateButtonOverlayCSS(`${scope} .${classPrefix}--primary`, {\n overlay: buttonHoverOverlay as ButtonHoverOverlay,\n primaryColor,\n iconName: buttonHoverIconName,\n textColor: primaryText,\n });\n css += generateButtonOverlayCSS(`${scope} .${classPrefix}--secondary`, {\n overlay: buttonHoverOverlay as ButtonHoverOverlay,\n primaryColor,\n iconName: buttonHoverIconName,\n textColor: primaryColor,\n });\n }\n\n return css;\n}\n\nconst BTN_HOVER_BASE = \"position: relative; overflow: hidden; transition: all 0.2s ease;\";\n\n// ============================================================================\n// ProductShowcase\n// ============================================================================\n\nexport function exportProductShowcase(\n block: Block,\n _depth: number,\n _basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n subtitle,\n products = [],\n variant = \"alternating\",\n bg,\n buttonHoverEffect = \"none\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n const bgStyle = bg ? `background-color: ${escapeHtml(bg)};` : \"background-color: var(--sg-bg);\";\n const scope = `[data-block-id=\"${block.id}\"]`;\n\n // Hover CSS\n const hoverCss = generateAdminButtonHoverCSS(scope, \"sg-showcase__btn\", {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n }, theme);\n\n // Header\n const subtitleHtml = subtitle\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;\">${escapeHtml(subtitle)}</span>`\n : \"\";\n const titleHtml = title\n ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;\">${escapeHtml(title)}</h2>`\n : \"\";\n const headerHtml =\n title || subtitle\n ? `<div data-block-group=\"Conteúdo\" style=\"text-align: center; margin-bottom: 3rem;\">${subtitleHtml}${titleHtml}</div>`\n : \"\";\n\n const stylePreamble = hoverCss ? `<style>${hoverCss}</style>` : \"\";\n\n if (variant === \"grid\") {\n const gridId = generateScopedId(block.id || \"\", \"product-grid\");\n const responsiveConfig = resolveResponsiveColumns(\n Math.min(products.length, 3),\n 1,\n 2,\n Math.min(products.length, 3),\n );\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(gridId, responsiveConfig, \"2rem\");\n\n const cardsHtml = products\n .map((p: any) => {\n const imgHtml = p.image\n ? `<div style=\"width: 100%; height: 200px; background-image: url(${escapeHtml(p.image)}); background-size: cover; background-position: center;\"></div>`\n : \"\";\n const badgeHtml = p.badge\n ? `<span style=\"display: inline-block; padding: 0.125rem 0.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.7rem; font-weight: 600; margin-bottom: 0.5rem;\">${escapeHtml(p.badge)}</span>`\n : \"\";\n const iconHtml = p.icon ? `<span style=\"margin-right: 0.5rem;\">${escapeHtml(p.icon)}</span>` : \"\";\n const btnHtml = p.primaryButton\n ? `<a href=\"${escapeHtml(p.primaryButton.href || \"#\")}\" class=\"sg-showcase__btn sg-showcase__btn--primary\" style=\"display: inline-block; margin-top: 1rem; padding: 0.5rem 1rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; font-size: 0.875rem; ${BTN_HOVER_BASE}\">${escapeHtml(p.primaryButton.text)}</a>`\n : \"\";\n return `<div style=\"background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); overflow: hidden; box-shadow: var(--sg-card-shadow);\">${imgHtml}<div style=\"padding: 1.5rem;\">${badgeHtml}<h3 style=\"font-size: 1.25rem; font-weight: 600; margin-bottom: 0.5rem;\">${iconHtml}${escapeHtml(p.name)}</h3><p style=\"color: var(--sg-muted-text); font-size: 0.875rem;\">${escapeHtml(p.description)}</p>${btnHtml}</div></div>`;\n })\n .join(\"\");\n\n return `${stylePreamble}<style>${mediaQueries}</style><section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div data-block-group=\"Layout\" id=\"${gridId}\" style=\"${inlineStyles}\">${cardsHtml}</div></div></section>`;\n }\n\n // alternating / stacked\n const scopeId = generateScopedId(block.id || \"\", \"product-showcase\");\n const productsHtml = products\n .map((p: any, index: number) => {\n const isReversed = variant === \"alternating\" && index % 2 === 1;\n\n const imgHtml = p.image\n ? `<img src=\"${escapeHtml(p.image)}\" alt=\"${escapeHtml(p.name)}\" style=\"width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;\" />`\n : `<div style=\"width: 100%; height: 300px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 4rem;\">${escapeHtml(p.icon || \"📦\")}</div>`;\n\n const badgeHtml = p.badge\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 0.75rem;\">${escapeHtml(p.badge)}</span>`\n : \"\";\n const iconHtml = p.icon ? `<span style=\"margin-right: 0.5rem;\">${escapeHtml(p.icon)}</span>` : \"\";\n\n const featuresHtml =\n p.features && p.features.length > 0\n ? `<ul style=\"list-style: none; padding: 0; margin: 0 0 1.5rem 0;\">${p.features.map((f: string) => `<li style=\"display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;\"><span style=\"color: #10b981; font-weight: 700;\">✓</span>${escapeHtml(f)}</li>`).join(\"\")}</ul>`\n : \"\";\n\n const primaryBtnHtml = p.primaryButton\n ? `<a href=\"${escapeHtml(p.primaryButton.href || \"#\")}\" class=\"sg-showcase__btn sg-showcase__btn--primary\" style=\"display: inline-block; padding: 0.625rem 1.25rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${BTN_HOVER_BASE}\">${escapeHtml(p.primaryButton.text)}</a>`\n : \"\";\n const secondaryBtnHtml = p.secondaryButton\n ? `<a href=\"${escapeHtml(p.secondaryButton.href || \"#\")}\" class=\"sg-showcase__btn sg-showcase__btn--secondary\" style=\"display: inline-block; padding: 0.625rem 1.25rem; background-color: transparent; color: var(--sg-primary); border: 1px solid var(--sg-primary); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${BTN_HOVER_BASE}\">${escapeHtml(p.secondaryButton.text)}</a>`\n : \"\";\n const buttonsHtml =\n primaryBtnHtml || secondaryBtnHtml\n ? `<div style=\"display: flex; gap: 0.75rem; flex-wrap: wrap;\">${primaryBtnHtml}${secondaryBtnHtml}</div>`\n : \"\";\n\n const itemId = `${scopeId}-item-${index}`;\n\n return `<style>\n #${itemId} { flex-direction: column; }\n @media (min-width: 768px) { #${itemId} { flex-direction: ${isReversed ? \"row-reverse\" : \"row\"}; } }\n</style><div id=\"${itemId}\" style=\"display: flex; gap: 3rem; align-items: center;\"><div style=\"flex: 1 1 50%;\">${imgHtml}</div><div style=\"flex: 1 1 50%;\">${badgeHtml}<h3 style=\"font-size: 1.5rem; font-weight: 700; margin-bottom: 0.75rem;\">${iconHtml}${escapeHtml(p.name)}</h3><p style=\"color: var(--sg-muted-text); margin-bottom: 1rem; line-height: 1.7;\">${escapeHtml(p.longDescription || p.description)}</p>${featuresHtml}${buttonsHtml}</div></div>`;\n })\n .join(\"\");\n\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div data-block-group=\"Layout\" style=\"display: flex; flex-direction: column; gap: 4rem;\">${productsHtml}</div></div></section>`;\n}\n\n// ============================================================================\n// AboutSection\n// ============================================================================\n\nexport function exportAboutSection(\n block: Block,\n _depth: number,\n _basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n subtitle,\n description,\n secondaryDescription,\n image,\n achievements = [],\n primaryButton,\n variant = \"image-left\",\n bg,\n stats = [],\n buttonHoverEffect = \"none\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n const bgStyle = bg ? `background-color: ${escapeHtml(bg)};` : \"background-color: var(--sg-bg);\";\n const isCentered = variant === \"centered\";\n const isReversed = variant === \"image-right\";\n const scope = `[data-block-id=\"${block.id}\"]`;\n\n // Hover CSS\n const hoverCss = generateAdminButtonHoverCSS(scope, \"sg-about__btn\", {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n }, theme);\n\n const subtitleHtml = subtitle\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;\">${escapeHtml(subtitle)}</span>`\n : \"\";\n const titleHtml = title\n ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 1rem;\">${escapeHtml(title)}</h2>`\n : \"\";\n const descHtml = description\n ? `<p style=\"color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1rem;\">${escapeHtml(description)}</p>`\n : \"\";\n const secondaryDescHtml = secondaryDescription\n ? `<p style=\"color: var(--sg-muted-text); line-height: 1.7; margin-bottom: 1.5rem;\">${escapeHtml(secondaryDescription)}</p>`\n : \"\";\n const achievementsHtml =\n achievements.length > 0\n ? `<ul style=\"list-style: none; padding: 0; margin: 0 0 1.5rem 0;\">${achievements.map((a: any) => `<li style=\"display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.5rem;\"><span style=\"color: #10b981; font-weight: 700;\">✓</span>${escapeHtml(a.text)}</li>`).join(\"\")}</ul>`\n : \"\";\n const buttonHtml = primaryButton\n ? `<a href=\"${escapeHtml(primaryButton.href || \"#\")}\" class=\"sg-about__btn sg-about__btn--primary\" style=\"display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border-radius: var(--sg-button-radius, 0.5rem); text-decoration: none; font-weight: 500; ${BTN_HOVER_BASE}\">${escapeHtml(primaryButton.text)}</a>`\n : \"\";\n\n const stylePreamble = hoverCss ? `<style>${hoverCss}</style>` : \"\";\n\n if (isCentered) {\n const imgHtml = image\n ? `<div data-block-group=\"Mídia\" style=\"margin: 2rem 0;\"><img src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(title || \"About\")}\" style=\"width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;\" /></div>`\n : \"\";\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 800px; margin: 0 auto; padding: 0 1rem; text-align: center;\">${subtitleHtml}${titleHtml}${imgHtml}${descHtml}${secondaryDescHtml}${achievementsHtml}${buttonHtml}</div></section>`;\n }\n\n // image-left / image-right\n const scopeId = generateScopedId(block.id || \"\", \"about\");\n const imgHtml = image\n ? `<img src=\"${escapeHtml(image)}\" alt=\"${escapeHtml(title || \"About\")}\" style=\"width: 100%; border-radius: var(--sg-card-radius, 0.75rem); object-fit: cover;\" />`\n : `<div style=\"width: 100%; height: 400px; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); display: flex; align-items: center; justify-content: center; font-size: 1rem; color: var(--sg-muted-text);\">Imagem</div>`;\n\n const statsHtml =\n stats.length > 0\n ? `<div style=\"display: flex; gap: 0.5rem; margin-top: 1rem;\">${stats.map((s: any) => `<div style=\"background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); padding: 0.75rem 1rem; border-radius: var(--sg-card-radius, 0.75rem); text-align: center; box-shadow: 0 4px 12px rgba(0,0,0,0.15); min-width: 80px;\"><div style=\"font-size: 1.5rem; font-weight: 700;\">${escapeHtml(s.value)}</div><div style=\"font-size: 0.7rem; opacity: 0.9;\">${escapeHtml(s.label)}</div></div>`).join(\"\")}</div>`\n : \"\";\n\n return `${stylePreamble}<style>\n #${scopeId} { flex-direction: column; }\n @media (min-width: 768px) { #${scopeId} { flex-direction: ${isReversed ? \"row-reverse\" : \"row\"}; } }\n</style><section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div id=\"${scopeId}\" style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem; display: flex; gap: 3rem; align-items: center;\"><div data-block-group=\"Mídia\" style=\"flex: 1 1 50%; position: relative;\">${imgHtml}${statsHtml}</div><div data-block-group=\"Conteúdo\" style=\"flex: 1 1 50%;\">${subtitleHtml}${titleHtml}${descHtml}${secondaryDescHtml}${achievementsHtml}${buttonHtml}</div></div></section>`;\n}\n\n// ============================================================================\n// ContactSection\n// ============================================================================\n\nconst CONTACT_ICON_SVG: Record<string, string> = {\n mail: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\"/><path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\"/></svg>`,\n phone: `<svg xmlns=\"http://www.w3.org/2000/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=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z\"/></svg>`,\n \"map-pin\": `<svg xmlns=\"http://www.w3.org/2000/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=\"M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/></svg>`,\n clock: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><polyline points=\"12 6 12 12 16 14\"/></svg>`,\n globe: `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20\"/><path d=\"M2 12h20\"/></svg>`,\n};\n\nfunction getContactIconSvg(icon: string): string {\n return CONTACT_ICON_SVG[icon] || CONTACT_ICON_SVG.mail;\n}\n\nexport function exportContactSection(\n block: Block,\n _depth: number,\n _basePath?: string,\n theme?: ThemeTokens,\n): string {\n const {\n title,\n subtitle,\n description,\n contactInfo = [],\n formTitle,\n formFields = [],\n submitText = \"Enviar\",\n variant = \"split\",\n bg,\n buttonHoverEffect = \"none\",\n buttonHoverIntensity = 50,\n buttonHoverOverlay = \"none\",\n buttonHoverIconName = \"arrow-right\",\n } = (block as any).props;\n\n const bgStyle = bg ? `background-color: ${escapeHtml(bg)};` : \"background-color: var(--sg-bg);\";\n const isFormOnly = variant === \"form-only\";\n const isStacked = variant === \"stacked\";\n const scope = `[data-block-id=\"${block.id}\"]`;\n\n // Hover CSS — submit button uses --primary class\n const hoverCss = generateAdminButtonHoverCSS(scope, \"sg-contact__btn\", {\n buttonHoverEffect,\n buttonHoverIntensity,\n buttonHoverOverlay,\n buttonHoverIconName,\n }, theme);\n\n const subtitleHtml = subtitle\n ? `<span style=\"display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 9999px; font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 0.75rem;\">${escapeHtml(subtitle)}</span>`\n : \"\";\n const titleHtml = title\n ? `<h2 style=\"font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;\">${escapeHtml(title)}</h2>`\n : \"\";\n const descHtml = description\n ? `<p style=\"color: var(--sg-muted-text);\">${escapeHtml(description)}</p>`\n : \"\";\n const headerHtml =\n title || subtitle\n ? `<div data-block-group=\"Conteúdo\" style=\"text-align: center; margin-bottom: 3rem;\">${subtitleHtml}${titleHtml}${descHtml}</div>`\n : \"\";\n\n // Form HTML\n const fieldsHtml = formFields\n .map((field: any) => {\n const labelHtml = field.label\n ? `<label style=\"display: block; font-size: 0.875rem; font-weight: 500; margin-bottom: 0.375rem; color: var(--sg-text);\">${escapeHtml(field.label)}${field.required ? '<span style=\"color: #ef4444;\"> *</span>' : \"\"}</label>`\n : \"\";\n const inputStyle = `width: 100%; padding: 0.625rem 0.75rem; border: 1px solid var(--sg-border); border-radius: var(--sg-button-radius, 0.5rem); font-size: 0.875rem; background-color: var(--sg-bg); color: var(--sg-text); box-sizing: border-box;`;\n const inputHtml =\n field.type === \"textarea\"\n ? `<textarea name=\"${escapeHtml(field.name)}\" placeholder=\"${escapeHtml(field.placeholder || \"\")}\" rows=\"4\" style=\"${inputStyle} resize: vertical;\"${field.required ? \" required\" : \"\"}></textarea>`\n : `<input type=\"${escapeHtml(field.type || \"text\")}\" name=\"${escapeHtml(field.name)}\" placeholder=\"${escapeHtml(field.placeholder || \"\")}\" style=\"${inputStyle}\"${field.required ? \" required\" : \"\"} />`;\n return `<div style=\"margin-bottom: 1rem;\">${labelHtml}${inputHtml}</div>`;\n })\n .join(\"\");\n\n const submitBtnStyle = `width: 100%; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text); border: none; border-radius: var(--sg-button-radius, 0.5rem); font-weight: 500; cursor: pointer; font-size: 1rem; ${BTN_HOVER_BASE}`;\n\n const formHtml = `<div data-block-group=\"Formulário\" style=\"background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); padding: 2rem; box-shadow: var(--sg-card-shadow);\">${formTitle ? `<h3 style=\"font-size: 1.25rem; font-weight: 600; margin-bottom: 1.5rem;\">${escapeHtml(formTitle)}</h3>` : \"\"}<form>${fieldsHtml}<button type=\"submit\" class=\"sg-contact__btn sg-contact__btn--primary\" style=\"${submitBtnStyle}\">${escapeHtml(submitText)}</button></form></div>`;\n\n const stylePreamble = hoverCss ? `<style>${hoverCss}</style>` : \"\";\n\n if (isFormOnly) {\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 600px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}${formHtml}</div></section>`;\n }\n\n // Contact info cards\n const contactCardsHtml = contactInfo\n .map((info: any) => {\n const iconSvg = getContactIconSvg(info.icon || \"mail\");\n return `<div style=\"display: flex; align-items: flex-start; gap: 1rem; padding: 1.25rem; background-color: var(--sg-surface); border-radius: var(--sg-card-radius, 0.75rem); box-shadow: var(--sg-card-shadow);\"><div style=\"width: 2.5rem; height: 2.5rem; background-color: var(--sg-primary); border-radius: 0.5rem; display: flex; align-items: center; justify-content: center; color: var(--sg-primary-text, #fff); flex-shrink: 0;\">${iconSvg}</div><div><div style=\"font-weight: 600; font-size: 0.875rem; margin-bottom: 0.25rem;\">${escapeHtml(info.label)}</div><div style=\"color: var(--sg-muted-text); font-size: 0.875rem;\">${escapeHtml(info.value)}</div></div></div>`;\n })\n .join(\"\");\n\n const scopeId = generateScopedId(block.id || \"\", \"contact\");\n\n if (isStacked) {\n return `${stylePreamble}<section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}${contactInfo.length > 0 ? `<div data-block-group=\"Info\" style=\"display: flex; flex-direction: column; gap: 1rem; margin-bottom: 3rem;\">${contactCardsHtml}</div>` : \"\"}${formHtml}</div></section>`;\n }\n\n // split layout\n return `${stylePreamble}<style>\n #${scopeId} { flex-direction: column; }\n @media (min-width: 768px) { #${scopeId} { flex-direction: row; } }\n</style><section ${blockIdAttr(block.id)} ${dataBlockIdAttr(block.id)} style=\"padding: 4rem 0; ${bgStyle}\"><div style=\"max-width: 1200px; margin: 0 auto; padding: 0 1rem;\">${headerHtml}<div id=\"${scopeId}\" style=\"display: flex; gap: 3rem;\">${contactInfo.length > 0 ? `<div data-block-group=\"Info\" style=\"flex: 1 1 40%; display: flex; flex-direction: column; gap: 1rem;\">${contactCardsHtml}</div>` : \"\"}<div style=\"flex: 1 1 60%;\">${formHtml}</div></div></div></section>`;\n}\n"],"names":["generateAdminButtonHoverCSS","scope","classPrefix","props","theme","buttonHoverEffect","buttonHoverIntensity","buttonHoverOverlay","buttonHoverIconName","primaryColor","primaryText","css","primaryResult","generateButtonHoverStyles","outlineResult","getButtonHoverKeyframes","generateButtonOverlayCSS","BTN_HOVER_BASE","exportProductShowcase","block","_depth","_basePath","title","subtitle","products","variant","bg","bgStyle","escapeHtml","hoverCss","subtitleHtml","titleHtml","headerHtml","stylePreamble","gridId","generateScopedId","responsiveConfig","resolveResponsiveColumns","inlineStyles","mediaQueries","generateResponsiveGridStyles","cardsHtml","p","imgHtml","badgeHtml","iconHtml","btnHtml","blockIdAttr","dataBlockIdAttr","scopeId","productsHtml","index","isReversed","featuresHtml","f","primaryBtnHtml","secondaryBtnHtml","buttonsHtml","itemId","exportAboutSection","description","secondaryDescription","image","achievements","primaryButton","stats","isCentered","descHtml","secondaryDescHtml","achievementsHtml","a","buttonHtml","statsHtml","s","CONTACT_ICON_SVG","getContactIconSvg","icon","exportContactSection","contactInfo","formTitle","formFields","submitText","isFormOnly","isStacked","fieldsHtml","field","labelHtml","inputStyle","inputHtml","submitBtnStyle","formHtml","contactCardsHtml","info"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
- import { escapeHtml as e, dataBlockIdAttr as z } from "../../shared/htmlHelpers.js";
1
+ import { escapeHtml as t, dataBlockIdAttr as z } from "../../shared/htmlHelpers.js";
2
2
  import { generateScopedId as B } from "../../shared/idGenerator.js";
3
3
  import { resolveResponsiveColumns as N, generateResponsiveGridStyles as R } from "../../shared/responsiveGridHelper.js";
4
4
  function D(r, k, H, A) {
5
5
  const {
6
6
  title: c,
7
- excerpt: t,
7
+ excerpt: e,
8
8
  image: s,
9
9
  date: o,
10
10
  category: i,
@@ -13,64 +13,64 @@ function D(r, k, H, A) {
13
13
  readingTime: m,
14
14
  linkHref: p,
15
15
  linkText: n,
16
- variant: y = "default",
16
+ variant: b = "default",
17
17
  showImage: x = !0,
18
18
  showCategory: f = !0,
19
- showDate: h = !0,
19
+ showDate: v = !0,
20
20
  showAuthor: $ = !1,
21
- showReadingTime: v = !1
21
+ showReadingTime: h = !1
22
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>`;
23
+ if (b === "horizontal") {
24
+ const g = x && s ? `<div style="width: 260px; min-height: 180px; flex-shrink: 0; background-image: url(${t(s)}); background-size: cover; background-position: center;"></div>` : "", a = [];
25
+ f && i && a.push(t(i)), v && o && a.push(t(o)), h && m && a.push(t(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="${t(l)}" alt="${t(d)}" style="width: 28px; height: 28px; border-radius: 50%; object-fit: cover;" />` : ""}<span style="font-size: 0.8rem; color: var(--sg-muted-text);">${t(d)}</span></div>` : "", T = n ? `<a href="${t(p || "#")}" style="color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;">${t(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;">${t(c)}</h3>${e ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.75rem;">${t(e)}</p>` : ""}${T}${I}</div></article>`;
28
28
  }
29
- if (y === "minimal") {
29
+ if (b === "minimal") {
30
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>`;
31
+ f && i && g.push(t(i)), v && o && g.push(t(o)), h && m && g.push(t(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="${t(p || "#")}" style="color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;">${t(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;">${t(c)}</h3>${e ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 0.5rem;">${t(e)}</p>` : ""}${w}</article>`;
34
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>`;
35
+ const u = x && s ? `<div style="height: 200px; background-image: url(${t(s)}); background-size: cover; background-position: center;"></div>` : "", y = [];
36
+ f && i && y.push(t(i)), v && o && y.push(t(o)), h && m && y.push(t(m));
37
+ const P = y.length ? `<p style="font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;">${y.join(" &middot; ")}</p>` : "", j = $ && d ? `<div style="display: flex; align-items: center; gap: 0.5rem; margin-top: 1rem;">${l ? `<img src="${t(l)}" alt="${t(d)}" style="width: 32px; height: 32px; border-radius: 50%; object-fit: cover;" />` : ""}<span style="font-size: 0.8rem; color: var(--sg-muted-text);">${t(d)}</span></div>` : "", C = n ? `<a href="${t(p || "#")}" style="color: var(--sg-primary); font-weight: 500; text-decoration: none; font-size: 0.875rem;">${t(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;">${t(c)}</h3>${e ? `<p style="color: var(--sg-muted-text); font-size: 0.875rem; margin-bottom: 1rem;">${t(e)}</p>` : ""}${C}${j}</div></article>`;
39
39
  }
40
40
  function G(r, k, H, A, c) {
41
41
  const {
42
- title: t,
42
+ title: e,
43
43
  subtitle: s,
44
44
  columns: o = 3,
45
45
  cards: i = [],
46
46
  showViewAll: d = !1,
47
47
  viewAllText: l,
48
48
  viewAllHref: m
49
- } = r.props, p = B(r.id || "", "blog-post-grid"), n = N(o, 1, 2, o), { inlineStyles: y, mediaQueries: x } = R(
49
+ } = r.props, p = B(r.id || "", "blog-post-grid"), n = N(o, 1, 2, o), { inlineStyles: b, mediaQueries: x } = R(
50
50
  p,
51
51
  n,
52
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>` : "";
53
+ ), f = e || s ? `<div data-block-group="Cabeçalho" style="text-align: center; margin-bottom: 3rem;">${e ? `<h2 style="font-size: var(--sg-heading-h2); margin-bottom: 0.5rem;">${t(e)}</h2>` : ""}${s ? `<p style="color: var(--sg-muted-text);">${t(s)}</p>` : ""}</div>` : "";
54
54
  if (!c)
55
55
  throw new Error("exportBlogPostGrid requires renderChild function");
56
- const h = i.length > 0 ? i.map(
57
- (v, u) => c(
56
+ const v = i.length > 0 ? i.map(
57
+ (h, u) => c(
58
58
  {
59
59
  id: `${r.id}-card-${u}`,
60
60
  type: "blogPostCard",
61
- props: v
61
+ props: h
62
62
  },
63
63
  k + 1,
64
64
  H,
65
65
  A
66
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>`;
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="${t(m || "#")}" style="display: inline-block; padding: 0.75rem 1.5rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); font-weight: 600; border-radius: var(--sg-button-radius); text-decoration: none;">${t(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="${b}">${v}</div>${$}</div></section>`;
69
69
  }
70
70
  function V(r, k, H, A) {
71
71
  const {
72
72
  title: c,
73
- content: t,
73
+ content: e,
74
74
  featuredImage: s,
75
75
  date: o,
76
76
  category: i,
@@ -79,19 +79,19 @@ function V(r, k, H, A) {
79
79
  showFeaturedImage: m = !0,
80
80
  showAuthor: p = !0,
81
81
  authorVariant: n = "inline",
82
- showDate: y = !0,
82
+ showDate: b = !0,
83
83
  showTags: x = !0,
84
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>';
85
+ contentMaxWidth: v = "720px"
86
+ } = r.props, $ = m && s ? `<div data-block-group="Mídia" style="width: 100%; height: 400px; background-image: url(${t(s)}); background-size: cover; background-position: center; border-radius: var(--sg-card-radius); margin-bottom: 2rem;"></div>` : "", h = i ? `<span style="display: inline-block; padding: 0.25rem 0.75rem; background-color: var(--sg-primary); color: var(--sg-primary-text, #fff); border-radius: 999px; font-size: 0.75rem; font-weight: 600; margin-bottom: 1rem;">${t(i)}</span>` : "", u = [];
87
+ b && o && u.push(t(o)), f && d && u.push(t(d));
88
+ const y = 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;">${t(c)}</h1>`, j = e ? `<div class="sg-blog-post-content" style="font-size: 1.0625rem; line-height: 1.75; color: var(--sg-text);">${e}</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:var(--sg-primary-text, #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:var(--sg-primary-text, #fff);font-size:1.1rem;font-weight:700;">A</div>';
89
89
  let a = "";
90
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
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>`
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;">${t(I)}</span>`
93
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>`;
94
+ return `<article ${z(r.id)} class="sg-blog-post-detail" style="padding: 4rem 0; background-color: var(--sg-bg);"><div style="max-width: ${t(v)}; margin: 0 auto; padding: 0 1rem;">${$}${h}${P}${y}${j}${a}${w}</div></article>`;
95
95
  }
96
96
  export {
97
97
  D as exportBlogPostCard,
@@ -1 +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
+ {"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: var(--sg-primary-text, #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: var(--sg-primary-text, #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:var(--sg-primary-text, #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:var(--sg-primary-text, #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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"}