@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.
- package/README.md +175 -132
- package/dist/annotation-fonts-BqoLZ4Mp.js +80 -0
- package/dist/annotation-fonts-BqoLZ4Mp.js.map +1 -0
- package/dist/annotation-fonts-Dt0IQXhz.cjs +91 -0
- package/dist/annotation-fonts-Dt0IQXhz.cjs.map +1 -0
- package/dist/annotation-style--rPIZsuP.js +879 -0
- package/dist/annotation-style--rPIZsuP.js.map +1 -0
- package/dist/annotation-style-Bzvvp8-N.cjs +879 -0
- package/dist/annotation-style-Bzvvp8-N.cjs.map +1 -0
- package/dist/ar-D9XKAmDx.js +567 -0
- package/dist/ar-D9XKAmDx.js.map +1 -0
- package/dist/ar-DnEj5vbP.cjs +567 -0
- package/dist/ar-DnEj5vbP.cjs.map +1 -0
- package/dist/chrome.cjs +378 -221
- package/dist/chrome.cjs.map +1 -1
- package/dist/chrome.d.cts +5 -34
- package/dist/chrome.d.ts +5 -34
- package/dist/chrome.js +377 -218
- package/dist/chrome.js.map +1 -1
- package/dist/commands-BmgxhJ8B.js +953 -0
- package/dist/commands-BmgxhJ8B.js.map +1 -0
- package/dist/commands-CYt4SFUX.cjs +1060 -0
- package/dist/commands-CYt4SFUX.cjs.map +1 -0
- package/dist/commands.cjs +12 -595
- package/dist/commands.d.cts +29 -4
- package/dist/commands.d.ts +29 -4
- package/dist/commands.js +2 -593
- package/dist/comments-panel-MUVgLCBI.js +514 -0
- package/dist/comments-panel-MUVgLCBI.js.map +1 -0
- package/dist/comments-panel-pEcQg4Vs.cjs +514 -0
- package/dist/comments-panel-pEcQg4Vs.cjs.map +1 -0
- package/dist/de-Bdr4aWzm.js +566 -0
- package/dist/de-Bdr4aWzm.js.map +1 -0
- package/dist/de-Dv6zvbnd.cjs +566 -0
- package/dist/de-Dv6zvbnd.cjs.map +1 -0
- package/dist/dialog-B5GBisKv.js +55 -0
- package/dist/dialog-B5GBisKv.js.map +1 -0
- package/dist/dialog-t8F13BL_.cjs +60 -0
- package/dist/dialog-t8F13BL_.cjs.map +1 -0
- package/dist/es-BP09DR9w.cjs +566 -0
- package/dist/es-BP09DR9w.cjs.map +1 -0
- package/dist/es-BSXz5tBv.js +566 -0
- package/dist/es-BSXz5tBv.js.map +1 -0
- package/dist/form-design-panel-B5MXTZ96.cjs +418 -0
- package/dist/form-design-panel-B5MXTZ96.cjs.map +1 -0
- package/dist/form-design-panel-vWWU9uB-.js +418 -0
- package/dist/form-design-panel-vWWU9uB-.js.map +1 -0
- package/dist/fr-BBQQn7tJ.cjs +566 -0
- package/dist/fr-BBQQn7tJ.cjs.map +1 -0
- package/dist/fr-Ckn3K9v1.js +566 -0
- package/dist/fr-Ckn3K9v1.js.map +1 -0
- package/dist/he-DRsG7bH7.cjs +567 -0
- package/dist/he-DRsG7bH7.cjs.map +1 -0
- package/dist/he-wdGU5PkU.js +567 -0
- package/dist/he-wdGU5PkU.js.map +1 -0
- package/dist/icons-BrK5iVL8.js +856 -0
- package/dist/icons-BrK5iVL8.js.map +1 -0
- package/dist/icons-x0Tc05bs.cjs +1010 -0
- package/dist/icons-x0Tc05bs.cjs.map +1 -0
- package/dist/index.cjs +3162 -5106
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +636 -143
- package/dist/index.d.ts +636 -143
- package/dist/index.js +3083 -4975
- package/dist/index.js.map +1 -1
- package/dist/it-BuP4o0xQ.cjs +566 -0
- package/dist/it-BuP4o0xQ.cjs.map +1 -0
- package/dist/it-Us-VmvIu.js +566 -0
- package/dist/it-Us-VmvIu.js.map +1 -0
- package/dist/ja-Cizj0-5O.js +566 -0
- package/dist/ja-Cizj0-5O.js.map +1 -0
- package/dist/ja-DovEd6ts.cjs +566 -0
- package/dist/ja-DovEd6ts.cjs.map +1 -0
- package/dist/ko-B-qJEol2.cjs +566 -0
- package/dist/ko-B-qJEol2.cjs.map +1 -0
- package/dist/ko-DlrXliE1.js +566 -0
- package/dist/ko-DlrXliE1.js.map +1 -0
- package/dist/labels-BiM9wp9K.cjs +21 -0
- package/dist/labels-BiM9wp9K.cjs.map +1 -0
- package/dist/labels-C6_i87Oj.js +16 -0
- package/dist/labels-C6_i87Oj.js.map +1 -0
- package/dist/link-editor-CSjqPnj1.cjs +125 -0
- package/dist/link-editor-CSjqPnj1.cjs.map +1 -0
- package/dist/link-editor-SxM1nnJU.js +125 -0
- package/dist/link-editor-SxM1nnJU.js.map +1 -0
- package/dist/measurement-Bs61XWbJ.js +325 -0
- package/dist/measurement-Bs61XWbJ.js.map +1 -0
- package/dist/measurement-CcCsHPOX.cjs +326 -0
- package/dist/measurement-CcCsHPOX.cjs.map +1 -0
- package/dist/nl-0aF7M_0h.js +566 -0
- package/dist/nl-0aF7M_0h.js.map +1 -0
- package/dist/nl-D3KZDDiJ.cjs +566 -0
- package/dist/nl-D3KZDDiJ.cjs.map +1 -0
- package/dist/pl-BW--AaCI.js +566 -0
- package/dist/pl-BW--AaCI.js.map +1 -0
- package/dist/pl-DSFhAUqx.cjs +566 -0
- package/dist/pl-DSFhAUqx.cjs.map +1 -0
- package/dist/pt-C5S-8MC5.cjs +566 -0
- package/dist/pt-C5S-8MC5.cjs.map +1 -0
- package/dist/pt-DIhpU5pT.js +566 -0
- package/dist/pt-DIhpU5pT.js.map +1 -0
- package/dist/redact-confirm-B6j36TPw.js +83 -0
- package/dist/redact-confirm-B6j36TPw.js.map +1 -0
- package/dist/redact-confirm-CX_SY2ZN.cjs +83 -0
- package/dist/redact-confirm-CX_SY2ZN.cjs.map +1 -0
- package/dist/redaction-panel-BmoIl-Ll.cjs +96 -0
- package/dist/redaction-panel-BmoIl-Ll.cjs.map +1 -0
- package/dist/redaction-panel-IJDshSJI.js +96 -0
- package/dist/redaction-panel-IJDshSJI.js.map +1 -0
- package/dist/search-panel-HfIhJm1M.js +249 -0
- package/dist/search-panel-HfIhJm1M.js.map +1 -0
- package/dist/search-panel-s9IoiOtv.cjs +249 -0
- package/dist/search-panel-s9IoiOtv.cjs.map +1 -0
- package/dist/sheet-BDsa_Sup.cjs +442 -0
- package/dist/sheet-BDsa_Sup.cjs.map +1 -0
- package/dist/sheet-R6XDgyEf.js +365 -0
- package/dist/sheet-R6XDgyEf.js.map +1 -0
- package/dist/sign-dialog-CgnR7akj.cjs +155 -0
- package/dist/sign-dialog-CgnR7akj.cjs.map +1 -0
- package/dist/sign-dialog-GDqCoQhA.js +155 -0
- package/dist/sign-dialog-GDqCoQhA.js.map +1 -0
- package/dist/signature-inspector-DyO313Qf.cjs +166 -0
- package/dist/signature-inspector-DyO313Qf.cjs.map +1 -0
- package/dist/signature-inspector-okFz8do6.js +166 -0
- package/dist/signature-inspector-okFz8do6.js.map +1 -0
- package/dist/signature-maker-BhCmYyHD.js +393 -0
- package/dist/signature-maker-BhCmYyHD.js.map +1 -0
- package/dist/signature-maker-BoYa8vgA.cjs +393 -0
- package/dist/signature-maker-BoYa8vgA.cjs.map +1 -0
- package/dist/signatures-panel-B56PC6d9.cjs +300 -0
- package/dist/signatures-panel-B56PC6d9.cjs.map +1 -0
- package/dist/signatures-panel-CgnFfhFm.js +300 -0
- package/dist/signatures-panel-CgnFfhFm.js.map +1 -0
- package/dist/stamp-store-BHvRs-Do.cjs +147 -0
- package/dist/stamp-store-BHvRs-Do.cjs.map +1 -0
- package/dist/stamp-store-WuF-L3Jj.js +112 -0
- package/dist/stamp-store-WuF-L3Jj.js.map +1 -0
- package/dist/stamps-panel-B9NYGayn.cjs +231 -0
- package/dist/stamps-panel-B9NYGayn.cjs.map +1 -0
- package/dist/stamps-panel-CDO0FPyK.js +231 -0
- package/dist/stamps-panel-CDO0FPyK.js.map +1 -0
- package/dist/toolbar-CJu2wKTU.cjs +1659 -0
- package/dist/toolbar-CJu2wKTU.cjs.map +1 -0
- package/dist/toolbar-z9od3tKl.js +1564 -0
- package/dist/toolbar-z9od3tKl.js.map +1 -0
- package/dist/zh-cn-3tmMeHqv.cjs +566 -0
- package/dist/zh-cn-3tmMeHqv.cjs.map +1 -0
- package/dist/zh-cn-CxkUUBct.js +566 -0
- package/dist/zh-cn-CxkUUBct.js.map +1 -0
- package/package.json +6 -4
- package/src/styles.css +153 -89
- package/dist/commands.cjs.map +0 -1
- package/dist/commands.js.map +0 -1
- package/dist/es-DYwzfxyt.cjs +0 -293
- package/dist/es-DYwzfxyt.cjs.map +0 -1
- package/dist/es-sN6uqBgD.js +0 -293
- 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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"}
|