@embedpdf/viewer-chrome 3.0.0-next.14 → 3.0.0-next.16

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 (177) hide show
  1. package/README.md +175 -132
  2. package/dist/annotation-fonts-DWjVOTP0.js +80 -0
  3. package/dist/annotation-fonts-DWjVOTP0.js.map +1 -0
  4. package/dist/annotation-fonts-dpfVkhnq.cjs +91 -0
  5. package/dist/annotation-fonts-dpfVkhnq.cjs.map +1 -0
  6. package/dist/annotation-style-B3XKAyZ-.cjs +879 -0
  7. package/dist/annotation-style-B3XKAyZ-.cjs.map +1 -0
  8. package/dist/annotation-style-CXF3X47Z.js +879 -0
  9. package/dist/annotation-style-CXF3X47Z.js.map +1 -0
  10. package/dist/ar-B132r9bo.cjs +659 -0
  11. package/dist/ar-B132r9bo.cjs.map +1 -0
  12. package/dist/ar-BLWFJoA_.js +659 -0
  13. package/dist/ar-BLWFJoA_.js.map +1 -0
  14. package/dist/attachments-panel-Cxln8xos.cjs +217 -0
  15. package/dist/attachments-panel-Cxln8xos.cjs.map +1 -0
  16. package/dist/attachments-panel-H1ucRbwo.js +217 -0
  17. package/dist/attachments-panel-H1ucRbwo.js.map +1 -0
  18. package/dist/chrome.cjs +399 -242
  19. package/dist/chrome.cjs.map +1 -1
  20. package/dist/chrome.d.cts +5 -35
  21. package/dist/chrome.d.ts +5 -35
  22. package/dist/chrome.js +398 -239
  23. package/dist/chrome.js.map +1 -1
  24. package/dist/commands-BkgLP3Om.js +1348 -0
  25. package/dist/commands-BkgLP3Om.js.map +1 -0
  26. package/dist/commands-DL1gjZt7.cjs +1473 -0
  27. package/dist/commands-DL1gjZt7.cjs.map +1 -0
  28. package/dist/commands.cjs +13 -649
  29. package/dist/commands.d.cts +30 -3
  30. package/dist/commands.d.ts +30 -3
  31. package/dist/commands.js +2 -647
  32. package/dist/comments-panel-BsnWedTh.cjs +514 -0
  33. package/dist/comments-panel-BsnWedTh.cjs.map +1 -0
  34. package/dist/comments-panel-D7Eadws9.js +514 -0
  35. package/dist/comments-panel-D7Eadws9.js.map +1 -0
  36. package/dist/de-7_MvFWzN.cjs +658 -0
  37. package/dist/de-7_MvFWzN.cjs.map +1 -0
  38. package/dist/de-BUhwc9-x.js +658 -0
  39. package/dist/de-BUhwc9-x.js.map +1 -0
  40. package/dist/dialog-BIb373cg.js +55 -0
  41. package/dist/dialog-BIb373cg.js.map +1 -0
  42. package/dist/dialog-CngKTnAM.cjs +60 -0
  43. package/dist/dialog-CngKTnAM.cjs.map +1 -0
  44. package/dist/es-DgYj-1L3.cjs +658 -0
  45. package/dist/es-DgYj-1L3.cjs.map +1 -0
  46. package/dist/es-DoXTqFoO.js +658 -0
  47. package/dist/es-DoXTqFoO.js.map +1 -0
  48. package/dist/form-design-panel-CgV_5YWC.js +418 -0
  49. package/dist/form-design-panel-CgV_5YWC.js.map +1 -0
  50. package/dist/form-design-panel-D0FdmWXW.cjs +418 -0
  51. package/dist/form-design-panel-D0FdmWXW.cjs.map +1 -0
  52. package/dist/fr-B-8NDhBA.js +658 -0
  53. package/dist/fr-B-8NDhBA.js.map +1 -0
  54. package/dist/fr-C856dmQJ.cjs +658 -0
  55. package/dist/fr-C856dmQJ.cjs.map +1 -0
  56. package/dist/he-BFTeNc4t.cjs +659 -0
  57. package/dist/he-BFTeNc4t.cjs.map +1 -0
  58. package/dist/he-Dlh0fNXM.js +659 -0
  59. package/dist/he-Dlh0fNXM.js.map +1 -0
  60. package/dist/icons-1UfLUZ_y.cjs +1029 -0
  61. package/dist/icons-1UfLUZ_y.cjs.map +1 -0
  62. package/dist/icons-7dB0Y1ct.js +875 -0
  63. package/dist/icons-7dB0Y1ct.js.map +1 -0
  64. package/dist/index.cjs +3651 -5447
  65. package/dist/index.cjs.map +1 -1
  66. package/dist/index.d.cts +646 -144
  67. package/dist/index.d.ts +646 -144
  68. package/dist/index.js +3618 -5368
  69. package/dist/index.js.map +1 -1
  70. package/dist/it-Bef-2Yxq.cjs +658 -0
  71. package/dist/it-Bef-2Yxq.cjs.map +1 -0
  72. package/dist/it-BkirG7ol.js +658 -0
  73. package/dist/it-BkirG7ol.js.map +1 -0
  74. package/dist/ja-CGEjCE-s.js +658 -0
  75. package/dist/ja-CGEjCE-s.js.map +1 -0
  76. package/dist/ja-DNw2zqSD.cjs +658 -0
  77. package/dist/ja-DNw2zqSD.cjs.map +1 -0
  78. package/dist/ko-CTkl5vMh.js +658 -0
  79. package/dist/ko-CTkl5vMh.js.map +1 -0
  80. package/dist/ko-YHzeBqP6.cjs +658 -0
  81. package/dist/ko-YHzeBqP6.cjs.map +1 -0
  82. package/dist/labels-BiM9wp9K.cjs +21 -0
  83. package/dist/labels-BiM9wp9K.cjs.map +1 -0
  84. package/dist/labels-C6_i87Oj.js +16 -0
  85. package/dist/labels-C6_i87Oj.js.map +1 -0
  86. package/dist/link-editor-CAS7MZM2.cjs +125 -0
  87. package/dist/link-editor-CAS7MZM2.cjs.map +1 -0
  88. package/dist/link-editor-CkwtqRvb.js +125 -0
  89. package/dist/link-editor-CkwtqRvb.js.map +1 -0
  90. package/dist/measurement-CQdbnIrn.js +325 -0
  91. package/dist/measurement-CQdbnIrn.js.map +1 -0
  92. package/dist/measurement-Cxv1Ahxx.cjs +326 -0
  93. package/dist/measurement-Cxv1Ahxx.cjs.map +1 -0
  94. package/dist/nl-BjkbaLq3.cjs +658 -0
  95. package/dist/nl-BjkbaLq3.cjs.map +1 -0
  96. package/dist/nl-Dya4sR8_.js +658 -0
  97. package/dist/nl-Dya4sR8_.js.map +1 -0
  98. package/dist/outline-panel-BpGtBdj0.cjs +707 -0
  99. package/dist/outline-panel-BpGtBdj0.cjs.map +1 -0
  100. package/dist/outline-panel-DO5_REYw.js +707 -0
  101. package/dist/outline-panel-DO5_REYw.js.map +1 -0
  102. package/dist/outline-properties-BCa2cc0t.js +330 -0
  103. package/dist/outline-properties-BCa2cc0t.js.map +1 -0
  104. package/dist/outline-properties-DT3FIxCw.cjs +330 -0
  105. package/dist/outline-properties-DT3FIxCw.cjs.map +1 -0
  106. package/dist/pl-CKKdVnpZ.cjs +658 -0
  107. package/dist/pl-CKKdVnpZ.cjs.map +1 -0
  108. package/dist/pl-DA9b5NVg.js +658 -0
  109. package/dist/pl-DA9b5NVg.js.map +1 -0
  110. package/dist/print-dialog-BqIrHCBh.cjs +276 -0
  111. package/dist/print-dialog-BqIrHCBh.cjs.map +1 -0
  112. package/dist/print-dialog-DvcI2m2_.js +276 -0
  113. package/dist/print-dialog-DvcI2m2_.js.map +1 -0
  114. package/dist/pt-DLcszlzi.cjs +658 -0
  115. package/dist/pt-DLcszlzi.cjs.map +1 -0
  116. package/dist/pt-Nm8yyjbX.js +658 -0
  117. package/dist/pt-Nm8yyjbX.js.map +1 -0
  118. package/dist/redact-confirm-C6EiK8yN.cjs +83 -0
  119. package/dist/redact-confirm-C6EiK8yN.cjs.map +1 -0
  120. package/dist/redact-confirm-CKuv9iN_.js +83 -0
  121. package/dist/redact-confirm-CKuv9iN_.js.map +1 -0
  122. package/dist/redaction-panel-CgNZ-pQk.js +96 -0
  123. package/dist/redaction-panel-CgNZ-pQk.js.map +1 -0
  124. package/dist/redaction-panel-ZhX0dlMi.cjs +96 -0
  125. package/dist/redaction-panel-ZhX0dlMi.cjs.map +1 -0
  126. package/dist/search-panel-BE4xzWlm.js +249 -0
  127. package/dist/search-panel-BE4xzWlm.js.map +1 -0
  128. package/dist/search-panel-wcbTNG1z.cjs +249 -0
  129. package/dist/search-panel-wcbTNG1z.cjs.map +1 -0
  130. package/dist/sheet-DTBFiwde.cjs +461 -0
  131. package/dist/sheet-DTBFiwde.cjs.map +1 -0
  132. package/dist/sheet-DyjKfAq0.js +378 -0
  133. package/dist/sheet-DyjKfAq0.js.map +1 -0
  134. package/dist/sign-dialog-D5WGx-Yn.cjs +155 -0
  135. package/dist/sign-dialog-D5WGx-Yn.cjs.map +1 -0
  136. package/dist/sign-dialog-DerNe8qT.js +155 -0
  137. package/dist/sign-dialog-DerNe8qT.js.map +1 -0
  138. package/dist/signature-inspector-Bz6TAfZM.cjs +160 -0
  139. package/dist/signature-inspector-Bz6TAfZM.cjs.map +1 -0
  140. package/dist/signature-inspector-CsGr9EBk.js +160 -0
  141. package/dist/signature-inspector-CsGr9EBk.js.map +1 -0
  142. package/dist/signature-maker-D_YfBXLn.cjs +393 -0
  143. package/dist/signature-maker-D_YfBXLn.cjs.map +1 -0
  144. package/dist/signature-maker-Dnth4rV4.js +393 -0
  145. package/dist/signature-maker-Dnth4rV4.js.map +1 -0
  146. package/dist/signatures-panel-Ci_LaI1C.cjs +294 -0
  147. package/dist/signatures-panel-Ci_LaI1C.cjs.map +1 -0
  148. package/dist/signatures-panel-DZ9ywrjz.js +294 -0
  149. package/dist/signatures-panel-DZ9ywrjz.js.map +1 -0
  150. package/dist/stamp-store-BHvRs-Do.cjs +147 -0
  151. package/dist/stamp-store-BHvRs-Do.cjs.map +1 -0
  152. package/dist/stamp-store-WuF-L3Jj.js +112 -0
  153. package/dist/stamp-store-WuF-L3Jj.js.map +1 -0
  154. package/dist/stamps-panel-BrczStaz.js +225 -0
  155. package/dist/stamps-panel-BrczStaz.js.map +1 -0
  156. package/dist/stamps-panel-Cv9nJBwx.cjs +225 -0
  157. package/dist/stamps-panel-Cv9nJBwx.cjs.map +1 -0
  158. package/dist/theme-Be0OZokZ.js +97 -0
  159. package/dist/theme-Be0OZokZ.js.map +1 -0
  160. package/dist/theme-FR26JI3r.cjs +126 -0
  161. package/dist/theme-FR26JI3r.cjs.map +1 -0
  162. package/dist/toolbar-DF361xWY.js +1565 -0
  163. package/dist/toolbar-DF361xWY.js.map +1 -0
  164. package/dist/toolbar-ddvpsvTb.cjs +1660 -0
  165. package/dist/toolbar-ddvpsvTb.cjs.map +1 -0
  166. package/dist/zh-cn-BMPPkLpL.js +658 -0
  167. package/dist/zh-cn-BMPPkLpL.js.map +1 -0
  168. package/dist/zh-cn-CZOO3p4H.cjs +658 -0
  169. package/dist/zh-cn-CZOO3p4H.cjs.map +1 -0
  170. package/package.json +6 -4
  171. package/src/styles.css +161 -89
  172. package/dist/commands.cjs.map +0 -1
  173. package/dist/commands.js.map +0 -1
  174. package/dist/es-BXLlBo2b.cjs +0 -321
  175. package/dist/es-BXLlBo2b.cjs.map +0 -1
  176. package/dist/es-CLgTsFDS.js +0 -321
  177. package/dist/es-CLgTsFDS.js.map +0 -1
@@ -0,0 +1,325 @@
1
+ import { t as Dialog } from "./dialog-BIb373cg.js";
2
+ import { useEffect, useRef, useState } from "react";
3
+ import { useCapability, useSelector } from "@embedpdf/react/runtime";
4
+ import { StageToken } from "@embedpdf/react/stage";
5
+ import { AnnotationToken, useAnnotationState } from "@embedpdf/react/annotation";
6
+ import { MeasurementToken, useMeasurement, useMeasurementState, usePageScale } from "@embedpdf/react/measurement";
7
+ import { useT } from "@embedpdf/react/i18n";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ //#region src/ui/measurement.tsx
10
+ const control = "border-border bg-surface text-fg w-full rounded-md border px-2 py-1.5 text-sm disabled:opacity-50";
11
+ const button = "border-border text-fg hover:bg-hover rounded-md border px-3 py-1.5 text-sm disabled:opacity-50";
12
+ /** The current page's address, or null with no page (empty document). */
13
+ const useCurrentPage = () => useSelector(StageToken, (stage) => stage.getCurrentPage());
14
+ function MeasurementSection() {
15
+ const t = useT();
16
+ const page = useCurrentPage();
17
+ const measurement = useMeasurement();
18
+ const busy = useMeasurementState((state) => state.busy);
19
+ const canCalibrate = useSelector(MeasurementToken, (current) => current.canCalibrate());
20
+ const scale = usePageScale(page);
21
+ const anno = useCapability(AnnotationToken);
22
+ const selected = useAnnotationState((state) => state.selected);
23
+ const resettable = useSelector(AnnotationToken, (annotation) => annotation.selection.list().filter((candidate) => (candidate.subtype === "polygon" || candidate.subtype === "polyline") && candidate.captionCenter && annotation.canUpdate(candidate.ref) && !candidate.lockedContents), (left, right) => left.length === right.length && left.every((annotation, i) => annotation === right[i]));
24
+ const readouts = useSelector(MeasurementToken, (measurement) => anno.selection.list().map((annotation) => measurement.getReadout(annotation.ref)).filter((readout) => !("unavailable" in readout)), (left, right) => JSON.stringify(left) === JSON.stringify(right));
25
+ const reports = useMeasurementState((state) => state.lastReports);
26
+ const [allPages, setAllPages] = useState(false);
27
+ const [recalculate, setRecalculate] = useState(true);
28
+ const [error, setError] = useState(null);
29
+ const disabled = !page || busy || !canCalibrate || !scale?.ready;
30
+ const rectilinear = scale?.measure?.subtype === "rectilinear" ? scale.measure : null;
31
+ const target = allPages ? "all" : page;
32
+ const options = { recalculate };
33
+ const run = async (work) => {
34
+ setError(null);
35
+ try {
36
+ await work();
37
+ } catch (error) {
38
+ setError(error instanceof Error ? error.message : String(error));
39
+ }
40
+ };
41
+ const precision = rectilinear?.distance[rectilinear.distance.length - 1]?.precision ?? 100;
42
+ return /* @__PURE__ */ jsxs("div", {
43
+ className: "flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4 text-sm",
44
+ children: [
45
+ /* @__PURE__ */ jsx("p", {
46
+ className: "text-fg-muted",
47
+ children: t("measurement.instructions")
48
+ }),
49
+ /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsxs("span", {
50
+ className: "text-fg-muted",
51
+ children: [t("measurement.scale"), ": "]
52
+ }), /* @__PURE__ */ jsx("strong", { children: rectilinear?.ratio ?? t("measurement.unavailable") })] }),
53
+ scale?.error && /* @__PURE__ */ jsx("p", {
54
+ role: "alert",
55
+ className: "text-red-600",
56
+ children: scale.error.message
57
+ }),
58
+ scale && !scale.persistent && scale.ready && /* @__PURE__ */ jsx("p", {
59
+ className: "text-fg-muted",
60
+ children: t("measurement.sessionOnly")
61
+ }),
62
+ /* @__PURE__ */ jsxs("label", {
63
+ className: "flex items-center gap-2",
64
+ children: [/* @__PURE__ */ jsx("input", {
65
+ type: "checkbox",
66
+ checked: allPages,
67
+ disabled: busy,
68
+ onChange: (event) => setAllPages(event.target.checked)
69
+ }), t("measurement.allPages")]
70
+ }),
71
+ /* @__PURE__ */ jsxs("label", {
72
+ className: "flex items-center gap-2",
73
+ children: [/* @__PURE__ */ jsx("input", {
74
+ type: "checkbox",
75
+ checked: recalculate,
76
+ disabled: busy,
77
+ onChange: (event) => setRecalculate(event.target.checked)
78
+ }), t("measurement.recalculate")]
79
+ }),
80
+ /* @__PURE__ */ jsxs("label", { children: [t("measurement.preset"), /* @__PURE__ */ jsxs("select", {
81
+ "aria-label": t("measurement.preset"),
82
+ className: control,
83
+ value: "",
84
+ disabled,
85
+ onChange: (event) => void run(() => measurement.setPreset(target, event.target.value, options)),
86
+ children: [/* @__PURE__ */ jsx("option", {
87
+ value: "",
88
+ disabled: true,
89
+ children: t("measurement.choosePreset")
90
+ }), measurement.listPresets().map((preset) => /* @__PURE__ */ jsx("option", {
91
+ value: preset.id,
92
+ children: preset.label
93
+ }, preset.id))]
94
+ })] }),
95
+ /* @__PURE__ */ jsxs("label", { children: [t("measurement.unit"), /* @__PURE__ */ jsxs("select", {
96
+ "aria-label": t("measurement.unit"),
97
+ className: control,
98
+ value: rectilinear?.distance[0]?.unit.trim() ?? "",
99
+ disabled: disabled || !rectilinear,
100
+ onChange: (event) => void run(() => measurement.setUnit(target, event.target.value, options)),
101
+ children: [!measurement.listUnits().includes(rectilinear?.distance[0]?.unit.trim()) && /* @__PURE__ */ jsx("option", {
102
+ value: rectilinear?.distance[0]?.unit.trim() ?? "",
103
+ children: t("measurement.custom")
104
+ }), measurement.listUnits().map((unit) => /* @__PURE__ */ jsx("option", {
105
+ value: unit,
106
+ children: unit
107
+ }, unit))]
108
+ })] }),
109
+ /* @__PURE__ */ jsxs("label", { children: [t("measurement.areaUnit"), /* @__PURE__ */ jsxs("select", {
110
+ "aria-label": t("measurement.areaUnit"),
111
+ className: control,
112
+ value: rectilinear?.area[0]?.unit.trim().replace("²", "2") ?? "",
113
+ disabled: disabled || !rectilinear,
114
+ onChange: (event) => void run(() => measurement.setAreaUnit(target, event.target.value, options)),
115
+ children: [!measurement.listAreaUnits().includes(rectilinear?.area[0]?.unit.trim().replace("²", "2")) && /* @__PURE__ */ jsx("option", {
116
+ value: rectilinear?.area[0]?.unit.trim().replace("²", "2") ?? "",
117
+ children: t("measurement.custom")
118
+ }), measurement.listAreaUnits().map((unit) => /* @__PURE__ */ jsx("option", {
119
+ value: unit,
120
+ children: unit.replace("2", "²")
121
+ }, unit))]
122
+ })] }),
123
+ /* @__PURE__ */ jsxs("label", { children: [t("measurement.precision"), /* @__PURE__ */ jsxs("select", {
124
+ "aria-label": t("measurement.precision"),
125
+ className: control,
126
+ value: precision,
127
+ disabled: disabled || !rectilinear,
128
+ onChange: (event) => void run(() => measurement.setPrecision(target, Number(event.target.value), options)),
129
+ children: [![
130
+ 1,
131
+ 10,
132
+ 100,
133
+ 1e3,
134
+ 1e4
135
+ ].includes(precision) && /* @__PURE__ */ jsx("option", {
136
+ value: precision,
137
+ children: t("measurement.custom")
138
+ }), [
139
+ 1,
140
+ 10,
141
+ 100,
142
+ 1e3,
143
+ 1e4
144
+ ].map((candidate) => /* @__PURE__ */ jsx("option", {
145
+ value: candidate,
146
+ children: 1 / candidate
147
+ }, candidate))]
148
+ })] }),
149
+ /* @__PURE__ */ jsx("button", {
150
+ className: button,
151
+ disabled,
152
+ onClick: () => measurement.startCalibration(),
153
+ children: t("measurement.calibrate")
154
+ }),
155
+ selected.length > 0 && /* @__PURE__ */ jsxs("section", {
156
+ className: "border-border-subtle border-t pt-3",
157
+ children: [
158
+ /* @__PURE__ */ jsx("h3", {
159
+ className: "mb-1 font-medium",
160
+ children: t("measurement.selection")
161
+ }),
162
+ readouts.length ? readouts.map((readout, i) => /* @__PURE__ */ jsxs("div", {
163
+ className: "mb-2",
164
+ children: [/* @__PURE__ */ jsxs("p", { children: [
165
+ t(`measurement.${readout.kind}`),
166
+ ": ",
167
+ readout.label
168
+ ] }), readout.perimeter && /* @__PURE__ */ jsxs("p", { children: [
169
+ t("measurement.perimeter"),
170
+ ": ",
171
+ readout.perimeter
172
+ ] })]
173
+ }, i)) : /* @__PURE__ */ jsx("p", {
174
+ className: "text-fg-muted",
175
+ children: t("measurement.unavailable")
176
+ }),
177
+ resettable.length > 0 && /* @__PURE__ */ jsx("button", {
178
+ className: button,
179
+ disabled: busy,
180
+ onClick: () => void run(async () => {
181
+ for (const annotation of resettable) if (annotation.subtype === "polygon" || annotation.subtype === "polyline") await anno.update(annotation.ref, {
182
+ subtype: annotation.subtype,
183
+ captionCenter: null
184
+ });
185
+ }),
186
+ children: t("measurement.resetLabel")
187
+ })
188
+ ]
189
+ }),
190
+ reports.length > 0 && /* @__PURE__ */ jsx("p", {
191
+ role: "status",
192
+ children: t("measurement.report", { params: {
193
+ updated: reports.reduce((total, report) => total + report.updated.length, 0),
194
+ skipped: reports.reduce((total, report) => total + report.skipped.length, 0),
195
+ failed: reports.reduce((total, report) => total + report.failed.length + (report.scaleError || report.error ? 1 : 0), 0)
196
+ } })
197
+ }),
198
+ error && /* @__PURE__ */ jsx("p", {
199
+ role: "alert",
200
+ className: "text-red-600",
201
+ children: error
202
+ })
203
+ ]
204
+ });
205
+ }
206
+ function CalibrationDialog() {
207
+ const t = useT();
208
+ const measurement = useMeasurement();
209
+ const { busy, calibrationRequest: request } = useMeasurementState();
210
+ const canCalibrate = useSelector(MeasurementToken, (current) => current.canCalibrate());
211
+ const input = useRef(null);
212
+ const [value, setValue] = useState("");
213
+ const [unit, setUnit] = useState("m");
214
+ const [allPages, setAllPages] = useState(false);
215
+ const [recalculate, setRecalculate] = useState(true);
216
+ const [error, setError] = useState(null);
217
+ useEffect(() => {
218
+ setValue("");
219
+ setError(null);
220
+ input.current?.focus();
221
+ }, [request]);
222
+ if (!request) return null;
223
+ const submit = async () => {
224
+ setError(null);
225
+ try {
226
+ await measurement.calibrate({
227
+ page: request.page,
228
+ from: request.from,
229
+ to: request.to,
230
+ distance: {
231
+ value: Number(value),
232
+ unit
233
+ }
234
+ }, {
235
+ recalculate,
236
+ applyTo: allPages ? "all" : void 0
237
+ });
238
+ measurement.dismissCalibration();
239
+ } catch (error) {
240
+ setError(error instanceof Error ? error.message : String(error));
241
+ }
242
+ };
243
+ return /* @__PURE__ */ jsx(Dialog, {
244
+ labelledBy: "measurement-calibration-title",
245
+ onClose: () => {
246
+ if (!busy) measurement.dismissCalibration();
247
+ },
248
+ className: "border-border bg-surface w-96 rounded-lg border p-5 shadow-xl",
249
+ children: /* @__PURE__ */ jsxs("form", {
250
+ className: "flex flex-col gap-4",
251
+ onSubmit: (event) => {
252
+ event.preventDefault();
253
+ submit();
254
+ },
255
+ children: [
256
+ /* @__PURE__ */ jsx("h2", {
257
+ id: "measurement-calibration-title",
258
+ className: "font-semibold",
259
+ children: t("measurement.calibrate")
260
+ }),
261
+ /* @__PURE__ */ jsx("p", {
262
+ className: "text-fg-muted text-sm",
263
+ children: t("measurement.knownLength")
264
+ }),
265
+ /* @__PURE__ */ jsxs("label", { children: [t("measurement.length"), /* @__PURE__ */ jsx("input", {
266
+ ref: input,
267
+ "aria-label": t("measurement.length"),
268
+ className: control,
269
+ type: "number",
270
+ min: "0",
271
+ step: "any",
272
+ value,
273
+ onChange: (event) => setValue(event.target.value)
274
+ })] }),
275
+ /* @__PURE__ */ jsxs("label", { children: [t("measurement.unit"), /* @__PURE__ */ jsx("select", {
276
+ className: control,
277
+ "aria-label": t("measurement.unit"),
278
+ value: unit,
279
+ onChange: (event) => setUnit(event.target.value),
280
+ children: measurement.listUnits().map((lengthUnit) => /* @__PURE__ */ jsx("option", { children: lengthUnit }, lengthUnit))
281
+ })] }),
282
+ /* @__PURE__ */ jsxs("label", {
283
+ className: "flex items-center gap-2 text-sm",
284
+ children: [/* @__PURE__ */ jsx("input", {
285
+ type: "checkbox",
286
+ checked: allPages,
287
+ onChange: (event) => setAllPages(event.target.checked)
288
+ }), t("measurement.allPages")]
289
+ }),
290
+ /* @__PURE__ */ jsxs("label", {
291
+ className: "flex items-center gap-2 text-sm",
292
+ children: [/* @__PURE__ */ jsx("input", {
293
+ type: "checkbox",
294
+ checked: recalculate,
295
+ onChange: (event) => setRecalculate(event.target.checked)
296
+ }), t("measurement.recalculate")]
297
+ }),
298
+ error && /* @__PURE__ */ jsx("p", {
299
+ role: "alert",
300
+ className: "text-sm text-red-600",
301
+ children: error
302
+ }),
303
+ /* @__PURE__ */ jsxs("div", {
304
+ className: "flex justify-end gap-2",
305
+ children: [/* @__PURE__ */ jsx("button", {
306
+ type: "button",
307
+ className: button,
308
+ disabled: busy,
309
+ onClick: () => measurement.dismissCalibration(),
310
+ children: t("demo.cancel")
311
+ }), /* @__PURE__ */ jsx("button", {
312
+ className: button,
313
+ type: "submit",
314
+ disabled: busy || !canCalibrate || !(Number(value) > 0) || !Number.isFinite(Number(value)),
315
+ children: busy ? t("measurement.applying") : t("measurement.apply")
316
+ })]
317
+ })
318
+ ]
319
+ })
320
+ });
321
+ }
322
+ //#endregion
323
+ export { CalibrationDialog, MeasurementSection };
324
+
325
+ //# sourceMappingURL=measurement-CQdbnIrn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measurement-CQdbnIrn.js","names":[],"sources":["../src/ui/measurement.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { useCapability, useSelector } from '@embedpdf/react/runtime';\nimport { AnnotationToken, useAnnotationState } from '@embedpdf/react/annotation';\nimport { StageToken } from '@embedpdf/react/stage';\nimport {\n MeasurementToken,\n useMeasurement,\n useMeasurementState,\n usePageScale,\n type LengthUnit,\n type AreaUnit,\n type MeasurementReadout,\n} from '@embedpdf/react/measurement';\nimport { useT } from '@embedpdf/react/i18n';\nimport { Dialog } from './dialog';\nimport { Icon } from './icons';\n\nconst control =\n 'border-border bg-surface text-fg w-full rounded-md border px-2 py-1.5 text-sm disabled:opacity-50';\n\nconst button =\n 'border-border text-fg hover:bg-hover rounded-md border px-3 py-1.5 text-sm disabled:opacity-50';\n\n/** The current page's address, or null with no page (empty document). */\nconst useCurrentPage = () => useSelector(StageToken, (stage) => stage.getCurrentPage());\n\nexport function MeasurementSection() {\n const t = useT();\n\n const page = useCurrentPage();\n\n const measurement = useMeasurement();\n const busy = useMeasurementState((state) => state.busy);\n const canCalibrate = useSelector(MeasurementToken, (current) => current.canCalibrate());\n\n const scale = usePageScale(page);\n const anno = useCapability(AnnotationToken);\n const selected = useAnnotationState((state) => state.selected);\n const resettable = useSelector(\n AnnotationToken,\n (annotation) =>\n annotation.selection\n .list()\n .filter(\n (candidate) =>\n (candidate.subtype === 'polygon' || candidate.subtype === 'polyline') &&\n candidate.captionCenter &&\n annotation.canUpdate(candidate.ref) &&\n !candidate.lockedContents,\n ),\n (left, right) =>\n left.length === right.length && left.every((annotation, i) => annotation === right[i]),\n );\n const readouts = useSelector(\n MeasurementToken,\n (measurement) =>\n anno.selection\n .list()\n .map((annotation) => measurement.getReadout(annotation.ref))\n .filter((readout): readout is MeasurementReadout => !('unavailable' in readout)),\n (left, right) => JSON.stringify(left) === JSON.stringify(right),\n );\n const reports = useMeasurementState((state) => state.lastReports);\n const [allPages, setAllPages] = useState(false);\n\n const [recalculate, setRecalculate] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const disabled = !page || busy || !canCalibrate || !scale?.ready;\n const rectilinear = scale?.measure?.subtype === 'rectilinear' ? scale.measure : null;\n const target = allPages ? 'all' : page!;\n const options = { recalculate };\n const run = async (work: () => Promise<unknown>) => {\n setError(null);\n try {\n await work();\n } catch (error) {\n setError(error instanceof Error ? error.message : String(error));\n }\n };\n const precision = rectilinear?.distance[rectilinear.distance.length - 1]?.precision ?? 100;\n return (\n <div className=\"flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4 text-sm\">\n <p className=\"text-fg-muted\">{t('measurement.instructions')}</p>\n <div>\n <span className=\"text-fg-muted\">{t('measurement.scale')}: </span>\n <strong>{rectilinear?.ratio ?? t('measurement.unavailable')}</strong>\n </div>\n {scale?.error && (\n <p role=\"alert\" className=\"text-red-600\">\n {scale.error.message}\n </p>\n )}\n {scale && !scale.persistent && scale.ready && (\n <p className=\"text-fg-muted\">{t('measurement.sessionOnly')}</p>\n )}\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={allPages}\n disabled={busy}\n onChange={(event) => setAllPages(event.target.checked)}\n />\n {t('measurement.allPages')}\n </label>\n <label className=\"flex items-center gap-2\">\n <input\n type=\"checkbox\"\n checked={recalculate}\n disabled={busy}\n onChange={(event) => setRecalculate(event.target.checked)}\n />\n {t('measurement.recalculate')}\n </label>\n <label>\n {t('measurement.preset')}\n <select\n aria-label={t('measurement.preset')}\n className={control}\n value=\"\"\n disabled={disabled}\n onChange={(event) =>\n void run(() => measurement.setPreset(target, event.target.value, options))\n }\n >\n <option value=\"\" disabled>\n {t('measurement.choosePreset')}\n </option>\n {measurement.listPresets().map((preset) => (\n <option key={preset.id} value={preset.id}>\n {preset.label}\n </option>\n ))}\n </select>\n </label>\n <label>\n {t('measurement.unit')}\n <select\n aria-label={t('measurement.unit')}\n className={control}\n value={rectilinear?.distance[0]?.unit.trim() ?? ''}\n disabled={disabled || !rectilinear}\n onChange={(event) =>\n void run(() => measurement.setUnit(target, event.target.value as LengthUnit, options))\n }\n >\n {!measurement\n .listUnits()\n .includes(rectilinear?.distance[0]?.unit.trim() as LengthUnit) && (\n <option value={rectilinear?.distance[0]?.unit.trim() ?? ''}>\n {t('measurement.custom')}\n </option>\n )}\n {measurement.listUnits().map((unit) => (\n <option key={unit} value={unit}>\n {unit}\n </option>\n ))}\n </select>\n </label>\n <label>\n {t('measurement.areaUnit')}\n <select\n aria-label={t('measurement.areaUnit')}\n className={control}\n value={rectilinear?.area[0]?.unit.trim().replace('²', '2') ?? ''}\n disabled={disabled || !rectilinear}\n onChange={(event) =>\n void run(() => measurement.setAreaUnit(target, event.target.value as AreaUnit, options))\n }\n >\n {!measurement\n .listAreaUnits()\n .includes(rectilinear?.area[0]?.unit.trim().replace('²', '2') as AreaUnit) && (\n <option value={rectilinear?.area[0]?.unit.trim().replace('²', '2') ?? ''}>\n {t('measurement.custom')}\n </option>\n )}\n {measurement.listAreaUnits().map((unit) => (\n <option key={unit} value={unit}>\n {unit.replace('2', '²')}\n </option>\n ))}\n </select>\n </label>\n <label>\n {t('measurement.precision')}\n <select\n aria-label={t('measurement.precision')}\n className={control}\n value={precision}\n disabled={disabled || !rectilinear}\n onChange={(event) =>\n void run(() => measurement.setPrecision(target, Number(event.target.value), options))\n }\n >\n {![1, 10, 100, 1000, 10000].includes(precision) && (\n <option value={precision}>{t('measurement.custom')}</option>\n )}\n {[1, 10, 100, 1000, 10000].map((candidate) => (\n <option key={candidate} value={candidate}>\n {1 / candidate}\n </option>\n ))}\n </select>\n </label>\n <button className={button} disabled={disabled} onClick={() => measurement.startCalibration()}>\n {t('measurement.calibrate')}\n </button>\n {selected.length > 0 && (\n <section className=\"border-border-subtle border-t pt-3\">\n <h3 className=\"mb-1 font-medium\">{t('measurement.selection')}</h3>\n {readouts.length ? (\n readouts.map((readout, i) => (\n <div key={i} className=\"mb-2\">\n <p>\n {t(`measurement.${readout.kind}`)}: {readout.label}\n </p>\n {readout.perimeter && (\n <p>\n {t('measurement.perimeter')}: {readout.perimeter}\n </p>\n )}\n </div>\n ))\n ) : (\n <p className=\"text-fg-muted\">{t('measurement.unavailable')}</p>\n )}\n {resettable.length > 0 && (\n <button\n className={button}\n disabled={busy}\n onClick={() =>\n void run(async () => {\n for (const annotation of resettable) {\n if (annotation.subtype === 'polygon' || annotation.subtype === 'polyline') {\n await anno.update(annotation.ref, {\n subtype: annotation.subtype,\n captionCenter: null,\n });\n }\n }\n })\n }\n >\n {t('measurement.resetLabel')}\n </button>\n )}\n </section>\n )}\n {reports.length > 0 && (\n <p role=\"status\">\n {t('measurement.report', {\n params: {\n updated: reports.reduce((total, report) => total + report.updated.length, 0),\n skipped: reports.reduce((total, report) => total + report.skipped.length, 0),\n failed: reports.reduce(\n (total, report) =>\n total + report.failed.length + (report.scaleError || report.error ? 1 : 0),\n 0,\n ),\n },\n })}\n </p>\n )}\n {error && (\n <p role=\"alert\" className=\"text-red-600\">\n {error}\n </p>\n )}\n </div>\n );\n}\n\nexport function CalibrationDialog() {\n const t = useT();\n\n const measurement = useMeasurement();\n const { busy, calibrationRequest: request } = useMeasurementState();\n const canCalibrate = useSelector(MeasurementToken, (current) => current.canCalibrate());\n const input = useRef<HTMLInputElement>(null);\n const [value, setValue] = useState('');\n\n const [unit, setUnit] = useState<LengthUnit>('m');\n const [allPages, setAllPages] = useState(false);\n\n const [recalculate, setRecalculate] = useState(true);\n const [error, setError] = useState<string | null>(null);\n useEffect(() => {\n setValue('');\n setError(null);\n input.current?.focus();\n }, [request]);\n if (!request) return null;\n const submit = async () => {\n setError(null);\n try {\n await measurement.calibrate(\n {\n page: request.page,\n from: request.from,\n to: request.to,\n distance: { value: Number(value), unit },\n },\n { recalculate, applyTo: allPages ? 'all' : undefined },\n );\n measurement.dismissCalibration();\n } catch (error) {\n setError(error instanceof Error ? error.message : String(error));\n }\n };\n return (\n <Dialog\n labelledBy=\"measurement-calibration-title\"\n onClose={() => {\n if (!busy) measurement.dismissCalibration();\n }}\n className=\"border-border bg-surface w-96 rounded-lg border p-5 shadow-xl\"\n >\n <form\n className=\"flex flex-col gap-4\"\n onSubmit={(event) => {\n event.preventDefault();\n void submit();\n }}\n >\n <h2 id=\"measurement-calibration-title\" className=\"font-semibold\">\n {t('measurement.calibrate')}\n </h2>\n <p className=\"text-fg-muted text-sm\">{t('measurement.knownLength')}</p>\n <label>\n {t('measurement.length')}\n <input\n ref={input}\n aria-label={t('measurement.length')}\n className={control}\n type=\"number\"\n min=\"0\"\n step=\"any\"\n value={value}\n onChange={(event) => setValue(event.target.value)}\n />\n </label>\n <label>\n {t('measurement.unit')}\n <select\n className={control}\n aria-label={t('measurement.unit')}\n value={unit}\n onChange={(event) => setUnit(event.target.value as LengthUnit)}\n >\n {measurement.listUnits().map((lengthUnit) => (\n <option key={lengthUnit}>{lengthUnit}</option>\n ))}\n </select>\n </label>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={allPages}\n onChange={(event) => setAllPages(event.target.checked)}\n />\n {t('measurement.allPages')}\n </label>\n <label className=\"flex items-center gap-2 text-sm\">\n <input\n type=\"checkbox\"\n checked={recalculate}\n onChange={(event) => setRecalculate(event.target.checked)}\n />\n {t('measurement.recalculate')}\n </label>\n {error && (\n <p role=\"alert\" className=\"text-sm text-red-600\">\n {error}\n </p>\n )}\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n className={button}\n disabled={busy}\n onClick={() => measurement.dismissCalibration()}\n >\n {t('demo.cancel')}\n </button>\n <button\n className={button}\n type=\"submit\"\n disabled={\n busy || !canCalibrate || !(Number(value) > 0) || !Number.isFinite(Number(value))\n }\n >\n {busy ? t('measurement.applying') : t('measurement.apply')}\n </button>\n </div>\n </form>\n </Dialog>\n );\n}\n"],"mappings":"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"}