@mieweb/ui 0.11.0-dev.30 → 0.11.0-dev.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CsvBlock-AV4VM7JT.cjs +18 -0
- package/dist/{CsvBlock-RGO7JXHJ.cjs.map → CsvBlock-AV4VM7JT.cjs.map} +1 -1
- package/dist/CsvBlock-XBNYCEMP.js +9 -0
- package/dist/{CsvBlock-CFXSDPBI.js.map → CsvBlock-XBNYCEMP.js.map} +1 -1
- package/dist/HtmlPreviewBlock-DQAVD6IO.cjs +18 -0
- package/dist/{HtmlPreviewBlock-VBYXCXVT.cjs.map → HtmlPreviewBlock-DQAVD6IO.cjs.map} +1 -1
- package/dist/HtmlPreviewBlock-QQHRNLIY.js +9 -0
- package/dist/{HtmlPreviewBlock-Z2GCK325.js.map → HtmlPreviewBlock-QQHRNLIY.js.map} +1 -1
- package/dist/MermaidBlock-LHGYKC23.cjs +18 -0
- package/dist/{MermaidBlock-I2R2BQOX.cjs.map → MermaidBlock-LHGYKC23.cjs.map} +1 -1
- package/dist/MermaidBlock-QPKMIP3B.js +9 -0
- package/dist/{MermaidBlock-XCAK7IA5.js.map → MermaidBlock-QPKMIP3B.js.map} +1 -1
- package/dist/SurveyBlock-6DPTWHKI.js +9 -0
- package/dist/{SurveyBlock-KI5JOWCL.js.map → SurveyBlock-6DPTWHKI.js.map} +1 -1
- package/dist/SurveyBlock-6IXNVHS5.cjs +18 -0
- package/dist/{SurveyBlock-UKSGISRT.cjs.map → SurveyBlock-6IXNVHS5.cjs.map} +1 -1
- package/dist/{chunk-7XKM6V2K.cjs → chunk-2OXNJJHJ.cjs} +8 -8
- package/dist/{chunk-7XKM6V2K.cjs.map → chunk-2OXNJJHJ.cjs.map} +1 -1
- package/dist/{chunk-AJPFQF3H.cjs → chunk-2R3ILG4Y.cjs} +11 -11
- package/dist/{chunk-AJPFQF3H.cjs.map → chunk-2R3ILG4Y.cjs.map} +1 -1
- package/dist/{chunk-XQHDQ64G.cjs → chunk-2Z2GFDRS.cjs} +4 -4
- package/dist/{chunk-XQHDQ64G.cjs.map → chunk-2Z2GFDRS.cjs.map} +1 -1
- package/dist/{chunk-GM32IDVL.cjs → chunk-32ZILZ2T.cjs} +6 -6
- package/dist/{chunk-GM32IDVL.cjs.map → chunk-32ZILZ2T.cjs.map} +1 -1
- package/dist/{chunk-VOEXGDL5.js → chunk-33Y3KQWL.js} +3 -3
- package/dist/{chunk-VOEXGDL5.js.map → chunk-33Y3KQWL.js.map} +1 -1
- package/dist/{chunk-GYXSF6BJ.cjs → chunk-3IKIRGHI.cjs} +6 -6
- package/dist/{chunk-GYXSF6BJ.cjs.map → chunk-3IKIRGHI.cjs.map} +1 -1
- package/dist/{chunk-5HKZR6UG.js → chunk-43L4KGLU.js} +4 -4
- package/dist/{chunk-5HKZR6UG.js.map → chunk-43L4KGLU.js.map} +1 -1
- package/dist/{chunk-6BNZLN4B.cjs → chunk-4I5V6SXP.cjs} +10 -10
- package/dist/{chunk-6BNZLN4B.cjs.map → chunk-4I5V6SXP.cjs.map} +1 -1
- package/dist/{chunk-NUFUV43P.cjs → chunk-4UDEMJE4.cjs} +2 -2
- package/dist/chunk-4UDEMJE4.cjs.map +1 -0
- package/dist/{chunk-L5Y52F2E.cjs → chunk-4VSK3EE5.cjs} +4 -4
- package/dist/{chunk-L5Y52F2E.cjs.map → chunk-4VSK3EE5.cjs.map} +1 -1
- package/dist/{chunk-Y7ZJZLJY.js → chunk-566FIEPE.js} +4 -4
- package/dist/{chunk-Y7ZJZLJY.js.map → chunk-566FIEPE.js.map} +1 -1
- package/dist/{chunk-UTIPENPW.cjs → chunk-67SD6VPF.cjs} +5 -5
- package/dist/{chunk-UTIPENPW.cjs.map → chunk-67SD6VPF.cjs.map} +1 -1
- package/dist/{chunk-6CGM5H4J.js → chunk-6LIC3DKE.js} +2 -2
- package/dist/chunk-6LIC3DKE.js.map +1 -0
- package/dist/{chunk-6N7NMOSV.js → chunk-76ECYE5G.js} +3 -3
- package/dist/{chunk-6N7NMOSV.js.map → chunk-76ECYE5G.js.map} +1 -1
- package/dist/{chunk-56VTM4OX.js → chunk-7LKTIZLR.js} +3 -3
- package/dist/{chunk-56VTM4OX.js.map → chunk-7LKTIZLR.js.map} +1 -1
- package/dist/{chunk-7C5W744U.cjs → chunk-ARRJRFPD.cjs} +8 -8
- package/dist/{chunk-7C5W744U.cjs.map → chunk-ARRJRFPD.cjs.map} +1 -1
- package/dist/{chunk-5KGYTNOA.cjs → chunk-BP4LXRC6.cjs} +9 -9
- package/dist/{chunk-5KGYTNOA.cjs.map → chunk-BP4LXRC6.cjs.map} +1 -1
- package/dist/{chunk-UNFDIBKJ.js → chunk-CLNTWFEB.js} +3 -3
- package/dist/{chunk-UNFDIBKJ.js.map → chunk-CLNTWFEB.js.map} +1 -1
- package/dist/{chunk-X5JOEZVR.js → chunk-CRSJRWN2.js} +4 -4
- package/dist/{chunk-X5JOEZVR.js.map → chunk-CRSJRWN2.js.map} +1 -1
- package/dist/{chunk-FIKO4WR6.js → chunk-CVMD2A3J.js} +3 -3
- package/dist/{chunk-FIKO4WR6.js.map → chunk-CVMD2A3J.js.map} +1 -1
- package/dist/{chunk-SMPLM6K3.js → chunk-DG3CXR24.js} +5 -5
- package/dist/{chunk-SMPLM6K3.js.map → chunk-DG3CXR24.js.map} +1 -1
- package/dist/{chunk-LRAAJRE7.cjs → chunk-DO7EED3B.cjs} +154 -154
- package/dist/{chunk-LRAAJRE7.cjs.map → chunk-DO7EED3B.cjs.map} +1 -1
- package/dist/{chunk-UJDWFDKE.js → chunk-DXKE4YZT.js} +3 -3
- package/dist/{chunk-UJDWFDKE.js.map → chunk-DXKE4YZT.js.map} +1 -1
- package/dist/{chunk-KQ6GLYFZ.cjs → chunk-ECKIFQSD.cjs} +6 -6
- package/dist/{chunk-KQ6GLYFZ.cjs.map → chunk-ECKIFQSD.cjs.map} +1 -1
- package/dist/{chunk-4P27Y52M.js → chunk-EPKPHWIL.js} +4 -4
- package/dist/{chunk-4P27Y52M.js.map → chunk-EPKPHWIL.js.map} +1 -1
- package/dist/{chunk-RIUQP2QS.cjs → chunk-FNSFMM4F.cjs} +5 -5
- package/dist/{chunk-RIUQP2QS.cjs.map → chunk-FNSFMM4F.cjs.map} +1 -1
- package/dist/{chunk-3Y3ZCDNF.cjs → chunk-FQUSSPXX.cjs} +19 -19
- package/dist/{chunk-3Y3ZCDNF.cjs.map → chunk-FQUSSPXX.cjs.map} +1 -1
- package/dist/{chunk-ANMX7YDL.cjs → chunk-FSARTLUE.cjs} +4 -4
- package/dist/{chunk-ANMX7YDL.cjs.map → chunk-FSARTLUE.cjs.map} +1 -1
- package/dist/{chunk-ERACGSDY.cjs → chunk-G42V64UW.cjs} +8 -8
- package/dist/{chunk-ERACGSDY.cjs.map → chunk-G42V64UW.cjs.map} +1 -1
- package/dist/{chunk-UUI7WXI5.js → chunk-GAI6SRJ3.js} +3 -3
- package/dist/{chunk-UUI7WXI5.js.map → chunk-GAI6SRJ3.js.map} +1 -1
- package/dist/{chunk-4I6BW3FB.js → chunk-GLRKXJCR.js} +3 -3
- package/dist/{chunk-4I6BW3FB.js.map → chunk-GLRKXJCR.js.map} +1 -1
- package/dist/{chunk-NPKPCYAT.cjs → chunk-GM376OD6.cjs} +17 -17
- package/dist/{chunk-NPKPCYAT.cjs.map → chunk-GM376OD6.cjs.map} +1 -1
- package/dist/{chunk-DXEPYK3I.cjs → chunk-HGJHWI7W.cjs} +5 -3
- package/dist/chunk-HGJHWI7W.cjs.map +1 -0
- package/dist/{chunk-6ZA574PU.cjs → chunk-IIV5GNSK.cjs} +5 -5
- package/dist/{chunk-6ZA574PU.cjs.map → chunk-IIV5GNSK.cjs.map} +1 -1
- package/dist/{chunk-XPVQI3MM.cjs → chunk-INMDLVUB.cjs} +17 -2
- package/dist/chunk-INMDLVUB.cjs.map +1 -0
- package/dist/{chunk-RZSSQ7AT.js → chunk-JATLYCS4.js} +3 -3
- package/dist/{chunk-RZSSQ7AT.js.map → chunk-JATLYCS4.js.map} +1 -1
- package/dist/{chunk-4NB4WOGU.cjs → chunk-JCO62XMU.cjs} +6 -6
- package/dist/{chunk-4NB4WOGU.cjs.map → chunk-JCO62XMU.cjs.map} +1 -1
- package/dist/{chunk-QR7B6UPR.js → chunk-JN2CL7MK.js} +3 -3
- package/dist/{chunk-QR7B6UPR.js.map → chunk-JN2CL7MK.js.map} +1 -1
- package/dist/{chunk-FBCDYTWM.js → chunk-JNSSA4YN.js} +3 -3
- package/dist/{chunk-FBCDYTWM.js.map → chunk-JNSSA4YN.js.map} +1 -1
- package/dist/{chunk-BIQIE3VW.js → chunk-JQAGNAY2.js} +5 -5
- package/dist/{chunk-BIQIE3VW.js.map → chunk-JQAGNAY2.js.map} +1 -1
- package/dist/{chunk-TOJ56HKQ.cjs → chunk-KD7YD6US.cjs} +8 -8
- package/dist/{chunk-TOJ56HKQ.cjs.map → chunk-KD7YD6US.cjs.map} +1 -1
- package/dist/{chunk-5LNLB2XT.js → chunk-KSQQBFDQ.js} +3 -3
- package/dist/{chunk-5LNLB2XT.js.map → chunk-KSQQBFDQ.js.map} +1 -1
- package/dist/{chunk-3NOVISM6.js → chunk-L52HKEUD.js} +3 -3
- package/dist/{chunk-3NOVISM6.js.map → chunk-L52HKEUD.js.map} +1 -1
- package/dist/{chunk-IXUIOR4K.cjs → chunk-M42FTWY2.cjs} +6 -6
- package/dist/{chunk-IXUIOR4K.cjs.map → chunk-M42FTWY2.cjs.map} +1 -1
- package/dist/{chunk-32ZCJOSR.cjs → chunk-N7AIZWQS.cjs} +4 -4
- package/dist/{chunk-32ZCJOSR.cjs.map → chunk-N7AIZWQS.cjs.map} +1 -1
- package/dist/{chunk-P7D7BYFE.js → chunk-NA3NRLX2.js} +4 -4
- package/dist/{chunk-P7D7BYFE.js.map → chunk-NA3NRLX2.js.map} +1 -1
- package/dist/{chunk-Y424YL55.js → chunk-OLA7OYAS.js} +3 -3
- package/dist/{chunk-Y424YL55.js.map → chunk-OLA7OYAS.js.map} +1 -1
- package/dist/{chunk-F6W62K4J.js → chunk-OWYWRBED.js} +3 -3
- package/dist/{chunk-F6W62K4J.js.map → chunk-OWYWRBED.js.map} +1 -1
- package/dist/{chunk-RSJGTWLM.js → chunk-OYLZ5PF2.js} +3 -3
- package/dist/{chunk-RSJGTWLM.js.map → chunk-OYLZ5PF2.js.map} +1 -1
- package/dist/{chunk-7XC6E4BT.cjs → chunk-PJN4HM2X.cjs} +37 -37
- package/dist/{chunk-7XC6E4BT.cjs.map → chunk-PJN4HM2X.cjs.map} +1 -1
- package/dist/{chunk-NIO3XVUV.js → chunk-PLBWZW4F.js} +4 -4
- package/dist/{chunk-NIO3XVUV.js.map → chunk-PLBWZW4F.js.map} +1 -1
- package/dist/{chunk-XI74P5F2.cjs → chunk-PW2E7YBD.cjs} +5 -5
- package/dist/{chunk-XI74P5F2.cjs.map → chunk-PW2E7YBD.cjs.map} +1 -1
- package/dist/{chunk-HDY7YQFX.js → chunk-Q5APDRMO.js} +3 -3
- package/dist/{chunk-HDY7YQFX.js.map → chunk-Q5APDRMO.js.map} +1 -1
- package/dist/{chunk-FGLIP6YR.js → chunk-QATEO4KC.js} +4 -4
- package/dist/{chunk-FGLIP6YR.js.map → chunk-QATEO4KC.js.map} +1 -1
- package/dist/{chunk-254QK722.cjs → chunk-QHCAWDMG.cjs} +18 -7
- package/dist/chunk-QHCAWDMG.cjs.map +1 -0
- package/dist/{chunk-7HFZL5V5.js → chunk-QNJEDBIN.js} +4 -4
- package/dist/{chunk-7HFZL5V5.js.map → chunk-QNJEDBIN.js.map} +1 -1
- package/dist/{chunk-AIJYZP7M.js → chunk-R3MJKY63.js} +6 -6
- package/dist/{chunk-AIJYZP7M.js.map → chunk-R3MJKY63.js.map} +1 -1
- package/dist/{chunk-N54FYWG6.js → chunk-R5P7NAJQ.js} +4 -4
- package/dist/{chunk-N54FYWG6.js.map → chunk-R5P7NAJQ.js.map} +1 -1
- package/dist/{chunk-BWSZ2BHJ.cjs → chunk-S6457ZNC.cjs} +5 -5
- package/dist/{chunk-BWSZ2BHJ.cjs.map → chunk-S6457ZNC.cjs.map} +1 -1
- package/dist/{chunk-Z2OOJGHL.cjs → chunk-SCYLVQWA.cjs} +53 -53
- package/dist/{chunk-Z2OOJGHL.cjs.map → chunk-SCYLVQWA.cjs.map} +1 -1
- package/dist/{chunk-7IRTD4JT.cjs → chunk-SGDNEIJM.cjs} +4 -4
- package/dist/{chunk-7IRTD4JT.cjs.map → chunk-SGDNEIJM.cjs.map} +1 -1
- package/dist/{chunk-4JXO5JTE.js → chunk-SNAMNKFH.js} +17 -2
- package/dist/chunk-SNAMNKFH.js.map +1 -0
- package/dist/{chunk-GW4RFJZ5.js → chunk-TUYWCUKH.js} +18 -7
- package/dist/chunk-TUYWCUKH.js.map +1 -0
- package/dist/{chunk-CLQW724U.cjs → chunk-TXB3UHIO.cjs} +9 -9
- package/dist/{chunk-CLQW724U.cjs.map → chunk-TXB3UHIO.cjs.map} +1 -1
- package/dist/{chunk-4RI3CQGE.js → chunk-ULEX7OOJ.js} +4 -4
- package/dist/{chunk-4RI3CQGE.js.map → chunk-ULEX7OOJ.js.map} +1 -1
- package/dist/{chunk-KDW6BD4O.cjs → chunk-UVVZD3AS.cjs} +4 -4
- package/dist/{chunk-KDW6BD4O.cjs.map → chunk-UVVZD3AS.cjs.map} +1 -1
- package/dist/{chunk-MA3Y6AYA.cjs → chunk-V2KSJLUL.cjs} +8 -8
- package/dist/{chunk-MA3Y6AYA.cjs.map → chunk-V2KSJLUL.cjs.map} +1 -1
- package/dist/{chunk-SW2E7XKY.cjs → chunk-VIVS44IG.cjs} +9 -9
- package/dist/{chunk-SW2E7XKY.cjs.map → chunk-VIVS44IG.cjs.map} +1 -1
- package/dist/{chunk-GVM6DTR5.js → chunk-VP3XNLUL.js} +5 -3
- package/dist/chunk-VP3XNLUL.js.map +1 -0
- package/dist/{chunk-IGDO62KR.cjs → chunk-VVKUYQER.cjs} +5 -5
- package/dist/{chunk-IGDO62KR.cjs.map → chunk-VVKUYQER.cjs.map} +1 -1
- package/dist/{chunk-BJ6ABRSQ.cjs → chunk-WG2ANSDG.cjs} +6 -6
- package/dist/{chunk-BJ6ABRSQ.cjs.map → chunk-WG2ANSDG.cjs.map} +1 -1
- package/dist/{chunk-WFBUBT54.js → chunk-WX2XB6FP.js} +3 -3
- package/dist/{chunk-WFBUBT54.js.map → chunk-WX2XB6FP.js.map} +1 -1
- package/dist/{chunk-7QW6TU4X.js → chunk-YCPWQWQQ.js} +3 -3
- package/dist/{chunk-7QW6TU4X.js.map → chunk-YCPWQWQQ.js.map} +1 -1
- package/dist/{chunk-DSQCYX7L.js → chunk-YSIFPHLX.js} +7 -7
- package/dist/{chunk-DSQCYX7L.js.map → chunk-YSIFPHLX.js.map} +1 -1
- package/dist/{chunk-2X54ZLT6.js → chunk-ZFJJMDV3.js} +4 -4
- package/dist/{chunk-2X54ZLT6.js.map → chunk-ZFJJMDV3.js.map} +1 -1
- package/dist/{chunk-PYI2IWNX.cjs → chunk-ZOSM6D7F.cjs} +4 -4
- package/dist/{chunk-PYI2IWNX.cjs.map → chunk-ZOSM6D7F.cjs.map} +1 -1
- package/dist/components/ActionPlan/index.cjs +6 -6
- package/dist/components/ActionPlan/index.js +4 -4
- package/dist/components/ActivityFeed/index.cjs +6 -6
- package/dist/components/ActivityFeed/index.js +4 -4
- package/dist/components/AlertDialog/index.cjs +7 -7
- package/dist/components/AlertDialog/index.js +3 -3
- package/dist/components/AssociationList/index.cjs +6 -6
- package/dist/components/AssociationList/index.js +4 -4
- package/dist/components/Button/index.cjs +4 -4
- package/dist/components/Button/index.d.cts +1 -1
- package/dist/components/Button/index.d.ts +1 -1
- package/dist/components/Button/index.js +2 -2
- package/dist/components/CalendarView/index.cjs +5 -5
- package/dist/components/CalendarView/index.js +3 -3
- package/dist/components/CustomizableDashboard/index.cjs +10 -10
- package/dist/components/CustomizableDashboard/index.js +3 -3
- package/dist/components/EmailEditor/index.cjs +14 -14
- package/dist/components/EmailEditor/index.js +5 -5
- package/dist/components/FieldHistory/index.cjs +6 -6
- package/dist/components/FieldHistory/index.js +4 -4
- package/dist/components/FloatingWindow/index.cjs +5 -5
- package/dist/components/FloatingWindow/index.js +3 -3
- package/dist/components/ListView/index.cjs +5 -5
- package/dist/components/ListView/index.js +3 -3
- package/dist/components/Markdown/index.cjs +17 -17
- package/dist/components/Markdown/index.js +8 -8
- package/dist/components/MediaEditor/index.cjs +12 -12
- package/dist/components/MediaEditor/index.d.cts +13 -0
- package/dist/components/MediaEditor/index.d.ts +13 -0
- package/dist/components/MediaEditor/index.js +7 -7
- package/dist/components/MediaFeed/index.cjs +6 -6
- package/dist/components/MediaFeed/index.js +5 -5
- package/dist/components/MediaPlayer/index.cjs +7 -7
- package/dist/components/MediaPlayer/index.js +4 -4
- package/dist/components/MegaMenu/index.cjs +6 -6
- package/dist/components/MegaMenu/index.js +3 -3
- package/dist/components/RadialExplorer/index.cjs +4 -4
- package/dist/components/RadialExplorer/index.js +3 -3
- package/dist/components/RecordHeader/index.cjs +5 -5
- package/dist/components/RecordHeader/index.d.cts +1 -1
- package/dist/components/RecordHeader/index.d.ts +1 -1
- package/dist/components/RecordHeader/index.js +3 -3
- package/dist/components/RichTextEditor/index.cjs +6 -6
- package/dist/components/RichTextEditor/index.js +3 -3
- package/dist/components/SectionSpyNav/index.cjs +4 -4
- package/dist/components/SectionSpyNav/index.js +3 -3
- package/dist/components/SuperChat/index.cjs +9 -9
- package/dist/components/SuperChat/index.js +5 -5
- package/dist/components/Textarea/index.cjs +7 -7
- package/dist/components/Textarea/index.js +4 -4
- package/dist/components/TranscriptView/index.cjs +2 -2
- package/dist/components/TranscriptView/index.d.cts +14 -1
- package/dist/components/TranscriptView/index.d.ts +14 -1
- package/dist/components/TranscriptView/index.js +1 -1
- package/dist/components/ViewSet/index.cjs +6 -6
- package/dist/components/ViewSet/index.js +5 -5
- package/dist/datavis.cjs +3 -3
- package/dist/datavis.js +2 -2
- package/dist/deck.cjs +15 -15
- package/dist/deck.js +2 -2
- package/dist/esheet.cjs +130 -130
- package/dist/esheet.js +8 -8
- package/dist/hooks/index.cjs +12 -12
- package/dist/hooks/index.d.cts +15 -2
- package/dist/hooks/index.d.ts +15 -2
- package/dist/hooks/index.js +3 -3
- package/dist/index.cjs +2056 -418
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +178 -87
- package/dist/index.d.ts +178 -87
- package/dist/index.js +1693 -55
- package/dist/index.js.map +1 -1
- package/dist/{model-Y7WRIGGA.cjs → model-NPW2JMHZ.cjs} +20 -20
- package/dist/{model-Y7WRIGGA.cjs.map → model-NPW2JMHZ.cjs.map} +1 -1
- package/dist/{model-WFFZRQMY.js → model-SG5H3TCJ.js} +6 -6
- package/dist/{model-WFFZRQMY.js.map → model-SG5H3TCJ.js.map} +1 -1
- package/dist/org-chart.cjs +4 -4
- package/dist/org-chart.js +2 -2
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/templates.cjs +38 -38
- package/dist/templates.js +3 -3
- package/package.json +1 -1
- package/dist/CsvBlock-CFXSDPBI.js +0 -9
- package/dist/CsvBlock-RGO7JXHJ.cjs +0 -18
- package/dist/HtmlPreviewBlock-VBYXCXVT.cjs +0 -18
- package/dist/HtmlPreviewBlock-Z2GCK325.js +0 -9
- package/dist/MermaidBlock-I2R2BQOX.cjs +0 -18
- package/dist/MermaidBlock-XCAK7IA5.js +0 -9
- package/dist/SurveyBlock-KI5JOWCL.js +0 -9
- package/dist/SurveyBlock-UKSGISRT.cjs +0 -18
- package/dist/chunk-254QK722.cjs.map +0 -1
- package/dist/chunk-4JXO5JTE.js.map +0 -1
- package/dist/chunk-6CGM5H4J.js.map +0 -1
- package/dist/chunk-DXEPYK3I.cjs.map +0 -1
- package/dist/chunk-GVM6DTR5.js.map +0 -1
- package/dist/chunk-GW4RFJZ5.js.map +0 -1
- package/dist/chunk-NUFUV43P.cjs.map +0 -1
- package/dist/chunk-XPVQI3MM.cjs.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkFNSFMM4F_cjs = require('./chunk-FNSFMM4F.cjs');
|
|
4
4
|
var react = require('react');
|
|
5
5
|
var DOMPurify = require('dompurify');
|
|
6
6
|
var hljs = require('highlight.js/lib/core');
|
|
@@ -235,7 +235,7 @@ function useMarkdown() {
|
|
|
235
235
|
}
|
|
236
236
|
var CodeBlock = ({ code, language }) => {
|
|
237
237
|
const html = react.useMemo(() => highlightCode(code, language), [code, language]);
|
|
238
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
238
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkFNSFMM4F_cjs.FenceBlock, { code, language, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
239
239
|
"pre",
|
|
240
240
|
{
|
|
241
241
|
className: "m-0 overflow-x-auto !bg-transparent p-3 text-sm",
|
|
@@ -253,16 +253,16 @@ var CodeBlock = ({ code, language }) => {
|
|
|
253
253
|
) });
|
|
254
254
|
};
|
|
255
255
|
var CsvBlock = react.lazy(
|
|
256
|
-
() => import('./CsvBlock-
|
|
256
|
+
() => import('./CsvBlock-AV4VM7JT.cjs').then((m) => ({ default: m.CsvBlock }))
|
|
257
257
|
);
|
|
258
258
|
var HtmlPreviewBlock = react.lazy(
|
|
259
|
-
() => import('./HtmlPreviewBlock-
|
|
259
|
+
() => import('./HtmlPreviewBlock-DQAVD6IO.cjs').then((m) => ({ default: m.HtmlPreviewBlock }))
|
|
260
260
|
);
|
|
261
261
|
var MermaidBlock = react.lazy(
|
|
262
|
-
() => import('./MermaidBlock-
|
|
262
|
+
() => import('./MermaidBlock-LHGYKC23.cjs').then((m) => ({ default: m.MermaidBlock }))
|
|
263
263
|
);
|
|
264
264
|
var SurveyBlock = react.lazy(
|
|
265
|
-
() => import('./SurveyBlock-
|
|
265
|
+
() => import('./SurveyBlock-6IXNVHS5.cjs').then((m) => ({ default: m.SurveyBlock }))
|
|
266
266
|
);
|
|
267
267
|
var BlockFallback = () => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center p-4 text-sm text-neutral-500", children: "Loading\u2026" });
|
|
268
268
|
var BLOCK_RE = /<div data-block-type="([^"]+)" data-block-id="([^"]+)" data-code="([^"]*)"([^>]*\bdata-md-fence="1"[^>]*)><\/div>/g;
|
|
@@ -343,5 +343,5 @@ exports.CodeBlock = CodeBlock;
|
|
|
343
343
|
exports.MarkdownRenderer = MarkdownRenderer;
|
|
344
344
|
exports.highlightCode = highlightCode;
|
|
345
345
|
exports.useMarkdown = useMarkdown;
|
|
346
|
-
//# sourceMappingURL=chunk-
|
|
347
|
-
//# sourceMappingURL=chunk-
|
|
346
|
+
//# sourceMappingURL=chunk-KD7YD6US.cjs.map
|
|
347
|
+
//# sourceMappingURL=chunk-KD7YD6US.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/Markdown/useMarkdown.ts","../src/components/Markdown/CodeBlock.tsx","../src/components/Markdown/MarkdownRenderer.tsx"],"names":["hljs","javascript","typescript","python","json","xml","css","bash","sql","yaml","markdown","DOMPurify","marked","useRef","useCallback","useMemo","jsx","FenceBlock","lazy","Suspense","useState","useEffect"],"mappings":"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","file":"chunk-TOJ56HKQ.cjs","sourcesContent":["/** useMarkdown — converts markdown to sanitised HTML with hljs highlighting and special fence blocks. */\nimport DOMPurify from 'dompurify';\nimport hljs from 'highlight.js/lib/core';\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\nimport bash from 'highlight.js/lib/languages/bash';\nimport css from 'highlight.js/lib/languages/css';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport python from 'highlight.js/lib/languages/python';\nimport sql from 'highlight.js/lib/languages/sql';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport xml from 'highlight.js/lib/languages/xml';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport { marked, type MarkedOptions, type Tokens } from 'marked';\nimport { useCallback, useMemo, useRef } from 'react';\n\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('python', python);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('html', xml);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('shell', bash);\nhljs.registerLanguage('sql', sql);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('yml', yaml);\nhljs.registerLanguage('markdown', markdown);\nhljs.registerLanguage('md', markdown);\n\nconst lazyLanguages: Record<string, () => Promise<unknown>> = {\n java: () => import('highlight.js/lib/languages/java'),\n cpp: () => import('highlight.js/lib/languages/cpp'),\n 'c++': () => import('highlight.js/lib/languages/cpp'),\n c: () => import('highlight.js/lib/languages/c'),\n csharp: () => import('highlight.js/lib/languages/csharp'),\n php: () => import('highlight.js/lib/languages/php'),\n ruby: () => import('highlight.js/lib/languages/ruby'),\n go: () => import('highlight.js/lib/languages/go'),\n rust: () => import('highlight.js/lib/languages/rust'),\n perl: () => import('highlight.js/lib/languages/perl'),\n r: () => import('highlight.js/lib/languages/r'),\n makefile: () => import('highlight.js/lib/languages/makefile'),\n dockerfile: () => import('highlight.js/lib/languages/dockerfile'),\n};\n\nconst loadedLanguages = new Set<string>([\n 'javascript',\n 'typescript',\n 'python',\n 'json',\n 'xml',\n 'html',\n 'css',\n 'bash',\n 'shell',\n 'sql',\n 'yaml',\n 'yml',\n 'markdown',\n 'md',\n]);\n\nasync function ensureLanguage(lang: string): Promise<boolean> {\n const key = lang.toLowerCase();\n if (loadedLanguages.has(key)) return true;\n const loader = lazyLanguages[key];\n if (!loader) return false;\n try {\n const mod = (await loader()) as { default: unknown };\n hljs.registerLanguage(\n key,\n mod.default as Parameters<typeof hljs.registerLanguage>[1]\n );\n loadedLanguages.add(key);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function highlightCode(code: string, lang?: string): string {\n if (lang && loadedLanguages.has(lang.toLowerCase())) {\n try {\n return hljs.highlight(code, { language: lang.toLowerCase() }).value;\n } catch {\n /* fall through */\n }\n }\n try {\n const result = hljs.highlightAuto(code);\n if (result.relevance > 5) return result.value;\n } catch {\n /* fall through */\n }\n return escapeHtml(code);\n}\n\nfunction sanitise(html: string): string {\n return DOMPurify.sanitize(html, {\n ADD_ATTR: [\n 'target',\n 'rel',\n 'data-block-type',\n 'data-block-id',\n 'data-code',\n 'data-lang',\n 'data-md-fence',\n ],\n }) as string;\n}\n\n// Use globalThis to prevent duplicate DOMPurify hook registration across HMR reloads.\nconst _g = globalThis as unknown as Record<string, boolean>;\n// Guard against SSR: DOMPurify hooks operate on the DOM, so only register in the browser.\nif (typeof document !== 'undefined' && !_g.__markdownAnchorHookInstalled) {\n _g.__markdownAnchorHookInstalled = true;\n DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => {\n const isAnchor =\n (typeof HTMLAnchorElement !== 'undefined' &&\n node instanceof HTMLAnchorElement) ||\n node.nodeName === 'A';\n if (isAnchor) {\n node.setAttribute('target', '_blank');\n node.setAttribute('rel', 'noopener noreferrer');\n }\n });\n}\n\nlet blockCounter = 0;\n\nfunction createRenderer() {\n const renderer = new marked.Renderer();\n\n renderer.code = function (this: unknown, token: Tokens.Code) {\n const { text: code, lang = '' } = token;\n const normalised = lang.toLowerCase().trim();\n const blockId = `block-${++blockCounter}`;\n const encodedCode = encodeURIComponent(code);\n const sentinel = 'data-md-fence=\"1\"';\n\n switch (normalised) {\n case 'mermaid':\n return `<div data-block-type=\"mermaid\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n case 'csv':\n return `<div data-block-type=\"csv\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n case 'survey':\n return `<div data-block-type=\"survey\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n case 'html':\n return `<div data-block-type=\"html-preview\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n default:\n return `<div data-block-type=\"code\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" data-lang=\"${escapeHtml(normalised)}\" ${sentinel}></div>`;\n }\n };\n\n renderer.link = function (this: unknown, token: Tokens.Link) {\n const { href, title, tokens } = token;\n const text =\n this && typeof (this as Record<string, unknown>).parser === 'object'\n ? (\n this as {\n parser: { parseInline: (t: Tokens.Link['tokens']) => string };\n }\n ).parser.parseInline(tokens)\n : token.text;\n const titleAttr = title ? ` title=\"${escapeHtml(title)}\"` : '';\n return `<a href=\"${escapeHtml(href)}\" target=\"_blank\" rel=\"noopener noreferrer\"${titleAttr}>${text}</a>`;\n };\n\n renderer.table = function (this: unknown, token: Tokens.Table) {\n const headerCells = token.header\n .map((cell) => {\n const content =\n this && typeof (this as Record<string, unknown>).parser === 'object'\n ? (\n this as {\n parser: {\n parseInline: (t: Tokens.TableCell['tokens']) => string;\n };\n }\n ).parser.parseInline(cell.tokens)\n : cell.text;\n return `<th>${content}</th>`;\n })\n .join('');\n\n const bodyRows = token.rows\n .map((row) => {\n const cells = row\n .map((cell) => {\n const content =\n this &&\n typeof (this as Record<string, unknown>).parser === 'object'\n ? (\n this as {\n parser: {\n parseInline: (t: Tokens.TableCell['tokens']) => string;\n };\n }\n ).parser.parseInline(cell.tokens)\n : cell.text;\n return `<td>${content}</td>`;\n })\n .join('');\n return `<tr>${cells}</tr>`;\n })\n .join('');\n\n return `<div class=\"overflow-x-auto\"><table class=\"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700\"><thead><tr>${headerCells}</tr></thead><tbody class=\"divide-y divide-neutral-200 dark:divide-neutral-700\">${bodyRows}</tbody></table></div>`;\n };\n\n return renderer;\n}\n\nfunction makeMarkedOptions(): MarkedOptions {\n return { gfm: true, breaks: true, renderer: createRenderer() };\n}\n\nconst CACHE_MAX = 100;\nconst renderCache = new Map<string, string>();\nfunction cacheSet(key: string, value: string) {\n if (renderCache.size >= CACHE_MAX) {\n renderCache.delete(renderCache.keys().next().value as string);\n }\n renderCache.set(key, value);\n}\n\nexport interface UseMarkdownResult {\n /** Render markdown text to sanitised HTML string */\n render: (text: string, cacheKey?: string) => string;\n /** Async-render that lazy-loads needed languages first */\n renderAsync: (text: string, cacheKey?: string) => Promise<string>;\n /** Clear the render cache */\n clearCache: () => void;\n}\n\nexport function useMarkdown(): UseMarkdownResult {\n const cacheRef = useRef(renderCache);\n\n const render = useCallback((text: string, cacheKey?: string): string => {\n if (!text) return '';\n const key = cacheKey ?? text;\n const cached = cacheRef.current.get(key);\n if (cached) return cached;\n\n const raw = marked.parse(text, {\n ...makeMarkedOptions(),\n async: false,\n }) as string;\n const clean = sanitise(raw);\n cacheSet(key, clean);\n return clean;\n }, []);\n\n const renderAsync = useCallback(\n async (text: string, cacheKey?: string): Promise<string> => {\n if (!text) return '';\n const key = cacheKey ?? text;\n const cached = cacheRef.current.get(key);\n if (cached) return cached;\n\n // Allow `+`, `-`, `.` in language identifiers (c++, objective-c, bash-session, etc.)\n const fenceRegex = /^```([\\w+\\-.]+)\\s*$/gm;\n let match: RegExpExecArray | null;\n const langs: string[] = [];\n while ((match = fenceRegex.exec(text)) !== null) {\n langs.push(match[1]);\n }\n await Promise.all(langs.map((l) => ensureLanguage(l)));\n\n const raw = await marked.parse(text, makeMarkedOptions());\n const clean = sanitise(raw);\n cacheSet(key, clean);\n return clean;\n },\n []\n );\n\n const clearCache = useCallback(() => {\n cacheRef.current.clear();\n }, []);\n\n return useMemo(\n () => ({ render, renderAsync, clearCache }),\n [render, renderAsync, clearCache]\n );\n}\n","/**\n * CodeBlock — Renders a syntax-highlighted code fence using FenceBlock.\n *\n * Used by `MarkdownRenderer` for plain (non-special) fenced code blocks.\n * Highlighting is performed synchronously via the `highlightCode` helper from\n * `useMarkdown`; if the language was not pre-registered with highlight.js the\n * helper falls back to escaped raw text.\n */\nimport React, { useMemo } from 'react';\n\nimport { FenceBlock } from './FenceBlock';\nimport { highlightCode } from './useMarkdown';\n\ninterface CodeBlockProps {\n code: string;\n language?: string;\n}\n\nexport const CodeBlock: React.FC<CodeBlockProps> = ({ code, language }) => {\n const html = useMemo(() => highlightCode(code, language), [code, language]);\n\n return (\n <FenceBlock code={code} language={language}>\n {/* Focusable so keyboard users can horizontally scroll long lines\n (axe: scrollable-region-focusable). */}\n <pre\n className=\"m-0 overflow-x-auto !bg-transparent p-3 text-sm\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable code needs keyboard focus\n tabIndex={0}\n role=\"region\"\n aria-label={language ? `${language} code` : 'Code'}\n >\n <code\n className=\"hljs bg-transparent p-0\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </pre>\n </FenceBlock>\n );\n};\n","/**\n * MarkdownRenderer — renders markdown with React components for special fence blocks.\n */\nimport React, { Suspense, lazy, useEffect, useState } from 'react';\n\nimport './styles.css';\nimport { CodeBlock } from './CodeBlock';\nimport { useMarkdown } from './useMarkdown';\n\n// Block components are lazy-loaded so optional peer deps (papaparse, js-yaml, mermaid)\n// aren't bundled unless actually rendered.\nconst CsvBlock = lazy(() =>\n import('./CsvBlock').then((m) => ({ default: m.CsvBlock }))\n);\nconst HtmlPreviewBlock = lazy(() =>\n import('./HtmlPreviewBlock').then((m) => ({ default: m.HtmlPreviewBlock }))\n);\nconst MermaidBlock = lazy(() =>\n import('./MermaidBlock').then((m) => ({ default: m.MermaidBlock }))\n);\nconst SurveyBlock = lazy(() =>\n import('./SurveyBlock').then((m) => ({ default: m.SurveyBlock }))\n);\n\nconst BlockFallback: React.FC = () => (\n <div className=\"flex items-center justify-center p-4 text-sm text-neutral-500\">\n Loading…\n </div>\n);\n\nexport interface MarkdownRendererProps {\n /** Raw markdown text */\n text: string;\n /** Cache key (e.g., message._id + revisionNumber) */\n cacheKey?: string;\n /** Additional CSS classes */\n className?: string;\n /** Whether the message is still streaming (may have incomplete blocks) */\n streaming?: boolean;\n}\n\n// Matches fence block markers emitted by useMarkdown (sentinel data-md-fence prevents raw-HTML injection)\nconst BLOCK_RE =\n /<div data-block-type=\"([^\"]+)\" data-block-id=\"([^\"]+)\" data-code=\"([^\"]*)\"([^>]*\\bdata-md-fence=\"1\"[^>]*)><\\/div>/g;\n\ninterface HtmlSegment {\n html: string;\n}\ninterface BlockSegment {\n type: string;\n id: string;\n code: string;\n lang?: string;\n}\ntype Segment = HtmlSegment | BlockSegment;\n\nfunction splitHtml(html: string): Segment[] {\n const segments: Segment[] = [];\n let last = 0;\n for (const m of html.matchAll(BLOCK_RE)) {\n if (m.index > last) segments.push({ html: html.slice(last, m.index) });\n const langMatch = m[4]?.match(/data-lang=\"([^\"]*)\"/)?.[1];\n segments.push({\n type: m[1],\n id: m[2],\n code: (() => {\n try {\n return decodeURIComponent(m[3]);\n } catch {\n return m[3];\n }\n })(),\n lang: langMatch ?? undefined,\n });\n last = m.index + m[0].length;\n }\n if (last < html.length) segments.push({ html: html.slice(last) });\n return segments;\n}\n\nfunction renderBlock(seg: BlockSegment): React.ReactNode {\n const wrap = (node: React.ReactNode) => (\n <Suspense key={seg.id} fallback={<BlockFallback />}>\n {node}\n </Suspense>\n );\n switch (seg.type) {\n case 'mermaid':\n return wrap(<MermaidBlock code={seg.code} id={seg.id} />);\n case 'csv':\n return wrap(<CsvBlock code={seg.code} id={seg.id} />);\n case 'survey':\n return wrap(<SurveyBlock code={seg.code} id={seg.id} />);\n case 'html-preview':\n return wrap(<HtmlPreviewBlock code={seg.code} id={seg.id} />);\n case 'code':\n return wrap(\n <CodeBlock code={seg.code} language={seg.lang || undefined} />\n );\n default:\n return null;\n }\n}\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({\n text,\n cacheKey,\n className = '',\n streaming = false,\n}) => {\n const { render, renderAsync } = useMarkdown();\n const [html, setHtml] = useState('');\n\n useEffect(() => {\n let cancelled = false;\n\n // While streaming, append text length to the cache key so each delta\n // produces a fresh render rather than a stale hit on the messageId.\n const effectiveKey = streaming\n ? cacheKey\n ? `${cacheKey}::${text.length}`\n : undefined\n : cacheKey;\n\n async function doRender() {\n const rendered = await renderAsync(text, effectiveKey);\n if (!cancelled) setHtml(rendered);\n }\n\n if (streaming) {\n setHtml(render(text, effectiveKey));\n } else {\n void doRender();\n }\n\n return () => {\n cancelled = true;\n };\n }, [text, cacheKey, streaming, render, renderAsync]);\n\n const segments = splitHtml(html);\n const proseClass = `md-prose ${className}`.trim();\n\n return (\n <div className={proseClass}>\n {segments.map((seg, i) =>\n 'html' in seg ? (\n <div key={i} dangerouslySetInnerHTML={{ __html: seg.html }} />\n ) : (\n renderBlock(seg)\n )\n )}\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/Markdown/useMarkdown.ts","../src/components/Markdown/CodeBlock.tsx","../src/components/Markdown/MarkdownRenderer.tsx"],"names":["hljs","javascript","typescript","python","json","xml","css","bash","sql","yaml","markdown","DOMPurify","marked","useRef","useCallback","useMemo","jsx","FenceBlock","lazy","Suspense","useState","useEffect"],"mappings":"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","file":"chunk-KD7YD6US.cjs","sourcesContent":["/** useMarkdown — converts markdown to sanitised HTML with hljs highlighting and special fence blocks. */\nimport DOMPurify from 'dompurify';\nimport hljs from 'highlight.js/lib/core';\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\nimport bash from 'highlight.js/lib/languages/bash';\nimport css from 'highlight.js/lib/languages/css';\nimport javascript from 'highlight.js/lib/languages/javascript';\nimport json from 'highlight.js/lib/languages/json';\nimport markdown from 'highlight.js/lib/languages/markdown';\nimport python from 'highlight.js/lib/languages/python';\nimport sql from 'highlight.js/lib/languages/sql';\nimport typescript from 'highlight.js/lib/languages/typescript';\nimport xml from 'highlight.js/lib/languages/xml';\nimport yaml from 'highlight.js/lib/languages/yaml';\nimport { marked, type MarkedOptions, type Tokens } from 'marked';\nimport { useCallback, useMemo, useRef } from 'react';\n\nhljs.registerLanguage('javascript', javascript);\nhljs.registerLanguage('typescript', typescript);\nhljs.registerLanguage('python', python);\nhljs.registerLanguage('json', json);\nhljs.registerLanguage('xml', xml);\nhljs.registerLanguage('html', xml);\nhljs.registerLanguage('css', css);\nhljs.registerLanguage('bash', bash);\nhljs.registerLanguage('shell', bash);\nhljs.registerLanguage('sql', sql);\nhljs.registerLanguage('yaml', yaml);\nhljs.registerLanguage('yml', yaml);\nhljs.registerLanguage('markdown', markdown);\nhljs.registerLanguage('md', markdown);\n\nconst lazyLanguages: Record<string, () => Promise<unknown>> = {\n java: () => import('highlight.js/lib/languages/java'),\n cpp: () => import('highlight.js/lib/languages/cpp'),\n 'c++': () => import('highlight.js/lib/languages/cpp'),\n c: () => import('highlight.js/lib/languages/c'),\n csharp: () => import('highlight.js/lib/languages/csharp'),\n php: () => import('highlight.js/lib/languages/php'),\n ruby: () => import('highlight.js/lib/languages/ruby'),\n go: () => import('highlight.js/lib/languages/go'),\n rust: () => import('highlight.js/lib/languages/rust'),\n perl: () => import('highlight.js/lib/languages/perl'),\n r: () => import('highlight.js/lib/languages/r'),\n makefile: () => import('highlight.js/lib/languages/makefile'),\n dockerfile: () => import('highlight.js/lib/languages/dockerfile'),\n};\n\nconst loadedLanguages = new Set<string>([\n 'javascript',\n 'typescript',\n 'python',\n 'json',\n 'xml',\n 'html',\n 'css',\n 'bash',\n 'shell',\n 'sql',\n 'yaml',\n 'yml',\n 'markdown',\n 'md',\n]);\n\nasync function ensureLanguage(lang: string): Promise<boolean> {\n const key = lang.toLowerCase();\n if (loadedLanguages.has(key)) return true;\n const loader = lazyLanguages[key];\n if (!loader) return false;\n try {\n const mod = (await loader()) as { default: unknown };\n hljs.registerLanguage(\n key,\n mod.default as Parameters<typeof hljs.registerLanguage>[1]\n );\n loadedLanguages.add(key);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function highlightCode(code: string, lang?: string): string {\n if (lang && loadedLanguages.has(lang.toLowerCase())) {\n try {\n return hljs.highlight(code, { language: lang.toLowerCase() }).value;\n } catch {\n /* fall through */\n }\n }\n try {\n const result = hljs.highlightAuto(code);\n if (result.relevance > 5) return result.value;\n } catch {\n /* fall through */\n }\n return escapeHtml(code);\n}\n\nfunction sanitise(html: string): string {\n return DOMPurify.sanitize(html, {\n ADD_ATTR: [\n 'target',\n 'rel',\n 'data-block-type',\n 'data-block-id',\n 'data-code',\n 'data-lang',\n 'data-md-fence',\n ],\n }) as string;\n}\n\n// Use globalThis to prevent duplicate DOMPurify hook registration across HMR reloads.\nconst _g = globalThis as unknown as Record<string, boolean>;\n// Guard against SSR: DOMPurify hooks operate on the DOM, so only register in the browser.\nif (typeof document !== 'undefined' && !_g.__markdownAnchorHookInstalled) {\n _g.__markdownAnchorHookInstalled = true;\n DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => {\n const isAnchor =\n (typeof HTMLAnchorElement !== 'undefined' &&\n node instanceof HTMLAnchorElement) ||\n node.nodeName === 'A';\n if (isAnchor) {\n node.setAttribute('target', '_blank');\n node.setAttribute('rel', 'noopener noreferrer');\n }\n });\n}\n\nlet blockCounter = 0;\n\nfunction createRenderer() {\n const renderer = new marked.Renderer();\n\n renderer.code = function (this: unknown, token: Tokens.Code) {\n const { text: code, lang = '' } = token;\n const normalised = lang.toLowerCase().trim();\n const blockId = `block-${++blockCounter}`;\n const encodedCode = encodeURIComponent(code);\n const sentinel = 'data-md-fence=\"1\"';\n\n switch (normalised) {\n case 'mermaid':\n return `<div data-block-type=\"mermaid\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n case 'csv':\n return `<div data-block-type=\"csv\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n case 'survey':\n return `<div data-block-type=\"survey\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n case 'html':\n return `<div data-block-type=\"html-preview\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" ${sentinel}></div>`;\n default:\n return `<div data-block-type=\"code\" data-block-id=\"${blockId}\" data-code=\"${encodedCode}\" data-lang=\"${escapeHtml(normalised)}\" ${sentinel}></div>`;\n }\n };\n\n renderer.link = function (this: unknown, token: Tokens.Link) {\n const { href, title, tokens } = token;\n const text =\n this && typeof (this as Record<string, unknown>).parser === 'object'\n ? (\n this as {\n parser: { parseInline: (t: Tokens.Link['tokens']) => string };\n }\n ).parser.parseInline(tokens)\n : token.text;\n const titleAttr = title ? ` title=\"${escapeHtml(title)}\"` : '';\n return `<a href=\"${escapeHtml(href)}\" target=\"_blank\" rel=\"noopener noreferrer\"${titleAttr}>${text}</a>`;\n };\n\n renderer.table = function (this: unknown, token: Tokens.Table) {\n const headerCells = token.header\n .map((cell) => {\n const content =\n this && typeof (this as Record<string, unknown>).parser === 'object'\n ? (\n this as {\n parser: {\n parseInline: (t: Tokens.TableCell['tokens']) => string;\n };\n }\n ).parser.parseInline(cell.tokens)\n : cell.text;\n return `<th>${content}</th>`;\n })\n .join('');\n\n const bodyRows = token.rows\n .map((row) => {\n const cells = row\n .map((cell) => {\n const content =\n this &&\n typeof (this as Record<string, unknown>).parser === 'object'\n ? (\n this as {\n parser: {\n parseInline: (t: Tokens.TableCell['tokens']) => string;\n };\n }\n ).parser.parseInline(cell.tokens)\n : cell.text;\n return `<td>${content}</td>`;\n })\n .join('');\n return `<tr>${cells}</tr>`;\n })\n .join('');\n\n return `<div class=\"overflow-x-auto\"><table class=\"min-w-full divide-y divide-neutral-200 dark:divide-neutral-700\"><thead><tr>${headerCells}</tr></thead><tbody class=\"divide-y divide-neutral-200 dark:divide-neutral-700\">${bodyRows}</tbody></table></div>`;\n };\n\n return renderer;\n}\n\nfunction makeMarkedOptions(): MarkedOptions {\n return { gfm: true, breaks: true, renderer: createRenderer() };\n}\n\nconst CACHE_MAX = 100;\nconst renderCache = new Map<string, string>();\nfunction cacheSet(key: string, value: string) {\n if (renderCache.size >= CACHE_MAX) {\n renderCache.delete(renderCache.keys().next().value as string);\n }\n renderCache.set(key, value);\n}\n\nexport interface UseMarkdownResult {\n /** Render markdown text to sanitised HTML string */\n render: (text: string, cacheKey?: string) => string;\n /** Async-render that lazy-loads needed languages first */\n renderAsync: (text: string, cacheKey?: string) => Promise<string>;\n /** Clear the render cache */\n clearCache: () => void;\n}\n\nexport function useMarkdown(): UseMarkdownResult {\n const cacheRef = useRef(renderCache);\n\n const render = useCallback((text: string, cacheKey?: string): string => {\n if (!text) return '';\n const key = cacheKey ?? text;\n const cached = cacheRef.current.get(key);\n if (cached) return cached;\n\n const raw = marked.parse(text, {\n ...makeMarkedOptions(),\n async: false,\n }) as string;\n const clean = sanitise(raw);\n cacheSet(key, clean);\n return clean;\n }, []);\n\n const renderAsync = useCallback(\n async (text: string, cacheKey?: string): Promise<string> => {\n if (!text) return '';\n const key = cacheKey ?? text;\n const cached = cacheRef.current.get(key);\n if (cached) return cached;\n\n // Allow `+`, `-`, `.` in language identifiers (c++, objective-c, bash-session, etc.)\n const fenceRegex = /^```([\\w+\\-.]+)\\s*$/gm;\n let match: RegExpExecArray | null;\n const langs: string[] = [];\n while ((match = fenceRegex.exec(text)) !== null) {\n langs.push(match[1]);\n }\n await Promise.all(langs.map((l) => ensureLanguage(l)));\n\n const raw = await marked.parse(text, makeMarkedOptions());\n const clean = sanitise(raw);\n cacheSet(key, clean);\n return clean;\n },\n []\n );\n\n const clearCache = useCallback(() => {\n cacheRef.current.clear();\n }, []);\n\n return useMemo(\n () => ({ render, renderAsync, clearCache }),\n [render, renderAsync, clearCache]\n );\n}\n","/**\n * CodeBlock — Renders a syntax-highlighted code fence using FenceBlock.\n *\n * Used by `MarkdownRenderer` for plain (non-special) fenced code blocks.\n * Highlighting is performed synchronously via the `highlightCode` helper from\n * `useMarkdown`; if the language was not pre-registered with highlight.js the\n * helper falls back to escaped raw text.\n */\nimport React, { useMemo } from 'react';\n\nimport { FenceBlock } from './FenceBlock';\nimport { highlightCode } from './useMarkdown';\n\ninterface CodeBlockProps {\n code: string;\n language?: string;\n}\n\nexport const CodeBlock: React.FC<CodeBlockProps> = ({ code, language }) => {\n const html = useMemo(() => highlightCode(code, language), [code, language]);\n\n return (\n <FenceBlock code={code} language={language}>\n {/* Focusable so keyboard users can horizontally scroll long lines\n (axe: scrollable-region-focusable). */}\n <pre\n className=\"m-0 overflow-x-auto !bg-transparent p-3 text-sm\"\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex -- scrollable code needs keyboard focus\n tabIndex={0}\n role=\"region\"\n aria-label={language ? `${language} code` : 'Code'}\n >\n <code\n className=\"hljs bg-transparent p-0\"\n dangerouslySetInnerHTML={{ __html: html }}\n />\n </pre>\n </FenceBlock>\n );\n};\n","/**\n * MarkdownRenderer — renders markdown with React components for special fence blocks.\n */\nimport React, { Suspense, lazy, useEffect, useState } from 'react';\n\nimport './styles.css';\nimport { CodeBlock } from './CodeBlock';\nimport { useMarkdown } from './useMarkdown';\n\n// Block components are lazy-loaded so optional peer deps (papaparse, js-yaml, mermaid)\n// aren't bundled unless actually rendered.\nconst CsvBlock = lazy(() =>\n import('./CsvBlock').then((m) => ({ default: m.CsvBlock }))\n);\nconst HtmlPreviewBlock = lazy(() =>\n import('./HtmlPreviewBlock').then((m) => ({ default: m.HtmlPreviewBlock }))\n);\nconst MermaidBlock = lazy(() =>\n import('./MermaidBlock').then((m) => ({ default: m.MermaidBlock }))\n);\nconst SurveyBlock = lazy(() =>\n import('./SurveyBlock').then((m) => ({ default: m.SurveyBlock }))\n);\n\nconst BlockFallback: React.FC = () => (\n <div className=\"flex items-center justify-center p-4 text-sm text-neutral-500\">\n Loading…\n </div>\n);\n\nexport interface MarkdownRendererProps {\n /** Raw markdown text */\n text: string;\n /** Cache key (e.g., message._id + revisionNumber) */\n cacheKey?: string;\n /** Additional CSS classes */\n className?: string;\n /** Whether the message is still streaming (may have incomplete blocks) */\n streaming?: boolean;\n}\n\n// Matches fence block markers emitted by useMarkdown (sentinel data-md-fence prevents raw-HTML injection)\nconst BLOCK_RE =\n /<div data-block-type=\"([^\"]+)\" data-block-id=\"([^\"]+)\" data-code=\"([^\"]*)\"([^>]*\\bdata-md-fence=\"1\"[^>]*)><\\/div>/g;\n\ninterface HtmlSegment {\n html: string;\n}\ninterface BlockSegment {\n type: string;\n id: string;\n code: string;\n lang?: string;\n}\ntype Segment = HtmlSegment | BlockSegment;\n\nfunction splitHtml(html: string): Segment[] {\n const segments: Segment[] = [];\n let last = 0;\n for (const m of html.matchAll(BLOCK_RE)) {\n if (m.index > last) segments.push({ html: html.slice(last, m.index) });\n const langMatch = m[4]?.match(/data-lang=\"([^\"]*)\"/)?.[1];\n segments.push({\n type: m[1],\n id: m[2],\n code: (() => {\n try {\n return decodeURIComponent(m[3]);\n } catch {\n return m[3];\n }\n })(),\n lang: langMatch ?? undefined,\n });\n last = m.index + m[0].length;\n }\n if (last < html.length) segments.push({ html: html.slice(last) });\n return segments;\n}\n\nfunction renderBlock(seg: BlockSegment): React.ReactNode {\n const wrap = (node: React.ReactNode) => (\n <Suspense key={seg.id} fallback={<BlockFallback />}>\n {node}\n </Suspense>\n );\n switch (seg.type) {\n case 'mermaid':\n return wrap(<MermaidBlock code={seg.code} id={seg.id} />);\n case 'csv':\n return wrap(<CsvBlock code={seg.code} id={seg.id} />);\n case 'survey':\n return wrap(<SurveyBlock code={seg.code} id={seg.id} />);\n case 'html-preview':\n return wrap(<HtmlPreviewBlock code={seg.code} id={seg.id} />);\n case 'code':\n return wrap(\n <CodeBlock code={seg.code} language={seg.lang || undefined} />\n );\n default:\n return null;\n }\n}\n\nexport const MarkdownRenderer: React.FC<MarkdownRendererProps> = ({\n text,\n cacheKey,\n className = '',\n streaming = false,\n}) => {\n const { render, renderAsync } = useMarkdown();\n const [html, setHtml] = useState('');\n\n useEffect(() => {\n let cancelled = false;\n\n // While streaming, append text length to the cache key so each delta\n // produces a fresh render rather than a stale hit on the messageId.\n const effectiveKey = streaming\n ? cacheKey\n ? `${cacheKey}::${text.length}`\n : undefined\n : cacheKey;\n\n async function doRender() {\n const rendered = await renderAsync(text, effectiveKey);\n if (!cancelled) setHtml(rendered);\n }\n\n if (streaming) {\n setHtml(render(text, effectiveKey));\n } else {\n void doRender();\n }\n\n return () => {\n cancelled = true;\n };\n }, [text, cacheKey, streaming, render, renderAsync]);\n\n const segments = splitHtml(html);\n const proseClass = `md-prose ${className}`.trim();\n\n return (\n <div className={proseClass}>\n {segments.map((seg, i) =>\n 'html' in seg ? (\n <div key={i} dangerouslySetInnerHTML={{ __html: seg.html }} />\n ) : (\n renderBlock(seg)\n )\n )}\n </div>\n );\n};\n"]}
|
|
@@ -6,7 +6,7 @@ import { useLiveAnnouncement } from './chunk-HNXLLDPN.js';
|
|
|
6
6
|
import { Plus, GripVertical, Link, ChevronUp, ChevronDown, History, Trash2, CheckCircle, RefreshCw, Pencil, StickyNote, ExternalLink, HelpCircle } from './chunk-BKSPDTX4.js';
|
|
7
7
|
import { isRtl } from './chunk-YVKBXNPK.js';
|
|
8
8
|
import { Badge } from './chunk-522WJIVI.js';
|
|
9
|
-
import { Button } from './chunk-
|
|
9
|
+
import { Button } from './chunk-WX2XB6FP.js';
|
|
10
10
|
import { cn } from './chunk-TQONQSJO.js';
|
|
11
11
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
12
12
|
import * as React from 'react';
|
|
@@ -630,5 +630,5 @@ var ProblemList = React.forwardRef(
|
|
|
630
630
|
ProblemList.displayName = "ProblemList";
|
|
631
631
|
|
|
632
632
|
export { CHANGE_TYPE_LABELS, CONCERN_STATUS_LABELS, CodingChips, ProblemList, RowActionToolbar, RowIconButton, UncertaintyBadge, concernGroupKey, concernHistoryContent, currentAssertion, toolbarKeyNav };
|
|
633
|
-
//# sourceMappingURL=chunk-
|
|
634
|
-
//# sourceMappingURL=chunk-
|
|
633
|
+
//# sourceMappingURL=chunk-KSQQBFDQ.js.map
|
|
634
|
+
//# sourceMappingURL=chunk-KSQQBFDQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/RowActionToolbar/RowActionToolbar.tsx","../src/components/ProblemList/ProblemList.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-5LNLB2XT.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\n\n/**\n * Toolbar / group arrow-key navigation (WAI-ARIA toolbar pattern).\n * Attach to a container's onKeyDown: ←/→ move focus between enabled\n * buttons, Home/End jump to first/last. Horizontal arrows follow the\n * visual direction, so they invert under RTL.\n */\nexport function toolbarKeyNav(e: React.KeyboardEvent<HTMLElement>) {\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button:not([disabled])'\n )\n );\n const i = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (i === -1 || buttons.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n let key = e.key;\n if (isRtl(e.currentTarget)) {\n if (key === 'ArrowRight') key = 'ArrowLeft';\n else if (key === 'ArrowLeft') key = 'ArrowRight';\n }\n const next =\n key === 'ArrowLeft'\n ? (i - 1 + buttons.length) % buttons.length\n : key === 'ArrowRight'\n ? (i + 1) % buttons.length\n : key === 'Home'\n ? 0\n : buttons.length - 1;\n buttons[next]?.focus();\n}\n\n// Alignment of the floating (fine-pointer) overlay within the row.\nconst ALIGN = {\n /** Vertically centered on the row's right edge (single-line rows). */\n center:\n 'pointer-fine:top-1/2 pointer-fine:end-0 pointer-fine:-translate-y-1/2',\n /** Pinned near the row's top-right corner (multi-line rows). */\n top: 'pointer-fine:top-1.5 pointer-fine:end-1.5',\n} as const;\n\n// Which hover scope reveals the toolbar. Rows nested inside another `group`\n// (e.g. order rows inside an assessed problem) use a named group so hovering\n// the outer block doesn't reveal every nested toolbar. `grid` keys off the\n// datavis (NITRO) table row (`.wcdv-tr`) for toolbars rendered into grid\n// cells via `formatCell`.\nconst REVEAL = {\n row: cn(\n 'group-hover:pointer-events-auto group-hover:opacity-100',\n 'group-focus-within:pointer-events-auto group-focus-within:opacity-100',\n 'group-focus:pointer-events-auto group-focus:opacity-100'\n ),\n order: cn(\n 'group-hover/order:pointer-events-auto group-hover/order:opacity-100',\n 'group-focus-within/order:pointer-events-auto group-focus-within/order:opacity-100',\n 'group-focus/order:pointer-events-auto group-focus/order:opacity-100'\n ),\n grid: cn(\n '[.wcdv-tr:hover_&]:pointer-events-auto [.wcdv-tr:hover_&]:opacity-100',\n '[.wcdv-tr:focus-within_&]:pointer-events-auto [.wcdv-tr:focus-within_&]:opacity-100'\n ),\n} as const;\n\nexport interface RowActionToolbarProps {\n /** Accessible name, e.g. `Actions for penicillin`. */\n label: string;\n /** Overlay alignment on fine-pointer devices. @default 'center' */\n align?: keyof typeof ALIGN;\n /**\n * Hover scope for the reveal. Use `'order'` when the row is a\n * `group/order` nested inside another `group`; use `'grid'` inside a\n * datavis (NITRO) grid cell — the toolbar then stays in flow (the cell\n * reserves its space) and reveals when the `.wcdv-tr` row is hovered.\n * @default 'row'\n */\n group?: keyof typeof REVEAL;\n /**\n * `'hover'` floats the toolbar over the row on fine-pointer devices and\n * reveals it on hover/focus; `'always'` keeps it in flow at the end of the\n * row and always visible on every pointer type.\n * @default 'hover'\n */\n reveal?: 'hover' | 'always';\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Per-row action toolbar for clinical lists.\n *\n * On hover-capable (fine pointer) devices it floats over the row's right\n * edge as a card-styled overlay, hidden until the row is hovered or\n * keyboard-focused. Touch devices can't hover, so the toolbar stays in\n * flow at the end of the row (`ms-auto`) and is always visible.\n *\n * Implements WAI-ARIA toolbar arrow-key navigation. The parent row must be\n * `relative` and carry the matching `group` (or `group/order`) class.\n */\nexport function RowActionToolbar({\n label,\n align = 'center',\n group = 'row',\n reveal = 'hover',\n className,\n children,\n}: RowActionToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label={label}\n onKeyDown={toolbarKeyNav}\n className={cn(\n 'z-10 ms-auto flex items-center gap-0.5',\n reveal === 'hover' && [\n 'transition-opacity',\n // Inside a grid cell the column already reserves the space, so the\n // toolbar stays in flow — no absolute overlay. It keeps the card\n // chrome, though: pair with a `sticky end-0` actions column and it\n // floats over scrolled-under content at the grid's right edge.\n group !== 'grid' && [\n 'pointer-fine:absolute',\n ALIGN[align],\n 'pointer-fine:bg-card pointer-fine:border-border pointer-fine:rounded-md pointer-fine:border pointer-fine:p-0.5 pointer-fine:shadow-sm',\n ],\n group === 'grid' &&\n 'bg-card border-border rounded-md border p-0.5 shadow-sm',\n 'pointer-fine:pointer-events-none pointer-fine:opacity-0',\n REVEAL[group],\n 'focus-within:pointer-events-auto focus-within:opacity-100',\n ],\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nexport interface RowIconButtonProps {\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n onClick: () => void;\n /** Toggle-button state (renders `aria-pressed` + tinted background). */\n active?: boolean;\n /** Disclosure state and the id of the controlled region. */\n expanded?: boolean;\n controls?: string;\n /** `md` = 32px button / 16px icon; `sm` = 28px / 14px. @default 'md' */\n size?: 'md' | 'sm';\n}\n\n/** Tooltip-labeled ghost icon button for `RowActionToolbar`. */\nexport function RowIconButton({\n label,\n icon: Icon,\n onClick,\n active,\n expanded,\n controls,\n size = 'md',\n}: RowIconButtonProps) {\n return (\n <Tooltip content={label}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n aria-pressed={active}\n aria-expanded={expanded}\n aria-controls={controls}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className={cn(\n size === 'sm' ? 'h-7 w-7' : 'h-8 w-8',\n 'shrink-0',\n (active || expanded) &&\n 'bg-primary-50 text-primary-700 dark:bg-primary-950 dark:text-primary-400'\n )}\n >\n <Icon size={size === 'sm' ? 14 : 16} />\n </Button>\n </Tooltip>\n );\n}\n","'use client';\n\nimport { useMessages, type MessageTranslator } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n PencilIcon,\n RefreshIcon,\n CheckCircleIcon,\n LinkIcon,\n ExternalLinkIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n PlusIcon,\n HistoryIcon,\n HelpCircleIcon,\n GripVerticalIcon,\n StickyNoteIcon,\n TrashIcon,\n} from '../Icons';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\n\n// =============================================================================\n// Types — shared condition (concern/assertion) model\n// =============================================================================\n\n/** A single coding on a condition assertion (ICD-10 / ICD-11 / SNOMED). */\nexport interface ConditionCoding {\n /** Coding system, e.g. 'ICD-10-CM', 'ICD-11', 'SNOMED' */\n system: 'ICD-10-CM' | 'ICD-11' | 'SNOMED' | string;\n code: string;\n display?: string;\n /** Which coding is authoritative for this assertion */\n primary?: boolean;\n /** Provenance when derived via a crosswalk (e.g. SNOMED→ICD-10 map) */\n mappedFrom?: string;\n}\n\n/** Longitudinal status of the concern (the stable problem thread). */\nexport type ConcernStatus =\n | 'active'\n | 'recurrence'\n | 'relapse'\n | 'inactive'\n | 'remission'\n | 'resolved';\n\n/** FHIR-aligned verification status of an assertion. */\nexport type VerificationStatus =\n | 'unconfirmed'\n | 'provisional'\n | 'differential'\n | 'confirmed'\n | 'refuted'\n | 'entered-in-error';\n\n/** Why an assertion superseded its predecessor. */\nexport type AssertionChangeType =\n | 'refinement'\n | 'revision'\n | 'progression'\n | 'reattribution';\n\n// ---- Uncertainty (mirrors §4 of the design doc) ----\n\n/** Three-state flag for an optional field: confident / uncertain / explicitly unknown. */\nexport interface FieldUncertainty {\n /** false = explicitly unknown (\"asked; patient doesn't know\") — distinct from untouched */\n known: boolean;\n /** Why the value is absent (~ FHIR data-absent-reason) */\n reason?: 'asked-unknown' | 'not-asked' | 'masked' | 'unavailable';\n /** Softness of a value that IS present */\n confidence?: 'low' | 'medium' | 'high';\n note?: string;\n}\n\n/** Condition fields that can carry per-field uncertainty. */\nexport type UncertainConditionField =\n | 'coding'\n | 'onset'\n | 'severity'\n | 'laterality'\n | 'bodySite';\n\n/** First-class uncertainty block for a condition assertion. */\nexport interface Uncertainty {\n overall?: 'confirmed' | 'low' | 'medium' | 'high';\n fields?: Partial<Record<UncertainConditionField, FieldUncertainty>>;\n}\n\n/** A time-stamped, coded characterization of a concern. */\nexport interface ConditionAssertion {\n id: string;\n /** Display date the assertion was made, e.g. \"2023-06-14\" */\n date: string;\n /** Free-text condition name — the only hard-required clinical field */\n text: string;\n coding?: ConditionCoding[];\n verificationStatus: VerificationStatus;\n /** How this assertion relates to the one it supersedes */\n changeType?: AssertionChangeType;\n /** Id of the assertion this one supersedes */\n supersedes?: string;\n severity?: 'mild' | 'moderate' | 'severe';\n /** Onset — exact date and/or fuzzy human string (\"since her twenties\") */\n onset?: { date?: string; fuzzy?: string };\n /** First-class uncertainty (§4 of the design doc) */\n uncertainty?: Uncertainty;\n note?: string;\n}\n\n/** Relationship between two concerns. */\nexport interface ConcernRelationship {\n type:\n | 'caused-by'\n | 'evolved-from'\n | 'differential-sibling'\n | 'complication-of';\n /** concernId of the related concern */\n concernId: string;\n /** Display name of the related concern */\n display?: string;\n}\n\n/** A quick, dated progress note about a concern — lighter than an assertion. */\nexport interface ConditionObservation {\n id: string;\n /** Display date, e.g. \"2026-07-03\" */\n date: string;\n text: string;\n author?: string;\n}\n\n/**\n * A stable problem thread. The concernId is the durable identity that orders\n * and encounters reference; assertions carry the evolving codes.\n */\nexport interface ConditionConcern {\n concernId: string;\n clinicalStatus: ConcernStatus;\n /** Ordered oldest → newest; the last non-refuted assertion is current */\n assertions: ConditionAssertion[];\n /** Quick progress notes over time (newest last) */\n observations?: ConditionObservation[];\n relationships?: ConcernRelationship[];\n /** Where the concern came from */\n source?:\n | 'ehrProblemList'\n | 'patientReported'\n | 'manuallyAdded'\n | 'claimsHistory';\n}\n\n/** Row actions on a concern. */\nexport type ProblemListAction =\n | 'open'\n | 'observe'\n | 'refine'\n | 'revise'\n | 'resolve'\n | 'relate'\n | 'remove'\n | 'move-up'\n | 'move-down';\n\nexport interface ProblemListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Patient-level concerns (controlled) */\n concerns: ConditionConcern[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Called when a row action is clicked */\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n /** Called when a new problem is added via the capture-first input */\n onAddProblem?: (text: string) => void;\n /**\n * Called with the full ordered list of concernIds after a move — via drag\n * and drop, the move buttons, or Alt+Arrow keys. Enables reordering. The\n * component renders concerns in props order — persist the ids wherever the\n * encounter/patient object lives and feed them back in.\n */\n onReorder?: (concernIds: string[]) => void;\n /** Which row actions to show (default: all except 'remove') */\n actions?: ProblemListAction[];\n /** Show row actions in flow, always visible, instead of the hover-reveal overlay */\n inlineActions?: boolean;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when there are no concerns */\n emptyMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst GROUP_ORDER: { key: string; label: string; statuses: ConcernStatus[] }[] =\n [\n {\n key: 'active',\n label: 'Active',\n statuses: ['active', 'recurrence', 'relapse'],\n },\n { key: 'inactive', label: 'Inactive', statuses: ['inactive', 'remission'] },\n { key: 'resolved', label: 'Resolved', statuses: ['resolved'] },\n ];\n\n/**\n * Grouping key for a concern. Unconfirmed concerns (current assertion not yet\n * verified) live in their own group, separate from Active / Resolved.\n */\nexport function concernGroupKey(concern: ConditionConcern): string {\n if (currentAssertion(concern)?.verificationStatus === 'unconfirmed') {\n return 'unconfirmed';\n }\n return (\n GROUP_ORDER.find((g) => g.statuses.includes(concern.clinicalStatus))?.key ??\n 'active'\n );\n}\n\nexport const CONCERN_STATUS_LABELS: Record<ConcernStatus, string> = {\n active: 'Active',\n recurrence: 'Recurrence',\n relapse: 'Relapse',\n inactive: 'Inactive',\n remission: 'Remission',\n resolved: 'Resolved',\n};\n\nexport const CHANGE_TYPE_LABELS: Record<AssertionChangeType, string> = {\n refinement: 'Refined',\n revision: 'Revised',\n progression: 'Progressed',\n reattribution: 'Re-attributed',\n};\n\nconst DEFAULT_ACTIONS: ProblemListAction[] = [\n 'open',\n 'observe',\n 'refine',\n 'revise',\n 'resolve',\n 'relate',\n 'move-up',\n 'move-down',\n];\n\nconst ACTION_META: Record<\n ProblemListAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n open: { label: 'Open', icon: ExternalLinkIcon },\n observe: { label: 'Add observation (progress note)', icon: StickyNoteIcon },\n refine: { label: 'Refine (more specific)', icon: PencilIcon },\n revise: { label: 'Revise (prior was wrong)', icon: RefreshIcon },\n resolve: { label: 'Resolve', icon: CheckCircleIcon },\n relate: { label: 'Relate to another problem', icon: LinkIcon },\n remove: { label: 'Delete', icon: TrashIcon },\n 'move-up': { label: 'Move up (Alt+↑)', icon: ChevronUpIcon },\n 'move-down': { label: 'Move down (Alt+↓)', icon: ChevronDownIcon },\n};\n\nconst VERIFICATION_BADGE: Record<\n VerificationStatus,\n {\n label: string;\n variant: 'default' | 'secondary' | 'success' | 'warning' | 'outline';\n }\n> = {\n unconfirmed: { label: 'Unconfirmed', variant: 'outline' },\n provisional: { label: 'Provisional', variant: 'warning' },\n differential: { label: 'Differential', variant: 'warning' },\n confirmed: { label: 'Confirmed', variant: 'success' },\n refuted: { label: 'Refuted', variant: 'secondary' },\n 'entered-in-error': { label: 'Entered in error', variant: 'secondary' },\n};\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** The current (last non-refuted, non-error) assertion of a concern. */\nexport function currentAssertion(\n concern: ConditionConcern\n): ConditionAssertion | undefined {\n for (let i = concern.assertions.length - 1; i >= 0; i--) {\n const a = concern.assertions[i];\n if (\n a.verificationStatus !== 'refuted' &&\n a.verificationStatus !== 'entered-in-error'\n ) {\n return a;\n }\n }\n return concern.assertions[concern.assertions.length - 1];\n}\n\nconst UNCERTAIN_FIELD_LABELS: Record<UncertainConditionField, string> = {\n coding: 'Coding',\n onset: 'Onset',\n severity: 'Severity',\n laterality: 'Laterality',\n bodySite: 'Body site',\n};\n\nfunction describeFieldUncertainty(\n field: UncertainConditionField,\n f: FieldUncertainty,\n m: MessageTranslator\n): string {\n const label = UNCERTAIN_FIELD_LABELS[field];\n if (!f.known) {\n const reason =\n f.reason === 'asked-unknown'\n ? 'asked — unknown'\n : (f.reason ?? 'unknown').replace(/-/g, ' ');\n return `${m(label)}: ${m(reason)}${f.note ? ` (${f.note})` : ''}`;\n }\n return `${m(label)}: ${m('{confidence} confidence', {\n confidence: m(f.confidence ?? 'uncertain'),\n })}${f.note ? ` (${f.note})` : ''}`;\n}\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\n/**\n * Parenthetical coding display. Clinicians don't need chip noise: inline we\n * show only ICD-10/ICD-11 codes, unlabeled (the code format is obvious), and\n * SNOMED stays out of the way. The full coding background — every system,\n * display name, and crosswalk provenance — lives in the tooltip.\n */\nexport function CodingChips({ coding }: { coding?: ConditionCoding[] }) {\n const m = useMessages();\n if (!coding?.length) return null;\n const icd = coding.filter((c) => c.system.startsWith('ICD'));\n const inline = icd.length > 0 ? icd : coding.filter((c) => c.primary);\n const label = inline.map((c) => c.code).join(', ');\n return (\n <Tooltip\n content={\n <span className=\"flex flex-col gap-0.5\">\n {coding.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n {c.primary ? m(' · primary') : ''}\n {c.mappedFrom\n ? m(' · mapped from {source}', { source: c.mappedFrom })\n : ''}\n </span>\n ))}\n </span>\n }\n >\n {/* focusable so the coding provenance is reachable by keyboard */}\n <span\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n className=\"text-muted-foreground focus-visible:ring-ring rounded text-xs whitespace-nowrap focus-visible:ring-2 focus-visible:outline-none\"\n >\n ({label || m('coded')})\n </span>\n </Tooltip>\n );\n}\n\n/**\n * Full concern background for a hover/long-press tooltip: assertion history,\n * coding background, and recent observations.\n */\nexport function concernHistoryContent(\n concern: ConditionConcern,\n m: MessageTranslator = (message) => message\n): React.ReactNode {\n return (\n <span className=\"flex max-w-xs flex-col gap-1\">\n <span className=\"font-semibold\">{m('History')}</span>\n {[...concern.assertions].reverse().map((a) => (\n <span key={a.id}>\n {a.date} — {a.text}\n {a.changeType\n ? ` (${m(CHANGE_TYPE_LABELS[a.changeType]).toLocaleLowerCase()})`\n : ''}\n {a.verificationStatus === 'refuted'\n ? ` — ${m('Refuted').toLocaleLowerCase()}`\n : ''}\n </span>\n ))}\n {concern.observations && concern.observations.length > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Observations')}</span>\n {[...concern.observations]\n .reverse()\n .slice(0, 3)\n .map((o) => (\n <span key={o.id}>\n {o.date} — {o.text}\n </span>\n ))}\n </>\n )}\n {(currentAssertion(concern)?.coding?.length ?? 0) > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Coding')}</span>\n {currentAssertion(concern)!.coding!.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n </span>\n ))}\n </>\n )}\n </span>\n );\n}\n\n/** Badge summarizing an assertion's uncertainty block (§4 of the design doc). */\nexport function UncertaintyBadge({\n uncertainty,\n}: {\n uncertainty?: Uncertainty;\n}) {\n const m = useMessages();\n if (!uncertainty) return null;\n const fieldEntries = Object.entries(uncertainty.fields ?? {}) as Array<\n [UncertainConditionField, FieldUncertainty]\n >;\n const overall =\n uncertainty.overall && uncertainty.overall !== 'confirmed'\n ? uncertainty.overall\n : null;\n if (!overall && fieldEntries.length === 0) return null;\n const lines = [\n ...(overall\n ? [m('Overall certainty: {certainty}', { certainty: m(overall) })]\n : []),\n ...fieldEntries.map(([field, f]) => describeFieldUncertainty(field, f, m)),\n ];\n return (\n <Tooltip content={lines.join(' · ')}>\n <Badge variant=\"warning\" size=\"sm\" className=\"gap-1\">\n <HelpCircleIcon size={10} />\n {overall\n ? m('{certainty} certainty', { certainty: m(overall) })\n : m('{count} uncertain', { count: fieldEntries.length })}\n </Badge>\n </Tooltip>\n );\n}\n\nfunction AssertionTimeline({ concern }: { concern: ConditionConcern }) {\n const m = useMessages();\n const items = [...concern.assertions].reverse(); // newest first\n return (\n <ol\n aria-label={m('Assertion history')}\n className=\"border-border ms-1.5 mt-2 space-y-2 border-s ps-4\"\n >\n {items.map((a) => {\n const refuted =\n a.verificationStatus === 'refuted' ||\n a.verificationStatus === 'entered-in-error';\n const verification = VERIFICATION_BADGE[a.verificationStatus];\n return (\n <li key={a.id} className=\"relative text-sm\">\n <span\n aria-hidden\n className=\"bg-border absolute -start-5 top-1.5 h-2 w-2 rounded-full\"\n />\n <span className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {a.date}\n </span>\n <span\n className={cn(\n 'text-foreground font-medium',\n refuted && 'text-muted-foreground line-through'\n )}\n >\n {a.text}\n </span>\n {a.changeType && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m(CHANGE_TYPE_LABELS[a.changeType])}\n </Badge>\n )}\n <Badge variant={verification.variant} size=\"sm\">\n {m(verification.label)}\n </Badge>\n <UncertaintyBadge uncertainty={a.uncertainty} />\n <CodingChips coding={a.coding} />\n </span>\n {a.note && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">{a.note}</p>\n )}\n </li>\n );\n })}\n </ol>\n );\n}\n\nfunction ConcernRow({\n concern,\n actions,\n inlineActions,\n readOnly,\n canReorder,\n drag,\n onAction,\n}: {\n concern: ConditionConcern;\n actions: ProblemListAction[];\n inlineActions: boolean;\n readOnly: boolean;\n canReorder: boolean;\n drag: UseDragReorderReturn;\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n}) {\n const m = useMessages();\n const [expanded, setExpanded] = React.useState(false);\n const current = currentAssertion(concern);\n const hasHistory = concern.assertions.length > 1;\n\n const visibleActions = actions.filter(\n (a) => canReorder || (a !== 'move-up' && a !== 'move-down')\n );\n\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n if (!canReorder) return;\n e.preventDefault();\n onAction?.(concern, e.key === 'ArrowUp' ? 'move-up' : 'move-down');\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Roving focus between rows\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-concern-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n } else if ((e.key === 'Enter' || e.key === ' ') && hasHistory) {\n e.preventDefault();\n setExpanded((v) => !v);\n }\n };\n\n if (!current) return null;\n\n return (\n // Roving-focus row (WAI-ARIA listbox-like keyboard pattern): the row is a\n // legitimate focus stop so ↑/↓ navigate rows, Enter toggles history, and\n // Alt+↑/↓ reorders — required for 508 keyboard operability.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-concern-id={concern.concernId}\n tabIndex={0}\n onKeyDown={handleRowKeyDown}\n {...drag.rowProps(concern.concernId)}\n aria-label={[\n `${current.text}.`,\n hasHistory ? m('Press Enter to toggle history.') : '',\n canReorder ? m('Alt plus arrow keys to reorder.') : '',\n ]\n .filter(Boolean)\n .join(' ')}\n className={cn(\n 'group border-border/60 relative border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, concern.concernId)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div className=\"flex min-h-9 flex-wrap items-center gap-x-2 gap-y-1\">\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n {/* Hover (or long-press on touch) the name for the complete background:\n assertion history, observations, and coding provenance. */}\n <Tooltip content={concernHistoryContent(concern, m)}>\n <span className=\"text-foreground font-medium\">{current.text}</span>\n </Tooltip>\n <CodingChips coding={current.coding} />\n {/* 'unconfirmed' is conveyed by the Unconfirmed group header */}\n {current.verificationStatus !== 'confirmed' &&\n current.verificationStatus !== 'unconfirmed' && (\n <Badge\n variant={VERIFICATION_BADGE[current.verificationStatus].variant}\n size=\"sm\"\n >\n {m(VERIFICATION_BADGE[current.verificationStatus].label)}\n </Badge>\n )}\n <UncertaintyBadge uncertainty={current.uncertainty} />\n {concern.relationships?.map((r) => (\n <Badge key={`${r.type}:${r.concernId}`} variant=\"outline\" size=\"sm\">\n <LinkIcon size={10} className=\"me-1\" />\n {m(r.type.replace(/-/g, ' '))}\n {r.display ? `: ${r.display}` : ''}\n </Badge>\n ))}\n {hasHistory && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n leftIcon={<HistoryIcon size={12} />}\n rightIcon={\n expanded ? (\n <ChevronUpIcon size={12} />\n ) : (\n <ChevronDownIcon size={12} />\n )\n }\n className=\"text-muted-foreground h-auto px-1.5 py-0.5 text-xs\"\n >\n {m('{count} assertions', { count: concern.assertions.length })}\n </Button>\n )}\n\n {!readOnly && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: current.text })}\n align=\"top\"\n reveal={inlineActions ? 'always' : 'hover'}\n >\n {visibleActions.map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(concern, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </div>\n\n {expanded && (\n <>\n <AssertionTimeline concern={concern} />\n {concern.observations && concern.observations.length > 0 && (\n <div className=\"ms-1.5 mt-2 ps-4\">\n <h5 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Observations')}\n </h5>\n <ol aria-label={m('Observations')} className=\"mt-1 space-y-1\">\n {[...concern.observations].reverse().map((o) => (\n <li key={o.id} className=\"flex flex-wrap gap-x-2 text-sm\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {o.date}\n </span>\n <span className=\"text-foreground\">{o.text}</span>\n {o.author && (\n <span className=\"text-muted-foreground text-xs\">\n — {o.author}\n </span>\n )}\n </li>\n ))}\n </ol>\n </div>\n )}\n </>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// ProblemList\n// =============================================================================\n\n/**\n * Patient-level problem list built on the concern/assertion model: each row is\n * a stable ConditionConcern whose coded characterization evolves through an\n * assertion history (refinement / revision / progression). Rows expand to show\n * the assertion timeline; refuted assertions render struck-through.\n *\n * Controlled component: concerns come in via props; every user interaction is\n * reported through callbacks.\n *\n * @example\n * ```tsx\n * <ProblemList\n * concerns={concerns}\n * onAction={(concern, action) => handleAction(concern, action)}\n * onAddProblem={(text) => addConcern(text)}\n * />\n * ```\n */\nexport const ProblemList = React.forwardRef<HTMLDivElement, ProblemListProps>(\n (\n {\n concerns,\n title = 'Problem list',\n onAction,\n onAddProblem,\n onReorder,\n actions = DEFAULT_ACTIONS,\n inlineActions = false,\n readOnly = false,\n emptyMessage = 'No problems recorded.',\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const [draft, setDraft] = React.useState('');\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const submitDraft = () => {\n const text = draft.trim();\n if (!text) return;\n onAddProblem?.(text);\n setDraft('');\n };\n\n /** Swap with the adjacent concern in the same group, then report the full order. */\n const moveConcern = React.useCallback(\n (concern: ConditionConcern, dir: -1 | 1) => {\n if (!onReorder || readOnly) return;\n const groupKey = concernGroupKey(concern);\n const ids = concerns.map((c) => c.concernId);\n const from = ids.indexOf(concern.concernId);\n // nearest neighbor in the same group\n let to = from + dir;\n while (\n to >= 0 &&\n to < concerns.length &&\n concernGroupKey(concerns[to]) !== groupKey\n ) {\n to += dir;\n }\n if (to < 0 || to >= concerns.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n const current = currentAssertion(concern);\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: current?.text ?? concern.concernId,\n })\n );\n onReorder(ids);\n },\n [concerns, onReorder, readOnly, setAnnouncement, m]\n );\n\n const handleAction = React.useCallback(\n (concern: ConditionConcern, action: ProblemListAction) => {\n if (action === 'move-up') moveConcern(concern, -1);\n else if (action === 'move-down') moveConcern(concern, 1);\n else onAction?.(concern, action);\n },\n [moveConcern, onAction]\n );\n\n // Drag & drop reordering, restricted to the same group (a cross-group\n // drop would silently imply a status change). Precomputed map — dragover\n // fires too frequently for a linear concern scan per event.\n const groupById = React.useMemo(\n () =>\n new Map(\n concerns.map((c) => [c.concernId, concernGroupKey(c)] as const)\n ),\n [concerns]\n );\n const groupOf = React.useCallback(\n (id: string) => groupById.get(id),\n [groupById]\n );\n const drag = useDragReorder({\n ids: concerns.map((c) => c.concernId),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (newIds) => {\n // announce pointer drops too, not just keyboard moves\n setAnnouncement(m('Problem list reordered'));\n onReorder(newIds);\n },\n canDropOn: (dragged, target) => groupOf(dragged) === groupOf(target),\n });\n\n // Unconfirmed concerns get their own list, ahead of Active / Resolved.\n const groups = [\n {\n key: 'unconfirmed',\n label: 'Unconfirmed',\n items: concerns.filter((c) => concernGroupKey(c) === 'unconfirmed'),\n },\n ...GROUP_ORDER.map(({ key, label }) => ({\n key,\n label,\n items: concerns.filter((c) => concernGroupKey(c) === key),\n })),\n // Active stays visible as the empty state only when nothing is recorded\n // at all — an empty Active section next to populated groups would\n // misleadingly read \"No problems recorded\".\n ].filter(\n (g) => g.items.length > 0 || (g.key === 'active' && concerns.length === 0)\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-6 px-4 py-4\">\n {groups.map(({ key, label, items }) => (\n <section key={key} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n {items.length > 0 ? (\n <ul className=\"mt-1\">\n {items.map((concern) => (\n <ConcernRow\n key={concern.concernId}\n concern={concern}\n actions={actions}\n inlineActions={inlineActions}\n readOnly={readOnly}\n canReorder={drag.enabled}\n drag={drag}\n onAction={handleAction}\n />\n ))}\n </ul>\n ) : (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {m(emptyMessage)}\n </p>\n )}\n </section>\n ))}\n\n {!readOnly && onAddProblem && (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n data-slot=\"input\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') submitDraft();\n }}\n placeholder={m('Add problem (name is enough)…')}\n aria-label={m('Add problem')}\n className={cn(\n 'border-border bg-background text-foreground placeholder:text-muted-foreground',\n 'h-8 flex-1 rounded-md border px-2.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={submitDraft}\n disabled={!draft.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8\"\n >\n {m('Add')}\n </Button>\n </div>\n )}\n </CardContent>\n\n {/* Reorder announcements for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nProblemList.displayName = 'ProblemList';\n\nexport default ProblemList;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/RowActionToolbar/RowActionToolbar.tsx","../src/components/ProblemList/ProblemList.tsx"],"names":["jsx"],"mappings":"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","file":"chunk-KSQQBFDQ.js","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { isRtl } from '../../hooks/useDirection';\nimport { cn } from '../../utils/cn';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\n\n/**\n * Toolbar / group arrow-key navigation (WAI-ARIA toolbar pattern).\n * Attach to a container's onKeyDown: ←/→ move focus between enabled\n * buttons, Home/End jump to first/last. Horizontal arrows follow the\n * visual direction, so they invert under RTL.\n */\nexport function toolbarKeyNav(e: React.KeyboardEvent<HTMLElement>) {\n if (e.altKey || e.ctrlKey || e.metaKey) return;\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const buttons = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>(\n 'button:not([disabled])'\n )\n );\n const i = buttons.indexOf(document.activeElement as HTMLButtonElement);\n if (i === -1 || buttons.length === 0) return;\n e.preventDefault();\n e.stopPropagation();\n let key = e.key;\n if (isRtl(e.currentTarget)) {\n if (key === 'ArrowRight') key = 'ArrowLeft';\n else if (key === 'ArrowLeft') key = 'ArrowRight';\n }\n const next =\n key === 'ArrowLeft'\n ? (i - 1 + buttons.length) % buttons.length\n : key === 'ArrowRight'\n ? (i + 1) % buttons.length\n : key === 'Home'\n ? 0\n : buttons.length - 1;\n buttons[next]?.focus();\n}\n\n// Alignment of the floating (fine-pointer) overlay within the row.\nconst ALIGN = {\n /** Vertically centered on the row's right edge (single-line rows). */\n center:\n 'pointer-fine:top-1/2 pointer-fine:end-0 pointer-fine:-translate-y-1/2',\n /** Pinned near the row's top-right corner (multi-line rows). */\n top: 'pointer-fine:top-1.5 pointer-fine:end-1.5',\n} as const;\n\n// Which hover scope reveals the toolbar. Rows nested inside another `group`\n// (e.g. order rows inside an assessed problem) use a named group so hovering\n// the outer block doesn't reveal every nested toolbar. `grid` keys off the\n// datavis (NITRO) table row (`.wcdv-tr`) for toolbars rendered into grid\n// cells via `formatCell`.\nconst REVEAL = {\n row: cn(\n 'group-hover:pointer-events-auto group-hover:opacity-100',\n 'group-focus-within:pointer-events-auto group-focus-within:opacity-100',\n 'group-focus:pointer-events-auto group-focus:opacity-100'\n ),\n order: cn(\n 'group-hover/order:pointer-events-auto group-hover/order:opacity-100',\n 'group-focus-within/order:pointer-events-auto group-focus-within/order:opacity-100',\n 'group-focus/order:pointer-events-auto group-focus/order:opacity-100'\n ),\n grid: cn(\n '[.wcdv-tr:hover_&]:pointer-events-auto [.wcdv-tr:hover_&]:opacity-100',\n '[.wcdv-tr:focus-within_&]:pointer-events-auto [.wcdv-tr:focus-within_&]:opacity-100'\n ),\n} as const;\n\nexport interface RowActionToolbarProps {\n /** Accessible name, e.g. `Actions for penicillin`. */\n label: string;\n /** Overlay alignment on fine-pointer devices. @default 'center' */\n align?: keyof typeof ALIGN;\n /**\n * Hover scope for the reveal. Use `'order'` when the row is a\n * `group/order` nested inside another `group`; use `'grid'` inside a\n * datavis (NITRO) grid cell — the toolbar then stays in flow (the cell\n * reserves its space) and reveals when the `.wcdv-tr` row is hovered.\n * @default 'row'\n */\n group?: keyof typeof REVEAL;\n /**\n * `'hover'` floats the toolbar over the row on fine-pointer devices and\n * reveals it on hover/focus; `'always'` keeps it in flow at the end of the\n * row and always visible on every pointer type.\n * @default 'hover'\n */\n reveal?: 'hover' | 'always';\n className?: string;\n children: React.ReactNode;\n}\n\n/**\n * Per-row action toolbar for clinical lists.\n *\n * On hover-capable (fine pointer) devices it floats over the row's right\n * edge as a card-styled overlay, hidden until the row is hovered or\n * keyboard-focused. Touch devices can't hover, so the toolbar stays in\n * flow at the end of the row (`ms-auto`) and is always visible.\n *\n * Implements WAI-ARIA toolbar arrow-key navigation. The parent row must be\n * `relative` and carry the matching `group` (or `group/order`) class.\n */\nexport function RowActionToolbar({\n label,\n align = 'center',\n group = 'row',\n reveal = 'hover',\n className,\n children,\n}: RowActionToolbarProps) {\n return (\n <div\n role=\"toolbar\"\n aria-label={label}\n onKeyDown={toolbarKeyNav}\n className={cn(\n 'z-10 ms-auto flex items-center gap-0.5',\n reveal === 'hover' && [\n 'transition-opacity',\n // Inside a grid cell the column already reserves the space, so the\n // toolbar stays in flow — no absolute overlay. It keeps the card\n // chrome, though: pair with a `sticky end-0` actions column and it\n // floats over scrolled-under content at the grid's right edge.\n group !== 'grid' && [\n 'pointer-fine:absolute',\n ALIGN[align],\n 'pointer-fine:bg-card pointer-fine:border-border pointer-fine:rounded-md pointer-fine:border pointer-fine:p-0.5 pointer-fine:shadow-sm',\n ],\n group === 'grid' &&\n 'bg-card border-border rounded-md border p-0.5 shadow-sm',\n 'pointer-fine:pointer-events-none pointer-fine:opacity-0',\n REVEAL[group],\n 'focus-within:pointer-events-auto focus-within:opacity-100',\n ],\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nexport interface RowIconButtonProps {\n label: string;\n icon: React.ComponentType<{ size?: number | string }>;\n onClick: () => void;\n /** Toggle-button state (renders `aria-pressed` + tinted background). */\n active?: boolean;\n /** Disclosure state and the id of the controlled region. */\n expanded?: boolean;\n controls?: string;\n /** `md` = 32px button / 16px icon; `sm` = 28px / 14px. @default 'md' */\n size?: 'md' | 'sm';\n}\n\n/** Tooltip-labeled ghost icon button for `RowActionToolbar`. */\nexport function RowIconButton({\n label,\n icon: Icon,\n onClick,\n active,\n expanded,\n controls,\n size = 'md',\n}: RowIconButtonProps) {\n return (\n <Tooltip content={label}>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={label}\n aria-pressed={active}\n aria-expanded={expanded}\n aria-controls={controls}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n className={cn(\n size === 'sm' ? 'h-7 w-7' : 'h-8 w-8',\n 'shrink-0',\n (active || expanded) &&\n 'bg-primary-50 text-primary-700 dark:bg-primary-950 dark:text-primary-400'\n )}\n >\n <Icon size={size === 'sm' ? 14 : 16} />\n </Button>\n </Tooltip>\n );\n}\n","'use client';\n\nimport { useMessages, type MessageTranslator } from '../../utils/messages';\n\nimport * as React from 'react';\nimport { cn } from '../../utils/cn';\nimport { Badge } from '../Badge/Badge';\nimport { Button } from '../Button';\nimport { Tooltip } from '../Tooltip';\nimport { Card, CardHeader, CardContent } from '../Card/Card';\nimport {\n PencilIcon,\n RefreshIcon,\n CheckCircleIcon,\n LinkIcon,\n ExternalLinkIcon,\n ChevronDownIcon,\n ChevronUpIcon,\n PlusIcon,\n HistoryIcon,\n HelpCircleIcon,\n GripVerticalIcon,\n StickyNoteIcon,\n TrashIcon,\n} from '../Icons';\nimport {\n useDragReorder,\n dragIndicatorClasses,\n type UseDragReorderReturn,\n} from '../../hooks/useDragReorder';\nimport { RowActionToolbar, RowIconButton } from '../RowActionToolbar';\nimport { useLiveAnnouncement } from '../../hooks/useLiveAnnouncement';\n\n// =============================================================================\n// Types — shared condition (concern/assertion) model\n// =============================================================================\n\n/** A single coding on a condition assertion (ICD-10 / ICD-11 / SNOMED). */\nexport interface ConditionCoding {\n /** Coding system, e.g. 'ICD-10-CM', 'ICD-11', 'SNOMED' */\n system: 'ICD-10-CM' | 'ICD-11' | 'SNOMED' | string;\n code: string;\n display?: string;\n /** Which coding is authoritative for this assertion */\n primary?: boolean;\n /** Provenance when derived via a crosswalk (e.g. SNOMED→ICD-10 map) */\n mappedFrom?: string;\n}\n\n/** Longitudinal status of the concern (the stable problem thread). */\nexport type ConcernStatus =\n | 'active'\n | 'recurrence'\n | 'relapse'\n | 'inactive'\n | 'remission'\n | 'resolved';\n\n/** FHIR-aligned verification status of an assertion. */\nexport type VerificationStatus =\n | 'unconfirmed'\n | 'provisional'\n | 'differential'\n | 'confirmed'\n | 'refuted'\n | 'entered-in-error';\n\n/** Why an assertion superseded its predecessor. */\nexport type AssertionChangeType =\n | 'refinement'\n | 'revision'\n | 'progression'\n | 'reattribution';\n\n// ---- Uncertainty (mirrors §4 of the design doc) ----\n\n/** Three-state flag for an optional field: confident / uncertain / explicitly unknown. */\nexport interface FieldUncertainty {\n /** false = explicitly unknown (\"asked; patient doesn't know\") — distinct from untouched */\n known: boolean;\n /** Why the value is absent (~ FHIR data-absent-reason) */\n reason?: 'asked-unknown' | 'not-asked' | 'masked' | 'unavailable';\n /** Softness of a value that IS present */\n confidence?: 'low' | 'medium' | 'high';\n note?: string;\n}\n\n/** Condition fields that can carry per-field uncertainty. */\nexport type UncertainConditionField =\n | 'coding'\n | 'onset'\n | 'severity'\n | 'laterality'\n | 'bodySite';\n\n/** First-class uncertainty block for a condition assertion. */\nexport interface Uncertainty {\n overall?: 'confirmed' | 'low' | 'medium' | 'high';\n fields?: Partial<Record<UncertainConditionField, FieldUncertainty>>;\n}\n\n/** A time-stamped, coded characterization of a concern. */\nexport interface ConditionAssertion {\n id: string;\n /** Display date the assertion was made, e.g. \"2023-06-14\" */\n date: string;\n /** Free-text condition name — the only hard-required clinical field */\n text: string;\n coding?: ConditionCoding[];\n verificationStatus: VerificationStatus;\n /** How this assertion relates to the one it supersedes */\n changeType?: AssertionChangeType;\n /** Id of the assertion this one supersedes */\n supersedes?: string;\n severity?: 'mild' | 'moderate' | 'severe';\n /** Onset — exact date and/or fuzzy human string (\"since her twenties\") */\n onset?: { date?: string; fuzzy?: string };\n /** First-class uncertainty (§4 of the design doc) */\n uncertainty?: Uncertainty;\n note?: string;\n}\n\n/** Relationship between two concerns. */\nexport interface ConcernRelationship {\n type:\n | 'caused-by'\n | 'evolved-from'\n | 'differential-sibling'\n | 'complication-of';\n /** concernId of the related concern */\n concernId: string;\n /** Display name of the related concern */\n display?: string;\n}\n\n/** A quick, dated progress note about a concern — lighter than an assertion. */\nexport interface ConditionObservation {\n id: string;\n /** Display date, e.g. \"2026-07-03\" */\n date: string;\n text: string;\n author?: string;\n}\n\n/**\n * A stable problem thread. The concernId is the durable identity that orders\n * and encounters reference; assertions carry the evolving codes.\n */\nexport interface ConditionConcern {\n concernId: string;\n clinicalStatus: ConcernStatus;\n /** Ordered oldest → newest; the last non-refuted assertion is current */\n assertions: ConditionAssertion[];\n /** Quick progress notes over time (newest last) */\n observations?: ConditionObservation[];\n relationships?: ConcernRelationship[];\n /** Where the concern came from */\n source?:\n | 'ehrProblemList'\n | 'patientReported'\n | 'manuallyAdded'\n | 'claimsHistory';\n}\n\n/** Row actions on a concern. */\nexport type ProblemListAction =\n | 'open'\n | 'observe'\n | 'refine'\n | 'revise'\n | 'resolve'\n | 'relate'\n | 'remove'\n | 'move-up'\n | 'move-down';\n\nexport interface ProblemListProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n 'className' | 'title'\n> {\n /** Patient-level concerns (controlled) */\n concerns: ConditionConcern[];\n /** Header title (pass null to hide) */\n title?: string | null;\n /** Called when a row action is clicked */\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n /** Called when a new problem is added via the capture-first input */\n onAddProblem?: (text: string) => void;\n /**\n * Called with the full ordered list of concernIds after a move — via drag\n * and drop, the move buttons, or Alt+Arrow keys. Enables reordering. The\n * component renders concerns in props order — persist the ids wherever the\n * encounter/patient object lives and feed them back in.\n */\n onReorder?: (concernIds: string[]) => void;\n /** Which row actions to show (default: all except 'remove') */\n actions?: ProblemListAction[];\n /** Show row actions in flow, always visible, instead of the hover-reveal overlay */\n inlineActions?: boolean;\n /** Hide all action buttons (display only) */\n readOnly?: boolean;\n /** Message shown when there are no concerns */\n emptyMessage?: string;\n /** Additional CSS classes */\n className?: string;\n /** Test ID for testing */\n 'data-testid'?: string;\n}\n\n// =============================================================================\n// Constants\n// =============================================================================\n\nconst GROUP_ORDER: { key: string; label: string; statuses: ConcernStatus[] }[] =\n [\n {\n key: 'active',\n label: 'Active',\n statuses: ['active', 'recurrence', 'relapse'],\n },\n { key: 'inactive', label: 'Inactive', statuses: ['inactive', 'remission'] },\n { key: 'resolved', label: 'Resolved', statuses: ['resolved'] },\n ];\n\n/**\n * Grouping key for a concern. Unconfirmed concerns (current assertion not yet\n * verified) live in their own group, separate from Active / Resolved.\n */\nexport function concernGroupKey(concern: ConditionConcern): string {\n if (currentAssertion(concern)?.verificationStatus === 'unconfirmed') {\n return 'unconfirmed';\n }\n return (\n GROUP_ORDER.find((g) => g.statuses.includes(concern.clinicalStatus))?.key ??\n 'active'\n );\n}\n\nexport const CONCERN_STATUS_LABELS: Record<ConcernStatus, string> = {\n active: 'Active',\n recurrence: 'Recurrence',\n relapse: 'Relapse',\n inactive: 'Inactive',\n remission: 'Remission',\n resolved: 'Resolved',\n};\n\nexport const CHANGE_TYPE_LABELS: Record<AssertionChangeType, string> = {\n refinement: 'Refined',\n revision: 'Revised',\n progression: 'Progressed',\n reattribution: 'Re-attributed',\n};\n\nconst DEFAULT_ACTIONS: ProblemListAction[] = [\n 'open',\n 'observe',\n 'refine',\n 'revise',\n 'resolve',\n 'relate',\n 'move-up',\n 'move-down',\n];\n\nconst ACTION_META: Record<\n ProblemListAction,\n { label: string; icon: React.ComponentType<{ size?: number | string }> }\n> = {\n open: { label: 'Open', icon: ExternalLinkIcon },\n observe: { label: 'Add observation (progress note)', icon: StickyNoteIcon },\n refine: { label: 'Refine (more specific)', icon: PencilIcon },\n revise: { label: 'Revise (prior was wrong)', icon: RefreshIcon },\n resolve: { label: 'Resolve', icon: CheckCircleIcon },\n relate: { label: 'Relate to another problem', icon: LinkIcon },\n remove: { label: 'Delete', icon: TrashIcon },\n 'move-up': { label: 'Move up (Alt+↑)', icon: ChevronUpIcon },\n 'move-down': { label: 'Move down (Alt+↓)', icon: ChevronDownIcon },\n};\n\nconst VERIFICATION_BADGE: Record<\n VerificationStatus,\n {\n label: string;\n variant: 'default' | 'secondary' | 'success' | 'warning' | 'outline';\n }\n> = {\n unconfirmed: { label: 'Unconfirmed', variant: 'outline' },\n provisional: { label: 'Provisional', variant: 'warning' },\n differential: { label: 'Differential', variant: 'warning' },\n confirmed: { label: 'Confirmed', variant: 'success' },\n refuted: { label: 'Refuted', variant: 'secondary' },\n 'entered-in-error': { label: 'Entered in error', variant: 'secondary' },\n};\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** The current (last non-refuted, non-error) assertion of a concern. */\nexport function currentAssertion(\n concern: ConditionConcern\n): ConditionAssertion | undefined {\n for (let i = concern.assertions.length - 1; i >= 0; i--) {\n const a = concern.assertions[i];\n if (\n a.verificationStatus !== 'refuted' &&\n a.verificationStatus !== 'entered-in-error'\n ) {\n return a;\n }\n }\n return concern.assertions[concern.assertions.length - 1];\n}\n\nconst UNCERTAIN_FIELD_LABELS: Record<UncertainConditionField, string> = {\n coding: 'Coding',\n onset: 'Onset',\n severity: 'Severity',\n laterality: 'Laterality',\n bodySite: 'Body site',\n};\n\nfunction describeFieldUncertainty(\n field: UncertainConditionField,\n f: FieldUncertainty,\n m: MessageTranslator\n): string {\n const label = UNCERTAIN_FIELD_LABELS[field];\n if (!f.known) {\n const reason =\n f.reason === 'asked-unknown'\n ? 'asked — unknown'\n : (f.reason ?? 'unknown').replace(/-/g, ' ');\n return `${m(label)}: ${m(reason)}${f.note ? ` (${f.note})` : ''}`;\n }\n return `${m(label)}: ${m('{confidence} confidence', {\n confidence: m(f.confidence ?? 'uncertain'),\n })}${f.note ? ` (${f.note})` : ''}`;\n}\n\n// =============================================================================\n// Sub-components\n// =============================================================================\n\n/**\n * Parenthetical coding display. Clinicians don't need chip noise: inline we\n * show only ICD-10/ICD-11 codes, unlabeled (the code format is obvious), and\n * SNOMED stays out of the way. The full coding background — every system,\n * display name, and crosswalk provenance — lives in the tooltip.\n */\nexport function CodingChips({ coding }: { coding?: ConditionCoding[] }) {\n const m = useMessages();\n if (!coding?.length) return null;\n const icd = coding.filter((c) => c.system.startsWith('ICD'));\n const inline = icd.length > 0 ? icd : coding.filter((c) => c.primary);\n const label = inline.map((c) => c.code).join(', ');\n return (\n <Tooltip\n content={\n <span className=\"flex flex-col gap-0.5\">\n {coding.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n {c.primary ? m(' · primary') : ''}\n {c.mappedFrom\n ? m(' · mapped from {source}', { source: c.mappedFrom })\n : ''}\n </span>\n ))}\n </span>\n }\n >\n {/* focusable so the coding provenance is reachable by keyboard */}\n <span\n // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex\n tabIndex={0}\n className=\"text-muted-foreground focus-visible:ring-ring rounded text-xs whitespace-nowrap focus-visible:ring-2 focus-visible:outline-none\"\n >\n ({label || m('coded')})\n </span>\n </Tooltip>\n );\n}\n\n/**\n * Full concern background for a hover/long-press tooltip: assertion history,\n * coding background, and recent observations.\n */\nexport function concernHistoryContent(\n concern: ConditionConcern,\n m: MessageTranslator = (message) => message\n): React.ReactNode {\n return (\n <span className=\"flex max-w-xs flex-col gap-1\">\n <span className=\"font-semibold\">{m('History')}</span>\n {[...concern.assertions].reverse().map((a) => (\n <span key={a.id}>\n {a.date} — {a.text}\n {a.changeType\n ? ` (${m(CHANGE_TYPE_LABELS[a.changeType]).toLocaleLowerCase()})`\n : ''}\n {a.verificationStatus === 'refuted'\n ? ` — ${m('Refuted').toLocaleLowerCase()}`\n : ''}\n </span>\n ))}\n {concern.observations && concern.observations.length > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Observations')}</span>\n {[...concern.observations]\n .reverse()\n .slice(0, 3)\n .map((o) => (\n <span key={o.id}>\n {o.date} — {o.text}\n </span>\n ))}\n </>\n )}\n {(currentAssertion(concern)?.coding?.length ?? 0) > 0 && (\n <>\n <span className=\"mt-1 font-semibold\">{m('Coding')}</span>\n {currentAssertion(concern)!.coding!.map((c) => (\n <span key={`${c.system}:${c.code}`}>\n {c.system} {c.code}\n {c.display ? ` — ${c.display}` : ''}\n </span>\n ))}\n </>\n )}\n </span>\n );\n}\n\n/** Badge summarizing an assertion's uncertainty block (§4 of the design doc). */\nexport function UncertaintyBadge({\n uncertainty,\n}: {\n uncertainty?: Uncertainty;\n}) {\n const m = useMessages();\n if (!uncertainty) return null;\n const fieldEntries = Object.entries(uncertainty.fields ?? {}) as Array<\n [UncertainConditionField, FieldUncertainty]\n >;\n const overall =\n uncertainty.overall && uncertainty.overall !== 'confirmed'\n ? uncertainty.overall\n : null;\n if (!overall && fieldEntries.length === 0) return null;\n const lines = [\n ...(overall\n ? [m('Overall certainty: {certainty}', { certainty: m(overall) })]\n : []),\n ...fieldEntries.map(([field, f]) => describeFieldUncertainty(field, f, m)),\n ];\n return (\n <Tooltip content={lines.join(' · ')}>\n <Badge variant=\"warning\" size=\"sm\" className=\"gap-1\">\n <HelpCircleIcon size={10} />\n {overall\n ? m('{certainty} certainty', { certainty: m(overall) })\n : m('{count} uncertain', { count: fieldEntries.length })}\n </Badge>\n </Tooltip>\n );\n}\n\nfunction AssertionTimeline({ concern }: { concern: ConditionConcern }) {\n const m = useMessages();\n const items = [...concern.assertions].reverse(); // newest first\n return (\n <ol\n aria-label={m('Assertion history')}\n className=\"border-border ms-1.5 mt-2 space-y-2 border-s ps-4\"\n >\n {items.map((a) => {\n const refuted =\n a.verificationStatus === 'refuted' ||\n a.verificationStatus === 'entered-in-error';\n const verification = VERIFICATION_BADGE[a.verificationStatus];\n return (\n <li key={a.id} className=\"relative text-sm\">\n <span\n aria-hidden\n className=\"bg-border absolute -start-5 top-1.5 h-2 w-2 rounded-full\"\n />\n <span className=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {a.date}\n </span>\n <span\n className={cn(\n 'text-foreground font-medium',\n refuted && 'text-muted-foreground line-through'\n )}\n >\n {a.text}\n </span>\n {a.changeType && (\n <Badge variant=\"secondary\" size=\"sm\">\n {m(CHANGE_TYPE_LABELS[a.changeType])}\n </Badge>\n )}\n <Badge variant={verification.variant} size=\"sm\">\n {m(verification.label)}\n </Badge>\n <UncertaintyBadge uncertainty={a.uncertainty} />\n <CodingChips coding={a.coding} />\n </span>\n {a.note && (\n <p className=\"text-muted-foreground mt-0.5 text-xs\">{a.note}</p>\n )}\n </li>\n );\n })}\n </ol>\n );\n}\n\nfunction ConcernRow({\n concern,\n actions,\n inlineActions,\n readOnly,\n canReorder,\n drag,\n onAction,\n}: {\n concern: ConditionConcern;\n actions: ProblemListAction[];\n inlineActions: boolean;\n readOnly: boolean;\n canReorder: boolean;\n drag: UseDragReorderReturn;\n onAction?: (concern: ConditionConcern, action: ProblemListAction) => void;\n}) {\n const m = useMessages();\n const [expanded, setExpanded] = React.useState(false);\n const current = currentAssertion(concern);\n const hasHistory = concern.assertions.length > 1;\n\n const visibleActions = actions.filter(\n (a) => canReorder || (a !== 'move-up' && a !== 'move-down')\n );\n\n const handleRowKeyDown = (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.target !== e.currentTarget) return;\n if (e.altKey && (e.key === 'ArrowUp' || e.key === 'ArrowDown')) {\n if (!canReorder) return;\n e.preventDefault();\n onAction?.(concern, e.key === 'ArrowUp' ? 'move-up' : 'move-down');\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n // Roving focus between rows\n e.preventDefault();\n const list = e.currentTarget.closest('ul');\n if (!list) return;\n const rows = Array.from(\n list.querySelectorAll<HTMLElement>('li[data-concern-id]')\n );\n const i = rows.indexOf(e.currentTarget as HTMLElement);\n rows[\n e.key === 'ArrowUp'\n ? Math.max(0, i - 1)\n : Math.min(rows.length - 1, i + 1)\n ]?.focus();\n } else if ((e.key === 'Enter' || e.key === ' ') && hasHistory) {\n e.preventDefault();\n setExpanded((v) => !v);\n }\n };\n\n if (!current) return null;\n\n return (\n // Roving-focus row (WAI-ARIA listbox-like keyboard pattern): the row is a\n // legitimate focus stop so ↑/↓ navigate rows, Enter toggles history, and\n // Alt+↑/↓ reorders — required for 508 keyboard operability.\n /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */\n <li\n data-slot=\"clinical-list-row\"\n data-concern-id={concern.concernId}\n tabIndex={0}\n onKeyDown={handleRowKeyDown}\n {...drag.rowProps(concern.concernId)}\n aria-label={[\n `${current.text}.`,\n hasHistory ? m('Press Enter to toggle history.') : '',\n canReorder ? m('Alt plus arrow keys to reorder.') : '',\n ]\n .filter(Boolean)\n .join(' ')}\n className={cn(\n 'group border-border/60 relative border-b px-1 py-2',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:outline-none',\n drag.enabled && 'cursor-grab active:cursor-grabbing',\n dragIndicatorClasses(drag, concern.concernId)\n )}\n >\n {/* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/no-noninteractive-tabindex */}\n <div className=\"flex min-h-9 flex-wrap items-center gap-x-2 gap-y-1\">\n {drag.enabled ? (\n <GripVerticalIcon\n size={14}\n aria-hidden\n className=\"text-muted-foreground/50 shrink-0\"\n />\n ) : (\n <span className=\"text-muted-foreground/60 select-none\">•</span>\n )}\n {/* Hover (or long-press on touch) the name for the complete background:\n assertion history, observations, and coding provenance. */}\n <Tooltip content={concernHistoryContent(concern, m)}>\n <span className=\"text-foreground font-medium\">{current.text}</span>\n </Tooltip>\n <CodingChips coding={current.coding} />\n {/* 'unconfirmed' is conveyed by the Unconfirmed group header */}\n {current.verificationStatus !== 'confirmed' &&\n current.verificationStatus !== 'unconfirmed' && (\n <Badge\n variant={VERIFICATION_BADGE[current.verificationStatus].variant}\n size=\"sm\"\n >\n {m(VERIFICATION_BADGE[current.verificationStatus].label)}\n </Badge>\n )}\n <UncertaintyBadge uncertainty={current.uncertainty} />\n {concern.relationships?.map((r) => (\n <Badge key={`${r.type}:${r.concernId}`} variant=\"outline\" size=\"sm\">\n <LinkIcon size={10} className=\"me-1\" />\n {m(r.type.replace(/-/g, ' '))}\n {r.display ? `: ${r.display}` : ''}\n </Badge>\n ))}\n {hasHistory && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => setExpanded((v) => !v)}\n aria-expanded={expanded}\n leftIcon={<HistoryIcon size={12} />}\n rightIcon={\n expanded ? (\n <ChevronUpIcon size={12} />\n ) : (\n <ChevronDownIcon size={12} />\n )\n }\n className=\"text-muted-foreground h-auto px-1.5 py-0.5 text-xs\"\n >\n {m('{count} assertions', { count: concern.assertions.length })}\n </Button>\n )}\n\n {!readOnly && (\n <RowActionToolbar\n label={m('Actions for {name}', { name: current.text })}\n align=\"top\"\n reveal={inlineActions ? 'always' : 'hover'}\n >\n {visibleActions.map((action) => (\n <RowIconButton\n key={action}\n label={m(ACTION_META[action].label)}\n icon={ACTION_META[action].icon}\n onClick={() => onAction?.(concern, action)}\n />\n ))}\n </RowActionToolbar>\n )}\n </div>\n\n {expanded && (\n <>\n <AssertionTimeline concern={concern} />\n {concern.observations && concern.observations.length > 0 && (\n <div className=\"ms-1.5 mt-2 ps-4\">\n <h5 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {m('Observations')}\n </h5>\n <ol aria-label={m('Observations')} className=\"mt-1 space-y-1\">\n {[...concern.observations].reverse().map((o) => (\n <li key={o.id} className=\"flex flex-wrap gap-x-2 text-sm\">\n <span className=\"text-muted-foreground text-xs tabular-nums\">\n {o.date}\n </span>\n <span className=\"text-foreground\">{o.text}</span>\n {o.author && (\n <span className=\"text-muted-foreground text-xs\">\n — {o.author}\n </span>\n )}\n </li>\n ))}\n </ol>\n </div>\n )}\n </>\n )}\n </li>\n );\n}\n\n// =============================================================================\n// ProblemList\n// =============================================================================\n\n/**\n * Patient-level problem list built on the concern/assertion model: each row is\n * a stable ConditionConcern whose coded characterization evolves through an\n * assertion history (refinement / revision / progression). Rows expand to show\n * the assertion timeline; refuted assertions render struck-through.\n *\n * Controlled component: concerns come in via props; every user interaction is\n * reported through callbacks.\n *\n * @example\n * ```tsx\n * <ProblemList\n * concerns={concerns}\n * onAction={(concern, action) => handleAction(concern, action)}\n * onAddProblem={(text) => addConcern(text)}\n * />\n * ```\n */\nexport const ProblemList = React.forwardRef<HTMLDivElement, ProblemListProps>(\n (\n {\n concerns,\n title = 'Problem list',\n onAction,\n onAddProblem,\n onReorder,\n actions = DEFAULT_ACTIONS,\n inlineActions = false,\n readOnly = false,\n emptyMessage = 'No problems recorded.',\n className,\n 'data-testid': dataTestId,\n ...props\n },\n ref\n ) => {\n const m = useMessages();\n const [draft, setDraft] = React.useState('');\n // clears-then-sets so repeated identical messages re-announce\n const [announcement, setAnnouncement] = useLiveAnnouncement();\n\n const submitDraft = () => {\n const text = draft.trim();\n if (!text) return;\n onAddProblem?.(text);\n setDraft('');\n };\n\n /** Swap with the adjacent concern in the same group, then report the full order. */\n const moveConcern = React.useCallback(\n (concern: ConditionConcern, dir: -1 | 1) => {\n if (!onReorder || readOnly) return;\n const groupKey = concernGroupKey(concern);\n const ids = concerns.map((c) => c.concernId);\n const from = ids.indexOf(concern.concernId);\n // nearest neighbor in the same group\n let to = from + dir;\n while (\n to >= 0 &&\n to < concerns.length &&\n concernGroupKey(concerns[to]) !== groupKey\n ) {\n to += dir;\n }\n if (to < 0 || to >= concerns.length) return;\n [ids[from], ids[to]] = [ids[to], ids[from]];\n const current = currentAssertion(concern);\n setAnnouncement(\n m(dir === -1 ? '{name} moved up' : '{name} moved down', {\n name: current?.text ?? concern.concernId,\n })\n );\n onReorder(ids);\n },\n [concerns, onReorder, readOnly, setAnnouncement, m]\n );\n\n const handleAction = React.useCallback(\n (concern: ConditionConcern, action: ProblemListAction) => {\n if (action === 'move-up') moveConcern(concern, -1);\n else if (action === 'move-down') moveConcern(concern, 1);\n else onAction?.(concern, action);\n },\n [moveConcern, onAction]\n );\n\n // Drag & drop reordering, restricted to the same group (a cross-group\n // drop would silently imply a status change). Precomputed map — dragover\n // fires too frequently for a linear concern scan per event.\n const groupById = React.useMemo(\n () =>\n new Map(\n concerns.map((c) => [c.concernId, concernGroupKey(c)] as const)\n ),\n [concerns]\n );\n const groupOf = React.useCallback(\n (id: string) => groupById.get(id),\n [groupById]\n );\n const drag = useDragReorder({\n ids: concerns.map((c) => c.concernId),\n onReorder:\n readOnly || !onReorder\n ? undefined\n : (newIds) => {\n // announce pointer drops too, not just keyboard moves\n setAnnouncement(m('Problem list reordered'));\n onReorder(newIds);\n },\n canDropOn: (dragged, target) => groupOf(dragged) === groupOf(target),\n });\n\n // Unconfirmed concerns get their own list, ahead of Active / Resolved.\n const groups = [\n {\n key: 'unconfirmed',\n label: 'Unconfirmed',\n items: concerns.filter((c) => concernGroupKey(c) === 'unconfirmed'),\n },\n ...GROUP_ORDER.map(({ key, label }) => ({\n key,\n label,\n items: concerns.filter((c) => concernGroupKey(c) === key),\n })),\n // Active stays visible as the empty state only when nothing is recorded\n // at all — an empty Active section next to populated groups would\n // misleadingly read \"No problems recorded\".\n ].filter(\n (g) => g.items.length > 0 || (g.key === 'active' && concerns.length === 0)\n );\n\n return (\n <Card\n ref={ref}\n padding=\"none\"\n className={cn('w-full', className)}\n data-testid={dataTestId}\n {...props}\n >\n {title !== null && (\n <CardHeader className=\"border-border bg-muted/50 border-b px-4 py-3\">\n <h3 className=\"text-foreground text-sm font-semibold tracking-wide uppercase\">\n {m(title)}\n </h3>\n </CardHeader>\n )}\n\n <CardContent className=\"space-y-6 px-4 py-4\">\n {groups.map(({ key, label, items }) => (\n <section key={key} aria-label={m(label)}>\n <h4\n data-slot=\"clinical-list-heading\"\n className=\"border-border text-foreground border-b pb-1 text-sm font-semibold tracking-wide uppercase\"\n >\n {m(label)}\n </h4>\n {items.length > 0 ? (\n <ul className=\"mt-1\">\n {items.map((concern) => (\n <ConcernRow\n key={concern.concernId}\n concern={concern}\n actions={actions}\n inlineActions={inlineActions}\n readOnly={readOnly}\n canReorder={drag.enabled}\n drag={drag}\n onAction={handleAction}\n />\n ))}\n </ul>\n ) : (\n <p className=\"text-muted-foreground mt-2 text-sm\">\n {m(emptyMessage)}\n </p>\n )}\n </section>\n ))}\n\n {!readOnly && onAddProblem && (\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n data-slot=\"input\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') submitDraft();\n }}\n placeholder={m('Add problem (name is enough)…')}\n aria-label={m('Add problem')}\n className={cn(\n 'border-border bg-background text-foreground placeholder:text-muted-foreground',\n 'h-8 flex-1 rounded-md border px-2.5 text-sm',\n 'focus:ring-ring focus:ring-2 focus:outline-none'\n )}\n />\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={submitDraft}\n disabled={!draft.trim()}\n leftIcon={<PlusIcon size={12} />}\n className=\"h-8\"\n >\n {m('Add')}\n </Button>\n </div>\n )}\n </CardContent>\n\n {/* Reorder announcements for screen readers */}\n <div aria-live=\"polite\" className=\"sr-only\">\n {announcement}\n </div>\n </Card>\n );\n }\n);\n\nProblemList.displayName = 'ProblemList';\n\nexport default ProblemList;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { RichTextEditor } from './chunk-
|
|
1
|
+
import { RichTextEditor } from './chunk-JN2CL7MK.js';
|
|
2
2
|
import { RequiredMark } from './chunk-3IMM2PM4.js';
|
|
3
3
|
import { cn } from './chunk-TQONQSJO.js';
|
|
4
4
|
import * as React2 from 'react';
|
|
@@ -798,5 +798,5 @@ var Textarea = React2.forwardRef(
|
|
|
798
798
|
Textarea.displayName = "Textarea";
|
|
799
799
|
|
|
800
800
|
export { TextAreaPlain, TextAreaRich, Textarea, htmlToPlain, plainToHtml, textareaVariants };
|
|
801
|
-
//# sourceMappingURL=chunk-
|
|
802
|
-
//# sourceMappingURL=chunk-
|
|
801
|
+
//# sourceMappingURL=chunk-L52HKEUD.js.map
|
|
802
|
+
//# sourceMappingURL=chunk-L52HKEUD.js.map
|