@embedpdf/viewer-chrome 3.0.0-next.15 → 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.
- package/dist/{annotation-fonts-BqoLZ4Mp.js → annotation-fonts-DWjVOTP0.js} +2 -2
- package/dist/{annotation-fonts-BqoLZ4Mp.js.map → annotation-fonts-DWjVOTP0.js.map} +1 -1
- package/dist/{annotation-fonts-Dt0IQXhz.cjs → annotation-fonts-dpfVkhnq.cjs} +2 -2
- package/dist/{annotation-fonts-Dt0IQXhz.cjs.map → annotation-fonts-dpfVkhnq.cjs.map} +1 -1
- package/dist/{annotation-style-Bzvvp8-N.cjs → annotation-style-B3XKAyZ-.cjs} +3 -3
- package/dist/{annotation-style-Bzvvp8-N.cjs.map → annotation-style-B3XKAyZ-.cjs.map} +1 -1
- package/dist/{annotation-style--rPIZsuP.js → annotation-style-CXF3X47Z.js} +3 -3
- package/dist/{annotation-style--rPIZsuP.js.map → annotation-style-CXF3X47Z.js.map} +1 -1
- package/dist/{ar-DnEj5vbP.cjs → ar-B132r9bo.cjs} +93 -1
- package/dist/ar-B132r9bo.cjs.map +1 -0
- package/dist/{ar-D9XKAmDx.js → ar-BLWFJoA_.js} +93 -1
- package/dist/ar-BLWFJoA_.js.map +1 -0
- package/dist/attachments-panel-Cxln8xos.cjs +217 -0
- package/dist/attachments-panel-Cxln8xos.cjs.map +1 -0
- package/dist/attachments-panel-H1ucRbwo.js +217 -0
- package/dist/attachments-panel-H1ucRbwo.js.map +1 -0
- package/dist/chrome.cjs +21 -0
- package/dist/chrome.cjs.map +1 -1
- package/dist/chrome.js +21 -0
- package/dist/chrome.js.map +1 -1
- package/dist/{commands-BmgxhJ8B.js → commands-BkgLP3Om.js} +418 -23
- package/dist/commands-BkgLP3Om.js.map +1 -0
- package/dist/{commands-CYt4SFUX.cjs → commands-DL1gjZt7.cjs} +433 -20
- package/dist/commands-DL1gjZt7.cjs.map +1 -0
- package/dist/commands.cjs +2 -1
- package/dist/commands.d.cts +3 -1
- package/dist/commands.d.ts +3 -1
- package/dist/commands.js +2 -2
- package/dist/{comments-panel-pEcQg4Vs.cjs → comments-panel-BsnWedTh.cjs} +2 -2
- package/dist/{comments-panel-pEcQg4Vs.cjs.map → comments-panel-BsnWedTh.cjs.map} +1 -1
- package/dist/{comments-panel-MUVgLCBI.js → comments-panel-D7Eadws9.js} +2 -2
- package/dist/{comments-panel-MUVgLCBI.js.map → comments-panel-D7Eadws9.js.map} +1 -1
- package/dist/{de-Dv6zvbnd.cjs → de-7_MvFWzN.cjs} +93 -1
- package/dist/de-7_MvFWzN.cjs.map +1 -0
- package/dist/{de-Bdr4aWzm.js → de-BUhwc9-x.js} +93 -1
- package/dist/de-BUhwc9-x.js.map +1 -0
- package/dist/{dialog-B5GBisKv.js → dialog-BIb373cg.js} +3 -3
- package/dist/dialog-BIb373cg.js.map +1 -0
- package/dist/{dialog-t8F13BL_.cjs → dialog-CngKTnAM.cjs} +3 -3
- package/dist/dialog-CngKTnAM.cjs.map +1 -0
- package/dist/{es-BP09DR9w.cjs → es-DgYj-1L3.cjs} +93 -1
- package/dist/es-DgYj-1L3.cjs.map +1 -0
- package/dist/{es-BSXz5tBv.js → es-DoXTqFoO.js} +93 -1
- package/dist/es-DoXTqFoO.js.map +1 -0
- package/dist/{form-design-panel-vWWU9uB-.js → form-design-panel-CgV_5YWC.js} +3 -3
- package/dist/{form-design-panel-vWWU9uB-.js.map → form-design-panel-CgV_5YWC.js.map} +1 -1
- package/dist/{form-design-panel-B5MXTZ96.cjs → form-design-panel-D0FdmWXW.cjs} +3 -3
- package/dist/{form-design-panel-B5MXTZ96.cjs.map → form-design-panel-D0FdmWXW.cjs.map} +1 -1
- package/dist/{fr-Ckn3K9v1.js → fr-B-8NDhBA.js} +93 -1
- package/dist/fr-B-8NDhBA.js.map +1 -0
- package/dist/{fr-BBQQn7tJ.cjs → fr-C856dmQJ.cjs} +93 -1
- package/dist/fr-C856dmQJ.cjs.map +1 -0
- package/dist/{he-DRsG7bH7.cjs → he-BFTeNc4t.cjs} +93 -1
- package/dist/he-BFTeNc4t.cjs.map +1 -0
- package/dist/{he-wdGU5PkU.js → he-Dlh0fNXM.js} +93 -1
- package/dist/he-Dlh0fNXM.js.map +1 -0
- package/dist/{icons-x0Tc05bs.cjs → icons-1UfLUZ_y.cjs} +20 -1
- package/dist/icons-1UfLUZ_y.cjs.map +1 -0
- package/dist/{icons-BrK5iVL8.js → icons-7dB0Y1ct.js} +20 -1
- package/dist/icons-7dB0Y1ct.js.map +1 -0
- package/dist/index.cjs +740 -171
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +16 -2
- package/dist/index.d.ts +16 -2
- package/dist/index.js +727 -170
- package/dist/index.js.map +1 -1
- package/dist/{it-BuP4o0xQ.cjs → it-Bef-2Yxq.cjs} +93 -1
- package/dist/it-Bef-2Yxq.cjs.map +1 -0
- package/dist/{it-Us-VmvIu.js → it-BkirG7ol.js} +93 -1
- package/dist/it-BkirG7ol.js.map +1 -0
- package/dist/{ja-Cizj0-5O.js → ja-CGEjCE-s.js} +93 -1
- package/dist/ja-CGEjCE-s.js.map +1 -0
- package/dist/{ja-DovEd6ts.cjs → ja-DNw2zqSD.cjs} +93 -1
- package/dist/ja-DNw2zqSD.cjs.map +1 -0
- package/dist/{ko-DlrXliE1.js → ko-CTkl5vMh.js} +93 -1
- package/dist/ko-CTkl5vMh.js.map +1 -0
- package/dist/{ko-B-qJEol2.cjs → ko-YHzeBqP6.cjs} +93 -1
- package/dist/ko-YHzeBqP6.cjs.map +1 -0
- package/dist/{link-editor-CSjqPnj1.cjs → link-editor-CAS7MZM2.cjs} +2 -2
- package/dist/{link-editor-CSjqPnj1.cjs.map → link-editor-CAS7MZM2.cjs.map} +1 -1
- package/dist/{link-editor-SxM1nnJU.js → link-editor-CkwtqRvb.js} +2 -2
- package/dist/{link-editor-SxM1nnJU.js.map → link-editor-CkwtqRvb.js.map} +1 -1
- package/dist/{measurement-Bs61XWbJ.js → measurement-CQdbnIrn.js} +2 -2
- package/dist/{measurement-Bs61XWbJ.js.map → measurement-CQdbnIrn.js.map} +1 -1
- package/dist/{measurement-CcCsHPOX.cjs → measurement-Cxv1Ahxx.cjs} +2 -2
- package/dist/{measurement-CcCsHPOX.cjs.map → measurement-Cxv1Ahxx.cjs.map} +1 -1
- package/dist/{nl-D3KZDDiJ.cjs → nl-BjkbaLq3.cjs} +93 -1
- package/dist/nl-BjkbaLq3.cjs.map +1 -0
- package/dist/{nl-0aF7M_0h.js → nl-Dya4sR8_.js} +93 -1
- package/dist/nl-Dya4sR8_.js.map +1 -0
- package/dist/outline-panel-BpGtBdj0.cjs +707 -0
- package/dist/outline-panel-BpGtBdj0.cjs.map +1 -0
- package/dist/outline-panel-DO5_REYw.js +707 -0
- package/dist/outline-panel-DO5_REYw.js.map +1 -0
- package/dist/outline-properties-BCa2cc0t.js +330 -0
- package/dist/outline-properties-BCa2cc0t.js.map +1 -0
- package/dist/outline-properties-DT3FIxCw.cjs +330 -0
- package/dist/outline-properties-DT3FIxCw.cjs.map +1 -0
- package/dist/{pl-DSFhAUqx.cjs → pl-CKKdVnpZ.cjs} +93 -1
- package/dist/pl-CKKdVnpZ.cjs.map +1 -0
- package/dist/{pl-BW--AaCI.js → pl-DA9b5NVg.js} +93 -1
- package/dist/pl-DA9b5NVg.js.map +1 -0
- package/dist/print-dialog-BqIrHCBh.cjs +276 -0
- package/dist/print-dialog-BqIrHCBh.cjs.map +1 -0
- package/dist/print-dialog-DvcI2m2_.js +276 -0
- package/dist/print-dialog-DvcI2m2_.js.map +1 -0
- package/dist/{pt-C5S-8MC5.cjs → pt-DLcszlzi.cjs} +93 -1
- package/dist/pt-DLcszlzi.cjs.map +1 -0
- package/dist/{pt-DIhpU5pT.js → pt-Nm8yyjbX.js} +93 -1
- package/dist/pt-Nm8yyjbX.js.map +1 -0
- package/dist/{redact-confirm-CX_SY2ZN.cjs → redact-confirm-C6EiK8yN.cjs} +2 -2
- package/dist/{redact-confirm-CX_SY2ZN.cjs.map → redact-confirm-C6EiK8yN.cjs.map} +1 -1
- package/dist/{redact-confirm-B6j36TPw.js → redact-confirm-CKuv9iN_.js} +2 -2
- package/dist/{redact-confirm-B6j36TPw.js.map → redact-confirm-CKuv9iN_.js.map} +1 -1
- package/dist/{redaction-panel-IJDshSJI.js → redaction-panel-CgNZ-pQk.js} +2 -2
- package/dist/{redaction-panel-IJDshSJI.js.map → redaction-panel-CgNZ-pQk.js.map} +1 -1
- package/dist/{redaction-panel-BmoIl-Ll.cjs → redaction-panel-ZhX0dlMi.cjs} +2 -2
- package/dist/{redaction-panel-BmoIl-Ll.cjs.map → redaction-panel-ZhX0dlMi.cjs.map} +1 -1
- package/dist/{search-panel-HfIhJm1M.js → search-panel-BE4xzWlm.js} +4 -4
- package/dist/{search-panel-HfIhJm1M.js.map → search-panel-BE4xzWlm.js.map} +1 -1
- package/dist/{search-panel-s9IoiOtv.cjs → search-panel-wcbTNG1z.cjs} +4 -4
- package/dist/{search-panel-s9IoiOtv.cjs.map → search-panel-wcbTNG1z.cjs.map} +1 -1
- package/dist/{sheet-BDsa_Sup.cjs → sheet-DTBFiwde.cjs} +30 -11
- package/dist/sheet-DTBFiwde.cjs.map +1 -0
- package/dist/{sheet-R6XDgyEf.js → sheet-DyjKfAq0.js} +25 -12
- package/dist/sheet-DyjKfAq0.js.map +1 -0
- package/dist/{sign-dialog-CgnR7akj.cjs → sign-dialog-D5WGx-Yn.cjs} +2 -2
- package/dist/{sign-dialog-CgnR7akj.cjs.map → sign-dialog-D5WGx-Yn.cjs.map} +1 -1
- package/dist/{sign-dialog-GDqCoQhA.js → sign-dialog-DerNe8qT.js} +2 -2
- package/dist/{sign-dialog-GDqCoQhA.js.map → sign-dialog-DerNe8qT.js.map} +1 -1
- package/dist/{signature-inspector-DyO313Qf.cjs → signature-inspector-Bz6TAfZM.cjs} +4 -10
- package/dist/signature-inspector-Bz6TAfZM.cjs.map +1 -0
- package/dist/{signature-inspector-okFz8do6.js → signature-inspector-CsGr9EBk.js} +4 -10
- package/dist/signature-inspector-CsGr9EBk.js.map +1 -0
- package/dist/{signature-maker-BoYa8vgA.cjs → signature-maker-D_YfBXLn.cjs} +3 -3
- package/dist/{signature-maker-BoYa8vgA.cjs.map → signature-maker-D_YfBXLn.cjs.map} +1 -1
- package/dist/{signature-maker-BhCmYyHD.js → signature-maker-Dnth4rV4.js} +3 -3
- package/dist/{signature-maker-BhCmYyHD.js.map → signature-maker-Dnth4rV4.js.map} +1 -1
- package/dist/{signatures-panel-B56PC6d9.cjs → signatures-panel-Ci_LaI1C.cjs} +4 -10
- package/dist/signatures-panel-Ci_LaI1C.cjs.map +1 -0
- package/dist/{signatures-panel-CgnFfhFm.js → signatures-panel-DZ9ywrjz.js} +4 -10
- package/dist/signatures-panel-DZ9ywrjz.js.map +1 -0
- package/dist/{stamps-panel-CDO0FPyK.js → stamps-panel-BrczStaz.js} +4 -10
- package/dist/stamps-panel-BrczStaz.js.map +1 -0
- package/dist/{stamps-panel-B9NYGayn.cjs → stamps-panel-Cv9nJBwx.cjs} +4 -10
- package/dist/stamps-panel-Cv9nJBwx.cjs.map +1 -0
- package/dist/theme-Be0OZokZ.js +97 -0
- package/dist/theme-Be0OZokZ.js.map +1 -0
- package/dist/theme-FR26JI3r.cjs +126 -0
- package/dist/theme-FR26JI3r.cjs.map +1 -0
- package/dist/{toolbar-z9od3tKl.js → toolbar-DF361xWY.js} +7 -6
- package/dist/toolbar-DF361xWY.js.map +1 -0
- package/dist/{toolbar-CJu2wKTU.cjs → toolbar-ddvpsvTb.cjs} +7 -6
- package/dist/toolbar-ddvpsvTb.cjs.map +1 -0
- package/dist/{zh-cn-CxkUUBct.js → zh-cn-BMPPkLpL.js} +93 -1
- package/dist/zh-cn-BMPPkLpL.js.map +1 -0
- package/dist/{zh-cn-3tmMeHqv.cjs → zh-cn-CZOO3p4H.cjs} +93 -1
- package/dist/zh-cn-CZOO3p4H.cjs.map +1 -0
- package/package.json +4 -4
- package/src/styles.css +8 -0
- package/dist/ar-D9XKAmDx.js.map +0 -1
- package/dist/ar-DnEj5vbP.cjs.map +0 -1
- package/dist/commands-BmgxhJ8B.js.map +0 -1
- package/dist/commands-CYt4SFUX.cjs.map +0 -1
- package/dist/de-Bdr4aWzm.js.map +0 -1
- package/dist/de-Dv6zvbnd.cjs.map +0 -1
- package/dist/dialog-B5GBisKv.js.map +0 -1
- package/dist/dialog-t8F13BL_.cjs.map +0 -1
- package/dist/es-BP09DR9w.cjs.map +0 -1
- package/dist/es-BSXz5tBv.js.map +0 -1
- package/dist/fr-BBQQn7tJ.cjs.map +0 -1
- package/dist/fr-Ckn3K9v1.js.map +0 -1
- package/dist/he-DRsG7bH7.cjs.map +0 -1
- package/dist/he-wdGU5PkU.js.map +0 -1
- package/dist/icons-BrK5iVL8.js.map +0 -1
- package/dist/icons-x0Tc05bs.cjs.map +0 -1
- package/dist/it-BuP4o0xQ.cjs.map +0 -1
- package/dist/it-Us-VmvIu.js.map +0 -1
- package/dist/ja-Cizj0-5O.js.map +0 -1
- package/dist/ja-DovEd6ts.cjs.map +0 -1
- package/dist/ko-B-qJEol2.cjs.map +0 -1
- package/dist/ko-DlrXliE1.js.map +0 -1
- package/dist/nl-0aF7M_0h.js.map +0 -1
- package/dist/nl-D3KZDDiJ.cjs.map +0 -1
- package/dist/pl-BW--AaCI.js.map +0 -1
- package/dist/pl-DSFhAUqx.cjs.map +0 -1
- package/dist/pt-C5S-8MC5.cjs.map +0 -1
- package/dist/pt-DIhpU5pT.js.map +0 -1
- package/dist/sheet-BDsa_Sup.cjs.map +0 -1
- package/dist/sheet-R6XDgyEf.js.map +0 -1
- package/dist/signature-inspector-DyO313Qf.cjs.map +0 -1
- package/dist/signature-inspector-okFz8do6.js.map +0 -1
- package/dist/signatures-panel-B56PC6d9.cjs.map +0 -1
- package/dist/signatures-panel-CgnFfhFm.js.map +0 -1
- package/dist/stamps-panel-B9NYGayn.cjs.map +0 -1
- package/dist/stamps-panel-CDO0FPyK.js.map +0 -1
- package/dist/toolbar-CJu2wKTU.cjs.map +0 -1
- package/dist/toolbar-z9od3tKl.js.map +0 -1
- package/dist/zh-cn-3tmMeHqv.cjs.map +0 -1
- package/dist/zh-cn-CxkUUBct.js.map +0 -1
|
@@ -99,6 +99,7 @@ const ko = {
|
|
|
99
99
|
note: "댓글",
|
|
100
100
|
link: "링크",
|
|
101
101
|
gotoLink: "링크로 이동",
|
|
102
|
+
saveFile: "파일 저장",
|
|
102
103
|
removeLink: "링크 제거",
|
|
103
104
|
delete: "삭제",
|
|
104
105
|
group: "그룹화",
|
|
@@ -155,12 +156,44 @@ const ko = {
|
|
|
155
156
|
"annotations-create": "주석 추가는 허용되지 않습니다",
|
|
156
157
|
"doc-annotate-modify": "주석 변경은 허용되지 않습니다",
|
|
157
158
|
"doc-annotate-read": "주석 보기는 허용되지 않습니다",
|
|
159
|
+
"doc-attachments-modify": "파일을 추가할 수 없습니다",
|
|
158
160
|
"doc-download": "다운로드는 허용되지 않습니다",
|
|
159
161
|
"doc-forms-modify": "양식 필드 편집은 허용되지 않습니다",
|
|
162
|
+
"doc-outline-modify": "책갈피 변경은 허용되지 않습니다",
|
|
163
|
+
"doc-pages-assemble": "페이지 변경은 허용되지 않습니다",
|
|
160
164
|
"doc-print": "인쇄는 허용되지 않습니다",
|
|
161
165
|
"doc-text-copy": "복사는 허용되지 않습니다",
|
|
162
166
|
"doc-text-search": "검색은 허용되지 않습니다"
|
|
163
167
|
},
|
|
168
|
+
attachment: {
|
|
169
|
+
add: "파일 추가",
|
|
170
|
+
save: "저장",
|
|
171
|
+
goTo: "페이지로 이동",
|
|
172
|
+
delete: "삭제",
|
|
173
|
+
more: "추가 옵션"
|
|
174
|
+
},
|
|
175
|
+
outline: {
|
|
176
|
+
add: "책갈피 추가",
|
|
177
|
+
addChild: "하위 책갈피 추가",
|
|
178
|
+
rename: "이름 바꾸기",
|
|
179
|
+
setDestination: "대상을 현재 보기로 설정",
|
|
180
|
+
properties: "속성…",
|
|
181
|
+
delete: "삭제",
|
|
182
|
+
expandAll: "모두 펼치기",
|
|
183
|
+
collapseAll: "모두 접기",
|
|
184
|
+
more: "추가 옵션"
|
|
185
|
+
},
|
|
186
|
+
pages: {
|
|
187
|
+
rotateClockwise: "페이지를 시계 방향으로 회전",
|
|
188
|
+
rotateCounterclockwise: "페이지를 시계 반대 방향으로 회전",
|
|
189
|
+
delete: "페이지 삭제",
|
|
190
|
+
duplicate: "페이지 복제",
|
|
191
|
+
insertBlank: "빈 페이지 삽입",
|
|
192
|
+
insertFile: "파일에서 삽입…",
|
|
193
|
+
extract: "페이지 추출",
|
|
194
|
+
selectAll: "모든 페이지 선택",
|
|
195
|
+
more: "페이지 옵션"
|
|
196
|
+
},
|
|
164
197
|
turnedOff: "{label} 기능을 사용할 수 없습니다"
|
|
165
198
|
},
|
|
166
199
|
passwordPrompt: {
|
|
@@ -213,6 +246,25 @@ const ko = {
|
|
|
213
246
|
other: "기타"
|
|
214
247
|
},
|
|
215
248
|
goToPage: { go: "이동" },
|
|
249
|
+
print: {
|
|
250
|
+
title: "인쇄",
|
|
251
|
+
pages: "페이지",
|
|
252
|
+
allPages: "모든 페이지",
|
|
253
|
+
currentPage: "현재 페이지",
|
|
254
|
+
range: "사용자 지정",
|
|
255
|
+
rangeLabel: "인쇄할 페이지",
|
|
256
|
+
rangePlaceholder: "예: 1-3, 5",
|
|
257
|
+
rangeInvalid: "1부터 {total}까지의 페이지 번호를 입력하세요(예: 1-3, 5)",
|
|
258
|
+
annotations: "주석 인쇄",
|
|
259
|
+
preparing: "준비 중…",
|
|
260
|
+
preparingPage: "{total}페이지 중 {page}페이지 준비 중…",
|
|
261
|
+
ready: "인쇄할 준비가 되었습니다.",
|
|
262
|
+
images: "페이지가 {dpi} DPI 이미지로 인쇄됩니다.",
|
|
263
|
+
lowResolution: "이 문서는 저해상도({dpi} DPI) 인쇄만 허용합니다.",
|
|
264
|
+
failed: "인쇄물을 준비하지 못했습니다.",
|
|
265
|
+
cancel: "취소",
|
|
266
|
+
print: "인쇄"
|
|
267
|
+
},
|
|
216
268
|
panels: {
|
|
217
269
|
thumbnails: "축소판",
|
|
218
270
|
outline: "책갈피",
|
|
@@ -408,6 +460,46 @@ const ko = {
|
|
|
408
460
|
noRotate: "페이지를 회전해도 똑바로 유지",
|
|
409
461
|
invisible: "레거시: 알 수 없는 하위 유형 숨김"
|
|
410
462
|
},
|
|
463
|
+
attachments: {
|
|
464
|
+
loading: "첨부 파일 불러오는 중…",
|
|
465
|
+
failed: "첨부 파일을 읽을 수 없습니다.",
|
|
466
|
+
empty: "이 문서에는 첨부 파일이 없습니다",
|
|
467
|
+
drop: "파일을 놓아 첨부하세요",
|
|
468
|
+
dropHint: "또는 여기에 파일을 놓으세요",
|
|
469
|
+
adding: "추가 중…",
|
|
470
|
+
onPage: "{page}페이지",
|
|
471
|
+
count: "파일 {count}개",
|
|
472
|
+
countPlural: "파일 {count}개"
|
|
473
|
+
},
|
|
474
|
+
outline: {
|
|
475
|
+
filter: "책갈피 필터",
|
|
476
|
+
loading: "책갈피를 불러오는 중…",
|
|
477
|
+
failed: "책갈피를 읽을 수 없습니다.",
|
|
478
|
+
empty: "이 문서에는 책갈피가 없습니다",
|
|
479
|
+
noMatches: "일치하는 책갈피가 없습니다",
|
|
480
|
+
incomplete: "책갈피의 일부를 읽을 수 없습니다.",
|
|
481
|
+
untitled: "제목 없음",
|
|
482
|
+
properties: {
|
|
483
|
+
title: "책갈피 속성",
|
|
484
|
+
name: "제목",
|
|
485
|
+
color: "색상",
|
|
486
|
+
noColor: "없음",
|
|
487
|
+
customColor: "사용자 지정 색상",
|
|
488
|
+
bold: "굵게",
|
|
489
|
+
italic: "기울임꼴",
|
|
490
|
+
open: "문서를 열 때 펼침",
|
|
491
|
+
target: "대상",
|
|
492
|
+
targetNone: "없음",
|
|
493
|
+
targetView: "현재 보기",
|
|
494
|
+
targetNamed: "페이지 동작",
|
|
495
|
+
targetKept: "그대로 유지",
|
|
496
|
+
keptNote: "이 책갈피는 스크립트를 실행하거나 다른 파일을 엽니다. 여기에서 변경할 수 없습니다.",
|
|
497
|
+
fit: "맞춤",
|
|
498
|
+
fitKept: "현재 그대로",
|
|
499
|
+
save: "저장",
|
|
500
|
+
cancel: "취소"
|
|
501
|
+
}
|
|
502
|
+
},
|
|
411
503
|
linkEditor: {
|
|
412
504
|
toUrl: "URL에 링크",
|
|
413
505
|
url: "URL",
|
|
@@ -563,4 +655,4 @@ const ko = {
|
|
|
563
655
|
//#endregion
|
|
564
656
|
exports.ko = ko;
|
|
565
657
|
|
|
566
|
-
//# sourceMappingURL=ko-
|
|
658
|
+
//# sourceMappingURL=ko-YHzeBqP6.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ko-YHzeBqP6.cjs","names":[],"sources":["../src/locales/ko.ts"],"sourcesContent":["import type { Locale } from '@embedpdf/react/i18n';\n\n/**\n * Korean pack, in the words Adobe Acrobat's Korean edition uses. Machine-translated from the\n * English pack (`./en.ts`) and not yet reviewed by a native speaker.\n */\nexport const ko: Locale = {\n code: 'ko',\n name: '한국어',\n translations: {\n measurement: {\n title: '측정',\n distance: '거리',\n perimeter: '둘레',\n area: '면적',\n areaUnit: '면적 단위',\n resetLabel: '레이블 위치 재설정',\n calibrate: '축척 보정',\n scale: '축척',\n custom: '사용자 정의',\n unavailable: '사용할 수 없음',\n instructions:\n '드래그하여 거리를 측정한 다음 클릭하여 치수선을 배치합니다. 둘레나 면적은 꼭짓점을 클릭하고 두 번 클릭하여 완료합니다. 면적 경계선은 서로 교차할 수 없으며, 사용할 수 없는 미리 보기는 완료할 수 없습니다. 취소하려면 Escape 키를 누르십시오. 레이블 자체를 드래그하면 이동할 수 있습니다.',\n sessionOnly: '이 엔진은 페이지 보정을 이 세션 동안만 유지합니다.',\n allPages: '모든 페이지에 적용',\n recalculate: '기존 측정값 다시 계산',\n preset: '축척 사전 설정',\n choosePreset: '사전 설정 선택',\n unit: '단위',\n precision: '정밀도',\n selection: '선택한 측정',\n report: '{updated}개 업데이트됨 · {skipped}개 건너뜀 · {failed}개 실패',\n knownLength: '방금 그린 선이 나타내는 실제 길이를 입력하십시오.',\n length: '알려진 길이',\n apply: '축척 적용',\n applying: '적용 중…',\n },\n commands: {\n zoom: {\n in: '확대',\n out: '축소',\n fitPage: '페이지에 맞추기',\n fitWidth: '너비에 맞추기',\n automatic: '자동',\n menu: '확대/축소',\n level: '배율',\n p50: '50%',\n p100: '100%',\n p150: '150%',\n p200: '200%',\n p400: '400%',\n },\n pan: '이동',\n pointer: '선택',\n comment: '댓글',\n style: '스타일',\n menu: '메뉴',\n viewControls: '보기 컨트롤',\n open: '열기',\n download: '다운로드',\n print: '인쇄',\n fullscreen: '전체 화면',\n spread: {\n group: '페이지 레이아웃',\n none: '단일 페이지',\n odd: '두 페이지',\n even: '표지 페이지',\n },\n scroll: {\n group: '스크롤',\n vertical: '세로',\n horizontal: '가로',\n },\n rotate: {\n group: '회전',\n clockwise: '시계 방향 회전',\n counterclockwise: '시계 반대 방향 회전',\n },\n mode: {\n measure: '측정',\n group: '모드',\n view: '보기',\n annotate: '주석',\n shapes: '도형',\n insert: '삽입',\n form: '양식',\n redact: '교정',\n },\n annotate: {\n cancelCreation: '그리기 취소',\n highlight: '강조 표시',\n strikeout: '취소선',\n underline: '밑줄',\n squiggly: '물결선',\n ink: '그리기',\n inkHighlight: '형광펜',\n text: '텍스트 상자',\n insertText: '텍스트 삽입',\n replaceText: '텍스트 바꾸기',\n callout: '설명선',\n note: '댓글',\n link: '링크',\n gotoLink: '링크로 이동',\n saveFile: '파일 저장',\n removeLink: '링크 제거',\n delete: '삭제',\n group: '그룹화',\n ungroup: '그룹 해제',\n stampFromSelection: '스탬프 만들기',\n strip: '주석 작업',\n },\n selection: {\n copy: '복사',\n strip: '텍스트 선택 작업',\n },\n shapes: {\n rectangle: '사각형',\n circle: '타원',\n line: '선',\n arrow: '화살표',\n polygon: '다각형',\n polyline: '꺾은선',\n },\n insert: {\n stamp: '스탬프',\n attachment: '파일 첨부',\n signature: '서명',\n image: '이미지',\n },\n form: {\n textfield: '텍스트 필드',\n checkbox: '확인란',\n radio: '라디오 단추',\n select: '드롭다운',\n listbox: '목록 상자',\n button: '단추',\n signature: '서명 필드',\n // The Form mode's design switch, which opens the form designer's sidebar.\n design: '양식 디자인',\n },\n redact: {\n mark: '교정 표시',\n applyAll: '교정 적용',\n clearAll: '표시 지우기',\n },\n undo: '실행 취소',\n redo: '다시 실행',\n page: {\n next: '다음 페이지',\n previous: '이전 페이지',\n first: '첫 페이지',\n last: '마지막 페이지',\n goTo: '페이지로 이동',\n },\n find: '찾기',\n shortcuts: '키보드 단축키',\n notAllowed: {\n default: '{label} 기능은 허용되지 않습니다',\n 'annotations-create': '주석 추가는 허용되지 않습니다',\n 'doc-annotate-modify': '주석 변경은 허용되지 않습니다',\n 'doc-annotate-read': '주석 보기는 허용되지 않습니다',\n 'doc-attachments-modify': '파일을 추가할 수 없습니다',\n 'doc-download': '다운로드는 허용되지 않습니다',\n 'doc-forms-modify': '양식 필드 편집은 허용되지 않습니다',\n 'doc-outline-modify': '책갈피 변경은 허용되지 않습니다',\n 'doc-pages-assemble': '페이지 변경은 허용되지 않습니다',\n 'doc-print': '인쇄는 허용되지 않습니다',\n 'doc-text-copy': '복사는 허용되지 않습니다',\n 'doc-text-search': '검색은 허용되지 않습니다',\n },\n attachment: {\n add: '파일 추가',\n save: '저장',\n goTo: '페이지로 이동',\n delete: '삭제',\n more: '추가 옵션',\n },\n outline: {\n add: '책갈피 추가',\n addChild: '하위 책갈피 추가',\n rename: '이름 바꾸기',\n setDestination: '대상을 현재 보기로 설정',\n properties: '속성…',\n delete: '삭제',\n expandAll: '모두 펼치기',\n collapseAll: '모두 접기',\n more: '추가 옵션',\n },\n // The page commands, in the Pages mode and a page's menu.\n pages: {\n rotateClockwise: '페이지를 시계 방향으로 회전',\n rotateCounterclockwise: '페이지를 시계 반대 방향으로 회전',\n delete: '페이지 삭제',\n duplicate: '페이지 복제',\n insertBlank: '빈 페이지 삽입',\n insertFile: '파일에서 삽입…',\n extract: '페이지 추출',\n selectAll: '모든 페이지 선택',\n more: '페이지 옵션',\n },\n turnedOff: '{label} 기능을 사용할 수 없습니다',\n },\n passwordPrompt: {\n title: '암호 필요',\n required: '이 문서는 암호로 보호되어 있습니다. 문서를 열려면 암호를 입력하십시오.',\n incorrect: '암호가 올바르지 않습니다. 다시 시도하십시오.',\n incorrectWarning: '잘못된 암호',\n label: '암호',\n placeholder: '암호 입력',\n cancel: '취소',\n open: '열기',\n opening: '여는 중…',\n },\n dropToOpen: {\n label: 'PDF를 끌어다 놓아 열기',\n },\n documentError: {\n title: '문서를 열 수 없음',\n unknown: '문서를 열 수 없습니다.',\n notFound: '파일을 찾을 수 없습니다.',\n notAllowed: '이 문서에 대한 액세스 권한이 없습니다.',\n damaged: '이 파일은 PDF가 아니거나 손상되었습니다.',\n unsupported: '이 뷰어로는 이 종류의 문서를 열 수 없습니다.',\n retry: '다시 시도',\n close: '문서 닫기',\n },\n tabs: {\n close: '{name} 닫기',\n loading: '로드 중',\n untitled: '문서 {id}',\n },\n closeUnsaved: {\n title: '저장하지 않고 닫으시겠습니까?',\n body: '‘{name}’에 다운로드하지 않은 변경 내용이 있습니다. 변경 내용이 손실됩니다.',\n cancel: '취소',\n close: '저장하지 않고 닫기',\n },\n viewOnly: {\n label: '보기 전용',\n turnedOff: '이 문서를 변경하는 도구가 꺼져 있습니다',\n notAllowed: '이 문서를 읽을 수는 있지만 변경할 수는 없습니다',\n },\n panel: {\n close: '닫기',\n resize: '{title} 크기 조정',\n },\n menu: {\n back: '뒤로',\n },\n shortcuts: {\n document: '문서',\n viewing: '보기',\n editing: '편집',\n other: '기타',\n },\n goToPage: {\n go: '이동',\n },\n print: {\n title: '인쇄',\n pages: '페이지',\n allPages: '모든 페이지',\n currentPage: '현재 페이지',\n range: '사용자 지정',\n rangeLabel: '인쇄할 페이지',\n rangePlaceholder: '예: 1-3, 5',\n rangeInvalid: '1부터 {total}까지의 페이지 번호를 입력하세요(예: 1-3, 5)',\n annotations: '주석 인쇄',\n preparing: '준비 중…',\n preparingPage: '{total}페이지 중 {page}페이지 준비 중…',\n ready: '인쇄할 준비가 되었습니다.',\n images: '페이지가 {dpi} DPI 이미지로 인쇄됩니다.',\n lowResolution: '이 문서는 저해상도({dpi} DPI) 인쇄만 허용합니다.',\n failed: '인쇄물을 준비하지 못했습니다.',\n cancel: '취소',\n print: '인쇄',\n },\n panels: {\n thumbnails: '축소판',\n outline: '책갈피',\n attachments: '첨부 파일',\n search: '검색',\n comments: '댓글',\n style: '스타일',\n stamps: '스탬프',\n signatures: '서명',\n redaction: '교정',\n measurement: '측정',\n formDesign: '양식 디자인',\n switch: '패널 전환',\n },\n annotation: {\n comment: '댓글',\n highlight: '강조 표시',\n underline: '밑줄',\n squiggly: '물결선',\n strikeout: '취소선',\n square: '사각형',\n circle: '타원',\n line: '선',\n polygon: '다각형',\n polyline: '꺾은선',\n ink: '자유 그리기',\n freeText: '텍스트 상자',\n stamp: '스탬프',\n caret: '캐럿',\n redact: '교정',\n fileAttachment: '첨부 파일',\n // The style panel's labels, as the annotation kinds name them (`labelKey`), by wording:\n // one field is called different things by different kinds.\n style: {\n opacity: '불투명도',\n stroke: '선',\n fill: '채우기',\n color: '색상',\n strokeWidth: '선 두께',\n border: '테두리',\n borderStyle: '테두리 스타일',\n borderColor: '테두리 색상',\n borderWidth: '테두리 두께',\n background: '배경',\n outline: '윤곽선',\n lineEndings: '선 끝 모양',\n blendMode: '혼합 모드',\n font: '글꼴',\n fontSize: '글꼴 크기',\n textColor: '텍스트 색상',\n bold: '굵게',\n italic: '기울임꼴',\n underline: '밑줄',\n align: '정렬',\n alignment: '정렬 방식',\n label: '레이블',\n labelFont: '레이블 글꼴',\n labelSize: '레이블 크기',\n labelColor: '레이블 색상',\n icon: '아이콘',\n link: '링크',\n },\n // The annotation flags (`/F`).\n flags: {\n print: '인쇄',\n hidden: '숨김',\n noView: '보기 안 함',\n toggleNoView: '보기 안 함 전환',\n readOnly: '읽기 전용',\n locked: '잠김',\n lockedContents: '내용 잠김',\n noZoom: '확대/축소 안 함',\n noRotate: '회전 안 함',\n invisible: '보이지 않음',\n },\n borderStyles: { solid: '실선', dashed: '파선', cloudy: '구름 모양' },\n lineEndings: {\n none: '없음',\n square: '사각형',\n circle: '원',\n diamond: '다이아몬드',\n openArrow: '열린 화살표',\n closedArrow: '닫힌 화살표',\n butt: '버트',\n reverseOpenArrow: '반대 방향 열린 화살표',\n reverseClosedArrow: '반대 방향 닫힌 화살표',\n slash: '슬래시',\n },\n blendModes: {\n normal: '표준',\n multiply: '곱하기',\n screen: '스크린',\n overlay: '오버레이',\n darken: '어둡게 하기',\n lighten: '밝게 하기',\n colorDodge: '색상 닷지',\n colorBurn: '색상 번',\n hardLight: '하드 라이트',\n softLight: '소프트 라이트',\n difference: '차이',\n exclusion: '제외',\n hue: '색조',\n saturation: '채도',\n color: '색상',\n luminosity: '광도',\n },\n // The standard PDF fonts, by their names: a language may keep them as they are.\n fonts: {\n courier: 'Courier',\n courierBold: 'Courier Bold',\n courierBoldOblique: 'Courier Bold Oblique',\n courierOblique: 'Courier Oblique',\n helvetica: 'Helvetica',\n helveticaBold: 'Helvetica Bold',\n helveticaBoldOblique: 'Helvetica Bold Oblique',\n helveticaOblique: 'Helvetica Oblique',\n timesRoman: 'Times Roman',\n timesBold: 'Times Bold',\n timesBoldItalic: 'Times Bold Italic',\n timesItalic: 'Times Italic',\n symbol: 'Symbol',\n zapfDingbats: 'Zapf Dingbats',\n },\n alignments: { left: '왼쪽', center: '가운데', right: '오른쪽' },\n noteIcons: {\n comment: '댓글',\n key: '키',\n note: '메모',\n help: '도움말',\n newParagraph: '새 단락',\n paragraph: '단락',\n insert: '삽입',\n },\n attachmentIcons: {\n pushPin: '압정',\n paperclip: '클립',\n graph: '그래프',\n tag: '태그',\n },\n },\n // A form field's settings, as the form plugin names them (`labelKey`).\n form: {\n settings: {\n name: '이름',\n tooltip: '도구 설명',\n required: '필수',\n readOnly: '읽기 전용',\n noExport: '내보내지 않음',\n defaultValue: '기본값',\n maxLength: '최대 길이',\n multiline: '여러 줄',\n password: '암호',\n comb: '한 칸에 한 문자',\n radiosInUnison: '값이 같은 단추가 함께 선택됨',\n keepOneOn: '항상 하나 선택',\n options: '옵션',\n allowTyping: '입력 허용',\n multiSelect: '여러 항목 선택',\n },\n },\n // A thumbnail's tooltip.\n thumbnails: { page: '{page}페이지' },\n // The form designer's sidebar: the fields by page, and the selected one's buttons.\n formDesign: {\n empty: '아직 필드가 없습니다. 필드 도구를 골라 필드를 추가하십시오.',\n page: '{page}페이지',\n allFields: '모든 필드',\n buttons: '단추',\n boxes: '확인란',\n box: '확인란 {number}',\n addButton: '단추 추가',\n addBox: '확인란 추가',\n },\n // The style panel's own words around the properties.\n stylePanel: {\n mixed: '(혼합)',\n // A color swatch that takes the color away.\n transparent: '투명',\n lineStart: '시작',\n lineEnd: '끝',\n empty: '그리기 도구를 고르거나 주석을 선택하여 스타일을 편집하십시오.',\n selected: '{count}개 선택됨',\n toolDefaults: '{tool} 기본값',\n defaults: '기본값',\n },\n // The flags section of the style panel: its title, and what each flag does.\n annotationFlags: {\n title: '플래그 (/F)',\n print: '페이지를 인쇄할 때 포함',\n hidden: '모든 곳에서 숨김: 화면, 클릭, 인쇄',\n noView: '화면에서는 숨김, 인쇄는 될 수 있음',\n toggleNoView: '선택한 동안 보기 안 함 주석 표시',\n readOnly: '표시되지만 클릭할 수 없음',\n locked: '이동/크기 조정/삭제/스타일 변경 불가',\n lockedContents: '텍스트는 변경 불가, 형태는 변경 가능',\n noZoom: '화면에서 크기 고정(왼쪽 위 기준)',\n noRotate: '페이지를 회전해도 똑바로 유지',\n invisible: '레거시: 알 수 없는 하위 유형 숨김',\n },\n // The link editor over a selected annotation.\n attachments: {\n loading: '첨부 파일 불러오는 중…',\n failed: '첨부 파일을 읽을 수 없습니다.',\n empty: '이 문서에는 첨부 파일이 없습니다',\n drop: '파일을 놓아 첨부하세요',\n dropHint: '또는 여기에 파일을 놓으세요',\n adding: '추가 중…',\n onPage: '{page}페이지',\n count: '파일 {count}개',\n countPlural: '파일 {count}개',\n },\n outline: {\n filter: '책갈피 필터',\n loading: '책갈피를 불러오는 중…',\n failed: '책갈피를 읽을 수 없습니다.',\n empty: '이 문서에는 책갈피가 없습니다',\n noMatches: '일치하는 책갈피가 없습니다',\n incomplete: '책갈피의 일부를 읽을 수 없습니다.',\n untitled: '제목 없음',\n properties: {\n title: '책갈피 속성',\n name: '제목',\n color: '색상',\n noColor: '없음',\n customColor: '사용자 지정 색상',\n bold: '굵게',\n italic: '기울임꼴',\n open: '문서를 열 때 펼침',\n target: '대상',\n targetNone: '없음',\n targetView: '현재 보기',\n targetNamed: '페이지 동작',\n targetKept: '그대로 유지',\n keptNote:\n '이 책갈피는 스크립트를 실행하거나 다른 파일을 엽니다. 여기에서 변경할 수 없습니다.',\n fit: '맞춤',\n fitKept: '현재 그대로',\n save: '저장',\n cancel: '취소',\n },\n },\n linkEditor: {\n toUrl: 'URL에 링크',\n url: 'URL',\n toPage: '페이지에 링크',\n page: '페이지',\n urlPlaceholder: 'https://…',\n pagePlaceholder: '페이지 번호',\n add: '링크 추가',\n update: '링크 업데이트',\n },\n demo: {\n starting: '뷰어 시작 중…',\n opening: '문서 여는 중…',\n more: '더 보기',\n searchPlaceholder: '문서 검색…',\n searchCaseSensitive: '대/소문자 구분',\n searchWholeWord: '전체 단어만',\n searchRegex: '정규식',\n searchSearching: '검색 중…',\n searchResults: '{count}개의 결과를 찾았습니다',\n searchNoResults: '결과 없음',\n searchPrevious: '이전 결과',\n searchNext: '다음 결과',\n searchPage: '{page}페이지',\n commentsForbidden: '이 문서의 댓글에 액세스할 수 없습니다.',\n commentsLoading: '댓글 로드 중…',\n commentsError: '댓글을 로드하지 못했습니다.',\n commentsRetry: '다시 시도',\n commentsEmpty: '아직 댓글이 없습니다. 댓글 도구를 사용하여 스레드를 시작하십시오.',\n commentsEmptyReadOnly: '이 문서에는 댓글이 없습니다.',\n commentsAnonymous: '알 수 없음',\n commentsPage: '{page}페이지',\n commentCount: '댓글 {count}개',\n commentCountPlural: '댓글 {count}개',\n commentsReply: '답글',\n commentsReplyPlaceholder: '답글…',\n commentsAddPlaceholder: '댓글 추가…',\n commentsDelete: '댓글 삭제',\n commentsDeleteThread: '스레드 삭제',\n commentsEdit: '댓글 편집',\n commentsStatus: '상태',\n commentsStatusNone: '상태 없음',\n commentsStatusAccepted: '수락됨',\n commentsStatusRejected: '거부됨',\n commentsStatusCancelled: '취소됨',\n commentsStatusCompleted: '완료됨',\n empty: '이 데모 패널에는 아직 아무것도 없습니다.',\n page: '{current} / {total}페이지',\n goToPage: '페이지로 이동',\n cancel: '취소',\n pageBadge: '{page}쪽',\n redactionEmpty:\n '대기 중인 교정이 없습니다. 교정 도구를 사용하여 텍스트나 영역을 표시하십시오.',\n redactionArea: '영역 표시',\n redactionText: '텍스트 표시',\n redactionRemove: '표시 제거',\n redactConfirmTitle: '교정을 적용하시겠습니까?',\n redactConfirmBody:\n '교정 표시 {count}개 아래의 콘텐츠를 영구적으로 제거합니다. 이 작업은 실행 취소할 수 없습니다.',\n redactConfirmCollateral: '다른 주석 {count}개도 제거됩니다.',\n redactApply: '적용',\n redactApplying: '적용 중…',\n formatLabel: '형식',\n fieldSettingsTitle: '필드',\n fieldOptionLabel: '레이블',\n fieldOptionValue: '값',\n fieldOptionAdd: '옵션 추가',\n fieldOptionRemove: '옵션 제거',\n fieldNone: '없음',\n redactLabelTitle: '교정 레이블',\n redactLabelPlaceholder: '예: 교정됨',\n redactLabelRepeat: '영역 전체에 레이블 반복',\n stampsAll: '모든 스탬프',\n stampsLoading: '스탬프 로드 중…',\n stampsEmpty: '아직 스탬프가 없습니다. PDF를 가져오면 각 페이지가 스탬프가 됩니다.',\n stampsRemoveStamp: '스탬프 제거',\n stampsArmedHint: '페이지를 클릭하여 스탬프를 배치합니다.',\n stampsImport: 'PDF 가져오기…',\n stampsImporting: '가져오는 중…',\n stampsImportHint: 'PDF를 스탬프 라이브러리로 가져옵니다. 각 페이지가 하나의 스탬프가 됩니다.',\n stampsRemoveLibrary: '라이브러리 제거',\n stampsExportLibrary: '라이브러리를 PDF로 내보내기',\n stampsCustomLibrary: '내 스탬프',\n stampsCustomLabel: '사용자 정의 스탬프',\n stampsError: '기본 제공 스탬프를 로드할 수 없습니다.',\n stampsArmError: '해당 스탬프를 선택할 수 없습니다.',\n stampsImportError: '해당 PDF를 스탬프 라이브러리로 가져올 수 없습니다.',\n quickStampsLabel: '빠른 스탬프',\n signaturesEmpty: '아직 서명이 없습니다. 서명에 사용할 서명을 만드십시오.',\n signaturesNew: '새 서명…',\n signaturesArmedHint:\n '서명 필드를 클릭하여 서명하거나, 페이지의 아무 곳이나 클릭하여 표시를 배치합니다.',\n signaturesTargetHint: '선택한 필드에 사용할 표시를 고르십시오.',\n signaturesInDocument: '이 문서',\n signaturesNone: '이 문서에는 서명 필드가 없습니다.',\n signaturesValidate: '유효성 검사',\n signaturesValidating: '유효성 검사 중…',\n signaturesSigned: '서명됨',\n signaturesUnsigned: '서명 안 됨',\n signaturesRename: '이름 바꾸기',\n signaturesRemove: '제거',\n signaturesExport: 'PDF로 내보내기',\n signaturesAddInitials: '이니셜 추가',\n signatureLabel: '서명',\n initialsLabel: '이니셜',\n makerTitle: '새 서명',\n makerName: '이름',\n makerNamePlaceholder: '이름',\n makerDraw: '그리기',\n makerType: '입력',\n makerUpload: '업로드',\n makerTypePlaceholder: '이름을 입력하십시오',\n makerFont: '글꼴',\n makerUploadHint: 'PNG, JPEG 또는 1페이지 PDF를 선택하십시오',\n makerClear: '지우기',\n makerOptional: '(선택 사항)',\n makerSave: '저장',\n makerSaving: '저장 중…',\n makerError: '서명을 저장할 수 없습니다.',\n signTitle: '이 필드에 서명',\n signReason: '이유',\n signLocation: '위치',\n signKind: '서명 후 허용할 변경',\n signKindApproval: '승인 서명 — 양식 작성 및 추가 서명 후에도 유효함',\n signKindCertifyAnnotate: '인증 — 주석, 양식 작성 및 서명 허용',\n signKindCertifyFill: '인증 — 양식 작성 및 서명만 허용',\n signKindCertifyLocked: '인증 — 변경 허용 안 함',\n signButton: '서명',\n signSigning: '서명 중…',\n signFill: '서명하지 않고 배치',\n signError: '필드에 서명할 수 없습니다.',\n inspectTitle: '서명',\n inspectSigner: '서명자',\n inspectReason: '이유',\n inspectLocation: '위치',\n inspectTime: '시간',\n inspectIntegrity: '문서',\n inspectCryptography: '서명',\n inspectTrust: '서명자',\n inspectChanges: '서명 후 변경',\n inspectDownload: '서명된 버전 다운로드',\n verdictValid: '유효함',\n verdictValidUntrusted: '유효함, 신뢰할 수 없는 서명자',\n verdictInvalid: '유효하지 않음 — 서명 후 수정됨',\n verdictWillInvalidate: '유효함, 저장하면 무효',\n signaturesInvalidating:\n '문서를 저장하면 이 변경으로 인해 {field} 필드의 서명이 무효화됩니다. 서명을 유지하려면 변경을 실행 취소하십시오.',\n verdictIndeterminate: '확인할 수 없음',\n verdictUnchanged: '없음',\n verdictRestored: '변경 후 복원됨',\n inspectLaterRevisions: '서명 이후 개정',\n verdictPermitted: '허용됨',\n verdictForbidden: '허용되지 않음',\n },\n },\n};\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_icons = require("./icons-
|
|
1
|
+
const require_icons = require("./icons-1UfLUZ_y.cjs");
|
|
2
2
|
let react = require("react");
|
|
3
3
|
let _embedpdf_react_runtime = require("@embedpdf/react/runtime");
|
|
4
4
|
let _embedpdf_react_annotation = require("@embedpdf/react/annotation");
|
|
@@ -122,4 +122,4 @@ function LinkEditorCard({ onClose }) {
|
|
|
122
122
|
//#endregion
|
|
123
123
|
exports.LinkEditorCard = LinkEditorCard;
|
|
124
124
|
|
|
125
|
-
//# sourceMappingURL=link-editor-
|
|
125
|
+
//# sourceMappingURL=link-editor-CAS7MZM2.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-editor-
|
|
1
|
+
{"version":3,"file":"link-editor-CAS7MZM2.cjs","names":["Icon"],"sources":["../src/ui/link-editor.tsx"],"sourcesContent":["/**\n * The link editor popover. It rides the same selection anchor as the action\n * strip (`<AnnotationMenu>` solves where), opening from the strip's link icon\n * (`annotation:link` toggles the `link-editor` shell surface) and rendering in\n * place of the strip while open — one anchored card at a time.\n *\n * Reads the selection's current target from selection props (the `linkOf`\n * lens — parents derive from their committed child annotations) and writes\n * through the one `selection.updateLink(target)` path; the plugin's reconciler\n * materializes/retargets the attached children. Links are a verb on the\n * selection, not a style — which is why this is a popover, not a sidebar\n * section.\n */\nimport { useState, type ReactNode } from 'react';\nimport { useAnnotation, useAnnotationProperties } from '@embedpdf/react/annotation';\nimport type { PdfLinkTarget } from '@embedpdf/react/link';\nimport { useKernel } from '@embedpdf/react/runtime';\nimport { useT } from '@embedpdf/react/i18n';\nimport { Icon } from './icons';\n\nfunction ModeToggle({\n active,\n title,\n onClick,\n children,\n}: {\n active: boolean;\n title: string;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n onClick={onClick}\n className={`rounded border px-2.5 py-1 text-xs font-medium transition-colors ${\n active\n ? 'border-accent bg-accent text-on-accent'\n : 'border-border bg-surface text-fg hover:bg-hover'\n }`}\n >\n {children}\n </button>\n );\n}\n\nexport function LinkEditorCard({ onClose }: { onClose: () => void }) {\n const t = useT();\n const kernel = useKernel();\n const anno = useAnnotation();\n const props = useAnnotationProperties();\n const value = (props.values.link ?? null) as PdfLinkTarget | null;\n const [mode, setMode] = useState<'uri' | 'page'>(value?.kind === 'goto' ? 'page' : 'uri');\n const [uri, setUri] = useState(value?.kind === 'uri' ? value.uri : '');\n const [pageNo, setPageNo] = useState('1');\n\n const apply = () => {\n if (mode === 'uri') {\n const trimmed = uri.trim();\n if (!trimmed) return;\n anno.selection.updateLink({ kind: 'uri', uri: trimmed });\n onClose();\n return;\n }\n // Page number (1-based) → the page's object number (stable across moves).\n const page = kernel.documents.getPage(Math.max(0, Number(pageNo) - 1));\n if (!page) return;\n anno.selection.updateLink({ kind: 'goto', destination: { kind: 'fit', page: page.ref } });\n onClose();\n };\n\n const inputCls =\n 'border-border bg-surface text-fg focus:border-accent w-full rounded border px-2.5 py-1.5 text-sm outline-none';\n return (\n <div className=\"border-border bg-surface w-64 rounded-lg border p-3 shadow-lg\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-fg text-sm font-semibold\">{t('commands.annotate.link')}</span>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t('panel.close')}\n title={t('panel.close')}\n className=\"text-fg-muted hover:bg-hover grid h-6 w-6 place-items-center rounded\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n <div className=\"mb-2 flex gap-1.5\">\n <ModeToggle\n title={t('linkEditor.toUrl')}\n active={mode === 'uri'}\n onClick={() => setMode('uri')}\n >\n {t('linkEditor.url')}\n </ModeToggle>\n <ModeToggle\n title={t('linkEditor.toPage')}\n active={mode === 'page'}\n onClick={() => setMode('page')}\n >\n {t('linkEditor.page')}\n </ModeToggle>\n </div>\n {mode === 'uri' ? (\n <input\n type=\"url\"\n className={inputCls}\n placeholder={t('linkEditor.urlPlaceholder')}\n autoFocus\n value={uri}\n onChange={(event) => setUri(event.target.value)}\n onKeyDown={(event) => event.key === 'Enter' && apply()}\n />\n ) : (\n <input\n type=\"number\"\n min={1}\n className={inputCls}\n placeholder={t('linkEditor.pagePlaceholder')}\n autoFocus\n value={pageNo}\n onChange={(event) => setPageNo(event.target.value)}\n onKeyDown={(event) => event.key === 'Enter' && apply()}\n />\n )}\n <button\n type=\"button\"\n className=\"bg-accent text-on-accent mt-2.5 w-full rounded px-2 py-1.5 text-sm font-medium\"\n onClick={apply}\n >\n {value == null ? t('linkEditor.add') : t('linkEditor.update')}\n </button>\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { n as Icon } from "./icons-
|
|
1
|
+
import { n as Icon } from "./icons-7dB0Y1ct.js";
|
|
2
2
|
import { useState } from "react";
|
|
3
3
|
import { useKernel } from "@embedpdf/react/runtime";
|
|
4
4
|
import { useAnnotation, useAnnotationProperties } from "@embedpdf/react/annotation";
|
|
@@ -122,4 +122,4 @@ function LinkEditorCard({ onClose }) {
|
|
|
122
122
|
//#endregion
|
|
123
123
|
export { LinkEditorCard };
|
|
124
124
|
|
|
125
|
-
//# sourceMappingURL=link-editor-
|
|
125
|
+
//# sourceMappingURL=link-editor-CkwtqRvb.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link-editor-
|
|
1
|
+
{"version":3,"file":"link-editor-CkwtqRvb.js","names":[],"sources":["../src/ui/link-editor.tsx"],"sourcesContent":["/**\n * The link editor popover. It rides the same selection anchor as the action\n * strip (`<AnnotationMenu>` solves where), opening from the strip's link icon\n * (`annotation:link` toggles the `link-editor` shell surface) and rendering in\n * place of the strip while open — one anchored card at a time.\n *\n * Reads the selection's current target from selection props (the `linkOf`\n * lens — parents derive from their committed child annotations) and writes\n * through the one `selection.updateLink(target)` path; the plugin's reconciler\n * materializes/retargets the attached children. Links are a verb on the\n * selection, not a style — which is why this is a popover, not a sidebar\n * section.\n */\nimport { useState, type ReactNode } from 'react';\nimport { useAnnotation, useAnnotationProperties } from '@embedpdf/react/annotation';\nimport type { PdfLinkTarget } from '@embedpdf/react/link';\nimport { useKernel } from '@embedpdf/react/runtime';\nimport { useT } from '@embedpdf/react/i18n';\nimport { Icon } from './icons';\n\nfunction ModeToggle({\n active,\n title,\n onClick,\n children,\n}: {\n active: boolean;\n title: string;\n onClick: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n onClick={onClick}\n className={`rounded border px-2.5 py-1 text-xs font-medium transition-colors ${\n active\n ? 'border-accent bg-accent text-on-accent'\n : 'border-border bg-surface text-fg hover:bg-hover'\n }`}\n >\n {children}\n </button>\n );\n}\n\nexport function LinkEditorCard({ onClose }: { onClose: () => void }) {\n const t = useT();\n const kernel = useKernel();\n const anno = useAnnotation();\n const props = useAnnotationProperties();\n const value = (props.values.link ?? null) as PdfLinkTarget | null;\n const [mode, setMode] = useState<'uri' | 'page'>(value?.kind === 'goto' ? 'page' : 'uri');\n const [uri, setUri] = useState(value?.kind === 'uri' ? value.uri : '');\n const [pageNo, setPageNo] = useState('1');\n\n const apply = () => {\n if (mode === 'uri') {\n const trimmed = uri.trim();\n if (!trimmed) return;\n anno.selection.updateLink({ kind: 'uri', uri: trimmed });\n onClose();\n return;\n }\n // Page number (1-based) → the page's object number (stable across moves).\n const page = kernel.documents.getPage(Math.max(0, Number(pageNo) - 1));\n if (!page) return;\n anno.selection.updateLink({ kind: 'goto', destination: { kind: 'fit', page: page.ref } });\n onClose();\n };\n\n const inputCls =\n 'border-border bg-surface text-fg focus:border-accent w-full rounded border px-2.5 py-1.5 text-sm outline-none';\n return (\n <div className=\"border-border bg-surface w-64 rounded-lg border p-3 shadow-lg\">\n <div className=\"mb-2 flex items-center justify-between\">\n <span className=\"text-fg text-sm font-semibold\">{t('commands.annotate.link')}</span>\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={t('panel.close')}\n title={t('panel.close')}\n className=\"text-fg-muted hover:bg-hover grid h-6 w-6 place-items-center rounded\"\n >\n <Icon name=\"x\" size={14} />\n </button>\n </div>\n <div className=\"mb-2 flex gap-1.5\">\n <ModeToggle\n title={t('linkEditor.toUrl')}\n active={mode === 'uri'}\n onClick={() => setMode('uri')}\n >\n {t('linkEditor.url')}\n </ModeToggle>\n <ModeToggle\n title={t('linkEditor.toPage')}\n active={mode === 'page'}\n onClick={() => setMode('page')}\n >\n {t('linkEditor.page')}\n </ModeToggle>\n </div>\n {mode === 'uri' ? (\n <input\n type=\"url\"\n className={inputCls}\n placeholder={t('linkEditor.urlPlaceholder')}\n autoFocus\n value={uri}\n onChange={(event) => setUri(event.target.value)}\n onKeyDown={(event) => event.key === 'Enter' && apply()}\n />\n ) : (\n <input\n type=\"number\"\n min={1}\n className={inputCls}\n placeholder={t('linkEditor.pagePlaceholder')}\n autoFocus\n value={pageNo}\n onChange={(event) => setPageNo(event.target.value)}\n onKeyDown={(event) => event.key === 'Enter' && apply()}\n />\n )}\n <button\n type=\"button\"\n className=\"bg-accent text-on-accent mt-2.5 w-full rounded px-2 py-1.5 text-sm font-medium\"\n onClick={apply}\n >\n {value == null ? t('linkEditor.add') : t('linkEditor.update')}\n </button>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAoBA,SAAS,WAAW,EAClB,QACA,OACA,SACA,YAMC;CACD,OACE,oBAAC,UAAD;EACE,MAAK;EACE;EACE;EACT,WAAW,oEACT,SACI,2CACA;EAGL;CACK,CAAA;AAEZ;AAEA,SAAgB,eAAe,EAAE,WAAoC;CACnE,MAAM,IAAI,KAAK;CACf,MAAM,SAAS,UAAU;CACzB,MAAM,OAAO,cAAc;CAE3B,MAAM,QADQ,wBACK,CAAC,CAAC,OAAO,QAAQ;CACpC,MAAM,CAAC,MAAM,WAAW,SAAyB,OAAO,SAAS,SAAS,SAAS,KAAK;CACxF,MAAM,CAAC,KAAK,UAAU,SAAS,OAAO,SAAS,QAAQ,MAAM,MAAM,EAAE;CACrE,MAAM,CAAC,QAAQ,aAAa,SAAS,GAAG;CAExC,MAAM,cAAc;EAClB,IAAI,SAAS,OAAO;GAClB,MAAM,UAAU,IAAI,KAAK;GACzB,IAAI,CAAC,SAAS;GACd,KAAK,UAAU,WAAW;IAAE,MAAM;IAAO,KAAK;GAAQ,CAAC;GACvD,QAAQ;GACR;EACF;EAEA,MAAM,OAAO,OAAO,UAAU,QAAQ,KAAK,IAAI,GAAG,OAAO,MAAM,IAAI,CAAC,CAAC;EACrE,IAAI,CAAC,MAAM;EACX,KAAK,UAAU,WAAW;GAAE,MAAM;GAAQ,aAAa;IAAE,MAAM;IAAO,MAAM,KAAK;GAAI;EAAE,CAAC;EACxF,QAAQ;CACV;CAEA,MAAM,WACJ;CACF,OACE,qBAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,QAAD;KAAM,WAAU;KAAiC,UAAA,EAAE,wBAAwB;IAAQ,CAAA,GACnF,oBAAC,UAAD;KACE,MAAK;KACL,SAAS;KACT,cAAY,EAAE,aAAa;KAC3B,OAAO,EAAE,aAAa;KACtB,WAAU;KAEV,UAAA,oBAAC,MAAD;MAAM,MAAK;MAAI,MAAM;KAAK,CAAA;IACpB,CAAA,CACL;;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,YAAD;KACE,OAAO,EAAE,kBAAkB;KAC3B,QAAQ,SAAS;KACjB,eAAe,QAAQ,KAAK;KAE3B,UAAA,EAAE,gBAAgB;IACT,CAAA,GACZ,oBAAC,YAAD;KACE,OAAO,EAAE,mBAAmB;KAC5B,QAAQ,SAAS;KACjB,eAAe,QAAQ,MAAM;KAE5B,UAAA,EAAE,iBAAiB;IACV,CAAA,CACT;;GACJ,SAAS,QACR,oBAAC,SAAD;IACE,MAAK;IACL,WAAW;IACX,aAAa,EAAE,2BAA2B;IAC1C,WAAA;IACA,OAAO;IACP,WAAW,UAAU,OAAO,MAAM,OAAO,KAAK;IAC9C,YAAY,UAAU,MAAM,QAAQ,WAAW,MAAM;GACtD,CAAA,IAED,oBAAC,SAAD;IACE,MAAK;IACL,KAAK;IACL,WAAW;IACX,aAAa,EAAE,4BAA4B;IAC3C,WAAA;IACA,OAAO;IACP,WAAW,UAAU,UAAU,MAAM,OAAO,KAAK;IACjD,YAAY,UAAU,MAAM,QAAQ,WAAW,MAAM;GACtD,CAAA;GAEH,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,SAAS;IAER,UAAA,SAAS,OAAO,EAAE,gBAAgB,IAAI,EAAE,mBAAmB;GACtD,CAAA;EACL;;AAET"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as Dialog } from "./dialog-
|
|
1
|
+
import { t as Dialog } from "./dialog-BIb373cg.js";
|
|
2
2
|
import { useEffect, useRef, useState } from "react";
|
|
3
3
|
import { useCapability, useSelector } from "@embedpdf/react/runtime";
|
|
4
4
|
import { StageToken } from "@embedpdf/react/stage";
|
|
@@ -322,4 +322,4 @@ function CalibrationDialog() {
|
|
|
322
322
|
//#endregion
|
|
323
323
|
export { CalibrationDialog, MeasurementSection };
|
|
324
324
|
|
|
325
|
-
//# sourceMappingURL=measurement-
|
|
325
|
+
//# sourceMappingURL=measurement-CQdbnIrn.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measurement-Bs61XWbJ.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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"}
|
|
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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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_dialog = require("./dialog-
|
|
1
|
+
const require_dialog = require("./dialog-CngKTnAM.cjs");
|
|
2
2
|
let react = require("react");
|
|
3
3
|
let _embedpdf_react_runtime = require("@embedpdf/react/runtime");
|
|
4
4
|
let _embedpdf_react_stage = require("@embedpdf/react/stage");
|
|
@@ -323,4 +323,4 @@ function CalibrationDialog() {
|
|
|
323
323
|
exports.CalibrationDialog = CalibrationDialog;
|
|
324
324
|
exports.MeasurementSection = MeasurementSection;
|
|
325
325
|
|
|
326
|
-
//# sourceMappingURL=measurement-
|
|
326
|
+
//# sourceMappingURL=measurement-Cxv1Ahxx.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"measurement-CcCsHPOX.cjs","names":["StageToken","MeasurementToken","AnnotationToken","Dialog"],"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":";;;;;;;;;AAiBA,MAAM,UACJ;AAEF,MAAM,SACJ;;AAGF,MAAM,wBAAA,GAAA,wBAAA,YAAA,CAAmCA,sBAAAA,aAAa,UAAU,MAAM,eAAe,CAAC;AAEtF,SAAgB,qBAAqB;CACnC,MAAM,KAAA,GAAA,qBAAA,KAAA,CAAS;CAEf,MAAM,OAAO,eAAe;CAE5B,MAAM,eAAA,GAAA,4BAAA,eAAA,CAA6B;CACnC,MAAM,QAAA,GAAA,4BAAA,oBAAA,EAA4B,UAAU,MAAM,IAAI;CACtD,MAAM,gBAAA,GAAA,wBAAA,YAAA,CAA2BC,4BAAAA,mBAAmB,YAAY,QAAQ,aAAa,CAAC;CAEtF,MAAM,SAAA,GAAA,4BAAA,aAAA,CAAqB,IAAI;CAC/B,MAAM,QAAA,GAAA,wBAAA,cAAA,CAAqBC,2BAAAA,eAAe;CAC1C,MAAM,YAAA,GAAA,2BAAA,mBAAA,EAA+B,UAAU,MAAM,QAAQ;CAC7D,MAAM,cAAA,GAAA,wBAAA,YAAA,CACJA,2BAAAA,kBACC,eACC,WAAW,UACR,KAAK,CAAC,CACN,QACE,eACE,UAAU,YAAY,aAAa,UAAU,YAAY,eAC1D,UAAU,iBACV,WAAW,UAAU,UAAU,GAAG,KAClC,CAAC,UAAU,cACf,IACH,MAAM,UACL,KAAK,WAAW,MAAM,UAAU,KAAK,OAAO,YAAY,MAAM,eAAe,MAAM,EAAE,CACzF;CACA,MAAM,YAAA,GAAA,wBAAA,YAAA,CACJD,4BAAAA,mBACC,gBACC,KAAK,UACF,KAAK,CAAC,CACN,KAAK,eAAe,YAAY,WAAW,WAAW,GAAG,CAAC,CAAC,CAC3D,QAAQ,YAA2C,EAAE,iBAAiB,QAAQ,IAClF,MAAM,UAAU,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK,CAChE;CACA,MAAM,WAAA,GAAA,4BAAA,oBAAA,EAA+B,UAAU,MAAM,WAAW;CAChE,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAwB,KAAK;CAE9C,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA2B,IAAI;CACnD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAoC,IAAI;CACtD,MAAM,WAAW,CAAC,QAAQ,QAAQ,CAAC,gBAAgB,CAAC,OAAO;CAC3D,MAAM,cAAc,OAAO,SAAS,YAAY,gBAAgB,MAAM,UAAU;CAChF,MAAM,SAAS,WAAW,QAAQ;CAClC,MAAM,UAAU,EAAE,YAAY;CAC9B,MAAM,MAAM,OAAO,SAAiC;EAClD,SAAS,IAAI;EACb,IAAI;GACF,MAAM,KAAK;EACb,SAAS,OAAO;GACd,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;EACjE;CACF;CACA,MAAM,YAAY,aAAa,SAAS,YAAY,SAAS,SAAS,EAAE,EAAE,aAAa;CACvF,OACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;EAAK,WAAU;EAAf,UAAA;GACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAU;IAAiB,UAAA,EAAE,0BAA0B;GAAK,CAAA;GAC/D,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD,EAAA,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;IAAM,WAAU;IAAhB,UAAA,CAAiC,EAAE,mBAAmB,GAAE,IAAQ;GAChE,CAAA,GAAA,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAAS,aAAa,SAAS,EAAE,yBAAyB,EAAU,CAAA,CACjE,EAAA,CAAA;GACJ,OAAO,SACN,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;IACvB,UAAA,MAAM,MAAM;GACZ,CAAA;GAEJ,SAAS,CAAC,MAAM,cAAc,MAAM,SACnC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,WAAU;IAAiB,UAAA,EAAE,yBAAyB;GAAK,CAAA;GAEhE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KACE,MAAK;KACL,SAAS;KACT,UAAU;KACV,WAAW,UAAU,YAAY,MAAM,OAAO,OAAO;IACtD,CAAA,GACA,EAAE,sBAAsB,CACpB;;GACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;IAAO,WAAU;IAAjB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KACE,MAAK;KACL,SAAS;KACT,UAAU;KACV,WAAW,UAAU,eAAe,MAAM,OAAO,OAAO;IACzD,CAAA,GACA,EAAE,yBAAyB,CACvB;;GACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACG,EAAE,oBAAoB,GACvB,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IACE,cAAY,EAAE,oBAAoB;IAClC,WAAW;IACX,OAAM;IACI;IACV,WAAW,UACT,KAAK,UAAU,YAAY,UAAU,QAAQ,MAAM,OAAO,OAAO,OAAO,CAAC;IAN7E,UAAA,CASE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,OAAM;KAAG,UAAA;KACd,UAAA,EAAE,0BAA0B;IACvB,CAAA,GACP,YAAY,YAAY,CAAC,CAAC,KAAK,WAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAwB,OAAO,OAAO;KACnC,UAAA,OAAO;IACF,GAFK,OAAO,EAEZ,CACT,CACK;GACH,CAAA,CAAA,EAAA,CAAA;GACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACG,EAAE,kBAAkB,GACrB,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IACE,cAAY,EAAE,kBAAkB;IAChC,WAAW;IACX,OAAO,aAAa,SAAS,EAAE,EAAE,KAAK,KAAK,KAAK;IAChD,UAAU,YAAY,CAAC;IACvB,WAAW,UACT,KAAK,UAAU,YAAY,QAAQ,QAAQ,MAAM,OAAO,OAAqB,OAAO,CAAC;IANzF,UAAA,CASG,CAAC,YACC,UAAU,CAAC,CACX,SAAS,aAAa,SAAS,EAAE,EAAE,KAAK,KAAK,CAAe,KAC7D,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,OAAO,aAAa,SAAS,EAAE,EAAE,KAAK,KAAK,KAAK;KACrD,UAAA,EAAE,oBAAoB;IACjB,CAAA,GAET,YAAY,UAAU,CAAC,CAAC,KAAK,SAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAmB,OAAO;KACvB,UAAA;IACK,GAFK,IAEL,CACT,CACK;GACH,CAAA,CAAA,EAAA,CAAA;GACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACG,EAAE,sBAAsB,GACzB,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IACE,cAAY,EAAE,sBAAsB;IACpC,WAAW;IACX,OAAO,aAAa,KAAK,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,QAAQ,KAAK,GAAG,KAAK;IAC9D,UAAU,YAAY,CAAC;IACvB,WAAW,UACT,KAAK,UAAU,YAAY,YAAY,QAAQ,MAAM,OAAO,OAAmB,OAAO,CAAC;IAN3F,UAAA,CASG,CAAC,YACC,cAAc,CAAC,CACf,SAAS,aAAa,KAAK,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAa,KACzE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,OAAO,aAAa,KAAK,EAAE,EAAE,KAAK,KAAK,CAAC,CAAC,QAAQ,KAAK,GAAG,KAAK;KACnE,UAAA,EAAE,oBAAoB;IACjB,CAAA,GAET,YAAY,cAAc,CAAC,CAAC,KAAK,SAChC,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAmB,OAAO;KACvB,UAAA,KAAK,QAAQ,KAAK,GAAG;IAChB,GAFK,IAEL,CACT,CACK;GACH,CAAA,CAAA,EAAA,CAAA;GACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACG,EAAE,uBAAuB,GAC1B,iBAAA,GAAA,kBAAA,KAAA,CAAC,UAAD;IACE,cAAY,EAAE,uBAAuB;IACrC,WAAW;IACX,OAAO;IACP,UAAU,YAAY,CAAC;IACvB,WAAW,UACT,KAAK,UAAU,YAAY,aAAa,QAAQ,OAAO,MAAM,OAAO,KAAK,GAAG,OAAO,CAAC;IANxF,UAAA,CASG,CAAC;KAAC;KAAG;KAAI;KAAK;KAAM;IAAK,CAAC,CAAC,SAAS,SAAS,KAC5C,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAQ,OAAO;KAAY,UAAA,EAAE,oBAAoB;IAAU,CAAA,GAE5D;KAAC;KAAG;KAAI;KAAK;KAAM;IAAK,CAAC,CAAC,KAAK,cAC9B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KAAwB,OAAO;KAC5B,UAAA,IAAI;IACC,GAFK,SAEL,CACT,CACK;GACH,CAAA,CAAA,EAAA,CAAA;GACP,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;IAAQ,WAAW;IAAkB;IAAU,eAAe,YAAY,iBAAiB;IACxF,UAAA,EAAE,uBAAuB;GACpB,CAAA;GACP,SAAS,SAAS,KACjB,iBAAA,GAAA,kBAAA,KAAA,CAAC,WAAD;IAAS,WAAU;IAAnB,UAAA;KACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;MAAI,WAAU;MAAoB,UAAA,EAAE,uBAAuB;KAAM,CAAA;KAChE,SAAS,SACR,SAAS,KAAK,SAAS,MACrB,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;MAAa,WAAU;MAAvB,UAAA,CACE,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;OACG,EAAE,eAAe,QAAQ,MAAM;OAAE;OAAG,QAAQ;MAC5C,EAAA,CAAA,GACF,QAAQ,aACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,KAAD,EAAA,UAAA;OACG,EAAE,uBAAuB;OAAE;OAAG,QAAQ;MACtC,EAAA,CAAA,CAEF;KATK,GAAA,CASL,CACN,IAED,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;MAAG,WAAU;MAAiB,UAAA,EAAE,yBAAyB;KAAK,CAAA;KAE/D,WAAW,SAAS,KACnB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MACE,WAAW;MACX,UAAU;MACV,eACE,KAAK,IAAI,YAAY;OACnB,KAAK,MAAM,cAAc,YACvB,IAAI,WAAW,YAAY,aAAa,WAAW,YAAY,YAC7D,MAAM,KAAK,OAAO,WAAW,KAAK;QAChC,SAAS,WAAW;QACpB,eAAe;OACjB,CAAC;MAGP,CAAC;MAGF,UAAA,EAAE,wBAAwB;KACrB,CAAA;IAEH;;GAEV,QAAQ,SAAS,KAChB,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IACL,UAAA,EAAE,sBAAsB,EACvB,QAAQ;KACN,SAAS,QAAQ,QAAQ,OAAO,WAAW,QAAQ,OAAO,QAAQ,QAAQ,CAAC;KAC3E,SAAS,QAAQ,QAAQ,OAAO,WAAW,QAAQ,OAAO,QAAQ,QAAQ,CAAC;KAC3E,QAAQ,QAAQ,QACb,OAAO,WACN,QAAQ,OAAO,OAAO,UAAU,OAAO,cAAc,OAAO,QAAQ,IAAI,IAC1E,CACF;IACF,EACF,CAAC;GACA,CAAA;GAEJ,SACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;IAAG,MAAK;IAAQ,WAAU;IACvB,UAAA;GACA,CAAA;EAEF;;AAET;AAEA,SAAgB,oBAAoB;CAClC,MAAM,KAAA,GAAA,qBAAA,KAAA,CAAS;CAEf,MAAM,eAAA,GAAA,4BAAA,eAAA,CAA6B;CACnC,MAAM,EAAE,MAAM,oBAAoB,aAAA,GAAA,4BAAA,oBAAA,CAAgC;CAClE,MAAM,gBAAA,GAAA,wBAAA,YAAA,CAA2BA,4BAAAA,mBAAmB,YAAY,QAAQ,aAAa,CAAC;CACtF,MAAM,SAAA,GAAA,MAAA,OAAA,CAAiC,IAAI;CAC3C,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAqB,EAAE;CAErC,MAAM,CAAC,MAAM,YAAA,GAAA,MAAA,SAAA,CAAgC,GAAG;CAChD,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,SAAA,CAAwB,KAAK;CAE9C,MAAM,CAAC,aAAa,mBAAA,GAAA,MAAA,SAAA,CAA2B,IAAI;CACnD,MAAM,CAAC,OAAO,aAAA,GAAA,MAAA,SAAA,CAAoC,IAAI;CACtD,CAAA,GAAA,MAAA,UAAA,OAAgB;EACd,SAAS,EAAE;EACX,SAAS,IAAI;EACb,MAAM,SAAS,MAAM;CACvB,GAAG,CAAC,OAAO,CAAC;CACZ,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,SAAS,YAAY;EACzB,SAAS,IAAI;EACb,IAAI;GACF,MAAM,YAAY,UAChB;IACE,MAAM,QAAQ;IACd,MAAM,QAAQ;IACd,IAAI,QAAQ;IACZ,UAAU;KAAE,OAAO,OAAO,KAAK;KAAG;IAAK;GACzC,GACA;IAAE;IAAa,SAAS,WAAW,QAAQ,KAAA;GAAU,CACvD;GACA,YAAY,mBAAmB;EACjC,SAAS,OAAO;GACd,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;EACjE;CACF;CACA,OACE,iBAAA,GAAA,kBAAA,IAAA,CAACE,eAAAA,QAAD;EACE,YAAW;EACX,eAAe;GACb,IAAI,CAAC,MAAM,YAAY,mBAAmB;EAC5C;EACA,WAAU;EAEV,UAAA,iBAAA,GAAA,kBAAA,KAAA,CAAC,QAAD;GACE,WAAU;GACV,WAAW,UAAU;IACnB,MAAM,eAAe;IACrB,OAAY;GACd;GALF,UAAA;IAOE,iBAAA,GAAA,kBAAA,IAAA,CAAC,MAAD;KAAI,IAAG;KAAgC,WAAU;KAC9C,UAAA,EAAE,uBAAuB;IACxB,CAAA;IACJ,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,WAAU;KAAyB,UAAA,EAAE,yBAAyB;IAAK,CAAA;IACtE,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACG,EAAE,oBAAoB,GACvB,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;KACE,KAAK;KACL,cAAY,EAAE,oBAAoB;KAClC,WAAW;KACX,MAAK;KACL,KAAI;KACJ,MAAK;KACE;KACP,WAAW,UAAU,SAAS,MAAM,OAAO,KAAK;IACjD,CAAA,CACI,EAAA,CAAA;IACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD,EAAA,UAAA,CACG,EAAE,kBAAkB,GACrB,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;KACE,WAAW;KACX,cAAY,EAAE,kBAAkB;KAChC,OAAO;KACP,WAAW,UAAU,QAAQ,MAAM,OAAO,KAAmB;KAE5D,UAAA,YAAY,UAAU,CAAC,CAAC,KAAK,eAC5B,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD,EAAA,UAA0B,WAAmB,GAAhC,UAAgC,CAC9C;IACK,CAAA,CACH,EAAA,CAAA;IACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;KAAO,WAAU;KAAjB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MACE,MAAK;MACL,SAAS;MACT,WAAW,UAAU,YAAY,MAAM,OAAO,OAAO;KACtD,CAAA,GACA,EAAE,sBAAsB,CACpB;;IACP,iBAAA,GAAA,kBAAA,KAAA,CAAC,SAAD;KAAO,WAAU;KAAjB,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,SAAD;MACE,MAAK;MACL,SAAS;MACT,WAAW,UAAU,eAAe,MAAM,OAAO,OAAO;KACzD,CAAA,GACA,EAAE,yBAAyB,CACvB;;IACN,SACC,iBAAA,GAAA,kBAAA,IAAA,CAAC,KAAD;KAAG,MAAK;KAAQ,WAAU;KACvB,UAAA;IACA,CAAA;IAEL,iBAAA,GAAA,kBAAA,KAAA,CAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MACE,MAAK;MACL,WAAW;MACX,UAAU;MACV,eAAe,YAAY,mBAAmB;MAE7C,UAAA,EAAE,aAAa;KACV,CAAA,GACR,iBAAA,GAAA,kBAAA,IAAA,CAAC,UAAD;MACE,WAAW;MACX,MAAK;MACL,UACE,QAAQ,CAAC,gBAAgB,EAAE,OAAO,KAAK,IAAI,MAAM,CAAC,OAAO,SAAS,OAAO,KAAK,CAAC;MAGhF,UAAA,OAAO,EAAE,sBAAsB,IAAI,EAAE,mBAAmB;KACnD,CAAA,CACL;;GACD;;CACA,CAAA;AAEZ"}
|
|
1
|
+
{"version":3,"file":"measurement-Cxv1Ahxx.cjs","names":["StageToken","MeasurementToken","AnnotationToken","Dialog"],"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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"}
|