@brunoalz/smartgesti-site-editor 1.5.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/editor/LandingPageEditor.d.ts.map +1 -1
  2. package/dist/editor/LandingPageEditor.js +199 -185
  3. package/dist/editor/LandingPageEditor.js.map +1 -1
  4. package/dist/editor/PropertyEditor/VariationSelector.d.ts +1 -1
  5. package/dist/editor/PropertyEditor/VariationSelector.d.ts.map +1 -1
  6. package/dist/editor/PropertyEditor/VariationSelector.js +262 -93
  7. package/dist/editor/PropertyEditor/VariationSelector.js.map +1 -1
  8. package/dist/engine/export/exporters/layout/GridExporter.d.ts.map +1 -1
  9. package/dist/engine/export/exporters/layout/GridExporter.js +47 -31
  10. package/dist/engine/export/exporters/layout/GridExporter.js.map +1 -1
  11. package/dist/engine/export/exporters/layout/StackExporter.d.ts.map +1 -1
  12. package/dist/engine/export/exporters/layout/StackExporter.js +17 -16
  13. package/dist/engine/export/exporters/layout/StackExporter.js.map +1 -1
  14. package/dist/engine/export/exporters/sections/BlogPostExporters.d.ts.map +1 -1
  15. package/dist/engine/export/exporters/sections/BlogPostExporters.js +246 -186
  16. package/dist/engine/export/exporters/sections/BlogPostExporters.js.map +1 -1
  17. package/dist/engine/plugins/builtin/blog/manifest.d.ts.map +1 -1
  18. package/dist/engine/plugins/builtin/blog/manifest.js +65 -47
  19. package/dist/engine/plugins/builtin/blog/manifest.js.map +1 -1
  20. package/dist/engine/presets/blogVariations.d.ts +51 -0
  21. package/dist/engine/presets/blogVariations.d.ts.map +1 -0
  22. package/dist/engine/presets/blogVariations.js +267 -0
  23. package/dist/engine/presets/blogVariations.js.map +1 -0
  24. package/dist/engine/registry/blocks/layout/grid.d.ts.map +1 -1
  25. package/dist/engine/registry/blocks/layout/grid.js +84 -42
  26. package/dist/engine/registry/blocks/layout/grid.js.map +1 -1
  27. package/dist/engine/registry/blocks/layout/stack.d.ts.map +1 -1
  28. package/dist/engine/registry/blocks/layout/stack.js +14 -13
  29. package/dist/engine/registry/blocks/layout/stack.js.map +1 -1
  30. package/dist/engine/registry/blocks/sections/blogCategoryFilter.d.ts.map +1 -1
  31. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js +62 -5
  32. package/dist/engine/registry/blocks/sections/blogCategoryFilter.js.map +1 -1
  33. package/dist/engine/registry/blocks/sections/blogPostDetail.d.ts.map +1 -1
  34. package/dist/engine/registry/blocks/sections/blogPostDetail.js +16 -4
  35. package/dist/engine/registry/blocks/sections/blogPostDetail.js.map +1 -1
  36. package/dist/engine/registry/blocks/sections/blogRecentPosts.d.ts.map +1 -1
  37. package/dist/engine/registry/blocks/sections/blogRecentPosts.js +62 -5
  38. package/dist/engine/registry/blocks/sections/blogRecentPosts.js.map +1 -1
  39. package/dist/engine/registry/blocks/sections/blogSearchBar.d.ts.map +1 -1
  40. package/dist/engine/registry/blocks/sections/blogSearchBar.js +23 -1
  41. package/dist/engine/registry/blocks/sections/blogSearchBar.js.map +1 -1
  42. package/dist/engine/registry/blocks/sections/blogTagCloud.d.ts.map +1 -1
  43. package/dist/engine/registry/blocks/sections/blogTagCloud.js +63 -6
  44. package/dist/engine/registry/blocks/sections/blogTagCloud.js.map +1 -1
  45. package/dist/engine/render/renderers/layout/GridRenderer.d.ts.map +1 -1
  46. package/dist/engine/render/renderers/layout/GridRenderer.js +51 -18
  47. package/dist/engine/render/renderers/layout/GridRenderer.js.map +1 -1
  48. package/dist/engine/render/renderers/layout/StackRenderer.d.ts.map +1 -1
  49. package/dist/engine/render/renderers/layout/StackRenderer.js +30 -25
  50. package/dist/engine/render/renderers/layout/StackRenderer.js.map +1 -1
  51. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.d.ts.map +1 -1
  52. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js +157 -132
  53. package/dist/engine/render/renderers/sections/BlogCategoryFilterRenderer.js.map +1 -1
  54. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js +17 -17
  55. package/dist/engine/render/renderers/sections/BlogPostDetailRenderer.js.map +1 -1
  56. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.d.ts.map +1 -1
  57. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js +168 -136
  58. package/dist/engine/render/renderers/sections/BlogRecentPostsRenderer.js.map +1 -1
  59. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.d.ts.map +1 -1
  60. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js +59 -102
  61. package/dist/engine/render/renderers/sections/BlogSearchBarRenderer.js.map +1 -1
  62. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.d.ts.map +1 -1
  63. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js +158 -122
  64. package/dist/engine/render/renderers/sections/BlogTagCloudRenderer.js.map +1 -1
  65. package/dist/engine/schema/siteDocument.d.ts +57 -1
  66. package/dist/engine/schema/siteDocument.d.ts.map +1 -1
  67. package/dist/engine/schema/siteDocument.js.map +1 -1
  68. package/dist/engine/shared/hoverEffects/colorUtils.d.ts +2 -1
  69. package/dist/engine/shared/hoverEffects/colorUtils.d.ts.map +1 -1
  70. package/dist/engine/shared/hoverEffects/colorUtils.js +16 -12
  71. package/dist/engine/shared/hoverEffects/colorUtils.js.map +1 -1
  72. package/dist/engine/shared/widgetStyles.d.ts +9 -0
  73. package/dist/engine/shared/widgetStyles.d.ts.map +1 -0
  74. package/dist/engine/shared/widgetStyles.js +13 -0
  75. package/dist/engine/shared/widgetStyles.js.map +1 -0
  76. package/dist/index.d.ts +2 -0
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +84 -71
  79. package/dist/index.js.map +1 -1
  80. package/package.json +1 -1
@@ -1,12 +1,19 @@
1
- import { jsxs as c, jsx as t } from "react/jsx-runtime";
2
- import g from "react";
3
- import { cn as u } from "../../utils/cn.js";
4
- import { heroVariationIds as m, heroVariations as p } from "../../engine/presets/heroVariations.js";
5
- import { navbarVariationIds as v, navbarVariations as f } from "../../engine/presets/navbarVariations.js";
6
- function r(n, o) {
7
- return n[o] !== void 0 ? { [o]: n[o] } : {};
1
+ import { jsxs as v, jsx as t } from "react/jsx-runtime";
2
+ import p from "react";
3
+ import { cn as b } from "../../utils/cn.js";
4
+ import { heroVariationIds as f, heroVariations as y } from "../../engine/presets/heroVariations.js";
5
+ import { navbarVariationIds as h, navbarVariations as x } from "../../engine/presets/navbarVariations.js";
6
+ import { blogPostCardVariations as E, blogPostCardVariationIds as C, blogPostDetailVariations as P, blogPostDetailVariationIds as R, blogCategoryFilterVariations as T, blogCategoryFilterVariationIds as V, blogSearchBarVariations as I, blogSearchBarVariationIds as _, blogRecentPostsVariations as S, blogRecentPostsVariationIds as k, blogTagCloudVariations as w, blogTagCloudVariationIds as B } from "../../engine/presets/blogVariations.js";
7
+ function r(s, o) {
8
+ return s[o] !== void 0 ? { [o]: s[o] } : {};
8
9
  }
9
- const y = {
10
+ function A(s, o) {
11
+ const a = {};
12
+ for (const e of o)
13
+ s[e] !== void 0 && (a[e] = s[e]);
14
+ return a;
15
+ }
16
+ const G = {
10
17
  // Variant e variation
11
18
  variation: void 0,
12
19
  variant: "centered",
@@ -60,7 +67,7 @@ const y = {
60
67
  imageGridPreset: "four-equal",
61
68
  imageGridImages: [],
62
69
  imageGridGap: 8
63
- }, h = {
70
+ }, O = {
64
71
  variation: void 0,
65
72
  layout: "expanded",
66
73
  floating: !1,
@@ -91,93 +98,255 @@ const y = {
91
98
  buttonHoverIntensity: 50,
92
99
  buttonHoverOverlay: "none",
93
100
  buttonHoverIconName: "arrow-right"
94
- }, I = g.memo(function({ block: o, onUpdate: l }) {
95
- if (o.type === "hero") {
96
- const e = o.props, d = e.variation;
97
- return /* @__PURE__ */ c("div", { className: "space-y-2", children: [
98
- /* @__PURE__ */ t("h4", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide", children: "Variações" }),
99
- /* @__PURE__ */ t("div", { className: "grid grid-cols-2 gap-2", children: m.map((a) => {
100
- const i = p[a];
101
- return /* @__PURE__ */ t(
102
- "button",
103
- {
104
- type: "button",
105
- onClick: () => {
106
- const s = {
107
- // 1. RESET: Limpa todas as props visuais para evitar vazamento
108
- ...y,
109
- // 2. Aplica os defaults da nova variação
110
- ...i.defaultProps,
111
- // 3. Preserva APENAS o conteúdo editado pelo usuário
112
- ...r(e, "title"),
113
- ...r(e, "subtitle"),
114
- ...r(e, "description"),
115
- ...r(e, "badge"),
116
- ...r(e, "primaryButton"),
117
- ...r(e, "secondaryButton"),
118
- ...r(e, "image"),
119
- // 4. Preserva configuração da Image Grid
120
- ...r(e, "imageGridEnabled"),
121
- ...r(e, "imageGridPreset"),
122
- ...r(e, "imageGridImages"),
123
- ...r(e, "imageGridGap"),
124
- // 5. Preserva configuração do Carousel
125
- ...r(e, "carouselImages"),
126
- ...r(e, "carouselInterval"),
127
- ...r(e, "carouselTransition")
128
- };
129
- l(s);
130
- },
131
- className: u(
132
- "flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all",
133
- d === a ? "border-blue-500 bg-blue-50 dark:bg-blue-900/20" : "border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700"
134
- ),
135
- children: /* @__PURE__ */ t("span", { className: "text-xs font-medium text-gray-800 dark:text-gray-100", children: i.name })
101
+ }, N = {
102
+ variation: void 0,
103
+ variant: "default",
104
+ showImage: !0,
105
+ showCategory: !0,
106
+ showDate: !0,
107
+ showAuthor: !1,
108
+ showReadingTime: !1
109
+ }, H = {
110
+ variation: void 0,
111
+ authorVariant: "inline",
112
+ showFeaturedImage: !0,
113
+ showAuthor: !0,
114
+ showDate: !0,
115
+ showTags: !0,
116
+ showReadingTime: !0,
117
+ contentMaxWidth: "720px"
118
+ }, g = {
119
+ variation: void 0,
120
+ variant: void 0,
121
+ borderRadius: "0.75rem",
122
+ shadow: "none",
123
+ showCount: !0,
124
+ showAll: !0,
125
+ showThumbnail: !0,
126
+ showDate: !0,
127
+ showCategory: !1,
128
+ showIcon: !0,
129
+ filterCategories: !1,
130
+ filterTags: !1,
131
+ filterDate: !1,
132
+ // Hover effects
133
+ linkColor: void 0,
134
+ linkHoverColor: void 0,
135
+ linkHoverEffect: "background",
136
+ linkHoverIntensity: 50
137
+ }, L = [
138
+ "title",
139
+ "excerpt",
140
+ "image",
141
+ "date",
142
+ "category",
143
+ "authorName",
144
+ "authorAvatar",
145
+ "readingTime",
146
+ "linkHref",
147
+ "linkText"
148
+ ], D = [
149
+ "title",
150
+ "content",
151
+ "featuredImage",
152
+ "date",
153
+ "category",
154
+ "readingTime",
155
+ "tags",
156
+ "authorName",
157
+ "authorAvatar",
158
+ "authorBio"
159
+ ], F = [
160
+ "title",
161
+ "categories",
162
+ "activeCategory",
163
+ "allLabel",
164
+ "filterUrl"
165
+ ], K = [
166
+ "placeholder",
167
+ "searchUrl"
168
+ ], W = [
169
+ "title",
170
+ "count",
171
+ "posts"
172
+ ], z = [
173
+ "title",
174
+ "tags"
175
+ ];
176
+ function u({
177
+ variationIds: s,
178
+ variations: o,
179
+ currentVariation: a,
180
+ resetProps: e,
181
+ preserveKeys: i,
182
+ props: n,
183
+ onUpdate: l
184
+ }) {
185
+ return /* @__PURE__ */ v("div", { className: "space-y-2", children: [
186
+ /* @__PURE__ */ t("h4", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide", children: "Variações" }),
187
+ /* @__PURE__ */ t("div", { className: "grid grid-cols-2 gap-2", children: s.map((c) => {
188
+ const d = o[c];
189
+ return /* @__PURE__ */ t(
190
+ "button",
191
+ {
192
+ type: "button",
193
+ onClick: () => {
194
+ const m = {
195
+ ...e,
196
+ ...d.defaultProps,
197
+ ...A(n, i)
198
+ };
199
+ l(m);
200
+ },
201
+ className: b(
202
+ "flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all",
203
+ a === c ? "border-blue-500 bg-blue-50 dark:bg-blue-900/20" : "border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700"
204
+ ),
205
+ children: /* @__PURE__ */ t("span", { className: "text-xs font-medium text-gray-800 dark:text-gray-100", children: d.name })
206
+ },
207
+ c
208
+ );
209
+ }) })
210
+ ] });
211
+ }
212
+ const X = p.memo(function({ block: o, onUpdate: a }) {
213
+ const e = o.props, i = e.variation;
214
+ return o.type === "hero" ? /* @__PURE__ */ v("div", { className: "space-y-2", children: [
215
+ /* @__PURE__ */ t("h4", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide", children: "Variações" }),
216
+ /* @__PURE__ */ t("div", { className: "grid grid-cols-2 gap-2", children: f.map((n) => {
217
+ const l = y[n];
218
+ return /* @__PURE__ */ t(
219
+ "button",
220
+ {
221
+ type: "button",
222
+ onClick: () => {
223
+ const d = {
224
+ ...G,
225
+ ...l.defaultProps,
226
+ ...r(e, "title"),
227
+ ...r(e, "subtitle"),
228
+ ...r(e, "description"),
229
+ ...r(e, "badge"),
230
+ ...r(e, "primaryButton"),
231
+ ...r(e, "secondaryButton"),
232
+ ...r(e, "image"),
233
+ ...r(e, "imageGridEnabled"),
234
+ ...r(e, "imageGridPreset"),
235
+ ...r(e, "imageGridImages"),
236
+ ...r(e, "imageGridGap"),
237
+ ...r(e, "carouselImages"),
238
+ ...r(e, "carouselInterval"),
239
+ ...r(e, "carouselTransition")
240
+ };
241
+ a(d);
136
242
  },
137
- a
138
- );
139
- }) })
140
- ] });
141
- }
142
- if (o.type === "navbar") {
143
- const e = o.props, d = e.variation;
144
- return /* @__PURE__ */ c("div", { className: "space-y-2", children: [
145
- /* @__PURE__ */ t("h4", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide", children: "Variações" }),
146
- /* @__PURE__ */ t("div", { className: "grid grid-cols-2 gap-2", children: v.map((a) => {
147
- const i = f[a];
148
- return /* @__PURE__ */ t(
149
- "button",
150
- {
151
- type: "button",
152
- onClick: () => {
153
- const s = {
154
- // 1. RESET: Limpa todas as props visuais para evitar vazamento
155
- ...h,
156
- // 2. Aplica os defaults da nova variação
157
- ...i.defaultProps,
158
- // 3. Preserva APENAS o conteúdo editado pelo usuário
159
- ...r(e, "logo"),
160
- ...r(e, "logoText"),
161
- ...r(e, "logoHeight"),
162
- ...r(e, "links"),
163
- ...r(e, "ctaButton")
164
- };
165
- l(s);
166
- },
167
- className: u(
168
- "flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all",
169
- d === a ? "border-blue-500 bg-blue-50 dark:bg-blue-900/20" : "border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700"
170
- ),
171
- children: /* @__PURE__ */ t("span", { className: "text-xs font-medium text-gray-800 dark:text-gray-100", children: i.name })
243
+ className: b(
244
+ "flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all",
245
+ i === n ? "border-blue-500 bg-blue-50 dark:bg-blue-900/20" : "border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700"
246
+ ),
247
+ children: /* @__PURE__ */ t("span", { className: "text-xs font-medium text-gray-800 dark:text-gray-100", children: l.name })
248
+ },
249
+ n
250
+ );
251
+ }) })
252
+ ] }) : o.type === "navbar" ? /* @__PURE__ */ v("div", { className: "space-y-2", children: [
253
+ /* @__PURE__ */ t("h4", { className: "text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide", children: "Variações" }),
254
+ /* @__PURE__ */ t("div", { className: "grid grid-cols-2 gap-2", children: h.map((n) => {
255
+ const l = x[n];
256
+ return /* @__PURE__ */ t(
257
+ "button",
258
+ {
259
+ type: "button",
260
+ onClick: () => {
261
+ const d = {
262
+ ...O,
263
+ ...l.defaultProps,
264
+ ...r(e, "logo"),
265
+ ...r(e, "logoText"),
266
+ ...r(e, "logoHeight"),
267
+ ...r(e, "links"),
268
+ ...r(e, "ctaButton")
269
+ };
270
+ a(d);
172
271
  },
173
- a
174
- );
175
- }) })
176
- ] });
177
- }
178
- return null;
272
+ className: b(
273
+ "flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all",
274
+ i === n ? "border-blue-500 bg-blue-50 dark:bg-blue-900/20" : "border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700"
275
+ ),
276
+ children: /* @__PURE__ */ t("span", { className: "text-xs font-medium text-gray-800 dark:text-gray-100", children: l.name })
277
+ },
278
+ n
279
+ );
280
+ }) })
281
+ ] }) : o.type === "blogPostCard" ? /* @__PURE__ */ t(
282
+ u,
283
+ {
284
+ variationIds: C,
285
+ variations: E,
286
+ currentVariation: i,
287
+ resetProps: N,
288
+ preserveKeys: L,
289
+ props: e,
290
+ onUpdate: a
291
+ }
292
+ ) : o.type === "blogPostDetail" ? /* @__PURE__ */ t(
293
+ u,
294
+ {
295
+ variationIds: R,
296
+ variations: P,
297
+ currentVariation: i,
298
+ resetProps: H,
299
+ preserveKeys: D,
300
+ props: e,
301
+ onUpdate: a
302
+ }
303
+ ) : o.type === "blogCategoryFilter" ? /* @__PURE__ */ t(
304
+ u,
305
+ {
306
+ variationIds: V,
307
+ variations: T,
308
+ currentVariation: i,
309
+ resetProps: g,
310
+ preserveKeys: F,
311
+ props: e,
312
+ onUpdate: a
313
+ }
314
+ ) : o.type === "blogSearchBar" ? /* @__PURE__ */ t(
315
+ u,
316
+ {
317
+ variationIds: _,
318
+ variations: I,
319
+ currentVariation: i,
320
+ resetProps: g,
321
+ preserveKeys: K,
322
+ props: e,
323
+ onUpdate: a
324
+ }
325
+ ) : o.type === "blogRecentPosts" ? /* @__PURE__ */ t(
326
+ u,
327
+ {
328
+ variationIds: k,
329
+ variations: S,
330
+ currentVariation: i,
331
+ resetProps: g,
332
+ preserveKeys: W,
333
+ props: e,
334
+ onUpdate: a
335
+ }
336
+ ) : o.type === "blogTagCloud" ? /* @__PURE__ */ t(
337
+ u,
338
+ {
339
+ variationIds: B,
340
+ variations: w,
341
+ currentVariation: i,
342
+ resetProps: g,
343
+ preserveKeys: z,
344
+ props: e,
345
+ onUpdate: a
346
+ }
347
+ ) : null;
179
348
  });
180
349
  export {
181
- I as VariationSelector
350
+ X as VariationSelector
182
351
  };
183
352
  //# sourceMappingURL=VariationSelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VariationSelector.js","sources":["../../../src/editor/PropertyEditor/VariationSelector.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Block } from \"../../engine\";\nimport {\n heroVariations,\n heroVariationIds,\n} from \"../../engine/presets/heroVariations\";\nimport {\n navbarVariations,\n navbarVariationIds,\n} from \"../../engine/presets/navbarVariations\";\n\ninterface VariationSelectorProps {\n block: Block;\n onUpdate: (updates: Record<string, any>) => void;\n}\n\n/**\n * Helper para preservar um valor se ele existir (não undefined)\n */\nfunction preserveIfDefined(obj: Record<string, any>, key: string): Record<string, any> {\n return obj[key] !== undefined ? { [key]: obj[key] } : {};\n}\n\n/**\n * Props visuais do Hero que DEVEM ser resetadas ao trocar de variação\n * para evitar \"vazamento\" de estilos entre variações\n */\nconst HERO_VISUAL_PROPS_TO_RESET: Record<string, any> = {\n // Variant e variation\n variation: undefined,\n variant: \"centered\",\n // Layout\n align: \"center\",\n contentPosition: \"center\",\n contentSpacing: \"default\",\n blockGap: \"default\",\n minHeight: \"70vh\",\n contentMaxWidth: \"700px\",\n paddingY: undefined,\n // Background & Overlay\n background: undefined,\n overlay: false,\n overlayColor: undefined,\n // Typography colors (legacy)\n titleColor: undefined,\n subtitleColor: undefined,\n descriptionColor: undefined,\n // Typography config (novo sistema)\n titleTypography: undefined,\n subtitleTypography: undefined,\n descriptionTypography: undefined,\n // Badge styling\n badgeColor: undefined,\n badgeTextColor: undefined,\n // Image styling\n imageRadius: 16,\n imageShadow: \"lg\",\n imagePosition: \"right\",\n // Button styling\n buttonSize: \"md\",\n primaryButtonVariant: \"solid\",\n primaryButtonColor: undefined,\n primaryButtonTextColor: undefined,\n primaryButtonRadius: 8,\n secondaryButtonVariant: \"outline\",\n secondaryButtonColor: undefined,\n secondaryButtonTextColor: undefined,\n secondaryButtonRadius: 8,\n // Button hover\n buttonHoverEffect: \"scale\",\n buttonHoverIntensity: 50,\n buttonHoverOverlay: \"none\",\n buttonHoverIconName: \"arrow-right\",\n // Decorative\n showWave: false,\n waveColor: \"rgba(255,255,255,0.1)\",\n // Image Grid\n imageGridEnabled: false,\n imageGridPreset: \"four-equal\",\n imageGridImages: [],\n imageGridGap: 8,\n};\n\n/**\n * Props visuais da Navbar que DEVEM ser resetadas ao trocar de variação\n */\nconst NAVBAR_VISUAL_PROPS_TO_RESET: Record<string, any> = {\n variation: undefined,\n layout: \"expanded\",\n floating: false,\n sticky: true,\n // Aparência\n bg: \"#ffffff\",\n opacity: 100,\n blurOpacity: 0,\n borderRadius: 0,\n shadow: \"sm\",\n // Borda\n borderPosition: \"none\",\n borderWidth: 1,\n borderColor: \"#e5e7eb\",\n // Links\n linkColor: \"#374151\",\n linkHoverColor: \"#2563eb\",\n linkFontSize: \"md\",\n linkHoverEffect: \"background\",\n linkHoverIntensity: 50,\n // Botão\n buttonVariant: \"solid\",\n buttonColor: \"#2563eb\",\n buttonTextColor: \"#ffffff\",\n buttonBorderRadius: 8,\n buttonSize: \"md\",\n buttonHoverEffect: \"darken\",\n buttonHoverIntensity: 50,\n buttonHoverOverlay: \"none\",\n buttonHoverIconName: \"arrow-right\",\n};\n\n/**\n * Componente para selecionar variações de Hero e Navbar\n * Preserva props customizadas ao trocar variação\n */\nexport const VariationSelector = React.memo(function VariationSelector({ block, onUpdate }: VariationSelectorProps) {\n // Hero variations\n if (block.type === \"hero\") {\n const props = block.props as Record<string, any>;\n const currentVariation = props.variation;\n\n return (\n <div className=\"space-y-2\">\n <h4 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide\">\n Variações\n </h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {heroVariationIds.map((id) => {\n const v = heroVariations[id];\n const isActive = currentVariation === id;\n return (\n <button\n key={id}\n type=\"button\"\n onClick={() => {\n // IMPORTANTE: Ao trocar variação:\n // 1. Primeiro RESETA todas as props visuais para valores padrão\n // 2. Depois aplica os defaults da nova variação\n // 3. Por fim preserva o conteúdo do usuário\n\n const newProps = {\n // 1. RESET: Limpa todas as props visuais para evitar vazamento\n ...HERO_VISUAL_PROPS_TO_RESET,\n\n // 2. Aplica os defaults da nova variação\n ...v.defaultProps,\n\n // 3. Preserva APENAS o conteúdo editado pelo usuário\n ...preserveIfDefined(props, \"title\"),\n ...preserveIfDefined(props, \"subtitle\"),\n ...preserveIfDefined(props, \"description\"),\n ...preserveIfDefined(props, \"badge\"),\n ...preserveIfDefined(props, \"primaryButton\"),\n ...preserveIfDefined(props, \"secondaryButton\"),\n ...preserveIfDefined(props, \"image\"),\n\n // 4. Preserva configuração da Image Grid\n ...preserveIfDefined(props, \"imageGridEnabled\"),\n ...preserveIfDefined(props, \"imageGridPreset\"),\n ...preserveIfDefined(props, \"imageGridImages\"),\n ...preserveIfDefined(props, \"imageGridGap\"),\n\n // 5. Preserva configuração do Carousel\n ...preserveIfDefined(props, \"carouselImages\"),\n ...preserveIfDefined(props, \"carouselInterval\"),\n ...preserveIfDefined(props, \"carouselTransition\"),\n };\n\n onUpdate(newProps);\n }}\n className={cn(\n \"flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all\",\n isActive\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\n : \"border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700\",\n )}\n >\n <span className=\"text-xs font-medium text-gray-800 dark:text-gray-100\">\n {v.name}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n // Navbar variations\n if (block.type === \"navbar\") {\n const props = block.props as Record<string, any>;\n const currentVariation = props.variation;\n\n return (\n <div className=\"space-y-2\">\n <h4 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide\">\n Variações\n </h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {navbarVariationIds.map((id) => {\n const v = navbarVariations[id];\n const isActive = currentVariation === id;\n return (\n <button\n key={id}\n type=\"button\"\n onClick={() => {\n // IMPORTANTE: Ao trocar variação:\n // 1. Primeiro RESETA todas as props visuais para valores padrão\n // 2. Depois aplica os defaults da nova variação\n // 3. Por fim preserva o conteúdo do usuário\n\n const newProps = {\n // 1. RESET: Limpa todas as props visuais para evitar vazamento\n ...NAVBAR_VISUAL_PROPS_TO_RESET,\n\n // 2. Aplica os defaults da nova variação\n ...v.defaultProps,\n\n // 3. Preserva APENAS o conteúdo editado pelo usuário\n ...preserveIfDefined(props, \"logo\"),\n ...preserveIfDefined(props, \"logoText\"),\n ...preserveIfDefined(props, \"logoHeight\"),\n ...preserveIfDefined(props, \"links\"),\n ...preserveIfDefined(props, \"ctaButton\"),\n };\n\n onUpdate(newProps);\n }}\n className={cn(\n \"flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all\",\n isActive\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\n : \"border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700\",\n )}\n >\n <span className=\"text-xs font-medium text-gray-800 dark:text-gray-100\">\n {v.name}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n return null;\n});\n"],"names":["preserveIfDefined","obj","key","HERO_VISUAL_PROPS_TO_RESET","NAVBAR_VISUAL_PROPS_TO_RESET","VariationSelector","React","block","onUpdate","props","currentVariation","jsxs","jsx","heroVariationIds","id","v","heroVariations","newProps","cn","navbarVariationIds","navbarVariations"],"mappings":"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"}
1
+ {"version":3,"file":"VariationSelector.js","sources":["../../../src/editor/PropertyEditor/VariationSelector.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn } from \"../../utils/cn\";\nimport { Block } from \"../../engine\";\nimport {\n heroVariations,\n heroVariationIds,\n} from \"../../engine/presets/heroVariations\";\nimport {\n navbarVariations,\n navbarVariationIds,\n} from \"../../engine/presets/navbarVariations\";\nimport {\n blogPostCardVariations,\n blogPostCardVariationIds,\n blogPostDetailVariations,\n blogPostDetailVariationIds,\n blogCategoryFilterVariations,\n blogCategoryFilterVariationIds,\n blogSearchBarVariations,\n blogSearchBarVariationIds,\n blogRecentPostsVariations,\n blogRecentPostsVariationIds,\n blogTagCloudVariations,\n blogTagCloudVariationIds,\n} from \"../../engine/presets/blogVariations\";\n\ninterface VariationSelectorProps {\n block: Block;\n onUpdate: (updates: Record<string, any>) => void;\n}\n\n/**\n * Helper para preservar um valor se ele existir (não undefined)\n */\nfunction preserveIfDefined(obj: Record<string, any>, key: string): Record<string, any> {\n return obj[key] !== undefined ? { [key]: obj[key] } : {};\n}\n\n/**\n * Preserva múltiplas props de uma vez\n */\nfunction preserveMany(obj: Record<string, any>, keys: string[]): Record<string, any> {\n const result: Record<string, any> = {};\n for (const key of keys) {\n if (obj[key] !== undefined) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Props visuais do Hero que DEVEM ser resetadas ao trocar de variação\n * para evitar \"vazamento\" de estilos entre variações\n */\nconst HERO_VISUAL_PROPS_TO_RESET: Record<string, any> = {\n // Variant e variation\n variation: undefined,\n variant: \"centered\",\n // Layout\n align: \"center\",\n contentPosition: \"center\",\n contentSpacing: \"default\",\n blockGap: \"default\",\n minHeight: \"70vh\",\n contentMaxWidth: \"700px\",\n paddingY: undefined,\n // Background & Overlay\n background: undefined,\n overlay: false,\n overlayColor: undefined,\n // Typography colors (legacy)\n titleColor: undefined,\n subtitleColor: undefined,\n descriptionColor: undefined,\n // Typography config (novo sistema)\n titleTypography: undefined,\n subtitleTypography: undefined,\n descriptionTypography: undefined,\n // Badge styling\n badgeColor: undefined,\n badgeTextColor: undefined,\n // Image styling\n imageRadius: 16,\n imageShadow: \"lg\",\n imagePosition: \"right\",\n // Button styling\n buttonSize: \"md\",\n primaryButtonVariant: \"solid\",\n primaryButtonColor: undefined,\n primaryButtonTextColor: undefined,\n primaryButtonRadius: 8,\n secondaryButtonVariant: \"outline\",\n secondaryButtonColor: undefined,\n secondaryButtonTextColor: undefined,\n secondaryButtonRadius: 8,\n // Button hover\n buttonHoverEffect: \"scale\",\n buttonHoverIntensity: 50,\n buttonHoverOverlay: \"none\",\n buttonHoverIconName: \"arrow-right\",\n // Decorative\n showWave: false,\n waveColor: \"rgba(255,255,255,0.1)\",\n // Image Grid\n imageGridEnabled: false,\n imageGridPreset: \"four-equal\",\n imageGridImages: [],\n imageGridGap: 8,\n};\n\n/**\n * Props visuais da Navbar que DEVEM ser resetadas ao trocar de variação\n */\nconst NAVBAR_VISUAL_PROPS_TO_RESET: Record<string, any> = {\n variation: undefined,\n layout: \"expanded\",\n floating: false,\n sticky: true,\n // Aparência\n bg: \"#ffffff\",\n opacity: 100,\n blurOpacity: 0,\n borderRadius: 0,\n shadow: \"sm\",\n // Borda\n borderPosition: \"none\",\n borderWidth: 1,\n borderColor: \"#e5e7eb\",\n // Links\n linkColor: \"#374151\",\n linkHoverColor: \"#2563eb\",\n linkFontSize: \"md\",\n linkHoverEffect: \"background\",\n linkHoverIntensity: 50,\n // Botão\n buttonVariant: \"solid\",\n buttonColor: \"#2563eb\",\n buttonTextColor: \"#ffffff\",\n buttonBorderRadius: 8,\n buttonSize: \"md\",\n buttonHoverEffect: \"darken\",\n buttonHoverIntensity: 50,\n buttonHoverOverlay: \"none\",\n buttonHoverIconName: \"arrow-right\",\n};\n\n// ---------------------------------------------------------------------------\n// Blog visual props to reset\n// ---------------------------------------------------------------------------\n\nconst BLOG_POST_CARD_VISUAL_RESET: Record<string, any> = {\n variation: undefined,\n variant: \"default\",\n showImage: true,\n showCategory: true,\n showDate: true,\n showAuthor: false,\n showReadingTime: false,\n};\n\nconst BLOG_POST_DETAIL_VISUAL_RESET: Record<string, any> = {\n variation: undefined,\n authorVariant: \"inline\",\n showFeaturedImage: true,\n showAuthor: true,\n showDate: true,\n showTags: true,\n showReadingTime: true,\n contentMaxWidth: \"720px\",\n};\n\nconst BLOG_WIDGET_VISUAL_RESET: Record<string, any> = {\n variation: undefined,\n variant: undefined,\n borderRadius: \"0.75rem\",\n shadow: \"none\",\n showCount: true,\n showAll: true,\n showThumbnail: true,\n showDate: true,\n showCategory: false,\n showIcon: true,\n filterCategories: false,\n filterTags: false,\n filterDate: false,\n // Hover effects\n linkColor: undefined,\n linkHoverColor: undefined,\n linkHoverEffect: \"background\",\n linkHoverIntensity: 50,\n};\n\n// ---------------------------------------------------------------------------\n// User-content fields to preserve (per block type)\n// ---------------------------------------------------------------------------\n\nconst BLOG_POST_CARD_PRESERVE = [\n \"title\", \"excerpt\", \"image\", \"date\", \"category\",\n \"authorName\", \"authorAvatar\", \"readingTime\",\n \"linkHref\", \"linkText\",\n];\n\nconst BLOG_POST_DETAIL_PRESERVE = [\n \"title\", \"content\", \"featuredImage\", \"date\", \"category\",\n \"readingTime\", \"tags\", \"authorName\", \"authorAvatar\", \"authorBio\",\n];\n\nconst BLOG_CATEGORY_FILTER_PRESERVE = [\n \"title\", \"categories\", \"activeCategory\", \"allLabel\", \"filterUrl\",\n];\n\nconst BLOG_SEARCH_BAR_PRESERVE = [\n \"placeholder\", \"searchUrl\",\n];\n\nconst BLOG_RECENT_POSTS_PRESERVE = [\n \"title\", \"count\", \"posts\",\n];\n\nconst BLOG_TAG_CLOUD_PRESERVE = [\n \"title\", \"tags\",\n];\n\n// ---------------------------------------------------------------------------\n// Generic variation grid renderer\n// ---------------------------------------------------------------------------\n\nfunction VariationGrid({\n variationIds,\n variations,\n currentVariation,\n resetProps,\n preserveKeys,\n props,\n onUpdate,\n}: {\n variationIds: string[];\n variations: Record<string, { id: string; name: string; defaultProps: Record<string, any> }>;\n currentVariation: string | undefined;\n resetProps: Record<string, any>;\n preserveKeys: string[];\n props: Record<string, any>;\n onUpdate: (updates: Record<string, any>) => void;\n}) {\n return (\n <div className=\"space-y-2\">\n <h4 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide\">\n Variações\n </h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {variationIds.map((id) => {\n const v = variations[id];\n const isActive = currentVariation === id;\n return (\n <button\n key={id}\n type=\"button\"\n onClick={() => {\n const newProps = {\n ...resetProps,\n ...v.defaultProps,\n ...preserveMany(props, preserveKeys),\n };\n onUpdate(newProps);\n }}\n className={cn(\n \"flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all\",\n isActive\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\n : \"border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700\",\n )}\n >\n <span className=\"text-xs font-medium text-gray-800 dark:text-gray-100\">\n {v.name}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\n/**\n * Componente para selecionar variações de blocos\n * Preserva props customizadas ao trocar variação\n */\nexport const VariationSelector = React.memo(function VariationSelector({ block, onUpdate }: VariationSelectorProps) {\n const props = block.props as Record<string, any>;\n const currentVariation = props.variation;\n\n // Hero variations\n if (block.type === \"hero\") {\n return (\n <div className=\"space-y-2\">\n <h4 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide\">\n Variações\n </h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {heroVariationIds.map((id) => {\n const v = heroVariations[id];\n const isActive = currentVariation === id;\n return (\n <button\n key={id}\n type=\"button\"\n onClick={() => {\n const newProps = {\n ...HERO_VISUAL_PROPS_TO_RESET,\n ...v.defaultProps,\n ...preserveIfDefined(props, \"title\"),\n ...preserveIfDefined(props, \"subtitle\"),\n ...preserveIfDefined(props, \"description\"),\n ...preserveIfDefined(props, \"badge\"),\n ...preserveIfDefined(props, \"primaryButton\"),\n ...preserveIfDefined(props, \"secondaryButton\"),\n ...preserveIfDefined(props, \"image\"),\n ...preserveIfDefined(props, \"imageGridEnabled\"),\n ...preserveIfDefined(props, \"imageGridPreset\"),\n ...preserveIfDefined(props, \"imageGridImages\"),\n ...preserveIfDefined(props, \"imageGridGap\"),\n ...preserveIfDefined(props, \"carouselImages\"),\n ...preserveIfDefined(props, \"carouselInterval\"),\n ...preserveIfDefined(props, \"carouselTransition\"),\n };\n onUpdate(newProps);\n }}\n className={cn(\n \"flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all\",\n isActive\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\n : \"border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700\",\n )}\n >\n <span className=\"text-xs font-medium text-gray-800 dark:text-gray-100\">\n {v.name}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n // Navbar variations\n if (block.type === \"navbar\") {\n return (\n <div className=\"space-y-2\">\n <h4 className=\"text-xs font-semibold text-gray-600 dark:text-gray-400 uppercase tracking-wide\">\n Variações\n </h4>\n <div className=\"grid grid-cols-2 gap-2\">\n {navbarVariationIds.map((id) => {\n const v = navbarVariations[id];\n const isActive = currentVariation === id;\n return (\n <button\n key={id}\n type=\"button\"\n onClick={() => {\n const newProps = {\n ...NAVBAR_VISUAL_PROPS_TO_RESET,\n ...v.defaultProps,\n ...preserveIfDefined(props, \"logo\"),\n ...preserveIfDefined(props, \"logoText\"),\n ...preserveIfDefined(props, \"logoHeight\"),\n ...preserveIfDefined(props, \"links\"),\n ...preserveIfDefined(props, \"ctaButton\"),\n };\n onUpdate(newProps);\n }}\n className={cn(\n \"flex items-center gap-2 p-2 rounded-lg border-2 text-left transition-all\",\n isActive\n ? \"border-blue-500 bg-blue-50 dark:bg-blue-900/20\"\n : \"border-gray-200 dark:border-gray-600 hover:border-blue-300 dark:hover:border-blue-700\",\n )}\n >\n <span className=\"text-xs font-medium text-gray-800 dark:text-gray-100\">\n {v.name}\n </span>\n </button>\n );\n })}\n </div>\n </div>\n );\n }\n\n // Blog Post Card variations\n if (block.type === \"blogPostCard\") {\n return (\n <VariationGrid\n variationIds={blogPostCardVariationIds}\n variations={blogPostCardVariations}\n currentVariation={currentVariation}\n resetProps={BLOG_POST_CARD_VISUAL_RESET}\n preserveKeys={BLOG_POST_CARD_PRESERVE}\n props={props}\n onUpdate={onUpdate}\n />\n );\n }\n\n // Blog Post Detail variations\n if (block.type === \"blogPostDetail\") {\n return (\n <VariationGrid\n variationIds={blogPostDetailVariationIds}\n variations={blogPostDetailVariations}\n currentVariation={currentVariation}\n resetProps={BLOG_POST_DETAIL_VISUAL_RESET}\n preserveKeys={BLOG_POST_DETAIL_PRESERVE}\n props={props}\n onUpdate={onUpdate}\n />\n );\n }\n\n // Blog Category Filter variations\n if (block.type === \"blogCategoryFilter\") {\n return (\n <VariationGrid\n variationIds={blogCategoryFilterVariationIds}\n variations={blogCategoryFilterVariations}\n currentVariation={currentVariation}\n resetProps={BLOG_WIDGET_VISUAL_RESET}\n preserveKeys={BLOG_CATEGORY_FILTER_PRESERVE}\n props={props}\n onUpdate={onUpdate}\n />\n );\n }\n\n // Blog Search Bar variations\n if (block.type === \"blogSearchBar\") {\n return (\n <VariationGrid\n variationIds={blogSearchBarVariationIds}\n variations={blogSearchBarVariations}\n currentVariation={currentVariation}\n resetProps={BLOG_WIDGET_VISUAL_RESET}\n preserveKeys={BLOG_SEARCH_BAR_PRESERVE}\n props={props}\n onUpdate={onUpdate}\n />\n );\n }\n\n // Blog Recent Posts variations\n if (block.type === \"blogRecentPosts\") {\n return (\n <VariationGrid\n variationIds={blogRecentPostsVariationIds}\n variations={blogRecentPostsVariations}\n currentVariation={currentVariation}\n resetProps={BLOG_WIDGET_VISUAL_RESET}\n preserveKeys={BLOG_RECENT_POSTS_PRESERVE}\n props={props}\n onUpdate={onUpdate}\n />\n );\n }\n\n // Blog Tag Cloud variations\n if (block.type === \"blogTagCloud\") {\n return (\n <VariationGrid\n variationIds={blogTagCloudVariationIds}\n variations={blogTagCloudVariations}\n currentVariation={currentVariation}\n resetProps={BLOG_WIDGET_VISUAL_RESET}\n preserveKeys={BLOG_TAG_CLOUD_PRESERVE}\n props={props}\n onUpdate={onUpdate}\n />\n );\n }\n\n return null;\n});\n"],"names":["preserveIfDefined","obj","key","preserveMany","keys","result","HERO_VISUAL_PROPS_TO_RESET","NAVBAR_VISUAL_PROPS_TO_RESET","BLOG_POST_CARD_VISUAL_RESET","BLOG_POST_DETAIL_VISUAL_RESET","BLOG_WIDGET_VISUAL_RESET","BLOG_POST_CARD_PRESERVE","BLOG_POST_DETAIL_PRESERVE","BLOG_CATEGORY_FILTER_PRESERVE","BLOG_SEARCH_BAR_PRESERVE","BLOG_RECENT_POSTS_PRESERVE","BLOG_TAG_CLOUD_PRESERVE","VariationGrid","variationIds","variations","currentVariation","resetProps","preserveKeys","props","onUpdate","jsxs","jsx","id","v","newProps","cn","VariationSelector","React","block","heroVariationIds","heroVariations","navbarVariationIds","navbarVariations","blogPostCardVariationIds","blogPostCardVariations","blogPostDetailVariationIds","blogPostDetailVariations","blogCategoryFilterVariationIds","blogCategoryFilterVariations","blogSearchBarVariationIds","blogSearchBarVariations","blogRecentPostsVariationIds","blogRecentPostsVariations","blogTagCloudVariationIds","blogTagCloudVariations"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GridExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAS1D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAuER"}
1
+ {"version":3,"file":"GridExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAS1D,wBAAgB,UAAU,CACxB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CA6GR"}
@@ -1,37 +1,53 @@
1
- import { dataBlockIdAttr as h } from "../../shared/htmlHelpers.js";
2
- import { generateGridId as R } from "../../shared/idGenerator.js";
3
- import { resolveResponsiveColumns as T, generateResponsiveGridStyles as j, BREAKPOINTS as A } from "../../shared/responsiveGridHelper.js";
4
- function Q(e, f, y, v, n) {
5
- const { cols: r = 3, colTemplate: o, gap: p = "1rem", maxWidth: a, padding: s, paddingTop: l, children: w = [] } = e.props;
6
- if (!n)
1
+ import { dataBlockIdAttr as w } from "../../shared/htmlHelpers.js";
2
+ import { generateGridId as H } from "../../shared/idGenerator.js";
3
+ import { resolveResponsiveColumns as O, generateResponsiveGridStyles as R, BREAKPOINTS as T } from "../../shared/responsiveGridHelper.js";
4
+ function N(o, I, k, B, l) {
5
+ const {
6
+ cols: n = 2,
7
+ colTemplate: u,
8
+ gap: c = "2.5rem",
9
+ maxWidth: m,
10
+ padding: s,
11
+ paddingTop: $,
12
+ paddingBottom: h,
13
+ contentPosition: f = "center",
14
+ bg: d,
15
+ bgImage: t,
16
+ bgOverlay: G,
17
+ bgOverlayColor: z = "rgba(0,0,0,0.5)",
18
+ bgGradient: a,
19
+ children: P = []
20
+ } = o.props;
21
+ if (!l)
7
22
  throw new Error("exportGrid requires renderChild function");
8
- const i = R(e.id || ""), m = w.map((d) => n(d, f + 1, y, v)).join(""), t = [];
9
- a && (t.push(`max-width: ${a}`), t.push("margin-left: auto"), t.push("margin-right: auto")), s && (t.push(`padding-left: ${s}`), t.push(`padding-right: ${s}`)), l && t.push(`padding-top: ${l}`);
10
- const $ = t.length > 0, c = t.join("; ");
11
- if (o) {
12
- const d = `display: grid; gap: ${p};`, I = `
13
- /* Base: Mobile 1 coluna */
14
- #${i} {
15
- grid-template-columns: 1fr;
16
- }
17
-
18
- /* Desktop: template customizado */
19
- @media (min-width: ${A.md}) {
20
- #${i} {
21
- grid-template-columns: ${o};
22
- }
23
- }
24
- `.trim(), u = `<div id="${i}" ${h(e.id)} style="${d}">${m}</div>`, B = $ ? `<div style="${c}">${u}</div>` : u;
25
- return `<style>${I}</style>${B}`;
23
+ const r = H(o.id || ""), v = P.map((g) => l(g, I + 1, k, B)).join(""), i = [
24
+ "display: grid",
25
+ `gap: ${c}`,
26
+ "box-sizing: border-box",
27
+ "width: 100%"
28
+ ];
29
+ m && (i.push(`max-width: ${m}`), f === "left" ? i.push("margin-right: auto") : f === "right" ? i.push("margin-left: auto") : (i.push("margin-left: auto"), i.push("margin-right: auto"))), s && (i.push(`padding-left: ${s}`), i.push(`padding-right: ${s}`)), $ && i.push(`padding-top: ${$}`), h && i.push(`padding-bottom: ${h}`);
30
+ const b = i.join("; "), S = d || t || a;
31
+ let p = "";
32
+ if (u)
33
+ p = `
34
+ #${r} { grid-template-columns: 1fr; }
35
+ @media (min-width: ${T.md}) {
36
+ #${r} { grid-template-columns: ${u}; }
37
+ }`.trim();
38
+ else {
39
+ const g = O(n, 1, 2, typeof n == "number" ? n : 2);
40
+ p = R(r, g, c).mediaQueries;
26
41
  }
27
- const x = T(r, 1, 2, typeof r == "number" ? r : 3), { inlineStyles: H, mediaQueries: S } = j(
28
- i,
29
- x,
30
- p
31
- ), g = `<div id="${i}" ${h(e.id)} style="${H}">${m}</div>`, G = $ ? `<div style="${c}">${g}</div>` : g;
32
- return `<style>${S}</style>${G}`;
42
+ const y = `<style>${p}</style>`, j = `<div id="${r}" ${w(o.id)} style="${b}">${v}</div>`;
43
+ if (!S)
44
+ return `${y}${j}`;
45
+ const e = ["width: 100%", "position: relative"];
46
+ d && e.push(`background-color: ${d}`), t && (e.push(`background-image: url(${t})`), e.push("background-size: cover"), e.push("background-position: center"), e.push("background-repeat: no-repeat")), a && !t && e.push(`background: ${a}`);
47
+ const C = e.join("; "), x = t && G ? `<div style="position:absolute;inset:0;background-color:${z};z-index:0;"></div>` : "", E = x ? " position: relative; z-index: 1;" : "";
48
+ return `${y}<div style="${C}">${x}<div id="${r}" ${w(o.id)} style="${b};${E}">${v}</div></div>`;
33
49
  }
34
50
  export {
35
- Q as exportGrid
51
+ N as exportGrid
36
52
  };
37
53
  //# sourceMappingURL=GridExporter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GridExporter.js","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"sourcesContent":["/**\n * Grid Block Exporter\n * Sistema responsivo mobile-first com media queries\n * Suporte a colTemplate para templates customizados (ex: \"1fr 320px\")\n * Suporte a maxWidth e padding para espaçamento\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateGridId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n BREAKPOINTS,\n} from \"../../shared/responsiveGridHelper\";\n\nexport function exportGrid(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n renderChild?: (block: Block, _depth: number, basePath?: string, theme?: ThemeTokens) => string,\n): string {\n const { cols = 3, colTemplate, gap = \"1rem\", maxWidth, padding, paddingTop, children = [] } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportGrid requires renderChild function\");\n }\n\n // Gerar ID único para este grid\n const gridId = generateGridId(block.id || \"\");\n\n // Renderizar filhos\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n // Wrapper styles for maxWidth + padding\n const wrapperParts: string[] = [];\n if (maxWidth) {\n wrapperParts.push(`max-width: ${maxWidth}`);\n wrapperParts.push(\"margin-left: auto\");\n wrapperParts.push(\"margin-right: auto\");\n }\n if (padding) {\n wrapperParts.push(`padding-left: ${padding}`);\n wrapperParts.push(`padding-right: ${padding}`);\n }\n if (paddingTop) {\n wrapperParts.push(`padding-top: ${paddingTop}`);\n }\n const hasWrapper = wrapperParts.length > 0;\n const wrapperStyle = wrapperParts.join(\"; \");\n\n // Se colTemplate está definido, usar template customizado com responsive\n if (colTemplate) {\n const inlineStyles = `display: grid; gap: ${gap};`;\n const mediaQueries = `\n /* Base: Mobile 1 coluna */\n #${gridId} {\n grid-template-columns: 1fr;\n }\n\n /* Desktop: template customizado */\n @media (min-width: ${BREAKPOINTS.md}) {\n #${gridId} {\n grid-template-columns: ${colTemplate};\n }\n }\n `.trim();\n\n const gridHtml = `<div id=\"${gridId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n const wrappedHtml = hasWrapper\n ? `<div style=\"${wrapperStyle}\">${gridHtml}</div>`\n : gridHtml;\n\n return `<style>${mediaQueries}</style>${wrappedHtml}`;\n }\n\n // Comportamento padrão: resolver configuração responsiva\n const responsiveConfig = resolveResponsiveColumns(cols, 1, 2, typeof cols === \"number\" ? cols : 3);\n const { inlineStyles, mediaQueries } = generateResponsiveGridStyles(\n gridId,\n responsiveConfig,\n gap,\n );\n\n const gridHtml = `<div id=\"${gridId}\" ${dataBlockIdAttr(block.id)} style=\"${inlineStyles}\">${childrenHtml}</div>`;\n const wrappedHtml = hasWrapper\n ? `<div style=\"${wrapperStyle}\">${gridHtml}</div>`\n : gridHtml;\n\n return `<style>${mediaQueries}</style>${wrappedHtml}`;\n}\n"],"names":["exportGrid","block","depth","basePath","theme","renderChild","cols","colTemplate","gap","maxWidth","padding","paddingTop","children","gridId","generateGridId","childrenHtml","c","wrapperParts","hasWrapper","wrapperStyle","inlineStyles","mediaQueries","BREAKPOINTS","gridHtml","dataBlockIdAttr","wrappedHtml","responsiveConfig","resolveResponsiveColumns","generateResponsiveGridStyles"],"mappings":";;;AAiBO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM,EAAE,MAAAC,IAAO,GAAG,aAAAC,GAAa,KAAAC,IAAM,QAAQ,UAAAC,GAAU,SAAAC,GAAS,YAAAC,GAAY,UAAAC,IAAW,CAAA,EAAC,IAAOX,EAAc;AAE7G,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,0CAA0C;AAI5D,QAAMQ,IAASC,EAAeb,EAAM,MAAM,EAAE,GAGtCc,IAAeH,EAClB,IAAI,CAACI,MAAaX,EAAYW,GAAGd,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE,GAGJa,IAAyB,CAAA;AAC/B,EAAIR,MACFQ,EAAa,KAAK,cAAcR,CAAQ,EAAE,GAC1CQ,EAAa,KAAK,mBAAmB,GACrCA,EAAa,KAAK,oBAAoB,IAEpCP,MACFO,EAAa,KAAK,iBAAiBP,CAAO,EAAE,GAC5CO,EAAa,KAAK,kBAAkBP,CAAO,EAAE,IAE3CC,KACFM,EAAa,KAAK,gBAAgBN,CAAU,EAAE;AAEhD,QAAMO,IAAaD,EAAa,SAAS,GACnCE,IAAeF,EAAa,KAAK,IAAI;AAG3C,MAAIV,GAAa;AACf,UAAMa,IAAe,uBAAuBZ,CAAG,KACzCa,IAAe;AAAA;AAAA,OAElBR,CAAM;AAAA;AAAA;AAAA;AAAA;AAAA,yBAKYS,EAAY,EAAE;AAAA,SAC9BT,CAAM;AAAA,iCACkBN,CAAW;AAAA;AAAA;AAAA,IAGxC,KAAA,GAEMgB,IAAW,YAAYV,CAAM,KAAKW,EAAgBvB,EAAM,EAAE,CAAC,WAAWmB,CAAY,KAAKL,CAAY,UACnGU,IAAcP,IAChB,eAAeC,CAAY,KAAKI,CAAQ,WACxCA;AAEJ,WAAO,UAAUF,CAAY,WAAWI,CAAW;AAAA,EACrD;AAGA,QAAMC,IAAmBC,EAAyBrB,GAAM,GAAG,GAAG,OAAOA,KAAS,WAAWA,IAAO,CAAC,GAC3F,EAAE,cAAAc,GAAc,cAAAC,EAAA,IAAiBO;AAAA,IACrCf;AAAA,IACAa;AAAA,IACAlB;AAAA,EAAA,GAGIe,IAAW,YAAYV,CAAM,KAAKW,EAAgBvB,EAAM,EAAE,CAAC,WAAWmB,CAAY,KAAKL,CAAY,UACnGU,IAAcP,IAChB,eAAeC,CAAY,KAAKI,CAAQ,WACxCA;AAEJ,SAAO,UAAUF,CAAY,WAAWI,CAAW;AACrD;"}
1
+ {"version":3,"file":"GridExporter.js","sources":["../../../../../src/engine/export/exporters/layout/GridExporter.ts"],"sourcesContent":["/**\n * Grid Block Exporter\n * Full-width outer wrapper for background effects (color, image, gradient, overlay)\n * Inner grid constrained by maxWidth\n * Responsive: colTemplate collapses to 1fr on mobile\n */\n\nimport { Block } from \"../../../schema/siteDocument\";\nimport { ThemeTokens } from \"../../../schema/themeTokens\";\nimport { dataBlockIdAttr } from \"../../shared/htmlHelpers\";\nimport { generateGridId } from \"../../shared/idGenerator\";\nimport {\n resolveResponsiveColumns,\n generateResponsiveGridStyles,\n BREAKPOINTS,\n} from \"../../shared/responsiveGridHelper\";\n\nexport function exportGrid(\n block: Block,\n depth: number,\n basePath?: string,\n theme?: ThemeTokens,\n renderChild?: (block: Block, _depth: number, basePath?: string, theme?: ThemeTokens) => string,\n): string {\n const {\n cols = 2,\n colTemplate,\n gap = \"2.5rem\",\n maxWidth,\n padding,\n paddingTop,\n paddingBottom,\n contentPosition = \"center\",\n bg,\n bgImage,\n bgOverlay,\n bgOverlayColor = \"rgba(0,0,0,0.5)\",\n bgGradient,\n children = [],\n } = (block as any).props;\n\n if (!renderChild) {\n throw new Error(\"exportGrid requires renderChild function\");\n }\n\n const gridId = generateGridId(block.id || \"\");\n\n const childrenHtml = children\n .map((c: Block) => renderChild(c, depth + 1, basePath, theme))\n .join(\"\");\n\n // Inner grid styles\n const gridParts: string[] = [\n \"display: grid\",\n `gap: ${gap}`,\n \"box-sizing: border-box\",\n \"width: 100%\",\n ];\n\n if (maxWidth) {\n gridParts.push(`max-width: ${maxWidth}`);\n if (contentPosition === \"left\") {\n gridParts.push(\"margin-right: auto\");\n } else if (contentPosition === \"right\") {\n gridParts.push(\"margin-left: auto\");\n } else {\n gridParts.push(\"margin-left: auto\");\n gridParts.push(\"margin-right: auto\");\n }\n }\n if (padding) {\n gridParts.push(`padding-left: ${padding}`);\n gridParts.push(`padding-right: ${padding}`);\n }\n if (paddingTop) {\n gridParts.push(`padding-top: ${paddingTop}`);\n }\n if (paddingBottom) {\n gridParts.push(`padding-bottom: ${paddingBottom}`);\n }\n\n const gridInlineStyle = gridParts.join(\"; \");\n\n // Check if we need an outer wrapper\n const hasBgEffects = bg || bgImage || bgGradient;\n\n // Media queries for responsive columns\n let mediaQueries = \"\";\n if (colTemplate) {\n mediaQueries = `\n #${gridId} { grid-template-columns: 1fr; }\n @media (min-width: ${BREAKPOINTS.md}) {\n #${gridId} { grid-template-columns: ${colTemplate}; }\n }`.trim();\n } else {\n const responsiveConfig = resolveResponsiveColumns(cols, 1, 2, typeof cols === \"number\" ? cols : 2);\n const result = generateResponsiveGridStyles(gridId, responsiveConfig, gap);\n mediaQueries = result.mediaQueries;\n }\n\n const styleBlock = `<style>${mediaQueries}</style>`;\n const gridHtml = `<div id=\"${gridId}\" ${dataBlockIdAttr(block.id)} style=\"${gridInlineStyle}\">${childrenHtml}</div>`;\n\n if (!hasBgEffects) {\n return `${styleBlock}${gridHtml}`;\n }\n\n // Full-width wrapper for background effects\n const wrapperParts: string[] = [\"width: 100%\", \"position: relative\"];\n if (bg) {\n wrapperParts.push(`background-color: ${bg}`);\n }\n if (bgImage) {\n wrapperParts.push(`background-image: url(${bgImage})`);\n wrapperParts.push(\"background-size: cover\");\n wrapperParts.push(\"background-position: center\");\n wrapperParts.push(\"background-repeat: no-repeat\");\n }\n if (bgGradient && !bgImage) {\n wrapperParts.push(`background: ${bgGradient}`);\n }\n const wrapperStyle = wrapperParts.join(\"; \");\n\n // Overlay\n const overlayHtml = bgImage && bgOverlay\n ? `<div style=\"position:absolute;inset:0;background-color:${bgOverlayColor};z-index:0;\"></div>`\n : \"\";\n\n // If overlay, grid needs z-index\n const gridZIndex = overlayHtml ? \" position: relative; z-index: 1;\" : \"\";\n\n return `${styleBlock}<div style=\"${wrapperStyle}\">${overlayHtml}<div id=\"${gridId}\" ${dataBlockIdAttr(block.id)} style=\"${gridInlineStyle};${gridZIndex}\">${childrenHtml}</div></div>`;\n}\n"],"names":["exportGrid","block","depth","basePath","theme","renderChild","cols","colTemplate","gap","maxWidth","padding","paddingTop","paddingBottom","contentPosition","bg","bgImage","bgOverlay","bgOverlayColor","bgGradient","children","gridId","generateGridId","childrenHtml","c","gridParts","gridInlineStyle","hasBgEffects","mediaQueries","BREAKPOINTS","responsiveConfig","resolveResponsiveColumns","generateResponsiveGridStyles","styleBlock","gridHtml","dataBlockIdAttr","wrapperParts","wrapperStyle","overlayHtml","gridZIndex"],"mappings":";;;AAiBO,SAASA,EACdC,GACAC,GACAC,GACAC,GACAC,GACQ;AACR,QAAM;AAAA,IACJ,MAAAC,IAAO;AAAA,IACP,aAAAC;AAAA,IACA,KAAAC,IAAM;AAAA,IACN,UAAAC;AAAA,IACA,SAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAC;AAAA,IACA,iBAAAC,IAAkB;AAAA,IAClB,IAAAC;AAAA,IACA,SAAAC;AAAA,IACA,WAAAC;AAAA,IACA,gBAAAC,IAAiB;AAAA,IACjB,YAAAC;AAAA,IACA,UAAAC,IAAW,CAAA;AAAA,EAAC,IACTlB,EAAc;AAEnB,MAAI,CAACI;AACH,UAAM,IAAI,MAAM,0CAA0C;AAG5D,QAAMe,IAASC,EAAepB,EAAM,MAAM,EAAE,GAEtCqB,IAAeH,EAClB,IAAI,CAACI,MAAalB,EAAYkB,GAAGrB,IAAQ,GAAGC,GAAUC,CAAK,CAAC,EAC5D,KAAK,EAAE,GAGJoB,IAAsB;AAAA,IAC1B;AAAA,IACA,QAAQhB,CAAG;AAAA,IACX;AAAA,IACA;AAAA,EAAA;AAGF,EAAIC,MACFe,EAAU,KAAK,cAAcf,CAAQ,EAAE,GACnCI,MAAoB,SACtBW,EAAU,KAAK,oBAAoB,IAC1BX,MAAoB,UAC7BW,EAAU,KAAK,mBAAmB,KAElCA,EAAU,KAAK,mBAAmB,GAClCA,EAAU,KAAK,oBAAoB,KAGnCd,MACFc,EAAU,KAAK,iBAAiBd,CAAO,EAAE,GACzCc,EAAU,KAAK,kBAAkBd,CAAO,EAAE,IAExCC,KACFa,EAAU,KAAK,gBAAgBb,CAAU,EAAE,GAEzCC,KACFY,EAAU,KAAK,mBAAmBZ,CAAa,EAAE;AAGnD,QAAMa,IAAkBD,EAAU,KAAK,IAAI,GAGrCE,IAAeZ,KAAMC,KAAWG;AAGtC,MAAIS,IAAe;AACnB,MAAIpB;AACF,IAAAoB,IAAe;AAAA,OACZP,CAAM;AAAA,yBACYQ,EAAY,EAAE;AAAA,SAC9BR,CAAM,6BAA6Bb,CAAW;AAAA,OAChD,KAAA;AAAA,OACE;AACL,UAAMsB,IAAmBC,EAAyBxB,GAAM,GAAG,GAAG,OAAOA,KAAS,WAAWA,IAAO,CAAC;AAEjG,IAAAqB,IADeI,EAA6BX,GAAQS,GAAkBrB,CAAG,EACnD;AAAA,EACxB;AAEA,QAAMwB,IAAa,UAAUL,CAAY,YACnCM,IAAW,YAAYb,CAAM,KAAKc,EAAgBjC,EAAM,EAAE,CAAC,WAAWwB,CAAe,KAAKH,CAAY;AAE5G,MAAI,CAACI;AACH,WAAO,GAAGM,CAAU,GAAGC,CAAQ;AAIjC,QAAME,IAAyB,CAAC,eAAe,oBAAoB;AACnE,EAAIrB,KACFqB,EAAa,KAAK,qBAAqBrB,CAAE,EAAE,GAEzCC,MACFoB,EAAa,KAAK,yBAAyBpB,CAAO,GAAG,GACrDoB,EAAa,KAAK,wBAAwB,GAC1CA,EAAa,KAAK,6BAA6B,GAC/CA,EAAa,KAAK,8BAA8B,IAE9CjB,KAAc,CAACH,KACjBoB,EAAa,KAAK,eAAejB,CAAU,EAAE;AAE/C,QAAMkB,IAAeD,EAAa,KAAK,IAAI,GAGrCE,IAActB,KAAWC,IAC3B,0DAA0DC,CAAc,wBACxE,IAGEqB,IAAaD,IAAc,qCAAqC;AAEtE,SAAO,GAAGL,CAAU,eAAeI,CAAY,KAAKC,CAAW,YAAYjB,CAAM,KAAKc,EAAgBjC,EAAM,EAAE,CAAC,WAAWwB,CAAe,IAAIa,CAAU,KAAKhB,CAAY;AAC1K;"}
@@ -1 +1 @@
1
- {"version":3,"file":"StackExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/StackExporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK1D,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAuER"}
1
+ {"version":3,"file":"StackExporter.d.ts","sourceRoot":"","sources":["../../../../../src/engine/export/exporters/layout/StackExporter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAK1D,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,MAAM,GAC7F,MAAM,CAyER"}