formanitor 0.1.11 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AddInvestigationWidget-7UGZQYI5.mjs +30 -0
- package/dist/AddInvestigationWidget-7UGZQYI5.mjs.map +1 -0
- package/dist/AddInvestigationWidget-RY62UCPM.cjs +32 -0
- package/dist/AddInvestigationWidget-RY62UCPM.cjs.map +1 -0
- package/dist/AddMedicationWidget-UG26VMUX.mjs +30 -0
- package/dist/AddMedicationWidget-UG26VMUX.mjs.map +1 -0
- package/dist/AddMedicationWidget-WPI32WAP.cjs +32 -0
- package/dist/AddMedicationWidget-WPI32WAP.cjs.map +1 -0
- package/dist/AddProcedureWidget-SF6MTRBV.cjs +278 -0
- package/dist/AddProcedureWidget-SF6MTRBV.cjs.map +1 -0
- package/dist/AddProcedureWidget-SQJUKKMK.mjs +276 -0
- package/dist/AddProcedureWidget-SQJUKKMK.mjs.map +1 -0
- package/dist/BiometryIolWorkupWidget-I5AJOYB2.cjs +300 -0
- package/dist/BiometryIolWorkupWidget-I5AJOYB2.cjs.map +1 -0
- package/dist/BiometryIolWorkupWidget-NL2M7ZAA.mjs +298 -0
- package/dist/BiometryIolWorkupWidget-NL2M7ZAA.mjs.map +1 -0
- package/dist/DateTimeWidget-DIDVF2EB.cjs +61 -0
- package/dist/DateTimeWidget-DIDVF2EB.cjs.map +1 -0
- package/dist/DateTimeWidget-LFBB6HOP.mjs +59 -0
- package/dist/DateTimeWidget-LFBB6HOP.mjs.map +1 -0
- package/dist/DateWidget-4ND5TKP2.mjs +72 -0
- package/dist/DateWidget-4ND5TKP2.mjs.map +1 -0
- package/dist/DateWidget-BCVR5GDK.cjs +74 -0
- package/dist/DateWidget-BCVR5GDK.cjs.map +1 -0
- package/dist/DiagnosisTextareaWidget-E7OQRUMX.cjs +190 -0
- package/dist/DiagnosisTextareaWidget-E7OQRUMX.cjs.map +1 -0
- package/dist/DiagnosisTextareaWidget-MAOXCXEZ.mjs +184 -0
- package/dist/DiagnosisTextareaWidget-MAOXCXEZ.mjs.map +1 -0
- package/dist/DifferentialDiagnosisWidget-ANALLNKL.cjs +17 -0
- package/dist/DifferentialDiagnosisWidget-ANALLNKL.cjs.map +1 -0
- package/dist/DifferentialDiagnosisWidget-LCY2SA2I.mjs +15 -0
- package/dist/DifferentialDiagnosisWidget-LCY2SA2I.mjs.map +1 -0
- package/dist/DischargeMedicationOrdersWidget-GYT35W7J.mjs +161 -0
- package/dist/DischargeMedicationOrdersWidget-GYT35W7J.mjs.map +1 -0
- package/dist/DischargeMedicationOrdersWidget-ILWNZ7VM.cjs +163 -0
- package/dist/DischargeMedicationOrdersWidget-ILWNZ7VM.cjs.map +1 -0
- package/dist/EditableTable-TGCVUBLO.mjs +279 -0
- package/dist/EditableTable-TGCVUBLO.mjs.map +1 -0
- package/dist/EditableTable-VCUNJZEX.cjs +281 -0
- package/dist/EditableTable-VCUNJZEX.cjs.map +1 -0
- package/dist/FollowupWidget-F6FRZO4T.mjs +283 -0
- package/dist/FollowupWidget-F6FRZO4T.mjs.map +1 -0
- package/dist/FollowupWidget-NBTOV2ML.cjs +285 -0
- package/dist/FollowupWidget-NBTOV2ML.cjs.map +1 -0
- package/dist/FunctionalImpairmentScoreWidget-5V5SNLTF.cjs +93 -0
- package/dist/FunctionalImpairmentScoreWidget-5V5SNLTF.cjs.map +1 -0
- package/dist/FunctionalImpairmentScoreWidget-QKIZE7KT.mjs +91 -0
- package/dist/FunctionalImpairmentScoreWidget-QKIZE7KT.mjs.map +1 -0
- package/dist/GsExaminationWidget-57SL4BCI.cjs +528 -0
- package/dist/GsExaminationWidget-57SL4BCI.cjs.map +1 -0
- package/dist/GsExaminationWidget-J4VABGY6.mjs +526 -0
- package/dist/GsExaminationWidget-J4VABGY6.mjs.map +1 -0
- package/dist/GsGradingWidget-3WTLIP33.mjs +90 -0
- package/dist/GsGradingWidget-3WTLIP33.mjs.map +1 -0
- package/dist/GsGradingWidget-CIXE36HF.cjs +92 -0
- package/dist/GsGradingWidget-CIXE36HF.cjs.map +1 -0
- package/dist/GsSmartHistoryWidget-6Q2IIGDG.cjs +398 -0
- package/dist/GsSmartHistoryWidget-6Q2IIGDG.cjs.map +1 -0
- package/dist/GsSmartHistoryWidget-IOGZ6GNS.mjs +396 -0
- package/dist/GsSmartHistoryWidget-IOGZ6GNS.mjs.map +1 -0
- package/dist/HiddenVitalsWidget-HBK7PBPR.cjs +55 -0
- package/dist/HiddenVitalsWidget-HBK7PBPR.cjs.map +1 -0
- package/dist/HiddenVitalsWidget-JH3NRZLM.mjs +53 -0
- package/dist/HiddenVitalsWidget-JH3NRZLM.mjs.map +1 -0
- package/dist/LensAssessmentWidget-7WMULFS2.mjs +232 -0
- package/dist/LensAssessmentWidget-7WMULFS2.mjs.map +1 -0
- package/dist/LensAssessmentWidget-GSOOD7BX.cjs +234 -0
- package/dist/LensAssessmentWidget-GSOOD7BX.cjs.map +1 -0
- package/dist/MarMedicationOrdersWidget-3E6GFOR6.cjs +76 -0
- package/dist/MarMedicationOrdersWidget-3E6GFOR6.cjs.map +1 -0
- package/dist/MarMedicationOrdersWidget-QZUVSEB5.mjs +74 -0
- package/dist/MarMedicationOrdersWidget-QZUVSEB5.mjs.map +1 -0
- package/dist/OBGExaminationWidget-F2ZNSP2M.cjs +215 -0
- package/dist/OBGExaminationWidget-F2ZNSP2M.cjs.map +1 -0
- package/dist/OBGExaminationWidget-POVLALMA.mjs +213 -0
- package/dist/OBGExaminationWidget-POVLALMA.mjs.map +1 -0
- package/dist/OBGPathwayWidget-CGT7Q4T2.mjs +517 -0
- package/dist/OBGPathwayWidget-CGT7Q4T2.mjs.map +1 -0
- package/dist/OBGPathwayWidget-WCIQENMO.cjs +519 -0
- package/dist/OBGPathwayWidget-WCIQENMO.cjs.map +1 -0
- package/dist/ObstetricHistoryWidget-EGVLL4X2.mjs +1113 -0
- package/dist/ObstetricHistoryWidget-EGVLL4X2.mjs.map +1 -0
- package/dist/ObstetricHistoryWidget-XU6R7IPP.cjs +1115 -0
- package/dist/ObstetricHistoryWidget-XU6R7IPP.cjs.map +1 -0
- package/dist/OphthalDiagnosisWidget-G5RCC2QZ.mjs +89 -0
- package/dist/OphthalDiagnosisWidget-G5RCC2QZ.mjs.map +1 -0
- package/dist/OphthalDiagnosisWidget-OQPTHJ7E.cjs +91 -0
- package/dist/OphthalDiagnosisWidget-OQPTHJ7E.cjs.map +1 -0
- package/dist/OphthalmologyWidget-I3BKWOI2.cjs +1331 -0
- package/dist/OphthalmologyWidget-I3BKWOI2.cjs.map +1 -0
- package/dist/OphthalmologyWidget-RG2AI6WA.mjs +1329 -0
- package/dist/OphthalmologyWidget-RG2AI6WA.mjs.map +1 -0
- package/dist/OrthopedicExamWidget-BBZP6NVT.mjs +366 -0
- package/dist/OrthopedicExamWidget-BBZP6NVT.mjs.map +1 -0
- package/dist/OrthopedicExamWidget-M4KKU5RC.cjs +368 -0
- package/dist/OrthopedicExamWidget-M4KKU5RC.cjs.map +1 -0
- package/dist/PainScaleFlagsWidget-E576R6QB.mjs +151 -0
- package/dist/PainScaleFlagsWidget-E576R6QB.mjs.map +1 -0
- package/dist/PainScaleFlagsWidget-QHGESXNE.cjs +153 -0
- package/dist/PainScaleFlagsWidget-QHGESXNE.cjs.map +1 -0
- package/dist/ReadOnlyTable-4Y2XW4MX.mjs +6 -0
- package/dist/ReadOnlyTable-4Y2XW4MX.mjs.map +1 -0
- package/dist/ReadOnlyTable-L7G6GWEJ.cjs +15 -0
- package/dist/ReadOnlyTable-L7G6GWEJ.cjs.map +1 -0
- package/dist/ReferralWidget-J2PWYFDT.cjs +171 -0
- package/dist/ReferralWidget-J2PWYFDT.cjs.map +1 -0
- package/dist/ReferralWidget-UPYWEO5R.mjs +169 -0
- package/dist/ReferralWidget-UPYWEO5R.mjs.map +1 -0
- package/dist/RichTextWidget-BBCNJPMH.mjs +11 -0
- package/dist/RichTextWidget-BBCNJPMH.mjs.map +1 -0
- package/dist/RichTextWidget-CRQHNVJR.cjs +24 -0
- package/dist/RichTextWidget-CRQHNVJR.cjs.map +1 -0
- package/dist/SmartTextarea-DKWV4R6H.cjs +19 -0
- package/dist/SmartTextarea-DKWV4R6H.cjs.map +1 -0
- package/dist/SmartTextarea-ZTQIW6O2.mjs +10 -0
- package/dist/SmartTextarea-ZTQIW6O2.mjs.map +1 -0
- package/dist/SuggestionTextareaWidget-22NR3JWM.mjs +215 -0
- package/dist/SuggestionTextareaWidget-22NR3JWM.mjs.map +1 -0
- package/dist/SuggestionTextareaWidget-WCTPWW2E.cjs +226 -0
- package/dist/SuggestionTextareaWidget-WCTPWW2E.cjs.map +1 -0
- package/dist/SurgicalRiskFlagsWidget-Q5FTWB3M.cjs +146 -0
- package/dist/SurgicalRiskFlagsWidget-Q5FTWB3M.cjs.map +1 -0
- package/dist/SurgicalRiskFlagsWidget-WCAHZKKG.mjs +144 -0
- package/dist/SurgicalRiskFlagsWidget-WCAHZKKG.mjs.map +1 -0
- package/dist/UrologyExaminationWidget-JYUGZ5CG.cjs +273 -0
- package/dist/UrologyExaminationWidget-JYUGZ5CG.cjs.map +1 -0
- package/dist/UrologyExaminationWidget-QDTD3FJX.mjs +271 -0
- package/dist/UrologyExaminationWidget-QDTD3FJX.mjs.map +1 -0
- package/dist/UrologyPathwayWidget-QTFKUIM7.mjs +153 -0
- package/dist/UrologyPathwayWidget-QTFKUIM7.mjs.map +1 -0
- package/dist/UrologyPathwayWidget-TXZQNGP4.cjs +155 -0
- package/dist/UrologyPathwayWidget-TXZQNGP4.cjs.map +1 -0
- package/dist/UrologySmartHistoryWidget-53NATEO3.cjs +471 -0
- package/dist/UrologySmartHistoryWidget-53NATEO3.cjs.map +1 -0
- package/dist/UrologySmartHistoryWidget-PBU4QXQJ.mjs +469 -0
- package/dist/UrologySmartHistoryWidget-PBU4QXQJ.mjs.map +1 -0
- package/dist/VitalsWidget-BRFUKGNO.mjs +187 -0
- package/dist/VitalsWidget-BRFUKGNO.mjs.map +1 -0
- package/dist/VitalsWidget-PDCYXNBM.cjs +208 -0
- package/dist/VitalsWidget-PDCYXNBM.cjs.map +1 -0
- package/dist/chunk-3KRDT7TX.mjs +137 -0
- package/dist/chunk-3KRDT7TX.mjs.map +1 -0
- package/dist/chunk-4BAKQIPJ.mjs +27 -0
- package/dist/chunk-4BAKQIPJ.mjs.map +1 -0
- package/dist/chunk-4KSZUIJE.cjs +143 -0
- package/dist/chunk-4KSZUIJE.cjs.map +1 -0
- package/dist/chunk-4PMNVBJD.mjs +121 -0
- package/dist/chunk-4PMNVBJD.mjs.map +1 -0
- package/dist/chunk-5E3APMY6.cjs +54 -0
- package/dist/chunk-5E3APMY6.cjs.map +1 -0
- package/dist/chunk-5I2RC47Y.mjs +75 -0
- package/dist/chunk-5I2RC47Y.mjs.map +1 -0
- package/dist/chunk-6YX37XBM.cjs +32 -0
- package/dist/chunk-6YX37XBM.cjs.map +1 -0
- package/dist/chunk-7L2JOWGA.mjs +30 -0
- package/dist/chunk-7L2JOWGA.mjs.map +1 -0
- package/dist/chunk-AIZ3XYEZ.cjs +551 -0
- package/dist/chunk-AIZ3XYEZ.cjs.map +1 -0
- package/dist/chunk-AZHTIUOL.mjs +116 -0
- package/dist/chunk-AZHTIUOL.mjs.map +1 -0
- package/dist/chunk-AZSAPO2V.cjs +174 -0
- package/dist/chunk-AZSAPO2V.cjs.map +1 -0
- package/dist/chunk-B3GBIAHZ.mjs +285 -0
- package/dist/chunk-B3GBIAHZ.mjs.map +1 -0
- package/dist/chunk-BMNY7F6H.mjs +148 -0
- package/dist/chunk-BMNY7F6H.mjs.map +1 -0
- package/dist/chunk-BOBX45NY.cjs +77 -0
- package/dist/chunk-BOBX45NY.cjs.map +1 -0
- package/dist/chunk-BU4ZEAAP.mjs +102 -0
- package/dist/chunk-BU4ZEAAP.mjs.map +1 -0
- package/dist/chunk-DZYV47QC.mjs +54 -0
- package/dist/chunk-DZYV47QC.mjs.map +1 -0
- package/dist/chunk-E7WUDHSA.cjs +127 -0
- package/dist/chunk-E7WUDHSA.cjs.map +1 -0
- package/dist/chunk-FHHISVCH.cjs +13 -0
- package/dist/chunk-FHHISVCH.cjs.map +1 -0
- package/dist/chunk-GNZWSVTB.mjs +29 -0
- package/dist/chunk-GNZWSVTB.mjs.map +1 -0
- package/dist/chunk-GPU5P3FB.cjs +236 -0
- package/dist/chunk-GPU5P3FB.cjs.map +1 -0
- package/dist/chunk-GXXWMHAA.mjs +49 -0
- package/dist/chunk-GXXWMHAA.mjs.map +1 -0
- package/dist/chunk-GZPCYSJK.mjs +104 -0
- package/dist/chunk-GZPCYSJK.mjs.map +1 -0
- package/dist/chunk-HEFZA2AH.mjs +22 -0
- package/dist/chunk-HEFZA2AH.mjs.map +1 -0
- package/dist/chunk-I4AV6BQF.mjs +10 -0
- package/dist/chunk-I4AV6BQF.mjs.map +1 -0
- package/dist/chunk-I7TJVWYV.cjs +73 -0
- package/dist/chunk-I7TJVWYV.cjs.map +1 -0
- package/dist/chunk-IFMQKLNW.mjs +39 -0
- package/dist/chunk-IFMQKLNW.mjs.map +1 -0
- package/dist/chunk-IFSKLIS2.cjs +12 -0
- package/dist/chunk-IFSKLIS2.cjs.map +1 -0
- package/dist/chunk-IKAKE7TR.mjs +527 -0
- package/dist/chunk-IKAKE7TR.mjs.map +1 -0
- package/dist/chunk-JE6VXRWW.cjs +86 -0
- package/dist/chunk-JE6VXRWW.cjs.map +1 -0
- package/dist/chunk-JMGUUFOJ.cjs +45 -0
- package/dist/chunk-JMGUUFOJ.cjs.map +1 -0
- package/dist/chunk-KJA5BLGX.cjs +31 -0
- package/dist/chunk-KJA5BLGX.cjs.map +1 -0
- package/dist/chunk-KMJOTMUQ.cjs +109 -0
- package/dist/chunk-KMJOTMUQ.cjs.map +1 -0
- package/dist/chunk-L4CIIT4U.cjs +388 -0
- package/dist/chunk-L4CIIT4U.cjs.map +1 -0
- package/dist/chunk-LBWB7MYU.cjs +287 -0
- package/dist/chunk-LBWB7MYU.cjs.map +1 -0
- package/dist/chunk-LGGOBIEA.mjs +61 -0
- package/dist/chunk-LGGOBIEA.mjs.map +1 -0
- package/dist/chunk-LQYWMYEC.mjs +28 -0
- package/dist/chunk-LQYWMYEC.mjs.map +1 -0
- package/dist/chunk-MQ2JV7HL.cjs +140 -0
- package/dist/chunk-MQ2JV7HL.cjs.map +1 -0
- package/dist/chunk-N4L76SHJ.cjs +65 -0
- package/dist/chunk-N4L76SHJ.cjs.map +1 -0
- package/dist/chunk-O3VQBPEW.cjs +72 -0
- package/dist/chunk-O3VQBPEW.cjs.map +1 -0
- package/dist/chunk-P62377LB.cjs +27 -0
- package/dist/chunk-P62377LB.cjs.map +1 -0
- package/dist/chunk-PHADAQSH.cjs +49 -0
- package/dist/chunk-PHADAQSH.cjs.map +1 -0
- package/dist/chunk-PZBJYPWW.cjs +52 -0
- package/dist/chunk-PZBJYPWW.cjs.map +1 -0
- package/dist/chunk-QKJ7BQSR.cjs +538 -0
- package/dist/chunk-QKJ7BQSR.cjs.map +1 -0
- package/dist/chunk-QS6WG2XJ.cjs +56 -0
- package/dist/chunk-QS6WG2XJ.cjs.map +1 -0
- package/dist/chunk-S7EMPE2D.cjs +104 -0
- package/dist/chunk-S7EMPE2D.cjs.map +1 -0
- package/dist/chunk-SCMXLRX5.mjs +42 -0
- package/dist/chunk-SCMXLRX5.mjs.map +1 -0
- package/dist/chunk-SHQHDSA4.cjs +1959 -0
- package/dist/chunk-SHQHDSA4.cjs.map +1 -0
- package/dist/chunk-TJHG5WHX.cjs +47 -0
- package/dist/chunk-TJHG5WHX.cjs.map +1 -0
- package/dist/chunk-UGGUIXUS.cjs +41 -0
- package/dist/chunk-UGGUIXUS.cjs.map +1 -0
- package/dist/chunk-ULMK3TUI.mjs +69 -0
- package/dist/chunk-ULMK3TUI.mjs.map +1 -0
- package/dist/chunk-UULLSS4O.mjs +82 -0
- package/dist/chunk-UULLSS4O.mjs.map +1 -0
- package/dist/chunk-VNFBUAZD.mjs +25 -0
- package/dist/chunk-VNFBUAZD.mjs.map +1 -0
- package/dist/chunk-VPU66PI6.mjs +11 -0
- package/dist/chunk-VPU66PI6.mjs.map +1 -0
- package/dist/chunk-VZT5YNCD.mjs +228 -0
- package/dist/chunk-VZT5YNCD.mjs.map +1 -0
- package/dist/chunk-WYVXXEZI.mjs +46 -0
- package/dist/chunk-WYVXXEZI.mjs.map +1 -0
- package/dist/chunk-XDUVO3IZ.mjs +547 -0
- package/dist/chunk-XDUVO3IZ.mjs.map +1 -0
- package/dist/chunk-Y7TIWH4I.mjs +25 -0
- package/dist/chunk-Y7TIWH4I.mjs.map +1 -0
- package/dist/chunk-YEFM2ERQ.cjs +143 -0
- package/dist/chunk-YEFM2ERQ.cjs.map +1 -0
- package/dist/chunk-YHNI5NIX.mjs +361 -0
- package/dist/chunk-YHNI5NIX.mjs.map +1 -0
- package/dist/chunk-ZTT5XJR7.mjs +1921 -0
- package/dist/chunk-ZTT5XJR7.mjs.map +1 -0
- package/dist/index.cjs +2091 -14564
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +62 -767
- package/dist/index.d.ts +62 -767
- package/dist/index.mjs +1873 -14394
- package/dist/index.mjs.map +1 -1
- package/dist/read-only-table.cjs +15 -0
- package/dist/read-only-table.cjs.map +1 -0
- package/dist/read-only-table.d.cts +10 -0
- package/dist/read-only-table.d.ts +10 -0
- package/dist/read-only-table.mjs +6 -0
- package/dist/read-only-table.mjs.map +1 -0
- package/dist/rich-text.cjs +24 -0
- package/dist/rich-text.cjs.map +1 -0
- package/dist/rich-text.d.cts +8 -0
- package/dist/rich-text.d.ts +8 -0
- package/dist/rich-text.mjs +11 -0
- package/dist/rich-text.mjs.map +1 -0
- package/dist/richTextClassName--8wkuHkW.d.cts +10 -0
- package/dist/richTextClassName--8wkuHkW.d.ts +10 -0
- package/dist/smart.cjs +23 -0
- package/dist/smart.cjs.map +1 -0
- package/dist/smart.d.cts +23 -0
- package/dist/smart.d.ts +23 -0
- package/dist/smart.mjs +10 -0
- package/dist/smart.mjs.map +1 -0
- package/dist/types-CYtJk8H9.d.cts +782 -0
- package/dist/types-CYtJk8H9.d.ts +782 -0
- package/package.json +20 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Textarea } from './chunk-4BAKQIPJ.mjs';
|
|
2
|
+
import { getThemeConfig } from './chunk-Y7TIWH4I.mjs';
|
|
3
|
+
import { FieldRequiredIndicator, fieldLabelClass, fieldControlClass, fieldErrorClass, fieldWrapperClass } from './chunk-WYVXXEZI.mjs';
|
|
4
|
+
import { useForm } from './chunk-7L2JOWGA.mjs';
|
|
5
|
+
import { useField } from './chunk-ZTT5XJR7.mjs';
|
|
6
|
+
import { Label } from './chunk-HEFZA2AH.mjs';
|
|
7
|
+
import { cn } from './chunk-VPU66PI6.mjs';
|
|
8
|
+
import 'react';
|
|
9
|
+
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
10
|
+
|
|
11
|
+
var HiddenVitalsWidget = ({ fieldId }) => {
|
|
12
|
+
const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);
|
|
13
|
+
const { state } = useForm();
|
|
14
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
15
|
+
if (!fieldDef) return null;
|
|
16
|
+
const height = "height" in fieldDef ? fieldDef.height : void 0;
|
|
17
|
+
const theme = getThemeConfig("textarea", fieldDef.theme);
|
|
18
|
+
const wrapperClass = cn(theme?.wrapperClassName ?? "space-y-2", "sr-only");
|
|
19
|
+
const labelClass = theme?.labelClassName;
|
|
20
|
+
const inputClass = cn(theme?.inputClassName, showError && "border-red-500");
|
|
21
|
+
const labelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
22
|
+
fieldDef.label,
|
|
23
|
+
" ",
|
|
24
|
+
/* @__PURE__ */ jsx(FieldRequiredIndicator, { fieldDef })
|
|
25
|
+
] });
|
|
26
|
+
return /* @__PURE__ */ jsxs(
|
|
27
|
+
"div",
|
|
28
|
+
{
|
|
29
|
+
className: fieldWrapperClass(fieldDef, wrapperClass),
|
|
30
|
+
"aria-hidden": "true",
|
|
31
|
+
children: [
|
|
32
|
+
theme ? /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, className: fieldLabelClass(fieldDef, labelClass), children: labelContent }) : /* @__PURE__ */ jsx(Label, { htmlFor: fieldId, className: fieldLabelClass(fieldDef), children: labelContent }),
|
|
33
|
+
/* @__PURE__ */ jsx(
|
|
34
|
+
Textarea,
|
|
35
|
+
{
|
|
36
|
+
id: fieldId,
|
|
37
|
+
value: value ?? "",
|
|
38
|
+
onChange: (e) => setValue(e.target.value),
|
|
39
|
+
onBlur: setTouched,
|
|
40
|
+
disabled,
|
|
41
|
+
className: fieldControlClass(fieldDef, inputClass),
|
|
42
|
+
...height != null && { height }
|
|
43
|
+
}
|
|
44
|
+
),
|
|
45
|
+
showError && /* @__PURE__ */ jsx("p", { className: fieldErrorClass(fieldDef, "text-xs text-red-500"), children: error })
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
);
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export { HiddenVitalsWidget };
|
|
52
|
+
//# sourceMappingURL=HiddenVitalsWidget-JH3NRZLM.mjs.map
|
|
53
|
+
//# sourceMappingURL=HiddenVitalsWidget-JH3NRZLM.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/HiddenVitalsWidget.tsx"],"names":[],"mappings":";;;;;;;;;;AAmBO,IAAM,kBAAA,GAAoD,CAAC,EAAE,OAAA,EAAQ,KAAM;AAChF,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,UAAA,EAAY,OAAO,QAAA,EAAU,OAAA,EAAQ,GAAI,QAAA,CAAS,OAAO,CAAA;AAC5F,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,OAAA,EAAQ;AAE1B,EAAA,MAAM,SAAA,GAAY,CAAC,CAAC,KAAA,KAAU,WAAW,KAAA,CAAM,eAAA,CAAA;AAE/C,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,QAAA,IAAY,QAAA,GAAW,QAAA,CAAS,MAAA,GAAS,MAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,UAAA,EAAY,QAAA,CAAS,KAAK,CAAA;AAEvD,EAAA,MAAM,YAAA,GAAe,EAAA,CAAG,KAAA,EAAO,gBAAA,IAAoB,aAAa,SAAS,CAAA;AACzE,EAAA,MAAM,aAAa,KAAA,EAAO,cAAA;AAC1B,EAAA,MAAM,UAAA,GAAa,EAAA,CAAG,KAAA,EAAO,cAAA,EAAgB,aAAa,gBAAgB,CAAA;AAE1E,EAAA,MAAM,+BACJ,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,IAAA,QAAA,CAAS,KAAA;AAAA,IAAM,GAAA;AAAA,oBAAC,GAAA,CAAC,0BAAuB,QAAA,EAAoB;AAAA,GAAA,EAC/D,CAAA;AAGF,EAAA,uBACE,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,iBAAA,CAAkB,QAAA,EAAU,YAAY,CAAA;AAAA,MACnD,aAAA,EAAY,MAAA;AAAA,MAEX,QAAA,EAAA;AAAA,QAAA,KAAA,uBACE,KAAA,EAAA,EAAM,OAAA,EAAS,SAAS,SAAA,EAAW,eAAA,CAAgB,UAAU,UAAU,CAAA,EACrE,wBACH,CAAA,mBAEA,GAAA,CAAC,SAAM,OAAA,EAAS,OAAA,EAAS,WAAW,eAAA,CAAgB,QAAQ,GACzD,QAAA,EAAA,YAAA,EACH,CAAA;AAAA,wBAEF,GAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI,OAAA;AAAA,YACJ,OAAO,KAAA,IAAS,EAAA;AAAA,YAChB,UAAU,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACxC,MAAA,EAAQ,UAAA;AAAA,YACR,QAAA;AAAA,YACA,SAAA,EAAW,iBAAA,CAAkB,QAAA,EAAU,UAAU,CAAA;AAAA,YAChD,GAAI,MAAA,IAAU,IAAA,IAAQ,EAAE,MAAA;AAAO;AAAA,SAClC;AAAA,QACC,SAAA,wBACE,GAAA,EAAA,EAAE,SAAA,EAAW,gBAAgB,QAAA,EAAU,sBAAsB,GAAI,QAAA,EAAA,KAAA,EAAM;AAAA;AAAA;AAAA,GAE5E;AAEJ","file":"HiddenVitalsWidget-JH3NRZLM.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Textarea } from '../shadcn/textarea';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n} from '../../react/fieldStyle';\n\n/**\n * Hidden Vitals: same as a textarea (styling, behavior, form state) but visually\n * hidden in the UI. State is still saved in the background.\n */\nexport const HiddenVitalsWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef) return null;\n\n const height = 'height' in fieldDef ? fieldDef.height : undefined;\n const theme = getThemeConfig('textarea', fieldDef.theme);\n\n const wrapperClass = cn(theme?.wrapperClassName ?? 'space-y-2', 'sr-only');\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n\n const labelContent = (\n <>\n {fieldDef.label} <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n return (\n <div\n className={fieldWrapperClass(fieldDef, wrapperClass)}\n aria-hidden=\"true\"\n >\n {theme ? (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef, labelClass)}>\n {labelContent}\n </Label>\n ) : (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n )}\n <Textarea\n id={fieldId}\n value={value ?? ''}\n onChange={(e) => setValue(e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n className={fieldControlClass(fieldDef, inputClass)}\n {...(height != null && { height })}\n />\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { useForm } from './chunk-7L2JOWGA.mjs';
|
|
2
|
+
import { useField } from './chunk-ZTT5XJR7.mjs';
|
|
3
|
+
import { cn } from './chunk-VPU66PI6.mjs';
|
|
4
|
+
import 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var EMPTY_GRADES = { NO: 0, NC: 0, C: 0, PSC: 0 };
|
|
8
|
+
var LOCS_FIELDS = [
|
|
9
|
+
{ key: "NO", label: "Nuclear Opalescence", max: 4, hint: "0\u20134" },
|
|
10
|
+
{ key: "NC", label: "Nuclear Colour", max: 4, hint: "0\u20134" },
|
|
11
|
+
{ key: "C", label: "Cortical", max: 4, hint: "0\u20134" },
|
|
12
|
+
{ key: "PSC", label: "Posterior Subcapsular", max: 4, hint: "0\u20134" }
|
|
13
|
+
];
|
|
14
|
+
var LOCS_GRID_STYLE = {
|
|
15
|
+
display: "grid",
|
|
16
|
+
gridTemplateColumns: "minmax(0, 1fr) minmax(5.5rem, auto) minmax(5.5rem, auto)",
|
|
17
|
+
columnGap: "1rem",
|
|
18
|
+
rowGap: "0.5rem",
|
|
19
|
+
alignItems: "center",
|
|
20
|
+
width: "100%",
|
|
21
|
+
minWidth: 0
|
|
22
|
+
};
|
|
23
|
+
function parseGrades(raw) {
|
|
24
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return void 0;
|
|
25
|
+
const r = raw;
|
|
26
|
+
const n = (k) => {
|
|
27
|
+
const v = Number(r[k]);
|
|
28
|
+
return Number.isFinite(v) ? Math.trunc(v) : 0;
|
|
29
|
+
};
|
|
30
|
+
return { NO: n("NO"), NC: n("NC"), C: n("C"), PSC: n("PSC") };
|
|
31
|
+
}
|
|
32
|
+
function clampGrade(v) {
|
|
33
|
+
return Math.max(0, Math.min(4, Math.trunc(v)));
|
|
34
|
+
}
|
|
35
|
+
function parseValue(raw) {
|
|
36
|
+
const locs = {
|
|
37
|
+
OD: { ...EMPTY_GRADES },
|
|
38
|
+
OS: { ...EMPTY_GRADES }
|
|
39
|
+
};
|
|
40
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
41
|
+
const o = raw;
|
|
42
|
+
const locsRaw = o.locs;
|
|
43
|
+
if (locsRaw && typeof locsRaw === "object" && !Array.isArray(locsRaw)) {
|
|
44
|
+
const L = locsRaw;
|
|
45
|
+
const od = parseGrades(L.OD);
|
|
46
|
+
const os = parseGrades(L.OS);
|
|
47
|
+
if (od)
|
|
48
|
+
locs.OD = {
|
|
49
|
+
NO: clampGrade(od.NO),
|
|
50
|
+
NC: clampGrade(od.NC),
|
|
51
|
+
C: clampGrade(od.C),
|
|
52
|
+
PSC: clampGrade(od.PSC)
|
|
53
|
+
};
|
|
54
|
+
if (os)
|
|
55
|
+
locs.OS = {
|
|
56
|
+
NO: clampGrade(os.NO),
|
|
57
|
+
NC: clampGrade(os.NC),
|
|
58
|
+
C: clampGrade(os.C),
|
|
59
|
+
PSC: clampGrade(os.PSC)
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
notes: typeof o.notes === "string" ? o.notes : "",
|
|
64
|
+
assessmentKey: typeof o.assessmentKey === "string" ? o.assessmentKey : void 0,
|
|
65
|
+
locs
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return { notes: "", assessmentKey: void 0, locs };
|
|
69
|
+
}
|
|
70
|
+
function cataractStage(eye, locs) {
|
|
71
|
+
const g = locs[eye];
|
|
72
|
+
const total = g.NO + g.NC + g.C + g.PSC;
|
|
73
|
+
if (total === 0) return "\u2014";
|
|
74
|
+
if (total <= 4) return "Early";
|
|
75
|
+
if (total <= 8) return "Moderate";
|
|
76
|
+
if (total <= 12) return "Advanced";
|
|
77
|
+
return "Hypermature";
|
|
78
|
+
}
|
|
79
|
+
function Stepper({
|
|
80
|
+
value,
|
|
81
|
+
max,
|
|
82
|
+
disabled,
|
|
83
|
+
ariaLabel,
|
|
84
|
+
onChange
|
|
85
|
+
}) {
|
|
86
|
+
return /* @__PURE__ */ jsxs(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: "flex items-center gap-1 justify-self-center",
|
|
90
|
+
role: "group",
|
|
91
|
+
"aria-label": ariaLabel,
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsx(
|
|
94
|
+
"button",
|
|
95
|
+
{
|
|
96
|
+
type: "button",
|
|
97
|
+
disabled,
|
|
98
|
+
onClick: () => onChange(Math.max(0, value - 1)),
|
|
99
|
+
className: "h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
|
|
100
|
+
children: "-"
|
|
101
|
+
}
|
|
102
|
+
),
|
|
103
|
+
/* @__PURE__ */ jsx(
|
|
104
|
+
"input",
|
|
105
|
+
{
|
|
106
|
+
type: "number",
|
|
107
|
+
min: 0,
|
|
108
|
+
max,
|
|
109
|
+
disabled,
|
|
110
|
+
value,
|
|
111
|
+
"aria-label": ariaLabel,
|
|
112
|
+
onChange: (e) => onChange(Math.max(0, Math.min(max, Number(e.target.value) || 0))),
|
|
113
|
+
className: "h-6 w-10 shrink-0 rounded border border-input bg-background px-1 py-0 text-center text-xs disabled:opacity-50"
|
|
114
|
+
}
|
|
115
|
+
),
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
"button",
|
|
118
|
+
{
|
|
119
|
+
type: "button",
|
|
120
|
+
disabled,
|
|
121
|
+
onClick: () => onChange(Math.min(max, value + 1)),
|
|
122
|
+
className: "h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
|
|
123
|
+
children: "+"
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
function StageBadge({ stage }) {
|
|
131
|
+
const cls = {
|
|
132
|
+
Early: "border border-emerald-200 text-foreground",
|
|
133
|
+
Moderate: "border border-amber-200 text-foreground",
|
|
134
|
+
Advanced: "border border-orange-300 text-foreground",
|
|
135
|
+
Hypermature: "border border-destructive text-foreground",
|
|
136
|
+
"\u2014": "border border-border text-muted-foreground"
|
|
137
|
+
};
|
|
138
|
+
return /* @__PURE__ */ jsx(
|
|
139
|
+
"span",
|
|
140
|
+
{
|
|
141
|
+
className: cn(
|
|
142
|
+
"rounded-full bg-background px-2 py-0.5 text-[11px] font-medium",
|
|
143
|
+
cls[stage] ?? "border border-border text-muted-foreground"
|
|
144
|
+
),
|
|
145
|
+
children: stage
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
var DEFAULT_TITLE = "Lens Assessment \u2014 LOCS III";
|
|
150
|
+
var LensAssessmentWidget = ({ fieldId }) => {
|
|
151
|
+
const { fieldDef, value, setValue, error, disabled, touched } = useField(fieldId);
|
|
152
|
+
const { state } = useForm();
|
|
153
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
154
|
+
if (!fieldDef || fieldDef.type !== "lens_assessment") {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
const def = fieldDef;
|
|
158
|
+
const v = parseValue(value);
|
|
159
|
+
const locs = v.locs ?? { OD: { ...EMPTY_GRADES }, OS: { ...EMPTY_GRADES } };
|
|
160
|
+
const title = def.meta?.cardTitle || (def.label?.trim() ? def.label : DEFAULT_TITLE);
|
|
161
|
+
const setPartial = (patch) => {
|
|
162
|
+
setValue({ ...v, ...patch, locs: patch.locs ?? v.locs ?? locs });
|
|
163
|
+
};
|
|
164
|
+
const setLocs = (eye, key, n) => {
|
|
165
|
+
const next = clampGrade(n);
|
|
166
|
+
setPartial({
|
|
167
|
+
locs: {
|
|
168
|
+
...locs,
|
|
169
|
+
[eye]: { ...locs[eye], [key]: next }
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
return /* @__PURE__ */ jsxs(
|
|
174
|
+
"div",
|
|
175
|
+
{
|
|
176
|
+
id: `lens-assessment-${fieldId}`,
|
|
177
|
+
className: "w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-4 text-card-foreground shadow-sm",
|
|
178
|
+
children: [
|
|
179
|
+
/* @__PURE__ */ jsx("h3", { className: "mb-3 text-sm font-semibold text-foreground", children: title }),
|
|
180
|
+
/* @__PURE__ */ jsxs("div", { style: LOCS_GRID_STYLE, children: [
|
|
181
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0", "aria-hidden": true }),
|
|
182
|
+
/* @__PURE__ */ jsx("div", { className: "w-24 justify-self-center text-center text-xs font-semibold", children: "Right Eye" }),
|
|
183
|
+
/* @__PURE__ */ jsx("div", { className: "w-24 justify-self-center text-center text-xs font-semibold", children: "Left Eye" }),
|
|
184
|
+
LOCS_FIELDS.map((f) => /* @__PURE__ */ jsxs("div", { style: { display: "contents" }, children: [
|
|
185
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 text-xs", children: [
|
|
186
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium", children: f.label }),
|
|
187
|
+
/* @__PURE__ */ jsx("div", { className: "text-muted-foreground", children: f.hint })
|
|
188
|
+
] }),
|
|
189
|
+
/* @__PURE__ */ jsx(
|
|
190
|
+
Stepper,
|
|
191
|
+
{
|
|
192
|
+
value: locs.OD[f.key],
|
|
193
|
+
max: f.max,
|
|
194
|
+
disabled,
|
|
195
|
+
ariaLabel: `${f.label} right eye`,
|
|
196
|
+
onChange: (n) => setLocs("OD", f.key, n)
|
|
197
|
+
}
|
|
198
|
+
),
|
|
199
|
+
/* @__PURE__ */ jsx(
|
|
200
|
+
Stepper,
|
|
201
|
+
{
|
|
202
|
+
value: locs.OS[f.key],
|
|
203
|
+
max: f.max,
|
|
204
|
+
disabled,
|
|
205
|
+
ariaLabel: `${f.label} left eye`,
|
|
206
|
+
onChange: (n) => setLocs("OS", f.key, n)
|
|
207
|
+
}
|
|
208
|
+
)
|
|
209
|
+
] }, f.key))
|
|
210
|
+
] }),
|
|
211
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-3 border-t border-border pt-3 text-xs", children: [
|
|
212
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: "Cataract Stage" }),
|
|
213
|
+
" ",
|
|
214
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-1 inline-flex items-center gap-1", children: [
|
|
215
|
+
"OD ",
|
|
216
|
+
/* @__PURE__ */ jsx(StageBadge, { stage: cataractStage("OD", locs) })
|
|
217
|
+
] }),
|
|
218
|
+
/* @__PURE__ */ jsxs("span", { className: "ml-2 inline-flex items-center gap-1", children: [
|
|
219
|
+
"OS ",
|
|
220
|
+
/* @__PURE__ */ jsx(StageBadge, { stage: cataractStage("OS", locs) })
|
|
221
|
+
] })
|
|
222
|
+
] }),
|
|
223
|
+
def.description && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: def.description }),
|
|
224
|
+
showError && /* @__PURE__ */ jsx("p", { className: "mt-2 text-xs text-red-500", children: error })
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
};
|
|
229
|
+
|
|
230
|
+
export { LensAssessmentWidget };
|
|
231
|
+
//# sourceMappingURL=LensAssessmentWidget-7WMULFS2.mjs.map
|
|
232
|
+
//# sourceMappingURL=LensAssessmentWidget-7WMULFS2.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/LensAssessmentWidget.tsx"],"names":[],"mappings":"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","file":"LensAssessmentWidget-7WMULFS2.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type {\n LensAssessmentFieldDef,\n LensAssessmentValue,\n LocsGrades,\n} from '../../core/types';\n\ntype LocsEye = 'OD' | 'OS';\ntype LocsComponentKey = keyof LocsGrades;\n\nconst EMPTY_GRADES: LocsGrades = { NO: 0, NC: 0, C: 0, PSC: 0 };\n\nconst LOCS_FIELDS: {\n key: LocsComponentKey;\n label: string;\n max: number;\n hint: string;\n}[] = [\n { key: 'NO', label: 'Nuclear Opalescence', max: 4, hint: '0–4' },\n { key: 'NC', label: 'Nuclear Colour', max: 4, hint: '0–4' },\n { key: 'C', label: 'Cortical', max: 4, hint: '0–4' },\n { key: 'PSC', label: 'Posterior Subcapsular', max: 4, hint: '0–4' },\n];\n\n/** Inline grid so layout survives Tailwind content scans that omit library bundles. */\nconst LOCS_GRID_STYLE: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(5.5rem, auto) minmax(5.5rem, auto)',\n columnGap: '1rem',\n rowGap: '0.5rem',\n alignItems: 'center',\n width: '100%',\n minWidth: 0,\n};\n\nfunction parseGrades(raw: unknown): LocsGrades | undefined {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const n = (k: LocsComponentKey) => {\n const v = Number(r[k]);\n return Number.isFinite(v) ? Math.trunc(v) : 0;\n };\n return { NO: n('NO'), NC: n('NC'), C: n('C'), PSC: n('PSC') };\n}\n\nfunction clampGrade(v: number): number {\n return Math.max(0, Math.min(4, Math.trunc(v)));\n}\n\nfunction parseValue(raw: unknown): LensAssessmentValue {\n const locs = {\n OD: { ...EMPTY_GRADES },\n OS: { ...EMPTY_GRADES },\n };\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n const locsRaw = o.locs;\n if (locsRaw && typeof locsRaw === 'object' && !Array.isArray(locsRaw)) {\n const L = locsRaw as Record<string, unknown>;\n const od = parseGrades(L.OD);\n const os = parseGrades(L.OS);\n if (od)\n locs.OD = {\n NO: clampGrade(od.NO),\n NC: clampGrade(od.NC),\n C: clampGrade(od.C),\n PSC: clampGrade(od.PSC),\n };\n if (os)\n locs.OS = {\n NO: clampGrade(os.NO),\n NC: clampGrade(os.NC),\n C: clampGrade(os.C),\n PSC: clampGrade(os.PSC),\n };\n }\n return {\n notes: typeof o.notes === 'string' ? o.notes : '',\n assessmentKey: typeof o.assessmentKey === 'string' ? o.assessmentKey : undefined,\n locs,\n };\n }\n return { notes: '', assessmentKey: undefined, locs };\n}\n\nfunction cataractStage(eye: LocsEye, locs: NonNullable<LensAssessmentValue['locs']>): string {\n const g = locs[eye];\n const total = g.NO + g.NC + g.C + g.PSC;\n if (total === 0) return '—';\n if (total <= 4) return 'Early';\n if (total <= 8) return 'Moderate';\n if (total <= 12) return 'Advanced';\n return 'Hypermature';\n}\n\nfunction Stepper({\n value,\n max,\n disabled,\n ariaLabel,\n onChange,\n}: {\n value: number;\n max: number;\n disabled?: boolean;\n ariaLabel: string;\n onChange: (v: number) => void;\n}) {\n return (\n <div\n className=\"flex items-center gap-1 justify-self-center\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange(Math.max(0, value - 1))}\n className=\"h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50\"\n >\n -\n </button>\n <input\n type=\"number\"\n min={0}\n max={max}\n disabled={disabled}\n value={value}\n aria-label={ariaLabel}\n onChange={(e) => onChange(Math.max(0, Math.min(max, Number(e.target.value) || 0)))}\n className=\"h-6 w-10 shrink-0 rounded border border-input bg-background px-1 py-0 text-center text-xs disabled:opacity-50\"\n />\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange(Math.min(max, value + 1))}\n className=\"h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50\"\n >\n +\n </button>\n </div>\n );\n}\n\nfunction StageBadge({ stage }: { stage: string }) {\n const cls: Record<string, string> = {\n Early: 'border border-emerald-200 text-foreground',\n Moderate: 'border border-amber-200 text-foreground',\n Advanced: 'border border-orange-300 text-foreground',\n Hypermature: 'border border-destructive text-foreground',\n '—': 'border border-border text-muted-foreground',\n };\n return (\n <span\n className={cn(\n 'rounded-full bg-background px-2 py-0.5 text-[11px] font-medium',\n cls[stage] ?? 'border border-border text-muted-foreground',\n )}\n >\n {stage}\n </span>\n );\n}\n\nconst DEFAULT_TITLE = 'Lens Assessment — LOCS III';\n\n/**\n * LOCS III lens assessment: OD/OS column steppers and derived cataract-stage badges.\n */\nexport const LensAssessmentWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef || fieldDef.type !== 'lens_assessment') {\n return null;\n }\n\n const def = fieldDef as LensAssessmentFieldDef;\n const v = parseValue(value);\n const locs = v.locs ?? { OD: { ...EMPTY_GRADES }, OS: { ...EMPTY_GRADES } };\n const title =\n (def.meta?.cardTitle as string | undefined) ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const setPartial = (patch: Partial<LensAssessmentValue>) => {\n setValue({ ...v, ...patch, locs: patch.locs ?? v.locs ?? locs });\n };\n\n const setLocs = (eye: LocsEye, key: LocsComponentKey, n: number) => {\n const next = clampGrade(n);\n setPartial({\n locs: {\n ...locs,\n [eye]: { ...locs[eye], [key]: next },\n },\n });\n };\n\n return (\n <div\n id={`lens-assessment-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-4 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-3 text-sm font-semibold text-foreground\">{title}</h3>\n\n <div style={LOCS_GRID_STYLE}>\n <div className=\"min-w-0\" aria-hidden />\n <div className=\"w-24 justify-self-center text-center text-xs font-semibold\">Right Eye</div>\n <div className=\"w-24 justify-self-center text-center text-xs font-semibold\">Left Eye</div>\n {LOCS_FIELDS.map((f) => (\n <div key={f.key} style={{ display: 'contents' }}>\n <div className=\"min-w-0 text-xs\">\n <div className=\"font-medium\">{f.label}</div>\n <div className=\"text-muted-foreground\">{f.hint}</div>\n </div>\n <Stepper\n value={locs.OD[f.key]}\n max={f.max}\n disabled={disabled}\n ariaLabel={`${f.label} right eye`}\n onChange={(n) => setLocs('OD', f.key, n)}\n />\n <Stepper\n value={locs.OS[f.key]}\n max={f.max}\n disabled={disabled}\n ariaLabel={`${f.label} left eye`}\n onChange={(n) => setLocs('OS', f.key, n)}\n />\n </div>\n ))}\n </div>\n\n <div className=\"mt-3 border-t border-border pt-3 text-xs\">\n <span className=\"text-muted-foreground\">Cataract Stage</span>{' '}\n <span className=\"ml-1 inline-flex items-center gap-1\">\n OD <StageBadge stage={cataractStage('OD', locs)} />\n </span>\n <span className=\"ml-2 inline-flex items-center gap-1\">\n OS <StageBadge stage={cataractStage('OS', locs)} />\n </span>\n </div>\n\n {def.description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>\n )}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk6YX37XBM_cjs = require('./chunk-6YX37XBM.cjs');
|
|
4
|
+
var chunkSHQHDSA4_cjs = require('./chunk-SHQHDSA4.cjs');
|
|
5
|
+
var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
|
|
6
|
+
require('react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
var EMPTY_GRADES = { NO: 0, NC: 0, C: 0, PSC: 0 };
|
|
10
|
+
var LOCS_FIELDS = [
|
|
11
|
+
{ key: "NO", label: "Nuclear Opalescence", max: 4, hint: "0\u20134" },
|
|
12
|
+
{ key: "NC", label: "Nuclear Colour", max: 4, hint: "0\u20134" },
|
|
13
|
+
{ key: "C", label: "Cortical", max: 4, hint: "0\u20134" },
|
|
14
|
+
{ key: "PSC", label: "Posterior Subcapsular", max: 4, hint: "0\u20134" }
|
|
15
|
+
];
|
|
16
|
+
var LOCS_GRID_STYLE = {
|
|
17
|
+
display: "grid",
|
|
18
|
+
gridTemplateColumns: "minmax(0, 1fr) minmax(5.5rem, auto) minmax(5.5rem, auto)",
|
|
19
|
+
columnGap: "1rem",
|
|
20
|
+
rowGap: "0.5rem",
|
|
21
|
+
alignItems: "center",
|
|
22
|
+
width: "100%",
|
|
23
|
+
minWidth: 0
|
|
24
|
+
};
|
|
25
|
+
function parseGrades(raw) {
|
|
26
|
+
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return void 0;
|
|
27
|
+
const r = raw;
|
|
28
|
+
const n = (k) => {
|
|
29
|
+
const v = Number(r[k]);
|
|
30
|
+
return Number.isFinite(v) ? Math.trunc(v) : 0;
|
|
31
|
+
};
|
|
32
|
+
return { NO: n("NO"), NC: n("NC"), C: n("C"), PSC: n("PSC") };
|
|
33
|
+
}
|
|
34
|
+
function clampGrade(v) {
|
|
35
|
+
return Math.max(0, Math.min(4, Math.trunc(v)));
|
|
36
|
+
}
|
|
37
|
+
function parseValue(raw) {
|
|
38
|
+
const locs = {
|
|
39
|
+
OD: { ...EMPTY_GRADES },
|
|
40
|
+
OS: { ...EMPTY_GRADES }
|
|
41
|
+
};
|
|
42
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
43
|
+
const o = raw;
|
|
44
|
+
const locsRaw = o.locs;
|
|
45
|
+
if (locsRaw && typeof locsRaw === "object" && !Array.isArray(locsRaw)) {
|
|
46
|
+
const L = locsRaw;
|
|
47
|
+
const od = parseGrades(L.OD);
|
|
48
|
+
const os = parseGrades(L.OS);
|
|
49
|
+
if (od)
|
|
50
|
+
locs.OD = {
|
|
51
|
+
NO: clampGrade(od.NO),
|
|
52
|
+
NC: clampGrade(od.NC),
|
|
53
|
+
C: clampGrade(od.C),
|
|
54
|
+
PSC: clampGrade(od.PSC)
|
|
55
|
+
};
|
|
56
|
+
if (os)
|
|
57
|
+
locs.OS = {
|
|
58
|
+
NO: clampGrade(os.NO),
|
|
59
|
+
NC: clampGrade(os.NC),
|
|
60
|
+
C: clampGrade(os.C),
|
|
61
|
+
PSC: clampGrade(os.PSC)
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
notes: typeof o.notes === "string" ? o.notes : "",
|
|
66
|
+
assessmentKey: typeof o.assessmentKey === "string" ? o.assessmentKey : void 0,
|
|
67
|
+
locs
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
return { notes: "", assessmentKey: void 0, locs };
|
|
71
|
+
}
|
|
72
|
+
function cataractStage(eye, locs) {
|
|
73
|
+
const g = locs[eye];
|
|
74
|
+
const total = g.NO + g.NC + g.C + g.PSC;
|
|
75
|
+
if (total === 0) return "\u2014";
|
|
76
|
+
if (total <= 4) return "Early";
|
|
77
|
+
if (total <= 8) return "Moderate";
|
|
78
|
+
if (total <= 12) return "Advanced";
|
|
79
|
+
return "Hypermature";
|
|
80
|
+
}
|
|
81
|
+
function Stepper({
|
|
82
|
+
value,
|
|
83
|
+
max,
|
|
84
|
+
disabled,
|
|
85
|
+
ariaLabel,
|
|
86
|
+
onChange
|
|
87
|
+
}) {
|
|
88
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
89
|
+
"div",
|
|
90
|
+
{
|
|
91
|
+
className: "flex items-center gap-1 justify-self-center",
|
|
92
|
+
role: "group",
|
|
93
|
+
"aria-label": ariaLabel,
|
|
94
|
+
children: [
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
96
|
+
"button",
|
|
97
|
+
{
|
|
98
|
+
type: "button",
|
|
99
|
+
disabled,
|
|
100
|
+
onClick: () => onChange(Math.max(0, value - 1)),
|
|
101
|
+
className: "h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
|
|
102
|
+
children: "-"
|
|
103
|
+
}
|
|
104
|
+
),
|
|
105
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
106
|
+
"input",
|
|
107
|
+
{
|
|
108
|
+
type: "number",
|
|
109
|
+
min: 0,
|
|
110
|
+
max,
|
|
111
|
+
disabled,
|
|
112
|
+
value,
|
|
113
|
+
"aria-label": ariaLabel,
|
|
114
|
+
onChange: (e) => onChange(Math.max(0, Math.min(max, Number(e.target.value) || 0))),
|
|
115
|
+
className: "h-6 w-10 shrink-0 rounded border border-input bg-background px-1 py-0 text-center text-xs disabled:opacity-50"
|
|
116
|
+
}
|
|
117
|
+
),
|
|
118
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
119
|
+
"button",
|
|
120
|
+
{
|
|
121
|
+
type: "button",
|
|
122
|
+
disabled,
|
|
123
|
+
onClick: () => onChange(Math.min(max, value + 1)),
|
|
124
|
+
className: "h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50",
|
|
125
|
+
children: "+"
|
|
126
|
+
}
|
|
127
|
+
)
|
|
128
|
+
]
|
|
129
|
+
}
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
function StageBadge({ stage }) {
|
|
133
|
+
const cls = {
|
|
134
|
+
Early: "border border-emerald-200 text-foreground",
|
|
135
|
+
Moderate: "border border-amber-200 text-foreground",
|
|
136
|
+
Advanced: "border border-orange-300 text-foreground",
|
|
137
|
+
Hypermature: "border border-destructive text-foreground",
|
|
138
|
+
"\u2014": "border border-border text-muted-foreground"
|
|
139
|
+
};
|
|
140
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
141
|
+
"span",
|
|
142
|
+
{
|
|
143
|
+
className: chunkFHHISVCH_cjs.cn(
|
|
144
|
+
"rounded-full bg-background px-2 py-0.5 text-[11px] font-medium",
|
|
145
|
+
cls[stage] ?? "border border-border text-muted-foreground"
|
|
146
|
+
),
|
|
147
|
+
children: stage
|
|
148
|
+
}
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
var DEFAULT_TITLE = "Lens Assessment \u2014 LOCS III";
|
|
152
|
+
var LensAssessmentWidget = ({ fieldId }) => {
|
|
153
|
+
const { fieldDef, value, setValue, error, disabled, touched } = chunkSHQHDSA4_cjs.useField(fieldId);
|
|
154
|
+
const { state } = chunk6YX37XBM_cjs.useForm();
|
|
155
|
+
const showError = !!error && (touched || state.submitAttempted);
|
|
156
|
+
if (!fieldDef || fieldDef.type !== "lens_assessment") {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
const def = fieldDef;
|
|
160
|
+
const v = parseValue(value);
|
|
161
|
+
const locs = v.locs ?? { OD: { ...EMPTY_GRADES }, OS: { ...EMPTY_GRADES } };
|
|
162
|
+
const title = def.meta?.cardTitle || (def.label?.trim() ? def.label : DEFAULT_TITLE);
|
|
163
|
+
const setPartial = (patch) => {
|
|
164
|
+
setValue({ ...v, ...patch, locs: patch.locs ?? v.locs ?? locs });
|
|
165
|
+
};
|
|
166
|
+
const setLocs = (eye, key, n) => {
|
|
167
|
+
const next = clampGrade(n);
|
|
168
|
+
setPartial({
|
|
169
|
+
locs: {
|
|
170
|
+
...locs,
|
|
171
|
+
[eye]: { ...locs[eye], [key]: next }
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
176
|
+
"div",
|
|
177
|
+
{
|
|
178
|
+
id: `lens-assessment-${fieldId}`,
|
|
179
|
+
className: "w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-4 text-card-foreground shadow-sm",
|
|
180
|
+
children: [
|
|
181
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-3 text-sm font-semibold text-foreground", children: title }),
|
|
182
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: LOCS_GRID_STYLE, children: [
|
|
183
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", "aria-hidden": true }),
|
|
184
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-24 justify-self-center text-center text-xs font-semibold", children: "Right Eye" }),
|
|
185
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-24 justify-self-center text-center text-xs font-semibold", children: "Left Eye" }),
|
|
186
|
+
LOCS_FIELDS.map((f) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "contents" }, children: [
|
|
187
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 text-xs", children: [
|
|
188
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium", children: f.label }),
|
|
189
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-muted-foreground", children: f.hint })
|
|
190
|
+
] }),
|
|
191
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
192
|
+
Stepper,
|
|
193
|
+
{
|
|
194
|
+
value: locs.OD[f.key],
|
|
195
|
+
max: f.max,
|
|
196
|
+
disabled,
|
|
197
|
+
ariaLabel: `${f.label} right eye`,
|
|
198
|
+
onChange: (n) => setLocs("OD", f.key, n)
|
|
199
|
+
}
|
|
200
|
+
),
|
|
201
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
202
|
+
Stepper,
|
|
203
|
+
{
|
|
204
|
+
value: locs.OS[f.key],
|
|
205
|
+
max: f.max,
|
|
206
|
+
disabled,
|
|
207
|
+
ariaLabel: `${f.label} left eye`,
|
|
208
|
+
onChange: (n) => setLocs("OS", f.key, n)
|
|
209
|
+
}
|
|
210
|
+
)
|
|
211
|
+
] }, f.key))
|
|
212
|
+
] }),
|
|
213
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 border-t border-border pt-3 text-xs", children: [
|
|
214
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: "Cataract Stage" }),
|
|
215
|
+
" ",
|
|
216
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-1 inline-flex items-center gap-1", children: [
|
|
217
|
+
"OD ",
|
|
218
|
+
/* @__PURE__ */ jsxRuntime.jsx(StageBadge, { stage: cataractStage("OD", locs) })
|
|
219
|
+
] }),
|
|
220
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-2 inline-flex items-center gap-1", children: [
|
|
221
|
+
"OS ",
|
|
222
|
+
/* @__PURE__ */ jsxRuntime.jsx(StageBadge, { stage: cataractStage("OS", locs) })
|
|
223
|
+
] })
|
|
224
|
+
] }),
|
|
225
|
+
def.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-muted-foreground", children: def.description }),
|
|
226
|
+
showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-red-500", children: error })
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
);
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
exports.LensAssessmentWidget = LensAssessmentWidget;
|
|
233
|
+
//# sourceMappingURL=LensAssessmentWidget-GSOOD7BX.cjs.map
|
|
234
|
+
//# sourceMappingURL=LensAssessmentWidget-GSOOD7BX.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/ui/widgets/LensAssessmentWidget.tsx"],"names":["jsxs","jsx","cn","useField","useForm"],"mappings":"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","file":"LensAssessmentWidget-GSOOD7BX.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type {\n LensAssessmentFieldDef,\n LensAssessmentValue,\n LocsGrades,\n} from '../../core/types';\n\ntype LocsEye = 'OD' | 'OS';\ntype LocsComponentKey = keyof LocsGrades;\n\nconst EMPTY_GRADES: LocsGrades = { NO: 0, NC: 0, C: 0, PSC: 0 };\n\nconst LOCS_FIELDS: {\n key: LocsComponentKey;\n label: string;\n max: number;\n hint: string;\n}[] = [\n { key: 'NO', label: 'Nuclear Opalescence', max: 4, hint: '0–4' },\n { key: 'NC', label: 'Nuclear Colour', max: 4, hint: '0–4' },\n { key: 'C', label: 'Cortical', max: 4, hint: '0–4' },\n { key: 'PSC', label: 'Posterior Subcapsular', max: 4, hint: '0–4' },\n];\n\n/** Inline grid so layout survives Tailwind content scans that omit library bundles. */\nconst LOCS_GRID_STYLE: React.CSSProperties = {\n display: 'grid',\n gridTemplateColumns: 'minmax(0, 1fr) minmax(5.5rem, auto) minmax(5.5rem, auto)',\n columnGap: '1rem',\n rowGap: '0.5rem',\n alignItems: 'center',\n width: '100%',\n minWidth: 0,\n};\n\nfunction parseGrades(raw: unknown): LocsGrades | undefined {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;\n const r = raw as Record<string, unknown>;\n const n = (k: LocsComponentKey) => {\n const v = Number(r[k]);\n return Number.isFinite(v) ? Math.trunc(v) : 0;\n };\n return { NO: n('NO'), NC: n('NC'), C: n('C'), PSC: n('PSC') };\n}\n\nfunction clampGrade(v: number): number {\n return Math.max(0, Math.min(4, Math.trunc(v)));\n}\n\nfunction parseValue(raw: unknown): LensAssessmentValue {\n const locs = {\n OD: { ...EMPTY_GRADES },\n OS: { ...EMPTY_GRADES },\n };\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const o = raw as Record<string, unknown>;\n const locsRaw = o.locs;\n if (locsRaw && typeof locsRaw === 'object' && !Array.isArray(locsRaw)) {\n const L = locsRaw as Record<string, unknown>;\n const od = parseGrades(L.OD);\n const os = parseGrades(L.OS);\n if (od)\n locs.OD = {\n NO: clampGrade(od.NO),\n NC: clampGrade(od.NC),\n C: clampGrade(od.C),\n PSC: clampGrade(od.PSC),\n };\n if (os)\n locs.OS = {\n NO: clampGrade(os.NO),\n NC: clampGrade(os.NC),\n C: clampGrade(os.C),\n PSC: clampGrade(os.PSC),\n };\n }\n return {\n notes: typeof o.notes === 'string' ? o.notes : '',\n assessmentKey: typeof o.assessmentKey === 'string' ? o.assessmentKey : undefined,\n locs,\n };\n }\n return { notes: '', assessmentKey: undefined, locs };\n}\n\nfunction cataractStage(eye: LocsEye, locs: NonNullable<LensAssessmentValue['locs']>): string {\n const g = locs[eye];\n const total = g.NO + g.NC + g.C + g.PSC;\n if (total === 0) return '—';\n if (total <= 4) return 'Early';\n if (total <= 8) return 'Moderate';\n if (total <= 12) return 'Advanced';\n return 'Hypermature';\n}\n\nfunction Stepper({\n value,\n max,\n disabled,\n ariaLabel,\n onChange,\n}: {\n value: number;\n max: number;\n disabled?: boolean;\n ariaLabel: string;\n onChange: (v: number) => void;\n}) {\n return (\n <div\n className=\"flex items-center gap-1 justify-self-center\"\n role=\"group\"\n aria-label={ariaLabel}\n >\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange(Math.max(0, value - 1))}\n className=\"h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50\"\n >\n -\n </button>\n <input\n type=\"number\"\n min={0}\n max={max}\n disabled={disabled}\n value={value}\n aria-label={ariaLabel}\n onChange={(e) => onChange(Math.max(0, Math.min(max, Number(e.target.value) || 0)))}\n className=\"h-6 w-10 shrink-0 rounded border border-input bg-background px-1 py-0 text-center text-xs disabled:opacity-50\"\n />\n <button\n type=\"button\"\n disabled={disabled}\n onClick={() => onChange(Math.min(max, value + 1))}\n className=\"h-6 w-6 shrink-0 rounded border border-input text-xs hover:bg-muted disabled:pointer-events-none disabled:opacity-50\"\n >\n +\n </button>\n </div>\n );\n}\n\nfunction StageBadge({ stage }: { stage: string }) {\n const cls: Record<string, string> = {\n Early: 'border border-emerald-200 text-foreground',\n Moderate: 'border border-amber-200 text-foreground',\n Advanced: 'border border-orange-300 text-foreground',\n Hypermature: 'border border-destructive text-foreground',\n '—': 'border border-border text-muted-foreground',\n };\n return (\n <span\n className={cn(\n 'rounded-full bg-background px-2 py-0.5 text-[11px] font-medium',\n cls[stage] ?? 'border border-border text-muted-foreground',\n )}\n >\n {stage}\n </span>\n );\n}\n\nconst DEFAULT_TITLE = 'Lens Assessment — LOCS III';\n\n/**\n * LOCS III lens assessment: OD/OS column steppers and derived cataract-stage badges.\n */\nexport const LensAssessmentWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef || fieldDef.type !== 'lens_assessment') {\n return null;\n }\n\n const def = fieldDef as LensAssessmentFieldDef;\n const v = parseValue(value);\n const locs = v.locs ?? { OD: { ...EMPTY_GRADES }, OS: { ...EMPTY_GRADES } };\n const title =\n (def.meta?.cardTitle as string | undefined) ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const setPartial = (patch: Partial<LensAssessmentValue>) => {\n setValue({ ...v, ...patch, locs: patch.locs ?? v.locs ?? locs });\n };\n\n const setLocs = (eye: LocsEye, key: LocsComponentKey, n: number) => {\n const next = clampGrade(n);\n setPartial({\n locs: {\n ...locs,\n [eye]: { ...locs[eye], [key]: next },\n },\n });\n };\n\n return (\n <div\n id={`lens-assessment-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-4 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-3 text-sm font-semibold text-foreground\">{title}</h3>\n\n <div style={LOCS_GRID_STYLE}>\n <div className=\"min-w-0\" aria-hidden />\n <div className=\"w-24 justify-self-center text-center text-xs font-semibold\">Right Eye</div>\n <div className=\"w-24 justify-self-center text-center text-xs font-semibold\">Left Eye</div>\n {LOCS_FIELDS.map((f) => (\n <div key={f.key} style={{ display: 'contents' }}>\n <div className=\"min-w-0 text-xs\">\n <div className=\"font-medium\">{f.label}</div>\n <div className=\"text-muted-foreground\">{f.hint}</div>\n </div>\n <Stepper\n value={locs.OD[f.key]}\n max={f.max}\n disabled={disabled}\n ariaLabel={`${f.label} right eye`}\n onChange={(n) => setLocs('OD', f.key, n)}\n />\n <Stepper\n value={locs.OS[f.key]}\n max={f.max}\n disabled={disabled}\n ariaLabel={`${f.label} left eye`}\n onChange={(n) => setLocs('OS', f.key, n)}\n />\n </div>\n ))}\n </div>\n\n <div className=\"mt-3 border-t border-border pt-3 text-xs\">\n <span className=\"text-muted-foreground\">Cataract Stage</span>{' '}\n <span className=\"ml-1 inline-flex items-center gap-1\">\n OD <StageBadge stage={cataractStage('OD', locs)} />\n </span>\n <span className=\"ml-2 inline-flex items-center gap-1\">\n OS <StageBadge stage={cataractStage('OS', locs)} />\n </span>\n </div>\n\n {def.description && (\n <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>\n )}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
|