vobi_document 1.0.2 → 1.1.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.
Files changed (96) hide show
  1. package/README.md +23 -6
  2. package/dist/blocks.cjs +108 -0
  3. package/dist/blocks.cjs.map +1 -0
  4. package/dist/blocks.d.cts +214 -0
  5. package/dist/blocks.d.ts +214 -0
  6. package/dist/blocks.js +7 -0
  7. package/dist/blocks.js.map +1 -0
  8. package/dist/catalogContext-DenbX-OW.d.cts +15 -0
  9. package/dist/catalogContext-HGMU-w_4.d.ts +15 -0
  10. package/dist/chunk-26DSIOEY.cjs +68 -0
  11. package/dist/chunk-26DSIOEY.cjs.map +1 -0
  12. package/dist/chunk-3FTKM37U.cjs +1354 -0
  13. package/dist/chunk-3FTKM37U.cjs.map +1 -0
  14. package/dist/chunk-CZB7F2LA.js +90 -0
  15. package/dist/chunk-CZB7F2LA.js.map +1 -0
  16. package/dist/chunk-ERKU5FDV.cjs +407 -0
  17. package/dist/chunk-ERKU5FDV.cjs.map +1 -0
  18. package/dist/chunk-FKX46GKE.cjs +36 -0
  19. package/dist/chunk-FKX46GKE.cjs.map +1 -0
  20. package/dist/chunk-GR76U6FP.cjs +194 -0
  21. package/dist/chunk-GR76U6FP.cjs.map +1 -0
  22. package/dist/chunk-I22MGPXO.cjs +117 -0
  23. package/dist/chunk-I22MGPXO.cjs.map +1 -0
  24. package/dist/chunk-JYSA6IM5.js +1327 -0
  25. package/dist/chunk-JYSA6IM5.js.map +1 -0
  26. package/dist/chunk-L5FXGEKX.cjs +114 -0
  27. package/dist/chunk-L5FXGEKX.cjs.map +1 -0
  28. package/dist/chunk-LNBAFOVK.cjs +14 -0
  29. package/dist/chunk-LNBAFOVK.cjs.map +1 -0
  30. package/dist/chunk-M6FQVH76.js +824 -0
  31. package/dist/chunk-M6FQVH76.js.map +1 -0
  32. package/dist/chunk-MUSSJOOA.js +109 -0
  33. package/dist/chunk-MUSSJOOA.js.map +1 -0
  34. package/dist/chunk-N3IDPT3B.js +182 -0
  35. package/dist/chunk-N3IDPT3B.js.map +1 -0
  36. package/dist/chunk-OJZJJEJX.js +904 -0
  37. package/dist/chunk-OJZJJEJX.js.map +1 -0
  38. package/dist/chunk-PLQNNXS2.js +382 -0
  39. package/dist/chunk-PLQNNXS2.js.map +1 -0
  40. package/dist/chunk-QJ5W5EED.cjs +94 -0
  41. package/dist/chunk-QJ5W5EED.cjs.map +1 -0
  42. package/dist/chunk-QYBWIJXZ.js +98 -0
  43. package/dist/chunk-QYBWIJXZ.js.map +1 -0
  44. package/dist/chunk-RO3Y2MSU.cjs +844 -0
  45. package/dist/chunk-RO3Y2MSU.cjs.map +1 -0
  46. package/dist/chunk-RZOR3HOA.cjs +933 -0
  47. package/dist/chunk-RZOR3HOA.cjs.map +1 -0
  48. package/dist/chunk-SOIYSSU3.js +108 -0
  49. package/dist/chunk-SOIYSSU3.js.map +1 -0
  50. package/dist/chunk-SP5LCPDG.cjs +119 -0
  51. package/dist/chunk-SP5LCPDG.cjs.map +1 -0
  52. package/dist/chunk-W52ULJCW.js +61 -0
  53. package/dist/chunk-W52ULJCW.js.map +1 -0
  54. package/dist/chunk-ZOJBDFKU.js +12 -0
  55. package/dist/chunk-ZOJBDFKU.js.map +1 -0
  56. package/dist/editor.cjs +60 -0
  57. package/dist/editor.cjs.map +1 -0
  58. package/dist/editor.d.cts +190 -0
  59. package/dist/editor.d.ts +190 -0
  60. package/dist/editor.js +7 -0
  61. package/dist/editor.js.map +1 -0
  62. package/dist/index.cjs +436 -3753
  63. package/dist/index.cjs.map +1 -1
  64. package/dist/index.d.cts +72 -7892
  65. package/dist/index.d.ts +72 -7892
  66. package/dist/index.js +22 -3662
  67. package/dist/index.js.map +1 -1
  68. package/dist/messages-Bi0JxNIH.d.cts +23 -0
  69. package/dist/messages-Bi0JxNIH.d.ts +23 -0
  70. package/dist/print.cjs +354 -0
  71. package/dist/print.cjs.map +1 -0
  72. package/dist/print.d.cts +43 -0
  73. package/dist/print.d.ts +43 -0
  74. package/dist/print.js +336 -0
  75. package/dist/print.js.map +1 -0
  76. package/dist/puck.cjs +8 -8
  77. package/dist/puck.cjs.map +1 -1
  78. package/dist/render.cjs +72 -0
  79. package/dist/render.cjs.map +1 -0
  80. package/dist/render.d.cts +93 -0
  81. package/dist/render.d.ts +93 -0
  82. package/dist/render.js +7 -0
  83. package/dist/render.js.map +1 -0
  84. package/dist/theme-BuEFpQeZ.d.cts +112 -0
  85. package/dist/theme-BuEFpQeZ.d.ts +112 -0
  86. package/dist/types-BgIugNWW.d.cts +25 -0
  87. package/dist/types-BgIugNWW.d.ts +25 -0
  88. package/dist/types-CvKSS1Sy.d.cts +38 -0
  89. package/dist/types-CvKSS1Sy.d.ts +38 -0
  90. package/dist/variables.cjs +111 -0
  91. package/dist/variables.cjs.map +1 -0
  92. package/dist/variables.d.cts +106 -0
  93. package/dist/variables.d.ts +106 -0
  94. package/dist/variables.js +6 -0
  95. package/dist/variables.js.map +1 -0
  96. package/package.json +39 -8
@@ -0,0 +1,904 @@
1
+ import { TextIcon, HeadingIcon, ListIcon, QuoteIcon, ButtonIcon, DividerIcon, SpacerIcon, ImageIcon, ImageGridIcon, TwoColumnsIcon, ImageTextIcon, IconTextIcon, TableIcon, PageBreakIcon } from './chunk-QYBWIJXZ.js';
2
+ import { devWarn } from './chunk-ZOJBDFKU.js';
3
+ import { CHIP_CLASS, INVALID_CHIP_CLASS, EMPTY_CHIP_CLASS, resolveVariableHtml } from './chunk-MUSSJOOA.js';
4
+ import { useResolvedVariables, useCatalog, useUnresolvedDisplay } from './chunk-SOIYSSU3.js';
5
+ import { z } from 'zod';
6
+ import styled4 from 'styled-components';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ // src/blocks/defineBlock.ts
10
+ function defineBlock(entry) {
11
+ return entry;
12
+ }
13
+
14
+ // src/blocks/primitives/proseCss.ts
15
+ var DOCUMENT_TEXT_CSS = `font-size: 16px;
16
+ line-height: 1.5;
17
+ overflow-wrap: break-word;
18
+ word-break: break-word;`;
19
+ var DOCUMENT_PROSE_CSS = `p {
20
+ margin: 0 0 8px;
21
+ }
22
+
23
+ h1, h2, h3, h4, h5, h6 {
24
+ margin: 0 0 8px;
25
+ line-height: 1.25;
26
+ font-weight: 600;
27
+ }
28
+
29
+ h1 { font-size: 2em; }
30
+ h2 { font-size: 1.5em; }
31
+ h3 { font-size: 1.25em; }
32
+ h4 { font-size: 1.125em; }
33
+ h5 { font-size: 1em; }
34
+ h6 { font-size: 0.875em; }
35
+
36
+ ul, ol {
37
+ margin: 0 0 8px;
38
+ padding-left: 24px;
39
+ }
40
+
41
+ ul { list-style: disc; }
42
+ ol { list-style: decimal; }
43
+
44
+ li { margin: 0 0 4px; }
45
+
46
+ strong, b { font-weight: 600; }
47
+ em, i { font-style: italic; }
48
+
49
+ a { color: var(--doc-brand, #005ac3); }
50
+
51
+ img { max-width: 100%; }
52
+
53
+ /* O chip herda peso, estilo e sublinhado do texto ao redor: pinar qualquer um deles faz
54
+ negrito/italico/sublinhado nao pegarem na variavel. Inline (e nao inline-block) porque
55
+ text-decoration nao atravessa um inline-block. */
56
+ .dg-var {
57
+ display: inline;
58
+ font-size: 0.92em;
59
+ font-weight: inherit;
60
+ font-style: inherit;
61
+ white-space: nowrap;
62
+ }
63
+
64
+ /* Sem margem sobrando no fim do bloco. Seletores de elemento, e nao um combinador filho,
65
+ porque a mesma string tambem e usada no topo de uma folha, onde nao ha pai. */
66
+ p:last-child,
67
+ ul:last-child,
68
+ ol:last-child,
69
+ h1:last-child,
70
+ h2:last-child,
71
+ h3:last-child,
72
+ h4:last-child,
73
+ h5:last-child,
74
+ h6:last-child {
75
+ margin-bottom: 0;
76
+ }`;
77
+ var Prose = styled4.div`
78
+ ${DOCUMENT_TEXT_CSS}
79
+ ${DOCUMENT_PROSE_CSS}
80
+
81
+ .${CHIP_CLASS} {
82
+ padding: 1px 6px;
83
+ border-radius: 4px;
84
+ background: color-mix(in srgb, var(--doc-brand, #005ac3) 12%, transparent);
85
+ color: var(--doc-brand, #005ac3);
86
+ }
87
+
88
+ .${INVALID_CHIP_CLASS} {
89
+ background: #fdecea;
90
+ color: #b4341b;
91
+ }
92
+
93
+ .${EMPTY_CHIP_CLASS} {
94
+ background: #f5e4b8;
95
+ color: #84620d;
96
+ }
97
+ `;
98
+ function RichText({ html = "", editing = false, as, className }) {
99
+ const resolved = useResolvedVariables();
100
+ const catalog = useCatalog();
101
+ const unresolved = useUnresolvedDisplay();
102
+ return /* @__PURE__ */ jsx(
103
+ Prose,
104
+ {
105
+ as,
106
+ className,
107
+ dangerouslySetInnerHTML: {
108
+ __html: resolveVariableHtml(html, resolved, { keepChip: editing, catalog, unresolved })
109
+ }
110
+ }
111
+ );
112
+ }
113
+ var TextBlock = defineBlock({
114
+ key: "Text",
115
+ label: "Texto",
116
+ category: "Conte\xFAdo",
117
+ icon: /* @__PURE__ */ jsx(TextIcon, {}),
118
+ fields: {
119
+ content: { type: "textarea", label: "Conte\xFAdo (HTML)" }
120
+ },
121
+ propsSchema: z.object({ content: z.string() }),
122
+ defaultProps: { content: "<p>Escreva o texto do documento aqui.</p>" },
123
+ component: ({ content, puck }) => /* @__PURE__ */ jsx(RichText, { html: content, editing: puck?.isEditing })
124
+ });
125
+ var HeadingBlock = defineBlock({
126
+ key: "Heading",
127
+ label: "T\xEDtulo",
128
+ category: "Conte\xFAdo",
129
+ icon: /* @__PURE__ */ jsx(HeadingIcon, {}),
130
+ fields: {
131
+ text: { type: "text", label: "T\xEDtulo" },
132
+ level: {
133
+ type: "select",
134
+ label: "N\xEDvel",
135
+ options: [
136
+ { label: "T\xEDtulo 1", value: 1 },
137
+ { label: "T\xEDtulo 2", value: 2 },
138
+ { label: "T\xEDtulo 3", value: 3 },
139
+ { label: "T\xEDtulo 4", value: 4 }
140
+ ]
141
+ }
142
+ },
143
+ propsSchema: z.object({ text: z.string(), level: z.union([z.literal(1), z.literal(2), z.literal(3), z.literal(4)]) }),
144
+ defaultProps: { text: "T\xEDtulo da se\xE7\xE3o", level: 2 },
145
+ component: ({ text, level, puck }) => /* @__PURE__ */ jsx(RichText, { as: `h${level ?? 2}`, html: text, editing: puck?.isEditing })
146
+ });
147
+ var List = styled4.ul`
148
+ margin: 0;
149
+ padding-left: 22px;
150
+
151
+ li {
152
+ margin-bottom: 4px;
153
+ }
154
+ li::marker {
155
+ color: var(--doc-brand, #005ac3);
156
+ }
157
+ `;
158
+ var ListBlock = defineBlock({
159
+ key: "List",
160
+ label: "Lista",
161
+ category: "Conte\xFAdo",
162
+ icon: /* @__PURE__ */ jsx(ListIcon, {}),
163
+ fields: {
164
+ ordered: {
165
+ type: "radio",
166
+ label: "Marcador",
167
+ options: [
168
+ { label: "Bolinha", value: false },
169
+ { label: "Numerada", value: true }
170
+ ]
171
+ },
172
+ items: {
173
+ type: "array",
174
+ label: "Itens",
175
+ getItemSummary: (item, index) => item?.text || `Item ${(index ?? 0) + 1}`,
176
+ arrayFields: { text: { type: "text", label: "Texto" } },
177
+ defaultItemProps: { text: "Novo item" }
178
+ }
179
+ },
180
+ propsSchema: z.object({ items: z.array(z.object({ text: z.string() })), ordered: z.boolean() }),
181
+ defaultProps: {
182
+ ordered: false,
183
+ items: [{ text: "Primeiro item" }, { text: "Segundo item" }]
184
+ },
185
+ component: ({ items = [], ordered, puck }) => /* @__PURE__ */ jsx(List, { as: ordered ? "ol" : "ul", children: items.map((item, index) => (
186
+ // eslint-disable-next-line react/no-array-index-key -- o item não tem id próprio; a ordem é a identidade
187
+ /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(RichText, { as: "span", html: item?.text, editing: puck?.isEditing }) }, index)
188
+ )) })
189
+ });
190
+ var Callout = styled4.blockquote`
191
+ margin: 0;
192
+ padding: 12px 0 12px 16px;
193
+ border-left: 3px solid var(--doc-brand, #005ac3);
194
+ `;
195
+ var Author = styled4.footer`
196
+ margin-top: 6px;
197
+ font-size: 0.9em;
198
+ opacity: 0.75;
199
+ `;
200
+ var QuoteBlock = defineBlock({
201
+ key: "Quote",
202
+ label: "Destaque",
203
+ category: "Conte\xFAdo",
204
+ icon: /* @__PURE__ */ jsx(QuoteIcon, {}),
205
+ fields: {
206
+ content: { type: "textarea", label: "Texto (HTML)" },
207
+ author: { type: "text", label: "Autor (opcional)" }
208
+ },
209
+ propsSchema: z.object({ content: z.string(), author: z.string().optional() }),
210
+ defaultProps: { content: "<p>Texto em destaque.</p>", author: "" },
211
+ component: ({ content, author, puck }) => /* @__PURE__ */ jsxs(Callout, { children: [
212
+ /* @__PURE__ */ jsx(RichText, { html: content, editing: puck?.isEditing }),
213
+ author ? /* @__PURE__ */ jsx(Author, { children: author }) : null
214
+ ] })
215
+ });
216
+ var SIZE_WIDTH = { small: "33%", medium: "66%", large: "100%" };
217
+ var GAP_PX = { none: 0, small: 8, medium: 16, large: 24 };
218
+ var Placeholder = styled4.div`
219
+ display: flex;
220
+ align-items: center;
221
+ justify-content: center;
222
+ min-height: 64px;
223
+ padding: 16px;
224
+ border: 1px dashed #c3c9d2;
225
+ border-radius: 8px;
226
+ color: #9aa3af;
227
+ font-size: 13px;
228
+ text-align: center;
229
+ `;
230
+ var LinkButton = styled4.a`
231
+ display: inline-block;
232
+ padding: 8px 16px;
233
+ border-radius: 6px;
234
+ background: var(--doc-brand, #1a56db);
235
+ color: #fff;
236
+ text-decoration: none;
237
+ font-weight: 500;
238
+ `;
239
+ var PageBreakMark = styled4.div`
240
+ break-after: page;
241
+ margin: 8px 0;
242
+ border-top: 1px dashed #c3c9d2;
243
+ text-align: center;
244
+ color: #9aa3af;
245
+ font-size: 11px;
246
+ text-transform: uppercase;
247
+ letter-spacing: 0.04em;
248
+ `;
249
+ var SlotColumn = styled4.div`
250
+ flex: ${(props) => props.$basis} 1 0;
251
+ min-width: 0;
252
+ `;
253
+ var Row = styled4.div`
254
+ display: flex;
255
+ gap: ${(props) => props.$gap}px;
256
+ align-items: ${(props) => props.$align ?? "flex-start"};
257
+ `;
258
+ var renderSlot = (slot) => typeof slot === "function" ? slot() : null;
259
+ var ButtonBlock = defineBlock({
260
+ key: "Button",
261
+ label: "Bot\xE3o",
262
+ category: "Conte\xFAdo",
263
+ icon: /* @__PURE__ */ jsx(ButtonIcon, {}),
264
+ fields: {
265
+ text: { type: "text", label: "Texto do bot\xE3o", contentEditable: true },
266
+ href: { type: "text", label: "Link ao clicar" }
267
+ },
268
+ propsSchema: z.object({ text: z.string(), href: z.string() }),
269
+ defaultProps: { text: "Clique aqui", href: "#" },
270
+ component: ({ text, href }) => /* @__PURE__ */ jsx(LinkButton, { href: href || "#", target: "_blank", rel: "noopener noreferrer", children: text })
271
+ });
272
+ var Rule = styled4.hr`
273
+ border: none;
274
+ border-top: 1px ${(props) => props.$variant} currentColor;
275
+ opacity: 0.25;
276
+ margin: ${(props) => props.$spacing}px 0;
277
+ `;
278
+ var DividerBlock = defineBlock({
279
+ key: "Divider",
280
+ label: "Divisor",
281
+ category: "Conte\xFAdo",
282
+ icon: /* @__PURE__ */ jsx(DividerIcon, {}),
283
+ fields: {
284
+ variant: {
285
+ type: "select",
286
+ label: "Tra\xE7o",
287
+ options: [
288
+ { label: "Cont\xEDnuo", value: "solid" },
289
+ { label: "Tracejado", value: "dashed" },
290
+ { label: "Pontilhado", value: "dotted" }
291
+ ]
292
+ },
293
+ spacing: {
294
+ type: "select",
295
+ label: "Espa\xE7amento",
296
+ options: [
297
+ { label: "Nenhum", value: "none" },
298
+ { label: "Pequeno", value: "small" },
299
+ { label: "M\xE9dio", value: "medium" },
300
+ { label: "Grande", value: "large" }
301
+ ]
302
+ }
303
+ },
304
+ propsSchema: z.object({
305
+ variant: z.enum(["solid", "dashed", "dotted"]),
306
+ spacing: z.enum(["none", "small", "medium", "large"])
307
+ }),
308
+ defaultProps: { variant: "solid", spacing: "medium" },
309
+ component: ({ variant, spacing }) => /* @__PURE__ */ jsx(Rule, { $variant: variant ?? "solid", $spacing: GAP_PX[spacing] ?? 16 })
310
+ });
311
+ var Gap = styled4.div`
312
+ height: ${(props) => props.$height}px;
313
+ ${(props) => props.$editing ? "border: 1px dashed #dbe0e6; border-radius: 4px;" : ""}
314
+ `;
315
+ var SpacerBlock = defineBlock({
316
+ key: "Spacer",
317
+ label: "Espa\xE7o",
318
+ category: "Conte\xFAdo",
319
+ icon: /* @__PURE__ */ jsx(SpacerIcon, {}),
320
+ fields: {
321
+ height: { type: "number", label: "Altura (px)", min: 4, max: 400 }
322
+ },
323
+ propsSchema: z.object({ height: z.number().int().min(1).max(600) }),
324
+ defaultProps: { height: 24 },
325
+ component: ({ height, puck }) => /* @__PURE__ */ jsx(Gap, { $height: height ?? 24, $editing: Boolean(puck?.isEditing) })
326
+ });
327
+ var Figure = styled4.figure`
328
+ margin: 0;
329
+ `;
330
+ var Caption = styled4.figcaption`
331
+ margin-top: 6px;
332
+ font-size: 0.85em;
333
+ opacity: 0.7;
334
+ `;
335
+ var ImageBlock = defineBlock({
336
+ key: "Image",
337
+ label: "Imagem",
338
+ category: "M\xEDdia",
339
+ icon: /* @__PURE__ */ jsx(ImageIcon, {}),
340
+ fields: {
341
+ src: { type: "text", label: "Imagem (URL)" },
342
+ alt: { type: "text", label: "Texto alternativo" },
343
+ caption: { type: "text", label: "Legenda (opcional)" },
344
+ size: {
345
+ type: "select",
346
+ label: "Tamanho",
347
+ options: [
348
+ { label: "Pequeno", value: "small" },
349
+ { label: "M\xE9dio", value: "medium" },
350
+ { label: "Grande", value: "large" }
351
+ ]
352
+ },
353
+ opacity: { type: "number", label: "Opacidade (%)", min: 0, max: 100 }
354
+ },
355
+ propsSchema: z.object({
356
+ src: z.string(),
357
+ alt: z.string(),
358
+ caption: z.string().optional(),
359
+ size: z.enum(["small", "medium", "large"]),
360
+ opacity: z.number().min(0).max(100)
361
+ }),
362
+ defaultProps: { src: "", alt: "", caption: "", size: "medium", opacity: 100 },
363
+ component: ({ src, alt, caption, size, opacity, puck }) => {
364
+ if (!src) return puck?.isEditing ? /* @__PURE__ */ jsx(Placeholder, { children: "Informe a URL da imagem" }) : null;
365
+ return /* @__PURE__ */ jsxs(Figure, { children: [
366
+ /* @__PURE__ */ jsx(
367
+ "img",
368
+ {
369
+ src,
370
+ alt: alt ?? "",
371
+ style: { width: SIZE_WIDTH[size] ?? "66%", maxWidth: "100%", opacity: (opacity ?? 100) / 100 }
372
+ }
373
+ ),
374
+ caption ? /* @__PURE__ */ jsx(Caption, { children: caption }) : null
375
+ ] });
376
+ }
377
+ });
378
+ var RATIO = {
379
+ square: "1 / 1",
380
+ landscape: "4 / 3",
381
+ portrait: "3 / 4",
382
+ auto: void 0
383
+ };
384
+ var Grid = styled4.div`
385
+ display: grid;
386
+ grid-template-columns: repeat(${(props) => props.$columns}, 1fr);
387
+ gap: ${(props) => props.$gap}px;
388
+ `;
389
+ var Cell = styled4.img`
390
+ width: 100%;
391
+ height: ${(props) => props.$ratio ? "100%" : "auto"};
392
+ aspect-ratio: ${(props) => props.$ratio ?? "auto"};
393
+ object-fit: ${(props) => props.$ratio ? "cover" : "contain"};
394
+ display: block;
395
+ `;
396
+ var ImageGridBlock = defineBlock({
397
+ key: "ImageGrid",
398
+ label: "Grade de imagens",
399
+ category: "M\xEDdia",
400
+ icon: /* @__PURE__ */ jsx(ImageGridIcon, {}),
401
+ fields: {
402
+ images: {
403
+ type: "array",
404
+ label: "Imagens",
405
+ getItemSummary: (item, index) => item?.alt || item?.src || `Imagem ${(index ?? 0) + 1}`,
406
+ arrayFields: {
407
+ src: { type: "text", label: "URL" },
408
+ alt: { type: "text", label: "Texto alternativo" }
409
+ },
410
+ defaultItemProps: { src: "", alt: "" }
411
+ },
412
+ columns: { type: "number", label: "Colunas", min: 1, max: 4 },
413
+ gap: {
414
+ type: "select",
415
+ label: "Espa\xE7amento",
416
+ options: [
417
+ { label: "Nenhum", value: "none" },
418
+ { label: "Pequeno", value: "small" },
419
+ { label: "M\xE9dio", value: "medium" },
420
+ { label: "Grande", value: "large" }
421
+ ]
422
+ },
423
+ ratio: {
424
+ type: "select",
425
+ label: "Propor\xE7\xE3o",
426
+ options: [
427
+ { label: "Quadrada", value: "square" },
428
+ { label: "Paisagem", value: "landscape" },
429
+ { label: "Retrato", value: "portrait" },
430
+ { label: "Original", value: "auto" }
431
+ ]
432
+ }
433
+ },
434
+ propsSchema: z.object({
435
+ images: z.array(z.object({ src: z.string(), alt: z.string().optional() })),
436
+ columns: z.number().int().min(1).max(4),
437
+ gap: z.enum(["none", "small", "medium", "large"]),
438
+ ratio: z.enum(["square", "landscape", "portrait", "auto"])
439
+ }),
440
+ defaultProps: { images: [], columns: 2, gap: "small", ratio: "square" },
441
+ component: ({ images = [], columns, gap, ratio, puck }) => {
442
+ const filled = images.filter((image) => image?.src);
443
+ if (!filled.length) return puck?.isEditing ? /* @__PURE__ */ jsx(Placeholder, { children: "Adicione imagens \xE0 grade" }) : null;
444
+ return /* @__PURE__ */ jsx(Grid, { $columns: columns ?? 2, $gap: GAP_PX[gap] ?? 8, children: filled.map((image, index) => (
445
+ // eslint-disable-next-line react/no-array-index-key -- a imagem não tem id próprio; a ordem é a identidade
446
+ /* @__PURE__ */ jsx(Cell, { src: image.src, alt: image.alt ?? "", $ratio: RATIO[ratio ?? "square"] }, index)
447
+ )) });
448
+ }
449
+ });
450
+ var slotSchema = z.array(z.unknown()).optional();
451
+ var TwoColumnsBlock = defineBlock({
452
+ key: "TwoColumns",
453
+ label: "Duas colunas",
454
+ category: "Layout",
455
+ icon: /* @__PURE__ */ jsx(TwoColumnsIcon, {}),
456
+ fields: {
457
+ left: { type: "slot", label: "Coluna esquerda" },
458
+ right: { type: "slot", label: "Coluna direita" },
459
+ ratio: { type: "number", label: "Largura da esquerda (%)", min: 20, max: 80 },
460
+ gap: {
461
+ type: "select",
462
+ label: "Espa\xE7amento",
463
+ options: [
464
+ { label: "Nenhum", value: "none" },
465
+ { label: "Pequeno", value: "small" },
466
+ { label: "M\xE9dio", value: "medium" },
467
+ { label: "Grande", value: "large" }
468
+ ]
469
+ },
470
+ align: {
471
+ type: "radio",
472
+ label: "Alinhamento vertical",
473
+ options: [
474
+ { label: "Topo", value: "start" },
475
+ { label: "Centro", value: "center" }
476
+ ]
477
+ }
478
+ },
479
+ propsSchema: z.object({
480
+ left: slotSchema,
481
+ right: slotSchema,
482
+ ratio: z.number().min(0).max(100),
483
+ gap: z.enum(["none", "small", "medium", "large"]),
484
+ align: z.enum(["start", "center"])
485
+ }),
486
+ defaultProps: { ratio: 50, gap: "medium", align: "start" },
487
+ component: ({ left, right, ratio = 50, gap, align }) => /* @__PURE__ */ jsxs(Row, { $gap: GAP_PX[gap] ?? 16, $align: align === "center" ? "center" : "flex-start", children: [
488
+ /* @__PURE__ */ jsx(SlotColumn, { $basis: ratio, children: renderSlot(left) }),
489
+ /* @__PURE__ */ jsx(SlotColumn, { $basis: 100 - ratio, children: renderSlot(right) })
490
+ ] })
491
+ });
492
+ var slotSchema2 = z.array(z.unknown()).optional();
493
+ var ImageTextBlock = defineBlock({
494
+ key: "ImageText",
495
+ label: "Imagem e texto",
496
+ category: "Layout",
497
+ icon: /* @__PURE__ */ jsx(ImageTextIcon, {}),
498
+ fields: {
499
+ image: { type: "slot", label: "Imagem", allow: ["Image", "ImageGrid"] },
500
+ text: { type: "slot", label: "Texto", allow: ["Text", "Heading", "List", "Quote", "Button"] },
501
+ ratio: { type: "number", label: "Largura da imagem (%)", min: 20, max: 80 },
502
+ imageRight: {
503
+ type: "radio",
504
+ label: "Posi\xE7\xE3o da imagem",
505
+ options: [
506
+ { label: "Esquerda", value: false },
507
+ { label: "Direita", value: true }
508
+ ]
509
+ },
510
+ gap: {
511
+ type: "select",
512
+ label: "Espa\xE7amento",
513
+ options: [
514
+ { label: "Nenhum", value: "none" },
515
+ { label: "Pequeno", value: "small" },
516
+ { label: "M\xE9dio", value: "medium" },
517
+ { label: "Grande", value: "large" }
518
+ ]
519
+ }
520
+ },
521
+ propsSchema: z.object({
522
+ image: slotSchema2,
523
+ text: slotSchema2,
524
+ ratio: z.number().min(0).max(100),
525
+ imageRight: z.boolean(),
526
+ gap: z.enum(["none", "small", "medium", "large"])
527
+ }),
528
+ defaultProps: {
529
+ ratio: 40,
530
+ imageRight: false,
531
+ gap: "medium",
532
+ image: [{ type: "Image", props: {} }],
533
+ text: [{ type: "Text", props: {} }]
534
+ },
535
+ component: ({ image, text, ratio = 40, imageRight, gap }) => {
536
+ const imageColumn = /* @__PURE__ */ jsx(SlotColumn, { $basis: ratio, children: renderSlot(image) });
537
+ const textColumn = /* @__PURE__ */ jsx(SlotColumn, { $basis: 100 - ratio, children: renderSlot(text) });
538
+ return /* @__PURE__ */ jsxs(Row, { $gap: GAP_PX[gap] ?? 16, children: [
539
+ imageRight ? textColumn : imageColumn,
540
+ imageRight ? imageColumn : textColumn
541
+ ] });
542
+ }
543
+ });
544
+ var SOCIAL = "Social e contato";
545
+ var ACTIONS = "A\xE7\xF5es";
546
+ var NAV = "Navega\xE7\xE3o";
547
+ var TIME_PLACE = "Tempo e local";
548
+ var GENERAL = "Gerais";
549
+ var CONTENT_ICON_CATALOG = {
550
+ whatsapp: {
551
+ label: "WhatsApp",
552
+ group: SOCIAL,
553
+ variant: "fill",
554
+ viewBox: "0 0 448 512",
555
+ inner: '<path d="M380.9 97.1C339 55.1 283.2 32 223.9 32c-122.4 0-222 99.6-222 222 0 39.1 10.2 77.3 29.6 111L0 480l117.7-30.9c32.4 17.7 68.9 27 106.1 27h.1c122.3 0 224.1-99.6 224.1-222 0-59.3-25.2-115-67.1-157zm-157 341.6c-33.2 0-65.7-8.9-94-25.7l-6.7-4-69.8 18.3L72 359.2l-4.4-7c-18.5-29.4-28.2-63.3-28.2-98.2 0-101.7 82.8-184.5 184.6-184.5 49.3 0 95.6 19.2 130.4 54.1 34.8 34.9 56.2 81.2 56.1 130.5 0 101.8-84.9 184.6-186.6 184.6zm101.2-138.2c-5.5-2.8-32.8-16.2-37.9-18-5.1-1.9-8.8-2.8-12.5 2.8-3.7 5.6-14.3 18-17.6 21.8-3.2 3.7-6.5 4.2-12 1.4-32.6-16.3-54-29.1-75.5-66-5.7-9.8 5.7-9.1 16.3-30.3 1.8-3.7.9-6.9-.5-9.7-1.4-2.8-12.5-30.1-17.1-41.2-4.5-10.8-9.1-9.3-12.5-9.5-3.2-.2-6.9-.2-10.6-.2-3.7 0-9.7 1.4-14.8 6.9-5.1 5.6-19.4 19-19.4 46.3 0 27.3 19.9 53.7 22.6 57.4 2.8 3.7 39.1 59.7 94.8 83.8 35.2 15.2 49 16.5 66.6 13.9 10.7-1.6 32.8-13.4 37.4-26.4 4.6-13 4.6-24.1 3.2-26.4-1.3-2.5-5-3.9-10.5-6.6z"/>'
556
+ },
557
+ instagram: {
558
+ label: "Instagram",
559
+ group: SOCIAL,
560
+ variant: "fill",
561
+ viewBox: "0 0 448 512",
562
+ inner: '<path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/>'
563
+ },
564
+ facebook: {
565
+ label: "Facebook",
566
+ group: SOCIAL,
567
+ variant: "fill",
568
+ viewBox: "0 0 320 512",
569
+ inner: '<path d="M80 299.3V512H196V299.3h86.5l18-97.8H196V166.9c0-51.7 20.3-71.5 72.7-71.5c16.3 0 29.4 .4 37 1.2V7.9C291.4 4 256.4 0 236.2 0C129.3 0 80 50.5 80 159.4v42.1H14v97.8H80z"/>'
570
+ },
571
+ email: {
572
+ label: "E-mail",
573
+ group: SOCIAL,
574
+ viewBox: "0 0 24 24",
575
+ inner: '<path d="m22 7-8.991 5.727a2 2 0 0 1-2.009 0L2 7" /><rect x="2" y="4" width="20" height="16" rx="2" />'
576
+ },
577
+ telefone: {
578
+ label: "Telefone",
579
+ group: SOCIAL,
580
+ viewBox: "0 0 24 24",
581
+ inner: '<path d="M13.832 16.568a1 1 0 0 0 1.213-.303l.355-.465A2 2 0 0 1 17 15h3a2 2 0 0 1 2 2v3a2 2 0 0 1-2 2A18 18 0 0 1 2 4a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v3a2 2 0 0 1-.8 1.6l-.468.351a1 1 0 0 0-.292 1.233 14 14 0 0 0 6.392 6.384" />'
582
+ },
583
+ link: {
584
+ label: "Link",
585
+ group: SOCIAL,
586
+ viewBox: "0 0 24 24",
587
+ inner: '<path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" /><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" />'
588
+ },
589
+ download: {
590
+ label: "Download",
591
+ group: ACTIONS,
592
+ viewBox: "0 0 24 24",
593
+ inner: '<path d="M12 15V3" /><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4" /><path d="m7 10 5 5 5-5" />'
594
+ },
595
+ check: {
596
+ label: "Check",
597
+ group: ACTIONS,
598
+ viewBox: "0 0 24 24",
599
+ inner: '<path d="M20 6 9 17l-5-5" />'
600
+ },
601
+ enviar: {
602
+ label: "Enviar",
603
+ group: ACTIONS,
604
+ viewBox: "0 0 24 24",
605
+ inner: '<path d="M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z" /><path d="m21.854 2.147-10.94 10.939" />'
606
+ },
607
+ cifrao: {
608
+ label: "Cifr\xE3o",
609
+ group: ACTIONS,
610
+ viewBox: "0 0 24 24",
611
+ inner: '<line x1="12" x2="12" y1="2" y2="22" /><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6" />'
612
+ },
613
+ "seta-esquerda": {
614
+ label: "Seta esquerda",
615
+ group: NAV,
616
+ viewBox: "0 0 24 24",
617
+ inner: '<path d="m12 19-7-7 7-7" /><path d="M19 12H5" />'
618
+ },
619
+ "seta-direita": {
620
+ label: "Seta direita",
621
+ group: NAV,
622
+ viewBox: "0 0 24 24",
623
+ inner: '<path d="M5 12h14" /><path d="m12 5 7 7-7 7" />'
624
+ },
625
+ "link-externo": {
626
+ label: "Link externo",
627
+ group: NAV,
628
+ viewBox: "0 0 24 24",
629
+ inner: '<path d="M15 3h6v6" /><path d="M10 14 21 3" /><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6" />'
630
+ },
631
+ calendario: {
632
+ label: "Calend\xE1rio",
633
+ group: TIME_PLACE,
634
+ viewBox: "0 0 24 24",
635
+ inner: '<path d="M8 2v3" /><path d="M16 2v3" /><rect x="3" y="3" width="18" height="18" rx="2" /><path d="M3 9h18" />'
636
+ },
637
+ relogio: {
638
+ label: "Rel\xF3gio",
639
+ group: TIME_PLACE,
640
+ viewBox: "0 0 24 24",
641
+ inner: '<circle cx="12" cy="12" r="10" /><path d="M12 6v6l4 2" />'
642
+ },
643
+ localizacao: {
644
+ label: "Localiza\xE7\xE3o",
645
+ group: TIME_PLACE,
646
+ viewBox: "0 0 24 24",
647
+ inner: '<path d="M20 10c0 4.993-5.539 10.193-7.399 11.799a1 1 0 0 1-1.202 0C9.539 20.193 4 14.993 4 10a8 8 0 0 1 16 0" /><circle cx="12" cy="10" r="3" />'
648
+ },
649
+ predio: {
650
+ label: "Pr\xE9dio",
651
+ group: TIME_PLACE,
652
+ viewBox: "0 0 24 24",
653
+ inner: '<path d="M12 10h.01" /><path d="M12 14h.01" /><path d="M12 6h.01" /><path d="M16 10h.01" /><path d="M16 14h.01" /><path d="M16 6h.01" /><path d="M8 10h.01" /><path d="M8 14h.01" /><path d="M8 6h.01" /><path d="M9 22v-3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v3" /><rect x="4" y="2" width="16" height="20" rx="2" />'
654
+ },
655
+ estrela: {
656
+ label: "Estrela",
657
+ group: GENERAL,
658
+ viewBox: "0 0 24 24",
659
+ inner: '<path d="M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z" />'
660
+ },
661
+ coracao: {
662
+ label: "Cora\xE7\xE3o",
663
+ group: GENERAL,
664
+ viewBox: "0 0 24 24",
665
+ inner: '<path d="M2 9.5a5.5 5.5 0 0 1 9.591-3.676.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5" />'
666
+ },
667
+ globo: {
668
+ label: "Globo",
669
+ group: GENERAL,
670
+ viewBox: "0 0 24 24",
671
+ inner: '<circle cx="12" cy="12" r="10" /><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20" /><path d="M2 12h20" />'
672
+ },
673
+ usuario: {
674
+ label: "Usu\xE1rio",
675
+ group: GENERAL,
676
+ viewBox: "0 0 24 24",
677
+ inner: '<path d="M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2" /><circle cx="12" cy="7" r="4" />'
678
+ },
679
+ arquivo: {
680
+ label: "Arquivo",
681
+ group: GENERAL,
682
+ viewBox: "0 0 24 24",
683
+ inner: '<path d="M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z" /><path d="M14 2v5a1 1 0 0 0 1 1h5" />'
684
+ },
685
+ imagem: {
686
+ label: "Imagem",
687
+ group: GENERAL,
688
+ viewBox: "0 0 24 24",
689
+ inner: '<rect width="18" height="18" x="3" y="3" rx="2" ry="2" /><circle cx="9" cy="9" r="2" /><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21" />'
690
+ },
691
+ camera: {
692
+ label: "C\xE2mera",
693
+ group: GENERAL,
694
+ viewBox: "0 0 24 24",
695
+ inner: '<path d="M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z" /><circle cx="12" cy="13" r="3" />'
696
+ }
697
+ };
698
+ var CONTENT_ICON_NAMES = Object.keys(CONTENT_ICON_CATALOG);
699
+ function ContentIcon({
700
+ name,
701
+ size = "1em",
702
+ color = "currentColor",
703
+ strokeWidth = 2,
704
+ style,
705
+ className
706
+ }) {
707
+ const def = name ? CONTENT_ICON_CATALOG[name] : void 0;
708
+ if (!def) return null;
709
+ const stroked = def.variant !== "fill";
710
+ return /* @__PURE__ */ jsx(
711
+ "svg",
712
+ {
713
+ width: size,
714
+ height: size,
715
+ viewBox: def.viewBox,
716
+ fill: stroked ? "none" : color,
717
+ ...stroked ? { stroke: color, strokeWidth, strokeLinecap: "round", strokeLinejoin: "round" } : {},
718
+ "aria-hidden": "true",
719
+ focusable: "false",
720
+ className,
721
+ style: { display: "inline-block", verticalAlign: "-0.125em", flexShrink: 0, ...style },
722
+ dangerouslySetInnerHTML: { __html: def.inner }
723
+ }
724
+ );
725
+ }
726
+ var IconSlot = styled4.span`
727
+ flex: none;
728
+ color: var(--doc-brand, #005ac3);
729
+ line-height: 1;
730
+ `;
731
+ var Body = styled4.div`
732
+ flex: 1;
733
+ min-width: 0;
734
+ `;
735
+ var IconTextBlock = defineBlock({
736
+ key: "IconText",
737
+ label: "\xCDcone e texto",
738
+ category: "Layout",
739
+ icon: /* @__PURE__ */ jsx(IconTextIcon, {}),
740
+ fields: {
741
+ icon: {
742
+ type: "select",
743
+ label: "\xCDcone",
744
+ options: CONTENT_ICON_NAMES.map((name) => ({ label: CONTENT_ICON_CATALOG[name].label, value: name }))
745
+ },
746
+ content: { type: "textarea", label: "Texto (HTML)" },
747
+ iconSize: { type: "number", label: "Tamanho do \xEDcone (px)", min: 12, max: 96 },
748
+ iconRight: {
749
+ type: "radio",
750
+ label: "Posi\xE7\xE3o do \xEDcone",
751
+ options: [
752
+ { label: "Esquerda", value: false },
753
+ { label: "Direita", value: true }
754
+ ]
755
+ },
756
+ gap: {
757
+ type: "select",
758
+ label: "Espa\xE7amento",
759
+ options: [
760
+ { label: "Nenhum", value: "none" },
761
+ { label: "Pequeno", value: "small" },
762
+ { label: "M\xE9dio", value: "medium" },
763
+ { label: "Grande", value: "large" }
764
+ ]
765
+ }
766
+ },
767
+ propsSchema: z.object({
768
+ icon: z.string(),
769
+ content: z.string(),
770
+ iconSize: z.number().int().min(8).max(128),
771
+ iconRight: z.boolean(),
772
+ gap: z.enum(["none", "small", "medium", "large"])
773
+ }),
774
+ defaultProps: { icon: "check", content: "<p>Descreva o item.</p>", iconSize: 24, iconRight: false, gap: "small" },
775
+ component: ({ icon, content, iconSize, iconRight, gap, puck }) => {
776
+ const glyph = /* @__PURE__ */ jsx(IconSlot, { children: /* @__PURE__ */ jsx(ContentIcon, { name: icon, size: iconSize ?? 24 }) });
777
+ return /* @__PURE__ */ jsxs(Row, { $gap: GAP_PX[gap] ?? 8, $align: "flex-start", children: [
778
+ iconRight ? null : glyph,
779
+ /* @__PURE__ */ jsx(Body, { children: /* @__PURE__ */ jsx(RichText, { html: content, editing: puck?.isEditing }) }),
780
+ iconRight ? glyph : null
781
+ ] });
782
+ }
783
+ });
784
+ var Grid2 = styled4.table`
785
+ width: 100%;
786
+ border-collapse: collapse;
787
+ font-size: 0.95em;
788
+
789
+ th,
790
+ td {
791
+ padding: 8px 10px;
792
+ border-bottom: 1px solid rgba(127, 137, 152, 0.28);
793
+ text-align: left;
794
+ vertical-align: top;
795
+ }
796
+
797
+ th {
798
+ font-weight: 600;
799
+ background: color-mix(in srgb, var(--doc-brand, #005ac3) 8%, transparent);
800
+ }
801
+ `;
802
+ var TableBlock = defineBlock({
803
+ key: "Table",
804
+ label: "Tabela",
805
+ category: "Dados",
806
+ icon: /* @__PURE__ */ jsx(TableIcon, {}),
807
+ fields: {
808
+ headerRow: {
809
+ type: "radio",
810
+ label: "Primeira linha \xE9 cabe\xE7alho",
811
+ options: [
812
+ { label: "Sim", value: true },
813
+ { label: "N\xE3o", value: false }
814
+ ]
815
+ },
816
+ rows: {
817
+ type: "array",
818
+ label: "Linhas",
819
+ getItemSummary: (row, index) => row?.cells?.map((cell) => cell?.value).filter(Boolean).join(" \xB7 ") || `Linha ${(index ?? 0) + 1}`,
820
+ arrayFields: {
821
+ cells: {
822
+ type: "array",
823
+ label: "C\xE9lulas",
824
+ getItemSummary: (cell, index) => cell?.value || `Coluna ${(index ?? 0) + 1}`,
825
+ arrayFields: { value: { type: "text", label: "Conte\xFAdo" } },
826
+ defaultItemProps: { value: "" }
827
+ }
828
+ },
829
+ defaultItemProps: { cells: [{ value: "" }, { value: "" }] }
830
+ }
831
+ },
832
+ propsSchema: z.object({
833
+ rows: z.array(z.object({ cells: z.array(z.object({ value: z.string() })) })),
834
+ headerRow: z.boolean()
835
+ }),
836
+ defaultProps: {
837
+ headerRow: true,
838
+ rows: [{ cells: [{ value: "Item" }, { value: "Valor" }] }, { cells: [{ value: "Exemplo" }, { value: "R$ 0,00" }] }]
839
+ },
840
+ component: ({ rows = [], headerRow, puck }) => {
841
+ if (!rows.length) return puck?.isEditing ? /* @__PURE__ */ jsx(Placeholder, { children: "Adicione linhas \xE0 tabela" }) : null;
842
+ const [first, ...rest] = rows;
843
+ const body = headerRow ? rest : rows;
844
+ return /* @__PURE__ */ jsxs(Grid2, { children: [
845
+ headerRow ? /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { children: (first?.cells ?? []).map((cell, index) => (
846
+ // eslint-disable-next-line react/no-array-index-key -- a célula não tem id; a posição é a identidade
847
+ /* @__PURE__ */ jsx("th", { children: /* @__PURE__ */ jsx(RichText, { as: "span", html: cell?.value, editing: puck?.isEditing }) }, index)
848
+ )) }) }) : null,
849
+ /* @__PURE__ */ jsx("tbody", { children: body.map((row, rowIndex) => (
850
+ // eslint-disable-next-line react/no-array-index-key -- idem
851
+ /* @__PURE__ */ jsx("tr", { children: (row?.cells ?? []).map((cell, cellIndex) => (
852
+ // eslint-disable-next-line react/no-array-index-key -- idem
853
+ /* @__PURE__ */ jsx("td", { children: /* @__PURE__ */ jsx(RichText, { as: "span", html: cell?.value, editing: puck?.isEditing }) }, cellIndex)
854
+ )) }, rowIndex)
855
+ )) })
856
+ ] });
857
+ }
858
+ });
859
+ var PageBreakBlock = defineBlock({
860
+ key: "PageBreak",
861
+ label: "Quebra de p\xE1gina",
862
+ category: "Estrutura",
863
+ icon: /* @__PURE__ */ jsx(PageBreakIcon, {}),
864
+ fields: {},
865
+ propsSchema: z.object({}),
866
+ component: ({ puck }) => puck?.isEditing ? /* @__PURE__ */ jsx(PageBreakMark, { children: "Quebra de p\xE1gina" }) : null
867
+ });
868
+
869
+ // src/blocks/defaults.tsx
870
+ var defaultBlocks = [
871
+ TextBlock,
872
+ HeadingBlock,
873
+ ListBlock,
874
+ QuoteBlock,
875
+ ButtonBlock,
876
+ DividerBlock,
877
+ SpacerBlock,
878
+ ImageBlock,
879
+ ImageGridBlock,
880
+ TwoColumnsBlock,
881
+ ImageTextBlock,
882
+ IconTextBlock,
883
+ TableBlock,
884
+ PageBreakBlock
885
+ ];
886
+ var blocksByKey = Object.fromEntries(
887
+ defaultBlocks.map((block) => [block.key, block])
888
+ );
889
+
890
+ // src/blocks/overrideBlock.ts
891
+ function overrideBlock(key, patch = {}) {
892
+ const base = blocksByKey[key];
893
+ if (!base) {
894
+ devWarn(
895
+ `override-unknown-block:${key}`,
896
+ `overrideBlock('${key}') n\xE3o achou bloco default com essa key \u2014 nada foi herdado. Bloco que \xE9 s\xF3 do host se declara com defineBlock.`
897
+ );
898
+ }
899
+ return { ...base, key, ...patch };
900
+ }
901
+
902
+ export { ButtonBlock, CONTENT_ICON_CATALOG, CONTENT_ICON_NAMES, ContentIcon, DOCUMENT_PROSE_CSS, DOCUMENT_TEXT_CSS, DividerBlock, HeadingBlock, IconTextBlock, ImageBlock, ImageGridBlock, ImageTextBlock, ListBlock, PageBreakBlock, QuoteBlock, RichText, SpacerBlock, TableBlock, TextBlock, TwoColumnsBlock, blocksByKey, defaultBlocks, defineBlock, overrideBlock };
903
+ //# sourceMappingURL=chunk-OJZJJEJX.js.map
904
+ //# sourceMappingURL=chunk-OJZJJEJX.js.map