formanitor 0.1.11 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/dist/AddInvestigationWidget-7UGZQYI5.mjs +30 -0
  2. package/dist/AddInvestigationWidget-7UGZQYI5.mjs.map +1 -0
  3. package/dist/AddInvestigationWidget-RY62UCPM.cjs +32 -0
  4. package/dist/AddInvestigationWidget-RY62UCPM.cjs.map +1 -0
  5. package/dist/AddMedicationWidget-UG26VMUX.mjs +30 -0
  6. package/dist/AddMedicationWidget-UG26VMUX.mjs.map +1 -0
  7. package/dist/AddMedicationWidget-WPI32WAP.cjs +32 -0
  8. package/dist/AddMedicationWidget-WPI32WAP.cjs.map +1 -0
  9. package/dist/AddProcedureWidget-SF6MTRBV.cjs +278 -0
  10. package/dist/AddProcedureWidget-SF6MTRBV.cjs.map +1 -0
  11. package/dist/AddProcedureWidget-SQJUKKMK.mjs +276 -0
  12. package/dist/AddProcedureWidget-SQJUKKMK.mjs.map +1 -0
  13. package/dist/BiometryIolWorkupWidget-I5AJOYB2.cjs +300 -0
  14. package/dist/BiometryIolWorkupWidget-I5AJOYB2.cjs.map +1 -0
  15. package/dist/BiometryIolWorkupWidget-NL2M7ZAA.mjs +298 -0
  16. package/dist/BiometryIolWorkupWidget-NL2M7ZAA.mjs.map +1 -0
  17. package/dist/DateTimeWidget-DIDVF2EB.cjs +61 -0
  18. package/dist/DateTimeWidget-DIDVF2EB.cjs.map +1 -0
  19. package/dist/DateTimeWidget-LFBB6HOP.mjs +59 -0
  20. package/dist/DateTimeWidget-LFBB6HOP.mjs.map +1 -0
  21. package/dist/DateWidget-4ND5TKP2.mjs +72 -0
  22. package/dist/DateWidget-4ND5TKP2.mjs.map +1 -0
  23. package/dist/DateWidget-BCVR5GDK.cjs +74 -0
  24. package/dist/DateWidget-BCVR5GDK.cjs.map +1 -0
  25. package/dist/DiagnosisTextareaWidget-E7OQRUMX.cjs +190 -0
  26. package/dist/DiagnosisTextareaWidget-E7OQRUMX.cjs.map +1 -0
  27. package/dist/DiagnosisTextareaWidget-MAOXCXEZ.mjs +184 -0
  28. package/dist/DiagnosisTextareaWidget-MAOXCXEZ.mjs.map +1 -0
  29. package/dist/DifferentialDiagnosisWidget-ANALLNKL.cjs +17 -0
  30. package/dist/DifferentialDiagnosisWidget-ANALLNKL.cjs.map +1 -0
  31. package/dist/DifferentialDiagnosisWidget-LCY2SA2I.mjs +15 -0
  32. package/dist/DifferentialDiagnosisWidget-LCY2SA2I.mjs.map +1 -0
  33. package/dist/DischargeMedicationOrdersWidget-GYT35W7J.mjs +161 -0
  34. package/dist/DischargeMedicationOrdersWidget-GYT35W7J.mjs.map +1 -0
  35. package/dist/DischargeMedicationOrdersWidget-ILWNZ7VM.cjs +163 -0
  36. package/dist/DischargeMedicationOrdersWidget-ILWNZ7VM.cjs.map +1 -0
  37. package/dist/EditableTable-TGCVUBLO.mjs +279 -0
  38. package/dist/EditableTable-TGCVUBLO.mjs.map +1 -0
  39. package/dist/EditableTable-VCUNJZEX.cjs +281 -0
  40. package/dist/EditableTable-VCUNJZEX.cjs.map +1 -0
  41. package/dist/FollowupWidget-F6FRZO4T.mjs +283 -0
  42. package/dist/FollowupWidget-F6FRZO4T.mjs.map +1 -0
  43. package/dist/FollowupWidget-NBTOV2ML.cjs +285 -0
  44. package/dist/FollowupWidget-NBTOV2ML.cjs.map +1 -0
  45. package/dist/FunctionalImpairmentScoreWidget-5V5SNLTF.cjs +93 -0
  46. package/dist/FunctionalImpairmentScoreWidget-5V5SNLTF.cjs.map +1 -0
  47. package/dist/FunctionalImpairmentScoreWidget-QKIZE7KT.mjs +91 -0
  48. package/dist/FunctionalImpairmentScoreWidget-QKIZE7KT.mjs.map +1 -0
  49. package/dist/GsExaminationWidget-57SL4BCI.cjs +528 -0
  50. package/dist/GsExaminationWidget-57SL4BCI.cjs.map +1 -0
  51. package/dist/GsExaminationWidget-J4VABGY6.mjs +526 -0
  52. package/dist/GsExaminationWidget-J4VABGY6.mjs.map +1 -0
  53. package/dist/GsGradingWidget-3WTLIP33.mjs +90 -0
  54. package/dist/GsGradingWidget-3WTLIP33.mjs.map +1 -0
  55. package/dist/GsGradingWidget-CIXE36HF.cjs +92 -0
  56. package/dist/GsGradingWidget-CIXE36HF.cjs.map +1 -0
  57. package/dist/GsSmartHistoryWidget-6Q2IIGDG.cjs +398 -0
  58. package/dist/GsSmartHistoryWidget-6Q2IIGDG.cjs.map +1 -0
  59. package/dist/GsSmartHistoryWidget-IOGZ6GNS.mjs +396 -0
  60. package/dist/GsSmartHistoryWidget-IOGZ6GNS.mjs.map +1 -0
  61. package/dist/HiddenVitalsWidget-HBK7PBPR.cjs +55 -0
  62. package/dist/HiddenVitalsWidget-HBK7PBPR.cjs.map +1 -0
  63. package/dist/HiddenVitalsWidget-JH3NRZLM.mjs +53 -0
  64. package/dist/HiddenVitalsWidget-JH3NRZLM.mjs.map +1 -0
  65. package/dist/LensAssessmentWidget-7WMULFS2.mjs +232 -0
  66. package/dist/LensAssessmentWidget-7WMULFS2.mjs.map +1 -0
  67. package/dist/LensAssessmentWidget-GSOOD7BX.cjs +234 -0
  68. package/dist/LensAssessmentWidget-GSOOD7BX.cjs.map +1 -0
  69. package/dist/MarMedicationOrdersWidget-3E6GFOR6.cjs +76 -0
  70. package/dist/MarMedicationOrdersWidget-3E6GFOR6.cjs.map +1 -0
  71. package/dist/MarMedicationOrdersWidget-QZUVSEB5.mjs +74 -0
  72. package/dist/MarMedicationOrdersWidget-QZUVSEB5.mjs.map +1 -0
  73. package/dist/OBGExaminationWidget-F2ZNSP2M.cjs +215 -0
  74. package/dist/OBGExaminationWidget-F2ZNSP2M.cjs.map +1 -0
  75. package/dist/OBGExaminationWidget-POVLALMA.mjs +213 -0
  76. package/dist/OBGExaminationWidget-POVLALMA.mjs.map +1 -0
  77. package/dist/OBGPathwayWidget-CGT7Q4T2.mjs +517 -0
  78. package/dist/OBGPathwayWidget-CGT7Q4T2.mjs.map +1 -0
  79. package/dist/OBGPathwayWidget-WCIQENMO.cjs +519 -0
  80. package/dist/OBGPathwayWidget-WCIQENMO.cjs.map +1 -0
  81. package/dist/ObstetricHistoryWidget-EGVLL4X2.mjs +1113 -0
  82. package/dist/ObstetricHistoryWidget-EGVLL4X2.mjs.map +1 -0
  83. package/dist/ObstetricHistoryWidget-XU6R7IPP.cjs +1115 -0
  84. package/dist/ObstetricHistoryWidget-XU6R7IPP.cjs.map +1 -0
  85. package/dist/OphthalDiagnosisWidget-G5RCC2QZ.mjs +89 -0
  86. package/dist/OphthalDiagnosisWidget-G5RCC2QZ.mjs.map +1 -0
  87. package/dist/OphthalDiagnosisWidget-OQPTHJ7E.cjs +91 -0
  88. package/dist/OphthalDiagnosisWidget-OQPTHJ7E.cjs.map +1 -0
  89. package/dist/OphthalmologyWidget-I3BKWOI2.cjs +1331 -0
  90. package/dist/OphthalmologyWidget-I3BKWOI2.cjs.map +1 -0
  91. package/dist/OphthalmologyWidget-RG2AI6WA.mjs +1329 -0
  92. package/dist/OphthalmologyWidget-RG2AI6WA.mjs.map +1 -0
  93. package/dist/OrthopedicExamWidget-BBZP6NVT.mjs +366 -0
  94. package/dist/OrthopedicExamWidget-BBZP6NVT.mjs.map +1 -0
  95. package/dist/OrthopedicExamWidget-M4KKU5RC.cjs +368 -0
  96. package/dist/OrthopedicExamWidget-M4KKU5RC.cjs.map +1 -0
  97. package/dist/PainScaleFlagsWidget-E576R6QB.mjs +151 -0
  98. package/dist/PainScaleFlagsWidget-E576R6QB.mjs.map +1 -0
  99. package/dist/PainScaleFlagsWidget-QHGESXNE.cjs +153 -0
  100. package/dist/PainScaleFlagsWidget-QHGESXNE.cjs.map +1 -0
  101. package/dist/ReadOnlyTable-4Y2XW4MX.mjs +6 -0
  102. package/dist/ReadOnlyTable-4Y2XW4MX.mjs.map +1 -0
  103. package/dist/ReadOnlyTable-L7G6GWEJ.cjs +15 -0
  104. package/dist/ReadOnlyTable-L7G6GWEJ.cjs.map +1 -0
  105. package/dist/ReferralWidget-J2PWYFDT.cjs +171 -0
  106. package/dist/ReferralWidget-J2PWYFDT.cjs.map +1 -0
  107. package/dist/ReferralWidget-UPYWEO5R.mjs +169 -0
  108. package/dist/ReferralWidget-UPYWEO5R.mjs.map +1 -0
  109. package/dist/RichTextWidget-BBCNJPMH.mjs +11 -0
  110. package/dist/RichTextWidget-BBCNJPMH.mjs.map +1 -0
  111. package/dist/RichTextWidget-CRQHNVJR.cjs +24 -0
  112. package/dist/RichTextWidget-CRQHNVJR.cjs.map +1 -0
  113. package/dist/SmartTextarea-DKWV4R6H.cjs +19 -0
  114. package/dist/SmartTextarea-DKWV4R6H.cjs.map +1 -0
  115. package/dist/SmartTextarea-ZTQIW6O2.mjs +10 -0
  116. package/dist/SmartTextarea-ZTQIW6O2.mjs.map +1 -0
  117. package/dist/SuggestionTextareaWidget-22NR3JWM.mjs +215 -0
  118. package/dist/SuggestionTextareaWidget-22NR3JWM.mjs.map +1 -0
  119. package/dist/SuggestionTextareaWidget-WCTPWW2E.cjs +226 -0
  120. package/dist/SuggestionTextareaWidget-WCTPWW2E.cjs.map +1 -0
  121. package/dist/SurgicalRiskFlagsWidget-Q5FTWB3M.cjs +146 -0
  122. package/dist/SurgicalRiskFlagsWidget-Q5FTWB3M.cjs.map +1 -0
  123. package/dist/SurgicalRiskFlagsWidget-WCAHZKKG.mjs +144 -0
  124. package/dist/SurgicalRiskFlagsWidget-WCAHZKKG.mjs.map +1 -0
  125. package/dist/UrologyExaminationWidget-JYUGZ5CG.cjs +273 -0
  126. package/dist/UrologyExaminationWidget-JYUGZ5CG.cjs.map +1 -0
  127. package/dist/UrologyExaminationWidget-QDTD3FJX.mjs +271 -0
  128. package/dist/UrologyExaminationWidget-QDTD3FJX.mjs.map +1 -0
  129. package/dist/UrologyPathwayWidget-QTFKUIM7.mjs +153 -0
  130. package/dist/UrologyPathwayWidget-QTFKUIM7.mjs.map +1 -0
  131. package/dist/UrologyPathwayWidget-TXZQNGP4.cjs +155 -0
  132. package/dist/UrologyPathwayWidget-TXZQNGP4.cjs.map +1 -0
  133. package/dist/UrologySmartHistoryWidget-53NATEO3.cjs +471 -0
  134. package/dist/UrologySmartHistoryWidget-53NATEO3.cjs.map +1 -0
  135. package/dist/UrologySmartHistoryWidget-PBU4QXQJ.mjs +469 -0
  136. package/dist/UrologySmartHistoryWidget-PBU4QXQJ.mjs.map +1 -0
  137. package/dist/VitalsWidget-BRFUKGNO.mjs +187 -0
  138. package/dist/VitalsWidget-BRFUKGNO.mjs.map +1 -0
  139. package/dist/VitalsWidget-PDCYXNBM.cjs +208 -0
  140. package/dist/VitalsWidget-PDCYXNBM.cjs.map +1 -0
  141. package/dist/chunk-3KRDT7TX.mjs +137 -0
  142. package/dist/chunk-3KRDT7TX.mjs.map +1 -0
  143. package/dist/chunk-4BAKQIPJ.mjs +27 -0
  144. package/dist/chunk-4BAKQIPJ.mjs.map +1 -0
  145. package/dist/chunk-4KSZUIJE.cjs +143 -0
  146. package/dist/chunk-4KSZUIJE.cjs.map +1 -0
  147. package/dist/chunk-4PMNVBJD.mjs +121 -0
  148. package/dist/chunk-4PMNVBJD.mjs.map +1 -0
  149. package/dist/chunk-5E3APMY6.cjs +54 -0
  150. package/dist/chunk-5E3APMY6.cjs.map +1 -0
  151. package/dist/chunk-5I2RC47Y.mjs +75 -0
  152. package/dist/chunk-5I2RC47Y.mjs.map +1 -0
  153. package/dist/chunk-6YX37XBM.cjs +32 -0
  154. package/dist/chunk-6YX37XBM.cjs.map +1 -0
  155. package/dist/chunk-7L2JOWGA.mjs +30 -0
  156. package/dist/chunk-7L2JOWGA.mjs.map +1 -0
  157. package/dist/chunk-AIZ3XYEZ.cjs +551 -0
  158. package/dist/chunk-AIZ3XYEZ.cjs.map +1 -0
  159. package/dist/chunk-AZHTIUOL.mjs +116 -0
  160. package/dist/chunk-AZHTIUOL.mjs.map +1 -0
  161. package/dist/chunk-AZSAPO2V.cjs +174 -0
  162. package/dist/chunk-AZSAPO2V.cjs.map +1 -0
  163. package/dist/chunk-B3GBIAHZ.mjs +285 -0
  164. package/dist/chunk-B3GBIAHZ.mjs.map +1 -0
  165. package/dist/chunk-BMNY7F6H.mjs +148 -0
  166. package/dist/chunk-BMNY7F6H.mjs.map +1 -0
  167. package/dist/chunk-BOBX45NY.cjs +77 -0
  168. package/dist/chunk-BOBX45NY.cjs.map +1 -0
  169. package/dist/chunk-BU4ZEAAP.mjs +102 -0
  170. package/dist/chunk-BU4ZEAAP.mjs.map +1 -0
  171. package/dist/chunk-DZYV47QC.mjs +54 -0
  172. package/dist/chunk-DZYV47QC.mjs.map +1 -0
  173. package/dist/chunk-E7WUDHSA.cjs +127 -0
  174. package/dist/chunk-E7WUDHSA.cjs.map +1 -0
  175. package/dist/chunk-FHHISVCH.cjs +13 -0
  176. package/dist/chunk-FHHISVCH.cjs.map +1 -0
  177. package/dist/chunk-GNZWSVTB.mjs +29 -0
  178. package/dist/chunk-GNZWSVTB.mjs.map +1 -0
  179. package/dist/chunk-GPU5P3FB.cjs +236 -0
  180. package/dist/chunk-GPU5P3FB.cjs.map +1 -0
  181. package/dist/chunk-GXXWMHAA.mjs +49 -0
  182. package/dist/chunk-GXXWMHAA.mjs.map +1 -0
  183. package/dist/chunk-GZPCYSJK.mjs +104 -0
  184. package/dist/chunk-GZPCYSJK.mjs.map +1 -0
  185. package/dist/chunk-HEFZA2AH.mjs +22 -0
  186. package/dist/chunk-HEFZA2AH.mjs.map +1 -0
  187. package/dist/chunk-I4AV6BQF.mjs +10 -0
  188. package/dist/chunk-I4AV6BQF.mjs.map +1 -0
  189. package/dist/chunk-I7TJVWYV.cjs +73 -0
  190. package/dist/chunk-I7TJVWYV.cjs.map +1 -0
  191. package/dist/chunk-IFMQKLNW.mjs +39 -0
  192. package/dist/chunk-IFMQKLNW.mjs.map +1 -0
  193. package/dist/chunk-IFSKLIS2.cjs +12 -0
  194. package/dist/chunk-IFSKLIS2.cjs.map +1 -0
  195. package/dist/chunk-IKAKE7TR.mjs +527 -0
  196. package/dist/chunk-IKAKE7TR.mjs.map +1 -0
  197. package/dist/chunk-JE6VXRWW.cjs +86 -0
  198. package/dist/chunk-JE6VXRWW.cjs.map +1 -0
  199. package/dist/chunk-JMGUUFOJ.cjs +45 -0
  200. package/dist/chunk-JMGUUFOJ.cjs.map +1 -0
  201. package/dist/chunk-KJA5BLGX.cjs +31 -0
  202. package/dist/chunk-KJA5BLGX.cjs.map +1 -0
  203. package/dist/chunk-KMJOTMUQ.cjs +109 -0
  204. package/dist/chunk-KMJOTMUQ.cjs.map +1 -0
  205. package/dist/chunk-L4CIIT4U.cjs +388 -0
  206. package/dist/chunk-L4CIIT4U.cjs.map +1 -0
  207. package/dist/chunk-LBWB7MYU.cjs +287 -0
  208. package/dist/chunk-LBWB7MYU.cjs.map +1 -0
  209. package/dist/chunk-LGGOBIEA.mjs +61 -0
  210. package/dist/chunk-LGGOBIEA.mjs.map +1 -0
  211. package/dist/chunk-LQYWMYEC.mjs +28 -0
  212. package/dist/chunk-LQYWMYEC.mjs.map +1 -0
  213. package/dist/chunk-MQ2JV7HL.cjs +140 -0
  214. package/dist/chunk-MQ2JV7HL.cjs.map +1 -0
  215. package/dist/chunk-N4L76SHJ.cjs +65 -0
  216. package/dist/chunk-N4L76SHJ.cjs.map +1 -0
  217. package/dist/chunk-O3VQBPEW.cjs +72 -0
  218. package/dist/chunk-O3VQBPEW.cjs.map +1 -0
  219. package/dist/chunk-P62377LB.cjs +27 -0
  220. package/dist/chunk-P62377LB.cjs.map +1 -0
  221. package/dist/chunk-PHADAQSH.cjs +49 -0
  222. package/dist/chunk-PHADAQSH.cjs.map +1 -0
  223. package/dist/chunk-PZBJYPWW.cjs +52 -0
  224. package/dist/chunk-PZBJYPWW.cjs.map +1 -0
  225. package/dist/chunk-QKJ7BQSR.cjs +538 -0
  226. package/dist/chunk-QKJ7BQSR.cjs.map +1 -0
  227. package/dist/chunk-QS6WG2XJ.cjs +56 -0
  228. package/dist/chunk-QS6WG2XJ.cjs.map +1 -0
  229. package/dist/chunk-S7EMPE2D.cjs +104 -0
  230. package/dist/chunk-S7EMPE2D.cjs.map +1 -0
  231. package/dist/chunk-SCMXLRX5.mjs +42 -0
  232. package/dist/chunk-SCMXLRX5.mjs.map +1 -0
  233. package/dist/chunk-SHQHDSA4.cjs +1959 -0
  234. package/dist/chunk-SHQHDSA4.cjs.map +1 -0
  235. package/dist/chunk-TJHG5WHX.cjs +47 -0
  236. package/dist/chunk-TJHG5WHX.cjs.map +1 -0
  237. package/dist/chunk-UGGUIXUS.cjs +41 -0
  238. package/dist/chunk-UGGUIXUS.cjs.map +1 -0
  239. package/dist/chunk-ULMK3TUI.mjs +69 -0
  240. package/dist/chunk-ULMK3TUI.mjs.map +1 -0
  241. package/dist/chunk-UULLSS4O.mjs +82 -0
  242. package/dist/chunk-UULLSS4O.mjs.map +1 -0
  243. package/dist/chunk-VNFBUAZD.mjs +25 -0
  244. package/dist/chunk-VNFBUAZD.mjs.map +1 -0
  245. package/dist/chunk-VPU66PI6.mjs +11 -0
  246. package/dist/chunk-VPU66PI6.mjs.map +1 -0
  247. package/dist/chunk-VZT5YNCD.mjs +228 -0
  248. package/dist/chunk-VZT5YNCD.mjs.map +1 -0
  249. package/dist/chunk-WYVXXEZI.mjs +46 -0
  250. package/dist/chunk-WYVXXEZI.mjs.map +1 -0
  251. package/dist/chunk-XDUVO3IZ.mjs +547 -0
  252. package/dist/chunk-XDUVO3IZ.mjs.map +1 -0
  253. package/dist/chunk-Y7TIWH4I.mjs +25 -0
  254. package/dist/chunk-Y7TIWH4I.mjs.map +1 -0
  255. package/dist/chunk-YEFM2ERQ.cjs +143 -0
  256. package/dist/chunk-YEFM2ERQ.cjs.map +1 -0
  257. package/dist/chunk-YHNI5NIX.mjs +361 -0
  258. package/dist/chunk-YHNI5NIX.mjs.map +1 -0
  259. package/dist/chunk-ZTT5XJR7.mjs +1921 -0
  260. package/dist/chunk-ZTT5XJR7.mjs.map +1 -0
  261. package/dist/index.cjs +2091 -14564
  262. package/dist/index.cjs.map +1 -1
  263. package/dist/index.d.cts +62 -767
  264. package/dist/index.d.ts +62 -767
  265. package/dist/index.mjs +1873 -14394
  266. package/dist/index.mjs.map +1 -1
  267. package/dist/read-only-table.cjs +15 -0
  268. package/dist/read-only-table.cjs.map +1 -0
  269. package/dist/read-only-table.d.cts +10 -0
  270. package/dist/read-only-table.d.ts +10 -0
  271. package/dist/read-only-table.mjs +6 -0
  272. package/dist/read-only-table.mjs.map +1 -0
  273. package/dist/rich-text.cjs +24 -0
  274. package/dist/rich-text.cjs.map +1 -0
  275. package/dist/rich-text.d.cts +8 -0
  276. package/dist/rich-text.d.ts +8 -0
  277. package/dist/rich-text.mjs +11 -0
  278. package/dist/rich-text.mjs.map +1 -0
  279. package/dist/richTextClassName--8wkuHkW.d.cts +10 -0
  280. package/dist/richTextClassName--8wkuHkW.d.ts +10 -0
  281. package/dist/smart.cjs +23 -0
  282. package/dist/smart.cjs.map +1 -0
  283. package/dist/smart.d.cts +23 -0
  284. package/dist/smart.d.ts +23 -0
  285. package/dist/smart.mjs +10 -0
  286. package/dist/smart.mjs.map +1 -0
  287. package/dist/types-CYtJk8H9.d.cts +782 -0
  288. package/dist/types-CYtJk8H9.d.ts +782 -0
  289. package/package.json +20 -2
@@ -0,0 +1,151 @@
1
+ import { Checkbox } from './chunk-GNZWSVTB.mjs';
2
+ import { Slider } from './chunk-SCMXLRX5.mjs';
3
+ import { getThemeConfig } from './chunk-Y7TIWH4I.mjs';
4
+ import { isLabelVisible, FieldRequiredIndicator, fieldLabelClass, fieldDescriptionClass, fieldErrorClass, fieldWrapperClass } from './chunk-WYVXXEZI.mjs';
5
+ import { useForm } from './chunk-7L2JOWGA.mjs';
6
+ import { Input } from './chunk-VNFBUAZD.mjs';
7
+ import { Select, SelectTrigger, SelectValue, SelectContent, SelectItem } from './chunk-AZHTIUOL.mjs';
8
+ import { useField, normalizePainScaleFlags } from './chunk-ZTT5XJR7.mjs';
9
+ import { Label } from './chunk-HEFZA2AH.mjs';
10
+ import { cn } from './chunk-VPU66PI6.mjs';
11
+ import { useMemo } from 'react';
12
+ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
13
+
14
+ function isFlagSelected(selected, optValue) {
15
+ return selected.some((v) => v === optValue || String(v) === String(optValue));
16
+ }
17
+ var PainScaleFlagsWidget = ({ fieldId }) => {
18
+ const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);
19
+ const { state } = useForm();
20
+ const showError = !!error && (touched || state.submitAttempted);
21
+ if (!fieldDef || fieldDef.type !== "pain_scale_flags") return null;
22
+ const def = fieldDef;
23
+ const min = def.min ?? 0;
24
+ const max = def.max ?? 10;
25
+ const step = def.step ?? 1;
26
+ const flagOptions = def.options ?? [];
27
+ const safe = useMemo(
28
+ () => normalizePainScaleFlags(value, { min, max }),
29
+ [value, min, max]
30
+ );
31
+ const theme = getThemeConfig("textarea", def.theme);
32
+ const wrapperClass = theme?.wrapperClassName ?? "space-y-2";
33
+ const labelClass = theme?.labelClassName;
34
+ const showLabel = isLabelVisible(def);
35
+ const update = (next) => {
36
+ setValue(normalizePainScaleFlags(next, { min, max }));
37
+ setTouched();
38
+ };
39
+ const toggleFlag = (optValue) => {
40
+ const sel = safe.flags;
41
+ const isSelected = isFlagSelected(sel, optValue);
42
+ const nextFlags = isSelected ? sel.filter((v) => v !== optValue && String(v) !== String(optValue)) : [...sel, String(optValue)];
43
+ update({ pain: safe.pain, flags: nextFlags, bp: safe.bp, upt: safe.upt });
44
+ };
45
+ const setBp = (bp) => update({ pain: safe.pain, flags: safe.flags, bp, upt: safe.upt });
46
+ const setUpt = (upt) => update({ pain: safe.pain, flags: safe.flags, bp: safe.bp, upt });
47
+ const labelContent = /* @__PURE__ */ jsxs(Fragment, { children: [
48
+ def.label,
49
+ " ",
50
+ /* @__PURE__ */ jsx(FieldRequiredIndicator, { fieldDef: def })
51
+ ] });
52
+ const labelEl = showLabel ? theme ? /* @__PURE__ */ jsx(Label, { className: fieldLabelClass(def, labelClass), children: labelContent }) : /* @__PURE__ */ jsx(Label, { className: fieldLabelClass(def), children: labelContent }) : null;
53
+ const bodyClass = cn(
54
+ "-mt-1 flex min-w-0 flex-col border-t border-[#D0D0D0] bg-white px-3 py-3",
55
+ disabled && "pointer-events-none opacity-60"
56
+ );
57
+ return /* @__PURE__ */ jsxs("div", { className: fieldWrapperClass(def, cn(wrapperClass, "h-full min-h-0 flex flex-col")), children: [
58
+ labelEl,
59
+ def.description && /* @__PURE__ */ jsx("p", { className: fieldDescriptionClass(def, "text-xs text-muted-foreground"), children: def.description }),
60
+ /* @__PURE__ */ jsx("div", { className: cn(bodyClass, "min-h-0 flex-1"), children: /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-3", children: [
61
+ /* @__PURE__ */ jsxs("div", { className: "space-y-2", children: [
62
+ /* @__PURE__ */ jsxs(Label, { className: "text-sm font-medium text-slate-700", children: [
63
+ "Pain score (VAS)",
64
+ /* @__PURE__ */ jsxs("span", { className: "ml-2 font-normal tabular-nums text-muted-foreground", children: [
65
+ safe.pain,
66
+ "/",
67
+ max
68
+ ] })
69
+ ] }),
70
+ /* @__PURE__ */ jsx(
71
+ Slider,
72
+ {
73
+ className: cn("py-1", showError && "rounded opacity-90 ring-1 ring-red-500"),
74
+ disabled,
75
+ min,
76
+ max,
77
+ step,
78
+ value: [safe.pain],
79
+ onValueChange: (v) => {
80
+ const n = v[0] ?? min;
81
+ update({ pain: n, flags: safe.flags, bp: safe.bp, upt: safe.upt });
82
+ }
83
+ }
84
+ )
85
+ ] }),
86
+ flagOptions.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-1.5", children: [
87
+ /* @__PURE__ */ jsx(Label, { className: "text-sm font-medium text-slate-700", children: "Triage flags" }),
88
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-x-4 gap-y-2", children: flagOptions.map((opt) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
89
+ /* @__PURE__ */ jsx(
90
+ Checkbox,
91
+ {
92
+ id: `${fieldId}-flag-${String(opt.value)}`,
93
+ checked: isFlagSelected(safe.flags, opt.value),
94
+ onCheckedChange: () => toggleFlag(opt.value),
95
+ disabled
96
+ }
97
+ ),
98
+ /* @__PURE__ */ jsx(
99
+ Label,
100
+ {
101
+ htmlFor: `${fieldId}-flag-${String(opt.value)}`,
102
+ className: "cursor-pointer text-sm font-normal leading-none",
103
+ children: opt.label
104
+ }
105
+ )
106
+ ] }, String(opt.value))) })
107
+ ] }) : null,
108
+ def.showBp || def.showUpt ? /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-1 gap-3 pt-1 sm:grid-cols-2", children: [
109
+ def.showBp ? /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
110
+ /* @__PURE__ */ jsx(Label, { htmlFor: `${fieldId}-bp`, className: "text-sm font-medium text-slate-700", children: "BP recorded" }),
111
+ /* @__PURE__ */ jsx(
112
+ Input,
113
+ {
114
+ id: `${fieldId}-bp`,
115
+ value: safe.bp ?? "",
116
+ onChange: (e) => setBp(e.target.value),
117
+ placeholder: "e.g. 130/86",
118
+ disabled,
119
+ className: "h-8 text-xs"
120
+ }
121
+ )
122
+ ] }) : null,
123
+ def.showUpt ? /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
124
+ /* @__PURE__ */ jsx(Label, { className: "text-sm font-medium text-slate-700", children: "UPT (if reproductive age)" }),
125
+ /* @__PURE__ */ jsxs(
126
+ Select,
127
+ {
128
+ value: safe.upt ? safe.upt : "none",
129
+ onValueChange: (val) => setUpt(val === "none" ? "" : val),
130
+ disabled,
131
+ children: [
132
+ /* @__PURE__ */ jsx(SelectTrigger, { className: "h-8 text-xs", children: /* @__PURE__ */ jsx(SelectValue, { placeholder: "\u2014" }) }),
133
+ /* @__PURE__ */ jsxs(SelectContent, { children: [
134
+ /* @__PURE__ */ jsx(SelectItem, { value: "none", children: "\u2014" }),
135
+ /* @__PURE__ */ jsx(SelectItem, { value: "Positive", children: "Positive" }),
136
+ /* @__PURE__ */ jsx(SelectItem, { value: "Negative", children: "Negative" }),
137
+ /* @__PURE__ */ jsx(SelectItem, { value: "Not done", children: "Not done" })
138
+ ] })
139
+ ]
140
+ }
141
+ )
142
+ ] }) : null
143
+ ] }) : null
144
+ ] }) }),
145
+ showError && /* @__PURE__ */ jsx("p", { className: fieldErrorClass(def, "text-xs text-red-500"), children: error })
146
+ ] });
147
+ };
148
+
149
+ export { PainScaleFlagsWidget };
150
+ //# sourceMappingURL=PainScaleFlagsWidget-E576R6QB.mjs.map
151
+ //# sourceMappingURL=PainScaleFlagsWidget-E576R6QB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/widgets/PainScaleFlagsWidget.tsx"],"names":[],"mappings":"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","file":"PainScaleFlagsWidget-E576R6QB.mjs","sourcesContent":["import React, { useMemo } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Slider } from '../shadcn/slider';\nimport { Checkbox } from '../shadcn/checkbox';\nimport { Input } from '../shadcn/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { PainScaleFlagsFieldDef, SelectOption } from '../../core/types';\nimport { normalizePainScaleFlags, type UrinePregnancyTest } from '../../core/painScaleFlags';\nimport {\n FieldRequiredIndicator,\n fieldDescriptionClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isFlagSelected(selected: string[], optValue: unknown): boolean {\n return selected.some((v) => v === optValue || String(v) === String(optValue));\n}\n\nexport const PainScaleFlagsWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef || fieldDef.type !== 'pain_scale_flags') return null;\n\n const def = fieldDef as PainScaleFlagsFieldDef;\n const min = def.min ?? 0;\n const max = def.max ?? 10;\n const step = def.step ?? 1;\n const flagOptions: SelectOption[] = def.options ?? [];\n\n const safe = useMemo(\n () => normalizePainScaleFlags(value, { min, max }),\n [value, min, max],\n );\n\n const theme = getThemeConfig('textarea', def.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const showLabel = isLabelVisible(def);\n\n const update = (next: { pain: number; flags: string[]; bp?: string; upt?: UrinePregnancyTest }) => {\n setValue(normalizePainScaleFlags(next, { min, max }));\n setTouched();\n };\n\n const toggleFlag = (optValue: unknown) => {\n const sel = safe.flags;\n const isSelected = isFlagSelected(sel, optValue);\n const nextFlags = isSelected\n ? sel.filter((v) => v !== optValue && String(v) !== String(optValue))\n : [...sel, String(optValue)];\n update({ pain: safe.pain, flags: nextFlags, bp: safe.bp, upt: safe.upt });\n };\n\n const setBp = (bp: string) => update({ pain: safe.pain, flags: safe.flags, bp, upt: safe.upt });\n const setUpt = (upt: UrinePregnancyTest) =>\n update({ pain: safe.pain, flags: safe.flags, bp: safe.bp, upt });\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n </>\n );\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 bodyClass = cn(\n '-mt-1 flex min-w-0 flex-col border-t border-[#D0D0D0] bg-white px-3 py-3',\n disabled && 'pointer-events-none opacity-60',\n );\n\n return (\n <div className={fieldWrapperClass(def, cn(wrapperClass, 'h-full min-h-0 flex flex-col'))}>\n {labelEl}\n {def.description && (\n <p className={fieldDescriptionClass(def, 'text-xs text-muted-foreground')}>\n {def.description}\n </p>\n )}\n\n <div className={cn(bodyClass, 'min-h-0 flex-1')}>\n <div className=\"min-w-0 space-y-3\">\n <div className=\"space-y-2\">\n <Label className=\"text-sm font-medium text-slate-700\">\n Pain score (VAS)\n <span className=\"ml-2 font-normal tabular-nums text-muted-foreground\">\n {safe.pain}/{max}\n </span>\n </Label>\n <Slider\n className={cn('py-1', showError && 'rounded opacity-90 ring-1 ring-red-500')}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n value={[safe.pain]}\n onValueChange={(v) => {\n const n = v[0] ?? min;\n update({ pain: n, flags: safe.flags, bp: safe.bp, upt: safe.upt });\n }}\n />\n </div>\n\n {flagOptions.length > 0 ? (\n <div className=\"min-w-0 space-y-1.5\">\n <Label className=\"text-sm font-medium text-slate-700\">Triage flags</Label>\n <div className=\"flex flex-wrap gap-x-4 gap-y-2\">\n {flagOptions.map((opt) => (\n <div key={String(opt.value)} className=\"flex items-center gap-2\">\n <Checkbox\n id={`${fieldId}-flag-${String(opt.value)}`}\n checked={isFlagSelected(safe.flags, opt.value)}\n onCheckedChange={() => toggleFlag(opt.value)}\n disabled={disabled}\n />\n <Label\n htmlFor={`${fieldId}-flag-${String(opt.value)}`}\n className=\"cursor-pointer text-sm font-normal leading-none\"\n >\n {opt.label}\n </Label>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {(def.showBp || def.showUpt) ? (\n <div className=\"grid grid-cols-1 gap-3 pt-1 sm:grid-cols-2\">\n {def.showBp ? (\n <div className=\"space-y-1\">\n <Label htmlFor={`${fieldId}-bp`} className=\"text-sm font-medium text-slate-700\">\n BP recorded\n </Label>\n <Input\n id={`${fieldId}-bp`}\n value={safe.bp ?? ''}\n onChange={(e) => setBp(e.target.value)}\n placeholder=\"e.g. 130/86\"\n disabled={disabled}\n className=\"h-8 text-xs\"\n />\n </div>\n ) : null}\n {def.showUpt ? (\n <div className=\"space-y-1\">\n <Label className=\"text-sm font-medium text-slate-700\">\n UPT (if reproductive age)\n </Label>\n <Select\n value={safe.upt ? safe.upt : 'none'}\n onValueChange={(val) =>\n setUpt(val === 'none' ? '' : (val as UrinePregnancyTest))\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">—</SelectItem>\n <SelectItem value=\"Positive\">Positive</SelectItem>\n <SelectItem value=\"Negative\">Negative</SelectItem>\n <SelectItem value=\"Not done\">Not done</SelectItem>\n </SelectContent>\n </Select>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,153 @@
1
+ 'use strict';
2
+
3
+ var chunkPZBJYPWW_cjs = require('./chunk-PZBJYPWW.cjs');
4
+ var chunkN4L76SHJ_cjs = require('./chunk-N4L76SHJ.cjs');
5
+ var chunkP62377LB_cjs = require('./chunk-P62377LB.cjs');
6
+ var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
7
+ var chunk6YX37XBM_cjs = require('./chunk-6YX37XBM.cjs');
8
+ var chunkTJHG5WHX_cjs = require('./chunk-TJHG5WHX.cjs');
9
+ var chunk4KSZUIJE_cjs = require('./chunk-4KSZUIJE.cjs');
10
+ var chunkSHQHDSA4_cjs = require('./chunk-SHQHDSA4.cjs');
11
+ var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
12
+ var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
13
+ var react = require('react');
14
+ var jsxRuntime = require('react/jsx-runtime');
15
+
16
+ function isFlagSelected(selected, optValue) {
17
+ return selected.some((v) => v === optValue || String(v) === String(optValue));
18
+ }
19
+ var PainScaleFlagsWidget = ({ fieldId }) => {
20
+ const { fieldDef, value, setValue, setTouched, error, touched, disabled } = chunkSHQHDSA4_cjs.useField(fieldId);
21
+ const { state } = chunk6YX37XBM_cjs.useForm();
22
+ const showError = !!error && (touched || state.submitAttempted);
23
+ if (!fieldDef || fieldDef.type !== "pain_scale_flags") return null;
24
+ const def = fieldDef;
25
+ const min = def.min ?? 0;
26
+ const max = def.max ?? 10;
27
+ const step = def.step ?? 1;
28
+ const flagOptions = def.options ?? [];
29
+ const safe = react.useMemo(
30
+ () => chunkSHQHDSA4_cjs.normalizePainScaleFlags(value, { min, max }),
31
+ [value, min, max]
32
+ );
33
+ const theme = chunkP62377LB_cjs.getThemeConfig("textarea", def.theme);
34
+ const wrapperClass = theme?.wrapperClassName ?? "space-y-2";
35
+ const labelClass = theme?.labelClassName;
36
+ const showLabel = chunk5E3APMY6_cjs.isLabelVisible(def);
37
+ const update = (next) => {
38
+ setValue(chunkSHQHDSA4_cjs.normalizePainScaleFlags(next, { min, max }));
39
+ setTouched();
40
+ };
41
+ const toggleFlag = (optValue) => {
42
+ const sel = safe.flags;
43
+ const isSelected = isFlagSelected(sel, optValue);
44
+ const nextFlags = isSelected ? sel.filter((v) => v !== optValue && String(v) !== String(optValue)) : [...sel, String(optValue)];
45
+ update({ pain: safe.pain, flags: nextFlags, bp: safe.bp, upt: safe.upt });
46
+ };
47
+ const setBp = (bp) => update({ pain: safe.pain, flags: safe.flags, bp, upt: safe.upt });
48
+ const setUpt = (upt) => update({ pain: safe.pain, flags: safe.flags, bp: safe.bp, upt });
49
+ const labelContent = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
50
+ def.label,
51
+ " ",
52
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef: def })
53
+ ] });
54
+ const labelEl = showLabel ? theme ? /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: chunk5E3APMY6_cjs.fieldLabelClass(def, labelClass), children: labelContent }) : /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: chunk5E3APMY6_cjs.fieldLabelClass(def), children: labelContent }) : null;
55
+ const bodyClass = chunkFHHISVCH_cjs.cn(
56
+ "-mt-1 flex min-w-0 flex-col border-t border-[#D0D0D0] bg-white px-3 py-3",
57
+ disabled && "pointer-events-none opacity-60"
58
+ );
59
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(def, chunkFHHISVCH_cjs.cn(wrapperClass, "h-full min-h-0 flex flex-col")), children: [
60
+ labelEl,
61
+ def.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldDescriptionClass(def, "text-xs text-muted-foreground"), children: def.description }),
62
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: chunkFHHISVCH_cjs.cn(bodyClass, "min-h-0 flex-1"), children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 space-y-3", children: [
63
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
64
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkJMGUUFOJ_cjs.Label, { className: "text-sm font-medium text-slate-700", children: [
65
+ "Pain score (VAS)",
66
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-2 font-normal tabular-nums text-muted-foreground", children: [
67
+ safe.pain,
68
+ "/",
69
+ max
70
+ ] })
71
+ ] }),
72
+ /* @__PURE__ */ jsxRuntime.jsx(
73
+ chunkN4L76SHJ_cjs.Slider,
74
+ {
75
+ className: chunkFHHISVCH_cjs.cn("py-1", showError && "rounded opacity-90 ring-1 ring-red-500"),
76
+ disabled,
77
+ min,
78
+ max,
79
+ step,
80
+ value: [safe.pain],
81
+ onValueChange: (v) => {
82
+ const n = v[0] ?? min;
83
+ update({ pain: n, flags: safe.flags, bp: safe.bp, upt: safe.upt });
84
+ }
85
+ }
86
+ )
87
+ ] }),
88
+ flagOptions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 space-y-1.5", children: [
89
+ /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: "text-sm font-medium text-slate-700", children: "Triage flags" }),
90
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-x-4 gap-y-2", children: flagOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
91
+ /* @__PURE__ */ jsxRuntime.jsx(
92
+ chunkPZBJYPWW_cjs.Checkbox,
93
+ {
94
+ id: `${fieldId}-flag-${String(opt.value)}`,
95
+ checked: isFlagSelected(safe.flags, opt.value),
96
+ onCheckedChange: () => toggleFlag(opt.value),
97
+ disabled
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsxRuntime.jsx(
101
+ chunkJMGUUFOJ_cjs.Label,
102
+ {
103
+ htmlFor: `${fieldId}-flag-${String(opt.value)}`,
104
+ className: "cursor-pointer text-sm font-normal leading-none",
105
+ children: opt.label
106
+ }
107
+ )
108
+ ] }, String(opt.value))) })
109
+ ] }) : null,
110
+ def.showBp || def.showUpt ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 pt-1 sm:grid-cols-2", children: [
111
+ def.showBp ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
112
+ /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { htmlFor: `${fieldId}-bp`, className: "text-sm font-medium text-slate-700", children: "BP recorded" }),
113
+ /* @__PURE__ */ jsxRuntime.jsx(
114
+ chunkTJHG5WHX_cjs.Input,
115
+ {
116
+ id: `${fieldId}-bp`,
117
+ value: safe.bp ?? "",
118
+ onChange: (e) => setBp(e.target.value),
119
+ placeholder: "e.g. 130/86",
120
+ disabled,
121
+ className: "h-8 text-xs"
122
+ }
123
+ )
124
+ ] }) : null,
125
+ def.showUpt ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
126
+ /* @__PURE__ */ jsxRuntime.jsx(chunkJMGUUFOJ_cjs.Label, { className: "text-sm font-medium text-slate-700", children: "UPT (if reproductive age)" }),
127
+ /* @__PURE__ */ jsxRuntime.jsxs(
128
+ chunk4KSZUIJE_cjs.Select,
129
+ {
130
+ value: safe.upt ? safe.upt : "none",
131
+ onValueChange: (val) => setUpt(val === "none" ? "" : val),
132
+ disabled,
133
+ children: [
134
+ /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectTrigger, { className: "h-8 text-xs", children: /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectValue, { placeholder: "\u2014" }) }),
135
+ /* @__PURE__ */ jsxRuntime.jsxs(chunk4KSZUIJE_cjs.SelectContent, { children: [
136
+ /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: "none", children: "\u2014" }),
137
+ /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: "Positive", children: "Positive" }),
138
+ /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: "Negative", children: "Negative" }),
139
+ /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: "Not done", children: "Not done" })
140
+ ] })
141
+ ]
142
+ }
143
+ )
144
+ ] }) : null
145
+ ] }) : null
146
+ ] }) }),
147
+ showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldErrorClass(def, "text-xs text-red-500"), children: error })
148
+ ] });
149
+ };
150
+
151
+ exports.PainScaleFlagsWidget = PainScaleFlagsWidget;
152
+ //# sourceMappingURL=PainScaleFlagsWidget-QHGESXNE.cjs.map
153
+ //# sourceMappingURL=PainScaleFlagsWidget-QHGESXNE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/widgets/PainScaleFlagsWidget.tsx"],"names":["useField","useForm","useMemo","normalizePainScaleFlags","getThemeConfig","isLabelVisible","jsxs","Fragment","jsx","FieldRequiredIndicator","Label","fieldLabelClass","cn","fieldWrapperClass","fieldDescriptionClass","Slider","Checkbox","Input","Select","SelectTrigger","SelectValue","SelectContent","SelectItem","fieldErrorClass"],"mappings":"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","file":"PainScaleFlagsWidget-QHGESXNE.cjs","sourcesContent":["import React, { useMemo } from 'react';\nimport { useField } from '../../react/useField';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport { Slider } from '../shadcn/slider';\nimport { Checkbox } from '../shadcn/checkbox';\nimport { Input } from '../shadcn/input';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { getThemeConfig } from '../themes';\nimport { cn } from '../../core/utils';\nimport type { PainScaleFlagsFieldDef, SelectOption } from '../../core/types';\nimport { normalizePainScaleFlags, type UrinePregnancyTest } from '../../core/painScaleFlags';\nimport {\n FieldRequiredIndicator,\n fieldDescriptionClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isFlagSelected(selected: string[], optValue: unknown): boolean {\n return selected.some((v) => v === optValue || String(v) === String(optValue));\n}\n\nexport const PainScaleFlagsWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, touched, disabled } = useField(fieldId);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n if (!fieldDef || fieldDef.type !== 'pain_scale_flags') return null;\n\n const def = fieldDef as PainScaleFlagsFieldDef;\n const min = def.min ?? 0;\n const max = def.max ?? 10;\n const step = def.step ?? 1;\n const flagOptions: SelectOption[] = def.options ?? [];\n\n const safe = useMemo(\n () => normalizePainScaleFlags(value, { min, max }),\n [value, min, max],\n );\n\n const theme = getThemeConfig('textarea', def.theme);\n const wrapperClass = theme?.wrapperClassName ?? 'space-y-2';\n const labelClass = theme?.labelClassName;\n const showLabel = isLabelVisible(def);\n\n const update = (next: { pain: number; flags: string[]; bp?: string; upt?: UrinePregnancyTest }) => {\n setValue(normalizePainScaleFlags(next, { min, max }));\n setTouched();\n };\n\n const toggleFlag = (optValue: unknown) => {\n const sel = safe.flags;\n const isSelected = isFlagSelected(sel, optValue);\n const nextFlags = isSelected\n ? sel.filter((v) => v !== optValue && String(v) !== String(optValue))\n : [...sel, String(optValue)];\n update({ pain: safe.pain, flags: nextFlags, bp: safe.bp, upt: safe.upt });\n };\n\n const setBp = (bp: string) => update({ pain: safe.pain, flags: safe.flags, bp, upt: safe.upt });\n const setUpt = (upt: UrinePregnancyTest) =>\n update({ pain: safe.pain, flags: safe.flags, bp: safe.bp, upt });\n\n const labelContent = (\n <>\n {def.label}{' '}\n <FieldRequiredIndicator fieldDef={def} />\n </>\n );\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 bodyClass = cn(\n '-mt-1 flex min-w-0 flex-col border-t border-[#D0D0D0] bg-white px-3 py-3',\n disabled && 'pointer-events-none opacity-60',\n );\n\n return (\n <div className={fieldWrapperClass(def, cn(wrapperClass, 'h-full min-h-0 flex flex-col'))}>\n {labelEl}\n {def.description && (\n <p className={fieldDescriptionClass(def, 'text-xs text-muted-foreground')}>\n {def.description}\n </p>\n )}\n\n <div className={cn(bodyClass, 'min-h-0 flex-1')}>\n <div className=\"min-w-0 space-y-3\">\n <div className=\"space-y-2\">\n <Label className=\"text-sm font-medium text-slate-700\">\n Pain score (VAS)\n <span className=\"ml-2 font-normal tabular-nums text-muted-foreground\">\n {safe.pain}/{max}\n </span>\n </Label>\n <Slider\n className={cn('py-1', showError && 'rounded opacity-90 ring-1 ring-red-500')}\n disabled={disabled}\n min={min}\n max={max}\n step={step}\n value={[safe.pain]}\n onValueChange={(v) => {\n const n = v[0] ?? min;\n update({ pain: n, flags: safe.flags, bp: safe.bp, upt: safe.upt });\n }}\n />\n </div>\n\n {flagOptions.length > 0 ? (\n <div className=\"min-w-0 space-y-1.5\">\n <Label className=\"text-sm font-medium text-slate-700\">Triage flags</Label>\n <div className=\"flex flex-wrap gap-x-4 gap-y-2\">\n {flagOptions.map((opt) => (\n <div key={String(opt.value)} className=\"flex items-center gap-2\">\n <Checkbox\n id={`${fieldId}-flag-${String(opt.value)}`}\n checked={isFlagSelected(safe.flags, opt.value)}\n onCheckedChange={() => toggleFlag(opt.value)}\n disabled={disabled}\n />\n <Label\n htmlFor={`${fieldId}-flag-${String(opt.value)}`}\n className=\"cursor-pointer text-sm font-normal leading-none\"\n >\n {opt.label}\n </Label>\n </div>\n ))}\n </div>\n </div>\n ) : null}\n\n {(def.showBp || def.showUpt) ? (\n <div className=\"grid grid-cols-1 gap-3 pt-1 sm:grid-cols-2\">\n {def.showBp ? (\n <div className=\"space-y-1\">\n <Label htmlFor={`${fieldId}-bp`} className=\"text-sm font-medium text-slate-700\">\n BP recorded\n </Label>\n <Input\n id={`${fieldId}-bp`}\n value={safe.bp ?? ''}\n onChange={(e) => setBp(e.target.value)}\n placeholder=\"e.g. 130/86\"\n disabled={disabled}\n className=\"h-8 text-xs\"\n />\n </div>\n ) : null}\n {def.showUpt ? (\n <div className=\"space-y-1\">\n <Label className=\"text-sm font-medium text-slate-700\">\n UPT (if reproductive age)\n </Label>\n <Select\n value={safe.upt ? safe.upt : 'none'}\n onValueChange={(val) =>\n setUpt(val === 'none' ? '' : (val as UrinePregnancyTest))\n }\n disabled={disabled}\n >\n <SelectTrigger className=\"h-8 text-xs\">\n <SelectValue placeholder=\"—\" />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"none\">—</SelectItem>\n <SelectItem value=\"Positive\">Positive</SelectItem>\n <SelectItem value=\"Negative\">Negative</SelectItem>\n <SelectItem value=\"Not done\">Not done</SelectItem>\n </SelectContent>\n </Select>\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n </div>\n\n {showError && (\n <p className={fieldErrorClass(def, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,6 @@
1
+ export { ReadOnlyTable } from './chunk-DZYV47QC.mjs';
2
+ import './chunk-UULLSS4O.mjs';
3
+ import './chunk-HEFZA2AH.mjs';
4
+ import './chunk-VPU66PI6.mjs';
5
+ //# sourceMappingURL=ReadOnlyTable-4Y2XW4MX.mjs.map
6
+ //# sourceMappingURL=ReadOnlyTable-4Y2XW4MX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ReadOnlyTable-4Y2XW4MX.mjs"}
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ var chunkQS6WG2XJ_cjs = require('./chunk-QS6WG2XJ.cjs');
4
+ require('./chunk-KMJOTMUQ.cjs');
5
+ require('./chunk-JMGUUFOJ.cjs');
6
+ require('./chunk-FHHISVCH.cjs');
7
+
8
+
9
+
10
+ Object.defineProperty(exports, "ReadOnlyTable", {
11
+ enumerable: true,
12
+ get: function () { return chunkQS6WG2XJ_cjs.ReadOnlyTable; }
13
+ });
14
+ //# sourceMappingURL=ReadOnlyTable-L7G6GWEJ.cjs.map
15
+ //# sourceMappingURL=ReadOnlyTable-L7G6GWEJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"ReadOnlyTable-L7G6GWEJ.cjs"}
@@ -0,0 +1,171 @@
1
+ 'use strict';
2
+
3
+ var chunkUGGUIXUS_cjs = require('./chunk-UGGUIXUS.cjs');
4
+ var chunk5E3APMY6_cjs = require('./chunk-5E3APMY6.cjs');
5
+ var chunk6YX37XBM_cjs = require('./chunk-6YX37XBM.cjs');
6
+ var chunk4KSZUIJE_cjs = require('./chunk-4KSZUIJE.cjs');
7
+ var chunkSHQHDSA4_cjs = require('./chunk-SHQHDSA4.cjs');
8
+ var chunkJMGUUFOJ_cjs = require('./chunk-JMGUUFOJ.cjs');
9
+ require('./chunk-FHHISVCH.cjs');
10
+ var react = require('react');
11
+ var jsxRuntime = require('react/jsx-runtime');
12
+
13
+ function normalizeOptions(response) {
14
+ if (Array.isArray(response)) {
15
+ return response.map((o) => ({ label: String(o.label), value: String(o.value) }));
16
+ }
17
+ if (response?.specializations?.length) {
18
+ return response.specializations.map((s) => ({ label: s, value: s }));
19
+ }
20
+ return [];
21
+ }
22
+ function normalizeValue(value) {
23
+ if (!value || !Array.isArray(value)) return [];
24
+ return value.map((item) => {
25
+ if (item && typeof item === "object" && "specialization" in item) {
26
+ const s = item.specialization;
27
+ const u = item.is_urgent;
28
+ return { specialization: String(s), is_urgent: Boolean(u) };
29
+ }
30
+ return { specialization: String(item), is_urgent: false };
31
+ });
32
+ }
33
+ var ReferralWidget = ({ fieldId }) => {
34
+ const { fieldDef, value, setValue, setTouched, error, disabled, touched } = chunkSHQHDSA4_cjs.useField(fieldId);
35
+ const handlers = chunkSHQHDSA4_cjs.useFieldHandlers(fieldId);
36
+ const [options, setOptions] = react.useState([]);
37
+ const [loading, setLoading] = react.useState(false);
38
+ const { state } = chunk6YX37XBM_cjs.useForm();
39
+ const showError = !!error && (touched || state.submitAttempted);
40
+ const selectedItems = normalizeValue(value);
41
+ const availableOptions = options.filter(
42
+ (opt) => !selectedItems.some((item) => item.specialization === opt.value)
43
+ );
44
+ const loadOptions = react.useCallback(async () => {
45
+ if (handlers.onFetchOptions) {
46
+ setLoading(true);
47
+ try {
48
+ const res = await handlers.onFetchOptions();
49
+ setOptions(normalizeOptions(res));
50
+ } finally {
51
+ setLoading(false);
52
+ }
53
+ return;
54
+ }
55
+ const def = fieldDef;
56
+ if (def?.options?.length) {
57
+ setOptions(def.options.map((o) => ({ label: String(o.label), value: String(o.value) })));
58
+ } else if (def?.dataSource) {
59
+ setLoading(true);
60
+ chunkUGGUIXUS_cjs.fetchOptions(def.dataSource.source, def.dataSource.params).then((opts) => setOptions(opts.map((o) => ({ label: String(o.label), value: String(o.value) })))).finally(() => setLoading(false));
61
+ } else {
62
+ setOptions([]);
63
+ }
64
+ }, [fieldDef, handlers]);
65
+ react.useEffect(() => {
66
+ if (!fieldDef) return;
67
+ loadOptions();
68
+ }, [fieldDef, loadOptions]);
69
+ const handleAdd = react.useCallback(
70
+ (specialization) => {
71
+ const next = [...selectedItems, { specialization, is_urgent: false }];
72
+ setValue(next);
73
+ setTouched();
74
+ },
75
+ [selectedItems, setValue, setTouched]
76
+ );
77
+ const handleRemove = react.useCallback(
78
+ (specialization) => {
79
+ const next = selectedItems.filter((item) => item.specialization !== specialization);
80
+ setValue(next);
81
+ setTouched();
82
+ },
83
+ [selectedItems, setValue, setTouched]
84
+ );
85
+ const handleToggleUrgent = react.useCallback(
86
+ (specialization) => {
87
+ const next = selectedItems.map(
88
+ (item) => item.specialization === specialization ? { ...item, is_urgent: !item.is_urgent } : item
89
+ );
90
+ setValue(next);
91
+ setTouched();
92
+ },
93
+ [selectedItems, setValue, setTouched]
94
+ );
95
+ if (!fieldDef) return null;
96
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: chunk5E3APMY6_cjs.fieldWrapperClass(fieldDef, "space-y-2"), children: [
97
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkJMGUUFOJ_cjs.Label, { htmlFor: fieldId, className: chunk5E3APMY6_cjs.fieldLabelClass(fieldDef), children: [
98
+ "Referral to ",
99
+ /* @__PURE__ */ jsxRuntime.jsx(chunk5E3APMY6_cjs.FieldRequiredIndicator, { fieldDef })
100
+ ] }),
101
+ loading && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground", children: "Loading..." }),
102
+ !loading && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
103
+ /* @__PURE__ */ jsxRuntime.jsxs(
104
+ chunk4KSZUIJE_cjs.Select,
105
+ {
106
+ disabled,
107
+ value: "",
108
+ onValueChange: (val) => {
109
+ if (val) {
110
+ handleAdd(val);
111
+ }
112
+ },
113
+ children: [
114
+ /* @__PURE__ */ jsxRuntime.jsx(
115
+ chunk4KSZUIJE_cjs.SelectTrigger,
116
+ {
117
+ id: fieldId,
118
+ className: chunk5E3APMY6_cjs.fieldControlClass(fieldDef, showError ? "border-red-500" : ""),
119
+ children: /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectValue, { placeholder: "Select specializations..." })
120
+ }
121
+ ),
122
+ /* @__PURE__ */ jsxRuntime.jsxs(chunk4KSZUIJE_cjs.SelectContent, { children: [
123
+ availableOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(chunk4KSZUIJE_cjs.SelectItem, { value: opt.value, children: opt.label }, opt.value)),
124
+ availableOptions.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "py-2 px-2 text-sm text-muted-foreground", children: "All specializations selected" })
125
+ ] })
126
+ ]
127
+ },
128
+ `referral-${selectedItems.map((i) => i.specialization).join(",")}`
129
+ ),
130
+ selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1.5 flex h-12 flex-wrap content-start gap-1.5 overflow-y-auto pr-1", children: selectedItems.map((item) => {
131
+ const isUrgent = item.is_urgent;
132
+ const chipClass = isUrgent ? "inline-flex items-center gap-0.5 px-2 py-0.5 bg-red-100 text-red-800 border border-red-300 rounded-full text-xs max-w-full cursor-pointer hover:bg-red-200 transition-colors" : "inline-flex items-center gap-0.5 px-2 py-0.5 bg-blue-100 text-blue-800 rounded-full text-xs max-w-full cursor-pointer hover:bg-blue-200 transition-colors";
133
+ return /* @__PURE__ */ jsxRuntime.jsxs(
134
+ "div",
135
+ {
136
+ className: chipClass,
137
+ onClick: (e) => {
138
+ if (e.target instanceof HTMLElement && e.target.closest("button")) return;
139
+ handleToggleUrgent(item.specialization);
140
+ },
141
+ children: [
142
+ isUrgent && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 bg-red-600 text-white text-[10px] font-bold px-1 py-0.5 rounded mr-1", children: "U" }),
143
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate max-w-[120px]", children: item.specialization }),
144
+ /* @__PURE__ */ jsxRuntime.jsx(
145
+ "button",
146
+ {
147
+ type: "button",
148
+ onClick: (e) => {
149
+ e.stopPropagation();
150
+ handleRemove(item.specialization);
151
+ },
152
+ className: "ml-0.5 text-blue-600 hover:text-blue-800 focus:outline-none flex-shrink-0 text-sm leading-none",
153
+ "aria-label": `Remove ${item.specialization}`,
154
+ children: "\xD7"
155
+ }
156
+ )
157
+ ]
158
+ },
159
+ item.specialization
160
+ );
161
+ }) }),
162
+ selectedItems.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-1", children: "No specializations selected" }),
163
+ selectedItems.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-muted-foreground mt-1.5", children: "Click a chip to mark as urgent" })
164
+ ] }),
165
+ showError && /* @__PURE__ */ jsxRuntime.jsx("p", { className: chunk5E3APMY6_cjs.fieldErrorClass(fieldDef, "text-xs text-red-500"), children: error })
166
+ ] });
167
+ };
168
+
169
+ exports.ReferralWidget = ReferralWidget;
170
+ //# sourceMappingURL=ReferralWidget-J2PWYFDT.cjs.map
171
+ //# sourceMappingURL=ReferralWidget-J2PWYFDT.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ui/widgets/ReferralWidget.tsx"],"names":["useField","useFieldHandlers","useState","useForm","useCallback","fetchOptions","useEffect","fieldWrapperClass","jsxs","Label","fieldLabelClass","jsx","FieldRequiredIndicator","Fragment","Select","SelectTrigger","fieldControlClass","SelectValue","SelectContent","SelectItem","fieldErrorClass"],"mappings":"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","file":"ReferralWidget-J2PWYFDT.cjs","sourcesContent":["import React, { useCallback, useEffect, useState } from 'react';\nimport { useField } from '../../react/useField';\nimport { useFieldHandlers } from '../../react/FormProvider';\nimport { useForm } from '../../react/useForm';\nimport { Label } from '../shadcn/label';\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '../shadcn/select';\nimport { fetchOptions } from '../../core/asyncOptions';\nimport type { ReferralFieldDef, ReferralItem } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n} from '../../react/fieldStyle';\n\nfunction normalizeOptions(\n response: { specializations?: string[] } | { label: string; value: any }[]\n): { label: string; value: string }[] {\n if (Array.isArray(response)) {\n return response.map((o) => ({ label: String(o.label), value: String(o.value) }));\n }\n if (response?.specializations?.length) {\n return response.specializations.map((s) => ({ label: s, value: s }));\n }\n return [];\n}\n\nfunction normalizeValue(value: unknown): ReferralItem[] {\n if (!value || !Array.isArray(value)) return [];\n return value.map((item) => {\n if (item && typeof item === 'object' && 'specialization' in item) {\n const s = (item as ReferralItem).specialization;\n const u = (item as ReferralItem).is_urgent;\n return { specialization: String(s), is_urgent: Boolean(u) };\n }\n return { specialization: String(item), is_urgent: false };\n });\n}\n\nexport const ReferralWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { fieldDef, value, setValue, setTouched, error, disabled, touched } = useField(fieldId);\n const handlers = useFieldHandlers(fieldId);\n const [options, setOptions] = useState<{ label: string; value: string }[]>([]);\n const [loading, setLoading] = useState(false);\n const { state } = useForm();\n const showError = !!error && (touched || state.submitAttempted);\n\n const selectedItems = normalizeValue(value);\n const availableOptions = options.filter(\n (opt) => !selectedItems.some((item) => item.specialization === opt.value)\n );\n\n const loadOptions = useCallback(async () => {\n if (handlers.onFetchOptions) {\n setLoading(true);\n try {\n const res = await handlers.onFetchOptions();\n setOptions(normalizeOptions(res));\n } finally {\n setLoading(false);\n }\n return;\n }\n const def = fieldDef as ReferralFieldDef | undefined;\n if (def?.options?.length) {\n setOptions(def.options.map((o) => ({ label: String(o.label), value: String(o.value) })));\n } else if (def?.dataSource) {\n setLoading(true);\n fetchOptions(def.dataSource.source, def.dataSource.params)\n .then((opts) => setOptions(opts.map((o) => ({ label: String(o.label), value: String(o.value) }))))\n .finally(() => setLoading(false));\n } else {\n setOptions([]);\n }\n }, [fieldDef, handlers]);\n\n useEffect(() => {\n if (!fieldDef) return;\n loadOptions();\n }, [fieldDef, loadOptions]);\n\n const handleAdd = useCallback(\n (specialization: string) => {\n const next = [...selectedItems, { specialization, is_urgent: false }];\n setValue(next);\n setTouched();\n },\n [selectedItems, setValue, setTouched]\n );\n\n const handleRemove = useCallback(\n (specialization: string) => {\n const next = selectedItems.filter((item) => item.specialization !== specialization);\n setValue(next);\n setTouched();\n },\n [selectedItems, setValue, setTouched]\n );\n\n const handleToggleUrgent = useCallback(\n (specialization: string) => {\n const next = selectedItems.map((item) =>\n item.specialization === specialization\n ? { ...item, is_urgent: !item.is_urgent }\n : item\n );\n setValue(next);\n setTouched();\n },\n [selectedItems, setValue, setTouched]\n );\n\n if (!fieldDef) return null;\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n Referral to <FieldRequiredIndicator fieldDef={fieldDef} />\n </Label>\n\n {loading && <p className=\"text-xs text-muted-foreground\">Loading...</p>}\n\n {!loading && (\n <>\n <Select\n key={`referral-${selectedItems.map((i) => i.specialization).join(',')}`}\n disabled={disabled}\n value=\"\"\n onValueChange={(val) => {\n if (val) {\n handleAdd(val);\n }\n }}\n >\n <SelectTrigger\n id={fieldId}\n className={fieldControlClass(fieldDef, showError ? 'border-red-500' : '')}\n >\n <SelectValue placeholder=\"Select specializations...\" />\n </SelectTrigger>\n <SelectContent>\n {availableOptions.map((opt) => (\n <SelectItem key={opt.value} value={opt.value}>\n {opt.label}\n </SelectItem>\n ))}\n {availableOptions.length === 0 && (\n <div className=\"py-2 px-2 text-sm text-muted-foreground\">\n All specializations selected\n </div>\n )}\n </SelectContent>\n </Select>\n\n {selectedItems.length > 0 && (\n <div className=\"mt-1.5 flex h-12 flex-wrap content-start gap-1.5 overflow-y-auto pr-1\">\n {selectedItems.map((item) => {\n const isUrgent = item.is_urgent;\n const chipClass = isUrgent\n ? 'inline-flex items-center gap-0.5 px-2 py-0.5 bg-red-100 text-red-800 border border-red-300 rounded-full text-xs max-w-full cursor-pointer hover:bg-red-200 transition-colors'\n : 'inline-flex items-center gap-0.5 px-2 py-0.5 bg-blue-100 text-blue-800 rounded-full text-xs max-w-full cursor-pointer hover:bg-blue-200 transition-colors';\n return (\n <div\n key={item.specialization}\n className={chipClass}\n onClick={(e) => {\n if (e.target instanceof HTMLElement && e.target.closest('button')) return;\n handleToggleUrgent(item.specialization);\n }}\n >\n {isUrgent && (\n <span className=\"flex-shrink-0 bg-red-600 text-white text-[10px] font-bold px-1 py-0.5 rounded mr-1\">\n U\n </span>\n )}\n <span className=\"truncate max-w-[120px]\">{item.specialization}</span>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(item.specialization);\n }}\n className=\"ml-0.5 text-blue-600 hover:text-blue-800 focus:outline-none flex-shrink-0 text-sm leading-none\"\n aria-label={`Remove ${item.specialization}`}\n >\n ×\n </button>\n </div>\n );\n })}\n </div>\n )}\n\n {selectedItems.length === 0 && (\n <p className=\"text-xs text-muted-foreground mt-1\">No specializations selected</p>\n )}\n\n {selectedItems.length > 0 && (\n <p className=\"text-xs text-muted-foreground mt-1.5\">\n Click a chip to mark as urgent\n </p>\n )}\n </>\n )}\n\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n"]}