@mieweb/ui 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. package/dist/CsvBlock-LVJARITD.cjs +15 -0
  2. package/dist/{CsvBlock-2A5VEDD3.cjs.map → CsvBlock-LVJARITD.cjs.map} +1 -1
  3. package/dist/CsvBlock-VTYNQ75L.js +6 -0
  4. package/dist/{CsvBlock-D6PWAJ5X.js.map → CsvBlock-VTYNQ75L.js.map} +1 -1
  5. package/dist/HtmlPreviewBlock-F33P37UD.cjs +15 -0
  6. package/dist/{HtmlPreviewBlock-SYXCV5RH.cjs.map → HtmlPreviewBlock-F33P37UD.cjs.map} +1 -1
  7. package/dist/HtmlPreviewBlock-N4PPVJLJ.js +6 -0
  8. package/dist/{HtmlPreviewBlock-PEHTJ6C3.js.map → HtmlPreviewBlock-N4PPVJLJ.js.map} +1 -1
  9. package/dist/MermaidBlock-G5X4FPUN.cjs +15 -0
  10. package/dist/{MermaidBlock-AFXNP5NK.cjs.map → MermaidBlock-G5X4FPUN.cjs.map} +1 -1
  11. package/dist/MermaidBlock-HUT53CRG.js +6 -0
  12. package/dist/{MermaidBlock-7NK3AVK2.js.map → MermaidBlock-HUT53CRG.js.map} +1 -1
  13. package/dist/SurveyBlock-ORTPGA5T.cjs +15 -0
  14. package/dist/{SurveyBlock-6KRNKFH5.cjs.map → SurveyBlock-ORTPGA5T.cjs.map} +1 -1
  15. package/dist/SurveyBlock-PM3ZMWWR.js +6 -0
  16. package/dist/{SurveyBlock-NNDGXGG4.js.map → SurveyBlock-PM3ZMWWR.js.map} +1 -1
  17. package/dist/ag-grid.cjs +13 -13
  18. package/dist/ag-grid.js +2 -2
  19. package/dist/brands/index.cjs +7 -7
  20. package/dist/brands/index.js +2 -2
  21. package/dist/{chunk-4DMZAVB2.js → chunk-23AYDOCH.js} +3 -3
  22. package/dist/{chunk-4DMZAVB2.js.map → chunk-23AYDOCH.js.map} +1 -1
  23. package/dist/{chunk-MAMY5HTT.cjs → chunk-26DPQUSB.cjs} +22 -22
  24. package/dist/{chunk-MAMY5HTT.cjs.map → chunk-26DPQUSB.cjs.map} +1 -1
  25. package/dist/{chunk-TRZXK57D.js → chunk-2DW4PUJD.js} +3 -3
  26. package/dist/{chunk-TRZXK57D.js.map → chunk-2DW4PUJD.js.map} +1 -1
  27. package/dist/{chunk-OX2RIVN7.js → chunk-3D4ITDLO.js} +4 -4
  28. package/dist/{chunk-OX2RIVN7.js.map → chunk-3D4ITDLO.js.map} +1 -1
  29. package/dist/{chunk-PJAQDAMZ.cjs → chunk-3IAA3KCE.cjs} +15 -6
  30. package/dist/chunk-3IAA3KCE.cjs.map +1 -0
  31. package/dist/chunk-3PXOIAF6.js +3 -0
  32. package/dist/{chunk-DHKYGVP7.js.map → chunk-3PXOIAF6.js.map} +1 -1
  33. package/dist/{chunk-6D5F7EDM.js → chunk-3SRBIXQX.js} +18 -17
  34. package/dist/chunk-3SRBIXQX.js.map +1 -0
  35. package/dist/{chunk-Q2EWNXIB.cjs → chunk-3SZQRMHM.cjs} +9 -9
  36. package/dist/{chunk-Q2EWNXIB.cjs.map → chunk-3SZQRMHM.cjs.map} +1 -1
  37. package/dist/{chunk-JLBT76WH.js → chunk-3YSIZ2CK.js} +14 -5
  38. package/dist/chunk-3YSIZ2CK.js.map +1 -0
  39. package/dist/{chunk-NIEIRA5A.cjs → chunk-4AE2L6AO.cjs} +13 -13
  40. package/dist/{chunk-NIEIRA5A.cjs.map → chunk-4AE2L6AO.cjs.map} +1 -1
  41. package/dist/{chunk-PFWHWIXS.cjs → chunk-54OW6ZPL.cjs} +124 -3
  42. package/dist/chunk-54OW6ZPL.cjs.map +1 -0
  43. package/dist/{chunk-FJH7P5WG.js → chunk-5BDCQBYW.js} +6 -6
  44. package/dist/{chunk-FJH7P5WG.js.map → chunk-5BDCQBYW.js.map} +1 -1
  45. package/dist/{chunk-XP6HELVG.cjs → chunk-5IDYOJHO.cjs} +13 -13
  46. package/dist/{chunk-XP6HELVG.cjs.map → chunk-5IDYOJHO.cjs.map} +1 -1
  47. package/dist/{chunk-3CJBUAJ4.js → chunk-5U6GETAW.js} +3 -3
  48. package/dist/{chunk-3CJBUAJ4.js.map → chunk-5U6GETAW.js.map} +1 -1
  49. package/dist/{chunk-HEH3QXOQ.js → chunk-5Y5FSR4N.js} +3 -3
  50. package/dist/{chunk-HEH3QXOQ.js.map → chunk-5Y5FSR4N.js.map} +1 -1
  51. package/dist/{chunk-MSRU3XBH.cjs → chunk-6ECKH4DJ.cjs} +7 -7
  52. package/dist/{chunk-MSRU3XBH.cjs.map → chunk-6ECKH4DJ.cjs.map} +1 -1
  53. package/dist/{chunk-MV3MTHWQ.js → chunk-6EWJGRC3.js} +3 -3
  54. package/dist/{chunk-MV3MTHWQ.js.map → chunk-6EWJGRC3.js.map} +1 -1
  55. package/dist/{chunk-AES2BKEW.cjs → chunk-6J7UGYT5.cjs} +10 -10
  56. package/dist/{chunk-AES2BKEW.cjs.map → chunk-6J7UGYT5.cjs.map} +1 -1
  57. package/dist/{chunk-7WMSUXOQ.js → chunk-6OCYG6J2.js} +4 -4
  58. package/dist/{chunk-7WMSUXOQ.js.map → chunk-6OCYG6J2.js.map} +1 -1
  59. package/dist/{chunk-JCNPVK74.cjs → chunk-6OQE4ZMG.cjs} +8 -8
  60. package/dist/{chunk-JCNPVK74.cjs.map → chunk-6OQE4ZMG.cjs.map} +1 -1
  61. package/dist/{chunk-KBEKQMVY.cjs → chunk-6QVI6DAO.cjs} +5 -5
  62. package/dist/{chunk-KBEKQMVY.cjs.map → chunk-6QVI6DAO.cjs.map} +1 -1
  63. package/dist/{chunk-CVC4NWFA.cjs → chunk-7AMOKHTW.cjs} +4 -4
  64. package/dist/{chunk-CVC4NWFA.cjs.map → chunk-7AMOKHTW.cjs.map} +1 -1
  65. package/dist/{chunk-44CK4CT2.cjs → chunk-7EB7665B.cjs} +13 -13
  66. package/dist/{chunk-44CK4CT2.cjs.map → chunk-7EB7665B.cjs.map} +1 -1
  67. package/dist/{chunk-BB4WQ4LV.cjs → chunk-ABAOZASX.cjs} +8 -8
  68. package/dist/{chunk-BB4WQ4LV.cjs.map → chunk-ABAOZASX.cjs.map} +1 -1
  69. package/dist/{chunk-6LFG4JFF.js → chunk-AFGADE3B.js} +3 -3
  70. package/dist/{chunk-6LFG4JFF.js.map → chunk-AFGADE3B.js.map} +1 -1
  71. package/dist/{chunk-UOOH356R.cjs → chunk-AIJAFPGJ.cjs} +5 -5
  72. package/dist/{chunk-UOOH356R.cjs.map → chunk-AIJAFPGJ.cjs.map} +1 -1
  73. package/dist/{chunk-43GBCUSQ.js → chunk-AQ564XO7.js} +6 -6
  74. package/dist/chunk-AQ564XO7.js.map +1 -0
  75. package/dist/{chunk-CYMZ2QS5.js → chunk-BCJFOSZX.js} +2 -2
  76. package/dist/{chunk-CYMZ2QS5.js.map → chunk-BCJFOSZX.js.map} +1 -1
  77. package/dist/{chunk-T3C4RNJ4.js → chunk-BJKAVWED.js} +3 -3
  78. package/dist/{chunk-T3C4RNJ4.js.map → chunk-BJKAVWED.js.map} +1 -1
  79. package/dist/{chunk-MKWGKASO.js → chunk-BMRQ4VME.js} +4 -4
  80. package/dist/{chunk-MKWGKASO.js.map → chunk-BMRQ4VME.js.map} +1 -1
  81. package/dist/{chunk-T42BCIUA.js → chunk-BMSG4NBH.js} +4 -4
  82. package/dist/{chunk-T42BCIUA.js.map → chunk-BMSG4NBH.js.map} +1 -1
  83. package/dist/{chunk-QA6ZDHFP.js → chunk-BOOJDRJO.js} +35 -11
  84. package/dist/chunk-BOOJDRJO.js.map +1 -0
  85. package/dist/{chunk-C2544GKZ.js → chunk-BX5ZODPF.js} +4 -4
  86. package/dist/{chunk-C2544GKZ.js.map → chunk-BX5ZODPF.js.map} +1 -1
  87. package/dist/{chunk-IYIYL2SQ.js → chunk-CEQJGUAS.js} +3 -3
  88. package/dist/{chunk-IYIYL2SQ.js.map → chunk-CEQJGUAS.js.map} +1 -1
  89. package/dist/{chunk-6ZYE6JUK.cjs → chunk-CKRRJO7T.cjs} +11 -11
  90. package/dist/{chunk-6ZYE6JUK.cjs.map → chunk-CKRRJO7T.cjs.map} +1 -1
  91. package/dist/{chunk-WO5CAOAN.js → chunk-DCBMTFLE.js} +3 -3
  92. package/dist/{chunk-WO5CAOAN.js.map → chunk-DCBMTFLE.js.map} +1 -1
  93. package/dist/{chunk-J7Z7467B.js → chunk-DLBV42JD.js} +4 -4
  94. package/dist/{chunk-J7Z7467B.js.map → chunk-DLBV42JD.js.map} +1 -1
  95. package/dist/{chunk-MUYTGWGE.js → chunk-DVOQ3JNO.js} +3 -3
  96. package/dist/{chunk-MUYTGWGE.js.map → chunk-DVOQ3JNO.js.map} +1 -1
  97. package/dist/{chunk-LJ2ZWIX6.js → chunk-DWIF6VXZ.js} +124 -3
  98. package/dist/chunk-DWIF6VXZ.js.map +1 -0
  99. package/dist/{chunk-IHTRKWBG.js → chunk-EGWWTIWS.js} +119 -75
  100. package/dist/chunk-EGWWTIWS.js.map +1 -0
  101. package/dist/{chunk-UM6NA7HL.js → chunk-EKRT7K2K.js} +4 -4
  102. package/dist/{chunk-UM6NA7HL.js.map → chunk-EKRT7K2K.js.map} +1 -1
  103. package/dist/{chunk-WGPMTW36.cjs → chunk-EPQPUFS6.cjs} +7 -7
  104. package/dist/{chunk-WGPMTW36.cjs.map → chunk-EPQPUFS6.cjs.map} +1 -1
  105. package/dist/{chunk-J3BU3JBX.js → chunk-FDUA6OGN.js} +3 -3
  106. package/dist/{chunk-J3BU3JBX.js.map → chunk-FDUA6OGN.js.map} +1 -1
  107. package/dist/{chunk-JHYFHEHS.js → chunk-FDV7EQWH.js} +4 -4
  108. package/dist/{chunk-JHYFHEHS.js.map → chunk-FDV7EQWH.js.map} +1 -1
  109. package/dist/{chunk-KQAXXJ4G.cjs → chunk-FF235PKY.cjs} +7 -7
  110. package/dist/{chunk-KQAXXJ4G.cjs.map → chunk-FF235PKY.cjs.map} +1 -1
  111. package/dist/{chunk-FZJBFJJR.js → chunk-FJ7YPVKV.js} +3 -3
  112. package/dist/{chunk-FZJBFJJR.js.map → chunk-FJ7YPVKV.js.map} +1 -1
  113. package/dist/{chunk-5MAGWW5X.cjs → chunk-FKLUSYFP.cjs} +11 -11
  114. package/dist/{chunk-5MAGWW5X.cjs.map → chunk-FKLUSYFP.cjs.map} +1 -1
  115. package/dist/{chunk-ZGSC2CB2.js → chunk-GTHNWP4P.js} +36 -5
  116. package/dist/chunk-GTHNWP4P.js.map +1 -0
  117. package/dist/{chunk-6AHYYWVB.js → chunk-H3HF36ZL.js} +5 -5
  118. package/dist/{chunk-6AHYYWVB.js.map → chunk-H3HF36ZL.js.map} +1 -1
  119. package/dist/{chunk-YZT62IMX.js → chunk-HIDV32ZX.js} +5 -5
  120. package/dist/{chunk-YZT62IMX.js.map → chunk-HIDV32ZX.js.map} +1 -1
  121. package/dist/{chunk-BIT27PPD.js → chunk-HS25RPDW.js} +3 -3
  122. package/dist/{chunk-BIT27PPD.js.map → chunk-HS25RPDW.js.map} +1 -1
  123. package/dist/{chunk-BWYYA3LQ.cjs → chunk-I2ECTLON.cjs} +5 -5
  124. package/dist/{chunk-BWYYA3LQ.cjs.map → chunk-I2ECTLON.cjs.map} +1 -1
  125. package/dist/{chunk-DUPR6FEL.js → chunk-I3WGZPI6.js} +4 -4
  126. package/dist/{chunk-DUPR6FEL.js.map → chunk-I3WGZPI6.js.map} +1 -1
  127. package/dist/{chunk-TN33E2VN.cjs → chunk-IJYTASQQ.cjs} +15 -15
  128. package/dist/{chunk-TN33E2VN.cjs.map → chunk-IJYTASQQ.cjs.map} +1 -1
  129. package/dist/{chunk-BT3ZQJGT.cjs → chunk-IUDY6S7I.cjs} +6 -6
  130. package/dist/{chunk-BT3ZQJGT.cjs.map → chunk-IUDY6S7I.cjs.map} +1 -1
  131. package/dist/{chunk-TR2OJKQ4.cjs → chunk-JTSKPDPH.cjs} +8 -8
  132. package/dist/{chunk-TR2OJKQ4.cjs.map → chunk-JTSKPDPH.cjs.map} +1 -1
  133. package/dist/{chunk-XCLQZ4FV.js → chunk-KFLDXJEE.js} +3 -3
  134. package/dist/{chunk-XCLQZ4FV.js.map → chunk-KFLDXJEE.js.map} +1 -1
  135. package/dist/{chunk-4LVPQ44A.js → chunk-LMBXJZLG.js} +9 -5
  136. package/dist/chunk-LMBXJZLG.js.map +1 -0
  137. package/dist/{chunk-A2QVQF54.cjs → chunk-M26KJKZG.cjs} +4 -4
  138. package/dist/{chunk-A2QVQF54.cjs.map → chunk-M26KJKZG.cjs.map} +1 -1
  139. package/dist/{chunk-ZHBANUBI.cjs → chunk-MJWFNV3L.cjs} +31 -27
  140. package/dist/chunk-MJWFNV3L.cjs.map +1 -0
  141. package/dist/{chunk-UFYXU7KV.js → chunk-MWPPOX6F.js} +4 -4
  142. package/dist/{chunk-UFYXU7KV.js.map → chunk-MWPPOX6F.js.map} +1 -1
  143. package/dist/{chunk-ZDEYV373.cjs → chunk-MYFZYUPR.cjs} +35 -11
  144. package/dist/chunk-MYFZYUPR.cjs.map +1 -0
  145. package/dist/{chunk-MCCO4A23.js → chunk-NGLI2MSM.js} +256 -45
  146. package/dist/chunk-NGLI2MSM.js.map +1 -0
  147. package/dist/{chunk-FCBQP2U4.cjs → chunk-NPKPCYAT.cjs} +142 -16
  148. package/dist/chunk-NPKPCYAT.cjs.map +1 -0
  149. package/dist/{chunk-T3RWXOCM.js → chunk-NU6QKULE.js} +3 -3
  150. package/dist/{chunk-T3RWXOCM.js.map → chunk-NU6QKULE.js.map} +1 -1
  151. package/dist/{chunk-QUUFKGDF.cjs → chunk-OAHORW4N.cjs} +130 -86
  152. package/dist/chunk-OAHORW4N.cjs.map +1 -0
  153. package/dist/{chunk-BYUV3IZV.cjs → chunk-OGPJ3LRF.cjs} +4 -4
  154. package/dist/{chunk-BYUV3IZV.cjs.map → chunk-OGPJ3LRF.cjs.map} +1 -1
  155. package/dist/{chunk-XL7TTKHP.js → chunk-OLFTGCGD.js} +7 -7
  156. package/dist/{chunk-XL7TTKHP.js.map → chunk-OLFTGCGD.js.map} +1 -1
  157. package/dist/{chunk-BX6BTDTR.js → chunk-OQWZYKJM.js} +3 -3
  158. package/dist/{chunk-BX6BTDTR.js.map → chunk-OQWZYKJM.js.map} +1 -1
  159. package/dist/{chunk-JBB25LFB.js → chunk-OTQ72WX3.js} +3 -3
  160. package/dist/{chunk-JBB25LFB.js.map → chunk-OTQ72WX3.js.map} +1 -1
  161. package/dist/{chunk-AFKKJEV5.cjs → chunk-OZOSWBSI.cjs} +4 -4
  162. package/dist/{chunk-AFKKJEV5.cjs.map → chunk-OZOSWBSI.cjs.map} +1 -1
  163. package/dist/{chunk-KJPOFUF5.cjs → chunk-P2VTQ5AR.cjs} +10 -10
  164. package/dist/{chunk-KJPOFUF5.cjs.map → chunk-P2VTQ5AR.cjs.map} +1 -1
  165. package/dist/{chunk-ZAIEQWRA.js → chunk-P6L74SKG.js} +5 -5
  166. package/dist/{chunk-ZAIEQWRA.js.map → chunk-P6L74SKG.js.map} +1 -1
  167. package/dist/{chunk-QASIWBXU.cjs → chunk-P7UMS4E6.cjs} +7 -7
  168. package/dist/{chunk-QASIWBXU.cjs.map → chunk-P7UMS4E6.cjs.map} +1 -1
  169. package/dist/chunk-PAM5UUBL.cjs +740 -0
  170. package/dist/{chunk-UTYUT5YY.cjs.map → chunk-PAM5UUBL.cjs.map} +1 -1
  171. package/dist/{chunk-NVHAQOHH.cjs → chunk-PLMXN23Q.cjs} +10 -10
  172. package/dist/chunk-PLMXN23Q.cjs.map +1 -0
  173. package/dist/{chunk-KOCTIB6U.js → chunk-PS5INHGC.js} +3 -3
  174. package/dist/{chunk-KOCTIB6U.js.map → chunk-PS5INHGC.js.map} +1 -1
  175. package/dist/{chunk-Y2S6QMKU.js → chunk-PTZB2GKL.js} +3 -3
  176. package/dist/{chunk-Y2S6QMKU.js.map → chunk-PTZB2GKL.js.map} +1 -1
  177. package/dist/{chunk-7VF6WO7H.cjs → chunk-Q5VBO3I5.cjs} +310 -99
  178. package/dist/chunk-Q5VBO3I5.cjs.map +1 -0
  179. package/dist/{chunk-BLPCYP4D.cjs → chunk-QI2SB6U3.cjs} +29 -29
  180. package/dist/{chunk-BLPCYP4D.cjs.map → chunk-QI2SB6U3.cjs.map} +1 -1
  181. package/dist/{chunk-EZKRAW2X.js → chunk-QUUBTNMH.js} +3 -3
  182. package/dist/{chunk-EZKRAW2X.js.map → chunk-QUUBTNMH.js.map} +1 -1
  183. package/dist/{chunk-5BQE6BEL.js → chunk-QYSUYB3S.js} +13 -9
  184. package/dist/chunk-QYSUYB3S.js.map +1 -0
  185. package/dist/{chunk-MZPF2QGM.cjs → chunk-RBS3GHDZ.cjs} +15 -15
  186. package/dist/{chunk-MZPF2QGM.cjs.map → chunk-RBS3GHDZ.cjs.map} +1 -1
  187. package/dist/{chunk-KJ5BSGEO.cjs → chunk-RS5VA6QU.cjs} +17 -13
  188. package/dist/chunk-RS5VA6QU.cjs.map +1 -0
  189. package/dist/{chunk-CKD554XR.cjs → chunk-RUEEDOE3.cjs} +5 -5
  190. package/dist/{chunk-CKD554XR.cjs.map → chunk-RUEEDOE3.cjs.map} +1 -1
  191. package/dist/{chunk-372IIHUA.cjs → chunk-RYQ3S3KO.cjs} +53 -53
  192. package/dist/{chunk-372IIHUA.cjs.map → chunk-RYQ3S3KO.cjs.map} +1 -1
  193. package/dist/{chunk-RHYIFIT5.js → chunk-RZFSJD67.js} +3 -3
  194. package/dist/{chunk-RHYIFIT5.js.map → chunk-RZFSJD67.js.map} +1 -1
  195. package/dist/{chunk-NQME7MCK.js → chunk-RZJXCI53.js} +191 -204
  196. package/dist/chunk-RZJXCI53.js.map +1 -0
  197. package/dist/{chunk-DFCZPVG4.cjs → chunk-S3MKIDYG.cjs} +8 -8
  198. package/dist/{chunk-DFCZPVG4.cjs.map → chunk-S3MKIDYG.cjs.map} +1 -1
  199. package/dist/chunk-S5RVSXDV.cjs +45 -0
  200. package/dist/chunk-S5RVSXDV.cjs.map +1 -0
  201. package/dist/{chunk-XDFDVF2O.js → chunk-SH6B4MG5.js} +4 -4
  202. package/dist/{chunk-XDFDVF2O.js.map → chunk-SH6B4MG5.js.map} +1 -1
  203. package/dist/chunk-SVSHA7XV.js +487 -0
  204. package/dist/chunk-SVSHA7XV.js.map +1 -0
  205. package/dist/{chunk-KL2S36FM.js → chunk-TNUL4LGG.js} +6 -6
  206. package/dist/{chunk-KL2S36FM.js.map → chunk-TNUL4LGG.js.map} +1 -1
  207. package/dist/chunk-TQONQSJO.js +42 -0
  208. package/dist/chunk-TQONQSJO.js.map +1 -0
  209. package/dist/{chunk-V25Z5GR6.cjs → chunk-TU36DBH2.cjs} +9 -9
  210. package/dist/{chunk-V25Z5GR6.cjs.map → chunk-TU36DBH2.cjs.map} +1 -1
  211. package/dist/{chunk-FQ3UCZUX.cjs → chunk-U3JU6BI5.cjs} +7 -7
  212. package/dist/{chunk-FQ3UCZUX.cjs.map → chunk-U3JU6BI5.cjs.map} +1 -1
  213. package/dist/{chunk-VCO2IZOG.js → chunk-UA7E7PDS.js} +3 -3
  214. package/dist/{chunk-VCO2IZOG.js.map → chunk-UA7E7PDS.js.map} +1 -1
  215. package/dist/{chunk-OOYEHBYJ.js → chunk-UUI7WXI5.js} +142 -16
  216. package/dist/chunk-UUI7WXI5.js.map +1 -0
  217. package/dist/{chunk-SNEQXSC5.cjs → chunk-VA7QN4DX.cjs} +2 -2
  218. package/dist/{chunk-SNEQXSC5.cjs.map → chunk-VA7QN4DX.cjs.map} +1 -1
  219. package/dist/{chunk-I2W24RHW.js → chunk-VE6OUO7X.js} +3 -3
  220. package/dist/{chunk-I2W24RHW.js.map → chunk-VE6OUO7X.js.map} +1 -1
  221. package/dist/{chunk-STPK44AU.js → chunk-VNWJTCBQ.js} +3 -3
  222. package/dist/{chunk-STPK44AU.js.map → chunk-VNWJTCBQ.js.map} +1 -1
  223. package/dist/{chunk-ZNZZCB2M.cjs → chunk-VPIYTQCV.cjs} +9 -9
  224. package/dist/{chunk-ZNZZCB2M.cjs.map → chunk-VPIYTQCV.cjs.map} +1 -1
  225. package/dist/{chunk-DLNJLCNO.cjs → chunk-VTKXM7IE.cjs} +4 -4
  226. package/dist/{chunk-DLNJLCNO.cjs.map → chunk-VTKXM7IE.cjs.map} +1 -1
  227. package/dist/{chunk-VPNURIAY.cjs → chunk-VVI32P7L.cjs} +10 -10
  228. package/dist/{chunk-VPNURIAY.cjs.map → chunk-VVI32P7L.cjs.map} +1 -1
  229. package/dist/{chunk-PWHK7SWN.cjs → chunk-VWCMOWGH.cjs} +150 -149
  230. package/dist/chunk-VWCMOWGH.cjs.map +1 -0
  231. package/dist/{chunk-EUUQVDXX.cjs → chunk-W4Q4UEXA.cjs} +14 -14
  232. package/dist/{chunk-EUUQVDXX.cjs.map → chunk-W4Q4UEXA.cjs.map} +1 -1
  233. package/dist/{chunk-ZVSW2KS6.js → chunk-WRYZ2752.js} +3 -3
  234. package/dist/{chunk-ZVSW2KS6.js.map → chunk-WRYZ2752.js.map} +1 -1
  235. package/dist/{chunk-U3ABLVYH.cjs → chunk-WUNWHOLA.cjs} +6 -6
  236. package/dist/{chunk-U3ABLVYH.cjs.map → chunk-WUNWHOLA.cjs.map} +1 -1
  237. package/dist/{chunk-RH43XBNV.cjs → chunk-WWJIW2IH.cjs} +4 -4
  238. package/dist/{chunk-RH43XBNV.cjs.map → chunk-WWJIW2IH.cjs.map} +1 -1
  239. package/dist/chunk-X4LBUPJO.cjs +511 -0
  240. package/dist/chunk-X4LBUPJO.cjs.map +1 -0
  241. package/dist/{chunk-4GXECTPS.cjs → chunk-XB54G7WS.cjs} +37 -3
  242. package/dist/chunk-XB54G7WS.cjs.map +1 -0
  243. package/dist/{chunk-IUFDGB5O.js → chunk-XMCIXHGH.js} +3 -3
  244. package/dist/{chunk-IUFDGB5O.js.map → chunk-XMCIXHGH.js.map} +1 -1
  245. package/dist/{chunk-KAKH2UZA.js → chunk-XO3WLK65.js} +3 -3
  246. package/dist/{chunk-KAKH2UZA.js.map → chunk-XO3WLK65.js.map} +1 -1
  247. package/dist/{chunk-IWDQPSJN.cjs → chunk-XS35KPBZ.cjs} +211 -223
  248. package/dist/chunk-XS35KPBZ.cjs.map +1 -0
  249. package/dist/{chunk-DEZ7XSTG.cjs → chunk-XXVUHLQN.cjs} +7 -7
  250. package/dist/{chunk-DEZ7XSTG.cjs.map → chunk-XXVUHLQN.cjs.map} +1 -1
  251. package/dist/{chunk-3GGET5LK.cjs → chunk-YGA35Z2P.cjs} +7 -7
  252. package/dist/{chunk-3GGET5LK.cjs.map → chunk-YGA35Z2P.cjs.map} +1 -1
  253. package/dist/{chunk-GOKC4CCZ.cjs → chunk-YMHOF6WA.cjs} +8 -8
  254. package/dist/{chunk-GOKC4CCZ.cjs.map → chunk-YMHOF6WA.cjs.map} +1 -1
  255. package/dist/{chunk-OXYFTCRW.cjs → chunk-YP5T6NZD.cjs} +4 -4
  256. package/dist/{chunk-OXYFTCRW.cjs.map → chunk-YP5T6NZD.cjs.map} +1 -1
  257. package/dist/{chunk-EL2RSQTJ.cjs → chunk-YVL3XATO.cjs} +5 -5
  258. package/dist/{chunk-EL2RSQTJ.cjs.map → chunk-YVL3XATO.cjs.map} +1 -1
  259. package/dist/{chunk-PVUDXJAI.js → chunk-YXCE2HSK.js} +4 -4
  260. package/dist/{chunk-PVUDXJAI.js.map → chunk-YXCE2HSK.js.map} +1 -1
  261. package/dist/{chunk-ST2RE5UB.cjs → chunk-Z5KFXHDP.cjs} +6 -6
  262. package/dist/{chunk-ST2RE5UB.cjs.map → chunk-Z5KFXHDP.cjs.map} +1 -1
  263. package/dist/{chunk-DAPZPT5N.cjs → chunk-ZBI52NP2.cjs} +13 -13
  264. package/dist/{chunk-DAPZPT5N.cjs.map → chunk-ZBI52NP2.cjs.map} +1 -1
  265. package/dist/{chunk-4Z6ZZKIY.js → chunk-ZIUADGAR.js} +3 -3
  266. package/dist/{chunk-4Z6ZZKIY.js.map → chunk-ZIUADGAR.js.map} +1 -1
  267. package/dist/{chunk-LOTMAKUG.cjs → chunk-ZZJ4ZVYR.cjs} +11 -11
  268. package/dist/{chunk-LOTMAKUG.cjs.map → chunk-ZZJ4ZVYR.cjs.map} +1 -1
  269. package/dist/collabKit-QZL4P5T5.js +48 -0
  270. package/dist/collabKit-QZL4P5T5.js.map +1 -0
  271. package/dist/collabKit-UF7E6V3N.cjs +72 -0
  272. package/dist/collabKit-UF7E6V3N.cjs.map +1 -0
  273. package/dist/components/Alert/index.cjs +6 -6
  274. package/dist/components/Alert/index.js +2 -2
  275. package/dist/components/AlertDialog/index.cjs +5 -5
  276. package/dist/components/AlertDialog/index.js +4 -4
  277. package/dist/components/AudioPlayer/index.cjs +7 -7
  278. package/dist/components/AudioPlayer/index.js +2 -2
  279. package/dist/components/AudioRecorder/index.cjs +7 -7
  280. package/dist/components/AudioRecorder/index.js +2 -2
  281. package/dist/components/Autocomplete/index.cjs +5 -5
  282. package/dist/components/Autocomplete/index.js +4 -4
  283. package/dist/components/Avatar/index.cjs +6 -6
  284. package/dist/components/Avatar/index.js +2 -2
  285. package/dist/components/Badge/index.cjs +4 -4
  286. package/dist/components/Badge/index.js +2 -2
  287. package/dist/components/Breadcrumb/index.cjs +4 -4
  288. package/dist/components/Breadcrumb/index.js +2 -2
  289. package/dist/components/Button/index.cjs +4 -4
  290. package/dist/components/Button/index.js +2 -2
  291. package/dist/components/Card/index.cjs +16 -16
  292. package/dist/components/Card/index.d.cts +8 -3
  293. package/dist/components/Card/index.d.ts +8 -3
  294. package/dist/components/Card/index.js +2 -2
  295. package/dist/components/Checkbox/index.cjs +5 -5
  296. package/dist/components/Checkbox/index.js +2 -2
  297. package/dist/components/CollabStatus/index.cjs +21 -0
  298. package/dist/components/CollabStatus/index.cjs.map +1 -0
  299. package/dist/components/CollabStatus/index.d.cts +222 -0
  300. package/dist/components/CollabStatus/index.d.ts +222 -0
  301. package/dist/components/CollabStatus/index.js +4 -0
  302. package/dist/components/CollabStatus/index.js.map +1 -0
  303. package/dist/components/Collapsible/index.cjs +5 -5
  304. package/dist/components/Collapsible/index.js +2 -2
  305. package/dist/components/CountryCodeDropdown/index.cjs +6 -6
  306. package/dist/components/CountryCodeDropdown/index.js +3 -3
  307. package/dist/components/DateInput/index.cjs +5 -5
  308. package/dist/components/DateInput/index.d.cts +3 -1
  309. package/dist/components/DateInput/index.d.ts +3 -1
  310. package/dist/components/DateInput/index.js +4 -4
  311. package/dist/components/Dropdown/index.cjs +10 -10
  312. package/dist/components/Dropdown/index.d.cts +1 -1
  313. package/dist/components/Dropdown/index.d.ts +1 -1
  314. package/dist/components/Dropdown/index.js +4 -4
  315. package/dist/components/FloatingWindow/index.cjs +5 -5
  316. package/dist/components/FloatingWindow/index.js +3 -3
  317. package/dist/components/Input/index.cjs +4 -4
  318. package/dist/components/Input/index.js +2 -2
  319. package/dist/components/Label/index.cjs +4 -4
  320. package/dist/components/Label/index.js +2 -2
  321. package/dist/components/Markdown/index.cjs +17 -17
  322. package/dist/components/Markdown/index.js +8 -8
  323. package/dist/components/MediaEditor/index.cjs +16 -16
  324. package/dist/components/MediaEditor/index.d.cts +34 -1
  325. package/dist/components/MediaEditor/index.d.ts +34 -1
  326. package/dist/components/MediaEditor/index.js +11 -11
  327. package/dist/components/MediaPlayer/index.cjs +6 -6
  328. package/dist/components/MediaPlayer/index.js +3 -3
  329. package/dist/components/Modal/index.cjs +10 -10
  330. package/dist/components/Modal/index.js +2 -2
  331. package/dist/components/Pagination/index.cjs +5 -5
  332. package/dist/components/Pagination/index.js +2 -2
  333. package/dist/components/PhoneInput/index.cjs +5 -5
  334. package/dist/components/PhoneInput/index.js +3 -3
  335. package/dist/components/Progress/index.cjs +7 -7
  336. package/dist/components/Progress/index.js +2 -2
  337. package/dist/components/QuickAction/index.cjs +7 -7
  338. package/dist/components/QuickAction/index.js +2 -2
  339. package/dist/components/Radio/index.cjs +5 -5
  340. package/dist/components/Radio/index.js +2 -2
  341. package/dist/components/RecordButton/index.cjs +5 -5
  342. package/dist/components/RecordButton/index.js +2 -2
  343. package/dist/components/RichTextEditor/index.cjs +10 -10
  344. package/dist/components/RichTextEditor/index.js +7 -7
  345. package/dist/components/SchedulePicker/index.cjs +11 -11
  346. package/dist/components/SchedulePicker/index.js +2 -2
  347. package/dist/components/ScrollArea/index.cjs +4 -4
  348. package/dist/components/ScrollArea/index.js +2 -2
  349. package/dist/components/Select/index.cjs +5 -5
  350. package/dist/components/Select/index.js +3 -3
  351. package/dist/components/Separator/index.cjs +4 -4
  352. package/dist/components/Separator/index.js +2 -2
  353. package/dist/components/Sheet/index.cjs +11 -11
  354. package/dist/components/Sheet/index.d.cts +1 -1
  355. package/dist/components/Sheet/index.d.ts +1 -1
  356. package/dist/components/Sheet/index.js +2 -2
  357. package/dist/components/Skeleton/index.cjs +7 -7
  358. package/dist/components/Skeleton/index.js +2 -2
  359. package/dist/components/Slider/index.cjs +6 -6
  360. package/dist/components/Slider/index.js +2 -2
  361. package/dist/components/Spinner/index.cjs +6 -6
  362. package/dist/components/Spinner/index.js +2 -2
  363. package/dist/components/SuperChat/index.cjs +46 -46
  364. package/dist/components/SuperChat/index.d.cts +4 -4
  365. package/dist/components/SuperChat/index.d.ts +4 -4
  366. package/dist/components/SuperChat/index.js +9 -9
  367. package/dist/components/SuperChat/plugins/index.cjs +10 -10
  368. package/dist/components/SuperChat/plugins/index.d.cts +3 -3
  369. package/dist/components/SuperChat/plugins/index.d.ts +3 -3
  370. package/dist/components/SuperChat/plugins/index.js +4 -4
  371. package/dist/components/Switch/index.cjs +5 -5
  372. package/dist/components/Switch/index.js +2 -2
  373. package/dist/components/Table/index.cjs +10 -10
  374. package/dist/components/Table/index.js +2 -2
  375. package/dist/components/Tabs/index.cjs +8 -8
  376. package/dist/components/Tabs/index.js +2 -2
  377. package/dist/components/Text/index.cjs +5 -5
  378. package/dist/components/Text/index.d.cts +1 -1
  379. package/dist/components/Text/index.d.ts +1 -1
  380. package/dist/components/Text/index.js +2 -2
  381. package/dist/components/Textarea/index.cjs +4 -4
  382. package/dist/components/Textarea/index.js +2 -2
  383. package/dist/components/ThemeProvider/index.cjs +9 -9
  384. package/dist/components/ThemeProvider/index.js +3 -3
  385. package/dist/components/Toggle/index.cjs +4 -4
  386. package/dist/components/Toggle/index.js +2 -2
  387. package/dist/components/Tooltip/index.cjs +3 -3
  388. package/dist/components/Tooltip/index.js +2 -2
  389. package/dist/datavis.cjs +7 -7
  390. package/dist/datavis.js +3 -3
  391. package/dist/esheet.cjs +18 -18
  392. package/dist/esheet.js +15 -15
  393. package/dist/hooks/index.cjs +34 -22
  394. package/dist/hooks/index.d.cts +31 -3
  395. package/dist/hooks/index.d.ts +31 -3
  396. package/dist/hooks/index.js +3 -3
  397. package/dist/index.cjs +3422 -1875
  398. package/dist/index.cjs.map +1 -1
  399. package/dist/index.d.cts +212 -22
  400. package/dist/index.d.ts +212 -22
  401. package/dist/index.js +918 -124
  402. package/dist/index.js.map +1 -1
  403. package/dist/kerebron.cjs +60 -17
  404. package/dist/kerebron.cjs.map +1 -1
  405. package/dist/kerebron.d.cts +39 -1
  406. package/dist/kerebron.d.ts +39 -1
  407. package/dist/kerebron.js +60 -17
  408. package/dist/kerebron.js.map +1 -1
  409. package/dist/styles.css +1 -1
  410. package/dist/tailwind-preset.cjs +4 -4
  411. package/dist/tailwind-preset.js +1 -1
  412. package/dist/{types-BYnLjEFg.d.ts → types-B2RLmdVd.d.cts} +3 -1
  413. package/dist/{types-BYnLjEFg.d.cts → types-B2RLmdVd.d.ts} +3 -1
  414. package/dist/{types-CyCwYBlr.d.ts → types-BoTeTPdH.d.ts} +1 -1
  415. package/dist/{types-CBh8Zlje.d.cts → types-DyIB9HYT.d.cts} +1 -1
  416. package/dist/{useAnchoredPosition-nXdSFKHf.d.cts → useAnchoredPosition-C7PNglzD.d.cts} +6 -2
  417. package/dist/{useAnchoredPosition-nXdSFKHf.d.ts → useAnchoredPosition-C7PNglzD.d.ts} +6 -2
  418. package/dist/{useTranscriptEdits-Hy0Vm-H8.d.cts → useTranscriptEdits-CGzlemHT.d.cts} +16 -3
  419. package/dist/{useTranscriptEdits-C2BbMU37.d.ts → useTranscriptEdits-D32bLs0l.d.ts} +16 -3
  420. package/dist/utils/index.cjs +15 -11
  421. package/dist/utils/index.d.cts +6 -1
  422. package/dist/utils/index.d.ts +6 -1
  423. package/dist/utils/index.js +2 -2
  424. package/package.json +30 -12
  425. package/dist/CsvBlock-2A5VEDD3.cjs +0 -15
  426. package/dist/CsvBlock-D6PWAJ5X.js +0 -6
  427. package/dist/HtmlPreviewBlock-PEHTJ6C3.js +0 -6
  428. package/dist/HtmlPreviewBlock-SYXCV5RH.cjs +0 -15
  429. package/dist/MermaidBlock-7NK3AVK2.js +0 -6
  430. package/dist/MermaidBlock-AFXNP5NK.cjs +0 -15
  431. package/dist/SurveyBlock-6KRNKFH5.cjs +0 -15
  432. package/dist/SurveyBlock-NNDGXGG4.js +0 -6
  433. package/dist/chunk-43GBCUSQ.js.map +0 -1
  434. package/dist/chunk-4GXECTPS.cjs.map +0 -1
  435. package/dist/chunk-4LVPQ44A.js.map +0 -1
  436. package/dist/chunk-5BQE6BEL.js.map +0 -1
  437. package/dist/chunk-6D5F7EDM.js.map +0 -1
  438. package/dist/chunk-7VF6WO7H.cjs.map +0 -1
  439. package/dist/chunk-DHKYGVP7.js +0 -3
  440. package/dist/chunk-F3SOEIN2.js +0 -11
  441. package/dist/chunk-F3SOEIN2.js.map +0 -1
  442. package/dist/chunk-FCBQP2U4.cjs.map +0 -1
  443. package/dist/chunk-IHTRKWBG.js.map +0 -1
  444. package/dist/chunk-IWDQPSJN.cjs.map +0 -1
  445. package/dist/chunk-JLBT76WH.js.map +0 -1
  446. package/dist/chunk-KJ5BSGEO.cjs.map +0 -1
  447. package/dist/chunk-LJ2ZWIX6.js.map +0 -1
  448. package/dist/chunk-MCCO4A23.js.map +0 -1
  449. package/dist/chunk-NQME7MCK.js.map +0 -1
  450. package/dist/chunk-NVHAQOHH.cjs.map +0 -1
  451. package/dist/chunk-OOYEHBYJ.js.map +0 -1
  452. package/dist/chunk-OR5DRJCW.cjs +0 -13
  453. package/dist/chunk-OR5DRJCW.cjs.map +0 -1
  454. package/dist/chunk-PFWHWIXS.cjs.map +0 -1
  455. package/dist/chunk-PJAQDAMZ.cjs.map +0 -1
  456. package/dist/chunk-PWHK7SWN.cjs.map +0 -1
  457. package/dist/chunk-QA6ZDHFP.js.map +0 -1
  458. package/dist/chunk-QUUFKGDF.cjs.map +0 -1
  459. package/dist/chunk-UTYUT5YY.cjs +0 -240
  460. package/dist/chunk-ZDEYV373.cjs.map +0 -1
  461. package/dist/chunk-ZGSC2CB2.js.map +0 -1
  462. package/dist/chunk-ZHBANUBI.cjs.map +0 -1
@@ -0,0 +1,511 @@
1
+ 'use strict';
2
+
3
+ var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
4
+ var React2 = require('react');
5
+ var reactDom = require('react-dom');
6
+ var lucideReact = require('lucide-react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React2__namespace = /*#__PURE__*/_interopNamespace(React2);
28
+
29
+ var defaultCollabStatusLabels = {
30
+ live: "Live",
31
+ connecting: "Connecting\u2026",
32
+ editing: (names) => `${names.join(", ")} ${names.length === 1 ? "is" : "are"} editing`,
33
+ triggerLabel: "Live-sync status \u2014 open the update log",
34
+ peersTitle: (count) => `In the room (${count})`,
35
+ alone: "You are the only one here.",
36
+ logTitle: (count) => `Update log (${count})`,
37
+ close: "Close update log",
38
+ wrap: "Wrap long values",
39
+ empty: "No updates yet.",
40
+ roomTerm: "Room",
41
+ urlTerm: "Socket",
42
+ clientTerm: "Client",
43
+ userTerm: "User",
44
+ clientSynced: "synced",
45
+ clientConnecting: "connecting"
46
+ };
47
+ function peerLabels(peers) {
48
+ const seen = /* @__PURE__ */ new Map();
49
+ for (const p of peers) {
50
+ const entry = seen.get(p.name);
51
+ if (entry) entry.count += 1;
52
+ else seen.set(p.name, { count: 1, color: p.color });
53
+ }
54
+ return [...seen].map(([name, { count, color }]) => ({
55
+ label: count > 1 ? `${name} (${count})` : name,
56
+ color
57
+ }));
58
+ }
59
+ var PANEL_OFFSET = 6;
60
+ var VIEWPORT_PADDING = 8;
61
+ function useAnchoredPanel(open, anchorRef, panelRef) {
62
+ const [pos, setPos] = React2__namespace.useState(
63
+ null
64
+ );
65
+ React2__namespace.useLayoutEffect(() => {
66
+ if (!open) {
67
+ setPos(null);
68
+ return;
69
+ }
70
+ const update = () => {
71
+ const anchor = anchorRef.current;
72
+ const panel = panelRef.current;
73
+ if (!anchor || !panel) return;
74
+ const a = anchor.getBoundingClientRect();
75
+ const { offsetWidth: width, offsetHeight: height } = panel;
76
+ const maxLeft = window.innerWidth - width - VIEWPORT_PADDING;
77
+ const left = Math.max(
78
+ VIEWPORT_PADDING,
79
+ Math.min(a.right - width, Math.max(VIEWPORT_PADDING, maxLeft))
80
+ );
81
+ let top = a.bottom + PANEL_OFFSET;
82
+ if (top + height > window.innerHeight - VIEWPORT_PADDING) {
83
+ top = Math.max(VIEWPORT_PADDING, a.top - height - PANEL_OFFSET);
84
+ }
85
+ setPos({ top, left });
86
+ };
87
+ const raf = window.requestAnimationFrame(update);
88
+ window.addEventListener("scroll", update, true);
89
+ window.addEventListener("resize", update);
90
+ return () => {
91
+ window.cancelAnimationFrame(raf);
92
+ window.removeEventListener("scroll", update, true);
93
+ window.removeEventListener("resize", update);
94
+ };
95
+ }, [open, anchorRef, panelRef]);
96
+ return pos;
97
+ }
98
+ var KIND_TONE = {
99
+ doc: "text-muted-foreground",
100
+ awareness: "text-primary-600 dark:text-primary-400",
101
+ sync: "text-success-700 dark:text-success-400",
102
+ patch: "text-muted-foreground"
103
+ };
104
+ function CollabStatus({
105
+ connected,
106
+ peers = [],
107
+ log = [],
108
+ room = null,
109
+ showLog = true,
110
+ compact = false,
111
+ attention = null,
112
+ labels: labelOverrides,
113
+ className
114
+ }) {
115
+ const labels = { ...defaultCollabStatusLabels, ...labelOverrides };
116
+ const [open, setOpen] = React2__namespace.useState(false);
117
+ const [wrapped, setWrapped] = React2__namespace.useState(false);
118
+ const triggerRef = React2__namespace.useRef(null);
119
+ const panelRef = React2__namespace.useRef(null);
120
+ const pos = useAnchoredPanel(open && showLog, triggerRef, panelRef);
121
+ const titleId = React2__namespace.useId();
122
+ React2__namespace.useEffect(() => {
123
+ if (!open) return;
124
+ const onKeyDown = (e) => {
125
+ if (e.key !== "Escape") return;
126
+ setOpen(false);
127
+ triggerRef.current?.focus();
128
+ };
129
+ const onPointerDown = (e) => {
130
+ const target = e.target;
131
+ if (panelRef.current?.contains(target)) return;
132
+ if (triggerRef.current?.contains(target)) return;
133
+ setOpen(false);
134
+ };
135
+ document.addEventListener("keydown", onKeyDown);
136
+ document.addEventListener("pointerdown", onPointerDown);
137
+ return () => {
138
+ document.removeEventListener("keydown", onKeyDown);
139
+ document.removeEventListener("pointerdown", onPointerDown);
140
+ };
141
+ }, [open]);
142
+ const occupants = peerLabels(peers);
143
+ const names = occupants.map((p) => p.label);
144
+ const clip = wrapped ? "break-all whitespace-pre-wrap" : "truncate";
145
+ const statusText = connected ? labels.live : labels.connecting;
146
+ const clientLine = `${room?.clientId ?? "\u2014"} \xB7 ${connected ? labels.clientSynced : labels.clientConnecting}`;
147
+ const triggerLabel = compact ? [
148
+ labels.triggerLabel,
149
+ statusText,
150
+ attention,
151
+ names.length > 0 && labels.editing(names)
152
+ ].filter(Boolean).join(" \u2014 ") : labels.triggerLabel;
153
+ const trigger = /* @__PURE__ */ jsxRuntime.jsxs(
154
+ "button",
155
+ {
156
+ type: "button",
157
+ ref: triggerRef,
158
+ className: chunkS5RVSXDV_cjs.cn(
159
+ "text-muted-foreground inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 text-xs",
160
+ "focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:outline-none",
161
+ showLog && "hover:bg-muted cursor-pointer",
162
+ className
163
+ ),
164
+ onClick: showLog ? () => setOpen((v) => !v) : void 0,
165
+ disabled: !showLog,
166
+ title: showLog ? triggerLabel : void 0,
167
+ "aria-expanded": showLog ? open : void 0,
168
+ "aria-label": showLog ? triggerLabel : void 0,
169
+ "data-slot": "collab-status-trigger",
170
+ children: [
171
+ /* @__PURE__ */ jsxRuntime.jsx(
172
+ "span",
173
+ {
174
+ "aria-hidden": "true",
175
+ "data-slot": "collab-status-dot",
176
+ className: chunkS5RVSXDV_cjs.cn(
177
+ "h-2 w-2 shrink-0 rounded-full",
178
+ !connected && "bg-warning-500 animate-pulse",
179
+ connected && attention && "bg-warning-500",
180
+ connected && !attention && "bg-success-500"
181
+ )
182
+ }
183
+ ),
184
+ !compact && /* @__PURE__ */ jsxRuntime.jsx("span", { children: statusText }),
185
+ !compact && attention && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-warning-700 dark:text-warning-400 truncate", children: [
186
+ "\xB7 ",
187
+ attention
188
+ ] }),
189
+ !compact && names.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: `\xB7 ${labels.editing(names)}` })
190
+ ]
191
+ }
192
+ );
193
+ if (!showLog) return trigger;
194
+ return /* @__PURE__ */ jsxRuntime.jsxs(
195
+ "span",
196
+ {
197
+ className: "relative inline-flex items-center",
198
+ "data-slot": "collab-status",
199
+ children: [
200
+ trigger,
201
+ open && typeof document !== "undefined" && reactDom.createPortal(
202
+ /* @__PURE__ */ jsxRuntime.jsxs(
203
+ "div",
204
+ {
205
+ ref: panelRef,
206
+ role: "dialog",
207
+ "aria-labelledby": titleId,
208
+ "data-slot": "collab-status-panel",
209
+ className: chunkS5RVSXDV_cjs.cn(
210
+ "bg-card text-card-foreground border-border fixed z-50 w-[26rem] max-w-[calc(100vw-1rem)]",
211
+ "rounded-lg border p-3 text-xs shadow-xl"
212
+ ),
213
+ style: {
214
+ top: pos?.top ?? 0,
215
+ left: pos?.left ?? 0,
216
+ visibility: pos ? void 0 : "hidden"
217
+ },
218
+ children: [
219
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [
220
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { id: titleId, className: "text-foreground text-sm", children: labels.logTitle(log.length) }),
221
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-0.5", children: [
222
+ /* @__PURE__ */ jsxRuntime.jsx(
223
+ "button",
224
+ {
225
+ type: "button",
226
+ className: chunkS5RVSXDV_cjs.cn(
227
+ "hover:text-foreground focus-visible:ring-ring rounded p-0.5 focus-visible:ring-2 focus-visible:outline-none",
228
+ wrapped ? "text-foreground bg-muted" : "text-muted-foreground"
229
+ ),
230
+ onClick: () => setWrapped((v) => !v),
231
+ "aria-pressed": wrapped,
232
+ "aria-label": labels.wrap,
233
+ title: labels.wrap,
234
+ "data-slot": "collab-status-wrap",
235
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.WrapText, { className: "h-4 w-4", "aria-hidden": "true" })
236
+ }
237
+ ),
238
+ /* @__PURE__ */ jsxRuntime.jsx(
239
+ "button",
240
+ {
241
+ type: "button",
242
+ className: "text-muted-foreground hover:text-foreground focus-visible:ring-ring rounded p-0.5 focus-visible:ring-2 focus-visible:outline-none",
243
+ onClick: () => {
244
+ setOpen(false);
245
+ triggerRef.current?.focus();
246
+ },
247
+ "aria-label": labels.close,
248
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "h-4 w-4", "aria-hidden": "true" })
249
+ }
250
+ )
251
+ ] })
252
+ ] }),
253
+ attention && /* @__PURE__ */ jsxRuntime.jsx(
254
+ "p",
255
+ {
256
+ "data-slot": "collab-status-attention",
257
+ className: "text-warning-700 dark:text-warning-400 mb-2",
258
+ children: attention
259
+ }
260
+ ),
261
+ room && /* @__PURE__ */ jsxRuntime.jsxs("dl", { className: "border-border text-muted-foreground mb-2 grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 border-b pb-2", children: [
262
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "opacity-70", children: labels.roomTerm }),
263
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: clip, title: room.name, children: room.name }),
264
+ room.url && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
265
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "opacity-70", children: labels.urlTerm }),
266
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: clip, title: room.url, children: room.url })
267
+ ] }),
268
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "opacity-70", children: labels.clientTerm }),
269
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: clip, title: clientLine, children: clientLine }),
270
+ room.userId && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
271
+ /* @__PURE__ */ jsxRuntime.jsx("dt", { className: "opacity-70", children: labels.userTerm }),
272
+ /* @__PURE__ */ jsxRuntime.jsx("dd", { className: clip, title: room.userId, children: room.userId })
273
+ ] })
274
+ ] }),
275
+ /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "border-border mb-2 border-b pb-2", children: [
276
+ /* @__PURE__ */ jsxRuntime.jsx("strong", { className: "text-foreground mb-1 block", children: labels.peersTitle(peers.length) }),
277
+ peers.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: labels.alone }) : /* @__PURE__ */ jsxRuntime.jsx(
278
+ "ul",
279
+ {
280
+ className: "flex flex-wrap gap-x-3 gap-y-1",
281
+ "data-slot": "collab-status-peers",
282
+ children: occupants.map((peer) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-1.5", children: [
283
+ /* @__PURE__ */ jsxRuntime.jsx(
284
+ "span",
285
+ {
286
+ "aria-hidden": "true",
287
+ className: "h-2 w-2 shrink-0 rounded-full",
288
+ style: {
289
+ backgroundColor: peer.color ?? "currentColor"
290
+ }
291
+ }
292
+ ),
293
+ /* @__PURE__ */ jsxRuntime.jsx(
294
+ "span",
295
+ {
296
+ className: chunkS5RVSXDV_cjs.cn("text-foreground", clip),
297
+ title: peer.label,
298
+ children: peer.label
299
+ }
300
+ )
301
+ ] }, peer.label))
302
+ }
303
+ )
304
+ ] }),
305
+ log.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: labels.empty }) : /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "max-h-72 space-y-0.5 overflow-y-auto font-mono", children: log.map((e) => /* @__PURE__ */ jsxRuntime.jsxs(
306
+ "li",
307
+ {
308
+ className: "grid grid-cols-[auto_auto_1fr] gap-2",
309
+ children: [
310
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground opacity-70", children: new Date(e.at).toLocaleTimeString() }),
311
+ /* @__PURE__ */ jsxRuntime.jsxs(
312
+ "span",
313
+ {
314
+ className: chunkS5RVSXDV_cjs.cn(
315
+ "whitespace-nowrap",
316
+ e.origin === "remote" ? "text-primary-600 dark:text-primary-400" : KIND_TONE[e.kind]
317
+ ),
318
+ children: [
319
+ e.kind,
320
+ e.origin ? `/${e.origin}` : ""
321
+ ]
322
+ }
323
+ ),
324
+ /* @__PURE__ */ jsxRuntime.jsx(
325
+ "span",
326
+ {
327
+ className: chunkS5RVSXDV_cjs.cn("text-foreground", clip),
328
+ title: e.detail,
329
+ children: e.detail
330
+ }
331
+ )
332
+ ]
333
+ },
334
+ e.id
335
+ )) })
336
+ ]
337
+ }
338
+ ),
339
+ document.body
340
+ )
341
+ ]
342
+ }
343
+ );
344
+ }
345
+ function useYjsCollabStatus({
346
+ doc,
347
+ provider,
348
+ user,
349
+ roomName,
350
+ url,
351
+ userId,
352
+ logCap = 100
353
+ }) {
354
+ const [connected, setConnected] = React2__namespace.useState(false);
355
+ const [peers, setPeers] = React2__namespace.useState([]);
356
+ const [lastRemoteEdit, setLastRemoteEdit] = React2__namespace.useState(null);
357
+ const [log, setLog] = React2__namespace.useState([]);
358
+ const logIdRef = React2__namespace.useRef(0);
359
+ const awarenessRef = React2__namespace.useRef(null);
360
+ const selfNameRef = React2__namespace.useRef("");
361
+ const activitySeen = React2__namespace.useRef(/* @__PURE__ */ new Map());
362
+ const peerNames = React2__namespace.useRef(/* @__PURE__ */ new Map());
363
+ const pushLog = React2__namespace.useCallback(
364
+ (entry) => {
365
+ const full = {
366
+ id: ++logIdRef.current,
367
+ at: Date.now(),
368
+ ...entry
369
+ };
370
+ setLog((prev) => [full, ...prev].slice(0, logCap));
371
+ },
372
+ [logCap]
373
+ );
374
+ const selfName = user?.name?.trim();
375
+ const selfColor = user?.color;
376
+ React2__namespace.useEffect(() => {
377
+ if (!doc || !provider) {
378
+ setConnected(false);
379
+ setPeers([]);
380
+ setLastRemoteEdit(null);
381
+ return;
382
+ }
383
+ const awareness = provider.awareness;
384
+ awarenessRef.current = awareness;
385
+ activitySeen.current = /* @__PURE__ */ new Map();
386
+ peerNames.current = /* @__PURE__ */ new Map();
387
+ setConnected(provider.synced ?? false);
388
+ const onDocUpdate = (update, origin) => {
389
+ pushLog({
390
+ kind: "doc",
391
+ origin: origin === provider ? "remote" : "local",
392
+ detail: `doc update \xB7 ${update.byteLength} bytes`
393
+ });
394
+ };
395
+ doc.on("update", onDocUpdate);
396
+ const onSync = (isSynced) => {
397
+ setConnected(isSynced);
398
+ pushLog({
399
+ kind: "sync",
400
+ detail: isSynced ? "synced with server" : "disconnected"
401
+ });
402
+ };
403
+ provider.on("sync", onSync);
404
+ const onStatus = (event) => {
405
+ if (event?.status === "disconnected") setConnected(false);
406
+ };
407
+ provider.on("status", onStatus);
408
+ const onAwareness = () => {
409
+ const others = [];
410
+ const present = /* @__PURE__ */ new Map();
411
+ let freshest = null;
412
+ awareness.getStates().forEach((state, clientId) => {
413
+ if (clientId === awareness.clientID) return;
414
+ const peer = state.user;
415
+ if (peer?.name) {
416
+ others.push({ name: peer.name, color: peer.color });
417
+ present.set(clientId, peer.name);
418
+ }
419
+ const activity = state.activity;
420
+ if (activity && activity.at > (activitySeen.current.get(clientId) ?? 0)) {
421
+ activitySeen.current.set(clientId, activity.at);
422
+ if (!freshest || activity.at > freshest.at) {
423
+ const sameUser = !!peer?.name && peer.name === selfNameRef.current;
424
+ freshest = {
425
+ fields: activity.fields,
426
+ by: sameUser ? "You (another window)" : peer?.name,
427
+ at: activity.at
428
+ };
429
+ }
430
+ }
431
+ });
432
+ for (const [clientId, name] of present) {
433
+ if (!peerNames.current.has(clientId)) {
434
+ pushLog({
435
+ kind: "awareness",
436
+ origin: "remote",
437
+ detail: `${name} joined the room`
438
+ });
439
+ }
440
+ }
441
+ for (const [clientId, name] of peerNames.current) {
442
+ if (!present.has(clientId)) {
443
+ pushLog({
444
+ kind: "awareness",
445
+ origin: "remote",
446
+ detail: `${name} left the room`
447
+ });
448
+ }
449
+ }
450
+ peerNames.current = present;
451
+ setPeers(others);
452
+ if (freshest) {
453
+ const edit = freshest;
454
+ setLastRemoteEdit(edit);
455
+ pushLog({
456
+ kind: "awareness",
457
+ origin: "remote",
458
+ detail: `${edit.by ?? "peer"} edited ${edit.fields.join(", ")}`
459
+ });
460
+ }
461
+ };
462
+ awareness.on("change", onAwareness);
463
+ return () => {
464
+ doc.off("update", onDocUpdate);
465
+ provider.off("sync", onSync);
466
+ provider.off("status", onStatus);
467
+ awareness.off("change", onAwareness);
468
+ awarenessRef.current = null;
469
+ activitySeen.current = /* @__PURE__ */ new Map();
470
+ peerNames.current = /* @__PURE__ */ new Map();
471
+ setConnected(false);
472
+ setPeers([]);
473
+ setLastRemoteEdit(null);
474
+ setLog([]);
475
+ };
476
+ }, [doc, provider, pushLog]);
477
+ React2__namespace.useEffect(() => {
478
+ const awareness = awarenessRef.current;
479
+ if (!awareness) return;
480
+ const name = selfName || `User ${awareness.clientID}`;
481
+ selfNameRef.current = name;
482
+ awareness.setLocalStateField("user", { name, color: selfColor });
483
+ }, [provider, selfName, selfColor]);
484
+ const publishActivity = React2__namespace.useCallback(
485
+ (fields) => {
486
+ awarenessRef.current?.setLocalStateField("activity", {
487
+ at: Date.now(),
488
+ fields
489
+ });
490
+ pushLog({
491
+ kind: "patch",
492
+ origin: "local",
493
+ detail: `edited ${fields.join(", ")}`
494
+ });
495
+ },
496
+ [pushLog]
497
+ );
498
+ const room = doc && provider ? {
499
+ name: roomName ?? provider.roomname ?? "room",
500
+ url: url ?? provider.url,
501
+ clientId: doc.clientID,
502
+ userId
503
+ } : null;
504
+ return { connected, peers, log, room, lastRemoteEdit, publishActivity };
505
+ }
506
+
507
+ exports.CollabStatus = CollabStatus;
508
+ exports.defaultCollabStatusLabels = defaultCollabStatusLabels;
509
+ exports.useYjsCollabStatus = useYjsCollabStatus;
510
+ //# sourceMappingURL=chunk-X4LBUPJO.cjs.map
511
+ //# sourceMappingURL=chunk-X4LBUPJO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/CollabStatus/CollabStatus.tsx","../src/components/CollabStatus/useYjsCollabStatus.ts"],"names":["React","jsxs","cn","jsx","createPortal","WrapText","X","Fragment","React2"],"mappings":"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","file":"chunk-X4LBUPJO.cjs","sourcesContent":["import * as React from 'react';\nimport { createPortal } from 'react-dom';\nimport { WrapText, X } from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Another participant currently present in the room. */\nexport interface CollabPeer {\n /** Display name published through presence. */\n name: string;\n /** Optional presence color (cursor/avatar tint). */\n color?: string;\n}\n\n/** Static identity of the open collaboration room, shown in the debug panel. */\nexport interface CollabRoomInfo {\n /** Room name on the sync server (e.g. `case/4`). */\n name: string;\n /** Transport URL the client connected to. */\n url?: string;\n /** This window's client id (stable per document), or null before connect. */\n clientId?: number | null;\n /** The acting application user id passed to the sync server. */\n userId?: string;\n}\n\n/** Category of a collaboration event in the debug log. */\nexport type CollabLogKind = 'doc' | 'awareness' | 'sync' | 'patch';\n\n/** A single entry in the collaboration debug log. */\nexport interface CollabLogEntry {\n /** Stable key for rendering. */\n id: number | string;\n /** Wall-clock time of the event (epoch ms). */\n at: number;\n /** Event category. */\n kind: CollabLogKind;\n /** Whether this window or a peer originated it. */\n origin?: 'local' | 'remote';\n /** Human-readable detail line. */\n detail: string;\n}\n\n/** Every user-facing string, so apps can translate the widget. */\nexport interface CollabStatusLabels {\n /** Trigger text once the initial sync completed. */\n live: string;\n /** Trigger text before the initial sync completes. */\n connecting: string;\n /** Summary of who else is editing, e.g. `Ann, Bo are editing`. */\n editing: (names: string[]) => string;\n /** Accessible name / tooltip of the trigger button. */\n triggerLabel: string;\n /** Heading of the room-occupants section. */\n peersTitle: (count: number) => string;\n /** Shown in the occupants section when nobody else is in the room. */\n alone: React.ReactNode;\n /** Heading of the debug panel. */\n logTitle: (count: number) => string;\n /** Accessible name of the panel close button. */\n close: string;\n /** Accessible name of the toggle that unclips long values. */\n wrap: string;\n /** Shown when the log is empty. */\n empty: React.ReactNode;\n roomTerm: string;\n urlTerm: string;\n clientTerm: string;\n userTerm: string;\n /** Suffix appended to the client id once synced / while connecting. */\n clientSynced: string;\n clientConnecting: string;\n}\n\nexport const defaultCollabStatusLabels: CollabStatusLabels = {\n live: 'Live',\n connecting: 'Connecting…',\n editing: (names) =>\n `${names.join(', ')} ${names.length === 1 ? 'is' : 'are'} editing`,\n triggerLabel: 'Live-sync status — open the update log',\n peersTitle: (count) => `In the room (${count})`,\n alone: 'You are the only one here.',\n logTitle: (count) => `Update log (${count})`,\n close: 'Close update log',\n wrap: 'Wrap long values',\n empty: 'No updates yet.',\n roomTerm: 'Room',\n urlTerm: 'Socket',\n clientTerm: 'Client',\n userTerm: 'User',\n clientSynced: 'synced',\n clientConnecting: 'connecting',\n};\n\nexport interface CollabStatusProps {\n /** True once the room has completed its initial sync with the server. */\n connected: boolean;\n /** Other people in the room right now. */\n peers?: CollabPeer[];\n /** Recent collaboration events, newest first. */\n log?: CollabLogEntry[];\n /** Identity of the open room, shown at the top of the panel. */\n room?: CollabRoomInfo | null;\n /** Set false to render a status-only chip with no debug panel. */\n showLog?: boolean;\n /**\n * Render the trigger as the bare connection dot, moving the status text into\n * its accessible name. For headers with no room for a full chip.\n */\n compact?: boolean;\n /**\n * An app-level condition worth the same glance as the connection state, e.g.\n * `\"Unsaved changes\"`. While set, the dot turns amber and the text joins the\n * trigger's accessible name and heads the panel.\n */\n attention?: React.ReactNode;\n /** Overrides for any user-facing string. */\n labels?: Partial<CollabStatusLabels>;\n /** Additional className for the trigger wrapper. */\n className?: string;\n}\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\n/** One row of the occupants list: a display label and its presence color. */\ninterface PeerLabel {\n label: string;\n color?: string;\n}\n\n/** Collapse multiple windows of the same person into `Name (N)`. */\nfunction peerLabels(peers: CollabPeer[]): PeerLabel[] {\n const seen = new Map<string, { count: number; color?: string }>();\n for (const p of peers) {\n const entry = seen.get(p.name);\n if (entry) entry.count += 1;\n else seen.set(p.name, { count: 1, color: p.color });\n }\n return [...seen].map(([name, { count, color }]) => ({\n label: count > 1 ? `${name} (${count})` : name,\n color,\n }));\n}\n\nconst PANEL_OFFSET = 6;\nconst VIEWPORT_PADDING = 8;\n\n/**\n * Position the panel under the trigger, right-aligned to it but clamped to the\n * viewport on both axes (it flips above the trigger when it would overflow the\n * bottom). Returns null until the panel has been measured.\n */\nfunction useAnchoredPanel(\n open: boolean,\n anchorRef: React.RefObject<HTMLElement | null>,\n panelRef: React.RefObject<HTMLElement | null>\n) {\n const [pos, setPos] = React.useState<{ top: number; left: number } | null>(\n null\n );\n\n React.useLayoutEffect(() => {\n if (!open) {\n setPos(null);\n return;\n }\n const update = () => {\n const anchor = anchorRef.current;\n const panel = panelRef.current;\n if (!anchor || !panel) return;\n const a = anchor.getBoundingClientRect();\n const { offsetWidth: width, offsetHeight: height } = panel;\n\n const maxLeft = window.innerWidth - width - VIEWPORT_PADDING;\n const left = Math.max(\n VIEWPORT_PADDING,\n Math.min(a.right - width, Math.max(VIEWPORT_PADDING, maxLeft))\n );\n\n let top = a.bottom + PANEL_OFFSET;\n if (top + height > window.innerHeight - VIEWPORT_PADDING) {\n top = Math.max(VIEWPORT_PADDING, a.top - height - PANEL_OFFSET);\n }\n\n setPos({ top, left });\n };\n\n // Measured after the (hidden) panel has been laid out.\n const raf = window.requestAnimationFrame(update);\n window.addEventListener('scroll', update, true);\n window.addEventListener('resize', update);\n return () => {\n window.cancelAnimationFrame(raf);\n window.removeEventListener('scroll', update, true);\n window.removeEventListener('resize', update);\n };\n }, [open, anchorRef, panelRef]);\n\n return pos;\n}\n\nconst KIND_TONE: Record<CollabLogKind, string> = {\n doc: 'text-muted-foreground',\n awareness: 'text-primary-600 dark:text-primary-400',\n sync: 'text-success-700 dark:text-success-400',\n patch: 'text-muted-foreground',\n};\n\n// =============================================================================\n// Component\n// =============================================================================\n\n/**\n * Live-collaboration status chip: a connection dot, a `Live` / `Connecting…`\n * label, a summary of who else is editing, and a click-to-open panel with the\n * room identity, who is in the room, and a rolling log of collaboration\n * events. Pass `compact` to shrink the trigger down to the dot alone, and\n * `attention` to let an app condition (\"Unsaved changes\") share that dot.\n *\n * Transport-agnostic — it renders whatever presence state you hand it. For a\n * Yjs (`y-websocket`) room, {@link useYjsCollabStatus} produces these props\n * directly:\n *\n * @example\n * ```tsx\n * const doc = React.useMemo(() => new Y.Doc(), []);\n * const provider = React.useMemo(\n * () => new WebsocketProvider('ws://localhost:1234', 'case/4', doc),\n * [doc]\n * );\n * const status = useYjsCollabStatus({ doc, provider, user: { name: 'Ann' } });\n *\n * return <CollabStatus {...status} />;\n * ```\n */\nexport function CollabStatus({\n connected,\n peers = [],\n log = [],\n room = null,\n showLog = true,\n compact = false,\n attention = null,\n labels: labelOverrides,\n className,\n}: CollabStatusProps) {\n const labels = { ...defaultCollabStatusLabels, ...labelOverrides };\n const [open, setOpen] = React.useState(false);\n const [wrapped, setWrapped] = React.useState(false);\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const panelRef = React.useRef<HTMLDivElement>(null);\n const pos = useAnchoredPanel(open && showLog, triggerRef, panelRef);\n const titleId = React.useId();\n\n // Escape closes and returns focus; a pointer outside dismisses.\n React.useEffect(() => {\n if (!open) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return;\n setOpen(false);\n triggerRef.current?.focus();\n };\n const onPointerDown = (e: Event) => {\n const target = e.target as Node;\n if (panelRef.current?.contains(target)) return;\n if (triggerRef.current?.contains(target)) return;\n setOpen(false);\n };\n document.addEventListener('keydown', onKeyDown);\n document.addEventListener('pointerdown', onPointerDown);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n document.removeEventListener('pointerdown', onPointerDown);\n };\n }, [open]);\n\n const occupants = peerLabels(peers);\n const names = occupants.map((p) => p.label);\n // Long values are clipped to one line; the panel's wrap toggle unclips them.\n const clip = wrapped ? 'break-all whitespace-pre-wrap' : 'truncate';\n const statusText = connected ? labels.live : labels.connecting;\n const clientLine = `${room?.clientId ?? '—'} · ${\n connected ? labels.clientSynced : labels.clientConnecting\n }`;\n // Compact triggers have no visible text, so the status and who is editing\n // have to reach assistive tech (and the tooltip) through the label.\n const triggerLabel = compact\n ? [\n labels.triggerLabel,\n statusText,\n attention,\n names.length > 0 && labels.editing(names),\n ]\n .filter(Boolean)\n .join(' — ')\n : labels.triggerLabel;\n\n const trigger = (\n <button\n type=\"button\"\n ref={triggerRef}\n className={cn(\n 'text-muted-foreground inline-flex items-center gap-1.5 rounded-md px-1.5 py-0.5 text-xs',\n 'focus-visible:ring-ring focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:outline-none',\n showLog && 'hover:bg-muted cursor-pointer',\n className\n )}\n onClick={showLog ? () => setOpen((v) => !v) : undefined}\n disabled={!showLog}\n title={showLog ? triggerLabel : undefined}\n aria-expanded={showLog ? open : undefined}\n aria-label={showLog ? triggerLabel : undefined}\n data-slot=\"collab-status-trigger\"\n >\n <span\n aria-hidden=\"true\"\n data-slot=\"collab-status-dot\"\n className={cn(\n 'h-2 w-2 shrink-0 rounded-full',\n !connected && 'bg-warning-500 animate-pulse',\n connected && attention && 'bg-warning-500',\n connected && !attention && 'bg-success-500'\n )}\n />\n {!compact && <span>{statusText}</span>}\n {!compact && attention && (\n <span className=\"text-warning-700 dark:text-warning-400 truncate\">\n · {attention}\n </span>\n )}\n {!compact && names.length > 0 && (\n <span className=\"truncate\">{`· ${labels.editing(names)}`}</span>\n )}\n </button>\n );\n\n if (!showLog) return trigger;\n\n return (\n <span\n className=\"relative inline-flex items-center\"\n data-slot=\"collab-status\"\n >\n {trigger}\n {open &&\n typeof document !== 'undefined' &&\n createPortal(\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-labelledby={titleId}\n data-slot=\"collab-status-panel\"\n className={cn(\n 'bg-card text-card-foreground border-border fixed z-50 w-[26rem] max-w-[calc(100vw-1rem)]',\n 'rounded-lg border p-3 text-xs shadow-xl'\n )}\n style={{\n top: pos?.top ?? 0,\n left: pos?.left ?? 0,\n visibility: pos ? undefined : 'hidden',\n }}\n >\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <strong id={titleId} className=\"text-foreground text-sm\">\n {labels.logTitle(log.length)}\n </strong>\n <span className=\"flex items-center gap-0.5\">\n <button\n type=\"button\"\n className={cn(\n 'hover:text-foreground focus-visible:ring-ring rounded p-0.5 focus-visible:ring-2 focus-visible:outline-none',\n wrapped\n ? 'text-foreground bg-muted'\n : 'text-muted-foreground'\n )}\n onClick={() => setWrapped((v) => !v)}\n aria-pressed={wrapped}\n aria-label={labels.wrap}\n title={labels.wrap}\n data-slot=\"collab-status-wrap\"\n >\n <WrapText className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground focus-visible:ring-ring rounded p-0.5 focus-visible:ring-2 focus-visible:outline-none\"\n onClick={() => {\n setOpen(false);\n triggerRef.current?.focus();\n }}\n aria-label={labels.close}\n >\n <X className=\"h-4 w-4\" aria-hidden=\"true\" />\n </button>\n </span>\n </div>\n\n {attention && (\n <p\n data-slot=\"collab-status-attention\"\n className=\"text-warning-700 dark:text-warning-400 mb-2\"\n >\n {attention}\n </p>\n )}\n\n {room && (\n <dl className=\"border-border text-muted-foreground mb-2 grid grid-cols-[auto_1fr] gap-x-3 gap-y-0.5 border-b pb-2\">\n <dt className=\"opacity-70\">{labels.roomTerm}</dt>\n {/* The values are clipped, so hovering must reveal the rest. */}\n <dd className={clip} title={room.name}>\n {room.name}\n </dd>\n {room.url && (\n <>\n <dt className=\"opacity-70\">{labels.urlTerm}</dt>\n <dd className={clip} title={room.url}>\n {room.url}\n </dd>\n </>\n )}\n <dt className=\"opacity-70\">{labels.clientTerm}</dt>\n <dd className={clip} title={clientLine}>\n {clientLine}\n </dd>\n {room.userId && (\n <>\n <dt className=\"opacity-70\">{labels.userTerm}</dt>\n <dd className={clip} title={room.userId}>\n {room.userId}\n </dd>\n </>\n )}\n </dl>\n )}\n\n <section className=\"border-border mb-2 border-b pb-2\">\n <strong className=\"text-foreground mb-1 block\">\n {labels.peersTitle(peers.length)}\n </strong>\n {peers.length === 0 ? (\n <p className=\"text-muted-foreground\">{labels.alone}</p>\n ) : (\n <ul\n className=\"flex flex-wrap gap-x-3 gap-y-1\"\n data-slot=\"collab-status-peers\"\n >\n {occupants.map((peer) => (\n <li key={peer.label} className=\"flex items-center gap-1.5\">\n <span\n aria-hidden=\"true\"\n className=\"h-2 w-2 shrink-0 rounded-full\"\n style={{\n backgroundColor: peer.color ?? 'currentColor',\n }}\n />\n <span\n className={cn('text-foreground', clip)}\n title={peer.label}\n >\n {peer.label}\n </span>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n {log.length === 0 ? (\n <p className=\"text-muted-foreground\">{labels.empty}</p>\n ) : (\n <ul className=\"max-h-72 space-y-0.5 overflow-y-auto font-mono\">\n {log.map((e) => (\n <li\n key={e.id}\n className=\"grid grid-cols-[auto_auto_1fr] gap-2\"\n >\n <span className=\"text-muted-foreground opacity-70\">\n {new Date(e.at).toLocaleTimeString()}\n </span>\n <span\n className={cn(\n 'whitespace-nowrap',\n e.origin === 'remote'\n ? 'text-primary-600 dark:text-primary-400'\n : KIND_TONE[e.kind]\n )}\n >\n {e.kind}\n {e.origin ? `/${e.origin}` : ''}\n </span>\n <span\n className={cn('text-foreground', clip)}\n title={e.detail}\n >\n {e.detail}\n </span>\n </li>\n ))}\n </ul>\n )}\n </div>,\n document.body\n )}\n </span>\n );\n}\n","import * as React from 'react';\nimport type {\n CollabLogEntry,\n CollabPeer,\n CollabRoomInfo,\n} from './CollabStatus';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// =============================================================================\n// Structural Yjs types\n// =============================================================================\n//\n// Declared structurally (as methods, so parameter bivariance applies) rather\n// than imported from `yjs` / `y-protocols`, so `@mieweb/ui` needs no Yjs\n// dependency at all. A real `Y.Doc`, `Awareness` and `WebsocketProvider`\n// satisfy these as-is.\n\n/** The subset of `Y.Doc` this hook observes. */\nexport interface YjsDocLike {\n clientID: number;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n}\n\n/** The subset of `y-protocols/awareness`.`Awareness` this hook uses. */\nexport interface YjsAwarenessLike {\n clientID: number;\n getStates(): Map<number, Record<string, any>>;\n setLocalStateField(field: string, value: unknown): void;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n}\n\n/** The subset of `y-websocket`.`WebsocketProvider` this hook uses. */\nexport interface YjsProviderLike {\n awareness: YjsAwarenessLike;\n /** True once the initial sync completed (y-websocket exposes this). */\n synced?: boolean;\n /** Room name, used as the default label in the debug panel. */\n roomname?: string;\n /** Server URL, used as the default label in the debug panel. */\n url?: string;\n on(event: string, handler: (...args: any[]) => void): void;\n off(event: string, handler: (...args: any[]) => void): void;\n}\n\n/** Awareness payload published whenever this window makes a local edit. */\ninterface EditActivity {\n at: number;\n fields: string[];\n}\n\n/** A remote collaborator's edit that just changed the open document. */\nexport interface CollabRemoteEdit {\n /** Human-readable labels of the fields that changed. */\n fields: string[];\n /** Who made the change, when attributable from presence. */\n by?: string;\n /** Timestamp; a new value signals a fresh growl/toast. */\n at: number;\n}\n\nexport interface UseYjsCollabStatusOptions {\n /** The shared document. Pass null to keep the hook inert. */\n doc: YjsDocLike | null | undefined;\n /** The sync provider (e.g. `y-websocket`). Pass null to keep it inert. */\n provider: YjsProviderLike | null | undefined;\n /**\n * Presence identity published for this window. Defaults to\n * `User <clientID>` so windows are distinguishable without a login.\n */\n user?: { name?: string; color?: string };\n /** Room label for the debug panel. Defaults to `provider.roomname`. */\n roomName?: string;\n /** URL label for the debug panel. Defaults to `provider.url`. */\n url?: string;\n /** Application user id shown in the debug panel. */\n userId?: string;\n /** Maximum log entries kept in memory. Default 100. */\n logCap?: number;\n}\n\nexport interface YjsCollabStatus {\n /** True once the initial server sync completed. */\n connected: boolean;\n /** Other windows currently present in the room. */\n peers: CollabPeer[];\n /** Recent collaboration events, newest first. */\n log: CollabLogEntry[];\n /** Room identity for the debug panel. */\n room: CollabRoomInfo | null;\n /** The most recent remote edit, or null. */\n lastRemoteEdit: CollabRemoteEdit | null;\n /**\n * Announce a local edit and the fields it touched, so other windows can\n * attribute it. Also records a `patch` log entry.\n */\n publishActivity: (fields: string[]) => void;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Bind {@link CollabStatus} to a Yjs room: tracks initial-sync state, publishes\n * this window's presence, tracks peers joining/leaving, attributes remote edits,\n * and keeps a capped log of document/awareness/sync events.\n *\n * The return value is spreadable straight into the component.\n *\n * @example\n * ```tsx\n * import * as Y from 'yjs';\n * import { WebsocketProvider } from 'y-websocket';\n * import { CollabStatus, useYjsCollabStatus } from '@mieweb/ui';\n *\n * function Header({ caseId }: { caseId: string }) {\n * const doc = React.useMemo(() => new Y.Doc(), []);\n * const provider = React.useMemo(\n * () => new WebsocketProvider('ws://localhost:1234', `case/${caseId}`, doc),\n * [doc, caseId]\n * );\n * React.useEffect(() => () => provider.destroy(), [provider]);\n *\n * const status = useYjsCollabStatus({ doc, provider, user: { name: 'Ann' } });\n * return <CollabStatus {...status} />;\n * }\n * ```\n */\nexport function useYjsCollabStatus({\n doc,\n provider,\n user,\n roomName,\n url,\n userId,\n logCap = 100,\n}: UseYjsCollabStatusOptions): YjsCollabStatus {\n const [connected, setConnected] = React.useState(false);\n const [peers, setPeers] = React.useState<CollabPeer[]>([]);\n const [lastRemoteEdit, setLastRemoteEdit] =\n React.useState<CollabRemoteEdit | null>(null);\n const [log, setLog] = React.useState<CollabLogEntry[]>([]);\n\n const logIdRef = React.useRef(0);\n const awarenessRef = React.useRef<YjsAwarenessLike | null>(null);\n /** Effective display name published to presence. */\n const selfNameRef = React.useRef('');\n /** Last activity timestamp seen per remote client, to detect new edits. */\n const activitySeen = React.useRef(new Map<number, number>());\n /** Names present, keyed by clientID, to detect join/leave. */\n const peerNames = React.useRef(new Map<number, string>());\n\n const pushLog = React.useCallback(\n (entry: Omit<CollabLogEntry, 'id' | 'at'>) => {\n const full: CollabLogEntry = {\n id: ++logIdRef.current,\n at: Date.now(),\n ...entry,\n };\n setLog((prev) => [full, ...prev].slice(0, logCap));\n },\n [logCap]\n );\n\n const selfName = user?.name?.trim();\n const selfColor = user?.color;\n\n React.useEffect(() => {\n if (!doc || !provider) {\n setConnected(false);\n setPeers([]);\n setLastRemoteEdit(null);\n return;\n }\n\n const awareness = provider.awareness;\n awarenessRef.current = awareness;\n activitySeen.current = new Map();\n peerNames.current = new Map();\n setConnected(provider.synced ?? false);\n\n // Remote updates arrive with `origin === provider`; local transactions have\n // a null origin — that is what labels the log entry.\n const onDocUpdate = (update: Uint8Array, origin: unknown) => {\n pushLog({\n kind: 'doc',\n origin: origin === provider ? 'remote' : 'local',\n detail: `doc update · ${update.byteLength} bytes`,\n });\n };\n doc.on('update', onDocUpdate);\n\n const onSync = (isSynced: boolean) => {\n setConnected(isSynced);\n pushLog({\n kind: 'sync',\n detail: isSynced ? 'synced with server' : 'disconnected',\n });\n };\n provider.on('sync', onSync);\n\n const onStatus = (event: { status?: string }) => {\n if (event?.status === 'disconnected') setConnected(false);\n };\n provider.on('status', onStatus);\n\n const onAwareness = () => {\n const others: CollabPeer[] = [];\n const present = new Map<number, string>();\n let freshest: CollabRemoteEdit | null = null;\n\n awareness.getStates().forEach((state, clientId) => {\n if (clientId === awareness.clientID) return; // skip this window\n const peer = state.user as CollabPeer | undefined;\n if (peer?.name) {\n others.push({ name: peer.name, color: peer.color });\n present.set(clientId, peer.name);\n }\n const activity = state.activity as EditActivity | undefined;\n if (\n activity &&\n activity.at > (activitySeen.current.get(clientId) ?? 0)\n ) {\n activitySeen.current.set(clientId, activity.at);\n if (!freshest || activity.at > freshest.at) {\n const sameUser = !!peer?.name && peer.name === selfNameRef.current;\n freshest = {\n fields: activity.fields,\n by: sameUser ? 'You (another window)' : peer?.name,\n at: activity.at,\n };\n }\n }\n });\n\n for (const [clientId, name] of present) {\n if (!peerNames.current.has(clientId)) {\n pushLog({\n kind: 'awareness',\n origin: 'remote',\n detail: `${name} joined the room`,\n });\n }\n }\n for (const [clientId, name] of peerNames.current) {\n if (!present.has(clientId)) {\n pushLog({\n kind: 'awareness',\n origin: 'remote',\n detail: `${name} left the room`,\n });\n }\n }\n peerNames.current = present;\n setPeers(others);\n\n if (freshest) {\n const edit = freshest as CollabRemoteEdit;\n setLastRemoteEdit(edit);\n pushLog({\n kind: 'awareness',\n origin: 'remote',\n detail: `${edit.by ?? 'peer'} edited ${edit.fields.join(', ')}`,\n });\n }\n };\n awareness.on('change', onAwareness);\n\n return () => {\n doc.off('update', onDocUpdate);\n provider.off('sync', onSync);\n provider.off('status', onStatus);\n awareness.off('change', onAwareness);\n awarenessRef.current = null;\n activitySeen.current = new Map();\n peerNames.current = new Map();\n setConnected(false);\n setPeers([]);\n setLastRemoteEdit(null);\n setLog([]);\n };\n }, [doc, provider, pushLog]);\n\n // Publish (and re-publish) this window's presence without tearing the room\n // down when the display name changes. Runs after the room effect above, which\n // is what populates `awarenessRef`.\n React.useEffect(() => {\n const awareness = awarenessRef.current;\n if (!awareness) return;\n const name = selfName || `User ${awareness.clientID}`;\n selfNameRef.current = name;\n awareness.setLocalStateField('user', { name, color: selfColor });\n }, [provider, selfName, selfColor]);\n\n const publishActivity = React.useCallback(\n (fields: string[]) => {\n awarenessRef.current?.setLocalStateField('activity', {\n at: Date.now(),\n fields,\n } satisfies EditActivity);\n pushLog({\n kind: 'patch',\n origin: 'local',\n detail: `edited ${fields.join(', ')}`,\n });\n },\n [pushLog]\n );\n\n const room: CollabRoomInfo | null =\n doc && provider\n ? {\n name: roomName ?? provider.roomname ?? 'room',\n url: url ?? provider.url,\n clientId: doc.clientID,\n userId,\n }\n : null;\n\n return { connected, peers, log, room, lastRemoteEdit, publishActivity };\n}\n"]}