@framv/docs 0.1.0

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.
package/dist/cdn.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import "./element.js";
2
+ import "./export.js";
3
+ export { FramvDoc } from "./doc.js";
4
+ export { FramvDocsElement } from "./element.js";
5
+ //# sourceMappingURL=cdn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.d.ts","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AACtB,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
package/dist/cdn.js ADDED
@@ -0,0 +1,5 @@
1
+ import "./element.js";
2
+ import "./export.js";
3
+ export { FramvDoc } from "./doc.js";
4
+ export { FramvDocsElement } from "./element.js";
5
+ //# sourceMappingURL=cdn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.js","sourceRoot":"","sources":["../src/cdn.ts"],"names":[],"mappings":"AAAA,OAAO,cAAc,CAAC;AACtB,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
package/dist/doc.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export interface DocOptions {
2
+ pageSize?: string;
3
+ orientation?: string;
4
+ margin?: number;
5
+ content: string;
6
+ }
7
+ export declare class FramvDoc {
8
+ private options;
9
+ constructor(options: DocOptions);
10
+ render(): HTMLElement;
11
+ }
12
+ //# sourceMappingURL=doc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.d.ts","sourceRoot":"","sources":["../src/doc.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAa;gBAEhB,OAAO,EAAE,UAAU;IAI/B,MAAM,IAAI,WAAW;CAQtB"}
package/dist/doc.js ADDED
@@ -0,0 +1,15 @@
1
+ export class FramvDoc {
2
+ options;
3
+ constructor(options) {
4
+ this.options = options;
5
+ }
6
+ render() {
7
+ const el = document.createElement("framv-docs");
8
+ el.setAttribute("page-size", this.options.pageSize ?? "A4");
9
+ el.setAttribute("orientation", this.options.orientation ?? "portrait");
10
+ el.setAttribute("margin", String(this.options.margin ?? 20));
11
+ el.innerHTML = this.options.content;
12
+ return el;
13
+ }
14
+ }
15
+ //# sourceMappingURL=doc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc.js","sourceRoot":"","sources":["../src/doc.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,QAAQ;IACX,OAAO,CAAa;IAE5B,YAAY,OAAmB;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAChD,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;QAC5D,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,UAAU,CAAC,CAAC;QACvE,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QAC7D,EAAE,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * `<framv-docs>` — multi-page document container.
3
+ *
4
+ * Attributes:
5
+ * page-size — A4, A3, A5, letter, legal (default: A4)
6
+ * orientation — portrait, landscape (default: portrait)
7
+ * margin — page margin in mm (default: 20)
8
+ * format — export format (pdf, png; default: pdf)
9
+ *
10
+ * Children are auto-paginated. Use <div class="framv-page-break"> to force a page break.
11
+ */
12
+ export declare class FramvDocsElement extends HTMLElement {
13
+ static observedAttributes: string[];
14
+ private _inner;
15
+ private _toolbar;
16
+ private _pdfBtn;
17
+ private _savedContent;
18
+ private _initialized;
19
+ get pageSize(): string;
20
+ get orientation(): string;
21
+ get margin(): number;
22
+ get format(): string;
23
+ connectedCallback(): void;
24
+ attributeChangedCallback(): void;
25
+ private _paginate;
26
+ private _export;
27
+ }
28
+ //# sourceMappingURL=element.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.d.ts","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"AAsEA;;;;;;;;;;GAUG;AACH,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,MAAM,CAAC,kBAAkB,WAA0C;IAEnE,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAqB;IAEpC,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,YAAY,CAAS;IAE7B,IAAI,QAAQ,IAAI,MAAM,CAErB;IACD,IAAI,WAAW,IAAI,MAAM,CAExB;IACD,IAAI,MAAM,IAAI,MAAM,CAEnB;IACD,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,iBAAiB,IAAI,IAAI;IAmCzB,wBAAwB,IAAI,IAAI;IAMhC,OAAO,CAAC,SAAS;YAoDH,OAAO;CAmDtB"}
@@ -0,0 +1,233 @@
1
+ import { exportElement } from "@framv/core";
2
+ const PAGE_SIZES = {
3
+ A4: { w: 210, h: 297 },
4
+ A3: { w: 297, h: 420 },
5
+ A5: { w: 148, h: 210 },
6
+ letter: { w: 216, h: 279 },
7
+ legal: { w: 216, h: 356 },
8
+ };
9
+ const STYLES = `
10
+ :host {
11
+ display: block;
12
+ background: #e8e8e8;
13
+ min-height: 100%;
14
+ padding: 24px 0;
15
+ }
16
+ .framv-docs-inner {
17
+ display: flex;
18
+ flex-direction: column;
19
+ align-items: center;
20
+ gap: 24px;
21
+ }
22
+ .framv-page {
23
+ background: white;
24
+ box-shadow: 0 2px 16px rgba(0,0,0,0.12);
25
+ box-sizing: border-box;
26
+ overflow: hidden;
27
+ position: relative;
28
+ }
29
+ .framv-page::after {
30
+ content: attr(data-page);
31
+ position: absolute;
32
+ bottom: 8px;
33
+ left: 0; right: 0;
34
+ text-align: center;
35
+ font: 10px system-ui;
36
+ color: #999;
37
+ }
38
+ .framv-page-break {
39
+ page-break-before: always;
40
+ break-before: page;
41
+ }
42
+ .framv-toolbar {
43
+ display: flex; align-items: center; justify-content: center; gap: 8px;
44
+ padding: 8px 16px;
45
+ background: rgba(0,0,0,0.7); backdrop-filter: blur(6px);
46
+ color: #fff; font: 12px system-ui;
47
+ position: sticky; top: 0; z-index: 10;
48
+ border-radius: 0 0 8px 8px;
49
+ width: fit-content; margin: 0 auto 16px auto;
50
+ }
51
+ .framv-toolbar button {
52
+ background: none; border: 1px solid rgba(255,255,255,0.2);
53
+ color: inherit; cursor: pointer;
54
+ padding: 4px 10px; font: inherit; border-radius: 4px;
55
+ }
56
+ .framv-toolbar button:hover { background: rgba(255,255,255,0.15); }
57
+ .framv-toolbar .btn-pdf { border-color: #50fa7b; color: #50fa7b; }
58
+ .framv-toolbar .btn-print { border-color: #8be9fd; color: #8be9fd; }
59
+ .framv-info {
60
+ color: rgba(255,255,255,0.6); font-size: 11px;
61
+ }
62
+ @media print {
63
+ :host { background: white; padding: 0; }
64
+ .framv-toolbar { display: none !important; }
65
+ .framv-page { box-shadow: none; break-inside: avoid; margin: 0; }
66
+ }
67
+ `;
68
+ /**
69
+ * `<framv-docs>` — multi-page document container.
70
+ *
71
+ * Attributes:
72
+ * page-size — A4, A3, A5, letter, legal (default: A4)
73
+ * orientation — portrait, landscape (default: portrait)
74
+ * margin — page margin in mm (default: 20)
75
+ * format — export format (pdf, png; default: pdf)
76
+ *
77
+ * Children are auto-paginated. Use <div class="framv-page-break"> to force a page break.
78
+ */
79
+ export class FramvDocsElement extends HTMLElement {
80
+ static observedAttributes = ["page-size", "orientation", "margin"];
81
+ _inner;
82
+ _toolbar;
83
+ _pdfBtn;
84
+ // Saved original content for re-pagination on attribute change
85
+ _savedContent = null;
86
+ _initialized = false;
87
+ get pageSize() {
88
+ return this.getAttribute("page-size") ?? "A4";
89
+ }
90
+ get orientation() {
91
+ return this.getAttribute("orientation") ?? "portrait";
92
+ }
93
+ get margin() {
94
+ return parseInt(this.getAttribute("margin") ?? "20");
95
+ }
96
+ get format() {
97
+ return this.getAttribute("format") ?? "pdf";
98
+ }
99
+ connectedCallback() {
100
+ if (this._initialized)
101
+ return;
102
+ this._initialized = true;
103
+ // Save original light DOM content before replacing innerHTML
104
+ const originalNodes = Array.from(this.childNodes);
105
+ this._savedContent = [];
106
+ for (const node of originalNodes) {
107
+ if (node instanceof HTMLElement && node.classList.contains("framv-page-break")) {
108
+ this._savedContent.push("BREAK");
109
+ }
110
+ else {
111
+ this._savedContent.push(node.cloneNode(true));
112
+ }
113
+ }
114
+ this.innerHTML = `
115
+ <style>${STYLES}</style>
116
+ <div class="framv-toolbar">
117
+ <span class="framv-info"></span>
118
+ <button class="btn-pdf">⬇ Export PDF</button>
119
+ <button class="btn-print">🖨 Print</button>
120
+ </div>
121
+ <div class="framv-docs-inner"></div>
122
+ `;
123
+ this._toolbar = this.querySelector(".framv-toolbar");
124
+ this._pdfBtn = this._toolbar.querySelector(".btn-pdf");
125
+ this._inner = this.querySelector(".framv-docs-inner");
126
+ this._paginate();
127
+ this._pdfBtn.addEventListener("click", () => this._export());
128
+ this._toolbar.querySelector(".btn-print").addEventListener("click", () => window.print());
129
+ }
130
+ attributeChangedCallback() {
131
+ if (this.isConnected && this._initialized) {
132
+ this._paginate();
133
+ }
134
+ }
135
+ _paginate() {
136
+ const size = PAGE_SIZES[this.pageSize] ?? PAGE_SIZES.A4;
137
+ const isPortrait = this.orientation !== "landscape";
138
+ const pageW = isPortrait ? size.w : size.h;
139
+ const pageH = isPortrait ? size.h : size.w;
140
+ const margin = this.margin;
141
+ // Use saved content for pagination (survives re-pagination)
142
+ const content = this._savedContent ?? [];
143
+ const pages = [];
144
+ let current = [];
145
+ for (const item of content) {
146
+ if (item === "BREAK") {
147
+ if (current.length > 0)
148
+ pages.push(current);
149
+ current = [];
150
+ }
151
+ else {
152
+ current.push(item.cloneNode(true));
153
+ }
154
+ }
155
+ if (current.length > 0)
156
+ pages.push(current);
157
+ // Clean up old pages
158
+ this._inner.innerHTML = "";
159
+ // Create pages
160
+ const contentW = pageW - margin * 2;
161
+ const contentH = pageH - margin * 2;
162
+ pages.forEach((nodes, i) => {
163
+ const page = document.createElement("div");
164
+ page.className = "framv-page";
165
+ page.dataset.page = String(i + 1);
166
+ page.style.width = `${pageW}mm`;
167
+ page.style.minHeight = `${pageH}mm`;
168
+ page.style.padding = `${margin}mm`;
169
+ const contentDiv = document.createElement("div");
170
+ contentDiv.className = "framv-page-content";
171
+ contentDiv.style.minHeight = `${contentH}mm`;
172
+ nodes.forEach((n) => contentDiv.appendChild(n));
173
+ page.appendChild(contentDiv);
174
+ this._inner.appendChild(page);
175
+ });
176
+ // Update toolbar
177
+ const info = this._toolbar.querySelector(".framv-info");
178
+ if (info)
179
+ info.textContent = `${this.pageSize.toUpperCase()} ${this.orientation} · ${pages.length} pages`;
180
+ this._pdfBtn.textContent = `⬇ Export ${this.format.toUpperCase()}`;
181
+ }
182
+ async _export() {
183
+ const size = PAGE_SIZES[this.pageSize] ?? PAGE_SIZES.A4;
184
+ const isPortrait = this.orientation !== "landscape";
185
+ const pageW = isPortrait ? size.w : size.h;
186
+ const pageH = isPortrait ? size.h : size.w;
187
+ const margin = this.margin;
188
+ const mmToPx = 3.7795275591;
189
+ const pages = this._inner.querySelectorAll(".framv-page");
190
+ try {
191
+ const { jsPDF } = await import("jspdf");
192
+ const pdf = new jsPDF({
193
+ orientation: pageW > pageH ? "l" : "p",
194
+ unit: "mm",
195
+ format: [pageW, pageH],
196
+ });
197
+ for (let i = 0; i < pages.length; i++) {
198
+ if (i > 0)
199
+ pdf.addPage();
200
+ const page = pages[i];
201
+ const pageContent = page.querySelector(".framv-page-content");
202
+ if (!pageContent)
203
+ continue;
204
+ await pdf.html(pageContent, {
205
+ x: margin,
206
+ y: margin,
207
+ width: pageW - margin * 2,
208
+ windowWidth: pageW * mmToPx,
209
+ });
210
+ }
211
+ pdf.save("framv-document.pdf");
212
+ }
213
+ catch (err) {
214
+ console.error("PDF export failed, falling back to core:", err);
215
+ // Fallback: export the first page via core exporter
216
+ const firstPage = this._inner.querySelector(".framv-page-content");
217
+ const blob = await exportElement({
218
+ element: firstPage ?? this._inner,
219
+ settings: { format: "pdf", width: pageW * mmToPx, height: pageH * mmToPx },
220
+ });
221
+ const url = URL.createObjectURL(blob);
222
+ const a = document.createElement("a");
223
+ a.href = url;
224
+ a.download = "framv-document.pdf";
225
+ a.click();
226
+ URL.revokeObjectURL(url);
227
+ }
228
+ }
229
+ }
230
+ if (!customElements.get("framv-docs")) {
231
+ customElements.define("framv-docs", FramvDocsElement);
232
+ }
233
+ //# sourceMappingURL=element.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../src/element.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=export.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":""}
package/dist/export.js ADDED
@@ -0,0 +1,34 @@
1
+ import { registerExporter } from "@framv/core";
2
+ registerExporter("pdf", async (element, settings, { freezer, renderer }) => {
3
+ const { jsPDF } = await import("jspdf");
4
+ const w = settings.width ?? (element instanceof SVGElement ? 800 : element.clientWidth || 800);
5
+ const h = settings.height ?? (element instanceof SVGElement ? 600 : element.clientHeight || 600);
6
+ const orientation = w > h ? "l" : "p";
7
+ const pdf = new jsPDF({
8
+ orientation,
9
+ unit: "px",
10
+ format: [w, h],
11
+ });
12
+ if (!(element instanceof SVGElement)) {
13
+ await pdf.html(element, {
14
+ x: 0,
15
+ y: 0,
16
+ width: w,
17
+ windowWidth: w,
18
+ });
19
+ }
20
+ else {
21
+ // Fallback for raw SVG elements
22
+ const frozen = await freezer.freezeAll(element);
23
+ const canvas = await renderer.renderToCanvas(frozen, settings.width, settings.height);
24
+ const blob = await canvas.convertToBlob({ type: "image/jpeg", quality: settings.quality ?? 0.95 });
25
+ const imgData = await new Promise((resolve) => {
26
+ const reader = new FileReader();
27
+ reader.onloadend = () => resolve(reader.result);
28
+ reader.readAsDataURL(blob);
29
+ });
30
+ pdf.addImage(imgData, "JPEG", 0, 0, canvas.width, canvas.height);
31
+ }
32
+ return pdf.output("blob");
33
+ });
34
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAmD,MAAM,aAAa,CAAC;AAEhG,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAoC,EAAE,QAAwB,EAAE,EAAE,OAAO,EAAE,QAAQ,EAA0D,EAAE,EAAE;IAC9K,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;IAExC,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,IAAI,CAAC,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI,GAAG,CAAC,CAAC;IAC/F,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,YAAY,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC;QACpB,WAAW;QACX,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;KACf,CAAC,CAAC;IAEH,IAAI,CAAC,CAAC,OAAO,YAAY,UAAU,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;YACtB,CAAC,EAAE,CAAC;YACJ,CAAC,EAAE,CAAC;YACJ,KAAK,EAAE,CAAC;YACR,WAAW,EAAE,CAAC;SACf,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,gCAAgC;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC,CAAC;QACnG,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACpD,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;YAChC,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAgB,CAAC,CAAC;YAC1D,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import "./export.js";
2
+ export { FramvDoc } from "./doc.js";
3
+ export { FramvDocsElement } from "./element.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ import "./export.js";
2
+ export { FramvDoc } from "./doc.js";
3
+ export { FramvDocsElement } from "./element.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AACrB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@framv/docs",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js",
11
+ "default": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "scripts": {
18
+ "build": "tsc -b && npm run bundle",
19
+ "prepublishOnly": "npm run build",
20
+ "bundle": "esbuild src/index.ts --bundle --format=esm --external:@framv/core --external:jspdf --outfile=dist/bundle.esm.js && esbuild src/cdn.ts --bundle --format=iife --global-name=FramvDocs --outfile=dist/bundle.iife.js"
21
+ },
22
+ "dependencies": {
23
+ "@framv/core": "*",
24
+ "jspdf": "^4.2.0"
25
+ },
26
+ "devDependencies": {
27
+ "esbuild": "^0.27.2",
28
+ "typescript": "^5.9.3"
29
+ },
30
+ "author": "Mens Reversa",
31
+ "license": "MIT",
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "https://github.com/mensreversa/framv.git",
35
+ "directory": "packages/docs"
36
+ },
37
+ "bugs": {
38
+ "url": "https://github.com/mensreversa/framv/issues"
39
+ }
40
+ }