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,1327 @@
1
+ import { BlockIcon } from './chunk-QYBWIJXZ.js';
2
+ import { DEFAULT_PAGE_MARGINS, DEFAULT_DOCUMENT_COLORS, useDocumentFont, buildConfig, DocumentThemeProvider, EditorShell, DrawerCard, DrawerItemIcon, DrawerHint, DOCUMENT_FONTS } from './chunk-PLQNNXS2.js';
3
+ import { formatResolvedValues } from './chunk-CZB7F2LA.js';
4
+ import { extractBindingKeys, CatalogProvider, ResolvedProvider } from './chunk-SOIYSSU3.js';
5
+ import e, { useRef, useMemo, useEffect, useState, useCallback, createElement, Fragment, useLayoutEffect } from 'react';
6
+ import { createUsePuck, blocksPlugin, outlinePlugin, fieldsPlugin, Puck, ActionBar, useGetPuck } from '@puckeditor/core';
7
+ import { z } from 'zod';
8
+ import styled3 from 'styled-components';
9
+ import { jsxs, jsx, Fragment as Fragment$1 } from 'react/jsx-runtime';
10
+
11
+ // src/editor/dictionary.ts
12
+ var ptBrDictionary = {
13
+ "header-publish": "Publicar",
14
+ "header-undo": "desfazer",
15
+ "header-redo": "refazer",
16
+ "header-toggle-leftsidebar": "Alternar barra lateral esquerda",
17
+ "header-toggle-rightsidebar": "Alternar barra lateral direita",
18
+ "header-toggle-menubar": "Alternar barra de menu",
19
+ "action-selectparent": "Selecionar bloco pai",
20
+ "action-duplicate": "Duplicar",
21
+ "action-delete": "Excluir",
22
+ "label-page": "P\xE1gina",
23
+ "label-component": "Bloco",
24
+ "outline-empty": "Nenhum item",
25
+ "outline-item-collapse": "Recolher",
26
+ "outline-item-expand": "Expandir",
27
+ "outline-header-title": "Estrutura",
28
+ "outline-header-collapseall": "Recolher tudo",
29
+ "outline-item-duplicate": "Duplicar",
30
+ "outline-item-delete": "Excluir",
31
+ "drawer-category-collapse": "Recolher {title}",
32
+ "drawer-category-expand": "Expandir {title}",
33
+ "drawer-category-other": "Outros",
34
+ "canvas-noconfig": "Sem configura\xE7\xE3o para {type}",
35
+ "field-readonly": "Somente leitura",
36
+ "field-arrayitem-summary": "Item #{index}",
37
+ "field-arrayitem-duplicate": "Duplicar",
38
+ "field-arrayitem-delete": "Excluir",
39
+ "field-external-selectdata": "Selecionar dados",
40
+ "field-external-search": "Buscar",
41
+ "field-external-togglefilters": "Alternar filtros",
42
+ "field-external-item": "Item externo",
43
+ "field-external-result-singular": "{count} resultado",
44
+ "field-external-result-plural": "{count} resultados",
45
+ "field-richtext-bold": "Negrito",
46
+ "field-richtext-italic": "It\xE1lico",
47
+ "field-richtext-underline": "Sublinhado",
48
+ "field-richtext-strikethrough": "Riscado",
49
+ "field-richtext-blockquote": "Cita\xE7\xE3o",
50
+ "field-richtext-code-inline": "C\xF3digo em linha",
51
+ "field-richtext-code-block": "Bloco de c\xF3digo",
52
+ "field-richtext-list-bullet": "Lista com marcadores",
53
+ "field-richtext-list-ordered": "Lista numerada",
54
+ "field-richtext-horizontalrule": "Linha horizontal",
55
+ "field-richtext-align-left": "Alinhar \xE0 esquerda",
56
+ "field-richtext-align-center": "Centralizar",
57
+ "field-richtext-align-right": "Alinhar \xE0 direita",
58
+ "field-richtext-align-justify": "Justificar",
59
+ "field-richtext-select": "Selecionar",
60
+ "field-richtext-headingselect-1": "T\xEDtulo 1",
61
+ "field-richtext-headingselect-2": "T\xEDtulo 2",
62
+ "field-richtext-headingselect-3": "T\xEDtulo 3",
63
+ "field-richtext-headingselect-4": "T\xEDtulo 4",
64
+ "field-richtext-headingselect-5": "T\xEDtulo 5",
65
+ "field-richtext-headingselect-6": "T\xEDtulo 6",
66
+ "field-richtext-alignselect-left": "Esquerda",
67
+ "field-richtext-alignselect-center": "Centro",
68
+ "field-richtext-alignselect-right": "Direita",
69
+ "field-richtext-alignselect-justify": "Justificado",
70
+ "field-richtext-listselect-bullet": "Lista com marcadores",
71
+ "field-richtext-listselect-ordered": "Lista numerada",
72
+ "viewport-zoom-in": "Aumentar zoom",
73
+ "viewport-zoom-out": "Diminuir zoom",
74
+ "viewport-zoom-auto": "{zoom}% (autom\xE1tico)",
75
+ "viewport-toggle-menu": "Alternar menu de visualiza\xE7\xE3o",
76
+ "viewport-switch": "Mudar para a visualiza\xE7\xE3o {label}",
77
+ "viewport-switch-default": "Mudar visualiza\xE7\xE3o",
78
+ "plugin-blocks": "Blocos",
79
+ "plugin-outline": "Estrutura",
80
+ "plugin-fields": "Campos",
81
+ "plugin-components": "Componentes",
82
+ "layout-maximize": "maximizar",
83
+ "layout-minimize": "minimizar",
84
+ "loader-loading": "carregando"
85
+ };
86
+
87
+ // src/editor/modifierStateShim.ts
88
+ var INSTALLED = "__dgModifierStateShim";
89
+ function installModifierStateShim() {
90
+ if (typeof Event === "undefined") return;
91
+ const proto = Event.prototype;
92
+ if (proto[INSTALLED]) return;
93
+ Object.defineProperty(Event.prototype, "getModifierState", {
94
+ value: () => false,
95
+ configurable: true,
96
+ writable: true
97
+ });
98
+ proto[INSTALLED] = true;
99
+ }
100
+
101
+ // src/editor/editorApi.ts
102
+ var createEditorApi = (dispatch) => ({
103
+ setData: (updater) => dispatch({
104
+ type: "setData",
105
+ data: typeof updater === "function" ? updater : () => updater
106
+ })
107
+ });
108
+ var assignEditorApiRef = (ref, api) => {
109
+ if (!ref) return;
110
+ if (typeof ref === "function") ref(api);
111
+ else ref.current = api;
112
+ };
113
+
114
+ // src/editor/EditorApiBridge.tsx
115
+ function EditorApiBridge({ apiRef, children }) {
116
+ const getPuck = useGetPuck();
117
+ useEffect(() => {
118
+ assignEditorApiRef(
119
+ apiRef,
120
+ createEditorApi((action) => getPuck().dispatch(action))
121
+ );
122
+ return () => assignEditorApiRef(apiRef, null);
123
+ }, [apiRef, getPuck]);
124
+ return createElement(Fragment, null, children);
125
+ }
126
+
127
+ // src/editor/headerApi.ts
128
+ function headerApiFromHistory(history, extras) {
129
+ return {
130
+ undo: () => history.back(),
131
+ redo: () => history.forward(),
132
+ canUndo: history.hasPast,
133
+ canRedo: history.hasFuture,
134
+ openSettings: extras.openSettings,
135
+ openPreview: extras.openPreview,
136
+ theme: extras.theme
137
+ };
138
+ }
139
+ var usePuckState = createUsePuck();
140
+ var pageFormatSchema = z.enum(["A4", "A5", "A3", "Letter", "Legal"]);
141
+ var marginsSchema = z.object({
142
+ top: z.number(),
143
+ right: z.number(),
144
+ bottom: z.number(),
145
+ left: z.number()
146
+ }).partial();
147
+ var coverFieldsSchema = z.object({
148
+ title: z.string().optional(),
149
+ subtitle: z.string().optional(),
150
+ date: z.string().optional(),
151
+ preparedFor: z.string().optional(),
152
+ presentedBy: z.string().optional(),
153
+ imageUrl: z.string().optional()
154
+ }).strict();
155
+ var headerConfigSchema = z.object({
156
+ enabled: z.boolean().default(false),
157
+ background: z.string().default("#FFFFFF"),
158
+ color: z.string().default("#3F4759"),
159
+ logoPosition: z.enum(["left", "right"]).default("right"),
160
+ info: z.object({
161
+ companyName: z.boolean(),
162
+ cnpj: z.boolean(),
163
+ phone: z.boolean(),
164
+ email: z.boolean(),
165
+ address: z.boolean()
166
+ }).partial().strict().optional()
167
+ }).strict();
168
+ var footerConfigSchema = z.object({
169
+ enabled: z.boolean().default(false),
170
+ pageNumber: z.boolean().default(true),
171
+ background: z.string().default("#FFFFFF"),
172
+ color: z.string().default("#3F4759"),
173
+ alignment: z.enum(["left", "center", "right"]).default("center"),
174
+ info: z.object({
175
+ email: z.boolean(),
176
+ phone: z.boolean(),
177
+ instagram: z.boolean(),
178
+ twitter: z.boolean(),
179
+ address: z.boolean(),
180
+ site: z.boolean(),
181
+ facebook: z.boolean(),
182
+ linkedin: z.boolean()
183
+ }).partial().strict().optional()
184
+ }).strict();
185
+ var themeSchema = z.object({
186
+ documentFont: z.string().optional(),
187
+ page: z.object({
188
+ format: pageFormatSchema.default("A4"),
189
+ orientation: z.enum(["portrait", "landscape"]).default("portrait"),
190
+ margins: marginsSchema.optional()
191
+ }).strict().optional(),
192
+ colors: z.object({
193
+ brand: z.string(),
194
+ text: z.string(),
195
+ background: z.string()
196
+ }).partial().strict().optional(),
197
+ logo: z.object({
198
+ key: z.string().optional(),
199
+ url: z.string().optional()
200
+ }).strict().optional(),
201
+ header: headerConfigSchema.optional(),
202
+ footer: footerConfigSchema.optional(),
203
+ watermark: z.object({
204
+ text: z.string().optional(),
205
+ imageKey: z.string().optional(),
206
+ opacity: z.number().min(0).max(1).optional()
207
+ }).strict().optional()
208
+ }).strict();
209
+
210
+ // src/surface/resolveTheme.ts
211
+ var DEFAULT_DOCUMENT_FONT_ID = "inter";
212
+ var DEFAULT_HEADER_CONFIG = headerConfigSchema.parse({});
213
+ var DEFAULT_FOOTER_CONFIG = footerConfigSchema.parse({});
214
+ function resolveTheme(theme = {}) {
215
+ return {
216
+ ...theme,
217
+ documentFont: theme.documentFont ?? DEFAULT_DOCUMENT_FONT_ID,
218
+ colors: { ...DEFAULT_DOCUMENT_COLORS, ...theme.colors },
219
+ page: {
220
+ format: "A4",
221
+ orientation: "portrait",
222
+ ...theme.page,
223
+ margins: { ...DEFAULT_PAGE_MARGINS, ...theme.page?.margins }
224
+ },
225
+ header: { ...DEFAULT_HEADER_CONFIG, ...theme.header },
226
+ footer: { ...DEFAULT_FOOTER_CONFIG, ...theme.footer }
227
+ };
228
+ }
229
+ function u() {
230
+ return (u = Object.assign || function(e2) {
231
+ for (var r2 = 1; r2 < arguments.length; r2++) {
232
+ var n2 = arguments[r2];
233
+ for (var t2 in n2) Object.prototype.hasOwnProperty.call(n2, t2) && (e2[t2] = n2[t2]);
234
+ }
235
+ return e2;
236
+ }).apply(this, arguments);
237
+ }
238
+ function c(e2, r2) {
239
+ if (null == e2) return {};
240
+ var n2, t2, o2 = {}, a2 = Object.keys(e2);
241
+ for (t2 = 0; t2 < a2.length; t2++) r2.indexOf(n2 = a2[t2]) >= 0 || (o2[n2] = e2[n2]);
242
+ return o2;
243
+ }
244
+ function i(e2) {
245
+ var n2 = useRef(e2), t2 = useRef(function(e3) {
246
+ n2.current && n2.current(e3);
247
+ });
248
+ return n2.current = e2, t2.current;
249
+ }
250
+ var s = function(e2, r2, n2) {
251
+ return void 0 === r2 && (r2 = 0), void 0 === n2 && (n2 = 1), e2 > n2 ? n2 : e2 < r2 ? r2 : e2;
252
+ };
253
+ var f = function(e2) {
254
+ return "touches" in e2;
255
+ };
256
+ var v = function(e2) {
257
+ return e2 && e2.ownerDocument.defaultView || self;
258
+ };
259
+ var d = function(e2, r2, n2) {
260
+ var t2 = e2.getBoundingClientRect(), o2 = f(r2) ? (function(e3, r3) {
261
+ for (var n3 = 0; n3 < e3.length; n3++) if (e3[n3].identifier === r3) return e3[n3];
262
+ return e3[0];
263
+ })(r2.touches, n2) : r2;
264
+ return { left: s((o2.pageX - (t2.left + v(e2).pageXOffset)) / t2.width), top: s((o2.pageY - (t2.top + v(e2).pageYOffset)) / t2.height) };
265
+ };
266
+ var h = function(e2) {
267
+ !f(e2) && e2.preventDefault();
268
+ };
269
+ var g = e.memo(function(o2) {
270
+ var a2 = o2.onMove, l2 = o2.onKey, s2 = o2.onEnd, g2 = c(o2, ["onMove", "onKey", "onEnd"]), m2 = useRef(null), p2 = i(a2), b2 = i(l2), _2 = i(s2), E2 = useRef(null), C2 = useRef(false), x = useMemo(function() {
271
+ var e2 = function(e3) {
272
+ h(e3), (f(e3) ? e3.touches.length > 0 : e3.buttons > 0) && m2.current ? p2(d(m2.current, e3, E2.current)) : (n2(false), _2());
273
+ }, r2 = function() {
274
+ n2(false), _2();
275
+ };
276
+ function n2(n3) {
277
+ var t2 = C2.current, o3 = v(m2.current), a3 = n3 ? o3.addEventListener : o3.removeEventListener;
278
+ a3(t2 ? "touchmove" : "mousemove", e2), a3(t2 ? "touchend" : "mouseup", r2);
279
+ }
280
+ return [function(e3) {
281
+ var r3 = e3.nativeEvent, t2 = m2.current;
282
+ if (t2 && (h(r3), !(function(e4, r4) {
283
+ return r4 && !f(e4);
284
+ })(r3, C2.current) && t2)) {
285
+ if (f(r3)) {
286
+ C2.current = true;
287
+ var o3 = r3.changedTouches || [];
288
+ o3.length && (E2.current = o3[0].identifier);
289
+ }
290
+ t2.focus(), p2(d(t2, r3, E2.current)), n2(true);
291
+ }
292
+ }, function(e3) {
293
+ var r3 = e3.which || e3.keyCode;
294
+ r3 < 37 || r3 > 40 || (e3.preventDefault(), b2({ left: 39 === r3 ? 0.05 : 37 === r3 ? -0.05 : 0, top: 40 === r3 ? 0.05 : 38 === r3 ? -0.05 : 0 }));
295
+ }, function(e3) {
296
+ var r3 = e3.which || e3.keyCode;
297
+ r3 >= 37 && r3 <= 40 && _2();
298
+ }, n2];
299
+ }, [b2, p2, _2]), H = x[0], M = x[1], N = x[2], w2 = x[3];
300
+ return useEffect(function() {
301
+ return w2;
302
+ }, [w2]), e.createElement("div", u({}, g2, { onTouchStart: H, onMouseDown: H, className: "react-colorful__interactive", ref: m2, onKeyDown: M, onKeyUp: N, tabIndex: 0, role: "slider" }));
303
+ });
304
+ var m = function(e2) {
305
+ return e2.filter(Boolean).join(" ");
306
+ };
307
+ var p = function(r2) {
308
+ var n2 = r2.color, t2 = r2.left, o2 = r2.top, a2 = void 0 === o2 ? 0.5 : o2, l2 = m(["react-colorful__pointer", r2.className]);
309
+ return e.createElement("div", { className: l2, style: { top: 100 * a2 + "%", left: 100 * t2 + "%" } }, e.createElement("div", { className: "react-colorful__pointer-fill", style: { backgroundColor: n2 } }));
310
+ };
311
+ var b = function(e2, r2, n2) {
312
+ return void 0 === r2 && (r2 = 0), void 0 === n2 && (n2 = Math.pow(10, r2)), Math.round(n2 * e2) / n2;
313
+ };
314
+ var E = function(e2) {
315
+ return L(C(e2));
316
+ };
317
+ var C = function(e2) {
318
+ return "#" === e2[0] && (e2 = e2.substring(1)), e2.length < 6 ? { r: parseInt(e2[0] + e2[0], 16), g: parseInt(e2[1] + e2[1], 16), b: parseInt(e2[2] + e2[2], 16), a: 4 === e2.length ? b(parseInt(e2[3] + e2[3], 16) / 255, 2) : 1 } : { r: parseInt(e2.substring(0, 2), 16), g: parseInt(e2.substring(2, 4), 16), b: parseInt(e2.substring(4, 6), 16), a: 8 === e2.length ? b(parseInt(e2.substring(6, 8), 16) / 255, 2) : 1 };
319
+ };
320
+ var w = function(e2) {
321
+ return D(I(e2));
322
+ };
323
+ var y = function(e2) {
324
+ var r2 = e2.s, n2 = e2.v, t2 = e2.a, o2 = (200 - r2) * n2 / 100;
325
+ return { h: b(e2.h), s: b(o2 > 0 && o2 < 200 ? r2 * n2 / 100 / (o2 <= 100 ? o2 : 200 - o2) * 100 : 0), l: b(o2 / 2), a: b(t2, 2) };
326
+ };
327
+ var q = function(e2) {
328
+ var r2 = y(e2);
329
+ return "hsl(" + r2.h + ", " + r2.s + "%, " + r2.l + "%)";
330
+ };
331
+ var I = function(e2) {
332
+ var r2 = e2.h, n2 = e2.s, t2 = e2.v, o2 = e2.a;
333
+ r2 = r2 / 360 * 6, n2 /= 100, t2 /= 100;
334
+ var a2 = Math.floor(r2), l2 = t2 * (1 - n2), u2 = t2 * (1 - (r2 - a2) * n2), c2 = t2 * (1 - (1 - r2 + a2) * n2), i2 = a2 % 6;
335
+ return { r: b(255 * [t2, u2, l2, l2, c2, t2][i2]), g: b(255 * [c2, t2, t2, u2, l2, l2][i2]), b: b(255 * [l2, l2, c2, t2, t2, u2][i2]), a: b(o2, 2) };
336
+ };
337
+ var B = function(e2) {
338
+ var r2 = e2.toString(16);
339
+ return r2.length < 2 ? "0" + r2 : r2;
340
+ };
341
+ var D = function(e2) {
342
+ var r2 = e2.r, n2 = e2.g, t2 = e2.b, o2 = e2.a, a2 = o2 < 1 ? B(b(255 * o2)) : "";
343
+ return "#" + B(r2) + B(n2) + B(t2) + a2;
344
+ };
345
+ var L = function(e2) {
346
+ var r2 = e2.r, n2 = e2.g, t2 = e2.b, o2 = e2.a, a2 = Math.max(r2, n2, t2), l2 = a2 - Math.min(r2, n2, t2), u2 = l2 ? a2 === r2 ? (n2 - t2) / l2 : a2 === n2 ? 2 + (t2 - r2) / l2 : 4 + (r2 - n2) / l2 : 0;
347
+ return { h: b(60 * (u2 < 0 ? u2 + 6 : u2)), s: b(a2 ? l2 / a2 * 100 : 0), v: b(a2 / 255 * 100), a: o2 };
348
+ };
349
+ var S = e.memo(function(r2) {
350
+ var n2 = r2.hue, t2 = r2.onChange, o2 = r2.onChangeEnd, a2 = m(["react-colorful__hue", r2.className]);
351
+ return e.createElement("div", { className: a2 }, e.createElement(g, { onMove: function(e2) {
352
+ t2({ h: 360 * e2.left });
353
+ }, onKey: function(e2) {
354
+ t2({ h: s(n2 + 360 * e2.left, 0, 360) });
355
+ }, onEnd: o2, "aria-label": "Hue", "aria-valuenow": b(n2), "aria-valuemax": "360", "aria-valuemin": "0" }, e.createElement(p, { className: "react-colorful__hue-pointer", left: n2 / 360, color: q({ h: n2, s: 100, v: 100, a: 1 }) })));
356
+ });
357
+ var T = e.memo(function(r2) {
358
+ var n2 = r2.hsva, t2 = r2.onChange, o2 = r2.onChangeEnd, a2 = { backgroundColor: q({ h: n2.h, s: 100, v: 100, a: 1 }) };
359
+ return e.createElement("div", { className: "react-colorful__saturation", style: a2 }, e.createElement(g, { onMove: function(e2) {
360
+ t2({ s: 100 * e2.left, v: 100 - 100 * e2.top });
361
+ }, onKey: function(e2) {
362
+ t2({ s: s(n2.s + 100 * e2.left, 0, 100), v: s(n2.v - 100 * e2.top, 0, 100) });
363
+ }, onEnd: o2, "aria-label": "Color", "aria-valuetext": "Saturation " + b(n2.s) + "%, Brightness " + b(n2.v) + "%" }, e.createElement(p, { className: "react-colorful__saturation-pointer", top: 1 - n2.v / 100, left: n2.s / 100, color: q(n2) })));
364
+ });
365
+ var F = function(e2, r2) {
366
+ if (e2 === r2) return true;
367
+ for (var n2 in e2) if (e2[n2] !== r2[n2]) return false;
368
+ return true;
369
+ };
370
+ var X = function(e2, r2) {
371
+ return e2.toLowerCase() === r2.toLowerCase() || F(C(e2), C(r2));
372
+ };
373
+ function Y(e2, n2, l2, u2) {
374
+ var c2 = i(l2), s2 = i(u2), f2 = useState(function() {
375
+ return e2.toHsva(n2);
376
+ }), v2 = f2[0], d2 = f2[1], h2 = useRef({ color: n2, hsva: v2 }), g2 = useRef(false);
377
+ useEffect(function() {
378
+ if (!e2.equal(n2, h2.current.color)) {
379
+ var r2 = e2.toHsva(n2);
380
+ h2.current = { hsva: r2, color: n2 }, d2(r2), g2.current = false;
381
+ }
382
+ }, [n2, e2]), useEffect(function() {
383
+ var r2;
384
+ F(v2, h2.current.hsva) || e2.equal(r2 = e2.fromHsva(v2), h2.current.color) || (h2.current = { hsva: v2, color: r2 }, c2(r2), g2.current = true);
385
+ }, [v2, e2, c2]);
386
+ var m2 = useCallback(function(e3) {
387
+ d2(function(r2) {
388
+ return Object.assign({}, r2, e3);
389
+ });
390
+ }, []), p2 = useCallback(function() {
391
+ g2.current && (g2.current = false, s2(h2.current.color));
392
+ }, [s2]);
393
+ return [v2, m2, p2];
394
+ }
395
+ var U = "undefined" != typeof window ? useLayoutEffect : useEffect;
396
+ var V = function() {
397
+ return ("undefined" != typeof __webpack_nonce__ ? __webpack_nonce__ : void 0);
398
+ };
399
+ var G = /* @__PURE__ */ new Map();
400
+ var J = function(e2) {
401
+ U(function() {
402
+ var r2 = e2.current ? e2.current.ownerDocument : document;
403
+ if (void 0 !== r2 && !G.has(r2)) {
404
+ var n2 = r2.createElement("style");
405
+ n2.innerHTML = `.react-colorful{position:relative;display:flex;flex-direction:column;width:200px;height:200px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:default}.react-colorful__saturation{position:relative;flex-grow:1;border-color:transparent;border-bottom:12px solid #000;border-radius:8px 8px 0 0;background-image:linear-gradient(0deg,#000,transparent),linear-gradient(90deg,#fff,hsla(0,0%,100%,0))}.react-colorful__alpha-gradient,.react-colorful__pointer-fill{content:"";position:absolute;left:0;top:0;right:0;bottom:0;pointer-events:none;border-radius:inherit}.react-colorful__alpha-gradient,.react-colorful__saturation{box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}.react-colorful__alpha,.react-colorful__hue{position:relative;height:24px}.react-colorful__hue{background:linear-gradient(90deg,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red)}.react-colorful__last-control{border-radius:0 0 8px 8px}.react-colorful__interactive{position:absolute;left:0;top:0;right:0;bottom:0;border-radius:inherit;outline:none;touch-action:none}.react-colorful__pointer{position:absolute;z-index:1;box-sizing:border-box;width:28px;height:28px;transform:translate(-50%,-50%);background-color:#fff;border:2px solid #fff;border-radius:50%;box-shadow:0 2px 4px rgba(0,0,0,.2)}.react-colorful__interactive:focus .react-colorful__pointer{transform:translate(-50%,-50%) scale(1.1)}.react-colorful__alpha,.react-colorful__alpha-pointer{background-color:#fff;background-image:url('data:image/svg+xml;charset=utf-8,<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill-opacity=".05"><path d="M8 0h8v8H8zM0 8h8v8H0z"/></svg>')}.react-colorful__saturation-pointer{z-index:3}.react-colorful__hue-pointer{z-index:2}`, G.set(r2, n2);
406
+ var t2 = V();
407
+ t2 && n2.setAttribute("nonce", t2), r2.head.appendChild(n2);
408
+ }
409
+ }, []);
410
+ };
411
+ var Q = function(n2) {
412
+ var t2 = n2.className, o2 = n2.colorModel, a2 = n2.color, l2 = void 0 === a2 ? o2.defaultColor : a2, i2 = n2.onChange, s2 = n2.onChangeEnd, f2 = c(n2, ["className", "colorModel", "color", "onChange", "onChangeEnd"]), v2 = useRef(null);
413
+ J(v2);
414
+ var d2 = Y(o2, l2, i2, s2), h2 = d2[0], g2 = d2[1], p2 = d2[2], b2 = m(["react-colorful", t2]);
415
+ return e.createElement("div", u({}, f2, { ref: v2, className: b2 }), e.createElement(T, { hsva: h2, onChange: g2, onChangeEnd: p2 }), e.createElement(S, { hue: h2.h, onChange: g2, onChangeEnd: p2, className: "react-colorful__last-control" }));
416
+ };
417
+ var W = { defaultColor: "000", toHsva: E, fromHsva: function(e2) {
418
+ return w({ h: e2.h, s: e2.s, v: e2.v, a: 1 });
419
+ }, equal: X };
420
+ var Z = function(r2) {
421
+ return e.createElement(Q, u({}, r2, { colorModel: W }));
422
+ };
423
+
424
+ // src/editor/colorPicker/color.ts
425
+ var HEX_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
426
+ function normalizeHex(input) {
427
+ const withHash = input.startsWith("#") ? input : `#${input}`;
428
+ if (!HEX_RE.test(withHash)) return null;
429
+ if (withHash.length === 7) return withHash.toUpperCase();
430
+ const [r2, g2, b2] = withHash.slice(1);
431
+ return `#${r2}${r2}${g2}${g2}${b2}${b2}`.toUpperCase();
432
+ }
433
+ function hexToRgb(hex) {
434
+ const full = normalizeHex(hex) ?? "#000000";
435
+ return {
436
+ r: parseInt(full.slice(1, 3), 16),
437
+ g: parseInt(full.slice(3, 5), 16),
438
+ b: parseInt(full.slice(5, 7), 16)
439
+ };
440
+ }
441
+ function rgbToHex(r2, g2, b2) {
442
+ const channel = (value) => Math.max(0, Math.min(255, Math.round(value))).toString(16).padStart(2, "0");
443
+ return `#${channel(r2)}${channel(g2)}${channel(b2)}`.toUpperCase();
444
+ }
445
+ var Panel = styled3.div`
446
+ width: 100%;
447
+
448
+ .react-colorful {
449
+ width: 100%;
450
+ height: 160px;
451
+ }
452
+
453
+ .react-colorful__saturation {
454
+ border-radius: 8px;
455
+ border-bottom: none;
456
+ }
457
+
458
+ .react-colorful__hue {
459
+ height: 10px;
460
+ margin-top: 10px;
461
+ border-radius: 5px;
462
+ }
463
+
464
+ .react-colorful__pointer {
465
+ width: 18px;
466
+ height: 18px;
467
+ border: 3px solid #fff;
468
+ }
469
+
470
+ .react-colorful__hue-pointer {
471
+ width: 14px;
472
+ height: 14px;
473
+ }
474
+ `;
475
+ var Fields = styled3.div`
476
+ display: grid;
477
+ grid-template-columns: 1.8fr 1fr 1fr 1fr;
478
+ gap: 6px;
479
+ margin-top: 12px;
480
+ `;
481
+ var FieldColumn = styled3.label`
482
+ display: flex;
483
+ flex-direction: column;
484
+ gap: 4px;
485
+ font-size: 11px;
486
+ font-weight: 600;
487
+ color: #3f4759;
488
+ `;
489
+ var FieldInput = styled3.input`
490
+ width: 100%;
491
+ padding: 6px 4px;
492
+ border: 1px solid #e5e7eb;
493
+ border-radius: 6px;
494
+ font-size: 12px;
495
+ text-align: center;
496
+ color: #3f4759;
497
+ `;
498
+ var CHANNELS = [
499
+ { key: "r", label: "R" },
500
+ { key: "g", label: "G" },
501
+ { key: "b", label: "B" }
502
+ ];
503
+ function ColorPickerPanel({ value, onChange, debounceMs = 300 }) {
504
+ const [draft, setDraft] = useState(() => normalizeHex(value) ?? "#000000");
505
+ const [hexText, setHexText] = useState(draft);
506
+ const timer = useRef();
507
+ const pending = useRef(null);
508
+ const onChangeRef = useRef(onChange);
509
+ onChangeRef.current = onChange;
510
+ useEffect(() => setHexText(draft), [draft]);
511
+ useEffect(
512
+ () => () => {
513
+ clearTimeout(timer.current);
514
+ if (pending.current !== null) onChangeRef.current(pending.current);
515
+ },
516
+ []
517
+ );
518
+ const apply = (hex) => {
519
+ setDraft(hex);
520
+ pending.current = hex;
521
+ clearTimeout(timer.current);
522
+ timer.current = setTimeout(() => {
523
+ pending.current = null;
524
+ onChangeRef.current(hex);
525
+ }, debounceMs);
526
+ };
527
+ const rgb = hexToRgb(draft);
528
+ const onChannelChange = (channel, raw) => {
529
+ const parsed = raw === "" ? 0 : parseInt(raw, 10);
530
+ if (Number.isNaN(parsed)) return;
531
+ const next = { ...rgb, [channel]: parsed };
532
+ apply(rgbToHex(next.r, next.g, next.b));
533
+ };
534
+ return /* @__PURE__ */ jsxs(Panel, { children: [
535
+ /* @__PURE__ */ jsx(Z, { color: draft, onChange: (next) => apply(next.toUpperCase()) }),
536
+ /* @__PURE__ */ jsxs(Fields, { children: [
537
+ /* @__PURE__ */ jsxs(FieldColumn, { children: [
538
+ "Hex",
539
+ /* @__PURE__ */ jsx(
540
+ FieldInput,
541
+ {
542
+ "aria-label": "Hex",
543
+ value: hexText,
544
+ onChange: (e2) => {
545
+ setHexText(e2.target.value);
546
+ const normalized = normalizeHex(e2.target.value);
547
+ if (normalized) apply(normalized);
548
+ },
549
+ onBlur: () => setHexText(draft)
550
+ }
551
+ )
552
+ ] }),
553
+ CHANNELS.map(({ key, label }) => /* @__PURE__ */ jsxs(FieldColumn, { children: [
554
+ label,
555
+ /* @__PURE__ */ jsx(
556
+ FieldInput,
557
+ {
558
+ "aria-label": label,
559
+ inputMode: "numeric",
560
+ value: rgb[key],
561
+ onChange: (e2) => onChannelChange(key, e2.target.value)
562
+ }
563
+ )
564
+ ] }, key))
565
+ ] })
566
+ ] });
567
+ }
568
+ var Wrapper = styled3.div`
569
+ position: relative;
570
+ display: inline-flex;
571
+ `;
572
+ var SwatchTrigger = styled3.button`
573
+ width: ${(props) => props.$size}px;
574
+ height: ${(props) => props.$size}px;
575
+ padding: 0;
576
+ border: 1px solid #e5e7eb;
577
+ border-radius: 6px;
578
+ cursor: pointer;
579
+ background: ${(props) => props.$color};
580
+ `;
581
+ var Popover = styled3.div`
582
+ position: absolute;
583
+ top: calc(100% + 8px);
584
+ right: 0;
585
+ width: 216px;
586
+ padding: 12px;
587
+ background: #fff;
588
+ border: 1px solid #e5e7eb;
589
+ border-radius: 10px;
590
+ box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);
591
+ z-index: 1200;
592
+ display: flex;
593
+ flex-direction: column;
594
+ gap: 12px;
595
+ `;
596
+ var PresetGrid = styled3.div`
597
+ display: grid;
598
+ grid-template-columns: repeat(6, 1fr);
599
+ gap: 6px;
600
+ `;
601
+ var PresetSwatch = styled3.button`
602
+ position: relative;
603
+ width: 100%;
604
+ aspect-ratio: 1;
605
+ padding: 0;
606
+ border: 1px solid rgba(15, 23, 42, 0.12);
607
+ border-radius: 7px;
608
+ cursor: pointer;
609
+ background: ${(props) => props.$color};
610
+ color: #fff;
611
+ display: flex;
612
+ align-items: center;
613
+ justify-content: center;
614
+
615
+ &:hover {
616
+ transform: scale(1.08);
617
+ }
618
+ `;
619
+ var CurrentRow = styled3.div`
620
+ display: flex;
621
+ align-items: center;
622
+ gap: 8px;
623
+ `;
624
+ var CurrentSwatch = styled3.button`
625
+ width: 28px;
626
+ height: 28px;
627
+ flex-shrink: 0;
628
+ padding: 0;
629
+ border: 1px solid #e5e7eb;
630
+ border-radius: 6px;
631
+ cursor: pointer;
632
+ background: ${(props) => props.$color};
633
+ `;
634
+ var HexField = styled3.input`
635
+ flex: 1;
636
+ min-width: 0;
637
+ padding: 6px 8px;
638
+ border: 1px solid #e5e7eb;
639
+ border-radius: 6px;
640
+ font-size: 13px;
641
+ color: #3f4759;
642
+ `;
643
+ var InheritAction = styled3.button`
644
+ display: inline-flex;
645
+ align-items: center;
646
+ gap: 6px;
647
+ align-self: flex-start;
648
+ padding: 0;
649
+ border: none;
650
+ background: none;
651
+ font-size: 13px;
652
+ font-weight: 500;
653
+ color: #1a56db;
654
+ cursor: pointer;
655
+
656
+ &:hover {
657
+ text-decoration: underline;
658
+ }
659
+ `;
660
+ var DEFAULT_COLOR_PRESETS = [
661
+ "#000000",
662
+ "#434A5B",
663
+ "#A9B0C5",
664
+ "#FFFFFF",
665
+ "#7D2A55",
666
+ "#9B3FD6",
667
+ "#D63F94",
668
+ "#D63C31",
669
+ "#F5820B",
670
+ "#DFA71E",
671
+ "#54390B",
672
+ "#57AB32",
673
+ "#25541B",
674
+ "#2AA48D",
675
+ "#7DA8F7",
676
+ "#2563EB",
677
+ "#152C61",
678
+ "#6B7280"
679
+ ];
680
+ var checkColor = (hex) => {
681
+ const { r: r2, g: g2, b: b2 } = hexToRgb(hex);
682
+ return 0.299 * r2 + 0.587 * g2 + 0.114 * b2 > 186 ? "#1F2937" : "#FFFFFF";
683
+ };
684
+ function CheckIcon() {
685
+ return /* @__PURE__ */ jsx("svg", { width: "12", height: "12", viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx(
686
+ "path",
687
+ {
688
+ d: "M3 8.5 6.5 12 13 4.5",
689
+ stroke: "currentColor",
690
+ strokeWidth: "2.4",
691
+ strokeLinecap: "round",
692
+ strokeLinejoin: "round"
693
+ }
694
+ ) });
695
+ }
696
+ function InheritIcon() {
697
+ return /* @__PURE__ */ jsx("svg", { width: "13", height: "13", viewBox: "0 0 16 16", fill: "none", "aria-hidden": true, children: /* @__PURE__ */ jsx(
698
+ "path",
699
+ {
700
+ d: "M13.5 8a5.5 5.5 0 1 1-1.61-3.89M13.5 2.5v2.75h-2.75",
701
+ stroke: "currentColor",
702
+ strokeWidth: "1.6",
703
+ strokeLinecap: "round",
704
+ strokeLinejoin: "round"
705
+ }
706
+ ) });
707
+ }
708
+ function ColorPicker({
709
+ value,
710
+ fallback,
711
+ presets = DEFAULT_COLOR_PRESETS,
712
+ onChange,
713
+ inheritLabel,
714
+ ariaLabel,
715
+ size = 28
716
+ }) {
717
+ const [open, setOpen] = useState(false);
718
+ const [advanced, setAdvanced] = useState(false);
719
+ const [hexDraft, setHexDraft] = useState(null);
720
+ const wrapperRef = useRef(null);
721
+ const effective = value ?? fallback ?? "#000000";
722
+ if (presets.length % 6 !== 0) {
723
+ console.warn(`[vobi-document] paleta com ${presets.length} cores n\xE3o fecha linhas de 6 (docs/theme.md).`);
724
+ }
725
+ useEffect(() => {
726
+ if (!open) return void 0;
727
+ const close = (event) => {
728
+ const el = wrapperRef.current;
729
+ if (el && !el.contains(event.target)) {
730
+ setOpen(false);
731
+ setAdvanced(false);
732
+ }
733
+ };
734
+ document.addEventListener("pointerdown", close);
735
+ return () => document.removeEventListener("pointerdown", close);
736
+ }, [open]);
737
+ const commit = (hex) => {
738
+ setHexDraft(null);
739
+ onChange(hex);
740
+ };
741
+ return /* @__PURE__ */ jsxs(Wrapper, { ref: wrapperRef, children: [
742
+ /* @__PURE__ */ jsx(
743
+ SwatchTrigger,
744
+ {
745
+ type: "button",
746
+ "aria-label": ariaLabel,
747
+ $color: effective,
748
+ $size: size,
749
+ onClick: () => setOpen((prev) => !prev)
750
+ }
751
+ ),
752
+ open ? /* @__PURE__ */ jsxs(Popover, { children: [
753
+ /* @__PURE__ */ jsx(PresetGrid, { children: presets.map((preset) => /* @__PURE__ */ jsx(
754
+ PresetSwatch,
755
+ {
756
+ type: "button",
757
+ "aria-label": preset,
758
+ $color: preset,
759
+ style: { color: checkColor(preset) },
760
+ onClick: () => commit(preset),
761
+ children: value?.toUpperCase() === preset.toUpperCase() ? /* @__PURE__ */ jsx(CheckIcon, {}) : null
762
+ },
763
+ preset
764
+ )) }),
765
+ /* @__PURE__ */ jsxs(CurrentRow, { children: [
766
+ /* @__PURE__ */ jsx(
767
+ CurrentSwatch,
768
+ {
769
+ type: "button",
770
+ "aria-label": "Cor personalizada",
771
+ $color: effective,
772
+ onClick: () => setAdvanced((prev) => !prev)
773
+ }
774
+ ),
775
+ /* @__PURE__ */ jsx(
776
+ HexField,
777
+ {
778
+ "aria-label": "Cor (hex)",
779
+ value: hexDraft ?? effective.toUpperCase(),
780
+ onChange: (e2) => {
781
+ const next = e2.target.value;
782
+ const normalized = normalizeHex(next);
783
+ if (normalized) {
784
+ commit(normalized);
785
+ return;
786
+ }
787
+ setHexDraft(next);
788
+ },
789
+ onBlur: () => setHexDraft(null)
790
+ }
791
+ )
792
+ ] }),
793
+ advanced ? /* @__PURE__ */ jsx(ColorPickerPanel, { value: effective, onChange: (next) => commit(next) }) : null,
794
+ inheritLabel ? /* @__PURE__ */ jsxs(
795
+ InheritAction,
796
+ {
797
+ type: "button",
798
+ onClick: () => {
799
+ commit(void 0);
800
+ setOpen(false);
801
+ },
802
+ children: [
803
+ /* @__PURE__ */ jsx(InheritIcon, {}),
804
+ inheritLabel
805
+ ]
806
+ }
807
+ ) : null
808
+ ] }) : null
809
+ ] });
810
+ }
811
+ var Backdrop = styled3.div`
812
+ position: fixed;
813
+ inset: 0;
814
+ background: rgba(15, 23, 42, 0.45);
815
+ display: flex;
816
+ align-items: center;
817
+ justify-content: center;
818
+ z-index: 1000;
819
+ `;
820
+ var Dialog = styled3.div`
821
+ width: 560px;
822
+ max-width: calc(100vw - 32px);
823
+ max-height: calc(100vh - 64px);
824
+ background: #fff;
825
+ border-radius: 12px;
826
+ overflow: hidden;
827
+ display: flex;
828
+ flex-direction: column;
829
+ font-family:
830
+ 'Inter',
831
+ -apple-system,
832
+ sans-serif;
833
+ `;
834
+ var Head = styled3.div`
835
+ display: flex;
836
+ align-items: center;
837
+ justify-content: space-between;
838
+ padding: 20px 24px;
839
+ border-bottom: 1px solid #eef0f3;
840
+ font-size: 18px;
841
+ font-weight: 600;
842
+ color: #1f2937;
843
+ `;
844
+ var CloseButton = styled3.button`
845
+ border: none;
846
+ background: none;
847
+ cursor: pointer;
848
+ font-size: 20px;
849
+ color: #6b7280;
850
+ line-height: 1;
851
+ `;
852
+ var Panel2 = styled3.div`
853
+ flex: 1;
854
+ padding: 24px 28px;
855
+ overflow: auto;
856
+ `;
857
+ var SectionTitle = styled3.h3`
858
+ margin: 0 0 16px;
859
+ font-size: 15px;
860
+ font-weight: 600;
861
+ color: #1f2937;
862
+ `;
863
+ var ColorRow = styled3.label`
864
+ display: flex;
865
+ align-items: center;
866
+ justify-content: space-between;
867
+ gap: 12px;
868
+ padding: 10px 0;
869
+ font-size: 14px;
870
+ color: #3f4759;
871
+ `;
872
+ var ColorControls = styled3.div`
873
+ position: relative;
874
+ display: flex;
875
+ align-items: center;
876
+ gap: 10px;
877
+ `;
878
+ styled3.input`
879
+ width: 96px;
880
+ padding: 6px 8px;
881
+ border: 1px solid #e5e7eb;
882
+ border-radius: 6px;
883
+ font-size: 13px;
884
+ text-align: right;
885
+ color: #6b7280;
886
+ `;
887
+ styled3.button`
888
+ width: 36px;
889
+ height: 36px;
890
+ padding: 0;
891
+ border: 1px solid #e5e7eb;
892
+ border-radius: 6px;
893
+ cursor: pointer;
894
+ background: ${(props) => props.$color};
895
+ `;
896
+ var Field = styled3.div`
897
+ margin-top: 24px;
898
+ `;
899
+ var FieldLabel = styled3.label`
900
+ display: block;
901
+ margin-bottom: 8px;
902
+ font-size: 14px;
903
+ font-weight: 600;
904
+ color: #1f2937;
905
+ `;
906
+ var Select = styled3.select`
907
+ width: 100%;
908
+ padding: 10px 12px;
909
+ border: 1px solid #e5e7eb;
910
+ border-radius: 8px;
911
+ font-size: 14px;
912
+ color: #3f4759;
913
+ background: #fff;
914
+ `;
915
+ var LogoBox = styled3.div`
916
+ margin-top: 12px;
917
+ width: 160px;
918
+ height: 160px;
919
+ border: 1px solid #e5e7eb;
920
+ border-radius: 8px;
921
+ display: flex;
922
+ align-items: center;
923
+ justify-content: center;
924
+ background: #f5f7fa;
925
+ overflow: hidden;
926
+ position: relative;
927
+ `;
928
+ var LogoImg = styled3.img`
929
+ max-width: 100%;
930
+ max-height: 100%;
931
+ `;
932
+ var UploadLabel = styled3.label`
933
+ display: inline-flex;
934
+ align-items: center;
935
+ gap: 6px;
936
+ margin-top: 12px;
937
+ padding: 8px 14px;
938
+ border-radius: 6px;
939
+ background: #1a56db;
940
+ color: #fff;
941
+ font-size: 13px;
942
+ font-weight: 500;
943
+ cursor: pointer;
944
+ `;
945
+ var HiddenFile = styled3.input`
946
+ display: none;
947
+ `;
948
+ var Placeholder = styled3.div`
949
+ color: #9aa3af;
950
+ font-size: 14px;
951
+ `;
952
+ function ColorField({ label, value, onCommit }) {
953
+ return /* @__PURE__ */ jsxs(ColorRow, { as: "div", children: [
954
+ /* @__PURE__ */ jsx("span", { children: label }),
955
+ /* @__PURE__ */ jsx(ColorControls, { children: /* @__PURE__ */ jsx(
956
+ ColorPicker,
957
+ {
958
+ value,
959
+ ariaLabel: `${label} (seletor)`,
960
+ onChange: (next) => {
961
+ if (next) onCommit(next);
962
+ }
963
+ }
964
+ ) })
965
+ ] });
966
+ }
967
+ var COLOR_FIELDS = [
968
+ { key: "brand", label: "Cor de marca" },
969
+ { key: "text", label: "Texto" },
970
+ { key: "background", label: "Fundo" }
971
+ ];
972
+ function VisualTab({ theme, onPatch, onLogoUpload }) {
973
+ const colors = { ...DEFAULT_DOCUMENT_COLORS, ...theme.colors };
974
+ const setColor = (key, value) => onPatch({ colors: { ...theme.colors, [key]: value } });
975
+ const handleLogo = async (file) => {
976
+ if (!file || !onLogoUpload) return;
977
+ const result = await onLogoUpload(file);
978
+ onPatch({ logo: result });
979
+ };
980
+ return /* @__PURE__ */ jsxs(Fragment$1, { children: [
981
+ /* @__PURE__ */ jsx(SectionTitle, { children: "Cores" }),
982
+ COLOR_FIELDS.map((field) => /* @__PURE__ */ jsx(
983
+ ColorField,
984
+ {
985
+ label: field.label,
986
+ value: colors[field.key],
987
+ onCommit: (next) => setColor(field.key, next)
988
+ },
989
+ field.key
990
+ )),
991
+ /* @__PURE__ */ jsxs(Field, { children: [
992
+ /* @__PURE__ */ jsx(FieldLabel, { htmlFor: "docgen-font", children: "Fonte" }),
993
+ /* @__PURE__ */ jsx(
994
+ Select,
995
+ {
996
+ id: "docgen-font",
997
+ "aria-label": "Fonte",
998
+ value: theme.documentFont ?? DEFAULT_DOCUMENT_FONT_ID,
999
+ onChange: (e2) => onPatch({ documentFont: e2.target.value }),
1000
+ children: DOCUMENT_FONTS.map((font) => /* @__PURE__ */ jsx("option", { value: font.id, children: font.label }, font.id))
1001
+ }
1002
+ )
1003
+ ] }),
1004
+ /* @__PURE__ */ jsxs(Field, { children: [
1005
+ /* @__PURE__ */ jsx(FieldLabel, { as: "span", children: "Logo" }),
1006
+ /* @__PURE__ */ jsx(LogoBox, { children: theme.logo?.url ? /* @__PURE__ */ jsx(LogoImg, { src: theme.logo.url, alt: "Logo" }) : /* @__PURE__ */ jsx(Placeholder, { children: "Sem logo" }) }),
1007
+ /* @__PURE__ */ jsxs(UploadLabel, { children: [
1008
+ "Alterar",
1009
+ /* @__PURE__ */ jsx(
1010
+ HiddenFile,
1011
+ {
1012
+ type: "file",
1013
+ accept: "image/*",
1014
+ "aria-label": "Alterar logo",
1015
+ onChange: (e2) => handleLogo(e2.target.files?.[0])
1016
+ }
1017
+ )
1018
+ ] })
1019
+ ] })
1020
+ ] });
1021
+ }
1022
+ function DocumentSettingsModal({
1023
+ open,
1024
+ onClose,
1025
+ theme,
1026
+ onThemeChange,
1027
+ onLogoUpload
1028
+ }) {
1029
+ if (!open) return null;
1030
+ const patch = (next) => onThemeChange({ ...theme, ...next });
1031
+ return /* @__PURE__ */ jsx(Backdrop, { role: "dialog", "aria-modal": "true", "aria-label": "Configura\xE7\xF5es do documento", children: /* @__PURE__ */ jsxs(Dialog, { children: [
1032
+ /* @__PURE__ */ jsxs(Head, { children: [
1033
+ /* @__PURE__ */ jsx("span", { children: "Configura\xE7\xF5es do documento" }),
1034
+ /* @__PURE__ */ jsx(CloseButton, { type: "button", "aria-label": "Fechar", onClick: onClose, children: "\xD7" })
1035
+ ] }),
1036
+ /* @__PURE__ */ jsx(Panel2, { children: /* @__PURE__ */ jsx(VisualTab, { theme, onPatch: patch, onLogoUpload }) })
1037
+ ] }) });
1038
+ }
1039
+ var EMPTY = {};
1040
+ var EMPTY_RAW = {};
1041
+ var defsFor = (keys, catalog) => {
1042
+ const byKey = new Map(catalog.map((def) => [def.key, def]));
1043
+ return keys.map((key) => byKey.get(key) ?? { key, label: key, type: "string", model: "outros" });
1044
+ };
1045
+ function useVariableResolution({
1046
+ catalog = [],
1047
+ resolver,
1048
+ ctx = {},
1049
+ keys = []
1050
+ }) {
1051
+ const keysHash = useMemo(() => [...keys].sort().join("|"), [keys]);
1052
+ const ctxHash = useMemo(() => JSON.stringify(ctx), [ctx]);
1053
+ const [state, setState] = useState({ ctxHash, raw: EMPTY_RAW, attempted: [] });
1054
+ const catalogRef = useRef(catalog);
1055
+ catalogRef.current = catalog;
1056
+ const resolverRef = useRef(resolver);
1057
+ resolverRef.current = resolver;
1058
+ const ctxRef = useRef(ctx);
1059
+ ctxRef.current = ctx;
1060
+ const ctxHashRef = useRef(ctxHash);
1061
+ ctxHashRef.current = ctxHash;
1062
+ const keysRef = useRef(keys);
1063
+ keysRef.current = keys;
1064
+ const stateRef = useRef(state);
1065
+ stateRef.current = state;
1066
+ const resolved = useMemo(
1067
+ () => state.ctxHash === ctxHash ? formatResolvedValues(defsFor(state.attempted, catalog), state.raw) : EMPTY,
1068
+ [state, ctxHash, catalog]
1069
+ );
1070
+ const missingFor = (list, forCtx) => {
1071
+ const attempted = new Set(stateRef.current.ctxHash === forCtx ? stateRef.current.attempted : []);
1072
+ return list.filter((key) => !attempted.has(key));
1073
+ };
1074
+ const merge = (forCtx, list, next) => setState((prev) => {
1075
+ const stale = prev.ctxHash !== forCtx;
1076
+ return {
1077
+ ctxHash: forCtx,
1078
+ raw: { ...stale ? EMPTY_RAW : prev.raw, ...next },
1079
+ attempted: [.../* @__PURE__ */ new Set([...stale ? [] : prev.attempted, ...list])]
1080
+ };
1081
+ });
1082
+ const fetchKeys = useCallback((list) => {
1083
+ const currentResolver = resolverRef.current;
1084
+ if (!currentResolver || list.length === 0) return Promise.resolve(null);
1085
+ return currentResolver(list, ctxRef.current);
1086
+ }, []);
1087
+ useEffect(() => {
1088
+ const forCtx = ctxHash;
1089
+ const missing = missingFor(keysRef.current, forCtx);
1090
+ if (!missing.length) return void 0;
1091
+ let active = true;
1092
+ fetchKeys(missing).then((next) => {
1093
+ if (active && next) merge(forCtx, missing, next);
1094
+ });
1095
+ return () => {
1096
+ active = false;
1097
+ };
1098
+ }, [keysHash, ctxHash, fetchKeys, resolver]);
1099
+ const ensureResolved = useCallback(
1100
+ (list) => {
1101
+ const forCtx = ctxHashRef.current;
1102
+ const missing = missingFor(list, forCtx);
1103
+ if (!missing.length) return Promise.resolve();
1104
+ return fetchKeys(missing).then((next) => {
1105
+ if (next) merge(forCtx, missing, next);
1106
+ });
1107
+ },
1108
+ [fetchKeys]
1109
+ );
1110
+ return { resolved, ensureResolved };
1111
+ }
1112
+ var EMPTY2 = { content: [], root: {} };
1113
+ function DocumentEditor({
1114
+ registry,
1115
+ data,
1116
+ onChange,
1117
+ onPublish,
1118
+ iframe = { enabled: false },
1119
+ theme = {},
1120
+ onThemeChange,
1121
+ onLogoUpload,
1122
+ renderSettings,
1123
+ renderHeader,
1124
+ renderBlockActions,
1125
+ catalog = [],
1126
+ translator = {},
1127
+ resolver,
1128
+ ctx = {},
1129
+ unresolvedDisplay = "placeholder",
1130
+ metadata,
1131
+ dictionary = ptBrDictionary,
1132
+ patchModifierState = true,
1133
+ disabledBlocks = [],
1134
+ apiRef
1135
+ }) {
1136
+ if (patchModifierState) installModifierStateShim();
1137
+ const [settingsOpen, setSettingsOpen] = useState(false);
1138
+ useDocumentFont(theme.documentFont);
1139
+ const disabledByKey = useMemo(
1140
+ () => Object.fromEntries(disabledBlocks.map((block) => [block.key, block.reason ?? ""])),
1141
+ [disabledBlocks.map((block) => `${block.key}:${block.reason ?? ""}`).join("|")]
1142
+ );
1143
+ const baseConfig = useMemo(() => buildConfig(registry), [registry]);
1144
+ const config = useMemo(() => {
1145
+ const disabledKeys = Object.keys(disabledByKey);
1146
+ if (!disabledKeys.length) return baseConfig;
1147
+ const components = { ...baseConfig.components };
1148
+ disabledKeys.forEach((key) => {
1149
+ if (!components[key]) return;
1150
+ components[key] = {
1151
+ ...components[key],
1152
+ permissions: { ...components[key].permissions, insert: false }
1153
+ };
1154
+ });
1155
+ return { ...baseConfig, components };
1156
+ }, [baseConfig, disabledByKey]);
1157
+ const themeRef = useRef(theme);
1158
+ themeRef.current = theme;
1159
+ const renderHeaderRef = useRef(renderHeader);
1160
+ renderHeaderRef.current = renderHeader;
1161
+ const apiRefRef = useRef(apiRef);
1162
+ apiRefRef.current = apiRef;
1163
+ const renderBlockActionsRef = useRef(renderBlockActions);
1164
+ renderBlockActionsRef.current = renderBlockActions;
1165
+ const usedKeys = useMemo(() => extractBindingKeys(data), [data]);
1166
+ const { resolved, ensureResolved } = useVariableResolution({ catalog, resolver, ctx, keys: usedKeys });
1167
+ const blockByKey = useMemo(() => {
1168
+ const map = {};
1169
+ registry.forEach((block) => {
1170
+ map[block.key] = { icon: block.icon, label: block.label };
1171
+ });
1172
+ return map;
1173
+ }, [registry]);
1174
+ const plugins = useMemo(
1175
+ () => [
1176
+ { ...blocksPlugin(), label: "Blocos" },
1177
+ { ...outlinePlugin(), label: "Estrutura" },
1178
+ { ...fieldsPlugin(), label: "Campos" }
1179
+ ],
1180
+ []
1181
+ );
1182
+ const overrides = useMemo(() => {
1183
+ const base = {
1184
+ // eslint-disable-next-line react/no-unstable-nested-components, react/no-unused-prop-types
1185
+ drawerItem: ({ name }) => {
1186
+ const card = /* @__PURE__ */ jsxs(DrawerCard, { $disabled: name in disabledByKey, children: [
1187
+ /* @__PURE__ */ jsx(DrawerItemIcon, { children: blockByKey[name]?.icon ?? /* @__PURE__ */ jsx(BlockIcon, {}) }),
1188
+ /* @__PURE__ */ jsx("span", { children: blockByKey[name]?.label ?? name })
1189
+ ] });
1190
+ if (!(name in disabledByKey)) return card;
1191
+ return /* @__PURE__ */ jsx(DrawerHint, { "data-hint": disabledByKey[name] || void 0, children: card });
1192
+ }
1193
+ };
1194
+ const withBridge = apiRefRef.current ? {
1195
+ ...base,
1196
+ // eslint-disable-next-line react/no-unstable-nested-components, react/no-unused-prop-types
1197
+ puck: ({ children }) => createElement(EditorApiBridge, { apiRef: apiRefRef.current }, children)
1198
+ } : base;
1199
+ function BlockActionBar({ label, children, parentAction }) {
1200
+ const selectedItem = usePuckState((state) => state.selectedItem);
1201
+ const extra = renderBlockActionsRef.current?.(selectedItem ?? null);
1202
+ return /* @__PURE__ */ jsxs(ActionBar, { children: [
1203
+ /* @__PURE__ */ jsxs(ActionBar.Group, { children: [
1204
+ parentAction,
1205
+ label ? /* @__PURE__ */ jsx(ActionBar.Label, { label }) : null
1206
+ ] }),
1207
+ extra ? /* @__PURE__ */ jsx(ActionBar.Group, { children: extra }) : null,
1208
+ /* @__PURE__ */ jsx(ActionBar.Group, { children })
1209
+ ] });
1210
+ }
1211
+ const withActions = renderBlockActionsRef.current ? { ...withBridge, actionBar: BlockActionBar } : withBridge;
1212
+ if (!renderHeaderRef.current) return withActions;
1213
+ function Header() {
1214
+ const getPuck = useGetPuck();
1215
+ const hasPast = usePuckState((state) => state.history.hasPast);
1216
+ const hasFuture = usePuckState((state) => state.history.hasFuture);
1217
+ const api = headerApiFromHistory(
1218
+ {
1219
+ hasPast,
1220
+ hasFuture,
1221
+ back: () => getPuck().history.back(),
1222
+ forward: () => getPuck().history.forward()
1223
+ },
1224
+ {
1225
+ openSettings: () => setSettingsOpen(true),
1226
+ openPreview: () => getPuck().dispatch({
1227
+ type: "setUi",
1228
+ ui: (prev) => ({ previewMode: prev.previewMode === "edit" ? "interactive" : "edit" })
1229
+ }),
1230
+ theme: themeRef.current
1231
+ }
1232
+ );
1233
+ return createElement(Fragment, null, renderHeaderRef.current?.(api));
1234
+ }
1235
+ return { ...withActions, header: Header };
1236
+ }, [blockByKey, disabledByKey, Boolean(renderHeader), Boolean(apiRef), Boolean(renderBlockActions)]);
1237
+ return /* @__PURE__ */ jsx(DocumentThemeProvider, { theme, children: /* @__PURE__ */ jsx(CatalogProvider, { catalog, translator, children: /* @__PURE__ */ jsxs(ResolvedProvider, { resolved, ensureResolved, unresolvedDisplay, children: [
1238
+ /* @__PURE__ */ jsx(EditorShell, { children: /* @__PURE__ */ jsx(
1239
+ Puck,
1240
+ {
1241
+ config,
1242
+ data: { ...EMPTY2, ...data },
1243
+ onChange,
1244
+ onPublish,
1245
+ iframe,
1246
+ overrides,
1247
+ plugins,
1248
+ metadata,
1249
+ dictionary
1250
+ }
1251
+ ) }),
1252
+ renderSettings ? renderSettings({
1253
+ open: settingsOpen,
1254
+ onClose: () => setSettingsOpen(false),
1255
+ theme,
1256
+ onThemeChange: onThemeChange ?? (() => void 0),
1257
+ onLogoUpload
1258
+ }) : /* @__PURE__ */ jsx(
1259
+ DocumentSettingsModal,
1260
+ {
1261
+ open: settingsOpen,
1262
+ onClose: () => setSettingsOpen(false),
1263
+ theme,
1264
+ onThemeChange: onThemeChange ?? (() => void 0),
1265
+ onLogoUpload
1266
+ }
1267
+ )
1268
+ ] }) }) });
1269
+ }
1270
+ function useDocumentAutosave({
1271
+ doc,
1272
+ save,
1273
+ delay = 3e3,
1274
+ initialSavedAt = null,
1275
+ enabled = true
1276
+ }) {
1277
+ const [status, setStatus] = useState("saved");
1278
+ const [lastSavedAt, setLastSavedAt] = useState(initialSavedAt);
1279
+ const lastSaved = useRef(null);
1280
+ const timer = useRef();
1281
+ const inFlight = useRef(false);
1282
+ const tail = useRef(Promise.resolve());
1283
+ const latest = useRef(doc);
1284
+ latest.current = doc;
1285
+ const enabledRef = useRef(enabled);
1286
+ enabledRef.current = enabled;
1287
+ const saveRef = useRef(save);
1288
+ saveRef.current = save;
1289
+ const flush = useCallback(() => {
1290
+ if (!enabledRef.current) return Promise.resolve();
1291
+ const run = async () => {
1292
+ inFlight.current = true;
1293
+ try {
1294
+ const snapshot = JSON.stringify(latest.current);
1295
+ if (snapshot === lastSaved.current) return;
1296
+ setStatus("saving");
1297
+ await saveRef.current(latest.current);
1298
+ lastSaved.current = snapshot;
1299
+ setStatus("saved");
1300
+ setLastSavedAt(/* @__PURE__ */ new Date());
1301
+ } catch {
1302
+ setStatus("error");
1303
+ clearTimeout(timer.current);
1304
+ timer.current = setTimeout(flush, delay);
1305
+ } finally {
1306
+ inFlight.current = false;
1307
+ }
1308
+ };
1309
+ const chained = inFlight.current ? tail.current.then(run) : run();
1310
+ tail.current = chained;
1311
+ return chained;
1312
+ }, [delay]);
1313
+ useEffect(() => {
1314
+ if (!enabled || lastSaved.current === null) {
1315
+ lastSaved.current = JSON.stringify(doc);
1316
+ return void 0;
1317
+ }
1318
+ clearTimeout(timer.current);
1319
+ timer.current = setTimeout(flush, delay);
1320
+ return () => clearTimeout(timer.current);
1321
+ }, [doc, delay, flush, enabled]);
1322
+ return { status, lastSavedAt, flushNow: flush };
1323
+ }
1324
+
1325
+ export { ColorPicker, ColorPickerPanel, DEFAULT_COLOR_PRESETS, DEFAULT_DOCUMENT_FONT_ID, DEFAULT_FOOTER_CONFIG, DEFAULT_HEADER_CONFIG, DocumentEditor, DocumentSettingsModal, coverFieldsSchema, footerConfigSchema, headerConfigSchema, hexToRgb, installModifierStateShim, normalizeHex, pageFormatSchema, ptBrDictionary, resolveTheme, rgbToHex, themeSchema, useDocumentAutosave, usePuckState };
1326
+ //# sourceMappingURL=chunk-JYSA6IM5.js.map
1327
+ //# sourceMappingURL=chunk-JYSA6IM5.js.map