@uurtech/jdf 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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 JDF Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # jdf.js
2
+
3
+ [![npm](https://img.shields.io/npm/v/jdfjs.svg)](https://www.npmjs.com/package/jdfjs)
4
+ [![license](https://img.shields.io/npm/l/jdfjs.svg)](LICENSE)
5
+
6
+ Render [JDF (JSON Document Format)](https://github.com/uurtech/jdf) files in any web page with a single tag. Like PDF.js — but the file you point at is plain JSON, so you can also generate it, diff it, and edit it with any tool.
7
+
8
+ ```html
9
+ <link rel="stylesheet" href="https://unpkg.com/jdfjs/dist/jdfjs.css">
10
+ <script type="module" src="https://unpkg.com/jdfjs"></script>
11
+
12
+ <jdf src="/whitepaper.jdf"></jdf>
13
+ ```
14
+
15
+ That's the whole thing. Every `<jdf>` tag on the page is detected on load and rendered in place.
16
+
17
+ ## Install
18
+
19
+ ```bash
20
+ npm install jdfjs
21
+ ```
22
+
23
+ Or via CDN — no install at all:
24
+
25
+ ```html
26
+ <script type="module" src="https://unpkg.com/jdfjs"></script>
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ```html
32
+ <jdf src="/doc.jdf"></jdf>
33
+
34
+ <!-- Configure with attributes -->
35
+ <jdf src="/doc.jdf"
36
+ width="800"
37
+ height="600"
38
+ zoom="1.2"
39
+ sidebar="true"
40
+ dark-mode="auto"></jdf>
41
+ ```
42
+
43
+ That is the only embed form. The `<jdf>` element is registered as a custom element with reactive attributes — change `src` programmatically and the embed updates:
44
+
45
+ ```js
46
+ document.querySelector("jdf").setAttribute("src", "/other.jdf");
47
+ ```
48
+
49
+ ## Configuration
50
+
51
+ | Attribute | Type | Default | Notes |
52
+ |---|---|---|---|
53
+ | `src` | string | required | URL to a `.jdf` file |
54
+ | `width` | number (px) or any CSS length | — | e.g. `"800"` or `"100%"` |
55
+ | `height` | number (px) or any CSS length | `600px` | e.g. `"80vh"` |
56
+ | `zoom` | number | `1` | `1` = 100% |
57
+ | `fit` | `"manual"` · `"fit-width"` · `"fit-page"` | `"manual"` | Auto-zoom mode |
58
+ | `sidebar` | boolean | `false` | Show page-thumbnail sidebar |
59
+ | `toolbar` | boolean | `true` | Show toolbar (zoom, page nav) |
60
+ | `dark-mode` | `"auto"` · `"light"` · `"dark"` | `"auto"` | Follows OS by default |
61
+ | `page` | integer (0-based) | `0` | Initial page |
62
+ | `manual` | boolean | — | Skip auto-init for this element |
63
+
64
+ ## Programmatic API
65
+
66
+ For full control, install via npm and call the JS API directly:
67
+
68
+ ```js
69
+ import { embed, render, JDFViewer, jdf } from "jdfjs";
70
+ import "jdfjs/style.css";
71
+
72
+ // 1. Embed by URL into any container
73
+ const v = await embed("#viewer", "/doc.jdf", {
74
+ zoom: 1.2,
75
+ sidebar: true,
76
+ width: "100%",
77
+ height: "80vh",
78
+ fit: "fit-width",
79
+ onPageChange: (i) => console.log("on page", i),
80
+ onLoad: (doc) => console.log("loaded", doc.meta.title),
81
+ });
82
+ v.goToPage(2);
83
+ v.setZoom(1.5);
84
+ v.destroy();
85
+
86
+ // 2. Render an in-memory document (no fetch)
87
+ import type { JdfDocument } from "jdfjs";
88
+ const doc: JdfDocument = {
89
+ $jdf: "1.0.0",
90
+ meta: { title: "Generated", pageSize: "A4" },
91
+ pages: [{
92
+ elements: [
93
+ { type: "text", content: "Hello", heading: 1, position: { x: 0, y: 5 }, width: 166 }
94
+ ],
95
+ }],
96
+ };
97
+ render("#out", doc);
98
+
99
+ // 3. Class form for advanced wiring
100
+ const el = document.getElementById("v")!;
101
+ const v3 = new JDFViewer(el, doc, { darkMode: "dark" });
102
+ v3.setDocument(otherDoc); // hot-swap
103
+ ```
104
+
105
+ ## SPAs / async content
106
+
107
+ Auto-init runs on `DOMContentLoaded` and watches the DOM with a `MutationObserver`, so `<jdf>` tags added later are picked up automatically. To trigger a manual scan after a route change:
108
+
109
+ ```js
110
+ import { jdf } from "jdfjs";
111
+ jdf(); // scan the whole document
112
+ jdf(myContainer); // scan only inside myContainer
113
+ ```
114
+
115
+ To opt out per element, add `manual`. To disable auto-init globally, set `window.JDFjsAutoInit = false` **before** loading the script.
116
+
117
+ ## Hosting your `.jdf` file
118
+
119
+ JDF files are static JSON — every static host works. Suggested response headers:
120
+
121
+ ```
122
+ Content-Type: application/json
123
+ Cache-Control: public, max-age=3600
124
+ Access-Control-Allow-Origin: *
125
+ ```
126
+
127
+ The fetch needs CORS allowed if the JDF is on a different origin from your page.
128
+
129
+ ## Browser support
130
+
131
+ Chrome 88+, Firefox 87+, Safari 14+, Edge 88+.
132
+
133
+ ## Feature parity with the desktop reader
134
+
135
+ jdf.js renders every JDF element type the [desktop Reader](https://github.com/uurtech/jdf) does:
136
+
137
+ - `text` (with `heading: 1-6`, `align`, `tocEntry`, internal/external `link`)
138
+ - `richtext` (per-run `bold`/`italic`/`underline`/`strikethrough`/`color`/`fontSize`/`fontFamily`/`link`)
139
+ - `image` (embedded base64 or URL/path; `fit: contain|cover|fill|none`)
140
+ - `table` (headers, alternating rows, configurable borders, column alignment, cell-level styles)
141
+ - `list` (ordered / unordered, mixed nested)
142
+ - `shape` (rect, circle, ellipse, line, SVG path; fill, stroke, opacity)
143
+ - `collapsible` (expandable section)
144
+ - `toc` (auto-generated, hierarchical, click-to-navigate)
145
+
146
+ Plus headers/footers (template strings or full element trees), custom page sizes, doc-level / per-page orientation, and internal `#page-N` link navigation.
147
+
148
+ ## License
149
+
150
+ MIT — see [LICENSE](https://github.com/uurtech/jdf/blob/master/LICENSE).
151
+
152
+ By [Ugur Kazdal](https://uurtech.com) ([@uurtech](https://github.com/uurtech)).
package/dist/jdfjs.cjs ADDED
@@ -0,0 +1,12 @@
1
+ 'use strict';var J={A3:{width:297,height:420},A4:{width:210,height:297},A5:{width:148,height:210},Letter:{width:215.9,height:279.4},Legal:{width:215.9,height:355.6},Tabloid:{width:279.4,height:431.8}},N={top:25,right:20,bottom:25,left:20},A=3.7795275591,Z=96,V=1.3333333333;function f(e,t="mm"){switch(t){case "mm":return e*A;case "in":return e*Z;case "pt":return e*V;case "px":return e;default:return e*A}}function R(e,t="portrait"){let n=typeof e=="string"?J[e]:e;return t==="landscape"?{width:n.height,height:n.width}:{...n}}function H(e){if(typeof e=="number")return `${e}px`;if(typeof e=="string")return e;let{top:t=0,right:n=0,bottom:r=0,left:o=0}=e;return `${t}px ${n}px ${r}px ${o}px`}function m(e){let t={};if(e.fontFamily&&(t["font-family"]=e.fontFamily),e.fontSize&&(t["font-size"]=`${e.fontSize*1.333}px`),e.fontWeight&&(t["font-weight"]=String(e.fontWeight)),e.fontStyle&&(t["font-style"]=e.fontStyle),e.color&&(t.color=e.color),e.backgroundColor&&(t["background-color"]=e.backgroundColor),e.textAlign&&(t["text-align"]=e.textAlign),e.textDecoration){let n=e.textDecoration==="strikethrough"?"line-through":e.textDecoration;t["text-decoration"]=n;}return e.lineHeight&&(t["line-height"]=String(e.lineHeight)),e.letterSpacing!=null&&(t["letter-spacing"]=typeof e.letterSpacing=="number"?`${e.letterSpacing}px`:e.letterSpacing),e.padding!=null&&(t.padding=H(e.padding)),e.margin!=null&&(t.margin=H(e.margin)),e.marginTop!=null&&(t["margin-top"]=`${e.marginTop}px`),e.marginBottom!=null&&(t["margin-bottom"]=`${e.marginBottom}px`),e.border&&(t.border=e.border),e.borderRadius!=null&&(t["border-radius"]=typeof e.borderRadius=="number"?`${e.borderRadius}px`:e.borderRadius),e.opacity!=null&&(t.opacity=String(e.opacity)),t}function E(e,t){if(!e)return {};if(typeof e=="string")return m(t[e]||{});if(Array.isArray(e)){let n={};for(let r of e)n={...n,...t[r]||{}};return m(n)}return m(e)}function b(e,t){for(let[n,r]of Object.entries(t))e.style.setProperty(n,r);}function L(e){if(!e)return null;let t=typeof e=="string"?e:e.target;if(typeof e=="string"?e.startsWith("#"):e.type==="internal"){let r=t.replace(/^#/,"").match(/^page-(\d+)$/i);return r?{href:t,internal:true,pageIndex:Number(r[1])-1}:{href:t,internal:true}}return {href:t,internal:false}}function k(e,t,n){e.href=t.href,t.internal?e.addEventListener("click",r=>{t.pageIndex!=null&&n&&(r.preventDefault(),n(t.pageIndex));}):(e.target="_blank",e.rel="noopener noreferrer");}var j="http://www.w3.org/2000/svg";function w(e,t){let n=document.createElement("div");_(n,e);let r=null;switch(e.type){case "text":r=q(e,t);break;case "richtext":r=B(e,t);break;case "image":r=Q(e,t);break;case "table":r=te(e,t);break;case "list":r=ne(e,t);break;case "shape":r=re(e);break;case "collapsible":r=oe(e,t);break;case "toc":r=ie(e,t);break}return r?(n.appendChild(r),n):null}function _(e,t){let n=t;n.position&&(e.style.position="absolute",n.position.x!=null&&(e.style.left=`${f(n.position.x)}px`),n.position.y!=null&&(e.style.top=`${f(n.position.y)}px`)),n.width!=null&&(e.style.width=`${f(n.width)}px`),n.height!=null&&(e.style.height=`${f(n.height)}px`);}function q(e,t){let n=W(e.heading),r=document.createElement(n);r.className="jdfjs-text",r.style.margin="0",r.style.whiteSpace="pre-wrap",b(r,E(e.style,t.styles)),e.align&&(r.style.textAlign=e.align);let o=L(e.link);if(o){let s=document.createElement("a");k(s,o,t.onNavigatePage),s.className="jdfjs-link",s.textContent=e.content||"",r.appendChild(s);}else r.textContent=e.content||"";return r}function W(e){return e===true?"h1":typeof e=="number"&&e>=1&&e<=6?"h"+e:"p"}function B(e,t){let n=document.createElement("p");n.className="jdfjs-richtext",n.style.margin="0",b(n,E(e.style,t.styles));for(let r of e.runs||[])n.appendChild(X(r,t));return n}function G(e,t){let n={};if(e.style)if(typeof e.style=="string")Object.assign(n,m(t[e.style]||{}));else if(Array.isArray(e.style))for(let o of e.style)Object.assign(n,m(t[o]||{}));else Object.assign(n,m(e.style));e.bold&&(n["font-weight"]="bold"),e.italic&&(n["font-style"]="italic");let r=[];return e.underline&&r.push("underline"),e.strikethrough&&r.push("line-through"),r.length&&(n["text-decoration"]=r.join(" ")),e.color&&(n.color=e.color),e.fontSize&&(n["font-size"]=`${e.fontSize*1.333}px`),e.fontFamily&&(n["font-family"]=e.fontFamily),n}function X(e,t){let n=L(e.link),r=n?document.createElement("a"):document.createElement("span");return n&&(k(r,n,t.onNavigatePage),r.classList.add("jdfjs-link")),b(r,G(e,t.styles)),r.textContent=e.text,r}function U(e,t){if(!e)return;let n=e[t];if(n&&typeof n=="object"&&"data"in n)return n;let r=e.images?.[t];if(r)return r}function K(e,t){if(e.src?.startsWith("data:")||e.src?.startsWith("http"))return e.src;if(e.resource){let n=U(t,e.resource);if(n?.data){let r=n.mimeType||"image/png";return n.data.startsWith("data:")?n.data:`data:${r};base64,${n.data}`}if(n?.path)return n.path}return e.src||""}function Q(e,t){let n=document.createElement("div");n.className="jdfjs-image",n.style.width="100%",n.style.height="100%";let r=document.createElement("img");switch(r.src=K(e,t.resources),r.alt=e.alt||"",r.style.display="block",r.style.width="100%",r.style.height="100%",e.fit){case "cover":r.style.objectFit="cover";break;case "fill":r.style.objectFit="fill";break;case "none":r.style.objectFit="none";break;default:r.style.objectFit="contain";}return b(r,E(e.style,t.styles)),n.appendChild(r),n}function Y(e){return typeof e=="string"?e:e.content}function ee(e){return typeof e=="string"?{}:{colspan:e.colspan,rowspan:e.rowspan}}function te(e,t){let n=document.createElement("div");n.className="jdfjs-table-wrap",b(n,E(e.style,t.styles)),n.style.overflowX="auto";let r=(()=>{let l=e.headerStyle;if(!l)return {};if(typeof l=="string")return m(t.styles[l]||{});if(Array.isArray(l)){let p={};for(let u of l)p={...p,...m(t.styles[u]||{})};return p}return m(l)})(),o=(()=>{let l=e.rowStyle;if(!l)return {};if(typeof l=="string")return m(t.styles[l]||{});if(Array.isArray(l)){let p={};for(let u of l)p={...p,...m(t.styles[u]||{})};return p}return m(l)})(),s=(()=>{let l=e.alternateRowStyle;if(!l){let p=e.alternatingRowColor;return p?{"background-color":p}:{}}if(typeof l=="string")return m(t.styles[l]||{});if(Array.isArray(l)){let p={};for(let u of l)p={...p,...m(t.styles[u]||{})};return p}return m(l)})(),a=(()=>{let l=e.borders;return l===false?{outer:false,inner:false}:l===true||l===void 0?{outer:true,inner:true,color:"#e2e8f0",width:1}:{outer:true,inner:true,color:"#e2e8f0",width:1,...l}})(),d=e.headers??e.columns?.map(l=>l.header||"").filter(l=>l!==""),c=l=>e.columns?.[l]?.align,i=document.createElement("table");if(i.style.width="100%",i.style.borderCollapse="collapse",i.style.fontSize="14px",a.outer&&(i.style.border=`${a.width||1}px solid ${a.color||"#e2e8f0"}`),d&&d.length>0){let l=document.createElement("thead"),p=document.createElement("tr");b(p,r),d.forEach((u,x)=>{let g=document.createElement("th");g.textContent=u,g.style.padding="8px 12px",g.style.fontWeight="600",g.style.background="#f8fafc",g.style.textAlign=c(x)||"left",a.inner&&(g.style.border=`${a.width||1}px solid ${a.color||"#e2e8f0"}`),p.appendChild(g);}),l.appendChild(p),i.appendChild(l);}let h=document.createElement("tbody");return e.rows.forEach((l,p)=>{let u=document.createElement("tr");b(u,o),p%2===1&&b(u,s),l.forEach((x,g)=>{let y=document.createElement("td");y.textContent=Y(x);let v=ee(x);v.colspan&&(y.colSpan=v.colspan),v.rowspan&&(y.rowSpan=v.rowspan),y.style.padding="8px 12px",y.style.verticalAlign="top",y.style.textAlign=c(g)||"left",a.inner&&(y.style.border=`${a.width||1}px solid ${a.color||"#e2e8f0"}`),u.appendChild(y);}),h.appendChild(u);}),i.appendChild(h),n.appendChild(i),n}function ne(e,t){let n=document.createElement("div");n.className="jdfjs-list-wrap",b(n,E(e.style,t.styles));let r=e.listType??(e.ordered?"ordered":"unordered"),o=z(r);return $(o,e.items||[],r),n.appendChild(o),n}function z(e){let t=document.createElement(e==="ordered"?"ol":"ul");return t.style.margin="0",t.style.paddingLeft="20px",t.style.listStyle=e==="ordered"?"decimal":"disc",t}function $(e,t,n,r){for(let o of t){let s=document.createElement("li");if(s.style.fontSize="14px",s.style.lineHeight="1.6",s.appendChild(document.createTextNode(o.content)),o.children?.length){let a=o.listType||n,d=z(a);d.style.marginTop="4px",$(d,o.children,a),s.appendChild(d);}e.appendChild(s);}}function re(e){let t=document.createElement("div");t.className="jdfjs-shape",t.style.width="100%",t.style.height="100%";let n=e.width??100,r=e.height??100,o=e.fill??"none",s=(()=>{let i=e.stroke;return typeof i=="string"?i:i?.color?i.color:"none"})(),a=(()=>{let i=e.stroke;return typeof i=="object"&&i?.width!=null?i.width:e.strokeWidth??0})(),d=document.createElementNS(j,"svg");d.setAttribute("width","100%"),d.setAttribute("height","100%"),d.setAttribute("viewBox",`0 0 ${n} ${r}`),d.setAttribute("preserveAspectRatio","none"),d.style.display="block",d.style.overflow="visible";let c=null;switch(e.shape){case "rect":{let i=document.createElementNS(j,"rect");i.setAttribute("x","0"),i.setAttribute("y","0"),i.setAttribute("width",String(n)),i.setAttribute("height",String(r)),e.borderRadius&&i.setAttribute("rx",String(e.borderRadius)),c=i;break}case "circle":{let i=document.createElementNS(j,"circle");i.setAttribute("cx",String(n/2)),i.setAttribute("cy",String(r/2)),i.setAttribute("r",String(Math.min(n,r)/2)),c=i;break}case "ellipse":{let i=document.createElementNS(j,"ellipse");i.setAttribute("cx",String(n/2)),i.setAttribute("cy",String(r/2)),i.setAttribute("rx",String(n/2)),i.setAttribute("ry",String(r/2)),c=i;break}case "line":{let i=document.createElementNS(j,"line");return i.setAttribute("x1","0"),i.setAttribute("y1","0"),i.setAttribute("x2",String(n)),i.setAttribute("y2",String(r)),i.setAttribute("stroke",s==="none"?o!=="none"?o:"currentColor":s),i.setAttribute("stroke-width",String(a||.3)),d.appendChild(i),t.appendChild(d),t}case "path":{let i=document.createElementNS(j,"path");i.setAttribute("d",e.path||""),i.setAttribute("fill-rule","evenodd"),c=i;break}}return c&&(c.setAttribute("fill",o),c.setAttribute("stroke",s),a&&c.setAttribute("stroke-width",String(a)),d.appendChild(c)),t.appendChild(d),t}function oe(e,t){let n=document.createElement("div");n.className="jdfjs-collapsible",b(n,E(e.style,t.styles)),n.style.border="1px solid #e2e8f0",n.style.borderRadius="8px",n.style.overflow="hidden",n.style.background="#ffffff";let r=document.createElement("button");r.type="button",r.className="jdfjs-collapsible-header",r.style.width="100%",r.style.display="flex",r.style.alignItems="center",r.style.gap="8px",r.style.padding="10px 16px",r.style.fontSize="14px",r.style.fontWeight="500",r.style.background="#f8fafc",r.style.border="0",r.style.cursor="pointer",r.style.textAlign="left";let o=document.createElement("span");o.textContent="\u25B6",o.style.fontSize="10px",o.style.transition="transform 0.15s ease";let s=document.createElement("span");s.textContent=e.title||"Section",s.style.flex="1",r.appendChild(o),r.appendChild(s),n.appendChild(r);let a=document.createElement("div");a.className="jdfjs-collapsible-body",a.style.padding="12px 16px",a.style.position="relative";let d=e.expanded??false,c=()=>{a.style.display=d?"block":"none",o.style.transform=d?"rotate(90deg)":"rotate(0deg)";};c(),r.addEventListener("click",()=>{d=!d,c();});for(let i of e.elements||[]){let h=w(i,{...t,path:[...t.path,"elements"]});h&&a.appendChild(h);}return n.appendChild(a),n}function ie(e,t){let n=document.createElement("div");n.className="jdfjs-toc",b(n,E(e.style,t.styles));let r=e.depth??6,o=[];t.document.pages.forEach((s,a)=>{for(let d of s.elements){if(d.type!=="text")continue;let c=d,i=c.tocEntry||(c.heading?c.content:null);if(!i)continue;let h=typeof c.tocLevel=="number"?c.tocLevel:typeof c.heading=="number"?c.heading:1;h>r||o.push({title:i,pageIndex:a,level:h});}});for(let s of o){let a=document.createElement("button");a.type="button",a.className="jdfjs-toc-entry",a.style.display="flex",a.style.alignItems="baseline",a.style.gap="8px",a.style.width="100%",a.style.background="transparent",a.style.border="0",a.style.borderBottom="1px dotted #e2e8f0",a.style.padding=`6px 8px 6px ${(s.level-1)*16+8}px`,a.style.cursor="pointer",a.style.fontSize="14px",a.style.color="#334155",a.style.textAlign="left";let d=document.createElement("span");d.textContent=s.title,d.style.flex="1";let c=document.createElement("span");c.style.flex="1",c.style.borderBottom="1px dotted #cbd5e1",c.style.alignSelf="end",c.style.marginBottom="4px";let i=document.createElement("span");i.textContent=String(s.pageIndex+1),i.style.fontFamily="JetBrains Mono, monospace",i.style.fontSize="12px",i.style.color="#94a3b8",i.style.flexShrink="0",a.appendChild(d),a.appendChild(c),a.appendChild(i),a.addEventListener("click",()=>t.onNavigatePage?.(s.pageIndex)),n.appendChild(a);}return n}function D(e,t){return e.replace(/\{\{pageNumber\}\}/g,String(t.pageNumber)).replace(/\{\{totalPages\}\}/g,String(t.totalPages)).replace(/\{\{title\}\}/g,t.title).replace(/\{\{author\}\}/g,t.author)}async function P(e,t,n={}){let r=O(e);r.classList.add("jdfjs-loading");try{let o=await fetch(t,{headers:{Accept:"application/json,application/jdf+json"}});if(!o.ok)throw new Error(`Failed to fetch ${t} (${o.status})`);let s=await o.json();if(!s?.$jdf)throw new Error("Not a valid JDF document (missing $jdf field)");return r.classList.remove("jdfjs-loading"),I(r,s,n)}catch(o){throw r.classList.remove("jdfjs-loading"),r.classList.add("jdfjs-error"),r.innerHTML=`<div class="jdfjs-error-msg">${se(o.message)}</div>`,n.onError?.(o),o}}function I(e,t,n={}){let r=O(e);return new S(r,t,n).getInstance()}var S=class{constructor(t,n,r={}){this.resizeObs=null;this.toolbarEl=null;this.sidebarEl=null;this.observer=null;this.container=t,this.doc=n,this.options={zoom:r.zoom??1,sidebar:r.sidebar??false,toolbar:r.toolbar??true,darkMode:r.darkMode??"auto",initialPage:r.initialPage??0,fit:r.fit??"manual",...r},this.zoom=this.options.zoom,this.currentPage=this.options.initialPage,this.applyContainerSize(),this.mount(),queueMicrotask(()=>this.options.onLoad?.(this.doc));}applyContainerSize(){let t=this.options.width,n=this.options.height;t!=null&&(this.container.style.width=typeof t=="number"?`${t}px`:t),n!=null&&(this.container.style.height=typeof n=="number"?`${n}px`:n);}mount(){this.container.innerHTML="",this.container.classList.add("jdfjs"),this.options.darkMode==="dark"?this.container.classList.add("jdfjs-dark"):this.options.darkMode==="auto"&&window.matchMedia?.("(prefers-color-scheme: dark)").matches&&this.container.classList.add("jdfjs-dark"),this.root=document.createElement("div"),this.root.className="jdfjs-root",this.options.toolbar&&(this.toolbarEl=this.buildToolbar(),this.root.appendChild(this.toolbarEl));let t=document.createElement("div");t.className="jdfjs-body",this.options.sidebar&&(this.sidebarEl=this.buildSidebar(),t.appendChild(this.sidebarEl)),this.pagesEl=document.createElement("div"),this.pagesEl.className="jdfjs-pages",t.appendChild(this.pagesEl),this.root.appendChild(t),this.container.appendChild(this.root),this.renderAllPages(),this.setupScrollObserver(),this.setupResizeObserver(),this.applyFit(),this.currentPage>0&&this.scrollToPage(this.currentPage);}setupResizeObserver(){typeof ResizeObserver>"u"||(this.resizeObs?.disconnect(),this.resizeObs=new ResizeObserver(()=>this.applyFit()),this.resizeObs.observe(this.pagesEl));}applyFit(){if(this.options.fit==="manual")return;let t=this.pagesEl.querySelector(".jdfjs-page");if(!t)return;let n=parseFloat(t.style.width||"0"),r=parseFloat(t.style.minHeight||"0");if(!n||!r)return;let o=this.pagesEl.clientWidth-32,s=this.pagesEl.clientHeight-32;this.options.fit==="fit-width"?this.zoom=Math.max(.25,Math.min(3,o/n)):this.options.fit==="fit-page"&&(this.zoom=Math.max(.25,Math.min(3,Math.min(o/n,s/r)))),this.applyZoom(),this.updateIndicators();}buildToolbar(){let t=document.createElement("div");return t.className="jdfjs-toolbar",t.innerHTML=`
2
+ <span class="jdfjs-title"></span>
3
+ <div class="jdfjs-spacer"></div>
4
+ <button class="jdfjs-btn" data-act="prev" title="Previous page">\u2039</button>
5
+ <span class="jdfjs-page-indicator"></span>
6
+ <button class="jdfjs-btn" data-act="next" title="Next page">\u203A</button>
7
+ <span class="jdfjs-divider"></span>
8
+ <button class="jdfjs-btn" data-act="zoom-out" title="Zoom out">\u2212</button>
9
+ <span class="jdfjs-zoom-indicator"></span>
10
+ <button class="jdfjs-btn" data-act="zoom-in" title="Zoom in">+</button>
11
+ `,t.querySelector(".jdfjs-title").textContent=this.doc.meta?.title??"Document",this.updateIndicators(t),t.addEventListener("click",n=>{let r=n.target.closest("[data-act]");if(!r)return;let o=r.getAttribute("data-act");o==="prev"?this.goToPage(this.currentPage-1):o==="next"?this.goToPage(this.currentPage+1):o==="zoom-in"?this.setZoom(this.zoom+.1):o==="zoom-out"&&this.setZoom(this.zoom-.1);}),t}buildSidebar(){let t=document.createElement("div");return t.className="jdfjs-sidebar",this.doc.pages.forEach((n,r)=>{let o=document.createElement("button");o.className="jdfjs-sidebar-thumb",o.setAttribute("data-page",String(r)),o.innerHTML=`<span class="jdfjs-sidebar-num">${r+1}</span>`,o.addEventListener("click",()=>this.goToPage(r)),t.appendChild(o);}),t}updateIndicators(t=this.toolbarEl){if(!t)return;let n=t.querySelector(".jdfjs-page-indicator");n&&(n.textContent=`${this.currentPage+1} / ${this.doc.pages.length}`);let r=t.querySelector(".jdfjs-zoom-indicator");r&&(r.textContent=`${Math.round(this.zoom*100)}%`),this.sidebarEl&&this.sidebarEl.querySelectorAll(".jdfjs-sidebar-thumb").forEach(o=>{let s=Number(o.getAttribute("data-page"));o.classList.toggle("jdfjs-sidebar-thumb-active",s===this.currentPage);});}renderAllPages(){this.pagesEl.innerHTML="";let t=this.doc.styles??{};this.doc.pages.forEach((n,r)=>{let o=this.renderPage(n,r,t);this.pagesEl.appendChild(o);}),this.applyZoom();}renderPage(t,n,r){let o=R(t.pageSize??this.doc.meta?.pageSize??"A4",t.pageOrientation??this.doc.meta?.pageOrientation??"portrait"),s={...N,...this.doc.meta?.margins||{},...t.margins||{}},a=document.createElement("div");a.className="jdfjs-page-wrapper",a.setAttribute("data-page-index",String(n));let d=document.createElement("div");d.className="jdfjs-page",d.style.width=`${f(o.width)}px`,d.style.minHeight=`${f(o.height)}px`,t.background&&(d.style.backgroundColor=t.background);let c=t.header??this.doc.header,i=t.footer??this.doc.footer,h=c?.height??0,l=i?.height??0;if(c){let u=this.renderHeaderFooter(c,n,this.doc.pages.length,r);u.classList.add("jdfjs-header"),u.style.paddingTop=`${f(s.top/2)}px`,u.style.paddingLeft=`${f(s.left)}px`,u.style.paddingRight=`${f(s.right)}px`,d.appendChild(u);}let p=document.createElement("div");if(p.className="jdfjs-page-content",p.style.position="relative",p.style.paddingTop=`${f((s.top||0)+h)}px`,p.style.paddingRight=`${f(s.right||0)}px`,p.style.paddingBottom=`${f((s.bottom||0)+l)}px`,p.style.paddingLeft=`${f(s.left||0)}px`,t.elements.forEach((u,x)=>{let g=w(u,{styles:r,resources:this.doc.resources,document:this.doc,path:["pages",n,"elements",x],onNavigatePage:y=>this.goToPage(y)});g&&p.appendChild(g);}),d.appendChild(p),i){let u=this.renderHeaderFooter(i,n,this.doc.pages.length,r);u.classList.add("jdfjs-footer"),u.style.paddingBottom=`${f(s.bottom/2)}px`,u.style.paddingLeft=`${f(s.left)}px`,u.style.paddingRight=`${f(s.right)}px`,d.appendChild(u);}return a.appendChild(d),a}renderHeaderFooter(t,n,r,o){let s=document.createElement("div");if(t.elements?.length)t.elements.forEach((a,d)=>{let c=w(a,{styles:o,resources:this.doc.resources,document:this.doc,path:["__hf__",n,d],onNavigatePage:i=>this.goToPage(i)});c&&s.appendChild(c);});else if(t.content){let a=D(t.content,{pageNumber:n+1,totalPages:r,title:this.doc.meta?.title??"",author:this.doc.meta?.author??""}),d=document.createElement("div");d.textContent=a,Object.assign(d.style,E(t.style,o)),s.appendChild(d);}return s}setupScrollObserver(){typeof IntersectionObserver>"u"||(this.observer?.disconnect(),this.observer=new IntersectionObserver(t=>{let n=t.filter(r=>r.isIntersecting).sort((r,o)=>o.intersectionRatio-r.intersectionRatio);if(n[0]){let r=Number(n[0].target.getAttribute("data-page-index"));!isNaN(r)&&r!==this.currentPage&&(this.currentPage=r,this.updateIndicators(),this.options.onPageChange?.(r));}},{root:this.pagesEl,threshold:[.25,.5,.75]}),this.pagesEl.querySelectorAll("[data-page-index]").forEach(t=>this.observer.observe(t)));}scrollToPage(t){let n=this.pagesEl.querySelector(`[data-page-index="${t}"]`);n&&n.scrollIntoView({behavior:"smooth",block:"start"});}applyZoom(){this.pagesEl.style.setProperty("--jdfjs-zoom",String(this.zoom)),this.pagesEl.querySelectorAll(".jdfjs-page").forEach(t=>{t.style.transform=`scale(${this.zoom})`,t.style.transformOrigin="top center";});}setZoom(t){this.zoom=Math.max(.25,Math.min(3,t)),this.applyZoom(),this.updateIndicators();}getZoom(){return this.zoom}goToPage(t){let n=Math.max(0,Math.min(this.doc.pages.length-1,t));this.currentPage=n,this.scrollToPage(n),this.updateIndicators(),this.options.onPageChange?.(n);}getCurrentPage(){return this.currentPage}setDocument(t){if(this.doc=t,this.currentPage=0,this.toolbarEl){let n=this.toolbarEl.querySelector(".jdfjs-title");n&&(n.textContent=t.meta?.title??"Document");}this.sidebarEl&&(this.sidebarEl.innerHTML="",this.buildSidebar().querySelectorAll(".jdfjs-sidebar-thumb").forEach(r=>this.sidebarEl.appendChild(r))),this.renderAllPages(),this.setupScrollObserver(),this.options.onLoad?.(t);}destroy(){this.observer?.disconnect(),this.resizeObs?.disconnect(),this.container.innerHTML="",this.container.classList.remove("jdfjs","jdfjs-dark","jdfjs-loading","jdfjs-error"),this.container.style.removeProperty("width"),this.container.style.removeProperty("height");}getInstance(){return {container:this.container,document:this.doc,setZoom:t=>this.setZoom(t),getZoom:()=>this.getZoom(),goToPage:t=>this.goToPage(t),getCurrentPage:()=>this.getCurrentPage(),setDocument:t=>this.setDocument(t),destroy:()=>this.destroy()}}};function O(e){if(typeof e=="string"){let t=document.querySelector(e);if(!t)throw new Error(`jdfjs: container "${e}" not found`);return t}return e}function se(e){return e.replace(/[&<>"']/g,t=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[t])}var M=new WeakSet;function ae(e){let t={},n=l=>e.getAttribute(l),r=n("zoom");if(r!=null){let l=Number(r);isNaN(l)||(t.zoom=l);}let o=n("sidebar");o!=null&&(t.sidebar=o!=="false"&&o!=="0");let s=n("toolbar");s!=null&&(t.toolbar=s!=="false"&&s!=="0");let a=n("dark-mode")||n("darkmode");(a==="auto"||a==="light"||a==="dark")&&(t.darkMode=a);let d=n("page");if(d!=null){let l=Number(d);isNaN(l)||(t.initialPage=l);}let c=n("width");if(c!=null){let l=Number(c);t.width=isNaN(l)?c:l;}let i=n("height");if(i!=null){let l=Number(i);t.height=isNaN(l)?i:l;}let h=n("fit");return (h==="manual"||h==="fit-width"||h==="fit-page")&&(t.fit=h),t}function T(e){if(M.has(e)||e.hasAttribute("manual"))return;let t=e.getAttribute("src");if(!t)return;M.add(e);let n=e,r=ae(e);P(n,t,r).catch(o=>{console.error("[jdf.js] failed to embed",t,o),n.dispatchEvent(new CustomEvent("jdf-error",{detail:o,bubbles:true}));});}function C(e=document){e.querySelectorAll("jdf").forEach(T);}function F(){if(typeof MutationObserver>"u")return;new MutationObserver(t=>{for(let n of t)n.addedNodes.forEach(r=>{r instanceof Element&&(r.tagName.toLowerCase()==="jdf"?T(r):C(r));});}).observe(document.body,{childList:true,subtree:true});}function le(e=document){C(e);}function de(){typeof window>"u"||typeof document>"u"||window.JDFjsAutoInit!==false&&(document.readyState==="loading"?document.addEventListener("DOMContentLoaded",()=>{C(),F();},{once:true}):(C(),F()));}if(typeof customElements<"u"&&!customElements.get("jdf")){class e extends HTMLElement{static get observedAttributes(){return ["src","width","height","zoom"]}connectedCallback(){T(this);}attributeChangedCallback(n,r,o){if(r!==o){if(n==="src"&&o)M.delete(this),T(this);else if(n==="width"&&o){let s=Number(o);this.style.width=isNaN(s)?o:`${s}px`;}else if(n==="height"&&o){let s=Number(o);this.style.height=isNaN(s)?o:`${s}px`;}}}}customElements.define("jdf",e);}de();exports.JDFViewer=S;exports.embed=P;exports.jdf=le;exports.render=I;//# sourceMappingURL=jdfjs.cjs.map
12
+ //# sourceMappingURL=jdfjs.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../packages/jdf-core/src/defaults.ts","../src/utils/style.ts","../src/utils/link.ts","../src/renderers/element.ts","../src/utils/template.ts","../src/viewer.ts","../src/auto-init.ts"],"names":["PAGE_SIZES","DEFAULT_MARGINS","MM_TO_PX","IN_TO_PX","PT_TO_PX","unitToPx","value","unit","getPageDimensions","pageSize","orientation","size","paddingToCss","p","top","right","bottom","left","styleToCss","style","css","td","resolveStyle","ref","styles","merged","k","applyStyle","el","v","resolveLink","link","target","m","attachLinkBehaviour","resolved","onNavigatePage","e","NS_SVG","renderElement","ctx","wrap","applyPositionAndSize","inner","renderText","renderRichText","renderImage","renderTable","renderList","renderShape","renderCollapsible","renderToc","any","tag","textTag","node","a","h","run","renderRun","runCss","s","decos","lookupResource","resources","key","direct","inImages","imageSrc","res","mime","img","cellText","c","cellAttrs","headerCss","rowCss","altRowCss","borders","b","headers","colAlign","i","table","thead","tr","th","tbody","row","ri","cell","ci","attrs","defaultType","root","listElementForType","buildItems","t","parent","items","def","item","li","childType","nested","w","fill","strokeColor","strokeWidth","svg","shapeNode","r","l","header","arrow","titleSpan","body","expanded","apply","child","depth","entries","page","pi","title","level","entry","btn","filler","num","resolveTemplate","text","vars","embed","container","url","options","resolveContainer","doc","render","err","escapeHtml","document","JDFViewer","firstPage","pageWidth","pageHeight","containerWidth","containerHeight","tb","act","sb","_","idx","pageInd","zoomInd","pageEl","pageIndex","dim","margins","wrapper","footer","headerH","footerH","content","elIdx","f","hf","totalPages","div","span","visible","z","clamped","d","found","PROCESSED","readOptions","opts","attr","name","zoom","n","dm","fit","processElement","src","scan","watchForNewTargets","mutations","jdf","autoInit","JdfElement","oldVal","newVal"],"mappings":"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","file":"jdfjs.cjs","sourcesContent":["import type { Margins, CustomPageSize, PageSizeName } from \"./types\";\n\nexport const PAGE_SIZES: Record<PageSizeName, CustomPageSize> = {\n A3: { width: 297, height: 420 },\n A4: { width: 210, height: 297 },\n A5: { width: 148, height: 210 },\n Letter: { width: 215.9, height: 279.4 },\n Legal: { width: 215.9, height: 355.6 },\n Tabloid: { width: 279.4, height: 431.8 },\n};\n\nexport const DEFAULT_MARGINS: Margins = { top: 25, right: 20, bottom: 25, left: 20 };\nexport const MM_TO_PX = 3.7795275591;\nexport const IN_TO_PX = 96;\nexport const PT_TO_PX = 1.3333333333;\n\nexport function unitToPx(value: number, unit: string = \"mm\"): number {\n switch (unit) {\n case \"mm\": return value * MM_TO_PX;\n case \"in\": return value * IN_TO_PX;\n case \"pt\": return value * PT_TO_PX;\n case \"px\": return value;\n default: return value * MM_TO_PX;\n }\n}\n\nexport function getPageDimensions(pageSize: PageSizeName | CustomPageSize, orientation: \"portrait\" | \"landscape\" = \"portrait\"): CustomPageSize {\n const size = typeof pageSize === \"string\" ? PAGE_SIZES[pageSize] : pageSize;\n if (orientation === \"landscape\") return { width: size.height, height: size.width };\n return { ...size };\n}\n","import type { Style, StyleRef } from \"@jdf/core\";\n\nfunction paddingToCss(p: NonNullable<Style[\"padding\"]>): string {\n if (typeof p === \"number\") return `${p}px`;\n if (typeof p === \"string\") return p;\n const { top = 0, right = 0, bottom = 0, left = 0 } = p;\n return `${top}px ${right}px ${bottom}px ${left}px`;\n}\n\nexport function styleToCss(style: Style): Record<string, string> {\n const css: Record<string, string> = {};\n if (style.fontFamily) css[\"font-family\"] = style.fontFamily;\n if (style.fontSize) css[\"font-size\"] = `${style.fontSize * 1.333}px`;\n if (style.fontWeight) css[\"font-weight\"] = String(style.fontWeight);\n if (style.fontStyle) css[\"font-style\"] = style.fontStyle;\n if (style.color) css[\"color\"] = style.color;\n if (style.backgroundColor) css[\"background-color\"] = style.backgroundColor;\n if (style.textAlign) css[\"text-align\"] = style.textAlign;\n if (style.textDecoration) {\n const td = style.textDecoration === \"strikethrough\" ? \"line-through\" : style.textDecoration;\n css[\"text-decoration\"] = td;\n }\n if (style.lineHeight) css[\"line-height\"] = String(style.lineHeight);\n if (style.letterSpacing != null) {\n css[\"letter-spacing\"] = typeof style.letterSpacing === \"number\" ? `${style.letterSpacing}px` : style.letterSpacing;\n }\n if (style.padding != null) css[\"padding\"] = paddingToCss(style.padding);\n if (style.margin != null) css[\"margin\"] = paddingToCss(style.margin as any);\n if (style.marginTop != null) css[\"margin-top\"] = `${style.marginTop}px`;\n if (style.marginBottom != null) css[\"margin-bottom\"] = `${style.marginBottom}px`;\n if (style.border) css[\"border\"] = style.border;\n if (style.borderRadius != null) {\n css[\"border-radius\"] = typeof style.borderRadius === \"number\" ? `${style.borderRadius}px` : style.borderRadius;\n }\n if (style.opacity != null) css[\"opacity\"] = String(style.opacity);\n return css;\n}\n\nexport function resolveStyle(ref: StyleRef | undefined, styles: Record<string, Style>): Record<string, string> {\n if (!ref) return {};\n if (typeof ref === \"string\") return styleToCss(styles[ref] || {});\n if (Array.isArray(ref)) {\n let merged: Style = {};\n for (const k of ref) merged = { ...merged, ...(styles[k] || {}) };\n return styleToCss(merged);\n }\n return styleToCss(ref);\n}\n\n/** Apply a CSS object map to an HTMLElement. */\nexport function applyStyle(el: HTMLElement, css: Record<string, string>) {\n for (const [k, v] of Object.entries(css)) el.style.setProperty(k, v);\n}\n","import type { Link } from \"@jdf/core\";\n\nexport interface ResolvedLink {\n href: string;\n internal: boolean;\n pageIndex?: number;\n}\n\nexport function resolveLink(link: Link | undefined): ResolvedLink | null {\n if (!link) return null;\n const target = typeof link === \"string\" ? link : link.target;\n const internal = typeof link === \"string\" ? link.startsWith(\"#\") : link.type === \"internal\";\n if (internal) {\n const m = target.replace(/^#/, \"\").match(/^page-(\\d+)$/i);\n if (m) return { href: target, internal: true, pageIndex: Number(m[1]) - 1 };\n return { href: target, internal: true };\n }\n return { href: target, internal: false };\n}\n\nexport function attachLinkBehaviour(\n el: HTMLAnchorElement,\n resolved: ResolvedLink,\n onNavigatePage?: (idx: number) => void\n) {\n el.href = resolved.href;\n if (resolved.internal) {\n el.addEventListener(\"click\", (e) => {\n if (resolved.pageIndex != null && onNavigatePage) {\n e.preventDefault();\n onNavigatePage(resolved.pageIndex);\n }\n });\n } else {\n el.target = \"_blank\";\n el.rel = \"noopener noreferrer\";\n }\n}\n","import type {\n Element, Style, Resources, JdfDocument,\n TextElement, RichTextElement, ImageElement, TableElement, ListElement,\n ShapeElement, CollapsibleElement, TocElement, RichTextRun, ListItem, TableCellValue, ImageResource,\n} from \"@jdf/core\";\nimport { unitToPx } from \"@jdf/core\";\nimport { resolveStyle, styleToCss, applyStyle } from \"../utils/style\";\nimport { resolveLink, attachLinkBehaviour } from \"../utils/link\";\n\nexport interface RenderContext {\n styles: Record<string, Style>;\n resources?: Resources;\n document: JdfDocument;\n path: (string | number)[];\n onNavigatePage?: (pageIndex: number) => void;\n}\n\nconst NS_SVG = \"http://www.w3.org/2000/svg\";\n\nexport function renderElement(el: Element, ctx: RenderContext): HTMLElement | null {\n const wrap = document.createElement(\"div\");\n applyPositionAndSize(wrap, el);\n let inner: HTMLElement | null = null;\n switch (el.type) {\n case \"text\": inner = renderText(el, ctx); break;\n case \"richtext\": inner = renderRichText(el, ctx); break;\n case \"image\": inner = renderImage(el, ctx); break;\n case \"table\": inner = renderTable(el, ctx); break;\n case \"list\": inner = renderList(el, ctx); break;\n case \"shape\": inner = renderShape(el); break;\n case \"collapsible\": inner = renderCollapsible(el, ctx); break;\n case \"toc\": inner = renderToc(el, ctx); break;\n }\n if (!inner) return null;\n wrap.appendChild(inner);\n return wrap;\n}\n\nfunction applyPositionAndSize(el: HTMLElement, e: Element) {\n const any = e as any;\n if (any.position) {\n el.style.position = \"absolute\";\n if (any.position.x != null) el.style.left = `${unitToPx(any.position.x)}px`;\n if (any.position.y != null) el.style.top = `${unitToPx(any.position.y)}px`;\n }\n if (any.width != null) el.style.width = `${unitToPx(any.width)}px`;\n if (any.height != null) el.style.height = `${unitToPx(any.height)}px`;\n}\n\n// ── text ────────────────────────────────────────────────────────────────────\nfunction renderText(el: TextElement, ctx: RenderContext): HTMLElement {\n const tag = textTag(el.heading);\n const node = document.createElement(tag);\n node.className = \"jdfjs-text\";\n node.style.margin = \"0\";\n node.style.whiteSpace = \"pre-wrap\";\n applyStyle(node, resolveStyle(el.style, ctx.styles));\n if (el.align) node.style.textAlign = el.align;\n\n const link = resolveLink(el.link);\n if (link) {\n const a = document.createElement(\"a\");\n attachLinkBehaviour(a, link, ctx.onNavigatePage);\n a.className = \"jdfjs-link\";\n a.textContent = el.content || \"\";\n node.appendChild(a);\n } else {\n node.textContent = el.content || \"\";\n }\n return node;\n}\n\nfunction textTag(h: TextElement[\"heading\"]): keyof HTMLElementTagNameMap {\n if (h === true) return \"h1\";\n if (typeof h === \"number\" && h >= 1 && h <= 6) return (\"h\" + h) as keyof HTMLElementTagNameMap;\n return \"p\";\n}\n\n// ── richtext ────────────────────────────────────────────────────────────────\nfunction renderRichText(el: RichTextElement, ctx: RenderContext): HTMLElement {\n const p = document.createElement(\"p\");\n p.className = \"jdfjs-richtext\";\n p.style.margin = \"0\";\n applyStyle(p, resolveStyle(el.style, ctx.styles));\n for (const run of el.runs || []) {\n p.appendChild(renderRun(run, ctx));\n }\n return p;\n}\n\nfunction runCss(run: RichTextRun, styles: Record<string, Style>): Record<string, string> {\n const css: Record<string, string> = {};\n if (run.style) {\n if (typeof run.style === \"string\") Object.assign(css, styleToCss(styles[run.style] || {}));\n else if (Array.isArray(run.style)) for (const s of run.style) Object.assign(css, styleToCss(styles[s] || {}));\n else Object.assign(css, styleToCss(run.style));\n }\n if (run.bold) css[\"font-weight\"] = \"bold\";\n if (run.italic) css[\"font-style\"] = \"italic\";\n const decos: string[] = [];\n if (run.underline) decos.push(\"underline\");\n if (run.strikethrough) decos.push(\"line-through\");\n if (decos.length) css[\"text-decoration\"] = decos.join(\" \");\n if (run.color) css[\"color\"] = run.color;\n if (run.fontSize) css[\"font-size\"] = `${run.fontSize * 1.333}px`;\n if (run.fontFamily) css[\"font-family\"] = run.fontFamily;\n return css;\n}\n\nfunction renderRun(run: RichTextRun, ctx: RenderContext): HTMLElement {\n const link = resolveLink(run.link);\n const node: HTMLElement = link ? document.createElement(\"a\") : document.createElement(\"span\");\n if (link) {\n attachLinkBehaviour(node as HTMLAnchorElement, link, ctx.onNavigatePage);\n node.classList.add(\"jdfjs-link\");\n }\n applyStyle(node, runCss(run, ctx.styles));\n node.textContent = run.text;\n return node;\n}\n\n// ── image ───────────────────────────────────────────────────────────────────\nfunction lookupResource(resources: Resources | undefined, key: string): ImageResource | undefined {\n if (!resources) return undefined;\n const direct = (resources as any)[key];\n if (direct && typeof direct === \"object\" && \"data\" in direct) return direct as ImageResource;\n const inImages = resources.images?.[key];\n if (inImages) return inImages;\n return undefined;\n}\n\nfunction imageSrc(el: ImageElement, resources?: Resources): string {\n if (el.src?.startsWith(\"data:\") || el.src?.startsWith(\"http\")) return el.src;\n if (el.resource) {\n const res = lookupResource(resources, el.resource);\n if (res?.data) {\n const mime = res.mimeType || \"image/png\";\n if (res.data.startsWith(\"data:\")) return res.data;\n return `data:${mime};base64,${res.data}`;\n }\n if (res?.path) return res.path;\n }\n return el.src || \"\";\n}\n\nfunction renderImage(el: ImageElement, ctx: RenderContext): HTMLElement {\n const wrap = document.createElement(\"div\");\n wrap.className = \"jdfjs-image\";\n wrap.style.width = \"100%\";\n wrap.style.height = \"100%\";\n const img = document.createElement(\"img\");\n img.src = imageSrc(el, ctx.resources);\n img.alt = el.alt || \"\";\n img.style.display = \"block\";\n img.style.width = \"100%\";\n img.style.height = \"100%\";\n switch (el.fit) {\n case \"cover\": img.style.objectFit = \"cover\"; break;\n case \"fill\": img.style.objectFit = \"fill\"; break;\n case \"none\": img.style.objectFit = \"none\"; break;\n default: img.style.objectFit = \"contain\";\n }\n applyStyle(img, resolveStyle(el.style, ctx.styles));\n wrap.appendChild(img);\n return wrap;\n}\n\n// ── table ───────────────────────────────────────────────────────────────────\nfunction cellText(c: TableCellValue): string {\n return typeof c === \"string\" ? c : c.content;\n}\nfunction cellAttrs(c: TableCellValue): { colspan?: number; rowspan?: number } {\n if (typeof c === \"string\") return {};\n return { colspan: c.colspan, rowspan: c.rowspan };\n}\n\nfunction renderTable(el: TableElement, ctx: RenderContext): HTMLElement {\n const wrap = document.createElement(\"div\");\n wrap.className = \"jdfjs-table-wrap\";\n applyStyle(wrap, resolveStyle(el.style, ctx.styles));\n wrap.style.overflowX = \"auto\";\n\n const headerCss = (() => {\n const s = el.headerStyle;\n if (!s) return {};\n if (typeof s === \"string\") return styleToCss(ctx.styles[s] || {});\n if (Array.isArray(s)) { let m = {}; for (const k of s) m = { ...m, ...styleToCss(ctx.styles[k] || {}) }; return m; }\n return styleToCss(s);\n })();\n const rowCss = (() => {\n const s = el.rowStyle;\n if (!s) return {};\n if (typeof s === \"string\") return styleToCss(ctx.styles[s] || {});\n if (Array.isArray(s)) { let m = {}; for (const k of s) m = { ...m, ...styleToCss(ctx.styles[k] || {}) }; return m; }\n return styleToCss(s);\n })();\n const altRowCss = (() => {\n const s = el.alternateRowStyle;\n if (!s) {\n const c = el.alternatingRowColor;\n return c ? { \"background-color\": c } : {};\n }\n if (typeof s === \"string\") return styleToCss(ctx.styles[s] || {});\n if (Array.isArray(s)) { let m = {}; for (const k of s) m = { ...m, ...styleToCss(ctx.styles[k] || {}) }; return m; }\n return styleToCss(s);\n })();\n const borders = (() => {\n const b = el.borders;\n if (b === false) return { outer: false, inner: false } as const;\n if (b === true || b === undefined) return { outer: true, inner: true, color: \"#e2e8f0\", width: 1 } as const;\n return { outer: true, inner: true, color: \"#e2e8f0\", width: 1, ...b } as const;\n })();\n\n const headers = el.headers ?? el.columns?.map((c) => c.header || \"\").filter((h) => h !== \"\");\n const colAlign = (i: number) => el.columns?.[i]?.align;\n\n const table = document.createElement(\"table\");\n table.style.width = \"100%\";\n table.style.borderCollapse = \"collapse\";\n table.style.fontSize = \"14px\";\n if (borders.outer) table.style.border = `${borders.width || 1}px solid ${borders.color || \"#e2e8f0\"}`;\n\n if (headers && headers.length > 0) {\n const thead = document.createElement(\"thead\");\n const tr = document.createElement(\"tr\");\n applyStyle(tr, headerCss as any);\n headers.forEach((h, i) => {\n const th = document.createElement(\"th\");\n th.textContent = h;\n th.style.padding = \"8px 12px\";\n th.style.fontWeight = \"600\";\n th.style.background = \"#f8fafc\";\n th.style.textAlign = colAlign(i) || \"left\";\n if (borders.inner) th.style.border = `${borders.width || 1}px solid ${borders.color || \"#e2e8f0\"}`;\n tr.appendChild(th);\n });\n thead.appendChild(tr);\n table.appendChild(thead);\n }\n\n const tbody = document.createElement(\"tbody\");\n el.rows.forEach((row, ri) => {\n const tr = document.createElement(\"tr\");\n applyStyle(tr, rowCss as any);\n if (ri % 2 === 1) applyStyle(tr, altRowCss as any);\n row.forEach((cell, ci) => {\n const td = document.createElement(\"td\");\n td.textContent = cellText(cell);\n const attrs = cellAttrs(cell);\n if (attrs.colspan) td.colSpan = attrs.colspan;\n if (attrs.rowspan) td.rowSpan = attrs.rowspan;\n td.style.padding = \"8px 12px\";\n td.style.verticalAlign = \"top\";\n td.style.textAlign = colAlign(ci) || \"left\";\n if (borders.inner) td.style.border = `${borders.width || 1}px solid ${borders.color || \"#e2e8f0\"}`;\n tr.appendChild(td);\n });\n tbody.appendChild(tr);\n });\n table.appendChild(tbody);\n wrap.appendChild(table);\n return wrap;\n}\n\n// ── list ────────────────────────────────────────────────────────────────────\nfunction renderList(el: ListElement, ctx: RenderContext): HTMLElement {\n const wrap = document.createElement(\"div\");\n wrap.className = \"jdfjs-list-wrap\";\n applyStyle(wrap, resolveStyle(el.style, ctx.styles));\n\n const defaultType = el.listType ?? (el.ordered ? \"ordered\" : \"unordered\");\n const root = listElementForType(defaultType);\n buildItems(root, el.items || [], defaultType, ctx);\n wrap.appendChild(root);\n return wrap;\n}\n\nfunction listElementForType(t: \"ordered\" | \"unordered\") {\n const node = document.createElement(t === \"ordered\" ? \"ol\" : \"ul\");\n node.style.margin = \"0\";\n node.style.paddingLeft = \"20px\";\n node.style.listStyle = t === \"ordered\" ? \"decimal\" : \"disc\";\n return node;\n}\n\nfunction buildItems(parent: HTMLElement, items: ListItem[], def: \"ordered\" | \"unordered\", ctx: RenderContext) {\n for (const item of items) {\n const li = document.createElement(\"li\");\n li.style.fontSize = \"14px\";\n li.style.lineHeight = \"1.6\";\n li.appendChild(document.createTextNode(item.content));\n if (item.children?.length) {\n const childType = item.listType || def;\n const nested = listElementForType(childType);\n nested.style.marginTop = \"4px\";\n buildItems(nested, item.children, childType, ctx);\n li.appendChild(nested);\n }\n parent.appendChild(li);\n }\n}\n\n// ── shape ───────────────────────────────────────────────────────────────────\nfunction renderShape(el: ShapeElement): HTMLElement {\n const wrap = document.createElement(\"div\");\n wrap.className = \"jdfjs-shape\";\n wrap.style.width = \"100%\";\n wrap.style.height = \"100%\";\n\n const w = el.width ?? 100;\n const h = el.height ?? 100;\n const fill = el.fill ?? \"none\";\n const strokeColor = (() => {\n const s = el.stroke;\n if (typeof s === \"string\") return s;\n if (s?.color) return s.color;\n return \"none\";\n })();\n const strokeWidth = (() => {\n const s = el.stroke;\n if (typeof s === \"object\" && s?.width != null) return s.width;\n return el.strokeWidth ?? 0;\n })();\n\n const svg = document.createElementNS(NS_SVG, \"svg\");\n svg.setAttribute(\"width\", \"100%\");\n svg.setAttribute(\"height\", \"100%\");\n svg.setAttribute(\"viewBox\", `0 0 ${w} ${h}`);\n svg.setAttribute(\"preserveAspectRatio\", \"none\");\n svg.style.display = \"block\";\n svg.style.overflow = \"visible\";\n\n let shapeNode: SVGElement | null = null;\n switch (el.shape) {\n case \"rect\": {\n const r = document.createElementNS(NS_SVG, \"rect\");\n r.setAttribute(\"x\", \"0\");\n r.setAttribute(\"y\", \"0\");\n r.setAttribute(\"width\", String(w));\n r.setAttribute(\"height\", String(h));\n if (el.borderRadius) r.setAttribute(\"rx\", String(el.borderRadius));\n shapeNode = r;\n break;\n }\n case \"circle\": {\n const c = document.createElementNS(NS_SVG, \"circle\");\n c.setAttribute(\"cx\", String(w / 2));\n c.setAttribute(\"cy\", String(h / 2));\n c.setAttribute(\"r\", String(Math.min(w, h) / 2));\n shapeNode = c;\n break;\n }\n case \"ellipse\": {\n const e = document.createElementNS(NS_SVG, \"ellipse\");\n e.setAttribute(\"cx\", String(w / 2));\n e.setAttribute(\"cy\", String(h / 2));\n e.setAttribute(\"rx\", String(w / 2));\n e.setAttribute(\"ry\", String(h / 2));\n shapeNode = e;\n break;\n }\n case \"line\": {\n const l = document.createElementNS(NS_SVG, \"line\");\n l.setAttribute(\"x1\", \"0\");\n l.setAttribute(\"y1\", \"0\");\n l.setAttribute(\"x2\", String(w));\n l.setAttribute(\"y2\", String(h));\n l.setAttribute(\"stroke\", strokeColor === \"none\" ? (fill !== \"none\" ? fill : \"currentColor\") : strokeColor);\n l.setAttribute(\"stroke-width\", String(strokeWidth || 0.3));\n svg.appendChild(l);\n wrap.appendChild(svg);\n return wrap;\n }\n case \"path\": {\n const p = document.createElementNS(NS_SVG, \"path\");\n p.setAttribute(\"d\", el.path || \"\");\n p.setAttribute(\"fill-rule\", \"evenodd\");\n shapeNode = p;\n break;\n }\n }\n if (shapeNode) {\n shapeNode.setAttribute(\"fill\", fill);\n shapeNode.setAttribute(\"stroke\", strokeColor);\n if (strokeWidth) shapeNode.setAttribute(\"stroke-width\", String(strokeWidth));\n svg.appendChild(shapeNode);\n }\n wrap.appendChild(svg);\n return wrap;\n}\n\n// ── collapsible ─────────────────────────────────────────────────────────────\nfunction renderCollapsible(el: CollapsibleElement, ctx: RenderContext): HTMLElement {\n const wrap = document.createElement(\"div\");\n wrap.className = \"jdfjs-collapsible\";\n applyStyle(wrap, resolveStyle(el.style, ctx.styles));\n wrap.style.border = \"1px solid #e2e8f0\";\n wrap.style.borderRadius = \"8px\";\n wrap.style.overflow = \"hidden\";\n wrap.style.background = \"#ffffff\";\n\n const header = document.createElement(\"button\");\n header.type = \"button\";\n header.className = \"jdfjs-collapsible-header\";\n header.style.width = \"100%\";\n header.style.display = \"flex\";\n header.style.alignItems = \"center\";\n header.style.gap = \"8px\";\n header.style.padding = \"10px 16px\";\n header.style.fontSize = \"14px\";\n header.style.fontWeight = \"500\";\n header.style.background = \"#f8fafc\";\n header.style.border = \"0\";\n header.style.cursor = \"pointer\";\n header.style.textAlign = \"left\";\n\n const arrow = document.createElement(\"span\");\n arrow.textContent = \"▶\";\n arrow.style.fontSize = \"10px\";\n arrow.style.transition = \"transform 0.15s ease\";\n\n const titleSpan = document.createElement(\"span\");\n titleSpan.textContent = el.title || \"Section\";\n titleSpan.style.flex = \"1\";\n\n header.appendChild(arrow);\n header.appendChild(titleSpan);\n wrap.appendChild(header);\n\n const body = document.createElement(\"div\");\n body.className = \"jdfjs-collapsible-body\";\n body.style.padding = \"12px 16px\";\n body.style.position = \"relative\";\n\n let expanded = el.expanded ?? false;\n const apply = () => {\n body.style.display = expanded ? \"block\" : \"none\";\n arrow.style.transform = expanded ? \"rotate(90deg)\" : \"rotate(0deg)\";\n };\n apply();\n header.addEventListener(\"click\", () => { expanded = !expanded; apply(); });\n\n for (const child of el.elements || []) {\n const node = renderElement(child, { ...ctx, path: [...ctx.path, \"elements\"] });\n if (node) body.appendChild(node);\n }\n wrap.appendChild(body);\n return wrap;\n}\n\n// ── toc ─────────────────────────────────────────────────────────────────────\nfunction renderToc(el: TocElement, ctx: RenderContext): HTMLElement {\n const wrap = document.createElement(\"div\");\n wrap.className = \"jdfjs-toc\";\n applyStyle(wrap, resolveStyle(el.style, ctx.styles));\n\n const depth = el.depth ?? 6;\n const entries: { title: string; pageIndex: number; level: number }[] = [];\n ctx.document.pages.forEach((page, pi) => {\n for (const e of page.elements) {\n if (e.type !== \"text\") continue;\n const t = e as TextElement;\n const title = t.tocEntry || (t.heading ? t.content : null);\n if (!title) continue;\n const level = typeof t.tocLevel === \"number\" ? t.tocLevel : (typeof t.heading === \"number\" ? t.heading : 1);\n if (level > depth) continue;\n entries.push({ title, pageIndex: pi, level });\n }\n });\n\n for (const entry of entries) {\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"jdfjs-toc-entry\";\n btn.style.display = \"flex\";\n btn.style.alignItems = \"baseline\";\n btn.style.gap = \"8px\";\n btn.style.width = \"100%\";\n btn.style.background = \"transparent\";\n btn.style.border = \"0\";\n btn.style.borderBottom = \"1px dotted #e2e8f0\";\n btn.style.padding = `6px 8px 6px ${(entry.level - 1) * 16 + 8}px`;\n btn.style.cursor = \"pointer\";\n btn.style.fontSize = \"14px\";\n btn.style.color = \"#334155\";\n btn.style.textAlign = \"left\";\n\n const titleSpan = document.createElement(\"span\");\n titleSpan.textContent = entry.title;\n titleSpan.style.flex = \"1\";\n\n const filler = document.createElement(\"span\");\n filler.style.flex = \"1\";\n filler.style.borderBottom = \"1px dotted #cbd5e1\";\n filler.style.alignSelf = \"end\";\n filler.style.marginBottom = \"4px\";\n\n const num = document.createElement(\"span\");\n num.textContent = String(entry.pageIndex + 1);\n num.style.fontFamily = \"JetBrains Mono, monospace\";\n num.style.fontSize = \"12px\";\n num.style.color = \"#94a3b8\";\n num.style.flexShrink = \"0\";\n\n btn.appendChild(titleSpan);\n btn.appendChild(filler);\n btn.appendChild(num);\n\n btn.addEventListener(\"click\", () => ctx.onNavigatePage?.(entry.pageIndex));\n wrap.appendChild(btn);\n }\n return wrap;\n}\n","export interface TemplateVars {\n pageNumber: number;\n totalPages: number;\n title: string;\n author: string;\n}\n\nexport function resolveTemplate(text: string, vars: TemplateVars): string {\n return text\n .replace(/\\{\\{pageNumber\\}\\}/g, String(vars.pageNumber))\n .replace(/\\{\\{totalPages\\}\\}/g, String(vars.totalPages))\n .replace(/\\{\\{title\\}\\}/g, vars.title)\n .replace(/\\{\\{author\\}\\}/g, vars.author);\n}\n","import type { JdfDocument, Element, Page, Style, StyleRef, HeaderFooter } from \"@jdf/core\";\nimport { getPageDimensions, unitToPx, DEFAULT_MARGINS } from \"@jdf/core\";\nimport { renderElement } from \"./renderers/element\";\nimport { resolveStyle } from \"./utils/style\";\nimport { resolveTemplate } from \"./utils/template\";\n\nexport interface JDFViewerOptions {\n /** Initial zoom level. 1 = 100%. Default: 1 */\n zoom?: number;\n /** Show the page sidebar. Default: false (most embeds want a clean look) */\n sidebar?: boolean;\n /** Show the toolbar (zoom, page nav, search). Default: true */\n toolbar?: boolean;\n /** Use dark mode. Default: follows `prefers-color-scheme` */\n darkMode?: \"auto\" | \"light\" | \"dark\";\n /** Initial page index (0-based). Default: 0 */\n initialPage?: number;\n /** Container width. Number = pixels. String = any CSS length (\"100%\", \"60ch\", \"640px\"). */\n width?: number | string;\n /** Container height. Number = pixels. String = any CSS length (\"80vh\", \"600px\"). Default: \"600px\". */\n height?: number | string;\n /** Page-fit strategy:\n * \"manual\" — exact zoom from `zoom` option (default)\n * \"fit-width\" — auto-zoom each page to fill container width\n * \"fit-page\" — auto-zoom so a whole page is visible\n */\n fit?: \"manual\" | \"fit-width\" | \"fit-page\";\n /** Called when the user navigates to a different page */\n onPageChange?: (pageIndex: number) => void;\n /** Called once the document finishes rendering */\n onLoad?: (doc: JdfDocument) => void;\n /** Called on any rendering error */\n onError?: (err: Error) => void;\n}\n\nexport interface JDFViewerInstance {\n /** The container element */\n container: HTMLElement;\n /** The current document */\n document: JdfDocument;\n /** Get / set zoom (1 = 100%) */\n setZoom: (zoom: number) => void;\n getZoom: () => number;\n /** Navigate to a page (0-based) */\n goToPage: (pageIndex: number) => void;\n getCurrentPage: () => number;\n /** Replace the document */\n setDocument: (doc: JdfDocument) => void;\n /** Tear down — removes DOM and event listeners */\n destroy: () => void;\n}\n\n/**\n * Embed a JDF document into a container by URL.\n * The simplest \"PDF.js-like\" usage.\n */\nexport async function embed(\n container: HTMLElement | string,\n url: string,\n options: JDFViewerOptions = {}\n): Promise<JDFViewerInstance> {\n const el = resolveContainer(container);\n el.classList.add(\"jdfjs-loading\");\n try {\n const res = await fetch(url, { headers: { Accept: \"application/json,application/jdf+json\" } });\n if (!res.ok) throw new Error(`Failed to fetch ${url} (${res.status})`);\n const doc = (await res.json()) as JdfDocument;\n if (!doc?.$jdf) throw new Error(\"Not a valid JDF document (missing $jdf field)\");\n el.classList.remove(\"jdfjs-loading\");\n return render(el, doc, options);\n } catch (err) {\n el.classList.remove(\"jdfjs-loading\");\n el.classList.add(\"jdfjs-error\");\n el.innerHTML = `<div class=\"jdfjs-error-msg\">${escapeHtml((err as Error).message)}</div>`;\n options.onError?.(err as Error);\n throw err;\n }\n}\n\n/**\n * Render a JDF document directly into a container. No fetch.\n */\nexport function render(\n container: HTMLElement | string,\n document: JdfDocument,\n options: JDFViewerOptions = {}\n): JDFViewerInstance {\n const el = resolveContainer(container);\n return new JDFViewer(el, document, options).getInstance();\n}\n\n/**\n * Class form for advanced consumers (event subscriptions, custom toolbar wiring, etc).\n */\nexport class JDFViewer {\n private container: HTMLElement;\n private doc: JdfDocument;\n private options: Required<Pick<JDFViewerOptions, \"zoom\" | \"sidebar\" | \"toolbar\" | \"darkMode\" | \"initialPage\" | \"fit\">> & JDFViewerOptions;\n private zoom: number;\n private currentPage: number;\n private resizeObs: ResizeObserver | null = null;\n private pagesEl!: HTMLDivElement;\n private toolbarEl: HTMLDivElement | null = null;\n private sidebarEl: HTMLDivElement | null = null;\n private root!: HTMLDivElement;\n private observer: IntersectionObserver | null = null;\n\n constructor(container: HTMLElement, doc: JdfDocument, options: JDFViewerOptions = {}) {\n this.container = container;\n this.doc = doc;\n this.options = {\n zoom: options.zoom ?? 1,\n sidebar: options.sidebar ?? false,\n toolbar: options.toolbar ?? true,\n darkMode: options.darkMode ?? \"auto\",\n initialPage: options.initialPage ?? 0,\n fit: options.fit ?? \"manual\",\n ...options,\n };\n this.zoom = this.options.zoom;\n this.currentPage = this.options.initialPage;\n this.applyContainerSize();\n this.mount();\n queueMicrotask(() => this.options.onLoad?.(this.doc));\n }\n\n private applyContainerSize() {\n const w = this.options.width;\n const h = this.options.height;\n if (w != null) {\n this.container.style.width = typeof w === \"number\" ? `${w}px` : w;\n }\n if (h != null) {\n this.container.style.height = typeof h === \"number\" ? `${h}px` : h;\n }\n }\n\n private mount() {\n this.container.innerHTML = \"\";\n this.container.classList.add(\"jdfjs\");\n if (this.options.darkMode === \"dark\") this.container.classList.add(\"jdfjs-dark\");\n else if (this.options.darkMode === \"auto\") {\n if (window.matchMedia?.(\"(prefers-color-scheme: dark)\").matches) {\n this.container.classList.add(\"jdfjs-dark\");\n }\n }\n\n this.root = document.createElement(\"div\");\n this.root.className = \"jdfjs-root\";\n\n if (this.options.toolbar) {\n this.toolbarEl = this.buildToolbar();\n this.root.appendChild(this.toolbarEl);\n }\n\n const body = document.createElement(\"div\");\n body.className = \"jdfjs-body\";\n\n if (this.options.sidebar) {\n this.sidebarEl = this.buildSidebar();\n body.appendChild(this.sidebarEl);\n }\n\n this.pagesEl = document.createElement(\"div\");\n this.pagesEl.className = \"jdfjs-pages\";\n body.appendChild(this.pagesEl);\n\n this.root.appendChild(body);\n this.container.appendChild(this.root);\n this.renderAllPages();\n this.setupScrollObserver();\n this.setupResizeObserver();\n this.applyFit();\n if (this.currentPage > 0) this.scrollToPage(this.currentPage);\n }\n\n private setupResizeObserver() {\n if (typeof ResizeObserver === \"undefined\") return;\n this.resizeObs?.disconnect();\n this.resizeObs = new ResizeObserver(() => this.applyFit());\n this.resizeObs.observe(this.pagesEl);\n }\n\n /** Auto-zoom for fit modes. */\n private applyFit() {\n if (this.options.fit === \"manual\") return;\n const firstPage = this.pagesEl.querySelector<HTMLElement>(\".jdfjs-page\");\n if (!firstPage) return;\n // Read intrinsic page size from the inline width/min-height in px (set in renderPage)\n const pageWidth = parseFloat(firstPage.style.width || \"0\");\n const pageHeight = parseFloat(firstPage.style.minHeight || \"0\");\n if (!pageWidth || !pageHeight) return;\n const containerWidth = this.pagesEl.clientWidth - 32; // margin\n const containerHeight = this.pagesEl.clientHeight - 32;\n if (this.options.fit === \"fit-width\") {\n this.zoom = Math.max(0.25, Math.min(3, containerWidth / pageWidth));\n } else if (this.options.fit === \"fit-page\") {\n this.zoom = Math.max(0.25, Math.min(3, Math.min(containerWidth / pageWidth, containerHeight / pageHeight)));\n }\n this.applyZoom();\n this.updateIndicators();\n }\n\n private buildToolbar(): HTMLDivElement {\n const tb = document.createElement(\"div\");\n tb.className = \"jdfjs-toolbar\";\n tb.innerHTML = `\n <span class=\"jdfjs-title\"></span>\n <div class=\"jdfjs-spacer\"></div>\n <button class=\"jdfjs-btn\" data-act=\"prev\" title=\"Previous page\">‹</button>\n <span class=\"jdfjs-page-indicator\"></span>\n <button class=\"jdfjs-btn\" data-act=\"next\" title=\"Next page\">›</button>\n <span class=\"jdfjs-divider\"></span>\n <button class=\"jdfjs-btn\" data-act=\"zoom-out\" title=\"Zoom out\">−</button>\n <span class=\"jdfjs-zoom-indicator\"></span>\n <button class=\"jdfjs-btn\" data-act=\"zoom-in\" title=\"Zoom in\">+</button>\n `;\n tb.querySelector(\".jdfjs-title\")!.textContent = this.doc.meta?.title ?? \"Document\";\n this.updateIndicators(tb);\n\n tb.addEventListener(\"click\", (e) => {\n const target = (e.target as HTMLElement).closest(\"[data-act]\");\n if (!target) return;\n const act = target.getAttribute(\"data-act\");\n if (act === \"prev\") this.goToPage(this.currentPage - 1);\n else if (act === \"next\") this.goToPage(this.currentPage + 1);\n else if (act === \"zoom-in\") this.setZoom(this.zoom + 0.1);\n else if (act === \"zoom-out\") this.setZoom(this.zoom - 0.1);\n });\n return tb;\n }\n\n private buildSidebar(): HTMLDivElement {\n const sb = document.createElement(\"div\");\n sb.className = \"jdfjs-sidebar\";\n this.doc.pages.forEach((_, idx) => {\n const btn = document.createElement(\"button\");\n btn.className = \"jdfjs-sidebar-thumb\";\n btn.setAttribute(\"data-page\", String(idx));\n btn.innerHTML = `<span class=\"jdfjs-sidebar-num\">${idx + 1}</span>`;\n btn.addEventListener(\"click\", () => this.goToPage(idx));\n sb.appendChild(btn);\n });\n return sb;\n }\n\n private updateIndicators(tb: HTMLElement = this.toolbarEl!) {\n if (!tb) return;\n const pageInd = tb.querySelector(\".jdfjs-page-indicator\");\n if (pageInd) pageInd.textContent = `${this.currentPage + 1} / ${this.doc.pages.length}`;\n const zoomInd = tb.querySelector(\".jdfjs-zoom-indicator\");\n if (zoomInd) zoomInd.textContent = `${Math.round(this.zoom * 100)}%`;\n if (this.sidebarEl) {\n this.sidebarEl.querySelectorAll(\".jdfjs-sidebar-thumb\").forEach((el) => {\n const idx = Number(el.getAttribute(\"data-page\"));\n el.classList.toggle(\"jdfjs-sidebar-thumb-active\", idx === this.currentPage);\n });\n }\n }\n\n private renderAllPages() {\n this.pagesEl.innerHTML = \"\";\n const styles = this.doc.styles ?? {};\n this.doc.pages.forEach((page, idx) => {\n const pageEl = this.renderPage(page, idx, styles);\n this.pagesEl.appendChild(pageEl);\n });\n this.applyZoom();\n }\n\n private renderPage(page: Page, pageIndex: number, styles: Record<string, Style>): HTMLDivElement {\n const dim = getPageDimensions(\n page.pageSize ?? this.doc.meta?.pageSize ?? \"A4\",\n page.pageOrientation ?? this.doc.meta?.pageOrientation ?? \"portrait\"\n );\n const margins = { ...DEFAULT_MARGINS, ...(this.doc.meta?.margins || {}), ...(page.margins || {}) };\n\n const wrapper = document.createElement(\"div\");\n wrapper.className = \"jdfjs-page-wrapper\";\n wrapper.setAttribute(\"data-page-index\", String(pageIndex));\n\n const pageEl = document.createElement(\"div\");\n pageEl.className = \"jdfjs-page\";\n pageEl.style.width = `${unitToPx(dim.width)}px`;\n pageEl.style.minHeight = `${unitToPx(dim.height)}px`;\n if (page.background) pageEl.style.backgroundColor = page.background;\n\n const header = page.header ?? this.doc.header;\n const footer = page.footer ?? this.doc.footer;\n const headerH = header?.height ?? 0;\n const footerH = footer?.height ?? 0;\n\n if (header) {\n const h = this.renderHeaderFooter(header, pageIndex, this.doc.pages.length, styles);\n h.classList.add(\"jdfjs-header\");\n h.style.paddingTop = `${unitToPx(margins.top! / 2)}px`;\n h.style.paddingLeft = `${unitToPx(margins.left!)}px`;\n h.style.paddingRight = `${unitToPx(margins.right!)}px`;\n pageEl.appendChild(h);\n }\n\n const content = document.createElement(\"div\");\n content.className = \"jdfjs-page-content\";\n content.style.position = \"relative\";\n content.style.paddingTop = `${unitToPx((margins.top || 0) + headerH)}px`;\n content.style.paddingRight = `${unitToPx(margins.right || 0)}px`;\n content.style.paddingBottom = `${unitToPx((margins.bottom || 0) + footerH)}px`;\n content.style.paddingLeft = `${unitToPx(margins.left || 0)}px`;\n\n page.elements.forEach((el, elIdx) => {\n const node = renderElement(el, {\n styles,\n resources: this.doc.resources,\n document: this.doc,\n path: [\"pages\", pageIndex, \"elements\", elIdx],\n onNavigatePage: (idx) => this.goToPage(idx),\n });\n if (node) content.appendChild(node);\n });\n pageEl.appendChild(content);\n\n if (footer) {\n const f = this.renderHeaderFooter(footer, pageIndex, this.doc.pages.length, styles);\n f.classList.add(\"jdfjs-footer\");\n f.style.paddingBottom = `${unitToPx(margins.bottom! / 2)}px`;\n f.style.paddingLeft = `${unitToPx(margins.left!)}px`;\n f.style.paddingRight = `${unitToPx(margins.right!)}px`;\n pageEl.appendChild(f);\n }\n\n wrapper.appendChild(pageEl);\n return wrapper;\n }\n\n private renderHeaderFooter(hf: HeaderFooter, pageIndex: number, totalPages: number, styles: Record<string, Style>): HTMLDivElement {\n const div = document.createElement(\"div\");\n if (hf.elements?.length) {\n hf.elements.forEach((el, idx) => {\n const node = renderElement(el, {\n styles,\n resources: this.doc.resources,\n document: this.doc,\n path: [\"__hf__\", pageIndex, idx],\n onNavigatePage: (i) => this.goToPage(i),\n });\n if (node) div.appendChild(node);\n });\n } else if (hf.content) {\n const text = resolveTemplate(hf.content, { pageNumber: pageIndex + 1, totalPages, title: this.doc.meta?.title ?? \"\", author: this.doc.meta?.author ?? \"\" });\n const span = document.createElement(\"div\");\n span.textContent = text;\n Object.assign(span.style, resolveStyle(hf.style as StyleRef | undefined, styles));\n div.appendChild(span);\n }\n return div;\n }\n\n private setupScrollObserver() {\n if (typeof IntersectionObserver === \"undefined\") return;\n this.observer?.disconnect();\n this.observer = new IntersectionObserver(\n (entries) => {\n const visible = entries\n .filter((e) => e.isIntersecting)\n .sort((a, b) => b.intersectionRatio - a.intersectionRatio);\n if (visible[0]) {\n const idx = Number((visible[0].target as HTMLElement).getAttribute(\"data-page-index\"));\n if (!isNaN(idx) && idx !== this.currentPage) {\n this.currentPage = idx;\n this.updateIndicators();\n this.options.onPageChange?.(idx);\n }\n }\n },\n { root: this.pagesEl, threshold: [0.25, 0.5, 0.75] }\n );\n this.pagesEl.querySelectorAll(\"[data-page-index]\").forEach((el) => this.observer!.observe(el));\n }\n\n private scrollToPage(idx: number) {\n const el = this.pagesEl.querySelector(`[data-page-index=\"${idx}\"]`) as HTMLElement | null;\n if (el) el.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n }\n\n private applyZoom() {\n this.pagesEl.style.setProperty(\"--jdfjs-zoom\", String(this.zoom));\n this.pagesEl.querySelectorAll<HTMLElement>(\".jdfjs-page\").forEach((el) => {\n el.style.transform = `scale(${this.zoom})`;\n el.style.transformOrigin = \"top center\";\n });\n }\n\n setZoom(z: number) {\n this.zoom = Math.max(0.25, Math.min(3, z));\n this.applyZoom();\n this.updateIndicators();\n }\n getZoom() { return this.zoom; }\n\n goToPage(idx: number) {\n const clamped = Math.max(0, Math.min(this.doc.pages.length - 1, idx));\n this.currentPage = clamped;\n this.scrollToPage(clamped);\n this.updateIndicators();\n this.options.onPageChange?.(clamped);\n }\n getCurrentPage() { return this.currentPage; }\n\n setDocument(doc: JdfDocument) {\n this.doc = doc;\n this.currentPage = 0;\n if (this.toolbarEl) {\n const t = this.toolbarEl.querySelector(\".jdfjs-title\");\n if (t) t.textContent = doc.meta?.title ?? \"Document\";\n }\n if (this.sidebarEl) {\n this.sidebarEl.innerHTML = \"\";\n const newSidebar = this.buildSidebar();\n newSidebar.querySelectorAll(\".jdfjs-sidebar-thumb\").forEach((c) => this.sidebarEl!.appendChild(c));\n }\n this.renderAllPages();\n this.setupScrollObserver();\n this.options.onLoad?.(doc);\n }\n\n destroy() {\n this.observer?.disconnect();\n this.resizeObs?.disconnect();\n this.container.innerHTML = \"\";\n this.container.classList.remove(\"jdfjs\", \"jdfjs-dark\", \"jdfjs-loading\", \"jdfjs-error\");\n this.container.style.removeProperty(\"width\");\n this.container.style.removeProperty(\"height\");\n }\n\n getInstance(): JDFViewerInstance {\n return {\n container: this.container,\n document: this.doc,\n setZoom: (z) => this.setZoom(z),\n getZoom: () => this.getZoom(),\n goToPage: (i) => this.goToPage(i),\n getCurrentPage: () => this.getCurrentPage(),\n setDocument: (d) => this.setDocument(d),\n destroy: () => this.destroy(),\n };\n }\n}\n\nfunction resolveContainer(c: HTMLElement | string): HTMLElement {\n if (typeof c === \"string\") {\n const found = document.querySelector(c);\n if (!found) throw new Error(`jdfjs: container \"${c}\" not found`);\n return found as HTMLElement;\n }\n return c;\n}\n\nfunction escapeHtml(s: string): string {\n return s.replace(/[&<>\"']/g, (m) => ({ \"&\": \"&amp;\", \"<\": \"&lt;\", \">\": \"&gt;\", '\"': \"&quot;\", \"'\": \"&#39;\" }[m]!));\n}\n","/**\n * Auto-init: scan the page for <jdf src=\"...\"> tags and render each one.\n *\n * <link rel=\"stylesheet\" href=\"https://unpkg.com/jdfjs/dist/jdfjs.css\">\n * <script type=\"module\" src=\"https://unpkg.com/jdfjs\"></script>\n * <jdf src=\"/whitepaper.jdf\"></jdf>\n *\n * Configuration via attributes on <jdf>:\n * <jdf src=\"...\" width=\"800\" height=\"600\" zoom=\"1.2\" sidebar=\"true\" dark-mode=\"auto\"></jdf>\n *\n * For SPAs that mount content async, call `jdf()` after the new DOM lands.\n * To opt out per-element add `manual`. To disable globally:\n * window.JDFjsAutoInit = false // before loading the script\n */\n\nimport { embed, type JDFViewerOptions } from \"./viewer\";\n\nconst PROCESSED = new WeakSet<Element>();\n\nfunction readOptions(el: Element): JDFViewerOptions {\n const opts: JDFViewerOptions = {};\n const attr = (name: string) => el.getAttribute(name);\n\n const zoom = attr(\"zoom\");\n if (zoom != null) {\n const n = Number(zoom);\n if (!isNaN(n)) opts.zoom = n;\n }\n const sb = attr(\"sidebar\");\n if (sb != null) opts.sidebar = sb !== \"false\" && sb !== \"0\";\n const tb = attr(\"toolbar\");\n if (tb != null) opts.toolbar = tb !== \"false\" && tb !== \"0\";\n const dm = attr(\"dark-mode\") || attr(\"darkmode\");\n if (dm === \"auto\" || dm === \"light\" || dm === \"dark\") opts.darkMode = dm;\n const page = attr(\"page\");\n if (page != null) {\n const n = Number(page);\n if (!isNaN(n)) opts.initialPage = n;\n }\n const w = attr(\"width\");\n if (w != null) {\n const n = Number(w);\n opts.width = isNaN(n) ? w : n;\n }\n const h = attr(\"height\");\n if (h != null) {\n const n = Number(h);\n opts.height = isNaN(n) ? h : n;\n }\n const fit = attr(\"fit\");\n if (fit === \"manual\" || fit === \"fit-width\" || fit === \"fit-page\") opts.fit = fit;\n\n return opts;\n}\n\nfunction processElement(el: Element) {\n if (PROCESSED.has(el)) return;\n if (el.hasAttribute(\"manual\")) return;\n const src = el.getAttribute(\"src\");\n if (!src) return;\n PROCESSED.add(el);\n const container = el as HTMLElement;\n const opts = readOptions(el);\n embed(container, src, opts).catch((err) => {\n console.error(\"[jdf.js] failed to embed\", src, err);\n container.dispatchEvent(new CustomEvent(\"jdf-error\", { detail: err, bubbles: true }));\n });\n}\n\nfunction scan(root: ParentNode = document) {\n root.querySelectorAll(\"jdf\").forEach(processElement);\n}\n\nfunction watchForNewTargets() {\n if (typeof MutationObserver === \"undefined\") return;\n const obs = new MutationObserver((mutations) => {\n for (const m of mutations) {\n m.addedNodes.forEach((n) => {\n if (n instanceof Element) {\n if (n.tagName.toLowerCase() === \"jdf\") processElement(n);\n else scan(n);\n }\n });\n }\n });\n obs.observe(document.body, { childList: true, subtree: true });\n}\n\n/** Manually trigger a scan — for SPAs that mount content asynchronously. */\nexport function jdf(root: ParentNode = document) {\n scan(root);\n}\n\nfunction autoInit() {\n if (typeof window === \"undefined\" || typeof document === \"undefined\") return;\n if ((window as any).JDFjsAutoInit === false) return;\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", () => { scan(); watchForNewTargets(); }, { once: true });\n } else {\n scan();\n watchForNewTargets();\n }\n}\n\n// Define the <jdf> element as a custom element so its src attribute is reactive.\n// Browsers treat it as HTMLElement, but registering it gives us attribute-change hooks.\nif (typeof customElements !== \"undefined\" && !customElements.get(\"jdf\")) {\n class JdfElement extends HTMLElement {\n static get observedAttributes() { return [\"src\", \"width\", \"height\", \"zoom\"]; }\n connectedCallback() { processElement(this); }\n attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null) {\n if (oldVal === newVal) return;\n if (name === \"src\" && newVal) {\n PROCESSED.delete(this);\n processElement(this);\n } else if (name === \"width\" && newVal) {\n const n = Number(newVal);\n this.style.width = isNaN(n) ? newVal : `${n}px`;\n } else if (name === \"height\" && newVal) {\n const n = Number(newVal);\n this.style.height = isNaN(n) ? newVal : `${n}px`;\n }\n }\n }\n customElements.define(\"jdf\", JdfElement);\n}\n\nautoInit();\n"]}