formanitor 0.2.7 → 0.2.8

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 (223) hide show
  1. package/dist/{AddInvestigationWidget-MSY4VSQZ.cjs → AddInvestigationWidget-4AZ7HTJY.cjs} +7 -7
  2. package/dist/{AddInvestigationWidget-MSY4VSQZ.cjs.map → AddInvestigationWidget-4AZ7HTJY.cjs.map} +1 -1
  3. package/dist/{AddInvestigationWidget-A2JS2ETO.mjs → AddInvestigationWidget-MSW4FUHR.mjs} +3 -3
  4. package/dist/{AddInvestigationWidget-A2JS2ETO.mjs.map → AddInvestigationWidget-MSW4FUHR.mjs.map} +1 -1
  5. package/dist/{AddMedicationWidget-B5RXRYBK.mjs → AddMedicationWidget-OEULICY3.mjs} +7 -5
  6. package/dist/AddMedicationWidget-OEULICY3.mjs.map +1 -0
  7. package/dist/AddMedicationWidget-UDVVDKHR.cjs +34 -0
  8. package/dist/AddMedicationWidget-UDVVDKHR.cjs.map +1 -0
  9. package/dist/{AddProcedureWidget-YW4EV66W.mjs → AddProcedureWidget-7IZ7SY7N.mjs} +3 -3
  10. package/dist/{AddProcedureWidget-YW4EV66W.mjs.map → AddProcedureWidget-7IZ7SY7N.mjs.map} +1 -1
  11. package/dist/{AddProcedureWidget-QUNDIZGR.cjs → AddProcedureWidget-NQCN5FBQ.cjs} +6 -6
  12. package/dist/{AddProcedureWidget-QUNDIZGR.cjs.map → AddProcedureWidget-NQCN5FBQ.cjs.map} +1 -1
  13. package/dist/{BiometryIolWorkupWidget-FWO3IWTF.cjs → BiometryIolWorkupWidget-NTYCAGGX.cjs} +6 -6
  14. package/dist/{BiometryIolWorkupWidget-FWO3IWTF.cjs.map → BiometryIolWorkupWidget-NTYCAGGX.cjs.map} +1 -1
  15. package/dist/{BiometryIolWorkupWidget-5RZP34FF.mjs → BiometryIolWorkupWidget-ZJRUTQZK.mjs} +4 -4
  16. package/dist/{BiometryIolWorkupWidget-5RZP34FF.mjs.map → BiometryIolWorkupWidget-ZJRUTQZK.mjs.map} +1 -1
  17. package/dist/BpeChartWidget-OL5WKSQG.mjs +7 -0
  18. package/dist/{BpeChartWidget-HATASHAC.mjs.map → BpeChartWidget-OL5WKSQG.mjs.map} +1 -1
  19. package/dist/BpeChartWidget-WYDP2BVS.cjs +28 -0
  20. package/dist/{BpeChartWidget-VZRH7M7L.cjs.map → BpeChartWidget-WYDP2BVS.cjs.map} +1 -1
  21. package/dist/{DateTimeWidget-RJ7SATVA.cjs → DateTimeWidget-3E6N4NOK.cjs} +6 -6
  22. package/dist/{DateTimeWidget-RJ7SATVA.cjs.map → DateTimeWidget-3E6N4NOK.cjs.map} +1 -1
  23. package/dist/{DateTimeWidget-KRX4O6OD.mjs → DateTimeWidget-TAHCCYCX.mjs} +4 -4
  24. package/dist/{DateTimeWidget-KRX4O6OD.mjs.map → DateTimeWidget-TAHCCYCX.mjs.map} +1 -1
  25. package/dist/{DateWidget-JEKDKPNS.mjs → DateWidget-5LFXAWRK.mjs} +4 -4
  26. package/dist/{DateWidget-JEKDKPNS.mjs.map → DateWidget-5LFXAWRK.mjs.map} +1 -1
  27. package/dist/{DateWidget-T7IQUWEA.cjs → DateWidget-HIYZ3TY7.cjs} +6 -6
  28. package/dist/{DateWidget-T7IQUWEA.cjs.map → DateWidget-HIYZ3TY7.cjs.map} +1 -1
  29. package/dist/{DentalChartWidget-P2YPKAMO.mjs → DentalChartWidget-4ZUVMMRX.mjs} +4 -4
  30. package/dist/{DentalChartWidget-LYLOFWZU.cjs.map → DentalChartWidget-4ZUVMMRX.mjs.map} +1 -1
  31. package/dist/DentalChartWidget-J6CHCPWI.cjs +21 -0
  32. package/dist/{DentalChartWidget-P2YPKAMO.mjs.map → DentalChartWidget-J6CHCPWI.cjs.map} +1 -1
  33. package/dist/{DiagnosisTextareaWidget-XJ47OZYH.cjs → DiagnosisTextareaWidget-2N5DP2CP.cjs} +7 -7
  34. package/dist/{DiagnosisTextareaWidget-XJ47OZYH.cjs.map → DiagnosisTextareaWidget-2N5DP2CP.cjs.map} +1 -1
  35. package/dist/{DiagnosisTextareaWidget-6UCYCCSB.mjs → DiagnosisTextareaWidget-OXOXANMF.mjs} +4 -4
  36. package/dist/{DiagnosisTextareaWidget-6UCYCCSB.mjs.map → DiagnosisTextareaWidget-OXOXANMF.mjs.map} +1 -1
  37. package/dist/{DifferentialDiagnosisWidget-XESNHNQQ.cjs → DifferentialDiagnosisWidget-RLGTZFGB.cjs} +4 -4
  38. package/dist/{DifferentialDiagnosisWidget-XESNHNQQ.cjs.map → DifferentialDiagnosisWidget-RLGTZFGB.cjs.map} +1 -1
  39. package/dist/{DifferentialDiagnosisWidget-IZEZVW5F.mjs → DifferentialDiagnosisWidget-XY7CJ5OG.mjs} +3 -3
  40. package/dist/{DifferentialDiagnosisWidget-IZEZVW5F.mjs.map → DifferentialDiagnosisWidget-XY7CJ5OG.mjs.map} +1 -1
  41. package/dist/{DischargeMedicationOrdersWidget-KA3HANHE.mjs → DischargeMedicationOrdersWidget-JXLQWPCP.mjs} +4 -4
  42. package/dist/{DischargeMedicationOrdersWidget-KA3HANHE.mjs.map → DischargeMedicationOrdersWidget-JXLQWPCP.mjs.map} +1 -1
  43. package/dist/{DischargeMedicationOrdersWidget-WRJRYL6F.cjs → DischargeMedicationOrdersWidget-X3ZVW3FP.cjs} +7 -7
  44. package/dist/{DischargeMedicationOrdersWidget-WRJRYL6F.cjs.map → DischargeMedicationOrdersWidget-X3ZVW3FP.cjs.map} +1 -1
  45. package/dist/{EditableTable-VZ66IXYI.mjs → EditableTable-ECNOISL3.mjs} +3 -3
  46. package/dist/{EditableTable-VZ66IXYI.mjs.map → EditableTable-ECNOISL3.mjs.map} +1 -1
  47. package/dist/{EditableTable-OW5LC6OC.cjs → EditableTable-OFVKAYRA.cjs} +4 -4
  48. package/dist/{EditableTable-OW5LC6OC.cjs.map → EditableTable-OFVKAYRA.cjs.map} +1 -1
  49. package/dist/{ExtraOralExamWidget-JVKJ4ZWC.mjs → ExtraOralExamWidget-74G73HGP.mjs} +3 -3
  50. package/dist/{ExtraOralExamWidget-JVKJ4ZWC.mjs.map → ExtraOralExamWidget-74G73HGP.mjs.map} +1 -1
  51. package/dist/{ExtraOralExamWidget-ZIOSKMIO.cjs → ExtraOralExamWidget-ETQI25NZ.cjs} +4 -4
  52. package/dist/{ExtraOralExamWidget-ZIOSKMIO.cjs.map → ExtraOralExamWidget-ETQI25NZ.cjs.map} +1 -1
  53. package/dist/{FollowupWidget-GCGPWZVY.mjs → FollowupWidget-ENDML2BN.mjs} +3 -3
  54. package/dist/{FollowupWidget-GCGPWZVY.mjs.map → FollowupWidget-ENDML2BN.mjs.map} +1 -1
  55. package/dist/{FollowupWidget-2STSJSDY.cjs → FollowupWidget-XMPHTW2M.cjs} +4 -4
  56. package/dist/{FollowupWidget-2STSJSDY.cjs.map → FollowupWidget-XMPHTW2M.cjs.map} +1 -1
  57. package/dist/{FunctionalImpairmentScoreWidget-FCA4UKQA.cjs → FunctionalImpairmentScoreWidget-7TACV6EV.cjs} +6 -6
  58. package/dist/{FunctionalImpairmentScoreWidget-FCA4UKQA.cjs.map → FunctionalImpairmentScoreWidget-7TACV6EV.cjs.map} +1 -1
  59. package/dist/{FunctionalImpairmentScoreWidget-TKS6KE7K.mjs → FunctionalImpairmentScoreWidget-MGK6K4ZW.mjs} +4 -4
  60. package/dist/{FunctionalImpairmentScoreWidget-TKS6KE7K.mjs.map → FunctionalImpairmentScoreWidget-MGK6K4ZW.mjs.map} +1 -1
  61. package/dist/{GsExaminationWidget-ESIEZCP3.mjs → GsExaminationWidget-LCFURWVZ.mjs} +4 -4
  62. package/dist/{GsExaminationWidget-ESIEZCP3.mjs.map → GsExaminationWidget-LCFURWVZ.mjs.map} +1 -1
  63. package/dist/{GsExaminationWidget-KKE5I5GX.cjs → GsExaminationWidget-PCPCUJWN.cjs} +10 -10
  64. package/dist/{GsExaminationWidget-KKE5I5GX.cjs.map → GsExaminationWidget-PCPCUJWN.cjs.map} +1 -1
  65. package/dist/{GsGradingWidget-HC4MJ4KJ.mjs → GsGradingWidget-2TNN3B3R.mjs} +4 -4
  66. package/dist/{GsGradingWidget-HC4MJ4KJ.mjs.map → GsGradingWidget-2TNN3B3R.mjs.map} +1 -1
  67. package/dist/{GsGradingWidget-NGCQQVYA.cjs → GsGradingWidget-OXS65SQJ.cjs} +12 -12
  68. package/dist/{GsGradingWidget-NGCQQVYA.cjs.map → GsGradingWidget-OXS65SQJ.cjs.map} +1 -1
  69. package/dist/{GsSmartHistoryWidget-AAB427Q2.cjs → GsSmartHistoryWidget-CCIUZHMN.cjs} +12 -12
  70. package/dist/{GsSmartHistoryWidget-AAB427Q2.cjs.map → GsSmartHistoryWidget-CCIUZHMN.cjs.map} +1 -1
  71. package/dist/{GsSmartHistoryWidget-7HYGDU4O.mjs → GsSmartHistoryWidget-G5B3VUHN.mjs} +4 -4
  72. package/dist/{GsSmartHistoryWidget-7HYGDU4O.mjs.map → GsSmartHistoryWidget-G5B3VUHN.mjs.map} +1 -1
  73. package/dist/{HiddenVitalsWidget-5GFBDDPT.cjs → HiddenVitalsWidget-DHZOSOQY.cjs} +6 -6
  74. package/dist/{HiddenVitalsWidget-5GFBDDPT.cjs.map → HiddenVitalsWidget-DHZOSOQY.cjs.map} +1 -1
  75. package/dist/{HiddenVitalsWidget-CIE3KERT.mjs → HiddenVitalsWidget-QWJHUVRJ.mjs} +4 -4
  76. package/dist/{HiddenVitalsWidget-CIE3KERT.mjs.map → HiddenVitalsWidget-QWJHUVRJ.mjs.map} +1 -1
  77. package/dist/{LensAssessmentWidget-SIKJVVAE.cjs → LensAssessmentWidget-6DFZYT5F.cjs} +6 -6
  78. package/dist/{LensAssessmentWidget-SIKJVVAE.cjs.map → LensAssessmentWidget-6DFZYT5F.cjs.map} +1 -1
  79. package/dist/{LensAssessmentWidget-B4OMHTOE.mjs → LensAssessmentWidget-P2KHBHM2.mjs} +4 -4
  80. package/dist/{LensAssessmentWidget-B4OMHTOE.mjs.map → LensAssessmentWidget-P2KHBHM2.mjs.map} +1 -1
  81. package/dist/{MarMedicationOrdersWidget-767F65K6.cjs → MarMedicationOrdersWidget-QSMTNWR3.cjs} +7 -7
  82. package/dist/{MarMedicationOrdersWidget-767F65K6.cjs.map → MarMedicationOrdersWidget-QSMTNWR3.cjs.map} +1 -1
  83. package/dist/{MarMedicationOrdersWidget-LG3WOXN7.mjs → MarMedicationOrdersWidget-XW2YFTTH.mjs} +4 -4
  84. package/dist/{MarMedicationOrdersWidget-LG3WOXN7.mjs.map → MarMedicationOrdersWidget-XW2YFTTH.mjs.map} +1 -1
  85. package/dist/{OBGExaminationWidget-MRTGWLXJ.cjs → OBGExaminationWidget-5THYKJI5.cjs} +11 -11
  86. package/dist/{OBGExaminationWidget-MRTGWLXJ.cjs.map → OBGExaminationWidget-5THYKJI5.cjs.map} +1 -1
  87. package/dist/{OBGExaminationWidget-HQKTHSOZ.mjs → OBGExaminationWidget-Y2BVJB33.mjs} +4 -4
  88. package/dist/{OBGExaminationWidget-HQKTHSOZ.mjs.map → OBGExaminationWidget-Y2BVJB33.mjs.map} +1 -1
  89. package/dist/{OBGPathwayWidget-QJNWUIEM.mjs → OBGPathwayWidget-ALGYLNKZ.mjs} +5 -5
  90. package/dist/{OBGPathwayWidget-QJNWUIEM.mjs.map → OBGPathwayWidget-ALGYLNKZ.mjs.map} +1 -1
  91. package/dist/{OBGPathwayWidget-YRU36UL7.cjs → OBGPathwayWidget-FHBZPBPH.cjs} +9 -9
  92. package/dist/{OBGPathwayWidget-YRU36UL7.cjs.map → OBGPathwayWidget-FHBZPBPH.cjs.map} +1 -1
  93. package/dist/{ObstetricHistoryWidget-EW6JLNQ7.mjs → ObstetricHistoryWidget-5GDUCYS3.mjs} +4 -4
  94. package/dist/{ObstetricHistoryWidget-EW6JLNQ7.mjs.map → ObstetricHistoryWidget-5GDUCYS3.mjs.map} +1 -1
  95. package/dist/{ObstetricHistoryWidget-OOWCVFRB.cjs → ObstetricHistoryWidget-XGZM2HL4.cjs} +7 -7
  96. package/dist/{ObstetricHistoryWidget-OOWCVFRB.cjs.map → ObstetricHistoryWidget-XGZM2HL4.cjs.map} +1 -1
  97. package/dist/{OphthalDiagnosisWidget-UXXYGKD5.cjs → OphthalDiagnosisWidget-7WY633CI.cjs} +4 -4
  98. package/dist/{OphthalDiagnosisWidget-UXXYGKD5.cjs.map → OphthalDiagnosisWidget-7WY633CI.cjs.map} +1 -1
  99. package/dist/{OphthalDiagnosisWidget-MZYBQTFV.mjs → OphthalDiagnosisWidget-YHEDHIX5.mjs} +3 -3
  100. package/dist/{OphthalDiagnosisWidget-MZYBQTFV.mjs.map → OphthalDiagnosisWidget-YHEDHIX5.mjs.map} +1 -1
  101. package/dist/{OphthalmologyWidget-27ZN2E3F.mjs → OphthalmologyWidget-6RWGZHLU.mjs} +3 -3
  102. package/dist/{OphthalmologyWidget-27ZN2E3F.mjs.map → OphthalmologyWidget-6RWGZHLU.mjs.map} +1 -1
  103. package/dist/{OphthalmologyWidget-WFSFIHT4.cjs → OphthalmologyWidget-VLW4CM2Q.cjs} +4 -4
  104. package/dist/{OphthalmologyWidget-WFSFIHT4.cjs.map → OphthalmologyWidget-VLW4CM2Q.cjs.map} +1 -1
  105. package/dist/{OrthopedicExamWidget-ULZTDFXJ.cjs → OrthopedicExamWidget-4ZNOVW54.cjs} +6 -6
  106. package/dist/{OrthopedicExamWidget-ULZTDFXJ.cjs.map → OrthopedicExamWidget-4ZNOVW54.cjs.map} +1 -1
  107. package/dist/{OrthopedicExamWidget-WM55M3Y4.mjs → OrthopedicExamWidget-CWEH3ZY7.mjs} +4 -4
  108. package/dist/{OrthopedicExamWidget-WM55M3Y4.mjs.map → OrthopedicExamWidget-CWEH3ZY7.mjs.map} +1 -1
  109. package/dist/{PainScaleFlagsWidget-IFA3RCEL.cjs → PainScaleFlagsWidget-EYYQBSYL.cjs} +8 -8
  110. package/dist/{PainScaleFlagsWidget-IFA3RCEL.cjs.map → PainScaleFlagsWidget-EYYQBSYL.cjs.map} +1 -1
  111. package/dist/{PainScaleFlagsWidget-5KN7T4JK.mjs → PainScaleFlagsWidget-XC73ND7X.mjs} +4 -4
  112. package/dist/{PainScaleFlagsWidget-5KN7T4JK.mjs.map → PainScaleFlagsWidget-XC73ND7X.mjs.map} +1 -1
  113. package/dist/{PregnancyStatusWidget-U2BEJGBJ.mjs → PregnancyStatusWidget-U6Y3DCDB.mjs} +3 -3
  114. package/dist/{PregnancyStatusWidget-U2BEJGBJ.mjs.map → PregnancyStatusWidget-U6Y3DCDB.mjs.map} +1 -1
  115. package/dist/{PregnancyStatusWidget-QTTVFBOE.cjs → PregnancyStatusWidget-YZRYO2WA.cjs} +4 -4
  116. package/dist/{PregnancyStatusWidget-QTTVFBOE.cjs.map → PregnancyStatusWidget-YZRYO2WA.cjs.map} +1 -1
  117. package/dist/{ReferralWidget-GU3JYED2.mjs → ReferralWidget-FXJC56AF.mjs} +4 -4
  118. package/dist/{ReferralWidget-GU3JYED2.mjs.map → ReferralWidget-FXJC56AF.mjs.map} +1 -1
  119. package/dist/{ReferralWidget-27VGZCOQ.cjs → ReferralWidget-KD36EA74.cjs} +7 -7
  120. package/dist/{ReferralWidget-27VGZCOQ.cjs.map → ReferralWidget-KD36EA74.cjs.map} +1 -1
  121. package/dist/RichTextWidget-JG4Y7X66.mjs +11 -0
  122. package/dist/{RichTextWidget-2KLV65QP.cjs.map → RichTextWidget-JG4Y7X66.mjs.map} +1 -1
  123. package/dist/{RichTextWidget-2KLV65QP.cjs → RichTextWidget-KKC3P5Z3.cjs} +7 -7
  124. package/dist/{RichTextWidget-ZBX554ZJ.mjs.map → RichTextWidget-KKC3P5Z3.cjs.map} +1 -1
  125. package/dist/SmartTextarea-DSM5TP5N.cjs +19 -0
  126. package/dist/{SmartTextarea-LQDXFCYT.mjs.map → SmartTextarea-DSM5TP5N.cjs.map} +1 -1
  127. package/dist/SmartTextarea-HDRABZIN.mjs +10 -0
  128. package/dist/{SmartTextarea-WITNRNDU.cjs.map → SmartTextarea-HDRABZIN.mjs.map} +1 -1
  129. package/dist/{SuggestionTextareaWidget-UNL3FZRI.mjs → SuggestionTextareaWidget-IKL46SCV.mjs} +7 -7
  130. package/dist/{SuggestionTextareaWidget-UNL3FZRI.mjs.map → SuggestionTextareaWidget-IKL46SCV.mjs.map} +1 -1
  131. package/dist/{SuggestionTextareaWidget-FWRZ46MV.cjs → SuggestionTextareaWidget-KABKRNP3.cjs} +18 -18
  132. package/dist/{SuggestionTextareaWidget-FWRZ46MV.cjs.map → SuggestionTextareaWidget-KABKRNP3.cjs.map} +1 -1
  133. package/dist/{SurgicalRiskFlagsWidget-OJKCZIWJ.cjs → SurgicalRiskFlagsWidget-DO66VPQC.cjs} +6 -6
  134. package/dist/{SurgicalRiskFlagsWidget-OJKCZIWJ.cjs.map → SurgicalRiskFlagsWidget-DO66VPQC.cjs.map} +1 -1
  135. package/dist/{SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs → SurgicalRiskFlagsWidget-NPOHFMIZ.mjs} +4 -4
  136. package/dist/{SurgicalRiskFlagsWidget-ZTQJ6CDF.mjs.map → SurgicalRiskFlagsWidget-NPOHFMIZ.mjs.map} +1 -1
  137. package/dist/{TreatmentPlanWidget-665HLKYV.mjs → TreatmentPlanWidget-7XYIVHQO.mjs} +4 -4
  138. package/dist/{TreatmentPlanWidget-665HLKYV.mjs.map → TreatmentPlanWidget-7XYIVHQO.mjs.map} +1 -1
  139. package/dist/{TreatmentPlanWidget-TATWSPLY.cjs → TreatmentPlanWidget-ELTSULQ4.cjs} +6 -6
  140. package/dist/{TreatmentPlanWidget-TATWSPLY.cjs.map → TreatmentPlanWidget-ELTSULQ4.cjs.map} +1 -1
  141. package/dist/{UrologyExaminationWidget-GRBL2SDG.mjs → UrologyExaminationWidget-OQLZPWVR.mjs} +4 -4
  142. package/dist/{UrologyExaminationWidget-GRBL2SDG.mjs.map → UrologyExaminationWidget-OQLZPWVR.mjs.map} +1 -1
  143. package/dist/{UrologyExaminationWidget-GQLMV4FB.cjs → UrologyExaminationWidget-OSNFGBI2.cjs} +12 -12
  144. package/dist/{UrologyExaminationWidget-GQLMV4FB.cjs.map → UrologyExaminationWidget-OSNFGBI2.cjs.map} +1 -1
  145. package/dist/{UrologyPathwayWidget-PEO5BVQX.mjs → UrologyPathwayWidget-KE2LAZTZ.mjs} +4 -4
  146. package/dist/{UrologyPathwayWidget-PEO5BVQX.mjs.map → UrologyPathwayWidget-KE2LAZTZ.mjs.map} +1 -1
  147. package/dist/{UrologyPathwayWidget-D6EWSOGW.cjs → UrologyPathwayWidget-YPYIX43Z.cjs} +7 -7
  148. package/dist/{UrologyPathwayWidget-D6EWSOGW.cjs.map → UrologyPathwayWidget-YPYIX43Z.cjs.map} +1 -1
  149. package/dist/{UrologySmartHistoryWidget-BDKRFBYN.mjs → UrologySmartHistoryWidget-ET6CU36D.mjs} +4 -4
  150. package/dist/{UrologySmartHistoryWidget-BDKRFBYN.mjs.map → UrologySmartHistoryWidget-ET6CU36D.mjs.map} +1 -1
  151. package/dist/{UrologySmartHistoryWidget-P3KTQE7L.cjs → UrologySmartHistoryWidget-SLBJALMO.cjs} +15 -15
  152. package/dist/{UrologySmartHistoryWidget-P3KTQE7L.cjs.map → UrologySmartHistoryWidget-SLBJALMO.cjs.map} +1 -1
  153. package/dist/{VitalsWidget-MS3OOZSW.cjs → VitalsWidget-MGUUJZP4.cjs} +5 -5
  154. package/dist/{VitalsWidget-MS3OOZSW.cjs.map → VitalsWidget-MGUUJZP4.cjs.map} +1 -1
  155. package/dist/{VitalsWidget-63HTXK2M.mjs → VitalsWidget-YI3IXQYN.mjs} +3 -3
  156. package/dist/{VitalsWidget-63HTXK2M.mjs.map → VitalsWidget-YI3IXQYN.mjs.map} +1 -1
  157. package/dist/{chunk-5RT3S67O.cjs → chunk-35I4CBEC.cjs} +6 -6
  158. package/dist/{chunk-5RT3S67O.cjs.map → chunk-35I4CBEC.cjs.map} +1 -1
  159. package/dist/{chunk-XDUVO3IZ.mjs → chunk-4422KT6O.mjs} +61 -6
  160. package/dist/chunk-4422KT6O.mjs.map +1 -0
  161. package/dist/{chunk-BBD3Y37O.cjs → chunk-4KTQ4NEI.cjs} +4 -4
  162. package/dist/{chunk-BBD3Y37O.cjs.map → chunk-4KTQ4NEI.cjs.map} +1 -1
  163. package/dist/{chunk-MBZRRYJB.mjs → chunk-7ZRK7ZWY.mjs} +4 -4
  164. package/dist/{chunk-MBZRRYJB.mjs.map → chunk-7ZRK7ZWY.mjs.map} +1 -1
  165. package/dist/{chunk-AIZ3XYEZ.cjs → chunk-A2A5EB5R.cjs} +60 -5
  166. package/dist/chunk-A2A5EB5R.cjs.map +1 -0
  167. package/dist/{chunk-T3UHPMFX.mjs → chunk-BKZXISZH.mjs} +3 -3
  168. package/dist/{chunk-T3UHPMFX.mjs.map → chunk-BKZXISZH.mjs.map} +1 -1
  169. package/dist/{chunk-G6Y4UJPN.mjs → chunk-CC54SKAA.mjs} +5 -5
  170. package/dist/{chunk-G6Y4UJPN.mjs.map → chunk-CC54SKAA.mjs.map} +1 -1
  171. package/dist/{chunk-Q66LXMRR.mjs → chunk-FAAMKLBY.mjs} +3 -3
  172. package/dist/{chunk-Q66LXMRR.mjs.map → chunk-FAAMKLBY.mjs.map} +1 -1
  173. package/dist/{chunk-TCQQUJCL.cjs → chunk-GQX2UGHH.cjs} +11 -11
  174. package/dist/{chunk-TCQQUJCL.cjs.map → chunk-GQX2UGHH.cjs.map} +1 -1
  175. package/dist/{chunk-2BGJZ44Q.mjs → chunk-HKEUAERY.mjs} +9 -4
  176. package/dist/{chunk-TB33A4PD.cjs.map → chunk-HKEUAERY.mjs.map} +1 -1
  177. package/dist/{chunk-T2IKWRV2.cjs → chunk-JFZ7XPDM.cjs} +9 -9
  178. package/dist/{chunk-T2IKWRV2.cjs.map → chunk-JFZ7XPDM.cjs.map} +1 -1
  179. package/dist/{chunk-TB33A4PD.cjs → chunk-JVIU4OBK.cjs} +9 -3
  180. package/dist/chunk-JVIU4OBK.cjs.map +1 -0
  181. package/dist/{chunk-XIUXYHGG.cjs → chunk-L2H5SOAV.cjs} +5 -5
  182. package/dist/{chunk-XIUXYHGG.cjs.map → chunk-L2H5SOAV.cjs.map} +1 -1
  183. package/dist/{chunk-XLCTFYFD.mjs → chunk-PNRSJPGV.mjs} +5 -5
  184. package/dist/{chunk-XLCTFYFD.mjs.map → chunk-PNRSJPGV.mjs.map} +1 -1
  185. package/dist/{chunk-X4AJCTON.cjs → chunk-PVKHVVFS.cjs} +4 -4
  186. package/dist/{chunk-X4AJCTON.cjs.map → chunk-PVKHVVFS.cjs.map} +1 -1
  187. package/dist/{chunk-Q3K646K4.mjs → chunk-QM6UMI2M.mjs} +3 -3
  188. package/dist/{chunk-Q3K646K4.mjs.map → chunk-QM6UMI2M.mjs.map} +1 -1
  189. package/dist/{chunk-MQHZ7HD2.mjs → chunk-QQXBHDUF.mjs} +3 -3
  190. package/dist/{chunk-MQHZ7HD2.mjs.map → chunk-QQXBHDUF.mjs.map} +1 -1
  191. package/dist/{chunk-UKSP3B3W.mjs → chunk-VAJR2VBK.mjs} +3 -3
  192. package/dist/{chunk-UKSP3B3W.mjs.map → chunk-VAJR2VBK.mjs.map} +1 -1
  193. package/dist/{chunk-RZK44P3C.cjs → chunk-WM43XTEK.cjs} +7 -7
  194. package/dist/{chunk-RZK44P3C.cjs.map → chunk-WM43XTEK.cjs.map} +1 -1
  195. package/dist/{chunk-7DISRJAB.cjs → chunk-XGO2HG3N.cjs} +4 -4
  196. package/dist/{chunk-7DISRJAB.cjs.map → chunk-XGO2HG3N.cjs.map} +1 -1
  197. package/dist/index.cjs +133 -129
  198. package/dist/index.d.cts +6 -3
  199. package/dist/index.d.ts +6 -3
  200. package/dist/index.mjs +51 -51
  201. package/dist/read-only-table.d.cts +1 -1
  202. package/dist/read-only-table.d.ts +1 -1
  203. package/dist/rich-text.cjs +5 -5
  204. package/dist/rich-text.mjs +4 -4
  205. package/dist/smart.cjs +5 -5
  206. package/dist/smart.d.cts +1 -1
  207. package/dist/smart.d.ts +1 -1
  208. package/dist/smart.mjs +3 -3
  209. package/dist/{types-BbOnd5IN.d.cts → types-27f9S27N.d.cts} +13 -1
  210. package/dist/{types-BbOnd5IN.d.ts → types-27f9S27N.d.ts} +13 -1
  211. package/package.json +1 -1
  212. package/dist/AddMedicationWidget-45T4XVEL.cjs +0 -32
  213. package/dist/AddMedicationWidget-45T4XVEL.cjs.map +0 -1
  214. package/dist/AddMedicationWidget-B5RXRYBK.mjs.map +0 -1
  215. package/dist/BpeChartWidget-HATASHAC.mjs +0 -7
  216. package/dist/BpeChartWidget-VZRH7M7L.cjs +0 -28
  217. package/dist/DentalChartWidget-LYLOFWZU.cjs +0 -21
  218. package/dist/RichTextWidget-ZBX554ZJ.mjs +0 -11
  219. package/dist/SmartTextarea-LQDXFCYT.mjs +0 -10
  220. package/dist/SmartTextarea-WITNRNDU.cjs +0 -19
  221. package/dist/chunk-2BGJZ44Q.mjs.map +0 -1
  222. package/dist/chunk-AIZ3XYEZ.cjs.map +0 -1
  223. package/dist/chunk-XDUVO3IZ.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ui/shadcn/separator.tsx","../src/ui/widgets/RichTextWidget.tsx"],"names":["jsx","UnderlineIcon","TableIcon"],"mappings":"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","file":"chunk-XLCTFYFD.mjs","sourcesContent":["import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport type { Extensions } from '@tiptap/core';\nimport {\n Bold,\n Italic,\n Underline as UnderlineIcon,\n Strikethrough,\n List,\n ListOrdered,\n Undo,\n Redo,\n Table as TableIcon,\n Rows2,\n Columns2,\n TableRowsSplit,\n TableColumnsSplit,\n Trash2,\n} from 'lucide-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 { Button } from '../shadcn/button';\nimport { Separator } from '../shadcn/separator';\nimport { cn } from '../../core/utils';\nimport type { Editor } from '@tiptap/core';\nimport type { RichTextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isEmptyHtml(html: string): boolean {\n const t = html.trim();\n return (\n t === '' ||\n t === '<p></p>' ||\n t === '<p><br></p>' ||\n t === '<p><br class=\"ProseMirror-trailingBreak\"></p>'\n );\n}\n\nfunction buildRichTextExtensions(placeholder: string, tables: boolean): Extensions {\n const base: Extensions = [\n StarterKit.configure({\n // Disable headings entirely so the UI/content can't introduce H2/H3.\n heading: false,\n bulletList: {\n HTMLAttributes: {\n class: 'list-disc pl-6 my-2',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'list-decimal pl-6 my-2',\n },\n },\n listItem: {\n HTMLAttributes: {\n class: 'my-1',\n },\n },\n }),\n Underline,\n Placeholder.configure({\n placeholder,\n }),\n ];\n\n if (!tables) return base;\n\n return [\n ...base,\n Table.configure({\n resizable: true,\n /** Wider hit zone along column borders (default 5px). */\n handleWidth: 8,\n cellMinWidth: 50,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ];\n}\n\nfunction RichTextToolbar({\n editor,\n disabled,\n tablesEnabled,\n}: {\n editor: Editor | null;\n disabled: boolean;\n tablesEnabled: boolean;\n}) {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => rerender();\n editor.on('selectionUpdate', handler);\n editor.on('transaction', handler);\n return () => {\n editor.off('selectionUpdate', handler);\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n if (!editor) {\n return (\n <div className=\"flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]\" />\n );\n }\n\n const fmtBtn = (active: boolean, onClick: () => void, icon: React.ReactNode, title: string) => (\n <Button\n type=\"button\"\n variant={active ? 'secondary' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled}\n title={title}\n onClick={() => {\n if (!disabled) onClick();\n }}\n >\n {icon}\n </Button>\n );\n\n const inTable = tablesEnabled && editor.isActive('table');\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Rich text formatting\"\n >\n {fmtBtn(\n editor.isActive('bold'),\n () => editor.chain().focus().toggleBold().run(),\n <Bold className=\"h-4 w-4\" />,\n 'Bold',\n )}\n {fmtBtn(\n editor.isActive('italic'),\n () => editor.chain().focus().toggleItalic().run(),\n <Italic className=\"h-4 w-4\" />,\n 'Italic',\n )}\n {fmtBtn(\n editor.isActive('underline'),\n () => editor.chain().focus().toggleUnderline().run(),\n <UnderlineIcon className=\"h-4 w-4\" />,\n 'Underline',\n )}\n {fmtBtn(\n editor.isActive('strike'),\n () => editor.chain().focus().toggleStrike().run(),\n <Strikethrough className=\"h-4 w-4\" />,\n 'Strikethrough',\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n {fmtBtn(\n editor.isActive('bulletList'),\n () => editor.chain().focus().toggleBulletList().run(),\n <List className=\"h-4 w-4\" />,\n 'Bullet list',\n )}\n {fmtBtn(\n editor.isActive('orderedList'),\n () => editor.chain().focus().toggleOrderedList().run(),\n <ListOrdered className=\"h-4 w-4\" />,\n 'Numbered list',\n )}\n\n {tablesEnabled && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n {!inTable ? (\n fmtBtn(\n false,\n () =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run(),\n <TableIcon className=\"h-4 w-4\" />,\n 'Insert table',\n )\n ) : (\n <>\n {fmtBtn(\n false,\n () => editor.chain().focus().addRowAfter().run(),\n <Rows2 className=\"h-4 w-4\" />,\n 'Add row below',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().addColumnAfter().run(),\n <Columns2 className=\"h-4 w-4\" />,\n 'Add column right',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteRow().run(),\n <TableRowsSplit className=\"h-4 w-4\" />,\n 'Delete row',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteColumn().run(),\n <TableColumnsSplit className=\"h-4 w-4\" />,\n 'Delete column',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteTable().run(),\n <Trash2 className=\"h-4 w-4\" />,\n 'Delete table',\n )}\n </>\n )}\n </>\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().undo()}\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n >\n <Undo className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().redo()}\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n >\n <Redo className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n\nexport const RichTextWidget: 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 const showError = !!error && (touched || state.submitAttempted);\n\n const def = fieldDef as RichTextFieldDef | undefined;\n const placeholder = def?.placeholder ?? 'Start typing…';\n const minHeight = def?.minHeight ?? 160;\n const tablesEnabled = !!def?.tables;\n\n const extensions = useMemo(\n () => buildRichTextExtensions(placeholder, tablesEnabled),\n [placeholder, tablesEnabled],\n );\n\n const stringValue = typeof value === 'string' ? value : '';\n\n const editor = useEditor(\n {\n extensions,\n content: stringValue || '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor: ed }) => {\n const html = ed.getHTML();\n setValue(isEmptyHtml(html) ? '' : html);\n },\n onBlur: () => setTouched(),\n editorProps: {\n attributes: {\n id: fieldId,\n class: 'tiptap focus:outline-none',\n style: `min-height: ${minHeight}px`,\n },\n },\n },\n [extensions, fieldId],\n );\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n editor.setEditable(!disabled);\n }, [editor, disabled]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n el.style.minHeight = `${minHeight}px`;\n }, [editor, minHeight]);\n\n // Listen for a custom 'insertTranscript' event dispatched by external hooks\n // (e.g. voice recording) so the widget controls its own insertion logic.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n const handler = (e: Event) => {\n const { text } = (e as CustomEvent<{ text: string }>).detail;\n if (!text) return;\n const currentText = editor.getText();\n const prefix = currentText.length > 0 && !/\\s$/.test(currentText) ? ' ' : '';\n editor.chain().focus().insertContent(prefix + text).run();\n };\n el.addEventListener('insertTranscript', handler);\n return () => el.removeEventListener('insertTranscript', handler);\n }, [editor]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const fromForm = stringValue;\n const fromEditor = editor.getHTML();\n if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;\n if (fromForm && fromForm !== fromEditor) {\n editor.commands.setContent(fromForm, { emitUpdate: false });\n }\n if (!fromForm && !isEmptyHtml(fromEditor)) {\n editor.commands.setContent('', { emitUpdate: false });\n }\n }, [stringValue, editor]);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n );\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {showLabel ? labelEl : null}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : showLabel ? (\n labelEl\n ) : null}\n <div\n className={fieldControlClass(\n fieldDef,\n cn(\n 'rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden',\n showError && 'border-red-500',\n disabled && 'opacity-60',\n ),\n )}\n >\n <RichTextToolbar\n editor={editor}\n disabled={disabled}\n tablesEnabled={tablesEnabled}\n />\n <div\n className={cn(\n 'px-3 py-2',\n '[&_.ProseMirror]:outline-none',\n '[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2',\n '[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2',\n '[&_.ProseMirror_li]:list-item',\n '[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0',\n )}\n >\n <EditorContent editor={editor} />\n </div>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n// Re-exported from a lightweight module so read-only consumers can use it\n// without pulling in the TipTap/ProseMirror editor.\nexport { richTextHtmlClassName } from './richTextClassName';\n"]}
1
+ {"version":3,"sources":["../src/ui/shadcn/separator.tsx","../src/ui/widgets/RichTextWidget.tsx"],"names":["jsx","UnderlineIcon","TableIcon"],"mappings":"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","file":"chunk-PNRSJPGV.mjs","sourcesContent":["import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"../../core/utils\"\n\nconst Separator = React.forwardRef<\n React.ElementRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n (\n { className, orientation = \"horizontal\", decorative = true, ...props },\n ref\n ) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n className\n )}\n {...props}\n />\n )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n\n","import React, { useEffect, useMemo, useReducer } from 'react';\nimport { EditorContent, useEditor } from '@tiptap/react';\nimport StarterKit from '@tiptap/starter-kit';\nimport Placeholder from '@tiptap/extension-placeholder';\nimport Underline from '@tiptap/extension-underline';\nimport { Table, TableRow, TableHeader, TableCell } from '@tiptap/extension-table';\nimport type { Extensions } from '@tiptap/core';\nimport {\n Bold,\n Italic,\n Underline as UnderlineIcon,\n Strikethrough,\n List,\n ListOrdered,\n Undo,\n Redo,\n Table as TableIcon,\n Rows2,\n Columns2,\n TableRowsSplit,\n TableColumnsSplit,\n Trash2,\n} from 'lucide-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 { Button } from '../shadcn/button';\nimport { Separator } from '../shadcn/separator';\nimport { cn } from '../../core/utils';\nimport type { Editor } from '@tiptap/core';\nimport type { RichTextFieldDef } from '../../core/types';\nimport {\n FieldRequiredIndicator,\n fieldControlClass,\n fieldErrorClass,\n fieldLabelClass,\n fieldWrapperClass,\n isLabelVisible,\n} from '../../react/fieldStyle';\n\nfunction isEmptyHtml(html: string): boolean {\n const t = html.trim();\n return (\n t === '' ||\n t === '<p></p>' ||\n t === '<p><br></p>' ||\n t === '<p><br class=\"ProseMirror-trailingBreak\"></p>'\n );\n}\n\nfunction buildRichTextExtensions(placeholder: string, tables: boolean): Extensions {\n const base: Extensions = [\n StarterKit.configure({\n // Disable headings entirely so the UI/content can't introduce H2/H3.\n heading: false,\n bulletList: {\n HTMLAttributes: {\n class: 'list-disc pl-6 my-2',\n },\n },\n orderedList: {\n HTMLAttributes: {\n class: 'list-decimal pl-6 my-2',\n },\n },\n listItem: {\n HTMLAttributes: {\n class: 'my-1',\n },\n },\n }),\n Underline,\n Placeholder.configure({\n placeholder,\n }),\n ];\n\n if (!tables) return base;\n\n return [\n ...base,\n Table.configure({\n resizable: true,\n /** Wider hit zone along column borders (default 5px). */\n handleWidth: 8,\n cellMinWidth: 50,\n }),\n TableRow,\n TableHeader,\n TableCell,\n ];\n}\n\nfunction RichTextToolbar({\n editor,\n disabled,\n tablesEnabled,\n}: {\n editor: Editor | null;\n disabled: boolean;\n tablesEnabled: boolean;\n}) {\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n\n useEffect(() => {\n if (!editor) return;\n const handler = () => rerender();\n editor.on('selectionUpdate', handler);\n editor.on('transaction', handler);\n return () => {\n editor.off('selectionUpdate', handler);\n editor.off('transaction', handler);\n };\n }, [editor]);\n\n if (!editor) {\n return (\n <div className=\"flex flex-wrap gap-1 border-b border-input bg-muted/30 px-2 py-1.5 min-h-[42px]\" />\n );\n }\n\n const fmtBtn = (active: boolean, onClick: () => void, icon: React.ReactNode, title: string) => (\n <Button\n type=\"button\"\n variant={active ? 'secondary' : 'outline'}\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled}\n title={title}\n onClick={() => {\n if (!disabled) onClick();\n }}\n >\n {icon}\n </Button>\n );\n\n const inTable = tablesEnabled && editor.isActive('table');\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1 border-b border-input bg-muted/30 px-2 py-1.5\"\n role=\"toolbar\"\n aria-label=\"Rich text formatting\"\n >\n {fmtBtn(\n editor.isActive('bold'),\n () => editor.chain().focus().toggleBold().run(),\n <Bold className=\"h-4 w-4\" />,\n 'Bold',\n )}\n {fmtBtn(\n editor.isActive('italic'),\n () => editor.chain().focus().toggleItalic().run(),\n <Italic className=\"h-4 w-4\" />,\n 'Italic',\n )}\n {fmtBtn(\n editor.isActive('underline'),\n () => editor.chain().focus().toggleUnderline().run(),\n <UnderlineIcon className=\"h-4 w-4\" />,\n 'Underline',\n )}\n {fmtBtn(\n editor.isActive('strike'),\n () => editor.chain().focus().toggleStrike().run(),\n <Strikethrough className=\"h-4 w-4\" />,\n 'Strikethrough',\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n {fmtBtn(\n editor.isActive('bulletList'),\n () => editor.chain().focus().toggleBulletList().run(),\n <List className=\"h-4 w-4\" />,\n 'Bullet list',\n )}\n {fmtBtn(\n editor.isActive('orderedList'),\n () => editor.chain().focus().toggleOrderedList().run(),\n <ListOrdered className=\"h-4 w-4\" />,\n 'Numbered list',\n )}\n\n {tablesEnabled && (\n <>\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n {!inTable ? (\n fmtBtn(\n false,\n () =>\n editor\n .chain()\n .focus()\n .insertTable({ rows: 3, cols: 3, withHeaderRow: true })\n .run(),\n <TableIcon className=\"h-4 w-4\" />,\n 'Insert table',\n )\n ) : (\n <>\n {fmtBtn(\n false,\n () => editor.chain().focus().addRowAfter().run(),\n <Rows2 className=\"h-4 w-4\" />,\n 'Add row below',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().addColumnAfter().run(),\n <Columns2 className=\"h-4 w-4\" />,\n 'Add column right',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteRow().run(),\n <TableRowsSplit className=\"h-4 w-4\" />,\n 'Delete row',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteColumn().run(),\n <TableColumnsSplit className=\"h-4 w-4\" />,\n 'Delete column',\n )}\n {fmtBtn(\n false,\n () => editor.chain().focus().deleteTable().run(),\n <Trash2 className=\"h-4 w-4\" />,\n 'Delete table',\n )}\n </>\n )}\n </>\n )}\n\n <Separator orientation=\"vertical\" className=\"mx-0.5 h-6\" />\n\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().undo()}\n title=\"Undo\"\n onClick={() => editor.chain().focus().undo().run()}\n >\n <Undo className=\"h-4 w-4\" />\n </Button>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n disabled={disabled || !editor.can().redo()}\n title=\"Redo\"\n onClick={() => editor.chain().focus().redo().run()}\n >\n <Redo className=\"h-4 w-4\" />\n </Button>\n </div>\n );\n}\n\nexport const RichTextWidget: 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 const showError = !!error && (touched || state.submitAttempted);\n\n const def = fieldDef as RichTextFieldDef | undefined;\n const placeholder = def?.placeholder ?? 'Start typing…';\n const minHeight = def?.minHeight ?? 160;\n const tablesEnabled = !!def?.tables;\n\n const extensions = useMemo(\n () => buildRichTextExtensions(placeholder, tablesEnabled),\n [placeholder, tablesEnabled],\n );\n\n const stringValue = typeof value === 'string' ? value : '';\n\n const editor = useEditor(\n {\n extensions,\n content: stringValue || '',\n editable: !disabled,\n immediatelyRender: false,\n onUpdate: ({ editor: ed }) => {\n const html = ed.getHTML();\n setValue(isEmptyHtml(html) ? '' : html);\n },\n onBlur: () => setTouched(),\n editorProps: {\n attributes: {\n id: fieldId,\n class: 'tiptap focus:outline-none',\n style: `min-height: ${minHeight}px`,\n },\n },\n },\n [extensions, fieldId],\n );\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n editor.setEditable(!disabled);\n }, [editor, disabled]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n el.style.minHeight = `${minHeight}px`;\n }, [editor, minHeight]);\n\n // Listen for a custom 'insertTranscript' event dispatched by external hooks\n // (e.g. voice recording) so the widget controls its own insertion logic.\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const el = editor.view.dom as HTMLElement;\n const handler = (e: Event) => {\n const { text } = (e as CustomEvent<{ text: string }>).detail;\n if (!text) return;\n const currentText = editor.getText();\n const prefix = currentText.length > 0 && !/\\s$/.test(currentText) ? ' ' : '';\n editor.chain().focus().insertContent(prefix + text).run();\n };\n el.addEventListener('insertTranscript', handler);\n return () => el.removeEventListener('insertTranscript', handler);\n }, [editor]);\n\n useEffect(() => {\n if (!editor || editor.isDestroyed) return;\n const fromForm = stringValue;\n const fromEditor = editor.getHTML();\n if (isEmptyHtml(fromForm) && isEmptyHtml(fromEditor)) return;\n if (fromForm && fromForm !== fromEditor) {\n editor.commands.setContent(fromForm, { emitUpdate: false });\n }\n if (!fromForm && !isEmptyHtml(fromEditor)) {\n editor.commands.setContent('', { emitUpdate: false });\n }\n }, [stringValue, editor]);\n\n if (!fieldDef) return null;\n\n const showLabel = isLabelVisible(fieldDef);\n\n const labelContent = (\n <>\n {fieldDef.label}{' '}\n <FieldRequiredIndicator fieldDef={fieldDef} />\n </>\n );\n\n const labelEl = (\n <Label htmlFor={fieldId} className={fieldLabelClass(fieldDef)}>\n {labelContent}\n </Label>\n );\n\n return (\n <div className={fieldWrapperClass(fieldDef, 'space-y-2')}>\n {hasVoice ? (\n <div className=\"flex items-center justify-between\">\n {showLabel ? labelEl : null}\n <VoiceMicButton fieldId={fieldId} onTranscriptReady={setValue} />\n </div>\n ) : showLabel ? (\n labelEl\n ) : null}\n <div\n className={fieldControlClass(\n fieldDef,\n cn(\n 'rounded-md border border-input bg-background text-sm ring-offset-background overflow-hidden',\n showError && 'border-red-500',\n disabled && 'opacity-60',\n ),\n )}\n >\n <RichTextToolbar\n editor={editor}\n disabled={disabled}\n tablesEnabled={tablesEnabled}\n />\n <div\n className={cn(\n 'px-3 py-2',\n '[&_.ProseMirror]:outline-none',\n '[&_.ProseMirror_ul]:list-disc [&_.ProseMirror_ul]:pl-6 [&_.ProseMirror_ul]:my-2',\n '[&_.ProseMirror_ol]:list-decimal [&_.ProseMirror_ol]:pl-6 [&_.ProseMirror_ol]:my-2',\n '[&_.ProseMirror_li]:list-item',\n '[&_.ProseMirror_blockquote]:border-l-4 [&_.ProseMirror_blockquote]:border-muted-foreground/40 [&_.ProseMirror_blockquote]:pl-3 [&_.ProseMirror_blockquote]:italic [&_.ProseMirror_blockquote]:my-2',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:text-muted-foreground',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:content-[attr(data-placeholder)]',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:float-left',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:pointer-events-none',\n '[&_.ProseMirror_p.is-editor-empty:first-child::before]:h-0',\n )}\n >\n <EditorContent editor={editor} />\n </div>\n </div>\n {showError && (\n <p className={fieldErrorClass(fieldDef, 'text-xs text-red-500')}>{error}</p>\n )}\n </div>\n );\n};\n\n// Re-exported from a lightweight module so read-only consumers can use it\n// without pulling in the TipTap/ProseMirror editor.\nexport { richTextHtmlClassName } from './richTextClassName';\n"]}
@@ -3,7 +3,7 @@
3
3
  var chunkPHADAQSH_cjs = require('./chunk-PHADAQSH.cjs');
4
4
  var chunkRILRMRXB_cjs = require('./chunk-RILRMRXB.cjs');
5
5
  var chunkO3VQBPEW_cjs = require('./chunk-O3VQBPEW.cjs');
6
- var chunkTB33A4PD_cjs = require('./chunk-TB33A4PD.cjs');
6
+ var chunkJVIU4OBK_cjs = require('./chunk-JVIU4OBK.cjs');
7
7
  var chunkFHHISVCH_cjs = require('./chunk-FHHISVCH.cjs');
8
8
  var react = require('react');
9
9
  var lucideReact = require('lucide-react');
@@ -353,7 +353,7 @@ function ChartLegend() {
353
353
  }) });
354
354
  }
355
355
  var DentalChartWidget = ({ fieldId }) => {
356
- const { value, setValue, setTouched, disabled } = chunkTB33A4PD_cjs.useField(fieldId);
356
+ const { value, setValue, setTouched, disabled } = chunkJVIU4OBK_cjs.useField(fieldId);
357
357
  const data = normalizeDentalChart(value);
358
358
  const teeth = data.teeth;
359
359
  const handleToothChange = react.useCallback(
@@ -603,5 +603,5 @@ exports.DentalChartWidget = DentalChartWidget;
603
603
  exports.QUADRANTS = QUADRANTS;
604
604
  exports.normalizeDentalChart = normalizeDentalChart;
605
605
  exports.toothLabel = toothLabel;
606
- //# sourceMappingURL=chunk-X4AJCTON.cjs.map
607
- //# sourceMappingURL=chunk-X4AJCTON.cjs.map
606
+ //# sourceMappingURL=chunk-PVKHVVFS.cjs.map
607
+ //# sourceMappingURL=chunk-PVKHVVFS.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/dentalChart.ts","../src/ui/widgets/DentalChartWidget.tsx"],"names":["jsxs","jsx","Trash2","cn","Textarea","Popover","PopoverTrigger","Fragment","PopoverContent","useField","useCallback","Button","X"],"mappings":"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","file":"chunk-X4AJCTON.cjs","sourcesContent":["import type { ToothCondition, DentalChartData } from './types';\n\nexport const CONDITION_CONFIG: Record<ToothCondition, { label: string; color: string }> = {\n cavity: { label: 'Cavity', color: '#ef4444' },\n filled: { label: 'Filled', color: '#3b82f6' },\n crown: { label: 'Crown', color: '#f59e0b' },\n missing: { label: 'Missing', color: '#9ca3af' },\n root_canal: { label: 'Root Canal (RCT)', color: '#a855f7' },\n bridge: { label: 'Bridge', color: '#f97316' },\n implant: { label: 'Implant', color: '#14b8a6' },\n fractured: { label: 'Fractured', color: '#eab308' },\n impacted: { label: 'Impacted', color: '#6366f1' },\n};\n\nexport const ALL_CONDITIONS = Object.keys(CONDITION_CONFIG) as ToothCondition[];\n\n/** FDI quadrant tooth numbers, ordered from midline outward */\nexport const QUADRANTS = {\n upperRight: [11, 12, 13, 14, 15, 16, 17, 18] as const,\n upperLeft: [21, 22, 23, 24, 25, 26, 27, 28] as const,\n lowerLeft: [31, 32, 33, 34, 35, 36, 37, 38] as const,\n lowerRight: [41, 42, 43, 44, 45, 46, 47, 48] as const,\n};\n\nconst TOOTH_NAMES: Record<number, string> = {\n 11: 'UR Central Incisor', 12: 'UR Lateral Incisor',\n 13: 'UR Canine', 14: 'UR 1st Premolar',\n 15: 'UR 2nd Premolar', 16: 'UR 1st Molar',\n 17: 'UR 2nd Molar', 18: 'UR 3rd Molar',\n 21: 'UL Central Incisor', 22: 'UL Lateral Incisor',\n 23: 'UL Canine', 24: 'UL 1st Premolar',\n 25: 'UL 2nd Premolar', 26: 'UL 1st Molar',\n 27: 'UL 2nd Molar', 28: 'UL 3rd Molar',\n 31: 'LL Central Incisor', 32: 'LL Lateral Incisor',\n 33: 'LL Canine', 34: 'LL 1st Premolar',\n 35: 'LL 2nd Premolar', 36: 'LL 1st Molar',\n 37: 'LL 2nd Molar', 38: 'LL 3rd Molar',\n 41: 'LR Central Incisor', 42: 'LR Lateral Incisor',\n 43: 'LR Canine', 44: 'LR 1st Premolar',\n 45: 'LR 2nd Premolar', 46: 'LR 1st Molar',\n 47: 'LR 2nd Molar', 48: 'LR 3rd Molar',\n};\n\nexport function toothLabel(id: number): string {\n return TOOTH_NAMES[id] ?? `Tooth ${id}`;\n}\n\n/** Conditions that support per-surface location selection. */\nexport const SURFACE_CONDITIONS: readonly ToothCondition[] = ['cavity', 'filled', 'fractured'];\n\n/** Anterior teeth that use \"Incisal\" instead of \"Occlusal\". */\nconst ANTERIOR_TEETH = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/**\n * Returns the ordered surface options for a given FDI tooth number.\n * - Upper jaw → Palatal (teeth 11-28)\n * - Lower jaw → Lingual (teeth 31-48)\n * - Anteriors → Incisal instead of Occlusal\n */\nexport function getToothSurfaces(id: number): string[] {\n const isUpper = id >= 11 && id <= 28;\n const isAnterior = ANTERIOR_TEETH.has(id);\n return [\n 'Buccal',\n 'Mesial',\n 'Distal',\n isAnterior ? 'Incisal' : 'Occlusal',\n isUpper ? 'Palatal' : 'Lingual',\n ];\n}\n\n/** Coerces an unknown value into a valid `DentalChartData` shape. */\nexport function normalizeDentalChart(value: unknown): DentalChartData {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.teeth && typeof v.teeth === 'object' && !Array.isArray(v.teeth)) {\n return value as DentalChartData;\n }\n }\n return { teeth: {} };\n}\n","import React, { useCallback } from 'react';\nimport { X, Trash2 } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Button } from '../shadcn/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../shadcn/popover';\nimport { Textarea } from '../shadcn/textarea';\nimport { useField } from '../../react/useField';\nimport {\n ALL_CONDITIONS,\n CONDITION_CONFIG,\n QUADRANTS,\n SURFACE_CONDITIONS,\n getToothSurfaces,\n normalizeDentalChart,\n toothLabel,\n} from '../../core/dentalChart';\nimport type { DentalChartData, ToothCondition, ToothEntry } from '../../core/types';\n\n// ─── Tooth Editor (inside popover) ───────────────────────────────────────────\n\nfunction ToothEditor({\n id,\n entry,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const surfaces = entry?.surfaces ?? {};\n const notes = entry?.notes ?? '';\n const availableSurfaces = getToothSurfaces(id);\n\n const buildEntry = (\n nextConditions: ToothCondition[],\n nextSurfaces: typeof surfaces,\n nextNotes: string,\n ): ToothEntry => ({\n conditions: nextConditions,\n surfaces: Object.keys(nextSurfaces).length ? nextSurfaces : undefined,\n notes: nextNotes || undefined,\n });\n\n const toggle = (c: ToothCondition) => {\n const isActive = conditions.includes(c);\n const nextConditions = isActive\n ? conditions.filter((x) => x !== c)\n : [...conditions, c];\n // Clear surfaces for a condition being deactivated\n const nextSurfaces = { ...surfaces };\n if (isActive) delete nextSurfaces[c];\n onChange(buildEntry(nextConditions, nextSurfaces, notes));\n };\n\n const toggleSurface = (c: ToothCondition, surface: string) => {\n const current = surfaces[c] ?? [];\n const next = current.includes(surface)\n ? current.filter((s) => s !== surface)\n : [...current, surface];\n const nextSurfaces = { ...surfaces, [c]: next.length ? next : [] };\n onChange(buildEntry(conditions, nextSurfaces, notes));\n };\n\n const updateNotes = (v: string) =>\n onChange(buildEntry(conditions, surfaces, v));\n\n // Conditions active that support surface selection\n const activeSurfaceConditions = SURFACE_CONDITIONS.filter((c) =>\n conditions.includes(c),\n );\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div>\n <p className=\"text-xs font-semibold text-foreground\">Tooth {id}</p>\n <p className=\"text-[10px] text-muted-foreground\">{toothLabel(id)}</p>\n </div>\n {conditions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => onChange({ conditions: [] })}\n className=\"flex shrink-0 items-center gap-1 text-[10px] text-destructive hover:underline\"\n >\n <Trash2 className=\"h-3 w-3\" />\n Clear\n </button>\n )}\n </div>\n\n {/* Condition chips */}\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const active = conditions.includes(c);\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => toggle(c)}\n className={cn(\n 'rounded-full border px-2.5 py-0.5 text-[10px] font-medium transition-all',\n active\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={active ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {cfg.label}\n </button>\n );\n })}\n </div>\n\n {/* Surface location pickers — one per active surface-eligible condition */}\n {activeSurfaceConditions.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const selected = surfaces[c] ?? [];\n return (\n <div key={c} className=\"space-y-1\">\n <p\n className=\"text-[10px] font-semibold uppercase tracking-wide\"\n style={{ color: cfg.color }}\n >\n {cfg.label} — surfaces\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {availableSurfaces.map((surface) => {\n const on = selected.includes(surface);\n return (\n <button\n key={surface}\n type=\"button\"\n onClick={() => toggleSurface(c, surface)}\n className={cn(\n 'rounded border px-2 py-0.5 text-[10px] font-medium transition-all',\n on\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={on ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {surface}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n <Textarea\n value={notes}\n onChange={(e) => updateNotes(e.target.value)}\n placeholder=\"Notes for this tooth…\"\n className=\"h-16 resize-none text-xs\"\n />\n </div>\n );\n}\n\n// ─── Single Tooth Button ──────────────────────────────────────────────────────\n\nfunction ToothButton({\n id,\n entry,\n isUpper,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n cursor: 'pointer',\n userSelect: 'none',\n outline: 'none',\n transition: 'box-shadow 0.15s',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={toothLabel(id)}\n style={boxStyle}\n className=\"hover:ring-2 hover:ring-primary/30 focus:ring-2 focus:ring-primary/40\"\n >\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent className=\"w-72 p-3\" side={isUpper ? 'top' : 'bottom'} align=\"center\" sideOffset={6}>\n <ToothEditor id={id} entry={entry} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Tooth surface diagram ────────────────────────────────────────────────────\n\nconst ANTERIOR_IDS = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/** Build a surface→color map from an entry's per-condition surface selections. */\nfunction buildSurfaceColorMap(entry: ToothEntry | undefined): Record<string, string> {\n if (!entry?.surfaces) return {};\n const map: Record<string, string> = {};\n for (const cond of SURFACE_CONDITIONS) {\n const surfs = entry.surfaces[cond as ToothCondition];\n if (!surfs?.length) continue;\n const color = CONDITION_CONFIG[cond as ToothCondition]?.color;\n if (!color) continue;\n for (const s of surfs) map[s] = color;\n }\n return map;\n}\n\n/**\n * Small SVG cross-section of a tooth crown (occlusal view).\n * 5 segments: Buccal (top) · Mesial (left) · Distal (right) ·\n * Palatal or Lingual (bottom) · Occlusal or Incisal (centre).\n */\nfunction ToothDiagram({ id, entry }: { id: number; entry: ToothEntry | undefined }) {\n const colorMap = buildSurfaceColorMap(entry);\n const hasSurfaces = Object.keys(colorMap).length > 0;\n\n const isUpper = id >= 11 && id <= 28;\n const bottomLabel = isUpper ? 'Palatal' : 'Lingual';\n const centerLabel = ANTERIOR_IDS.has(id) ? 'Incisal' : 'Occlusal';\n\n // 46 × 46 viewBox; inner corners at 11 and 35\n const S = 46;\n const I = 11;\n const segments = [\n { key: 'Buccal', d: `M0,0 L${S},0 L${S-I},${I} L${I},${I}Z` },\n { key: 'Mesial', d: `M0,0 L0,${S} L${I},${S-I} L${I},${I}Z` },\n { key: 'Distal', d: `M${S},0 L${S},${S} L${S-I},${S-I} L${S-I},${I}Z` },\n { key: bottomLabel, d: `M0,${S} L${S},${S} L${S-I},${S-I} L${I},${S-I}Z` },\n { key: centerLabel, d: `M${I},${I} L${S-I},${I} L${S-I},${S-I} L${I},${S-I}Z` },\n ];\n\n return (\n <svg\n width={S}\n height={S}\n viewBox={`0 0 ${S} ${S}`}\n style={{ flexShrink: 0, opacity: hasSurfaces ? 1 : 0.3 }}\n >\n {segments.map(({ key, d }) => {\n const color = colorMap[key];\n return (\n <path\n key={key}\n d={d}\n fill={color ?? '#f1f5f9'}\n stroke={color ? color : '#cbd5e1'}\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n />\n );\n })}\n </svg>\n );\n}\n\n// ─── Arch Row ─────────────────────────────────────────────────────────────────\n\nfunction ArchRow({\n teeth: toothIds,\n isUpper,\n data,\n onChange,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n onChange: (id: number, entry: ToothEntry) => void;\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ToothButton\n id={id}\n entry={data[String(id)]}\n isUpper={isUpper}\n onChange={(entry) => onChange(id, entry)}\n />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\n// ─── Legend ───────────────────────────────────────────────────────────────────\n\nfunction ChartLegend() {\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── Forminator Widget wrapper ────────────────────────────────────────────────\n\nexport const DentalChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, setTouched, disabled } = useField(fieldId);\n const data = normalizeDentalChart(value);\n const teeth = data.teeth;\n\n const handleToothChange = useCallback(\n (id: number, entry: ToothEntry) => {\n const next: DentalChartData['teeth'] = { ...teeth };\n if (entry.conditions.length === 0 && !entry.notes) {\n delete next[String(id)];\n } else {\n next[String(id)] = entry;\n }\n setValue({ teeth: next });\n setTouched();\n },\n [teeth, setValue, setTouched],\n );\n\n const markedCount = Object.keys(teeth).length;\n\n if (disabled) {\n return <DentalChartDisplay data={data} />;\n }\n\n return (\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n Click any tooth to mark conditions\n {markedCount > 0 && (\n <span className=\"ml-1 font-medium text-foreground\">\n · {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </span>\n )}\n </p>\n </div>\n {markedCount > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { setValue({ teeth: {} }); setTouched(); }}\n className=\"h-7 gap-1 text-xs text-destructive hover:text-destructive\"\n >\n <X className=\"h-3 w-3\" />\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} onChange={handleToothChange} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} onChange={handleToothChange} />\n </div>\n </div>\n\n <div className=\"my-2 flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} onChange={handleToothChange} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} onChange={handleToothChange} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ChartLegend />\n </div>\n </div>\n );\n};\n\n// ─── Minimal display used when field is disabled ──────────────────────────────\n\nfunction DentalChartDisplay({ data }: { data: DentalChartData }) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n if (markedCount === 0) {\n return (\n <div className=\"rounded-xl border border-border/60 bg-card px-4 py-8 text-center text-sm text-muted-foreground shadow-sm\">\n No dental findings recorded\n </div>\n );\n }\n return <DentalChartReadOnly data={data} />;\n}\n\n// ─── Standalone read-only view (also exported for prescription pages) ─────────\n\nexport function DentalChartReadOnly({\n data,\n className,\n}: {\n data: DentalChartData;\n className?: string;\n}) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n\n const usedConditions = new Set(\n Object.values(teeth).flatMap((e) => e.conditions ?? []),\n );\n\n const toothNotes = Object.entries(teeth)\n .filter(([, e]) => e.notes)\n .map(([id, e]) => ({ id: Number(id), label: toothLabel(Number(id)), notes: e.notes! }));\n\n return (\n <div className={cn('rounded-xl border border-border/60 bg-card shadow-sm', className)}>\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n {markedCount > 0 && (\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </p>\n )}\n </div>\n </div>\n\n {markedCount === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n No dental findings recorded\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} />\n </div>\n </div>\n\n <div className=\"my-2 flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {usedConditions.size > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ReadOnlyLegend usedConditions={usedConditions} />\n </div>\n )}\n\n {toothNotes.length > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Tooth Notes</p>\n <div className=\"space-y-1.5\">\n {toothNotes.map(({ id, label, notes }) => (\n <div key={id} className=\"flex gap-2 text-xs\">\n <span className=\"shrink-0 font-medium text-foreground\">{id}</span>\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className=\"text-foreground\">{notes}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Read-only helpers ────────────────────────────────────────────────────────\n\nfunction ReadOnlyTooth({\n id,\n entry,\n isUpper,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const tooltipParts = [\n `Tooth ${id}: ${toothLabel(id)}`,\n conditions.length > 0\n ? conditions.map((c) => CONDITION_CONFIG[c as ToothCondition]?.label ?? c).join(', ')\n : 'Healthy',\n entry?.notes ? `Notes: ${entry.notes}` : null,\n ].filter(Boolean);\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n userSelect: 'none',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <div title={tooltipParts.join('\\n')} style={boxStyle}>\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </div>\n );\n}\n\nfunction ReadOnlyArchRow({\n teeth: toothIds,\n isUpper,\n data,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ReadOnlyTooth id={id} entry={data[String(id)]} isUpper={isUpper} />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ReadOnlyLegend({ usedConditions }: { usedConditions: Set<string> }) {\n const active = ALL_CONDITIONS.filter((c) => usedConditions.has(c));\n if (active.length === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {active.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/core/dentalChart.ts","../src/ui/widgets/DentalChartWidget.tsx"],"names":["jsxs","jsx","Trash2","cn","Textarea","Popover","PopoverTrigger","Fragment","PopoverContent","useField","useCallback","Button","X"],"mappings":"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","file":"chunk-PVKHVVFS.cjs","sourcesContent":["import type { ToothCondition, DentalChartData } from './types';\n\nexport const CONDITION_CONFIG: Record<ToothCondition, { label: string; color: string }> = {\n cavity: { label: 'Cavity', color: '#ef4444' },\n filled: { label: 'Filled', color: '#3b82f6' },\n crown: { label: 'Crown', color: '#f59e0b' },\n missing: { label: 'Missing', color: '#9ca3af' },\n root_canal: { label: 'Root Canal (RCT)', color: '#a855f7' },\n bridge: { label: 'Bridge', color: '#f97316' },\n implant: { label: 'Implant', color: '#14b8a6' },\n fractured: { label: 'Fractured', color: '#eab308' },\n impacted: { label: 'Impacted', color: '#6366f1' },\n};\n\nexport const ALL_CONDITIONS = Object.keys(CONDITION_CONFIG) as ToothCondition[];\n\n/** FDI quadrant tooth numbers, ordered from midline outward */\nexport const QUADRANTS = {\n upperRight: [11, 12, 13, 14, 15, 16, 17, 18] as const,\n upperLeft: [21, 22, 23, 24, 25, 26, 27, 28] as const,\n lowerLeft: [31, 32, 33, 34, 35, 36, 37, 38] as const,\n lowerRight: [41, 42, 43, 44, 45, 46, 47, 48] as const,\n};\n\nconst TOOTH_NAMES: Record<number, string> = {\n 11: 'UR Central Incisor', 12: 'UR Lateral Incisor',\n 13: 'UR Canine', 14: 'UR 1st Premolar',\n 15: 'UR 2nd Premolar', 16: 'UR 1st Molar',\n 17: 'UR 2nd Molar', 18: 'UR 3rd Molar',\n 21: 'UL Central Incisor', 22: 'UL Lateral Incisor',\n 23: 'UL Canine', 24: 'UL 1st Premolar',\n 25: 'UL 2nd Premolar', 26: 'UL 1st Molar',\n 27: 'UL 2nd Molar', 28: 'UL 3rd Molar',\n 31: 'LL Central Incisor', 32: 'LL Lateral Incisor',\n 33: 'LL Canine', 34: 'LL 1st Premolar',\n 35: 'LL 2nd Premolar', 36: 'LL 1st Molar',\n 37: 'LL 2nd Molar', 38: 'LL 3rd Molar',\n 41: 'LR Central Incisor', 42: 'LR Lateral Incisor',\n 43: 'LR Canine', 44: 'LR 1st Premolar',\n 45: 'LR 2nd Premolar', 46: 'LR 1st Molar',\n 47: 'LR 2nd Molar', 48: 'LR 3rd Molar',\n};\n\nexport function toothLabel(id: number): string {\n return TOOTH_NAMES[id] ?? `Tooth ${id}`;\n}\n\n/** Conditions that support per-surface location selection. */\nexport const SURFACE_CONDITIONS: readonly ToothCondition[] = ['cavity', 'filled', 'fractured'];\n\n/** Anterior teeth that use \"Incisal\" instead of \"Occlusal\". */\nconst ANTERIOR_TEETH = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/**\n * Returns the ordered surface options for a given FDI tooth number.\n * - Upper jaw → Palatal (teeth 11-28)\n * - Lower jaw → Lingual (teeth 31-48)\n * - Anteriors → Incisal instead of Occlusal\n */\nexport function getToothSurfaces(id: number): string[] {\n const isUpper = id >= 11 && id <= 28;\n const isAnterior = ANTERIOR_TEETH.has(id);\n return [\n 'Buccal',\n 'Mesial',\n 'Distal',\n isAnterior ? 'Incisal' : 'Occlusal',\n isUpper ? 'Palatal' : 'Lingual',\n ];\n}\n\n/** Coerces an unknown value into a valid `DentalChartData` shape. */\nexport function normalizeDentalChart(value: unknown): DentalChartData {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n const v = value as Record<string, unknown>;\n if (v.teeth && typeof v.teeth === 'object' && !Array.isArray(v.teeth)) {\n return value as DentalChartData;\n }\n }\n return { teeth: {} };\n}\n","import React, { useCallback } from 'react';\nimport { X, Trash2 } from 'lucide-react';\nimport { cn } from '../../core/utils';\nimport { Button } from '../shadcn/button';\nimport { Popover, PopoverContent, PopoverTrigger } from '../shadcn/popover';\nimport { Textarea } from '../shadcn/textarea';\nimport { useField } from '../../react/useField';\nimport {\n ALL_CONDITIONS,\n CONDITION_CONFIG,\n QUADRANTS,\n SURFACE_CONDITIONS,\n getToothSurfaces,\n normalizeDentalChart,\n toothLabel,\n} from '../../core/dentalChart';\nimport type { DentalChartData, ToothCondition, ToothEntry } from '../../core/types';\n\n// ─── Tooth Editor (inside popover) ───────────────────────────────────────────\n\nfunction ToothEditor({\n id,\n entry,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const surfaces = entry?.surfaces ?? {};\n const notes = entry?.notes ?? '';\n const availableSurfaces = getToothSurfaces(id);\n\n const buildEntry = (\n nextConditions: ToothCondition[],\n nextSurfaces: typeof surfaces,\n nextNotes: string,\n ): ToothEntry => ({\n conditions: nextConditions,\n surfaces: Object.keys(nextSurfaces).length ? nextSurfaces : undefined,\n notes: nextNotes || undefined,\n });\n\n const toggle = (c: ToothCondition) => {\n const isActive = conditions.includes(c);\n const nextConditions = isActive\n ? conditions.filter((x) => x !== c)\n : [...conditions, c];\n // Clear surfaces for a condition being deactivated\n const nextSurfaces = { ...surfaces };\n if (isActive) delete nextSurfaces[c];\n onChange(buildEntry(nextConditions, nextSurfaces, notes));\n };\n\n const toggleSurface = (c: ToothCondition, surface: string) => {\n const current = surfaces[c] ?? [];\n const next = current.includes(surface)\n ? current.filter((s) => s !== surface)\n : [...current, surface];\n const nextSurfaces = { ...surfaces, [c]: next.length ? next : [] };\n onChange(buildEntry(conditions, nextSurfaces, notes));\n };\n\n const updateNotes = (v: string) =>\n onChange(buildEntry(conditions, surfaces, v));\n\n // Conditions active that support surface selection\n const activeSurfaceConditions = SURFACE_CONDITIONS.filter((c) =>\n conditions.includes(c),\n );\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex items-start justify-between gap-2\">\n <div>\n <p className=\"text-xs font-semibold text-foreground\">Tooth {id}</p>\n <p className=\"text-[10px] text-muted-foreground\">{toothLabel(id)}</p>\n </div>\n {conditions.length > 0 && (\n <button\n type=\"button\"\n onClick={() => onChange({ conditions: [] })}\n className=\"flex shrink-0 items-center gap-1 text-[10px] text-destructive hover:underline\"\n >\n <Trash2 className=\"h-3 w-3\" />\n Clear\n </button>\n )}\n </div>\n\n {/* Condition chips */}\n <div className=\"flex flex-wrap gap-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const active = conditions.includes(c);\n return (\n <button\n key={c}\n type=\"button\"\n onClick={() => toggle(c)}\n className={cn(\n 'rounded-full border px-2.5 py-0.5 text-[10px] font-medium transition-all',\n active\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={active ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {cfg.label}\n </button>\n );\n })}\n </div>\n\n {/* Surface location pickers — one per active surface-eligible condition */}\n {activeSurfaceConditions.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n const selected = surfaces[c] ?? [];\n return (\n <div key={c} className=\"space-y-1\">\n <p\n className=\"text-[10px] font-semibold uppercase tracking-wide\"\n style={{ color: cfg.color }}\n >\n {cfg.label} — surfaces\n </p>\n <div className=\"flex flex-wrap gap-1\">\n {availableSurfaces.map((surface) => {\n const on = selected.includes(surface);\n return (\n <button\n key={surface}\n type=\"button\"\n onClick={() => toggleSurface(c, surface)}\n className={cn(\n 'rounded border px-2 py-0.5 text-[10px] font-medium transition-all',\n on\n ? 'text-white'\n : 'border-border bg-background text-muted-foreground hover:border-gray-400',\n )}\n style={on ? { backgroundColor: cfg.color, borderColor: cfg.color } : undefined}\n >\n {surface}\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n <Textarea\n value={notes}\n onChange={(e) => updateNotes(e.target.value)}\n placeholder=\"Notes for this tooth…\"\n className=\"h-16 resize-none text-xs\"\n />\n </div>\n );\n}\n\n// ─── Single Tooth Button ──────────────────────────────────────────────────────\n\nfunction ToothButton({\n id,\n entry,\n isUpper,\n onChange,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n onChange: (entry: ToothEntry) => void;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n cursor: 'pointer',\n userSelect: 'none',\n outline: 'none',\n transition: 'box-shadow 0.15s',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <Popover>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={toothLabel(id)}\n style={boxStyle}\n className=\"hover:ring-2 hover:ring-primary/30 focus:ring-2 focus:ring-primary/40\"\n >\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent className=\"w-72 p-3\" side={isUpper ? 'top' : 'bottom'} align=\"center\" sideOffset={6}>\n <ToothEditor id={id} entry={entry} onChange={onChange} />\n </PopoverContent>\n </Popover>\n );\n}\n\n// ─── Tooth surface diagram ────────────────────────────────────────────────────\n\nconst ANTERIOR_IDS = new Set([13, 12, 11, 21, 22, 23, 43, 42, 41, 31, 32, 33]);\n\n/** Build a surface→color map from an entry's per-condition surface selections. */\nfunction buildSurfaceColorMap(entry: ToothEntry | undefined): Record<string, string> {\n if (!entry?.surfaces) return {};\n const map: Record<string, string> = {};\n for (const cond of SURFACE_CONDITIONS) {\n const surfs = entry.surfaces[cond as ToothCondition];\n if (!surfs?.length) continue;\n const color = CONDITION_CONFIG[cond as ToothCondition]?.color;\n if (!color) continue;\n for (const s of surfs) map[s] = color;\n }\n return map;\n}\n\n/**\n * Small SVG cross-section of a tooth crown (occlusal view).\n * 5 segments: Buccal (top) · Mesial (left) · Distal (right) ·\n * Palatal or Lingual (bottom) · Occlusal or Incisal (centre).\n */\nfunction ToothDiagram({ id, entry }: { id: number; entry: ToothEntry | undefined }) {\n const colorMap = buildSurfaceColorMap(entry);\n const hasSurfaces = Object.keys(colorMap).length > 0;\n\n const isUpper = id >= 11 && id <= 28;\n const bottomLabel = isUpper ? 'Palatal' : 'Lingual';\n const centerLabel = ANTERIOR_IDS.has(id) ? 'Incisal' : 'Occlusal';\n\n // 46 × 46 viewBox; inner corners at 11 and 35\n const S = 46;\n const I = 11;\n const segments = [\n { key: 'Buccal', d: `M0,0 L${S},0 L${S-I},${I} L${I},${I}Z` },\n { key: 'Mesial', d: `M0,0 L0,${S} L${I},${S-I} L${I},${I}Z` },\n { key: 'Distal', d: `M${S},0 L${S},${S} L${S-I},${S-I} L${S-I},${I}Z` },\n { key: bottomLabel, d: `M0,${S} L${S},${S} L${S-I},${S-I} L${I},${S-I}Z` },\n { key: centerLabel, d: `M${I},${I} L${S-I},${I} L${S-I},${S-I} L${I},${S-I}Z` },\n ];\n\n return (\n <svg\n width={S}\n height={S}\n viewBox={`0 0 ${S} ${S}`}\n style={{ flexShrink: 0, opacity: hasSurfaces ? 1 : 0.3 }}\n >\n {segments.map(({ key, d }) => {\n const color = colorMap[key];\n return (\n <path\n key={key}\n d={d}\n fill={color ?? '#f1f5f9'}\n stroke={color ? color : '#cbd5e1'}\n strokeWidth=\"1\"\n strokeLinejoin=\"round\"\n />\n );\n })}\n </svg>\n );\n}\n\n// ─── Arch Row ─────────────────────────────────────────────────────────────────\n\nfunction ArchRow({\n teeth: toothIds,\n isUpper,\n data,\n onChange,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n onChange: (id: number, entry: ToothEntry) => void;\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ToothButton\n id={id}\n entry={data[String(id)]}\n isUpper={isUpper}\n onChange={(entry) => onChange(id, entry)}\n />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\n// ─── Legend ───────────────────────────────────────────────────────────────────\n\nfunction ChartLegend() {\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {ALL_CONDITIONS.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── Forminator Widget wrapper ────────────────────────────────────────────────\n\nexport const DentalChartWidget: React.FC<{ fieldId: string }> = ({ fieldId }) => {\n const { value, setValue, setTouched, disabled } = useField(fieldId);\n const data = normalizeDentalChart(value);\n const teeth = data.teeth;\n\n const handleToothChange = useCallback(\n (id: number, entry: ToothEntry) => {\n const next: DentalChartData['teeth'] = { ...teeth };\n if (entry.conditions.length === 0 && !entry.notes) {\n delete next[String(id)];\n } else {\n next[String(id)] = entry;\n }\n setValue({ teeth: next });\n setTouched();\n },\n [teeth, setValue, setTouched],\n );\n\n const markedCount = Object.keys(teeth).length;\n\n if (disabled) {\n return <DentalChartDisplay data={data} />;\n }\n\n return (\n <div className=\"rounded-xl border border-border/60 bg-card shadow-sm\">\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n Click any tooth to mark conditions\n {markedCount > 0 && (\n <span className=\"ml-1 font-medium text-foreground\">\n · {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </span>\n )}\n </p>\n </div>\n {markedCount > 0 && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => { setValue({ teeth: {} }); setTouched(); }}\n className=\"h-7 gap-1 text-xs text-destructive hover:text-destructive\"\n >\n <X className=\"h-3 w-3\" />\n Clear all\n </Button>\n )}\n </div>\n\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} onChange={handleToothChange} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} onChange={handleToothChange} />\n </div>\n </div>\n\n <div className=\"my-2 flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} onChange={handleToothChange} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} onChange={handleToothChange} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ChartLegend />\n </div>\n </div>\n );\n};\n\n// ─── Minimal display used when field is disabled ──────────────────────────────\n\nfunction DentalChartDisplay({ data }: { data: DentalChartData }) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n if (markedCount === 0) {\n return (\n <div className=\"rounded-xl border border-border/60 bg-card px-4 py-8 text-center text-sm text-muted-foreground shadow-sm\">\n No dental findings recorded\n </div>\n );\n }\n return <DentalChartReadOnly data={data} />;\n}\n\n// ─── Standalone read-only view (also exported for prescription pages) ─────────\n\nexport function DentalChartReadOnly({\n data,\n className,\n}: {\n data: DentalChartData;\n className?: string;\n}) {\n const teeth = data.teeth ?? {};\n const markedCount = Object.keys(teeth).length;\n\n const usedConditions = new Set(\n Object.values(teeth).flatMap((e) => e.conditions ?? []),\n );\n\n const toothNotes = Object.entries(teeth)\n .filter(([, e]) => e.notes)\n .map(([id, e]) => ({ id: Number(id), label: toothLabel(Number(id)), notes: e.notes! }));\n\n return (\n <div className={cn('rounded-xl border border-border/60 bg-card shadow-sm', className)}>\n <div className=\"flex items-center justify-between border-b border-border/60 px-4 py-3\">\n <div>\n <h3 className=\"text-sm font-semibold text-foreground\">\n Intra Oral Examination – Dental Chart\n </h3>\n {markedCount > 0 && (\n <p className=\"mt-0.5 text-[11px] text-muted-foreground\">\n {markedCount} {markedCount !== 1 ? 'teeth' : 'tooth'} marked\n </p>\n )}\n </div>\n </div>\n\n {markedCount === 0 ? (\n <div className=\"px-4 py-8 text-center text-sm text-muted-foreground\">\n No dental findings recorded\n </div>\n ) : (\n <>\n <div className=\"overflow-x-auto px-4 py-4\">\n <div className=\"flex justify-center\">\n <div className=\"flex flex-col items-center gap-0\">\n {/* Upper arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UR</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperRight} isUpper data={teeth} reverseOrder />\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <span className=\"mb-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">UL</span>\n <ReadOnlyArchRow teeth={QUADRANTS.upperLeft} isUpper data={teeth} />\n </div>\n </div>\n\n <div className=\"my-2 flex w-full items-center gap-2\">\n <div className=\"h-px flex-1 bg-border\" />\n <span className=\"text-xs font-semibold uppercase tracking-wider text-muted-foreground\">Occlusal</span>\n <div className=\"h-px flex-1 bg-border\" />\n </div>\n\n {/* Lower arch */}\n <div className=\"flex\">\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerRight} isUpper={false} data={teeth} reverseOrder />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LR</span>\n </div>\n <div className=\"mx-2 h-[58px] w-px bg-border\" />\n <div className=\"flex flex-col\">\n <ReadOnlyArchRow teeth={QUADRANTS.lowerLeft} isUpper={false} data={teeth} />\n <span className=\"mt-1 text-xs font-semibold uppercase tracking-wider text-muted-foreground\">LL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n {usedConditions.size > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Legend</p>\n <ReadOnlyLegend usedConditions={usedConditions} />\n </div>\n )}\n\n {toothNotes.length > 0 && (\n <div className=\"border-t border-border/60 px-4 py-3\">\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">Tooth Notes</p>\n <div className=\"space-y-1.5\">\n {toothNotes.map(({ id, label, notes }) => (\n <div key={id} className=\"flex gap-2 text-xs\">\n <span className=\"shrink-0 font-medium text-foreground\">{id}</span>\n <span className=\"text-muted-foreground\">{label}:</span>\n <span className=\"text-foreground\">{notes}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n\n// ─── Read-only helpers ────────────────────────────────────────────────────────\n\nfunction ReadOnlyTooth({\n id,\n entry,\n isUpper,\n}: {\n id: number;\n entry: ToothEntry | undefined;\n isUpper: boolean;\n}) {\n const conditions = entry?.conditions ?? [];\n const isMissing = conditions.includes('missing');\n const primary = isMissing ? 'missing' : (conditions[0] ?? null);\n const primaryColor = primary ? CONDITION_CONFIG[primary as ToothCondition].color : null;\n const multiCount = conditions.length > 1 ? conditions.length : null;\n\n const tooltipParts = [\n `Tooth ${id}: ${toothLabel(id)}`,\n conditions.length > 0\n ? conditions.map((c) => CONDITION_CONFIG[c as ToothCondition]?.label ?? c).join(', ')\n : 'Healthy',\n entry?.notes ? `Notes: ${entry.notes}` : null,\n ].filter(Boolean);\n\n const boxStyle: React.CSSProperties = {\n position: 'relative',\n width: 46,\n height: 58,\n flexShrink: 0,\n display: 'flex',\n flexDirection: 'column',\n borderRadius: 6,\n border: '1px solid',\n borderColor: !isMissing && primaryColor ? primaryColor : isMissing ? '#d1d5db' : '#e5e7eb',\n backgroundColor: isMissing ? '#f3f4f6' : '#ffffff',\n userSelect: 'none',\n };\n\n const numberStyle: React.CSSProperties = {\n flex: 1,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: 11,\n fontWeight: 700,\n color: isMissing ? '#9ca3af' : '#374151',\n lineHeight: 1,\n };\n\n const stripStyle = (rounded: 'top' | 'bottom'): React.CSSProperties => ({\n height: 10,\n flexShrink: 0,\n borderRadius: rounded === 'bottom' ? '0 0 5px 5px' : '5px 5px 0 0',\n backgroundColor: !isMissing && primaryColor ? primaryColor : 'transparent',\n });\n\n return (\n <div title={tooltipParts.join('\\n')} style={boxStyle}>\n {isUpper ? (\n <>\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n <div style={stripStyle('bottom')} />\n </>\n ) : (\n <>\n <div style={stripStyle('top')} />\n <div style={numberStyle}>{isMissing ? '✕' : id}</div>\n </>\n )}\n\n {/* Multi-condition badge */}\n {multiCount && (\n <span className=\"absolute -top-1.5 -right-1.5 z-10 flex h-3.5 w-3.5 items-center justify-center rounded-full bg-primary text-[7px] font-bold text-primary-foreground\">\n {multiCount}\n </span>\n )}\n </div>\n );\n}\n\nfunction ReadOnlyArchRow({\n teeth: toothIds,\n isUpper,\n data,\n reverseOrder = false,\n}: {\n teeth: readonly number[];\n isUpper: boolean;\n data: DentalChartData['teeth'];\n reverseOrder?: boolean;\n}) {\n const ordered = reverseOrder ? [...toothIds].reverse() : toothIds;\n return (\n <div className=\"flex gap-1\">\n {ordered.map((id) => (\n <div key={id} className=\"flex flex-col items-center gap-0.5\">\n {isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n <ReadOnlyTooth id={id} entry={data[String(id)]} isUpper={isUpper} />\n {!isUpper && <ToothDiagram id={id} entry={data[String(id)]} />}\n </div>\n ))}\n </div>\n );\n}\n\nfunction ReadOnlyLegend({ usedConditions }: { usedConditions: Set<string> }) {\n const active = ALL_CONDITIONS.filter((c) => usedConditions.has(c));\n if (active.length === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-x-4 gap-y-1.5\">\n {active.map((c) => {\n const cfg = CONDITION_CONFIG[c];\n return (\n <div key={c} className=\"flex items-center gap-1.5\">\n <span className=\"h-2.5 w-2.5 shrink-0 rounded-full\" style={{ backgroundColor: cfg.color }} />\n <span className=\"text-[10px] text-muted-foreground\">{cfg.label}</span>\n </div>\n );\n })}\n </div>\n );\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { useFormStore, useVoiceContext } from './chunk-2BGJZ44Q.mjs';
1
+ import { useFormStore, useVoiceContext } from './chunk-HKEUAERY.mjs';
2
2
  import { useState, useCallback } from 'react';
3
3
  import { Loader2, Mic } from 'lucide-react';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -71,5 +71,5 @@ function VoiceMicButton({ fieldId, onTranscriptReady }) {
71
71
  }
72
72
 
73
73
  export { VoiceMicButton };
74
- //# sourceMappingURL=chunk-Q3K646K4.mjs.map
75
- //# sourceMappingURL=chunk-Q3K646K4.mjs.map
74
+ //# sourceMappingURL=chunk-QM6UMI2M.mjs.map
75
+ //# sourceMappingURL=chunk-QM6UMI2M.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/VoiceMicButton.tsx"],"names":[],"mappings":"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","file":"chunk-Q3K646K4.mjs","sourcesContent":["import { useCallback, useState } from 'react';\nimport { Mic, Loader2 } from 'lucide-react';\nimport { useFormStore } from './FormProvider';\nimport { useVoiceContext } from './VoiceContext';\n\ntype RecordingStatus = 'idle' | 'recording' | 'transcribing';\n\nfunction RecordingWave() {\n const bars = [\n { dur: '0.6s', values: '3;10;3', yValues: '4.5;0;4.5', delay: '0s' },\n { dur: '0.6s', values: '8;3;8', yValues: '2;4.5;2', delay: '0.1s' },\n { dur: '0.6s', values: '5;11;5', yValues: '3.5;0.5;3.5', delay: '0.05s' },\n { dur: '0.6s', values: '10;4;10', yValues: '1;4;1', delay: '0.15s' },\n ];\n return (\n <svg width=\"16\" height=\"12\" viewBox=\"0 0 18 12\" aria-hidden>\n {bars.map((b, i) => (\n <rect key={i} x={i * 4 + 1} width=\"2.5\" rx=\"1.25\" fill=\"currentColor\" y=\"0\" height=\"12\">\n <animate attributeName=\"height\" values={b.values} dur={b.dur} begin={b.delay} repeatCount=\"indefinite\" />\n <animate attributeName=\"y\" values={b.yValues} dur={b.dur} begin={b.delay} repeatCount=\"indefinite\" />\n </rect>\n ))}\n </svg>\n );\n}\n\ninterface VoiceMicButtonProps {\n fieldId: string;\n onTranscriptReady: (transcript: string) => void;\n}\n\nexport function VoiceMicButton({ fieldId, onTranscriptReady }: VoiceMicButtonProps) {\n const store = useFormStore();\n const { activeFieldId, setActiveFieldId } = useVoiceContext();\n const [status, setStatus] = useState<RecordingStatus>('idle');\n\n const voice = store.getVoice();\n\n const isActive = activeFieldId === fieldId;\n const isRecording = status === 'recording' && isActive;\n const isTranscribing = status === 'transcribing' && isActive;\n const isBlocked = activeFieldId !== null && !isActive;\n\n const handleClick = useCallback(async () => {\n if (!voice || isBlocked || isTranscribing) return;\n\n if (isRecording) {\n setStatus('transcribing');\n try {\n const transcript = await voice.stopRecording();\n if (transcript) onTranscriptReady(transcript);\n } catch {\n // silently reset on error\n } finally {\n setStatus('idle');\n setActiveFieldId(null);\n }\n } else {\n setActiveFieldId(fieldId);\n setStatus('recording');\n try {\n await voice.startRecording(fieldId);\n } catch {\n setStatus('idle');\n setActiveFieldId(null);\n }\n }\n }, [voice, isBlocked, isTranscribing, isRecording, fieldId, onTranscriptReady, setActiveFieldId]);\n\n const title = isTranscribing\n ? 'Processing…'\n : isRecording\n ? 'Stop recording'\n : 'Dictate this field';\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isBlocked || isTranscribing}\n title={title}\n className={[\n 'flex items-center gap-1 rounded px-1 py-0.5',\n 'text-[11px] font-medium transition-opacity',\n isBlocked ? 'pointer-events-none opacity-30' : '',\n isTranscribing ? 'cursor-wait opacity-50' : '',\n !isBlocked && !isTranscribing ? 'hover:opacity-70' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {isTranscribing ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-slate-400\" />\n ) : isRecording ? (\n <>\n <span className=\"text-rose-400\">\n <RecordingWave />\n </span>\n <span className=\"text-rose-400\">Stop</span>\n </>\n ) : (\n <Mic className=\"h-4 w-4 text-slate-400\" />\n )}\n </button>\n );\n}\n"]}
1
+ {"version":3,"sources":["../src/react/VoiceMicButton.tsx"],"names":[],"mappings":"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","file":"chunk-QM6UMI2M.mjs","sourcesContent":["import { useCallback, useState } from 'react';\nimport { Mic, Loader2 } from 'lucide-react';\nimport { useFormStore } from './FormProvider';\nimport { useVoiceContext } from './VoiceContext';\n\ntype RecordingStatus = 'idle' | 'recording' | 'transcribing';\n\nfunction RecordingWave() {\n const bars = [\n { dur: '0.6s', values: '3;10;3', yValues: '4.5;0;4.5', delay: '0s' },\n { dur: '0.6s', values: '8;3;8', yValues: '2;4.5;2', delay: '0.1s' },\n { dur: '0.6s', values: '5;11;5', yValues: '3.5;0.5;3.5', delay: '0.05s' },\n { dur: '0.6s', values: '10;4;10', yValues: '1;4;1', delay: '0.15s' },\n ];\n return (\n <svg width=\"16\" height=\"12\" viewBox=\"0 0 18 12\" aria-hidden>\n {bars.map((b, i) => (\n <rect key={i} x={i * 4 + 1} width=\"2.5\" rx=\"1.25\" fill=\"currentColor\" y=\"0\" height=\"12\">\n <animate attributeName=\"height\" values={b.values} dur={b.dur} begin={b.delay} repeatCount=\"indefinite\" />\n <animate attributeName=\"y\" values={b.yValues} dur={b.dur} begin={b.delay} repeatCount=\"indefinite\" />\n </rect>\n ))}\n </svg>\n );\n}\n\ninterface VoiceMicButtonProps {\n fieldId: string;\n onTranscriptReady: (transcript: string) => void;\n}\n\nexport function VoiceMicButton({ fieldId, onTranscriptReady }: VoiceMicButtonProps) {\n const store = useFormStore();\n const { activeFieldId, setActiveFieldId } = useVoiceContext();\n const [status, setStatus] = useState<RecordingStatus>('idle');\n\n const voice = store.getVoice();\n\n const isActive = activeFieldId === fieldId;\n const isRecording = status === 'recording' && isActive;\n const isTranscribing = status === 'transcribing' && isActive;\n const isBlocked = activeFieldId !== null && !isActive;\n\n const handleClick = useCallback(async () => {\n if (!voice || isBlocked || isTranscribing) return;\n\n if (isRecording) {\n setStatus('transcribing');\n try {\n const transcript = await voice.stopRecording();\n if (transcript) onTranscriptReady(transcript);\n } catch {\n // silently reset on error\n } finally {\n setStatus('idle');\n setActiveFieldId(null);\n }\n } else {\n setActiveFieldId(fieldId);\n setStatus('recording');\n try {\n await voice.startRecording(fieldId);\n } catch {\n setStatus('idle');\n setActiveFieldId(null);\n }\n }\n }, [voice, isBlocked, isTranscribing, isRecording, fieldId, onTranscriptReady, setActiveFieldId]);\n\n const title = isTranscribing\n ? 'Processing…'\n : isRecording\n ? 'Stop recording'\n : 'Dictate this field';\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={isBlocked || isTranscribing}\n title={title}\n className={[\n 'flex items-center gap-1 rounded px-1 py-0.5',\n 'text-[11px] font-medium transition-opacity',\n isBlocked ? 'pointer-events-none opacity-30' : '',\n isTranscribing ? 'cursor-wait opacity-50' : '',\n !isBlocked && !isTranscribing ? 'hover:opacity-70' : '',\n ]\n .filter(Boolean)\n .join(' ')}\n >\n {isTranscribing ? (\n <Loader2 className=\"h-3.5 w-3.5 animate-spin text-slate-400\" />\n ) : isRecording ? (\n <>\n <span className=\"text-rose-400\">\n <RecordingWave />\n </span>\n <span className=\"text-rose-400\">Stop</span>\n </>\n ) : (\n <Mic className=\"h-4 w-4 text-slate-400\" />\n )}\n </button>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { isLabelVisible, FieldRequiredIndicator, fieldLabelClass, fieldWrapperClass } from './chunk-WYVXXEZI.mjs';
2
- import { useField } from './chunk-2BGJZ44Q.mjs';
2
+ import { useField } from './chunk-HKEUAERY.mjs';
3
3
  import { Label } from './chunk-HEFZA2AH.mjs';
4
4
  import { cn } from './chunk-VPU66PI6.mjs';
5
5
  import { useMemo } from 'react';
@@ -211,5 +211,5 @@ function BpeChartReadOnly({
211
211
  }
212
212
 
213
213
  export { BPE_SCORES, BpeChartReadOnly, BpeChartWidget, SEXTANTS };
214
- //# sourceMappingURL=chunk-MQHZ7HD2.mjs.map
215
- //# sourceMappingURL=chunk-MQHZ7HD2.mjs.map
214
+ //# sourceMappingURL=chunk-QQXBHDUF.mjs.map
215
+ //# sourceMappingURL=chunk-QQXBHDUF.mjs.map