formanitor 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/dist/{AddInvestigationWidget-RY62UCPM.cjs → AddInvestigationWidget-7FLINCTT.cjs} +7 -7
  2. package/dist/{AddInvestigationWidget-RY62UCPM.cjs.map → AddInvestigationWidget-7FLINCTT.cjs.map} +1 -1
  3. package/dist/{AddInvestigationWidget-7UGZQYI5.mjs → AddInvestigationWidget-FABXZDEZ.mjs} +3 -3
  4. package/dist/{AddInvestigationWidget-7UGZQYI5.mjs.map → AddInvestigationWidget-FABXZDEZ.mjs.map} +1 -1
  5. package/dist/{AddMedicationWidget-WPI32WAP.cjs → AddMedicationWidget-45T4XVEL.cjs} +6 -6
  6. package/dist/{AddMedicationWidget-WPI32WAP.cjs.map → AddMedicationWidget-45T4XVEL.cjs.map} +1 -1
  7. package/dist/{AddMedicationWidget-UG26VMUX.mjs → AddMedicationWidget-B5RXRYBK.mjs} +3 -3
  8. package/dist/{AddMedicationWidget-UG26VMUX.mjs.map → AddMedicationWidget-B5RXRYBK.mjs.map} +1 -1
  9. package/dist/{AddProcedureWidget-SQJUKKMK.mjs → AddProcedureWidget-F74WGSFX.mjs} +3 -3
  10. package/dist/{AddProcedureWidget-SQJUKKMK.mjs.map → AddProcedureWidget-F74WGSFX.mjs.map} +1 -1
  11. package/dist/{AddProcedureWidget-SF6MTRBV.cjs → AddProcedureWidget-HK7UNRXH.cjs} +6 -6
  12. package/dist/{AddProcedureWidget-SF6MTRBV.cjs.map → AddProcedureWidget-HK7UNRXH.cjs.map} +1 -1
  13. package/dist/{BiometryIolWorkupWidget-NL2M7ZAA.mjs → BiometryIolWorkupWidget-5RZP34FF.mjs} +4 -4
  14. package/dist/{BiometryIolWorkupWidget-NL2M7ZAA.mjs.map → BiometryIolWorkupWidget-5RZP34FF.mjs.map} +1 -1
  15. package/dist/{BiometryIolWorkupWidget-I5AJOYB2.cjs → BiometryIolWorkupWidget-FWO3IWTF.cjs} +6 -6
  16. package/dist/{BiometryIolWorkupWidget-I5AJOYB2.cjs.map → BiometryIolWorkupWidget-FWO3IWTF.cjs.map} +1 -1
  17. package/dist/{DateTimeWidget-LFBB6HOP.mjs → DateTimeWidget-3AUBZYYK.mjs} +4 -4
  18. package/dist/{DateTimeWidget-LFBB6HOP.mjs.map → DateTimeWidget-3AUBZYYK.mjs.map} +1 -1
  19. package/dist/{DateTimeWidget-DIDVF2EB.cjs → DateTimeWidget-OS7ER5F6.cjs} +6 -6
  20. package/dist/{DateTimeWidget-DIDVF2EB.cjs.map → DateTimeWidget-OS7ER5F6.cjs.map} +1 -1
  21. package/dist/{DateWidget-4ND5TKP2.mjs → DateWidget-KCTE6N5G.mjs} +4 -4
  22. package/dist/{DateWidget-4ND5TKP2.mjs.map → DateWidget-KCTE6N5G.mjs.map} +1 -1
  23. package/dist/{DateWidget-BCVR5GDK.cjs → DateWidget-UNLX544Z.cjs} +6 -6
  24. package/dist/{DateWidget-BCVR5GDK.cjs.map → DateWidget-UNLX544Z.cjs.map} +1 -1
  25. package/dist/{DiagnosisTextareaWidget-MAOXCXEZ.mjs → DiagnosisTextareaWidget-6UCYCCSB.mjs} +4 -4
  26. package/dist/{DiagnosisTextareaWidget-MAOXCXEZ.mjs.map → DiagnosisTextareaWidget-6UCYCCSB.mjs.map} +1 -1
  27. package/dist/{DiagnosisTextareaWidget-E7OQRUMX.cjs → DiagnosisTextareaWidget-XJ47OZYH.cjs} +7 -7
  28. package/dist/{DiagnosisTextareaWidget-E7OQRUMX.cjs.map → DiagnosisTextareaWidget-XJ47OZYH.cjs.map} +1 -1
  29. package/dist/{DifferentialDiagnosisWidget-LCY2SA2I.mjs → DifferentialDiagnosisWidget-IZEZVW5F.mjs} +3 -3
  30. package/dist/{DifferentialDiagnosisWidget-LCY2SA2I.mjs.map → DifferentialDiagnosisWidget-IZEZVW5F.mjs.map} +1 -1
  31. package/dist/{DifferentialDiagnosisWidget-ANALLNKL.cjs → DifferentialDiagnosisWidget-XESNHNQQ.cjs} +4 -4
  32. package/dist/{DifferentialDiagnosisWidget-ANALLNKL.cjs.map → DifferentialDiagnosisWidget-XESNHNQQ.cjs.map} +1 -1
  33. package/dist/{DischargeMedicationOrdersWidget-GYT35W7J.mjs → DischargeMedicationOrdersWidget-KA3HANHE.mjs} +4 -4
  34. package/dist/{DischargeMedicationOrdersWidget-GYT35W7J.mjs.map → DischargeMedicationOrdersWidget-KA3HANHE.mjs.map} +1 -1
  35. package/dist/{DischargeMedicationOrdersWidget-ILWNZ7VM.cjs → DischargeMedicationOrdersWidget-WRJRYL6F.cjs} +7 -7
  36. package/dist/{DischargeMedicationOrdersWidget-ILWNZ7VM.cjs.map → DischargeMedicationOrdersWidget-WRJRYL6F.cjs.map} +1 -1
  37. package/dist/{EditableTable-VCUNJZEX.cjs → EditableTable-VQ72UEFF.cjs} +4 -4
  38. package/dist/{EditableTable-VCUNJZEX.cjs.map → EditableTable-VQ72UEFF.cjs.map} +1 -1
  39. package/dist/{EditableTable-TGCVUBLO.mjs → EditableTable-XFCPKSUY.mjs} +3 -3
  40. package/dist/{EditableTable-TGCVUBLO.mjs.map → EditableTable-XFCPKSUY.mjs.map} +1 -1
  41. package/dist/{FollowupWidget-F6FRZO4T.mjs → FollowupWidget-BFZ6P2JE.mjs} +3 -3
  42. package/dist/{FollowupWidget-F6FRZO4T.mjs.map → FollowupWidget-BFZ6P2JE.mjs.map} +1 -1
  43. package/dist/{FollowupWidget-NBTOV2ML.cjs → FollowupWidget-MAYTHM2E.cjs} +4 -4
  44. package/dist/{FollowupWidget-NBTOV2ML.cjs.map → FollowupWidget-MAYTHM2E.cjs.map} +1 -1
  45. package/dist/{FunctionalImpairmentScoreWidget-5V5SNLTF.cjs → FunctionalImpairmentScoreWidget-FCA4UKQA.cjs} +6 -6
  46. package/dist/{FunctionalImpairmentScoreWidget-5V5SNLTF.cjs.map → FunctionalImpairmentScoreWidget-FCA4UKQA.cjs.map} +1 -1
  47. package/dist/{FunctionalImpairmentScoreWidget-QKIZE7KT.mjs → FunctionalImpairmentScoreWidget-TKS6KE7K.mjs} +4 -4
  48. package/dist/{FunctionalImpairmentScoreWidget-QKIZE7KT.mjs.map → FunctionalImpairmentScoreWidget-TKS6KE7K.mjs.map} +1 -1
  49. package/dist/{GsExaminationWidget-J4VABGY6.mjs → GsExaminationWidget-ESIEZCP3.mjs} +4 -4
  50. package/dist/{GsExaminationWidget-J4VABGY6.mjs.map → GsExaminationWidget-ESIEZCP3.mjs.map} +1 -1
  51. package/dist/{GsExaminationWidget-57SL4BCI.cjs → GsExaminationWidget-KKE5I5GX.cjs} +10 -10
  52. package/dist/{GsExaminationWidget-57SL4BCI.cjs.map → GsExaminationWidget-KKE5I5GX.cjs.map} +1 -1
  53. package/dist/{GsGradingWidget-3WTLIP33.mjs → GsGradingWidget-HC4MJ4KJ.mjs} +4 -4
  54. package/dist/{GsGradingWidget-3WTLIP33.mjs.map → GsGradingWidget-HC4MJ4KJ.mjs.map} +1 -1
  55. package/dist/{GsGradingWidget-CIXE36HF.cjs → GsGradingWidget-NGCQQVYA.cjs} +12 -12
  56. package/dist/{GsGradingWidget-CIXE36HF.cjs.map → GsGradingWidget-NGCQQVYA.cjs.map} +1 -1
  57. package/dist/{GsSmartHistoryWidget-IOGZ6GNS.mjs → GsSmartHistoryWidget-7HYGDU4O.mjs} +4 -4
  58. package/dist/{GsSmartHistoryWidget-IOGZ6GNS.mjs.map → GsSmartHistoryWidget-7HYGDU4O.mjs.map} +1 -1
  59. package/dist/{GsSmartHistoryWidget-6Q2IIGDG.cjs → GsSmartHistoryWidget-AAB427Q2.cjs} +12 -12
  60. package/dist/{GsSmartHistoryWidget-6Q2IIGDG.cjs.map → GsSmartHistoryWidget-AAB427Q2.cjs.map} +1 -1
  61. package/dist/{HiddenVitalsWidget-HBK7PBPR.cjs → HiddenVitalsWidget-5GFBDDPT.cjs} +6 -6
  62. package/dist/{HiddenVitalsWidget-HBK7PBPR.cjs.map → HiddenVitalsWidget-5GFBDDPT.cjs.map} +1 -1
  63. package/dist/{HiddenVitalsWidget-JH3NRZLM.mjs → HiddenVitalsWidget-CIE3KERT.mjs} +4 -4
  64. package/dist/{HiddenVitalsWidget-JH3NRZLM.mjs.map → HiddenVitalsWidget-CIE3KERT.mjs.map} +1 -1
  65. package/dist/{LensAssessmentWidget-7WMULFS2.mjs → LensAssessmentWidget-B4OMHTOE.mjs} +4 -4
  66. package/dist/{LensAssessmentWidget-7WMULFS2.mjs.map → LensAssessmentWidget-B4OMHTOE.mjs.map} +1 -1
  67. package/dist/{LensAssessmentWidget-GSOOD7BX.cjs → LensAssessmentWidget-SIKJVVAE.cjs} +6 -6
  68. package/dist/{LensAssessmentWidget-GSOOD7BX.cjs.map → LensAssessmentWidget-SIKJVVAE.cjs.map} +1 -1
  69. package/dist/{MarMedicationOrdersWidget-3E6GFOR6.cjs → MarMedicationOrdersWidget-767F65K6.cjs} +7 -7
  70. package/dist/{MarMedicationOrdersWidget-3E6GFOR6.cjs.map → MarMedicationOrdersWidget-767F65K6.cjs.map} +1 -1
  71. package/dist/{MarMedicationOrdersWidget-QZUVSEB5.mjs → MarMedicationOrdersWidget-LG3WOXN7.mjs} +4 -4
  72. package/dist/{MarMedicationOrdersWidget-QZUVSEB5.mjs.map → MarMedicationOrdersWidget-LG3WOXN7.mjs.map} +1 -1
  73. package/dist/{OBGExaminationWidget-POVLALMA.mjs → OBGExaminationWidget-HQKTHSOZ.mjs} +4 -4
  74. package/dist/{OBGExaminationWidget-POVLALMA.mjs.map → OBGExaminationWidget-HQKTHSOZ.mjs.map} +1 -1
  75. package/dist/{OBGExaminationWidget-F2ZNSP2M.cjs → OBGExaminationWidget-MRTGWLXJ.cjs} +11 -11
  76. package/dist/{OBGExaminationWidget-F2ZNSP2M.cjs.map → OBGExaminationWidget-MRTGWLXJ.cjs.map} +1 -1
  77. package/dist/{OBGPathwayWidget-CGT7Q4T2.mjs → OBGPathwayWidget-X67XKRIH.mjs} +5 -5
  78. package/dist/{OBGPathwayWidget-CGT7Q4T2.mjs.map → OBGPathwayWidget-X67XKRIH.mjs.map} +1 -1
  79. package/dist/{OBGPathwayWidget-WCIQENMO.cjs → OBGPathwayWidget-XGN3HEWS.cjs} +17 -17
  80. package/dist/{OBGPathwayWidget-WCIQENMO.cjs.map → OBGPathwayWidget-XGN3HEWS.cjs.map} +1 -1
  81. package/dist/{ObstetricHistoryWidget-XU6R7IPP.cjs → ObstetricHistoryWidget-RP7NY4PV.cjs} +12 -12
  82. package/dist/{ObstetricHistoryWidget-XU6R7IPP.cjs.map → ObstetricHistoryWidget-RP7NY4PV.cjs.map} +1 -1
  83. package/dist/{ObstetricHistoryWidget-EGVLL4X2.mjs → ObstetricHistoryWidget-Z4VAXH3E.mjs} +4 -4
  84. package/dist/{ObstetricHistoryWidget-EGVLL4X2.mjs.map → ObstetricHistoryWidget-Z4VAXH3E.mjs.map} +1 -1
  85. package/dist/{OphthalDiagnosisWidget-G5RCC2QZ.mjs → OphthalDiagnosisWidget-MZYBQTFV.mjs} +3 -3
  86. package/dist/{OphthalDiagnosisWidget-G5RCC2QZ.mjs.map → OphthalDiagnosisWidget-MZYBQTFV.mjs.map} +1 -1
  87. package/dist/{OphthalDiagnosisWidget-OQPTHJ7E.cjs → OphthalDiagnosisWidget-UXXYGKD5.cjs} +4 -4
  88. package/dist/{OphthalDiagnosisWidget-OQPTHJ7E.cjs.map → OphthalDiagnosisWidget-UXXYGKD5.cjs.map} +1 -1
  89. package/dist/{OphthalmologyWidget-RG2AI6WA.mjs → OphthalmologyWidget-27ZN2E3F.mjs} +3 -3
  90. package/dist/{OphthalmologyWidget-RG2AI6WA.mjs.map → OphthalmologyWidget-27ZN2E3F.mjs.map} +1 -1
  91. package/dist/{OphthalmologyWidget-I3BKWOI2.cjs → OphthalmologyWidget-WFSFIHT4.cjs} +4 -4
  92. package/dist/{OphthalmologyWidget-I3BKWOI2.cjs.map → OphthalmologyWidget-WFSFIHT4.cjs.map} +1 -1
  93. package/dist/{OrthopedicExamWidget-M4KKU5RC.cjs → OrthopedicExamWidget-ULZTDFXJ.cjs} +6 -6
  94. package/dist/{OrthopedicExamWidget-M4KKU5RC.cjs.map → OrthopedicExamWidget-ULZTDFXJ.cjs.map} +1 -1
  95. package/dist/{OrthopedicExamWidget-BBZP6NVT.mjs → OrthopedicExamWidget-WM55M3Y4.mjs} +4 -4
  96. package/dist/{OrthopedicExamWidget-BBZP6NVT.mjs.map → OrthopedicExamWidget-WM55M3Y4.mjs.map} +1 -1
  97. package/dist/{PainScaleFlagsWidget-E576R6QB.mjs → PainScaleFlagsWidget-5KN7T4JK.mjs} +4 -4
  98. package/dist/{PainScaleFlagsWidget-E576R6QB.mjs.map → PainScaleFlagsWidget-5KN7T4JK.mjs.map} +1 -1
  99. package/dist/{PainScaleFlagsWidget-QHGESXNE.cjs → PainScaleFlagsWidget-IFA3RCEL.cjs} +8 -8
  100. package/dist/{PainScaleFlagsWidget-QHGESXNE.cjs.map → PainScaleFlagsWidget-IFA3RCEL.cjs.map} +1 -1
  101. package/dist/{ReferralWidget-J2PWYFDT.cjs → ReferralWidget-27VGZCOQ.cjs} +7 -7
  102. package/dist/{ReferralWidget-J2PWYFDT.cjs.map → ReferralWidget-27VGZCOQ.cjs.map} +1 -1
  103. package/dist/{ReferralWidget-UPYWEO5R.mjs → ReferralWidget-GU3JYED2.mjs} +4 -4
  104. package/dist/{ReferralWidget-UPYWEO5R.mjs.map → ReferralWidget-GU3JYED2.mjs.map} +1 -1
  105. package/dist/{RichTextWidget-CRQHNVJR.cjs → RichTextWidget-2KLV65QP.cjs} +7 -7
  106. package/dist/{RichTextWidget-BBCNJPMH.mjs.map → RichTextWidget-2KLV65QP.cjs.map} +1 -1
  107. package/dist/RichTextWidget-ZBX554ZJ.mjs +11 -0
  108. package/dist/{RichTextWidget-CRQHNVJR.cjs.map → RichTextWidget-ZBX554ZJ.mjs.map} +1 -1
  109. package/dist/SmartTextarea-LQDXFCYT.mjs +10 -0
  110. package/dist/{SmartTextarea-DKWV4R6H.cjs.map → SmartTextarea-LQDXFCYT.mjs.map} +1 -1
  111. package/dist/SmartTextarea-WITNRNDU.cjs +19 -0
  112. package/dist/{SmartTextarea-ZTQIW6O2.mjs.map → SmartTextarea-WITNRNDU.cjs.map} +1 -1
  113. package/dist/{SuggestionTextareaWidget-WCTPWW2E.cjs → SuggestionTextareaWidget-DY6M5JPO.cjs} +18 -18
  114. package/dist/{SuggestionTextareaWidget-WCTPWW2E.cjs.map → SuggestionTextareaWidget-DY6M5JPO.cjs.map} +1 -1
  115. package/dist/{SuggestionTextareaWidget-22NR3JWM.mjs → SuggestionTextareaWidget-GQTWCFBG.mjs} +7 -7
  116. package/dist/{SuggestionTextareaWidget-22NR3JWM.mjs.map → SuggestionTextareaWidget-GQTWCFBG.mjs.map} +1 -1
  117. package/dist/{SurgicalRiskFlagsWidget-Q5FTWB3M.cjs → SurgicalRiskFlagsWidget-OJKCZIWJ.cjs} +6 -6
  118. package/dist/{SurgicalRiskFlagsWidget-Q5FTWB3M.cjs.map → SurgicalRiskFlagsWidget-OJKCZIWJ.cjs.map} +1 -1
  119. package/dist/{SurgicalRiskFlagsWidget-WCAHZKKG.mjs → SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs} +4 -4
  120. package/dist/{SurgicalRiskFlagsWidget-WCAHZKKG.mjs.map → SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs.map} +1 -1
  121. package/dist/{UrologyExaminationWidget-JYUGZ5CG.cjs → UrologyExaminationWidget-GQLMV4FB.cjs} +12 -12
  122. package/dist/{UrologyExaminationWidget-JYUGZ5CG.cjs.map → UrologyExaminationWidget-GQLMV4FB.cjs.map} +1 -1
  123. package/dist/{UrologyExaminationWidget-QDTD3FJX.mjs → UrologyExaminationWidget-GRBL2SDG.mjs} +4 -4
  124. package/dist/{UrologyExaminationWidget-QDTD3FJX.mjs.map → UrologyExaminationWidget-GRBL2SDG.mjs.map} +1 -1
  125. package/dist/{UrologyPathwayWidget-TXZQNGP4.cjs → UrologyPathwayWidget-D6EWSOGW.cjs} +7 -7
  126. package/dist/{UrologyPathwayWidget-TXZQNGP4.cjs.map → UrologyPathwayWidget-D6EWSOGW.cjs.map} +1 -1
  127. package/dist/{UrologyPathwayWidget-QTFKUIM7.mjs → UrologyPathwayWidget-PEO5BVQX.mjs} +4 -4
  128. package/dist/{UrologyPathwayWidget-QTFKUIM7.mjs.map → UrologyPathwayWidget-PEO5BVQX.mjs.map} +1 -1
  129. package/dist/{UrologySmartHistoryWidget-PBU4QXQJ.mjs → UrologySmartHistoryWidget-BDKRFBYN.mjs} +4 -4
  130. package/dist/{UrologySmartHistoryWidget-PBU4QXQJ.mjs.map → UrologySmartHistoryWidget-BDKRFBYN.mjs.map} +1 -1
  131. package/dist/{UrologySmartHistoryWidget-53NATEO3.cjs → UrologySmartHistoryWidget-P3KTQE7L.cjs} +15 -15
  132. package/dist/{UrologySmartHistoryWidget-53NATEO3.cjs.map → UrologySmartHistoryWidget-P3KTQE7L.cjs.map} +1 -1
  133. package/dist/{VitalsWidget-BRFUKGNO.mjs → VitalsWidget-63HTXK2M.mjs} +3 -3
  134. package/dist/{VitalsWidget-BRFUKGNO.mjs.map → VitalsWidget-63HTXK2M.mjs.map} +1 -1
  135. package/dist/{VitalsWidget-PDCYXNBM.cjs → VitalsWidget-MS3OOZSW.cjs} +5 -5
  136. package/dist/{VitalsWidget-PDCYXNBM.cjs.map → VitalsWidget-MS3OOZSW.cjs.map} +1 -1
  137. package/dist/{chunk-ZTT5XJR7.mjs → chunk-2BGJZ44Q.mjs} +3 -2
  138. package/dist/chunk-2BGJZ44Q.mjs.map +1 -0
  139. package/dist/{chunk-ULMK3TUI.mjs → chunk-4HDMR2LX.mjs} +3 -3
  140. package/dist/{chunk-ULMK3TUI.mjs.map → chunk-4HDMR2LX.mjs.map} +1 -1
  141. package/dist/{chunk-6YX37XBM.cjs → chunk-7DISRJAB.cjs} +4 -4
  142. package/dist/{chunk-6YX37XBM.cjs.map → chunk-7DISRJAB.cjs.map} +1 -1
  143. package/dist/{chunk-VZT5YNCD.mjs → chunk-MBZRRYJB.mjs} +4 -4
  144. package/dist/{chunk-VZT5YNCD.mjs.map → chunk-MBZRRYJB.mjs.map} +1 -1
  145. package/dist/{chunk-I7TJVWYV.cjs → chunk-ML47UEDU.cjs} +6 -6
  146. package/dist/{chunk-I7TJVWYV.cjs.map → chunk-ML47UEDU.cjs.map} +1 -1
  147. package/dist/{chunk-5I2RC47Y.mjs → chunk-Q3K646K4.mjs} +3 -3
  148. package/dist/{chunk-5I2RC47Y.mjs.map → chunk-Q3K646K4.mjs.map} +1 -1
  149. package/dist/{chunk-GPU5P3FB.cjs → chunk-RZK44P3C.cjs} +7 -7
  150. package/dist/{chunk-GPU5P3FB.cjs.map → chunk-RZK44P3C.cjs.map} +1 -1
  151. package/dist/{chunk-L4CIIT4U.cjs → chunk-T2IKWRV2.cjs} +9 -9
  152. package/dist/{chunk-L4CIIT4U.cjs.map → chunk-T2IKWRV2.cjs.map} +1 -1
  153. package/dist/{chunk-7L2JOWGA.mjs → chunk-T3UHPMFX.mjs} +3 -3
  154. package/dist/{chunk-7L2JOWGA.mjs.map → chunk-T3UHPMFX.mjs.map} +1 -1
  155. package/dist/{chunk-SHQHDSA4.cjs → chunk-TB33A4PD.cjs} +3 -2
  156. package/dist/chunk-TB33A4PD.cjs.map +1 -0
  157. package/dist/{chunk-MQ2JV7HL.cjs → chunk-TVFUWRTE.cjs} +11 -11
  158. package/dist/{chunk-MQ2JV7HL.cjs.map → chunk-TVFUWRTE.cjs.map} +1 -1
  159. package/dist/{chunk-BOBX45NY.cjs → chunk-XIUXYHGG.cjs} +5 -5
  160. package/dist/{chunk-BOBX45NY.cjs.map → chunk-XIUXYHGG.cjs.map} +1 -1
  161. package/dist/{chunk-YHNI5NIX.mjs → chunk-XLCTFYFD.mjs} +5 -5
  162. package/dist/{chunk-YHNI5NIX.mjs.map → chunk-XLCTFYFD.mjs.map} +1 -1
  163. package/dist/{chunk-3KRDT7TX.mjs → chunk-XN2QLBLT.mjs} +5 -5
  164. package/dist/{chunk-3KRDT7TX.mjs.map → chunk-XN2QLBLT.mjs.map} +1 -1
  165. package/dist/index.cjs +109 -107
  166. package/dist/index.cjs.map +1 -1
  167. package/dist/index.d.cts +10 -0
  168. package/dist/index.d.ts +10 -0
  169. package/dist/index.mjs +42 -40
  170. package/dist/index.mjs.map +1 -1
  171. package/dist/rich-text.cjs +5 -5
  172. package/dist/rich-text.mjs +4 -4
  173. package/dist/smart.cjs +5 -5
  174. package/dist/smart.mjs +3 -3
  175. package/package.json +1 -1
  176. package/dist/RichTextWidget-BBCNJPMH.mjs +0 -11
  177. package/dist/SmartTextarea-DKWV4R6H.cjs +0 -19
  178. package/dist/SmartTextarea-ZTQIW6O2.mjs +0 -10
  179. package/dist/chunk-SHQHDSA4.cjs.map +0 -1
  180. package/dist/chunk-ZTT5XJR7.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/widgets/SuggestionTextareaWidget.tsx"],"names":[],"mappings":"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","file":"SuggestionTextareaWidget-22NR3JWM.mjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Textarea } from '../shadcn/textarea';\nimport { getThemeConfig } from '../themes';\nimport { fetchOptions } from '../../core/asyncOptions';\nimport { cn } from '../../core/utils';\nimport type { SelectOption, SuggestionTextareaFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldDescriptionClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\nimport { TextWidget } from './Text';\nimport { SelectWidget } from './Select';\n\nimport { getSuggestionTokensFromText, toggleSuggestionTokenInText } from '../../core/suggestionTokens';\n\nexport { getSuggestionTokensFromText, toggleSuggestionTokenInText };\n\nconst DEFAULT_TOKEN_SEPARATOR = ', ';\n\nfunction getAppendSeparator(def: SuggestionTextareaFieldDef): string {\n const raw = def.meta && typeof (def.meta as { appendSeparator?: unknown }).appendSeparator === 'string'\n ? (def.meta as { appendSeparator: string }).appendSeparator\n : DEFAULT_TOKEN_SEPARATOR;\n return raw;\n}\n\nfunction isTokenSelected(text: string, optionValue: unknown): boolean {\n const t = String(optionValue).trim();\n if (!t) return false;\n return getSuggestionTokensFromText(text).some((p) => p === t);\n}\n\n/**\n * Chip option values present in `text` as comma-separated tokens (same typing as schema `options[].value`).\n * Order follows left-to-right token order; duplicates in text only appear once.\n */\nexport function deriveKnownSuggestionChipValues(text: string, options: SelectOption[]): unknown[] {\n if (!options.length) return [];\n const allowed = new Map<string, unknown>(options.map((o) => [String(o.value), o.value] as const));\n const tokens = getSuggestionTokensFromText(text);\n const out: unknown[] = [];\n const seen = new Set<string>();\n for (const t of tokens) {\n if (!allowed.has(t) || seen.has(t)) continue;\n seen.add(t);\n out.push(allowed.get(t)!);\n }\n return out;\n}\n\nfunction parallelChipArraysEqual(a: unknown, b: unknown): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction isSuggestionField(type: string | undefined): type is SuggestionTextareaFieldDef['type'] {\n return type === 'suggestion_textarea' || type === 'complaint_chips';\n}\n\n/**\n * Renders a sibling schema field inside the suggestion textarea shell. Uses concrete widgets\n * (not FieldRenderer) so `hidden` layout fields still render here without circular imports.\n * Supported: text, number, textarea, select.\n */\nfunction EmbeddedSchemaField({ fieldId }: { fieldId: string }) {\n const store = useFormStore();\n const fieldDef = store.getFieldDef(fieldId);\n if (!fieldDef) return null;\n switch (fieldDef.type) {\n case 'text':\n case 'number':\n case 'textarea':\n return <TextWidget fieldId={fieldId} />;\n case 'select':\n return <SelectWidget fieldId={fieldId} />;\n default:\n return null;\n }\n}\n\n/**\n * Reusable textarea with schema-driven **suggestion chips** inside the input area (same white\n * shell as the textarea). The field value is a **single string**: clicking a chip **appends**\n * that option’s `value` or **removes** it if already selected. When chip options are loaded,\n * slugs are kept on the **last line** (comma + space by default), with prose above separated by\n * a newline. Optional `meta.parallelChipFieldId` mirrors chip selections into a sibling\n * **`multiselect`** array. Free typing is still allowed.\n */\nexport const SuggestionTextareaWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n\n const [options, setOptions] = useState<SelectOption[]>([]);\n const [loading, setLoading] = useState(false);\n const showError = !!error && (touched || state.submitAttempted);\n\n const def =\n fieldDef && isSuggestionField(fieldDef.type) ? (fieldDef as SuggestionTextareaFieldDef) : undefined;\n\n const textValue = value == null || typeof value === 'string' ? value || '' : String(value);\n\n const parallelChipFieldId =\n def?.meta &&\n typeof (def.meta as { parallelChipFieldId?: unknown }).parallelChipFieldId === 'string'\n ? (def.meta as { parallelChipFieldId: string }).parallelChipFieldId.trim()\n : undefined;\n\n const embeddedFieldIds = useMemo(() => {\n const raw = def?.meta && Array.isArray((def.meta as { embeddedFieldIds?: unknown }).embeddedFieldIds)\n ? (def.meta as { embeddedFieldIds: unknown[] }).embeddedFieldIds\n : [];\n return raw\n .filter((id): id is string => typeof id === 'string' && id.trim().length > 0)\n .map((id) => id.trim())\n .filter((id) => store.getFieldDef(id));\n }, [def?.meta, store]);\n\n useEffect(() => {\n if (!def) {\n setOptions([]);\n return;\n }\n if (def.options?.length) {\n setOptions(def.options);\n } else if (def.dataSource) {\n setLoading(true);\n fetchOptions(def.dataSource.source, def.dataSource.params)\n .then((opts) => setOptions(opts as SelectOption[]))\n .finally(() => setLoading(false));\n } else {\n setOptions([]);\n }\n }, [def]);\n\n const chipAllowedSet = useMemo(\n () => new Set(options.map((o) => String(o.value).trim()).filter(Boolean)),\n [options],\n );\n\n useEffect(() => {\n if (!parallelChipFieldId) return;\n const parallelDef = store.getFieldDef(parallelChipFieldId);\n if (!parallelDef || parallelDef.type !== 'multiselect') return;\n const next = deriveKnownSuggestionChipValues(textValue, options);\n const prev = store.getFieldState(parallelChipFieldId).value;\n if (parallelChipArraysEqual(prev, next)) return;\n store.setValues({ [parallelChipFieldId]: next }, { touch: false });\n }, [def, parallelChipFieldId, textValue, options, store]);\n\n if (!def) {\n return null;\n }\n\n const appendSeparator = getAppendSeparator(def);\n const suggestionsAria =\n def.meta && typeof (def.meta as { suggestionsAriaLabel?: string }).suggestionsAriaLabel === 'string'\n ? (def.meta as { suggestionsAriaLabel: string }).suggestionsAriaLabel\n : 'Quick suggestions';\n\n const theme = getThemeConfig('textarea', def.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n const inputWithStyle = fieldControlClass(def, inputClass);\n const height =\n def.height != null\n ? typeof def.height === 'string'\n ? Number(def.height) || undefined\n : def.height\n : undefined;\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n </>\n );\n\n const showLabel = isLabelVisible(def);\n\n const labelEl = showLabel ? (\n theme ? (\n <Label className={fieldLabelClass(def, labelClass)}>{labelContent}</Label>\n ) : (\n <Label className={fieldLabelClass(def)}>{labelContent}</Label>\n )\n ) : null;\n\n const onChipClick = (optValue: unknown) => {\n if (disabled) return;\n setValue(toggleSuggestionTokenInText(textValue, String(optValue), appendSeparator, chipAllowedSet));\n };\n\n const hasSuggestions = options.length > 0;\n const hasEmbedded = embeddedFieldIds.length > 0;\n const hasShell = hasSuggestions || hasEmbedded;\n const isHighlightLabel = def.theme === 'highlight-label';\n\n const suggestionShellClass = cn(\n 'flex min-w-0 flex-col overflow-hidden',\n hasShell &&\n (isHighlightLabel\n ? '-mt-1 rounded-b-md border-[#D0D0D0] bg-white'\n : 'rounded-md border border-input bg-background'),\n );\n\n const chipsRowClass = cn(\n 'flex flex-wrap gap-2 px-3 pb-2 pt-3',\n hasSuggestions &&\n (isHighlightLabel ? '' : 'border-b border-input/70'),\n disabled && 'pointer-events-none opacity-50',\n );\n\n const embeddedRowClass = cn(\n 'grid gap-3 px-3 sm:grid-cols-3',\n hasEmbedded &&\n (hasSuggestions\n ? cn('py-2', isHighlightLabel && 'border-t border-input/70')\n : 'border-b border-input/70 py-3'),\n disabled && 'pointer-events-none opacity-50',\n );\n\n const textareaShellClass = cn(\n inputWithStyle,\n hasShell &&\n cn(\n 'mt-0 rounded-t-none rounded-b-md border-0 shadow-none focus-visible:ring-offset-0',\n isHighlightLabel ? 'border-t-0' : 'min-h-[80px]',\n ),\n );\n\n const suggestionButtons =\n loading ? (\n <span className=\"text-xs text-muted-foreground\">Loading suggestions…</span>\n ) : (\n options.map((opt) => {\n const on = isTokenSelected(textValue, opt.value);\n return (\n <button\n key={String(opt.value)}\n type=\"button\"\n onClick={() => onChipClick(opt.value)}\n className={cn(\n 'inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-muted-foreground/30 bg-background hover:bg-muted/60',\n )}\n >\n {opt.label}\n </button>\n );\n })\n );\n\n return (\n <div className={fieldWrapperClass(def, wrapperClass)}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {labelEl}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : (\n labelEl\n )}\n\n {def.description && (\n <p className={fieldDescriptionClass(def, 'text-xs text-muted-foreground')}>\n {def.description}\n </p>\n )}\n\n {hasShell ? (\n <div className={suggestionShellClass}>\n {hasSuggestions && (\n <div className={chipsRowClass} role=\"group\" aria-label={suggestionsAria}>\n {suggestionButtons}\n </div>\n )}\n {hasEmbedded && (\n <div className={embeddedRowClass}>\n {embeddedFieldIds.map((id) => (\n <EmbeddedSchemaField key={id} fieldId={id} />\n ))}\n </div>\n )}\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) => setValue(e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n className={textareaShellClass}\n placeholder={def.placeholder}\n style={height != null && Number.isFinite(height) ? { minHeight: height } : undefined}\n aria-label={!showLabel ? def.label : undefined}\n />\n </div>\n ) : (\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) => setValue(e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n className={inputWithStyle}\n placeholder={def.placeholder}\n style={height != null && Number.isFinite(height) ? { minHeight: height } : undefined}\n aria-label={!showLabel ? def.label : undefined}\n />\n )}\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n/** @deprecated Use `SuggestionTextareaWidget`. Kept for schema compatibility. */\nexport const ComplaintChipsWidget = SuggestionTextareaWidget;\n"]}
1
+ {"version":3,"sources":["../src/ui/widgets/SuggestionTextareaWidget.tsx"],"names":[],"mappings":"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","file":"SuggestionTextareaWidget-GQTWCFBG.mjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { useFormStore } from '../../react/FormProvider';\nimport { VoiceMicButton } from '../../react/VoiceMicButton';\nimport { Label } from '../shadcn/label';\nimport { Textarea } from '../shadcn/textarea';\nimport { getThemeConfig } from '../themes';\nimport { fetchOptions } from '../../core/asyncOptions';\nimport { cn } from '../../core/utils';\nimport type { SelectOption, SuggestionTextareaFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldDescriptionClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\nimport { TextWidget } from './Text';\nimport { SelectWidget } from './Select';\n\nimport { getSuggestionTokensFromText, toggleSuggestionTokenInText } from '../../core/suggestionTokens';\n\nexport { getSuggestionTokensFromText, toggleSuggestionTokenInText };\n\nconst DEFAULT_TOKEN_SEPARATOR = ', ';\n\nfunction getAppendSeparator(def: SuggestionTextareaFieldDef): string {\n const raw = def.meta && typeof (def.meta as { appendSeparator?: unknown }).appendSeparator === 'string'\n ? (def.meta as { appendSeparator: string }).appendSeparator\n : DEFAULT_TOKEN_SEPARATOR;\n return raw;\n}\n\nfunction isTokenSelected(text: string, optionValue: unknown): boolean {\n const t = String(optionValue).trim();\n if (!t) return false;\n return getSuggestionTokensFromText(text).some((p) => p === t);\n}\n\n/**\n * Chip option values present in `text` as comma-separated tokens (same typing as schema `options[].value`).\n * Order follows left-to-right token order; duplicates in text only appear once.\n */\nexport function deriveKnownSuggestionChipValues(text: string, options: SelectOption[]): unknown[] {\n if (!options.length) return [];\n const allowed = new Map<string, unknown>(options.map((o) => [String(o.value), o.value] as const));\n const tokens = getSuggestionTokensFromText(text);\n const out: unknown[] = [];\n const seen = new Set<string>();\n for (const t of tokens) {\n if (!allowed.has(t) || seen.has(t)) continue;\n seen.add(t);\n out.push(allowed.get(t)!);\n }\n return out;\n}\n\nfunction parallelChipArraysEqual(a: unknown, b: unknown): boolean {\n if (!Array.isArray(a) || !Array.isArray(b)) return false;\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n}\n\nfunction isSuggestionField(type: string | undefined): type is SuggestionTextareaFieldDef['type'] {\n return type === 'suggestion_textarea' || type === 'complaint_chips';\n}\n\n/**\n * Renders a sibling schema field inside the suggestion textarea shell. Uses concrete widgets\n * (not FieldRenderer) so `hidden` layout fields still render here without circular imports.\n * Supported: text, number, textarea, select.\n */\nfunction EmbeddedSchemaField({ fieldId }: { fieldId: string }) {\n const store = useFormStore();\n const fieldDef = store.getFieldDef(fieldId);\n if (!fieldDef) return null;\n switch (fieldDef.type) {\n case 'text':\n case 'number':\n case 'textarea':\n return <TextWidget fieldId={fieldId} />;\n case 'select':\n return <SelectWidget fieldId={fieldId} />;\n default:\n return null;\n }\n}\n\n/**\n * Reusable textarea with schema-driven **suggestion chips** inside the input area (same white\n * shell as the textarea). The field value is a **single string**: clicking a chip **appends**\n * that option’s `value` or **removes** it if already selected. When chip options are loaded,\n * slugs are kept on the **last line** (comma + space by default), with prose above separated by\n * a newline. Optional `meta.parallelChipFieldId` mirrors chip selections into a sibling\n * **`multiselect`** array. Free typing is still allowed.\n */\nexport const SuggestionTextareaWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const { state } = useForm();\n const store = useFormStore();\n const hasVoice = !!(fieldDef?.voice && store.getVoice());\n\n const [options, setOptions] = useState<SelectOption[]>([]);\n const [loading, setLoading] = useState(false);\n const showError = !!error && (touched || state.submitAttempted);\n\n const def =\n fieldDef && isSuggestionField(fieldDef.type) ? (fieldDef as SuggestionTextareaFieldDef) : undefined;\n\n const textValue = value == null || typeof value === 'string' ? value || '' : String(value);\n\n const parallelChipFieldId =\n def?.meta &&\n typeof (def.meta as { parallelChipFieldId?: unknown }).parallelChipFieldId === 'string'\n ? (def.meta as { parallelChipFieldId: string }).parallelChipFieldId.trim()\n : undefined;\n\n const embeddedFieldIds = useMemo(() => {\n const raw = def?.meta && Array.isArray((def.meta as { embeddedFieldIds?: unknown }).embeddedFieldIds)\n ? (def.meta as { embeddedFieldIds: unknown[] }).embeddedFieldIds\n : [];\n return raw\n .filter((id): id is string => typeof id === 'string' && id.trim().length > 0)\n .map((id) => id.trim())\n .filter((id) => store.getFieldDef(id));\n }, [def?.meta, store]);\n\n useEffect(() => {\n if (!def) {\n setOptions([]);\n return;\n }\n if (def.options?.length) {\n setOptions(def.options);\n } else if (def.dataSource) {\n setLoading(true);\n fetchOptions(def.dataSource.source, def.dataSource.params)\n .then((opts) => setOptions(opts as SelectOption[]))\n .finally(() => setLoading(false));\n } else {\n setOptions([]);\n }\n }, [def]);\n\n const chipAllowedSet = useMemo(\n () => new Set(options.map((o) => String(o.value).trim()).filter(Boolean)),\n [options],\n );\n\n useEffect(() => {\n if (!parallelChipFieldId) return;\n const parallelDef = store.getFieldDef(parallelChipFieldId);\n if (!parallelDef || parallelDef.type !== 'multiselect') return;\n const next = deriveKnownSuggestionChipValues(textValue, options);\n const prev = store.getFieldState(parallelChipFieldId).value;\n if (parallelChipArraysEqual(prev, next)) return;\n store.setValues({ [parallelChipFieldId]: next }, { touch: false });\n }, [def, parallelChipFieldId, textValue, options, store]);\n\n if (!def) {\n return null;\n }\n\n const appendSeparator = getAppendSeparator(def);\n const suggestionsAria =\n def.meta && typeof (def.meta as { suggestionsAriaLabel?: string }).suggestionsAriaLabel === 'string'\n ? (def.meta as { suggestionsAriaLabel: string }).suggestionsAriaLabel\n : 'Quick suggestions';\n\n const theme = getThemeConfig('textarea', def.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const inputClass = cn(theme?.inputClassName, showError && 'border-red-500');\n const inputWithStyle = fieldControlClass(def, inputClass);\n const height =\n def.height != null\n ? typeof def.height === 'string'\n ? Number(def.height) || undefined\n : def.height\n : undefined;\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n </>\n );\n\n const showLabel = isLabelVisible(def);\n\n const labelEl = showLabel ? (\n theme ? (\n <Label className={fieldLabelClass(def, labelClass)}>{labelContent}</Label>\n ) : (\n <Label className={fieldLabelClass(def)}>{labelContent}</Label>\n )\n ) : null;\n\n const onChipClick = (optValue: unknown) => {\n if (disabled) return;\n setValue(toggleSuggestionTokenInText(textValue, String(optValue), appendSeparator, chipAllowedSet));\n };\n\n const hasSuggestions = options.length > 0;\n const hasEmbedded = embeddedFieldIds.length > 0;\n const hasShell = hasSuggestions || hasEmbedded;\n const isHighlightLabel = def.theme === 'highlight-label';\n\n const suggestionShellClass = cn(\n 'flex min-w-0 flex-col overflow-hidden',\n hasShell &&\n (isHighlightLabel\n ? '-mt-1 rounded-b-md border-[#D0D0D0] bg-white'\n : 'rounded-md border border-input bg-background'),\n );\n\n const chipsRowClass = cn(\n 'flex flex-wrap gap-2 px-3 pb-2 pt-3',\n hasSuggestions &&\n (isHighlightLabel ? '' : 'border-b border-input/70'),\n disabled && 'pointer-events-none opacity-50',\n );\n\n const embeddedRowClass = cn(\n 'grid gap-3 px-3 sm:grid-cols-3',\n hasEmbedded &&\n (hasSuggestions\n ? cn('py-2', isHighlightLabel && 'border-t border-input/70')\n : 'border-b border-input/70 py-3'),\n disabled && 'pointer-events-none opacity-50',\n );\n\n const textareaShellClass = cn(\n inputWithStyle,\n hasShell &&\n cn(\n 'mt-0 rounded-t-none rounded-b-md border-0 shadow-none focus-visible:ring-offset-0',\n isHighlightLabel ? 'border-t-0' : 'min-h-[80px]',\n ),\n );\n\n const suggestionButtons =\n loading ? (\n <span className=\"text-xs text-muted-foreground\">Loading suggestions…</span>\n ) : (\n options.map((opt) => {\n const on = isTokenSelected(textValue, opt.value);\n return (\n <button\n key={String(opt.value)}\n type=\"button\"\n onClick={() => onChipClick(opt.value)}\n className={cn(\n 'inline-flex min-h-8 items-center rounded-full border px-3 py-1 text-xs font-medium leading-none transition-colors',\n on\n ? 'border-primary bg-primary/10 text-primary'\n : 'border-muted-foreground/30 bg-background hover:bg-muted/60',\n )}\n >\n {opt.label}\n </button>\n );\n })\n );\n\n return (\n <div className={fieldWrapperClass(def, wrapperClass)}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {labelEl}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : (\n labelEl\n )}\n\n {def.description && (\n <p className={fieldDescriptionClass(def, 'text-xs text-muted-foreground')}>\n {def.description}\n </p>\n )}\n\n {hasShell ? (\n <div className={suggestionShellClass}>\n {hasSuggestions && (\n <div className={chipsRowClass} role=\"group\" aria-label={suggestionsAria}>\n {suggestionButtons}\n </div>\n )}\n {hasEmbedded && (\n <div className={embeddedRowClass}>\n {embeddedFieldIds.map((id) => (\n <EmbeddedSchemaField key={id} fieldId={id} />\n ))}\n </div>\n )}\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) => setValue(e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n className={textareaShellClass}\n placeholder={def.placeholder}\n style={height != null && Number.isFinite(height) ? { minHeight: height } : undefined}\n aria-label={!showLabel ? def.label : undefined}\n />\n </div>\n ) : (\n <Textarea\n id={fieldId}\n value={textValue}\n onChange={(e) => setValue(e.target.value)}\n onBlur={setTouched}\n disabled={disabled}\n className={inputWithStyle}\n placeholder={def.placeholder}\n style={height != null && Number.isFinite(height) ? { minHeight: height } : undefined}\n aria-label={!showLabel ? def.label : undefined}\n />\n )}\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n/** @deprecated Use `SuggestionTextareaWidget`. Kept for schema compatibility. */\nexport const ComplaintChipsWidget = SuggestionTextareaWidget;\n"]}
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var chunk6YX37XBM_cjs = require('./chunk-6YX37XBM.cjs');
4
- var chunkSHQHDSA4_cjs = require('./chunk-SHQHDSA4.cjs');
3
+ var chunk7DISRJAB_cjs = require('./chunk-7DISRJAB.cjs');
4
+ var chunkTB33A4PD_cjs = require('./chunk-TB33A4PD.cjs');
5
5
  var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
6
6
  require('react');
7
7
  var jsxRuntime = require('react/jsx-runtime');
@@ -90,8 +90,8 @@ function RiskCol({
90
90
  ] });
91
91
  }
92
92
  var SurgicalRiskFlagsWidget = ({ fieldId }) => {
93
- const { fieldDef, value, setValue, error, disabled, touched } = chunkSHQHDSA4_cjs.useField(fieldId);
94
- const { state } = chunk6YX37XBM_cjs.useForm();
93
+ const { fieldDef, value, setValue, error, disabled, touched } = chunkTB33A4PD_cjs.useField(fieldId);
94
+ const { state } = chunk7DISRJAB_cjs.useForm();
95
95
  const showError = !!error && (touched || state.submitAttempted);
96
96
  if (!fieldDef || fieldDef.type !== "surgical_risk_flags") {
97
97
  return null;
@@ -142,5 +142,5 @@ var SurgicalRiskFlagsWidget = ({ fieldId }) => {
142
142
  };
143
143
 
144
144
  exports.SurgicalRiskFlagsWidget = SurgicalRiskFlagsWidget;
145
- //# sourceMappingURL=SurgicalRiskFlagsWidget-Q5FTWB3M.cjs.map
146
- //# sourceMappingURL=SurgicalRiskFlagsWidget-Q5FTWB3M.cjs.map
145
+ //# sourceMappingURL=SurgicalRiskFlagsWidget-OJKCZIWJ.cjs.map
146
+ //# sourceMappingURL=SurgicalRiskFlagsWidget-OJKCZIWJ.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/widgets/SurgicalRiskFlagsWidget.tsx"],"names":["jsxs","jsx","cn","useField","useForm"],"mappings":"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","file":"SurgicalRiskFlagsWidget-Q5FTWB3M.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type { SurgicalRiskFlagsFieldDef, SurgicalRiskFlagsValue } from '../../core/types';\n\nconst RISKS = [\n 'Small pupil',\n 'Pseudoexfoliation',\n 'Diabetes',\n 'Shallow AC',\n 'Previous ocular surgery',\n 'Zonular weakness',\n 'Mature/white cataract',\n] as const;\n\ntype Eye = 'OD' | 'OS';\n\nconst DIABETES = 'Diabetes';\n\nfunction parseValue(raw: unknown): SurgicalRiskFlagsValue {\n const empty: SurgicalRiskFlagsValue = { OD: [], OS: [] };\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return empty;\n const o = raw as Record<string, unknown>;\n const arr = (x: unknown): string[] =>\n Array.isArray(x) ? x.filter((i): i is string => typeof i === 'string') : [];\n let OD = arr(o.OD);\n let OS = arr(o.OS);\n const odD = OD.includes(DIABETES);\n const osD = OS.includes(DIABETES);\n if (odD !== osD) {\n if (odD && !osD) OS = [...OS, DIABETES];\n else if (osD && !odD) OD = [...OD, DIABETES];\n }\n return { OD, OS };\n}\n\n/** Heuristic tier from number of flags checked for that eye. */\nfunction riskTierForCount(n: number): 'High' | 'Moderate' | 'Low' {\n if (n === 0) return 'Low';\n if (n <= 2) return 'Moderate';\n return 'High';\n}\n\nfunction tierBadgeClass(tier: 'High' | 'Moderate' | 'Low'): string {\n if (tier === 'High') return 'bg-red-600 text-white';\n if (tier === 'Moderate') return 'bg-amber-500 text-white';\n return 'bg-emerald-600 text-white';\n}\n\nconst DEFAULT_TITLE = 'Surgical Risk Flags (Stage 11)';\n\nfunction RiskCol({\n eye,\n value,\n disabled,\n onToggle,\n}: {\n eye: Eye;\n value: SurgicalRiskFlagsValue;\n disabled?: boolean;\n onToggle: (eye: Eye, risk: string) => void;\n}) {\n const selected = new Set(value[eye]);\n const tier = riskTierForCount(selected.size);\n\n return (\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-xs font-semibold text-foreground\">\n {eye === 'OD' ? 'Right Eye (OD)' : 'Left Eye (OS)'}\n </div>\n <span\n className={cn(\n 'whitespace-nowrap rounded-full px-2 py-0.5 text-[11px] font-medium',\n tierBadgeClass(tier),\n )}\n >\n {tier} risk\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {RISKS.map((r) => (\n <label\n key={r}\n className=\"flex cursor-pointer items-center gap-2 rounded px-2 py-1 text-xs hover:bg-muted/50\"\n >\n <input\n type=\"checkbox\"\n className=\"shrink-0\"\n checked={selected.has(r)}\n disabled={disabled}\n onChange={() => onToggle(eye, r)}\n />\n <span>{r}</span>\n </label>\n ))}\n </div>\n </div>\n );\n}\n\nexport const SurgicalRiskFlagsWidget: 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 !== 'surgical_risk_flags') {\n return null;\n }\n\n const def = fieldDef as SurgicalRiskFlagsFieldDef;\n const v = parseValue(value);\n const title =\n (def.meta?.cardTitle as string | undefined)?.trim() ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const toggleRisk = (eye: Eye, risk: string) => {\n const next: SurgicalRiskFlagsValue = {\n OD: [...v.OD],\n OS: [...v.OS],\n };\n\n if (risk === DIABETES) {\n const had = next.OD.includes(DIABETES) || next.OS.includes(DIABETES);\n if (had) {\n next.OD = next.OD.filter((x) => x !== DIABETES);\n next.OS = next.OS.filter((x) => x !== DIABETES);\n } else {\n if (!next.OD.includes(DIABETES)) next.OD.push(DIABETES);\n if (!next.OS.includes(DIABETES)) next.OS.push(DIABETES);\n }\n setValue(next);\n return;\n }\n\n const list = next[eye];\n const i = list.indexOf(risk);\n if (i === -1) list.push(risk);\n else list.splice(i, 1);\n setValue(next);\n };\n\n return (\n <div\n id={`surgical-risk-flags-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-3 text-sm font-semibold leading-tight text-foreground\">{title}</h3>\n\n <div className=\"flex gap-6\">\n <RiskCol eye=\"OD\" value={v} disabled={disabled} onToggle={toggleRisk} />\n <div className=\"w-px shrink-0 bg-border\" aria-hidden />\n <RiskCol eye=\"OS\" value={v} disabled={disabled} onToggle={toggleRisk} />\n </div>\n\n {def.description && <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ui/widgets/SurgicalRiskFlagsWidget.tsx"],"names":["jsxs","jsx","cn","useField","useForm"],"mappings":"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","file":"SurgicalRiskFlagsWidget-OJKCZIWJ.cjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type { SurgicalRiskFlagsFieldDef, SurgicalRiskFlagsValue } from '../../core/types';\n\nconst RISKS = [\n 'Small pupil',\n 'Pseudoexfoliation',\n 'Diabetes',\n 'Shallow AC',\n 'Previous ocular surgery',\n 'Zonular weakness',\n 'Mature/white cataract',\n] as const;\n\ntype Eye = 'OD' | 'OS';\n\nconst DIABETES = 'Diabetes';\n\nfunction parseValue(raw: unknown): SurgicalRiskFlagsValue {\n const empty: SurgicalRiskFlagsValue = { OD: [], OS: [] };\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return empty;\n const o = raw as Record<string, unknown>;\n const arr = (x: unknown): string[] =>\n Array.isArray(x) ? x.filter((i): i is string => typeof i === 'string') : [];\n let OD = arr(o.OD);\n let OS = arr(o.OS);\n const odD = OD.includes(DIABETES);\n const osD = OS.includes(DIABETES);\n if (odD !== osD) {\n if (odD && !osD) OS = [...OS, DIABETES];\n else if (osD && !odD) OD = [...OD, DIABETES];\n }\n return { OD, OS };\n}\n\n/** Heuristic tier from number of flags checked for that eye. */\nfunction riskTierForCount(n: number): 'High' | 'Moderate' | 'Low' {\n if (n === 0) return 'Low';\n if (n <= 2) return 'Moderate';\n return 'High';\n}\n\nfunction tierBadgeClass(tier: 'High' | 'Moderate' | 'Low'): string {\n if (tier === 'High') return 'bg-red-600 text-white';\n if (tier === 'Moderate') return 'bg-amber-500 text-white';\n return 'bg-emerald-600 text-white';\n}\n\nconst DEFAULT_TITLE = 'Surgical Risk Flags (Stage 11)';\n\nfunction RiskCol({\n eye,\n value,\n disabled,\n onToggle,\n}: {\n eye: Eye;\n value: SurgicalRiskFlagsValue;\n disabled?: boolean;\n onToggle: (eye: Eye, risk: string) => void;\n}) {\n const selected = new Set(value[eye]);\n const tier = riskTierForCount(selected.size);\n\n return (\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-xs font-semibold text-foreground\">\n {eye === 'OD' ? 'Right Eye (OD)' : 'Left Eye (OS)'}\n </div>\n <span\n className={cn(\n 'whitespace-nowrap rounded-full px-2 py-0.5 text-[11px] font-medium',\n tierBadgeClass(tier),\n )}\n >\n {tier} risk\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {RISKS.map((r) => (\n <label\n key={r}\n className=\"flex cursor-pointer items-center gap-2 rounded px-2 py-1 text-xs hover:bg-muted/50\"\n >\n <input\n type=\"checkbox\"\n className=\"shrink-0\"\n checked={selected.has(r)}\n disabled={disabled}\n onChange={() => onToggle(eye, r)}\n />\n <span>{r}</span>\n </label>\n ))}\n </div>\n </div>\n );\n}\n\nexport const SurgicalRiskFlagsWidget: 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 !== 'surgical_risk_flags') {\n return null;\n }\n\n const def = fieldDef as SurgicalRiskFlagsFieldDef;\n const v = parseValue(value);\n const title =\n (def.meta?.cardTitle as string | undefined)?.trim() ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const toggleRisk = (eye: Eye, risk: string) => {\n const next: SurgicalRiskFlagsValue = {\n OD: [...v.OD],\n OS: [...v.OS],\n };\n\n if (risk === DIABETES) {\n const had = next.OD.includes(DIABETES) || next.OS.includes(DIABETES);\n if (had) {\n next.OD = next.OD.filter((x) => x !== DIABETES);\n next.OS = next.OS.filter((x) => x !== DIABETES);\n } else {\n if (!next.OD.includes(DIABETES)) next.OD.push(DIABETES);\n if (!next.OS.includes(DIABETES)) next.OS.push(DIABETES);\n }\n setValue(next);\n return;\n }\n\n const list = next[eye];\n const i = list.indexOf(risk);\n if (i === -1) list.push(risk);\n else list.splice(i, 1);\n setValue(next);\n };\n\n return (\n <div\n id={`surgical-risk-flags-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-3 text-sm font-semibold leading-tight text-foreground\">{title}</h3>\n\n <div className=\"flex gap-6\">\n <RiskCol eye=\"OD\" value={v} disabled={disabled} onToggle={toggleRisk} />\n <div className=\"w-px shrink-0 bg-border\" aria-hidden />\n <RiskCol eye=\"OS\" value={v} disabled={disabled} onToggle={toggleRisk} />\n </div>\n\n {def.description && <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
- import { useForm } from './chunk-7L2JOWGA.mjs';
2
- import { useField } from './chunk-ZTT5XJR7.mjs';
1
+ import { useForm } from './chunk-T3UHPMFX.mjs';
2
+ import { useField } from './chunk-2BGJZ44Q.mjs';
3
3
  import { cn } from './chunk-VPU66PI6.mjs';
4
4
  import 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -140,5 +140,5 @@ var SurgicalRiskFlagsWidget = ({ fieldId }) => {
140
140
  };
141
141
 
142
142
  export { SurgicalRiskFlagsWidget };
143
- //# sourceMappingURL=SurgicalRiskFlagsWidget-WCAHZKKG.mjs.map
144
- //# sourceMappingURL=SurgicalRiskFlagsWidget-WCAHZKKG.mjs.map
143
+ //# sourceMappingURL=SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs.map
144
+ //# sourceMappingURL=SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/widgets/SurgicalRiskFlagsWidget.tsx"],"names":[],"mappings":"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","file":"SurgicalRiskFlagsWidget-WCAHZKKG.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type { SurgicalRiskFlagsFieldDef, SurgicalRiskFlagsValue } from '../../core/types';\n\nconst RISKS = [\n 'Small pupil',\n 'Pseudoexfoliation',\n 'Diabetes',\n 'Shallow AC',\n 'Previous ocular surgery',\n 'Zonular weakness',\n 'Mature/white cataract',\n] as const;\n\ntype Eye = 'OD' | 'OS';\n\nconst DIABETES = 'Diabetes';\n\nfunction parseValue(raw: unknown): SurgicalRiskFlagsValue {\n const empty: SurgicalRiskFlagsValue = { OD: [], OS: [] };\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return empty;\n const o = raw as Record<string, unknown>;\n const arr = (x: unknown): string[] =>\n Array.isArray(x) ? x.filter((i): i is string => typeof i === 'string') : [];\n let OD = arr(o.OD);\n let OS = arr(o.OS);\n const odD = OD.includes(DIABETES);\n const osD = OS.includes(DIABETES);\n if (odD !== osD) {\n if (odD && !osD) OS = [...OS, DIABETES];\n else if (osD && !odD) OD = [...OD, DIABETES];\n }\n return { OD, OS };\n}\n\n/** Heuristic tier from number of flags checked for that eye. */\nfunction riskTierForCount(n: number): 'High' | 'Moderate' | 'Low' {\n if (n === 0) return 'Low';\n if (n <= 2) return 'Moderate';\n return 'High';\n}\n\nfunction tierBadgeClass(tier: 'High' | 'Moderate' | 'Low'): string {\n if (tier === 'High') return 'bg-red-600 text-white';\n if (tier === 'Moderate') return 'bg-amber-500 text-white';\n return 'bg-emerald-600 text-white';\n}\n\nconst DEFAULT_TITLE = 'Surgical Risk Flags (Stage 11)';\n\nfunction RiskCol({\n eye,\n value,\n disabled,\n onToggle,\n}: {\n eye: Eye;\n value: SurgicalRiskFlagsValue;\n disabled?: boolean;\n onToggle: (eye: Eye, risk: string) => void;\n}) {\n const selected = new Set(value[eye]);\n const tier = riskTierForCount(selected.size);\n\n return (\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-xs font-semibold text-foreground\">\n {eye === 'OD' ? 'Right Eye (OD)' : 'Left Eye (OS)'}\n </div>\n <span\n className={cn(\n 'whitespace-nowrap rounded-full px-2 py-0.5 text-[11px] font-medium',\n tierBadgeClass(tier),\n )}\n >\n {tier} risk\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {RISKS.map((r) => (\n <label\n key={r}\n className=\"flex cursor-pointer items-center gap-2 rounded px-2 py-1 text-xs hover:bg-muted/50\"\n >\n <input\n type=\"checkbox\"\n className=\"shrink-0\"\n checked={selected.has(r)}\n disabled={disabled}\n onChange={() => onToggle(eye, r)}\n />\n <span>{r}</span>\n </label>\n ))}\n </div>\n </div>\n );\n}\n\nexport const SurgicalRiskFlagsWidget: 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 !== 'surgical_risk_flags') {\n return null;\n }\n\n const def = fieldDef as SurgicalRiskFlagsFieldDef;\n const v = parseValue(value);\n const title =\n (def.meta?.cardTitle as string | undefined)?.trim() ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const toggleRisk = (eye: Eye, risk: string) => {\n const next: SurgicalRiskFlagsValue = {\n OD: [...v.OD],\n OS: [...v.OS],\n };\n\n if (risk === DIABETES) {\n const had = next.OD.includes(DIABETES) || next.OS.includes(DIABETES);\n if (had) {\n next.OD = next.OD.filter((x) => x !== DIABETES);\n next.OS = next.OS.filter((x) => x !== DIABETES);\n } else {\n if (!next.OD.includes(DIABETES)) next.OD.push(DIABETES);\n if (!next.OS.includes(DIABETES)) next.OS.push(DIABETES);\n }\n setValue(next);\n return;\n }\n\n const list = next[eye];\n const i = list.indexOf(risk);\n if (i === -1) list.push(risk);\n else list.splice(i, 1);\n setValue(next);\n };\n\n return (\n <div\n id={`surgical-risk-flags-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-3 text-sm font-semibold leading-tight text-foreground\">{title}</h3>\n\n <div className=\"flex gap-6\">\n <RiskCol eye=\"OD\" value={v} disabled={disabled} onToggle={toggleRisk} />\n <div className=\"w-px shrink-0 bg-border\" aria-hidden />\n <RiskCol eye=\"OS\" value={v} disabled={disabled} onToggle={toggleRisk} />\n </div>\n\n {def.description && <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ui/widgets/SurgicalRiskFlagsWidget.tsx"],"names":[],"mappings":"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","file":"SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs","sourcesContent":["import React from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { cn } from '../../core/utils';\nimport type { SurgicalRiskFlagsFieldDef, SurgicalRiskFlagsValue } from '../../core/types';\n\nconst RISKS = [\n 'Small pupil',\n 'Pseudoexfoliation',\n 'Diabetes',\n 'Shallow AC',\n 'Previous ocular surgery',\n 'Zonular weakness',\n 'Mature/white cataract',\n] as const;\n\ntype Eye = 'OD' | 'OS';\n\nconst DIABETES = 'Diabetes';\n\nfunction parseValue(raw: unknown): SurgicalRiskFlagsValue {\n const empty: SurgicalRiskFlagsValue = { OD: [], OS: [] };\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return empty;\n const o = raw as Record<string, unknown>;\n const arr = (x: unknown): string[] =>\n Array.isArray(x) ? x.filter((i): i is string => typeof i === 'string') : [];\n let OD = arr(o.OD);\n let OS = arr(o.OS);\n const odD = OD.includes(DIABETES);\n const osD = OS.includes(DIABETES);\n if (odD !== osD) {\n if (odD && !osD) OS = [...OS, DIABETES];\n else if (osD && !odD) OD = [...OD, DIABETES];\n }\n return { OD, OS };\n}\n\n/** Heuristic tier from number of flags checked for that eye. */\nfunction riskTierForCount(n: number): 'High' | 'Moderate' | 'Low' {\n if (n === 0) return 'Low';\n if (n <= 2) return 'Moderate';\n return 'High';\n}\n\nfunction tierBadgeClass(tier: 'High' | 'Moderate' | 'Low'): string {\n if (tier === 'High') return 'bg-red-600 text-white';\n if (tier === 'Moderate') return 'bg-amber-500 text-white';\n return 'bg-emerald-600 text-white';\n}\n\nconst DEFAULT_TITLE = 'Surgical Risk Flags (Stage 11)';\n\nfunction RiskCol({\n eye,\n value,\n disabled,\n onToggle,\n}: {\n eye: Eye;\n value: SurgicalRiskFlagsValue;\n disabled?: boolean;\n onToggle: (eye: Eye, risk: string) => void;\n}) {\n const selected = new Set(value[eye]);\n const tier = riskTierForCount(selected.size);\n\n return (\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <div className=\"text-xs font-semibold text-foreground\">\n {eye === 'OD' ? 'Right Eye (OD)' : 'Left Eye (OS)'}\n </div>\n <span\n className={cn(\n 'whitespace-nowrap rounded-full px-2 py-0.5 text-[11px] font-medium',\n tierBadgeClass(tier),\n )}\n >\n {tier} risk\n </span>\n </div>\n <div className=\"space-y-1.5\">\n {RISKS.map((r) => (\n <label\n key={r}\n className=\"flex cursor-pointer items-center gap-2 rounded px-2 py-1 text-xs hover:bg-muted/50\"\n >\n <input\n type=\"checkbox\"\n className=\"shrink-0\"\n checked={selected.has(r)}\n disabled={disabled}\n onChange={() => onToggle(eye, r)}\n />\n <span>{r}</span>\n </label>\n ))}\n </div>\n </div>\n );\n}\n\nexport const SurgicalRiskFlagsWidget: 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 !== 'surgical_risk_flags') {\n return null;\n }\n\n const def = fieldDef as SurgicalRiskFlagsFieldDef;\n const v = parseValue(value);\n const title =\n (def.meta?.cardTitle as string | undefined)?.trim() ||\n (def.label?.trim() ? def.label : DEFAULT_TITLE);\n\n const toggleRisk = (eye: Eye, risk: string) => {\n const next: SurgicalRiskFlagsValue = {\n OD: [...v.OD],\n OS: [...v.OS],\n };\n\n if (risk === DIABETES) {\n const had = next.OD.includes(DIABETES) || next.OS.includes(DIABETES);\n if (had) {\n next.OD = next.OD.filter((x) => x !== DIABETES);\n next.OS = next.OS.filter((x) => x !== DIABETES);\n } else {\n if (!next.OD.includes(DIABETES)) next.OD.push(DIABETES);\n if (!next.OS.includes(DIABETES)) next.OS.push(DIABETES);\n }\n setValue(next);\n return;\n }\n\n const list = next[eye];\n const i = list.indexOf(risk);\n if (i === -1) list.push(risk);\n else list.splice(i, 1);\n setValue(next);\n };\n\n return (\n <div\n id={`surgical-risk-flags-${fieldId}`}\n className=\"w-full min-w-0 max-w-full rounded-lg border border-border bg-card p-3 text-card-foreground shadow-sm\"\n >\n <h3 className=\"mb-3 text-sm font-semibold leading-tight text-foreground\">{title}</h3>\n\n <div className=\"flex gap-6\">\n <RiskCol eye=\"OD\" value={v} disabled={disabled} onToggle={toggleRisk} />\n <div className=\"w-px shrink-0 bg-border\" aria-hidden />\n <RiskCol eye=\"OS\" value={v} disabled={disabled} onToggle={toggleRisk} />\n </div>\n\n {def.description && <p className=\"mt-2 text-xs text-muted-foreground\">{def.description}</p>}\n\n {showError && <p className=\"mt-2 text-xs text-red-500\">{error}</p>}\n </div>\n );\n};\n"]}
@@ -4,11 +4,11 @@ var chunkPZBJYPWW_cjs = require('./chunk-PZBJYPWW.cjs');
4
4
  var chunkPHADAQSH_cjs = require('./chunk-PHADAQSH.cjs');
5
5
  var chunkP62377LB_cjs = require('./chunk-P62377LB.cjs');
6
6
  var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
7
- var chunk6YX37XBM_cjs = require('./chunk-6YX37XBM.cjs');
7
+ var chunk7DISRJAB_cjs = require('./chunk-7DISRJAB.cjs');
8
8
  var chunkTJHG5WHX_cjs = require('./chunk-TJHG5WHX.cjs');
9
9
  var chunk4KSZUIJE_cjs = require('./chunk-4KSZUIJE.cjs');
10
10
  var chunkO3VQBPEW_cjs = require('./chunk-O3VQBPEW.cjs');
11
- var chunkSHQHDSA4_cjs = require('./chunk-SHQHDSA4.cjs');
11
+ var chunkTB33A4PD_cjs = require('./chunk-TB33A4PD.cjs');
12
12
  var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
13
13
  var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
14
14
  var react = require('react');
@@ -44,16 +44,16 @@ var GU_ROWS = [
44
44
  var DRE_CONSISTENCY = ["none", "Soft (benign)", "Firm", "Hard / nodular (malignancy?)"];
45
45
  var DRE_SULCUS = ["none", "Preserved", "Obliterated"];
46
46
  var UrologyExaminationWidget = ({ fieldId }) => {
47
- const { fieldDef, value, setValue, setTouched, error, touched, disabled } = chunkSHQHDSA4_cjs.useField(fieldId);
48
- const clinicalField = chunkSHQHDSA4_cjs.useField(URO_CLINICAL_EXAMINATION_FIELD);
49
- const { state } = chunk6YX37XBM_cjs.useForm();
47
+ const { fieldDef, value, setValue, setTouched, error, touched, disabled } = chunkTB33A4PD_cjs.useField(fieldId);
48
+ const clinicalField = chunkTB33A4PD_cjs.useField(URO_CLINICAL_EXAMINATION_FIELD);
49
+ const { state } = chunk7DISRJAB_cjs.useForm();
50
50
  const showError = !!error && (touched || state.submitAttempted);
51
- const safe = react.useMemo(() => chunkSHQHDSA4_cjs.normalizeUrologyExamination(value), [value]);
51
+ const safe = react.useMemo(() => chunkTB33A4PD_cjs.normalizeUrologyExamination(value), [value]);
52
52
  const [clinicalNarrativeLocked, setClinicalNarrativeLocked] = react.useState(false);
53
53
  react.useEffect(() => {
54
54
  if (clinicalNarrativeLocked || disabled) return;
55
- const norm = chunkSHQHDSA4_cjs.normalizeUrologyExamination(value);
56
- const next = chunkSHQHDSA4_cjs.formatUrologyExaminationToClinicalExamination(norm);
55
+ const norm = chunkTB33A4PD_cjs.normalizeUrologyExamination(value);
56
+ const next = chunkTB33A4PD_cjs.formatUrologyExaminationToClinicalExamination(norm);
57
57
  clinicalField.setValue(next);
58
58
  if (norm.examinationNotes !== next) {
59
59
  setValue({ ...norm, examinationNotes: next });
@@ -236,8 +236,8 @@ var UrologyExaminationWidget = ({ fieldId }) => {
236
236
  disabled: disabled || clinicalField.disabled,
237
237
  onClick: () => {
238
238
  setClinicalNarrativeLocked(false);
239
- const norm = chunkSHQHDSA4_cjs.normalizeUrologyExamination(value);
240
- clinicalField.setValue(chunkSHQHDSA4_cjs.formatUrologyExaminationToClinicalExamination(norm));
239
+ const norm = chunkTB33A4PD_cjs.normalizeUrologyExamination(value);
240
+ clinicalField.setValue(chunkTB33A4PD_cjs.formatUrologyExaminationToClinicalExamination(norm));
241
241
  },
242
242
  children: "Regenerate"
243
243
  }
@@ -269,5 +269,5 @@ var UrologyExaminationWidget = ({ fieldId }) => {
269
269
  };
270
270
 
271
271
  exports.UrologyExaminationWidget = UrologyExaminationWidget;
272
- //# sourceMappingURL=UrologyExaminationWidget-JYUGZ5CG.cjs.map
273
- //# sourceMappingURL=UrologyExaminationWidget-JYUGZ5CG.cjs.map
272
+ //# sourceMappingURL=UrologyExaminationWidget-GQLMV4FB.cjs.map
273
+ //# sourceMappingURL=UrologyExaminationWidget-GQLMV4FB.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/widgets/UrologyExaminationWidget.tsx"],"names":["useField","useForm","useMemo","normalizeUrologyExamination","useState","useEffect","formatUrologyExaminationToClinicalExamination","getThemeConfig","jsxs","Fragment","jsx","FieldRequiredIndicator","Label","cn","Checkbox","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","Textarea"],"mappings":"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","file":"UrologyExaminationWidget-JYUGZ5CG.cjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Input } from '../shadcn/input';\nimport { Textarea } from '../shadcn/textarea';\nimport { Checkbox } from '../shadcn/checkbox';\nimport { Button } from '../shadcn/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { cn } from '../../core/utils';\nimport { FieldRequiredIndicator } from '../../react/fieldStyle';\nimport { getThemeConfig } from '../themes';\nimport type { UrologyExaminationValue } from '../../core/urologyPathway';\nimport {\n formatUrologyExaminationToClinicalExamination,\n normalizeUrologyExamination,\n} from '../../core/urologyPathway';\n\n/** Free-text exam narrative; field id must match template `clinical_examination`. */\nconst URO_CLINICAL_EXAMINATION_FIELD = 'clinical_examination';\n\ntype GeneralKey = keyof UrologyExaminationValue['general'];\ntype AbdomenKey = keyof UrologyExaminationValue['abdomen'];\ntype GuKey = keyof UrologyExaminationValue['gu'];\n\nconst GENERAL_ROWS: { key: GeneralKey; label: string }[] = [\n { key: 'pallor', label: 'Pallor (chronic dz)' },\n { key: 'oedema', label: 'Oedema (renal)' },\n { key: 'icterus', label: 'Icterus' },\n { key: 'lymphadenopathy', label: 'Lymphadenopathy' },\n];\n\nconst ABD_ROWS: { key: AbdomenKey; label: string }[] = [\n { key: 'distension', label: 'Distension' },\n { key: 'scars', label: 'Surgical scars' },\n { key: 'mass', label: 'Visible mass' },\n { key: 'kidneyPalpable', label: 'Kidney palpable' },\n { key: 'bladderPalpable', label: 'Bladder palpable' },\n { key: 'renalAngleTender', label: 'Renal angle tender' },\n { key: 'bladderDull', label: 'Bladder dullness (retention)' },\n];\n\nconst GU_ROWS: { key: GuKey; label: string }[] = [\n { key: 'meatusAbnormal', label: 'Meatus abnormal (hypospadias?)' },\n { key: 'phimosis', label: 'Phimosis / paraphimosis' },\n { key: 'lesions', label: 'Penile lesions / ulcers' },\n { key: 'scrotalSwelling', label: 'Scrotal swelling' },\n { key: 'transilluminant', label: 'Transilluminant' },\n { key: 'tenderTestis', label: 'Tender testis' },\n { key: 'hydrocele', label: 'Hydrocele' },\n { key: 'varicocele', label: 'Varicocele' },\n { key: 'suspiciousMass', label: 'Suspicious mass' },\n];\n\nconst DRE_CONSISTENCY = ['none', 'Soft (benign)', 'Firm', 'Hard / nodular (malignancy?)'] as const;\nconst DRE_SULCUS = ['none', 'Preserved', 'Obliterated'] as const;\n\nexport const UrologyExaminationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);\n const clinicalField = useField(URO_CLINICAL_EXAMINATION_FIELD);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n const safe = useMemo(() => normalizeUrologyExamination(value), [value]);\n\n const [clinicalNarrativeLocked, setClinicalNarrativeLocked] = useState(false);\n\n useEffect(() => {\n if (clinicalNarrativeLocked || disabled) return;\n const norm = normalizeUrologyExamination(value);\n const next = formatUrologyExaminationToClinicalExamination(norm);\n clinicalField.setValue(next);\n if (norm.examinationNotes !== next) {\n setValue({ ...norm, examinationNotes: next });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, clinicalNarrativeLocked, disabled]);\n\n const bump = (next: UrologyExaminationValue) => {\n setValue(next);\n setTouched();\n };\n\n const toggleGeneral = (key: GeneralKey) => {\n bump({ ...safe, general: { ...safe.general, [key]: !safe.general[key] } });\n };\n\n const toggleAbdomen = (key: AbdomenKey) => {\n bump({ ...safe, abdomen: { ...safe.abdomen, [key]: !safe.abdomen[key] } });\n };\n\n const toggleGu = (key: GuKey) => {\n bump({ ...safe, gu: { ...safe.gu, [key]: !safe.gu[key] } });\n };\n\n if (!fieldDef) return null;\n\n const theme = getThemeConfig('textarea', fieldDef.theme);\n const wrapperClass =\n theme?.wrapperClassName ?? 'rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]';\n const labelClass = theme?.labelClassName;\n\n const labelContent = (\n <>\n {fieldDef.label}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = theme ? (\n <Label className={labelClass}>{labelContent}</Label>\n ) : (\n <Label className=\"text-sm font-medium\">{labelContent}</Label>\n );\n\n const bodyClass = cn(\n '-mt-1 flex min-w-0 flex-col gap-3 border-t border-[#D0D0D0] bg-white px-3 py-3',\n disabled && 'pointer-events-none opacity-60',\n );\n\n return (\n <div className={cn('w-full min-w-0', wrapperClass)}>\n {labelEl}\n\n <div className={bodyClass}>\n <div className=\"grid grid-cols-1 gap-3 text-xs md:grid-cols-2 xl:grid-cols-4\">\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">General</p>\n {GENERAL_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.general[r.key]}\n onCheckedChange={() => toggleGeneral(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">Abdomen</p>\n {ABD_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.abdomen[r.key]}\n onCheckedChange={() => toggleAbdomen(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">External genitalia / scrotum</p>\n {GU_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.gu[r.key]}\n onCheckedChange={() => toggleGu(r.key)}\n disabled={disabled}\n />\n {r.key === 'suspiciousMass' ? (\n <span className=\"font-medium text-red-600\">{r.label}</span>\n ) : (\n r.label\n )}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">DRE — Prostate</p>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.done}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, done: c === true } })\n }\n disabled={disabled}\n />\n DRE performed\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Estimated size (g)</span>\n <Input\n type=\"number\"\n min={0}\n className=\"h-8 text-xs\"\n value={safe.dre.sizeGrams}\n onChange={(e) => {\n const n = Number(e.target.value);\n bump({\n ...safe,\n dre: {\n ...safe.dre,\n sizeGrams: Number.isFinite(n) && n >= 0 ? Math.round(n) : 0,\n },\n });\n }}\n disabled={disabled}\n />\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Consistency</span>\n <Select\n value={safe.dre.consistency || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, consistency: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_CONSISTENCY.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Median sulcus</span>\n <Select\n value={safe.dre.medianSulcus || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, medianSulcus: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_SULCUS.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.tenderness}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, tenderness: c === true } })\n }\n disabled={disabled}\n />\n Tender (prostatitis?)\n </label>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <Label className=\"text-xs font-semibold text-slate-700\">\n {clinicalField.fieldDef?.label ?? 'Clinical examination'}\n </Label>\n <div className=\"flex items-center gap-2\">\n {clinicalNarrativeLocked ? (\n <span className=\"rounded bg-amber-50 px-1.5 py-0.5 text-[10px] font-medium text-amber-900 ring-1 ring-amber-200/80\">\n You edited this summary. Use{' '}\n <span className=\"italic\">'Regenerate'</span> to update it from the form.\n </span>\n ) : null}\n {clinicalNarrativeLocked ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 shrink-0 px-2 text-xs\"\n disabled={disabled || clinicalField.disabled}\n onClick={() => {\n setClinicalNarrativeLocked(false);\n const norm = normalizeUrologyExamination(value);\n clinicalField.setValue(formatUrologyExaminationToClinicalExamination(norm));\n }}\n >\n Regenerate\n </Button>\n ) : null}\n </div>\n </div>\n {clinicalNarrativeLocked ? (\n <p className=\"text-[10px] text-muted-foreground\">\n Edit this box anytime. Use Regenerate to replace with fresh text from the structured\n examination.\n </p>\n ) : null}\n <Textarea\n className=\"min-h-[88px] rounded-md border border-input bg-white text-sm\"\n placeholder=\"Auto-filled from selections above…\"\n value={\n typeof clinicalField.value === 'string'\n ? clinicalField.value\n : clinicalField.value == null\n ? ''\n : String(clinicalField.value)\n }\n onChange={(e) => {\n setClinicalNarrativeLocked(true);\n const t = e.target.value;\n clinicalField.setValue(t);\n clinicalField.setTouched();\n setValue({ ...safe, examinationNotes: t });\n setTouched();\n }}\n disabled={disabled || clinicalField.disabled}\n />\n </div>\n </div>\n\n {showError ? <p className=\"px-3 pb-2 text-xs text-red-500\">{error}</p> : null}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ui/widgets/UrologyExaminationWidget.tsx"],"names":["useField","useForm","useMemo","normalizeUrologyExamination","useState","useEffect","formatUrologyExaminationToClinicalExamination","getThemeConfig","jsxs","Fragment","jsx","FieldRequiredIndicator","Label","cn","Checkbox","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","Button","Textarea"],"mappings":"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","file":"UrologyExaminationWidget-GQLMV4FB.cjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Input } from '../shadcn/input';\nimport { Textarea } from '../shadcn/textarea';\nimport { Checkbox } from '../shadcn/checkbox';\nimport { Button } from '../shadcn/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { cn } from '../../core/utils';\nimport { FieldRequiredIndicator } from '../../react/fieldStyle';\nimport { getThemeConfig } from '../themes';\nimport type { UrologyExaminationValue } from '../../core/urologyPathway';\nimport {\n formatUrologyExaminationToClinicalExamination,\n normalizeUrologyExamination,\n} from '../../core/urologyPathway';\n\n/** Free-text exam narrative; field id must match template `clinical_examination`. */\nconst URO_CLINICAL_EXAMINATION_FIELD = 'clinical_examination';\n\ntype GeneralKey = keyof UrologyExaminationValue['general'];\ntype AbdomenKey = keyof UrologyExaminationValue['abdomen'];\ntype GuKey = keyof UrologyExaminationValue['gu'];\n\nconst GENERAL_ROWS: { key: GeneralKey; label: string }[] = [\n { key: 'pallor', label: 'Pallor (chronic dz)' },\n { key: 'oedema', label: 'Oedema (renal)' },\n { key: 'icterus', label: 'Icterus' },\n { key: 'lymphadenopathy', label: 'Lymphadenopathy' },\n];\n\nconst ABD_ROWS: { key: AbdomenKey; label: string }[] = [\n { key: 'distension', label: 'Distension' },\n { key: 'scars', label: 'Surgical scars' },\n { key: 'mass', label: 'Visible mass' },\n { key: 'kidneyPalpable', label: 'Kidney palpable' },\n { key: 'bladderPalpable', label: 'Bladder palpable' },\n { key: 'renalAngleTender', label: 'Renal angle tender' },\n { key: 'bladderDull', label: 'Bladder dullness (retention)' },\n];\n\nconst GU_ROWS: { key: GuKey; label: string }[] = [\n { key: 'meatusAbnormal', label: 'Meatus abnormal (hypospadias?)' },\n { key: 'phimosis', label: 'Phimosis / paraphimosis' },\n { key: 'lesions', label: 'Penile lesions / ulcers' },\n { key: 'scrotalSwelling', label: 'Scrotal swelling' },\n { key: 'transilluminant', label: 'Transilluminant' },\n { key: 'tenderTestis', label: 'Tender testis' },\n { key: 'hydrocele', label: 'Hydrocele' },\n { key: 'varicocele', label: 'Varicocele' },\n { key: 'suspiciousMass', label: 'Suspicious mass' },\n];\n\nconst DRE_CONSISTENCY = ['none', 'Soft (benign)', 'Firm', 'Hard / nodular (malignancy?)'] as const;\nconst DRE_SULCUS = ['none', 'Preserved', 'Obliterated'] as const;\n\nexport const UrologyExaminationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);\n const clinicalField = useField(URO_CLINICAL_EXAMINATION_FIELD);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n const safe = useMemo(() => normalizeUrologyExamination(value), [value]);\n\n const [clinicalNarrativeLocked, setClinicalNarrativeLocked] = useState(false);\n\n useEffect(() => {\n if (clinicalNarrativeLocked || disabled) return;\n const norm = normalizeUrologyExamination(value);\n const next = formatUrologyExaminationToClinicalExamination(norm);\n clinicalField.setValue(next);\n if (norm.examinationNotes !== next) {\n setValue({ ...norm, examinationNotes: next });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, clinicalNarrativeLocked, disabled]);\n\n const bump = (next: UrologyExaminationValue) => {\n setValue(next);\n setTouched();\n };\n\n const toggleGeneral = (key: GeneralKey) => {\n bump({ ...safe, general: { ...safe.general, [key]: !safe.general[key] } });\n };\n\n const toggleAbdomen = (key: AbdomenKey) => {\n bump({ ...safe, abdomen: { ...safe.abdomen, [key]: !safe.abdomen[key] } });\n };\n\n const toggleGu = (key: GuKey) => {\n bump({ ...safe, gu: { ...safe.gu, [key]: !safe.gu[key] } });\n };\n\n if (!fieldDef) return null;\n\n const theme = getThemeConfig('textarea', fieldDef.theme);\n const wrapperClass =\n theme?.wrapperClassName ?? 'rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]';\n const labelClass = theme?.labelClassName;\n\n const labelContent = (\n <>\n {fieldDef.label}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = theme ? (\n <Label className={labelClass}>{labelContent}</Label>\n ) : (\n <Label className=\"text-sm font-medium\">{labelContent}</Label>\n );\n\n const bodyClass = cn(\n '-mt-1 flex min-w-0 flex-col gap-3 border-t border-[#D0D0D0] bg-white px-3 py-3',\n disabled && 'pointer-events-none opacity-60',\n );\n\n return (\n <div className={cn('w-full min-w-0', wrapperClass)}>\n {labelEl}\n\n <div className={bodyClass}>\n <div className=\"grid grid-cols-1 gap-3 text-xs md:grid-cols-2 xl:grid-cols-4\">\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">General</p>\n {GENERAL_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.general[r.key]}\n onCheckedChange={() => toggleGeneral(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">Abdomen</p>\n {ABD_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.abdomen[r.key]}\n onCheckedChange={() => toggleAbdomen(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">External genitalia / scrotum</p>\n {GU_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.gu[r.key]}\n onCheckedChange={() => toggleGu(r.key)}\n disabled={disabled}\n />\n {r.key === 'suspiciousMass' ? (\n <span className=\"font-medium text-red-600\">{r.label}</span>\n ) : (\n r.label\n )}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">DRE — Prostate</p>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.done}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, done: c === true } })\n }\n disabled={disabled}\n />\n DRE performed\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Estimated size (g)</span>\n <Input\n type=\"number\"\n min={0}\n className=\"h-8 text-xs\"\n value={safe.dre.sizeGrams}\n onChange={(e) => {\n const n = Number(e.target.value);\n bump({\n ...safe,\n dre: {\n ...safe.dre,\n sizeGrams: Number.isFinite(n) && n >= 0 ? Math.round(n) : 0,\n },\n });\n }}\n disabled={disabled}\n />\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Consistency</span>\n <Select\n value={safe.dre.consistency || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, consistency: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_CONSISTENCY.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Median sulcus</span>\n <Select\n value={safe.dre.medianSulcus || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, medianSulcus: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_SULCUS.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.tenderness}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, tenderness: c === true } })\n }\n disabled={disabled}\n />\n Tender (prostatitis?)\n </label>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <Label className=\"text-xs font-semibold text-slate-700\">\n {clinicalField.fieldDef?.label ?? 'Clinical examination'}\n </Label>\n <div className=\"flex items-center gap-2\">\n {clinicalNarrativeLocked ? (\n <span className=\"rounded bg-amber-50 px-1.5 py-0.5 text-[10px] font-medium text-amber-900 ring-1 ring-amber-200/80\">\n You edited this summary. Use{' '}\n <span className=\"italic\">'Regenerate'</span> to update it from the form.\n </span>\n ) : null}\n {clinicalNarrativeLocked ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 shrink-0 px-2 text-xs\"\n disabled={disabled || clinicalField.disabled}\n onClick={() => {\n setClinicalNarrativeLocked(false);\n const norm = normalizeUrologyExamination(value);\n clinicalField.setValue(formatUrologyExaminationToClinicalExamination(norm));\n }}\n >\n Regenerate\n </Button>\n ) : null}\n </div>\n </div>\n {clinicalNarrativeLocked ? (\n <p className=\"text-[10px] text-muted-foreground\">\n Edit this box anytime. Use Regenerate to replace with fresh text from the structured\n examination.\n </p>\n ) : null}\n <Textarea\n className=\"min-h-[88px] rounded-md border border-input bg-white text-sm\"\n placeholder=\"Auto-filled from selections above…\"\n value={\n typeof clinicalField.value === 'string'\n ? clinicalField.value\n : clinicalField.value == null\n ? ''\n : String(clinicalField.value)\n }\n onChange={(e) => {\n setClinicalNarrativeLocked(true);\n const t = e.target.value;\n clinicalField.setValue(t);\n clinicalField.setTouched();\n setValue({ ...safe, examinationNotes: t });\n setTouched();\n }}\n disabled={disabled || clinicalField.disabled}\n />\n </div>\n </div>\n\n {showError ? <p className=\"px-3 pb-2 text-xs text-red-500\">{error}</p> : null}\n </div>\n );\n};\n"]}
@@ -2,11 +2,11 @@ import { Checkbox } from './chunk-GNZWSVTB.mjs';
2
2
  import { Textarea } from './chunk-4BAKQIPJ.mjs';
3
3
  import { getThemeConfig } from './chunk-Y7TIWH4I.mjs';
4
4
  import { FieldRequiredIndicator } from './chunk-WYVXXEZI.mjs';
5
- import { useForm } from './chunk-7L2JOWGA.mjs';
5
+ import { useForm } from './chunk-T3UHPMFX.mjs';
6
6
  import { Input } from './chunk-VNFBUAZD.mjs';
7
7
  import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-AZHTIUOL.mjs';
8
8
  import { Button } from './chunk-GXXWMHAA.mjs';
9
- import { useField, normalizeUrologyExamination, formatUrologyExaminationToClinicalExamination } from './chunk-ZTT5XJR7.mjs';
9
+ import { useField, normalizeUrologyExamination, formatUrologyExaminationToClinicalExamination } from './chunk-2BGJZ44Q.mjs';
10
10
  import { Label } from './chunk-HEFZA2AH.mjs';
11
11
  import { cn } from './chunk-VPU66PI6.mjs';
12
12
  import { useMemo, useState, useEffect } from 'react';
@@ -267,5 +267,5 @@ var UrologyExaminationWidget = ({ fieldId }) => {
267
267
  };
268
268
 
269
269
  export { UrologyExaminationWidget };
270
- //# sourceMappingURL=UrologyExaminationWidget-QDTD3FJX.mjs.map
271
- //# sourceMappingURL=UrologyExaminationWidget-QDTD3FJX.mjs.map
270
+ //# sourceMappingURL=UrologyExaminationWidget-GRBL2SDG.mjs.map
271
+ //# sourceMappingURL=UrologyExaminationWidget-GRBL2SDG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/widgets/UrologyExaminationWidget.tsx"],"names":[],"mappings":"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","file":"UrologyExaminationWidget-QDTD3FJX.mjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Input } from '../shadcn/input';\nimport { Textarea } from '../shadcn/textarea';\nimport { Checkbox } from '../shadcn/checkbox';\nimport { Button } from '../shadcn/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { cn } from '../../core/utils';\nimport { FieldRequiredIndicator } from '../../react/fieldStyle';\nimport { getThemeConfig } from '../themes';\nimport type { UrologyExaminationValue } from '../../core/urologyPathway';\nimport {\n formatUrologyExaminationToClinicalExamination,\n normalizeUrologyExamination,\n} from '../../core/urologyPathway';\n\n/** Free-text exam narrative; field id must match template `clinical_examination`. */\nconst URO_CLINICAL_EXAMINATION_FIELD = 'clinical_examination';\n\ntype GeneralKey = keyof UrologyExaminationValue['general'];\ntype AbdomenKey = keyof UrologyExaminationValue['abdomen'];\ntype GuKey = keyof UrologyExaminationValue['gu'];\n\nconst GENERAL_ROWS: { key: GeneralKey; label: string }[] = [\n { key: 'pallor', label: 'Pallor (chronic dz)' },\n { key: 'oedema', label: 'Oedema (renal)' },\n { key: 'icterus', label: 'Icterus' },\n { key: 'lymphadenopathy', label: 'Lymphadenopathy' },\n];\n\nconst ABD_ROWS: { key: AbdomenKey; label: string }[] = [\n { key: 'distension', label: 'Distension' },\n { key: 'scars', label: 'Surgical scars' },\n { key: 'mass', label: 'Visible mass' },\n { key: 'kidneyPalpable', label: 'Kidney palpable' },\n { key: 'bladderPalpable', label: 'Bladder palpable' },\n { key: 'renalAngleTender', label: 'Renal angle tender' },\n { key: 'bladderDull', label: 'Bladder dullness (retention)' },\n];\n\nconst GU_ROWS: { key: GuKey; label: string }[] = [\n { key: 'meatusAbnormal', label: 'Meatus abnormal (hypospadias?)' },\n { key: 'phimosis', label: 'Phimosis / paraphimosis' },\n { key: 'lesions', label: 'Penile lesions / ulcers' },\n { key: 'scrotalSwelling', label: 'Scrotal swelling' },\n { key: 'transilluminant', label: 'Transilluminant' },\n { key: 'tenderTestis', label: 'Tender testis' },\n { key: 'hydrocele', label: 'Hydrocele' },\n { key: 'varicocele', label: 'Varicocele' },\n { key: 'suspiciousMass', label: 'Suspicious mass' },\n];\n\nconst DRE_CONSISTENCY = ['none', 'Soft (benign)', 'Firm', 'Hard / nodular (malignancy?)'] as const;\nconst DRE_SULCUS = ['none', 'Preserved', 'Obliterated'] as const;\n\nexport const UrologyExaminationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);\n const clinicalField = useField(URO_CLINICAL_EXAMINATION_FIELD);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n const safe = useMemo(() => normalizeUrologyExamination(value), [value]);\n\n const [clinicalNarrativeLocked, setClinicalNarrativeLocked] = useState(false);\n\n useEffect(() => {\n if (clinicalNarrativeLocked || disabled) return;\n const norm = normalizeUrologyExamination(value);\n const next = formatUrologyExaminationToClinicalExamination(norm);\n clinicalField.setValue(next);\n if (norm.examinationNotes !== next) {\n setValue({ ...norm, examinationNotes: next });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, clinicalNarrativeLocked, disabled]);\n\n const bump = (next: UrologyExaminationValue) => {\n setValue(next);\n setTouched();\n };\n\n const toggleGeneral = (key: GeneralKey) => {\n bump({ ...safe, general: { ...safe.general, [key]: !safe.general[key] } });\n };\n\n const toggleAbdomen = (key: AbdomenKey) => {\n bump({ ...safe, abdomen: { ...safe.abdomen, [key]: !safe.abdomen[key] } });\n };\n\n const toggleGu = (key: GuKey) => {\n bump({ ...safe, gu: { ...safe.gu, [key]: !safe.gu[key] } });\n };\n\n if (!fieldDef) return null;\n\n const theme = getThemeConfig('textarea', fieldDef.theme);\n const wrapperClass =\n theme?.wrapperClassName ?? 'rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]';\n const labelClass = theme?.labelClassName;\n\n const labelContent = (\n <>\n {fieldDef.label}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = theme ? (\n <Label className={labelClass}>{labelContent}</Label>\n ) : (\n <Label className=\"text-sm font-medium\">{labelContent}</Label>\n );\n\n const bodyClass = cn(\n '-mt-1 flex min-w-0 flex-col gap-3 border-t border-[#D0D0D0] bg-white px-3 py-3',\n disabled && 'pointer-events-none opacity-60',\n );\n\n return (\n <div className={cn('w-full min-w-0', wrapperClass)}>\n {labelEl}\n\n <div className={bodyClass}>\n <div className=\"grid grid-cols-1 gap-3 text-xs md:grid-cols-2 xl:grid-cols-4\">\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">General</p>\n {GENERAL_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.general[r.key]}\n onCheckedChange={() => toggleGeneral(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">Abdomen</p>\n {ABD_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.abdomen[r.key]}\n onCheckedChange={() => toggleAbdomen(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">External genitalia / scrotum</p>\n {GU_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.gu[r.key]}\n onCheckedChange={() => toggleGu(r.key)}\n disabled={disabled}\n />\n {r.key === 'suspiciousMass' ? (\n <span className=\"font-medium text-red-600\">{r.label}</span>\n ) : (\n r.label\n )}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">DRE — Prostate</p>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.done}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, done: c === true } })\n }\n disabled={disabled}\n />\n DRE performed\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Estimated size (g)</span>\n <Input\n type=\"number\"\n min={0}\n className=\"h-8 text-xs\"\n value={safe.dre.sizeGrams}\n onChange={(e) => {\n const n = Number(e.target.value);\n bump({\n ...safe,\n dre: {\n ...safe.dre,\n sizeGrams: Number.isFinite(n) && n >= 0 ? Math.round(n) : 0,\n },\n });\n }}\n disabled={disabled}\n />\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Consistency</span>\n <Select\n value={safe.dre.consistency || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, consistency: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_CONSISTENCY.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Median sulcus</span>\n <Select\n value={safe.dre.medianSulcus || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, medianSulcus: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_SULCUS.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.tenderness}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, tenderness: c === true } })\n }\n disabled={disabled}\n />\n Tender (prostatitis?)\n </label>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <Label className=\"text-xs font-semibold text-slate-700\">\n {clinicalField.fieldDef?.label ?? 'Clinical examination'}\n </Label>\n <div className=\"flex items-center gap-2\">\n {clinicalNarrativeLocked ? (\n <span className=\"rounded bg-amber-50 px-1.5 py-0.5 text-[10px] font-medium text-amber-900 ring-1 ring-amber-200/80\">\n You edited this summary. Use{' '}\n <span className=\"italic\">'Regenerate'</span> to update it from the form.\n </span>\n ) : null}\n {clinicalNarrativeLocked ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 shrink-0 px-2 text-xs\"\n disabled={disabled || clinicalField.disabled}\n onClick={() => {\n setClinicalNarrativeLocked(false);\n const norm = normalizeUrologyExamination(value);\n clinicalField.setValue(formatUrologyExaminationToClinicalExamination(norm));\n }}\n >\n Regenerate\n </Button>\n ) : null}\n </div>\n </div>\n {clinicalNarrativeLocked ? (\n <p className=\"text-[10px] text-muted-foreground\">\n Edit this box anytime. Use Regenerate to replace with fresh text from the structured\n examination.\n </p>\n ) : null}\n <Textarea\n className=\"min-h-[88px] rounded-md border border-input bg-white text-sm\"\n placeholder=\"Auto-filled from selections above…\"\n value={\n typeof clinicalField.value === 'string'\n ? clinicalField.value\n : clinicalField.value == null\n ? ''\n : String(clinicalField.value)\n }\n onChange={(e) => {\n setClinicalNarrativeLocked(true);\n const t = e.target.value;\n clinicalField.setValue(t);\n clinicalField.setTouched();\n setValue({ ...safe, examinationNotes: t });\n setTouched();\n }}\n disabled={disabled || clinicalField.disabled}\n />\n </div>\n </div>\n\n {showError ? <p className=\"px-3 pb-2 text-xs text-red-500\">{error}</p> : null}\n </div>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/ui/widgets/UrologyExaminationWidget.tsx"],"names":[],"mappings":"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","file":"UrologyExaminationWidget-GRBL2SDG.mjs","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Input } from '../shadcn/input';\nimport { Textarea } from '../shadcn/textarea';\nimport { Checkbox } from '../shadcn/checkbox';\nimport { Button } from '../shadcn/button';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { cn } from '../../core/utils';\nimport { FieldRequiredIndicator } from '../../react/fieldStyle';\nimport { getThemeConfig } from '../themes';\nimport type { UrologyExaminationValue } from '../../core/urologyPathway';\nimport {\n formatUrologyExaminationToClinicalExamination,\n normalizeUrologyExamination,\n} from '../../core/urologyPathway';\n\n/** Free-text exam narrative; field id must match template `clinical_examination`. */\nconst URO_CLINICAL_EXAMINATION_FIELD = 'clinical_examination';\n\ntype GeneralKey = keyof UrologyExaminationValue['general'];\ntype AbdomenKey = keyof UrologyExaminationValue['abdomen'];\ntype GuKey = keyof UrologyExaminationValue['gu'];\n\nconst GENERAL_ROWS: { key: GeneralKey; label: string }[] = [\n { key: 'pallor', label: 'Pallor (chronic dz)' },\n { key: 'oedema', label: 'Oedema (renal)' },\n { key: 'icterus', label: 'Icterus' },\n { key: 'lymphadenopathy', label: 'Lymphadenopathy' },\n];\n\nconst ABD_ROWS: { key: AbdomenKey; label: string }[] = [\n { key: 'distension', label: 'Distension' },\n { key: 'scars', label: 'Surgical scars' },\n { key: 'mass', label: 'Visible mass' },\n { key: 'kidneyPalpable', label: 'Kidney palpable' },\n { key: 'bladderPalpable', label: 'Bladder palpable' },\n { key: 'renalAngleTender', label: 'Renal angle tender' },\n { key: 'bladderDull', label: 'Bladder dullness (retention)' },\n];\n\nconst GU_ROWS: { key: GuKey; label: string }[] = [\n { key: 'meatusAbnormal', label: 'Meatus abnormal (hypospadias?)' },\n { key: 'phimosis', label: 'Phimosis / paraphimosis' },\n { key: 'lesions', label: 'Penile lesions / ulcers' },\n { key: 'scrotalSwelling', label: 'Scrotal swelling' },\n { key: 'transilluminant', label: 'Transilluminant' },\n { key: 'tenderTestis', label: 'Tender testis' },\n { key: 'hydrocele', label: 'Hydrocele' },\n { key: 'varicocele', label: 'Varicocele' },\n { key: 'suspiciousMass', label: 'Suspicious mass' },\n];\n\nconst DRE_CONSISTENCY = ['none', 'Soft (benign)', 'Firm', 'Hard / nodular (malignancy?)'] as const;\nconst DRE_SULCUS = ['none', 'Preserved', 'Obliterated'] as const;\n\nexport const UrologyExaminationWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);\n const clinicalField = useField(URO_CLINICAL_EXAMINATION_FIELD);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n const safe = useMemo(() => normalizeUrologyExamination(value), [value]);\n\n const [clinicalNarrativeLocked, setClinicalNarrativeLocked] = useState(false);\n\n useEffect(() => {\n if (clinicalNarrativeLocked || disabled) return;\n const norm = normalizeUrologyExamination(value);\n const next = formatUrologyExaminationToClinicalExamination(norm);\n clinicalField.setValue(next);\n if (norm.examinationNotes !== next) {\n setValue({ ...norm, examinationNotes: next });\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, clinicalNarrativeLocked, disabled]);\n\n const bump = (next: UrologyExaminationValue) => {\n setValue(next);\n setTouched();\n };\n\n const toggleGeneral = (key: GeneralKey) => {\n bump({ ...safe, general: { ...safe.general, [key]: !safe.general[key] } });\n };\n\n const toggleAbdomen = (key: AbdomenKey) => {\n bump({ ...safe, abdomen: { ...safe.abdomen, [key]: !safe.abdomen[key] } });\n };\n\n const toggleGu = (key: GuKey) => {\n bump({ ...safe, gu: { ...safe.gu, [key]: !safe.gu[key] } });\n };\n\n if (!fieldDef) return null;\n\n const theme = getThemeConfig('textarea', fieldDef.theme);\n const wrapperClass =\n theme?.wrapperClassName ?? 'rounded-md overflow-hidden flex flex-col border border-[#D0D0D0]';\n const labelClass = theme?.labelClassName;\n\n const labelContent = (\n <>\n {fieldDef.label}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = theme ? (\n <Label className={labelClass}>{labelContent}</Label>\n ) : (\n <Label className=\"text-sm font-medium\">{labelContent}</Label>\n );\n\n const bodyClass = cn(\n '-mt-1 flex min-w-0 flex-col gap-3 border-t border-[#D0D0D0] bg-white px-3 py-3',\n disabled && 'pointer-events-none opacity-60',\n );\n\n return (\n <div className={cn('w-full min-w-0', wrapperClass)}>\n {labelEl}\n\n <div className={bodyClass}>\n <div className=\"grid grid-cols-1 gap-3 text-xs md:grid-cols-2 xl:grid-cols-4\">\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">General</p>\n {GENERAL_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.general[r.key]}\n onCheckedChange={() => toggleGeneral(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">Abdomen</p>\n {ABD_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.abdomen[r.key]}\n onCheckedChange={() => toggleAbdomen(r.key)}\n disabled={disabled}\n />\n {r.label}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">External genitalia / scrotum</p>\n {GU_ROWS.map((r) => (\n <label key={r.key} className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.gu[r.key]}\n onCheckedChange={() => toggleGu(r.key)}\n disabled={disabled}\n />\n {r.key === 'suspiciousMass' ? (\n <span className=\"font-medium text-red-600\">{r.label}</span>\n ) : (\n r.label\n )}\n </label>\n ))}\n </div>\n <div className=\"space-y-2\">\n <p className=\"font-semibold text-slate-800\">DRE — Prostate</p>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.done}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, done: c === true } })\n }\n disabled={disabled}\n />\n DRE performed\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Estimated size (g)</span>\n <Input\n type=\"number\"\n min={0}\n className=\"h-8 text-xs\"\n value={safe.dre.sizeGrams}\n onChange={(e) => {\n const n = Number(e.target.value);\n bump({\n ...safe,\n dre: {\n ...safe.dre,\n sizeGrams: Number.isFinite(n) && n >= 0 ? Math.round(n) : 0,\n },\n });\n }}\n disabled={disabled}\n />\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Consistency</span>\n <Select\n value={safe.dre.consistency || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, consistency: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_CONSISTENCY.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"block\">\n <span className=\"mb-1 block font-medium\">Median sulcus</span>\n <Select\n value={safe.dre.medianSulcus || 'none'}\n onValueChange={(val) =>\n bump({\n ...safe,\n dre: { ...safe.dre, medianSulcus: val === 'none' ? '' : val },\n })\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n {DRE_SULCUS.map((opt) => (\n <SelectItem key={opt} value={opt}>\n {opt === 'none' ? '—' : opt}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n <label className=\"flex items-center gap-2\">\n <Checkbox\n checked={safe.dre.tenderness}\n onCheckedChange={(c) =>\n bump({ ...safe, dre: { ...safe.dre, tenderness: c === true } })\n }\n disabled={disabled}\n />\n Tender (prostatitis?)\n </label>\n </div>\n </div>\n\n <div className=\"space-y-1\">\n <div className=\"flex flex-wrap items-center justify-between gap-2\">\n <Label className=\"text-xs font-semibold text-slate-700\">\n {clinicalField.fieldDef?.label ?? 'Clinical examination'}\n </Label>\n <div className=\"flex items-center gap-2\">\n {clinicalNarrativeLocked ? (\n <span className=\"rounded bg-amber-50 px-1.5 py-0.5 text-[10px] font-medium text-amber-900 ring-1 ring-amber-200/80\">\n You edited this summary. Use{' '}\n <span className=\"italic\">'Regenerate'</span> to update it from the form.\n </span>\n ) : null}\n {clinicalNarrativeLocked ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-7 shrink-0 px-2 text-xs\"\n disabled={disabled || clinicalField.disabled}\n onClick={() => {\n setClinicalNarrativeLocked(false);\n const norm = normalizeUrologyExamination(value);\n clinicalField.setValue(formatUrologyExaminationToClinicalExamination(norm));\n }}\n >\n Regenerate\n </Button>\n ) : null}\n </div>\n </div>\n {clinicalNarrativeLocked ? (\n <p className=\"text-[10px] text-muted-foreground\">\n Edit this box anytime. Use Regenerate to replace with fresh text from the structured\n examination.\n </p>\n ) : null}\n <Textarea\n className=\"min-h-[88px] rounded-md border border-input bg-white text-sm\"\n placeholder=\"Auto-filled from selections above…\"\n value={\n typeof clinicalField.value === 'string'\n ? clinicalField.value\n : clinicalField.value == null\n ? ''\n : String(clinicalField.value)\n }\n onChange={(e) => {\n setClinicalNarrativeLocked(true);\n const t = e.target.value;\n clinicalField.setValue(t);\n clinicalField.setTouched();\n setValue({ ...safe, examinationNotes: t });\n setTouched();\n }}\n disabled={disabled || clinicalField.disabled}\n />\n </div>\n </div>\n\n {showError ? <p className=\"px-3 pb-2 text-xs text-red-500\">{error}</p> : null}\n </div>\n );\n};\n"]}