@arbidocs/blocks 0.4.125 → 0.4.127

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/{NativeDocxEditor-2JTZNFKD.cjs → NativeDocxEditor-BE2OEOTJ.cjs} +7 -7
  2. package/dist/{NativeDocxEditor-2JTZNFKD.cjs.map → NativeDocxEditor-BE2OEOTJ.cjs.map} +1 -1
  3. package/dist/{NativeDocxEditor-QIWYQDIO.js → NativeDocxEditor-KOPFMRYW.js} +3 -3
  4. package/dist/{NativeDocxEditor-QIWYQDIO.js.map → NativeDocxEditor-KOPFMRYW.js.map} +1 -1
  5. package/dist/{StreamedArtifactEditor-DNBDUNP2.cjs → StreamedArtifactEditor-EEYAXJ4H.cjs} +5 -5
  6. package/dist/{StreamedArtifactEditor-DNBDUNP2.cjs.map → StreamedArtifactEditor-EEYAXJ4H.cjs.map} +1 -1
  7. package/dist/{StreamedArtifactEditor-WDHPTWX7.js → StreamedArtifactEditor-TDATDYD2.js} +3 -3
  8. package/dist/{StreamedArtifactEditor-WDHPTWX7.js.map → StreamedArtifactEditor-TDATDYD2.js.map} +1 -1
  9. package/dist/agents/index.cjs +302 -302
  10. package/dist/agents/index.js +10 -10
  11. package/dist/agents/workflows/StepParts.d.ts +3 -3
  12. package/dist/artifacts/VersionTimeline.d.ts +19 -1
  13. package/dist/artifacts/index.cjs +21 -21
  14. package/dist/artifacts/index.d.ts +1 -1
  15. package/dist/artifacts/index.js +1 -1
  16. package/dist/calls/index.cjs +3 -3
  17. package/dist/calls/index.js +2 -2
  18. package/dist/chat/index.cjs +135 -135
  19. package/dist/chat/index.js +4 -4
  20. package/dist/{chunk-7HAM7Y5U.js → chunk-2DFDFOM7.js} +3 -3
  21. package/dist/{chunk-7HAM7Y5U.js.map → chunk-2DFDFOM7.js.map} +1 -1
  22. package/dist/{chunk-BDSKKIFZ.js → chunk-2FL7QJKJ.js} +3 -3
  23. package/dist/{chunk-BDSKKIFZ.js.map → chunk-2FL7QJKJ.js.map} +1 -1
  24. package/dist/{chunk-ERNMU6RV.js → chunk-2PNNCEPH.js} +5 -5
  25. package/dist/chunk-2PNNCEPH.js.map +1 -0
  26. package/dist/{chunk-KUW4ATIC.cjs → chunk-4TR5QCCX.cjs} +5 -5
  27. package/dist/{chunk-KUW4ATIC.cjs.map → chunk-4TR5QCCX.cjs.map} +1 -1
  28. package/dist/{chunk-P5ST47VY.js → chunk-5Y7JRY7Y.js} +3 -3
  29. package/dist/{chunk-P5ST47VY.js.map → chunk-5Y7JRY7Y.js.map} +1 -1
  30. package/dist/{chunk-HM23LXUP.cjs → chunk-6AALMYPS.cjs} +3 -3
  31. package/dist/{chunk-HM23LXUP.cjs.map → chunk-6AALMYPS.cjs.map} +1 -1
  32. package/dist/{chunk-IXTQYFIF.js → chunk-6HCJ3ZEU.js} +34 -6
  33. package/dist/chunk-6HCJ3ZEU.js.map +1 -0
  34. package/dist/{chunk-SHASZLGD.js → chunk-6Z72CXZR.js} +3 -3
  35. package/dist/{chunk-SHASZLGD.js.map → chunk-6Z72CXZR.js.map} +1 -1
  36. package/dist/{chunk-N7ARMX3O.cjs → chunk-DZI7WOUD.cjs} +4 -4
  37. package/dist/{chunk-N7ARMX3O.cjs.map → chunk-DZI7WOUD.cjs.map} +1 -1
  38. package/dist/{chunk-JJLMCV3T.js → chunk-ECERC6TI.js} +32 -28
  39. package/dist/chunk-ECERC6TI.js.map +1 -0
  40. package/dist/{chunk-ETN5EZI4.js → chunk-ENDP7JER.js} +3 -3
  41. package/dist/{chunk-ETN5EZI4.js.map → chunk-ENDP7JER.js.map} +1 -1
  42. package/dist/{chunk-W4GXDARU.cjs → chunk-INW76PEL.cjs} +163 -110
  43. package/dist/chunk-INW76PEL.cjs.map +1 -0
  44. package/dist/{chunk-OTDGTBAS.js → chunk-KELGOCJA.js} +164 -111
  45. package/dist/chunk-KELGOCJA.js.map +1 -0
  46. package/dist/{chunk-WEUCLOBB.cjs → chunk-KYDRUFWT.cjs} +5 -5
  47. package/dist/{chunk-WEUCLOBB.cjs.map → chunk-KYDRUFWT.cjs.map} +1 -1
  48. package/dist/{chunk-D72GGCXN.js → chunk-MCKOZACC.js} +3 -3
  49. package/dist/{chunk-D72GGCXN.js.map → chunk-MCKOZACC.js.map} +1 -1
  50. package/dist/{chunk-SA7TN3AW.cjs → chunk-MCPRNDOJ.cjs} +78 -78
  51. package/dist/{chunk-SA7TN3AW.cjs.map → chunk-MCPRNDOJ.cjs.map} +1 -1
  52. package/dist/{chunk-ZV3BKLFY.cjs → chunk-NYHGG2IA.cjs} +3 -3
  53. package/dist/{chunk-ZV3BKLFY.cjs.map → chunk-NYHGG2IA.cjs.map} +1 -1
  54. package/dist/{chunk-U6MPHCEB.cjs → chunk-O6IEZDRC.cjs} +33 -5
  55. package/dist/chunk-O6IEZDRC.cjs.map +1 -0
  56. package/dist/{chunk-WV4IDVDQ.cjs → chunk-PJJY6CYL.cjs} +11 -11
  57. package/dist/{chunk-WV4IDVDQ.cjs.map → chunk-PJJY6CYL.cjs.map} +1 -1
  58. package/dist/{chunk-CXLVI3SB.js → chunk-PUCY3UXN.js} +3 -3
  59. package/dist/{chunk-CXLVI3SB.js.map → chunk-PUCY3UXN.js.map} +1 -1
  60. package/dist/{chunk-MRURIBBB.cjs → chunk-SARREDFP.cjs} +47 -47
  61. package/dist/chunk-SARREDFP.cjs.map +1 -0
  62. package/dist/{chunk-565NYAM2.js → chunk-T2CVFK2I.js} +10 -10
  63. package/dist/{chunk-565NYAM2.js.map → chunk-T2CVFK2I.js.map} +1 -1
  64. package/dist/{chunk-HQH35JWC.js → chunk-T6I6ZCBE.js} +3 -3
  65. package/dist/{chunk-HQH35JWC.js.map → chunk-T6I6ZCBE.js.map} +1 -1
  66. package/dist/{chunk-Y4X3RBFI.js → chunk-UUXKB3WQ.js} +3 -3
  67. package/dist/{chunk-Y4X3RBFI.js.map → chunk-UUXKB3WQ.js.map} +1 -1
  68. package/dist/{chunk-JSH43QMZ.cjs → chunk-V5OAXIBN.cjs} +3 -3
  69. package/dist/{chunk-JSH43QMZ.cjs.map → chunk-V5OAXIBN.cjs.map} +1 -1
  70. package/dist/{chunk-VMZXFYHK.cjs → chunk-XFKF3WRN.cjs} +5 -5
  71. package/dist/{chunk-VMZXFYHK.cjs.map → chunk-XFKF3WRN.cjs.map} +1 -1
  72. package/dist/{chunk-GICUGQNN.cjs → chunk-ZAVEMQ37.cjs} +31 -27
  73. package/dist/chunk-ZAVEMQ37.cjs.map +1 -0
  74. package/dist/{chunk-4VCKYR4D.cjs → chunk-ZLRQ5K77.cjs} +4 -4
  75. package/dist/{chunk-4VCKYR4D.cjs.map → chunk-ZLRQ5K77.cjs.map} +1 -1
  76. package/dist/collaboration/index.cjs +23 -23
  77. package/dist/collaboration/index.js +1 -1
  78. package/dist/collaboration/mail/MailMessageView.d.ts +5 -1
  79. package/dist/connect/docx.cjs +6 -6
  80. package/dist/connect/docx.js +4 -4
  81. package/dist/connect/index.cjs +121 -66
  82. package/dist/connect/index.cjs.map +1 -1
  83. package/dist/connect/index.js +70 -15
  84. package/dist/connect/index.js.map +1 -1
  85. package/dist/connection/ConnectedWorkflowBuilder.d.ts +3 -0
  86. package/dist/document-tools/index.cjs +1 -1
  87. package/dist/document-tools/index.js +1 -1
  88. package/dist/docx/index.cjs +46 -46
  89. package/dist/docx/index.js +3 -3
  90. package/dist/facts/index.cjs +1 -1
  91. package/dist/facts/index.js +1 -1
  92. package/dist/files/HtmlViewerParts.d.ts +0 -28
  93. package/dist/files/index.cjs +19 -102
  94. package/dist/files/index.cjs.map +1 -1
  95. package/dist/files/index.d.ts +1 -1
  96. package/dist/files/index.js +6 -87
  97. package/dist/files/index.js.map +1 -1
  98. package/dist/home/index.cjs +17 -17
  99. package/dist/home/index.js +3 -3
  100. package/dist/index.cjs +641 -641
  101. package/dist/index.js +20 -20
  102. package/dist/settings/ConfirmDialog.d.ts +4 -1
  103. package/dist/settings/index.cjs +14 -14
  104. package/dist/settings/index.js +4 -4
  105. package/dist/studio/index.cjs +5 -5
  106. package/dist/studio/index.js +4 -4
  107. package/dist/workflow-canvas/index.cjs +64 -62
  108. package/dist/workflow-canvas/index.cjs.map +1 -1
  109. package/dist/workflow-canvas/index.js +13 -11
  110. package/dist/workflow-canvas/index.js.map +1 -1
  111. package/node_modules/@arbidocs/coedit/package.json +1 -1
  112. package/package.json +4 -4
  113. package/dist/chunk-ERNMU6RV.js.map +0 -1
  114. package/dist/chunk-GICUGQNN.cjs.map +0 -1
  115. package/dist/chunk-IXTQYFIF.js.map +0 -1
  116. package/dist/chunk-JJLMCV3T.js.map +0 -1
  117. package/dist/chunk-MRURIBBB.cjs.map +0 -1
  118. package/dist/chunk-OTDGTBAS.js.map +0 -1
  119. package/dist/chunk-U6MPHCEB.cjs.map +0 -1
  120. package/dist/chunk-W4GXDARU.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/artifacts/ArtifactCompareBar.tsx","../src/artifacts/ArtifactEditorBody.tsx","../src/artifacts/ArtifactToolbar.tsx","../src/artifacts/ArtifactVersionBar.tsx","../src/artifacts/ArtifactEditor.tsx","../src/artifacts/RedlineParts.tsx","../src/artifacts/ArtifactRedlineView.tsx","../src/artifacts/VersionTimeline.tsx"],"names":["jsx","cn","jsxs","Fragment","X","Button","GitCompare","Loader2","ArrowLeftRight","History","Eye"],"mappings":";;;;;;AAeO,IAAM,mCAAA,GAAgE;AAAA,EAC3E,SAAA,EAAW,aAAA;AAAA,EACX,YAAA,EAAc,eAAA;AAAA,EACd,gBAAA,EAAkB,gDAAA;AAAA,EAClB,gBAAA,EAAkB,0CAAA;AAAA,EAClB,cAAA,EAAgB,2BAAA;AAAA,EAChB,aAAA,EAAe;AACjB;AAqBA,IAAM,SAAA,GACJ,sPAAA;AAMK,SAAS,kBAAA,CAAmB;AAAA,EACjC,aAAA;AAAA,EACA,YAAA;AAAA,EACA,IAAA;AAAA,EACA,gBAAA;AAAA,EACA,oBAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,mCAAA,EAAqC,GAAG,MAAA,EAAO;AAC9D,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wCAAA,EAA0C,QAAA,EAAA,CAAA,CAAE,SAAA,EAAU,CAAA;AAAA,IACrE,aAAA;AAAA,IACA,YAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0CAA0C,QAAA,EAAA,YAAA,EAAa,CAAA;AAAA,IAExE,SAAS,eAAA,mBACR,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,oBAAA;AAAA,QACT,cAAA,EAAc,gBAAA;AAAA,QACd,SAAA,EAAW,EAAA;AAAA,UACT,SAAA;AAAA,UACA,mBACI,qDAAA,GACA;AAAA,SACN;AAAA,QACA,KAAA,EAAO,gBAAA,GAAmB,CAAA,CAAE,gBAAA,GAAmB,CAAA,CAAE,gBAAA;AAAA,QACjD,eAAa,QAAA,CAAS,OAAA,EAAS,cAAc,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,QAE9E,QAAA,EAAA;AAAA,UAAA,gBAAA,mBACC,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,IAAA,EAAC,CAAA,mBAEtC,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,UAAA,EAAW,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,UAE1C,CAAA,CAAE;AAAA;AAAA;AAAA,KACL,mBAEA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,SAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,OAAO,CAAA,CAAE,cAAA;AAAA,QACT,cAAY,CAAA,CAAE,cAAA;AAAA,QAEd,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAA,EAAU,UAAA,EAAW,eAAW,IAAA,EAAC;AAAA;AAAA,KACnD;AAAA,oBAEF,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,SAAA,EAAW,EAAA;AAAA,UACT,SAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,OAAO,CAAA,CAAE,aAAA;AAAA,QAET,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS,aAAA,EAAW,IAAA,EAAC,CAAA;AAAA,UACjC,CAAA,CAAE;AAAA;AAAA;AAAA;AACL,GAAA,EACF,CAAA;AAEJ;AChFO,SAAS,kBAAA,CAAmB;AAAA,EACjC,OAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,SAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,SAAA,GAAY,WAAA;AAAA,IAChB,CAAC,CAAA,KAAqC;AACpC,MAAA,IAAI,CAAC,SAAA,IAAa,CAAC,MAAA,EAAQ;AAC3B,MAAA,IAAA,CAAK,CAAA,CAAE,OAAA,IAAW,CAAA,CAAE,OAAA,KAAY,CAAC,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,GAAA,CAAI,WAAA,EAAY,KAAM,GAAA,EAAK;AACxE,QAAA,CAAA,CAAE,cAAA,EAAe;AACjB,QAAA,IAAI,SAAS,MAAA,EAAO;AAAA,MACtB;AAAA,IACF,CAAA;AAAA,IACA,CAAC,SAAA,EAAW,MAAA,EAAQ,OAAO;AAAA,GAC7B;AAEA,EAAA,MAAM,QAAA,GAAW,aAAa,SAAA,IAAa,gBAAA;AAC3C,EAAA;AAAA;AAAA;AAAA,oBAGEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,eAAA;AAAA,QACV,SAAA,EAAWC,EAAAA,CAAG,8BAAA,EAAgC,SAAS,CAAA;AAAA,QACvD,SAAA;AAAA,QAEC,QAAA,EAAA,CAAC,4BACAD,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,KAAA;AAAA,YACV,WAAA,EAAU,mBAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,UAAU,EAAE,MAAA,EAAQ,8BAA8B,CAAA;AAAA,YAEhF,yBAAe,OAAO;AAAA;AAAA,SACzB,GACE,2BACFA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,QAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,cAAc,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AAAA,YAE7E,QAAA,EAAA;AAAA;AAAA,SACH,GAEA;AAAA;AAAA;AAEJ;AAEJ;ACpEO,IAAM,+BAAA,GAAyD;AAAA,EACpE,KAAA,EAAO,kBAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,WAAA,EAAa,gBAAA;AAAA,EACb,OAAA,EAAS,uBAAA;AAAA,EACT,YAAA,EAAc,sCAAA;AAAA,EACd,YAAA,EAAc,eAAA;AAAA,EACd,aAAA,EAAe,uBAAA;AAAA,EACf,SAAA,EAAW,oBAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,cAAA;AAAA,EACb,OAAA,EAAS;AACX;AAuCO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,YAAA,GAAe,KAAA;AAAA,EACf,WAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,+BAAA,EAAiC,GAAG,MAAA,EAAO;AAC1D,EAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,qBACbA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,cAAY,CAAA,CAAE,KAAA;AAAA,MACd,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAWC,EAAAA,CAAG,yBAAA,EAA2B,OAAA,IAAW,SAAS,SAAS,CAAA;AAAA,MAErE;AAAA;AAAA,GACH;AAGF,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,KAAA;AAAA,sBACLC,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,WAAA;AAAA,UACT,QAAA,EAAU,YAAA;AAAA,UACV,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAM,UAAU,MAAA,GAAS,IAAA;AAAA,UACzB,OAAO,CAAA,CAAE,IAAA;AAAA,UACT,cAAY,CAAA,CAAE,IAAA;AAAA,UACd,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,UACvE,SAAA,EAAU,iDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,YACtC,CAAC,2BAAWA,GAAAA,CAAC,UAAK,SAAA,EAAU,MAAA,EAAQ,YAAE,IAAA,EAAK;AAAA;AAAA;AAAA;AAC9C,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AAAA,oBACLE,IAAAA,CAAAC,QAAAA,EAAA,EAEG,QAAA,EAAA;AAAA,MAAA,CAAC,2BACAD,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,QAAA;AAAA,UACT,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,IAAA;AAAA,UACL,OAAO,CAAA,CAAE,WAAA;AAAA,UACT,eAAa,QAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,sBAAsB,CAAA;AAAA,UACvE,SAAA,EAAU,yBAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,IAACI,CAAAA,EAAA,EAAE,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,4BAClCJ,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAQ,YAAE,MAAA,EAAO;AAAA;AAAA;AAAA,OACnC;AAAA,MAED,8BACCE,IAAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAS,SAAA;AAAA,UACT,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAM,UAAU,MAAA,GAAS,IAAA;AAAA,UACzB,OAAO,CAAA,CAAE,YAAA;AAAA,UACT,cAAY,CAAA,CAAE,OAAA;AAAA,UACd,eAAa,QAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AAAA,UACpE,SAAA,EAAU,iDAAA;AAAA,UAEV,QAAA,EAAA;AAAA,4BAAAF,GAAAA,CAAC,UAAA,EAAA,EAAW,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,YAC1C,CAAC,2BAAWA,GAAAA,CAAC,UAAK,SAAA,EAAU,MAAA,EAAQ,YAAE,OAAA,EAAQ;AAAA;AAAA;AAAA,OACjD;AAAA,sBAEFE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,IAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,MAAA;AAAA,YACT,OAAA,EAAS,aAAa,SAAA,GAAY,SAAA;AAAA,YAClC,IAAA,EAAK,IAAA;AAAA,YACL,OAAO,UAAA,GAAc,OAAA,GAAU,EAAE,YAAA,GAAe,CAAA,CAAE,gBAAiB,CAAA,CAAE,SAAA;AAAA,YACrE,QAAA,EAAU,CAAC,UAAA,IAAc,QAAA;AAAA,YACzB,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,YACvE,SAAA,EAAU,yBAAA;AAAA,YAET,QAAA,EAAA;AAAA,cAAA,QAAA,mBACCF,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,uBAAsB,aAAA,EAAW,IAAA,EAAC,CAAA,mBAErDA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,8BAExCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAQ,QAAA,EAAA,QAAA,GAAW,CAAA,CAAE,MAAA,GAAS,OAAA,GAAU,CAAA,CAAE,IAAA,GAAO,CAAA,CAAE,WAAA,EAAY;AAAA;AAAA;AAAA,SACjF;AAAA,QACC,UAAA,IAAc,CAAC,QAAA,oBACdA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,kFAAA;AAAA,YACV,aAAA,EAAW,IAAA;AAAA,YACX,eAAa,QAAA,CAAS,OAAA,EAAS,YAAY,EAAE,MAAA,EAAQ,uBAAuB;AAAA;AAAA;AAC9E,OAAA,EAEJ,CAAA;AAAA,sBACAA,GAAAA,CAAC,MAAA,EAAA,EAAK,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,SAAA,EAC3B,QAAA,EAAA,UAAA,IAAc,CAAC,QAAA,GAAW,CAAA,CAAE,OAAA,GAAU,EAAA,EACzC;AAAA,KAAA,EACF;AAAA,GACF;AACF;AClKO,IAAM,mCAAA,GAAgE;AAAA,EAC3E,KAAA,EAAO,UAAA;AAAA,EACP,UAAU,CAAC,KAAA,EAAO,UAAU,CAAA,QAAA,EAAW,KAAK,OAAO,KAAK,CAAA,CAAA;AAAA,EACxD,IAAA,EAAM,WAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ,CAAC,KAAA,EAAO,IAAA,EAAM,SAAA,KAAc,CAAA,QAAA,EAAW,KAAK,CAAA,MAAA,EAAM,IAAI,CAAA,EAAG,SAAA,GAAY,SAAA,GAAY,EAAE,CAAA,CAAA;AAAA,EAC3F,OAAA,EAAS,uBAAA;AAAA,EACT,YAAA,EAAc;AAChB;AA8BO,SAAS,kBAAA,CAAmB;AAAA,EACjC,QAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA4B;AAC1B,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,mCAAA,EAAqC,GAAG,MAAA,EAAO;AAC9D,EAAA,MAAM,QAAQ,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AAC1D,EAAA,MAAM,QAAA,GAAW,KAAA,KAAU,QAAA,CAAS,MAAA,GAAS,CAAA;AAC7C,EAAA,uBACEE,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,OAAA;AAAA,MACL,cAAY,CAAA,CAAE,KAAA;AAAA,MACd,WAAA,EAAU,sBAAA;AAAA,MACV,SAAA,EAAWD,EAAAA,CAAG,mDAAA,EAAqD,SAAS,CAAA;AAAA,MAC5E,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,MAEvE,QAAA,EAAA;AAAA,wBAAAD,GAAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,uCAAA,EAAwC,eAAW,IAAA,EAAC,CAAA;AAAA,wBACvEA,GAAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,sCAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,UAAU,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,YAE/E,QAAA,EAAA,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,KAAA,IAAS,CAAA,GAAI,CAAA,CAAE,QAAA,CAAS,KAAA,GAAQ,CAAA,EAAG,QAAA,CAAS,MAAM,CAAA,GAAI,CAAA,CAAE;AAAA;AAAA,SAClF;AAAA,QACC,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,KAAA,IAAS,CAAA,IAAK,QAAA,oBACpCA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,wFAAA,EACb,QAAA,EAAA,CAAA,CAAE,MAAA,EACL,CAAA;AAAA,QAED,QAAA,CAAS,MAAA,GAAS,CAAA,oBACjBA,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,cAAY,CAAA,CAAE,MAAA;AAAA,YACd,KAAA,EAAO,SAAA;AAAA,YACP,UAAU,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,YACtC,SAAA,EAAU,4NAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,QAAQ,EAAE,MAAA,EAAQ,2BAA2B,CAAA;AAAA,YAE3E,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,qBAChBA,GAAAA,CAAC,QAAA,EAAA,EAAkB,KAAA,EAAO,CAAA,CAAE,EAAA,EACzB,QAAA,EAAA,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,IAAU,CAAA,GAAI,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,SAAS,CAAA,EAAG,CAAA,CAAE,EAAA,KAAO,SAAS,CAAA,EAAA,EAD7D,CAAA,CAAE,EAEf,CACD;AAAA;AAAA,SACH;AAAA,QAED,6BACCE,IAAAA;AAAA,UAACG,MAAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,OAAA;AAAA,YACR,IAAA,EAAK,IAAA;AAAA,YACL,OAAA,EAAS,SAAA;AAAA,YACT,OAAO,CAAA,CAAE,YAAA;AAAA,YACT,SAAA,EAAU,yBAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,4BAA4B,CAAA;AAAA,YAE9E,QAAA,EAAA;AAAA,8BAAAL,IAACM,UAAAA,EAAA,EAAW,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,8BAC3CN,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,MAAA,EAAQ,YAAE,OAAA,EAAQ;AAAA;AAAA;AAAA;AACpC;AAAA;AAAA,GAEJ;AAEJ;AChGO,IAAM,qCAAA,GAAoE;AAAA,EAC/E,SAAA,EAAW,wBAAA;AAAA,EACX,KAAA,EAAO,gDAAA;AAAA,EACP,KAAA,EAAO;AACT;AAqEA,IAAM,iBAAA,GAAoB,CAAC,GAAA,KAAwB;AACjD,EAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,GAAG,CAAA;AACzB,EAAA,OAAO,MAAA,CAAO,MAAM,IAAA,CAAK,OAAA,EAAS,CAAA,GAAI,GAAA,GAAM,KAAK,cAAA,EAAe;AAClE,CAAA;AAQO,SAAS,cAAA,CAAe;AAAA,EAC7B,OAAA;AAAA,EACA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,UAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA,GAAS,OAAA;AAAA,EACT,OAAA;AAAA,EACA,WAAW,EAAC;AAAA,EACZ,gBAAA,GAAmB,EAAA;AAAA,EACnB,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA,GAAa,iBAAA;AAAA,EACb,MAAA;AAAA,EACA,OAAA;AAAA,EACA,cAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,WAAW,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,OAAO,SAAS,CAAA;AAC7D,EAAA,MAAM,cAAc,MAAA,KAAW,OAAA;AAC/B,EAAA,MAAM,eAAe,EAAE,GAAG,qCAAA,EAAuC,GAAG,QAAQ,MAAA,EAAO;AACnF,EAAA,uBACEE,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAWD,EAAAA,CAAG,sDAAA,EAAwD,SAAS,CAAA;AAAA,MAC/E,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,mBAAmB,CAAA;AAAA,MAElE,QAAA,EAAA;AAAA,wBAAAC,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oFAAA,EACZ,QAAA,EAAA;AAAA,UAAA,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,aAAA,mBACtBF,GAAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,QAAA;AAAA,cACA,SAAA,EAAW,gBAAA;AAAA,cACX,UAAA;AAAA,cACA,MAAA,EAAQ,aAAA;AAAA,cAER,WAAW,UAAA,IAAc,CAAC,SAAA,IAAa,CAAC,cAAc,SAAA,GAAY,MAAA;AAAA,cAClE,QAAQ,MAAA,EAAQ,QAAA;AAAA,cAChB,SAAS,OAAA,EAAS;AAAA;AAAA,WACpB,mBAEAA,GAAAA,CAAC,MAAA,EAAA,EAAK,CAAA;AAAA,0BAERE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAF,GAAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,SAAA;AAAA,gBACA,OAAA;AAAA,gBACA,OAAA;AAAA,gBACA,UAAA;AAAA,gBACA,QAAA;AAAA,gBAEA,UAAA,EACE,cAAc,CAAC,WAAA,KAAgB,aAAa,EAAE,QAAA,CAAS,SAAS,CAAA,IAAK,aAAA,CAAA,CAAA;AAAA,gBAEvE,YAAA,EAAc,WAAA;AAAA,gBACd,WAAA;AAAA,gBACA,QAAA;AAAA,gBACA,SAAA;AAAA,gBACA,MAAA;AAAA,gBACA,QAAQ,MAAA,EAAQ;AAAA;AAAA,aAClB;AAAA,YACC;AAAA,WAAA,EACH;AAAA,SAAA,EACF,CAAA;AAAA,QACC,6BACCA,GAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,wEAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,YAAY,EAAE,MAAA,EAAQ,wBAAwB,CAAA;AAAA,YAE7E,QAAA,kBAAAA,GAAAA;AAAA,cAAC,kBAAA;AAAA,cAAA;AAAA,gBACC,aAAA,kBACEA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sDAAA,EACb,QAAA,EAAA,QAAA,IAAY,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,CAAE,IAAA,GAAO,EAAA,EAC7C,CAAA;AAAA,gBAEF,YAAA,EACE,QAAA,IAAY,CAAA,IAAK,QAAA,CAAS,MAAA,GAAS,CAAA,GAC/B,CAAA,CAAA,EAAI,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,IAAU,QAAA,GAAW,CAAC,CAAA,CAAA,GAC7C,IAAA;AAAA,gBAEN,IAAA,EAAK,eAAA;AAAA,gBACL,gBAAA;AAAA,gBACA,oBAAA;AAAA,gBACA,MAAA,EAAQ,aAAA;AAAA,gBACR,MAAA,EAAQ,aAAA;AAAA,gBACR,QAAQ,MAAA,EAAQ;AAAA;AAAA;AAClB;AAAA,SACF;AAAA,wBAEFA,IAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kBACZ,QAAA,EAAA,WAAA,GACC,MAAA,KAAW,0BACTE,IAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,OAAA;AAAA,YACL,SAAA,EAAU,gFAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,yBAAyB,CAAA;AAAA,YAEzE,QAAA,EAAA;AAAA,8BAAAF,GAAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,iBAAA,EAAmB,uBAAa,KAAA,EAAM,CAAA;AAAA,cAClD,2BACCA,GAAAA;AAAA,gBAACK,MAAAA;AAAA,gBAAA;AAAA,kBACC,OAAA,EAAQ,SAAA;AAAA,kBACR,IAAA,EAAK,IAAA;AAAA,kBACL,OAAA,EAAS,OAAA;AAAA,kBACT,SAAA,EAAU,yBAAA;AAAA,kBACV,eAAa,QAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,yBAAyB,CAAA;AAAA,kBAExE,QAAA,EAAA,YAAA,CAAa;AAAA;AAAA;AAChB;AAAA;AAAA,4BAIJH,IAAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAU,iFAAA;AAAA,YACV,eAAa,QAAA,CAAS,OAAA,EAAS,WAAW,EAAE,MAAA,EAAQ,6BAA6B,CAAA;AAAA,YAEjF,QAAA,EAAA;AAAA,8BAAAF,IAACO,OAAAA,EAAA,EAAQ,SAAA,EAAU,qBAAA,EAAsB,eAAW,IAAA,EAAC,CAAA;AAAA,cACpD,YAAA,CAAa;AAAA;AAAA;AAAA,4BAIlBP,GAAAA;AAAA,UAAC,kBAAA;AAAA,UAAA;AAAA,YACC,OAAA;AAAA,YACA,SAAA;AAAA,YACA,SAAA;AAAA,YACA,gBAAA;AAAA,YACA,MAAA;AAAA,YACA,OAAA;AAAA,YACA,cAAA;AAAA,YACA,MAAA;AAAA,YACA,OAAA,EAAS,cAAc,CAAC,QAAA;AAAA,YACxB,SAAS,OAAA,EAAS;AAAA;AAAA,SACpB,EAEJ;AAAA;AAAA;AAAA,GACF;AAEJ;AC5OO,IAAM,sBAAA,GAAwC;AAAA,EACnD,cAAA,EAAgB,iBAAA;AAAA,EAChB,UAAA,EAAY,sCAAA;AAAA,EACZ,YAAA,EAAc,uEAAA;AAAA,EACd,SAAA,EAAW,0BAAA;AAAA,EACX,WAAA,EAAa,6CAAA;AAAA,EACb,UAAA,EAAY,mCAAA;AAAA,EACZ,aAAA,EAAe,gBAAA;AAAA,EACf,SAAA,EAAW,qBAAA;AAAA,EACX,YAAA,EAAc,oBAAA;AAAA,EACd,OAAA,EAAS,iBAAA;AAAA,EACT,SAAA,EAAW;AACb;AAaO,SAAS,YAAA,CAAa,EAAE,MAAA,EAAQ,QAAA,EAAS,EAAsB;AACpE,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,aAAU,eAAA,EAC7C,QAAA,EAAA;AAAA,IAAA,MAAA;AAAA,oBACDF,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAgD,QAAA,EAAS;AAAA,GAAA,EAC1E,CAAA;AAEJ;AAYO,SAAS,cAAc,EAAE,IAAA,EAAM,OAAA,EAAS,MAAA,EAAQ,QAAO,EAAuB;AACnF,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AACjD,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4EAAA,EACZ,QAAA,EAAA;AAAA,IAAA,IAAA;AAAA,oBACDF,GAAAA;AAAA,MAACK,MAAAA;AAAA,MAAA;AAAA,QACC,OAAA,EAAQ,OAAA;AAAA,QACR,IAAA,EAAK,MAAA;AAAA,QACL,SAAA,EAAU,wCAAA;AAAA,QACV,OAAA,EAAS,MAAA;AAAA,QACT,OAAO,CAAA,CAAE,cAAA;AAAA,QACT,cAAY,CAAA,CAAE,cAAA;AAAA,QAEd,QAAA,kBAAAL,GAAAA,CAACQ,cAAAA,EAAA,EAAe,WAAU,UAAA,EAAW;AAAA;AAAA,KACvC;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;AAKO,SAAS,aAAA,CAAc;AAAA,EAC5B,IAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF,CAAA,EAKG;AACD,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AACjD,EAAA,MAAM,IAAA,GACJ,IAAA,KAAS,MAAA,GACL,CAAA,CAAE,UAAA,GACF,IAAA,KAAS,WAAA,GACP,UAAA,GACE,CAAA,CAAE,YAAA,GACF,CAAA,CAAE,SAAA,GACJ,CAAA,CAAE,WAAA;AACV,EAAA,uBACER,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEACZ,QAAA,EAAA,IAAA,EACH,CAAA;AAEJ;AAGO,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAS,EAA4B;AACtE,EAAA,uBAAOA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2CAA2C,QAAA,EAAS,CAAA;AAC5E;AAaO,SAAS,eAAA,CAAgB,EAAE,QAAA,EAAU,OAAA,EAAS,QAAO,EAAyB;AACnF,EAAA,uBACEE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EACb,QAAA,EAAA;AAAA,oBAAAF,IAAC,KAAA,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,SAAA,EAAU,qCAC1B,QAAA,EACH,CAAA;AAAA,IACC;AAAA,GAAA,EACH,CAAA;AAEJ;AAEA,IAAM,SAAA,GAAY;AAAA,EAChB,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,wEAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,uEAAA;AAAA,IACN,IAAA,EAAM;AAAA;AAEV,CAAA;AAGO,SAAS,WAAA,CAAY;AAAA,EAC1B,EAAA,EAAI,GAAA;AAAA,EACJ,MAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,EAGG;AACD,EAAA,MAAM,MAAM,SAAA,CAAU,GAAG,CAAA,CAAE,MAAA,GAAS,SAAS,MAAM,CAAA;AACnD,EAAA,uBACEA,GAAAA,CAAC,GAAA,EAAA,EAAI,WAAW,GAAA,EAAM,GAAG,OACtB,QAAA,EACH,CAAA;AAEJ;AAWA,IAAM,WAAA,GAAiD;AAAA,EACrD,IAAA,EAAM,oIAAA;AAAA,EACN,GAAA,EAAK,kHAAA;AAAA,EACL,OAAA,EACE,kHAAA;AAAA,EACF,MAAA,EACE;AACJ,CAAA;AAGO,SAAS,mBAAA,CAAoB;AAAA,EAClC,OAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAMG;AACD,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AACjD,EAAA,MAAM,WAAA,GAAiD;AAAA,IACrD,MAAM,CAAA,CAAE,UAAA;AAAA,IACR,SAAS,CAAA,CAAE,aAAA;AAAA,IACX,KAAK,CAAA,CAAE,SAAA;AAAA,IACP,QAAQ,CAAA,CAAE;AAAA,GACZ;AACA,EAAA,uBACEA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAiD,WAAA,EAAU,gBAAA,EACvE,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,qBACZA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MAEC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,MAAM,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AAAA,MAC7B,KAAA,EAAO,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AAAA,MACzB,YAAA,EAAY,WAAA,CAAY,CAAA,CAAE,IAAI,CAAA;AAAA,MAC9B,KAAA,EAAO,EAAE,GAAA,EAAK,CAAA,CAAE,MAAM,CAAA,EAAE;AAAA,MACxB,SAAA,EAAWC,EAAAA;AAAA,QACT,gLAAA;AAAA,QACA,WAAA,CAAY,EAAE,IAAI;AAAA,OACpB;AAAA,MACA,aAAA,EAAa,QAAA,CAAS,MAAA,GAAS,CAAA,CAAE,GAAG,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,eAAA,EAAkB,CAAA,CAAE,GAAG,CAAA,CAAA,EAAI,CAAA;AAAA,MAE5E,QAAA,kBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,UAAA,EAAW;AAAA,KAAA;AAAA,IAZvB,CAAA,CAAE;AAAA,GAcV,CAAA,EACH,CAAA;AAEJ;AC9KA,SAAS,YAAY,GAAA,EAAmD;AACtE,EAAA,QAAQ,GAAA,GAAM,CAAC,CAAA;AAAG,IAChB,KAAK,GAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,QAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,KAAA;AAAA,IACT,KAAK,GAAA;AACH,MAAA,OAAO,MAAA;AAAA,IACT;AACE,MAAA,OAAO,IAAA;AAAA;AAEb;AAGA,IAAM,cAAA,GAAiB,EAAA;AAOhB,SAAS,mBAAA,CAAoB;AAAA,EAClC,KAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAC3B,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,sBAAA,EAAwB,GAAG,MAAA,EAAO;AACjD,EAAA,MAAM,UAAA,GAAa,OAAO,QAAA,KAAa,UAAA;AACvC,EAAA,MAAM,OAAA,GAAU,OAA8B,IAAI,CAAA;AAClD,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAI,QAAA,CAA8B,EAAE,CAAA;AAE9D,EAAA,MAAM,WAAA,GAAc,OAAA;AAAA,IAClB,MAAO,KAAA,CAAM,IAAA,KAAS,UAAU,IAAI,GAAA,CAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,EAAA,EAAI,EAAE,IAAI,CAAC,CAAC,CAAA,GAAI,IAAA;AAAA,IACpF,CAAC,KAAK;AAAA,GACR;AAEA,EAAA,MAAM,UAAA,GAAa,QAAmC,MAAM;AAC1D,IAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KAAA,CACb,WAAA,EAAa,GAAA,CAAI,OAAO,EAAE,CAAA,IAAK,WAAA,CAAY,GAAG,CAAA,MAAO,MAAA;AACxD,IAAA,OAAO;AAAA,MACL,GAAA,EAAK,CAAC,EAAE,QAAA,EAAU,GAAG,KAAA,EAAM,qBACzBA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAG,KAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,CAAM,UAAU,CAAC,CAAA,EAAI,GAAG,OAC1D,QAAA,EACH,CAAA;AAAA,MAEF,GAAA,EAAK,CAAC,EAAE,QAAA,EAAU,GAAG,KAAA,EAAM,qBACzBA,GAAAA,CAAC,WAAA,EAAA,EAAY,IAAG,KAAA,EAAM,MAAA,EAAQ,OAAO,KAAA,CAAM,UAAU,CAAC,CAAA,EAAI,GAAG,OAC1D,QAAA,EACH;AAAA,KAEJ;AAAA,EACF,CAAA,EAAG,CAAC,WAAW,CAAC,CAAA;AAGhB,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,UAAA,IAAc,KAAA,CAAM,IAAA,KAAS,OAAA,IAAW,CAAC,IAAA,EAAM;AAClD,MAAA,UAAA,CAAW,EAAE,CAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,qBAAA,EAAsB,CAAE,GAAA;AAC7C,IAAA,MAAM,IAAA,uBAAW,GAAA,EAAsD;AACvE,IAAA,IAAA,CAAK,gBAAA,CAA8B,YAAY,CAAA,CAAE,OAAA,CAAQ,CAAC,EAAA,KAAO;AAC/D,MAAA,MAAM,GAAA,GAAM,GAAG,OAAA,CAAQ,GAAA;AACvB,MAAA,IAAI,CAAC,GAAA,IAAO,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,IAAI,GAAA,EAAK;AAAA,QACZ,GAAA,EAAK,EAAA,CAAG,qBAAA,EAAsB,CAAE,GAAA,GAAM,OAAA;AAAA,QACtC,MAAM,WAAA,EAAa,GAAA,CAAI,GAAG,CAAA,IAAK,WAAA,CAAY,GAAG,CAAA,IAAK;AAAA,OACpD,CAAA;AAAA,IACH,CAAC,CAAA;AACD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,EAAM,CAAC,CAAC,GAAA,EAAK,CAAC,CAAA,MAAO,EAAE,GAAA,EAAK,GAAG,CAAA,EAAE,CAAE,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,GAAG,CAAA;AAC3F,IAAA,MAAM,SAA8B,EAAC;AACrC,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,GAAG,CAAA;AAAA,QACH,GAAA,EAAK,IAAA,IAAQ,CAAA,CAAE,GAAA,GAAM,IAAA,CAAK,MAAM,cAAA,GAAiB,IAAA,CAAK,GAAA,GAAM,cAAA,GAAiB,CAAA,CAAE;AAAA,OAChF,CAAA;AAAA,IACH;AACA,IAAA,UAAA,CAAW,MAAM,CAAA;AAAA,EACnB,CAAA,EAAG,CAAC,UAAA,EAAY,KAAA,EAAO,WAAW,CAAC,CAAA;AAEnC,EAAA,uBACEA,GAAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,cAAY,CAAA,CAAE,OAAA;AAAA,MACd,SAAA,EAAU,QAAA;AAAA,MACV,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,MAEnE,QAAA,kBAAAA,GAAAA,CAAC,YAAA,EAAA,EAAa,MAAA,EACX,gBAAM,IAAA,KAAS,MAAA,IAAU,KAAA,CAAM,IAAA,KAAS,eAAe,KAAA,CAAM,IAAA,KAAS,aAAA,mBACrEA,IAAC,KAAA,EAAA,EAAI,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,UAC3B,QAAA,kBAAAA,GAAAA,CAAC,aAAA,EAAA,EAAc,IAAA,EAAM,MAAM,IAAA,EAAM,UAAA,EAAwB,MAAA,EAAgB,CAAA,EAC3E,IACE,KAAA,CAAM,IAAA,KAAS,WAAA,mBACjBE,KAAC,gBAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAAF,IAACO,OAAAA,EAAA,EAAQ,SAAA,EAAU,2CAAA,EAA4C,eAAW,IAAA,EAAC,CAAA;AAAA,wBAC3EP,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,WAAU,IAAA,EAAK,QAAA,EAC5B,YAAE,SAAA,EACL;AAAA,OAAA,EACF,oBAEAA,GAAAA;AAAA,QAAC,eAAA;AAAA,QAAA;AAAA,UACC,OAAA;AAAA,UACA,MAAA,EACE,6BACEA,GAAAA;AAAA,YAAC,mBAAA;AAAA,YAAA;AAAA,cACC,OAAA;AAAA,cACA,QAAA;AAAA,cACA,MAAA;AAAA,cACA,QAAQ,OAAA,EAAS;AAAA;AAAA,WACnB,GACE,IAAA;AAAA,UAGL,QAAA,EAAA,cAAA,CAAe,KAAA,CAAM,QAAA,EAAU,UAAU;AAAA;AAAA,OAC5C,EAEJ;AAAA;AAAA,GACF;AAEJ;AChKO,IAAM,+BAAA,GAAyD;AAAA,EACpE,SAAA,EACE,sGAAA;AAAA,EACF,aAAA,EACE,oFAAA;AAAA,EACF,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,CAAC,CAAA,KAAM,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA;AAAA,EAC5B,YAAA,EAAc,CAAC,CAAA,KAAM,CAAA,sBAAA,EAAyB,CAAC,CAAA,CAAA;AAAA,EAC/C,OAAA,EAAS;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,IAAA,EAAM,YAAA;AAAA,IACN,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ;AACV;AAwDO,SAAS,eAAA,CAAgB;AAAA,EAC9B,QAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,UAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,+BAAA,EAAiC,GAAG,MAAA,EAAO;AAC1D,EAAA,IAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AACxB,IAAA,uBACEA,GAAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAWC,EAAAA,CAAG,mCAAA,EAAqC,SAAS,CAAA;AAAA,QAC5D,eAAa,QAAA,CAAS,OAAA,EAAS,OAAO,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,QAEzE,QAAA,EAAA,IAAA,GAAO,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE;AAAA;AAAA,KAC1B;AAAA,EAEJ;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,QAAA,CAAS,OAAA,CAAQ,CAAC,CAAA,EAAG,CAAA,KAAM,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,MAAA,IAAU,CAAA,GAAI,CAAC,CAAC,CAAA;AAClE,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,IAAQ,CAAC,CAAC,SAAA;AAE9B,EAAA,uBACED,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWC,EAAAA,CAAG,0BAAA,EAA4B,SAAS,CAAA;AAAA,MACnD,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,MAEnE,QAAA,kBAAAD,IAAC,IAAA,EAAA,EAAG,SAAA,EAAU,+BACX,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,QAAA,MAAM,SAAA,GAAY,EAAE,EAAA,KAAO,SAAA;AAC3B,QAAA,MAAM,QAAA,GAAW,CAAA,KAAM,QAAA,CAAS,MAAA,GAAS,CAAA;AACzC,QAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,IAAU,CAAA,GAAI,CAAA;AAC/B,QAAA,MAAM,kBAAkB,CAAA,CAAE,WAAA,GAAc,WAAW,GAAA,CAAI,CAAA,CAAE,WAAW,CAAA,GAAI,MAAA;AACxE,QAAA,MAAM,eACJ,eAAA,KAAoB,MAAA,IAAa,eAAA,KAAoB,MAAA,GAAS,IAAI,eAAA,GAAkB,IAAA;AAEtF,QAAA,MAAM,KAAA,GAAQ,CAAC,SAAA,GAAY,IAAA,GAAO,IAAA,GAAQ,WAAW,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,OAAA,GAAW,CAAA,CAAE,OAAA;AAC/E,QAAA,MAAM,IAAA,GAAO,IAAA,GAAA,CACR,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,QAAA,EAAU,OAAA,CAAQ,iBAAA,EAAmB,EAAE,CAAA,GACpD,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,QAAA;AAChB,QAAA,MAAM,MAAA,GAAS,CAAC,IAAA,IAAQ,CAAA,CAAE,MAAA,GAAU,EAAE,OAAA,CAAQ,CAAA,CAAE,MAAM,CAAA,IAAK,IAAA,GAAQ,IAAA;AACnE,QAAA,uBACEE,IAAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YAEC,SAAA,EAAWD,EAAAA;AAAA,cACT,gDAAA;AAAA,cACA,SAAA,IAAa;AAAA,aACf;AAAA,YACA,aAAA,EAAa,QAAA,CAAS,OAAA,EAAS,GAAA,GAAM,CAAA,CAAE,EAAE,CAAA,EAAG,EAAE,MAAA,EAAQ,CAAA,YAAA,EAAe,CAAA,CAAE,EAAE,IAAI,CAAA;AAAA,YAE7E,QAAA,EAAA;AAAA,8BAAAD,IAACS,OAAAA,EAAA,EAAQ,SAAA,EAAU,uCAAA,EAAwC,eAAW,IAAA,EAAC,CAAA;AAAA,8BACvEP,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,gCAAAA,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,kCAAAF,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,yCAAyC,QAAA,EAAA,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA,EAAE,CAAA;AAAA,kBAC1E,yBACCA,GAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,SAAA,EAAU,mFAAA;AAAA,sBACV,aAAA,EAAa,QAAA,CAAS,OAAA,EAAS,YAAA,EAAc;AAAA,wBAC3C,MAAA,EAAQ;AAAA,uBACT,CAAA;AAAA,sBAEA,QAAA,EAAA;AAAA;AAAA;AACH,iBAAA,EAEJ,CAAA;AAAA,gCACAE,IAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EACZ,QAAA,EAAA;AAAA,kBAAA,IAAA;AAAA,kBAAK,QAAA;AAAA,kBAAI,UAAA,CAAW,EAAE,SAAS,CAAA;AAAA,kBAC/B,MAAA,oBAAUA,IAAAA,CAAC,MAAA,EAAA,EAAK,eAAa,CAAA,eAAA,EAAkB,CAAA,CAAE,EAAE,CAAA,CAAA,EAAI,QAAA,EAAA;AAAA,oBAAA,QAAA;AAAA,oBAAI;AAAA,mBAAA,EAAO,CAAA;AAAA,kBAClE,CAAA,CAAE,MAAA,oBACDA,IAAAA,CAAAC,UAAA,EACG,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,oBACA,CAAA,CAAE,MAAA;AAAA,oBAAQ,GAAA;AAAA,oCACXH,GAAAA;AAAA,sBAAC,QAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAK,QAAA;AAAA,wBACL,OAAA,EAAS,EAAE,MAAA,CAAO,MAAA;AAAA,wBAClB,SAAA,EAAU,mFAAA;AAAA,wBACV,KAAA,EAAO,EAAE,MAAA,CAAO,KAAA;AAAA,wBAChB,aAAA,EAAa,CAAA,eAAA,EAAkB,CAAA,CAAE,EAAE,CAAA,CAAA;AAAA,wBAElC,YAAE,MAAA,CAAO;AAAA;AAAA;AACZ,mBAAA,EACF,CAAA;AAAA,kBAED,YAAA,KAAiB,wBAChBE,IAAAA;AAAA,oBAAC,MAAA;AAAA,oBAAA;AAAA,sBACC,eAAa,QAAA,CAAS,OAAA,EAAS,MAAA,GAAS,CAAA,CAAE,EAAE,CAAA,EAAG;AAAA,wBAC7C,MAAA,EAAQ,CAAA,eAAA,EAAkB,CAAA,CAAE,EAAE,CAAA;AAAA,uBAC/B,CAAA;AAAA,sBAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,wBAAI,OAAA;AAAA,wBACF,CAAA,CAAE,aAAa,YAAY;AAAA;AAAA;AAAA;AAChC,iBAAA,EAEJ;AAAA,eAAA,EACF,CAAA;AAAA,cACC,CAAC,SAAA,oBACAA,IAAAA,CAAAC,UAAA,EACE,QAAA,EAAA;AAAA,gCAAAD,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA;AAAA,oBAC1B,SAAA,EAAU,mQAAA;AAAA,oBACV,eAAa,QAAA,CAAS,OAAA,EAAS,IAAA,GAAO,CAAA,CAAE,EAAE,CAAA,EAAG;AAAA,sBAC3C,MAAA,EAAQ,CAAA,aAAA,EAAgB,CAAA,CAAE,EAAE,CAAA;AAAA,qBAC7B,CAAA;AAAA,oBAED,QAAA,EAAA;AAAA,sCAAAF,GAAAA,CAACU,GAAAA,EAAA,EAAI,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,sBAAE,GAAA;AAAA,sBAAE,CAAA,CAAE;AAAA;AAAA;AAAA,iBAClC;AAAA,gBACC,8BACCR,IAAAA;AAAA,kBAAC,QAAA;AAAA,kBAAA;AAAA,oBACC,IAAA,EAAK,QAAA;AAAA,oBACL,OAAA,EAAS,MAAM,SAAA,CAAU,CAAA,CAAE,EAAE,CAAA;AAAA,oBAC7B,SAAA,EAAU,qOAAA;AAAA,oBACV,eAAa,QAAA,CAAS,OAAA,EAAS,OAAA,GAAU,CAAA,CAAE,EAAE,CAAA,EAAG;AAAA,sBAC9C,MAAA,EAAQ,CAAA,gBAAA,EAAmB,CAAA,CAAE,EAAE,CAAA;AAAA,qBAChC,CAAA;AAAA,oBAED,QAAA,EAAA;AAAA,sCAAAF,GAAAA,CAACM,UAAAA,EAAA,EAAW,SAAA,EAAU,UAAA,EAAW,CAAA;AAAA,sBAAE,GAAA;AAAA,sBAAE,CAAA,CAAE;AAAA;AAAA;AAAA;AACzC,eAAA,EAEJ;AAAA;AAAA,WAAA;AAAA,UA5EG,CAAA,CAAE;AAAA,SA8ET;AAAA,MAEJ,CAAC,CAAA,EACH;AAAA;AAAA,GACF;AAEJ","file":"chunk-OTDGTBAS.js","sourcesContent":["import type { ReactNode } from 'react'\nimport { ArrowLeftRight, Eye, EyeOff, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the compare bar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactCompareBarLabels {\n compareVs: string\n trackChanges: string\n trackChangesBack: string\n trackChangesView: string\n flipComparison: string\n stopComparing: string\n}\n\nexport const DEFAULT_ARTIFACT_COMPARE_BAR_LABELS: ArtifactCompareBarLabels = {\n compareVs: 'Compare vs.',\n trackChanges: 'Track changes',\n trackChangesBack: 'Back to editing (your comparison stays active)',\n trackChangesView: 'View tracked changes against Compare vs.',\n flipComparison: 'Flip comparison direction',\n stopComparing: 'Stop comparing',\n}\n\nexport interface ArtifactCompareBarTestIds {\n trackChanges: string\n}\n\nexport interface ArtifactCompareBarProps {\n /** The compared-against version (the host renders its name or pill). */\n compareTarget: ReactNode\n /** \"v2\": which version it is, when every version shares one file name. */\n versionLabel?: string | null\n /** An editable artifact toggles Track changes; a read-only comparison gets a flip arrow. */\n mode: 'track-changes' | 'flip'\n showTrackChanges: boolean\n onToggleTrackChanges: () => void\n onFlip: () => void\n onStop: () => void\n labels?: Partial<ArtifactCompareBarLabels>\n testIds?: Partial<ArtifactCompareBarTestIds>\n}\n\nconst barButton =\n 'inline-flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:px-2.5'\n\n/**\n * \"Compare vs. [version]\" row contents: always an explicit text label (an icon-only pill was\n * unclear), with Track changes or Flip, and Stop comparing.\n */\nexport function ArtifactCompareBar({\n compareTarget,\n versionLabel,\n mode,\n showTrackChanges,\n onToggleTrackChanges,\n onFlip,\n onStop,\n labels,\n testIds,\n}: ArtifactCompareBarProps) {\n const l = { ...DEFAULT_ARTIFACT_COMPARE_BAR_LABELS, ...labels }\n return (\n <>\n <span className=\"shrink-0 text-sm text-muted-foreground\">{l.compareVs}</span>\n {compareTarget}\n {versionLabel && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{versionLabel}</span>\n )}\n {mode === 'track-changes' ? (\n <button\n type=\"button\"\n onClick={onToggleTrackChanges}\n aria-pressed={showTrackChanges}\n className={cn(\n barButton,\n showTrackChanges\n ? 'bg-accent text-accent-foreground hover:bg-accent/70'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={showTrackChanges ? l.trackChangesBack : l.trackChangesView}\n data-testid={testIdOr(testIds?.trackChanges, { testId: 'track-changes-toggle' })}\n >\n {showTrackChanges ? (\n <Eye className=\"size-3.5\" aria-hidden />\n ) : (\n <EyeOff className=\"size-3.5\" aria-hidden />\n )}\n {l.trackChanges}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onFlip}\n className={cn(\n barButton,\n 'p-1 text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={l.flipComparison}\n aria-label={l.flipComparison}\n >\n <ArrowLeftRight className=\"size-3.5\" aria-hidden />\n </button>\n )}\n <button\n type=\"button\"\n onClick={onStop}\n className={cn(\n barButton,\n 'ml-auto text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={l.stopComparing}\n >\n <X className=\"size-3\" aria-hidden />\n {l.stopComparing}\n </button>\n </>\n )\n}\n","import { useCallback, type KeyboardEvent, type ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport type { RenderMarkdown } from './ArtifactRedlineView'\n\nexport interface ArtifactEditorBodyTestIds {\n /** The read-only rendered document. */\n rendered: string\n /** The track-changes panel. */\n trackChanges: string\n}\n\nexport interface ArtifactEditorBodyProps {\n /** The saved markdown, shown rendered while not editing. */\n content: string\n isEditing: boolean\n /** A comparison is active. */\n comparing: boolean\n /** Show the track-changes panel instead of the editor (needs `comparing`). */\n showTrackChanges: boolean\n /** The editing surface (for example `ArtifactMarkdownEditor`). */\n editor: ReactNode\n /** The track-changes panel (for example `ArtifactRedlineView`). */\n redline: ReactNode\n renderMarkdown: RenderMarkdown\n /** Mod+S while editing; omit to leave the shortcut to the browser. */\n onSave?: () => void\n /** Mod+S only saves when this is true (there are changes and no save is running). */\n canSave?: boolean\n className?: string\n testIds?: Partial<ArtifactEditorBodyTestIds>\n}\n\n/**\n * The body of an artifact: the rendered document when reading, the editor when editing, and the\n * track-changes panel in its place while comparing. It is either typing or reviewing, never both\n * stacked, as in Word's Show Markup. Mod+S saves from anywhere inside it.\n */\nexport function ArtifactEditorBody({\n content,\n isEditing,\n comparing,\n showTrackChanges,\n editor,\n redline,\n renderMarkdown,\n onSave,\n canSave = true,\n className,\n testIds,\n}: ArtifactEditorBodyProps) {\n const onKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (!isEditing || !onSave) return\n if ((e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === 's') {\n e.preventDefault()\n if (canSave) onSave()\n }\n },\n [isEditing, onSave, canSave]\n )\n\n const tracking = isEditing && comparing && showTrackChanges\n return (\n // The key handler only listens to bubbling keystrokes of the editor inside; the editor itself\n // is the focusable element.\n <div\n data-slot=\"artifact-body\"\n className={cn('h-full min-h-0 overflow-auto', className)}\n onKeyDown={onKeyDown}\n >\n {!isEditing ? (\n <div\n className=\"p-6\"\n data-slot=\"artifact-rendered\"\n data-testid={testIdOr(testIds?.rendered, { testId: 'document-rendered-markdown' })}\n >\n {renderMarkdown(content)}\n </div>\n ) : tracking ? (\n <div\n className=\"h-full\"\n data-testid={testIdOr(testIds?.trackChanges, { testId: 'track-changes-panel' })}\n >\n {redline}\n </div>\n ) : (\n editor\n )}\n </div>\n )\n}\n","import { Check, GitCompare, Loader2, Pencil, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the toolbar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactToolbarLabels {\n /** The accessible name of the group of actions. */\n group: string\n edit: string\n cancel: string\n cancelTitle: string\n compare: string\n compareTitle: string\n saveDocument: string\n saveAsVersion: string\n noChanges: string\n saving: string\n save: string\n saveVersion: string\n /** Announced (not shown) when there are unsaved changes. */\n unsaved: string\n}\n\nexport const DEFAULT_ARTIFACT_TOOLBAR_LABELS: ArtifactToolbarLabels = {\n group: 'Document actions',\n edit: 'Edit',\n cancel: 'Cancel',\n cancelTitle: 'Cancel editing',\n compare: 'Compare with previous',\n compareTitle: 'Compare against the previous version',\n saveDocument: 'Save document',\n saveAsVersion: 'Save as a new version',\n noChanges: 'No changes to save',\n saving: 'Saving…',\n save: 'Save',\n saveVersion: 'Save version',\n unsaved: 'Unsaved changes',\n}\n\nexport interface ArtifactToolbarTestIds {\n edit: string\n cancel: string\n compare: string\n save: string\n unsavedDot: string\n}\n\nexport interface ArtifactToolbarProps {\n isEditing: boolean\n /** A new document that has no earlier version: \"Save\" instead of \"Save version\", no Cancel. */\n isDraft?: boolean\n /** Narrow panel: icon-only Edit and Compare. Save keeps its label. */\n compact?: boolean\n /** The buffer differs from the saved version. */\n hasChanges: boolean\n isSaving: boolean\n /** Offer \"Compare against the previous version\". */\n canCompare: boolean\n onStartEdit: () => void\n /** Edit is not offered yet (the text is still being prepared). */\n editDisabled?: boolean\n /** Discard the buffer and leave edit mode. */\n onCancel: () => void\n onCompare: () => void\n /** Save the buffer as a NEW version. */\n onSave: () => void\n className?: string\n labels?: Partial<ArtifactToolbarLabels>\n testIds?: Partial<ArtifactToolbarTestIds>\n}\n\n/**\n * Edit, Cancel (discard), Compare and Save for an artifact. Save is the ONE filled button and only\n * once there is something to save; a dot marks unsaved changes and a polite status announces them.\n * Touch targets are 44px on coarse pointers.\n */\nexport function ArtifactToolbar({\n isEditing,\n isDraft = false,\n compact = false,\n hasChanges,\n isSaving,\n canCompare,\n editDisabled = false,\n onStartEdit,\n onCancel,\n onCompare,\n onSave,\n className,\n labels,\n testIds,\n}: ArtifactToolbarProps) {\n const l = { ...DEFAULT_ARTIFACT_TOOLBAR_LABELS, ...labels }\n const group = (children: React.ReactNode): React.ReactElement => (\n <div\n role=\"group\"\n aria-label={l.group}\n data-slot=\"artifact-toolbar\"\n className={cn('flex items-center gap-2', compact && 'gap-1', className)}\n >\n {children}\n </div>\n )\n\n if (!isEditing) {\n return group(\n <Button\n onClick={onStartEdit}\n disabled={editDisabled}\n variant=\"outline\"\n size={compact ? 'icon' : 'sm'}\n title={l.edit}\n aria-label={l.edit}\n data-testid={testIdOr(testIds?.edit, { testId: 'edit-document-button' })}\n className=\"pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <Pencil className=\"size-4\" aria-hidden />\n {!compact && <span className=\"ml-1\">{l.edit}</span>}\n </Button>\n )\n }\n return group(\n <>\n {/* A draft has no Cancel: the panel's own Close is the one way out (it warns first). */}\n {!isDraft && (\n <Button\n onClick={onCancel}\n variant=\"outline\"\n size=\"sm\"\n title={l.cancelTitle}\n data-testid={testIdOr(testIds?.cancel, { testId: 'cancel-edit-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <X className=\"size-4\" aria-hidden />\n <span className=\"ml-1\">{l.cancel}</span>\n </Button>\n )}\n {canCompare && (\n <Button\n onClick={onCompare}\n variant=\"outline\"\n size={compact ? 'icon' : 'sm'}\n title={l.compareTitle}\n aria-label={l.compare}\n data-testid={testIdOr(testIds?.compare, { testId: 'compare-button' })}\n className=\"pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <GitCompare className=\"size-4\" aria-hidden />\n {!compact && <span className=\"ml-1\">{l.compare}</span>}\n </Button>\n )}\n <div className=\"relative\">\n <Button\n onClick={onSave}\n variant={hasChanges ? 'default' : 'outline'}\n size=\"sm\"\n title={hasChanges ? (isDraft ? l.saveDocument : l.saveAsVersion) : l.noChanges}\n disabled={!hasChanges || isSaving}\n data-testid={testIdOr(testIds?.save, { testId: 'save-document-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Check className=\"size-4\" aria-hidden />\n )}\n <span className=\"ml-1\">{isSaving ? l.saving : isDraft ? l.save : l.saveVersion}</span>\n </Button>\n {hasChanges && !isSaving && (\n <span\n className=\"absolute -right-1 -top-1 size-2.5 rounded-full bg-primary ring-2 ring-background\"\n aria-hidden\n data-testid={testIdOr(testIds?.unsavedDot, { testId: 'unsaved-changes-dot' })}\n />\n )}\n </div>\n <span role=\"status\" className=\"sr-only\">\n {hasChanges && !isSaving ? l.unsaved : ''}\n </span>\n </>\n )\n}\n","import { GitCompare, History } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport type { VersionEntry } from './VersionTimeline'\n\n/** Every fixed string of the version bar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactVersionBarLabels {\n group: string\n /** \"Version 2 of 3\". */\n position: (index: number, total: number) => string\n /** The only version: nothing to choose from yet. */\n only: string\n latest: string\n select: string\n option: (index: number, date: string, isCurrent: boolean) => string\n compare: string\n compareTitle: string\n}\n\nexport const DEFAULT_ARTIFACT_VERSION_BAR_LABELS: ArtifactVersionBarLabels = {\n group: 'Versions',\n position: (index, total) => `Version ${index} of ${total}`,\n only: 'Version 1',\n latest: 'Latest',\n select: 'Open a version',\n option: (index, date, isCurrent) => `Version ${index} · ${date}${isCurrent ? ' (open)' : ''}`,\n compare: 'Compare with previous',\n compareTitle: 'Compare this version against the one it was saved from',\n}\n\nexport interface ArtifactVersionBarTestIds {\n root: string\n position: string\n select: string\n compare: string\n}\n\nexport interface ArtifactVersionBarProps {\n /** The lineage, oldest first. */\n versions: VersionEntry[]\n /** The open version. */\n currentId: string\n formatDate: (iso: string) => string\n /** Open another version (selected from the list). */\n onOpen: (id: string) => void\n /** Compare the open version with the one before it. Omit to hide the button. */\n onCompare?: () => void\n className?: string\n labels?: Partial<ArtifactVersionBarLabels>\n testIds?: Partial<ArtifactVersionBarTestIds>\n}\n\n/**\n * Where you are in an artifact's versions: \"Version 2 of 3\", a list to open any version, and\n * Compare with the previous one. Saving a new version is the toolbar's Save button; the editor\n * lays the two out on one row. The list is a native select: it is keyboard and screen-reader\n * complete and uses the phone's own picker.\n */\nexport function ArtifactVersionBar({\n versions,\n currentId,\n formatDate,\n onOpen,\n onCompare,\n className,\n labels,\n testIds,\n}: ArtifactVersionBarProps) {\n const l = { ...DEFAULT_ARTIFACT_VERSION_BAR_LABELS, ...labels }\n const index = versions.findIndex((v) => v.id === currentId)\n const isLatest = index === versions.length - 1\n return (\n <div\n role=\"group\"\n aria-label={l.group}\n data-slot=\"artifact-version-bar\"\n className={cn('flex min-w-0 flex-wrap items-center gap-2 text-sm', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-version-bar' })}\n >\n <History className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span\n className=\"shrink-0 font-medium text-foreground\"\n data-testid={testIdOr(testIds?.position, { testId: 'artifact-version-position' })}\n >\n {versions.length > 1 && index >= 0 ? l.position(index + 1, versions.length) : l.only}\n </span>\n {versions.length > 1 && index >= 0 && isLatest && (\n <span className=\"shrink-0 rounded-full bg-accent px-2 py-0.5 text-xs font-medium text-accent-foreground\">\n {l.latest}\n </span>\n )}\n {versions.length > 1 && (\n <select\n aria-label={l.select}\n value={currentId}\n onChange={(e) => onOpen(e.target.value)}\n className=\"min-w-0 max-w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:text-base\"\n data-testid={testIdOr(testIds?.select, { testId: 'artifact-version-select' })}\n >\n {versions.map((v, i) => (\n <option key={v.id} value={v.id}>\n {l.option(v.number ?? i + 1, formatDate(v.createdAt), v.id === currentId)}\n </option>\n ))}\n </select>\n )}\n {onCompare && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onCompare}\n title={l.compareTitle}\n className=\"pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.compare, { testId: 'artifact-version-compare' })}\n >\n <GitCompare className=\"size-4\" aria-hidden />\n <span className=\"ml-1\">{l.compare}</span>\n </Button>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ArtifactCompareBar, type ArtifactCompareBarLabels } from './ArtifactCompareBar'\nimport { ArtifactEditorBody, type ArtifactEditorBodyTestIds } from './ArtifactEditorBody'\nimport type { RenderMarkdown } from './ArtifactRedlineView'\nimport { ArtifactToolbar, type ArtifactToolbarLabels } from './ArtifactToolbar'\nimport {\n ArtifactVersionBar,\n type ArtifactVersionBarLabels,\n type ArtifactVersionBarTestIds,\n} from './ArtifactVersionBar'\nimport type { VersionEntry } from './VersionTimeline'\n\n/** Whether the artifact's text is available (`ArtifactTextStatus` of `@arbidocs/react/artifacts`). */\nexport type ArtifactEditorStatus = 'loading' | 'parsing' | 'ready' | 'error'\n\nexport interface ArtifactEditorStatusLabels {\n /** Shown while the backend is still parsing a fresh upload. */\n preparing: string\n error: string\n retry: string\n}\n\nexport const DEFAULT_ARTIFACT_EDITOR_STATUS_LABELS: ArtifactEditorStatusLabels = {\n preparing: 'Preparing editor…',\n error: \"The document couldn't be prepared for editing.\",\n retry: 'Try again',\n}\n\nexport interface ArtifactEditorLabels {\n status: Partial<ArtifactEditorStatusLabels>\n toolbar: Partial<ArtifactToolbarLabels>\n versions: Partial<ArtifactVersionBarLabels>\n compare: Partial<ArtifactCompareBarLabels>\n}\n\nexport interface ArtifactEditorTestIds {\n root: string\n /** The \"Preparing editor\" state. */\n preparing: string\n /** The error state and its retry button. */\n error: string\n retry: string\n compareRow: string\n body: Partial<ArtifactEditorBodyTestIds>\n versions: Partial<ArtifactVersionBarTestIds>\n}\n\nexport interface ArtifactEditorProps {\n /** The saved markdown of the open version. */\n content: string\n isEditing: boolean\n hasChanges: boolean\n isSaving: boolean\n isDraft?: boolean\n /** Narrow container: icon-only Edit and Compare. */\n compact?: boolean\n canCompare: boolean\n /** A comparison is active. */\n comparing: boolean\n /** The version being compared against. */\n compareId?: string | null\n showTrackChanges: boolean\n /**\n * Whether the text is available. While `loading` or `parsing` the body is a \"Preparing editor\"\n * state (the toolbar is disabled: an editor on an empty baseline would save a blank version);\n * `error` shows `labels.status.error` with Retry (`onRetry`). Default `ready`.\n */\n status?: ArtifactEditorStatus\n /** Ask for the text again after an `error`. */\n onRetry?: () => void\n /** The lineage, oldest first. The version bar shows only for two or more. */\n versions?: VersionEntry[]\n currentVersionId?: string\n onStartEdit: () => void\n onCancel: () => void\n /** Save the buffer as a new version. */\n onSave: () => void\n onCompare: () => void\n onStopCompare: () => void\n onToggleTrackChanges: () => void\n /** Open another version from the version list. */\n onOpenVersion?: (id: string) => void\n formatDate?: (iso: string) => string\n /** The editing surface (for example `ArtifactMarkdownEditor`). */\n editor: ReactNode\n /** The track-changes panel (for example `ArtifactRedlineView`). */\n redline: ReactNode\n renderMarkdown: RenderMarkdown\n /** Extra actions in the header (share, download...). */\n actions?: ReactNode\n className?: string\n labels?: Partial<ArtifactEditorLabels>\n testIds?: Partial<ArtifactEditorTestIds>\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const date = new Date(iso)\n return Number.isNaN(date.getTime()) ? iso : date.toLocaleString()\n}\n\n/**\n * The artifact surface: a header with the version bar and the toolbar (Edit, Cancel, Compare,\n * Save as a new version), a compare row while comparing, and the body (read, edit or track\n * changes). Everything is view-model driven: a host binds state with `useArtifactSession` from\n * `@arbidocs/react/artifacts` and passes the editor and redline as slots.\n */\nexport function ArtifactEditor({\n content,\n isEditing,\n hasChanges,\n isSaving,\n isDraft = false,\n compact = false,\n canCompare,\n comparing,\n compareId,\n showTrackChanges,\n status = 'ready',\n onRetry,\n versions = [],\n currentVersionId = '',\n onStartEdit,\n onCancel,\n onSave,\n onCompare,\n onStopCompare,\n onToggleTrackChanges,\n onOpenVersion,\n formatDate = defaultFormatDate,\n editor,\n redline,\n renderMarkdown,\n actions,\n className,\n labels,\n testIds,\n}: ArtifactEditorProps) {\n const compared = versions.findIndex((v) => v.id === compareId)\n const unavailable = status !== 'ready'\n const statusLabels = { ...DEFAULT_ARTIFACT_EDITOR_STATUS_LABELS, ...labels?.status }\n return (\n <div\n data-slot=\"artifact-editor\"\n className={cn('flex h-full max-h-dvh min-h-0 flex-col bg-background', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-editor' })}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2 border-b border-border px-3 py-2\">\n {versions.length > 0 && onOpenVersion ? (\n <ArtifactVersionBar\n versions={versions}\n currentId={currentVersionId}\n formatDate={formatDate}\n onOpen={onOpenVersion}\n // While reading, Compare is here; while editing it is in the toolbar.\n onCompare={canCompare && !isEditing && !unavailable ? onCompare : undefined}\n labels={labels?.versions}\n testIds={testIds?.versions}\n />\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n <ArtifactToolbar\n isEditing={isEditing}\n isDraft={isDraft}\n compact={compact}\n hasChanges={hasChanges}\n isSaving={isSaving}\n // Reading with a version bar: the bar carries Compare. Editing: the toolbar does.\n canCompare={\n canCompare && !unavailable && (isEditing || !(versions.length > 0 && onOpenVersion))\n }\n editDisabled={unavailable}\n onStartEdit={onStartEdit}\n onCancel={onCancel}\n onCompare={onCompare}\n onSave={onSave}\n labels={labels?.toolbar}\n />\n {actions}\n </div>\n </div>\n {comparing && (\n <div\n className=\"flex flex-wrap items-center gap-1.5 border-b border-border px-3 py-1.5\"\n data-testid={testIdOr(testIds?.compareRow, { testId: 'artifact-compare-row' })}\n >\n <ArtifactCompareBar\n compareTarget={\n <span className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n {compared >= 0 ? versions[compared].name : ''}\n </span>\n }\n versionLabel={\n compared >= 0 && versions.length > 1\n ? `v${versions[compared].number ?? compared + 1}`\n : null\n }\n mode=\"track-changes\"\n showTrackChanges={showTrackChanges}\n onToggleTrackChanges={onToggleTrackChanges}\n onFlip={onStopCompare}\n onStop={onStopCompare}\n labels={labels?.compare}\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1\">\n {unavailable ? (\n status === 'error' ? (\n <div\n role=\"alert\"\n className=\"flex h-full flex-col items-center justify-center gap-3 p-6 text-center text-sm\"\n data-testid={testIdOr(testIds?.error, { testId: 'artifact-editor-error' })}\n >\n <p className=\"text-foreground\">{statusLabels.error}</p>\n {onRetry && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetry}\n className=\"pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.retry, { testId: 'artifact-editor-retry' })}\n >\n {statusLabels.retry}\n </Button>\n )}\n </div>\n ) : (\n <p\n role=\"status\"\n className=\"flex h-full items-center justify-center gap-2 p-6 text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.preparing, { testId: 'artifact-editor-preparing' })}\n >\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n {statusLabels.preparing}\n </p>\n )\n ) : (\n <ArtifactEditorBody\n content={content}\n isEditing={isEditing}\n comparing={comparing}\n showTrackChanges={showTrackChanges}\n editor={editor}\n redline={redline}\n renderMarkdown={renderMarkdown}\n onSave={onSave}\n canSave={hasChanges && !isSaving}\n testIds={testIds?.body}\n />\n )}\n </div>\n </div>\n )\n}\n","import type { ComponentPropsWithoutRef, ReactNode, Ref } from 'react'\nimport { ArrowLeftRight, Undo2 } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the redline parts. Pass a partial `labels` to translate or reword. */\nexport interface RedlineLabels {\n flipComparison: string\n noDocument: string\n noChangesYet: string\n identical: string\n unavailable: string\n revertMove: string\n revertReplace: string\n revertAdd: string\n revertRemove: string\n /** The accessible name of the redline region. */\n tracked: string\n /** Announced while the diff computes. */\n computing: string\n}\n\nexport const DEFAULT_REDLINE_LABELS: RedlineLabels = {\n flipComparison: 'Flip comparison',\n noDocument: 'No document selected for comparison.',\n noChangesYet: 'No changes yet — start editing to see redlined differences here.',\n identical: 'Documents are identical.',\n unavailable: 'Document text not available for comparison.',\n revertMove: 'Undo this move (revert both ends)',\n revertReplace: 'Undo this edit',\n revertAdd: 'Undo this insertion',\n revertRemove: 'Undo this deletion',\n tracked: 'Tracked changes',\n computing: 'Comparing…',\n}\n\nexport type RedlineRegionKind = 'replace' | 'remove' | 'add' | 'move'\n\n// ── Frame ───────────────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineFrameProps {\n /** Optional header row (see RedlineHeader). */\n header?: ReactNode\n children: ReactNode\n}\n\n/** Column shell for a redline: optional header, scrolling body. */\nexport function RedlineFrame({ header, children }: RedlineFrameProps) {\n return (\n <div className=\"flex h-full flex-col\" data-slot=\"redline-frame\">\n {header}\n <div className=\"flex-1 overflow-auto text-sm leading-relaxed\">{children}</div>\n </div>\n )\n}\n\nexport interface RedlineHeaderProps {\n /** The base document pill. */\n base: ReactNode\n /** The compared document pill. */\n compare?: ReactNode\n onFlip: () => void\n labels?: Partial<RedlineLabels>\n}\n\n/** \"Base ⇄ Compare\" row with the flip control. */\nexport function RedlineHeader({ base, compare, onFlip, labels }: RedlineHeaderProps) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n return (\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border bg-muted px-3 py-2\">\n {base}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 shrink-0 pointer-coarse:size-11\"\n onClick={onFlip}\n title={l.flipComparison}\n aria-label={l.flipComparison}\n >\n <ArrowLeftRight className=\"size-3.5\" />\n </Button>\n {compare}\n </div>\n )\n}\n\nexport type RedlineStatusKind = 'idle' | 'identical' | 'unavailable'\n\n/** A centred status line for the redline body (nothing to diff). */\nexport function RedlineStatus({\n kind,\n reviewMode,\n labels,\n}: {\n kind: RedlineStatusKind\n /** Accept/reject mode: \"identical\" means no edits yet. */\n reviewMode?: boolean\n labels?: Partial<RedlineLabels>\n}) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const text =\n kind === 'idle'\n ? l.noDocument\n : kind === 'identical'\n ? reviewMode\n ? l.noChangesYet\n : l.identical\n : l.unavailable\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n {text}\n </div>\n )\n}\n\n/** Centres a loading indicator while the diff computes. */\nexport function RedlineComputing({ children }: { children: ReactNode }) {\n return <div className=\"flex h-full items-center justify-center\">{children}</div>\n}\n\n// ── Document + marks ────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineDocumentProps {\n /** Rendered redline markdown. */\n children: ReactNode\n /** Ref to the rendered body (the host measures change positions from it). */\n bodyRef?: Ref<HTMLDivElement>\n /** Margin gutter (revert buttons) shown in accept/reject mode. */\n gutter?: ReactNode\n}\n\nexport function RedlineDocument({ children, bodyRef, gutter }: RedlineDocumentProps) {\n return (\n <div className=\"relative\">\n <div ref={bodyRef} className=\"mx-auto max-w-3xl px-6 py-4 pr-14\">\n {children}\n </div>\n {gutter}\n </div>\n )\n}\n\nconst MARK_TONE = {\n del: {\n base: 'font-semibold text-red-600 line-through decoration-2 dark:text-red-400',\n move: 'font-semibold text-emerald-600 line-through decoration-2 dark:text-emerald-400',\n },\n ins: {\n base: 'font-semibold text-blue-600 underline decoration-2 dark:text-blue-400',\n move: 'font-semibold text-emerald-600 underline decoration-2 dark:text-emerald-400',\n },\n} as const\n\n/** `<del>` / `<ins>` for the markdown renderer: red strike, blue underline, green for moves. */\nexport function RedlineMark({\n as: Tag,\n isMove,\n children,\n ...props\n}: (ComponentPropsWithoutRef<'del'> | ComponentPropsWithoutRef<'ins'>) & {\n as: 'del' | 'ins'\n isMove: boolean\n}) {\n const cls = MARK_TONE[Tag][isMove ? 'move' : 'base']\n return (\n <Tag className={cls} {...props}>\n {children}\n </Tag>\n )\n}\n\n// ── Revert gutter ───────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineMarkerView {\n cid: string\n /** Vertical offset in px, already spaced so buttons never overlap. */\n top: number\n kind: RedlineRegionKind\n}\n\nconst REVERT_TONE: Record<RedlineRegionKind, string> = {\n move: 'border-emerald-600 text-emerald-700 hover:bg-emerald-50 dark:border-emerald-400 dark:text-emerald-300 dark:hover:bg-emerald-950/40',\n add: 'border-blue-600 text-blue-700 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-300 dark:hover:bg-blue-950/40',\n replace:\n 'border-blue-600 text-blue-700 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-300 dark:hover:bg-blue-950/40',\n remove:\n 'border-red-600 text-red-700 hover:bg-red-50 dark:border-red-400 dark:text-red-300 dark:hover:bg-red-950/40',\n}\n\n/** One undo button per change, aligned with the change in the margin. */\nexport function RedlineRevertGutter({\n markers,\n onRevert,\n labels,\n testId,\n}: {\n markers: RedlineMarkerView[]\n onRevert: (cid: string) => void\n labels?: Partial<RedlineLabels>\n /** Replaces the whole `redline-revert-<cid>` id. */\n testId?: (cid: string) => string\n}) {\n if (markers.length === 0) return null\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const revertTitle: Record<RedlineRegionKind, string> = {\n move: l.revertMove,\n replace: l.revertReplace,\n add: l.revertAdd,\n remove: l.revertRemove,\n }\n return (\n <div className=\"pointer-events-none absolute right-2 top-0 w-9\" data-slot=\"redline-gutter\">\n {markers.map((m) => (\n <button\n key={m.cid}\n type=\"button\"\n onClick={() => onRevert(m.cid)}\n title={revertTitle[m.kind]}\n aria-label={revertTitle[m.kind]}\n style={{ top: m.top - 2 }}\n className={cn(\n 'pointer-events-auto absolute right-0 inline-flex h-6 w-7 items-center justify-center rounded-md border bg-background transition-colors pointer-coarse:h-11 pointer-coarse:w-11',\n REVERT_TONE[m.kind]\n )}\n data-testid={testIdOr(testId?.(m.cid), { testId: `redline-revert-${m.cid}` })}\n >\n <Undo2 className=\"size-3.5\" />\n </button>\n ))}\n </div>\n )\n}\n","import { useLayoutEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\nimport {\n DEFAULT_REDLINE_LABELS,\n RedlineComputing,\n RedlineDocument,\n RedlineFrame,\n RedlineMark,\n RedlineRevertGutter,\n RedlineStatus,\n type RedlineLabels,\n type RedlineMarkerView,\n type RedlineRegionKind,\n} from './RedlineParts'\n\ntype DelProps = React.ComponentPropsWithoutRef<'del'> & { 'data-cid'?: string }\ntype InsProps = React.ComponentPropsWithoutRef<'ins'> & { 'data-cid'?: string }\n\n/** The `<del>` / `<ins>` renderers a markdown renderer must use for the tracked changes. */\nexport interface RedlineMarkdownComponents {\n del: React.FC<DelProps>\n ins: React.FC<InsProps>\n}\n\n/**\n * Renders markdown to React. The redline markdown carries raw `<del>` / `<ins>` tags, so the\n * renderer must allow inline HTML and honour `components`.\n */\nexport type RenderMarkdown = (markdown: string, components?: RedlineMarkdownComponents) => ReactNode\n\n/** What the view shows. Matches `RedlineState` of `@arbidocs/react/artifacts`. */\nexport type ArtifactRedlineState =\n | { kind: 'idle' }\n | { kind: 'computing' }\n | { kind: 'ready'; markdown: string; regions: { id: string; kind: RedlineRegionKind }[] }\n | { kind: 'identical' }\n | { kind: 'unavailable' }\n\nexport interface ArtifactRedlineViewTestIds {\n /** Replaces the whole `redline-revert-<cid>` id. */\n revert: (cid: string) => string\n root: string\n}\n\nexport interface ArtifactRedlineViewProps {\n state: ArtifactRedlineState\n renderMarkdown: RenderMarkdown\n /** Accept/reject mode: a margin button per change undoes that change. Omit for read-only. */\n onRevert?: (regionId: string) => void\n /** A header row (for example `RedlineHeader`). */\n header?: ReactNode\n labels?: Partial<RedlineLabels>\n testIds?: Partial<ArtifactRedlineViewTestIds>\n}\n\n/** First char of a change id encodes its kind: p(replace) r(remove) a(add) m(move). */\nfunction kindFromCid(cid: string | undefined): RedlineRegionKind | null {\n switch (cid?.[0]) {\n case 'p':\n return 'replace'\n case 'r':\n return 'remove'\n case 'a':\n return 'add'\n case 'm':\n return 'move'\n default:\n return null\n }\n}\n\n/** Two changes on one line would stack their buttons; nudge each down by one button height. */\nconst MARKER_MIN_GAP = 26\n\n/**\n * Word-style track changes between two versions: deletions struck through in red, insertions\n * underlined in blue, moves in green, status lines when there is nothing to diff, and (when\n * `onRevert` is set) an undo button per change aligned in the margin.\n */\nexport function ArtifactRedlineView({\n state,\n renderMarkdown,\n onRevert,\n header,\n labels,\n testIds,\n}: ArtifactRedlineViewProps) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const reviewMode = typeof onRevert === 'function'\n const bodyRef = useRef<HTMLDivElement | null>(null)\n const [markers, setMarkers] = useState<RedlineMarkerView[]>([])\n\n const regionKinds = useMemo(\n () => (state.kind === 'ready' ? new Map(state.regions.map((r) => [r.id, r.kind])) : null),\n [state]\n )\n\n const components = useMemo<RedlineMarkdownComponents>(() => {\n const isMove = (cid: string | undefined): boolean =>\n (regionKinds?.get(cid ?? '') ?? kindFromCid(cid)) === 'move'\n return {\n del: ({ children, ...props }: DelProps) => (\n <RedlineMark as=\"del\" isMove={isMove(props['data-cid'])} {...props}>\n {children}\n </RedlineMark>\n ),\n ins: ({ children, ...props }: InsProps) => (\n <RedlineMark as=\"ins\" isMove={isMove(props['data-cid'])} {...props}>\n {children}\n </RedlineMark>\n ),\n }\n }, [regionKinds])\n\n // After each render, find each change's first element and put its undo button level with it.\n useLayoutEffect(() => {\n const host = bodyRef.current\n if (!reviewMode || state.kind !== 'ready' || !host) {\n setMarkers([])\n return\n }\n const hostTop = host.getBoundingClientRect().top\n const seen = new Map<string, { top: number; kind: RedlineRegionKind }>()\n host.querySelectorAll<HTMLElement>('[data-cid]').forEach((el) => {\n const cid = el.dataset.cid\n if (!cid || seen.has(cid)) return\n seen.set(cid, {\n top: el.getBoundingClientRect().top - hostTop,\n kind: regionKinds?.get(cid) ?? kindFromCid(cid) ?? 'replace',\n })\n })\n const sorted = Array.from(seen, ([cid, v]) => ({ cid, ...v })).sort((a, b) => a.top - b.top)\n const spaced: RedlineMarkerView[] = []\n for (const m of sorted) {\n const prev = spaced[spaced.length - 1]\n spaced.push({\n ...m,\n top: prev && m.top - prev.top < MARKER_MIN_GAP ? prev.top + MARKER_MIN_GAP : m.top,\n })\n }\n setMarkers(spaced)\n }, [reviewMode, state, regionKinds])\n\n return (\n <section\n aria-label={l.tracked}\n className=\"h-full\"\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-redline' })}\n >\n <RedlineFrame header={header}>\n {state.kind === 'idle' || state.kind === 'identical' || state.kind === 'unavailable' ? (\n <div role=\"status\" className=\"h-full\">\n <RedlineStatus kind={state.kind} reviewMode={reviewMode} labels={labels} />\n </div>\n ) : state.kind === 'computing' ? (\n <RedlineComputing>\n <Loader2 className=\"size-5 animate-spin text-muted-foreground\" aria-hidden />\n <span className=\"sr-only\" role=\"status\">\n {l.computing}\n </span>\n </RedlineComputing>\n ) : (\n <RedlineDocument\n bodyRef={bodyRef}\n gutter={\n reviewMode ? (\n <RedlineRevertGutter\n markers={markers}\n onRevert={onRevert}\n labels={labels}\n testId={testIds?.revert}\n />\n ) : null\n }\n >\n {renderMarkdown(state.markdown, components)}\n </RedlineDocument>\n )}\n </RedlineFrame>\n </section>\n )\n}\n","import { Eye, GitCompare, History } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the timeline. Pass a partial `labels` to translate or reword. */\nexport interface VersionTimelineLabels {\n emptyLive: string\n emptyDocument: string\n untitled: string\n latest: string\n viewing: string\n current: string\n version: (n: number) => string\n branchedFrom: (n: number) => string\n /** Why a version exists, keyed by its `reason` (upload | edit | signed | sync). */\n reasons: Record<string, string>\n open: string\n compare: string\n /** Before the thread a version was made in: \"in {thread}\". */\n madeIn: string\n}\n\nexport const DEFAULT_VERSION_TIMELINE_LABELS: VersionTimelineLabels = {\n emptyLive:\n 'No earlier versions yet. When you ask the assistant for a change, the previous version is kept here.',\n emptyDocument:\n 'No earlier versions yet. Editing this draft and saving creates a new version here.',\n untitled: 'Untitled',\n latest: 'Latest',\n viewing: 'Viewing',\n current: 'Current',\n version: (n) => `Version ${n}`,\n branchedFrom: (n) => `branched from Version ${n}`,\n reasons: {\n upload: 'Original upload',\n edit: 'Saved edit',\n signed: 'Signed',\n sync: 'Synced',\n },\n open: 'Open',\n compare: 'Compare',\n madeIn: 'in',\n}\n\nexport interface VersionTimelineTestIds {\n root: string\n empty: string\n currentBadge: string\n /** Replaces the whole `version-row-<id>` id. */\n row: (id: string) => string\n branch: (id: string) => string\n open: (id: string) => string\n compare: (id: string) => string\n}\n\nexport interface VersionEntry {\n id: string\n /** File name as stored (live artifacts have their extension stripped for display). */\n name: string\n /** ISO string; formatted with `formatDate`. */\n createdAt: string\n /** 1-based version number; defaults to the row's position. */\n number?: number\n /** The version this one was saved from (a restore when it is not the row above). */\n savedFromId?: string | null\n /** Why the version exists: upload | edit | signed | sync. Shown as a label on the row. */\n reason?: string | null\n /** The thread whose turn made this version: named on the row, opening it at that turn. */\n madeIn?: { label: string; onOpen: () => void } | null\n}\n\nexport interface VersionTimelineProps {\n /** Versions in creation order (oldest first). */\n versions: VersionEntry[]\n /** The version currently open. */\n currentId: string\n /**\n * A live (html/react) artifact: plain-language labels for non-developers, no file extension,\n * and no Compare (a text diff of source code means nothing to them).\n */\n live?: boolean\n formatDate: (iso: string) => string\n onOpen: (id: string) => void\n /** Omit to hide Compare (also hidden for `live`). */\n onCompare?: (id: string) => void\n className?: string\n labels?: Partial<VersionTimelineLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<VersionTimelineTestIds>\n}\n\n/**\n * Clickable timeline of an immutable version chain: open any version or compare it with the\n * current one. Versions are numbered in creation order; a version saved from an OLD version is a\n * deliberate branch and says where it came from instead of implying it follows the row above.\n * Test ids: `version-timeline`, `version-timeline-empty`, `version-row-{id}`,\n * `version-current-badge`, `version-branch-{id}`, `open-version-{id}`, `compare-version-{id}`.\n */\nexport function VersionTimeline({\n versions,\n currentId,\n live = false,\n formatDate,\n onOpen,\n onCompare,\n className,\n labels,\n testIds,\n}: VersionTimelineProps) {\n const l = { ...DEFAULT_VERSION_TIMELINE_LABELS, ...labels }\n if (versions.length <= 1) {\n return (\n <div\n className={cn('p-6 text-sm text-muted-foreground', className)}\n data-testid={testIdOr(testIds?.empty, { testId: 'version-timeline-empty' })}\n >\n {live ? l.emptyLive : l.emptyDocument}\n </div>\n )\n }\n\n const numberById = new Map<string, number>()\n versions.forEach((v, i) => numberById.set(v.id, v.number ?? i + 1))\n const canCompare = !live && !!onCompare\n\n return (\n <div\n className={cn('h-full overflow-auto p-4', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'version-timeline' })}\n >\n <ol className=\"mx-auto max-w-2xl space-y-1\">\n {versions.map((v, i) => {\n const isCurrent = v.id === currentId\n const isLatest = i === versions.length - 1\n const number = v.number ?? i + 1\n const savedFromNumber = v.savedFromId ? numberById.get(v.savedFromId) : undefined\n const branchedFrom =\n savedFromNumber !== undefined && savedFromNumber !== number - 1 ? savedFromNumber : null\n // Live artifacts say \"Latest\"/\"Viewing\" (open vs. newest) instead of \"Current\".\n const badge = !isCurrent ? null : live ? (isLatest ? l.latest : l.viewing) : l.current\n const name = live\n ? (v.name || l.untitled).replace(/\\.[A-Za-z0-9]+$/, '')\n : v.name || l.untitled\n const reason = !live && v.reason ? (l.reasons[v.reason] ?? null) : null\n return (\n <li\n key={v.id}\n className={cn(\n 'flex items-center gap-3 rounded-md px-3 py-2.5',\n isCurrent && 'bg-accent'\n )}\n data-testid={testIdOr(testIds?.row?.(v.id), { testId: `version-row-${v.id}` })}\n >\n <History className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-foreground\">{l.version(number)}</span>\n {badge && (\n <span\n className=\"rounded-full bg-background px-2 py-0.5 text-xs font-medium text-accent-foreground\"\n data-testid={testIdOr(testIds?.currentBadge, {\n testId: 'version-current-badge',\n })}\n >\n {badge}\n </span>\n )}\n </div>\n <div className=\"truncate text-sm text-muted-foreground\">\n {name} · {formatDate(v.createdAt)}\n {reason && <span data-testid={`version-reason-${v.id}`}> · {reason}</span>}\n {v.madeIn && (\n <>\n {' '}\n {l.madeIn}{' '}\n <button\n type=\"button\"\n onClick={v.madeIn.onOpen}\n className=\"font-medium text-foreground underline-offset-2 hover:text-primary hover:underline\"\n title={v.madeIn.label}\n data-testid={`version-thread-${v.id}`}\n >\n {v.madeIn.label}\n </button>\n </>\n )}\n {branchedFrom !== null && (\n <span\n data-testid={testIdOr(testIds?.branch?.(v.id), {\n testId: `version-branch-${v.id}`,\n })}\n >\n {' '}\n · {l.branchedFrom(branchedFrom)}\n </span>\n )}\n </div>\n </div>\n {!isCurrent && (\n <>\n <button\n type=\"button\"\n onClick={() => onOpen(v.id)}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.open?.(v.id), {\n testId: `open-version-${v.id}`,\n })}\n >\n <Eye className=\"size-3.5\" /> {l.open}\n </button>\n {canCompare && (\n <button\n type=\"button\"\n onClick={() => onCompare(v.id)}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-sm font-medium text-primary transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.compare?.(v.id), {\n testId: `compare-version-${v.id}`,\n })}\n >\n <GitCompare className=\"size-3.5\" /> {l.compare}\n </button>\n )}\n </>\n )}\n </li>\n )\n })}\n </ol>\n </div>\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/collaboration/mail/MailMessagePreview.tsx","../src/collaboration/mail/mailCompose.ts","../src/collaboration/mail/MailGrid.tsx","../src/collaboration/mail/MailDeliveryList.tsx","../src/collaboration/mail/MailMessageView.tsx","../src/collaboration/mail/MailDocumentPicker.tsx","../src/collaboration/mail/PlainMailBodyEditor.tsx"],"names":["jsx","cn","deliveryProblem","jsxs","Paperclip","useMemo","GridView","Mail","Send","CheckCircle2","Clock","AlertCircle","Button","ArrowLeft","Fragment","Reply","Sparkles","Forward","Archive","Trash2","DOMPurify","useState","Popover","PopoverTrigger","FolderOpen","PopoverContent","Command","CommandInput","CommandList","CommandEmpty","CommandGroup","CommandItem"],"mappings":"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","file":"chunk-U6MPHCEB.cjs","sourcesContent":["import { Paperclip } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface MailMessagePreviewProps {\n participants: string\n subject: string\n preview?: string\n date: string\n dateTime?: string\n unread?: boolean\n hasAttachments?: boolean\n /** A sent message's delivery problem; sent and delivered mail shows nothing, as in other clients. */\n deliveryProblem?: MailDeliveryProblem\n}\n\nexport type MailDeliveryProblem = 'bounced' | 'partially_bounced' | 'delayed'\n\nconst DELIVERY_BADGE: Record<MailDeliveryProblem, { label: string; title: string; tone: string }> =\n {\n bounced: {\n label: 'Bounced',\n title: \"Not delivered: the recipient's mail server sent this message back.\",\n tone: 'bg-destructive/10 text-destructive',\n },\n partially_bounced: {\n label: 'Partly bounced',\n title: 'Some recipients did not get this message. Open it to see who.',\n tone: 'bg-destructive/10 text-destructive',\n },\n delayed: {\n label: 'Delayed',\n title: \"Delivery is delayed; the recipient's server will keep retrying.\",\n tone: 'bg-muted text-muted-foreground',\n },\n }\n\n/** A pill for a sent message that bounced, partly bounced, or is delayed. */\nexport function MailDeliveryBadge({\n problem,\n className,\n}: {\n problem: MailDeliveryProblem\n className?: string\n}) {\n const badge = DELIVERY_BADGE[problem]\n return (\n <span\n className={cn('shrink-0 rounded-full px-2 py-0.5 text-xs font-medium', badge.tone, className)}\n title={badge.title}\n data-testid=\"mail-delivery-badge\"\n >\n {badge.label}\n </span>\n )\n}\n\n/** Compact inbox identity: sender/date, subject, then a body preview. */\nexport function MailMessagePreview({\n participants,\n subject,\n preview,\n date,\n dateTime,\n unread,\n hasAttachments,\n deliveryProblem,\n}: MailMessagePreviewProps) {\n return (\n <div className=\"flex h-full w-full min-w-0 flex-col justify-center gap-0.5 text-sm leading-5\">\n <div className=\"flex min-w-0 items-center gap-2\">\n <span className={cn('min-w-0 flex-1 truncate', unread && 'font-semibold')}>\n {participants}\n </span>\n {hasAttachments && (\n <Paperclip\n className=\"size-3.5 shrink-0 text-muted-foreground\"\n aria-label=\"Has attachments\"\n />\n )}\n {deliveryProblem && <MailDeliveryBadge problem={deliveryProblem} />}\n <time dateTime={dateTime} className=\"shrink-0 text-xs font-normal text-muted-foreground\">\n {date}\n </time>\n </div>\n <div className={cn('truncate', unread && 'font-semibold')}>{subject || '(No subject)'}</div>\n <div className=\"truncate font-normal text-muted-foreground\">{preview || '\\u00a0'}</div>\n </div>\n )\n}\n","/** Pure helpers for writing mail: an empty message, recipient parsing, replies and forwards. */\n\nimport type {\n MailAccount,\n MailAddress,\n MailAttachment,\n MailCompose,\n MailMessage,\n} from '@arbidocs/react'\n\nexport const emptyMailCompose = (): MailCompose => ({\n to: [],\n cc: [],\n bcc: [],\n subject: '',\n text: '',\n attachments: [],\n})\n\n/** A person as shown: the name on the message, else the address. */\nexport const mailAddressLabel = (person: MailAddress): string => person.name || person.email\n\n/**\n * Typed or pasted recipients (`a@x.org; Pat <pat@y.org>`), separated by commas, semicolons or\n * lines, deduplicated by address.\n */\nexport function parseMailRecipients(value: string): MailAddress[] {\n const addresses = (value.match(/(?:[^,;\"\\n]|\"[^\"]*\")+/g) ?? [])\n .map((entry) => entry.trim())\n .filter(Boolean)\n .map((entry) => {\n const named = entry.match(/^(.*?)\\s*<([^<>]+)>$/)\n return named\n ? { email: named[2].trim(), name: named[1].trim().replace(/^\"|\"$/g, '') }\n : { email: entry }\n })\n return addresses.filter(\n (address, index) =>\n addresses.findIndex((item) => item.email.toLowerCase() === address.email.toLowerCase()) ===\n index\n )\n}\n\n/** A reply (to the sender, or everyone with `all`) or a forward of `message`. */\nexport function replyMailCompose(\n message: MailMessage,\n {\n account,\n folderRole,\n forward = false,\n all = false,\n attachments = [],\n }: {\n account: MailAccount\n /** The folder the message is in: replying from Sent goes to its recipients. */\n folderRole: string\n forward?: boolean\n all?: boolean\n /** A forward's attachments, with their content. */\n attachments?: MailAttachment[]\n }\n): MailCompose {\n return {\n ...emptyMailCompose(),\n to: forward ? [] : folderRole === 'sent' ? message.to : message.sender,\n cc: all\n ? [...message.to, ...message.cc]\n .filter(\n (r) =>\n r.email.toLowerCase() !== account.email.toLowerCase() &&\n !message.sender.some((s) => s.email.toLowerCase() === r.email.toLowerCase())\n )\n .filter(\n (r, i, values) =>\n values.findIndex((v) => v.email.toLowerCase() === r.email.toLowerCase()) === i\n )\n : [],\n subject: `${forward ? 'Fwd' : 'Re'}: ${message.subject.replace(/^(Re|Fwd):\\s*/i, '')}`,\n text: `\\n\\n${message.sender.map((s) => s.email).join(', ')} wrote:\\n${message.text}`,\n in_reply_to: forward ? undefined : message.message_id,\n references: [...message.references, ...(message.message_id ? [message.message_id] : [])],\n attachments,\n secure_delivery: message.secure_delivery,\n }\n}\n\n/** A saved draft, reopened for editing (`attachments` with their content). */\nexport function draftMailCompose(message: MailMessage, attachments: MailAttachment[]): MailCompose {\n return {\n to: message.to,\n cc: message.cc,\n bcc: message.bcc,\n subject: message.subject,\n text: message.text,\n html: message.html,\n attachments,\n draft_id: message.id,\n secure_delivery: message.secure_delivery,\n }\n}\n\n/** Whether a message carries a calendar invite (an .ics part). */\nexport const hasCalendarPart = (attachments: MailAttachment[]): boolean =>\n attachments.some(\n (a) => /^text\\/calendar\\b|^application\\/ics\\b/i.test(a.content_type) || /\\.ics$/i.test(a.name)\n )\n","import { useMemo } from 'react'\nimport type { ColDef, GridState } from 'ag-grid-community'\nimport { Mail } from 'lucide-react'\nimport type { MailAddress, MailMessage } from '@arbidocs/react'\nimport { GridView } from '../../files/GridView'\nimport { MailMessagePreview, type MailDeliveryProblem } from './MailMessagePreview'\nimport { mailAddressLabel } from './mailCompose'\n\n/** The list shows only delivery problems; sent and delivered mail stays quiet. */\nfunction deliveryProblem(status: MailMessage['delivery_status']): MailDeliveryProblem | undefined {\n return status === 'bounced' || status === 'partially_bounced' || status === 'delayed'\n ? status\n : undefined\n}\n\nexport interface MailGridProps {\n messages: MailMessage[]\n loading: boolean\n selected: string | null\n /** Sent, Drafts or Outbox: rows show recipients instead of the sender. */\n outgoing?: boolean\n onSelect: (id: string) => void\n /** How a person is named (default: the name on the message, else the address). */\n personLabel?: (person: MailAddress) => string\n /** Column state to restore at mount, and where to persist changes (both optional). */\n gridState?: GridState\n onGridStateChange?: (state: GridState) => void\n}\n\n/** A folder's messages: one row per message, unread dot, participants, subject and preview. */\nexport function MailGrid({\n messages,\n loading,\n selected,\n onSelect,\n outgoing = false,\n personLabel = mailAddressLabel,\n gridState,\n onGridStateChange,\n}: MailGridProps) {\n const columns = useMemo<ColDef<MailMessage>[]>(\n () => [\n {\n colId: 'unread',\n cellStyle: { padding: 0, justifyContent: 'center' },\n headerName: '',\n width: 34,\n minWidth: 34,\n maxWidth: 34,\n sortable: false,\n resizable: false,\n cellRenderer: ({ data }: { data?: MailMessage }) =>\n data?.unread ? (\n <span className=\"inline-block size-2 rounded-full bg-primary\" aria-label=\"Unread\" />\n ) : null,\n },\n {\n colId: 'message',\n cellClass:\n '[&_.ag-cell-value]:h-full [&_.ag-cell-value]:w-full [&_.ag-cell-wrapper]:h-full [&_.ag-cell-wrapper]:w-full',\n headerName: 'Message',\n flex: 1,\n minWidth: 240,\n sortable: false,\n valueGetter: (p) => p.data?.subject ?? '',\n cellRenderer: ({ data }: { data?: MailMessage }) =>\n data ? (\n <MailMessagePreview\n participants={(outgoing ? data.to : data.sender).map(personLabel).join(', ')}\n subject={data.subject}\n preview={data.preview}\n unread={data.unread}\n hasAttachments={Boolean(data.attachments.length)}\n deliveryProblem={deliveryProblem(data.delivery_status)}\n dateTime={data.received_at}\n date={\n data.received_at\n ? new Date(data.received_at).toLocaleString(undefined, {\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n })\n : ''\n }\n />\n ) : null,\n },\n ],\n [outgoing, personLabel]\n )\n return (\n <GridView<MailMessage>\n items={messages}\n columnDefs={columns}\n getItemId={(m) => m.id}\n onRowClick={(m) => onSelect(m.id)}\n height=\"100%\"\n rowHeight={84}\n persistState={Boolean(onGridStateChange)}\n gridId=\"personal-mail-grid-v2\"\n gridState={gridState}\n onGridStateChange={onGridStateChange}\n testId=\"mail-grid\"\n isLoading={loading}\n getRowTestId={(m) => `mail-row-${m.id}`}\n emptyState={{\n icon: <Mail className=\"size-10 text-muted-foreground/50\" />,\n title: 'No messages',\n message: 'Messages in this folder will appear here.',\n }}\n gridOptions={{\n headerHeight: 0,\n suppressCellFocus: false,\n onCellKeyDown: (event) => {\n if ((event.event as KeyboardEvent)?.key === 'Enter' && event.data) onSelect(event.data.id)\n },\n defaultColDef: {\n sortable: true,\n resizable: true,\n filter: false,\n },\n rowClassRules: { 'bg-muted/60': (p) => p.data?.id === selected },\n }}\n />\n )\n}\n","import { AlertCircle, CheckCircle2, Clock, Send } from 'lucide-react'\nimport type { MailDeliveryRecipient } from '@arbidocs/react'\nimport { cn } from '@arbidocs/react/ui'\n\nconst ICONS: Record<MailDeliveryRecipient['status'], typeof Send> = {\n accepted: Send,\n relayed: Send,\n expanded: Send,\n delivered: CheckCircle2,\n delayed: Clock,\n rejected: AlertCircle,\n failed: AlertCircle,\n}\n\nconst LABELS: Record<MailDeliveryRecipient['status'], string> = {\n accepted: 'Sent',\n relayed: 'Sent',\n expanded: 'Sent',\n delivered: 'Delivered',\n delayed: 'Delayed',\n rejected: 'Not delivered',\n failed: 'Not delivered',\n}\n\n/**\n * Where a sent message got to, per recipient: the relay's answer and any delivery reports that came\n * back, in plain words. Shown on sent native mail only.\n */\nexport function MailDeliveryList({\n recipients,\n}: {\n recipients: MailDeliveryRecipient[]\n}): React.ReactElement | null {\n if (recipients.length === 0) return null\n return (\n <section\n aria-label=\"Delivery\"\n className=\"mb-5 rounded-md border border-border/60 px-3 py-2\"\n data-testid=\"mail-delivery-list\"\n >\n <h3 className=\"mb-1 text-xs font-medium text-muted-foreground\">Delivery</h3>\n <ul className=\"space-y-1\">\n {recipients.map((recipient) => {\n const Icon = ICONS[recipient.status]\n const failed = recipient.status === 'failed' || recipient.status === 'rejected'\n return (\n <li\n key={recipient.email}\n className=\"flex flex-wrap items-baseline gap-x-2 text-sm\"\n data-testid={`mail-delivery-${recipient.email}`}\n >\n <Icon\n aria-hidden=\"true\"\n className={cn(\n 'size-3.5 shrink-0 self-center',\n failed ? 'text-destructive' : 'text-muted-foreground'\n )}\n />\n <span className=\"font-medium\">{recipient.email}</span>\n <span className={cn(failed ? 'text-destructive' : 'text-muted-foreground')}>\n {LABELS[recipient.status]}: {recipient.description}\n </span>\n </li>\n )\n })}\n </ul>\n </section>\n )\n}\n","import type { ReactNode } from 'react'\nimport DOMPurify from 'dompurify'\nimport { Archive, ArrowLeft, Forward, Paperclip, Reply, Sparkles, Trash2 } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport type {\n MailAccount,\n MailAddress,\n MailAttachment,\n MailFolder,\n MailMessage,\n MailMessageUpdate,\n} from '@arbidocs/react'\nimport { MailDeliveryBadge } from './MailMessagePreview'\nimport { MailDeliveryList } from './MailDeliveryList'\nimport { hasCalendarPart, mailAddressLabel } from './mailCompose'\n\n/** Why an action that changes the mailbox on the server can't run right now. */\nexport const NEEDS_CONNECTION = 'Available when you are back online'\n\nexport interface MailMessageViewProps {\n account: MailAccount\n message: MailMessage\n folderRole: string\n folders: MailFolder[] | undefined\n isOnline: boolean\n loading: boolean\n uploadPending?: boolean\n onBack: () => void\n onEditDraft: () => void\n onReply: (forward?: boolean, all?: boolean) => void\n /** Ask ARBI to draft the reply (in a chat beside it). Absent: not offered. */\n onReplyWithArbi?: () => void\n onUpdate: (body: MailMessageUpdate) => void\n onDownloadAttachment: (attachment: MailAttachment) => void\n onDownloadOriginal: () => void\n /** Native mail: save the email to a workspace. Absent: not offered. */\n onSaveToWorkspace?: () => void\n /** How a person is named (default: the name on the message, else the address). */\n personLabel?: (person: MailAddress) => string\n /** A calendar invite card, for a message that carries an .ics part. */\n renderInvite?: () => ReactNode\n}\n\nconst SANITIZE = {\n ALLOWED_TAGS: [\n 'p',\n 'br',\n 'strong',\n 'b',\n 'em',\n 'i',\n 'u',\n 's',\n 'ul',\n 'ol',\n 'li',\n 'a',\n 'span',\n 'blockquote',\n ],\n ALLOWED_ATTR: ['href'],\n ALLOW_DATA_ATTR: false,\n}\n\n/** An opened message: its actions, sender, recipients, delivery, attachments and body. */\nexport function MailMessageView({\n account,\n message,\n folderRole,\n folders,\n isOnline,\n loading,\n uploadPending,\n onBack,\n onEditDraft,\n onReply,\n onReplyWithArbi,\n onUpdate,\n onDownloadAttachment,\n onDownloadOriginal,\n onSaveToWorkspace,\n personLabel = mailAddressLabel,\n renderInvite,\n}: MailMessageViewProps) {\n // Moving, marking and saving change the server's mailbox; offline they are unavailable, with why.\n const offlineTitle = isOnline ? undefined : NEEDS_CONNECTION\n return (\n <article className=\"min-w-0 flex-1 overflow-auto p-4 sm:p-5\">\n <Button className=\"mb-3\" variant=\"ghost\" onClick={onBack}>\n <ArrowLeft className=\"mr-2 size-4\" />\n Back\n </Button>\n {loading && <p className=\"text-muted-foreground\">Loading message…</p>}\n <div className=\"-mx-4 mb-5 flex flex-wrap items-center gap-1 border-b bg-muted/20 px-3 py-1.5 sm:-mx-5 [&_button]:h-8 [&_button]:px-2 [&_button]:text-xs\">\n {folderRole === 'drafts' ? (\n <Button onClick={onEditDraft}>Edit draft</Button>\n ) : (\n <>\n <Button variant=\"ghost\" onClick={() => onReply()}>\n <Reply className=\"mr-2 size-4\" />\n Reply\n </Button>\n {onReplyWithArbi && (\n <Button variant=\"ghost\" onClick={onReplyWithArbi}>\n <Sparkles className=\"mr-2 size-4\" />\n Reply with ARBI\n </Button>\n )}\n {message.to.length + message.cc.length > 1 && (\n <Button variant=\"ghost\" onClick={() => onReply(false, true)}>\n Reply all\n </Button>\n )}\n <Button variant=\"ghost\" onClick={() => onReply(true)}>\n <Forward className=\"mr-2 size-4\" />\n Forward\n </Button>\n </>\n )}\n <Button\n variant=\"ghost\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() => onUpdate({ unread: !message.unread })}\n >\n {message.unread ? 'Mark read' : 'Mark unread'}\n </Button>\n {(folderRole === 'archive' || folderRole === 'trash') && (\n <Button\n variant=\"ghost\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() =>\n onUpdate({ folder_id: folders?.find((f) => f.role === 'inbox')?.id ?? 'inbox' })\n }\n >\n Move to Inbox\n </Button>\n )}\n <Button\n variant=\"ghost\"\n aria-label=\"Archive message\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() =>\n onUpdate({ folder_id: folders?.find((f) => f.role === 'archive')?.id ?? 'archive' })\n }\n >\n <Archive className=\"size-4\" />\n </Button>\n <Button\n variant=\"ghost\"\n aria-label=\"Trash message\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={() => onUpdate({ action: 'trash' })}\n >\n <Trash2 className=\"size-4\" />\n </Button>\n </div>\n <div className=\"mb-4 flex flex-wrap items-center gap-2\">\n <h2 className=\"text-xl font-semibold leading-snug tracking-tight\">\n {message.subject || '(No subject)'}\n </h2>\n {(message.delivery_status === 'bounced' ||\n message.delivery_status === 'partially_bounced' ||\n message.delivery_status === 'delayed') && (\n <MailDeliveryBadge problem={message.delivery_status} />\n )}\n </div>\n <div className=\"mb-5 flex gap-3 border-b border-border/60 pb-4\">\n <span\n aria-hidden=\"true\"\n className=\"flex size-10 shrink-0 items-center justify-center rounded-full bg-primary/10 text-sm font-semibold text-primary\"\n >\n {(message.sender[0]?.name || message.sender[0]?.email || '?')\n .split(/\\s+/)\n .slice(0, 2)\n .map((part) => part[0])\n .join('')\n .toUpperCase()}\n </span>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline justify-between gap-1\">\n <p className=\"text-sm font-semibold\">\n {message.sender.map((person) => person.name || person.email).join(', ')}\n </p>\n <time className=\"text-[11px] text-muted-foreground\">\n {message.received_at ? new Date(message.received_at).toLocaleString() : ''}\n </time>\n </div>\n <p className=\"break-all text-xs text-muted-foreground\">\n {message.sender.map((person) => person.email).join(', ')}\n </p>\n <p className=\"mt-2 break-all text-xs text-muted-foreground\">\n To: {message.to.map(personLabel).join(', ')}\n {message.cc.length > 0 && ` · Cc: ${message.cc.map(personLabel).join(', ')}`}\n </p>\n </div>\n </div>\n <MailDeliveryList recipients={message.delivery ?? []} />\n {renderInvite && hasCalendarPart(message.attachments) && renderInvite()}\n <div className=\"mb-4 flex flex-wrap gap-2\">\n {message.attachments.map((a) => (\n <Button\n key={a.id}\n className=\"h-auto min-h-12 justify-start rounded-md border-border/70 bg-muted/20 px-3 py-2 text-left shadow-none hover:bg-muted/60\"\n variant=\"outline\"\n onClick={() => onDownloadAttachment(a)}\n >\n <Paperclip className=\"mr-2 size-4\" />\n <span className=\"min-w-0\">\n <span className=\"block truncate text-xs font-medium\">{a.name}</span>\n <span\n aria-hidden=\"true\"\n className=\"block text-[11px] font-normal text-muted-foreground\"\n >\n {a.size < 1024 ? `${a.size} B` : `${Math.ceil(a.size / 1024)} KB`}\n </span>\n </span>\n </Button>\n ))}\n </div>\n {message.html && message.text ? (\n <div\n data-testid=\"mail-message-body\"\n className=\"text-sm leading-7 [&_p]:mb-3 [&_ul]:list-disc [&_ul]:pl-6 [&_ol]:list-decimal [&_ol]:pl-6 [&_a]:text-primary [&_a]:underline\"\n dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(message.html, SANITIZE) }}\n />\n ) : message.text ? (\n <pre\n data-testid=\"mail-message-body\"\n className=\"whitespace-pre-wrap break-words font-sans text-sm leading-7 text-foreground/90\"\n >\n {message.text.split(/(https?:\\/\\/[^\\s]+)/g).map((part, index) =>\n /^https?:\\/\\//.test(part) ? (\n <a\n key={index}\n href={part}\n className=\"text-primary underline underline-offset-2\"\n rel=\"noreferrer\"\n >\n {part}\n </a>\n ) : (\n part\n )\n )}\n </pre>\n ) : message.html ? (\n <iframe\n title=\"Email body\"\n sandbox=\"\"\n referrerPolicy=\"no-referrer\"\n className=\"min-h-96 w-full border-0 bg-white\"\n srcDoc={`<meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; img-src data:; style-src 'unsafe-inline'; base-uri 'none'; form-action 'none'\">${message.html}`}\n />\n ) : (\n <p className=\"text-muted-foreground\">Empty message</p>\n )}\n {account.provider === 'native' && (\n <div className=\"flex flex-wrap gap-2\">\n <Button\n className=\"mt-5\"\n variant=\"outline\"\n disabled={!isOnline}\n title={offlineTitle}\n onClick={onDownloadOriginal}\n >\n Download original email\n </Button>\n {onSaveToWorkspace && (\n <Button\n className=\"mt-5\"\n variant=\"outline\"\n disabled={uploadPending || !isOnline}\n title={offlineTitle}\n onClick={onSaveToWorkspace}\n >\n Save to workspace\n </Button>\n )}\n </div>\n )}\n </article>\n )\n}\n","import { useMemo, useState, type ReactNode } from 'react'\nimport { FolderOpen } from 'lucide-react'\nimport {\n Button,\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from '@arbidocs/react/ui'\n\n/** A workspace document that can be attached to an email. */\nexport interface MailAttachableDocument {\n id: string\n title: string\n /** Its file-type icon. */\n icon?: ReactNode\n}\n\nexport interface MailDocumentPickerProps {\n documents: MailAttachableDocument[]\n onAttach: (document: MailAttachableDocument) => void\n disabled?: boolean\n}\n\n/** \"From workspace\": a searchable list of the workspace's documents, attached as their files. */\nexport function MailDocumentPicker({\n documents,\n onAttach,\n disabled = false,\n}: MailDocumentPickerProps): React.ReactElement {\n const [open, setOpen] = useState(false)\n const [query, setQuery] = useState('')\n const filtered = useMemo(() => {\n const q = query.trim().toLowerCase()\n return q ? documents.filter((d) => d.title.toLowerCase().includes(q)) : documents\n }, [documents, query])\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={disabled}\n data-testid=\"mail-attach-workspace-document\"\n >\n <FolderOpen className=\"mr-2 size-4\" />\n From workspace\n </Button>\n </PopoverTrigger>\n <PopoverContent className=\"w-80 p-0\" align=\"start\" sideOffset={4}>\n <Command shouldFilter={false}>\n <CommandInput placeholder=\"Search documents...\" value={query} onValueChange={setQuery} />\n <CommandList className=\"max-h-72\">\n <CommandEmpty>No documents in this workspace</CommandEmpty>\n <CommandGroup>\n {filtered.map((doc) => (\n <CommandItem\n key={doc.id}\n value={doc.id}\n onSelect={() => {\n setOpen(false)\n setQuery('')\n onAttach(doc)\n }}\n data-testid={`document-search-item-${doc.id}`}\n >\n {doc.icon && <span className=\"shrink-0 text-muted-foreground\">{doc.icon}</span>}\n <span className=\"ml-1.5 flex-1 truncate text-sm\">{doc.title}</span>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n )\n}\n","export interface MailBodyEditorProps {\n text: string\n html?: string\n disabled: boolean\n /** Every edit: the plain text and, from the rich editor, its HTML (`''` from this one). */\n onChange: (text: string, html: string) => void\n}\n\n/**\n * The message body as plain text: used when the rich editor (an optional peer, `lexical`) is not\n * installed or could not be loaded.\n */\nexport function PlainMailBodyEditor({ text, disabled, onChange }: MailBodyEditorProps) {\n return (\n <textarea\n aria-label=\"Message\"\n className=\"my-3 min-h-48 w-full resize-y bg-transparent text-sm outline-none\"\n value={text}\n disabled={disabled}\n onChange={(event) => onChange(event.target.value, '')}\n />\n )\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/artifacts/ArtifactCompareBar.tsx","../src/artifacts/ArtifactEditorBody.tsx","../src/artifacts/ArtifactToolbar.tsx","../src/artifacts/ArtifactVersionBar.tsx","../src/artifacts/ArtifactEditor.tsx","../src/artifacts/RedlineParts.tsx","../src/artifacts/ArtifactRedlineView.tsx","../src/artifacts/VersionTimeline.tsx"],"names":["jsxs","Fragment","jsx","cn","testIdOr","Eye","EyeOff","ArrowLeftRight","X","useCallback","Button","Pencil","GitCompare","Loader2","Check","History","Undo2","useRef","useState","useMemo","useLayoutEffect"],"mappings":"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","file":"chunk-W4GXDARU.cjs","sourcesContent":["import type { ReactNode } from 'react'\nimport { ArrowLeftRight, Eye, EyeOff, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the compare bar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactCompareBarLabels {\n compareVs: string\n trackChanges: string\n trackChangesBack: string\n trackChangesView: string\n flipComparison: string\n stopComparing: string\n}\n\nexport const DEFAULT_ARTIFACT_COMPARE_BAR_LABELS: ArtifactCompareBarLabels = {\n compareVs: 'Compare vs.',\n trackChanges: 'Track changes',\n trackChangesBack: 'Back to editing (your comparison stays active)',\n trackChangesView: 'View tracked changes against Compare vs.',\n flipComparison: 'Flip comparison direction',\n stopComparing: 'Stop comparing',\n}\n\nexport interface ArtifactCompareBarTestIds {\n trackChanges: string\n}\n\nexport interface ArtifactCompareBarProps {\n /** The compared-against version (the host renders its name or pill). */\n compareTarget: ReactNode\n /** \"v2\": which version it is, when every version shares one file name. */\n versionLabel?: string | null\n /** An editable artifact toggles Track changes; a read-only comparison gets a flip arrow. */\n mode: 'track-changes' | 'flip'\n showTrackChanges: boolean\n onToggleTrackChanges: () => void\n onFlip: () => void\n onStop: () => void\n labels?: Partial<ArtifactCompareBarLabels>\n testIds?: Partial<ArtifactCompareBarTestIds>\n}\n\nconst barButton =\n 'inline-flex shrink-0 items-center gap-1 rounded-md px-1.5 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:min-w-11 pointer-coarse:px-2.5'\n\n/**\n * \"Compare vs. [version]\" row contents: always an explicit text label (an icon-only pill was\n * unclear), with Track changes or Flip, and Stop comparing.\n */\nexport function ArtifactCompareBar({\n compareTarget,\n versionLabel,\n mode,\n showTrackChanges,\n onToggleTrackChanges,\n onFlip,\n onStop,\n labels,\n testIds,\n}: ArtifactCompareBarProps) {\n const l = { ...DEFAULT_ARTIFACT_COMPARE_BAR_LABELS, ...labels }\n return (\n <>\n <span className=\"shrink-0 text-sm text-muted-foreground\">{l.compareVs}</span>\n {compareTarget}\n {versionLabel && (\n <span className=\"shrink-0 text-xs text-muted-foreground\">{versionLabel}</span>\n )}\n {mode === 'track-changes' ? (\n <button\n type=\"button\"\n onClick={onToggleTrackChanges}\n aria-pressed={showTrackChanges}\n className={cn(\n barButton,\n showTrackChanges\n ? 'bg-accent text-accent-foreground hover:bg-accent/70'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={showTrackChanges ? l.trackChangesBack : l.trackChangesView}\n data-testid={testIdOr(testIds?.trackChanges, { testId: 'track-changes-toggle' })}\n >\n {showTrackChanges ? (\n <Eye className=\"size-3.5\" aria-hidden />\n ) : (\n <EyeOff className=\"size-3.5\" aria-hidden />\n )}\n {l.trackChanges}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={onFlip}\n className={cn(\n barButton,\n 'p-1 text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={l.flipComparison}\n aria-label={l.flipComparison}\n >\n <ArrowLeftRight className=\"size-3.5\" aria-hidden />\n </button>\n )}\n <button\n type=\"button\"\n onClick={onStop}\n className={cn(\n barButton,\n 'ml-auto text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n title={l.stopComparing}\n >\n <X className=\"size-3\" aria-hidden />\n {l.stopComparing}\n </button>\n </>\n )\n}\n","import { useCallback, type KeyboardEvent, type ReactNode } from 'react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport type { RenderMarkdown } from './ArtifactRedlineView'\n\nexport interface ArtifactEditorBodyTestIds {\n /** The read-only rendered document. */\n rendered: string\n /** The track-changes panel. */\n trackChanges: string\n}\n\nexport interface ArtifactEditorBodyProps {\n /** The saved markdown, shown rendered while not editing. */\n content: string\n isEditing: boolean\n /** A comparison is active. */\n comparing: boolean\n /** Show the track-changes panel instead of the editor (needs `comparing`). */\n showTrackChanges: boolean\n /** The editing surface (for example `ArtifactMarkdownEditor`). */\n editor: ReactNode\n /** The track-changes panel (for example `ArtifactRedlineView`). */\n redline: ReactNode\n renderMarkdown: RenderMarkdown\n /** Mod+S while editing; omit to leave the shortcut to the browser. */\n onSave?: () => void\n /** Mod+S only saves when this is true (there are changes and no save is running). */\n canSave?: boolean\n className?: string\n testIds?: Partial<ArtifactEditorBodyTestIds>\n}\n\n/**\n * The body of an artifact: the rendered document when reading, the editor when editing, and the\n * track-changes panel in its place while comparing. It is either typing or reviewing, never both\n * stacked, as in Word's Show Markup. Mod+S saves from anywhere inside it.\n */\nexport function ArtifactEditorBody({\n content,\n isEditing,\n comparing,\n showTrackChanges,\n editor,\n redline,\n renderMarkdown,\n onSave,\n canSave = true,\n className,\n testIds,\n}: ArtifactEditorBodyProps) {\n const onKeyDown = useCallback(\n (e: KeyboardEvent<HTMLDivElement>) => {\n if (!isEditing || !onSave) return\n if ((e.metaKey || e.ctrlKey) && !e.altKey && e.key.toLowerCase() === 's') {\n e.preventDefault()\n if (canSave) onSave()\n }\n },\n [isEditing, onSave, canSave]\n )\n\n const tracking = isEditing && comparing && showTrackChanges\n return (\n // The key handler only listens to bubbling keystrokes of the editor inside; the editor itself\n // is the focusable element.\n <div\n data-slot=\"artifact-body\"\n className={cn('h-full min-h-0 overflow-auto', className)}\n onKeyDown={onKeyDown}\n >\n {!isEditing ? (\n <div\n className=\"p-6\"\n data-slot=\"artifact-rendered\"\n data-testid={testIdOr(testIds?.rendered, { testId: 'document-rendered-markdown' })}\n >\n {renderMarkdown(content)}\n </div>\n ) : tracking ? (\n <div\n className=\"h-full\"\n data-testid={testIdOr(testIds?.trackChanges, { testId: 'track-changes-panel' })}\n >\n {redline}\n </div>\n ) : (\n editor\n )}\n </div>\n )\n}\n","import { Check, GitCompare, Loader2, Pencil, X } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the toolbar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactToolbarLabels {\n /** The accessible name of the group of actions. */\n group: string\n edit: string\n cancel: string\n cancelTitle: string\n compare: string\n compareTitle: string\n saveDocument: string\n saveAsVersion: string\n noChanges: string\n saving: string\n save: string\n saveVersion: string\n /** Announced (not shown) when there are unsaved changes. */\n unsaved: string\n}\n\nexport const DEFAULT_ARTIFACT_TOOLBAR_LABELS: ArtifactToolbarLabels = {\n group: 'Document actions',\n edit: 'Edit',\n cancel: 'Cancel',\n cancelTitle: 'Cancel editing',\n compare: 'Compare with previous',\n compareTitle: 'Compare against the previous version',\n saveDocument: 'Save document',\n saveAsVersion: 'Save as a new version',\n noChanges: 'No changes to save',\n saving: 'Saving…',\n save: 'Save',\n saveVersion: 'Save version',\n unsaved: 'Unsaved changes',\n}\n\nexport interface ArtifactToolbarTestIds {\n edit: string\n cancel: string\n compare: string\n save: string\n unsavedDot: string\n}\n\nexport interface ArtifactToolbarProps {\n isEditing: boolean\n /** A new document that has no earlier version: \"Save\" instead of \"Save version\", no Cancel. */\n isDraft?: boolean\n /** Narrow panel: icon-only Edit and Compare. Save keeps its label. */\n compact?: boolean\n /** The buffer differs from the saved version. */\n hasChanges: boolean\n isSaving: boolean\n /** Offer \"Compare against the previous version\". */\n canCompare: boolean\n onStartEdit: () => void\n /** Edit is not offered yet (the text is still being prepared). */\n editDisabled?: boolean\n /** Discard the buffer and leave edit mode. */\n onCancel: () => void\n onCompare: () => void\n /** Save the buffer as a NEW version. */\n onSave: () => void\n className?: string\n labels?: Partial<ArtifactToolbarLabels>\n testIds?: Partial<ArtifactToolbarTestIds>\n}\n\n/**\n * Edit, Cancel (discard), Compare and Save for an artifact. Save is the ONE filled button and only\n * once there is something to save; a dot marks unsaved changes and a polite status announces them.\n * Touch targets are 44px on coarse pointers.\n */\nexport function ArtifactToolbar({\n isEditing,\n isDraft = false,\n compact = false,\n hasChanges,\n isSaving,\n canCompare,\n editDisabled = false,\n onStartEdit,\n onCancel,\n onCompare,\n onSave,\n className,\n labels,\n testIds,\n}: ArtifactToolbarProps) {\n const l = { ...DEFAULT_ARTIFACT_TOOLBAR_LABELS, ...labels }\n const group = (children: React.ReactNode): React.ReactElement => (\n <div\n role=\"group\"\n aria-label={l.group}\n data-slot=\"artifact-toolbar\"\n className={cn('flex items-center gap-2', compact && 'gap-1', className)}\n >\n {children}\n </div>\n )\n\n if (!isEditing) {\n return group(\n <Button\n onClick={onStartEdit}\n disabled={editDisabled}\n variant=\"outline\"\n size={compact ? 'icon' : 'sm'}\n title={l.edit}\n aria-label={l.edit}\n data-testid={testIdOr(testIds?.edit, { testId: 'edit-document-button' })}\n className=\"pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <Pencil className=\"size-4\" aria-hidden />\n {!compact && <span className=\"ml-1\">{l.edit}</span>}\n </Button>\n )\n }\n return group(\n <>\n {/* A draft has no Cancel: the panel's own Close is the one way out (it warns first). */}\n {!isDraft && (\n <Button\n onClick={onCancel}\n variant=\"outline\"\n size=\"sm\"\n title={l.cancelTitle}\n data-testid={testIdOr(testIds?.cancel, { testId: 'cancel-edit-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n <X className=\"size-4\" aria-hidden />\n <span className=\"ml-1\">{l.cancel}</span>\n </Button>\n )}\n {canCompare && (\n <Button\n onClick={onCompare}\n variant=\"outline\"\n size={compact ? 'icon' : 'sm'}\n title={l.compareTitle}\n aria-label={l.compare}\n data-testid={testIdOr(testIds?.compare, { testId: 'compare-button' })}\n className=\"pointer-coarse:min-h-11 pointer-coarse:min-w-11\"\n >\n <GitCompare className=\"size-4\" aria-hidden />\n {!compact && <span className=\"ml-1\">{l.compare}</span>}\n </Button>\n )}\n <div className=\"relative\">\n <Button\n onClick={onSave}\n variant={hasChanges ? 'default' : 'outline'}\n size=\"sm\"\n title={hasChanges ? (isDraft ? l.saveDocument : l.saveAsVersion) : l.noChanges}\n disabled={!hasChanges || isSaving}\n data-testid={testIdOr(testIds?.save, { testId: 'save-document-button' })}\n className=\"pointer-coarse:min-h-11\"\n >\n {isSaving ? (\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n ) : (\n <Check className=\"size-4\" aria-hidden />\n )}\n <span className=\"ml-1\">{isSaving ? l.saving : isDraft ? l.save : l.saveVersion}</span>\n </Button>\n {hasChanges && !isSaving && (\n <span\n className=\"absolute -right-1 -top-1 size-2.5 rounded-full bg-primary ring-2 ring-background\"\n aria-hidden\n data-testid={testIdOr(testIds?.unsavedDot, { testId: 'unsaved-changes-dot' })}\n />\n )}\n </div>\n <span role=\"status\" className=\"sr-only\">\n {hasChanges && !isSaving ? l.unsaved : ''}\n </span>\n </>\n )\n}\n","import { GitCompare, History } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport type { VersionEntry } from './VersionTimeline'\n\n/** Every fixed string of the version bar. Pass a partial `labels` to translate or reword. */\nexport interface ArtifactVersionBarLabels {\n group: string\n /** \"Version 2 of 3\". */\n position: (index: number, total: number) => string\n /** The only version: nothing to choose from yet. */\n only: string\n latest: string\n select: string\n option: (index: number, date: string, isCurrent: boolean) => string\n compare: string\n compareTitle: string\n}\n\nexport const DEFAULT_ARTIFACT_VERSION_BAR_LABELS: ArtifactVersionBarLabels = {\n group: 'Versions',\n position: (index, total) => `Version ${index} of ${total}`,\n only: 'Version 1',\n latest: 'Latest',\n select: 'Open a version',\n option: (index, date, isCurrent) => `Version ${index} · ${date}${isCurrent ? ' (open)' : ''}`,\n compare: 'Compare with previous',\n compareTitle: 'Compare this version against the one it was saved from',\n}\n\nexport interface ArtifactVersionBarTestIds {\n root: string\n position: string\n select: string\n compare: string\n}\n\nexport interface ArtifactVersionBarProps {\n /** The lineage, oldest first. */\n versions: VersionEntry[]\n /** The open version. */\n currentId: string\n formatDate: (iso: string) => string\n /** Open another version (selected from the list). */\n onOpen: (id: string) => void\n /** Compare the open version with the one before it. Omit to hide the button. */\n onCompare?: () => void\n className?: string\n labels?: Partial<ArtifactVersionBarLabels>\n testIds?: Partial<ArtifactVersionBarTestIds>\n}\n\n/**\n * Where you are in an artifact's versions: \"Version 2 of 3\", a list to open any version, and\n * Compare with the previous one. Saving a new version is the toolbar's Save button; the editor\n * lays the two out on one row. The list is a native select: it is keyboard and screen-reader\n * complete and uses the phone's own picker.\n */\nexport function ArtifactVersionBar({\n versions,\n currentId,\n formatDate,\n onOpen,\n onCompare,\n className,\n labels,\n testIds,\n}: ArtifactVersionBarProps) {\n const l = { ...DEFAULT_ARTIFACT_VERSION_BAR_LABELS, ...labels }\n const index = versions.findIndex((v) => v.id === currentId)\n const isLatest = index === versions.length - 1\n return (\n <div\n role=\"group\"\n aria-label={l.group}\n data-slot=\"artifact-version-bar\"\n className={cn('flex min-w-0 flex-wrap items-center gap-2 text-sm', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-version-bar' })}\n >\n <History className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <span\n className=\"shrink-0 font-medium text-foreground\"\n data-testid={testIdOr(testIds?.position, { testId: 'artifact-version-position' })}\n >\n {versions.length > 1 && index >= 0 ? l.position(index + 1, versions.length) : l.only}\n </span>\n {versions.length > 1 && index >= 0 && isLatest && (\n <span className=\"shrink-0 rounded-full bg-accent px-2 py-0.5 text-xs font-medium text-accent-foreground\">\n {l.latest}\n </span>\n )}\n {versions.length > 1 && (\n <select\n aria-label={l.select}\n value={currentId}\n onChange={(e) => onOpen(e.target.value)}\n className=\"min-w-0 max-w-full rounded-md border border-input bg-background px-2 py-1 text-sm text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11 pointer-coarse:text-base\"\n data-testid={testIdOr(testIds?.select, { testId: 'artifact-version-select' })}\n >\n {versions.map((v, i) => (\n <option key={v.id} value={v.id}>\n {l.option(v.number ?? i + 1, formatDate(v.createdAt), v.id === currentId)}\n </option>\n ))}\n </select>\n )}\n {onCompare && (\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={onCompare}\n title={l.compareTitle}\n className=\"pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.compare, { testId: 'artifact-version-compare' })}\n >\n <GitCompare className=\"size-4\" aria-hidden />\n <span className=\"ml-1\">{l.compare}</span>\n </Button>\n )}\n </div>\n )\n}\n","import type { ReactNode } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport { ArtifactCompareBar, type ArtifactCompareBarLabels } from './ArtifactCompareBar'\nimport { ArtifactEditorBody, type ArtifactEditorBodyTestIds } from './ArtifactEditorBody'\nimport type { RenderMarkdown } from './ArtifactRedlineView'\nimport { ArtifactToolbar, type ArtifactToolbarLabels } from './ArtifactToolbar'\nimport {\n ArtifactVersionBar,\n type ArtifactVersionBarLabels,\n type ArtifactVersionBarTestIds,\n} from './ArtifactVersionBar'\nimport type { VersionEntry } from './VersionTimeline'\n\n/** Whether the artifact's text is available (`ArtifactTextStatus` of `@arbidocs/react/artifacts`). */\nexport type ArtifactEditorStatus = 'loading' | 'parsing' | 'ready' | 'error'\n\nexport interface ArtifactEditorStatusLabels {\n /** Shown while the backend is still parsing a fresh upload. */\n preparing: string\n error: string\n retry: string\n}\n\nexport const DEFAULT_ARTIFACT_EDITOR_STATUS_LABELS: ArtifactEditorStatusLabels = {\n preparing: 'Preparing editor…',\n error: \"The document couldn't be prepared for editing.\",\n retry: 'Try again',\n}\n\nexport interface ArtifactEditorLabels {\n status: Partial<ArtifactEditorStatusLabels>\n toolbar: Partial<ArtifactToolbarLabels>\n versions: Partial<ArtifactVersionBarLabels>\n compare: Partial<ArtifactCompareBarLabels>\n}\n\nexport interface ArtifactEditorTestIds {\n root: string\n /** The \"Preparing editor\" state. */\n preparing: string\n /** The error state and its retry button. */\n error: string\n retry: string\n compareRow: string\n body: Partial<ArtifactEditorBodyTestIds>\n versions: Partial<ArtifactVersionBarTestIds>\n}\n\nexport interface ArtifactEditorProps {\n /** The saved markdown of the open version. */\n content: string\n isEditing: boolean\n hasChanges: boolean\n isSaving: boolean\n isDraft?: boolean\n /** Narrow container: icon-only Edit and Compare. */\n compact?: boolean\n canCompare: boolean\n /** A comparison is active. */\n comparing: boolean\n /** The version being compared against. */\n compareId?: string | null\n showTrackChanges: boolean\n /**\n * Whether the text is available. While `loading` or `parsing` the body is a \"Preparing editor\"\n * state (the toolbar is disabled: an editor on an empty baseline would save a blank version);\n * `error` shows `labels.status.error` with Retry (`onRetry`). Default `ready`.\n */\n status?: ArtifactEditorStatus\n /** Ask for the text again after an `error`. */\n onRetry?: () => void\n /** The lineage, oldest first. The version bar shows only for two or more. */\n versions?: VersionEntry[]\n currentVersionId?: string\n onStartEdit: () => void\n onCancel: () => void\n /** Save the buffer as a new version. */\n onSave: () => void\n onCompare: () => void\n onStopCompare: () => void\n onToggleTrackChanges: () => void\n /** Open another version from the version list. */\n onOpenVersion?: (id: string) => void\n formatDate?: (iso: string) => string\n /** The editing surface (for example `ArtifactMarkdownEditor`). */\n editor: ReactNode\n /** The track-changes panel (for example `ArtifactRedlineView`). */\n redline: ReactNode\n renderMarkdown: RenderMarkdown\n /** Extra actions in the header (share, download...). */\n actions?: ReactNode\n className?: string\n labels?: Partial<ArtifactEditorLabels>\n testIds?: Partial<ArtifactEditorTestIds>\n}\n\nconst defaultFormatDate = (iso: string): string => {\n const date = new Date(iso)\n return Number.isNaN(date.getTime()) ? iso : date.toLocaleString()\n}\n\n/**\n * The artifact surface: a header with the version bar and the toolbar (Edit, Cancel, Compare,\n * Save as a new version), a compare row while comparing, and the body (read, edit or track\n * changes). Everything is view-model driven: a host binds state with `useArtifactSession` from\n * `@arbidocs/react/artifacts` and passes the editor and redline as slots.\n */\nexport function ArtifactEditor({\n content,\n isEditing,\n hasChanges,\n isSaving,\n isDraft = false,\n compact = false,\n canCompare,\n comparing,\n compareId,\n showTrackChanges,\n status = 'ready',\n onRetry,\n versions = [],\n currentVersionId = '',\n onStartEdit,\n onCancel,\n onSave,\n onCompare,\n onStopCompare,\n onToggleTrackChanges,\n onOpenVersion,\n formatDate = defaultFormatDate,\n editor,\n redline,\n renderMarkdown,\n actions,\n className,\n labels,\n testIds,\n}: ArtifactEditorProps) {\n const compared = versions.findIndex((v) => v.id === compareId)\n const unavailable = status !== 'ready'\n const statusLabels = { ...DEFAULT_ARTIFACT_EDITOR_STATUS_LABELS, ...labels?.status }\n return (\n <div\n data-slot=\"artifact-editor\"\n className={cn('flex h-full max-h-dvh min-h-0 flex-col bg-background', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-editor' })}\n >\n <div className=\"flex flex-wrap items-center justify-between gap-2 border-b border-border px-3 py-2\">\n {versions.length > 0 && onOpenVersion ? (\n <ArtifactVersionBar\n versions={versions}\n currentId={currentVersionId}\n formatDate={formatDate}\n onOpen={onOpenVersion}\n // While reading, Compare is here; while editing it is in the toolbar.\n onCompare={canCompare && !isEditing && !unavailable ? onCompare : undefined}\n labels={labels?.versions}\n testIds={testIds?.versions}\n />\n ) : (\n <span />\n )}\n <div className=\"flex items-center gap-2\">\n <ArtifactToolbar\n isEditing={isEditing}\n isDraft={isDraft}\n compact={compact}\n hasChanges={hasChanges}\n isSaving={isSaving}\n // Reading with a version bar: the bar carries Compare. Editing: the toolbar does.\n canCompare={\n canCompare && !unavailable && (isEditing || !(versions.length > 0 && onOpenVersion))\n }\n editDisabled={unavailable}\n onStartEdit={onStartEdit}\n onCancel={onCancel}\n onCompare={onCompare}\n onSave={onSave}\n labels={labels?.toolbar}\n />\n {actions}\n </div>\n </div>\n {comparing && (\n <div\n className=\"flex flex-wrap items-center gap-1.5 border-b border-border px-3 py-1.5\"\n data-testid={testIdOr(testIds?.compareRow, { testId: 'artifact-compare-row' })}\n >\n <ArtifactCompareBar\n compareTarget={\n <span className=\"min-w-0 truncate text-sm font-medium text-foreground\">\n {compared >= 0 ? versions[compared].name : ''}\n </span>\n }\n versionLabel={\n compared >= 0 && versions.length > 1\n ? `v${versions[compared].number ?? compared + 1}`\n : null\n }\n mode=\"track-changes\"\n showTrackChanges={showTrackChanges}\n onToggleTrackChanges={onToggleTrackChanges}\n onFlip={onStopCompare}\n onStop={onStopCompare}\n labels={labels?.compare}\n />\n </div>\n )}\n <div className=\"min-h-0 flex-1\">\n {unavailable ? (\n status === 'error' ? (\n <div\n role=\"alert\"\n className=\"flex h-full flex-col items-center justify-center gap-3 p-6 text-center text-sm\"\n data-testid={testIdOr(testIds?.error, { testId: 'artifact-editor-error' })}\n >\n <p className=\"text-foreground\">{statusLabels.error}</p>\n {onRetry && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onRetry}\n className=\"pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.retry, { testId: 'artifact-editor-retry' })}\n >\n {statusLabels.retry}\n </Button>\n )}\n </div>\n ) : (\n <p\n role=\"status\"\n className=\"flex h-full items-center justify-center gap-2 p-6 text-sm text-muted-foreground\"\n data-testid={testIdOr(testIds?.preparing, { testId: 'artifact-editor-preparing' })}\n >\n <Loader2 className=\"size-4 animate-spin\" aria-hidden />\n {statusLabels.preparing}\n </p>\n )\n ) : (\n <ArtifactEditorBody\n content={content}\n isEditing={isEditing}\n comparing={comparing}\n showTrackChanges={showTrackChanges}\n editor={editor}\n redline={redline}\n renderMarkdown={renderMarkdown}\n onSave={onSave}\n canSave={hasChanges && !isSaving}\n testIds={testIds?.body}\n />\n )}\n </div>\n </div>\n )\n}\n","import type { ComponentPropsWithoutRef, ReactNode, Ref } from 'react'\nimport { ArrowLeftRight, Undo2 } from 'lucide-react'\nimport { Button, cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the redline parts. Pass a partial `labels` to translate or reword. */\nexport interface RedlineLabels {\n flipComparison: string\n noDocument: string\n noChangesYet: string\n identical: string\n unavailable: string\n revertMove: string\n revertReplace: string\n revertAdd: string\n revertRemove: string\n /** The accessible name of the redline region. */\n tracked: string\n /** Announced while the diff computes. */\n computing: string\n}\n\nexport const DEFAULT_REDLINE_LABELS: RedlineLabels = {\n flipComparison: 'Flip comparison',\n noDocument: 'No document selected for comparison.',\n noChangesYet: 'No changes yet — start editing to see redlined differences here.',\n identical: 'Documents are identical.',\n unavailable: 'Document text not available for comparison.',\n revertMove: 'Undo this move (revert both ends)',\n revertReplace: 'Undo this edit',\n revertAdd: 'Undo this insertion',\n revertRemove: 'Undo this deletion',\n tracked: 'Tracked changes',\n computing: 'Comparing…',\n}\n\nexport type RedlineRegionKind = 'replace' | 'remove' | 'add' | 'move'\n\n// ── Frame ───────────────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineFrameProps {\n /** Optional header row (see RedlineHeader). */\n header?: ReactNode\n children: ReactNode\n}\n\n/** Column shell for a redline: optional header, scrolling body. */\nexport function RedlineFrame({ header, children }: RedlineFrameProps) {\n return (\n <div className=\"flex h-full flex-col\" data-slot=\"redline-frame\">\n {header}\n <div className=\"flex-1 overflow-auto text-sm leading-relaxed\">{children}</div>\n </div>\n )\n}\n\nexport interface RedlineHeaderProps {\n /** The base document pill. */\n base: ReactNode\n /** The compared document pill. */\n compare?: ReactNode\n onFlip: () => void\n labels?: Partial<RedlineLabels>\n}\n\n/** \"Base ⇄ Compare\" row with the flip control. */\nexport function RedlineHeader({ base, compare, onFlip, labels }: RedlineHeaderProps) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n return (\n <div className=\"flex shrink-0 items-center gap-2 border-b border-border bg-muted px-3 py-2\">\n {base}\n <Button\n variant=\"ghost\"\n size=\"icon\"\n className=\"size-6 shrink-0 pointer-coarse:size-11\"\n onClick={onFlip}\n title={l.flipComparison}\n aria-label={l.flipComparison}\n >\n <ArrowLeftRight className=\"size-3.5\" />\n </Button>\n {compare}\n </div>\n )\n}\n\nexport type RedlineStatusKind = 'idle' | 'identical' | 'unavailable'\n\n/** A centred status line for the redline body (nothing to diff). */\nexport function RedlineStatus({\n kind,\n reviewMode,\n labels,\n}: {\n kind: RedlineStatusKind\n /** Accept/reject mode: \"identical\" means no edits yet. */\n reviewMode?: boolean\n labels?: Partial<RedlineLabels>\n}) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const text =\n kind === 'idle'\n ? l.noDocument\n : kind === 'identical'\n ? reviewMode\n ? l.noChangesYet\n : l.identical\n : l.unavailable\n return (\n <div className=\"flex h-full items-center justify-center text-sm text-muted-foreground\">\n {text}\n </div>\n )\n}\n\n/** Centres a loading indicator while the diff computes. */\nexport function RedlineComputing({ children }: { children: ReactNode }) {\n return <div className=\"flex h-full items-center justify-center\">{children}</div>\n}\n\n// ── Document + marks ────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineDocumentProps {\n /** Rendered redline markdown. */\n children: ReactNode\n /** Ref to the rendered body (the host measures change positions from it). */\n bodyRef?: Ref<HTMLDivElement>\n /** Margin gutter (revert buttons) shown in accept/reject mode. */\n gutter?: ReactNode\n}\n\nexport function RedlineDocument({ children, bodyRef, gutter }: RedlineDocumentProps) {\n return (\n <div className=\"relative\">\n <div ref={bodyRef} className=\"mx-auto max-w-3xl px-6 py-4 pr-14\">\n {children}\n </div>\n {gutter}\n </div>\n )\n}\n\nconst MARK_TONE = {\n del: {\n base: 'font-semibold text-red-600 line-through decoration-2 dark:text-red-400',\n move: 'font-semibold text-emerald-600 line-through decoration-2 dark:text-emerald-400',\n },\n ins: {\n base: 'font-semibold text-blue-600 underline decoration-2 dark:text-blue-400',\n move: 'font-semibold text-emerald-600 underline decoration-2 dark:text-emerald-400',\n },\n} as const\n\n/** `<del>` / `<ins>` for the markdown renderer: red strike, blue underline, green for moves. */\nexport function RedlineMark({\n as: Tag,\n isMove,\n children,\n ...props\n}: (ComponentPropsWithoutRef<'del'> | ComponentPropsWithoutRef<'ins'>) & {\n as: 'del' | 'ins'\n isMove: boolean\n}) {\n const cls = MARK_TONE[Tag][isMove ? 'move' : 'base']\n return (\n <Tag className={cls} {...props}>\n {children}\n </Tag>\n )\n}\n\n// ── Revert gutter ───────────────────────────────────────────────────────────────────────────\n\nexport interface RedlineMarkerView {\n cid: string\n /** Vertical offset in px, already spaced so buttons never overlap. */\n top: number\n kind: RedlineRegionKind\n}\n\nconst REVERT_TONE: Record<RedlineRegionKind, string> = {\n move: 'border-emerald-600 text-emerald-700 hover:bg-emerald-50 dark:border-emerald-400 dark:text-emerald-300 dark:hover:bg-emerald-950/40',\n add: 'border-blue-600 text-blue-700 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-300 dark:hover:bg-blue-950/40',\n replace:\n 'border-blue-600 text-blue-700 hover:bg-blue-50 dark:border-blue-400 dark:text-blue-300 dark:hover:bg-blue-950/40',\n remove:\n 'border-red-600 text-red-700 hover:bg-red-50 dark:border-red-400 dark:text-red-300 dark:hover:bg-red-950/40',\n}\n\n/** One undo button per change, aligned with the change in the margin. */\nexport function RedlineRevertGutter({\n markers,\n onRevert,\n labels,\n testId,\n}: {\n markers: RedlineMarkerView[]\n onRevert: (cid: string) => void\n labels?: Partial<RedlineLabels>\n /** Replaces the whole `redline-revert-<cid>` id. */\n testId?: (cid: string) => string\n}) {\n if (markers.length === 0) return null\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const revertTitle: Record<RedlineRegionKind, string> = {\n move: l.revertMove,\n replace: l.revertReplace,\n add: l.revertAdd,\n remove: l.revertRemove,\n }\n return (\n <div className=\"pointer-events-none absolute right-2 top-0 w-9\" data-slot=\"redline-gutter\">\n {markers.map((m) => (\n <button\n key={m.cid}\n type=\"button\"\n onClick={() => onRevert(m.cid)}\n title={revertTitle[m.kind]}\n aria-label={revertTitle[m.kind]}\n style={{ top: m.top - 2 }}\n className={cn(\n 'pointer-events-auto absolute right-0 inline-flex h-6 w-7 items-center justify-center rounded-md border bg-background transition-colors pointer-coarse:h-11 pointer-coarse:w-11',\n REVERT_TONE[m.kind]\n )}\n data-testid={testIdOr(testId?.(m.cid), { testId: `redline-revert-${m.cid}` })}\n >\n <Undo2 className=\"size-3.5\" />\n </button>\n ))}\n </div>\n )\n}\n","import { useLayoutEffect, useMemo, useRef, useState, type ReactNode } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { testIdOr } from '../chat/test-id'\nimport {\n DEFAULT_REDLINE_LABELS,\n RedlineComputing,\n RedlineDocument,\n RedlineFrame,\n RedlineMark,\n RedlineRevertGutter,\n RedlineStatus,\n type RedlineLabels,\n type RedlineMarkerView,\n type RedlineRegionKind,\n} from './RedlineParts'\n\ntype DelProps = React.ComponentPropsWithoutRef<'del'> & { 'data-cid'?: string }\ntype InsProps = React.ComponentPropsWithoutRef<'ins'> & { 'data-cid'?: string }\n\n/** The `<del>` / `<ins>` renderers a markdown renderer must use for the tracked changes. */\nexport interface RedlineMarkdownComponents {\n del: React.FC<DelProps>\n ins: React.FC<InsProps>\n}\n\n/**\n * Renders markdown to React. The redline markdown carries raw `<del>` / `<ins>` tags, so the\n * renderer must allow inline HTML and honour `components`.\n */\nexport type RenderMarkdown = (markdown: string, components?: RedlineMarkdownComponents) => ReactNode\n\n/** What the view shows. Matches `RedlineState` of `@arbidocs/react/artifacts`. */\nexport type ArtifactRedlineState =\n | { kind: 'idle' }\n | { kind: 'computing' }\n | { kind: 'ready'; markdown: string; regions: { id: string; kind: RedlineRegionKind }[] }\n | { kind: 'identical' }\n | { kind: 'unavailable' }\n\nexport interface ArtifactRedlineViewTestIds {\n /** Replaces the whole `redline-revert-<cid>` id. */\n revert: (cid: string) => string\n root: string\n}\n\nexport interface ArtifactRedlineViewProps {\n state: ArtifactRedlineState\n renderMarkdown: RenderMarkdown\n /** Accept/reject mode: a margin button per change undoes that change. Omit for read-only. */\n onRevert?: (regionId: string) => void\n /** A header row (for example `RedlineHeader`). */\n header?: ReactNode\n labels?: Partial<RedlineLabels>\n testIds?: Partial<ArtifactRedlineViewTestIds>\n}\n\n/** First char of a change id encodes its kind: p(replace) r(remove) a(add) m(move). */\nfunction kindFromCid(cid: string | undefined): RedlineRegionKind | null {\n switch (cid?.[0]) {\n case 'p':\n return 'replace'\n case 'r':\n return 'remove'\n case 'a':\n return 'add'\n case 'm':\n return 'move'\n default:\n return null\n }\n}\n\n/** Two changes on one line would stack their buttons; nudge each down by one button height. */\nconst MARKER_MIN_GAP = 26\n\n/**\n * Word-style track changes between two versions: deletions struck through in red, insertions\n * underlined in blue, moves in green, status lines when there is nothing to diff, and (when\n * `onRevert` is set) an undo button per change aligned in the margin.\n */\nexport function ArtifactRedlineView({\n state,\n renderMarkdown,\n onRevert,\n header,\n labels,\n testIds,\n}: ArtifactRedlineViewProps) {\n const l = { ...DEFAULT_REDLINE_LABELS, ...labels }\n const reviewMode = typeof onRevert === 'function'\n const bodyRef = useRef<HTMLDivElement | null>(null)\n const [markers, setMarkers] = useState<RedlineMarkerView[]>([])\n\n const regionKinds = useMemo(\n () => (state.kind === 'ready' ? new Map(state.regions.map((r) => [r.id, r.kind])) : null),\n [state]\n )\n\n const components = useMemo<RedlineMarkdownComponents>(() => {\n const isMove = (cid: string | undefined): boolean =>\n (regionKinds?.get(cid ?? '') ?? kindFromCid(cid)) === 'move'\n return {\n del: ({ children, ...props }: DelProps) => (\n <RedlineMark as=\"del\" isMove={isMove(props['data-cid'])} {...props}>\n {children}\n </RedlineMark>\n ),\n ins: ({ children, ...props }: InsProps) => (\n <RedlineMark as=\"ins\" isMove={isMove(props['data-cid'])} {...props}>\n {children}\n </RedlineMark>\n ),\n }\n }, [regionKinds])\n\n // After each render, find each change's first element and put its undo button level with it.\n useLayoutEffect(() => {\n const host = bodyRef.current\n if (!reviewMode || state.kind !== 'ready' || !host) {\n setMarkers([])\n return\n }\n const hostTop = host.getBoundingClientRect().top\n const seen = new Map<string, { top: number; kind: RedlineRegionKind }>()\n host.querySelectorAll<HTMLElement>('[data-cid]').forEach((el) => {\n const cid = el.dataset.cid\n if (!cid || seen.has(cid)) return\n seen.set(cid, {\n top: el.getBoundingClientRect().top - hostTop,\n kind: regionKinds?.get(cid) ?? kindFromCid(cid) ?? 'replace',\n })\n })\n const sorted = Array.from(seen, ([cid, v]) => ({ cid, ...v })).sort((a, b) => a.top - b.top)\n const spaced: RedlineMarkerView[] = []\n for (const m of sorted) {\n const prev = spaced[spaced.length - 1]\n spaced.push({\n ...m,\n top: prev && m.top - prev.top < MARKER_MIN_GAP ? prev.top + MARKER_MIN_GAP : m.top,\n })\n }\n setMarkers(spaced)\n }, [reviewMode, state, regionKinds])\n\n return (\n <section\n aria-label={l.tracked}\n className=\"h-full\"\n data-testid={testIdOr(testIds?.root, { testId: 'artifact-redline' })}\n >\n <RedlineFrame header={header}>\n {state.kind === 'idle' || state.kind === 'identical' || state.kind === 'unavailable' ? (\n <div role=\"status\" className=\"h-full\">\n <RedlineStatus kind={state.kind} reviewMode={reviewMode} labels={labels} />\n </div>\n ) : state.kind === 'computing' ? (\n <RedlineComputing>\n <Loader2 className=\"size-5 animate-spin text-muted-foreground\" aria-hidden />\n <span className=\"sr-only\" role=\"status\">\n {l.computing}\n </span>\n </RedlineComputing>\n ) : (\n <RedlineDocument\n bodyRef={bodyRef}\n gutter={\n reviewMode ? (\n <RedlineRevertGutter\n markers={markers}\n onRevert={onRevert}\n labels={labels}\n testId={testIds?.revert}\n />\n ) : null\n }\n >\n {renderMarkdown(state.markdown, components)}\n </RedlineDocument>\n )}\n </RedlineFrame>\n </section>\n )\n}\n","import { Eye, GitCompare, History } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\n\n/** Every fixed string of the timeline. Pass a partial `labels` to translate or reword. */\nexport interface VersionTimelineLabels {\n emptyLive: string\n emptyDocument: string\n untitled: string\n latest: string\n viewing: string\n current: string\n version: (n: number) => string\n branchedFrom: (n: number) => string\n /** Why a version exists, keyed by its `reason` (upload | edit | signed | sync). */\n reasons: Record<string, string>\n open: string\n compare: string\n /** Before the thread a version was made in: \"in {thread}\". */\n madeIn: string\n}\n\nexport const DEFAULT_VERSION_TIMELINE_LABELS: VersionTimelineLabels = {\n emptyLive:\n 'No earlier versions yet. When you ask the assistant for a change, the previous version is kept here.',\n emptyDocument:\n 'No earlier versions yet. Editing this draft and saving creates a new version here.',\n untitled: 'Untitled',\n latest: 'Latest',\n viewing: 'Viewing',\n current: 'Current',\n version: (n) => `Version ${n}`,\n branchedFrom: (n) => `branched from Version ${n}`,\n reasons: {\n upload: 'Original upload',\n edit: 'Saved edit',\n signed: 'Signed',\n sync: 'Synced',\n },\n open: 'Open',\n compare: 'Compare',\n madeIn: 'in',\n}\n\nexport interface VersionTimelineTestIds {\n root: string\n empty: string\n currentBadge: string\n /** Replaces the whole `version-row-<id>` id. */\n row: (id: string) => string\n branch: (id: string) => string\n open: (id: string) => string\n compare: (id: string) => string\n}\n\nexport interface VersionEntry {\n id: string\n /** File name as stored (live artifacts have their extension stripped for display). */\n name: string\n /** ISO string; formatted with `formatDate`. */\n createdAt: string\n /** 1-based version number; defaults to the row's position. */\n number?: number\n /** The version this one was saved from (a restore when it is not the row above). */\n savedFromId?: string | null\n /** Why the version exists: upload | edit | signed | sync. Shown as a label on the row. */\n reason?: string | null\n /** The thread whose turn made this version: named on the row, opening it at that turn. */\n madeIn?: { label: string; onOpen: () => void } | null\n}\n\nexport interface VersionTimelineProps {\n /** Versions in creation order (oldest first). */\n versions: VersionEntry[]\n /** The version currently open. */\n currentId: string\n /**\n * A live (html/react) artifact: plain-language labels for non-developers, no file extension,\n * and no Compare (a text diff of source code means nothing to them).\n */\n live?: boolean\n formatDate: (iso: string) => string\n onOpen: (id: string) => void\n /** Omit to hide Compare (also hidden for `live`). */\n onCompare?: (id: string) => void\n className?: string\n labels?: Partial<VersionTimelineLabels>\n /** Overrides for the test ids (defaults keep the current ids). */\n testIds?: Partial<VersionTimelineTestIds>\n}\n\n/**\n * Clickable timeline of an immutable version chain: open any version or compare it with the\n * current one. Versions are numbered in creation order; a version saved from an OLD version is a\n * deliberate branch and says where it came from instead of implying it follows the row above.\n * Test ids: `version-timeline`, `version-timeline-empty`, `version-row-{id}`,\n * `version-current-badge`, `version-branch-{id}`, `open-version-{id}`, `compare-version-{id}`.\n */\nexport function VersionTimeline({\n versions,\n currentId,\n live = false,\n formatDate,\n onOpen,\n onCompare,\n className,\n labels,\n testIds,\n}: VersionTimelineProps) {\n const l = { ...DEFAULT_VERSION_TIMELINE_LABELS, ...labels }\n if (versions.length <= 1) {\n return (\n <div\n className={cn('p-6 text-sm text-muted-foreground', className)}\n data-testid={testIdOr(testIds?.empty, { testId: 'version-timeline-empty' })}\n >\n {live ? l.emptyLive : l.emptyDocument}\n </div>\n )\n }\n\n const numberById = new Map<string, number>()\n versions.forEach((v, i) => numberById.set(v.id, v.number ?? i + 1))\n const canCompare = !live && !!onCompare\n\n return (\n <div\n className={cn('h-full overflow-auto p-4', className)}\n data-testid={testIdOr(testIds?.root, { testId: 'version-timeline' })}\n >\n <ol className=\"mx-auto max-w-2xl space-y-1\">\n {versions.map((v, i) => {\n const isCurrent = v.id === currentId\n const isLatest = i === versions.length - 1\n const number = v.number ?? i + 1\n const savedFromNumber = v.savedFromId ? numberById.get(v.savedFromId) : undefined\n const branchedFrom =\n savedFromNumber !== undefined && savedFromNumber !== number - 1 ? savedFromNumber : null\n // Live artifacts say \"Latest\"/\"Viewing\" (open vs. newest) instead of \"Current\".\n const badge = !isCurrent ? null : live ? (isLatest ? l.latest : l.viewing) : l.current\n const name = live\n ? (v.name || l.untitled).replace(/\\.[A-Za-z0-9]+$/, '')\n : v.name || l.untitled\n const reason = !live && v.reason ? (l.reasons[v.reason] ?? null) : null\n return (\n <li\n key={v.id}\n className={cn(\n 'flex items-center gap-3 rounded-md px-3 py-2.5',\n isCurrent && 'bg-accent'\n )}\n data-testid={testIdOr(testIds?.row?.(v.id), { testId: `version-row-${v.id}` })}\n >\n <History className=\"size-4 shrink-0 text-muted-foreground\" aria-hidden />\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-foreground\">{l.version(number)}</span>\n {badge && (\n <span\n className=\"rounded-full bg-background px-2 py-0.5 text-xs font-medium text-accent-foreground\"\n data-testid={testIdOr(testIds?.currentBadge, {\n testId: 'version-current-badge',\n })}\n >\n {badge}\n </span>\n )}\n </div>\n <div className=\"truncate text-sm text-muted-foreground\">\n {name} · {formatDate(v.createdAt)}\n {reason && <span data-testid={`version-reason-${v.id}`}> · {reason}</span>}\n {v.madeIn && (\n <>\n {' '}\n {l.madeIn}{' '}\n <button\n type=\"button\"\n onClick={v.madeIn.onOpen}\n className=\"font-medium text-foreground underline-offset-2 hover:text-primary hover:underline\"\n title={v.madeIn.label}\n data-testid={`version-thread-${v.id}`}\n >\n {v.madeIn.label}\n </button>\n </>\n )}\n {branchedFrom !== null && (\n <span\n data-testid={testIdOr(testIds?.branch?.(v.id), {\n testId: `version-branch-${v.id}`,\n })}\n >\n {' '}\n · {l.branchedFrom(branchedFrom)}\n </span>\n )}\n </div>\n </div>\n {!isCurrent && (\n <>\n <button\n type=\"button\"\n onClick={() => onOpen(v.id)}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.open?.(v.id), {\n testId: `open-version-${v.id}`,\n })}\n >\n <Eye className=\"size-3.5\" /> {l.open}\n </button>\n {canCompare && (\n <button\n type=\"button\"\n onClick={() => onCompare(v.id)}\n className=\"inline-flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-sm font-medium text-primary transition-colors hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11\"\n data-testid={testIdOr(testIds?.compare?.(v.id), {\n testId: `compare-version-${v.id}`,\n })}\n >\n <GitCompare className=\"size-3.5\" /> {l.compare}\n </button>\n )}\n </>\n )}\n </li>\n )\n })}\n </ol>\n </div>\n )\n}\n"]}