@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.
- package/dist/editor/LandingPageEditor.d.ts.map +1 -1
- package/dist/editor/LandingPageEditor.js +183 -169
- package/dist/editor/LandingPageEditor.js.map +1 -1
- package/dist/editor/PaletteSelector.d.ts +3 -0
- package/dist/editor/PaletteSelector.d.ts.map +1 -1
- package/dist/editor/PaletteSelector.js +114 -25
- package/dist/editor/PaletteSelector.js.map +1 -1
- package/dist/editor/components/RightPanel.d.ts +2 -0
- package/dist/editor/components/RightPanel.d.ts.map +1 -1
- package/dist/editor/components/RightPanel.js +23 -22
- package/dist/editor/components/RightPanel.js.map +1 -1
- package/dist/engine/export/exporters/content/AvatarExporter.js +2 -2
- package/dist/engine/export/exporters/content/AvatarExporter.js.map +1 -1
- package/dist/engine/export/exporters/content/BadgeExporter.js +11 -11
- package/dist/engine/export/exporters/content/BadgeExporter.js.map +1 -1
- package/dist/engine/export/exporters/sections/AdminSectionExporters.js +17 -17
- package/dist/engine/export/exporters/sections/AdminSectionExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/BlogPostExporters.js +34 -34
- package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/ContentGridExporters.js +16 -16
- package/dist/engine/export/exporters/sections/ContentGridExporters.js.map +1 -1
- package/dist/engine/export/exporters/sections/MarketingExporters.js +4 -4
- package/dist/engine/export/exporters/sections/MarketingExporters.js.map +1 -1
- package/dist/engine/render/renderers/content/BadgeRenderer.js +12 -12
- package/dist/engine/render/renderers/content/BadgeRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/AboutSectionRenderer.js +8 -8
- package/dist/engine/render/renderers/sections/AboutSectionRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/ContactSectionRenderer.js +52 -52
- package/dist/engine/render/renderers/sections/ContactSectionRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js +5 -5
- package/dist/engine/render/renderers/sections/FeatureGridRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/FeatureRenderer.js +9 -9
- package/dist/engine/render/renderers/sections/FeatureRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js +5 -5
- package/dist/engine/render/renderers/sections/PricingCardRenderer.js.map +1 -1
- package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js +17 -17
- package/dist/engine/render/renderers/sections/ProductShowcaseRenderer.js.map +1 -1
- package/dist/hooks/useEditorState.d.ts +2 -0
- package/dist/hooks/useEditorState.d.ts.map +1 -1
- package/dist/hooks/useEditorState.js +82 -77
- package/dist/hooks/useEditorState.js.map +1 -1
- package/dist/shared/templates/index.d.ts +4 -0
- package/dist/shared/templates/index.d.ts.map +1 -1
- package/dist/shared/templates/index.js +14 -7
- package/dist/shared/templates/index.js.map +1 -1
- package/dist/shared/templates/smartgesti-admin.d.ts.map +1 -1
- package/dist/shared/templates/smartgesti-admin.js +1 -4
- package/dist/shared/templates/smartgesti-admin.js.map +1 -1
- package/dist/utils/colorUtils.d.ts +73 -16
- package/dist/utils/colorUtils.d.ts.map +1 -1
- package/dist/utils/colorUtils.js +95 -9
- package/dist/utils/colorUtils.js.map +1 -1
- 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>` : "",
|
|
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;">${
|
|
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>` : "",
|
|
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>` : "",
|
|
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 `${
|
|
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
|
|
105
|
-
return `${
|
|
106
|
-
#${
|
|
107
|
-
@media (min-width: 768px) { #${
|
|
108
|
-
</style><section ${B(e.id)} ${I(e.id)} style="padding: 4rem 0; ${z}"><div id="${
|
|
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>`,
|
|
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 `${
|
|
146
|
-
const
|
|
147
|
-
return j ? `${
|
|
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;">${
|
|
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
|
|
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:
|
|
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:
|
|
16
|
+
variant: b = "default",
|
|
17
17
|
showImage: x = !0,
|
|
18
18
|
showCategory: f = !0,
|
|
19
|
-
showDate:
|
|
19
|
+
showDate: v = !0,
|
|
20
20
|
showAuthor: $ = !1,
|
|
21
|
-
showReadingTime:
|
|
21
|
+
showReadingTime: h = !1
|
|
22
22
|
} = r.props;
|
|
23
|
-
if (
|
|
24
|
-
const g = x && s ? `<div style="width: 260px; min-height: 180px; flex-shrink: 0; background-image: url(${
|
|
25
|
-
f && i && a.push(
|
|
26
|
-
const w = a.length ? `<p style="font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;">${a.join(" · ")}</p>` : "", I = $ && d ? `<div style="display: flex; align-items: center; gap: 0.5rem; margin-top: auto; padding-top: 0.75rem;">${l ? `<img src="${
|
|
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;">${
|
|
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(" · ")}</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 (
|
|
29
|
+
if (b === "minimal") {
|
|
30
30
|
const g = [];
|
|
31
|
-
f && i && g.push(
|
|
32
|
-
const a = g.length ? `<p style="font-size: 0.75rem; color: var(--sg-muted-text); margin-bottom: 0.5rem;">${g.join(" · ")}</p>` : "", w = n ? `<a href="${
|
|
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;">${
|
|
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(" · ")}</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(${
|
|
36
|
-
f && i &&
|
|
37
|
-
const P =
|
|
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;">${
|
|
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(" · ")}</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:
|
|
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:
|
|
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 =
|
|
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
|
|
57
|
-
(
|
|
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:
|
|
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="${
|
|
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="${
|
|
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:
|
|
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:
|
|
82
|
+
showDate: b = !0,
|
|
83
83
|
showTags: x = !0,
|
|
84
84
|
showReadingTime: f = !0,
|
|
85
|
-
contentMaxWidth:
|
|
86
|
-
} = r.props, $ = m && s ? `<div data-block-group="Mídia" style="width: 100%; height: 400px; background-image: url(${
|
|
87
|
-
|
|
88
|
-
const
|
|
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(" · ")}</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;">${
|
|
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: ${
|
|
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(\" · \")}</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(\" · \")}</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(\" · \")}</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(\" · \")}</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(\" · \")}</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(\" · \")}</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(\" · \")}</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(\" · \")}</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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"}
|