@epam/ai-dial-attachment-canvas 1.2.8 → 1.2.9

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.
@@ -0,0 +1,266 @@
1
+ import "./PdfContent.css";
2
+ import { a as e, n as t, r as n } from "./LazyContentBoundary-tNE1ExbI.js";
3
+ import { mergeClasses as r } from "@epam/ai-dial-chat-shared";
4
+ import { DIAL_ICON_SIZE as i, DIAL_KIT_ICON_STROKE as a, Dropdown as o, ElementSize as s, FabButton as c, Input as ee } from "@epam/ai-dial-ui-kit";
5
+ import { IconMenu2 as te, IconX as ne } from "@tabler/icons-react";
6
+ import { useCallback as l, useEffect as u, useId as re, useRef as d, useState as f } from "react";
7
+ import { jsx as p, jsxs as m } from "react/jsx-runtime";
8
+ import { DocumentPreview as ie, PageThumbnail as ae } from "@epam/ai-dial-react-pdf-highlighter";
9
+ var oe = { viewer: "_viewer_1gfxm_1" }, h = null, se = (e) => (h ||= new Promise((t, n) => {
10
+ try {
11
+ t(e());
12
+ } catch (e) {
13
+ n(e);
14
+ }
15
+ }).catch((e) => {
16
+ throw h = null, e;
17
+ }), h), ce = 15, g = 3, le = 172, ue = 400, _ = 150, de = 60, v = ({ url: h, highlights: v, selectedHighlightId: y, selectedPageNumber: b, loadPdf: x, configurePdfWorker: S, hideHeader: fe = !1, onLoadError: C, labels: { thumbnailsLabel: pe = "Thumbnails", showThumbnailsLabel: me = "Show thumbnails", hideThumbnailsLabel: he = "Hide thumbnails", pageNumberLabel: ge = "Page number", loadingLabel: _e = "Loading…", errorLabel: ve = "Failed to load content", retryLabel: w = "Retry" } = {} }) => {
18
+ let [T, E] = f(() => S ? "preparing" : "ready"), [ye, be] = f(0), xe = l(async (t) => {
19
+ try {
20
+ return await (x ?? e)(t);
21
+ } catch (e) {
22
+ throw C?.(t), e;
23
+ }
24
+ }, [x, C]);
25
+ u(() => {
26
+ if (!S) return;
27
+ E("preparing");
28
+ let e = !1;
29
+ return se(S).then(() => {
30
+ e || E("ready");
31
+ }).catch(() => {
32
+ e || E("error");
33
+ }), () => {
34
+ e = !0;
35
+ };
36
+ }, [S, ye]);
37
+ let Se = l(() => {
38
+ be((e) => e + 1);
39
+ }, []), D = re(), [O, Ce] = f(0), [k, A] = f(/* @__PURE__ */ new Map()), [j, we] = f(!1), [M, N] = f(() => b ?? (y ? v.find((e) => e.id === y)?.bboxes[0]?.page ?? 1 : 1)), P = d(null), F = d(null), [Te, I] = f([]), [L, R] = f(le), [z, Ee] = f(ue), [De, B] = f(0), V = d(!1), H = d(0), U = d(null);
40
+ u(() => {
41
+ if (b != null) {
42
+ N(b);
43
+ return;
44
+ }
45
+ if (!y) return;
46
+ let e = v.find((e) => e.id === y)?.bboxes[0]?.page;
47
+ e != null && N(e);
48
+ }, [
49
+ b,
50
+ y,
51
+ v
52
+ ]), u(() => {
53
+ let e = F.current;
54
+ if (!j || !e) return;
55
+ let t = new ResizeObserver((e) => {
56
+ let t = e[0]?.contentRect.height;
57
+ t && Ee(t);
58
+ });
59
+ return t.observe(e), () => t.disconnect();
60
+ }, [j]);
61
+ let Oe = l((e) => {
62
+ if (!e || V.current) return;
63
+ let t = e.getBoundingClientRect().height;
64
+ t > 0 && (V.current = !0, R(t));
65
+ }, []), ke = l((e) => {
66
+ H.current = e.currentTarget.scrollTop, U.current ??= requestAnimationFrame(() => {
67
+ U.current = null, B(H.current);
68
+ });
69
+ }, []);
70
+ u(() => () => {
71
+ U.current != null && cancelAnimationFrame(U.current);
72
+ }, []);
73
+ let W = l((e) => {
74
+ if (O === 0) return;
75
+ let t = Math.max(0, (M - 1) * L - e.clientHeight / 2 + L / 2);
76
+ H.current = t, B(t), e.scrollTop = t;
77
+ }, [
78
+ M,
79
+ O,
80
+ L
81
+ ]), Ae = l((e) => {
82
+ F.current = e, e && W(e);
83
+ }, [W]);
84
+ u(() => {
85
+ let e = F.current;
86
+ e && W(e);
87
+ }, [W]);
88
+ let G = Math.max(0, Math.floor(De / L) - g), je = Math.ceil(z / L) + 6, K = Math.min(O - 1, G + je);
89
+ u(() => {
90
+ if (O === 0) return;
91
+ let e = Math.min(O, ce);
92
+ I(Array.from({ length: e }, (e, t) => t + 1));
93
+ }, [O]), u(() => {
94
+ if (!j || O === 0) return;
95
+ let e = setTimeout(() => {
96
+ I((e) => {
97
+ let t = new Set(e), n = !1;
98
+ for (let e = G + 1; e <= K + 1; e++) t.has(e) || (t.add(e), n = !0);
99
+ return n ? Array.from(t).sort((e, t) => e - t) : e;
100
+ });
101
+ }, _);
102
+ return () => clearTimeout(e);
103
+ }, [
104
+ j,
105
+ G,
106
+ K,
107
+ O
108
+ ]), u(() => {
109
+ if (O === 0) return;
110
+ let e = setTimeout(() => {
111
+ let e = Math.ceil(z / L / 2) + g, t = Math.max(0, M - 1 - e), n = Math.min(O - 1, M - 1 + e);
112
+ I((e) => {
113
+ let r = new Set(e), i = !1;
114
+ for (let e = t + 1; e <= n + 1; e++) r.has(e) || (r.add(e), i = !0);
115
+ return i ? Array.from(r).sort((e, t) => e - t) : e;
116
+ });
117
+ }, _);
118
+ return () => clearTimeout(e);
119
+ }, [
120
+ M,
121
+ O,
122
+ z,
123
+ L
124
+ ]);
125
+ let Me = l((e) => {
126
+ A((t) => new Map([...t, ...e]));
127
+ }, []), [q, Ne] = f(!1), Pe = l((e) => {
128
+ P.current = e, Ne(!0);
129
+ }, []), J = d(null);
130
+ u(() => {
131
+ if (!q) return;
132
+ let e = J.current, t = e?.querySelector(".pdf-container"), n = e?.querySelector(".pdf-highlight-viewer");
133
+ if (!t || !n) return;
134
+ let r = () => {
135
+ let e = n.scrollWidth - n.clientWidth;
136
+ e > 0 && (n.scrollLeft = e / 2);
137
+ };
138
+ r();
139
+ let i = new ResizeObserver(r);
140
+ i.observe(t), i.observe(n);
141
+ let a = P.current?.getZoom(), o = 0, s, c = () => {
142
+ let e = P.current?.getZoom();
143
+ e !== a && (a = e, o = de), o > 0 && (r(), --o), s = requestAnimationFrame(c);
144
+ };
145
+ return s = requestAnimationFrame(c), () => {
146
+ cancelAnimationFrame(s), i.disconnect();
147
+ };
148
+ }, [q]), u(() => {
149
+ if (!q || y || b != null) return;
150
+ let e = requestAnimationFrame(() => {
151
+ P.current?.navigateToPage(1);
152
+ });
153
+ return () => cancelAnimationFrame(e);
154
+ }, [
155
+ q,
156
+ y,
157
+ b
158
+ ]);
159
+ let Y = l((e) => {
160
+ N(e), P.current?.navigateToPage(e);
161
+ }, []), Fe = l((e) => {
162
+ N(e);
163
+ }, []), [X, Z] = f(() => String(M));
164
+ u(() => {
165
+ Z(String(M));
166
+ }, [M]);
167
+ let Q = l((e) => {
168
+ let t = Number(e);
169
+ Number.isInteger(t) && t >= 1 && t <= O ? Y(t) : Z(String(M));
170
+ }, [
171
+ O,
172
+ M,
173
+ Y
174
+ ]);
175
+ if (!h) return null;
176
+ if (T === "preparing") return /* @__PURE__ */ p(n, { loadingLabel: _e });
177
+ if (T === "error") return /* @__PURE__ */ p(t, {
178
+ errorLabel: ve,
179
+ retryLabel: w,
180
+ onRetry: Se
181
+ });
182
+ let $ = [];
183
+ for (let e = G + 1; e <= K + 1 && e <= O; e++) $.push(/* @__PURE__ */ p("div", {
184
+ ref: e === G + 1 ? Oe : void 0,
185
+ children: /* @__PURE__ */ p(ae, {
186
+ pageNum: e,
187
+ onSelectPage: Y,
188
+ isSelected: M === e,
189
+ isLoading: !k.has(e),
190
+ thumbnailUrl: k.get(e) ?? null
191
+ })
192
+ }, e));
193
+ let Ie = G * L, Le = Math.max(0, O - K - 1) * L;
194
+ return /* @__PURE__ */ m("div", {
195
+ className: "relative flex h-full overflow-hidden",
196
+ children: [O > 0 && /* @__PURE__ */ p("div", {
197
+ className: "absolute start-3 top-3 z-10",
198
+ children: /* @__PURE__ */ p(o, {
199
+ open: j,
200
+ onOpenChange: we,
201
+ placement: "bottom-start",
202
+ matchReferenceWidth: !1,
203
+ renderOverlay: () => /* @__PURE__ */ m("div", {
204
+ className: "flex w-36 flex-col",
205
+ children: [/* @__PURE__ */ p("div", {
206
+ className: "shrink-0 p-1",
207
+ children: /* @__PURE__ */ p(ee, {
208
+ size: s.Small,
209
+ "aria-label": ge,
210
+ value: X,
211
+ postfix: `/ ${O}`,
212
+ inputMode: "numeric",
213
+ onChange: (e) => Z(e ?? ""),
214
+ onBlur: () => Q(X),
215
+ onKeyDown: (e) => {
216
+ e.key === "Enter" && Q(X);
217
+ }
218
+ })
219
+ }), /* @__PURE__ */ m("div", {
220
+ ref: Ae,
221
+ id: D,
222
+ role: "region",
223
+ "aria-label": pe,
224
+ onScroll: ke,
225
+ className: "max-h-[70vh] min-h-0 overflow-y-auto overflow-x-hidden p-1 [scrollbar-gutter:stable]",
226
+ children: [
227
+ /* @__PURE__ */ p("div", { style: { height: Ie } }),
228
+ $,
229
+ /* @__PURE__ */ p("div", { style: { height: Le } })
230
+ ]
231
+ })]
232
+ }),
233
+ children: /* @__PURE__ */ p(c, {
234
+ icon: p(j ? ne : te, {
235
+ size: i.LG,
236
+ stroke: a,
237
+ "aria-hidden": !0
238
+ }),
239
+ "aria-label": j ? he : me,
240
+ "aria-expanded": j,
241
+ "aria-controls": j ? D : void 0
242
+ })
243
+ })
244
+ }), /* @__PURE__ */ p("div", {
245
+ ref: J,
246
+ className: r("min-w-0 flex-1 overflow-hidden", oe.viewer),
247
+ children: /* @__PURE__ */ p(ie, {
248
+ fileUrl: h,
249
+ loadFileCb: xe,
250
+ highlights: v,
251
+ selectedHighlightId: y,
252
+ selectedPageNumber: b,
253
+ showOccurrences: !1,
254
+ onTotalPagesChange: Ce,
255
+ thumbnailPageNumbers: Te,
256
+ onThumbnailsLoaded: Me,
257
+ onViewerReady: Pe,
258
+ onCurrentPageChange: Fe,
259
+ viewerOptions: { enableVirtualScrolling: !0 },
260
+ containerClassName: fe ? "[&>div:first-child]:hidden" : void 0
261
+ })
262
+ })]
263
+ });
264
+ };
265
+ //#endregion
266
+ export { v as PdfContent };
package/index.js CHANGED
@@ -96,9 +96,7 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
96
96
  type: ge,
97
97
  html: ee
98
98
  }, "*"));
99
- return;
100
- }
101
- if (!(k || O)) try {
99
+ } else if (!(k || O)) try {
102
100
  b.current?.contentDocument ?? f(!0);
103
101
  } catch {
104
102
  f(!0);
@@ -347,7 +345,7 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
347
345
  let [{ DocxDocument: n, DocxScrollViewer: r }, { chartEx: o }, { createDocxHighlightSurface: c }] = await Promise.all([
348
346
  import("@silurus/ooxml/docx"),
349
347
  import("@silurus/ooxml/chart-ex"),
350
- import("./ooxml-highlight-surfaces-BzgOKpBV.js")
348
+ import("./ooxml-highlight-surfaces-C18JJb0P.js")
351
349
  ]), l = await n.load(t.url, { chartEx: o });
352
350
  if (i()) throw l.destroy(), new De();
353
351
  let u = r.fromDocument(e, l, {
@@ -367,7 +365,7 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
367
365
  let [{ PptxPresentation: n, PptxScrollViewer: r }, { chartEx: o }, { createPptxHighlightSurface: c }] = await Promise.all([
368
366
  import("@silurus/ooxml/pptx"),
369
367
  import("@silurus/ooxml/chart-ex"),
370
- import("./ooxml-highlight-surfaces-BzgOKpBV.js")
368
+ import("./ooxml-highlight-surfaces-C18JJb0P.js")
371
369
  ]), l = await n.load(t.url, { chartEx: o });
372
370
  if (i()) throw l.destroy(), new De();
373
371
  let u = r.fromPresentation(e, l, {
@@ -387,7 +385,7 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
387
385
  let [{ XlsxViewer: n }, { chartEx: r }, { createXlsxHighlightSurface: c }] = await Promise.all([
388
386
  import("@silurus/ooxml/xlsx"),
389
387
  import("@silurus/ooxml/chart-ex"),
390
- import("./ooxml-highlight-surfaces-BzgOKpBV.js")
388
+ import("./ooxml-highlight-surfaces-C18JJb0P.js")
391
389
  ]), l = new n(e, {
392
390
  showZoomSlider: !0,
393
391
  chartEx: r,
@@ -566,15 +564,11 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
566
564
  let n = e.toLowerCase();
567
565
  return t.find((e) => e.contentType.split(",").some((e) => e.trim().toLowerCase() === n && e.trim() !== ""));
568
566
  }, Ae = (e, t) => {
569
- if (!(e == null || e === "")) return Object.prototype.hasOwnProperty.call(t, e) ? t[e] : void 0;
567
+ if (e != null && e !== "") return Object.prototype.hasOwnProperty.call(t, e) ? t[e] : void 0;
570
568
  }, je = (e) => `${e}:grouped-visualizer`, Me = (e, t) => {
571
569
  let n = (t.contentType ?? "").split(",").map((e) => e.trim().toLowerCase()).filter((e) => e !== ""), r = [], i = [];
572
570
  return e.forEach((e) => {
573
- if (e.url != null && e.url !== "" && (n.length === 0 || n.includes(e.contentType.toLowerCase()))) {
574
- r.push(e);
575
- return;
576
- }
577
- i.push(e);
571
+ e.url != null && e.url !== "" && (n.length === 0 || n.includes(e.contentType.toLowerCase())) ? r.push(e) : i.push(e);
578
572
  }), {
579
573
  claimed: r,
580
574
  unclaimed: i
@@ -688,7 +682,7 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
688
682
  jsonExpandIcon: "_jsonExpandIcon_13ogb_54",
689
683
  jsonCollapseIcon: "_jsonCollapseIcon_13ogb_67",
690
684
  jsonCollapsedContent: "_jsonCollapsedContent_13ogb_84"
691
- }, Ie = () => N(async () => ({ default: (await import("./PdfContent-ELaDSyFF.js")).PdfContent })), Le = ({ url: e, fileName: t, loadErrorLabel: n }) => {
685
+ }, Ie = () => N(async () => ({ default: (await import("./PdfContent-BfC7giGe.js")).PdfContent })), Le = ({ url: e, fileName: t, loadErrorLabel: n }) => {
692
686
  let [r, i] = z(!1);
693
687
  return I(() => {
694
688
  i(!1);
@@ -708,7 +702,7 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
708
702
  className: "max-h-full max-w-full object-contain",
709
703
  onError: () => i(!0)
710
704
  });
711
- }, Re = new Set([
705
+ }, Re = /* @__PURE__ */ new Set([
712
706
  i.PlainText,
713
707
  i.Code,
714
708
  i.Ooxml
@@ -1158,11 +1152,11 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
1158
1152
  onVisualizerSendMessage: Fe
1159
1153
  })
1160
1154
  });
1161
- }), Ue = new Set(["html", "htm"]), Z = {
1155
+ }), Ue = /* @__PURE__ */ new Set(["html", "htm"]), Z = {
1162
1156
  docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
1163
1157
  xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
1164
1158
  pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation"
1165
- }, We = new Set(/* @__PURE__ */ "txt.md.markdown.json.jsonl.ndjson.xml.csv.tsv.yaml.yml.toml.ini.conf.cfg.css.scss.sass.less.js.jsx.ts.tsx.mjs.cjs.mts.cts.py.rb.go.rs.java.kt.swift.c.h.cpp.cs.sh.bash.zsh.fish.ps1.log.env.gitignore.dockerfile.makefile.sql".split(".")), Ge = {
1159
+ }, We = /* @__PURE__ */ new Set(/* @__PURE__ */ "txt.md.markdown.json.jsonl.ndjson.xml.csv.tsv.yaml.yml.toml.ini.conf.cfg.css.scss.sass.less.js.jsx.ts.tsx.mjs.cjs.mts.cts.py.rb.go.rs.java.kt.swift.c.h.cpp.cs.sh.bash.zsh.fish.ps1.log.env.gitignore.dockerfile.makefile.sql".split(".")), Ge = {
1166
1160
  docx: r.Docx,
1167
1161
  xlsx: r.Xlsx,
1168
1162
  pptx: r.Pptx,
@@ -1190,10 +1184,10 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
1190
1184
  return n == null ? void 0 : qe[n];
1191
1185
  }, Xe = (e) => {
1192
1186
  let t = e.lastIndexOf(".");
1193
- return t === -1 ? !1 : We.has(e.slice(t + 1).toLowerCase());
1187
+ return t !== -1 && We.has(e.slice(t + 1).toLowerCase());
1194
1188
  }, Ze = (e) => {
1195
1189
  let t = e.lastIndexOf(".");
1196
- return t === -1 ? !1 : Ue.has(e.slice(t + 1).toLowerCase());
1190
+ return t !== -1 && Ue.has(e.slice(t + 1).toLowerCase());
1197
1191
  }, Qe = {
1198
1192
  xml: "xml",
1199
1193
  csv: "plaintext",
@@ -1254,7 +1248,7 @@ var pe = { panel: "dial-attachment-canvas-panel" }, G = {
1254
1248
  errorType: n.Forbidden,
1255
1249
  ...e != null && { url: e }
1256
1250
  }), nt = (e) => {
1257
- if (!(e.type !== i.Image && e.type !== i.Audio && e.type !== i.Pdf && e.type !== i.Ooxml)) return e.url.startsWith("blob:") ? e.url : void 0;
1251
+ if (e.type === i.Image || e.type === i.Audio || e.type === i.Pdf || e.type === i.Ooxml) return e.url.startsWith("blob:") ? e.url : void 0;
1258
1252
  }, rt = (e) => {
1259
1253
  let t = nt(e);
1260
1254
  t != null && URL.revokeObjectURL(t);
@@ -1455,28 +1449,28 @@ var ot = ({ children: e }) => {
1455
1449
  case d.Markdown:
1456
1450
  case d.MarkdownAlt: {
1457
1451
  let i = await e.resolveMarkdownContent(t);
1458
- return i == null ? !1 : r(i, t.name, n);
1452
+ return i != null && r(i, t.name, n);
1459
1453
  }
1460
1454
  case d.JSON: {
1461
1455
  let i = await e.resolveJsonContent(t);
1462
- return i == null ? !1 : r(i, t.name, n);
1456
+ return i != null && r(i, t.name, n);
1463
1457
  }
1464
1458
  case d.PDF: {
1465
1459
  let i = await e.resolvePdfContent(t);
1466
- return i == null ? !1 : r(i, t.name, n);
1460
+ return i != null && r(i, t.name, n);
1467
1461
  }
1468
1462
  }
1469
1463
  let g = t.name != null && Ze(t.name) || t.url != null && Ze(dt(t.url));
1470
1464
  if (t.name != null && !Xe(t.name) && !g) return r($(e.resolveContentUrl(t)), t.name, n);
1471
1465
  if (g) {
1472
1466
  let a = await e.resolveHtmlContent(t);
1473
- return a == null ? e.hasTextSource(t) ? r($(e.resolveContentUrl(t)), t.name, n) : t.url == null ? !1 : r({
1467
+ return a == null ? e.hasTextSource(t) ? r($(e.resolveContentUrl(t)), t.name, n) : t.url != null && r({
1474
1468
  type: i.Html,
1475
1469
  url: t.url
1476
1470
  }, t.name, n) : r(a, t.name, n);
1477
1471
  }
1478
1472
  let _ = await e.resolveCodeContent(t, $e(m));
1479
- return _ == null ? !1 : r(_, t.name, n);
1473
+ return _ != null && r(_, t.name, n);
1480
1474
  }, [
1481
1475
  o,
1482
1476
  s,
@@ -1487,11 +1481,11 @@ var ot = ({ children: e }) => {
1487
1481
  switch (t.type) {
1488
1482
  case c.Image: {
1489
1483
  let r = e.resolveImageContent(t);
1490
- return r == null ? !1 : (l?.(), n(r, t.name, o), !0);
1484
+ return r != null && (l?.(), n(r, t.name, o), !0);
1491
1485
  }
1492
1486
  case c.Audio: {
1493
1487
  let e = t.playUrl ?? t.url;
1494
- return e == null ? !1 : (n({
1488
+ return e != null && (n({
1495
1489
  type: i.Audio,
1496
1490
  url: e,
1497
1491
  mimeType: t.contentType || void 0
@@ -32,11 +32,7 @@ var n = 4 / 3, r = 9525, i = 2, a = 1, o = 0, s = 16, c = .25, l = () => {
32
32
  let t = [...e].sort((e, t) => e.top - t.top || e.left - t.left), n = [];
33
33
  for (let e of t) {
34
34
  let t = n.at(-1), r = t != null && Math.abs(t.top - e.top) <= i && Math.abs(t.height - e.height) <= i, o = t != null && e.left <= t.left + t.width + a;
35
- if (r && o) {
36
- t.width = Math.max(t.left + t.width, e.left + e.width) - t.left, t.height = Math.max(t.height, e.height);
37
- continue;
38
- }
39
- n.push({ ...e });
35
+ r && o ? (t.width = Math.max(t.left + t.width, e.left + e.width) - t.left, t.height = Math.max(t.height, e.height)) : n.push({ ...e });
40
36
  }
41
37
  return n;
42
38
  }, h = (e, t, n) => Math.min(Math.max(e, t), n), g = (e, t) => e.length === t.length && e.every((e, n) => e === t[n]), _ = (e, t, n) => {
@@ -67,11 +63,7 @@ var n = 4 / 3, r = 9525, i = 2, a = 1, o = 0, s = 16, c = .25, l = () => {
67
63
  let e = h(n - t.start, 0, t.end - t.start), i = o(t, e, h(r - t.start, e, t.end - t.start));
68
64
  if (i == null) continue;
69
65
  let c = s.get(t.surfaceIndex);
70
- if (c == null) {
71
- s.set(t.surfaceIndex, [i]);
72
- continue;
73
- }
74
- c.push(i);
66
+ c == null ? s.set(t.surfaceIndex, [i]) : c.push(i);
75
67
  }
76
68
  for (let [e, t] of s) s.set(e, m(t));
77
69
  return s;
@@ -118,7 +110,7 @@ var n = 4 / 3, r = 9525, i = 2, a = 1, o = 0, s = 16, c = .25, l = () => {
118
110
  });
119
111
  }, x = (e) => e.rotation !== 0 || (e.textBodyRotation ?? 0) !== 0 || e.shapeFlipH === !0 || e.shapeFlipV === !0, S = ({ location: e, runs: t, measure: n }) => {
120
112
  let r = [], i = "";
121
- for (let n of t) n.shapeId != null && String(n.shapeId) === e.shapeId && (n.origin === "master" || n.origin === "layout" || (r.push({
113
+ for (let n of t) n.shapeId != null && String(n.shapeId) === e.shapeId && n.origin !== "master" && n.origin !== "layout" && (r.push({
122
114
  run: n,
123
115
  box: {
124
116
  x: n.shapeX + n.inShapeX,
@@ -129,7 +121,7 @@ var n = 4 / 3, r = 9525, i = 2, a = 1, o = 0, s = 16, c = .25, l = () => {
129
121
  start: i.length,
130
122
  end: i.length + n.text.length,
131
123
  surfaceIndex: o
132
- }), i += n.text));
124
+ }), i += n.text);
133
125
  return y(r, i, e.start, e.endExclusive, e.text, x, ({ run: e, box: t }, r, i) => v(e.text, t, e.font, 0, !1, r, i, n)).get(o) ?? [];
134
126
  }, C = (e, t) => {
135
127
  let n = t.indexOf(e);
@@ -223,7 +215,7 @@ var n = 4 / 3, r = 9525, i = 2, a = 1, o = 0, s = 16, c = .25, l = () => {
223
215
  }, M = (e, n) => {
224
216
  if (!Number.isSafeInteger(e.occurrence) || e.occurrence < 1) return [];
225
217
  let r = /* @__PURE__ */ new Map();
226
- for (let e of n) e.tableCell == null || e.shapeId == null || e.origin === "master" || e.origin === "layout" || O(r, JSON.stringify([
218
+ for (let e of n) e.tableCell != null && e.shapeId != null && e.origin !== "master" && e.origin !== "layout" && O(r, JSON.stringify([
227
219
  e.elementIndex,
228
220
  e.shapeId,
229
221
  e.tableCell.row
@@ -428,7 +420,7 @@ var n = 4 / 3, r = 9525, i = 2, a = 1, o = 0, s = 16, c = .25, l = () => {
428
420
  for (let n of e) for (let e of n.locations) {
429
421
  if (e.kind !== t.XlsxCellRange) continue;
430
422
  let s = C(e.sheet, r.sheetNames);
431
- if (!(s == null || s !== r.sheetIndex)) for (let t of T({
423
+ if (s != null && s === r.sheetIndex) for (let t of T({
432
424
  location: e,
433
425
  getCellViewportRect: (e) => {
434
426
  let t = r.getCellViewportRect(e);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@epam/ai-dial-attachment-canvas",
3
3
  "description": "Canvas viewer for rendering attachment content — images, PDFs, Office documents, CSV, JSON, markdown, and plain text",
4
- "version": "1.2.8",
4
+ "version": "1.2.9",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "./index.js",
@@ -29,10 +29,10 @@
29
29
  "@modelcontextprotocol/sdk": "^1.32.1",
30
30
  "@modelcontextprotocol/ext-apps": "1.7.5",
31
31
  "pdfjs-dist": "^5.4.149",
32
- "@epam/ai-dial-sidebar": "1.2.8"
32
+ "@epam/ai-dial-sidebar": "1.2.9"
33
33
  },
34
34
  "peerDependencies": {
35
- "@epam/ai-dial-chat-shared": "1.2.8",
35
+ "@epam/ai-dial-chat-shared": "1.2.9",
36
36
  "@epam/ai-dial-ui-kit": "^0.15.4",
37
37
  "react": "^19.2.8"
38
38
  },
@@ -1,266 +0,0 @@
1
- import "./PdfContent.css";
2
- import { a as e, n as t, r as n } from "./LazyContentBoundary-tNE1ExbI.js";
3
- import { mergeClasses as r } from "@epam/ai-dial-chat-shared";
4
- import { DIAL_ICON_SIZE as i, DIAL_KIT_ICON_STROKE as a, Dropdown as o, ElementSize as s, FabButton as c, Input as ee } from "@epam/ai-dial-ui-kit";
5
- import { IconMenu2 as te, IconX as ne } from "@tabler/icons-react";
6
- import { useCallback as l, useEffect as u, useId as d, useRef as f, useState as p } from "react";
7
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
8
- import { DocumentPreview as re, PageThumbnail as ie } from "@epam/ai-dial-react-pdf-highlighter";
9
- var g = { viewer: "_viewer_1gfxm_1" }, _ = null, ae = (e) => (_ ||= new Promise((t, n) => {
10
- try {
11
- t(e());
12
- } catch (e) {
13
- n(e);
14
- }
15
- }).catch((e) => {
16
- throw _ = null, e;
17
- }), _), oe = 15, v = 3, se = 172, ce = 400, y = 150, le = 60, b = ({ url: _, highlights: b, selectedHighlightId: x, selectedPageNumber: S, loadPdf: C, configurePdfWorker: w, hideHeader: ue = !1, onLoadError: T, labels: { thumbnailsLabel: de = "Thumbnails", showThumbnailsLabel: fe = "Show thumbnails", hideThumbnailsLabel: pe = "Hide thumbnails", pageNumberLabel: me = "Page number", loadingLabel: he = "Loading…", errorLabel: ge = "Failed to load content", retryLabel: _e = "Retry" } = {} }) => {
18
- let [E, D] = p(() => w ? "preparing" : "ready"), [ve, ye] = p(0), be = l(async (t) => {
19
- try {
20
- return await (C ?? e)(t);
21
- } catch (e) {
22
- throw T?.(t), e;
23
- }
24
- }, [C, T]);
25
- u(() => {
26
- if (!w) return;
27
- D("preparing");
28
- let e = !1;
29
- return ae(w).then(() => {
30
- e || D("ready");
31
- }).catch(() => {
32
- e || D("error");
33
- }), () => {
34
- e = !0;
35
- };
36
- }, [w, ve]);
37
- let xe = l(() => {
38
- ye((e) => e + 1);
39
- }, []), O = d(), [k, Se] = p(0), [A, j] = p(/* @__PURE__ */ new Map()), [M, Ce] = p(!1), [N, P] = p(() => S ?? (x ? b.find((e) => e.id === x)?.bboxes[0]?.page ?? 1 : 1)), F = f(null), I = f(null), [we, L] = p([]), [R, Te] = p(se), [z, Ee] = p(ce), [De, B] = p(0), V = f(!1), H = f(0), U = f(null);
40
- u(() => {
41
- if (S != null) {
42
- P(S);
43
- return;
44
- }
45
- if (!x) return;
46
- let e = b.find((e) => e.id === x)?.bboxes[0]?.page;
47
- e != null && P(e);
48
- }, [
49
- S,
50
- x,
51
- b
52
- ]), u(() => {
53
- let e = I.current;
54
- if (!M || !e) return;
55
- let t = new ResizeObserver((e) => {
56
- let t = e[0]?.contentRect.height;
57
- t && Ee(t);
58
- });
59
- return t.observe(e), () => t.disconnect();
60
- }, [M]);
61
- let Oe = l((e) => {
62
- if (!e || V.current) return;
63
- let t = e.getBoundingClientRect().height;
64
- t > 0 && (V.current = !0, Te(t));
65
- }, []), ke = l((e) => {
66
- H.current = e.currentTarget.scrollTop, U.current ??= requestAnimationFrame(() => {
67
- U.current = null, B(H.current);
68
- });
69
- }, []);
70
- u(() => () => {
71
- U.current != null && cancelAnimationFrame(U.current);
72
- }, []);
73
- let W = l((e) => {
74
- if (k === 0) return;
75
- let t = Math.max(0, (N - 1) * R - e.clientHeight / 2 + R / 2);
76
- H.current = t, B(t), e.scrollTop = t;
77
- }, [
78
- N,
79
- k,
80
- R
81
- ]), Ae = l((e) => {
82
- I.current = e, e && W(e);
83
- }, [W]);
84
- u(() => {
85
- let e = I.current;
86
- e && W(e);
87
- }, [W]);
88
- let G = Math.max(0, Math.floor(De / R) - v), je = Math.ceil(z / R) + v * 2, K = Math.min(k - 1, G + je);
89
- u(() => {
90
- if (k === 0) return;
91
- let e = Math.min(k, oe);
92
- L(Array.from({ length: e }, (e, t) => t + 1));
93
- }, [k]), u(() => {
94
- if (!M || k === 0) return;
95
- let e = setTimeout(() => {
96
- L((e) => {
97
- let t = new Set(e), n = !1;
98
- for (let e = G + 1; e <= K + 1; e++) t.has(e) || (t.add(e), n = !0);
99
- return n ? Array.from(t).sort((e, t) => e - t) : e;
100
- });
101
- }, y);
102
- return () => clearTimeout(e);
103
- }, [
104
- M,
105
- G,
106
- K,
107
- k
108
- ]), u(() => {
109
- if (k === 0) return;
110
- let e = setTimeout(() => {
111
- let e = Math.ceil(z / R / 2) + v, t = Math.max(0, N - 1 - e), n = Math.min(k - 1, N - 1 + e);
112
- L((e) => {
113
- let r = new Set(e), i = !1;
114
- for (let e = t + 1; e <= n + 1; e++) r.has(e) || (r.add(e), i = !0);
115
- return i ? Array.from(r).sort((e, t) => e - t) : e;
116
- });
117
- }, y);
118
- return () => clearTimeout(e);
119
- }, [
120
- N,
121
- k,
122
- z,
123
- R
124
- ]);
125
- let Me = l((e) => {
126
- j((t) => new Map([...t, ...e]));
127
- }, []), [q, Ne] = p(!1), Pe = l((e) => {
128
- F.current = e, Ne(!0);
129
- }, []), J = f(null);
130
- u(() => {
131
- if (!q) return;
132
- let e = J.current, t = e?.querySelector(".pdf-container"), n = e?.querySelector(".pdf-highlight-viewer");
133
- if (!t || !n) return;
134
- let r = () => {
135
- let e = n.scrollWidth - n.clientWidth;
136
- e > 0 && (n.scrollLeft = e / 2);
137
- };
138
- r();
139
- let i = new ResizeObserver(r);
140
- i.observe(t), i.observe(n);
141
- let a = F.current?.getZoom(), o = 0, s, c = () => {
142
- let e = F.current?.getZoom();
143
- e !== a && (a = e, o = le), o > 0 && (r(), --o), s = requestAnimationFrame(c);
144
- };
145
- return s = requestAnimationFrame(c), () => {
146
- cancelAnimationFrame(s), i.disconnect();
147
- };
148
- }, [q]), u(() => {
149
- if (!q || x || S != null) return;
150
- let e = requestAnimationFrame(() => {
151
- F.current?.navigateToPage(1);
152
- });
153
- return () => cancelAnimationFrame(e);
154
- }, [
155
- q,
156
- x,
157
- S
158
- ]);
159
- let Y = l((e) => {
160
- P(e), F.current?.navigateToPage(e);
161
- }, []), Fe = l((e) => {
162
- P(e);
163
- }, []), [X, Z] = p(() => String(N));
164
- u(() => {
165
- Z(String(N));
166
- }, [N]);
167
- let Q = l((e) => {
168
- let t = Number(e);
169
- Number.isInteger(t) && t >= 1 && t <= k ? Y(t) : Z(String(N));
170
- }, [
171
- k,
172
- N,
173
- Y
174
- ]);
175
- if (!_) return null;
176
- if (E === "preparing") return /* @__PURE__ */ m(n, { loadingLabel: he });
177
- if (E === "error") return /* @__PURE__ */ m(t, {
178
- errorLabel: ge,
179
- retryLabel: _e,
180
- onRetry: xe
181
- });
182
- let $ = [];
183
- for (let e = G + 1; e <= K + 1 && e <= k; e++) $.push(/* @__PURE__ */ m("div", {
184
- ref: e === G + 1 ? Oe : void 0,
185
- children: /* @__PURE__ */ m(ie, {
186
- pageNum: e,
187
- onSelectPage: Y,
188
- isSelected: N === e,
189
- isLoading: !A.has(e),
190
- thumbnailUrl: A.get(e) ?? null
191
- })
192
- }, e));
193
- let Ie = G * R, Le = Math.max(0, k - K - 1) * R;
194
- return /* @__PURE__ */ h("div", {
195
- className: "relative flex h-full overflow-hidden",
196
- children: [k > 0 && /* @__PURE__ */ m("div", {
197
- className: "absolute start-3 top-3 z-10",
198
- children: /* @__PURE__ */ m(o, {
199
- open: M,
200
- onOpenChange: Ce,
201
- placement: "bottom-start",
202
- matchReferenceWidth: !1,
203
- renderOverlay: () => /* @__PURE__ */ h("div", {
204
- className: "flex w-36 flex-col",
205
- children: [/* @__PURE__ */ m("div", {
206
- className: "shrink-0 p-1",
207
- children: /* @__PURE__ */ m(ee, {
208
- size: s.Small,
209
- "aria-label": me,
210
- value: X,
211
- postfix: `/ ${k}`,
212
- inputMode: "numeric",
213
- onChange: (e) => Z(e ?? ""),
214
- onBlur: () => Q(X),
215
- onKeyDown: (e) => {
216
- e.key === "Enter" && Q(X);
217
- }
218
- })
219
- }), /* @__PURE__ */ h("div", {
220
- ref: Ae,
221
- id: O,
222
- role: "region",
223
- "aria-label": de,
224
- onScroll: ke,
225
- className: "max-h-[70vh] min-h-0 overflow-y-auto overflow-x-hidden p-1 [scrollbar-gutter:stable]",
226
- children: [
227
- /* @__PURE__ */ m("div", { style: { height: Ie } }),
228
- $,
229
- /* @__PURE__ */ m("div", { style: { height: Le } })
230
- ]
231
- })]
232
- }),
233
- children: /* @__PURE__ */ m(c, {
234
- icon: m(M ? ne : te, {
235
- size: i.LG,
236
- stroke: a,
237
- "aria-hidden": !0
238
- }),
239
- "aria-label": M ? pe : fe,
240
- "aria-expanded": M,
241
- "aria-controls": M ? O : void 0
242
- })
243
- })
244
- }), /* @__PURE__ */ m("div", {
245
- ref: J,
246
- className: r("min-w-0 flex-1 overflow-hidden", g.viewer),
247
- children: /* @__PURE__ */ m(re, {
248
- fileUrl: _,
249
- loadFileCb: be,
250
- highlights: b,
251
- selectedHighlightId: x,
252
- selectedPageNumber: S,
253
- showOccurrences: !1,
254
- onTotalPagesChange: Se,
255
- thumbnailPageNumbers: we,
256
- onThumbnailsLoaded: Me,
257
- onViewerReady: Pe,
258
- onCurrentPageChange: Fe,
259
- viewerOptions: { enableVirtualScrolling: !0 },
260
- containerClassName: ue ? "[&>div:first-child]:hidden" : void 0
261
- })
262
- })]
263
- });
264
- };
265
- //#endregion
266
- export { b as PdfContent };