@arbidocs/react 0.5.110 → 0.5.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/dist/PdfViewerImpl-QUSDLNNM.cjs +380 -0
  2. package/dist/PdfViewerImpl-QUSDLNNM.cjs.map +1 -0
  3. package/dist/PdfViewerImpl-TEBYF2QI.js +378 -0
  4. package/dist/PdfViewerImpl-TEBYF2QI.js.map +1 -0
  5. package/dist/{PdfViewer.d-bQH9yxFg.d.cts → PdfViewerImpl.d-B28hLEuj.d.cts} +8 -1
  6. package/dist/{PdfViewer.d-bQH9yxFg.d.ts → PdfViewerImpl.d-B28hLEuj.d.ts} +8 -1
  7. package/dist/annotations/freeze/index.d.cts +1 -1
  8. package/dist/annotations/freeze/index.d.ts +1 -1
  9. package/dist/artifacts/index.cjs +13 -13
  10. package/dist/artifacts/index.js +3 -3
  11. package/dist/calls/livekit/index.cjs +48 -48
  12. package/dist/calls/livekit/index.js +3 -3
  13. package/dist/{chunk-W2FATOTX.cjs → chunk-3JAEX57E.cjs} +4 -4
  14. package/dist/{chunk-W2FATOTX.cjs.map → chunk-3JAEX57E.cjs.map} +1 -1
  15. package/dist/{chunk-H5M7FXLB.js → chunk-4FL3X3LA.js} +3 -3
  16. package/dist/{chunk-H5M7FXLB.js.map → chunk-4FL3X3LA.js.map} +1 -1
  17. package/dist/{chunk-HD5H2PPP.cjs → chunk-5TRUFWKT.cjs} +66 -66
  18. package/dist/{chunk-HD5H2PPP.cjs.map → chunk-5TRUFWKT.cjs.map} +1 -1
  19. package/dist/chunk-6QNBSXCE.js +271 -0
  20. package/dist/chunk-6QNBSXCE.js.map +1 -0
  21. package/dist/{chunk-QF2BW6HZ.cjs → chunk-DI5KSVKY.cjs} +38 -38
  22. package/dist/{chunk-QF2BW6HZ.cjs.map → chunk-DI5KSVKY.cjs.map} +1 -1
  23. package/dist/{chunk-DQALOQPI.js → chunk-DZKRL5H3.js} +4 -4
  24. package/dist/{chunk-DQALOQPI.js.map → chunk-DZKRL5H3.js.map} +1 -1
  25. package/dist/{chunk-RVUGSM65.cjs → chunk-GKGAPU6T.cjs} +44 -44
  26. package/dist/{chunk-RVUGSM65.cjs.map → chunk-GKGAPU6T.cjs.map} +1 -1
  27. package/dist/chunk-L2IPPTVC.js +20 -0
  28. package/dist/chunk-L2IPPTVC.js.map +1 -0
  29. package/dist/{chunk-FZJMA32S.js → chunk-LSU4UPS5.js} +4 -4
  30. package/dist/{chunk-FZJMA32S.js.map → chunk-LSU4UPS5.js.map} +1 -1
  31. package/dist/{chunk-7LIMHY56.cjs → chunk-O32T7XRD.cjs} +3 -3
  32. package/dist/{chunk-7LIMHY56.cjs.map → chunk-O32T7XRD.cjs.map} +1 -1
  33. package/dist/chunk-PWGSIM3F.cjs +291 -0
  34. package/dist/chunk-PWGSIM3F.cjs.map +1 -0
  35. package/dist/{chunk-CPQ3CU4B.js → chunk-QMY2JKBI.js} +3 -3
  36. package/dist/{chunk-CPQ3CU4B.js.map → chunk-QMY2JKBI.js.map} +1 -1
  37. package/dist/chunk-QP3WQSAA.cjs +23 -0
  38. package/dist/chunk-QP3WQSAA.cjs.map +1 -0
  39. package/dist/chunk-SSXFVWCT.js +46 -0
  40. package/dist/chunk-SSXFVWCT.js.map +1 -0
  41. package/dist/chunk-T5FZICXN.cjs +50 -0
  42. package/dist/chunk-T5FZICXN.cjs.map +1 -0
  43. package/dist/{chunk-P6WLV5UY.js → chunk-XWPLOFDN.js} +3 -3
  44. package/dist/{chunk-P6WLV5UY.js.map → chunk-XWPLOFDN.js.map} +1 -1
  45. package/dist/{chunk-5HDKL6XB.cjs → chunk-YMB6XUR2.cjs} +57 -57
  46. package/dist/{chunk-5HDKL6XB.cjs.map → chunk-YMB6XUR2.cjs.map} +1 -1
  47. package/dist/{chunk-6H3O63TQ.js → chunk-ZM6N7YZH.js} +3 -3
  48. package/dist/{chunk-6H3O63TQ.js.map → chunk-ZM6N7YZH.js.map} +1 -1
  49. package/dist/document-tools/core.cjs +98 -98
  50. package/dist/document-tools/core.d.cts +2 -2
  51. package/dist/document-tools/core.d.ts +2 -2
  52. package/dist/document-tools/core.js +3 -3
  53. package/dist/document-tools/index.cjs +100 -100
  54. package/dist/document-tools/index.d.cts +1 -1
  55. package/dist/document-tools/index.d.ts +1 -1
  56. package/dist/document-tools/index.js +4 -4
  57. package/dist/index.cjs +1407 -1337
  58. package/dist/index.cjs.map +1 -1
  59. package/dist/{index.d-BMhTH98a.d.ts → index.d-CYXcTKYt.d.ts} +1 -0
  60. package/dist/{index.d-BMhTH98a.d.cts → index.d-LArLnpI8.d.cts} +1 -0
  61. package/dist/index.d.cts +38 -8
  62. package/dist/index.d.ts +38 -8
  63. package/dist/index.js +85 -29
  64. package/dist/index.js.map +1 -1
  65. package/dist/lazy-chunk.d-B6YDLMKI.d.cts +31 -0
  66. package/dist/lazy-chunk.d-B6YDLMKI.d.ts +31 -0
  67. package/dist/{query-keys.d-ChgpJLPF.d.cts → query-keys.d-B1Am9tIF.d.cts} +1 -1
  68. package/dist/{query-keys.d-ChgpJLPF.d.ts → query-keys.d-B1Am9tIF.d.ts} +1 -1
  69. package/dist/ui/index.cjs +13 -0
  70. package/dist/ui/index.d.cts +2 -1
  71. package/dist/ui/index.d.ts +2 -1
  72. package/dist/ui/index.js +1 -0
  73. package/dist/viewers/PdfViewer.cjs +17 -0
  74. package/dist/viewers/PdfViewer.cjs.map +1 -0
  75. package/dist/viewers/PdfViewer.d.cts +9 -0
  76. package/dist/viewers/PdfViewer.d.ts +9 -0
  77. package/dist/viewers/PdfViewer.js +4 -0
  78. package/dist/viewers/PdfViewer.js.map +1 -0
  79. package/dist/viewers/index.cjs +79 -653
  80. package/dist/viewers/index.cjs.map +1 -1
  81. package/dist/viewers/index.d.cts +3 -1
  82. package/dist/viewers/index.d.ts +3 -1
  83. package/dist/viewers/index.js +6 -639
  84. package/dist/viewers/index.js.map +1 -1
  85. package/package.json +11 -3
@@ -0,0 +1,271 @@
1
+ import { useEffect, useRef, useCallback, useLayoutEffect } from 'react';
2
+
3
+ // src/viewers/page-scroll.ts
4
+ var PAGE_SELECTOR = '[role="article"][data-page-number]';
5
+ function anchorDelta(previousHeight, nextHeight, pageTop, containerTop) {
6
+ const delta = nextHeight - previousHeight;
7
+ if (delta === 0) return 0;
8
+ return pageTop + previousHeight <= containerTop + 1 ? delta : 0;
9
+ }
10
+ function measureVisiblePages(pages, viewTop, viewBottom) {
11
+ const visibility = /* @__PURE__ */ new Map();
12
+ let page = null;
13
+ let bestPx = 0;
14
+ let score = 0;
15
+ const viewHeight = viewBottom - viewTop;
16
+ for (const p of pages) {
17
+ const height = p.bottom - p.top;
18
+ const px = Math.min(p.bottom, viewBottom) - Math.max(p.top, viewTop);
19
+ if (px <= 0 || height <= 0) continue;
20
+ visibility.set(p.n, px / height);
21
+ if (px > bestPx) {
22
+ bestPx = px;
23
+ page = p.n;
24
+ score = px / Math.min(height, viewHeight);
25
+ }
26
+ }
27
+ return { page, score, visibility };
28
+ }
29
+ function useScrollAnchor(containerRef, key) {
30
+ useEffect(() => {
31
+ const container = containerRef.current;
32
+ if (!container || typeof ResizeObserver === "undefined") return;
33
+ container.style.overflowAnchor = "none";
34
+ const heights = /* @__PURE__ */ new Map();
35
+ const observer = new ResizeObserver((entries) => {
36
+ let shift = 0;
37
+ const containerTop = container.getBoundingClientRect().top;
38
+ for (const entry of entries) {
39
+ const el = entry.target;
40
+ const height = el.getBoundingClientRect().height;
41
+ const previous = heights.get(el);
42
+ heights.set(el, height);
43
+ if (previous === void 0) continue;
44
+ shift += anchorDelta(previous, height, el.getBoundingClientRect().top, containerTop);
45
+ }
46
+ if (shift !== 0 && !container.dataset.zooming) container.scrollTop += shift;
47
+ });
48
+ container.querySelectorAll(PAGE_SELECTOR).forEach((el) => {
49
+ heights.set(el, el.getBoundingClientRect().height);
50
+ observer.observe(el);
51
+ });
52
+ return () => observer.disconnect();
53
+ }, [containerRef, key]);
54
+ }
55
+ var PAGE_UPDATE_DEBOUNCE_MS = 10;
56
+ var MIN_VISIBILITY_THRESHOLD = 0.15;
57
+ var INTERSECTION_THRESHOLDS = [0, 0.25, 0.5, 0.75, 1];
58
+ function usePageIntersectionObserver({
59
+ containerRef,
60
+ scrollCompleteRef,
61
+ isEnabled,
62
+ getPageElements,
63
+ getPageNumber,
64
+ onPageChange,
65
+ onVisibilityUpdate,
66
+ observeKey
67
+ }) {
68
+ const latest = useRef({ getPageElements, getPageNumber, onPageChange, onVisibilityUpdate });
69
+ latest.current = { getPageElements, getPageNumber, onPageChange, onVisibilityUpdate };
70
+ useEffect(() => {
71
+ if (!isEnabled || !containerRef.current) return;
72
+ const container = containerRef.current;
73
+ let lastReportedPage = null;
74
+ let updateTimeout = null;
75
+ let frame = 0;
76
+ const evaluate = () => {
77
+ const root = container.getBoundingClientRect();
78
+ const pages = [];
79
+ for (const el of latest.current.getPageElements()) {
80
+ const n = latest.current.getPageNumber(el);
81
+ if (n <= 0) continue;
82
+ const r = el.getBoundingClientRect();
83
+ pages.push({ n, top: r.top, bottom: r.bottom });
84
+ }
85
+ const { page, score, visibility } = measureVisiblePages(pages, root.top, root.bottom);
86
+ if (scrollCompleteRef.current && page !== null && page !== lastReportedPage && score > MIN_VISIBILITY_THRESHOLD) {
87
+ lastReportedPage = page;
88
+ latest.current.onPageChange(page);
89
+ }
90
+ latest.current.onVisibilityUpdate?.(visibility);
91
+ };
92
+ const observer = new IntersectionObserver(
93
+ () => {
94
+ if (updateTimeout) clearTimeout(updateTimeout);
95
+ updateTimeout = setTimeout(evaluate, PAGE_UPDATE_DEBOUNCE_MS);
96
+ },
97
+ { root: container, threshold: INTERSECTION_THRESHOLDS }
98
+ );
99
+ const onScroll = () => {
100
+ if (!frame) {
101
+ frame = requestAnimationFrame(() => {
102
+ frame = 0;
103
+ evaluate();
104
+ });
105
+ }
106
+ };
107
+ container.addEventListener("scroll", onScroll, { passive: true });
108
+ latest.current.getPageElements().forEach((element) => observer.observe(element));
109
+ return () => {
110
+ observer.disconnect();
111
+ container.removeEventListener("scroll", onScroll);
112
+ if (updateTimeout) clearTimeout(updateTimeout);
113
+ if (frame) cancelAnimationFrame(frame);
114
+ };
115
+ }, [containerRef, scrollCompleteRef, isEnabled, observeKey]);
116
+ }
117
+ var MIN_ZOOM = 0.5;
118
+ var MAX_ZOOM = 4;
119
+ var DOUBLE_TAP_ZOOM = 2;
120
+ var MAX_CANVAS_PIXELS = 8e6;
121
+ var MAX_RENDER_DPR = 2;
122
+ function clampZoom(zoom) {
123
+ if (!Number.isFinite(zoom)) return 1;
124
+ return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100;
125
+ }
126
+ var ZOOM_PRESETS = [1.5, 2, 3];
127
+ function cycleZoom(zoom) {
128
+ return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1;
129
+ }
130
+ function doubleTapZoom(zoom) {
131
+ return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM;
132
+ }
133
+ function zoomLabel(zoom) {
134
+ return `${Math.round(zoom * 100)}%`;
135
+ }
136
+ function pinchZoom(startZoom, startDistance, distance2) {
137
+ if (startDistance <= 0) return startZoom;
138
+ return clampZoom(startZoom * distance2 / startDistance);
139
+ }
140
+ function anchoredScroll(scroll, focal, oldZoom, newZoom) {
141
+ if (oldZoom <= 0) return scroll;
142
+ return (scroll + focal) * newZoom / oldZoom - focal;
143
+ }
144
+ function renderDpr(cssWidth, cssHeight, devicePixelRatio, maxPixels = MAX_CANVAS_PIXELS) {
145
+ const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR);
146
+ const area = cssWidth * cssHeight;
147
+ if (area <= 0) return wanted;
148
+ const fits = Math.sqrt(maxPixels / area);
149
+ return Math.max(1, Math.min(wanted, fits));
150
+ }
151
+ function fitPageWidth(contentWidth, pageBorder) {
152
+ if (!Number.isFinite(contentWidth)) return 0;
153
+ return Math.max(0, Math.floor(contentWidth) - pageBorder);
154
+ }
155
+ function contentBoxWidth(el) {
156
+ const style = getComputedStyle(el);
157
+ const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0);
158
+ return Math.max(0, el.clientWidth - padding);
159
+ }
160
+ var distance = (a, b) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY);
161
+ var INTERACTIVE = 'button, a, input, textarea, select, [role="button"]';
162
+ var DOUBLE_TAP_MS = 300;
163
+ var DOUBLE_TAP_SLOP_PX = 30;
164
+ function usePinchZoom({ containerRef, zoom, onZoomChange }) {
165
+ const zoomRef = useRef(zoom);
166
+ const onChangeRef = useRef(onZoomChange);
167
+ onChangeRef.current = onZoomChange;
168
+ const focalRef = useRef(null);
169
+ const appliedZoomRef = useRef(zoom);
170
+ const request = useCallback((next, focal) => {
171
+ const clamped = clampZoom(next);
172
+ if (clamped === zoomRef.current) return;
173
+ focalRef.current = focal;
174
+ zoomRef.current = clamped;
175
+ onChangeRef.current?.(clamped);
176
+ }, []);
177
+ useLayoutEffect(() => {
178
+ zoomRef.current = zoom;
179
+ const container = containerRef.current;
180
+ const previous = appliedZoomRef.current;
181
+ appliedZoomRef.current = zoom;
182
+ if (!container || previous === zoom) return;
183
+ const rect = container.getBoundingClientRect();
184
+ const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 };
185
+ focalRef.current = null;
186
+ container.dataset.zooming = "true";
187
+ container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom);
188
+ container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom);
189
+ requestAnimationFrame(
190
+ () => requestAnimationFrame(() => {
191
+ delete container.dataset.zooming;
192
+ })
193
+ );
194
+ }, [zoom, containerRef]);
195
+ useEffect(() => {
196
+ const el = containerRef.current;
197
+ if (!el) return;
198
+ let pinch = null;
199
+ let lastTap = null;
200
+ let frame = 0;
201
+ let pending = null;
202
+ const focalOf = (a, b) => {
203
+ const rect = el.getBoundingClientRect();
204
+ return {
205
+ x: (a.clientX + b.clientX) / 2 - rect.left,
206
+ y: (a.clientY + b.clientY) / 2 - rect.top
207
+ };
208
+ };
209
+ const flush = () => {
210
+ frame = 0;
211
+ if (pending) request(pending.zoom, pending.focal);
212
+ pending = null;
213
+ };
214
+ const onStart = (e) => {
215
+ if (e.touches.length === 2) {
216
+ pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current };
217
+ lastTap = null;
218
+ }
219
+ };
220
+ const onMove = (e) => {
221
+ if (!pinch || e.touches.length !== 2) return;
222
+ e.preventDefault();
223
+ pending = {
224
+ zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),
225
+ focal: focalOf(e.touches[0], e.touches[1])
226
+ };
227
+ if (!frame) frame = requestAnimationFrame(flush);
228
+ };
229
+ const onEnd = (e) => {
230
+ if (pinch && e.touches.length < 2) {
231
+ pinch = null;
232
+ return;
233
+ }
234
+ if (e.touches.length !== 0 || e.changedTouches.length !== 1) return;
235
+ const t = e.changedTouches[0];
236
+ if (e.target?.closest?.(INTERACTIVE)) return;
237
+ const now = e.timeStamp;
238
+ if (lastTap && now - lastTap.time < DOUBLE_TAP_MS && Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX) {
239
+ e.preventDefault();
240
+ const rect = el.getBoundingClientRect();
241
+ request(doubleTapZoom(zoomRef.current), {
242
+ x: t.clientX - rect.left,
243
+ y: t.clientY - rect.top
244
+ });
245
+ lastTap = null;
246
+ } else {
247
+ lastTap = { time: now, x: t.clientX, y: t.clientY };
248
+ }
249
+ };
250
+ el.addEventListener("touchstart", onStart, { passive: true });
251
+ el.addEventListener("touchmove", onMove, { passive: false });
252
+ el.addEventListener("touchend", onEnd, { passive: false });
253
+ el.addEventListener("touchcancel", onEnd, { passive: false });
254
+ return () => {
255
+ el.removeEventListener("touchstart", onStart);
256
+ el.removeEventListener("touchmove", onMove);
257
+ el.removeEventListener("touchend", onEnd);
258
+ el.removeEventListener("touchcancel", onEnd);
259
+ if (frame) cancelAnimationFrame(frame);
260
+ };
261
+ }, [containerRef, request]);
262
+ }
263
+
264
+ // src/viewers/pdf-viewer-constants.ts
265
+ var LAZY_LOAD_BUFFER_BEFORE = 2;
266
+ var LAZY_LOAD_BUFFER_AFTER = 5;
267
+ var INITIAL_LAZY_LOAD_BUFFER = { before: 0, after: 1 };
268
+
269
+ export { INITIAL_LAZY_LOAD_BUFFER, LAZY_LOAD_BUFFER_AFTER, LAZY_LOAD_BUFFER_BEFORE, MAX_ZOOM, MIN_ZOOM, PAGE_SELECTOR, anchorDelta, anchoredScroll, clampZoom, contentBoxWidth, cycleZoom, doubleTapZoom, fitPageWidth, pinchZoom, renderDpr, usePageIntersectionObserver, usePinchZoom, useScrollAnchor, zoomLabel };
270
+ //# sourceMappingURL=chunk-6QNBSXCE.js.map
271
+ //# sourceMappingURL=chunk-6QNBSXCE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/viewers/page-scroll.ts","../src/viewers/usePageIntersectionObserver.ts","../src/viewers/viewer-zoom.ts","../src/viewers/pdf-viewer-constants.ts"],"names":["useEffect","distance","useRef"],"mappings":"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","file":"chunk-6QNBSXCE.js","sourcesContent":["/**\n * Scroll stability for page-stacked viewers (PDF + parsed/HTML).\n *\n * Pages are lazy: their height can change after the user is already looking at something further\n * down (a placeholder replaced by the real page, a late canvas). Browsers that implement scroll\n * anchoring (Chromium) hide that; Safari/WebKit does not, so the content visibly jumps under the\n * finger and momentum scrolling is cut short. The viewers therefore do their own anchoring, the\n * same way on every engine: native anchoring is switched off and a page that changes height\n * entirely ABOVE the viewport shifts `scrollTop` by exactly that change.\n */\n\nimport { useEffect } from 'react'\nimport type { RefObject } from 'react'\n\n/** One page of a stacked viewer (both viewers mark pages like this). */\nexport const PAGE_SELECTOR = '[role=\"article\"][data-page-number]'\n\n/**\n * How far to move `scrollTop` after a page changed height from `previousHeight` to `nextHeight`.\n * Only a page that lay completely above the visible top edge (`containerTop`) pushes the content\n * the user is reading; anything at or below it just grows or shrinks away from the viewport.\n *\n * @param pageTop viewport-relative top of the page (unchanged by its own resize)\n */\nexport function anchorDelta(\n previousHeight: number,\n nextHeight: number,\n pageTop: number,\n containerTop: number\n): number {\n const delta = nextHeight - previousHeight\n if (delta === 0) return 0\n return pageTop + previousHeight <= containerTop + 1 ? delta : 0\n}\n\nexport interface PageBox {\n n: number\n top: number\n bottom: number\n}\n\n/**\n * Which page is being read: the one showing the most pixels inside [viewTop, viewBottom] (the\n * first on a tie). `score` is those pixels relative to the smaller of the page and the viewport,\n * so a page much taller than the screen can still count as \"mostly visible\". `visibility` maps\n * every page that shows any pixel to its visible fraction (for lazy loading).\n */\nexport function measureVisiblePages(\n pages: readonly PageBox[],\n viewTop: number,\n viewBottom: number\n): { page: number | null; score: number; visibility: Map<number, number> } {\n const visibility = new Map<number, number>()\n let page: number | null = null\n let bestPx = 0\n let score = 0\n const viewHeight = viewBottom - viewTop\n for (const p of pages) {\n const height = p.bottom - p.top\n const px = Math.min(p.bottom, viewBottom) - Math.max(p.top, viewTop)\n if (px <= 0 || height <= 0) continue\n visibility.set(p.n, px / height)\n if (px > bestPx) {\n bestPx = px\n page = p.n\n score = px / Math.min(height, viewHeight)\n }\n }\n return { page, score, visibility }\n}\n\n/**\n * Keep the reading position when pages above it change height. `key` re-scans for pages when the\n * page set changes (page count, first layout).\n */\nexport function useScrollAnchor(containerRef: RefObject<HTMLElement | null>, key: unknown): void {\n useEffect(() => {\n const container = containerRef.current\n if (!container || typeof ResizeObserver === 'undefined') return\n container.style.overflowAnchor = 'none'\n\n const heights = new Map<Element, number>()\n const observer = new ResizeObserver((entries) => {\n let shift = 0\n const containerTop = container.getBoundingClientRect().top\n for (const entry of entries) {\n const el = entry.target\n const height = el.getBoundingClientRect().height\n const previous = heights.get(el)\n heights.set(el, height)\n if (previous === undefined) continue\n shift += anchorDelta(previous, height, el.getBoundingClientRect().top, containerTop)\n }\n // A zoom change re-anchors the scroll position itself (see usePinchZoom).\n if (shift !== 0 && !container.dataset.zooming) container.scrollTop += shift\n })\n container.querySelectorAll(PAGE_SELECTOR).forEach((el) => {\n heights.set(el, el.getBoundingClientRect().height)\n observer.observe(el)\n })\n return () => observer.disconnect()\n }, [containerRef, key])\n}\n","import { useEffect, useRef, RefObject } from 'react'\nimport { measureVisiblePages, type PageBox } from './page-scroll'\n\n// Page synchronization constants\nconst PAGE_UPDATE_DEBOUNCE_MS = 10 // Delay before updating page number after scroll (10ms)\nconst MIN_VISIBILITY_THRESHOLD = 0.15 // Minimum visibility (15%) to consider page \"visible\"\nconst INTERSECTION_THRESHOLDS = [0, 0.25, 0.5, 0.75, 1.0] // IntersectionObserver thresholds\n\ninterface UsePageIntersectionObserverOptions {\n /** Container element that scrolls */\n containerRef: RefObject<HTMLElement | null>\n /** Ref tracking whether initial scroll has completed */\n scrollCompleteRef: RefObject<boolean>\n /** Whether the observer should be active */\n isEnabled: boolean\n /** Function to get page elements to observe */\n getPageElements: () => Element[]\n /** Function to extract page number from element */\n getPageNumber: (element: Element) => number\n /** Callback when page number changes */\n onPageChange: (pageNumber: number) => void\n /** Optional callback with visibility data for custom logic (e.g., lazy loading) */\n onVisibilityUpdate?: (visibilityMap: Map<number, number>) => void\n /**\n * Re-subscribe when this changes (the set of page elements: page count, first layout). Callers\n * may pass fresh inline callbacks every render: they are read through refs and never cause a\n * re-subscribe (a re-subscribe re-delivers every page and, with a state-setting callback, loops).\n */\n observeKey?: unknown\n}\n\n/**\n * Custom hook to track the visible page of a page-stacked viewer.\n * Used for bidirectional page synchronization in document viewers.\n *\n * IntersectionObserver wakes it when pages enter or leave the viewport; a passive scroll listener\n * (at most one measurement per frame) keeps it current in between. The page itself is chosen from\n * live geometry (see `measureVisiblePages`).\n */\nexport function usePageIntersectionObserver({\n containerRef,\n scrollCompleteRef,\n isEnabled,\n getPageElements,\n getPageNumber,\n onPageChange,\n onVisibilityUpdate,\n observeKey,\n}: UsePageIntersectionObserverOptions) {\n const latest = useRef({ getPageElements, getPageNumber, onPageChange, onVisibilityUpdate })\n latest.current = { getPageElements, getPageNumber, onPageChange, onVisibilityUpdate }\n\n useEffect(() => {\n if (!isEnabled || !containerRef.current) return\n\n const container = containerRef.current\n let lastReportedPage: number | null = null\n let updateTimeout: ReturnType<typeof setTimeout> | null = null\n let frame = 0\n\n // Read the live geometry rather than IntersectionObserver ratios: a ratio is relative to the\n // page's own height, so a zoomed page much taller than the screen never reaches the threshold\n // (and ratios only update on a few crossings, which is too coarse for tall pages).\n const evaluate = () => {\n const root = container.getBoundingClientRect()\n const pages: PageBox[] = []\n for (const el of latest.current.getPageElements()) {\n const n = latest.current.getPageNumber(el)\n if (n <= 0) continue\n const r = el.getBoundingClientRect()\n pages.push({ n, top: r.top, bottom: r.bottom })\n }\n const { page, score, visibility } = measureVisiblePages(pages, root.top, root.bottom)\n\n // Only report when the scroll is complete and the page changed\n if (\n scrollCompleteRef.current &&\n page !== null &&\n page !== lastReportedPage &&\n score > MIN_VISIBILITY_THRESHOLD\n ) {\n lastReportedPage = page\n latest.current.onPageChange(page)\n }\n\n // Call optional visibility update callback (e.g., for lazy loading)\n latest.current.onVisibilityUpdate?.(visibility)\n }\n\n const observer = new IntersectionObserver(\n () => {\n // Debounce updates\n if (updateTimeout) clearTimeout(updateTimeout)\n updateTimeout = setTimeout(evaluate, PAGE_UPDATE_DEBOUNCE_MS)\n },\n { root: container, threshold: INTERSECTION_THRESHOLDS }\n )\n // At most one measurement per frame while scrolling; nothing is stored in React state here.\n const onScroll = () => {\n if (!frame) {\n frame = requestAnimationFrame(() => {\n frame = 0\n evaluate()\n })\n }\n }\n container.addEventListener('scroll', onScroll, { passive: true })\n\n // Observe all page elements\n latest.current.getPageElements().forEach((element) => observer.observe(element))\n\n return () => {\n observer.disconnect()\n container.removeEventListener('scroll', onScroll)\n if (updateTimeout) clearTimeout(updateTimeout)\n if (frame) cancelAnimationFrame(frame)\n }\n }, [containerRef, scrollCompleteRef, isEnabled, observeKey])\n}\n","/**\n * Zoom for page-stacked viewers (PDF + parsed/HTML).\n *\n * Browser pinch-zoom only magnifies the bitmap the page already painted: a PDF canvas rendered at\n * fit-width stays blurry however far you pinch. The viewers therefore own the zoom: `zoom` is a\n * multiplier of the fit-width size (1 = fit width, 2 = twice as wide). The PDF viewer re-renders\n * its canvases at the new scale; the parsed viewer reflows its text. This module holds the pure\n * math and the touch gesture hook (pinch, double-tap) both use.\n */\n\nimport { useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport type { RefObject } from 'react'\n\nexport const MIN_ZOOM = 0.5\nexport const MAX_ZOOM = 4\nconst DOUBLE_TAP_ZOOM = 2\n/** Canvas pixel budget per page: iOS Safari fails above ~16.7M pixels in total, so stay well under. */\nexport const MAX_CANVAS_PIXELS = 8_000_000\n/** Device pixel ratio is capped: beyond 2x the extra sharpness is invisible and costs 2-3x memory. */\nconst MAX_RENDER_DPR = 2\n\nexport function clampZoom(zoom: number): number {\n if (!Number.isFinite(zoom)) return 1\n return Math.round(Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, zoom)) * 100) / 100\n}\n\n/** The zoom levels the single zoom button steps through before it returns to fit width. */\nconst ZOOM_PRESETS = [1.5, 2, 3]\n\n/** The zoom button: the next preset above the current zoom, or back to fit width after the last. */\nexport function cycleZoom(zoom: number): number {\n return ZOOM_PRESETS.find((preset) => preset > zoom + 0.05) ?? 1\n}\n\n/** Double-tap toggles between fit width and a comfortable reading zoom. */\nexport function doubleTapZoom(zoom: number): number {\n return zoom > 1.05 ? 1 : DOUBLE_TAP_ZOOM\n}\n\nexport function zoomLabel(zoom: number): string {\n return `${Math.round(zoom * 100)}%`\n}\n\n/** The zoom a pinch has reached: the start zoom scaled by how far the fingers moved apart. */\nexport function pinchZoom(startZoom: number, startDistance: number, distance: number): number {\n if (startDistance <= 0) return startZoom\n return clampZoom((startZoom * distance) / startDistance)\n}\n\n/**\n * New scroll offset that keeps the content point under `focal` (a viewport coordinate) still while\n * the zoom changes from `oldZoom` to `newZoom`.\n */\nexport function anchoredScroll(\n scroll: number,\n focal: number,\n oldZoom: number,\n newZoom: number\n): number {\n if (oldZoom <= 0) return scroll\n return ((scroll + focal) * newZoom) / oldZoom - focal\n}\n\n/**\n * Device pixel ratio to rasterise a page of `cssWidth` x `cssHeight` at: the device's own, capped,\n * and lowered further when the page would otherwise exceed the canvas pixel budget.\n */\nexport function renderDpr(\n cssWidth: number,\n cssHeight: number,\n devicePixelRatio: number,\n maxPixels: number = MAX_CANVAS_PIXELS\n): number {\n const wanted = Math.min(Math.max(devicePixelRatio || 1, 1), MAX_RENDER_DPR)\n const area = cssWidth * cssHeight\n if (area <= 0) return wanted\n const fits = Math.sqrt(maxPixels / area)\n return Math.max(1, Math.min(wanted, fits))\n}\n\n/**\n * Width a fit-width page's content gets in a scroller whose content box is `contentWidth` wide:\n * that box less the page's own border, floored so sub-pixel layout never rounds the page up past\n * the box into a sideways overflow.\n */\nexport function fitPageWidth(contentWidth: number, pageBorder: number): number {\n if (!Number.isFinite(contentWidth)) return 0\n return Math.max(0, Math.floor(contentWidth) - pageBorder)\n}\n\n/**\n * An element's content-box width: `clientWidth` (which, unlike `offsetWidth`, leaves out the\n * vertical scrollbar and the borders) less the horizontal padding.\n */\nexport function contentBoxWidth(el: HTMLElement): number {\n const style = getComputedStyle(el)\n const padding = (parseFloat(style.paddingLeft) || 0) + (parseFloat(style.paddingRight) || 0)\n return Math.max(0, el.clientWidth - padding)\n}\n\nconst distance = (a: Touch, b: Touch) => Math.hypot(a.clientX - b.clientX, a.clientY - b.clientY)\nconst INTERACTIVE = 'button, a, input, textarea, select, [role=\"button\"]'\nconst DOUBLE_TAP_MS = 300\nconst DOUBLE_TAP_SLOP_PX = 30\n\ninterface PinchZoomOptions {\n containerRef: RefObject<HTMLElement | null>\n zoom: number\n onZoomChange?: (zoom: number) => void\n}\n\n/**\n * Pinch and double-tap zoom on a scroller, plus focal-point preservation for EVERY zoom change\n * (gesture, buttons, props): after the new zoom has laid out, the scroll offset is moved so the\n * content under the pinch centre (or the viewport centre) stays where it was.\n *\n * The scroller must carry `touch-action: pan-x pan-y` so the browser leaves two-finger gestures\n * to this hook instead of zooming the whole app.\n */\nexport function usePinchZoom({ containerRef, zoom, onZoomChange }: PinchZoomOptions): void {\n const zoomRef = useRef(zoom)\n const onChangeRef = useRef(onZoomChange)\n onChangeRef.current = onZoomChange\n const focalRef = useRef<{ x: number; y: number } | null>(null)\n const appliedZoomRef = useRef(zoom)\n\n const request = useCallback((next: number, focal: { x: number; y: number } | null) => {\n const clamped = clampZoom(next)\n if (clamped === zoomRef.current) return\n focalRef.current = focal\n zoomRef.current = clamped\n onChangeRef.current?.(clamped)\n }, [])\n\n // Zoom changed (from here or from outside): keep the focal point still once it has laid out.\n useLayoutEffect(() => {\n zoomRef.current = zoom\n const container = containerRef.current\n const previous = appliedZoomRef.current\n appliedZoomRef.current = zoom\n if (!container || previous === zoom) return\n const rect = container.getBoundingClientRect()\n const focal = focalRef.current ?? { x: rect.width / 2, y: rect.height / 2 }\n focalRef.current = null\n // The page-anchoring observer must not also react to this resize.\n container.dataset.zooming = 'true'\n container.scrollLeft = anchoredScroll(container.scrollLeft, focal.x, previous, zoom)\n container.scrollTop = anchoredScroll(container.scrollTop, focal.y, previous, zoom)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => {\n delete container.dataset.zooming\n })\n )\n }, [zoom, containerRef])\n\n useEffect(() => {\n const el = containerRef.current\n if (!el) return\n let pinch: { startDistance: number; startZoom: number } | null = null\n let lastTap: { time: number; x: number; y: number } | null = null\n let frame = 0\n let pending: { zoom: number; focal: { x: number; y: number } } | null = null\n\n const focalOf = (a: Touch, b: Touch) => {\n const rect = el.getBoundingClientRect()\n return {\n x: (a.clientX + b.clientX) / 2 - rect.left,\n y: (a.clientY + b.clientY) / 2 - rect.top,\n }\n }\n const flush = () => {\n frame = 0\n if (pending) request(pending.zoom, pending.focal)\n pending = null\n }\n\n const onStart = (e: TouchEvent) => {\n if (e.touches.length === 2) {\n pinch = { startDistance: distance(e.touches[0], e.touches[1]), startZoom: zoomRef.current }\n lastTap = null\n }\n }\n const onMove = (e: TouchEvent) => {\n if (!pinch || e.touches.length !== 2) return\n e.preventDefault()\n pending = {\n zoom: pinchZoom(pinch.startZoom, pinch.startDistance, distance(e.touches[0], e.touches[1])),\n focal: focalOf(e.touches[0], e.touches[1]),\n }\n if (!frame) frame = requestAnimationFrame(flush)\n }\n const onEnd = (e: TouchEvent) => {\n if (pinch && e.touches.length < 2) {\n pinch = null\n return\n }\n if (e.touches.length !== 0 || e.changedTouches.length !== 1) return\n const t = e.changedTouches[0]\n if ((e.target as Element | null)?.closest?.(INTERACTIVE)) return\n const now = e.timeStamp\n if (\n lastTap &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(t.clientX - lastTap.x, t.clientY - lastTap.y) < DOUBLE_TAP_SLOP_PX\n ) {\n e.preventDefault()\n const rect = el.getBoundingClientRect()\n request(doubleTapZoom(zoomRef.current), {\n x: t.clientX - rect.left,\n y: t.clientY - rect.top,\n })\n lastTap = null\n } else {\n lastTap = { time: now, x: t.clientX, y: t.clientY }\n }\n }\n\n el.addEventListener('touchstart', onStart, { passive: true })\n el.addEventListener('touchmove', onMove, { passive: false })\n el.addEventListener('touchend', onEnd, { passive: false })\n el.addEventListener('touchcancel', onEnd, { passive: false })\n return () => {\n el.removeEventListener('touchstart', onStart)\n el.removeEventListener('touchmove', onMove)\n el.removeEventListener('touchend', onEnd)\n el.removeEventListener('touchcancel', onEnd)\n if (frame) cancelAnimationFrame(frame)\n }\n }, [containerRef, request])\n}\n","/** Pages to render before the visible area (canvas pre-load buffer) */\nexport const LAZY_LOAD_BUFFER_BEFORE = 2\n\n/** Pages to render after the visible area (canvas pre-load buffer) */\nexport const LAZY_LOAD_BUFFER_AFTER = 5\n\n/**\n * Smaller render window used on the very first paint so time-to-first-visible-page is\n * fast. Expanded to LAZY_LOAD_BUFFER_BEFORE / LAZY_LOAD_BUFFER_AFTER once the browser\n * is idle (via requestIdleCallback / setTimeout fallback).\n */\nexport const INITIAL_LAZY_LOAD_BUFFER = { before: 0, after: 1 }\n"]}
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
- var chunkW2FATOTX_cjs = require('./chunk-W2FATOTX.cjs');
3
+ var chunk3JAEX57E_cjs = require('./chunk-3JAEX57E.cjs');
4
4
  var chunkSUZORMAB_cjs = require('./chunk-SUZORMAB.cjs');
5
5
  var chunk2IJP73ZG_cjs = require('./chunk-2IJP73ZG.cjs');
6
- var chunk7LIMHY56_cjs = require('./chunk-7LIMHY56.cjs');
6
+ var chunkO32T7XRD_cjs = require('./chunk-O32T7XRD.cjs');
7
7
  var chunkNDIKMOBJ_cjs = require('./chunk-NDIKMOBJ.cjs');
8
8
  var react = require('react');
9
9
  var reactQuery = require('@tanstack/react-query');
@@ -210,7 +210,7 @@ function versionsWithMarkup(versions) {
210
210
  }
211
211
  var SIGNED_UNCHANGED = "The signed PDF is unchanged: the comments are kept beside it as markup.";
212
212
  function useDocumentMarkup(documentData, snapshotVersion, currentSigned = false) {
213
- const { client, notify, saveFile, onDocumentsChanged } = chunkW2FATOTX_cjs.useDocumentTools();
213
+ const { client, notify, saveFile, onDocumentsChanged } = chunk3JAEX57E_cjs.useDocumentTools();
214
214
  const documentId = documentData?.external_id;
215
215
  const currentVersion = documentData?.current_version ?? 1;
216
216
  const shownVersion = snapshotVersion ?? currentVersion;
@@ -241,11 +241,11 @@ function useDocumentMarkup(documentData, snapshotVersion, currentSigned = false)
241
241
  const downloadMarkup = react.useCallback(async () => {
242
242
  if (!documentId) return;
243
243
  if (currentSigned) {
244
- notify(chunkW2FATOTX_cjs.SIGNED_LOCKED_REASON, "info");
244
+ notify(chunk3JAEX57E_cjs.SIGNED_LOCKED_REASON, "info");
245
245
  return;
246
246
  }
247
247
  try {
248
- const { blob, fileName } = await chunkW2FATOTX_cjs.fetchMarkupPdf(
248
+ const { blob, fileName } = await chunk3JAEX57E_cjs.fetchMarkupPdf(
249
249
  client,
250
250
  documentId,
251
251
  snapshotVersion ? snapshotVersion : void 0
@@ -383,17 +383,17 @@ function useIsOnline() {
383
383
  );
384
384
  }
385
385
  function useDocumentBytes(documentRef, options) {
386
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
386
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
387
387
  const { version, kind, enabled = true, fallback } = options;
388
388
  return reactQuery.useQuery({
389
- queryKey: chunk7LIMHY56_cjs.documentBytesKey(documentRef, version ?? null, kind),
389
+ queryKey: chunkO32T7XRD_cjs.documentBytesKey(documentRef, version ?? null, kind),
390
390
  queryFn: async ({ signal }) => {
391
391
  if (fallback && typeof navigator !== "undefined" && navigator.onLine === false) {
392
392
  const offline = await fallback();
393
393
  if (offline) return offline;
394
394
  }
395
395
  try {
396
- return await (kind === "original" ? chunkW2FATOTX_cjs.fetchDocumentFile : chunkW2FATOTX_cjs.fetchDocumentPdf)(
396
+ return await (kind === "original" ? chunk3JAEX57E_cjs.fetchDocumentFile : chunk3JAEX57E_cjs.fetchDocumentPdf)(
397
397
  client,
398
398
  documentRef,
399
399
  { signal }
@@ -438,10 +438,10 @@ async function fetchDocumentSignatures(client, documentRef) {
438
438
  return data;
439
439
  }
440
440
  function useDocumentSignatures(documentId, enabled = true) {
441
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
441
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
442
442
  const { docId, version } = chunkNDIKMOBJ_cjs.parseVersionRef(documentId);
443
443
  return reactQuery.useQuery({
444
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.documentSignatures(docId ?? "", version),
444
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.documentSignatures(docId ?? "", version),
445
445
  queryFn: () => fetchDocumentSignatures(client, documentId),
446
446
  enabled: enabled && !!docId,
447
447
  staleTime: 6e4
@@ -506,7 +506,7 @@ async function signDocument(client$1, deploymentDomain, {
506
506
  return signed.data;
507
507
  }
508
508
  function useSignDocument() {
509
- const env = chunkW2FATOTX_cjs.useDocumentTools();
509
+ const env = chunk3JAEX57E_cjs.useDocumentTools();
510
510
  const queryClient = reactQuery.useQueryClient();
511
511
  return reactQuery.useMutation({
512
512
  mutationFn: (vars) => {
@@ -515,7 +515,7 @@ function useSignDocument() {
515
515
  },
516
516
  onSuccess: async (result) => {
517
517
  await env.onDocumentsChanged?.([result.doc_ext_id], "signed");
518
- await queryClient.invalidateQueries({ queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.documentSignatures() });
518
+ await queryClient.invalidateQueries({ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.documentSignatures() });
519
519
  }
520
520
  });
521
521
  }
@@ -552,9 +552,9 @@ async function fetchSignatureVerification(client, reference) {
552
552
  return data;
553
553
  }
554
554
  function useSignatureVerification(reference) {
555
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
555
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
556
556
  return reactQuery.useQuery({
557
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.signatureVerification(reference ?? ""),
557
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.signatureVerification(reference ?? ""),
558
558
  queryFn: () => fetchSignatureVerification(client, reference),
559
559
  enabled: !!reference,
560
560
  retry: false
@@ -567,7 +567,7 @@ async function matchSignedCopy(file, verification) {
567
567
  return signature ? { kind: "earlier", signature } : { kind: "none" };
568
568
  }
569
569
  function useOpenWorkspaceRead() {
570
- const arbi = chunk7LIMHY56_cjs.useArbiHost().arbi;
570
+ const arbi = chunkO32T7XRD_cjs.useArbiHost().arbi;
571
571
  const workspaceId = arbi?.hasWorkspace ? arbi.getWorkspaceId() : void 0;
572
572
  const read = (run) => arbi && workspaceId ? arbi.readInWorkspace(workspaceId, run) : run();
573
573
  return { workspaceId, read };
@@ -661,9 +661,9 @@ async function fetchDocumentSignatureRequests(client, documentId) {
661
661
  return data;
662
662
  }
663
663
  function useDocumentSignatureRequests(documentId, enabled = true) {
664
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
664
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
665
665
  return reactQuery.useQuery({
666
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.signatureRequestsForDocument(documentId ?? ""),
666
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.signatureRequestsForDocument(documentId ?? ""),
667
667
  queryFn: () => fetchDocumentSignatureRequests(client, documentId),
668
668
  enabled: enabled && !!documentId,
669
669
  staleTime: 15e3
@@ -706,10 +706,10 @@ async function saveSignatureRequest(client, { documentId, version, fields, messa
706
706
  }
707
707
  function useInvalidateRequests() {
708
708
  const queryClient = reactQuery.useQueryClient();
709
- return () => queryClient.invalidateQueries({ queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.signatureRequests() });
709
+ return () => queryClient.invalidateQueries({ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.signatureRequests() });
710
710
  }
711
711
  function useSaveSignatureRequest() {
712
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
712
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
713
713
  const invalidate = useInvalidateRequests();
714
714
  return reactQuery.useMutation({
715
715
  mutationFn: (vars) => saveSignatureRequest(client, vars),
@@ -717,7 +717,7 @@ function useSaveSignatureRequest() {
717
717
  });
718
718
  }
719
719
  function useVoidSignatureRequest() {
720
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
720
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
721
721
  const invalidate = useInvalidateRequests();
722
722
  return reactQuery.useMutation({
723
723
  mutationFn: async (requestId) => {
@@ -731,7 +731,7 @@ function useVoidSignatureRequest() {
731
731
  });
732
732
  }
733
733
  function useDeclineSignatureRequest() {
734
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
734
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
735
735
  const invalidate = useInvalidateRequests();
736
736
  return reactQuery.useMutation({
737
737
  mutationFn: async ({ requestId, reason }) => {
@@ -771,7 +771,7 @@ async function signSignatureRequest(client$1, deploymentDomain, { request, pdfBl
771
771
  return signed.data;
772
772
  }
773
773
  function useSignSignatureRequest() {
774
- const env = chunkW2FATOTX_cjs.useDocumentTools();
774
+ const env = chunk3JAEX57E_cjs.useDocumentTools();
775
775
  const invalidate = useInvalidateRequests();
776
776
  const queryClient = reactQuery.useQueryClient();
777
777
  return reactQuery.useMutation({
@@ -783,16 +783,16 @@ function useSignSignatureRequest() {
783
783
  await invalidate();
784
784
  if (result.completed && result.request.doc_ext_id) {
785
785
  await env.onDocumentsChanged?.([result.request.doc_ext_id], "signed");
786
- await queryClient.invalidateQueries({ queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.documentSignatures() });
786
+ await queryClient.invalidateQueries({ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.documentSignatures() });
787
787
  }
788
788
  }
789
789
  });
790
790
  }
791
791
  function useSignerCandidates(enabled = true) {
792
- const { client, user } = chunkW2FATOTX_cjs.useDocumentTools();
792
+ const { client, user } = chunk3JAEX57E_cjs.useDocumentTools();
793
793
  const { workspaceId, read } = useOpenWorkspaceRead();
794
794
  return reactQuery.useQuery({
795
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.signatureCandidates(workspaceId ?? ""),
795
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.signatureCandidates(workspaceId ?? ""),
796
796
  queryFn: async () => {
797
797
  const { data, error } = await read(() => client.GET("/v1/workspace/users"));
798
798
  if (!data) throw new Error(detail(error, "The workspace members could not be read"));
@@ -830,14 +830,14 @@ async function inviteSigners(client, documentId, emails) {
830
830
  }
831
831
  }
832
832
  function useInviteSigners() {
833
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
833
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
834
834
  const invalidate = useInvalidateRequests();
835
835
  const queryClient = reactQuery.useQueryClient();
836
836
  return reactQuery.useMutation({
837
837
  mutationFn: ({ documentId, emails }) => inviteSigners(client, documentId, emails),
838
838
  onSuccess: async () => {
839
839
  await invalidate();
840
- await queryClient.invalidateQueries({ queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.signatureCandidates() });
840
+ await queryClient.invalidateQueries({ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.signatureCandidates() });
841
841
  }
842
842
  });
843
843
  }
@@ -874,9 +874,9 @@ async function deleteSavedSignature(client) {
874
874
  if (!response.ok) throw new Error(detail2(error, "Your saved signature could not be deleted"));
875
875
  }
876
876
  function useSavedSignature(enabled = true) {
877
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
877
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
878
878
  return reactQuery.useQuery({
879
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.savedSignature(),
879
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.savedSignature(),
880
880
  queryFn: () => fetchSavedSignature(client),
881
881
  enabled,
882
882
  staleTime: 6e4,
@@ -884,19 +884,19 @@ function useSavedSignature(enabled = true) {
884
884
  });
885
885
  }
886
886
  function useStoreSavedSignature() {
887
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
887
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
888
888
  const queryClient = reactQuery.useQueryClient();
889
889
  return reactQuery.useMutation({
890
890
  mutationFn: (signature) => storeSavedSignature(client, signature),
891
- onSuccess: (_, signature) => queryClient.setQueryData(chunk7LIMHY56_cjs.arbiQueryKeys.savedSignature(), signature)
891
+ onSuccess: (_, signature) => queryClient.setQueryData(chunkO32T7XRD_cjs.arbiQueryKeys.savedSignature(), signature)
892
892
  });
893
893
  }
894
894
  function useDeleteSavedSignature() {
895
- const { client } = chunkW2FATOTX_cjs.useDocumentTools();
895
+ const { client } = chunk3JAEX57E_cjs.useDocumentTools();
896
896
  const queryClient = reactQuery.useQueryClient();
897
897
  return reactQuery.useMutation({
898
898
  mutationFn: () => deleteSavedSignature(client),
899
- onSuccess: () => queryClient.setQueryData(chunk7LIMHY56_cjs.arbiQueryKeys.savedSignature(), null)
899
+ onSuccess: () => queryClient.setQueryData(chunkO32T7XRD_cjs.arbiQueryKeys.savedSignature(), null)
900
900
  });
901
901
  }
902
902
  function pngBytes(base64) {
@@ -984,14 +984,14 @@ async function signFileShare(client$1, domain, vars) {
984
984
  }
985
985
  function useFileShare(client, shareId, signing) {
986
986
  return reactQuery.useQuery({
987
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.fileShare(shareId),
987
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.fileShare(shareId),
988
988
  queryFn: () => getFileShare(client, shareId),
989
989
  refetchInterval: signing ? false : 5e3
990
990
  });
991
991
  }
992
992
  function useFileSharePdf(client, shareId, share) {
993
993
  return reactQuery.useQuery({
994
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.fileSharePdf(shareId, share?.status),
994
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.fileSharePdf(shareId, share?.status),
995
995
  queryFn: () => fileShareBytes(client, shareId, share?.status === "completed" ? "signed" : "view"),
996
996
  enabled: !!share?.can_preview,
997
997
  staleTime: Infinity
@@ -999,7 +999,7 @@ function useFileSharePdf(client, shareId, share) {
999
999
  }
1000
1000
  function useFileShares(client) {
1001
1001
  return reactQuery.useQuery({
1002
- queryKey: chunk7LIMHY56_cjs.arbiQueryKeys.fileShares(),
1002
+ queryKey: chunkO32T7XRD_cjs.arbiQueryKeys.fileShares(),
1003
1003
  queryFn: async () => {
1004
1004
  const result = await client.GET("/v1/file-shares");
1005
1005
  if (!result.data) throw new Error("Could not load shared files");
@@ -1085,5 +1085,5 @@ exports.useSignerCandidates = useSignerCandidates;
1085
1085
  exports.useStoreSavedSignature = useStoreSavedSignature;
1086
1086
  exports.useVoidSignatureRequest = useVoidSignatureRequest;
1087
1087
  exports.versionsWithMarkup = versionsWithMarkup;
1088
- //# sourceMappingURL=chunk-QF2BW6HZ.cjs.map
1089
- //# sourceMappingURL=chunk-QF2BW6HZ.cjs.map
1088
+ //# sourceMappingURL=chunk-DI5KSVKY.cjs.map
1089
+ //# sourceMappingURL=chunk-DI5KSVKY.cjs.map