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,194 @@
1
+ 'use strict';
2
+
3
+ var chunkSP5LCPDG_cjs = require('./chunk-SP5LCPDG.cjs');
4
+ var zod = require('zod');
5
+ var react = require('react');
6
+ var styled = require('styled-components');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
10
+
11
+ var styled__default = /*#__PURE__*/_interopDefault(styled);
12
+
13
+ var variableTypeSchema = zod.z.enum([
14
+ "string",
15
+ "number",
16
+ "date",
17
+ "currency",
18
+ "boolean",
19
+ "document",
20
+ "phone",
21
+ "zipcode"
22
+ ]);
23
+ var variableDefSchema = zod.z.object({
24
+ key: zod.z.string().min(1),
25
+ label: zod.z.string().min(1),
26
+ fullLabel: zod.z.string().optional(),
27
+ type: variableTypeSchema,
28
+ model: zod.z.string().min(1),
29
+ default: zod.z.unknown().optional()
30
+ }).strict();
31
+ var variableCatalogSchema = zod.z.object({
32
+ catalog: zod.z.array(variableDefSchema).default([])
33
+ }).strict();
34
+ var VARIABLE_MENU_WIDTH = 260;
35
+ var VARIABLE_MENU_MAX_HEIGHT = 320;
36
+ var Panel = styled__default.default.div`
37
+ width: ${VARIABLE_MENU_WIDTH}px;
38
+ max-height: ${(props) => props.$maxHeight}px;
39
+ overflow: auto;
40
+ background: #fff;
41
+ border: 1px solid #e5e7eb;
42
+ border-radius: 12px;
43
+ box-shadow: 0 12px 32px rgba(17, 24, 39, 0.16);
44
+ padding: 6px;
45
+ `;
46
+ var Search = styled__default.default.input`
47
+ width: 100%;
48
+ padding: 9px 10px;
49
+ margin-bottom: 4px;
50
+ border: 1px solid #e5e7eb;
51
+ border-radius: 8px;
52
+ font-size: 13px;
53
+ color: #111827;
54
+
55
+ &::placeholder {
56
+ color: #9aa3af;
57
+ }
58
+ &:focus {
59
+ outline: none;
60
+ border-color: #1a56db;
61
+ }
62
+ `;
63
+ var GroupLabel = styled__default.default.div`
64
+ padding: 10px 10px 4px;
65
+ font-size: 11px;
66
+ font-weight: 700;
67
+ letter-spacing: 0.06em;
68
+ text-transform: uppercase;
69
+ color: #9aa3af;
70
+ `;
71
+ var Option = styled__default.default.button`
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: 1px;
75
+ width: 100%;
76
+ padding: 7px 10px;
77
+ border: none;
78
+ border-radius: 8px;
79
+ background: transparent;
80
+ cursor: pointer;
81
+ text-align: left;
82
+
83
+ &:hover {
84
+ background: #f3f6fb;
85
+ }
86
+ `;
87
+ var OptionLabel = styled__default.default.span`
88
+ color: #1f2937;
89
+ font-size: 13px;
90
+ font-weight: 500;
91
+ `;
92
+ var OptionValue = styled__default.default.span`
93
+ color: #9aa3af;
94
+ font-size: 12px;
95
+ overflow: hidden;
96
+ text-overflow: ellipsis;
97
+ white-space: nowrap;
98
+ `;
99
+ var Missing = styled__default.default.span`
100
+ color: #e02424;
101
+ font-size: 12px;
102
+ font-style: italic;
103
+ `;
104
+ var Empty = styled__default.default.div`
105
+ padding: 14px 10px;
106
+ color: #9aa3af;
107
+ text-align: center;
108
+ font-size: 13px;
109
+ `;
110
+ function groupBy(defs) {
111
+ const map = /* @__PURE__ */ new Map();
112
+ defs.forEach((def) => {
113
+ const list = map.get(def.model ?? "outros") ?? [];
114
+ list.push(def);
115
+ map.set(def.model ?? "outros", list);
116
+ });
117
+ return [...map.entries()];
118
+ }
119
+ function VariableMenu({ accept, model, onPick, maxHeight = VARIABLE_MENU_MAX_HEIGHT }) {
120
+ const catalog = chunkSP5LCPDG_cjs.useCatalog();
121
+ const translator = chunkSP5LCPDG_cjs.useTranslator();
122
+ const preview = chunkSP5LCPDG_cjs.useResolvedVariables();
123
+ const ensureResolved = chunkSP5LCPDG_cjs.useEnsureResolved();
124
+ const [query, setQuery] = react.useState("");
125
+ const [loading, setLoading] = react.useState(true);
126
+ const searchRef = react.useRef(null);
127
+ const catalogRef = react.useRef(catalog);
128
+ catalogRef.current = catalog;
129
+ react.useEffect(() => {
130
+ searchRef.current?.focus();
131
+ }, []);
132
+ react.useEffect(() => {
133
+ let active = true;
134
+ ensureResolved(catalogRef.current.map((def) => def.key)).finally(() => {
135
+ if (active) setLoading(false);
136
+ });
137
+ return () => {
138
+ active = false;
139
+ };
140
+ }, []);
141
+ const options = react.useMemo(() => {
142
+ const q = query.trim().toLowerCase();
143
+ const matchesQuery = (def) => def.label.toLowerCase().includes(q) || Boolean(def.fullLabel?.toLowerCase().includes(q));
144
+ return catalog.filter(
145
+ (def) => (!accept || accept.includes(def.type)) && (!model || def.model === model) && (!q || matchesQuery(def))
146
+ );
147
+ }, [catalog, accept, model, query]);
148
+ return /* @__PURE__ */ jsxRuntime.jsxs(Panel, { $maxHeight: maxHeight, children: [
149
+ /* @__PURE__ */ jsxRuntime.jsx(Search, { ref: searchRef, placeholder: "Inserir vari\xE1vel", value: query, onChange: (e) => setQuery(e.target.value) }),
150
+ options.length === 0 && /* @__PURE__ */ jsxRuntime.jsx(Empty, { children: "Nenhuma vari\xE1vel" }),
151
+ groupBy(options).map(([groupName, defs]) => /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
152
+ /* @__PURE__ */ jsxRuntime.jsx(GroupLabel, { children: translator[groupName] ?? groupName }),
153
+ defs.map((def) => {
154
+ const value = preview[def.key];
155
+ return /* @__PURE__ */ jsxRuntime.jsxs(Option, { type: "button", onMouseDown: (e) => e.preventDefault(), onClick: () => onPick(def), children: [
156
+ /* @__PURE__ */ jsxRuntime.jsx(OptionLabel, { children: def.label }),
157
+ value ? /* @__PURE__ */ jsxRuntime.jsx(OptionValue, { children: value }) : null,
158
+ !value && !loading ? /* @__PURE__ */ jsxRuntime.jsx(Missing, { children: "Dado n\xE3o informado" }) : null
159
+ ] }, def.key);
160
+ })
161
+ ] }, groupName))
162
+ ] });
163
+ }
164
+
165
+ // src/variables/menuPlacement.ts
166
+ var GAP = 6;
167
+ var MARGIN = 8;
168
+ var MIN_HEIGHT = 160;
169
+ var clamp = (value, min, max) => Math.min(Math.max(value, min), Math.max(min, max));
170
+ var placeVariableMenu = (anchor, viewport, options = {}) => {
171
+ const { width = VARIABLE_MENU_WIDTH, maxHeight = VARIABLE_MENU_MAX_HEIGHT, minHeight = MIN_HEIGHT } = options;
172
+ const spaceBelow = viewport.height - anchor.bottom - GAP - MARGIN;
173
+ const spaceAbove = anchor.top - GAP - MARGIN;
174
+ const openUp = spaceBelow < Math.min(maxHeight, minHeight) && spaceAbove > spaceBelow;
175
+ const available = openUp ? spaceAbove : spaceBelow;
176
+ const height = clamp(Math.min(maxHeight, available), Math.min(minHeight, maxHeight), maxHeight);
177
+ const top = openUp ? anchor.top - GAP - height : anchor.bottom + GAP;
178
+ return {
179
+ top: clamp(top, MARGIN, viewport.height - height - MARGIN),
180
+ left: clamp(anchor.left, MARGIN, viewport.width - width - MARGIN),
181
+ maxHeight: height,
182
+ placement: openUp ? "top" : "bottom"
183
+ };
184
+ };
185
+
186
+ exports.VARIABLE_MENU_MAX_HEIGHT = VARIABLE_MENU_MAX_HEIGHT;
187
+ exports.VARIABLE_MENU_WIDTH = VARIABLE_MENU_WIDTH;
188
+ exports.VariableMenu = VariableMenu;
189
+ exports.placeVariableMenu = placeVariableMenu;
190
+ exports.variableCatalogSchema = variableCatalogSchema;
191
+ exports.variableDefSchema = variableDefSchema;
192
+ exports.variableTypeSchema = variableTypeSchema;
193
+ //# sourceMappingURL=chunk-GR76U6FP.cjs.map
194
+ //# sourceMappingURL=chunk-GR76U6FP.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/variables/schema.ts","../src/variables/VariableMenu.tsx","../src/variables/menuPlacement.ts"],"names":["z","styled","useCatalog","useTranslator","useResolvedVariables","useEnsureResolved","useState","useRef","useEffect","useMemo","jsxs","jsx"],"mappings":"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","file":"chunk-GR76U6FP.cjs","sourcesContent":["import { z } from 'zod';\nimport type { VariableCatalog, VariableDef, VariableType } from './types';\n\ntype Schema<T> = z.ZodType<T, z.ZodTypeDef, unknown>;\n\nexport const variableTypeSchema: Schema<VariableType> = z.enum([\n 'string',\n 'number',\n 'date',\n 'currency',\n 'boolean',\n 'document',\n 'phone',\n 'zipcode'\n]);\n\nexport const variableDefSchema: Schema<VariableDef> = z\n .object({\n key: z.string().min(1),\n label: z.string().min(1),\n fullLabel: z.string().optional(),\n type: variableTypeSchema,\n model: z.string().min(1),\n default: z.unknown().optional()\n })\n .strict();\n\nexport const variableCatalogSchema: Schema<VariableCatalog> = z\n .object({\n catalog: z.array(variableDefSchema).default([])\n })\n .strict();\n","import { useEffect, useMemo, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { useCatalog, useTranslator } from './catalogContext';\nimport { useEnsureResolved, useResolvedVariables } from './resolvedContext';\nimport type { VariableDef, VariableType } from './types';\n\ntype Props = {\n accept?: VariableType[];\n model?: string;\n onPick: (def: VariableDef) => void;\n /** Altura máxima do painel em px. O host reduz quando não há espaço na viewport. */\n maxHeight?: number;\n};\n\nexport const VARIABLE_MENU_WIDTH = 260;\nexport const VARIABLE_MENU_MAX_HEIGHT = 320;\n\nconst Panel = styled.div<{ $maxHeight: number }>`\n width: ${VARIABLE_MENU_WIDTH}px;\n max-height: ${props => props.$maxHeight}px;\n overflow: auto;\n background: #fff;\n border: 1px solid #e5e7eb;\n border-radius: 12px;\n box-shadow: 0 12px 32px rgba(17, 24, 39, 0.16);\n padding: 6px;\n`;\n\nconst Search = styled.input`\n width: 100%;\n padding: 9px 10px;\n margin-bottom: 4px;\n border: 1px solid #e5e7eb;\n border-radius: 8px;\n font-size: 13px;\n color: #111827;\n\n &::placeholder {\n color: #9aa3af;\n }\n &:focus {\n outline: none;\n border-color: #1a56db;\n }\n`;\n\nconst GroupLabel = styled.div`\n padding: 10px 10px 4px;\n font-size: 11px;\n font-weight: 700;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: #9aa3af;\n`;\n\nconst Option = styled.button`\n display: flex;\n flex-direction: column;\n gap: 1px;\n width: 100%;\n padding: 7px 10px;\n border: none;\n border-radius: 8px;\n background: transparent;\n cursor: pointer;\n text-align: left;\n\n &:hover {\n background: #f3f6fb;\n }\n`;\n\nconst OptionLabel = styled.span`\n color: #1f2937;\n font-size: 13px;\n font-weight: 500;\n`;\n\nconst OptionValue = styled.span`\n color: #9aa3af;\n font-size: 12px;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst Missing = styled.span`\n color: #e02424;\n font-size: 12px;\n font-style: italic;\n`;\n\nconst Empty = styled.div`\n padding: 14px 10px;\n color: #9aa3af;\n text-align: center;\n font-size: 13px;\n`;\n\nfunction groupBy(defs: VariableDef[]): [string, VariableDef[]][] {\n const map = new Map<string, VariableDef[]>();\n defs.forEach(def => {\n const list = map.get(def.model ?? 'outros') ?? [];\n list.push(def);\n map.set(def.model ?? 'outros', list);\n });\n return [...map.entries()];\n}\n\nexport function VariableMenu({ accept, model, onPick, maxHeight = VARIABLE_MENU_MAX_HEIGHT }: Props) {\n const catalog = useCatalog();\n const translator = useTranslator();\n const preview = useResolvedVariables();\n const ensureResolved = useEnsureResolved();\n const [query, setQuery] = useState('');\n const [loading, setLoading] = useState(true);\n const searchRef = useRef<HTMLInputElement>(null);\n const catalogRef = useRef(catalog);\n catalogRef.current = catalog;\n\n useEffect(() => {\n searchRef.current?.focus();\n }, []);\n\n useEffect(() => {\n let active = true;\n ensureResolved(catalogRef.current.map(def => def.key)).finally(() => {\n if (active) setLoading(false);\n });\n return () => {\n active = false;\n };\n }, []);\n\n const options = useMemo(() => {\n const q = query.trim().toLowerCase();\n const matchesQuery = (def: VariableDef) =>\n def.label.toLowerCase().includes(q) || Boolean(def.fullLabel?.toLowerCase().includes(q));\n return catalog.filter(\n def => (!accept || accept.includes(def.type)) && (!model || def.model === model) && (!q || matchesQuery(def))\n );\n }, [catalog, accept, model, query]);\n\n return (\n <Panel $maxHeight={maxHeight}>\n <Search ref={searchRef} placeholder=\"Inserir variável\" value={query} onChange={e => setQuery(e.target.value)} />\n {options.length === 0 && <Empty>Nenhuma variável</Empty>}\n {groupBy(options).map(([groupName, defs]) => (\n <div key={groupName}>\n <GroupLabel>{translator[groupName] ?? groupName}</GroupLabel>\n {defs.map(def => {\n const value = preview[def.key];\n return (\n <Option key={def.key} type=\"button\" onMouseDown={e => e.preventDefault()} onClick={() => onPick(def)}>\n <OptionLabel>{def.label}</OptionLabel>\n {value ? <OptionValue>{value}</OptionValue> : null}\n {!value && !loading ? <Missing>Dado não informado</Missing> : null}\n </Option>\n );\n })}\n </div>\n ))}\n </Panel>\n );\n}\n","import { VARIABLE_MENU_MAX_HEIGHT, VARIABLE_MENU_WIDTH } from './VariableMenu';\n\n/** Retângulo da âncora em coordenadas de viewport (o que `getBoundingClientRect` devolve). */\nexport type MenuAnchor = { top: number; bottom: number; left: number };\n\nexport type MenuViewport = { width: number; height: number };\n\nexport type MenuPlacement = { top: number; left: number; maxHeight: number; placement: 'top' | 'bottom' };\n\nconst GAP = 6;\nconst MARGIN = 8;\nconst MIN_HEIGHT = 160;\n\nconst clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), Math.max(min, max));\n\n/**\n * Posiciona o menu de variáveis (`position: fixed`) ancorado no cursor: abre para baixo quando cabe,\n * inverte para cima quando não cabe, e encolhe `maxHeight` ao espaço disponível.\n * Sem isso o menu aberto no fim da página fica cortado pela viewport — ver docs/variables.md.\n */\nexport const placeVariableMenu = (\n anchor: MenuAnchor,\n viewport: MenuViewport,\n options: { width?: number; maxHeight?: number; minHeight?: number } = {}\n): MenuPlacement => {\n const { width = VARIABLE_MENU_WIDTH, maxHeight = VARIABLE_MENU_MAX_HEIGHT, minHeight = MIN_HEIGHT } = options;\n\n const spaceBelow = viewport.height - anchor.bottom - GAP - MARGIN;\n const spaceAbove = anchor.top - GAP - MARGIN;\n const openUp = spaceBelow < Math.min(maxHeight, minHeight) && spaceAbove > spaceBelow;\n\n const available = openUp ? spaceAbove : spaceBelow;\n const height = clamp(Math.min(maxHeight, available), Math.min(minHeight, maxHeight), maxHeight);\n const top = openUp ? anchor.top - GAP - height : anchor.bottom + GAP;\n\n return {\n top: clamp(top, MARGIN, viewport.height - height - MARGIN),\n left: clamp(anchor.left, MARGIN, viewport.width - width - MARGIN),\n maxHeight: height,\n placement: openUp ? 'top' : 'bottom'\n };\n};\n"]}
@@ -0,0 +1,117 @@
1
+ 'use strict';
2
+
3
+ var chunkSP5LCPDG_cjs = require('./chunk-SP5LCPDG.cjs');
4
+
5
+ // src/variables/variableHtml.ts
6
+ var NOT_INFORMED_LABEL = "N\xE3o informado";
7
+ var CHIP_CLASS = "dg-var";
8
+ var INVALID_CHIP_CLASS = "dg-var--invalid";
9
+ var EMPTY_CHIP_CLASS = "dg-var--empty";
10
+ var INVALID_ICON = "\u26A0 ";
11
+ var VAR_SPAN_REGEX = /<span([^>]*\bdata-var-key="([^"]+)"[^>]*)>([\s\S]*?)<\/span>/g;
12
+ var buildVariableChipHtml = (def) => `<span class="${CHIP_CLASS}" data-var-key="${def.key}" contenteditable="false">${def.fullLabel || def.label || def.key}</span>`;
13
+ var stripAttr = (attrs, name) => attrs.replace(new RegExp(`\\s*${name}="[^"]*"`, "gi"), "");
14
+ var removeClass = (attrs, className) => {
15
+ const current = attrs.match(/class="([^"]*)"/);
16
+ if (!current) return attrs;
17
+ const classes = current[1].split(/\s+/).filter(Boolean);
18
+ if (!classes.includes(className)) return attrs;
19
+ const kept = classes.filter((name) => name !== className);
20
+ return kept.length ? attrs.replace(/class="[^"]*"/, `class="${kept.join(" ")}"`) : stripAttr(attrs, "class");
21
+ };
22
+ var ensureClass = (attrs, className) => {
23
+ const current = attrs.match(/class="([^"]*)"/);
24
+ if (!current) return `${attrs} class="${className}"`;
25
+ const classes = current[1].split(/\s+/).filter(Boolean);
26
+ if (classes.includes(className)) return attrs;
27
+ return attrs.replace(/class="[^"]*"/, `class="${[...classes, className].join(" ")}"`);
28
+ };
29
+ var resolveWithRegex = (html, resolved, keepChip, knownKeys, knownDefs, unresolved) => html.replace(VAR_SPAN_REGEX, (_match, attrs, key, label) => {
30
+ const cleanAttrs = stripAttr(attrs, "contenteditable");
31
+ if (knownKeys && unresolved !== "label" && !knownKeys.has(key)) {
32
+ const text = label.startsWith(INVALID_ICON) ? label : `${INVALID_ICON}${label}`;
33
+ return `<span${ensureClass(cleanAttrs, INVALID_CHIP_CLASS)}>${text}</span>`;
34
+ }
35
+ const raw = resolved[key];
36
+ if (raw === void 0 && unresolved === "label")
37
+ return `<span${ensureClass(cleanAttrs, CHIP_CLASS)}>${label}</span>`;
38
+ const value = raw !== void 0 ? String(raw) : NOT_INFORMED_LABEL;
39
+ if (keepChip) {
40
+ const withBadge = raw === void 0 ? ensureClass(cleanAttrs, EMPTY_CHIP_CLASS) : removeClass(cleanAttrs, EMPTY_CHIP_CLASS);
41
+ return `<span${withBadge}>${value}</span>`;
42
+ }
43
+ const markerAttrs = stripAttr(cleanAttrs, "class");
44
+ const def = knownDefs?.get(key);
45
+ const withType = def?.type ? `${markerAttrs} data-var-type="${def.type}"` : markerAttrs;
46
+ return `<span${withType}>${value}</span>`;
47
+ });
48
+ var setChipText = (doc, chip, value) => {
49
+ const walker = doc.createTreeWalker(chip, NodeFilter.SHOW_TEXT);
50
+ const nodes = [];
51
+ while (walker.nextNode()) nodes.push(walker.currentNode);
52
+ if (!nodes.length) {
53
+ chip.appendChild(doc.createTextNode(value));
54
+ return;
55
+ }
56
+ nodes[0].nodeValue = value;
57
+ nodes.slice(1).forEach((node) => node.parentNode?.removeChild(node));
58
+ };
59
+ var markInvalid = (doc, chip) => {
60
+ chip.classList.add(INVALID_CHIP_CLASS);
61
+ if (!(chip.textContent ?? "").startsWith(INVALID_ICON)) {
62
+ chip.insertBefore(doc.createTextNode(INVALID_ICON), chip.firstChild);
63
+ }
64
+ };
65
+ var collectVariableIssues = (data, catalog = [], resolved = {}) => {
66
+ const keys = chunkSP5LCPDG_cjs.extractBindingKeys(data);
67
+ const chipLabels = chunkSP5LCPDG_cjs.extractBindingLabels(data);
68
+ const byKey = new Map(catalog.map((item) => [item.key, item]));
69
+ const unknown = [];
70
+ const unresolved = [];
71
+ keys.forEach((key) => {
72
+ const item = byKey.get(key);
73
+ if (!item) unknown.push(chipLabels[key] || key);
74
+ else if (resolved[key] === void 0) unresolved.push(item.fullLabel || item.label || chipLabels[key] || key);
75
+ });
76
+ return { unknown, unresolved, hasIssues: unknown.length > 0 || unresolved.length > 0 };
77
+ };
78
+ var resolveVariableHtml = (html, resolved = {}, { keepChip = true, catalog, unresolved = "placeholder" } = {}) => {
79
+ if (!html || html.indexOf("data-var-key") < 0) return html;
80
+ const knownKeys = catalog ? new Set(catalog.map((item) => item.key)) : null;
81
+ const knownDefs = catalog ? new Map(catalog.map((item) => [item.key, item])) : null;
82
+ if (typeof DOMParser === "undefined")
83
+ return resolveWithRegex(html, resolved, keepChip, knownKeys, knownDefs, unresolved);
84
+ const doc = new DOMParser().parseFromString(html, "text/html");
85
+ doc.body.querySelectorAll("[data-var-key]").forEach((chip) => {
86
+ const key = chip.getAttribute("data-var-key") ?? "";
87
+ const value = resolved[key];
88
+ const unknown = knownKeys && unresolved !== "label" ? !knownKeys.has(key) : false;
89
+ chip.removeAttribute("contenteditable");
90
+ if (unknown) {
91
+ markInvalid(doc, chip);
92
+ return;
93
+ }
94
+ if (value === void 0 && unresolved === "label") {
95
+ chip.classList.add(CHIP_CLASS);
96
+ return;
97
+ }
98
+ setChipText(doc, chip, value !== void 0 ? String(value) : NOT_INFORMED_LABEL);
99
+ chip.classList.toggle(EMPTY_CHIP_CLASS, keepChip && value === void 0);
100
+ if (!keepChip) {
101
+ chip.removeAttribute("class");
102
+ const def = knownDefs?.get(key);
103
+ if (def?.type) chip.setAttribute("data-var-type", def.type);
104
+ }
105
+ });
106
+ return doc.body.innerHTML;
107
+ };
108
+
109
+ exports.CHIP_CLASS = CHIP_CLASS;
110
+ exports.EMPTY_CHIP_CLASS = EMPTY_CHIP_CLASS;
111
+ exports.INVALID_CHIP_CLASS = INVALID_CHIP_CLASS;
112
+ exports.NOT_INFORMED_LABEL = NOT_INFORMED_LABEL;
113
+ exports.buildVariableChipHtml = buildVariableChipHtml;
114
+ exports.collectVariableIssues = collectVariableIssues;
115
+ exports.resolveVariableHtml = resolveVariableHtml;
116
+ //# sourceMappingURL=chunk-I22MGPXO.cjs.map
117
+ //# sourceMappingURL=chunk-I22MGPXO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/variables/variableHtml.ts"],"names":["extractBindingKeys","extractBindingLabels"],"mappings":"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","file":"chunk-I22MGPXO.cjs","sourcesContent":["import { extractBindingKeys, extractBindingLabels } from './bindings';\nimport type { ResolvedVariables, UnresolvedDisplay, VariableDef } from './types';\n\nexport const NOT_INFORMED_LABEL = 'Não informado';\nexport const CHIP_CLASS = 'dg-var';\nexport const INVALID_CHIP_CLASS = 'dg-var--invalid';\nexport const EMPTY_CHIP_CLASS = 'dg-var--empty';\nconst INVALID_ICON = '⚠ ';\n\nconst VAR_SPAN_REGEX = /<span([^>]*\\bdata-var-key=\"([^\"]+)\"[^>]*)>([\\s\\S]*?)<\\/span>/g;\n\n/** Markup canônico do chip de variável — editores de host inserem por aqui. */\nexport const buildVariableChipHtml = (def: { key: string; label?: string; fullLabel?: string }): string =>\n `<span class=\"${CHIP_CLASS}\" data-var-key=\"${def.key}\" contenteditable=\"false\">${\n def.fullLabel || def.label || def.key\n }</span>`;\n\ntype ResolveOptions = { keepChip?: boolean; catalog?: VariableDef[]; unresolved?: UnresolvedDisplay };\n\nconst stripAttr = (attrs: string, name: string): string => attrs.replace(new RegExp(`\\\\s*${name}=\"[^\"]*\"`, 'gi'), '');\n\nconst removeClass = (attrs: string, className: string): string => {\n const current = attrs.match(/class=\"([^\"]*)\"/);\n if (!current) return attrs;\n const classes = current[1].split(/\\s+/).filter(Boolean);\n if (!classes.includes(className)) return attrs;\n const kept = classes.filter(name => name !== className);\n return kept.length ? attrs.replace(/class=\"[^\"]*\"/, `class=\"${kept.join(' ')}\"`) : stripAttr(attrs, 'class');\n};\n\nconst ensureClass = (attrs: string, className: string): string => {\n const current = attrs.match(/class=\"([^\"]*)\"/);\n if (!current) return `${attrs} class=\"${className}\"`;\n const classes = current[1].split(/\\s+/).filter(Boolean);\n if (classes.includes(className)) return attrs;\n return attrs.replace(/class=\"[^\"]*\"/, `class=\"${[...classes, className].join(' ')}\"`);\n};\n\n// Fallback sem DOMParser (fila de PDF) — deve espelhar o caminho DOM (docs/variables.md).\nconst resolveWithRegex = (\n html: string,\n resolved: ResolvedVariables,\n keepChip: boolean,\n knownKeys: Set<string> | null,\n knownDefs: Map<string, VariableDef> | null,\n unresolved: UnresolvedDisplay\n): string =>\n html.replace(VAR_SPAN_REGEX, (_match, attrs: string, key: string, label: string) => {\n const cleanAttrs = stripAttr(attrs, 'contenteditable');\n\n if (knownKeys && unresolved !== 'label' && !knownKeys.has(key)) {\n const text = label.startsWith(INVALID_ICON) ? label : `${INVALID_ICON}${label}`;\n return `<span${ensureClass(cleanAttrs, INVALID_CHIP_CLASS)}>${text}</span>`;\n }\n\n const raw = resolved[key];\n if (raw === undefined && unresolved === 'label')\n return `<span${ensureClass(cleanAttrs, CHIP_CLASS)}>${label}</span>`;\n\n const value = raw !== undefined ? String(raw) : NOT_INFORMED_LABEL;\n if (keepChip) {\n const withBadge =\n raw === undefined ? ensureClass(cleanAttrs, EMPTY_CHIP_CLASS) : removeClass(cleanAttrs, EMPTY_CHIP_CLASS);\n return `<span${withBadge}>${value}</span>`;\n }\n const markerAttrs = stripAttr(cleanAttrs, 'class');\n const def = knownDefs?.get(key);\n const withType = def?.type ? `${markerAttrs} data-var-type=\"${def.type}\"` : markerAttrs;\n return `<span${withType}>${value}</span>`;\n });\n\nconst setChipText = (doc: Document, chip: Element, value: string): void => {\n const walker = doc.createTreeWalker(chip, NodeFilter.SHOW_TEXT);\n const nodes: Node[] = [];\n while (walker.nextNode()) nodes.push(walker.currentNode);\n if (!nodes.length) {\n chip.appendChild(doc.createTextNode(value));\n return;\n }\n nodes[0].nodeValue = value;\n nodes.slice(1).forEach(node => node.parentNode?.removeChild(node));\n};\n\nconst markInvalid = (doc: Document, chip: Element): void => {\n chip.classList.add(INVALID_CHIP_CLASS);\n if (!(chip.textContent ?? '').startsWith(INVALID_ICON)) {\n chip.insertBefore(doc.createTextNode(INVALID_ICON), chip.firstChild);\n }\n};\n\n/** Classifica os chips do documento em `unknown` (fora do catálogo) e `unresolved` (sem valor). */\nexport const collectVariableIssues = (\n data: unknown,\n catalog: VariableDef[] = [],\n resolved: ResolvedVariables = {}\n): { unknown: string[]; unresolved: string[]; hasIssues: boolean } => {\n const keys = extractBindingKeys(data);\n const chipLabels = extractBindingLabels(data);\n const byKey = new Map(catalog.map(item => [item.key, item]));\n const unknown: string[] = [];\n const unresolved: string[] = [];\n keys.forEach(key => {\n const item = byKey.get(key);\n if (!item) unknown.push(chipLabels[key] || key);\n else if (resolved[key] === undefined) unresolved.push(item.fullLabel || item.label || chipLabels[key] || key);\n });\n return { unknown, unresolved, hasIssues: unknown.length > 0 || unresolved.length > 0 };\n};\n\n/**\n * Resolve os chips de variável de um HTML: valor, \"Não informado\" ou inválido (⚠).\n * `keepChip: false` (render/PDF) mantém um span marcador (data-var-key/data-var-type, sem class).\n * `unresolved: 'label'` (contexto de template) preserva o chip (texto + class) e não marca chip fora do\n * catálogo como inválido — o template não está ligado a um documento, então \"key desconhecida\" ali é ruído.\n * Ver docs/variables.md.\n */\nexport const resolveVariableHtml = (\n html: string,\n resolved: ResolvedVariables = {},\n { keepChip = true, catalog, unresolved = 'placeholder' }: ResolveOptions = {}\n): string => {\n if (!html || html.indexOf('data-var-key') < 0) return html;\n const knownKeys = catalog ? new Set(catalog.map(item => item.key)) : null;\n const knownDefs = catalog ? new Map(catalog.map(item => [item.key, item])) : null;\n if (typeof DOMParser === 'undefined')\n return resolveWithRegex(html, resolved, keepChip, knownKeys, knownDefs, unresolved);\n\n const doc = new DOMParser().parseFromString(html, 'text/html');\n\n doc.body.querySelectorAll('[data-var-key]').forEach(chip => {\n const key = chip.getAttribute('data-var-key') ?? '';\n const value = resolved[key];\n const unknown = knownKeys && unresolved !== 'label' ? !knownKeys.has(key) : false;\n chip.removeAttribute('contenteditable');\n\n if (unknown) {\n markInvalid(doc, chip);\n return;\n }\n if (value === undefined && unresolved === 'label') {\n chip.classList.add(CHIP_CLASS);\n return;\n }\n setChipText(doc, chip, value !== undefined ? String(value) : NOT_INFORMED_LABEL);\n chip.classList.toggle(EMPTY_CHIP_CLASS, keepChip && value === undefined);\n if (!keepChip) {\n chip.removeAttribute('class');\n const def = knownDefs?.get(key);\n if (def?.type) chip.setAttribute('data-var-type', def.type);\n }\n });\n return doc.body.innerHTML;\n};\n"]}