@brunoalz/smartgesti-site-editor 1.10.0 → 1.10.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.d.ts","sourceRoot":"","sources":["../../../src/engine/preview/Preview.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAA+C,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,YAAY,EAAS,MAAM,wBAAwB,CAAC;AAO7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAwDD;;GAEG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,YAAY,EACZ,eAAe,EACf,oBAA4B,EAC5B,YAAmB,GACpB,EAAE,YAAY,2CA4kBd"}
1
+ {"version":3,"file":"Preview.d.ts","sourceRoot":"","sources":["../../../src/engine/preview/Preview.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAA+C,MAAM,OAAO,CAAC;AACpE,OAAO,EAAE,YAAY,EAAS,MAAM,wBAAwB,CAAC;AAO7D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAwDD;;GAEG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,MAAM,EACN,SAAS,EACT,KAAK,EACL,YAAY,EACZ,eAAe,EACf,oBAA4B,EAC5B,YAAmB,GACpB,EAAE,YAAY,2CAimBd"}
@@ -1,14 +1,14 @@
1
- import { jsx as C, jsxs as W } from "react/jsx-runtime";
2
- import { useRef as y, useState as j, useEffect as x, useMemo as F } from "react";
3
- import { componentRegistry as X } from "../registry/registry.js";
4
- import { exportPageToHtml as Y, exportBlockToHtml as K } from "../export/exportHtml.js";
5
- import { detectChangedBlocks as Q } from "../../utils/changeDetector.js";
6
- import { hashDocument as P } from "../../utils/documentHash.js";
7
- import { logger as D } from "../../utils/logger.js";
8
- function U(o, v) {
9
- const u = (w) => {
10
- for (const d of w) {
11
- if (d.id === v) return d;
1
+ import { jsx as P, jsxs as F } from "react/jsx-runtime";
2
+ import { useRef as k, useState as X, useEffect as S, useMemo as Y } from "react";
3
+ import { componentRegistry as K } from "../registry/registry.js";
4
+ import { exportPageToHtml as Q, exportBlockToHtml as U } from "../export/exportHtml.js";
5
+ import { detectChangedBlocks as V } from "../../utils/changeDetector.js";
6
+ import { hashDocument as H } from "../../utils/documentHash.js";
7
+ import { logger as J } from "../../utils/logger.js";
8
+ function Z(o, x) {
9
+ const u = (T) => {
10
+ for (const d of T) {
11
+ if (d.id === x) return d;
12
12
  const n = d.props;
13
13
  if (n?.children && Array.isArray(n.children)) {
14
14
  const r = u(n.children);
@@ -33,58 +33,58 @@ function U(o, v) {
33
33
  };
34
34
  return u(o.structure);
35
35
  }
36
- function V(o) {
37
- const v = {}, u = (w) => {
38
- for (const d of w) {
39
- const n = X.get(d.type);
40
- v[d.id] = n?.name || d.type;
36
+ function ee(o) {
37
+ const x = {}, u = (T) => {
38
+ for (const d of T) {
39
+ const n = K.get(d.type);
40
+ x[d.id] = n?.name || d.type;
41
41
  const r = d.props;
42
42
  r?.children && Array.isArray(r.children) && u(r.children), d.type === "card" && (Array.isArray(r?.header) && u(r.header), Array.isArray(r?.content) && u(r.content), Array.isArray(r?.footer) && u(r.footer));
43
43
  }
44
44
  };
45
- return o?.structure && u(o.structure), v;
45
+ return o?.structure && u(o.structure), x;
46
46
  }
47
- function ae({
47
+ function se({
48
48
  document: o,
49
- pageId: v,
49
+ pageId: x,
50
50
  className: u,
51
- style: w,
51
+ style: T,
52
52
  onBlockClick: d,
53
53
  selectedBlockId: n,
54
54
  showSelectionOverlay: r = !1,
55
- focusedGroup: H = null
55
+ focusedGroup: B = null
56
56
  }) {
57
- const s = y(null), E = y(null), _ = y(null), J = y(null), B = y(!1), [$, A] = j(!0), I = y(n), R = y(r), M = y(H);
58
- x(() => {
59
- I.current = n;
60
- }, [n]), x(() => {
57
+ const s = k(null), A = k(null), _ = k(null), q = k(null), L = k(!1), [G, C] = X(!0), D = k(n), R = k(r), M = k(B);
58
+ S(() => {
59
+ D.current = n;
60
+ }, [n]), S(() => {
61
61
  R.current = r;
62
- }, [r]), x(() => {
63
- M.current = H;
64
- }, [H]);
65
- const f = F(() => v ? o.pages.find((t) => t.id === v) : o.pages[0], [o, v]), z = y({});
66
- x(() => {
67
- z.current = V(f);
68
- }, [f]);
69
- const L = (t) => {
62
+ }, [r]), S(() => {
63
+ M.current = B;
64
+ }, [B]);
65
+ const p = Y(() => x ? o.pages.find((t) => t.id === x) : o.pages[0], [o, x]), $ = k({});
66
+ S(() => {
67
+ $.current = ee(p);
68
+ }, [p]);
69
+ const I = (t) => {
70
70
  if (!s.current) return;
71
71
  const e = s.current.contentDocument || s.current.contentWindow?.document;
72
72
  if (!e) return;
73
73
  const i = R.current, l = M.current;
74
74
  requestAnimationFrame(() => {
75
75
  const c = e.getElementById("block-highlight");
76
- c && c.remove(), e.querySelectorAll("[data-block-id]").forEach((T) => {
77
- const g = T;
78
- g.style.outline = "", g.style.outlineOffset = "";
76
+ c && c.remove(), e.querySelectorAll("[data-block-id]").forEach((h) => {
77
+ const m = h;
78
+ m.style.outline = "", m.style.outlineOffset = "";
79
79
  });
80
- const b = e.getElementById("sg-block-label");
81
- b && b.remove();
80
+ const E = e.getElementById("sg-block-label");
81
+ E && E.remove();
82
82
  const N = e.getElementById("sg-group-highlight");
83
83
  N && N.remove();
84
- const p = e.getElementById("sg-group-label");
85
- if (p && p.remove(), t) {
86
- const T = e.createElement("style");
87
- if (T.id = "block-highlight", T.textContent = `
84
+ const w = e.getElementById("sg-group-label");
85
+ if (w && w.remove(), t) {
86
+ const h = e.createElement("style");
87
+ if (h.id = "block-highlight", h.textContent = `
88
88
  [data-block-id="${t}"] {
89
89
  outline: 2px solid #3b82f6 !important;
90
90
  outline-offset: 2px !important;
@@ -101,34 +101,34 @@ function ae({
101
101
  pointer-events: none;
102
102
  z-index: -1;
103
103
  }
104
- `, e.head.appendChild(T), i) {
105
- const g = e.querySelector(`[data-block-id="${t}"]`);
106
- if (g) {
107
- const m = z.current[t] || t, k = e.createElement("div");
108
- k.id = "sg-block-label", k.textContent = m, k.style.cssText = "position:absolute;top:-22px;left:0;background:#3b82f6;color:#fff;font-size:11px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10000;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:16px;", getComputedStyle(g).position === "static" && (g.style.position = "relative"), g.appendChild(k);
104
+ `, e.head.appendChild(h), i) {
105
+ const m = e.querySelector(`[data-block-id="${t}"]`);
106
+ if (m) {
107
+ const y = $.current[t] || t, v = e.createElement("div");
108
+ v.id = "sg-block-label", v.textContent = y, v.style.cssText = "position:absolute;top:-22px;left:0;background:#3b82f6;color:#fff;font-size:11px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10000;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:16px;", getComputedStyle(m).position === "static" && (m.style.position = "relative"), m.appendChild(v);
109
109
  }
110
110
  }
111
111
  if (l) {
112
- const m = e.querySelector(`[data-block-id="${t}"]`)?.querySelector(`[data-block-group="${l}"]`);
113
- if (m) {
114
- const k = e.createElement("style");
115
- k.id = "sg-group-highlight", k.textContent = `
112
+ const y = e.querySelector(`[data-block-id="${t}"]`)?.querySelector(`[data-block-group="${l}"]`);
113
+ if (y) {
114
+ const v = e.createElement("style");
115
+ v.id = "sg-group-highlight", v.textContent = `
116
116
  [data-block-id="${t}"] [data-block-group="${l}"] {
117
117
  outline: 2px solid #8b5cf6 !important;
118
118
  outline-offset: 2px !important;
119
119
  position: relative;
120
120
  }
121
- `, e.head.appendChild(k);
122
- const S = e.createElement("div");
123
- S.id = "sg-group-label", S.textContent = l, S.style.cssText = "position:absolute;top:-20px;right:0;background:#8b5cf6;color:#fff;font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10001;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:14px;", getComputedStyle(m).position === "static" && (m.style.position = "relative"), m.appendChild(S);
121
+ `, e.head.appendChild(v);
122
+ const b = e.createElement("div");
123
+ b.id = "sg-group-label", b.textContent = l, b.style.cssText = "position:absolute;top:-20px;right:0;background:#8b5cf6;color:#fff;font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10001;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:14px;", getComputedStyle(y).position === "static" && (y.style.position = "relative"), y.appendChild(b);
124
124
  }
125
125
  }
126
126
  }
127
127
  });
128
- }, q = () => {
128
+ }, W = () => {
129
129
  s.current?.contentWindow && s.current.contentWindow.postMessage({
130
130
  type: "sg-set-block-names",
131
- names: z.current
131
+ names: $.current
132
132
  }, "*");
133
133
  }, O = (t) => {
134
134
  if (!s.current) return;
@@ -159,14 +159,14 @@ function ae({
159
159
  outline-offset: 1px !important;
160
160
  background: rgba(139, 92, 246, 0.04);
161
161
  }
162
- `, e.head.appendChild(l), q();
162
+ `, e.head.appendChild(l), W();
163
163
  }
164
- L(I.current || null);
165
- }, h = (t, e) => {
166
- if (!(!s.current || !f))
164
+ I(D.current || null);
165
+ }, g = (t, e) => {
166
+ if (!(!s.current || !p))
167
167
  try {
168
- e && A(!0);
169
- let i = Y(f, t, !0);
168
+ e && C(!0);
169
+ let i = Q(p, t, !0);
170
170
  const l = `
171
171
  <script>
172
172
  (function() {
@@ -273,109 +273,117 @@ function ae({
273
273
  `;
274
274
  i = i.replace("</body>", `${l}</body>`), i.includes("</body>") || (i = i + l);
275
275
  const c = s.current, a = () => {
276
- L(I.current || null), R.current && O(!0);
276
+ I(D.current || null), R.current && O(!0);
277
277
  };
278
278
  e ? (c.onload = () => {
279
- A(!1), E.current = JSON.parse(JSON.stringify(t)), _.current = P(t), a();
279
+ C(!1), A.current = JSON.parse(JSON.stringify(t)), _.current = H(t), a();
280
280
  }, setTimeout(() => {
281
- A(!1), E.current = JSON.parse(JSON.stringify(t)), _.current = P(t), a();
282
- }, 1e3)) : (E.current = JSON.parse(JSON.stringify(t)), _.current = P(t), c.onload = () => {
281
+ C(!1), A.current = JSON.parse(JSON.stringify(t)), _.current = H(t), a();
282
+ }, 1e3)) : (A.current = JSON.parse(JSON.stringify(t)), _.current = H(t), c.onload = () => {
283
283
  a();
284
284
  }), c.srcdoc = i;
285
285
  } catch (i) {
286
- D.error("[Preview] Error:", i), e && A(!1);
286
+ J.error("[Preview] Error:", i), e && C(!1);
287
287
  }
288
- }, G = (t, e) => {
289
- if (!(!s.current || !f))
288
+ }, j = (t, e) => {
289
+ if (!(!s.current || !p))
290
290
  try {
291
- const i = U(f, t);
291
+ const i = Z(p, t);
292
292
  if (!i) {
293
- h(e, !1);
293
+ g(e, !1);
294
294
  return;
295
295
  }
296
- const l = K(i, void 0, e.theme);
296
+ const l = U(i, void 0, e.theme);
297
297
  requestAnimationFrame(() => {
298
298
  const c = s.current;
299
299
  if (!c) return;
300
300
  const a = c.contentDocument || c.contentWindow?.document;
301
301
  if (!a) return;
302
- const b = a.querySelector(`[data-block-id="${t}"]`);
303
- if (b)
302
+ const E = a.querySelector(`[data-block-id="${t}"]`);
303
+ if (E)
304
304
  try {
305
- a.querySelectorAll(`style[data-block-style="${t}"]`).forEach((m) => m.remove());
306
- const p = a.createElement("div");
307
- p.innerHTML = l, p.querySelectorAll("style").forEach((m) => {
308
- m.setAttribute("data-block-style", t);
305
+ a.querySelectorAll(`style[data-block-style="${t}"]`).forEach((f) => f.remove()), a.querySelectorAll(`script[data-block-style="${t}"]`).forEach((f) => f.remove());
306
+ const h = a.createElement("div");
307
+ h.innerHTML = l, h.querySelectorAll("style").forEach((f) => {
308
+ f.setAttribute("data-block-style", t);
309
+ });
310
+ const y = [];
311
+ h.querySelectorAll("script").forEach((f) => {
312
+ y.push({ text: f.textContent || "" }), f.remove();
309
313
  });
310
- const g = a.createDocumentFragment();
311
- for (; p.firstChild; )
312
- g.appendChild(p.firstChild);
313
- g.childNodes.length > 0 ? b.parentNode?.replaceChild(g, b) : b.outerHTML = l, E.current = JSON.parse(JSON.stringify(e)), _.current = P(e), L(I.current || null);
314
+ const b = a.createDocumentFragment();
315
+ for (; h.firstChild; )
316
+ b.appendChild(h.firstChild);
317
+ b.childNodes.length > 0 ? E.parentNode?.replaceChild(b, E) : E.outerHTML = l, y.forEach(({ text: f }) => {
318
+ if (!f.trim()) return;
319
+ const z = a.createElement("script");
320
+ z.setAttribute("data-block-style", t), z.textContent = f, a.body.appendChild(z);
321
+ }), A.current = JSON.parse(JSON.stringify(e)), _.current = H(e), I(D.current || null);
314
322
  } catch (N) {
315
- D.error("[Preview] Erro ao atualizar:", N), h(e, !1);
323
+ J.error("[Preview] Erro ao atualizar:", N), g(e, !1);
316
324
  }
317
325
  else
318
- h(e, !1);
326
+ g(e, !1);
319
327
  });
320
328
  } catch (i) {
321
- D.error("[Preview] Erro:", i), h(e, !1);
329
+ J.error("[Preview] Erro:", i), g(e, !1);
322
330
  }
323
331
  };
324
- return x(() => {
325
- if (!f) {
326
- A(!1);
332
+ return S(() => {
333
+ if (!p) {
334
+ C(!1);
327
335
  return;
328
336
  }
329
- const t = P(o);
330
- if (!B.current) {
331
- s.current && (B.current = !0, J.current = f?.id ?? null, h(o, !0));
337
+ const t = H(o);
338
+ if (!L.current) {
339
+ s.current && (L.current = !0, q.current = p?.id ?? null, g(o, !0));
332
340
  return;
333
341
  }
334
342
  if (!s.current) return;
335
- const e = f?.id ?? null;
336
- if (J.current !== e) {
337
- J.current = e, h(o, !1);
343
+ const e = p?.id ?? null;
344
+ if (q.current !== e) {
345
+ q.current = e, g(o, !1);
338
346
  return;
339
347
  }
340
348
  if (_.current === t)
341
349
  return;
342
- const i = E.current ? JSON.stringify(E.current.theme) : null, l = JSON.stringify(o.theme);
350
+ const i = A.current ? JSON.stringify(A.current.theme) : null, l = JSON.stringify(o.theme);
343
351
  if (i !== l) {
344
- h(o, !1);
352
+ g(o, !1);
345
353
  return;
346
354
  }
347
- const c = Q(
348
- E.current || o,
355
+ const c = V(
356
+ A.current || o,
349
357
  o,
350
- f?.id
358
+ p?.id
351
359
  );
352
360
  if (c.length === 0) {
353
- D.debug(
361
+ J.debug(
354
362
  "[Preview] Hash changed but no changes detected, forcing reload"
355
- ), h(o, !1);
363
+ ), g(o, !1);
356
364
  return;
357
365
  }
358
366
  if (c.some(
359
367
  (a) => a.blockId === "__structural__" || a.changedProps?.includes("children")
360
368
  )) {
361
- h(o, !1);
369
+ g(o, !1);
362
370
  return;
363
371
  }
364
372
  if (c.length === 1) {
365
373
  const a = c[0];
366
374
  if (!(a.changedProps || []).some(
367
- (p) => p === "children" || p === "header" || p === "content" || p === "footer"
375
+ (w) => w === "children" || w === "header" || w === "content" || w === "footer"
368
376
  )) {
369
- G(a.blockId, o);
377
+ j(a.blockId, o);
370
378
  return;
371
379
  }
372
380
  }
373
- h(o, !1);
374
- }, [o, f]), x(() => {
375
- B.current && L(n || null);
376
- }, [n, H]), x(() => {
377
- B.current && O(r);
378
- }, [r]), x(() => {
381
+ g(o, !1);
382
+ }, [o, p]), S(() => {
383
+ L.current && I(n || null);
384
+ }, [n, B]), S(() => {
385
+ L.current && O(r);
386
+ }, [r]), S(() => {
379
387
  if (!d) return;
380
388
  const t = (e) => {
381
389
  e.data?.type === "block-click" && e.data?.blockId && d(e.data.blockId, e.data.group || void 0);
@@ -383,8 +391,8 @@ function ae({
383
391
  return window.addEventListener("message", t), () => {
384
392
  window.removeEventListener("message", t);
385
393
  };
386
- }, [d]), f ? /* @__PURE__ */ W("div", { className: u, style: { position: "relative", ...w }, children: [
387
- $ && /* @__PURE__ */ C(
394
+ }, [d]), p ? /* @__PURE__ */ F("div", { className: u, style: { position: "relative", ...T }, children: [
395
+ G && /* @__PURE__ */ P(
388
396
  "div",
389
397
  {
390
398
  style: {
@@ -399,10 +407,10 @@ function ae({
399
407
  backgroundColor: "rgba(255, 255, 255, 0.8)",
400
408
  zIndex: 10
401
409
  },
402
- children: /* @__PURE__ */ C("div", { style: { color: "#6b7280" }, children: "Carregando preview..." })
410
+ children: /* @__PURE__ */ P("div", { style: { color: "#6b7280" }, children: "Carregando preview..." })
403
411
  }
404
412
  ),
405
- /* @__PURE__ */ C(
413
+ /* @__PURE__ */ P(
406
414
  "iframe",
407
415
  {
408
416
  ref: s,
@@ -415,9 +423,9 @@ function ae({
415
423
  title: "Preview do site"
416
424
  }
417
425
  )
418
- ] }) : /* @__PURE__ */ C("div", { className: u, style: w, children: /* @__PURE__ */ C("div", { style: { padding: "2rem", textAlign: "center", color: "#6b7280" }, children: "Página não encontrada" }) });
426
+ ] }) : /* @__PURE__ */ P("div", { className: u, style: T, children: /* @__PURE__ */ P("div", { style: { padding: "2rem", textAlign: "center", color: "#6b7280" }, children: "Página não encontrada" }) });
419
427
  }
420
428
  export {
421
- ae as Preview
429
+ se as Preview
422
430
  };
423
431
  //# sourceMappingURL=Preview.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Preview.js","sources":["../../../src/engine/preview/Preview.tsx"],"sourcesContent":["/**\n * Preview\n * Sem dependências circulares, sem reloads desnecessários\n */\n\nimport React, { useEffect, useRef, useState, useMemo } from \"react\";\nimport { SiteDocument, Block } from \"../schema/siteDocument\";\nimport { componentRegistry } from \"../registry/registry\";\nimport { exportPageToHtml, exportBlockToHtml } from \"../export/exportHtml\";\nimport { detectChangedBlocks } from \"../../utils/changeDetector\";\nimport { hashDocument } from \"../../utils/documentHash\";\nimport { logger } from \"../../utils/logger\";\n\nexport interface PreviewProps {\n document: SiteDocument;\n pageId?: string;\n className?: string;\n style?: React.CSSProperties;\n onBlockClick?: (blockId: string, group?: string) => void;\n selectedBlockId?: string | null;\n /** Exibe hover e label de seleção nos blocos do preview */\n showSelectionOverlay?: boolean;\n /** Grupo focado para indicador visual no preview */\n focusedGroup?: string | null;\n}\n\n/**\n * Encontra um bloco na estrutura recursivamente\n */\nfunction findBlockInPage(page: any, blockId: string): Block | null {\n const findInBlocks = (blocks: Block[]): Block | null => {\n for (const block of blocks) {\n if (block.id === blockId) return block;\n const props = block.props as Record<string, any>;\n if (props?.children && Array.isArray(props.children)) {\n const found = findInBlocks(props.children);\n if (found) return found;\n }\n if (block.type === \"card\") {\n if (props.header && Array.isArray(props.header)) {\n const found = findInBlocks(props.header);\n if (found) return found;\n }\n if (props.content && Array.isArray(props.content)) {\n const found = findInBlocks(props.content);\n if (found) return found;\n }\n if (props.footer && Array.isArray(props.footer)) {\n const found = findInBlocks(props.footer);\n if (found) return found;\n }\n }\n }\n return null;\n };\n return findInBlocks(page.structure);\n}\n\n/**\n * Monta mapa blockId → nome legível (da registry)\n */\nfunction buildBlockNameMap(page: any): Record<string, string> {\n const map: Record<string, string> = {};\n const walk = (blocks: Block[]) => {\n for (const block of blocks) {\n const def = componentRegistry.get(block.type);\n map[block.id] = def?.name || block.type;\n const props = block.props as Record<string, any>;\n if (props?.children && Array.isArray(props.children)) walk(props.children);\n if (block.type === \"card\") {\n if (Array.isArray(props?.header)) walk(props.header);\n if (Array.isArray(props?.content)) walk(props.content);\n if (Array.isArray(props?.footer)) walk(props.footer);\n }\n }\n };\n if (page?.structure) walk(page.structure);\n return map;\n}\n\n/**\n * Componente de preview usando iframe isolado\n */\nexport function Preview({\n document,\n pageId,\n className,\n style,\n onBlockClick,\n selectedBlockId,\n showSelectionOverlay = false,\n focusedGroup = null,\n}: PreviewProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const previousDocRef = useRef<SiteDocument | null>(null);\n const previousDocHashRef = useRef<string | null>(null);\n const previousPageIdRef = useRef<string | null>(null);\n const isInitializedRef = useRef<boolean>(false);\n const [isLoading, setIsLoading] = useState(true);\n\n // Usar ref para selectedBlockId (necessário para highlight assíncrono)\n const selectedBlockIdRef = useRef(selectedBlockId);\n const showSelectionOverlayRef = useRef(showSelectionOverlay);\n const focusedGroupRef = useRef(focusedGroup);\n\n // Atualizar refs quando props mudam\n useEffect(() => {\n selectedBlockIdRef.current = selectedBlockId;\n }, [selectedBlockId]);\n\n useEffect(() => {\n showSelectionOverlayRef.current = showSelectionOverlay;\n }, [showSelectionOverlay]);\n\n useEffect(() => {\n focusedGroupRef.current = focusedGroup;\n }, [focusedGroup]);\n\n const page = useMemo(() => {\n return pageId\n ? document.pages.find((p) => p.id === pageId)\n : document.pages[0];\n }, [document, pageId]);\n\n // Mapa blockId → nome legível para labels\n const blockNameMapRef = useRef<Record<string, string>>({});\n useEffect(() => {\n blockNameMapRef.current = buildBlockNameMap(page);\n }, [page]);\n\n // Atualizar highlight + selection overlay diretamente no iframe (sem reload)\n const updateHighlight = (blockId: string | null) => {\n if (!iframeRef.current) return;\n\n const iframeDoc =\n iframeRef.current.contentDocument ||\n iframeRef.current.contentWindow?.document;\n if (!iframeDoc) return;\n\n const overlayEnabled = showSelectionOverlayRef.current;\n const group = focusedGroupRef.current;\n\n requestAnimationFrame(() => {\n // Remover highlight anterior\n const oldStyle = iframeDoc.getElementById(\"block-highlight\");\n if (oldStyle) oldStyle.remove();\n\n const allBlocks = iframeDoc.querySelectorAll(\"[data-block-id]\");\n allBlocks.forEach((el) => {\n const htmlEl = el as HTMLElement;\n htmlEl.style.outline = \"\";\n htmlEl.style.outlineOffset = \"\";\n });\n\n // Remover labels anteriores\n const oldLabel = iframeDoc.getElementById(\"sg-block-label\");\n if (oldLabel) oldLabel.remove();\n const oldGroupStyle = iframeDoc.getElementById(\"sg-group-highlight\");\n if (oldGroupStyle) oldGroupStyle.remove();\n const oldGroupLabel = iframeDoc.getElementById(\"sg-group-label\");\n if (oldGroupLabel) oldGroupLabel.remove();\n\n // Adicionar novo highlight\n if (blockId) {\n const highlightStyle = iframeDoc.createElement(\"style\");\n highlightStyle.id = \"block-highlight\";\n highlightStyle.textContent = `\n [data-block-id=\"${blockId}\"] {\n outline: 2px solid #3b82f6 !important;\n outline-offset: 2px !important;\n position: relative;\n }\n [data-block-id=\"${blockId}\"]::before {\n content: '';\n position: absolute;\n top: -4px;\n left: -4px;\n right: -4px;\n bottom: -4px;\n background: rgba(59, 130, 246, 0.1);\n pointer-events: none;\n z-index: -1;\n }\n `;\n iframeDoc.head.appendChild(highlightStyle);\n\n // Selection label (only when overlay is enabled)\n if (overlayEnabled) {\n const selectedEl = iframeDoc.querySelector(`[data-block-id=\"${blockId}\"]`) as HTMLElement;\n if (selectedEl) {\n const blockName = blockNameMapRef.current[blockId] || blockId;\n const label = iframeDoc.createElement(\"div\");\n label.id = \"sg-block-label\";\n label.textContent = blockName;\n label.style.cssText = \"position:absolute;top:-22px;left:0;background:#3b82f6;color:#fff;font-size:11px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10000;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:16px;\";\n const pos = getComputedStyle(selectedEl).position;\n if (pos === \"static\") selectedEl.style.position = \"relative\";\n selectedEl.appendChild(label);\n }\n }\n\n // Indicador de grupo — mostra qual sub-seção foi clicada (purple)\n if (group) {\n const blockEl = iframeDoc.querySelector(`[data-block-id=\"${blockId}\"]`);\n const groupEl = blockEl?.querySelector(`[data-block-group=\"${group}\"]`) as HTMLElement;\n if (groupEl) {\n const ghStyle = iframeDoc.createElement(\"style\");\n ghStyle.id = \"sg-group-highlight\";\n ghStyle.textContent = `\n [data-block-id=\"${blockId}\"] [data-block-group=\"${group}\"] {\n outline: 2px solid #8b5cf6 !important;\n outline-offset: 2px !important;\n position: relative;\n }\n `;\n iframeDoc.head.appendChild(ghStyle);\n\n const gLabel = iframeDoc.createElement(\"div\");\n gLabel.id = \"sg-group-label\";\n gLabel.textContent = group;\n gLabel.style.cssText = \"position:absolute;top:-20px;right:0;background:#8b5cf6;color:#fff;font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10001;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:14px;\";\n const gPos = getComputedStyle(groupEl).position;\n if (gPos === \"static\") groupEl.style.position = \"relative\";\n groupEl.appendChild(gLabel);\n }\n }\n }\n });\n };\n\n // Enviar mapa de nomes para o iframe\n const sendBlockNamesToIframe = () => {\n if (!iframeRef.current?.contentWindow) return;\n iframeRef.current.contentWindow.postMessage({\n type: \"sg-set-block-names\",\n names: blockNameMapRef.current,\n }, \"*\");\n };\n\n // Atualizar hover overlay (injetar/remover CSS de hover nos blocos)\n const updateSelectionOverlay = (enabled: boolean) => {\n if (!iframeRef.current) return;\n\n const iframeDoc =\n iframeRef.current.contentDocument ||\n iframeRef.current.contentWindow?.document;\n if (!iframeDoc) return;\n\n const existingStyle = iframeDoc.getElementById(\"sg-hover-overlay\");\n if (existingStyle) existingStyle.remove();\n\n // Remove tooltip when disabling\n if (!enabled) {\n const tooltip = iframeDoc.getElementById(\"sg-hover-tooltip\");\n if (tooltip) tooltip.style.opacity = \"0\";\n }\n\n if (enabled) {\n const hoverStyle = iframeDoc.createElement(\"style\");\n hoverStyle.id = \"sg-hover-overlay\";\n hoverStyle.textContent = `\n [data-block-id] {\n cursor: pointer;\n transition: outline 0.15s ease, outline-offset 0.15s ease;\n }\n [data-block-id]:hover {\n outline: 2px dashed #94a3b8 !important;\n outline-offset: 2px !important;\n }\n [data-block-group] {\n cursor: pointer;\n transition: outline 0.15s ease, background 0.15s ease;\n }\n [data-block-group]:hover {\n outline: 1.5px dashed #a78bfa !important;\n outline-offset: 1px !important;\n background: rgba(139, 92, 246, 0.04);\n }\n `;\n iframeDoc.head.appendChild(hoverStyle);\n sendBlockNamesToIframe();\n }\n\n // Re-apply highlight (recalcula label)\n updateHighlight(selectedBlockIdRef.current || null);\n };\n\n // Atualizar preview completo (com srcdoc - causa reload)\n const updateFullPreview = (doc: SiteDocument, showLoading: boolean) => {\n if (!iframeRef.current || !page) return;\n\n try {\n if (showLoading) {\n setIsLoading(true);\n }\n\n let html = exportPageToHtml(page, doc, true);\n\n // Adicionar click handler + hover handler: links não navegam, enviam editor-navigate; outros cliques enviam block-click\n const clickHandler = `\n <script>\n (function() {\n // Click handler\n document.addEventListener('click', function(e) {\n var target = e.target;\n var anchor = target;\n while (anchor && anchor.tagName !== 'A') {\n anchor = anchor.parentElement;\n }\n if (anchor && anchor.tagName === 'A' && anchor.href) {\n e.preventDefault();\n e.stopPropagation();\n window.parent.postMessage({\n type: 'editor-navigate',\n href: anchor.getAttribute('href') || anchor.href\n }, '*');\n return;\n }\n var element = target;\n var group = null;\n while (element && !element.dataset.blockId) {\n if (element.dataset && element.dataset.blockGroup && !group) {\n group = element.dataset.blockGroup;\n }\n element = element.parentElement;\n }\n if (element && element.dataset.blockId) {\n window.parent.postMessage({\n type: 'block-click',\n blockId: element.dataset.blockId,\n group: group\n }, '*');\n }\n }, true);\n\n // Hover tooltip — block name map injected from parent via postMessage\n var _blockNames = {};\n var _hoverTooltip = null;\n\n window.addEventListener('message', function(e) {\n if (e.data && e.data.type === 'sg-set-block-names') {\n _blockNames = e.data.names || {};\n }\n });\n\n function getTooltip() {\n if (_hoverTooltip) return _hoverTooltip;\n _hoverTooltip = document.createElement('div');\n _hoverTooltip.id = 'sg-hover-tooltip';\n _hoverTooltip.style.cssText = 'position:fixed;top:0;left:0;background:#334155;color:#fff;font-size:11px;font-weight:500;padding:3px 8px;border-radius:4px;z-index:99999;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:16px;opacity:0;transition:opacity 0.12s ease;box-shadow:0 2px 6px rgba(0,0,0,0.2);';\n document.body.appendChild(_hoverTooltip);\n return _hoverTooltip;\n }\n\n var _currentHoveredBlock = null;\n var _currentHoveredGroup = null;\n\n document.addEventListener('mouseover', function(e) {\n // Check if hover overlay is active\n if (!document.getElementById('sg-hover-overlay')) return;\n var el = e.target;\n var groupName = null;\n while (el && !el.dataset.blockId) {\n if (el.dataset && el.dataset.blockGroup && !groupName) {\n groupName = el.dataset.blockGroup;\n }\n el = el.parentElement;\n }\n if (el && el.dataset.blockId) {\n if (el !== _currentHoveredBlock || groupName !== _currentHoveredGroup) {\n _currentHoveredBlock = el;\n _currentHoveredGroup = groupName;\n var tt = getTooltip();\n var blockName = _blockNames[el.dataset.blockId] || el.dataset.blockId;\n tt.textContent = groupName ? (blockName + ' \\\\u203A ' + groupName) : blockName;\n tt.style.opacity = '1';\n }\n }\n }, true);\n\n document.addEventListener('mousemove', function(e) {\n if (_hoverTooltip && _hoverTooltip.style.opacity === '1') {\n _hoverTooltip.style.left = (e.clientX + 12) + 'px';\n _hoverTooltip.style.top = (e.clientY - 28) + 'px';\n }\n }, true);\n\n document.addEventListener('mouseout', function(e) {\n var el = e.target;\n while (el && !el.dataset.blockId) el = el.parentElement;\n if (el === _currentHoveredBlock) {\n var related = e.relatedTarget;\n while (related && related !== el) related = related.parentElement;\n if (!related) {\n _currentHoveredBlock = null;\n _currentHoveredGroup = null;\n if (_hoverTooltip) _hoverTooltip.style.opacity = '0';\n }\n }\n }, true);\n })();\n </script>\n `;\n html = html.replace(\"</body>\", `${clickHandler}</body>`);\n if (!html.includes(\"</body>\")) {\n html = html + clickHandler;\n }\n\n const iframe = iframeRef.current;\n\n const applyOverlayAfterLoad = () => {\n updateHighlight(selectedBlockIdRef.current || null);\n if (showSelectionOverlayRef.current) {\n updateSelectionOverlay(true);\n }\n };\n\n if (showLoading) {\n iframe.onload = () => {\n setIsLoading(false);\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n applyOverlayAfterLoad();\n };\n setTimeout(() => {\n setIsLoading(false);\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n applyOverlayAfterLoad();\n }, 1000);\n } else {\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n iframe.onload = () => {\n applyOverlayAfterLoad();\n };\n }\n\n iframe.srcdoc = html;\n } catch (error) {\n logger.error(\"[Preview] Error:\", error);\n if (showLoading) {\n setIsLoading(false);\n }\n }\n };\n\n // Atualizar apenas um bloco (sem reload)\n const updatePartialPreview = (blockId: string, doc: SiteDocument) => {\n if (!iframeRef.current || !page) return;\n\n try {\n const block = findBlockInPage(page, blockId);\n if (!block) {\n updateFullPreview(doc, false);\n return;\n }\n\n const blockHtml = exportBlockToHtml(block, undefined, doc.theme);\n\n requestAnimationFrame(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n const iframeDoc =\n iframe.contentDocument || iframe.contentWindow?.document;\n if (!iframeDoc) return;\n\n const element = iframeDoc.querySelector(`[data-block-id=\"${blockId}\"]`);\n if (element) {\n try {\n // Remover <style> tags antigas associadas a este bloco\n const oldStyles = iframeDoc.querySelectorAll(`style[data-block-style=\"${blockId}\"]`);\n oldStyles.forEach(s => s.remove());\n\n const temp = iframeDoc.createElement(\"div\");\n temp.innerHTML = blockHtml;\n\n // Marcar e extrair <style> tags para inserção separada\n const styleTags = temp.querySelectorAll(\"style\");\n styleTags.forEach(style => {\n style.setAttribute(\"data-block-style\", blockId);\n });\n\n // Usar DocumentFragment para substituir com múltiplos elementos irmãos\n // (ex: <style>hover CSS</style><button>text</button>)\n const fragment = iframeDoc.createDocumentFragment();\n while (temp.firstChild) {\n fragment.appendChild(temp.firstChild);\n }\n\n if (fragment.childNodes.length > 0) {\n element.parentNode?.replaceChild(fragment, element);\n } else {\n element.outerHTML = blockHtml;\n }\n\n // Atualizar refs\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n\n // Reaplicar highlight\n updateHighlight(selectedBlockIdRef.current || null);\n } catch (error) {\n logger.error(\"[Preview] Erro ao atualizar:\", error);\n updateFullPreview(doc, false);\n }\n } else {\n updateFullPreview(doc, false);\n }\n });\n } catch (error) {\n logger.error(\"[Preview] Erro:\", error);\n updateFullPreview(doc, false);\n }\n };\n\n // Efeito para mudanças no DOCUMENTO (não no selectedBlockId)\n useEffect(() => {\n if (!page) {\n setIsLoading(false);\n return;\n }\n\n const currentDocHash = hashDocument(document);\n\n // Primeira renderização\n if (!isInitializedRef.current) {\n if (iframeRef.current) {\n isInitializedRef.current = true;\n previousPageIdRef.current = page?.id ?? null;\n updateFullPreview(document, true);\n }\n return;\n }\n\n if (!iframeRef.current) return;\n\n // Detectar troca de página (pageId mudou)\n const currentPageId = page?.id ?? null;\n if (previousPageIdRef.current !== currentPageId) {\n previousPageIdRef.current = currentPageId;\n updateFullPreview(document, false);\n return;\n }\n\n // Se hash não mudou, não há mudanças no documento\n if (previousDocHashRef.current === currentDocHash) {\n return;\n }\n\n // Se o theme mudou, forçar reload completo (CSS variables precisam ser regeneradas)\n const prevThemeJson = previousDocRef.current ? JSON.stringify(previousDocRef.current.theme) : null;\n const currThemeJson = JSON.stringify(document.theme);\n if (prevThemeJson !== currThemeJson) {\n updateFullPreview(document, false);\n return;\n }\n\n // Detectar mudanças na página atual\n const changedBlocks = detectChangedBlocks(\n previousDocRef.current || document,\n document,\n page?.id,\n );\n\n // Se não há mudanças detectadas mas o hash mudou, forçar reload\n if (changedBlocks.length === 0) {\n logger.debug(\n \"[Preview] Hash changed but no changes detected, forcing reload\",\n );\n updateFullPreview(document, false);\n return;\n }\n\n // Mudança estrutural (bloco adicionado/removido) = reload completo\n if (\n changedBlocks.some(\n (c) =>\n c.blockId === \"__structural__\" ||\n c.changedProps?.includes(\"children\"),\n )\n ) {\n updateFullPreview(document, false);\n return;\n }\n\n // Mudança de 1 bloco (não estrutural) = atualização parcial\n if (changedBlocks.length === 1) {\n const change = changedBlocks[0];\n const changedProps = change.changedProps || [];\n\n const isStructural = changedProps.some(\n (prop) =>\n prop === \"children\" ||\n prop === \"header\" ||\n prop === \"content\" ||\n prop === \"footer\",\n );\n\n if (!isStructural) {\n updatePartialPreview(change.blockId, document);\n return;\n }\n }\n\n // Fallback: reload completo SEM loader\n updateFullPreview(document, false);\n }, [document, page]); // APENAS document e page - sem funções\n\n // Efeito SEPARADO para highlight (não recarrega o preview)\n useEffect(() => {\n if (!isInitializedRef.current) return;\n updateHighlight(selectedBlockId || null);\n }, [selectedBlockId, focusedGroup]); // eslint-disable-line react-hooks/exhaustive-deps -- updateHighlight reads focusedGroupRef\n\n // Efeito para toggle do selection overlay\n useEffect(() => {\n if (!isInitializedRef.current) return;\n updateSelectionOverlay(showSelectionOverlay);\n }, [showSelectionOverlay]); // eslint-disable-line react-hooks/exhaustive-deps -- same pattern as updateFullPreview\n\n // Listener para cliques\n useEffect(() => {\n if (!onBlockClick) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === \"block-click\" && event.data?.blockId) {\n onBlockClick(event.data.blockId, event.data.group || undefined);\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n };\n }, [onBlockClick]);\n\n if (!page) {\n return (\n <div className={className} style={style}>\n <div style={{ padding: \"2rem\", textAlign: \"center\", color: \"#6b7280\" }}>\n Página não encontrada\n </div>\n </div>\n );\n }\n\n return (\n <div className={className} style={{ position: \"relative\", ...style }}>\n {isLoading && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255, 255, 255, 0.8)\",\n zIndex: 10,\n }}\n >\n <div style={{ color: \"#6b7280\" }}>Carregando preview...</div>\n </div>\n )}\n <iframe\n ref={iframeRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n border: \"none\",\n backgroundColor: \"#ffffff\",\n }}\n title=\"Preview do site\"\n />\n </div>\n );\n}\n"],"names":["findBlockInPage","page","blockId","findInBlocks","blocks","block","props","found","buildBlockNameMap","map","walk","def","componentRegistry","Preview","document","pageId","className","style","onBlockClick","selectedBlockId","showSelectionOverlay","focusedGroup","iframeRef","useRef","previousDocRef","previousDocHashRef","previousPageIdRef","isInitializedRef","isLoading","setIsLoading","useState","selectedBlockIdRef","showSelectionOverlayRef","focusedGroupRef","useEffect","useMemo","p","blockNameMapRef","updateHighlight","iframeDoc","overlayEnabled","group","oldStyle","el","htmlEl","oldLabel","oldGroupStyle","oldGroupLabel","highlightStyle","selectedEl","blockName","label","groupEl","ghStyle","gLabel","sendBlockNamesToIframe","updateSelectionOverlay","enabled","existingStyle","tooltip","hoverStyle","updateFullPreview","doc","showLoading","html","exportPageToHtml","clickHandler","iframe","applyOverlayAfterLoad","hashDocument","error","logger","updatePartialPreview","blockHtml","exportBlockToHtml","element","s","temp","fragment","currentDocHash","currentPageId","prevThemeJson","currThemeJson","changedBlocks","detectChangedBlocks","c","change","prop","handleMessage","event","jsxs","jsx"],"mappings":"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"}
1
+ {"version":3,"file":"Preview.js","sources":["../../../src/engine/preview/Preview.tsx"],"sourcesContent":["/**\n * Preview\n * Sem dependências circulares, sem reloads desnecessários\n */\n\nimport React, { useEffect, useRef, useState, useMemo } from \"react\";\nimport { SiteDocument, Block } from \"../schema/siteDocument\";\nimport { componentRegistry } from \"../registry/registry\";\nimport { exportPageToHtml, exportBlockToHtml } from \"../export/exportHtml\";\nimport { detectChangedBlocks } from \"../../utils/changeDetector\";\nimport { hashDocument } from \"../../utils/documentHash\";\nimport { logger } from \"../../utils/logger\";\n\nexport interface PreviewProps {\n document: SiteDocument;\n pageId?: string;\n className?: string;\n style?: React.CSSProperties;\n onBlockClick?: (blockId: string, group?: string) => void;\n selectedBlockId?: string | null;\n /** Exibe hover e label de seleção nos blocos do preview */\n showSelectionOverlay?: boolean;\n /** Grupo focado para indicador visual no preview */\n focusedGroup?: string | null;\n}\n\n/**\n * Encontra um bloco na estrutura recursivamente\n */\nfunction findBlockInPage(page: any, blockId: string): Block | null {\n const findInBlocks = (blocks: Block[]): Block | null => {\n for (const block of blocks) {\n if (block.id === blockId) return block;\n const props = block.props as Record<string, any>;\n if (props?.children && Array.isArray(props.children)) {\n const found = findInBlocks(props.children);\n if (found) return found;\n }\n if (block.type === \"card\") {\n if (props.header && Array.isArray(props.header)) {\n const found = findInBlocks(props.header);\n if (found) return found;\n }\n if (props.content && Array.isArray(props.content)) {\n const found = findInBlocks(props.content);\n if (found) return found;\n }\n if (props.footer && Array.isArray(props.footer)) {\n const found = findInBlocks(props.footer);\n if (found) return found;\n }\n }\n }\n return null;\n };\n return findInBlocks(page.structure);\n}\n\n/**\n * Monta mapa blockId → nome legível (da registry)\n */\nfunction buildBlockNameMap(page: any): Record<string, string> {\n const map: Record<string, string> = {};\n const walk = (blocks: Block[]) => {\n for (const block of blocks) {\n const def = componentRegistry.get(block.type);\n map[block.id] = def?.name || block.type;\n const props = block.props as Record<string, any>;\n if (props?.children && Array.isArray(props.children)) walk(props.children);\n if (block.type === \"card\") {\n if (Array.isArray(props?.header)) walk(props.header);\n if (Array.isArray(props?.content)) walk(props.content);\n if (Array.isArray(props?.footer)) walk(props.footer);\n }\n }\n };\n if (page?.structure) walk(page.structure);\n return map;\n}\n\n/**\n * Componente de preview usando iframe isolado\n */\nexport function Preview({\n document,\n pageId,\n className,\n style,\n onBlockClick,\n selectedBlockId,\n showSelectionOverlay = false,\n focusedGroup = null,\n}: PreviewProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const previousDocRef = useRef<SiteDocument | null>(null);\n const previousDocHashRef = useRef<string | null>(null);\n const previousPageIdRef = useRef<string | null>(null);\n const isInitializedRef = useRef<boolean>(false);\n const [isLoading, setIsLoading] = useState(true);\n\n // Usar ref para selectedBlockId (necessário para highlight assíncrono)\n const selectedBlockIdRef = useRef(selectedBlockId);\n const showSelectionOverlayRef = useRef(showSelectionOverlay);\n const focusedGroupRef = useRef(focusedGroup);\n\n // Atualizar refs quando props mudam\n useEffect(() => {\n selectedBlockIdRef.current = selectedBlockId;\n }, [selectedBlockId]);\n\n useEffect(() => {\n showSelectionOverlayRef.current = showSelectionOverlay;\n }, [showSelectionOverlay]);\n\n useEffect(() => {\n focusedGroupRef.current = focusedGroup;\n }, [focusedGroup]);\n\n const page = useMemo(() => {\n return pageId\n ? document.pages.find((p) => p.id === pageId)\n : document.pages[0];\n }, [document, pageId]);\n\n // Mapa blockId → nome legível para labels\n const blockNameMapRef = useRef<Record<string, string>>({});\n useEffect(() => {\n blockNameMapRef.current = buildBlockNameMap(page);\n }, [page]);\n\n // Atualizar highlight + selection overlay diretamente no iframe (sem reload)\n const updateHighlight = (blockId: string | null) => {\n if (!iframeRef.current) return;\n\n const iframeDoc =\n iframeRef.current.contentDocument ||\n iframeRef.current.contentWindow?.document;\n if (!iframeDoc) return;\n\n const overlayEnabled = showSelectionOverlayRef.current;\n const group = focusedGroupRef.current;\n\n requestAnimationFrame(() => {\n // Remover highlight anterior\n const oldStyle = iframeDoc.getElementById(\"block-highlight\");\n if (oldStyle) oldStyle.remove();\n\n const allBlocks = iframeDoc.querySelectorAll(\"[data-block-id]\");\n allBlocks.forEach((el) => {\n const htmlEl = el as HTMLElement;\n htmlEl.style.outline = \"\";\n htmlEl.style.outlineOffset = \"\";\n });\n\n // Remover labels anteriores\n const oldLabel = iframeDoc.getElementById(\"sg-block-label\");\n if (oldLabel) oldLabel.remove();\n const oldGroupStyle = iframeDoc.getElementById(\"sg-group-highlight\");\n if (oldGroupStyle) oldGroupStyle.remove();\n const oldGroupLabel = iframeDoc.getElementById(\"sg-group-label\");\n if (oldGroupLabel) oldGroupLabel.remove();\n\n // Adicionar novo highlight\n if (blockId) {\n const highlightStyle = iframeDoc.createElement(\"style\");\n highlightStyle.id = \"block-highlight\";\n highlightStyle.textContent = `\n [data-block-id=\"${blockId}\"] {\n outline: 2px solid #3b82f6 !important;\n outline-offset: 2px !important;\n position: relative;\n }\n [data-block-id=\"${blockId}\"]::before {\n content: '';\n position: absolute;\n top: -4px;\n left: -4px;\n right: -4px;\n bottom: -4px;\n background: rgba(59, 130, 246, 0.1);\n pointer-events: none;\n z-index: -1;\n }\n `;\n iframeDoc.head.appendChild(highlightStyle);\n\n // Selection label (only when overlay is enabled)\n if (overlayEnabled) {\n const selectedEl = iframeDoc.querySelector(`[data-block-id=\"${blockId}\"]`) as HTMLElement;\n if (selectedEl) {\n const blockName = blockNameMapRef.current[blockId] || blockId;\n const label = iframeDoc.createElement(\"div\");\n label.id = \"sg-block-label\";\n label.textContent = blockName;\n label.style.cssText = \"position:absolute;top:-22px;left:0;background:#3b82f6;color:#fff;font-size:11px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10000;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:16px;\";\n const pos = getComputedStyle(selectedEl).position;\n if (pos === \"static\") selectedEl.style.position = \"relative\";\n selectedEl.appendChild(label);\n }\n }\n\n // Indicador de grupo — mostra qual sub-seção foi clicada (purple)\n if (group) {\n const blockEl = iframeDoc.querySelector(`[data-block-id=\"${blockId}\"]`);\n const groupEl = blockEl?.querySelector(`[data-block-group=\"${group}\"]`) as HTMLElement;\n if (groupEl) {\n const ghStyle = iframeDoc.createElement(\"style\");\n ghStyle.id = \"sg-group-highlight\";\n ghStyle.textContent = `\n [data-block-id=\"${blockId}\"] [data-block-group=\"${group}\"] {\n outline: 2px solid #8b5cf6 !important;\n outline-offset: 2px !important;\n position: relative;\n }\n `;\n iframeDoc.head.appendChild(ghStyle);\n\n const gLabel = iframeDoc.createElement(\"div\");\n gLabel.id = \"sg-group-label\";\n gLabel.textContent = group;\n gLabel.style.cssText = \"position:absolute;top:-20px;right:0;background:#8b5cf6;color:#fff;font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px 4px 0 0;z-index:10001;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:14px;\";\n const gPos = getComputedStyle(groupEl).position;\n if (gPos === \"static\") groupEl.style.position = \"relative\";\n groupEl.appendChild(gLabel);\n }\n }\n }\n });\n };\n\n // Enviar mapa de nomes para o iframe\n const sendBlockNamesToIframe = () => {\n if (!iframeRef.current?.contentWindow) return;\n iframeRef.current.contentWindow.postMessage({\n type: \"sg-set-block-names\",\n names: blockNameMapRef.current,\n }, \"*\");\n };\n\n // Atualizar hover overlay (injetar/remover CSS de hover nos blocos)\n const updateSelectionOverlay = (enabled: boolean) => {\n if (!iframeRef.current) return;\n\n const iframeDoc =\n iframeRef.current.contentDocument ||\n iframeRef.current.contentWindow?.document;\n if (!iframeDoc) return;\n\n const existingStyle = iframeDoc.getElementById(\"sg-hover-overlay\");\n if (existingStyle) existingStyle.remove();\n\n // Remove tooltip when disabling\n if (!enabled) {\n const tooltip = iframeDoc.getElementById(\"sg-hover-tooltip\");\n if (tooltip) tooltip.style.opacity = \"0\";\n }\n\n if (enabled) {\n const hoverStyle = iframeDoc.createElement(\"style\");\n hoverStyle.id = \"sg-hover-overlay\";\n hoverStyle.textContent = `\n [data-block-id] {\n cursor: pointer;\n transition: outline 0.15s ease, outline-offset 0.15s ease;\n }\n [data-block-id]:hover {\n outline: 2px dashed #94a3b8 !important;\n outline-offset: 2px !important;\n }\n [data-block-group] {\n cursor: pointer;\n transition: outline 0.15s ease, background 0.15s ease;\n }\n [data-block-group]:hover {\n outline: 1.5px dashed #a78bfa !important;\n outline-offset: 1px !important;\n background: rgba(139, 92, 246, 0.04);\n }\n `;\n iframeDoc.head.appendChild(hoverStyle);\n sendBlockNamesToIframe();\n }\n\n // Re-apply highlight (recalcula label)\n updateHighlight(selectedBlockIdRef.current || null);\n };\n\n // Atualizar preview completo (com srcdoc - causa reload)\n const updateFullPreview = (doc: SiteDocument, showLoading: boolean) => {\n if (!iframeRef.current || !page) return;\n\n try {\n if (showLoading) {\n setIsLoading(true);\n }\n\n let html = exportPageToHtml(page, doc, true);\n\n // Adicionar click handler + hover handler: links não navegam, enviam editor-navigate; outros cliques enviam block-click\n const clickHandler = `\n <script>\n (function() {\n // Click handler\n document.addEventListener('click', function(e) {\n var target = e.target;\n var anchor = target;\n while (anchor && anchor.tagName !== 'A') {\n anchor = anchor.parentElement;\n }\n if (anchor && anchor.tagName === 'A' && anchor.href) {\n e.preventDefault();\n e.stopPropagation();\n window.parent.postMessage({\n type: 'editor-navigate',\n href: anchor.getAttribute('href') || anchor.href\n }, '*');\n return;\n }\n var element = target;\n var group = null;\n while (element && !element.dataset.blockId) {\n if (element.dataset && element.dataset.blockGroup && !group) {\n group = element.dataset.blockGroup;\n }\n element = element.parentElement;\n }\n if (element && element.dataset.blockId) {\n window.parent.postMessage({\n type: 'block-click',\n blockId: element.dataset.blockId,\n group: group\n }, '*');\n }\n }, true);\n\n // Hover tooltip — block name map injected from parent via postMessage\n var _blockNames = {};\n var _hoverTooltip = null;\n\n window.addEventListener('message', function(e) {\n if (e.data && e.data.type === 'sg-set-block-names') {\n _blockNames = e.data.names || {};\n }\n });\n\n function getTooltip() {\n if (_hoverTooltip) return _hoverTooltip;\n _hoverTooltip = document.createElement('div');\n _hoverTooltip.id = 'sg-hover-tooltip';\n _hoverTooltip.style.cssText = 'position:fixed;top:0;left:0;background:#334155;color:#fff;font-size:11px;font-weight:500;padding:3px 8px;border-radius:4px;z-index:99999;pointer-events:none;font-family:system-ui,sans-serif;white-space:nowrap;line-height:16px;opacity:0;transition:opacity 0.12s ease;box-shadow:0 2px 6px rgba(0,0,0,0.2);';\n document.body.appendChild(_hoverTooltip);\n return _hoverTooltip;\n }\n\n var _currentHoveredBlock = null;\n var _currentHoveredGroup = null;\n\n document.addEventListener('mouseover', function(e) {\n // Check if hover overlay is active\n if (!document.getElementById('sg-hover-overlay')) return;\n var el = e.target;\n var groupName = null;\n while (el && !el.dataset.blockId) {\n if (el.dataset && el.dataset.blockGroup && !groupName) {\n groupName = el.dataset.blockGroup;\n }\n el = el.parentElement;\n }\n if (el && el.dataset.blockId) {\n if (el !== _currentHoveredBlock || groupName !== _currentHoveredGroup) {\n _currentHoveredBlock = el;\n _currentHoveredGroup = groupName;\n var tt = getTooltip();\n var blockName = _blockNames[el.dataset.blockId] || el.dataset.blockId;\n tt.textContent = groupName ? (blockName + ' \\\\u203A ' + groupName) : blockName;\n tt.style.opacity = '1';\n }\n }\n }, true);\n\n document.addEventListener('mousemove', function(e) {\n if (_hoverTooltip && _hoverTooltip.style.opacity === '1') {\n _hoverTooltip.style.left = (e.clientX + 12) + 'px';\n _hoverTooltip.style.top = (e.clientY - 28) + 'px';\n }\n }, true);\n\n document.addEventListener('mouseout', function(e) {\n var el = e.target;\n while (el && !el.dataset.blockId) el = el.parentElement;\n if (el === _currentHoveredBlock) {\n var related = e.relatedTarget;\n while (related && related !== el) related = related.parentElement;\n if (!related) {\n _currentHoveredBlock = null;\n _currentHoveredGroup = null;\n if (_hoverTooltip) _hoverTooltip.style.opacity = '0';\n }\n }\n }, true);\n })();\n </script>\n `;\n html = html.replace(\"</body>\", `${clickHandler}</body>`);\n if (!html.includes(\"</body>\")) {\n html = html + clickHandler;\n }\n\n const iframe = iframeRef.current;\n\n const applyOverlayAfterLoad = () => {\n updateHighlight(selectedBlockIdRef.current || null);\n if (showSelectionOverlayRef.current) {\n updateSelectionOverlay(true);\n }\n };\n\n if (showLoading) {\n iframe.onload = () => {\n setIsLoading(false);\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n applyOverlayAfterLoad();\n };\n setTimeout(() => {\n setIsLoading(false);\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n applyOverlayAfterLoad();\n }, 1000);\n } else {\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n iframe.onload = () => {\n applyOverlayAfterLoad();\n };\n }\n\n iframe.srcdoc = html;\n } catch (error) {\n logger.error(\"[Preview] Error:\", error);\n if (showLoading) {\n setIsLoading(false);\n }\n }\n };\n\n // Atualizar apenas um bloco (sem reload)\n const updatePartialPreview = (blockId: string, doc: SiteDocument) => {\n if (!iframeRef.current || !page) return;\n\n try {\n const block = findBlockInPage(page, blockId);\n if (!block) {\n updateFullPreview(doc, false);\n return;\n }\n\n const blockHtml = exportBlockToHtml(block, undefined, doc.theme);\n\n requestAnimationFrame(() => {\n const iframe = iframeRef.current;\n if (!iframe) return;\n\n const iframeDoc =\n iframe.contentDocument || iframe.contentWindow?.document;\n if (!iframeDoc) return;\n\n const element = iframeDoc.querySelector(`[data-block-id=\"${blockId}\"]`);\n if (element) {\n try {\n // Remover <style> e <script> tags antigas associadas a este bloco\n const oldStyles = iframeDoc.querySelectorAll(`style[data-block-style=\"${blockId}\"]`);\n oldStyles.forEach(s => s.remove());\n const oldScripts = iframeDoc.querySelectorAll(`script[data-block-style=\"${blockId}\"]`);\n oldScripts.forEach(s => s.remove());\n\n const temp = iframeDoc.createElement(\"div\");\n temp.innerHTML = blockHtml;\n\n // Marcar e extrair <style> tags para inserção separada\n const styleTags = temp.querySelectorAll(\"style\");\n styleTags.forEach(style => {\n style.setAttribute(\"data-block-style\", blockId);\n });\n\n // Extrair <script> tags antes da inserção no DOM\n // (scripts inseridos via innerHTML/fragment NÃO são executados pelo browser)\n const scriptTags: { text: string }[] = [];\n const scripts = temp.querySelectorAll(\"script\");\n scripts.forEach(script => {\n scriptTags.push({ text: script.textContent || \"\" });\n script.remove();\n });\n\n // Usar DocumentFragment para substituir com múltiplos elementos irmãos\n // (ex: <style>hover CSS</style><button>text</button>)\n const fragment = iframeDoc.createDocumentFragment();\n while (temp.firstChild) {\n fragment.appendChild(temp.firstChild);\n }\n\n if (fragment.childNodes.length > 0) {\n element.parentNode?.replaceChild(fragment, element);\n } else {\n element.outerHTML = blockHtml;\n }\n\n // Re-executar scripts criando novos elementos <script>\n // (o browser executa scripts criados via createElement + appendChild)\n scriptTags.forEach(({ text }) => {\n if (!text.trim()) return;\n const newScript = iframeDoc.createElement(\"script\");\n newScript.setAttribute(\"data-block-style\", blockId);\n newScript.textContent = text;\n iframeDoc.body.appendChild(newScript);\n });\n\n // Atualizar refs\n previousDocRef.current = JSON.parse(JSON.stringify(doc));\n previousDocHashRef.current = hashDocument(doc);\n\n // Reaplicar highlight\n updateHighlight(selectedBlockIdRef.current || null);\n } catch (error) {\n logger.error(\"[Preview] Erro ao atualizar:\", error);\n updateFullPreview(doc, false);\n }\n } else {\n updateFullPreview(doc, false);\n }\n });\n } catch (error) {\n logger.error(\"[Preview] Erro:\", error);\n updateFullPreview(doc, false);\n }\n };\n\n // Efeito para mudanças no DOCUMENTO (não no selectedBlockId)\n useEffect(() => {\n if (!page) {\n setIsLoading(false);\n return;\n }\n\n const currentDocHash = hashDocument(document);\n\n // Primeira renderização\n if (!isInitializedRef.current) {\n if (iframeRef.current) {\n isInitializedRef.current = true;\n previousPageIdRef.current = page?.id ?? null;\n updateFullPreview(document, true);\n }\n return;\n }\n\n if (!iframeRef.current) return;\n\n // Detectar troca de página (pageId mudou)\n const currentPageId = page?.id ?? null;\n if (previousPageIdRef.current !== currentPageId) {\n previousPageIdRef.current = currentPageId;\n updateFullPreview(document, false);\n return;\n }\n\n // Se hash não mudou, não há mudanças no documento\n if (previousDocHashRef.current === currentDocHash) {\n return;\n }\n\n // Se o theme mudou, forçar reload completo (CSS variables precisam ser regeneradas)\n const prevThemeJson = previousDocRef.current ? JSON.stringify(previousDocRef.current.theme) : null;\n const currThemeJson = JSON.stringify(document.theme);\n if (prevThemeJson !== currThemeJson) {\n updateFullPreview(document, false);\n return;\n }\n\n // Detectar mudanças na página atual\n const changedBlocks = detectChangedBlocks(\n previousDocRef.current || document,\n document,\n page?.id,\n );\n\n // Se não há mudanças detectadas mas o hash mudou, forçar reload\n if (changedBlocks.length === 0) {\n logger.debug(\n \"[Preview] Hash changed but no changes detected, forcing reload\",\n );\n updateFullPreview(document, false);\n return;\n }\n\n // Mudança estrutural (bloco adicionado/removido) = reload completo\n if (\n changedBlocks.some(\n (c) =>\n c.blockId === \"__structural__\" ||\n c.changedProps?.includes(\"children\"),\n )\n ) {\n updateFullPreview(document, false);\n return;\n }\n\n // Mudança de 1 bloco (não estrutural) = atualização parcial\n if (changedBlocks.length === 1) {\n const change = changedBlocks[0];\n const changedProps = change.changedProps || [];\n\n const isStructural = changedProps.some(\n (prop) =>\n prop === \"children\" ||\n prop === \"header\" ||\n prop === \"content\" ||\n prop === \"footer\",\n );\n\n if (!isStructural) {\n updatePartialPreview(change.blockId, document);\n return;\n }\n }\n\n // Fallback: reload completo SEM loader\n updateFullPreview(document, false);\n }, [document, page]); // APENAS document e page - sem funções\n\n // Efeito SEPARADO para highlight (não recarrega o preview)\n useEffect(() => {\n if (!isInitializedRef.current) return;\n updateHighlight(selectedBlockId || null);\n }, [selectedBlockId, focusedGroup]); // eslint-disable-line react-hooks/exhaustive-deps -- updateHighlight reads focusedGroupRef\n\n // Efeito para toggle do selection overlay\n useEffect(() => {\n if (!isInitializedRef.current) return;\n updateSelectionOverlay(showSelectionOverlay);\n }, [showSelectionOverlay]); // eslint-disable-line react-hooks/exhaustive-deps -- same pattern as updateFullPreview\n\n // Listener para cliques\n useEffect(() => {\n if (!onBlockClick) return;\n\n const handleMessage = (event: MessageEvent) => {\n if (event.data?.type === \"block-click\" && event.data?.blockId) {\n onBlockClick(event.data.blockId, event.data.group || undefined);\n }\n };\n\n window.addEventListener(\"message\", handleMessage);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n };\n }, [onBlockClick]);\n\n if (!page) {\n return (\n <div className={className} style={style}>\n <div style={{ padding: \"2rem\", textAlign: \"center\", color: \"#6b7280\" }}>\n Página não encontrada\n </div>\n </div>\n );\n }\n\n return (\n <div className={className} style={{ position: \"relative\", ...style }}>\n {isLoading && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n backgroundColor: \"rgba(255, 255, 255, 0.8)\",\n zIndex: 10,\n }}\n >\n <div style={{ color: \"#6b7280\" }}>Carregando preview...</div>\n </div>\n )}\n <iframe\n ref={iframeRef}\n style={{\n width: \"100%\",\n height: \"100%\",\n border: \"none\",\n backgroundColor: \"#ffffff\",\n }}\n title=\"Preview do site\"\n />\n </div>\n );\n}\n"],"names":["findBlockInPage","page","blockId","findInBlocks","blocks","block","props","found","buildBlockNameMap","map","walk","def","componentRegistry","Preview","document","pageId","className","style","onBlockClick","selectedBlockId","showSelectionOverlay","focusedGroup","iframeRef","useRef","previousDocRef","previousDocHashRef","previousPageIdRef","isInitializedRef","isLoading","setIsLoading","useState","selectedBlockIdRef","showSelectionOverlayRef","focusedGroupRef","useEffect","useMemo","p","blockNameMapRef","updateHighlight","iframeDoc","overlayEnabled","group","oldStyle","el","htmlEl","oldLabel","oldGroupStyle","oldGroupLabel","highlightStyle","selectedEl","blockName","label","groupEl","ghStyle","gLabel","sendBlockNamesToIframe","updateSelectionOverlay","enabled","existingStyle","tooltip","hoverStyle","updateFullPreview","doc","showLoading","html","exportPageToHtml","clickHandler","iframe","applyOverlayAfterLoad","hashDocument","error","logger","updatePartialPreview","blockHtml","exportBlockToHtml","element","s","temp","scriptTags","script","fragment","text","newScript","currentDocHash","currentPageId","prevThemeJson","currThemeJson","changedBlocks","detectChangedBlocks","c","change","prop","handleMessage","event","jsxs","jsx"],"mappings":";;;;;;;AA6BA,SAASA,EAAgBC,GAAWC,GAA+B;AACjE,QAAMC,IAAe,CAACC,MAAkC;AACtD,eAAWC,KAASD,GAAQ;AAC1B,UAAIC,EAAM,OAAOH,EAAS,QAAOG;AACjC,YAAMC,IAAQD,EAAM;AACpB,UAAIC,GAAO,YAAY,MAAM,QAAQA,EAAM,QAAQ,GAAG;AACpD,cAAMC,IAAQJ,EAAaG,EAAM,QAAQ;AACzC,YAAIC,EAAO,QAAOA;AAAA,MACpB;AACA,UAAIF,EAAM,SAAS,QAAQ;AACzB,YAAIC,EAAM,UAAU,MAAM,QAAQA,EAAM,MAAM,GAAG;AAC/C,gBAAMC,IAAQJ,EAAaG,EAAM,MAAM;AACvC,cAAIC,EAAO,QAAOA;AAAA,QACpB;AACA,YAAID,EAAM,WAAW,MAAM,QAAQA,EAAM,OAAO,GAAG;AACjD,gBAAMC,IAAQJ,EAAaG,EAAM,OAAO;AACxC,cAAIC,EAAO,QAAOA;AAAA,QACpB;AACA,YAAID,EAAM,UAAU,MAAM,QAAQA,EAAM,MAAM,GAAG;AAC/C,gBAAMC,IAAQJ,EAAaG,EAAM,MAAM;AACvC,cAAIC,EAAO,QAAOA;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,SAAOJ,EAAaF,EAAK,SAAS;AACpC;AAKA,SAASO,GAAkBP,GAAmC;AAC5D,QAAMQ,IAA8B,CAAA,GAC9BC,IAAO,CAACN,MAAoB;AAChC,eAAWC,KAASD,GAAQ;AAC1B,YAAMO,IAAMC,EAAkB,IAAIP,EAAM,IAAI;AAC5C,MAAAI,EAAIJ,EAAM,EAAE,IAAIM,GAAK,QAAQN,EAAM;AACnC,YAAMC,IAAQD,EAAM;AACpB,MAAIC,GAAO,YAAY,MAAM,QAAQA,EAAM,QAAQ,KAAGI,EAAKJ,EAAM,QAAQ,GACrED,EAAM,SAAS,WACb,MAAM,QAAQC,GAAO,MAAM,KAAGI,EAAKJ,EAAM,MAAM,GAC/C,MAAM,QAAQA,GAAO,OAAO,KAAGI,EAAKJ,EAAM,OAAO,GACjD,MAAM,QAAQA,GAAO,MAAM,KAAGI,EAAKJ,EAAM,MAAM;AAAA,IAEvD;AAAA,EACF;AACA,SAAIL,GAAM,aAAWS,EAAKT,EAAK,SAAS,GACjCQ;AACT;AAKO,SAASI,GAAQ;AAAA,EACtB,UAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AAAA,EACA,OAAAC;AAAA,EACA,cAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,sBAAAC,IAAuB;AAAA,EACvB,cAAAC,IAAe;AACjB,GAAiB;AACf,QAAMC,IAAYC,EAA0B,IAAI,GAC1CC,IAAiBD,EAA4B,IAAI,GACjDE,IAAqBF,EAAsB,IAAI,GAC/CG,IAAoBH,EAAsB,IAAI,GAC9CI,IAAmBJ,EAAgB,EAAK,GACxC,CAACK,GAAWC,CAAY,IAAIC,EAAS,EAAI,GAGzCC,IAAqBR,EAAOJ,CAAe,GAC3Ca,IAA0BT,EAAOH,CAAoB,GACrDa,IAAkBV,EAAOF,CAAY;AAG3C,EAAAa,EAAU,MAAM;AACd,IAAAH,EAAmB,UAAUZ;AAAA,EAC/B,GAAG,CAACA,CAAe,CAAC,GAEpBe,EAAU,MAAM;AACd,IAAAF,EAAwB,UAAUZ;AAAA,EACpC,GAAG,CAACA,CAAoB,CAAC,GAEzBc,EAAU,MAAM;AACd,IAAAD,EAAgB,UAAUZ;AAAA,EAC5B,GAAG,CAACA,CAAY,CAAC;AAEjB,QAAMpB,IAAOkC,EAAQ,MACZpB,IACHD,EAAS,MAAM,KAAK,CAACsB,MAAMA,EAAE,OAAOrB,CAAM,IAC1CD,EAAS,MAAM,CAAC,GACnB,CAACA,GAAUC,CAAM,CAAC,GAGfsB,IAAkBd,EAA+B,EAAE;AACzD,EAAAW,EAAU,MAAM;AACd,IAAAG,EAAgB,UAAU7B,GAAkBP,CAAI;AAAA,EAClD,GAAG,CAACA,CAAI,CAAC;AAGT,QAAMqC,IAAkB,CAACpC,MAA2B;AAClD,QAAI,CAACoB,EAAU,QAAS;AAExB,UAAMiB,IACJjB,EAAU,QAAQ,mBAClBA,EAAU,QAAQ,eAAe;AACnC,QAAI,CAACiB,EAAW;AAEhB,UAAMC,IAAiBR,EAAwB,SACzCS,IAAQR,EAAgB;AAE9B,0BAAsB,MAAM;AAE1B,YAAMS,IAAWH,EAAU,eAAe,iBAAiB;AAC3D,MAAIG,OAAmB,OAAA,GAELH,EAAU,iBAAiB,iBAAiB,EACpD,QAAQ,CAACI,MAAO;AACxB,cAAMC,IAASD;AACf,QAAAC,EAAO,MAAM,UAAU,IACvBA,EAAO,MAAM,gBAAgB;AAAA,MAC/B,CAAC;AAGD,YAAMC,IAAWN,EAAU,eAAe,gBAAgB;AAC1D,MAAIM,OAAmB,OAAA;AACvB,YAAMC,IAAgBP,EAAU,eAAe,oBAAoB;AACnE,MAAIO,OAA6B,OAAA;AACjC,YAAMC,IAAgBR,EAAU,eAAe,gBAAgB;AAI/D,UAHIQ,OAA6B,OAAA,GAG7B7C,GAAS;AACX,cAAM8C,IAAiBT,EAAU,cAAc,OAAO;AAuBtD,YAtBAS,EAAe,KAAK,mBACpBA,EAAe,cAAc;AAAA,4BACT9C,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA,4BAKPA,CAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAY3BqC,EAAU,KAAK,YAAYS,CAAc,GAGrCR,GAAgB;AAClB,gBAAMS,IAAaV,EAAU,cAAc,mBAAmBrC,CAAO,IAAI;AACzE,cAAI+C,GAAY;AACd,kBAAMC,IAAYb,EAAgB,QAAQnC,CAAO,KAAKA,GAChDiD,IAAQZ,EAAU,cAAc,KAAK;AAC3C,YAAAY,EAAM,KAAK,kBACXA,EAAM,cAAcD,GACpBC,EAAM,MAAM,UAAU,qPACV,iBAAiBF,CAAU,EAAE,aAC7B,aAAUA,EAAW,MAAM,WAAW,aAClDA,EAAW,YAAYE,CAAK;AAAA,UAC9B;AAAA,QACF;AAGA,YAAIV,GAAO;AAET,gBAAMW,IADUb,EAAU,cAAc,mBAAmBrC,CAAO,IAAI,GAC7C,cAAc,sBAAsBuC,CAAK,IAAI;AACtE,cAAIW,GAAS;AACX,kBAAMC,IAAUd,EAAU,cAAc,OAAO;AAC/C,YAAAc,EAAQ,KAAK,sBACbA,EAAQ,cAAc;AAAA,gCACFnD,CAAO,yBAAyBuC,CAAK;AAAA;AAAA;AAAA;AAAA;AAAA,eAMzDF,EAAU,KAAK,YAAYc,CAAO;AAElC,kBAAMC,IAASf,EAAU,cAAc,KAAK;AAC5C,YAAAe,EAAO,KAAK,kBACZA,EAAO,cAAcb,GACrBa,EAAO,MAAM,UAAU,sPACV,iBAAiBF,CAAO,EAAE,aAC1B,aAAUA,EAAQ,MAAM,WAAW,aAChDA,EAAQ,YAAYE,CAAM;AAAA,UAC5B;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,GAGMC,IAAyB,MAAM;AACnC,IAAKjC,EAAU,SAAS,iBACxBA,EAAU,QAAQ,cAAc,YAAY;AAAA,MAC1C,MAAM;AAAA,MACN,OAAOe,EAAgB;AAAA,IAAA,GACtB,GAAG;AAAA,EACR,GAGMmB,IAAyB,CAACC,MAAqB;AACnD,QAAI,CAACnC,EAAU,QAAS;AAExB,UAAMiB,IACJjB,EAAU,QAAQ,mBAClBA,EAAU,QAAQ,eAAe;AACnC,QAAI,CAACiB,EAAW;AAEhB,UAAMmB,IAAgBnB,EAAU,eAAe,kBAAkB;AAIjE,QAHImB,OAA6B,OAAA,GAG7B,CAACD,GAAS;AACZ,YAAME,IAAUpB,EAAU,eAAe,kBAAkB;AAC3D,MAAIoB,MAASA,EAAQ,MAAM,UAAU;AAAA,IACvC;AAEA,QAAIF,GAAS;AACX,YAAMG,IAAarB,EAAU,cAAc,OAAO;AAClD,MAAAqB,EAAW,KAAK,oBAChBA,EAAW,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAmBzBrB,EAAU,KAAK,YAAYqB,CAAU,GACrCL,EAAA;AAAA,IACF;AAGA,IAAAjB,EAAgBP,EAAmB,WAAW,IAAI;AAAA,EACpD,GAGM8B,IAAoB,CAACC,GAAmBC,MAAyB;AACrE,QAAI,GAACzC,EAAU,WAAW,CAACrB;AAE3B,UAAI;AACF,QAAI8D,KACFlC,EAAa,EAAI;AAGnB,YAAImC,IAAOC,EAAiBhE,GAAM6D,GAAK,EAAI;AAG3C,cAAMI,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwGrB,QAAAF,IAAOA,EAAK,QAAQ,WAAW,GAAGE,CAAY,SAAS,GAClDF,EAAK,SAAS,SAAS,MAC1BA,IAAOA,IAAOE;AAGhB,cAAMC,IAAS7C,EAAU,SAEnB8C,IAAwB,MAAM;AAClC,UAAA9B,EAAgBP,EAAmB,WAAW,IAAI,GAC9CC,EAAwB,WAC1BwB,EAAuB,EAAI;AAAA,QAE/B;AAEA,QAAIO,KACFI,EAAO,SAAS,MAAM;AACpB,UAAAtC,EAAa,EAAK,GAClBL,EAAe,UAAU,KAAK,MAAM,KAAK,UAAUsC,CAAG,CAAC,GACvDrC,EAAmB,UAAU4C,EAAaP,CAAG,GAC7CM,EAAA;AAAA,QACF,GACA,WAAW,MAAM;AACf,UAAAvC,EAAa,EAAK,GAClBL,EAAe,UAAU,KAAK,MAAM,KAAK,UAAUsC,CAAG,CAAC,GACvDrC,EAAmB,UAAU4C,EAAaP,CAAG,GAC7CM,EAAA;AAAA,QACF,GAAG,GAAI,MAEP5C,EAAe,UAAU,KAAK,MAAM,KAAK,UAAUsC,CAAG,CAAC,GACvDrC,EAAmB,UAAU4C,EAAaP,CAAG,GAC7CK,EAAO,SAAS,MAAM;AACpB,UAAAC,EAAA;AAAA,QACF,IAGFD,EAAO,SAASH;AAAA,MAClB,SAASM,GAAO;AACd,QAAAC,EAAO,MAAM,oBAAoBD,CAAK,GAClCP,KACFlC,EAAa,EAAK;AAAA,MAEtB;AAAA,EACF,GAGM2C,IAAuB,CAACtE,GAAiB4D,MAAsB;AACnE,QAAI,GAACxC,EAAU,WAAW,CAACrB;AAE3B,UAAI;AACF,cAAMI,IAAQL,EAAgBC,GAAMC,CAAO;AAC3C,YAAI,CAACG,GAAO;AACV,UAAAwD,EAAkBC,GAAK,EAAK;AAC5B;AAAA,QACF;AAEA,cAAMW,IAAYC,EAAkBrE,GAAO,QAAWyD,EAAI,KAAK;AAE/D,8BAAsB,MAAM;AAC1B,gBAAMK,IAAS7C,EAAU;AACzB,cAAI,CAAC6C,EAAQ;AAEb,gBAAM5B,IACJ4B,EAAO,mBAAmBA,EAAO,eAAe;AAClD,cAAI,CAAC5B,EAAW;AAEhB,gBAAMoC,IAAUpC,EAAU,cAAc,mBAAmBrC,CAAO,IAAI;AACtE,cAAIyE;AACF,gBAAI;AAGF,cADkBpC,EAAU,iBAAiB,2BAA2BrC,CAAO,IAAI,EACzE,QAAQ,CAAA0E,MAAKA,EAAE,OAAA,CAAQ,GACdrC,EAAU,iBAAiB,4BAA4BrC,CAAO,IAAI,EAC1E,QAAQ,CAAA0E,MAAKA,EAAE,OAAA,CAAQ;AAElC,oBAAMC,IAAOtC,EAAU,cAAc,KAAK;AAC1C,cAAAsC,EAAK,YAAYJ,GAGCI,EAAK,iBAAiB,OAAO,EACrC,QAAQ,CAAA5D,MAAS;AACzBA,gBAAAA,EAAM,aAAa,oBAAoBf,CAAO;AAAA,cAChD,CAAC;AAID,oBAAM4E,IAAiC,CAAA;AAEvC,cADgBD,EAAK,iBAAiB,QAAQ,EACtC,QAAQ,CAAAE,MAAU;AACxB,gBAAAD,EAAW,KAAK,EAAE,MAAMC,EAAO,eAAe,IAAI,GAClDA,EAAO,OAAA;AAAA,cACT,CAAC;AAID,oBAAMC,IAAWzC,EAAU,uBAAA;AAC3B,qBAAOsC,EAAK;AACV,gBAAAG,EAAS,YAAYH,EAAK,UAAU;AAGtC,cAAIG,EAAS,WAAW,SAAS,IAC/BL,EAAQ,YAAY,aAAaK,GAAUL,CAAO,IAElDA,EAAQ,YAAYF,GAKtBK,EAAW,QAAQ,CAAC,EAAE,MAAAG,QAAW;AAC/B,oBAAI,CAACA,EAAK,OAAQ;AAClB,sBAAMC,IAAY3C,EAAU,cAAc,QAAQ;AAClD,gBAAA2C,EAAU,aAAa,oBAAoBhF,CAAO,GAClDgF,EAAU,cAAcD,GACxB1C,EAAU,KAAK,YAAY2C,CAAS;AAAA,cACtC,CAAC,GAGD1D,EAAe,UAAU,KAAK,MAAM,KAAK,UAAUsC,CAAG,CAAC,GACvDrC,EAAmB,UAAU4C,EAAaP,CAAG,GAG7CxB,EAAgBP,EAAmB,WAAW,IAAI;AAAA,YACpD,SAASuC,GAAO;AACd,cAAAC,EAAO,MAAM,gCAAgCD,CAAK,GAClDT,EAAkBC,GAAK,EAAK;AAAA,YAC9B;AAAA;AAEA,YAAAD,EAAkBC,GAAK,EAAK;AAAA,QAEhC,CAAC;AAAA,MACH,SAASQ,GAAO;AACd,QAAAC,EAAO,MAAM,mBAAmBD,CAAK,GACrCT,EAAkBC,GAAK,EAAK;AAAA,MAC9B;AAAA,EACF;AA2HA,SAxHA5B,EAAU,MAAM;AACd,QAAI,CAACjC,GAAM;AACT,MAAA4B,EAAa,EAAK;AAClB;AAAA,IACF;AAEA,UAAMsD,IAAiBd,EAAavD,CAAQ;AAG5C,QAAI,CAACa,EAAiB,SAAS;AAC7B,MAAIL,EAAU,YACZK,EAAiB,UAAU,IAC3BD,EAAkB,UAAUzB,GAAM,MAAM,MACxC4D,EAAkB/C,GAAU,EAAI;AAElC;AAAA,IACF;AAEA,QAAI,CAACQ,EAAU,QAAS;AAGxB,UAAM8D,IAAgBnF,GAAM,MAAM;AAClC,QAAIyB,EAAkB,YAAY0D,GAAe;AAC/C,MAAA1D,EAAkB,UAAU0D,GAC5BvB,EAAkB/C,GAAU,EAAK;AACjC;AAAA,IACF;AAGA,QAAIW,EAAmB,YAAY0D;AACjC;AAIF,UAAME,IAAgB7D,EAAe,UAAU,KAAK,UAAUA,EAAe,QAAQ,KAAK,IAAI,MACxF8D,IAAgB,KAAK,UAAUxE,EAAS,KAAK;AACnD,QAAIuE,MAAkBC,GAAe;AACnC,MAAAzB,EAAkB/C,GAAU,EAAK;AACjC;AAAA,IACF;AAGA,UAAMyE,IAAgBC;AAAA,MACpBhE,EAAe,WAAWV;AAAA,MAC1BA;AAAA,MACAb,GAAM;AAAA,IAAA;AAIR,QAAIsF,EAAc,WAAW,GAAG;AAC9B,MAAAhB,EAAO;AAAA,QACL;AAAA,MAAA,GAEFV,EAAkB/C,GAAU,EAAK;AACjC;AAAA,IACF;AAGA,QACEyE,EAAc;AAAA,MACZ,CAACE,MACCA,EAAE,YAAY,oBACdA,EAAE,cAAc,SAAS,UAAU;AAAA,IAAA,GAEvC;AACA,MAAA5B,EAAkB/C,GAAU,EAAK;AACjC;AAAA,IACF;AAGA,QAAIyE,EAAc,WAAW,GAAG;AAC9B,YAAMG,IAASH,EAAc,CAAC;AAW9B,UAAI,EAViBG,EAAO,gBAAgB,CAAA,GAEV;AAAA,QAChC,CAACC,MACCA,MAAS,cACTA,MAAS,YACTA,MAAS,aACTA,MAAS;AAAA,MAAA,GAGM;AACjB,QAAAnB,EAAqBkB,EAAO,SAAS5E,CAAQ;AAC7C;AAAA,MACF;AAAA,IACF;AAGA,IAAA+C,EAAkB/C,GAAU,EAAK;AAAA,EACnC,GAAG,CAACA,GAAUb,CAAI,CAAC,GAGnBiC,EAAU,MAAM;AACd,IAAKP,EAAiB,WACtBW,EAAgBnB,KAAmB,IAAI;AAAA,EACzC,GAAG,CAACA,GAAiBE,CAAY,CAAC,GAGlCa,EAAU,MAAM;AACd,IAAKP,EAAiB,WACtB6B,EAAuBpC,CAAoB;AAAA,EAC7C,GAAG,CAACA,CAAoB,CAAC,GAGzBc,EAAU,MAAM;AACd,QAAI,CAAChB,EAAc;AAEnB,UAAM0E,IAAgB,CAACC,MAAwB;AAC7C,MAAIA,EAAM,MAAM,SAAS,iBAAiBA,EAAM,MAAM,WACpD3E,EAAa2E,EAAM,KAAK,SAASA,EAAM,KAAK,SAAS,MAAS;AAAA,IAElE;AAEA,kBAAO,iBAAiB,WAAWD,CAAa,GACzC,MAAM;AACX,aAAO,oBAAoB,WAAWA,CAAa;AAAA,IACrD;AAAA,EACF,GAAG,CAAC1E,CAAY,CAAC,GAEZjB,IAWH,gBAAA6F,EAAC,SAAI,WAAA9E,GAAsB,OAAO,EAAE,UAAU,YAAY,GAAGC,EAAA,GAC1D,UAAA;AAAA,IAAAW,KACC,gBAAAmE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OAAO;AAAA,UACL,UAAU;AAAA,UACV,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,QAAQ;AAAA,QAAA;AAAA,QAGV,4BAAC,OAAA,EAAI,OAAO,EAAE,OAAO,UAAA,GAAa,UAAA,wBAAA,CAAqB;AAAA,MAAA;AAAA,IAAA;AAAA,IAG3D,gBAAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAKzE;AAAA,QACL,OAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,iBAAiB;AAAA,QAAA;AAAA,QAEnB,OAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EACR,GACF,sBAtCG,OAAA,EAAI,WAAAN,GAAsB,OAAAC,GACzB,UAAA,gBAAA8E,EAAC,SAAI,OAAO,EAAE,SAAS,QAAQ,WAAW,UAAU,OAAO,UAAA,GAAa,mCAExE,GACF;AAoCN;"}
@@ -1 +1 @@
1
- {"version":3,"file":"imageGallery.d.ts","sourceRoot":"","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,iBAAiB,CAAC,OAAO,CAuElE,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,cAAc,CAiQ7D,CAAC;AAKF,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"imageGallery.d.ts","sourceRoot":"","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtE;;GAEG;AACH,eAAO,MAAM,2BAA2B,EAAE,iBAAiB,CAAC,OAAO,CAuElE,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,eAAe,CAAC,cAAc,CA+P7D,CAAC;AAKF,eAAe,iBAAiB,CAAC"}
@@ -88,12 +88,10 @@ const o = {
88
88
  inputType: "text",
89
89
  group: "Conteúdo"
90
90
  },
91
- images: {
92
- label: "Imagens",
93
- inputType: "gallery-images",
94
- group: "Conteúdo",
95
- description: "Gerencie as imagens da galeria"
96
- },
91
+ // Note: "images" field is hidden because there's no modal UI for it yet.
92
+ // Users add images via defaultProps or programmatically.
93
+ // The gallery-images input type exists but shows confusing "[object Object]..." text.
94
+ // Will be re-enabled when GalleryImagesInput modal component is implemented.
97
95
  // =========================================================================
98
96
  // GRUPO: Layout
99
97
  // =========================================================================
@@ -113,18 +111,18 @@ const o = {
113
111
  label: "Colunas",
114
112
  inputType: "number",
115
113
  min: 2,
116
- max: 4,
114
+ max: 12,
117
115
  group: "Layout",
118
- description: "Número de colunas no desktop"
116
+ description: "Número de colunas no desktop (responsivo: 4→3→2→1)"
119
117
  },
120
118
  gap: {
121
- label: "Espaçamento",
119
+ label: "Espaçamento (rem)",
122
120
  inputType: "number",
123
121
  min: 0,
124
- max: 3,
122
+ max: 5,
125
123
  step: 0.5,
126
124
  group: "Layout",
127
- description: "Espaçamento entre imagens (rem)"
125
+ description: "Espaçamento entre imagens (0 = sem espaço)"
128
126
  },
129
127
  aspectRatio: {
130
128
  label: "Proporção",
@@ -155,14 +153,14 @@ const o = {
155
153
  description: "Arredondamento das imagens (px)"
156
154
  },
157
155
  imageShadow: {
158
- label: "Sombra",
156
+ label: "Sombra da Imagem",
159
157
  inputType: "select",
160
158
  options: [
161
- { value: "none", label: "Sem sombra" },
159
+ { value: "none", label: "Nenhuma" },
162
160
  { value: "sm", label: "Pequena" },
163
161
  { value: "md", label: "Média" },
164
162
  { value: "lg", label: "Grande" },
165
- { value: "xl", label: "Extra grande" }
163
+ { value: "xl", label: "Extra Grande" }
166
164
  ],
167
165
  group: "Aparência"
168
166
  },
@@ -1 +1 @@
1
- {"version":3,"file":"imageGallery.js","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"sourcesContent":["import { BlockDefinition } from \"../../types\";\nimport { componentRegistry } from \"../../registry\";\nimport type { ImageGalleryBlock } from \"../../../schema/siteDocument\";\nimport { galleryVariations } from \"../../../presets/galleryVariations\";\n\n/**\n * Valores padrão do ImageGallery - Use para garantir consistência em templates e factories\n */\nexport const IMAGE_GALLERY_DEFAULT_PROPS: ImageGalleryBlock[\"props\"] = {\n // Conteúdo\n title: \"Nossa Galeria\",\n subtitle: \"Confira nossas imagens\",\n images: [\n {\n id: \"1\",\n src: \"https://placehold.co/800x600/3b82f6/ffffff?text=Image+1\",\n alt: \"Imagem de demonstração 1\",\n title: \"Projeto 1\",\n description: \"Descrição da primeira imagem\",\n },\n {\n id: \"2\",\n src: \"https://placehold.co/800x600/8b5cf6/ffffff?text=Image+2\",\n alt: \"Imagem de demonstração 2\",\n title: \"Projeto 2\",\n description: \"Descrição da segunda imagem\",\n },\n {\n id: \"3\",\n src: \"https://placehold.co/800x600/ec4899/ffffff?text=Image+3\",\n alt: \"Imagem de demonstração 3\",\n title: \"Projeto 3\",\n description: \"Descrição da terceira imagem\",\n },\n {\n id: \"4\",\n src: \"https://placehold.co/800x600/10b981/ffffff?text=Image+4\",\n alt: \"Imagem de demonstração 4\",\n title: \"Projeto 4\",\n description: \"Descrição da quarta imagem\",\n },\n ],\n\n // Layout\n variation: \"gallery-grid\",\n columns: 4,\n gap: 1,\n aspectRatio: \"auto\",\n\n // Aparência\n imageBorderRadius: 8,\n imageShadow: \"md\",\n\n // Animações\n enterAnimation: \"fade-scale\",\n hoverEffect: \"zoom-overlay\",\n hoverIntensity: 50,\n\n // Lightbox\n lightbox: {\n mode: \"adaptive\",\n showArrows: true,\n showThumbnails: true,\n showCounter: true,\n showCaption: true,\n enableZoom: true,\n enableDownload: false,\n enableAutoplay: false,\n autoplayInterval: 5,\n closeOnBackdropClick: true,\n closeOnEsc: true,\n enableKeyboard: true,\n enableTouchGestures: true,\n transitionDuration: 300,\n },\n\n // Performance\n lazyLoad: true,\n showWarningAt: 50,\n};\n\nexport const imageGalleryBlock: BlockDefinition<\"imageGallery\"> = {\n type: \"imageGallery\",\n name: \"Galeria de Imagens\",\n description: \"Galeria de imagens com lightbox profissional e zoom\",\n category: \"sections\",\n canHaveChildren: false,\n defaultProps: IMAGE_GALLERY_DEFAULT_PROPS,\n variations: Object.values(galleryVariations),\n\n inspectorMeta: {\n // =========================================================================\n // GRUPO: Conteúdo\n // =========================================================================\n title: {\n label: \"Título\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n subtitle: {\n label: \"Subtítulo\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n images: {\n label: \"Imagens\",\n inputType: \"gallery-images\",\n group: \"Conteúdo\",\n description: \"Gerencie as imagens da galeria\",\n },\n\n // =========================================================================\n // GRUPO: Layout\n // =========================================================================\n variation: {\n label: \"Layout\",\n inputType: \"select\",\n options: [\n { value: \"gallery-grid\", label: \"Grid Clássico\" },\n { value: \"gallery-masonry\", label: \"Masonry (v1.1)\" },\n { value: \"gallery-featured\", label: \"Destaque (v1.2)\" },\n { value: \"gallery-carousel\", label: \"Carrossel (v1.3)\" },\n { value: \"gallery-alternating\", label: \"Alternado (v1.4)\" },\n ],\n group: \"Layout\",\n },\n columns: {\n label: \"Colunas\",\n inputType: \"number\",\n min: 2,\n max: 4,\n group: \"Layout\",\n description: \"Número de colunas no desktop\",\n },\n gap: {\n label: \"Espaçamento\",\n inputType: \"number\",\n min: 0,\n max: 3,\n step: 0.5,\n group: \"Layout\",\n description: \"Espaçamento entre imagens (rem)\",\n },\n aspectRatio: {\n label: \"Proporção\",\n inputType: \"select\",\n options: [\n { value: \"auto\", label: \"Original\" },\n { value: \"1/1\", label: \"Quadrado (1:1)\" },\n { value: \"4/3\", label: \"Paisagem (4:3)\" },\n { value: \"16/9\", label: \"Widescreen (16:9)\" },\n { value: \"3/2\", label: \"Clássico (3:2)\" },\n ],\n group: \"Layout\",\n },\n\n // =========================================================================\n // GRUPO: Aparência\n // =========================================================================\n bg: {\n label: \"Cor de Fundo\",\n inputType: \"color\",\n group: \"Aparência\",\n },\n imageBorderRadius: {\n label: \"Borda Arredondada\",\n inputType: \"number\",\n min: 0,\n max: 32,\n group: \"Aparência\",\n description: \"Arredondamento das imagens (px)\",\n },\n imageShadow: {\n label: \"Sombra\",\n inputType: \"select\",\n options: [\n { value: \"none\", label: \"Sem sombra\" },\n { value: \"sm\", label: \"Pequena\" },\n { value: \"md\", label: \"Média\" },\n { value: \"lg\", label: \"Grande\" },\n { value: \"xl\", label: \"Extra grande\" },\n ],\n group: \"Aparência\",\n },\n\n // =========================================================================\n // GRUPO: Animações\n // =========================================================================\n enterAnimation: {\n label: \"Animação de Entrada\",\n inputType: \"select\",\n options: [\n { value: \"fade-scale\", label: \"Fade + Zoom\" },\n { value: \"stagger\", label: \"Cascata\" },\n { value: \"slide-up\", label: \"Desliza de Baixo\" },\n { value: \"none\", label: \"Sem animação\" },\n ],\n group: \"Animações\",\n },\n hoverEffect: {\n label: \"Efeito de Hover\",\n inputType: \"select\",\n options: [\n { value: \"zoom-overlay\", label: \"Zoom + Overlay\" },\n { value: \"glow\", label: \"Brilho\" },\n { value: \"scale\", label: \"Aumentar\" },\n { value: \"caption-reveal\", label: \"Revelar Legenda\" },\n { value: \"none\", label: \"Sem efeito\" },\n ],\n group: \"Animações\",\n },\n hoverIntensity: {\n label: \"Intensidade do Hover\",\n inputType: \"number\",\n min: 0,\n max: 100,\n group: \"Animações\",\n description: \"Intensidade do efeito (0-100%)\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Tema\n // =========================================================================\n \"lightbox.mode\": {\n label: \"Tema do Lightbox\",\n inputType: \"select\",\n options: [\n { value: \"adaptive\", label: \"Adaptável (Auto)\" },\n { value: \"dark\", label: \"Escuro\" },\n { value: \"light\", label: \"Claro\" },\n { value: \"theme\", label: \"Seguir Tema do Site\" },\n ],\n group: \"Lightbox - Tema\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Navegação\n // =========================================================================\n \"lightbox.showArrows\": {\n label: \"Mostrar Setas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showThumbnails\": {\n label: \"Mostrar Miniaturas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showCounter\": {\n label: \"Mostrar Contador\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n description: 'Exibe \"3 de 12\"',\n },\n \"lightbox.showCaption\": {\n label: \"Mostrar Legenda\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Funcionalidades\n // =========================================================================\n \"lightbox.enableZoom\": {\n label: \"Ativar Zoom\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableDownload\": {\n label: \"Ativar Download\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Permitir download de imagens (v1.1)\",\n },\n \"lightbox.enableAutoplay\": {\n label: \"Ativar Autoplay\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Reprodução automática (v1.3)\",\n },\n \"lightbox.autoplayInterval\": {\n label: \"Intervalo do Autoplay\",\n inputType: \"number\",\n min: 2,\n max: 10,\n group: \"Lightbox - Funcionalidades\",\n description: \"Intervalo em segundos\",\n },\n \"lightbox.closeOnBackdropClick\": {\n label: \"Fechar ao Clicar Fora\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.closeOnEsc\": {\n label: \"Fechar com ESC\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableKeyboard\": {\n label: \"Navegação por Teclado\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Arrows, +, -, 0\",\n },\n \"lightbox.enableTouchGestures\": {\n label: \"Gestos Touch\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Swipe, pinch, double-tap\",\n },\n \"lightbox.transitionDuration\": {\n label: \"Duração da Transição\",\n inputType: \"number\",\n min: 100,\n max: 1000,\n step: 50,\n group: \"Lightbox - Funcionalidades\",\n description: \"Velocidade da animação (ms)\",\n },\n\n // =========================================================================\n // GRUPO: Performance\n // =========================================================================\n lazyLoad: {\n label: \"Lazy Loading\",\n inputType: \"checkbox\",\n group: \"Performance\",\n description: \"Carregar imagens sob demanda\",\n },\n showWarningAt: {\n label: \"Aviso de Performance\",\n inputType: \"number\",\n min: 20,\n max: 100,\n group: \"Performance\",\n description: \"Mostrar alerta após N imagens\",\n },\n },\n};\n\n// Register the block\ncomponentRegistry.register(imageGalleryBlock);\n\nexport default imageGalleryBlock;\n"],"names":["IMAGE_GALLERY_DEFAULT_PROPS","imageGalleryBlock","galleryVariations","componentRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"imageGallery.js","sources":["../../../../../src/engine/registry/blocks/sections/imageGallery.ts"],"sourcesContent":["import { BlockDefinition } from \"../../types\";\nimport { componentRegistry } from \"../../registry\";\nimport type { ImageGalleryBlock } from \"../../../schema/siteDocument\";\nimport { galleryVariations } from \"../../../presets/galleryVariations\";\n\n/**\n * Valores padrão do ImageGallery - Use para garantir consistência em templates e factories\n */\nexport const IMAGE_GALLERY_DEFAULT_PROPS: ImageGalleryBlock[\"props\"] = {\n // Conteúdo\n title: \"Nossa Galeria\",\n subtitle: \"Confira nossas imagens\",\n images: [\n {\n id: \"1\",\n src: \"https://placehold.co/800x600/3b82f6/ffffff?text=Image+1\",\n alt: \"Imagem de demonstração 1\",\n title: \"Projeto 1\",\n description: \"Descrição da primeira imagem\",\n },\n {\n id: \"2\",\n src: \"https://placehold.co/800x600/8b5cf6/ffffff?text=Image+2\",\n alt: \"Imagem de demonstração 2\",\n title: \"Projeto 2\",\n description: \"Descrição da segunda imagem\",\n },\n {\n id: \"3\",\n src: \"https://placehold.co/800x600/ec4899/ffffff?text=Image+3\",\n alt: \"Imagem de demonstração 3\",\n title: \"Projeto 3\",\n description: \"Descrição da terceira imagem\",\n },\n {\n id: \"4\",\n src: \"https://placehold.co/800x600/10b981/ffffff?text=Image+4\",\n alt: \"Imagem de demonstração 4\",\n title: \"Projeto 4\",\n description: \"Descrição da quarta imagem\",\n },\n ],\n\n // Layout\n variation: \"gallery-grid\",\n columns: 4,\n gap: 1,\n aspectRatio: \"auto\",\n\n // Aparência\n imageBorderRadius: 8,\n imageShadow: \"md\",\n\n // Animações\n enterAnimation: \"fade-scale\",\n hoverEffect: \"zoom-overlay\",\n hoverIntensity: 50,\n\n // Lightbox\n lightbox: {\n mode: \"adaptive\",\n showArrows: true,\n showThumbnails: true,\n showCounter: true,\n showCaption: true,\n enableZoom: true,\n enableDownload: false,\n enableAutoplay: false,\n autoplayInterval: 5,\n closeOnBackdropClick: true,\n closeOnEsc: true,\n enableKeyboard: true,\n enableTouchGestures: true,\n transitionDuration: 300,\n },\n\n // Performance\n lazyLoad: true,\n showWarningAt: 50,\n};\n\nexport const imageGalleryBlock: BlockDefinition<\"imageGallery\"> = {\n type: \"imageGallery\",\n name: \"Galeria de Imagens\",\n description: \"Galeria de imagens com lightbox profissional e zoom\",\n category: \"sections\",\n canHaveChildren: false,\n defaultProps: IMAGE_GALLERY_DEFAULT_PROPS,\n variations: Object.values(galleryVariations),\n\n inspectorMeta: {\n // =========================================================================\n // GRUPO: Conteúdo\n // =========================================================================\n title: {\n label: \"Título\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n subtitle: {\n label: \"Subtítulo\",\n inputType: \"text\",\n group: \"Conteúdo\",\n },\n // Note: \"images\" field is hidden because there's no modal UI for it yet.\n // Users add images via defaultProps or programmatically.\n // The gallery-images input type exists but shows confusing \"[object Object]...\" text.\n // Will be re-enabled when GalleryImagesInput modal component is implemented.\n\n // =========================================================================\n // GRUPO: Layout\n // =========================================================================\n variation: {\n label: \"Layout\",\n inputType: \"select\",\n options: [\n { value: \"gallery-grid\", label: \"Grid Clássico\" },\n { value: \"gallery-masonry\", label: \"Masonry (v1.1)\" },\n { value: \"gallery-featured\", label: \"Destaque (v1.2)\" },\n { value: \"gallery-carousel\", label: \"Carrossel (v1.3)\" },\n { value: \"gallery-alternating\", label: \"Alternado (v1.4)\" },\n ],\n group: \"Layout\",\n },\n columns: {\n label: \"Colunas\",\n inputType: \"number\",\n min: 2,\n max: 12,\n group: \"Layout\",\n description: \"Número de colunas no desktop (responsivo: 4→3→2→1)\",\n },\n gap: {\n label: \"Espaçamento (rem)\",\n inputType: \"number\",\n min: 0,\n max: 5,\n step: 0.5,\n group: \"Layout\",\n description: \"Espaçamento entre imagens (0 = sem espaço)\",\n },\n aspectRatio: {\n label: \"Proporção\",\n inputType: \"select\",\n options: [\n { value: \"auto\", label: \"Original\" },\n { value: \"1/1\", label: \"Quadrado (1:1)\" },\n { value: \"4/3\", label: \"Paisagem (4:3)\" },\n { value: \"16/9\", label: \"Widescreen (16:9)\" },\n { value: \"3/2\", label: \"Clássico (3:2)\" },\n ],\n group: \"Layout\",\n },\n\n // =========================================================================\n // GRUPO: Aparência\n // =========================================================================\n bg: {\n label: \"Cor de Fundo\",\n inputType: \"color\",\n group: \"Aparência\",\n },\n imageBorderRadius: {\n label: \"Borda Arredondada\",\n inputType: \"number\",\n min: 0,\n max: 32,\n group: \"Aparência\",\n description: \"Arredondamento das imagens (px)\",\n },\n imageShadow: {\n label: \"Sombra da Imagem\",\n inputType: \"select\",\n options: [\n { value: \"none\", label: \"Nenhuma\" },\n { value: \"sm\", label: \"Pequena\" },\n { value: \"md\", label: \"Média\" },\n { value: \"lg\", label: \"Grande\" },\n { value: \"xl\", label: \"Extra Grande\" },\n ],\n group: \"Aparência\",\n },\n\n // =========================================================================\n // GRUPO: Animações\n // =========================================================================\n enterAnimation: {\n label: \"Animação de Entrada\",\n inputType: \"select\",\n options: [\n { value: \"fade-scale\", label: \"Fade + Zoom\" },\n { value: \"stagger\", label: \"Cascata\" },\n { value: \"slide-up\", label: \"Desliza de Baixo\" },\n { value: \"none\", label: \"Sem animação\" },\n ],\n group: \"Animações\",\n },\n hoverEffect: {\n label: \"Efeito de Hover\",\n inputType: \"select\",\n options: [\n { value: \"zoom-overlay\", label: \"Zoom + Overlay\" },\n { value: \"glow\", label: \"Brilho\" },\n { value: \"scale\", label: \"Aumentar\" },\n { value: \"caption-reveal\", label: \"Revelar Legenda\" },\n { value: \"none\", label: \"Sem efeito\" },\n ],\n group: \"Animações\",\n },\n hoverIntensity: {\n label: \"Intensidade do Hover\",\n inputType: \"number\",\n min: 0,\n max: 100,\n group: \"Animações\",\n description: \"Intensidade do efeito (0-100%)\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Tema\n // =========================================================================\n \"lightbox.mode\": {\n label: \"Tema do Lightbox\",\n inputType: \"select\",\n options: [\n { value: \"adaptive\", label: \"Adaptável (Auto)\" },\n { value: \"dark\", label: \"Escuro\" },\n { value: \"light\", label: \"Claro\" },\n { value: \"theme\", label: \"Seguir Tema do Site\" },\n ],\n group: \"Lightbox - Tema\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Navegação\n // =========================================================================\n \"lightbox.showArrows\": {\n label: \"Mostrar Setas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showThumbnails\": {\n label: \"Mostrar Miniaturas\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n \"lightbox.showCounter\": {\n label: \"Mostrar Contador\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n description: 'Exibe \"3 de 12\"',\n },\n \"lightbox.showCaption\": {\n label: \"Mostrar Legenda\",\n inputType: \"checkbox\",\n group: \"Lightbox - Navegação\",\n },\n\n // =========================================================================\n // GRUPO: Lightbox - Funcionalidades\n // =========================================================================\n \"lightbox.enableZoom\": {\n label: \"Ativar Zoom\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableDownload\": {\n label: \"Ativar Download\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Permitir download de imagens (v1.1)\",\n },\n \"lightbox.enableAutoplay\": {\n label: \"Ativar Autoplay\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Reprodução automática (v1.3)\",\n },\n \"lightbox.autoplayInterval\": {\n label: \"Intervalo do Autoplay\",\n inputType: \"number\",\n min: 2,\n max: 10,\n group: \"Lightbox - Funcionalidades\",\n description: \"Intervalo em segundos\",\n },\n \"lightbox.closeOnBackdropClick\": {\n label: \"Fechar ao Clicar Fora\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.closeOnEsc\": {\n label: \"Fechar com ESC\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n },\n \"lightbox.enableKeyboard\": {\n label: \"Navegação por Teclado\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Arrows, +, -, 0\",\n },\n \"lightbox.enableTouchGestures\": {\n label: \"Gestos Touch\",\n inputType: \"checkbox\",\n group: \"Lightbox - Funcionalidades\",\n description: \"Swipe, pinch, double-tap\",\n },\n \"lightbox.transitionDuration\": {\n label: \"Duração da Transição\",\n inputType: \"number\",\n min: 100,\n max: 1000,\n step: 50,\n group: \"Lightbox - Funcionalidades\",\n description: \"Velocidade da animação (ms)\",\n },\n\n // =========================================================================\n // GRUPO: Performance\n // =========================================================================\n lazyLoad: {\n label: \"Lazy Loading\",\n inputType: \"checkbox\",\n group: \"Performance\",\n description: \"Carregar imagens sob demanda\",\n },\n showWarningAt: {\n label: \"Aviso de Performance\",\n inputType: \"number\",\n min: 20,\n max: 100,\n group: \"Performance\",\n description: \"Mostrar alerta após N imagens\",\n },\n },\n};\n\n// Register the block\ncomponentRegistry.register(imageGalleryBlock);\n\nexport default imageGalleryBlock;\n"],"names":["IMAGE_GALLERY_DEFAULT_PROPS","imageGalleryBlock","galleryVariations","componentRegistry"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brunoalz/smartgesti-site-editor",
3
- "version": "1.10.0",
3
+ "version": "1.10.1",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Site editor component for SmartGesti platform",