@embedpdf/viewer-chrome 3.0.0-next.13 → 3.0.0-next.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (157) hide show
  1. package/README.md +175 -132
  2. package/dist/annotation-fonts-BqoLZ4Mp.js +80 -0
  3. package/dist/annotation-fonts-BqoLZ4Mp.js.map +1 -0
  4. package/dist/annotation-fonts-Dt0IQXhz.cjs +91 -0
  5. package/dist/annotation-fonts-Dt0IQXhz.cjs.map +1 -0
  6. package/dist/annotation-style--rPIZsuP.js +879 -0
  7. package/dist/annotation-style--rPIZsuP.js.map +1 -0
  8. package/dist/annotation-style-Bzvvp8-N.cjs +879 -0
  9. package/dist/annotation-style-Bzvvp8-N.cjs.map +1 -0
  10. package/dist/ar-D9XKAmDx.js +567 -0
  11. package/dist/ar-D9XKAmDx.js.map +1 -0
  12. package/dist/ar-DnEj5vbP.cjs +567 -0
  13. package/dist/ar-DnEj5vbP.cjs.map +1 -0
  14. package/dist/chrome.cjs +378 -221
  15. package/dist/chrome.cjs.map +1 -1
  16. package/dist/chrome.d.cts +5 -34
  17. package/dist/chrome.d.ts +5 -34
  18. package/dist/chrome.js +377 -218
  19. package/dist/chrome.js.map +1 -1
  20. package/dist/commands-BmgxhJ8B.js +953 -0
  21. package/dist/commands-BmgxhJ8B.js.map +1 -0
  22. package/dist/commands-CYt4SFUX.cjs +1060 -0
  23. package/dist/commands-CYt4SFUX.cjs.map +1 -0
  24. package/dist/commands.cjs +12 -595
  25. package/dist/commands.d.cts +29 -4
  26. package/dist/commands.d.ts +29 -4
  27. package/dist/commands.js +2 -593
  28. package/dist/comments-panel-MUVgLCBI.js +514 -0
  29. package/dist/comments-panel-MUVgLCBI.js.map +1 -0
  30. package/dist/comments-panel-pEcQg4Vs.cjs +514 -0
  31. package/dist/comments-panel-pEcQg4Vs.cjs.map +1 -0
  32. package/dist/de-Bdr4aWzm.js +566 -0
  33. package/dist/de-Bdr4aWzm.js.map +1 -0
  34. package/dist/de-Dv6zvbnd.cjs +566 -0
  35. package/dist/de-Dv6zvbnd.cjs.map +1 -0
  36. package/dist/dialog-B5GBisKv.js +55 -0
  37. package/dist/dialog-B5GBisKv.js.map +1 -0
  38. package/dist/dialog-t8F13BL_.cjs +60 -0
  39. package/dist/dialog-t8F13BL_.cjs.map +1 -0
  40. package/dist/es-BP09DR9w.cjs +566 -0
  41. package/dist/es-BP09DR9w.cjs.map +1 -0
  42. package/dist/es-BSXz5tBv.js +566 -0
  43. package/dist/es-BSXz5tBv.js.map +1 -0
  44. package/dist/form-design-panel-B5MXTZ96.cjs +418 -0
  45. package/dist/form-design-panel-B5MXTZ96.cjs.map +1 -0
  46. package/dist/form-design-panel-vWWU9uB-.js +418 -0
  47. package/dist/form-design-panel-vWWU9uB-.js.map +1 -0
  48. package/dist/fr-BBQQn7tJ.cjs +566 -0
  49. package/dist/fr-BBQQn7tJ.cjs.map +1 -0
  50. package/dist/fr-Ckn3K9v1.js +566 -0
  51. package/dist/fr-Ckn3K9v1.js.map +1 -0
  52. package/dist/he-DRsG7bH7.cjs +567 -0
  53. package/dist/he-DRsG7bH7.cjs.map +1 -0
  54. package/dist/he-wdGU5PkU.js +567 -0
  55. package/dist/he-wdGU5PkU.js.map +1 -0
  56. package/dist/icons-BrK5iVL8.js +856 -0
  57. package/dist/icons-BrK5iVL8.js.map +1 -0
  58. package/dist/icons-x0Tc05bs.cjs +1010 -0
  59. package/dist/icons-x0Tc05bs.cjs.map +1 -0
  60. package/dist/index.cjs +3162 -5106
  61. package/dist/index.cjs.map +1 -1
  62. package/dist/index.d.cts +636 -143
  63. package/dist/index.d.ts +636 -143
  64. package/dist/index.js +3083 -4975
  65. package/dist/index.js.map +1 -1
  66. package/dist/it-BuP4o0xQ.cjs +566 -0
  67. package/dist/it-BuP4o0xQ.cjs.map +1 -0
  68. package/dist/it-Us-VmvIu.js +566 -0
  69. package/dist/it-Us-VmvIu.js.map +1 -0
  70. package/dist/ja-Cizj0-5O.js +566 -0
  71. package/dist/ja-Cizj0-5O.js.map +1 -0
  72. package/dist/ja-DovEd6ts.cjs +566 -0
  73. package/dist/ja-DovEd6ts.cjs.map +1 -0
  74. package/dist/ko-B-qJEol2.cjs +566 -0
  75. package/dist/ko-B-qJEol2.cjs.map +1 -0
  76. package/dist/ko-DlrXliE1.js +566 -0
  77. package/dist/ko-DlrXliE1.js.map +1 -0
  78. package/dist/labels-BiM9wp9K.cjs +21 -0
  79. package/dist/labels-BiM9wp9K.cjs.map +1 -0
  80. package/dist/labels-C6_i87Oj.js +16 -0
  81. package/dist/labels-C6_i87Oj.js.map +1 -0
  82. package/dist/link-editor-CSjqPnj1.cjs +125 -0
  83. package/dist/link-editor-CSjqPnj1.cjs.map +1 -0
  84. package/dist/link-editor-SxM1nnJU.js +125 -0
  85. package/dist/link-editor-SxM1nnJU.js.map +1 -0
  86. package/dist/measurement-Bs61XWbJ.js +325 -0
  87. package/dist/measurement-Bs61XWbJ.js.map +1 -0
  88. package/dist/measurement-CcCsHPOX.cjs +326 -0
  89. package/dist/measurement-CcCsHPOX.cjs.map +1 -0
  90. package/dist/nl-0aF7M_0h.js +566 -0
  91. package/dist/nl-0aF7M_0h.js.map +1 -0
  92. package/dist/nl-D3KZDDiJ.cjs +566 -0
  93. package/dist/nl-D3KZDDiJ.cjs.map +1 -0
  94. package/dist/pl-BW--AaCI.js +566 -0
  95. package/dist/pl-BW--AaCI.js.map +1 -0
  96. package/dist/pl-DSFhAUqx.cjs +566 -0
  97. package/dist/pl-DSFhAUqx.cjs.map +1 -0
  98. package/dist/pt-C5S-8MC5.cjs +566 -0
  99. package/dist/pt-C5S-8MC5.cjs.map +1 -0
  100. package/dist/pt-DIhpU5pT.js +566 -0
  101. package/dist/pt-DIhpU5pT.js.map +1 -0
  102. package/dist/redact-confirm-B6j36TPw.js +83 -0
  103. package/dist/redact-confirm-B6j36TPw.js.map +1 -0
  104. package/dist/redact-confirm-CX_SY2ZN.cjs +83 -0
  105. package/dist/redact-confirm-CX_SY2ZN.cjs.map +1 -0
  106. package/dist/redaction-panel-BmoIl-Ll.cjs +96 -0
  107. package/dist/redaction-panel-BmoIl-Ll.cjs.map +1 -0
  108. package/dist/redaction-panel-IJDshSJI.js +96 -0
  109. package/dist/redaction-panel-IJDshSJI.js.map +1 -0
  110. package/dist/search-panel-HfIhJm1M.js +249 -0
  111. package/dist/search-panel-HfIhJm1M.js.map +1 -0
  112. package/dist/search-panel-s9IoiOtv.cjs +249 -0
  113. package/dist/search-panel-s9IoiOtv.cjs.map +1 -0
  114. package/dist/sheet-BDsa_Sup.cjs +442 -0
  115. package/dist/sheet-BDsa_Sup.cjs.map +1 -0
  116. package/dist/sheet-R6XDgyEf.js +365 -0
  117. package/dist/sheet-R6XDgyEf.js.map +1 -0
  118. package/dist/sign-dialog-CgnR7akj.cjs +155 -0
  119. package/dist/sign-dialog-CgnR7akj.cjs.map +1 -0
  120. package/dist/sign-dialog-GDqCoQhA.js +155 -0
  121. package/dist/sign-dialog-GDqCoQhA.js.map +1 -0
  122. package/dist/signature-inspector-DyO313Qf.cjs +166 -0
  123. package/dist/signature-inspector-DyO313Qf.cjs.map +1 -0
  124. package/dist/signature-inspector-okFz8do6.js +166 -0
  125. package/dist/signature-inspector-okFz8do6.js.map +1 -0
  126. package/dist/signature-maker-BhCmYyHD.js +393 -0
  127. package/dist/signature-maker-BhCmYyHD.js.map +1 -0
  128. package/dist/signature-maker-BoYa8vgA.cjs +393 -0
  129. package/dist/signature-maker-BoYa8vgA.cjs.map +1 -0
  130. package/dist/signatures-panel-B56PC6d9.cjs +300 -0
  131. package/dist/signatures-panel-B56PC6d9.cjs.map +1 -0
  132. package/dist/signatures-panel-CgnFfhFm.js +300 -0
  133. package/dist/signatures-panel-CgnFfhFm.js.map +1 -0
  134. package/dist/stamp-store-BHvRs-Do.cjs +147 -0
  135. package/dist/stamp-store-BHvRs-Do.cjs.map +1 -0
  136. package/dist/stamp-store-WuF-L3Jj.js +112 -0
  137. package/dist/stamp-store-WuF-L3Jj.js.map +1 -0
  138. package/dist/stamps-panel-B9NYGayn.cjs +231 -0
  139. package/dist/stamps-panel-B9NYGayn.cjs.map +1 -0
  140. package/dist/stamps-panel-CDO0FPyK.js +231 -0
  141. package/dist/stamps-panel-CDO0FPyK.js.map +1 -0
  142. package/dist/toolbar-CJu2wKTU.cjs +1659 -0
  143. package/dist/toolbar-CJu2wKTU.cjs.map +1 -0
  144. package/dist/toolbar-z9od3tKl.js +1564 -0
  145. package/dist/toolbar-z9od3tKl.js.map +1 -0
  146. package/dist/zh-cn-3tmMeHqv.cjs +566 -0
  147. package/dist/zh-cn-3tmMeHqv.cjs.map +1 -0
  148. package/dist/zh-cn-CxkUUBct.js +566 -0
  149. package/dist/zh-cn-CxkUUBct.js.map +1 -0
  150. package/package.json +6 -4
  151. package/src/styles.css +153 -89
  152. package/dist/commands.cjs.map +0 -1
  153. package/dist/commands.js.map +0 -1
  154. package/dist/es-DYwzfxyt.cjs +0 -293
  155. package/dist/es-DYwzfxyt.cjs.map +0 -1
  156. package/dist/es-sN6uqBgD.js +0 -293
  157. package/dist/es-sN6uqBgD.js.map +0 -1
@@ -0,0 +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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"}
@@ -0,0 +1,326 @@
1
+ const require_dialog = require("./dialog-t8F13BL_.cjs");
2
+ let react = require("react");
3
+ let _embedpdf_react_runtime = require("@embedpdf/react/runtime");
4
+ let _embedpdf_react_stage = require("@embedpdf/react/stage");
5
+ let _embedpdf_react_annotation = require("@embedpdf/react/annotation");
6
+ let _embedpdf_react_measurement = require("@embedpdf/react/measurement");
7
+ let _embedpdf_react_i18n = require("@embedpdf/react/i18n");
8
+ let react_jsx_runtime = require("react/jsx-runtime");
9
+ //#region src/ui/measurement.tsx
10
+ const control = "border-border bg-surface text-fg w-full rounded-md border px-2 py-1.5 text-sm disabled:opacity-50";
11
+ const button = "border-border text-fg hover:bg-hover rounded-md border px-3 py-1.5 text-sm disabled:opacity-50";
12
+ /** The current page's address, or null with no page (empty document). */
13
+ const useCurrentPage = () => (0, _embedpdf_react_runtime.useSelector)(_embedpdf_react_stage.StageToken, (stage) => stage.getCurrentPage());
14
+ function MeasurementSection() {
15
+ const t = (0, _embedpdf_react_i18n.useT)();
16
+ const page = useCurrentPage();
17
+ const measurement = (0, _embedpdf_react_measurement.useMeasurement)();
18
+ const busy = (0, _embedpdf_react_measurement.useMeasurementState)((state) => state.busy);
19
+ const canCalibrate = (0, _embedpdf_react_runtime.useSelector)(_embedpdf_react_measurement.MeasurementToken, (current) => current.canCalibrate());
20
+ const scale = (0, _embedpdf_react_measurement.usePageScale)(page);
21
+ const anno = (0, _embedpdf_react_runtime.useCapability)(_embedpdf_react_annotation.AnnotationToken);
22
+ const selected = (0, _embedpdf_react_annotation.useAnnotationState)((state) => state.selected);
23
+ const resettable = (0, _embedpdf_react_runtime.useSelector)(_embedpdf_react_annotation.AnnotationToken, (annotation) => annotation.selection.list().filter((candidate) => (candidate.subtype === "polygon" || candidate.subtype === "polyline") && candidate.captionCenter && annotation.canUpdate(candidate.ref) && !candidate.lockedContents), (left, right) => left.length === right.length && left.every((annotation, i) => annotation === right[i]));
24
+ const readouts = (0, _embedpdf_react_runtime.useSelector)(_embedpdf_react_measurement.MeasurementToken, (measurement) => anno.selection.list().map((annotation) => measurement.getReadout(annotation.ref)).filter((readout) => !("unavailable" in readout)), (left, right) => JSON.stringify(left) === JSON.stringify(right));
25
+ const reports = (0, _embedpdf_react_measurement.useMeasurementState)((state) => state.lastReports);
26
+ const [allPages, setAllPages] = (0, react.useState)(false);
27
+ const [recalculate, setRecalculate] = (0, react.useState)(true);
28
+ const [error, setError] = (0, react.useState)(null);
29
+ const disabled = !page || busy || !canCalibrate || !scale?.ready;
30
+ const rectilinear = scale?.measure?.subtype === "rectilinear" ? scale.measure : null;
31
+ const target = allPages ? "all" : page;
32
+ const options = { recalculate };
33
+ const run = async (work) => {
34
+ setError(null);
35
+ try {
36
+ await work();
37
+ } catch (error) {
38
+ setError(error instanceof Error ? error.message : String(error));
39
+ }
40
+ };
41
+ const precision = rectilinear?.distance[rectilinear.distance.length - 1]?.precision ?? 100;
42
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
43
+ className: "flex min-h-0 flex-1 flex-col gap-4 overflow-y-auto p-4 text-sm",
44
+ children: [
45
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
46
+ className: "text-fg-muted",
47
+ children: t("measurement.instructions")
48
+ }),
49
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
50
+ className: "text-fg-muted",
51
+ children: [t("measurement.scale"), ": "]
52
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: rectilinear?.ratio ?? t("measurement.unavailable") })] }),
53
+ scale?.error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
54
+ role: "alert",
55
+ className: "text-red-600",
56
+ children: scale.error.message
57
+ }),
58
+ scale && !scale.persistent && scale.ready && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
59
+ className: "text-fg-muted",
60
+ children: t("measurement.sessionOnly")
61
+ }),
62
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
63
+ className: "flex items-center gap-2",
64
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
65
+ type: "checkbox",
66
+ checked: allPages,
67
+ disabled: busy,
68
+ onChange: (event) => setAllPages(event.target.checked)
69
+ }), t("measurement.allPages")]
70
+ }),
71
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
72
+ className: "flex items-center gap-2",
73
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
74
+ type: "checkbox",
75
+ checked: recalculate,
76
+ disabled: busy,
77
+ onChange: (event) => setRecalculate(event.target.checked)
78
+ }), t("measurement.recalculate")]
79
+ }),
80
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("measurement.preset"), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
81
+ "aria-label": t("measurement.preset"),
82
+ className: control,
83
+ value: "",
84
+ disabled,
85
+ onChange: (event) => void run(() => measurement.setPreset(target, event.target.value, options)),
86
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
87
+ value: "",
88
+ disabled: true,
89
+ children: t("measurement.choosePreset")
90
+ }), measurement.listPresets().map((preset) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
91
+ value: preset.id,
92
+ children: preset.label
93
+ }, preset.id))]
94
+ })] }),
95
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("measurement.unit"), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
96
+ "aria-label": t("measurement.unit"),
97
+ className: control,
98
+ value: rectilinear?.distance[0]?.unit.trim() ?? "",
99
+ disabled: disabled || !rectilinear,
100
+ onChange: (event) => void run(() => measurement.setUnit(target, event.target.value, options)),
101
+ children: [!measurement.listUnits().includes(rectilinear?.distance[0]?.unit.trim()) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
102
+ value: rectilinear?.distance[0]?.unit.trim() ?? "",
103
+ children: t("measurement.custom")
104
+ }), measurement.listUnits().map((unit) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
105
+ value: unit,
106
+ children: unit
107
+ }, unit))]
108
+ })] }),
109
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("measurement.areaUnit"), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
110
+ "aria-label": t("measurement.areaUnit"),
111
+ className: control,
112
+ value: rectilinear?.area[0]?.unit.trim().replace("²", "2") ?? "",
113
+ disabled: disabled || !rectilinear,
114
+ onChange: (event) => void run(() => measurement.setAreaUnit(target, event.target.value, options)),
115
+ children: [!measurement.listAreaUnits().includes(rectilinear?.area[0]?.unit.trim().replace("²", "2")) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
116
+ value: rectilinear?.area[0]?.unit.trim().replace("²", "2") ?? "",
117
+ children: t("measurement.custom")
118
+ }), measurement.listAreaUnits().map((unit) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
119
+ value: unit,
120
+ children: unit.replace("2", "²")
121
+ }, unit))]
122
+ })] }),
123
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("measurement.precision"), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("select", {
124
+ "aria-label": t("measurement.precision"),
125
+ className: control,
126
+ value: precision,
127
+ disabled: disabled || !rectilinear,
128
+ onChange: (event) => void run(() => measurement.setPrecision(target, Number(event.target.value), options)),
129
+ children: [![
130
+ 1,
131
+ 10,
132
+ 100,
133
+ 1e3,
134
+ 1e4
135
+ ].includes(precision) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
136
+ value: precision,
137
+ children: t("measurement.custom")
138
+ }), [
139
+ 1,
140
+ 10,
141
+ 100,
142
+ 1e3,
143
+ 1e4
144
+ ].map((candidate) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", {
145
+ value: candidate,
146
+ children: 1 / candidate
147
+ }, candidate))]
148
+ })] }),
149
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
150
+ className: button,
151
+ disabled,
152
+ onClick: () => measurement.startCalibration(),
153
+ children: t("measurement.calibrate")
154
+ }),
155
+ selected.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("section", {
156
+ className: "border-border-subtle border-t pt-3",
157
+ children: [
158
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h3", {
159
+ className: "mb-1 font-medium",
160
+ children: t("measurement.selection")
161
+ }),
162
+ readouts.length ? readouts.map((readout, i) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
163
+ className: "mb-2",
164
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", { children: [
165
+ t(`measurement.${readout.kind}`),
166
+ ": ",
167
+ readout.label
168
+ ] }), readout.perimeter && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", { children: [
169
+ t("measurement.perimeter"),
170
+ ": ",
171
+ readout.perimeter
172
+ ] })]
173
+ }, i)) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
174
+ className: "text-fg-muted",
175
+ children: t("measurement.unavailable")
176
+ }),
177
+ resettable.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
178
+ className: button,
179
+ disabled: busy,
180
+ onClick: () => void run(async () => {
181
+ for (const annotation of resettable) if (annotation.subtype === "polygon" || annotation.subtype === "polyline") await anno.update(annotation.ref, {
182
+ subtype: annotation.subtype,
183
+ captionCenter: null
184
+ });
185
+ }),
186
+ children: t("measurement.resetLabel")
187
+ })
188
+ ]
189
+ }),
190
+ reports.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
191
+ role: "status",
192
+ children: t("measurement.report", { params: {
193
+ updated: reports.reduce((total, report) => total + report.updated.length, 0),
194
+ skipped: reports.reduce((total, report) => total + report.skipped.length, 0),
195
+ failed: reports.reduce((total, report) => total + report.failed.length + (report.scaleError || report.error ? 1 : 0), 0)
196
+ } })
197
+ }),
198
+ error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
199
+ role: "alert",
200
+ className: "text-red-600",
201
+ children: error
202
+ })
203
+ ]
204
+ });
205
+ }
206
+ function CalibrationDialog() {
207
+ const t = (0, _embedpdf_react_i18n.useT)();
208
+ const measurement = (0, _embedpdf_react_measurement.useMeasurement)();
209
+ const { busy, calibrationRequest: request } = (0, _embedpdf_react_measurement.useMeasurementState)();
210
+ const canCalibrate = (0, _embedpdf_react_runtime.useSelector)(_embedpdf_react_measurement.MeasurementToken, (current) => current.canCalibrate());
211
+ const input = (0, react.useRef)(null);
212
+ const [value, setValue] = (0, react.useState)("");
213
+ const [unit, setUnit] = (0, react.useState)("m");
214
+ const [allPages, setAllPages] = (0, react.useState)(false);
215
+ const [recalculate, setRecalculate] = (0, react.useState)(true);
216
+ const [error, setError] = (0, react.useState)(null);
217
+ (0, react.useEffect)(() => {
218
+ setValue("");
219
+ setError(null);
220
+ input.current?.focus();
221
+ }, [request]);
222
+ if (!request) return null;
223
+ const submit = async () => {
224
+ setError(null);
225
+ try {
226
+ await measurement.calibrate({
227
+ page: request.page,
228
+ from: request.from,
229
+ to: request.to,
230
+ distance: {
231
+ value: Number(value),
232
+ unit
233
+ }
234
+ }, {
235
+ recalculate,
236
+ applyTo: allPages ? "all" : void 0
237
+ });
238
+ measurement.dismissCalibration();
239
+ } catch (error) {
240
+ setError(error instanceof Error ? error.message : String(error));
241
+ }
242
+ };
243
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_dialog.Dialog, {
244
+ labelledBy: "measurement-calibration-title",
245
+ onClose: () => {
246
+ if (!busy) measurement.dismissCalibration();
247
+ },
248
+ className: "border-border bg-surface w-96 rounded-lg border p-5 shadow-xl",
249
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("form", {
250
+ className: "flex flex-col gap-4",
251
+ onSubmit: (event) => {
252
+ event.preventDefault();
253
+ submit();
254
+ },
255
+ children: [
256
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h2", {
257
+ id: "measurement-calibration-title",
258
+ className: "font-semibold",
259
+ children: t("measurement.calibrate")
260
+ }),
261
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
262
+ className: "text-fg-muted text-sm",
263
+ children: t("measurement.knownLength")
264
+ }),
265
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("measurement.length"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
266
+ ref: input,
267
+ "aria-label": t("measurement.length"),
268
+ className: control,
269
+ type: "number",
270
+ min: "0",
271
+ step: "any",
272
+ value,
273
+ onChange: (event) => setValue(event.target.value)
274
+ })] }),
275
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", { children: [t("measurement.unit"), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("select", {
276
+ className: control,
277
+ "aria-label": t("measurement.unit"),
278
+ value: unit,
279
+ onChange: (event) => setUnit(event.target.value),
280
+ children: measurement.listUnits().map((lengthUnit) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("option", { children: lengthUnit }, lengthUnit))
281
+ })] }),
282
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
283
+ className: "flex items-center gap-2 text-sm",
284
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
285
+ type: "checkbox",
286
+ checked: allPages,
287
+ onChange: (event) => setAllPages(event.target.checked)
288
+ }), t("measurement.allPages")]
289
+ }),
290
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
291
+ className: "flex items-center gap-2 text-sm",
292
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
293
+ type: "checkbox",
294
+ checked: recalculate,
295
+ onChange: (event) => setRecalculate(event.target.checked)
296
+ }), t("measurement.recalculate")]
297
+ }),
298
+ error && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
299
+ role: "alert",
300
+ className: "text-sm text-red-600",
301
+ children: error
302
+ }),
303
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
304
+ className: "flex justify-end gap-2",
305
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
306
+ type: "button",
307
+ className: button,
308
+ disabled: busy,
309
+ onClick: () => measurement.dismissCalibration(),
310
+ children: t("demo.cancel")
311
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
312
+ className: button,
313
+ type: "submit",
314
+ disabled: busy || !canCalibrate || !(Number(value) > 0) || !Number.isFinite(Number(value)),
315
+ children: busy ? t("measurement.applying") : t("measurement.apply")
316
+ })]
317
+ })
318
+ ]
319
+ })
320
+ });
321
+ }
322
+ //#endregion
323
+ exports.CalibrationDialog = CalibrationDialog;
324
+ exports.MeasurementSection = MeasurementSection;
325
+
326
+ //# sourceMappingURL=measurement-CcCsHPOX.cjs.map
@@ -0,0 +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":"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"}