vobi_document 1.1.4 → 1.1.6

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 (47) hide show
  1. package/dist/blocks.cjs +25 -25
  2. package/dist/blocks.d.cts +1 -1
  3. package/dist/blocks.d.ts +1 -1
  4. package/dist/blocks.js +1 -1
  5. package/dist/{chunk-3KIK2XTA.cjs → chunk-CSQHYPHU.cjs} +14 -14
  6. package/dist/{chunk-3KIK2XTA.cjs.map → chunk-CSQHYPHU.cjs.map} +1 -1
  7. package/dist/{chunk-D3JG6YEL.cjs → chunk-LQIV7LT7.cjs} +8 -8
  8. package/dist/{chunk-D3JG6YEL.cjs.map → chunk-LQIV7LT7.cjs.map} +1 -1
  9. package/dist/{chunk-2EVBMRJR.js → chunk-NLM2NZWH.js} +3 -3
  10. package/dist/{chunk-2EVBMRJR.js.map → chunk-NLM2NZWH.js.map} +1 -1
  11. package/dist/{chunk-P2FDTTXF.js → chunk-NPNQGHGK.js} +9 -9
  12. package/dist/{chunk-P2FDTTXF.js.map → chunk-NPNQGHGK.js.map} +1 -1
  13. package/dist/{chunk-EX252M4Y.js → chunk-PNCVE5YE.js} +3 -3
  14. package/dist/{chunk-EX252M4Y.js.map → chunk-PNCVE5YE.js.map} +1 -1
  15. package/dist/{chunk-5H27FECZ.cjs → chunk-RGA2OGHE.cjs} +4 -4
  16. package/dist/{chunk-5H27FECZ.cjs.map → chunk-RGA2OGHE.cjs.map} +1 -1
  17. package/dist/{chunk-CPU4SK5F.cjs → chunk-RGG5BGMG.cjs} +105 -105
  18. package/dist/chunk-RGG5BGMG.cjs.map +1 -0
  19. package/dist/{chunk-RP4T57MA.cjs → chunk-USMVHVHF.cjs} +9 -9
  20. package/dist/{chunk-RP4T57MA.cjs.map → chunk-USMVHVHF.cjs.map} +1 -1
  21. package/dist/{chunk-PBBPAMLP.js → chunk-Y7ADQ2HV.js} +93 -93
  22. package/dist/chunk-Y7ADQ2HV.js.map +1 -0
  23. package/dist/{chunk-DQ4AL6SJ.js → chunk-Z3ZCB3ZT.js} +4 -4
  24. package/dist/{chunk-DQ4AL6SJ.js.map → chunk-Z3ZCB3ZT.js.map} +1 -1
  25. package/dist/editor.cjs +14 -14
  26. package/dist/editor.d.cts +1 -1
  27. package/dist/editor.d.ts +1 -1
  28. package/dist/editor.js +2 -2
  29. package/dist/index.cjs +83 -83
  30. package/dist/index.d.cts +2 -2
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.js +6 -6
  33. package/dist/print.cjs +19 -19
  34. package/dist/print.cjs.map +1 -1
  35. package/dist/print.d.cts +1 -1
  36. package/dist/print.d.ts +1 -1
  37. package/dist/print.js +5 -5
  38. package/dist/print.js.map +1 -1
  39. package/dist/render.cjs +18 -18
  40. package/dist/render.d.cts +1 -1
  41. package/dist/render.d.ts +1 -1
  42. package/dist/render.js +3 -3
  43. package/dist/{theme-BuEFpQeZ.d.cts → theme-DWRLG-2_.d.cts} +1 -1
  44. package/dist/{theme-BuEFpQeZ.d.ts → theme-DWRLG-2_.d.ts} +1 -1
  45. package/package.json +1 -1
  46. package/dist/chunk-CPU4SK5F.cjs.map +0 -1
  47. package/dist/chunk-PBBPAMLP.js.map +0 -1
@@ -1,4 +1,4 @@
1
- import { DEFAULT_DOCUMENT_COLORS, buildConfig, useDocumentFont, DocumentThemeProvider, fontStack } from './chunk-DQ4AL6SJ.js';
1
+ import { DEFAULT_DOCUMENT_COLORS, buildConfig, useDocumentFont, DocumentThemeProvider, fontStack } from './chunk-Z3ZCB3ZT.js';
2
2
  import { resolveDocumentVariables } from './chunk-CZB7F2LA.js';
3
3
  import { extractBindingKeys, CatalogProvider, ResolvedProvider } from './chunk-SOIYSSU3.js';
4
4
  import { createContext, useContext, useMemo, useState, useEffect } from 'react';
@@ -157,95 +157,17 @@ styled6.div`
157
157
  letter-spacing: 0.04em;
158
158
  opacity: 0.8;
159
159
  `;
160
- var HAIRLINE = "#d9d9d9";
161
- var Chrome = styled6.div`
162
- position: relative;
163
- display: flex;
164
- flex-direction: column;
165
- justify-content: space-between;
166
- height: 100%;
167
- padding: 0 7cqw 8cqw;
168
- `;
169
- var TopRow = styled6.div`
170
- display: flex;
171
- justify-content: space-between;
172
- align-items: flex-start;
173
- gap: 4cqw;
174
- `;
175
- var Logo = styled6(CoverLogoImg)`
176
- max-width: 17cqw;
177
- max-height: 17cqw;
178
- `;
179
- var Company = styled6(CoverField)`
180
- display: block;
181
- margin-top: 5cqw;
182
- max-width: 45cqw;
183
- font-size: 2.94cqw;
184
- font-weight: 800;
185
- line-height: 1.15;
186
- letter-spacing: 0.3cqw;
187
- text-align: right;
188
- text-transform: uppercase;
189
- `;
190
- var Head = styled6.div`
191
- display: flex;
192
- flex-direction: column;
193
-
194
- &::before,
195
- &::after {
196
- content: '';
197
- width: 19cqw;
198
- height: 0.9cqw;
199
- background: ${HAIRLINE};
200
- }
201
- &::before {
202
- margin-bottom: 6cqw;
203
- }
204
- &::after {
205
- margin-top: 6cqw;
206
- }
207
- `;
208
- var Title = styled6(CoverField)`
209
- display: block;
210
- font-size: 8.82cqw;
211
- font-weight: 800;
212
- line-height: 1.15;
213
- letter-spacing: 0.88cqw;
214
- text-transform: uppercase;
215
- `;
216
- var Subtitle = styled6(CoverField)`
217
- display: block;
218
- margin-top: 3cqw;
219
- font-size: 3.53cqw;
220
- font-weight: 400;
221
- line-height: 1.3;
222
- `;
223
- function Model1({ fields, theme, textColor, bgColor }) {
224
- return /* @__PURE__ */ jsxs(CoverFrame, { $font: fontStack(theme?.documentFont), $bg: fields.imageUrl ? void 0 : bgColor, $color: textColor, children: [
225
- fields.imageUrl ? /* @__PURE__ */ jsx(FullBleedImage, { $overlay: bgColor, $overlayOpacity: 0.85, children: /* @__PURE__ */ jsx(CoverImage, { src: fields.imageUrl }) }) : null,
226
- /* @__PURE__ */ jsxs(Chrome, { children: [
227
- /* @__PURE__ */ jsxs(TopRow, { children: [
228
- theme?.logo?.url ? /* @__PURE__ */ jsx(Logo, { src: theme.logo.url, alt: "" }) : /* @__PURE__ */ jsx("span", {}),
229
- /* @__PURE__ */ jsx(Company, { name: "presentedBy", value: fields.presentedBy, placeholder: "Nome da empresa" })
230
- ] }),
231
- /* @__PURE__ */ jsxs(Head, { children: [
232
- /* @__PURE__ */ jsx(Title, { name: "title", value: fields.title, placeholder: "Digite o t\xEDtulo..." }),
233
- /* @__PURE__ */ jsx(Subtitle, { name: "subtitle", value: fields.subtitle, placeholder: "Digite o subt\xEDtulo..." })
234
- ] })
235
- ] })
236
- ] });
237
- }
238
160
  var BAND_BG = "#e8ecf1";
239
- var HAIRLINE2 = "#d5dae1";
161
+ var HAIRLINE = "#d5dae1";
240
162
  var Hairline = styled6.div`
241
163
  position: absolute;
242
164
  left: 4.7%;
243
165
  top: 3%;
244
166
  height: 94%;
245
167
  width: 1px;
246
- background: ${HAIRLINE2};
168
+ background: ${HAIRLINE};
247
169
  `;
248
- var Logo2 = styled6(CoverLogoImg)`
170
+ var Logo = styled6(CoverLogoImg)`
249
171
  position: absolute;
250
172
  left: 10.9%;
251
173
  top: 6%;
@@ -260,7 +182,7 @@ var AccentBar = styled6.div`
260
182
  height: 28.7%;
261
183
  background: ${(p) => p.$accent};
262
184
  `;
263
- var Head2 = styled6.div`
185
+ var Head = styled6.div`
264
186
  position: absolute;
265
187
  left: 10.9%;
266
188
  right: 6%;
@@ -268,7 +190,7 @@ var Head2 = styled6.div`
268
190
  display: flex;
269
191
  flex-direction: column;
270
192
  `;
271
- var Title2 = styled6(CoverField)`
193
+ var Title = styled6(CoverField)`
272
194
  display: block;
273
195
  font-weight: 800;
274
196
  font-size: 12.6cqw;
@@ -309,18 +231,18 @@ var Value = styled6(CoverField)`
309
231
  line-height: 1.3;
310
232
  text-transform: uppercase;
311
233
  `;
312
- function Model2({ fields, theme, accent, textColor, bgColor }) {
234
+ function Model1({ fields, theme, accent, textColor, bgColor }) {
313
235
  const { editable } = useContext(CoverEditContext);
314
236
  const showHead = editable || Boolean(fields.title || fields.date);
315
237
  const showPrepared = editable || Boolean(fields.preparedFor);
316
238
  const showPresented = editable || Boolean(fields.presentedBy);
317
239
  const hasBand = showPrepared || showPresented;
318
240
  return /* @__PURE__ */ jsxs(CoverFrame, { $font: fontStack(theme?.documentFont), $bg: bgColor, $color: textColor, children: [
319
- theme?.logo?.url ? /* @__PURE__ */ jsx(Logo2, { src: theme.logo.url, alt: "" }) : null,
241
+ theme?.logo?.url ? /* @__PURE__ */ jsx(Logo, { src: theme.logo.url, alt: "" }) : null,
320
242
  showHead ? /* @__PURE__ */ jsxs(Fragment, { children: [
321
243
  /* @__PURE__ */ jsx(AccentBar, { $accent: accent }),
322
- /* @__PURE__ */ jsxs(Head2, { "data-cover-head": true, children: [
323
- /* @__PURE__ */ jsx(Title2, { name: "title", value: fields.title, placeholder: "Digite o t\xEDtulo..." }),
244
+ /* @__PURE__ */ jsxs(Head, { "data-cover-head": true, children: [
245
+ /* @__PURE__ */ jsx(Title, { name: "title", value: fields.title, placeholder: "Digite o t\xEDtulo..." }),
324
246
  /* @__PURE__ */ jsx(DateLine, { name: "date", value: fields.date, placeholder: "M\xEAs e ano" })
325
247
  ] })
326
248
  ] }) : null,
@@ -337,6 +259,84 @@ function Model2({ fields, theme, accent, textColor, bgColor }) {
337
259
  /* @__PURE__ */ jsx(Hairline, {})
338
260
  ] });
339
261
  }
262
+ var HAIRLINE2 = "#d9d9d9";
263
+ var Chrome = styled6.div`
264
+ position: relative;
265
+ display: flex;
266
+ flex-direction: column;
267
+ justify-content: space-between;
268
+ height: 100%;
269
+ padding: 0 7cqw 8cqw;
270
+ `;
271
+ var TopRow = styled6.div`
272
+ display: flex;
273
+ justify-content: space-between;
274
+ align-items: flex-start;
275
+ gap: 4cqw;
276
+ `;
277
+ var Logo2 = styled6(CoverLogoImg)`
278
+ max-width: 17cqw;
279
+ max-height: 17cqw;
280
+ `;
281
+ var Company = styled6(CoverField)`
282
+ display: block;
283
+ margin-top: 5cqw;
284
+ max-width: 45cqw;
285
+ font-size: 2.94cqw;
286
+ font-weight: 800;
287
+ line-height: 1.15;
288
+ letter-spacing: 0.3cqw;
289
+ text-align: right;
290
+ text-transform: uppercase;
291
+ `;
292
+ var Head2 = styled6.div`
293
+ display: flex;
294
+ flex-direction: column;
295
+
296
+ &::before,
297
+ &::after {
298
+ content: '';
299
+ width: 19cqw;
300
+ height: 0.9cqw;
301
+ background: ${HAIRLINE2};
302
+ }
303
+ &::before {
304
+ margin-bottom: 6cqw;
305
+ }
306
+ &::after {
307
+ margin-top: 6cqw;
308
+ }
309
+ `;
310
+ var Title2 = styled6(CoverField)`
311
+ display: block;
312
+ font-size: 8.82cqw;
313
+ font-weight: 800;
314
+ line-height: 1.15;
315
+ letter-spacing: 0.88cqw;
316
+ text-transform: uppercase;
317
+ `;
318
+ var Subtitle = styled6(CoverField)`
319
+ display: block;
320
+ margin-top: 3cqw;
321
+ font-size: 3.53cqw;
322
+ font-weight: 400;
323
+ line-height: 1.3;
324
+ `;
325
+ function Model2({ fields, theme, textColor, bgColor }) {
326
+ return /* @__PURE__ */ jsxs(CoverFrame, { $font: fontStack(theme?.documentFont), $bg: fields.imageUrl ? void 0 : bgColor, $color: textColor, children: [
327
+ fields.imageUrl ? /* @__PURE__ */ jsx(FullBleedImage, { $overlay: bgColor, $overlayOpacity: 0.85, children: /* @__PURE__ */ jsx(CoverImage, { src: fields.imageUrl }) }) : null,
328
+ /* @__PURE__ */ jsxs(Chrome, { children: [
329
+ /* @__PURE__ */ jsxs(TopRow, { children: [
330
+ theme?.logo?.url ? /* @__PURE__ */ jsx(Logo2, { src: theme.logo.url, alt: "" }) : /* @__PURE__ */ jsx("span", {}),
331
+ /* @__PURE__ */ jsx(Company, { name: "presentedBy", value: fields.presentedBy, placeholder: "Nome da empresa" })
332
+ ] }),
333
+ /* @__PURE__ */ jsxs(Head2, { children: [
334
+ /* @__PURE__ */ jsx(Title2, { name: "title", value: fields.title, placeholder: "Digite o t\xEDtulo..." }),
335
+ /* @__PURE__ */ jsx(Subtitle, { name: "subtitle", value: fields.subtitle, placeholder: "Digite o subt\xEDtulo..." })
336
+ ] })
337
+ ] })
338
+ ] });
339
+ }
340
340
  var ImageBand = styled6.div`
341
341
  position: relative;
342
342
  width: 100%;
@@ -495,7 +495,7 @@ function Model4({ fields, theme, accent, textColor, bgColor }) {
495
495
  ] }),
496
496
  showPrepared || showPresented ? /* @__PURE__ */ jsxs(Footer, { "data-cover-footer": true, children: [
497
497
  showPrepared ? /* @__PURE__ */ jsxs(Party, { children: [
498
- /* @__PURE__ */ jsx(Label3, { children: "Apresentada para" }),
498
+ /* @__PURE__ */ jsx(Label3, { children: "Preparada para" }),
499
499
  /* @__PURE__ */ jsx(Value3, { name: "preparedFor", value: fields.preparedFor, placeholder: "Nome do cliente" })
500
500
  ] }) : null,
501
501
  showPresented ? /* @__PURE__ */ jsxs(Party, { children: [
@@ -608,8 +608,8 @@ var COVER_TEMPLATES = {
608
608
  var COVER_TEMPLATE_IDS = Object.keys(COVER_TEMPLATES);
609
609
  var resolveCoverAccent = (accent, theme) => accent ?? theme?.colors?.brand ?? DEFAULT_DOCUMENT_COLORS.brand;
610
610
  var COVER_SURFACES = {
611
- "model-1": "brand",
612
- "model-2": "background",
611
+ "model-1": "background",
612
+ "model-2": "brand",
613
613
  "model-3": "brand",
614
614
  "model-4": "dark",
615
615
  "model-5": "background"
@@ -817,5 +817,5 @@ var DG_READY = "dg-ready";
817
817
  var DG_ERROR = "dg-error";
818
818
 
819
819
  export { COMPANY_INFO_ICONS, COVER_TEMPLATES, COVER_TEMPLATE_IDS, CoverEditContext, CoverPage, DG_ERROR, DG_MESSAGE_SOURCE, DG_READY, DocumentRenderer, FOOTER_INFO_ORDER, FooterBar, HEADER_INFO_ORDER, HeaderBar, resolveCoverAccent, resolveCoverColors };
820
- //# sourceMappingURL=chunk-PBBPAMLP.js.map
821
- //# sourceMappingURL=chunk-PBBPAMLP.js.map
820
+ //# sourceMappingURL=chunk-Y7ADQ2HV.js.map
821
+ //# sourceMappingURL=chunk-Y7ADQ2HV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/render/DocumentRenderer.tsx","../src/render/chrome/covers/primitives.tsx","../src/render/chrome/covers/covers.styles.ts","../src/render/chrome/covers/Model1.tsx","../src/render/chrome/covers/Model2.tsx","../src/render/chrome/covers/Model3.tsx","../src/render/chrome/covers/Model4.tsx","../src/render/chrome/covers/Model5.tsx","../src/render/chrome/covers/index.ts","../src/render/chrome/CoverPage.tsx","../src/render/chrome/icons.tsx","../src/render/chrome/chrome.styles.ts","../src/render/chrome/HeaderBar.tsx","../src/render/chrome/FooterBar.tsx","../src/render/messages.ts"],"names":["jsx","styled","useContext","HAIRLINE","Logo","Head","Title","jsxs","Subtitle","Label","Value","Body","ImageBand"],"mappings":"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","file":"chunk-Y7ADQ2HV.js","sourcesContent":["import { useEffect, useMemo, useState } from 'react';\nimport { type Data, type Metadata, Render } from '@puckeditor/core';\nimport { buildConfig } from '../core/buildConfig';\nimport type { Registry } from '../blocks/types';\nimport type { Theme } from '../schema/theme';\nimport { useDocumentFont } from '../surface/useDocumentFont';\nimport { DocumentThemeProvider } from '../surface/themeContext';\nimport { CatalogProvider } from '../variables/catalogContext';\nimport { ResolvedProvider } from '../variables/resolvedContext';\nimport { resolveDocumentVariables } from '../variables/resolve';\nimport { extractBindingKeys } from '../variables/bindings';\nimport type {\n ResolvedVariables,\n UnresolvedDisplay,\n VariableContext,\n VariableDef,\n VariableResolver\n} from '../variables/types';\n\nexport type DocumentRendererProps = {\n registry: Registry;\n data: Data;\n theme?: Theme;\n catalog?: VariableDef[];\n /** Live resolution (browser preview). Called in an effect. */\n resolver?: VariableResolver;\n ctx?: VariableContext;\n resolvedVariables?: ResolvedVariables;\n unresolvedDisplay?: UnresolvedDisplay;\n metadata?: Metadata;\n};\n\nexport function DocumentRenderer({\n registry,\n data,\n theme = {},\n catalog = [],\n resolver,\n ctx = {},\n resolvedVariables,\n unresolvedDisplay = 'placeholder',\n metadata\n}: DocumentRendererProps) {\n // Sem `theme`: ele chega pelo DocumentThemeProvider (config estável — ver docs/architecture.md).\n const config = useMemo(() => buildConfig(registry), [registry]);\n const [resolved, setResolved] = useState<ResolvedVariables>(resolvedVariables ?? {});\n\n useDocumentFont(theme.documentFont);\n\n const keysHash = useMemo(() => extractBindingKeys(data).sort().join('|'), [data]);\n const ctxHash = JSON.stringify(ctx);\n\n useEffect(() => {\n if (resolvedVariables || !resolver || keysHash === '') return undefined;\n let active = true;\n resolveDocumentVariables(data, catalog, resolver, ctx).then(next => {\n if (active) setResolved(next);\n });\n return () => {\n active = false;\n };\n // Keyado por keysHash/ctxHash (não por data) — evita refetch por edição.\n }, [resolvedVariables, resolver, catalog, keysHash, ctxHash]);\n\n const effective = resolvedVariables ?? resolved;\n\n return (\n <DocumentThemeProvider theme={theme}>\n <CatalogProvider catalog={catalog}>\n <ResolvedProvider resolved={effective} unresolvedDisplay={unresolvedDisplay}>\n <Render config={config} data={data} metadata={metadata} />\n </ResolvedProvider>\n </CatalogProvider>\n </DocumentThemeProvider>\n );\n}\n","import { createContext, useContext, type ElementType, type KeyboardEvent, type FocusEvent } from 'react';\nimport type { Theme, CoverFields } from '../../../schema/theme';\n\nexport type CoverEditCtx = {\n editable: boolean;\n onFieldChange?: (name: keyof CoverFields, value: string) => void;\n onImagePick?: () => void;\n};\n\nexport const CoverEditContext = createContext<CoverEditCtx>({ editable: false });\n\nexport type CoverTemplateProps = {\n fields: CoverFields;\n theme?: Theme;\n accent: string;\n textColor: string;\n bgColor: string;\n};\n\ntype CoverFieldProps = {\n name: keyof CoverFields;\n value?: string;\n placeholder: string;\n as?: ElementType;\n className?: string;\n};\n\nexport function CoverField({ name, value, placeholder, as: Tag = 'span', className }: CoverFieldProps) {\n const { editable, onFieldChange } = useContext(CoverEditContext);\n if (!editable) return value ? <Tag className={className}>{value}</Tag> : null;\n return (\n <Tag\n className={className}\n data-cover-field={name}\n data-placeholder={placeholder}\n contentEditable\n suppressContentEditableWarning\n onBlur={(e: FocusEvent<HTMLElement>) => onFieldChange?.(name, e.currentTarget.textContent?.trim() ?? '')}\n onKeyDown={(e: KeyboardEvent<HTMLElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n (e.currentTarget as HTMLElement).blur();\n }\n }}\n >\n {value}\n </Tag>\n );\n}\n\ntype CoverImageProps = { src?: string; className?: string };\n\nexport function CoverImage({ src, className }: CoverImageProps) {\n const { editable, onImagePick } = useContext(CoverEditContext);\n if (!editable) {\n return src ? (\n <div className={className} data-cover-image>\n <img src={src} alt=\"\" />\n </div>\n ) : null;\n }\n return (\n <div\n className={className}\n data-cover-image\n role=\"button\"\n tabIndex={0}\n onClick={() => onImagePick?.()}\n onKeyDown={(e: KeyboardEvent<HTMLElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onImagePick?.();\n }\n }}\n >\n {src ? <img src={src} alt=\"\" /> : <span>Adicionar imagem</span>}\n </div>\n );\n}\n","import styled from 'styled-components';\n\n// Página A4 inteira; cores/fonte por props (capa é irmã do PageFrame, não herda --doc-*).\nexport const CoverFrame = styled.div<{ $font: string; $bg?: string; $color?: string }>`\n position: relative;\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n font-family: ${p => p.$font};\n background: ${p => p.$bg ?? '#FFFFFF'};\n color: ${p => p.$color ?? '#111827'};\n overflow-wrap: break-word;\n\n [data-cover-field][contenteditable] {\n cursor: text;\n outline: 1px dashed transparent;\n outline-offset: 3px;\n transition: outline-color 0.12s ease;\n }\n [data-cover-field][contenteditable]:hover {\n outline-color: rgba(0, 90, 195, 0.45);\n }\n [data-cover-field][contenteditable]:focus {\n outline: 1px solid rgba(0, 90, 195, 0.8);\n }\n [data-cover-field][contenteditable]:empty::before {\n content: attr(data-placeholder);\n opacity: 0.45;\n font-style: italic;\n }\n [data-cover-image][role='button'] {\n cursor: pointer;\n outline: 1px dashed transparent;\n outline-offset: 3px;\n transition: outline-color 0.12s ease;\n }\n [data-cover-image][role='button']:hover {\n outline-color: rgba(0, 90, 195, 0.45);\n }\n [data-cover-image] img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n }\n`;\n\nexport const FullBleedImage = styled.div<{ $overlay: string; $overlayOpacity?: number }>`\n position: absolute;\n inset: 0;\n\n & > [data-cover-image] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ffffff;\n }\n\n &::after {\n content: '';\n position: absolute;\n inset: 0;\n background: ${p => p.$overlay};\n opacity: ${p => p.$overlayOpacity ?? 0.55};\n }\n`;\n\nexport const CoverLogoImg = styled.img`\n max-height: 48px;\n max-width: 160px;\n object-fit: contain;\n`;\n\nexport const LabelSmall = styled.div`\n font-size: 11px;\n letter-spacing: 0.04em;\n opacity: 0.8;\n`;\n","import { useContext } from 'react';\nimport styled from 'styled-components';\nimport { fontStack } from '../../../surface/fonts';\nimport { CoverEditContext, CoverField, type CoverTemplateProps } from './primitives';\nimport { CoverFrame, CoverLogoImg } from './covers.styles';\n\nconst BAND_BG = '#e8ecf1';\nconst HAIRLINE = '#d5dae1';\n\nconst Hairline = styled.div`\n position: absolute;\n left: 4.7%;\n top: 3%;\n height: 94%;\n width: 1px;\n background: ${HAIRLINE};\n`;\n\nconst Logo = styled(CoverLogoImg)`\n position: absolute;\n left: 10.9%;\n top: 6%;\n max-height: 13.6cqw;\n max-width: 32.7cqw;\n`;\n\nconst AccentBar = styled.div<{ $accent: string }>`\n position: absolute;\n left: 4.7%;\n top: 22.3%;\n width: 1.13cqw;\n height: 28.7%;\n background: ${p => p.$accent};\n`;\n\nconst Head = styled.div`\n position: absolute;\n left: 10.9%;\n right: 6%;\n top: 22.3%;\n display: flex;\n flex-direction: column;\n`;\n\nconst Title = styled(CoverField)`\n display: block;\n font-weight: 800;\n font-size: 12.6cqw;\n line-height: 1.2;\n letter-spacing: -0.63cqw;\n text-transform: uppercase;\n`;\n\nconst DateLine = styled(CoverField)`\n display: block;\n margin-top: 3.3cqw;\n font-size: 4.5cqw;\n font-weight: 400;\n`;\n\nconst Band = styled.div`\n position: absolute;\n left: 0;\n bottom: 0;\n width: 100%;\n height: 29.2%;\n background: ${BAND_BG};\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 4.3cqw;\n padding-left: 10.9%;\n padding-right: 6%;\n box-sizing: border-box;\n`;\n\nconst Label = styled.div`\n font-size: 2.77cqw;\n font-weight: 400;\n`;\n\nconst Value = styled(CoverField)`\n display: block;\n margin-top: 1cqw;\n font-size: 3.4cqw;\n font-weight: 700;\n line-height: 1.3;\n text-transform: uppercase;\n`;\n\nexport function Model1({ fields, theme, accent, textColor, bgColor }: CoverTemplateProps) {\n const { editable } = useContext(CoverEditContext);\n const showHead = editable || Boolean(fields.title || fields.date);\n const showPrepared = editable || Boolean(fields.preparedFor);\n const showPresented = editable || Boolean(fields.presentedBy);\n const hasBand = showPrepared || showPresented;\n return (\n <CoverFrame $font={fontStack(theme?.documentFont)} $bg={bgColor} $color={textColor}>\n {theme?.logo?.url ? <Logo src={theme.logo.url} alt=\"\" /> : null}\n {showHead ? (\n <>\n <AccentBar $accent={accent} />\n <Head data-cover-head>\n <Title name=\"title\" value={fields.title} placeholder=\"Digite o título...\" />\n <DateLine name=\"date\" value={fields.date} placeholder=\"Mês e ano\" />\n </Head>\n </>\n ) : null}\n {hasBand ? (\n <Band data-cover-band>\n {showPrepared ? (\n <div>\n <Label>Preparada para</Label>\n <Value name=\"preparedFor\" value={fields.preparedFor} placeholder=\"Nome do cliente\" />\n </div>\n ) : null}\n {showPresented ? (\n <div>\n <Label>Apresentada por</Label>\n <Value name=\"presentedBy\" value={fields.presentedBy} placeholder=\"Nome da empresa\" />\n </div>\n ) : null}\n </Band>\n ) : null}\n <Hairline />\n </CoverFrame>\n );\n}\n","import styled from 'styled-components';\nimport { fontStack } from '../../../surface/fonts';\nimport { CoverField, CoverImage, type CoverTemplateProps } from './primitives';\nimport { CoverFrame, FullBleedImage, CoverLogoImg } from './covers.styles';\n\nconst HAIRLINE = '#d9d9d9';\n\nconst Chrome = styled.div`\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n height: 100%;\n padding: 0 7cqw 8cqw;\n`;\n\nconst TopRow = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 4cqw;\n`;\n\nconst Logo = styled(CoverLogoImg)`\n max-width: 17cqw;\n max-height: 17cqw;\n`;\n\nconst Company = styled(CoverField)`\n display: block;\n margin-top: 5cqw;\n max-width: 45cqw;\n font-size: 2.94cqw;\n font-weight: 800;\n line-height: 1.15;\n letter-spacing: 0.3cqw;\n text-align: right;\n text-transform: uppercase;\n`;\n\nconst Head = styled.div`\n display: flex;\n flex-direction: column;\n\n &::before,\n &::after {\n content: '';\n width: 19cqw;\n height: 0.9cqw;\n background: ${HAIRLINE};\n }\n &::before {\n margin-bottom: 6cqw;\n }\n &::after {\n margin-top: 6cqw;\n }\n`;\n\nconst Title = styled(CoverField)`\n display: block;\n font-size: 8.82cqw;\n font-weight: 800;\n line-height: 1.15;\n letter-spacing: 0.88cqw;\n text-transform: uppercase;\n`;\n\nconst Subtitle = styled(CoverField)`\n display: block;\n margin-top: 3cqw;\n font-size: 3.53cqw;\n font-weight: 400;\n line-height: 1.3;\n`;\n\nexport function Model2({ fields, theme, textColor, bgColor }: CoverTemplateProps) {\n return (\n <CoverFrame $font={fontStack(theme?.documentFont)} $bg={fields.imageUrl ? undefined : bgColor} $color={textColor}>\n {fields.imageUrl ? (\n <FullBleedImage $overlay={bgColor} $overlayOpacity={0.85}>\n <CoverImage src={fields.imageUrl} />\n </FullBleedImage>\n ) : null}\n <Chrome>\n <TopRow>\n {theme?.logo?.url ? <Logo src={theme.logo.url} alt=\"\" /> : <span />}\n <Company name=\"presentedBy\" value={fields.presentedBy} placeholder=\"Nome da empresa\" />\n </TopRow>\n <Head>\n <Title name=\"title\" value={fields.title} placeholder=\"Digite o título...\" />\n <Subtitle name=\"subtitle\" value={fields.subtitle} placeholder=\"Digite o subtítulo...\" />\n </Head>\n </Chrome>\n </CoverFrame>\n );\n}\n","import { useContext } from 'react';\nimport styled from 'styled-components';\nimport { fontStack } from '../../../surface/fonts';\nimport { CoverEditContext, CoverField, CoverImage, type CoverTemplateProps } from './primitives';\nimport { CoverFrame, CoverLogoImg } from './covers.styles';\n\nconst ImageBand = styled.div`\n position: relative;\n width: 100%;\n height: 42.9cqw;\n flex-shrink: 0;\n overflow: hidden;\n background: #1a1a1a;\n\n & > [data-cover-image] {\n position: absolute;\n inset: 0;\n }\n`;\n\nconst Logo = styled(CoverLogoImg)`\n position: absolute;\n top: 1.2cqw;\n right: 5.9cqw;\n max-width: 14.7cqw;\n max-height: 14.7cqw;\n`;\n\nconst Body = styled.div`\n flex: 1;\n display: flex;\n flex-direction: column;\n padding: 11.5cqw 9.4cqw 7.35cqw;\n`;\n\nconst DateField = styled(CoverField)`\n display: block;\n font-size: 2.94cqw;\n font-weight: 400;\n opacity: 0.5;\n`;\n\nconst Title = styled(CoverField)`\n display: block;\n margin-top: 2.35cqw;\n font-size: 10.6cqw;\n font-weight: 800;\n line-height: 1.2;\n text-transform: uppercase;\n`;\n\nconst Subtitle = styled(CoverField)`\n display: block;\n margin-top: 4.7cqw;\n font-size: 3.53cqw;\n font-weight: 400;\n opacity: 0.62;\n`;\n\nconst Parties = styled.div`\n margin-top: 13.8cqw;\n display: flex;\n flex-direction: column;\n gap: 4.7cqw;\n`;\n\nconst Label = styled.div`\n font-size: 3.53cqw;\n font-weight: 600;\n`;\n\nconst Value = styled(CoverField)`\n display: block;\n margin-top: 0.7cqw;\n font-size: 3.53cqw;\n font-weight: 400;\n opacity: 0.62;\n`;\n\nexport function Model3({ fields, theme, textColor, bgColor }: CoverTemplateProps) {\n const { editable } = useContext(CoverEditContext);\n const showPresented = editable || Boolean(fields.presentedBy);\n const showPrepared = editable || Boolean(fields.preparedFor);\n return (\n <CoverFrame $font={fontStack(theme?.documentFont)} $bg={bgColor} $color={textColor}>\n <ImageBand>\n {fields.imageUrl ? <CoverImage src={fields.imageUrl} /> : null}\n {theme?.logo?.url ? <Logo src={theme.logo.url} alt=\"\" /> : null}\n </ImageBand>\n <Body>\n <DateField name=\"date\" value={fields.date} placeholder=\"Mês e ano\" />\n <Title name=\"title\" value={fields.title} placeholder=\"Digite o título...\" />\n <Subtitle name=\"subtitle\" value={fields.subtitle} placeholder=\"Digite o subtítulo...\" />\n {showPresented || showPrepared ? (\n <Parties data-cover-parties>\n {showPresented ? (\n <div>\n <Label>Apresentada por</Label>\n <Value name=\"presentedBy\" value={fields.presentedBy} placeholder=\"Nome da empresa\" />\n </div>\n ) : null}\n {showPrepared ? (\n <div>\n <Label>Preparada para</Label>\n <Value name=\"preparedFor\" value={fields.preparedFor} placeholder=\"Nome do cliente\" />\n </div>\n ) : null}\n </Parties>\n ) : null}\n </Body>\n </CoverFrame>\n );\n}\n","import { useContext } from 'react';\nimport styled from 'styled-components';\nimport { fontStack } from '../../../surface/fonts';\nimport { CoverEditContext, CoverField, type CoverTemplateProps } from './primitives';\nimport { CoverFrame, CoverLogoImg } from './covers.styles';\n\nconst Body = styled.div`\n display: flex;\n flex-direction: column;\n height: 100%;\n padding: 4.12cqw 9.4cqw 0;\n`;\n\nconst Logo = styled(CoverLogoImg)`\n max-width: 14.7cqw;\n max-height: 14.7cqw;\n`;\n\nconst Head = styled.div`\n margin-top: 23.2cqw;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n`;\n\nconst DateChip = styled(CoverField)<{ $accent: string }>`\n display: inline-block;\n align-self: flex-start;\n max-width: 100%;\n background: ${p => p.$accent};\n border-radius: 1000px;\n padding: 1.18cqw 2.94cqw;\n font-size: 2.94cqw;\n font-weight: 400;\n color: #ffffff;\n`;\n\nconst Title = styled(CoverField)`\n display: block;\n align-self: stretch;\n margin-top: 3.5cqw;\n font-size: 14.1cqw;\n font-weight: 300;\n line-height: 1.1;\n`;\n\nconst Footer = styled.div`\n margin-top: auto;\n padding-bottom: 11cqw;\n display: flex;\n gap: 6cqw;\n`;\n\nconst Party = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nconst Label = styled.div`\n font-size: 3.53cqw;\n font-weight: 300;\n opacity: 0.72;\n`;\n\nconst Value = styled(CoverField)`\n display: block;\n margin-top: 1.5cqw;\n font-size: 4.12cqw;\n font-weight: 500;\n`;\n\nexport function Model4({ fields, theme, accent, textColor, bgColor }: CoverTemplateProps) {\n const { editable } = useContext(CoverEditContext);\n const showPrepared = editable || Boolean(fields.preparedFor);\n const showPresented = editable || Boolean(fields.presentedBy);\n return (\n <CoverFrame $font={fontStack(theme?.documentFont)} $bg={bgColor} $color={textColor}>\n <Body>\n {theme?.logo?.url ? <Logo src={theme.logo.url} alt=\"\" /> : <span />}\n <Head>\n <DateChip name=\"date\" value={fields.date} placeholder=\"Mês e ano\" $accent={accent} />\n <Title name=\"title\" value={fields.title} placeholder=\"Digite o título...\" />\n </Head>\n {showPrepared || showPresented ? (\n <Footer data-cover-footer>\n {showPrepared ? (\n <Party>\n <Label>Preparada para</Label>\n <Value name=\"preparedFor\" value={fields.preparedFor} placeholder=\"Nome do cliente\" />\n </Party>\n ) : null}\n {showPresented ? (\n <Party>\n <Label>Apresentada por</Label>\n <Value name=\"presentedBy\" value={fields.presentedBy} placeholder=\"Nome da empresa\" />\n </Party>\n ) : null}\n </Footer>\n ) : null}\n </Body>\n </CoverFrame>\n );\n}\n","import { useContext } from 'react';\nimport styled from 'styled-components';\nimport { fontStack } from '../../../surface/fonts';\nimport { CoverEditContext, CoverField, CoverImage, type CoverTemplateProps } from './primitives';\nimport { CoverFrame, FullBleedImage, CoverLogoImg } from './covers.styles';\n\nconst Spacer = styled.div`\n height: 24.4cqw;\n flex-shrink: 0;\n`;\n\nconst ImageBand = styled.div`\n position: relative;\n width: 100%;\n height: 64.4cqw;\n flex-shrink: 0;\n overflow: hidden;\n background: #e8eef7;\n`;\n\nconst Bar = styled.div<{ $accent: string }>`\n position: absolute;\n width: 47.9cqw;\n height: 2.06cqw;\n background: ${p => p.$accent};\n`;\n\nconst BarTop = styled(Bar)`\n top: 0;\n right: 0;\n`;\n\nconst BarBottom = styled(Bar)`\n bottom: 0;\n left: 0;\n`;\n\nconst Bottom = styled.div`\n flex: 1;\n display: flex;\n align-items: center;\n gap: 7cqw;\n padding: 0 4.7cqw 4cqw 7cqw;\n`;\n\nconst LogoCol = styled.div`\n flex-shrink: 0;\n width: 29.4cqw;\n`;\n\nconst Logo = styled(CoverLogoImg)`\n max-width: 29.4cqw;\n max-height: 29.4cqw;\n`;\n\nconst TextCol = styled.div`\n flex: 1;\n min-width: 0;\n`;\n\nconst Title = styled(CoverField)`\n display: block;\n font-size: 7.06cqw;\n font-weight: 700;\n line-height: 1.2;\n text-transform: uppercase;\n`;\n\nconst Subtitle = styled(CoverField)`\n display: block;\n margin-top: 2.47cqw;\n font-size: 2.94cqw;\n font-weight: 400;\n line-height: 1.2;\n opacity: 0.72;\n`;\n\nconst Presented = styled.div`\n margin-top: 3.5cqw;\n font-size: 2.94cqw;\n font-weight: 600;\n line-height: 1.2;\n`;\n\nconst PresentedValue = styled(CoverField)`\n font-weight: 600;\n`;\n\nexport function Model5({ fields, theme, accent, textColor, bgColor }: CoverTemplateProps) {\n const { editable } = useContext(CoverEditContext);\n const showPresented = editable || Boolean(fields.presentedBy);\n return (\n <CoverFrame $font={fontStack(theme?.documentFont)} $bg={bgColor} $color={textColor}>\n <Spacer />\n <ImageBand>\n {fields.imageUrl ? (\n <FullBleedImage $overlay={accent} $overlayOpacity={0.5}>\n <CoverImage src={fields.imageUrl} />\n </FullBleedImage>\n ) : null}\n </ImageBand>\n <Bottom>\n <LogoCol>{theme?.logo?.url ? <Logo src={theme.logo.url} alt=\"\" /> : null}</LogoCol>\n <TextCol>\n <Title name=\"title\" value={fields.title} placeholder=\"Digite o título...\" />\n <Subtitle name=\"subtitle\" value={fields.subtitle} placeholder=\"Digite o subtítulo...\" />\n {showPresented ? (\n <Presented>\n Apresentada por:{' '}\n <PresentedValue name=\"presentedBy\" value={fields.presentedBy} placeholder=\"Nome da empresa\" />\n </Presented>\n ) : null}\n </TextCol>\n </Bottom>\n <BarTop $accent={accent} />\n <BarBottom $accent={accent} />\n </CoverFrame>\n );\n}\n","import type { ComponentType } from 'react';\nimport type { Theme } from '../../../schema/theme';\nimport { DEFAULT_DOCUMENT_COLORS } from '../../../surface/surface';\nimport type { CoverTemplateProps } from './primitives';\nimport { Model1 } from './Model1';\nimport { Model2 } from './Model2';\nimport { Model3 } from './Model3';\nimport { Model4 } from './Model4';\nimport { Model5 } from './Model5';\n\nexport const COVER_TEMPLATES: Record<string, ComponentType<CoverTemplateProps>> = {\n 'model-1': Model1,\n 'model-2': Model2,\n 'model-3': Model3,\n 'model-4': Model4,\n 'model-5': Model5\n};\n\nexport const COVER_TEMPLATE_IDS = Object.keys(COVER_TEMPLATES);\n\nexport const resolveCoverAccent = (accent?: string, theme?: Theme): string =>\n accent ?? theme?.colors?.brand ?? DEFAULT_DOCUMENT_COLORS.brand;\n\nconst COVER_SURFACES: Record<string, 'brand' | 'background' | 'dark'> = {\n 'model-1': 'background',\n 'model-2': 'brand',\n 'model-3': 'brand',\n 'model-4': 'dark',\n 'model-5': 'background'\n};\n\nconst ON_BRAND_TEXT = '#FFFFFF';\n\nconst DARK_SURFACE_BG = '#131B2C';\n\nexport type CoverColorOverrides = { accent?: string; textColor?: string; bgColor?: string };\n\nexport type CoverColors = { accent: string; textColor: string; bgColor: string };\n\nexport const resolveCoverColors = (\n templateId: string | undefined,\n { accent, textColor, bgColor }: CoverColorOverrides,\n theme?: Theme\n): CoverColors => {\n const colors = { ...DEFAULT_DOCUMENT_COLORS, ...theme?.colors };\n const surface = COVER_SURFACES[templateId ?? ''] ?? COVER_SURFACES['model-1'];\n const resolvedAccent = resolveCoverAccent(accent, theme);\n const surfaceBg = { brand: resolvedAccent, dark: DARK_SURFACE_BG, background: colors.background }[surface];\n\n return {\n accent: resolvedAccent,\n textColor: textColor ?? (surface === 'background' ? colors.text : ON_BRAND_TEXT),\n bgColor: bgColor ?? surfaceBg\n };\n};\n","import type { CSSProperties } from 'react';\nimport type { CoverFields, Theme } from '../../schema/theme';\nimport { DEFAULT_DOCUMENT_COLORS } from '../../surface/surface';\nimport { COVER_TEMPLATES, resolveCoverColors } from './covers';\n\nexport type CoverPageProps = {\n templateId?: string;\n accent?: string;\n fields?: CoverFields;\n theme?: Theme;\n textColor?: string;\n bgColor?: string;\n};\n\nexport function CoverPage({ templateId, accent, fields, theme, textColor, bgColor }: CoverPageProps) {\n if (!templateId) return null;\n\n // CoverPage é IRMÃO do PageFrame no body (buildDocumentHtml), não descendente —\n // não pode contar com as --doc-* vars setadas lá, precisa das próprias.\n const colors = { ...DEFAULT_DOCUMENT_COLORS, ...theme?.colors };\n const vars: CSSProperties = {\n ['--doc-brand' as keyof CSSProperties]: colors.brand,\n ['--doc-text' as keyof CSSProperties]: colors.text,\n ['--doc-bg' as keyof CSSProperties]: colors.background\n } as CSSProperties;\n\n const Template = COVER_TEMPLATES[templateId] ?? COVER_TEMPLATES['model-1'];\n const resolved = resolveCoverColors(templateId, { accent, textColor, bgColor }, theme);\n\n // Layout (width/height/overflow) vem do CSS gerado (buildPageCss.ts): .dg-cover\n // já define width, e o escopo .pagedjs_page_content .dg-cover define height/overflow\n // para a página impressa. Inline aqui só carrega as --doc-* vars.\n return (\n <section className=\"dg-cover\" style={vars}>\n <Template fields={fields ?? {}} theme={theme} {...resolved} />\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport type { CompanyInfo } from './types';\n\nconst BOX: { width: number; height: number; 'aria-hidden': true } = { width: 14, height: 14, 'aria-hidden': true };\n\nconst stroke = (inner: string): ReactNode => (\n <svg\n {...BOX}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n // eslint-disable-next-line react/no-danger -- markup estático deste arquivo, nunca entrada do host\n dangerouslySetInnerHTML={{ __html: inner }}\n />\n);\n\nconst brand = (viewBox: string, d: string): ReactNode => (\n <svg {...BOX} viewBox={viewBox} fill=\"currentColor\">\n <path d={d} />\n </svg>\n);\n\nexport const COMPANY_INFO_ICONS: Record<keyof CompanyInfo, ReactNode> = {\n companyName: stroke(\n '<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\" />'\n ),\n cnpj: stroke(\n '<path d=\"M16 10h2\" /><path d=\"M16 14h2\" /><path d=\"M6.17 15a3 3 0 0 1 5.66 0\" /><circle cx=\"9\" cy=\"11\" r=\"2\" /><rect x=\"2\" y=\"5\" width=\"20\" height=\"14\" rx=\"2\" />'\n ),\n phone: stroke(\n '<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\" />'\n ),\n email: stroke(\n '<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\" />'\n ),\n address: stroke(\n '<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\" />'\n ),\n site: stroke(\n '<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\" />'\n ),\n instagram: brand(\n '0 0 448 512',\n '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'\n ),\n facebook: brand(\n '0 0 320 512',\n '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'\n ),\n twitter: brand(\n '0 0 512 512',\n 'M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z'\n ),\n linkedin: brand(\n '0 0 448 512',\n 'M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z'\n )\n};\n","import styled from 'styled-components';\n\n// Chrome roda dentro das margin boxes do Paged.js — fora do PageFrame, sem herdar\n// font-family nem --doc-* vars; cada root recebe fonte e cores via props.\n// O Paged.js força `display: block` no filho direto da margin box com especificidade\n// (0,4,0) — por isso o root é block e o layout flex fica num wrapper interno.\n// O fundo da faixa NÃO fica aqui: é pintado na row inteira do Paged.js (corners\n// inclusos) pelo buildPageCss, pra faixa ser full-bleed até as bordas da página.\nexport const HeaderRoot = styled.header<{ $color: string; $font: string }>`\n height: 100%;\n color: ${props => props.$color};\n font-family: ${props => props.$font};\n line-height: 1.5;\n`;\n\nexport const HeaderLayout = styled.div<{ $reverse: boolean }>`\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-direction: ${props => (props.$reverse ? 'row-reverse' : 'row')};\n gap: 16px;\n height: 100%;\n padding: 20px 0;\n`;\n\nexport const HeaderInfo = styled.div<{ $alignEnd?: boolean }>`\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: ${props => (props.$alignEnd ? 'flex-end' : 'flex-start')};\n min-width: 0;\n font-size: 12px;\n text-align: ${props => (props.$alignEnd ? 'right' : 'left')};\n`;\n\n// Ícone fica sempre na borda externa da página: infos à direita (logo left) → texto, ícone.\nexport const InfoLine = styled.span<{ $strong?: boolean; $iconAfter?: boolean }>`\n display: flex;\n flex-direction: ${props => (props.$iconAfter ? 'row-reverse' : 'row')};\n align-items: center;\n gap: 8px;\n height: 22px;\n font-weight: ${props => (props.$strong ? 600 : 400)};\n font-size: ${props => (props.$strong ? '12.5px' : '12px')};\n\n svg {\n flex-shrink: 0;\n }\n`;\n\nexport const HeaderLogo = styled.img`\n max-height: 44px;\n max-width: 180px;\n object-fit: contain;\n`;\n\nexport const FooterRoot = styled.footer<{ $color: string; $font: string }>`\n height: 100%;\n color: ${props => props.$color};\n font-family: ${props => props.$font};\n line-height: 1.5;\n`;\n\nexport const FooterLayout = styled.div`\n display: flex;\n flex-direction: column;\n justify-content: center;\n height: 100%;\n padding: 12px 0;\n`;\n\nexport const FooterInfoRows = styled.div<{ $justify: string }>`\n display: flex;\n align-items: center;\n justify-content: ${props => props.$justify};\n flex-wrap: wrap;\n column-gap: 24px;\n font-size: 12px;\n`;\n\nexport const FooterItem = styled.span`\n display: inline-flex;\n align-items: center;\n gap: 6px;\n height: 22px;\n white-space: nowrap;\n\n svg {\n flex-shrink: 0;\n }\n`;\n","import type { HeaderConfig } from '../../schema/theme';\nimport type { CompanyInfo } from './types';\nimport { fontStack } from '../../surface/fonts';\nimport { COMPANY_INFO_ICONS } from './icons';\nimport { HeaderInfo, HeaderLayout, HeaderLogo, HeaderRoot, InfoLine } from './chrome.styles';\n\n/** Ordem em que as informações da empresa aparecem no cabeçalho. */\nexport const HEADER_INFO_ORDER: Array<keyof CompanyInfo> = ['companyName', 'cnpj', 'phone', 'email', 'address'];\n\nexport type HeaderBarProps = {\n config?: Partial<HeaderConfig>;\n companyInfo?: CompanyInfo;\n logoUrl?: string;\n documentFont?: string;\n};\n\nexport function HeaderBar({ config, companyInfo = {}, logoUrl, documentFont }: HeaderBarProps) {\n if (!config?.enabled) return null;\n\n const lines = HEADER_INFO_ORDER.filter(\n key => config.info?.[key as keyof NonNullable<HeaderConfig['info']>] && companyInfo[key]\n );\n const logoLeft = config.logoPosition === 'left';\n\n return (\n <HeaderRoot className=\"dg-running-header\" $color={config.color ?? '#3F4759'} $font={fontStack(documentFont)}>\n <HeaderLayout $reverse={logoLeft}>\n <HeaderInfo $alignEnd={logoLeft}>\n {lines.map(key => (\n <InfoLine key={key} $strong={key === 'companyName'} $iconAfter={logoLeft}>\n {COMPANY_INFO_ICONS[key]}\n <span>{companyInfo[key]}</span>\n </InfoLine>\n ))}\n </HeaderInfo>\n {logoUrl ? <HeaderLogo src={logoUrl} alt=\"\" /> : null}\n </HeaderLayout>\n </HeaderRoot>\n );\n}\n","import type { FooterConfig } from '../../schema/theme';\nimport type { CompanyInfo } from './types';\nimport { fontStack } from '../../surface/fonts';\nimport { COMPANY_INFO_ICONS } from './icons';\nimport { FooterInfoRows, FooterItem, FooterLayout, FooterRoot } from './chrome.styles';\n\nexport const FOOTER_INFO_ORDER: Array<keyof CompanyInfo> = [\n 'phone',\n 'site',\n 'instagram',\n 'facebook',\n 'twitter',\n 'linkedin',\n 'email',\n 'address'\n];\n\nconst ALIGNMENT_TO_JUSTIFY: Record<NonNullable<FooterConfig['alignment']>, string> = {\n left: 'flex-start',\n center: 'center',\n right: 'flex-end'\n};\n\nexport type FooterBarProps = {\n config?: Partial<FooterConfig>;\n companyInfo?: CompanyInfo;\n documentFont?: string;\n};\n\nexport function FooterBar({ config, companyInfo = {}, documentFont }: FooterBarProps) {\n const showBand = Boolean(config?.enabled);\n const showPageNumber = Boolean(config?.pageNumber);\n if (!showBand && !showPageNumber) return null;\n\n const lines = showBand\n ? FOOTER_INFO_ORDER.filter(\n key => config?.info?.[key as keyof NonNullable<FooterConfig['info']>] && companyInfo[key]\n )\n : [];\n const justify = ALIGNMENT_TO_JUSTIFY[config?.alignment ?? 'center'];\n\n return (\n <FooterRoot className=\"dg-running-footer\" $color={config?.color ?? '#3F4759'} $font={fontStack(documentFont)}>\n {showPageNumber ? <span className=\"dg-page-number\" /> : null}\n {showBand ? (\n <FooterLayout>\n {lines.length ? (\n <FooterInfoRows $justify={justify}>\n {lines.map(key => (\n <FooterItem key={key}>\n {COMPANY_INFO_ICONS[key]}\n <span>{companyInfo[key]}</span>\n </FooterItem>\n ))}\n </FooterInfoRows>\n ) : null}\n </FooterLayout>\n ) : null}\n </FooterRoot>\n );\n}\n","/**\n * Protocolo `postMessage` entre o documento gerado (iframe) e o host.\n * Módulo separado do `previewBootstrap` de propósito: o host precisa destas\n * constantes no browser, e o bootstrap só existe no caminho de impressão.\n */\nexport const DG_MESSAGE_SOURCE = 'document-generator';\nexport const DG_READY = 'dg-ready';\nexport const DG_ERROR = 'dg-error';\n"]}
@@ -5,7 +5,7 @@ import { jsx } from 'react/jsx-runtime';
5
5
  // src/surface/surface.tsx
6
6
  var DEFAULT_DOCUMENT_FONT = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif";
7
7
  var DEFAULT_DOCUMENT_COLORS = {
8
- brand: "#005AC3",
8
+ brand: "#001A43",
9
9
  text: "#3F4759",
10
10
  background: "#FFFFFF"
11
11
  };
@@ -389,7 +389,7 @@ function buildConfig(registry, options = {}) {
389
389
  render: () => createElement(
390
390
  PanelPlaceholder,
391
391
  null,
392
- `Selecione um bloco para editar suas configura\xE7\xF5es. Para ajustes gerais do documento, clique no \xEDcone
392
+ `Arraste um bloco para a p\xE1gina para editar suas configura\xE7\xF5es. Para ajustes gerais do documento, clique no \xEDcone
393
393
  Configura\xE7\xF5es no topo da p\xE1gina.`
394
394
  )
395
395
  }
@@ -400,5 +400,5 @@ function buildConfig(registry, options = {}) {
400
400
  }
401
401
 
402
402
  export { DEFAULT_DOCUMENT_COLORS, DEFAULT_DOCUMENT_FONT, DEFAULT_PAGE_MARGINS, DOCUMENT_FONTS, DocumentPage, DocumentThemeProvider, DrawerCard, DrawerHint, DrawerItemIcon, EditorShell, FONT_WEIGHT, PageFrame, appearanceToStyle, buildConfig, fontStack, gfontHref, marginsToPadding, pageHeightPx, pageWidthPx, useDocumentFont, useDocumentTheme };
403
- //# sourceMappingURL=chunk-DQ4AL6SJ.js.map
404
- //# sourceMappingURL=chunk-DQ4AL6SJ.js.map
403
+ //# sourceMappingURL=chunk-Z3ZCB3ZT.js.map
404
+ //# sourceMappingURL=chunk-Z3ZCB3ZT.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/surface/surface.tsx","../src/surface/fonts.ts","../src/surface/themeContext.tsx","../src/surface/DocumentPage.tsx","../src/surface/appearance.ts","../src/surface/useDocumentFont.ts","../src/surface/BlockShell.tsx","../src/core/buildConfig.ts"],"names":["jsx"],"mappings":"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","file":"chunk-DQ4AL6SJ.js","sourcesContent":["import styled from 'styled-components';\n\nexport const DEFAULT_DOCUMENT_FONT =\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\";\n\nexport const DEFAULT_DOCUMENT_COLORS = {\n brand: '#005AC3',\n text: '#3F4759',\n background: '#FFFFFF'\n} as const;\n\nexport type PageFormat = 'A4' | 'A5' | 'A3' | 'Letter' | 'Legal';\nexport type PageMargins = { top?: number; right?: number; bottom?: number; left?: number };\nexport type PageOptions = { format?: PageFormat; margins?: PageMargins };\n\nconst PAGE_WIDTH_PX: Record<PageFormat, number> = {\n A4: 794,\n A5: 559,\n A3: 1123,\n Letter: 816,\n Legal: 816\n};\n\nconst PAGE_HEIGHT_PX: Record<PageFormat, number> = {\n A4: 1123,\n A5: 794,\n A3: 1587,\n Letter: 1056,\n Legal: 1344\n};\n\nexport const DEFAULT_PAGE_MARGINS: Required<PageMargins> = { top: 40, right: 40, bottom: 40, left: 40 };\n\nexport function pageWidthPx(format: PageFormat = 'A4'): number {\n return PAGE_WIDTH_PX[format];\n}\n\nexport function pageHeightPx(format: PageFormat = 'A4'): number {\n return PAGE_HEIGHT_PX[format];\n}\n\nexport function marginsToPadding(margins?: PageMargins): string {\n const m = { ...DEFAULT_PAGE_MARGINS, ...margins };\n return `${m.top}px ${m.right}px ${m.bottom}px ${m.left}px`;\n}\n\n/** A página do documento — compartilhada pelo editor, viewer e PDF via `root` do Puck. */\nexport const PageFrame = styled.div<{\n $width: number;\n $padding: string;\n $font: string;\n $brand: string;\n $text: string;\n $bg: string;\n $padTop?: number;\n $padRight?: number;\n $padLeft?: number;\n 'data-docgen-root'?: string;\n}>`\n --doc-brand: ${props => props.$brand};\n --doc-text: ${props => props.$text};\n --doc-bg: ${props => props.$bg};\n font-family: ${props => props.$font};\n width: ${props => props.$width}px;\n max-width: 100%;\n min-height: 100%;\n margin: 0 auto;\n padding: ${props => props.$padding};\n background: var(--doc-bg);\n color: var(--doc-text);\n box-sizing: border-box;\n\n &,\n & *,\n & *::before,\n & *::after {\n box-sizing: border-box;\n }\n\n & button,\n & input,\n & select,\n & textarea {\n font: inherit;\n }\n\n & [data-docgen-block] {\n margin-bottom: 16px;\n }\n\n /* A capa é full-bleed (no preview/PDF ela sai do PageFrame via hoist). No editor\n ela renderiza em fluxo dentro do padding da folha — neutralizamos esse padding\n só pra ela, pra bater com o preview. O bleed vai no wrapper do Puck\n ([data-puck-component]) e não no bloco interno, senão a borda de seleção do Puck\n (desenhada no wrapper) fica inset. No PDF/viewer esse seletor nem existe (hoist). */\n & [data-puck-component]:has([data-docgen-block='Cover']) {\n margin-top: ${props => -(props.$padTop ?? 0)}px;\n margin-left: ${props => -(props.$padLeft ?? 0)}px;\n margin-right: ${props => -(props.$padRight ?? 0)}px;\n width: calc(100% + ${props => (props.$padLeft ?? 0) + (props.$padRight ?? 0)}px);\n }\n`;\n\n/** Chrome do editor: mesa cinza + folha com sombra (só editor). Porquês: docs/architecture.md. */\nexport const EditorShell = styled.div`\n height: 100%;\n\n li[data-puck-layer-tree-id] button > div,\n li[data-puck-layer-tree-id] button > div > div {\n overflow: hidden;\n }\n\n #puck-canvas-root,\n [class*='_PuckCanvas_'] {\n background: #e8e9eb;\n outline: none;\n }\n\n [class*='_PuckCanvas_'][class*='_PuckCanvas_'][class*='_PuckCanvas_'] {\n padding: 0;\n }\n\n #preview-frame {\n display: flex;\n flex-direction: column;\n align-items: center;\n box-sizing: border-box;\n min-height: 100%;\n padding: 32px 16px;\n }\n\n #preview-frame > * {\n flex: 1 0 auto;\n min-height: 0;\n box-shadow: 0 1px 4px rgba(15, 23, 42, 0.14);\n }\n`;\n\n/** Card custom do item no palette (substitui o item padrão do Puck): ícone + nome. */\nexport const DrawerCard = styled.div<{ $disabled?: boolean }>`\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 11px 12px;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n background: #fff;\n cursor: grab;\n font-size: 14px;\n color: #1f2937;\n\n &:hover {\n background: #f3f6fb;\n border-color: #c3c9d2;\n }\n\n ${props =>\n props.$disabled &&\n `\n opacity: 0.45;\n cursor: not-allowed;\n\n &:hover {\n background: #fff;\n border-color: #e5e7eb;\n }\n `}\n`;\n\n/**\n * Tooltip imediato para o card desabilitado do palette (o title nativo demora ~1s).\n * Os seletores de hover repetem `[data-hint]:not([data-hint=''])` para empatar a\n * especificidade da regra base — `&:hover::after` sozinho perde e o tooltip nunca aparece.\n */\nexport const DrawerHint = styled.div`\n position: relative;\n\n &[data-hint]:not([data-hint=''])::after {\n content: attr(data-hint);\n position: absolute;\n left: 50%;\n top: calc(100% + 6px);\n transform: translateX(-50%) translateY(-2px);\n width: max-content;\n max-width: 220px;\n padding: 6px 10px;\n background: #1f2937;\n color: #fff;\n font-size: 12px;\n line-height: 1.35;\n text-align: center;\n border-radius: 6px;\n opacity: 0;\n pointer-events: none;\n transition:\n opacity 0.12s ease,\n transform 0.12s ease;\n z-index: 20;\n }\n\n &[data-hint]:not([data-hint=''])::before {\n content: '';\n position: absolute;\n left: 50%;\n top: calc(100% + 1px);\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-bottom-color: #1f2937;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.12s ease;\n z-index: 20;\n }\n\n &[data-hint]:not([data-hint='']):hover::after,\n &[data-hint]:not([data-hint='']):hover::before {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n &[data-hint]:not([data-hint='']):hover::before {\n transform: translateX(-50%);\n }\n`;\n\n/** Mensagem do painel de propriedades quando nenhum bloco está selecionado. */\nexport const PanelPlaceholder = styled.div`\n padding: 24px 12px;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.5;\n text-align: center;\n`;\n\nexport const DrawerItemIcon = styled.span`\n display: flex;\n flex-shrink: 0;\n align-items: center;\n color: #6b7280;\n`;\n","import { DEFAULT_DOCUMENT_FONT } from './surface';\n\nexport type DocumentFont = {\n id: string;\n label: string;\n stack: string;\n /** Família no Google Fonts; ausente = fonte de sistema (nada a carregar). */\n gfont?: string;\n};\n\nexport const DOCUMENT_FONTS: readonly DocumentFont[] = [\n { id: 'inter', label: 'Inter', stack: \"'Inter', sans-serif\", gfont: 'Inter:wght@400;500;600;700' },\n { id: 'arial', label: 'Arial', stack: 'Arial, Helvetica, sans-serif' },\n { id: 'calibri', label: 'Calibri', stack: \"Calibri, Carlito, 'Segoe UI', sans-serif\" },\n { id: 'times-new-roman', label: 'Times New Roman', stack: \"'Times New Roman', Times, serif\" },\n { id: 'roboto', label: 'Roboto', stack: \"'Roboto', sans-serif\", gfont: 'Roboto:wght@400;500;700' },\n { id: 'open-sans', label: 'Open Sans', stack: \"'Open Sans', sans-serif\", gfont: 'Open+Sans:wght@400;500;600;700' },\n {\n id: 'montserrat',\n label: 'Montserrat',\n stack: \"'Montserrat', sans-serif\",\n gfont: 'Montserrat:wght@400;500;600;700'\n },\n { id: 'lato', label: 'Lato', stack: \"'Lato', sans-serif\", gfont: 'Lato:wght@400;700' },\n { id: 'georgia', label: 'Georgia', stack: \"Georgia, 'Times New Roman', serif\" },\n { id: 'helvetica', label: 'Helvetica', stack: \"'Helvetica Neue', Helvetica, Arial, sans-serif\" }\n] as const;\n\nconst byId = new Map(DOCUMENT_FONTS.map(f => [f.id, f]));\n\nconst primaryFamily = (stack: string): string =>\n stack\n .split(',')[0]\n .trim()\n .replace(/^['\"]|['\"]$/g, '');\n\n/**\n * Fontes do Google ganham um alias próprio (`<Família> Doc`) no topo do stack: o app\n * hospedeiro pode ter um @font-face com o mesmo nome apontando pra outros arquivos\n * (ex.: Inter estática do FBO), e o alias garante que o documento use os arquivos do\n * Google nos dois lados — no editor via useDocumentFont (CSS reescrito) e no artifact\n * o alias não resolve e cai na família original do <link> (mesmos arquivos).\n */\nexport function docFontFamilies(id?: string): { primary: string; alias: string } | null {\n const font = id ? byId.get(id) : undefined;\n if (!font?.gfont) return null;\n const primary = primaryFamily(font.stack);\n return { primary, alias: `${primary} Doc` };\n}\n\nexport function fontStack(id?: string): string {\n const font = id ? byId.get(id) : undefined;\n if (!font) return DEFAULT_DOCUMENT_FONT;\n const families = docFontFamilies(id);\n return families ? `'${families.alias}', ${font.stack}` : font.stack;\n}\n\nexport function gfontHref(id?: string): string | null {\n const font = id ? byId.get(id) : undefined;\n if (!font?.gfont) return null;\n return `https://fonts.googleapis.com/css2?family=${font.gfont}&display=swap`;\n}\n","import { createContext, useContext, type ReactNode } from 'react';\nimport type { Theme } from '../schema/theme';\n\nconst EMPTY_THEME: Theme = {};\n\n/** `null` distingue \"sem provider\" de \"provider com tema vazio\" — ver DocumentPage. */\nconst DocumentThemeContext = createContext<Theme | null>(null);\n\nexport type DocumentThemeProviderProps = {\n theme?: Theme;\n children?: ReactNode;\n};\n\n/**\n * Publica o tema do documento na árvore. Montado por `DocumentEditor` e\n * `DocumentRenderer` — é o canal que mantém o `Config` do Puck estável quando o\n * tema muda (ver docs/theme.md).\n */\nexport function DocumentThemeProvider({ theme, children }: DocumentThemeProviderProps) {\n return <DocumentThemeContext.Provider value={theme ?? EMPTY_THEME}>{children}</DocumentThemeContext.Provider>;\n}\n\n/** Tema do documento; `{}` quando não há provider acima. */\nexport function useDocumentTheme(): Theme {\n return useContext(DocumentThemeContext) ?? EMPTY_THEME;\n}\n\n/** Igual ao `useDocumentTheme`, mas devolve `null` sem provider (uso interno). */\nexport function useOptionalDocumentTheme(): Theme | null {\n return useContext(DocumentThemeContext);\n}\n","import type { ReactNode } from 'react';\nimport type { Theme } from '../schema/theme';\nimport { DEFAULT_DOCUMENT_COLORS, DEFAULT_PAGE_MARGINS, PageFrame, marginsToPadding, pageWidthPx } from './surface';\nimport { fontStack } from './fonts';\nimport { useOptionalDocumentTheme } from './themeContext';\n\nexport type DocumentPageProps = {\n children?: ReactNode;\n /** Usado só quando não há `DocumentThemeProvider` acima (ver `BuildConfigOptions.theme`). */\n fallbackTheme?: Theme;\n};\n\n/**\n * `root.render` do Puck: a folha do documento (largura, margens, fonte e CSS vars\n * de cor). Lê o tema do contexto em vez de recebê-lo por closure — assim o\n * componente tem identidade estável e trocar de tema não remonta os blocos.\n */\nexport function DocumentPage({ children, fallbackTheme }: DocumentPageProps) {\n const theme = useOptionalDocumentTheme() ?? fallbackTheme ?? {};\n const margins = { ...DEFAULT_PAGE_MARGINS, ...(theme.page?.margins ?? {}) };\n const colors = { ...DEFAULT_DOCUMENT_COLORS, ...theme.colors };\n\n return (\n <PageFrame\n data-docgen-root=\"\"\n $width={pageWidthPx(theme.page?.format)}\n $padding={marginsToPadding(theme.page?.margins)}\n $padTop={margins.top}\n $padRight={margins.right}\n $padLeft={margins.left}\n $font={fontStack(theme.documentFont)}\n $brand={colors.brand}\n $text={colors.text}\n $bg={colors.background}\n >\n {children}\n </PageFrame>\n );\n}\n","import type { CSSProperties } from 'react';\nimport type { Appearance } from '../schema/appearance';\nimport { fontStack } from './fonts';\n\nexport const FONT_WEIGHT: Record<string, number> = { normal: 400, medium: 500, bold: 700 };\n\n/** Sobrescrita por bloco → estilo do wrapper (cores viram CSS vars locais; não-set herda o tema). */\nexport function appearanceToStyle(a?: Appearance): CSSProperties {\n const style: Record<string, string | number> = {};\n if (!a) return style;\n if (a.brand !== undefined) style['--doc-brand'] = a.brand;\n if (a.text !== undefined) {\n style['--doc-text'] = a.text;\n style.color = a.text;\n }\n if (a.background !== undefined) style.background = a.background;\n if (a.fontSize !== undefined) style.fontSize = a.fontSize;\n if (a.fontFamily !== undefined) style.fontFamily = fontStack(a.fontFamily);\n if (a.fontWeight !== undefined) style.fontWeight = FONT_WEIGHT[a.fontWeight];\n if (a.textAlign !== undefined) style.textAlign = a.textAlign;\n return style as CSSProperties;\n}\n","import { useEffect } from 'react';\nimport { docFontFamilies, gfontHref } from './fonts';\n\n/**\n * Carrega a fonte do documento no app hospedeiro. O CSS do Google é baixado e\n * reescrito pra família alias (`<Família> Doc`, ver docFontFamilies) — assim o\n * canvas do editor usa os MESMOS arquivos do preview mesmo quando o app já tem\n * um @font-face com o nome original. Se o fetch falhar, cai pro <link> direto\n * (família original — comportamento antigo).\n */\nexport function useDocumentFont(id?: string): void {\n useEffect(() => {\n const href = gfontHref(id);\n if (!href || typeof document === 'undefined') return undefined;\n\n const selector = `[data-docgen-font=\"${id}\"]`;\n if (document.head.querySelector(selector)) return undefined;\n\n if (typeof fetch === 'undefined') {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.setAttribute('data-docgen-font', id as string);\n document.head.appendChild(link);\n return undefined;\n }\n\n const families = docFontFamilies(id);\n const style = document.createElement('style');\n style.setAttribute('data-docgen-font', id as string);\n document.head.appendChild(style);\n\n fetch(href)\n .then(res => {\n if (!res.ok) throw new Error(`gfont css ${res.status}`);\n return res.text();\n })\n .then(css => {\n style.textContent = families\n ? css.split(`font-family: '${families.primary}'`).join(`font-family: '${families.alias}'`)\n : css;\n })\n .catch(() => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.setAttribute('data-docgen-font', id as string);\n style.replaceWith(link);\n });\n return undefined;\n }, [id]);\n}\n","import type { ReactNode } from 'react';\nimport type { Appearance } from '../schema/appearance';\nimport { appearanceToStyle } from './appearance';\nimport { useDocumentFont } from './useDocumentFont';\n\nexport type BlockShellProps = {\n blockKey: string;\n appearance?: Appearance;\n children?: ReactNode;\n};\n\n/** Wrapper de todo bloco: aplica a aparência local e carrega a Google Font do bloco. */\nexport function BlockShell({ blockKey, appearance, children }: BlockShellProps) {\n useDocumentFont(appearance?.fontFamily);\n\n return (\n <div data-docgen-block={blockKey} style={appearanceToStyle(appearance)}>\n {children}\n </div>\n );\n}\n","import { createElement, type ComponentType } from 'react';\nimport type { ComponentConfig, Config } from '@puckeditor/core';\nimport type { BlockEntry, Registry } from '../blocks/types';\nimport { PanelPlaceholder } from '../surface/surface';\nimport { DocumentPage, type DocumentPageProps } from '../surface/DocumentPage';\nimport type { Theme } from '../schema/theme';\nimport { BlockShell } from '../surface/BlockShell';\n\nexport type BuildConfigOptions = {\n /**\n * Tema aplicado apenas quando NÃO há `DocumentThemeProvider` acima (uso avulso\n * de `buildConfig` + `<Render>`). No editor e no renderer o tema vem do provider:\n * passá-lo aqui troca a identidade de `root.render` a cada mudança e o Puck\n * remonta a árvore inteira. Ver docs/theme.md.\n */\n theme?: Theme;\n};\n\n/**\n * O Puck monta `componentConfig.render` como TIPO de elemento\n * (`<Component {...props}/>`), então uma closure nova por build desmonta e remonta\n * o bloco inteiro — perdendo foco, seleção e estado de editores embutidos. O cache\n * abaixo dá identidade estável por (componente, key). Ver docs/architecture.md.\n */\nconst blockRenderCache = new WeakMap<ComponentType<any>, Map<string, ComponentType<any>>>();\n\nfunction blockRender(key: string, Component: ComponentType<any>): ComponentType<any> {\n let byKey = blockRenderCache.get(Component);\n if (!byKey) {\n byKey = new Map();\n blockRenderCache.set(Component, byKey);\n }\n\n const cached = byKey.get(key);\n if (cached) return cached;\n\n function Block(props: any) {\n return createElement(BlockShell, { blockKey: key, appearance: props.appearance }, createElement(Component, props));\n }\n Block.displayName = `DocumentBlock(${key})`;\n byKey.set(key, Block);\n return Block;\n}\n\nconst fallbackPageCache = new WeakMap<Theme, ComponentType<any>>();\n\nfunction fallbackPage(theme: Theme): ComponentType<any> {\n const cached = fallbackPageCache.get(theme);\n if (cached) return cached;\n\n function Page(props: DocumentPageProps) {\n return createElement(DocumentPage, { ...props, fallbackTheme: theme });\n }\n Page.displayName = 'DocumentPage(fallback)';\n fallbackPageCache.set(theme, Page);\n return Page;\n}\n\n/**\n * Registry → Puck `Config` (mesmo config no editor, viewer e PDF). Replace-by-key;\n * `root.render` embrulha tudo no PageFrame do documento, que lê o tema do contexto.\n */\nexport function buildConfig(registry: Registry, options: BuildConfigOptions = {}): Config {\n const { theme } = options;\n\n const byKey = new Map<string, BlockEntry>();\n registry.forEach(entry => {\n byKey.set(entry.key, entry);\n });\n\n const components: Record<string, ComponentConfig<any>> = {};\n const categoryMap: Record<string, string[]> = {};\n\n byKey.forEach((entry, key) => {\n const { fields, defaultProps, component: Component } = entry;\n\n components[key] = {\n label: entry.label ?? key,\n fields,\n defaultProps,\n ...(entry.permissions && { permissions: entry.permissions }),\n render: blockRender(key, Component as ComponentType<any>)\n } as ComponentConfig<any>;\n\n const category = entry.category ?? 'other';\n if (!categoryMap[category]) categoryMap[category] = [];\n categoryMap[category].push(key);\n });\n\n const categories: NonNullable<Config['categories']> = {};\n Object.keys(categoryMap).forEach(name => {\n categories[name] = { components: categoryMap[name] };\n });\n\n const root: Config['root'] = {\n label: 'Página',\n fields: {\n placeholder: {\n type: 'custom',\n render: () =>\n createElement(\n PanelPlaceholder,\n null,\n `Selecione um bloco para editar suas configurações. Para ajustes gerais do documento, clique no ícone\n Configurações no topo da página.`\n )\n }\n },\n render: (theme ? fallbackPage(theme) : DocumentPage) as NonNullable<Config['root']>['render']\n };\n\n return { root, components, categories } as Config;\n}\n"]}
1
+ {"version":3,"sources":["../src/surface/surface.tsx","../src/surface/fonts.ts","../src/surface/themeContext.tsx","../src/surface/DocumentPage.tsx","../src/surface/appearance.ts","../src/surface/useDocumentFont.ts","../src/surface/BlockShell.tsx","../src/core/buildConfig.ts"],"names":["jsx"],"mappings":"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","file":"chunk-Z3ZCB3ZT.js","sourcesContent":["import styled from 'styled-components';\n\nexport const DEFAULT_DOCUMENT_FONT =\n \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif\";\n\nexport const DEFAULT_DOCUMENT_COLORS = {\n brand: '#001A43',\n text: '#3F4759',\n background: '#FFFFFF'\n} as const;\n\nexport type PageFormat = 'A4' | 'A5' | 'A3' | 'Letter' | 'Legal';\nexport type PageMargins = { top?: number; right?: number; bottom?: number; left?: number };\nexport type PageOptions = { format?: PageFormat; margins?: PageMargins };\n\nconst PAGE_WIDTH_PX: Record<PageFormat, number> = {\n A4: 794,\n A5: 559,\n A3: 1123,\n Letter: 816,\n Legal: 816\n};\n\nconst PAGE_HEIGHT_PX: Record<PageFormat, number> = {\n A4: 1123,\n A5: 794,\n A3: 1587,\n Letter: 1056,\n Legal: 1344\n};\n\nexport const DEFAULT_PAGE_MARGINS: Required<PageMargins> = { top: 40, right: 40, bottom: 40, left: 40 };\n\nexport function pageWidthPx(format: PageFormat = 'A4'): number {\n return PAGE_WIDTH_PX[format];\n}\n\nexport function pageHeightPx(format: PageFormat = 'A4'): number {\n return PAGE_HEIGHT_PX[format];\n}\n\nexport function marginsToPadding(margins?: PageMargins): string {\n const m = { ...DEFAULT_PAGE_MARGINS, ...margins };\n return `${m.top}px ${m.right}px ${m.bottom}px ${m.left}px`;\n}\n\n/** A página do documento — compartilhada pelo editor, viewer e PDF via `root` do Puck. */\nexport const PageFrame = styled.div<{\n $width: number;\n $padding: string;\n $font: string;\n $brand: string;\n $text: string;\n $bg: string;\n $padTop?: number;\n $padRight?: number;\n $padLeft?: number;\n 'data-docgen-root'?: string;\n}>`\n --doc-brand: ${props => props.$brand};\n --doc-text: ${props => props.$text};\n --doc-bg: ${props => props.$bg};\n font-family: ${props => props.$font};\n width: ${props => props.$width}px;\n max-width: 100%;\n min-height: 100%;\n margin: 0 auto;\n padding: ${props => props.$padding};\n background: var(--doc-bg);\n color: var(--doc-text);\n box-sizing: border-box;\n\n &,\n & *,\n & *::before,\n & *::after {\n box-sizing: border-box;\n }\n\n & button,\n & input,\n & select,\n & textarea {\n font: inherit;\n }\n\n & [data-docgen-block] {\n margin-bottom: 16px;\n }\n\n /* A capa é full-bleed (no preview/PDF ela sai do PageFrame via hoist). No editor\n ela renderiza em fluxo dentro do padding da folha — neutralizamos esse padding\n só pra ela, pra bater com o preview. O bleed vai no wrapper do Puck\n ([data-puck-component]) e não no bloco interno, senão a borda de seleção do Puck\n (desenhada no wrapper) fica inset. No PDF/viewer esse seletor nem existe (hoist). */\n & [data-puck-component]:has([data-docgen-block='Cover']) {\n margin-top: ${props => -(props.$padTop ?? 0)}px;\n margin-left: ${props => -(props.$padLeft ?? 0)}px;\n margin-right: ${props => -(props.$padRight ?? 0)}px;\n width: calc(100% + ${props => (props.$padLeft ?? 0) + (props.$padRight ?? 0)}px);\n }\n`;\n\n/** Chrome do editor: mesa cinza + folha com sombra (só editor). Porquês: docs/architecture.md. */\nexport const EditorShell = styled.div`\n height: 100%;\n\n li[data-puck-layer-tree-id] button > div,\n li[data-puck-layer-tree-id] button > div > div {\n overflow: hidden;\n }\n\n #puck-canvas-root,\n [class*='_PuckCanvas_'] {\n background: #e8e9eb;\n outline: none;\n }\n\n [class*='_PuckCanvas_'][class*='_PuckCanvas_'][class*='_PuckCanvas_'] {\n padding: 0;\n }\n\n #preview-frame {\n display: flex;\n flex-direction: column;\n align-items: center;\n box-sizing: border-box;\n min-height: 100%;\n padding: 32px 16px;\n }\n\n #preview-frame > * {\n flex: 1 0 auto;\n min-height: 0;\n box-shadow: 0 1px 4px rgba(15, 23, 42, 0.14);\n }\n`;\n\n/** Card custom do item no palette (substitui o item padrão do Puck): ícone + nome. */\nexport const DrawerCard = styled.div<{ $disabled?: boolean }>`\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n padding: 11px 12px;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n background: #fff;\n cursor: grab;\n font-size: 14px;\n color: #1f2937;\n\n &:hover {\n background: #f3f6fb;\n border-color: #c3c9d2;\n }\n\n ${props =>\n props.$disabled &&\n `\n opacity: 0.45;\n cursor: not-allowed;\n\n &:hover {\n background: #fff;\n border-color: #e5e7eb;\n }\n `}\n`;\n\n/**\n * Tooltip imediato para o card desabilitado do palette (o title nativo demora ~1s).\n * Os seletores de hover repetem `[data-hint]:not([data-hint=''])` para empatar a\n * especificidade da regra base — `&:hover::after` sozinho perde e o tooltip nunca aparece.\n */\nexport const DrawerHint = styled.div`\n position: relative;\n\n &[data-hint]:not([data-hint=''])::after {\n content: attr(data-hint);\n position: absolute;\n left: 50%;\n top: calc(100% + 6px);\n transform: translateX(-50%) translateY(-2px);\n width: max-content;\n max-width: 220px;\n padding: 6px 10px;\n background: #1f2937;\n color: #fff;\n font-size: 12px;\n line-height: 1.35;\n text-align: center;\n border-radius: 6px;\n opacity: 0;\n pointer-events: none;\n transition:\n opacity 0.12s ease,\n transform 0.12s ease;\n z-index: 20;\n }\n\n &[data-hint]:not([data-hint=''])::before {\n content: '';\n position: absolute;\n left: 50%;\n top: calc(100% + 1px);\n transform: translateX(-50%);\n border: 5px solid transparent;\n border-bottom-color: #1f2937;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.12s ease;\n z-index: 20;\n }\n\n &[data-hint]:not([data-hint='']):hover::after,\n &[data-hint]:not([data-hint='']):hover::before {\n opacity: 1;\n transform: translateX(-50%) translateY(0);\n }\n\n &[data-hint]:not([data-hint='']):hover::before {\n transform: translateX(-50%);\n }\n`;\n\n/** Mensagem do painel de propriedades quando nenhum bloco está selecionado. */\nexport const PanelPlaceholder = styled.div`\n padding: 24px 12px;\n color: #6b7280;\n font-size: 13px;\n line-height: 1.5;\n text-align: center;\n`;\n\nexport const DrawerItemIcon = styled.span`\n display: flex;\n flex-shrink: 0;\n align-items: center;\n color: #6b7280;\n`;\n","import { DEFAULT_DOCUMENT_FONT } from './surface';\n\nexport type DocumentFont = {\n id: string;\n label: string;\n stack: string;\n /** Família no Google Fonts; ausente = fonte de sistema (nada a carregar). */\n gfont?: string;\n};\n\nexport const DOCUMENT_FONTS: readonly DocumentFont[] = [\n { id: 'inter', label: 'Inter', stack: \"'Inter', sans-serif\", gfont: 'Inter:wght@400;500;600;700' },\n { id: 'arial', label: 'Arial', stack: 'Arial, Helvetica, sans-serif' },\n { id: 'calibri', label: 'Calibri', stack: \"Calibri, Carlito, 'Segoe UI', sans-serif\" },\n { id: 'times-new-roman', label: 'Times New Roman', stack: \"'Times New Roman', Times, serif\" },\n { id: 'roboto', label: 'Roboto', stack: \"'Roboto', sans-serif\", gfont: 'Roboto:wght@400;500;700' },\n { id: 'open-sans', label: 'Open Sans', stack: \"'Open Sans', sans-serif\", gfont: 'Open+Sans:wght@400;500;600;700' },\n {\n id: 'montserrat',\n label: 'Montserrat',\n stack: \"'Montserrat', sans-serif\",\n gfont: 'Montserrat:wght@400;500;600;700'\n },\n { id: 'lato', label: 'Lato', stack: \"'Lato', sans-serif\", gfont: 'Lato:wght@400;700' },\n { id: 'georgia', label: 'Georgia', stack: \"Georgia, 'Times New Roman', serif\" },\n { id: 'helvetica', label: 'Helvetica', stack: \"'Helvetica Neue', Helvetica, Arial, sans-serif\" }\n] as const;\n\nconst byId = new Map(DOCUMENT_FONTS.map(f => [f.id, f]));\n\nconst primaryFamily = (stack: string): string =>\n stack\n .split(',')[0]\n .trim()\n .replace(/^['\"]|['\"]$/g, '');\n\n/**\n * Fontes do Google ganham um alias próprio (`<Família> Doc`) no topo do stack: o app\n * hospedeiro pode ter um @font-face com o mesmo nome apontando pra outros arquivos\n * (ex.: Inter estática do FBO), e o alias garante que o documento use os arquivos do\n * Google nos dois lados — no editor via useDocumentFont (CSS reescrito) e no artifact\n * o alias não resolve e cai na família original do <link> (mesmos arquivos).\n */\nexport function docFontFamilies(id?: string): { primary: string; alias: string } | null {\n const font = id ? byId.get(id) : undefined;\n if (!font?.gfont) return null;\n const primary = primaryFamily(font.stack);\n return { primary, alias: `${primary} Doc` };\n}\n\nexport function fontStack(id?: string): string {\n const font = id ? byId.get(id) : undefined;\n if (!font) return DEFAULT_DOCUMENT_FONT;\n const families = docFontFamilies(id);\n return families ? `'${families.alias}', ${font.stack}` : font.stack;\n}\n\nexport function gfontHref(id?: string): string | null {\n const font = id ? byId.get(id) : undefined;\n if (!font?.gfont) return null;\n return `https://fonts.googleapis.com/css2?family=${font.gfont}&display=swap`;\n}\n","import { createContext, useContext, type ReactNode } from 'react';\nimport type { Theme } from '../schema/theme';\n\nconst EMPTY_THEME: Theme = {};\n\n/** `null` distingue \"sem provider\" de \"provider com tema vazio\" — ver DocumentPage. */\nconst DocumentThemeContext = createContext<Theme | null>(null);\n\nexport type DocumentThemeProviderProps = {\n theme?: Theme;\n children?: ReactNode;\n};\n\n/**\n * Publica o tema do documento na árvore. Montado por `DocumentEditor` e\n * `DocumentRenderer` — é o canal que mantém o `Config` do Puck estável quando o\n * tema muda (ver docs/theme.md).\n */\nexport function DocumentThemeProvider({ theme, children }: DocumentThemeProviderProps) {\n return <DocumentThemeContext.Provider value={theme ?? EMPTY_THEME}>{children}</DocumentThemeContext.Provider>;\n}\n\n/** Tema do documento; `{}` quando não há provider acima. */\nexport function useDocumentTheme(): Theme {\n return useContext(DocumentThemeContext) ?? EMPTY_THEME;\n}\n\n/** Igual ao `useDocumentTheme`, mas devolve `null` sem provider (uso interno). */\nexport function useOptionalDocumentTheme(): Theme | null {\n return useContext(DocumentThemeContext);\n}\n","import type { ReactNode } from 'react';\nimport type { Theme } from '../schema/theme';\nimport { DEFAULT_DOCUMENT_COLORS, DEFAULT_PAGE_MARGINS, PageFrame, marginsToPadding, pageWidthPx } from './surface';\nimport { fontStack } from './fonts';\nimport { useOptionalDocumentTheme } from './themeContext';\n\nexport type DocumentPageProps = {\n children?: ReactNode;\n /** Usado só quando não há `DocumentThemeProvider` acima (ver `BuildConfigOptions.theme`). */\n fallbackTheme?: Theme;\n};\n\n/**\n * `root.render` do Puck: a folha do documento (largura, margens, fonte e CSS vars\n * de cor). Lê o tema do contexto em vez de recebê-lo por closure — assim o\n * componente tem identidade estável e trocar de tema não remonta os blocos.\n */\nexport function DocumentPage({ children, fallbackTheme }: DocumentPageProps) {\n const theme = useOptionalDocumentTheme() ?? fallbackTheme ?? {};\n const margins = { ...DEFAULT_PAGE_MARGINS, ...(theme.page?.margins ?? {}) };\n const colors = { ...DEFAULT_DOCUMENT_COLORS, ...theme.colors };\n\n return (\n <PageFrame\n data-docgen-root=\"\"\n $width={pageWidthPx(theme.page?.format)}\n $padding={marginsToPadding(theme.page?.margins)}\n $padTop={margins.top}\n $padRight={margins.right}\n $padLeft={margins.left}\n $font={fontStack(theme.documentFont)}\n $brand={colors.brand}\n $text={colors.text}\n $bg={colors.background}\n >\n {children}\n </PageFrame>\n );\n}\n","import type { CSSProperties } from 'react';\nimport type { Appearance } from '../schema/appearance';\nimport { fontStack } from './fonts';\n\nexport const FONT_WEIGHT: Record<string, number> = { normal: 400, medium: 500, bold: 700 };\n\n/** Sobrescrita por bloco → estilo do wrapper (cores viram CSS vars locais; não-set herda o tema). */\nexport function appearanceToStyle(a?: Appearance): CSSProperties {\n const style: Record<string, string | number> = {};\n if (!a) return style;\n if (a.brand !== undefined) style['--doc-brand'] = a.brand;\n if (a.text !== undefined) {\n style['--doc-text'] = a.text;\n style.color = a.text;\n }\n if (a.background !== undefined) style.background = a.background;\n if (a.fontSize !== undefined) style.fontSize = a.fontSize;\n if (a.fontFamily !== undefined) style.fontFamily = fontStack(a.fontFamily);\n if (a.fontWeight !== undefined) style.fontWeight = FONT_WEIGHT[a.fontWeight];\n if (a.textAlign !== undefined) style.textAlign = a.textAlign;\n return style as CSSProperties;\n}\n","import { useEffect } from 'react';\nimport { docFontFamilies, gfontHref } from './fonts';\n\n/**\n * Carrega a fonte do documento no app hospedeiro. O CSS do Google é baixado e\n * reescrito pra família alias (`<Família> Doc`, ver docFontFamilies) — assim o\n * canvas do editor usa os MESMOS arquivos do preview mesmo quando o app já tem\n * um @font-face com o nome original. Se o fetch falhar, cai pro <link> direto\n * (família original — comportamento antigo).\n */\nexport function useDocumentFont(id?: string): void {\n useEffect(() => {\n const href = gfontHref(id);\n if (!href || typeof document === 'undefined') return undefined;\n\n const selector = `[data-docgen-font=\"${id}\"]`;\n if (document.head.querySelector(selector)) return undefined;\n\n if (typeof fetch === 'undefined') {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.setAttribute('data-docgen-font', id as string);\n document.head.appendChild(link);\n return undefined;\n }\n\n const families = docFontFamilies(id);\n const style = document.createElement('style');\n style.setAttribute('data-docgen-font', id as string);\n document.head.appendChild(style);\n\n fetch(href)\n .then(res => {\n if (!res.ok) throw new Error(`gfont css ${res.status}`);\n return res.text();\n })\n .then(css => {\n style.textContent = families\n ? css.split(`font-family: '${families.primary}'`).join(`font-family: '${families.alias}'`)\n : css;\n })\n .catch(() => {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n link.setAttribute('data-docgen-font', id as string);\n style.replaceWith(link);\n });\n return undefined;\n }, [id]);\n}\n","import type { ReactNode } from 'react';\nimport type { Appearance } from '../schema/appearance';\nimport { appearanceToStyle } from './appearance';\nimport { useDocumentFont } from './useDocumentFont';\n\nexport type BlockShellProps = {\n blockKey: string;\n appearance?: Appearance;\n children?: ReactNode;\n};\n\n/** Wrapper de todo bloco: aplica a aparência local e carrega a Google Font do bloco. */\nexport function BlockShell({ blockKey, appearance, children }: BlockShellProps) {\n useDocumentFont(appearance?.fontFamily);\n\n return (\n <div data-docgen-block={blockKey} style={appearanceToStyle(appearance)}>\n {children}\n </div>\n );\n}\n","import { createElement, type ComponentType } from 'react';\nimport type { ComponentConfig, Config } from '@puckeditor/core';\nimport type { BlockEntry, Registry } from '../blocks/types';\nimport { PanelPlaceholder } from '../surface/surface';\nimport { DocumentPage, type DocumentPageProps } from '../surface/DocumentPage';\nimport type { Theme } from '../schema/theme';\nimport { BlockShell } from '../surface/BlockShell';\n\nexport type BuildConfigOptions = {\n /**\n * Tema aplicado apenas quando NÃO há `DocumentThemeProvider` acima (uso avulso\n * de `buildConfig` + `<Render>`). No editor e no renderer o tema vem do provider:\n * passá-lo aqui troca a identidade de `root.render` a cada mudança e o Puck\n * remonta a árvore inteira. Ver docs/theme.md.\n */\n theme?: Theme;\n};\n\n/**\n * O Puck monta `componentConfig.render` como TIPO de elemento\n * (`<Component {...props}/>`), então uma closure nova por build desmonta e remonta\n * o bloco inteiro — perdendo foco, seleção e estado de editores embutidos. O cache\n * abaixo dá identidade estável por (componente, key). Ver docs/architecture.md.\n */\nconst blockRenderCache = new WeakMap<ComponentType<any>, Map<string, ComponentType<any>>>();\n\nfunction blockRender(key: string, Component: ComponentType<any>): ComponentType<any> {\n let byKey = blockRenderCache.get(Component);\n if (!byKey) {\n byKey = new Map();\n blockRenderCache.set(Component, byKey);\n }\n\n const cached = byKey.get(key);\n if (cached) return cached;\n\n function Block(props: any) {\n return createElement(BlockShell, { blockKey: key, appearance: props.appearance }, createElement(Component, props));\n }\n Block.displayName = `DocumentBlock(${key})`;\n byKey.set(key, Block);\n return Block;\n}\n\nconst fallbackPageCache = new WeakMap<Theme, ComponentType<any>>();\n\nfunction fallbackPage(theme: Theme): ComponentType<any> {\n const cached = fallbackPageCache.get(theme);\n if (cached) return cached;\n\n function Page(props: DocumentPageProps) {\n return createElement(DocumentPage, { ...props, fallbackTheme: theme });\n }\n Page.displayName = 'DocumentPage(fallback)';\n fallbackPageCache.set(theme, Page);\n return Page;\n}\n\n/**\n * Registry → Puck `Config` (mesmo config no editor, viewer e PDF). Replace-by-key;\n * `root.render` embrulha tudo no PageFrame do documento, que lê o tema do contexto.\n */\nexport function buildConfig(registry: Registry, options: BuildConfigOptions = {}): Config {\n const { theme } = options;\n\n const byKey = new Map<string, BlockEntry>();\n registry.forEach(entry => {\n byKey.set(entry.key, entry);\n });\n\n const components: Record<string, ComponentConfig<any>> = {};\n const categoryMap: Record<string, string[]> = {};\n\n byKey.forEach((entry, key) => {\n const { fields, defaultProps, component: Component } = entry;\n\n components[key] = {\n label: entry.label ?? key,\n fields,\n defaultProps,\n ...(entry.permissions && { permissions: entry.permissions }),\n render: blockRender(key, Component as ComponentType<any>)\n } as ComponentConfig<any>;\n\n const category = entry.category ?? 'other';\n if (!categoryMap[category]) categoryMap[category] = [];\n categoryMap[category].push(key);\n });\n\n const categories: NonNullable<Config['categories']> = {};\n Object.keys(categoryMap).forEach(name => {\n categories[name] = { components: categoryMap[name] };\n });\n\n const root: Config['root'] = {\n label: 'Página',\n fields: {\n placeholder: {\n type: 'custom',\n render: () =>\n createElement(\n PanelPlaceholder,\n null,\n `Arraste um bloco para a página para editar suas configurações. Para ajustes gerais do documento, clique no ícone\n Configurações no topo da página.`\n )\n }\n },\n render: (theme ? fallbackPage(theme) : DocumentPage) as NonNullable<Config['root']>['render']\n };\n\n return { root, components, categories } as Config;\n}\n"]}