@arslankhan/doc-forge 0.1.3 → 0.1.4

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 (56) hide show
  1. package/README.md +22 -6
  2. package/dist/binding-schema.d.ts +48 -0
  3. package/dist/binding-schema.d.ts.map +1 -0
  4. package/dist/binding-schema.js +200 -0
  5. package/dist/binding-schema.js.map +1 -0
  6. package/dist/binding.d.ts.map +1 -1
  7. package/dist/binding.js +2 -1
  8. package/dist/binding.js.map +1 -1
  9. package/dist/designer/DocumentDesigner.d.ts +9 -1
  10. package/dist/designer/DocumentDesigner.d.ts.map +1 -1
  11. package/dist/designer/DocumentDesigner.js +2 -2
  12. package/dist/designer/DocumentDesigner.js.map +1 -1
  13. package/dist/designer/ImageBindingFields.d.ts +3 -1
  14. package/dist/designer/ImageBindingFields.d.ts.map +1 -1
  15. package/dist/designer/ImageBindingFields.js +6 -6
  16. package/dist/designer/ImageBindingFields.js.map +1 -1
  17. package/dist/designer/InvoiceFields.d.ts +7 -2
  18. package/dist/designer/InvoiceFields.d.ts.map +1 -1
  19. package/dist/designer/InvoiceFields.js +19 -22
  20. package/dist/designer/InvoiceFields.js.map +1 -1
  21. package/dist/designer/PropertiesPanel.d.ts +4 -1
  22. package/dist/designer/PropertiesPanel.d.ts.map +1 -1
  23. package/dist/designer/PropertiesPanel.js +11 -8
  24. package/dist/designer/PropertiesPanel.js.map +1 -1
  25. package/dist/designer/ReportFields.d.ts +5 -1
  26. package/dist/designer/ReportFields.d.ts.map +1 -1
  27. package/dist/designer/ReportFields.js +20 -5
  28. package/dist/designer/ReportFields.js.map +1 -1
  29. package/dist/designer/SearchableBindingSelect.d.ts +27 -0
  30. package/dist/designer/SearchableBindingSelect.d.ts.map +1 -0
  31. package/dist/designer/SearchableBindingSelect.js +124 -0
  32. package/dist/designer/SearchableBindingSelect.js.map +1 -0
  33. package/dist/designer/TextBindingFields.d.ts +3 -1
  34. package/dist/designer/TextBindingFields.d.ts.map +1 -1
  35. package/dist/designer/TextBindingFields.js +6 -6
  36. package/dist/designer/TextBindingFields.js.map +1 -1
  37. package/dist/designer/index.d.ts +1 -0
  38. package/dist/designer/index.d.ts.map +1 -1
  39. package/dist/designer/index.js +1 -0
  40. package/dist/designer/index.js.map +1 -1
  41. package/dist/designer/styles.d.ts +1 -1
  42. package/dist/designer/styles.d.ts.map +1 -1
  43. package/dist/designer/styles.js +45 -0
  44. package/dist/designer/styles.js.map +1 -1
  45. package/dist/index.d.ts +3 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +2 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/render/binding-template.d.ts +8 -1
  50. package/dist/render/binding-template.d.ts.map +1 -1
  51. package/dist/render/binding-template.js +20 -8
  52. package/dist/render/binding-template.js.map +1 -1
  53. package/dist/report/process.d.ts.map +1 -1
  54. package/dist/report/process.js +16 -15
  55. package/dist/report/process.js.map +1 -1
  56. package/package.json +1 -1
@@ -0,0 +1,27 @@
1
+ import { type ReactElement } from "react";
2
+ import { type BindingField } from "../binding-schema.js";
3
+ interface SearchableBindingSelectProps {
4
+ label: string;
5
+ value: string;
6
+ options: readonly BindingField[];
7
+ onChange: (path: string) => void;
8
+ onBlur: () => void;
9
+ ariaLabel: string;
10
+ testId?: string;
11
+ placeholder?: string;
12
+ }
13
+ /** Searchable list of discovered binding paths. The stored value is the exact path. */
14
+ export declare function SearchableBindingSelect({ label, value, options, onChange, onBlur, ariaLabel, testId, placeholder, }: SearchableBindingSelectProps): ReactElement;
15
+ interface BindingPathControlProps {
16
+ label: string;
17
+ value: string;
18
+ options?: readonly BindingField[];
19
+ onChange: (path: string) => void;
20
+ onBlur: () => void;
21
+ ariaLabel: string;
22
+ testId?: string;
23
+ }
24
+ /** Uses the searchable list when a sample payload supplied options. Otherwise it keeps a path input. */
25
+ export declare function BindingPathControl({ label, value, options, onChange, onBlur, ariaLabel, testId, }: BindingPathControlProps): ReactElement;
26
+ export {};
27
+ //# sourceMappingURL=SearchableBindingSelect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchableBindingSelect.d.ts","sourceRoot":"","sources":["../../src/designer/SearchableBindingSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAmE,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAC3G,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAG9E,UAAU,4BAA4B;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,uFAAuF;AACvF,wBAAgB,uBAAuB,CAAC,EACtC,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAA6B,GAC9B,EAAE,4BAA4B,GAAG,YAAY,CA6J7C;AAED,UAAU,uBAAuB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wGAAwG;AACxG,wBAAgB,kBAAkB,CAAC,EACjC,KAAK,EACL,KAAK,EACL,OAAO,EACP,QAAQ,EACR,MAAM,EACN,SAAS,EACT,MAAM,GACP,EAAE,uBAAuB,GAAG,YAAY,CAuCxC"}
@@ -0,0 +1,124 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useId, useMemo, useRef, useState } from "react";
3
+ import { filterBindingFields } from "../binding-schema.js";
4
+ import { parseBindingPath } from "../binding-path.js";
5
+ /** Searchable list of discovered binding paths. The stored value is the exact path. */
6
+ export function SearchableBindingSelect({ label, value, options, onChange, onBlur, ariaLabel, testId, placeholder = "Search fields", }) {
7
+ const listId = useId();
8
+ const inputRef = useRef(null);
9
+ const [open, setOpen] = useState(false);
10
+ const [query, setQuery] = useState("");
11
+ const [activeIndex, setActiveIndex] = useState(0);
12
+ const [menuBox, setMenuBox] = useState(null);
13
+ const filtered = useMemo(() => filterBindingFields(options, open ? query : ""), [options, open, query]);
14
+ const groups = useMemo(() => groupFields(filtered), [filtered]);
15
+ const activeId = filtered[activeIndex] ? `${listId}-option-${activeIndex}` : undefined;
16
+ useEffect(() => {
17
+ setActiveIndex(0);
18
+ }, [query]);
19
+ useEffect(() => {
20
+ if (!open) {
21
+ return;
22
+ }
23
+ function place() {
24
+ const input = inputRef.current;
25
+ if (!input) {
26
+ return;
27
+ }
28
+ const rect = input.getBoundingClientRect();
29
+ const menuHeight = 220;
30
+ const below = window.innerHeight - rect.bottom;
31
+ const top = below < menuHeight && rect.top > below ? Math.max(8, rect.top - menuHeight - 4) : rect.bottom + 4;
32
+ setMenuBox({ top, left: rect.left, width: rect.width });
33
+ }
34
+ place();
35
+ window.addEventListener("scroll", place, true);
36
+ window.addEventListener("resize", place);
37
+ return () => {
38
+ window.removeEventListener("scroll", place, true);
39
+ window.removeEventListener("resize", place);
40
+ };
41
+ }, [open, query, filtered.length]);
42
+ function choose(path) {
43
+ onChange(path);
44
+ setQuery("");
45
+ setOpen(false);
46
+ }
47
+ function onKeyDown(event) {
48
+ if (event.key === "ArrowDown") {
49
+ event.preventDefault();
50
+ setOpen(true);
51
+ setActiveIndex((index) => Math.min(index + 1, Math.max(filtered.length - 1, 0)));
52
+ return;
53
+ }
54
+ if (event.key === "ArrowUp") {
55
+ event.preventDefault();
56
+ setOpen(true);
57
+ setActiveIndex((index) => Math.max(index - 1, 0));
58
+ return;
59
+ }
60
+ if (event.key === "Enter" && open) {
61
+ event.preventDefault();
62
+ const field = filtered[activeIndex];
63
+ if (field) {
64
+ choose(field.path);
65
+ }
66
+ return;
67
+ }
68
+ if (event.key === "Escape") {
69
+ setOpen(false);
70
+ setQuery("");
71
+ }
72
+ }
73
+ let optionIndex = -1;
74
+ return (_jsxs("label", { className: "df-field", children: [_jsx("span", { children: label }), _jsxs("div", { className: "df-bind-select", children: [_jsx("input", { ref: inputRef, role: "combobox", "aria-label": ariaLabel, "aria-autocomplete": "list", "aria-expanded": open, "aria-controls": listId, "aria-activedescendant": open ? activeId : undefined, "data-testid": testId, spellCheck: false, placeholder: placeholder, value: open ? query : value, onFocus: () => {
75
+ setQuery("");
76
+ setOpen(true);
77
+ }, onClick: () => setOpen(true), onChange: (event) => {
78
+ setQuery(event.target.value);
79
+ setOpen(true);
80
+ }, onKeyDown: onKeyDown, onBlur: () => {
81
+ const typed = query.trim();
82
+ if (typed.length > 0 && typed !== value && parseBindingPath(typed).valid) {
83
+ onChange(typed);
84
+ }
85
+ setOpen(false);
86
+ setQuery("");
87
+ onBlur();
88
+ } }), open ? (_jsx("ul", { id: listId, role: "listbox", className: "df-bind-menu", "data-testid": testId ? `${testId}-options` : undefined, style: menuBox ? { top: menuBox.top, left: menuBox.left, width: menuBox.width } : undefined, children: filtered.length === 0 ? (_jsx("li", { className: "df-bind-empty", children: "No matching fields." })) : (groups.map((group) => (_jsxs("li", { role: "presentation", children: [_jsx("div", { className: "df-bind-group", children: group.name }), _jsx("ul", { role: "presentation", children: group.fields.map((field) => {
89
+ optionIndex += 1;
90
+ const index = optionIndex;
91
+ const selected = index === activeIndex;
92
+ return (_jsx("li", { role: "presentation", children: _jsxs("button", { type: "button", role: "option", id: `${listId}-option-${index}`, "aria-selected": selected, className: selected ? "df-bind-option df-bind-option--active" : "df-bind-option", onMouseDown: (event) => event.preventDefault(), onMouseEnter: () => setActiveIndex(index), onClick: () => choose(field.path), children: [_jsx("span", { children: field.label }), _jsx("span", { className: "df-bind-type", children: field.type }), _jsx("code", { className: "df-bind-path", children: field.path })] }) }, field.path));
93
+ }) })] }, group.name)))) })) : null] })] }));
94
+ }
95
+ /** Uses the searchable list when a sample payload supplied options. Otherwise it keeps a path input. */
96
+ export function BindingPathControl({ label, value, options, onChange, onBlur, ariaLabel, testId, }) {
97
+ const [draft, setDraft] = useState(value);
98
+ useEffect(() => {
99
+ setDraft(value);
100
+ }, [value]);
101
+ if (!options) {
102
+ return (_jsxs("label", { className: "df-field", children: [_jsx("span", { children: label }), _jsx("input", { "aria-label": ariaLabel, "data-testid": testId, value: draft, spellCheck: false, onChange: (event) => {
103
+ const next = event.target.value;
104
+ setDraft(next);
105
+ if (parseBindingPath(next).valid) {
106
+ onChange(next);
107
+ }
108
+ }, onBlur: onBlur })] }));
109
+ }
110
+ return (_jsx(SearchableBindingSelect, { label: label, value: value, options: options, onChange: onChange, onBlur: onBlur, ariaLabel: ariaLabel, testId: testId }));
111
+ }
112
+ function groupFields(fields) {
113
+ const groups = [];
114
+ for (const field of fields) {
115
+ const current = groups[groups.length - 1];
116
+ if (!current || current.name !== field.group) {
117
+ groups.push({ name: field.group, fields: [field] });
118
+ continue;
119
+ }
120
+ current.fields.push(field);
121
+ }
122
+ return groups;
123
+ }
124
+ //# sourceMappingURL=SearchableBindingSelect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchableBindingSelect.js","sourceRoot":"","sources":["../../src/designer/SearchableBindingSelect.tsx"],"names":[],"mappings":"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"}
@@ -1,11 +1,13 @@
1
1
  import { type ReactElement } from "react";
2
+ import type { BindingField } from "../binding-schema.js";
2
3
  import type { TextElement } from "../types.js";
3
4
  interface TextBindingFieldsProps {
4
5
  element: TextElement;
5
6
  previewData: unknown | null;
7
+ scalarFields?: readonly BindingField[];
6
8
  onCommit: (element: TextElement, coalesce?: boolean) => void;
7
9
  onBlur: () => void;
8
10
  }
9
- export declare function TextBindingFields({ element, previewData, onCommit, onBlur, }: TextBindingFieldsProps): ReactElement;
11
+ export declare function TextBindingFields({ element, previewData, scalarFields, onCommit, onBlur, }: TextBindingFieldsProps): ReactElement;
10
12
  export {};
11
13
  //# sourceMappingURL=TextBindingFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextBindingFields.d.ts","sourceRoot":"","sources":["../../src/designer/TextBindingFields.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAG/D,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAE5D,UAAU,sBAAsB;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,WAAW,EACX,QAAQ,EACR,MAAM,GACP,EAAE,sBAAsB,GAAG,YAAY,CAqIvC"}
1
+ {"version":3,"file":"TextBindingFields.d.ts","sourceRoot":"","sources":["../../src/designer/TextBindingFields.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,YAAY,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,aAAa,CAAC;AAG5D,UAAU,sBAAsB;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,YAAY,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,MAAM,GACP,EAAE,sBAAsB,GAAG,YAAY,CAiIvC"}
@@ -2,7 +2,8 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
2
2
  import { useEffect, useState } from "react";
3
3
  import { resolveElementData } from "../binding.js";
4
4
  import { parseBindingPath } from "../binding-path.js";
5
- export function TextBindingFields({ element, previewData, onCommit, onBlur, }) {
5
+ import { BindingPathControl } from "./SearchableBindingSelect.js";
6
+ export function TextBindingFields({ element, previewData, scalarFields, onCommit, onBlur, }) {
6
7
  const savedKey = JSON.stringify(element.binding ?? null);
7
8
  const [path, setPath] = useState(element.binding?.path ?? "");
8
9
  const [fallback, setFallback] = useState(element.binding?.fallback ?? "");
@@ -39,11 +40,10 @@ export function TextBindingFields({ element, previewData, onCommit, onBlur, }) {
39
40
  const sample = bound && parseBindingPath(path).valid && previewData !== null
40
41
  ? previewSample(element, toBinding(path, fallback, prefix, suffix), previewData)
41
42
  : null;
42
- return (_jsxs("fieldset", { className: "df-binding", children: [_jsx("legend", { children: "Data binding" }), _jsxs("div", { className: "df-choice", role: "radiogroup", "aria-label": "Text source", children: [_jsxs("label", { children: [_jsx("input", { type: "radio", name: `text-mode-${element.id}`, checked: !bound, onChange: chooseStatic }), "Static text"] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: `text-mode-${element.id}`, checked: bound, onChange: () => setBound(true) }), "Data binding"] })] }), bound ? (_jsxs(_Fragment, { children: [_jsxs("label", { className: "df-field", children: [_jsx("span", { children: "Binding path" }), _jsx("input", { "aria-label": "Binding path", "data-testid": "binding-path", value: path, "aria-invalid": message.tone === "error", spellCheck: false, onChange: (event) => {
43
- const next = event.target.value;
44
- setPath(next);
45
- update(next, fallback, prefix, suffix);
46
- }, onBlur: onBlur })] }), _jsx("p", { className: `df-path-note df-path-note--${message.tone}`, "data-testid": "path-validity", role: "status", children: message.text }), _jsxs("label", { className: "df-field", children: [_jsx("span", { children: "Fallback" }), _jsx("input", { "aria-label": "Fallback value", value: fallback, onChange: (event) => {
43
+ return (_jsxs("fieldset", { className: "df-binding", children: [_jsx("legend", { children: "Data binding" }), _jsxs("div", { className: "df-choice", role: "radiogroup", "aria-label": "Text source", children: [_jsxs("label", { children: [_jsx("input", { type: "radio", name: `text-mode-${element.id}`, checked: !bound, onChange: chooseStatic }), "Static text"] }), _jsxs("label", { children: [_jsx("input", { type: "radio", name: `text-mode-${element.id}`, checked: bound, onChange: () => setBound(true) }), "Data binding"] })] }), bound ? (_jsxs(_Fragment, { children: [_jsx(BindingPathControl, { label: "Binding path", value: path, options: scalarFields, ariaLabel: "Binding path", testId: "binding-path", onChange: (next) => {
44
+ setPath(next);
45
+ update(next, fallback, prefix, suffix);
46
+ }, onBlur: onBlur }), _jsx("p", { className: `df-path-note df-path-note--${message.tone}`, "data-testid": "path-validity", role: "status", children: message.text }), _jsxs("label", { className: "df-field", children: [_jsx("span", { children: "Fallback" }), _jsx("input", { "aria-label": "Fallback value", value: fallback, onChange: (event) => {
47
47
  const next = event.target.value;
48
48
  setFallback(next);
49
49
  update(path, next, prefix, suffix);
@@ -1 +1 @@
1
- {"version":3,"file":"TextBindingFields.js","sourceRoot":"","sources":["../../src/designer/TextBindingFields.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TextBindingFields.js","sourceRoot":"","sources":["../../src/designer/TextBindingFields.tsx"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  export { DocumentDesigner } from "./DocumentDesigner.js";
2
2
  export type { DocumentDesignerProps } from "./DocumentDesigner.js";
3
+ export { BindingPathControl, SearchableBindingSelect } from "./SearchableBindingSelect.js";
3
4
  export { THEME_PREFERENCES, THEME_STORAGE_KEY, browserMatchMedia, browserThemeStorage, isThemePreference, readSystemPrefersDark, readThemePreference, resolveTheme, subscribeSystemTheme, writeThemePreference, } from "./theme.js";
4
5
  export type { ResolvedTheme, ThemePreference, ThemeStorage } from "./theme.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/designer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/designer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
1
  export { DocumentDesigner } from "./DocumentDesigner.js";
2
+ export { BindingPathControl, SearchableBindingSelect } from "./SearchableBindingSelect.js";
2
3
  export { THEME_PREFERENCES, THEME_STORAGE_KEY, browserMatchMedia, browserThemeStorage, isThemePreference, readSystemPrefersDark, readThemePreference, resolveTheme, subscribeSystemTheme, writeThemePreference, } from "./theme.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/designer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/designer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -1,3 +1,3 @@
1
1
  export declare const STYLE_ID = "doc-forge-designer-styles";
2
- export declare const DESIGNER_CSS = "\n.df-shell {\n --df-app: #e7ebf0;\n --df-surface: #ffffff;\n --df-surface-muted: #f7f8fa;\n --df-text: #1c2430;\n --df-text-secondary: #3d4858;\n --df-text-muted: #5c6778;\n --df-border: #d5dbe3;\n --df-input-bg: #ffffff;\n --df-input-border: #c5ceda;\n --df-hover: #e8eef6;\n --df-selected: #e5eefc;\n --df-selected-border: #c5d7f5;\n --df-selected-text: #174f9e;\n --df-primary: #1b5fbf;\n --df-primary-hover: #174f9e;\n --df-primary-text: #ffffff;\n --df-focus: #1b5fbf;\n --df-workspace: #c5cad3;\n --df-shadow: rgba(20, 28, 40, 0.18);\n --df-overlay: rgba(20, 28, 40, 0.45);\n --df-danger: #9f1d1d;\n --df-danger-border: #e4b4b4;\n --df-warning: #8a5a00;\n --df-success: #0f7b4c;\n color-scheme: light;\n height: 100%;\n min-height: 560px;\n display: flex;\n flex-direction: column;\n background: var(--df-app);\n color: var(--df-text);\n font-family: \"Segoe UI\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 13px;\n line-height: 1.4;\n}\n.df-shell[data-theme=\"dark\"] {\n --df-app: #12161c;\n --df-surface: #1c232d;\n --df-surface-muted: #171d26;\n --df-text: #e8eef6;\n --df-text-secondary: #c5d0de;\n --df-text-muted: #a8b3c2;\n --df-border: #313a48;\n --df-input-bg: #121820;\n --df-input-border: #465266;\n --df-hover: #283140;\n --df-selected: #1d3a5f;\n --df-selected-border: #3d6eab;\n --df-selected-text: #d6e6ff;\n --df-primary: #3d8bfd;\n --df-primary-hover: #69a6ff;\n --df-primary-text: #061018;\n --df-focus: #9ec1ff;\n --df-workspace: #0c1016;\n --df-shadow: rgba(0, 0, 0, 0.45);\n --df-overlay: rgba(0, 0, 0, 0.62);\n --df-danger: #ffb4b4;\n --df-danger-border: #8a3d3d;\n --df-warning: #f0c674;\n --df-success: #7dcea0;\n color-scheme: dark;\n}\n@media (prefers-reduced-motion: reduce) {\n .df-shell,\n .df-shell * {\n transition: none !important;\n }\n}\n.df-shell *,\n.df-shell *::before,\n.df-shell *::after {\n box-sizing: border-box;\n}\n.df-shell button,\n.df-shell input,\n.df-shell select,\n.df-shell textarea {\n font: inherit;\n}\n.df-shell input,\n.df-shell select,\n.df-shell textarea {\n color: var(--df-text);\n}\n.df-shell button:focus-visible,\n.df-shell input:focus-visible,\n.df-shell select:focus-visible,\n.df-shell textarea:focus-visible {\n outline: 2px solid var(--df-focus);\n outline-offset: 1px;\n}\n.df-toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--df-surface);\n border-bottom: 1px solid var(--df-border);\n}\n.df-toolbar-group {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.df-name {\n flex: 1 1 180px;\n min-width: 160px;\n}\n.df-name input,\n.df-select,\n.df-custom input,\n.df-field input,\n.df-field select,\n.df-field textarea {\n width: 100%;\n border: 1px solid var(--df-input-border);\n border-radius: 6px;\n background: var(--df-input-bg);\n color: var(--df-text);\n}\n.df-name input,\n.df-select,\n.df-custom input,\n.df-field input,\n.df-field select {\n height: 32px;\n padding: 0 8px;\n}\n.df-select {\n width: auto;\n}\n.df-custom {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.df-custom label {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.df-custom input {\n width: 72px;\n}\n.df-button {\n height: 32px;\n padding: 0 10px;\n border: 1px solid var(--df-input-border);\n border-radius: 6px;\n background: var(--df-surface);\n color: var(--df-text);\n cursor: pointer;\n}\n.df-button:hover:not(:disabled) {\n background: var(--df-hover);\n}\n.df-button:disabled {\n opacity: 0.45;\n cursor: default;\n}\n.df-button--primary {\n background: var(--df-primary);\n border-color: var(--df-primary-hover);\n color: var(--df-primary-text);\n}\n.df-button--primary:hover:not(:disabled) {\n background: var(--df-primary-hover);\n}\n.df-button--pressed {\n background: var(--df-selected);\n border-color: var(--df-primary);\n color: var(--df-selected-text);\n}\n.df-button--danger {\n width: 100%;\n color: var(--df-danger);\n border-color: var(--df-danger-border);\n background: var(--df-surface);\n}\n.df-theme {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n.df-theme-button {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n padding: 0;\n}\n.df-theme-button svg {\n display: block;\n}\n.df-zoom {\n min-width: 52px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n color: var(--df-text-secondary);\n}\n.df-status {\n flex: 1 1 160px;\n min-height: 1.2em;\n font-size: 12px;\n}\n.df-status--ok { color: var(--df-success); }\n.df-status--error { color: var(--df-danger); }\n.df-body {\n flex: 1;\n min-height: 0;\n display: flex;\n}\n.df-side {\n width: 240px;\n flex: 0 0 240px;\n background: var(--df-surface-muted);\n overflow: auto;\n padding: 12px;\n}\n.df-side--left { border-right: 1px solid var(--df-border); }\n.df-side--right { border-left: 1px solid var(--df-border); }\n.df-side-title {\n margin: 0 0 4px;\n font-size: 12px;\n font-weight: 650;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--df-text-muted);\n}\n.df-side-note {\n margin: 0 0 12px;\n color: var(--df-text-muted);\n font-size: 12px;\n}\n.df-tool {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n margin-bottom: 6px;\n padding: 8px;\n border: 1px solid transparent;\n border-radius: 8px;\n background: transparent;\n text-align: left;\n cursor: pointer;\n}\n.df-tool:hover { background: var(--df-hover); }\n.df-tool-icon {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n border: 1px solid var(--df-border);\n border-radius: 6px;\n background: var(--df-surface);\n color: var(--df-text);\n flex: 0 0 auto;\n}\n.df-tool strong { display: block; font-weight: 600; color: var(--df-text); }\n.df-tool span { display: block; color: var(--df-text-muted); font-size: 12px; }\n.df-viewport {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n background: var(--df-workspace);\n}\n.df-viewport-stage {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 24px;\n}\n/* Real spacers, not place-content. A centered item taller than the stage\n overflows outside the scrollable area, so the bottom of the page cannot be reached. */\n.df-viewport-stage:not(.df-viewport-stage--html)::before,\n.df-viewport-stage:not(.df-viewport-stage--html)::after {\n content: \"\";\n flex: 1 0 0px;\n align-self: stretch;\n min-height: 0;\n}\n.df-preview-banner {\n flex: 0 0 auto;\n padding: 8px 12px;\n background: var(--df-selected);\n color: var(--df-selected-text);\n border-bottom: 1px solid var(--df-selected-border);\n text-align: center;\n}\n.df-viewport-stage--html {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n padding: 0;\n}\n.df-html-note {\n flex: 0 0 auto;\n margin: 0;\n padding: 8px 12px;\n background: var(--df-surface);\n color: var(--df-text-muted);\n border-bottom: 1px solid var(--df-border);\n}\n.df-html-frame {\n flex: 1;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--df-workspace);\n}\n.df-page-slot {\n position: relative;\n flex: 0 0 auto;\n margin-inline: auto;\n}\n/* Document surface. These colors stay with the template and do not follow the editor theme. */\n.df-page {\n position: absolute;\n top: 0;\n left: 0;\n background: #fff;\n color: #1c2430;\n box-shadow: 0 12px 40px var(--df-shadow);\n transform-origin: top left;\n}\n.df-grid,\n.df-margins,\n.df-empty {\n position: absolute;\n pointer-events: none;\n}\n.df-grid {\n inset: 0;\n background-image:\n linear-gradient(to right, rgba(28, 36, 48, 0.12) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(28, 36, 48, 0.12) 1px, transparent 1px);\n}\n.df-margins {\n border: 1px dashed rgba(27, 95, 191, 0.7);\n}\n.df-empty {\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n color: #8b95a5;\n font-size: 14px;\n white-space: nowrap;\n}\n.df-element {\n position: absolute;\n touch-action: none;\n cursor: move;\n user-select: none;\n}\n.df-element--selected {\n box-shadow: 0 0 0 2px #1b5fbf;\n z-index: 2;\n}\n.df-text {\n overflow: hidden;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.df-image {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n padding: 4px;\n text-align: center;\n color: #5c6778;\n font-size: 11px;\n background:\n repeating-linear-gradient(-45deg, #f7f8fa, #f7f8fa 6px, #eef1f5 6px, #eef1f5 12px);\n border: 1px dashed #9aa3b2;\n}\n.df-items,\n.df-report,\n.df-totals {\n width: 100%;\n height: 100%;\n overflow: hidden;\n background: #ffffff;\n color: #1c2430;\n font-size: 10px;\n pointer-events: none;\n}\n.df-items table,\n.df-report table,\n.df-totals table {\n width: 100%;\n border-collapse: collapse;\n}\n.df-items th,\n.df-items td,\n.df-report th,\n.df-report td,\n.df-totals td {\n padding: 2px 4px;\n text-align: left;\n}\n.df-totals td:last-child { text-align: right; }\n.df-report tr[data-kind=\"group\"],\n.df-report tr[data-kind=\"subtotal\"],\n.df-report tr[data-kind=\"grand\"] { font-weight: 700; }\n.df-column {\n margin: 0 0 8px;\n padding: 8px;\n border: 1px solid var(--df-border);\n border-radius: 6px;\n}\n.df-column legend { padding: 0 4px; font-size: 12px; }\n.df-image-photo {\n width: 100%;\n height: 100%;\n object-fit: contain;\n pointer-events: none;\n}\n.df-rect { overflow: hidden; }\n.df-line { overflow: visible; }\n.df-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n right: -5px;\n bottom: -5px;\n padding: 0;\n border: 1px solid #1b5fbf;\n border-radius: 2px;\n background: #fff;\n cursor: nwse-resize;\n z-index: 3;\n}\n.df-style {\n border: 1px solid var(--df-border);\n border-radius: 8px;\n background: var(--df-surface);\n}\n.df-style > summary {\n cursor: pointer;\n padding: 8px 10px;\n font-size: 12px;\n font-weight: 650;\n}\n.df-style-body {\n display: grid;\n gap: 8px;\n padding: 0 10px 10px;\n}\n.df-reset { justify-self: start; font-size: 11px; }\n.df-props {\n display: grid;\n gap: 12px;\n align-content: start;\n}\n.df-props-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n}\n.df-props-head h3 {\n margin: 0;\n font-size: 14px;\n}\n.df-link {\n border: 0;\n background: transparent;\n color: var(--df-primary);\n cursor: pointer;\n padding: 0;\n}\n.df-link:hover { color: var(--df-primary-hover); }\n.df-field {\n display: grid;\n gap: 4px;\n}\n.df-check {\n display: flex;\n align-items: center;\n gap: 6px;\n margin: 6px 0;\n font-size: 12px;\n}\n.df-field > span,\n.df-custom span {\n font-size: 11px;\n font-weight: 650;\n color: var(--df-text-muted);\n}\n.df-field-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n}\n.df-field textarea {\n min-height: 72px;\n padding: 8px;\n resize: vertical;\n}\n.df-color {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n.df-color input[type=\"color\"] {\n width: 32px;\n height: 32px;\n padding: 2px;\n flex: 0 0 auto;\n}\n.df-meta {\n margin: 0;\n color: var(--df-text-muted);\n font-size: 12px;\n}\n.df-error {\n margin: 24px;\n padding: 16px;\n border: 1px solid var(--df-danger-border);\n border-radius: 8px;\n background: var(--df-surface);\n color: var(--df-danger);\n}\n.df-error ul { margin: 8px 0 0; padding-left: 18px; }\n.df-binding {\n margin: 0;\n padding: 8px;\n border: 1px solid var(--df-border);\n border-radius: 8px;\n display: grid;\n gap: 8px;\n}\n.df-binding legend {\n padding: 0 4px;\n font-size: 11px;\n font-weight: 650;\n color: var(--df-text-muted);\n}\n.df-choice {\n display: grid;\n gap: 4px;\n}\n.df-choice label {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.df-path-note {\n margin: 0;\n font-size: 12px;\n}\n.df-path-note--ok { color: var(--df-success); }\n.df-path-note--error { color: var(--df-danger); }\n.df-path-note--muted { color: var(--df-text-muted); }\n.df-dialog-backdrop {\n position: fixed;\n inset: 0;\n z-index: 30;\n background: var(--df-overlay);\n display: grid;\n place-items: center;\n padding: 16px;\n}\n.df-dialog {\n width: min(520px, 100%);\n max-height: min(640px, 100%);\n overflow: auto;\n background: var(--df-surface);\n color: var(--df-text);\n border-radius: 10px;\n padding: 16px;\n display: grid;\n gap: 10px;\n box-shadow: 0 16px 48px var(--df-shadow);\n}\n.df-dialog h3 {\n margin: 0;\n font-size: 16px;\n}\n.df-dialog textarea {\n min-height: 240px;\n padding: 8px;\n border: 1px solid var(--df-input-border);\n border-radius: 6px;\n background: var(--df-input-bg);\n color: var(--df-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n resize: vertical;\n}\n.df-dialog-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: flex-end;\n}\n";
2
+ export declare const DESIGNER_CSS = "\n.df-shell {\n --df-app: #e7ebf0;\n --df-surface: #ffffff;\n --df-surface-muted: #f7f8fa;\n --df-text: #1c2430;\n --df-text-secondary: #3d4858;\n --df-text-muted: #5c6778;\n --df-border: #d5dbe3;\n --df-input-bg: #ffffff;\n --df-input-border: #c5ceda;\n --df-hover: #e8eef6;\n --df-selected: #e5eefc;\n --df-selected-border: #c5d7f5;\n --df-selected-text: #174f9e;\n --df-primary: #1b5fbf;\n --df-primary-hover: #174f9e;\n --df-primary-text: #ffffff;\n --df-focus: #1b5fbf;\n --df-workspace: #c5cad3;\n --df-shadow: rgba(20, 28, 40, 0.18);\n --df-overlay: rgba(20, 28, 40, 0.45);\n --df-danger: #9f1d1d;\n --df-danger-border: #e4b4b4;\n --df-warning: #8a5a00;\n --df-success: #0f7b4c;\n color-scheme: light;\n height: 100%;\n min-height: 560px;\n display: flex;\n flex-direction: column;\n background: var(--df-app);\n color: var(--df-text);\n font-family: \"Segoe UI\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 13px;\n line-height: 1.4;\n}\n.df-shell[data-theme=\"dark\"] {\n --df-app: #12161c;\n --df-surface: #1c232d;\n --df-surface-muted: #171d26;\n --df-text: #e8eef6;\n --df-text-secondary: #c5d0de;\n --df-text-muted: #a8b3c2;\n --df-border: #313a48;\n --df-input-bg: #121820;\n --df-input-border: #465266;\n --df-hover: #283140;\n --df-selected: #1d3a5f;\n --df-selected-border: #3d6eab;\n --df-selected-text: #d6e6ff;\n --df-primary: #3d8bfd;\n --df-primary-hover: #69a6ff;\n --df-primary-text: #061018;\n --df-focus: #9ec1ff;\n --df-workspace: #0c1016;\n --df-shadow: rgba(0, 0, 0, 0.45);\n --df-overlay: rgba(0, 0, 0, 0.62);\n --df-danger: #ffb4b4;\n --df-danger-border: #8a3d3d;\n --df-warning: #f0c674;\n --df-success: #7dcea0;\n color-scheme: dark;\n}\n@media (prefers-reduced-motion: reduce) {\n .df-shell,\n .df-shell * {\n transition: none !important;\n }\n}\n.df-shell *,\n.df-shell *::before,\n.df-shell *::after {\n box-sizing: border-box;\n}\n.df-shell button,\n.df-shell input,\n.df-shell select,\n.df-shell textarea {\n font: inherit;\n}\n.df-shell input,\n.df-shell select,\n.df-shell textarea {\n color: var(--df-text);\n}\n.df-shell button:focus-visible,\n.df-shell input:focus-visible,\n.df-shell select:focus-visible,\n.df-shell textarea:focus-visible {\n outline: 2px solid var(--df-focus);\n outline-offset: 1px;\n}\n.df-toolbar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: var(--df-surface);\n border-bottom: 1px solid var(--df-border);\n}\n.df-toolbar-group {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.df-name {\n flex: 1 1 180px;\n min-width: 160px;\n}\n.df-name input,\n.df-select,\n.df-custom input,\n.df-field input,\n.df-field select,\n.df-field textarea {\n width: 100%;\n border: 1px solid var(--df-input-border);\n border-radius: 6px;\n background: var(--df-input-bg);\n color: var(--df-text);\n}\n.df-name input,\n.df-select,\n.df-custom input,\n.df-field input,\n.df-field select {\n height: 32px;\n padding: 0 8px;\n}\n.df-select {\n width: auto;\n}\n.df-custom {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.df-custom label {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.df-custom input {\n width: 72px;\n}\n.df-button {\n height: 32px;\n padding: 0 10px;\n border: 1px solid var(--df-input-border);\n border-radius: 6px;\n background: var(--df-surface);\n color: var(--df-text);\n cursor: pointer;\n}\n.df-button:hover:not(:disabled) {\n background: var(--df-hover);\n}\n.df-button:disabled {\n opacity: 0.45;\n cursor: default;\n}\n.df-button--primary {\n background: var(--df-primary);\n border-color: var(--df-primary-hover);\n color: var(--df-primary-text);\n}\n.df-button--primary:hover:not(:disabled) {\n background: var(--df-primary-hover);\n}\n.df-button--pressed {\n background: var(--df-selected);\n border-color: var(--df-primary);\n color: var(--df-selected-text);\n}\n.df-button--danger {\n width: 100%;\n color: var(--df-danger);\n border-color: var(--df-danger-border);\n background: var(--df-surface);\n}\n.df-theme {\n display: flex;\n align-items: center;\n gap: 2px;\n}\n.df-theme-button {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n padding: 0;\n}\n.df-theme-button svg {\n display: block;\n}\n.df-zoom {\n min-width: 52px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n color: var(--df-text-secondary);\n}\n.df-status {\n flex: 1 1 160px;\n min-height: 1.2em;\n font-size: 12px;\n}\n.df-status--ok { color: var(--df-success); }\n.df-status--error { color: var(--df-danger); }\n.df-body {\n flex: 1;\n min-height: 0;\n display: flex;\n}\n.df-side {\n width: 240px;\n flex: 0 0 240px;\n background: var(--df-surface-muted);\n overflow: auto;\n padding: 12px;\n}\n.df-side--left { border-right: 1px solid var(--df-border); }\n.df-side--right { border-left: 1px solid var(--df-border); }\n.df-side-title {\n margin: 0 0 4px;\n font-size: 12px;\n font-weight: 650;\n letter-spacing: 0.04em;\n text-transform: uppercase;\n color: var(--df-text-muted);\n}\n.df-side-note {\n margin: 0 0 12px;\n color: var(--df-text-muted);\n font-size: 12px;\n}\n.df-tool {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n margin-bottom: 6px;\n padding: 8px;\n border: 1px solid transparent;\n border-radius: 8px;\n background: transparent;\n text-align: left;\n cursor: pointer;\n}\n.df-tool:hover { background: var(--df-hover); }\n.df-tool-icon {\n width: 32px;\n height: 32px;\n display: grid;\n place-items: center;\n border: 1px solid var(--df-border);\n border-radius: 6px;\n background: var(--df-surface);\n color: var(--df-text);\n flex: 0 0 auto;\n}\n.df-tool strong { display: block; font-weight: 600; color: var(--df-text); }\n.df-tool span { display: block; color: var(--df-text-muted); font-size: 12px; }\n.df-viewport {\n flex: 1;\n min-width: 0;\n min-height: 0;\n display: flex;\n flex-direction: column;\n background: var(--df-workspace);\n}\n.df-viewport-stage {\n flex: 1;\n min-height: 0;\n overflow: auto;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n padding: 24px;\n}\n/* Real spacers, not place-content. A centered item taller than the stage\n overflows outside the scrollable area, so the bottom of the page cannot be reached. */\n.df-viewport-stage:not(.df-viewport-stage--html)::before,\n.df-viewport-stage:not(.df-viewport-stage--html)::after {\n content: \"\";\n flex: 1 0 0px;\n align-self: stretch;\n min-height: 0;\n}\n.df-preview-banner {\n flex: 0 0 auto;\n padding: 8px 12px;\n background: var(--df-selected);\n color: var(--df-selected-text);\n border-bottom: 1px solid var(--df-selected-border);\n text-align: center;\n}\n.df-viewport-stage--html {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n padding: 0;\n}\n.df-html-note {\n flex: 0 0 auto;\n margin: 0;\n padding: 8px 12px;\n background: var(--df-surface);\n color: var(--df-text-muted);\n border-bottom: 1px solid var(--df-border);\n}\n.df-html-frame {\n flex: 1;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--df-workspace);\n}\n.df-page-slot {\n position: relative;\n flex: 0 0 auto;\n margin-inline: auto;\n}\n/* Document surface. These colors stay with the template and do not follow the editor theme. */\n.df-page {\n position: absolute;\n top: 0;\n left: 0;\n background: #fff;\n color: #1c2430;\n box-shadow: 0 12px 40px var(--df-shadow);\n transform-origin: top left;\n}\n.df-grid,\n.df-margins,\n.df-empty {\n position: absolute;\n pointer-events: none;\n}\n.df-grid {\n inset: 0;\n background-image:\n linear-gradient(to right, rgba(28, 36, 48, 0.12) 1px, transparent 1px),\n linear-gradient(to bottom, rgba(28, 36, 48, 0.12) 1px, transparent 1px);\n}\n.df-margins {\n border: 1px dashed rgba(27, 95, 191, 0.7);\n}\n.df-empty {\n left: 50%;\n top: 50%;\n transform: translate(-50%, -50%);\n color: #8b95a5;\n font-size: 14px;\n white-space: nowrap;\n}\n.df-element {\n position: absolute;\n touch-action: none;\n cursor: move;\n user-select: none;\n}\n.df-element--selected {\n box-shadow: 0 0 0 2px #1b5fbf;\n z-index: 2;\n}\n.df-text {\n overflow: hidden;\n white-space: pre-wrap;\n word-break: break-word;\n}\n.df-image {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n padding: 4px;\n text-align: center;\n color: #5c6778;\n font-size: 11px;\n background:\n repeating-linear-gradient(-45deg, #f7f8fa, #f7f8fa 6px, #eef1f5 6px, #eef1f5 12px);\n border: 1px dashed #9aa3b2;\n}\n.df-items,\n.df-report,\n.df-totals {\n width: 100%;\n height: 100%;\n overflow: hidden;\n background: #ffffff;\n color: #1c2430;\n font-size: 10px;\n pointer-events: none;\n}\n.df-items table,\n.df-report table,\n.df-totals table {\n width: 100%;\n border-collapse: collapse;\n}\n.df-items th,\n.df-items td,\n.df-report th,\n.df-report td,\n.df-totals td {\n padding: 2px 4px;\n text-align: left;\n}\n.df-totals td:last-child { text-align: right; }\n.df-report tr[data-kind=\"group\"],\n.df-report tr[data-kind=\"subtotal\"],\n.df-report tr[data-kind=\"grand\"] { font-weight: 700; }\n.df-column {\n margin: 0 0 8px;\n padding: 8px;\n border: 1px solid var(--df-border);\n border-radius: 6px;\n}\n.df-column legend { padding: 0 4px; font-size: 12px; }\n.df-image-photo {\n width: 100%;\n height: 100%;\n object-fit: contain;\n pointer-events: none;\n}\n.df-rect { overflow: hidden; }\n.df-line { overflow: visible; }\n.df-handle {\n position: absolute;\n width: 10px;\n height: 10px;\n right: -5px;\n bottom: -5px;\n padding: 0;\n border: 1px solid #1b5fbf;\n border-radius: 2px;\n background: #fff;\n cursor: nwse-resize;\n z-index: 3;\n}\n.df-style {\n border: 1px solid var(--df-border);\n border-radius: 8px;\n background: var(--df-surface);\n}\n.df-style > summary {\n cursor: pointer;\n padding: 8px 10px;\n font-size: 12px;\n font-weight: 650;\n}\n.df-style-body {\n display: grid;\n gap: 8px;\n padding: 0 10px 10px;\n}\n.df-reset { justify-self: start; font-size: 11px; }\n.df-props {\n display: grid;\n gap: 12px;\n align-content: start;\n}\n.df-props-head {\n display: flex;\n justify-content: space-between;\n align-items: center;\n gap: 8px;\n}\n.df-props-head h3 {\n margin: 0;\n font-size: 14px;\n}\n.df-link {\n border: 0;\n background: transparent;\n color: var(--df-primary);\n cursor: pointer;\n padding: 0;\n}\n.df-link:hover { color: var(--df-primary-hover); }\n.df-field {\n display: grid;\n gap: 4px;\n}\n.df-check {\n display: flex;\n align-items: center;\n gap: 6px;\n margin: 6px 0;\n font-size: 12px;\n}\n.df-field > span,\n.df-custom span {\n font-size: 11px;\n font-weight: 650;\n color: var(--df-text-muted);\n}\n.df-field-row {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 8px;\n}\n.df-field textarea {\n min-height: 72px;\n padding: 8px;\n resize: vertical;\n}\n.df-color {\n display: flex;\n gap: 6px;\n align-items: center;\n}\n.df-color input[type=\"color\"] {\n width: 32px;\n height: 32px;\n padding: 2px;\n flex: 0 0 auto;\n}\n.df-meta {\n margin: 0;\n color: var(--df-text-muted);\n font-size: 12px;\n}\n.df-error {\n margin: 24px;\n padding: 16px;\n border: 1px solid var(--df-danger-border);\n border-radius: 8px;\n background: var(--df-surface);\n color: var(--df-danger);\n}\n.df-error ul { margin: 8px 0 0; padding-left: 18px; }\n.df-binding {\n margin: 0;\n padding: 8px;\n border: 1px solid var(--df-border);\n border-radius: 8px;\n display: grid;\n gap: 8px;\n}\n.df-binding legend {\n padding: 0 4px;\n font-size: 11px;\n font-weight: 650;\n color: var(--df-text-muted);\n}\n.df-choice {\n display: grid;\n gap: 4px;\n}\n.df-choice label {\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.df-path-note {\n margin: 0;\n font-size: 12px;\n}\n.df-path-note--ok { color: var(--df-success); }\n.df-path-note--error { color: var(--df-danger); }\n.df-path-note--muted { color: var(--df-text-muted); }\n.df-dialog-backdrop {\n position: fixed;\n inset: 0;\n z-index: 30;\n background: var(--df-overlay);\n display: grid;\n place-items: center;\n padding: 16px;\n}\n.df-dialog {\n width: min(520px, 100%);\n max-height: min(640px, 100%);\n overflow: auto;\n background: var(--df-surface);\n color: var(--df-text);\n border-radius: 10px;\n padding: 16px;\n display: grid;\n gap: 10px;\n box-shadow: 0 16px 48px var(--df-shadow);\n}\n.df-dialog h3 {\n margin: 0;\n font-size: 16px;\n}\n.df-dialog textarea {\n min-height: 240px;\n padding: 8px;\n border: 1px solid var(--df-input-border);\n border-radius: 6px;\n background: var(--df-input-bg);\n color: var(--df-text);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 12px;\n resize: vertical;\n}\n.df-dialog-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n justify-content: flex-end;\n}\n.df-bind-select { position: relative; }\n.df-bind-menu {\n position: fixed;\n z-index: 30;\n max-height: 220px;\n overflow: auto;\n margin: 0;\n padding: 4px;\n list-style: none;\n background: var(--df-surface);\n border: 1px solid var(--df-border);\n border-radius: 8px;\n box-shadow: 0 8px 24px var(--df-shadow);\n}\n.df-bind-menu ul { list-style: none; margin: 0; padding: 0; }\n.df-bind-group {\n padding: 6px 8px 2px;\n color: var(--df-text-muted);\n font-size: 11px;\n font-weight: 650;\n text-transform: lowercase;\n}\n.df-bind-option {\n display: grid;\n grid-template-columns: 1fr auto;\n gap: 2px 8px;\n width: 100%;\n padding: 6px 8px;\n border: 0;\n border-radius: 6px;\n background: transparent;\n color: var(--df-text);\n text-align: left;\n cursor: pointer;\n}\n.df-bind-option--active,\n.df-bind-option:hover { background: var(--df-hover); }\n.df-bind-path {\n grid-column: 1 / -1;\n color: var(--df-text-muted);\n font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;\n font-size: 11px;\n}\n.df-bind-type { color: var(--df-text-muted); font-size: 11px; }\n.df-bind-empty { padding: 8px; color: var(--df-text-muted); }\n";
3
3
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/designer/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,8BAA8B,CAAC;AAEpD,eAAO,MAAM,YAAY,gxZA8lBxB,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/designer/styles.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,QAAQ,8BAA8B,CAAC;AAEpD,eAAO,MAAM,YAAY,g7bA2oBxB,CAAC"}
@@ -605,5 +605,50 @@ export const DESIGNER_CSS = `
605
605
  gap: 8px;
606
606
  justify-content: flex-end;
607
607
  }
608
+ .df-bind-select { position: relative; }
609
+ .df-bind-menu {
610
+ position: fixed;
611
+ z-index: 30;
612
+ max-height: 220px;
613
+ overflow: auto;
614
+ margin: 0;
615
+ padding: 4px;
616
+ list-style: none;
617
+ background: var(--df-surface);
618
+ border: 1px solid var(--df-border);
619
+ border-radius: 8px;
620
+ box-shadow: 0 8px 24px var(--df-shadow);
621
+ }
622
+ .df-bind-menu ul { list-style: none; margin: 0; padding: 0; }
623
+ .df-bind-group {
624
+ padding: 6px 8px 2px;
625
+ color: var(--df-text-muted);
626
+ font-size: 11px;
627
+ font-weight: 650;
628
+ text-transform: lowercase;
629
+ }
630
+ .df-bind-option {
631
+ display: grid;
632
+ grid-template-columns: 1fr auto;
633
+ gap: 2px 8px;
634
+ width: 100%;
635
+ padding: 6px 8px;
636
+ border: 0;
637
+ border-radius: 6px;
638
+ background: transparent;
639
+ color: var(--df-text);
640
+ text-align: left;
641
+ cursor: pointer;
642
+ }
643
+ .df-bind-option--active,
644
+ .df-bind-option:hover { background: var(--df-hover); }
645
+ .df-bind-path {
646
+ grid-column: 1 / -1;
647
+ color: var(--df-text-muted);
648
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
649
+ font-size: 11px;
650
+ }
651
+ .df-bind-type { color: var(--df-text-muted); font-size: 11px; }
652
+ .df-bind-empty { padding: 8px; color: var(--df-text-muted); }
608
653
  `;
609
654
  //# sourceMappingURL=styles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/designer/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8lB3B,CAAC"}
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/designer/styles.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,QAAQ,GAAG,2BAA2B,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2oB3B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,8 @@ export { TemplateValidationError, validateTemplate } from "./validate.js";
6
6
  export type { TemplateValidationIssue, TemplateValidationResult } from "./validate.js";
7
7
  export { cloneTemplate, createTemplate, deserializeTemplate, serializeTemplate } from "./serialize.js";
8
8
  export { isBindingPath, parseBindingPath } from "./binding-path.js";
9
+ export { collectionKey, discoverArrayBindings, discoverBindings, discoverRowBindings, filterBindingFields, rowBindingNote, rowRelativePath, } from "./binding-schema.js";
10
+ export type { BindingDiscoveryOptions, BindingField, BindingValueKind } from "./binding-schema.js";
9
11
  export type { BindingPathResult } from "./binding-path.js";
10
12
  export { formatBindingValue, parsePreviewData, resolveBinding, resolveElementData, resolveTemplateData, } from "./binding.js";
11
13
  export type { BindingLookup, BindingMissReason, JsonPrimitive, JsonValue, PreviewDataResult, ImageResolutionSource, ResolvedDocument, ResolvedElement, ResolvedImageElement, ResolvedItemsElement, ResolvedTextElement, ResolvedTotalsElement, TextResolutionSource, } from "./binding.js";
@@ -19,7 +21,7 @@ export { RenderError } from "./render/errors.js";
19
21
  export { renderToHTML } from "./render/render-html.js";
20
22
  export type { RenderOptions } from "./render/render-html.js";
21
23
  export type { ImageSourcePolicy } from "./render/image-policy.js";
22
- export { BindingExpressionError, bindingTemplateExpression, createDocumentSaveResult, deserializeDocumentSaveResult, generateBindingHtml, interpolateBindingHtml, serializeDocumentSaveResult, } from "./render/binding-template.js";
24
+ export { BindingExpressionError, bindingTemplateExpression, createDocumentSaveResult, deserializeDocumentSaveResult, generateBindingHtml, generateHTML, interpolateBindingHtml, serializeDocumentSaveResult, } from "./render/binding-template.js";
23
25
  export type { DocumentSaveResult } from "./render/binding-template.js";
24
26
  export { exampleJobsReportTemplate } from "./examples/jobs-report.js";
25
27
  export { exampleJobsReportData, exampleJobsReportDataAlternate, exampleJobsReportDataEmpty, exampleJobsReportDataLarge, } from "./examples/jobs-report-data.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,6 +3,7 @@ export { AGGREGATES, DATE_FORMAT_STYLES, ELEMENT_TYPES, BORDER_STYLES, FONT_STYL
3
3
  export { TemplateValidationError, validateTemplate } from "./validate.js";
4
4
  export { cloneTemplate, createTemplate, deserializeTemplate, serializeTemplate } from "./serialize.js";
5
5
  export { isBindingPath, parseBindingPath } from "./binding-path.js";
6
+ export { collectionKey, discoverArrayBindings, discoverBindings, discoverRowBindings, filterBindingFields, rowBindingNote, rowRelativePath, } from "./binding-schema.js";
6
7
  export { formatBindingValue, parsePreviewData, resolveBinding, resolveElementData, resolveTemplateData, } from "./binding.js";
7
8
  export { InvoiceCalculationError, calculateInvoice } from "./invoice/calculate.js";
8
9
  export { prepareInvoiceContext } from "./invoice/context.js";
@@ -10,7 +11,7 @@ export { formatScalar } from "./invoice/format.js";
10
11
  export { BLANK_GROUP_LABEL, prepareReportTable, ReportProcessingError } from "./report/process.js";
11
12
  export { RenderError } from "./render/errors.js";
12
13
  export { renderToHTML } from "./render/render-html.js";
13
- export { BindingExpressionError, bindingTemplateExpression, createDocumentSaveResult, deserializeDocumentSaveResult, generateBindingHtml, interpolateBindingHtml, serializeDocumentSaveResult, } from "./render/binding-template.js";
14
+ export { BindingExpressionError, bindingTemplateExpression, createDocumentSaveResult, deserializeDocumentSaveResult, generateBindingHtml, generateHTML, interpolateBindingHtml, serializeDocumentSaveResult, } from "./render/binding-template.js";
14
15
  export { exampleJobsReportTemplate } from "./examples/jobs-report.js";
15
16
  export { exampleJobsReportData, exampleJobsReportDataAlternate, exampleJobsReportDataEmpty, exampleJobsReportDataLarge, } from "./examples/jobs-report-data.js";
16
17
  export { exampleFullInvoiceTemplate } from "./examples/full-invoice.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAkDpB,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEvG,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGpE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAiBtB,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAOnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGnG,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,EACnB,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAC1G,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,iBAAiB,EACjB,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,WAAW,EACX,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAkDpB,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG1E,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEvG,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AAiBtB,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAOnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAGnG,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,wBAAwB,EACxB,6BAA6B,EAC7B,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,2BAA2B,GAC5B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EAAE,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EACL,qBAAqB,EACrB,8BAA8B,EAC9B,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,+BAA+B,EAAE,MAAM,iCAAiC,CAAC;AAC1G,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,UAAU,EACV,2BAA2B,EAC3B,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,EACnB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,YAAY,EACZ,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC"}
@@ -33,10 +33,17 @@ export declare function serializeDocumentSaveResult(result: DocumentSaveResult):
33
33
  * The HTML string is returned as it was stored. Bindings inside it are not resolved.
34
34
  */
35
35
  export declare function deserializeDocumentSaveResult(json: string): DocumentSaveResult;
36
+ /**
37
+ * Fills a generated DocForge HTML template and returns the populated HTML string.
38
+ * `dataPayload` supplies the values. `generatedHTML` is the template with `${path}` placeholders.
39
+ * The result is a string. This function does not render, print, download, or create a PDF.
40
+ */
41
+ export declare function generateHTML(dataPayload: unknown, generatedHTML: string): string;
36
42
  /**
37
43
  * Fills approved template expressions from `data`.
38
44
  * Root expressions read the document. An items table repeats its first body row for `data-items-path`.
39
- * Row expressions read the current item. A path that is absent on the item is read from the document root.
45
+ * Row expressions read the current item. A path prefixed with the collection name, such as `details.itemName` for `invoice.details`, reads `itemName` on that item.
46
+ * An unprefixed path that is absent on the item is read from the document root.
40
47
  * Text is escaped. Image sources must pass the image URL policy. Missing values become empty text.
41
48
  * Property lookup uses the binding parser. Data is never executed.
42
49
  */
@@ -1 +1 @@
1
- {"version":3,"file":"binding-template.d.ts","sourceRoot":"","sources":["../../src/render/binding-template.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAoDrD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;gBAE1B,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ;CAOvD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CA0BtE;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAG3E;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAQ9E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAoB9E;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAwB1E"}
1
+ {"version":3,"file":"binding-template.d.ts","sourceRoot":"","sources":["../../src/render/binding-template.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAoDrD;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,QAAQ,CAAC;gBAE1B,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAG,QAAQ;CAOvD;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CA0BtE;AAED,6FAA6F;AAC7F,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAG3E;AAED,wEAAwE;AACxE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAQ9E;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAoB9E;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAwB1E"}
@@ -1,3 +1,4 @@
1
+ import { rowRelativePath } from "../binding-schema.js";
1
2
  import { formatBindingValue, resolveBinding } from "../binding.js";
2
3
  import { parseBindingPath } from "../binding-path.js";
3
4
  import { createTemplate } from "../serialize.js";
@@ -112,10 +113,19 @@ export function deserializeDocumentSaveResult(json) {
112
113
  }
113
114
  return { template: createTemplate(parsed.template), html: parsed.html };
114
115
  }
116
+ /**
117
+ * Fills a generated DocForge HTML template and returns the populated HTML string.
118
+ * `dataPayload` supplies the values. `generatedHTML` is the template with `${path}` placeholders.
119
+ * The result is a string. This function does not render, print, download, or create a PDF.
120
+ */
121
+ export function generateHTML(dataPayload, generatedHTML) {
122
+ return interpolateBindingHtml(generatedHTML, dataPayload);
123
+ }
115
124
  /**
116
125
  * Fills approved template expressions from `data`.
117
126
  * Root expressions read the document. An items table repeats its first body row for `data-items-path`.
118
- * Row expressions read the current item. A path that is absent on the item is read from the document root.
127
+ * Row expressions read the current item. A path prefixed with the collection name, such as `details.itemName` for `invoice.details`, reads `itemName` on that item.
128
+ * An unprefixed path that is absent on the item is read from the document root.
119
129
  * Text is escaped. Image sources must pass the image URL policy. Missing values become empty text.
120
130
  * Property lookup uses the binding parser. Data is never executed.
121
131
  */
@@ -154,7 +164,7 @@ function expandItemsTable(tableHtml, data) {
154
164
  const records = itemRecords(data, attrs["data-items-path"] ?? "");
155
165
  const body = records.length === 0
156
166
  ? emptyItemsRow(attrs["data-empty-text"], row.full)
157
- : records.map((record) => replaceExpressions(row.full, record, data)).join("");
167
+ : records.map((record) => replaceExpressions(row.full, record, data, attrs["data-items-path"])).join("");
158
168
  return (replaceExpressions(tableHtml.slice(0, tbody.innerStart), data, data) +
159
169
  body +
160
170
  replaceExpressions(tableHtml.slice(tbody.innerEnd), data, data));
@@ -195,13 +205,13 @@ function firstCellStyle(rowHtml) {
195
205
  const style = /\bstyle="([^"]*)"/i.exec(cell[1]);
196
206
  return style ? unescapeHtml(style[1]) : undefined;
197
207
  }
198
- function replaceExpressions(html, scope, root) {
208
+ function replaceExpressions(html, scope, root, collectionPath) {
199
209
  const expression = /\$\{([A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*|\[(?:0|[1-9][0-9]*)\])*)\}/g;
200
210
  return html.replace(expression, (_match, body, offset) => {
201
211
  if (!TEMPLATE_EXPRESSION.test(body)) {
202
212
  return "";
203
213
  }
204
- const scalar = lookupScalar(scope, root, expressionToBindingPath(body));
214
+ const scalar = lookupScalar(scope, root, expressionToBindingPath(body), collectionPath);
205
215
  if (scalar === null) {
206
216
  return "";
207
217
  }
@@ -211,16 +221,18 @@ function replaceExpressions(html, scope, root) {
211
221
  return escapeHtml(scalar);
212
222
  });
213
223
  }
214
- function lookupScalar(scope, root, path) {
215
- const parsed = parseBindingPath(path);
224
+ function lookupScalar(scope, root, path, collectionPath) {
225
+ const relative = collectionPath === undefined ? path : rowRelativePath(collectionPath, path);
226
+ const parsed = parseBindingPath(relative);
216
227
  if (!parsed.valid) {
217
228
  return null;
218
229
  }
219
- const local = resolveBinding(scope, path);
230
+ const local = resolveBinding(scope, relative);
220
231
  if (local.status === "found") {
221
232
  return formatBindingValue(local.value);
222
233
  }
223
- if (local.reason === "absent" && scope !== root) {
234
+ const prefixed = relative !== path;
235
+ if (!prefixed && local.reason === "absent" && scope !== root) {
224
236
  const parent = resolveBinding(root, path);
225
237
  if (parent.status === "found") {
226
238
  return formatBindingValue(parent.value);