@arbidocs/blocks 0.5.104 → 0.5.105

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 (210) hide show
  1. package/dist/{ConnectedCallDock-P7LK2HYF.cjs → ConnectedCallDock-63F733HH.cjs} +20 -20
  2. package/dist/{ConnectedCallDock-P7LK2HYF.cjs.map → ConnectedCallDock-63F733HH.cjs.map} +1 -1
  3. package/dist/{ConnectedCallDock-NEZJNTKH.js → ConnectedCallDock-VJGARAFW.js} +12 -12
  4. package/dist/{ConnectedCallDock-NEZJNTKH.js.map → ConnectedCallDock-VJGARAFW.js.map} +1 -1
  5. package/dist/{ConnectedCallRoom-K3X6ICCG.js → ConnectedCallRoom-JEHW4VML.js} +12 -12
  6. package/dist/{ConnectedCallRoom-K3X6ICCG.js.map → ConnectedCallRoom-JEHW4VML.js.map} +1 -1
  7. package/dist/{ConnectedCallRoom-FXTR4YFI.cjs → ConnectedCallRoom-RYPXT4T5.cjs} +13 -13
  8. package/dist/{ConnectedCallRoom-FXTR4YFI.cjs.map → ConnectedCallRoom-RYPXT4T5.cjs.map} +1 -1
  9. package/dist/{ConnectedNativeDocxComparison-FENZYWDH.js → ConnectedNativeDocxComparison-3EASEGA7.js} +15 -15
  10. package/dist/{ConnectedNativeDocxComparison-FENZYWDH.js.map → ConnectedNativeDocxComparison-3EASEGA7.js.map} +1 -1
  11. package/dist/{ConnectedNativeDocxComparison-7VJKOKYU.cjs → ConnectedNativeDocxComparison-JZ6E75CT.cjs} +16 -16
  12. package/dist/{ConnectedNativeDocxComparison-7VJKOKYU.cjs.map → ConnectedNativeDocxComparison-JZ6E75CT.cjs.map} +1 -1
  13. package/dist/{ConnectedNativeDocxEditor-HB5BHGZ2.cjs → ConnectedNativeDocxEditor-QJET2DM7.cjs} +16 -16
  14. package/dist/{ConnectedNativeDocxEditor-HB5BHGZ2.cjs.map → ConnectedNativeDocxEditor-QJET2DM7.cjs.map} +1 -1
  15. package/dist/{ConnectedNativeDocxEditor-CNQAMO2N.js → ConnectedNativeDocxEditor-X5R5WDIV.js} +14 -14
  16. package/dist/{ConnectedNativeDocxEditor-CNQAMO2N.js.map → ConnectedNativeDocxEditor-X5R5WDIV.js.map} +1 -1
  17. package/dist/{ConnectedProductionSetDialog-ENAIZWPK.cjs → ConnectedProductionSetDialog-CNF6RZCU.cjs} +3 -3
  18. package/dist/{ConnectedProductionSetDialog-ENAIZWPK.cjs.map → ConnectedProductionSetDialog-CNF6RZCU.cjs.map} +1 -1
  19. package/dist/{ConnectedProductionSetDialog-O4FWTZNF.js → ConnectedProductionSetDialog-MVSRWQAH.js} +3 -3
  20. package/dist/{ConnectedProductionSetDialog-O4FWTZNF.js.map → ConnectedProductionSetDialog-MVSRWQAH.js.map} +1 -1
  21. package/dist/{ConnectedStreamedWordArtifact-BF6JET2D.cjs → ConnectedStreamedWordArtifact-G4NO45TW.cjs} +16 -16
  22. package/dist/ConnectedStreamedWordArtifact-G4NO45TW.cjs.map +1 -0
  23. package/dist/{ConnectedStreamedWordArtifact-ILMKFCDC.js → ConnectedStreamedWordArtifact-WY34LSU2.js} +15 -15
  24. package/dist/ConnectedStreamedWordArtifact-WY34LSU2.js.map +1 -0
  25. package/dist/{DocumentReviewCard-WZNBPG72.js → DocumentReviewCard-DBRWDHRF.js} +11 -11
  26. package/dist/{DocumentReviewCard-WZNBPG72.js.map → DocumentReviewCard-DBRWDHRF.js.map} +1 -1
  27. package/dist/{DocumentReviewCard-MSHD73S3.cjs → DocumentReviewCard-O2CPX6PY.cjs} +16 -16
  28. package/dist/{DocumentReviewCard-MSHD73S3.cjs.map → DocumentReviewCard-O2CPX6PY.cjs.map} +1 -1
  29. package/dist/{FilesViewerDialog-DV2U4USR.cjs → FilesViewerDialog-3JCXOSI5.cjs} +39 -39
  30. package/dist/{FilesViewerDialog-DV2U4USR.cjs.map → FilesViewerDialog-3JCXOSI5.cjs.map} +1 -1
  31. package/dist/{FilesViewerDialog-XETOHORQ.js → FilesViewerDialog-7AHLHVDB.js} +33 -33
  32. package/dist/{FilesViewerDialog-XETOHORQ.js.map → FilesViewerDialog-7AHLHVDB.js.map} +1 -1
  33. package/dist/{WorkspaceTableView-WD754UBK.js → WorkspaceTableView-4VRDGFGG.js} +7 -7
  34. package/dist/{WorkspaceTableView-WD754UBK.js.map → WorkspaceTableView-4VRDGFGG.js.map} +1 -1
  35. package/dist/{WorkspaceTableView-3D6SYOWT.cjs → WorkspaceTableView-T2SIYAEM.cjs} +9 -9
  36. package/dist/{WorkspaceTableView-3D6SYOWT.cjs.map → WorkspaceTableView-T2SIYAEM.cjs.map} +1 -1
  37. package/dist/agents/index.cjs +296 -296
  38. package/dist/agents/index.js +13 -13
  39. package/dist/{ai-WASSGEMI.js → ai-KXDTYRZC.js} +16 -16
  40. package/dist/ai-KXDTYRZC.js.map +1 -0
  41. package/dist/{ai-E6FA4Y4J.cjs → ai-QXZ4PB2M.cjs} +24 -24
  42. package/dist/ai-QXZ4PB2M.cjs.map +1 -0
  43. package/dist/calls/index.cjs +121 -121
  44. package/dist/calls/index.js +8 -8
  45. package/dist/chat/index.cjs +1 -1
  46. package/dist/chat/index.js +1 -1
  47. package/dist/{chunk-RBI7WVEP.cjs → chunk-2NAAK4NF.cjs} +4 -4
  48. package/dist/{chunk-RBI7WVEP.cjs.map → chunk-2NAAK4NF.cjs.map} +1 -1
  49. package/dist/{chunk-PIWT2GCY.cjs → chunk-2THO5FO3.cjs} +20 -20
  50. package/dist/{chunk-PIWT2GCY.cjs.map → chunk-2THO5FO3.cjs.map} +1 -1
  51. package/dist/{chunk-4UOXUWX3.js → chunk-35M3UPTC.js} +71 -20
  52. package/dist/chunk-35M3UPTC.js.map +1 -0
  53. package/dist/{chunk-TQFDPCWU.js → chunk-3726GQUW.js} +17 -17
  54. package/dist/{chunk-TQFDPCWU.js.map → chunk-3726GQUW.js.map} +1 -1
  55. package/dist/{chunk-N77UYRV7.js → chunk-3BSFHBHY.js} +4 -4
  56. package/dist/{chunk-N77UYRV7.js.map → chunk-3BSFHBHY.js.map} +1 -1
  57. package/dist/{chunk-VULH3XAJ.cjs → chunk-3V7IZLHM.cjs} +28 -28
  58. package/dist/{chunk-VULH3XAJ.cjs.map → chunk-3V7IZLHM.cjs.map} +1 -1
  59. package/dist/{chunk-TP5PGWIO.cjs → chunk-4IOYQLKG.cjs} +3 -3
  60. package/dist/{chunk-TP5PGWIO.cjs.map → chunk-4IOYQLKG.cjs.map} +1 -1
  61. package/dist/{chunk-KGUBKE3V.cjs → chunk-4WJTJ2CM.cjs} +12 -12
  62. package/dist/{chunk-KGUBKE3V.cjs.map → chunk-4WJTJ2CM.cjs.map} +1 -1
  63. package/dist/{chunk-E26MNOLG.js → chunk-534Q6CX4.js} +3 -3
  64. package/dist/{chunk-E26MNOLG.js.map → chunk-534Q6CX4.js.map} +1 -1
  65. package/dist/{chunk-DBHBJIF4.js → chunk-55UIEU7L.js} +3 -3
  66. package/dist/{chunk-DBHBJIF4.js.map → chunk-55UIEU7L.js.map} +1 -1
  67. package/dist/{chunk-N52PBUAP.cjs → chunk-5VZVB63L.cjs} +6 -6
  68. package/dist/{chunk-N52PBUAP.cjs.map → chunk-5VZVB63L.cjs.map} +1 -1
  69. package/dist/{chunk-Y2FPWPDB.js → chunk-5XB3H2TJ.js} +3 -3
  70. package/dist/{chunk-Y2FPWPDB.js.map → chunk-5XB3H2TJ.js.map} +1 -1
  71. package/dist/{chunk-CEVVGJQX.js → chunk-62J727CD.js} +3 -3
  72. package/dist/{chunk-CEVVGJQX.js.map → chunk-62J727CD.js.map} +1 -1
  73. package/dist/{chunk-3PV25ICC.js → chunk-6KKVJ2V6.js} +3 -3
  74. package/dist/{chunk-3PV25ICC.js.map → chunk-6KKVJ2V6.js.map} +1 -1
  75. package/dist/{chunk-ET3W24JV.js → chunk-6PM2ZUUL.js} +14 -14
  76. package/dist/{chunk-ET3W24JV.js.map → chunk-6PM2ZUUL.js.map} +1 -1
  77. package/dist/{chunk-JWUCDK2F.js → chunk-6Q3SYCSX.js} +4 -4
  78. package/dist/{chunk-JWUCDK2F.js.map → chunk-6Q3SYCSX.js.map} +1 -1
  79. package/dist/{chunk-5UMZXDGL.cjs → chunk-7HGIC644.cjs} +5 -5
  80. package/dist/{chunk-5UMZXDGL.cjs.map → chunk-7HGIC644.cjs.map} +1 -1
  81. package/dist/{chunk-6NSKIS35.cjs → chunk-7MGK4ROW.cjs} +4 -4
  82. package/dist/{chunk-6NSKIS35.cjs.map → chunk-7MGK4ROW.cjs.map} +1 -1
  83. package/dist/{chunk-KUI2IC7W.js → chunk-7OUI4S7X.js} +3 -3
  84. package/dist/{chunk-KUI2IC7W.js.map → chunk-7OUI4S7X.js.map} +1 -1
  85. package/dist/{chunk-QN5GTCPB.cjs → chunk-BM2B6RWH.cjs} +6 -6
  86. package/dist/{chunk-QN5GTCPB.cjs.map → chunk-BM2B6RWH.cjs.map} +1 -1
  87. package/dist/{chunk-HTGEAQOA.js → chunk-C66RM2KW.js} +11 -11
  88. package/dist/{chunk-HTGEAQOA.js.map → chunk-C66RM2KW.js.map} +1 -1
  89. package/dist/{chunk-5OUOPKGE.cjs → chunk-C67B5OL7.cjs} +10 -10
  90. package/dist/{chunk-5OUOPKGE.cjs.map → chunk-C67B5OL7.cjs.map} +1 -1
  91. package/dist/{chunk-OG3TI5GX.js → chunk-CARVLLKR.js} +5 -5
  92. package/dist/{chunk-OG3TI5GX.js.map → chunk-CARVLLKR.js.map} +1 -1
  93. package/dist/{chunk-OKUXM2N4.cjs → chunk-CJOYEXEI.cjs} +4 -4
  94. package/dist/{chunk-OKUXM2N4.cjs.map → chunk-CJOYEXEI.cjs.map} +1 -1
  95. package/dist/{chunk-HKGO2GUG.cjs → chunk-CQ4M5S7Q.cjs} +3 -3
  96. package/dist/{chunk-HKGO2GUG.cjs.map → chunk-CQ4M5S7Q.cjs.map} +1 -1
  97. package/dist/{chunk-PGCKTXYH.js → chunk-E23QC3K5.js} +3 -3
  98. package/dist/{chunk-PGCKTXYH.js.map → chunk-E23QC3K5.js.map} +1 -1
  99. package/dist/{chunk-RAYNCZ7O.js → chunk-EAHJ2JSM.js} +4 -4
  100. package/dist/{chunk-RAYNCZ7O.js.map → chunk-EAHJ2JSM.js.map} +1 -1
  101. package/dist/{chunk-J3E5CSSC.js → chunk-ETUFJZKO.js} +4 -4
  102. package/dist/{chunk-J3E5CSSC.js.map → chunk-ETUFJZKO.js.map} +1 -1
  103. package/dist/{chunk-S7NJVJJX.cjs → chunk-FA5EFIHM.cjs} +55 -55
  104. package/dist/{chunk-S7NJVJJX.cjs.map → chunk-FA5EFIHM.cjs.map} +1 -1
  105. package/dist/{chunk-FDNIK5YS.cjs → chunk-GAJ5HESV.cjs} +4 -4
  106. package/dist/{chunk-FDNIK5YS.cjs.map → chunk-GAJ5HESV.cjs.map} +1 -1
  107. package/dist/{chunk-FNGFSHVE.js → chunk-H57PBOFE.js} +3 -3
  108. package/dist/{chunk-FNGFSHVE.js.map → chunk-H57PBOFE.js.map} +1 -1
  109. package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
  110. package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
  111. package/dist/{chunk-Y5P5ZMHQ.js → chunk-HFPKMVHR.js} +4 -4
  112. package/dist/{chunk-Y5P5ZMHQ.js.map → chunk-HFPKMVHR.js.map} +1 -1
  113. package/dist/{chunk-VJAMDAR6.cjs → chunk-I727LFZM.cjs} +4 -4
  114. package/dist/{chunk-VJAMDAR6.cjs.map → chunk-I727LFZM.cjs.map} +1 -1
  115. package/dist/{chunk-3RUQHIDC.js → chunk-IUOTGOXM.js} +3 -3
  116. package/dist/{chunk-3RUQHIDC.js.map → chunk-IUOTGOXM.js.map} +1 -1
  117. package/dist/{chunk-BSPPKX6X.cjs → chunk-IUTJW6FB.cjs} +50 -50
  118. package/dist/{chunk-BSPPKX6X.cjs.map → chunk-IUTJW6FB.cjs.map} +1 -1
  119. package/dist/{chunk-HTIEJVPI.js → chunk-JKAVXGHL.js} +5 -5
  120. package/dist/{chunk-HTIEJVPI.js.map → chunk-JKAVXGHL.js.map} +1 -1
  121. package/dist/{chunk-DDIV3MYQ.cjs → chunk-K3C4WECV.cjs} +5 -5
  122. package/dist/{chunk-DDIV3MYQ.cjs.map → chunk-K3C4WECV.cjs.map} +1 -1
  123. package/dist/{chunk-IWLNDDPN.cjs → chunk-KYTOLFAU.cjs} +35 -35
  124. package/dist/{chunk-IWLNDDPN.cjs.map → chunk-KYTOLFAU.cjs.map} +1 -1
  125. package/dist/{chunk-FMRTLPC7.cjs → chunk-LKK4PVOM.cjs} +6 -6
  126. package/dist/{chunk-FMRTLPC7.cjs.map → chunk-LKK4PVOM.cjs.map} +1 -1
  127. package/dist/{chunk-BMHW7WTF.js → chunk-LPHUB6EC.js} +3 -3
  128. package/dist/{chunk-BMHW7WTF.js.map → chunk-LPHUB6EC.js.map} +1 -1
  129. package/dist/{chunk-IIUEDF3F.js → chunk-LZAID6RY.js} +7 -7
  130. package/dist/{chunk-IIUEDF3F.js.map → chunk-LZAID6RY.js.map} +1 -1
  131. package/dist/{chunk-OFF2PR4W.js → chunk-NAAOKIR5.js} +3 -3
  132. package/dist/{chunk-OFF2PR4W.js.map → chunk-NAAOKIR5.js.map} +1 -1
  133. package/dist/{chunk-7LIPW6ZK.cjs → chunk-NNJQTH6R.cjs} +3 -3
  134. package/dist/{chunk-7LIPW6ZK.cjs.map → chunk-NNJQTH6R.cjs.map} +1 -1
  135. package/dist/{chunk-2VHZUSFW.js → chunk-OUORCDQD.js} +3 -3
  136. package/dist/{chunk-2VHZUSFW.js.map → chunk-OUORCDQD.js.map} +1 -1
  137. package/dist/{chunk-V2CKYM4B.cjs → chunk-OVKVMKTI.cjs} +15 -15
  138. package/dist/{chunk-V2CKYM4B.cjs.map → chunk-OVKVMKTI.cjs.map} +1 -1
  139. package/dist/{chunk-KCP42W67.cjs → chunk-P5D5GKVH.cjs} +3 -3
  140. package/dist/{chunk-KCP42W67.cjs.map → chunk-P5D5GKVH.cjs.map} +1 -1
  141. package/dist/{chunk-JS66ZT33.js → chunk-PVNULRFR.js} +3 -3
  142. package/dist/{chunk-JS66ZT33.js.map → chunk-PVNULRFR.js.map} +1 -1
  143. package/dist/{chunk-4WMGFGYP.cjs → chunk-QZGXZRWU.cjs} +4 -4
  144. package/dist/{chunk-4WMGFGYP.cjs.map → chunk-QZGXZRWU.cjs.map} +1 -1
  145. package/dist/{chunk-MMSHLHTA.cjs → chunk-RB6MAAS7.cjs} +4 -4
  146. package/dist/{chunk-MMSHLHTA.cjs.map → chunk-RB6MAAS7.cjs.map} +1 -1
  147. package/dist/{chunk-7ONU7EWY.js → chunk-RMQZHYBO.js} +6 -6
  148. package/dist/{chunk-7ONU7EWY.js.map → chunk-RMQZHYBO.js.map} +1 -1
  149. package/dist/{chunk-GOJ5GHFS.js → chunk-S5AFXSIQ.js} +3 -3
  150. package/dist/{chunk-GOJ5GHFS.js.map → chunk-S5AFXSIQ.js.map} +1 -1
  151. package/dist/{chunk-SY2WD6VA.cjs → chunk-SBTIITBJ.cjs} +6 -6
  152. package/dist/{chunk-SY2WD6VA.cjs.map → chunk-SBTIITBJ.cjs.map} +1 -1
  153. package/dist/{chunk-6A4GNM4T.cjs → chunk-TBYFNJRJ.cjs} +26 -26
  154. package/dist/{chunk-6A4GNM4T.cjs.map → chunk-TBYFNJRJ.cjs.map} +1 -1
  155. package/dist/{chunk-5R67KX2O.cjs → chunk-TSIMQOJR.cjs} +126 -75
  156. package/dist/chunk-TSIMQOJR.cjs.map +1 -0
  157. package/dist/{chunk-GARDQALH.js → chunk-TSLXIDUF.js} +7 -7
  158. package/dist/{chunk-GARDQALH.js.map → chunk-TSLXIDUF.js.map} +1 -1
  159. package/dist/{chunk-6KQVTMRL.cjs → chunk-UOGXKHTJ.cjs} +3 -3
  160. package/dist/{chunk-6KQVTMRL.cjs.map → chunk-UOGXKHTJ.cjs.map} +1 -1
  161. package/dist/{chunk-E6ISR55S.js → chunk-UTUXEZBC.js} +3 -3
  162. package/dist/{chunk-E6ISR55S.js.map → chunk-UTUXEZBC.js.map} +1 -1
  163. package/dist/{chunk-2UP73FZT.js → chunk-VNFNIHHJ.js} +3 -3
  164. package/dist/{chunk-2UP73FZT.js.map → chunk-VNFNIHHJ.js.map} +1 -1
  165. package/dist/{chunk-M4TM3K52.cjs → chunk-XCTQ6MLJ.cjs} +47 -47
  166. package/dist/{chunk-M4TM3K52.cjs.map → chunk-XCTQ6MLJ.cjs.map} +1 -1
  167. package/dist/{chunk-62OMGQHS.js → chunk-Y3NQBB43.js} +3 -3
  168. package/dist/{chunk-62OMGQHS.js.map → chunk-Y3NQBB43.js.map} +1 -1
  169. package/dist/{chunk-LWCLAAEX.js → chunk-YG77JLOX.js} +4 -4
  170. package/dist/{chunk-LWCLAAEX.js.map → chunk-YG77JLOX.js.map} +1 -1
  171. package/dist/{chunk-35BADIIF.cjs → chunk-YGOMTIBA.cjs} +3 -3
  172. package/dist/{chunk-35BADIIF.cjs.map → chunk-YGOMTIBA.cjs.map} +1 -1
  173. package/dist/{chunk-4FV5DO3V.js → chunk-YK4U6EV5.js} +3 -3
  174. package/dist/{chunk-4FV5DO3V.js.map → chunk-YK4U6EV5.js.map} +1 -1
  175. package/dist/{chunk-YPTZNQPJ.cjs → chunk-YP4FDWK3.cjs} +4 -4
  176. package/dist/{chunk-YPTZNQPJ.cjs.map → chunk-YP4FDWK3.cjs.map} +1 -1
  177. package/dist/{chunk-JNVJQCGF.cjs → chunk-YXYHYS5S.cjs} +3 -3
  178. package/dist/{chunk-JNVJQCGF.cjs.map → chunk-YXYHYS5S.cjs.map} +1 -1
  179. package/dist/collaboration/index.cjs +1 -1
  180. package/dist/collaboration/index.js +1 -1
  181. package/dist/connect/docx.cjs +19 -19
  182. package/dist/connect/docx.js +15 -15
  183. package/dist/connect/index.cjs +1019 -1019
  184. package/dist/connect/index.js +73 -73
  185. package/dist/connect/viewer.cjs +25 -25
  186. package/dist/connect/viewer.js +24 -24
  187. package/dist/dashboards/index.cjs +1 -1
  188. package/dist/dashboards/index.js +1 -1
  189. package/dist/embed/index.cjs +38 -38
  190. package/dist/embed/index.js +32 -32
  191. package/dist/files/index.cjs +224 -224
  192. package/dist/files/index.js +3 -3
  193. package/dist/index.cjs +1575 -1575
  194. package/dist/index.js +40 -40
  195. package/dist/settings/index.cjs +152 -152
  196. package/dist/settings/index.js +3 -3
  197. package/dist/shell/index.cjs +88 -88
  198. package/dist/shell/index.js +9 -9
  199. package/dist/studio/index.cjs +26 -26
  200. package/dist/studio/index.js +23 -23
  201. package/dist/workflow-canvas/index.cjs +51 -51
  202. package/dist/workflow-canvas/index.js +31 -31
  203. package/node_modules/@arbidocs/coedit/package.json +1 -1
  204. package/package.json +5 -5
  205. package/dist/ConnectedStreamedWordArtifact-BF6JET2D.cjs.map +0 -1
  206. package/dist/ConnectedStreamedWordArtifact-ILMKFCDC.js.map +0 -1
  207. package/dist/ai-E6FA4Y4J.cjs.map +0 -1
  208. package/dist/ai-WASSGEMI.js.map +0 -1
  209. package/dist/chunk-4UOXUWX3.js.map +0 -1
  210. package/dist/chunk-5R67KX2O.cjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/shell/Workspace.tsx","../src/shell/MobileBars.tsx","../src/shell/reload-policy.ts"],"names":["jsxs","cn","jsx","Fragment"],"mappings":";;;;;;;;;AAqBO,IAAM,6BAAA,GAAqD;AAAA,EAChE,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS;AACX;AAQO,SAAS,iBAAA,CACd,MACA,MAAA,EAKA;AACA,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,6BAAA,EAA+B,GAAG,MAAA,EAAO;AACxD,EAAA,IAAI,IAAA,KAAS,QAAA;AACX,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA,CAAE,MAAA,EAAQ,MAAM,gCAAA,EAAiC;AAChF,EAAA,IAAI,IAAA,KAAS,QAAA;AACX,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,OAAO,CAAA,CAAE,MAAA,EAAQ,MAAM,wCAAA,EAAyC;AACxF,EAAA,OAAO,EAAE,IAAA,EAAM,IAAA,EAAM,OAAO,CAAA,CAAE,OAAA,EAAS,MAAM,oCAAA,EAAqC;AACpF;AAGO,SAAS,mBAAmB,IAAA,EAAkC;AACnE,EAAA,IAAI,IAAA,KAAS,UAAU,OAAO,+BAAA;AAC9B,EAAA,IAAI,IAAA,KAAS,UAAU,OAAO,wBAAA;AAC9B,EAAA,OAAO,sBAAA;AACT;AAsBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,MAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,SAAA,CAAU,IAAA,EAAM,MAAM,CAAA;AACrD,EAAA,MAAM,wBACJ,IAAA,CAAC,MAAA,EAAA,EAAK,WAAU,6BAAA,EAA8B,KAAA,EAAO,KAAK,KAAA,EACxD,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,aAAA,EAAY,MAAA;AAAA,QACZ,eAAa,QAAA,CAAS,OAAA,EAAS,SAAS,EAAE,MAAA,EAAQ,kCAAkC,CAAA;AAAA,QACpF,SAAA,EAAW,EAAA;AAAA,UACT,qGAAA;AAAA,UACA,IAAA,CAAK;AAAA,SACP;AAAA,QAEC,QAAA,EAAA,SAAA,CAAU,IAAA,CAAK,MAAA,CAAO,CAAC,EAAE,WAAA;AAAY;AAAA,KACxC;AAAA,oBAEA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,qHAAA,EACd,QAAA,kBAAA,GAAA;AAAA,MAAC,IAAA,CAAK,IAAA;AAAA,MAAL;AAAA,QACC,cAAY,IAAA,CAAK,KAAA;AAAA,QACjB,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,+BAA+B,CAAA;AAAA,QAC9E,SAAA,EAAU;AAAA;AAAA,KACZ,EACF;AAAA,GAAA,EACF,CAAA;AAGF,EAAA,IAAI,CAAC,QAAA;AACH,IAAA,uBAAO,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAkD,QAAA,EAAA,KAAA,EAAM,CAAA;AAEhF,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,gDAAA,EAAkD,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,oBACvE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UAEC,SAAA,EAAW,EAAA;AAAA,YACT,0GAAA;AAAA,YACA,WAAW,wBAAA,GAA2B;AAAA,WACxC;AAAA,UAEC,QAAA,EAAA,SAAA,CAAU;AAAA;AAAA,OACb;AAAA,MACC,CAAC,UAAU,WAAA,oBACV,GAAA,CAAC,UAAK,SAAA,EAAU,+CAAA,EAAiD,eAAK,KAAA,EAAM,CAAA;AAAA,MAE7E,UAAU,WAAA,oBACT,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,qBAAA;AAAA,UACV,aAAA,EAAa,QAAA,CAAS,OAAA,EAAS,WAAA,EAAa;AAAA,YAC1C,MAAA,EAAQ;AAAA,WACT,CAAA;AAAA,UAEA,oBAAU,WAAA,oBACT,GAAA,CAAC,UAAK,SAAA,EAAU,wCAAA,EACb,oBAAU,WAAA,EACb;AAAA;AAAA;AAEJ,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;AAiBO,IAAM,iCAAA,GAA6D;AAAA,EACxE,GAAG,6BAAA;AAAA,EACH,MAAA,EAAQ,YAAA;AAAA,EACR,QAAA,EAAU,WAAA;AAAA,EACV,iBAAiB,CAAC,IAAA,EAAM,WAAW,CAAA,EAAG,IAAI,kBAAa,MAAM,CAAA,CAAA;AAAA,EAC7D,aAAA,EAAe,CAAC,MAAA,KAAW,CAAA,IAAA,EAAO,MAAM,CAAA,CAAA;AAAA,EACxC,YAAA,EAAc,CAAC,QAAA,KAAa,CAAA,IAAA,EAAO,QAAQ,CAAA,CAAA;AAAA,EAC3C,gBAAA,EAAkB,CAAC,MAAA,KAAW,CAAA,OAAA,EAAU,MAAM,CAAA;AAChD;AAqCO,SAAS,iBAAA,CAAkB;AAAA,EAChC,SAAA;AAAA,EACA,SAAS,EAAC;AAAA,EACV,OAAA,GAAU,KAAA;AAAA,EACV,OAAA,GAAU,SAAA;AAAA,EACV,QAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EACA,0BAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAA,GAAI,EAAE,GAAG,iCAAA,EAAmC,GAAG,MAAA,EAAO;AAC5D,EAAA,MAAM,MAAA,GAAS,CAAA,CAAE,MAAA,CAAO,WAAA,EAAY;AACpC,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,CAAA,CAAE,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AACxE,EAAA,4BACG,YAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,SAAO,IAAA,EAC1B,QAAA,kBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,WAAA,EAAU,oBAAA;AAAA,QACV,eAAa,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,8BAA8B,CAAA;AAAA,QACtE,YAAA,EAAY,CAAA,CAAE,eAAA,CAAgB,SAAA,CAAU,MAAM,MAAM,CAAA;AAAA,QACpD,SAAA,EAAW,EAAA;AAAA,UACT,kKAAA;AAAA,UACA,OAAA,KAAY,QAAA,GACR,4BAAA,GACA,OAAA,GACE,0BAAA,GACA,kBAAA;AAAA,UACN;AAAA,SACF;AAAA,QAEC,QAAA,EAAA;AAAA,UAAA,OAAA,KAAY,2BACX,GAAA,CAAC,MAAA,EAAA,EAAK,WAAU,0DAAA,EACb,QAAA,EAAA,SAAA,CAAU,MACb,CAAA,mBAEA,GAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,SAAA;AAAA,cACA,UAAU,CAAC,OAAA;AAAA,cACX,MAAA,EAAQ,CAAA;AAAA,cACR,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,UAED,EAAE,OAAA,IAAW,OAAA,KAAY,SAAA,CAAA,oBACxB,GAAA;AAAA,YAAC,WAAA;AAAA,YAAA;AAAA,cACC,aAAA,EAAY,MAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,KAEJ,EACF,CAAA;AAAA,oBAEA,IAAA;AAAA,MAAC,mBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAM,OAAA;AAAA,QACN,SAAA,EAAW,EAAA;AAAA,UACT,qCAAA;AAAA,UACA,OAAA,KAAY,SAAA,IAAa,CAAC,OAAA,GACtB,8CAAA,GACA;AAAA,SACN;AAAA,QACA,eAAa,QAAA,CAAS,OAAA,EAAS,MAAM,EAAE,MAAA,EAAQ,2BAA2B,CAAA;AAAA,QAE1E,QAAA,EAAA;AAAA,0BAAA,IAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,UAAA;AAAA,cACT,eAAa,QAAA,CAAS,OAAA,EAAS,KAAK,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,cACxE,SAAA,EAAU,OAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAA,EAAA,EAAW,WAAU,4CAAA,EAA6C,CAAA;AAAA,gBAClE,CAAA,CAAE,cAAc,MAAM;AAAA;AAAA;AAAA,WACzB;AAAA,0BACA,IAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,6BAA6B,MAAA,GAAY,cAAA;AAAA,cAClD,QAAA,EAAU,CAAC,CAAC,0BAAA;AAAA,cACZ,KAAA,EAAO,0BAAA;AAAA,cACP,eAAa,QAAA,CAAS,OAAA,EAAS,KAAK,EAAE,MAAA,EAAQ,0BAA0B,CAAA;AAAA,cACxE,SAAA,EAAU,OAAA;AAAA,cAEV,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,IAAA,EAAA,EAAK,WAAU,4CAAA,EAA6C,CAAA;AAAA,gCAC7D,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,kBAAA,CAAA,CAAE,aAAa,QAAQ,CAAA;AAAA,kBACvB,0BAAA,oBACC,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,iCAAiC,QAAA,EAAA,0BAAA,EAA2B;AAAA,iBAAA,EAEhF;AAAA;AAAA;AAAA,WACF;AAAA,UACC,MAAA,CAAO,MAAA,GAAS,CAAA,oBACf,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,qBAAA,EAAA,EAAsB,CAAA;AAAA,gCACtB,iBAAA,EAAA,EAAkB,SAAA,EAAU,6CAC1B,QAAA,EAAA,CAAA,CAAE,gBAAA,CAAiB,MAAM,CAAA,EAC5B,CAAA;AAAA,YACC,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjB,cAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AACxC,cAAA,uBACE,IAAA;AAAA,gBAAC,gBAAA;AAAA,gBAAA;AAAA,kBAEC,OAAA,EAAS,MAAM,QAAA,CAAS,CAAC,CAAA;AAAA,kBACzB,aAAA,EAAa,cAAA,CAAe,OAAA,EAAS,UAAA,EAAY,EAAE,EAAA,EAAI;AAAA,oBACrD,MAAA,EAAQ,CAAA,iBAAA,EAAoB,CAAA,CAAE,EAAE,CAAA;AAAA,mBACjC,CAAA;AAAA,kBACD,SAAA,EAAU,OAAA;AAAA,kBAEV,QAAA,EAAA;AAAA,oCAAA,IAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,6BAAA,EAA8B,KAAA,EAAO,KAAK,KAAA,EACxD,QAAA,EAAA;AAAA,sCAAA,GAAA;AAAA,wBAAC,MAAA;AAAA,wBAAA;AAAA,0BACC,aAAA,EAAY,MAAA;AAAA,0BACZ,SAAA,EAAW,EAAA;AAAA,4BACT,kGAAA;AAAA,4BACA,IAAA,CAAK;AAAA,2BACP;AAAA,0BAEC,QAAA,EAAA,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,CAAC,EAAE,WAAA;AAAY;AAAA,uBAChC;AAAA,sCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,mHAAA,EACd,QAAA,kBAAA,GAAA;AAAA,wBAAC,IAAA,CAAK,IAAA;AAAA,wBAAL;AAAA,0BACC,cAAY,IAAA,CAAK,KAAA;AAAA,0BACjB,aAAA,EAAa,cAAA,CAAe,OAAA,EAAS,IAAA,EAAM,EAAE,EAAA,EAAI;AAAA,4BAC/C,MAAA,EAAQ,CAAA,eAAA,EAAkB,CAAA,CAAE,EAAE,CAAA;AAAA,2BAC/B,CAAA;AAAA,0BACD,SAAA,EAAU;AAAA;AAAA,uBACZ,EACF;AAAA,qBAAA,EACF,CAAA;AAAA,oCACA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oCAAA,EAAsC,YAAE,IAAA,EAAK,CAAA;AAAA,oBAC5D,EAAE,QAAA,oBACD,GAAA;AAAA,sBAAC,MAAA;AAAA,sBAAA;AAAA,wBACC,SAAA,EAAU,+DAAA;AAAA,wBACV,aAAA,EAAa,cAAA,CAAe,OAAA,EAAS,QAAA,EAAU,EAAE,EAAA,EAAI;AAAA,0BACnD,MAAA,EAAQ,CAAA,oBAAA,EAAuB,CAAA,CAAE,EAAE,CAAA;AAAA,yBACpC,CAAA;AAAA,wBAEA,QAAA,EAAA,CAAA,CAAE;AAAA;AAAA;AACL;AAAA,iBAAA;AAAA,gBApCG,CAAA,CAAE;AAAA,eAsCT;AAAA,YAEJ,CAAC;AAAA,WAAA,EACH;AAAA;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ;AC/UO,IAAM,0BAAA,GAA+C;AAAA,EAC1D,kBAAA,EAAoB,sBAAA;AAAA,EACpB,iBAAA,EAAmB;AACrB;AAwBO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA,GAAW,IAAA;AAAA,EACX,MAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,EAAe,MAAA;AAAA,EACf;AACF,CAAA,EAAsB;AACpB,EAAA,uBACEA,IAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA,EAAU,gBAAA;AAAA,MACV,aAAA,EAAa,MAAA;AAAA,MACb,SAAA,EAAWC,EAAAA;AAAA,QACT,sFAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,QAAA,oBACCC,GAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAK,QAAA;AAAA,YACL,OAAA,EAAS,MAAA;AAAA,YACT,SAAA,EAAU,+GAAA;AAAA,YACV,YAAA,EACE,SAAA,IAAa,MAAA,EAAQ,kBAAA,IAAsB,0BAAA,CAA2B,kBAAA;AAAA,YAExE,eAAa,QAAA,CAAS,UAAA,EAAY,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,YAEjE,QAAA,kBAAAA,GAAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS;AAAA;AAAA,SAC3B;AAAA,wBAEFA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWD,EAAAA,CAAG,kCAAA,EAAoC,CAAC,QAAA,IAAY,MAAM,CAAA,EACvE,QAAA,EAAA,KAAA,IAAS,IAAA,EACZ,CAAA;AAAA,QACC,2BAAWC,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAsC,QAAA,EAAA,OAAA,EAAQ;AAAA;AAAA;AAAA,GAC3E;AAEJ;AAOA,SAAS,QAAA,CAAS,EAAE,IAAA,EAAK,EAAsB;AAC7C,EAAA,MAAM,IAAA,GACJ,6FAAA;AACF,EAAA,IAAI,CAAC,IAAA,CAAK,UAAA,EAAY,uBAAOA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAW,IAAA,EAAO,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAChE,EAAA,uBACEF,IAAAA,CAAAG,QAAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,MAAA,EAAA,EAAK,WAAA,EAAU,iBAAA,EAAkB,aAAA,EAAY,MAAA,EAAO,SAAA,EAAWD,EAAAA,CAAG,IAAA,EAAM,kBAAkB,CAAA,EACxF,QAAA,EAAA,IAAA,CAAK,UAAA,EACR,CAAA;AAAA,oBACAC,IAAC,MAAA,EAAA,EAAK,SAAA,EAAWD,GAAG,IAAA,EAAM,wBAAwB,CAAA,EAAI,QAAA,EAAA,IAAA,CAAK,KAAA,EAAM,CAAA;AAAA,oBACjEC,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,0BAAA,EAA4B,eAAK,KAAA,EAAM;AAAA,GAAA,EACzD,CAAA;AAEJ;AAiBO,SAAS,YAAA,CAAa;AAAA,EAC3B,KAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA,EAAe;AACjB,CAAA,EAAsB;AACpB,EAAA,MAAM,MAAA,GAAS,OAAoB,IAAI,CAAA;AAEvC,EAAA,mBAAA,CAAoB,MAAM,CAAA;AAC1B,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,MAAA;AAAA,MACL,YAAA,EACE,KAAA,IAAS,MAAA,EAAQ,iBAAA,IAAqB,0BAAA,CAA2B,iBAAA;AAAA,MAEnE,WAAA,EAAU,gBAAA;AAAA,MACV,eAAa,QAAA,CAAS,MAAA,EAAQ,EAAE,MAAA,EAAQ,kBAAkB,CAAA;AAAA,MAC1D,SAAA,EAAWD,EAAAA;AAAA,QACT,6EAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,qBACVD,IAAAA;AAAA,QAAC,UAAA;AAAA,QAAA;AAAA,UAEC,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,cAAA,EAAc,IAAA,CAAK,MAAA,GAAS,MAAA,GAAS,MAAA;AAAA,UACrC,SAAA,EAAWC,EAAAA;AAAA;AAAA,YAET,6IAAA;AAAA,YACA,IAAA,CAAK,SACD,4BAAA,GACA;AAAA,WACN;AAAA,UACA,aAAA,EAAa,cAAA,CAAe,YAAA,EAAc,IAAA,CAAK,EAAA,EAAI,EAAE,MAAA,EAAQ,CAAA,WAAA,EAAc,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,CAAA;AAAA,UAErF,QAAA,EAAA;AAAA,YAAA,IAAA,CAAK,IAAA;AAAA,4BACNC,GAAAA,CAAC,QAAA,EAAA,EAAS,IAAA,EAAY;AAAA;AAAA,SAAA;AAAA,QAhBjB,IAAA,CAAK;AAAA,OAkBb;AAAA;AAAA,GACH;AAEJ;ACnJO,IAAM,gBAAA,GAAmB,sBAAA;AAGhC,IAAM,eAAA,GAAkB,GAAA;AAExB,IAAM,OAAA,GAAU,GAAA;AAChB,IAAM,aAAA,GAAgB,GAAA;AAGtB,IAAM,cAAA,GACJ,6GAAA;AACF,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAC,CAAA;AAUD,IAAM,WAAA,GAAgC;AAAA,EACpC,MAAA,EAAQ,MAAM,MAAA,CAAO,QAAA,CAAS,MAAA,EAAO;AAAA,EACrC,IAAA,EAAM,CAAC,GAAA,EAAK,OAAA,KAAa,OAAA,GAAU,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,GAAG,CAAA,GAAI,MAAA,CAAO,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA,EAC5F,GAAA,EAAK,MAAM,IAAA,CAAK,GAAA;AAClB,CAAA;AAEA,IAAI,IAAA,GAAO,WAAA;AACX,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAI,KAAA,GAAQ,KAAA;AAEZ,IAAI,YAAA,GAAe,KAAA;AACnB,IAAI,YAAA,GAAe,CAAA;AACnB,IAAI,SAAA;AACJ,IAAI,iBAAA,GAAyC,IAAA;AAE7C,IAAM,MAAA,uBAAa,GAAA,EAAa;AAEhC,IAAM,gBAAA,uBAAuB,OAAA,EAAgB;AAE7C,SAAS,YAAY,EAAA,EAAsB;AACzC,EAAA,IAAI,cAAc,gBAAA,EAAkB,OAAO,CAAC,eAAA,CAAgB,GAAA,CAAI,GAAG,IAAI,CAAA;AACvE,EAAA,OAAO,EAAA,YAAc,mBAAA,IAAwB,EAAA,CAAmB,iBAAA,KAAsB,IAAA;AACxF;AAEA,SAAS,QAAQ,EAAA,EAAsB;AACrC,EAAA,IAAI,EAAA,YAAc,gBAAA,IAAoB,EAAA,YAAc,mBAAA,EAAqB;AACvE,IAAA,OAAO,EAAA,CAAG,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA;AAAA,EAC7B;AACA,EAAA,OAAA,CAAQ,EAAA,CAAG,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK,KAAM,EAAA;AAC3C;AAMO,SAAS,eAAA,CAAgB,MAAgB,QAAA,EAAmB;AACjE,EAAA,IAAI,GAAA,CAAI,aAAA,CAAc,cAAc,CAAA,EAAG,OAAO,IAAA;AAC9C,EAAA,MAAM,SAAS,GAAA,CAAI,aAAA;AACnB,EAAA,IAAI,UAAU,MAAA,KAAW,GAAA,CAAI,QAAQ,WAAA,CAAY,MAAM,GAAG,OAAO,IAAA;AACjE,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,CAAC,EAAA,CAAG,WAAA,EAAa,MAAA,CAAO,OAAO,EAAE,CAAA;AAAA,SAAA,IAC5B,OAAA,CAAQ,EAAE,CAAA,EAAG,OAAO,IAAA;AAAA,EAC/B;AACA,EAAA,OAAO,KAAA;AACT;AAGA,SAAS,WAAA,GAAuB;AAC9B,EAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AACrB,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI;AACF,IAAA,IAAA,GAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,gBAAgB,CAAC,CAAA,IAAK,CAAA;AAAA,EAC7D,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,IAAI,IAAA,IAAQ,GAAA,GAAM,IAAA,GAAO,eAAA,EAAiB,OAAO,KAAA;AACjD,EAAA,IAAI;AACF,IAAA,cAAA,CAAe,OAAA,CAAQ,gBAAA,EAAkB,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EACtD,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAA,GAAoB;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,MAAA,CAAO,cAAA,CAAe,OAAA,CAAQ,gBAAgB,CAAC,CAAA,IAAK,CAAA;AACjE,IAAA,OAAO,CAAC,CAAC,IAAA,IAAQ,IAAA,CAAK,GAAA,KAAQ,IAAA,GAAO,eAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEA,SAAS,MAAA,GAAe;AACtB,EAAA,KAAA,GAAQ,KAAA;AACR,EAAA,YAAA,GAAe,KAAA;AACf,EAAA,IAAI,SAAA,KAAc,MAAA,EAAW,aAAA,CAAc,SAAS,CAAA;AACpD,EAAA,SAAA,GAAY,MAAA;AACZ,EAAA,iBAAA,IAAoB;AACpB,EAAA,iBAAA,GAAoB,IAAA;AACtB;AAEA,SAAS,SAAA,GAAqB;AAC5B,EAAA,IAAI,CAAC,aAAY,EAAG;AAClB,IAAA,MAAA,EAAO;AACP,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAA,EAAO;AACP,EAAA,IAAA,CAAK,MAAA,EAAO;AACZ,EAAA,OAAO,IAAA;AACT;AAGA,SAAS,WAAW,GAAA,EAAqD;AACvE,EAAA,IAAI,CAAC,KAAA,IAAS,GAAA,IAAO,IAAA,EAAM,OAAO,IAAA;AAClC,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,CAAO,SAAS,IAAI,CAAA;AACxD,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,CAAO,QAAA,CAAS,UAAU,OAAO,IAAA;AAEzD,EAAA,IAAI,QAAA,CAAS,aAAA,CAAc,cAAc,CAAA,EAAG,OAAO,IAAA;AACnD,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAEA,SAAS,mBAAA,GAA4B;AACnC,EAAA,IAAI,iBAAA,EAAmB;AACvB,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,OAAO,OAAA,CAAQ,SAAA;AACrB,EAAA,MAAM,UAAU,OAAA,CAAQ,YAAA;AACxB,EAAA,IAAI,SAAA,GAAY,OAAO,QAAA,CAAS,QAAA;AAChC,EAAA,MAAM,OAAO,CAAC,QAAA,EAAgC,iBAC5C,SAAyB,IAAA,EAAM,QAAQ,GAAA,EAAK;AAC1C,IAAA,MAAM,MAAA,GAAS,WAAW,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,IAAU,aAAY,EAAG;AAC3B,MAAA,MAAA,EAAO;AACP,MAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,YAAY,CAAA;AAC9B,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,IAAA,CAAK,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,GAAG,CAAA;AACrC,IAAA,SAAA,GAAY,OAAO,QAAA,CAAS,QAAA;AAAA,EAC9B,CAAA;AACF,EAAA,OAAA,CAAQ,SAAA,GAAY,IAAA,CAAK,IAAA,EAAM,KAAK,CAAA;AACpC,EAAA,OAAA,CAAQ,YAAA,GAAe,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAEzC,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,QAAA,KAAa,SAAA,EAAW;AAC5C,IAAA,SAAA,GAAY,OAAO,QAAA,CAAS,QAAA;AAC5B,IAAA,IAAI,CAAC,QAAA,CAAS,aAAA,CAAc,cAAc,GAAG,SAAA,EAAU;AAAA,EACzD,CAAA;AACA,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC9C,EAAA,iBAAA,GAAoB,MAAM;AACxB,IAAA,OAAA,CAAQ,SAAA,GAAY,IAAA;AACpB,IAAA,OAAA,CAAQ,YAAA,GAAe,OAAA;AACvB,IAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,UAAU,CAAA;AAAA,EACnD,CAAA;AACF;AAEA,SAAS,YAAA,GAAqB;AAC5B,EAAA,IAAI,cAAc,MAAA,EAAW;AAC7B,EAAA,SAAA,GAAY,YAAY,MAAM;AAC5B,IAAA,IAAI,CAAC,YAAA,EAAc;AACnB,IAAA,MAAM,OAAO,QAAA,CAAS,eAAA,KAAoB,YAAY,IAAA,CAAK,GAAA,KAAQ,YAAA,IAAgB,OAAA;AACnF,IAAA,IAAI,IAAA,IAAQ,CAAC,eAAA,EAAgB,EAAG,SAAA,EAAU;AAAA,EAC5C,GAAG,aAAa,CAAA;AAClB;AAMO,SAAS,cAAA,GAAuB;AACrC,EAAA,KAAA,GAAQ,IAAA;AACR,EAAA,mBAAA,EAAoB;AACtB;AASO,SAAS,aAAA,GAA+B;AAC7C,EAAA,IAAI,QAAA,IAAY,OAAO,SAAA;AACvB,EAAA,IAAI,CAAC,eAAA,EAAgB,EAAG,OAAO,SAAA,KAAc,UAAA,GAAa,SAAA;AAC1D,EAAA,YAAA,GAAe,IAAA;AACf,EAAA,cAAA,EAAe;AACf,EAAA,YAAA,EAAa;AACb,EAAA,OAAO,UAAA;AACT;AAOO,SAAS,cAAc,IAAA,EAA6C;AACzE,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAU,IAAA,EAAK;AAAA,EACjB,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,GAAU,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA,EAChC;AACA,EAAA,OAAO,OAAA,CAAQ,IAAA;AAAA,IACb,MAAM,MAAA;AAAA,IACN,CAAC,KAAA,KAAmB;AAClB,MAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,EAAM,gBAAA,CAAiB,IAAI,KAAK,CAAA;AAAA,IAC7E;AAAA,GACF;AACF;AAEA,SAAS,OAAO,OAAA,EAAwB;AACtC,EAAA,MAAM,QAAA,GAAW,OAAO,OAAA,KAAY,QAAA,IAAY,YAAY,IAAA,IAAQ,gBAAA,CAAiB,IAAI,OAAO,CAAA;AAIhG,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,WAAW,KAAA,EAAO;AAClE,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAA,CAAO,QAAQ,+CAAA,EAAiD;AAAA,QAC9D,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AACA,IAAA;AAAA,EACF;AACA,EAAA,cAAA,EAAe;AACf,EAAA,IAAI,QAAA,EAAU;AACd,EAAA,MAAM,UAAU,aAAA,EAAc;AAC9B,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,oDAAA,EAAuD,OAAO,CAAA,CAAA,EAAI,OAAO,CAAA;AACxF;AAOO,SAAS,qBAAqB,KAAA,EAAoB;AACvD,EAAA,MAAM,UAAW,KAAA,CAAwC,OAAA;AACzD,EAAA,UAAA,CAAW,MAAM,MAAA,CAAO,OAAO,CAAA,EAAG,CAAC,CAAA;AACrC;AAEA,SAAS,WAAW,KAAA,EAAoB;AACtC,EAAA,YAAA,GAAe,KAAK,GAAA,EAAI;AACxB,EAAA,IAAI,KAAA,CAAM,SAAS,OAAA,IAAW,KAAA,CAAM,kBAAkB,OAAA,IAAW,WAAA,CAAY,KAAA,CAAM,MAAM,CAAA,EAAG;AAC1F,IAAA,MAAA,CAAO,GAAA,CAAI,MAAM,MAAM,CAAA;AAAA,EACzB;AACF;AAEA,IAAM,kBAAkB,CAAC,OAAA,EAAS,SAAA,EAAW,aAAA,EAAe,SAAS,YAAY,CAAA;AAG1E,SAAS,mBAAA,CAAoB,SAAA,GAAuC,EAAC,EAAS;AACnF,EAAA,IAAA,GAAO,EAAE,GAAG,WAAA,EAAa,GAAG,SAAA,EAAU;AACtC,EAAA,IAAI,SAAA,IAAa,OAAO,MAAA,KAAW,WAAA,EAAa;AAChD,EAAA,SAAA,GAAY,IAAA;AACZ,EAAA,YAAA,GAAe,KAAK,GAAA,EAAI;AACxB,EAAA,MAAA,CAAO,gBAAA,CAAiB,qBAAqB,oBAAoB,CAAA;AACjE,EAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,IAAA,QAAA,CAAS,gBAAA,CAAiB,MAAM,UAAA,EAAY,EAAE,SAAS,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAAA,EAC9E;AACF","file":"chunk-2UP73FZT.js","sourcesContent":["import type { ComponentType } from 'react'\nimport { ChevronDown, Globe, LayoutGrid, Lock, Plus, Users } from 'lucide-react'\nimport {\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport type { ShellRecentWorkspace, ShellWorkspace, ShellWorkspaceKind } from './types'\n\n/** The three workspace-kind names (badge title, type glyph name, subtitle). */\nexport interface WorkspaceKindLabels {\n common: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_WORKSPACE_KIND_LABELS: WorkspaceKindLabels = {\n common: 'Common',\n shared: 'Shared',\n private: 'Private',\n}\n\n/**\n * Workspace type drives the initial-badge fill and a quiet secondary glyph:\n * private (just you) -> navy, lock shared (several) -> selection tint, people\n * common (public) -> neutral, globe\n * Navy is identity and cyan is reserved for ARBI/AI, so \"shared\" is the selection tint.\n */\nexport function workspaceKindMeta(\n kind: ShellWorkspaceKind,\n labels?: Partial<WorkspaceKindLabels>\n): {\n Icon: ComponentType<{ className?: string; 'aria-label'?: string; 'data-testid'?: string }>\n label: string\n fill: string\n} {\n const l = { ...DEFAULT_WORKSPACE_KIND_LABELS, ...labels }\n if (kind === 'common')\n return { Icon: Globe, label: l.common, fill: 'bg-muted text-muted-foreground' }\n if (kind === 'shared')\n return { Icon: Users, label: l.shared, fill: 'bg-secondary text-secondary-foreground' }\n return { Icon: Lock, label: l.private, fill: 'bg-primary text-primary-foreground' }\n}\n\n/** The kind's hue as a CSS colour, for glyphs painted by SVG fill (the workspace shield). */\nexport function workspaceKindColor(kind: ShellWorkspaceKind): string {\n if (kind === 'common') return 'var(--color-muted-foreground)'\n if (kind === 'shared') return 'var(--color-secondary)'\n return 'var(--color-primary)'\n}\n\n/** Overridable ids of the workspace identity; defaults are the current ids. */\ntype WorkspaceIdentityTestIds = Partial<Record<'initial' | 'type' | 'projectName', string>>\n\nexport interface WorkspaceIdentityProps {\n workspace: ShellWorkspace\n /** Show name + type/project line beside the badge; otherwise the badge alone. */\n expanded: boolean\n /** Selected (nav-row) styling of the name. */\n isActive?: boolean\n /** Reword the kind names. */\n labels?: Partial<WorkspaceKindLabels>\n /** Part ids; defaults are the current ids. */\n testIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * Non-interactive guts of the workspace head: the initial badge (with a tiny type glyph) and,\n * when expanded, the name and the project/type line. Hosted by the switcher trigger and by the\n * workspace settings header, so it never nests a button.\n */\nexport function WorkspaceIdentity({\n workspace,\n expanded,\n isActive = false,\n labels,\n testIds,\n}: WorkspaceIdentityProps) {\n const kind = workspaceKindMeta(workspace.kind, labels)\n const badge = (\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n data-testid={testIdOr(testIds?.initial, { testId: 'sidebar-workspace-card-initial' })}\n className={cn(\n 'flex size-7 flex-shrink-0 items-center justify-center rounded-md text-sm font-semibold leading-none',\n kind.fill\n )}\n >\n {workspace.name.charAt(0).toUpperCase()}\n </span>\n {/* Type as a tiny overlay on the badge: status reads at the icon, not after the name. */}\n <span className=\"absolute -bottom-1 -right-1 flex size-3.5 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={testIdOr(testIds?.type, { testId: 'sidebar-workspace-card-type' })}\n className=\"size-2.5 text-muted-foreground\"\n />\n </span>\n </span>\n )\n\n if (!expanded)\n return <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n\n return (\n <>\n <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n <div className=\"ml-2.5 flex min-w-0 flex-1 flex-col text-left\">\n <span\n // 600: the name of the thing you are inside, above a lighter project line.\n className={cn(\n 'min-w-0 truncate text-left text-sm font-semibold capitalize leading-tight transition-colors duration-100',\n isActive ? 'text-accent-foreground' : 'text-foreground'\n )}\n >\n {workspace.name}\n </span>\n {!workspace.projectName && (\n <span className=\"mt-0.5 truncate text-xs text-muted-foreground\">{kind.label}</span>\n )}\n {workspace.projectName && (\n <span\n className=\"mt-0.5 flex min-w-0\"\n data-testid={testIdOr(testIds?.projectName, {\n testId: 'sidebar-workspace-card-project-name',\n })}\n >\n {workspace.projectLine ?? (\n <span className=\"truncate text-xs text-muted-foreground\">\n {workspace.projectName}\n </span>\n )}\n </span>\n )}\n </div>\n </>\n )\n}\n\n/**\n * Entity nouns plus the switcher's strings. `plural` arrives lowercased and `singular`\n * capitalized in the functions below.\n */\nexport interface WorkspaceSwitcherLabels extends WorkspaceKindLabels {\n /** Entity nouns, e.g. { plural: 'workspaces', singular: 'workspace' }. */\n plural: string\n singular: string\n /** The trigger's accessible name. */\n switchWorkspace: (name: string, plural: string) => string\n allWorkspaces: (plural: string) => string\n newWorkspace: (singular: string) => string\n recentWorkspaces: (plural: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_SWITCHER_LABELS: WorkspaceSwitcherLabels = {\n ...DEFAULT_WORKSPACE_KIND_LABELS,\n plural: 'workspaces',\n singular: 'workspace',\n switchWorkspace: (name, plural) => `${name} — switch ${plural}`,\n allWorkspaces: (plural) => `All ${plural}`,\n newWorkspace: (singular) => `New ${singular}`,\n recentWorkspaces: (plural) => `Recent ${plural}`,\n}\n\nexport interface WorkspaceSwitcherProps {\n workspace: ShellWorkspace\n /** Other workspaces to jump to (the app orders and caps them). */\n recent?: ShellRecentWorkspace[]\n /** Icon-only trigger (the sidebar rail). */\n compact?: boolean\n /** `appbar`: the phone app bar's title, name + chevron on one line. */\n variant?: 'sidebar' | 'appbar'\n onSwitch: (workspace: ShellWorkspace) => void\n /** Return to the workspaces list; leaves the workspace open. */\n onGoToList: () => void\n onNewWorkspace: () => void\n /**\n * When set, \"New workspace\" is shown disabled with this explanation under it (e.g. the user may\n * not create workspaces on this deployment).\n */\n newWorkspaceDisabledReason?: string\n /** Entity nouns and menu strings; any subset (the nouns default to workspace(s)). */\n labels?: Partial<WorkspaceSwitcherLabels>\n className?: string\n /** Trigger id (default `workspace-switcher-trigger`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `switchItem`, `type` and `lastSeen` are prefixes\n * (`<prefix>-<workspace id>`).\n */\n testIds?: Partial<Record<'menu' | 'all' | 'new' | 'switchItem' | 'type' | 'lastSeen', string>>\n /** Ids forwarded to the trigger's workspace identity. */\n identityTestIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * The current-workspace control as a dropdown: \"All workspaces\", \"New workspace\", then the\n * recent workspaces to jump straight into.\n */\nexport function WorkspaceSwitcher({\n workspace,\n recent = [],\n compact = false,\n variant = 'sidebar',\n onSwitch,\n onGoToList,\n onNewWorkspace,\n newWorkspaceDisabledReason,\n labels,\n className,\n testId,\n testIds,\n identityTestIds,\n}: WorkspaceSwitcherProps) {\n const l = { ...DEFAULT_WORKSPACE_SWITCHER_LABELS, ...labels }\n const plural = l.plural.toLowerCase()\n const singular = l.singular.charAt(0).toUpperCase() + l.singular.slice(1)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"workspace-switcher\"\n data-testid={testIdOr(testId, { testId: 'workspace-switcher-trigger' })}\n aria-label={l.switchWorkspace(workspace.name, plural)}\n className={cn(\n 'group flex min-w-0 items-center rounded-md transition-colors duration-100 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n variant === 'appbar'\n ? 'h-11 max-w-full gap-1 px-2'\n : compact\n ? 'h-12 w-12 justify-center'\n : 'h-12 w-full px-2',\n className\n )}\n >\n {variant === 'appbar' ? (\n <span className=\"min-w-0 truncate text-base font-semibold text-foreground\">\n {workspace.name}\n </span>\n ) : (\n <WorkspaceIdentity\n workspace={workspace}\n expanded={!compact}\n labels={l}\n testIds={identityTestIds}\n />\n )}\n {!(compact && variant === 'sidebar') && (\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ml-auto size-4 flex-shrink-0 text-muted-foreground transition-transform duration-150 group-data-[state=open]:rotate-180\"\n />\n )}\n </button>\n </DropdownMenuTrigger>\n {/* Expanded menus follow the trigger width so they stay inside the sidebar. */}\n <DropdownMenuContent\n align=\"start\"\n className={cn(\n 'border-0 max-w-[calc(100vw-1.5rem)]',\n variant === 'sidebar' && !compact\n ? 'w-[var(--radix-dropdown-menu-trigger-width)]'\n : 'w-60'\n )}\n data-testid={testIdOr(testIds?.menu, { testId: 'workspace-switcher-menu' })}\n >\n <DropdownMenuItem\n onClick={onGoToList}\n data-testid={testIdOr(testIds?.all, { testId: 'workspace-switcher-all' })}\n className=\"gap-2\"\n >\n <LayoutGrid className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n {l.allWorkspaces(plural)}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={newWorkspaceDisabledReason ? undefined : onNewWorkspace}\n disabled={!!newWorkspaceDisabledReason}\n title={newWorkspaceDisabledReason}\n data-testid={testIdOr(testIds?.new, { testId: 'workspace-switcher-new' })}\n className=\"gap-2\"\n >\n <Plus className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"flex min-w-0 flex-col\">\n {l.newWorkspace(singular)}\n {newWorkspaceDisabledReason && (\n <span className=\"text-xs text-muted-foreground\">{newWorkspaceDisabledReason}</span>\n )}\n </span>\n </DropdownMenuItem>\n {recent.length > 0 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">\n {l.recentWorkspaces(plural)}\n </DropdownMenuLabel>\n {recent.map((w) => {\n const kind = workspaceKindMeta(w.kind, l)\n return (\n <DropdownMenuItem\n key={w.id}\n onClick={() => onSwitch(w)}\n data-testid={prefixedTestId(testIds?.switchItem, w.id, {\n testId: `workspace-switch-${w.id}`,\n })}\n className=\"gap-2\"\n >\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-6 flex-shrink-0 items-center justify-center rounded text-xs font-semibold leading-none',\n kind.fill\n )}\n >\n {w.name.charAt(0).toUpperCase()}\n </span>\n <span className=\"absolute -bottom-1 -right-1 flex size-3 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={prefixedTestId(testIds?.type, w.id, {\n testId: `workspace-type-${w.id}`,\n })}\n className=\"size-2 text-muted-foreground\"\n />\n </span>\n </span>\n <span className=\"min-w-0 flex-1 truncate capitalize\">{w.name}</span>\n {w.lastSeen && (\n <span\n className=\"ml-2 flex-shrink-0 text-xs tabular-nums text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.lastSeen, w.id, {\n testId: `workspace-last-seen-${w.id}`,\n })}\n >\n {w.lastSeen}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { useRef, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { useShellBottomInset } from '../lib/bottom-inset'\nimport type { NavItem } from './types'\n\n/** Fixed strings of the phone bars. */\nexport interface MobileBarsLabels {\n /** The menu button (the `menuLabel` prop wins). */\n openNavigationMenu: string\n /** The tab bar's accessible name (the `label` prop wins). */\n workspaceSections: string\n}\n\nexport const DEFAULT_MOBILE_BARS_LABELS: MobileBarsLabels = {\n openNavigationMenu: 'Open navigation menu',\n workspaceSections: 'Workspace sections',\n}\n\nexport interface MobileAppBarProps {\n /** Show the menu button that opens the drawer (nothing to open on a list page with no sidebar). */\n showMenu?: boolean\n onMenu?: () => void\n /** Replaces the brand mark (e.g. the workspace switcher). */\n title?: ReactNode\n /** Brand mark shown when there is no `title`. */\n logo?: ReactNode\n /** Right-aligned controls that fit (ask, offline pill, bell, account). */\n actions?: ReactNode\n menuLabel?: string\n labels?: Partial<Pick<MobileBarsLabels, 'openNavigationMenu'>>\n className?: string\n 'data-testid'?: string\n /** Menu button id (default `mobile-nav-toggle`). */\n menuTestId?: string\n}\n\n/**\n * The slim phone app bar (56px): menu button, a title slot and an actions slot. The app mounts\n * it only on small screens; the controls that do not fit live in the drawer.\n */\nexport function MobileAppBar({\n showMenu = true,\n onMenu,\n title,\n logo,\n actions,\n menuLabel,\n labels,\n className,\n 'data-testid': testId,\n menuTestId,\n}: MobileAppBarProps) {\n return (\n <div\n data-slot=\"mobile-app-bar\"\n data-testid={testId}\n className={cn(\n 'sm:hidden flex h-14 flex-shrink-0 items-center gap-1 bg-background pl-1 pr-2 pt-safe',\n className\n )}\n >\n {showMenu && (\n <button\n type=\"button\"\n onClick={onMenu}\n className=\"flex size-11 shrink-0 items-center justify-center rounded-md text-foreground transition-colors hover:bg-muted\"\n aria-label={\n menuLabel ?? labels?.openNavigationMenu ?? DEFAULT_MOBILE_BARS_LABELS.openNavigationMenu\n }\n data-testid={testIdOr(menuTestId, { testId: 'mobile-nav-toggle' })}\n >\n <Menu className=\"size-5\" />\n </button>\n )}\n <div className={cn('flex min-w-0 flex-1 items-center', !showMenu && 'pl-3')}>\n {title ?? logo}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-0.5\">{actions}</div>}\n </div>\n )\n}\n\n/**\n * A tab's label. It wraps at word boundaries and is never clipped or cut with an ellipsis; a tab\n * narrower than 4.5rem sets it one size smaller so a long single word still fits, and an item with\n * a `shortLabel` shows that one while its tab is narrower than 5.5rem.\n */\nfunction TabLabel({ item }: { item: NavItem }) {\n const wrap =\n 'max-w-full text-balance px-0.5 text-center [overflow-wrap:normal] @max-[4.5rem]:text-[10px]'\n if (!item.shortLabel) return <span className={wrap}>{item.label}</span>\n return (\n <>\n <span data-slot=\"tab-short-label\" aria-hidden=\"true\" className={cn(wrap, '@[5.5rem]:hidden')}>\n {item.shortLabel}\n </span>\n <span className={cn(wrap, 'hidden @[5.5rem]:block')}>{item.label}</span>\n <span className=\"sr-only @[5.5rem]:hidden\">{item.label}</span>\n </>\n )\n}\n\nexport interface MobileTabBarProps {\n /** The workspace's main areas; test ids are `{testIdPrefix}-{id}` (prefix default `mobile-tab`). */\n items: NavItem[]\n label?: string\n labels?: Partial<Pick<MobileBarsLabels, 'workspaceSections'>>\n testIdPrefix?: string\n className?: string\n 'data-testid'?: string\n}\n\n/**\n * Phone bottom navigation: a 64px tinted bar of the main areas. The drawer carries the same\n * destinations with counts, so nothing is reachable only here. The app mounts it on small\n * screens only.\n */\nexport function MobileTabBar({\n items,\n label,\n labels,\n testIdPrefix,\n className,\n 'data-testid': testId,\n}: MobileTabBarProps) {\n const navRef = useRef<HTMLElement>(null)\n // Floating elements (install prompt, toasts) read the bar's height from `--shell-bottom-inset`.\n useShellBottomInset(navRef)\n return (\n <nav\n ref={navRef}\n aria-label={\n label ?? labels?.workspaceSections ?? DEFAULT_MOBILE_BARS_LABELS.workspaceSections\n }\n data-slot=\"mobile-tab-bar\"\n data-testid={testIdOr(testId, { testId: 'mobile-tab-bar' })}\n className={cn(\n 'flex min-h-16 flex-shrink-0 items-stretch bg-sidebar px-2 pb-safe sm:hidden',\n className\n )}\n >\n {items.map((item) => (\n <ActionLink\n key={item.id}\n href={item.href}\n external={item.external}\n onSelect={item.onSelect}\n disabled={item.disabled}\n aria-current={item.active ? 'page' : undefined}\n className={cn(\n // Each tab is a size container: a `shortLabel` replaces the label when it is narrow.\n '@container flex min-h-12 min-w-0 flex-1 flex-col items-center justify-center gap-0.5 rounded-md text-[11px] leading-tight transition-colors',\n item.active\n ? 'font-semibold text-primary'\n : 'font-medium text-muted-foreground hover:text-foreground'\n )}\n data-testid={prefixedTestId(testIdPrefix, item.id, { testId: `mobile-tab-${item.id}` })}\n >\n {item.icon}\n <TabLabel item={item} />\n </ActionLink>\n ))}\n </nav>\n )\n}\n","/**\n * One policy for every automatic reload: when the running build is out of date, pick a moment\n * that costs the user nothing.\n *\n * After a deploy (or mid-rollout, while old and new pods both serve) the previous build's hashed\n * chunks can 404. Vite reports that as `vite:preloadError`. Reloading fetches the current\n * index.html (served no-cache) and its chunks, but reloading at once throws away whatever the\n * user is typing, so:\n *\n * - A failed prefetch (`prefetchChunk`) never reloads. Nothing on screen depends on it.\n * - A failed chunk the user is waiting for reloads at once, unless the user is on a sign-in form\n * or has unsaved input (a focused or edited field, or a `[data-reload-guard]` region).\n * - Otherwise the reload waits: the next route navigation becomes a full page load of its target,\n * or the page reloads once the user is idle with nothing unsaved.\n * - Per tab, at most one policy reload a minute. A second failure right after one is not a stale\n * build (a genuinely missing chunk, say), so it surfaces to the error boundary instead of looping.\n */\n\nimport { notify } from '@arbidocs/react/shell'\n\nexport const CHUNK_RELOAD_KEY = 'arbi_chunk_reload_at'\n\n/** A second failure within this window after a reload is not a stale build: let it surface. */\nconst RELOAD_GUARD_MS = 60_000\n/** A deferred reload waits until the user has done nothing for this long. */\nconst IDLE_MS = 10_000\nconst IDLE_CHECK_MS = 2_000\n\n/** Sign-in pages, and regions a host marks as holding unsaved work. */\nconst GUARD_SELECTOR =\n '[data-slot=\"auth-layout\"], input[type=\"password\"], input[autocomplete=\"one-time-code\"], [data-reload-guard]'\nconst NON_TEXT_INPUTS = new Set([\n 'button',\n 'submit',\n 'reset',\n 'checkbox',\n 'radio',\n 'hidden',\n 'range',\n 'color',\n 'file',\n 'image',\n])\n\nexport interface ReloadPolicyDeps {\n /** Reload the current page. */\n reload: () => void\n /** Full page load of `url` (instead of a client-side navigation). */\n load: (url: string, replace: boolean) => void\n now: () => number\n}\n\nconst browserDeps: ReloadPolicyDeps = {\n reload: () => window.location.reload(),\n load: (url, replace) => (replace ? window.location.replace(url) : window.location.assign(url)),\n now: () => Date.now(),\n}\n\nlet deps = browserDeps\nlet installed = false\n/** The build is out of date: the next route navigation loads the page fresh. */\nlet stale = false\n/** A chunk the user needed failed: reload as soon as nothing would be lost. */\nlet reloadWanted = false\nlet lastActivity = 0\nlet idleTimer: ReturnType<typeof setInterval> | undefined\nlet restoreNavigation: (() => void) | null = null\n/** Fields the user typed into. */\nconst edited = new Set<Element>()\n/** Errors from `prefetchChunk` loads, so the preload-error handler can tell them apart. */\nconst prefetchFailures = new WeakSet<object>()\n\nfunction isTextField(el: Element): boolean {\n if (el instanceof HTMLInputElement) return !NON_TEXT_INPUTS.has(el.type)\n return el instanceof HTMLTextAreaElement || (el as HTMLElement).isContentEditable === true\n}\n\nfunction hasText(el: Element): boolean {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n return el.value.trim() !== ''\n }\n return (el.textContent ?? '').trim() !== ''\n}\n\n/**\n * Whether reloading now could cost the user something: a sign-in form, a `[data-reload-guard]`\n * region, a focused text field, or a field they typed into that still holds text.\n */\nexport function hasUnsavedInput(doc: Document = document): boolean {\n if (doc.querySelector(GUARD_SELECTOR)) return true\n const active = doc.activeElement\n if (active && active !== doc.body && isTextField(active)) return true\n for (const el of edited) {\n if (!el.isConnected) edited.delete(el)\n else if (hasText(el)) return true\n }\n return false\n}\n\n/** Take this tab's reload slot. False within the guard window, or when storage can't record it. */\nfunction claimReload(): boolean {\n const now = deps.now()\n let last = 0\n try {\n last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n } catch {\n // Unreadable: treat as never reloaded. Writing below decides.\n }\n if (last && now - last < RELOAD_GUARD_MS) return false\n try {\n sessionStorage.setItem(CHUNK_RELOAD_KEY, String(now))\n } catch {\n // Without the guard we can't tell a loop from a stale build: don't risk one.\n return false\n }\n return true\n}\n\nfunction guardHot(): boolean {\n try {\n const last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n return !!last && deps.now() - last < RELOAD_GUARD_MS\n } catch {\n return false\n }\n}\n\nfunction settle(): void {\n stale = false\n reloadWanted = false\n if (idleTimer !== undefined) clearInterval(idleTimer)\n idleTimer = undefined\n restoreNavigation?.()\n restoreNavigation = null\n}\n\nfunction reloadNow(): boolean {\n if (!claimReload()) {\n settle()\n return false\n }\n settle()\n deps.reload()\n return true\n}\n\n/** A client-side navigation to `url` becomes a full page load of it while the build is stale. */\nfunction loadsFresh(url: string | URL | null | undefined): string | null {\n if (!stale || url == null) return null\n const target = new URL(String(url), window.location.href)\n if (target.pathname === window.location.pathname) return null\n // Leaving a sign-in page establishes the session: a full load there races its persistence.\n if (document.querySelector(GUARD_SELECTOR)) return null\n return target.href\n}\n\nfunction interceptNavigation(): void {\n if (restoreNavigation) return\n const history = window.history\n const push = history.pushState\n const replace = history.replaceState\n let shownPath = window.location.pathname\n const wrap = (original: History['pushState'], replaceEntry: boolean): History['pushState'] =>\n function (this: History, data, unused, url) {\n const target = loadsFresh(url)\n if (target && claimReload()) {\n settle()\n deps.load(target, replaceEntry)\n return\n }\n original.call(this, data, unused, url)\n shownPath = window.location.pathname\n }\n history.pushState = wrap(push, false)\n history.replaceState = wrap(replace, true)\n // Back/forward already changed the address: reloading loads that target.\n const onPopState = () => {\n if (window.location.pathname === shownPath) return\n shownPath = window.location.pathname\n if (!document.querySelector(GUARD_SELECTOR)) reloadNow()\n }\n window.addEventListener('popstate', onPopState)\n restoreNavigation = () => {\n history.pushState = push\n history.replaceState = replace\n window.removeEventListener('popstate', onPopState)\n }\n}\n\nfunction watchForIdle(): void {\n if (idleTimer !== undefined) return\n idleTimer = setInterval(() => {\n if (!reloadWanted) return\n const idle = document.visibilityState === 'hidden' || deps.now() - lastActivity >= IDLE_MS\n if (idle && !hasUnsavedInput()) reloadNow()\n }, IDLE_CHECK_MS)\n}\n\n/**\n * The running build is out of date (a chunk 404'd, or a new service worker took over): the next\n * route navigation loads its target fresh instead of rendering it client-side.\n */\nexport function markBuildStale(): void {\n stale = true\n interceptNavigation()\n}\n\nexport type ReloadOutcome = 'reloaded' | 'deferred' | 'guarded'\n\n/**\n * Reload onto the current build when nothing would be lost; otherwise defer to the next route\n * navigation or to the moment the user is idle with nothing unsaved. `guarded` means a policy\n * reload just happened in this tab, so the failure should surface instead.\n */\nexport function requestReload(): ReloadOutcome {\n if (guardHot()) return 'guarded'\n if (!hasUnsavedInput()) return reloadNow() ? 'reloaded' : 'guarded'\n reloadWanted = true\n markBuildStale()\n watchForIdle()\n return 'deferred'\n}\n\n/**\n * Load a chunk ahead of need (warming a route the user may open next). Never rejects, and a\n * failure never reloads the page: it only marks the build stale so the next navigation loads\n * fresh.\n */\nexport function prefetchChunk(load: () => Promise<unknown>): Promise<void> {\n let loading: Promise<unknown>\n try {\n loading = load()\n } catch (error) {\n loading = Promise.reject(error)\n }\n return loading.then(\n () => undefined,\n (error: unknown) => {\n if (typeof error === 'object' && error !== null) prefetchFailures.add(error)\n }\n )\n}\n\nfunction decide(payload: unknown): void {\n const prefetch = typeof payload === 'object' && payload !== null && prefetchFailures.has(payload)\n // Offline the chunk simply couldn't be downloaded (it isn't cached yet). Reloading can't fix\n // that and would throw away what's on screen; say what happened instead, and let the failed\n // import reach the nearest error boundary as usual.\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n if (!prefetch) {\n notify.warning(\"This part of ARBI isn't available offline yet\", {\n description: 'Reconnect to open it. Once you have, it will work offline too.',\n })\n }\n return\n }\n markBuildStale()\n if (prefetch) return\n const outcome = requestReload()\n console.warn(`[chunk] A code chunk failed to load (stale build?): ${outcome}`, payload)\n}\n\n/**\n * The `vite:preloadError` handler. Decides once the failed import's own handlers have run, so a\n * `prefetchChunk` failure is known as one. Never cancels the event: the import rejects as usual\n * and, if a reload follows, the page is replaced anyway.\n */\nexport function handleChunkLoadError(event: Event): void {\n const payload = (event as Event & { payload?: unknown }).payload\n setTimeout(() => decide(payload), 0)\n}\n\nfunction onActivity(event: Event): void {\n lastActivity = deps.now()\n if (event.type === 'input' && event.target instanceof Element && isTextField(event.target)) {\n edited.add(event.target)\n }\n}\n\nconst ACTIVITY_EVENTS = ['input', 'keydown', 'pointerdown', 'wheel', 'touchstart'] as const\n\n/** Install the reload policy. Call once at startup; later calls are no-ops. */\nexport function installReloadPolicy(overrides: Partial<ReloadPolicyDeps> = {}): void {\n deps = { ...browserDeps, ...overrides }\n if (installed || typeof window === 'undefined') return\n installed = true\n lastActivity = deps.now()\n window.addEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) {\n document.addEventListener(type, onActivity, { capture: true, passive: true })\n }\n}\n\n/** Undo `installReloadPolicy` and forget all state (tests). */\nexport function resetReloadPolicy(): void {\n settle()\n edited.clear()\n if (installed) {\n window.removeEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) document.removeEventListener(type, onActivity, true)\n }\n installed = false\n deps = browserDeps\n}\n"]}
1
+ {"version":3,"sources":["../src/shell/Workspace.tsx","../src/shell/MobileBars.tsx","../src/shell/reload-policy.ts"],"names":["jsxs","cn","jsx","Fragment"],"mappings":"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","file":"chunk-VNFNIHHJ.js","sourcesContent":["import type { ComponentType } from 'react'\nimport { ChevronDown, Globe, LayoutGrid, Lock, Plus, Users } from 'lucide-react'\nimport {\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from '@arbidocs/react/ui'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport type { ShellRecentWorkspace, ShellWorkspace, ShellWorkspaceKind } from './types'\n\n/** The three workspace-kind names (badge title, type glyph name, subtitle). */\nexport interface WorkspaceKindLabels {\n common: string\n shared: string\n private: string\n}\n\nexport const DEFAULT_WORKSPACE_KIND_LABELS: WorkspaceKindLabels = {\n common: 'Common',\n shared: 'Shared',\n private: 'Private',\n}\n\n/**\n * Workspace type drives the initial-badge fill and a quiet secondary glyph:\n * private (just you) -> navy, lock shared (several) -> selection tint, people\n * common (public) -> neutral, globe\n * Navy is identity and cyan is reserved for ARBI/AI, so \"shared\" is the selection tint.\n */\nexport function workspaceKindMeta(\n kind: ShellWorkspaceKind,\n labels?: Partial<WorkspaceKindLabels>\n): {\n Icon: ComponentType<{ className?: string; 'aria-label'?: string; 'data-testid'?: string }>\n label: string\n fill: string\n} {\n const l = { ...DEFAULT_WORKSPACE_KIND_LABELS, ...labels }\n if (kind === 'common')\n return { Icon: Globe, label: l.common, fill: 'bg-muted text-muted-foreground' }\n if (kind === 'shared')\n return { Icon: Users, label: l.shared, fill: 'bg-secondary text-secondary-foreground' }\n return { Icon: Lock, label: l.private, fill: 'bg-primary text-primary-foreground' }\n}\n\n/** The kind's hue as a CSS colour, for glyphs painted by SVG fill (the workspace shield). */\nexport function workspaceKindColor(kind: ShellWorkspaceKind): string {\n if (kind === 'common') return 'var(--color-muted-foreground)'\n if (kind === 'shared') return 'var(--color-secondary)'\n return 'var(--color-primary)'\n}\n\n/** Overridable ids of the workspace identity; defaults are the current ids. */\ntype WorkspaceIdentityTestIds = Partial<Record<'initial' | 'type' | 'projectName', string>>\n\nexport interface WorkspaceIdentityProps {\n workspace: ShellWorkspace\n /** Show name + type/project line beside the badge; otherwise the badge alone. */\n expanded: boolean\n /** Selected (nav-row) styling of the name. */\n isActive?: boolean\n /** Reword the kind names. */\n labels?: Partial<WorkspaceKindLabels>\n /** Part ids; defaults are the current ids. */\n testIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * Non-interactive guts of the workspace head: the initial badge (with a tiny type glyph) and,\n * when expanded, the name and the project/type line. Hosted by the switcher trigger and by the\n * workspace settings header, so it never nests a button.\n */\nexport function WorkspaceIdentity({\n workspace,\n expanded,\n isActive = false,\n labels,\n testIds,\n}: WorkspaceIdentityProps) {\n const kind = workspaceKindMeta(workspace.kind, labels)\n const badge = (\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n data-testid={testIdOr(testIds?.initial, { testId: 'sidebar-workspace-card-initial' })}\n className={cn(\n 'flex size-7 flex-shrink-0 items-center justify-center rounded-md text-sm font-semibold leading-none',\n kind.fill\n )}\n >\n {workspace.name.charAt(0).toUpperCase()}\n </span>\n {/* Type as a tiny overlay on the badge: status reads at the icon, not after the name. */}\n <span className=\"absolute -bottom-1 -right-1 flex size-3.5 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={testIdOr(testIds?.type, { testId: 'sidebar-workspace-card-type' })}\n className=\"size-2.5 text-muted-foreground\"\n />\n </span>\n </span>\n )\n\n if (!expanded)\n return <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n\n return (\n <>\n <div className=\"flex flex-shrink-0 items-center justify-center\">{badge}</div>\n <div className=\"ml-2.5 flex min-w-0 flex-1 flex-col text-left\">\n <span\n // 600: the name of the thing you are inside, above a lighter project line.\n className={cn(\n 'min-w-0 truncate text-left text-sm font-semibold capitalize leading-tight transition-colors duration-100',\n isActive ? 'text-accent-foreground' : 'text-foreground'\n )}\n >\n {workspace.name}\n </span>\n {!workspace.projectName && (\n <span className=\"mt-0.5 truncate text-xs text-muted-foreground\">{kind.label}</span>\n )}\n {workspace.projectName && (\n <span\n className=\"mt-0.5 flex min-w-0\"\n data-testid={testIdOr(testIds?.projectName, {\n testId: 'sidebar-workspace-card-project-name',\n })}\n >\n {workspace.projectLine ?? (\n <span className=\"truncate text-xs text-muted-foreground\">\n {workspace.projectName}\n </span>\n )}\n </span>\n )}\n </div>\n </>\n )\n}\n\n/**\n * Entity nouns plus the switcher's strings. `plural` arrives lowercased and `singular`\n * capitalized in the functions below.\n */\nexport interface WorkspaceSwitcherLabels extends WorkspaceKindLabels {\n /** Entity nouns, e.g. { plural: 'workspaces', singular: 'workspace' }. */\n plural: string\n singular: string\n /** The trigger's accessible name. */\n switchWorkspace: (name: string, plural: string) => string\n allWorkspaces: (plural: string) => string\n newWorkspace: (singular: string) => string\n recentWorkspaces: (plural: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_SWITCHER_LABELS: WorkspaceSwitcherLabels = {\n ...DEFAULT_WORKSPACE_KIND_LABELS,\n plural: 'workspaces',\n singular: 'workspace',\n switchWorkspace: (name, plural) => `${name} — switch ${plural}`,\n allWorkspaces: (plural) => `All ${plural}`,\n newWorkspace: (singular) => `New ${singular}`,\n recentWorkspaces: (plural) => `Recent ${plural}`,\n}\n\nexport interface WorkspaceSwitcherProps {\n workspace: ShellWorkspace\n /** Other workspaces to jump to (the app orders and caps them). */\n recent?: ShellRecentWorkspace[]\n /** Icon-only trigger (the sidebar rail). */\n compact?: boolean\n /** `appbar`: the phone app bar's title, name + chevron on one line. */\n variant?: 'sidebar' | 'appbar'\n onSwitch: (workspace: ShellWorkspace) => void\n /** Return to the workspaces list; leaves the workspace open. */\n onGoToList: () => void\n onNewWorkspace: () => void\n /**\n * When set, \"New workspace\" is shown disabled with this explanation under it (e.g. the user may\n * not create workspaces on this deployment).\n */\n newWorkspaceDisabledReason?: string\n /** Entity nouns and menu strings; any subset (the nouns default to workspace(s)). */\n labels?: Partial<WorkspaceSwitcherLabels>\n className?: string\n /** Trigger id (default `workspace-switcher-trigger`). */\n testId?: string\n /**\n * Part ids; defaults are the current ids. `switchItem`, `type` and `lastSeen` are prefixes\n * (`<prefix>-<workspace id>`).\n */\n testIds?: Partial<Record<'menu' | 'all' | 'new' | 'switchItem' | 'type' | 'lastSeen', string>>\n /** Ids forwarded to the trigger's workspace identity. */\n identityTestIds?: WorkspaceIdentityTestIds\n}\n\n/**\n * The current-workspace control as a dropdown: \"All workspaces\", \"New workspace\", then the\n * recent workspaces to jump straight into.\n */\nexport function WorkspaceSwitcher({\n workspace,\n recent = [],\n compact = false,\n variant = 'sidebar',\n onSwitch,\n onGoToList,\n onNewWorkspace,\n newWorkspaceDisabledReason,\n labels,\n className,\n testId,\n testIds,\n identityTestIds,\n}: WorkspaceSwitcherProps) {\n const l = { ...DEFAULT_WORKSPACE_SWITCHER_LABELS, ...labels }\n const plural = l.plural.toLowerCase()\n const singular = l.singular.charAt(0).toUpperCase() + l.singular.slice(1)\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"workspace-switcher\"\n data-testid={testIdOr(testId, { testId: 'workspace-switcher-trigger' })}\n aria-label={l.switchWorkspace(workspace.name, plural)}\n className={cn(\n 'group flex min-w-0 items-center rounded-md transition-colors duration-100 hover:bg-muted focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n variant === 'appbar'\n ? 'h-11 max-w-full gap-1 px-2'\n : compact\n ? 'h-12 w-12 justify-center'\n : 'h-12 w-full px-2',\n className\n )}\n >\n {variant === 'appbar' ? (\n <span className=\"min-w-0 truncate text-base font-semibold text-foreground\">\n {workspace.name}\n </span>\n ) : (\n <WorkspaceIdentity\n workspace={workspace}\n expanded={!compact}\n labels={l}\n testIds={identityTestIds}\n />\n )}\n {!(compact && variant === 'sidebar') && (\n <ChevronDown\n aria-hidden=\"true\"\n className=\"ml-auto size-4 flex-shrink-0 text-muted-foreground transition-transform duration-150 group-data-[state=open]:rotate-180\"\n />\n )}\n </button>\n </DropdownMenuTrigger>\n {/* Expanded menus follow the trigger width so they stay inside the sidebar. */}\n <DropdownMenuContent\n align=\"start\"\n className={cn(\n 'border-0 max-w-[calc(100vw-1.5rem)]',\n variant === 'sidebar' && !compact\n ? 'w-[var(--radix-dropdown-menu-trigger-width)]'\n : 'w-60'\n )}\n data-testid={testIdOr(testIds?.menu, { testId: 'workspace-switcher-menu' })}\n >\n <DropdownMenuItem\n onClick={onGoToList}\n data-testid={testIdOr(testIds?.all, { testId: 'workspace-switcher-all' })}\n className=\"gap-2\"\n >\n <LayoutGrid className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n {l.allWorkspaces(plural)}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={newWorkspaceDisabledReason ? undefined : onNewWorkspace}\n disabled={!!newWorkspaceDisabledReason}\n title={newWorkspaceDisabledReason}\n data-testid={testIdOr(testIds?.new, { testId: 'workspace-switcher-new' })}\n className=\"gap-2\"\n >\n <Plus className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"flex min-w-0 flex-col\">\n {l.newWorkspace(singular)}\n {newWorkspaceDisabledReason && (\n <span className=\"text-xs text-muted-foreground\">{newWorkspaceDisabledReason}</span>\n )}\n </span>\n </DropdownMenuItem>\n {recent.length > 0 && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"text-xs font-normal text-muted-foreground\">\n {l.recentWorkspaces(plural)}\n </DropdownMenuLabel>\n {recent.map((w) => {\n const kind = workspaceKindMeta(w.kind, l)\n return (\n <DropdownMenuItem\n key={w.id}\n onClick={() => onSwitch(w)}\n data-testid={prefixedTestId(testIds?.switchItem, w.id, {\n testId: `workspace-switch-${w.id}`,\n })}\n className=\"gap-2\"\n >\n <span className=\"relative flex flex-shrink-0\" title={kind.label}>\n <span\n aria-hidden=\"true\"\n className={cn(\n 'flex size-6 flex-shrink-0 items-center justify-center rounded text-xs font-semibold leading-none',\n kind.fill\n )}\n >\n {w.name.charAt(0).toUpperCase()}\n </span>\n <span className=\"absolute -bottom-1 -right-1 flex size-3 items-center justify-center rounded-full bg-background ring-1 ring-border\">\n <kind.Icon\n aria-label={kind.label}\n data-testid={prefixedTestId(testIds?.type, w.id, {\n testId: `workspace-type-${w.id}`,\n })}\n className=\"size-2 text-muted-foreground\"\n />\n </span>\n </span>\n <span className=\"min-w-0 flex-1 truncate capitalize\">{w.name}</span>\n {w.lastSeen && (\n <span\n className=\"ml-2 flex-shrink-0 text-xs tabular-nums text-muted-foreground\"\n data-testid={prefixedTestId(testIds?.lastSeen, w.id, {\n testId: `workspace-last-seen-${w.id}`,\n })}\n >\n {w.lastSeen}\n </span>\n )}\n </DropdownMenuItem>\n )\n })}\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n )\n}\n","import { useRef, type ReactNode } from 'react'\nimport { Menu } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { ActionLink } from '../components/ActionLink'\nimport { prefixedTestId, testIdOr } from '../chat/test-id'\nimport { useShellBottomInset } from '../lib/bottom-inset'\nimport type { NavItem } from './types'\n\n/** Fixed strings of the phone bars. */\nexport interface MobileBarsLabels {\n /** The menu button (the `menuLabel` prop wins). */\n openNavigationMenu: string\n /** The tab bar's accessible name (the `label` prop wins). */\n workspaceSections: string\n}\n\nexport const DEFAULT_MOBILE_BARS_LABELS: MobileBarsLabels = {\n openNavigationMenu: 'Open navigation menu',\n workspaceSections: 'Workspace sections',\n}\n\nexport interface MobileAppBarProps {\n /** Show the menu button that opens the drawer (nothing to open on a list page with no sidebar). */\n showMenu?: boolean\n onMenu?: () => void\n /** Replaces the brand mark (e.g. the workspace switcher). */\n title?: ReactNode\n /** Brand mark shown when there is no `title`. */\n logo?: ReactNode\n /** Right-aligned controls that fit (ask, offline pill, bell, account). */\n actions?: ReactNode\n menuLabel?: string\n labels?: Partial<Pick<MobileBarsLabels, 'openNavigationMenu'>>\n className?: string\n 'data-testid'?: string\n /** Menu button id (default `mobile-nav-toggle`). */\n menuTestId?: string\n}\n\n/**\n * The slim phone app bar (56px): menu button, a title slot and an actions slot. The app mounts\n * it only on small screens; the controls that do not fit live in the drawer.\n */\nexport function MobileAppBar({\n showMenu = true,\n onMenu,\n title,\n logo,\n actions,\n menuLabel,\n labels,\n className,\n 'data-testid': testId,\n menuTestId,\n}: MobileAppBarProps) {\n return (\n <div\n data-slot=\"mobile-app-bar\"\n data-testid={testId}\n className={cn(\n 'sm:hidden flex h-14 flex-shrink-0 items-center gap-1 bg-background pl-1 pr-2 pt-safe',\n className\n )}\n >\n {showMenu && (\n <button\n type=\"button\"\n onClick={onMenu}\n className=\"flex size-11 shrink-0 items-center justify-center rounded-md text-foreground transition-colors hover:bg-muted\"\n aria-label={\n menuLabel ?? labels?.openNavigationMenu ?? DEFAULT_MOBILE_BARS_LABELS.openNavigationMenu\n }\n data-testid={testIdOr(menuTestId, { testId: 'mobile-nav-toggle' })}\n >\n <Menu className=\"size-5\" />\n </button>\n )}\n <div className={cn('flex min-w-0 flex-1 items-center', !showMenu && 'pl-3')}>\n {title ?? logo}\n </div>\n {actions && <div className=\"flex shrink-0 items-center gap-0.5\">{actions}</div>}\n </div>\n )\n}\n\n/**\n * A tab's label. It wraps at word boundaries and is never clipped or cut with an ellipsis; a tab\n * narrower than 4.5rem sets it one size smaller so a long single word still fits, and an item with\n * a `shortLabel` shows that one while its tab is narrower than 5.5rem.\n */\nfunction TabLabel({ item }: { item: NavItem }) {\n const wrap =\n 'max-w-full text-balance px-0.5 text-center [overflow-wrap:normal] @max-[4.5rem]:text-[10px]'\n if (!item.shortLabel) return <span className={wrap}>{item.label}</span>\n return (\n <>\n <span data-slot=\"tab-short-label\" aria-hidden=\"true\" className={cn(wrap, '@[5.5rem]:hidden')}>\n {item.shortLabel}\n </span>\n <span className={cn(wrap, 'hidden @[5.5rem]:block')}>{item.label}</span>\n <span className=\"sr-only @[5.5rem]:hidden\">{item.label}</span>\n </>\n )\n}\n\nexport interface MobileTabBarProps {\n /** The workspace's main areas; test ids are `{testIdPrefix}-{id}` (prefix default `mobile-tab`). */\n items: NavItem[]\n label?: string\n labels?: Partial<Pick<MobileBarsLabels, 'workspaceSections'>>\n testIdPrefix?: string\n className?: string\n 'data-testid'?: string\n}\n\n/**\n * Phone bottom navigation: a 64px tinted bar of the main areas. The drawer carries the same\n * destinations with counts, so nothing is reachable only here. The app mounts it on small\n * screens only.\n */\nexport function MobileTabBar({\n items,\n label,\n labels,\n testIdPrefix,\n className,\n 'data-testid': testId,\n}: MobileTabBarProps) {\n const navRef = useRef<HTMLElement>(null)\n // Floating elements (install prompt, toasts) read the bar's height from `--shell-bottom-inset`.\n useShellBottomInset(navRef)\n return (\n <nav\n ref={navRef}\n aria-label={\n label ?? labels?.workspaceSections ?? DEFAULT_MOBILE_BARS_LABELS.workspaceSections\n }\n data-slot=\"mobile-tab-bar\"\n data-testid={testIdOr(testId, { testId: 'mobile-tab-bar' })}\n className={cn(\n 'flex min-h-16 flex-shrink-0 items-stretch bg-sidebar px-2 pb-safe sm:hidden',\n className\n )}\n >\n {items.map((item) => (\n <ActionLink\n key={item.id}\n href={item.href}\n external={item.external}\n onSelect={item.onSelect}\n disabled={item.disabled}\n aria-current={item.active ? 'page' : undefined}\n className={cn(\n // Each tab is a size container: a `shortLabel` replaces the label when it is narrow.\n '@container flex min-h-12 min-w-0 flex-1 flex-col items-center justify-center gap-0.5 rounded-md text-[11px] leading-tight transition-colors',\n item.active\n ? 'font-semibold text-primary'\n : 'font-medium text-muted-foreground hover:text-foreground'\n )}\n data-testid={prefixedTestId(testIdPrefix, item.id, { testId: `mobile-tab-${item.id}` })}\n >\n {item.icon}\n <TabLabel item={item} />\n </ActionLink>\n ))}\n </nav>\n )\n}\n","/**\n * One policy for every automatic reload: when the running build is out of date, pick a moment\n * that costs the user nothing.\n *\n * After a deploy (or mid-rollout, while old and new pods both serve) the previous build's hashed\n * chunks can 404. Vite reports that as `vite:preloadError`. Reloading fetches the current\n * index.html (served no-cache) and its chunks, but reloading at once throws away whatever the\n * user is typing, so:\n *\n * - A failed prefetch (`prefetchChunk`) never reloads. Nothing on screen depends on it.\n * - A failed chunk the user is waiting for reloads at once, unless the user is on a sign-in form\n * or has unsaved input (a focused or edited field, or a `[data-reload-guard]` region).\n * - Otherwise the reload waits: the next route navigation becomes a full page load of its target,\n * or the page reloads once the user is idle with nothing unsaved.\n * - Per tab, at most one policy reload a minute. A second failure right after one is not a stale\n * build (a genuinely missing chunk, say), so it surfaces to the error boundary instead of looping.\n */\n\nimport { notify } from '@arbidocs/react/shell'\n\nexport const CHUNK_RELOAD_KEY = 'arbi_chunk_reload_at'\n\n/** A second failure within this window after a reload is not a stale build: let it surface. */\nconst RELOAD_GUARD_MS = 60_000\n/** A deferred reload waits until the user has done nothing for this long. */\nconst IDLE_MS = 10_000\nconst IDLE_CHECK_MS = 2_000\n\n/** Sign-in pages, and regions a host marks as holding unsaved work. */\nconst GUARD_SELECTOR =\n '[data-slot=\"auth-layout\"], input[type=\"password\"], input[autocomplete=\"one-time-code\"], [data-reload-guard]'\nconst NON_TEXT_INPUTS = new Set([\n 'button',\n 'submit',\n 'reset',\n 'checkbox',\n 'radio',\n 'hidden',\n 'range',\n 'color',\n 'file',\n 'image',\n])\n\nexport interface ReloadPolicyDeps {\n /** Reload the current page. */\n reload: () => void\n /** Full page load of `url` (instead of a client-side navigation). */\n load: (url: string, replace: boolean) => void\n now: () => number\n}\n\nconst browserDeps: ReloadPolicyDeps = {\n reload: () => window.location.reload(),\n load: (url, replace) => (replace ? window.location.replace(url) : window.location.assign(url)),\n now: () => Date.now(),\n}\n\nlet deps = browserDeps\nlet installed = false\n/** The build is out of date: the next route navigation loads the page fresh. */\nlet stale = false\n/** A chunk the user needed failed: reload as soon as nothing would be lost. */\nlet reloadWanted = false\nlet lastActivity = 0\nlet idleTimer: ReturnType<typeof setInterval> | undefined\nlet restoreNavigation: (() => void) | null = null\n/** Fields the user typed into. */\nconst edited = new Set<Element>()\n/** Errors from `prefetchChunk` loads, so the preload-error handler can tell them apart. */\nconst prefetchFailures = new WeakSet<object>()\n\nfunction isTextField(el: Element): boolean {\n if (el instanceof HTMLInputElement) return !NON_TEXT_INPUTS.has(el.type)\n return el instanceof HTMLTextAreaElement || (el as HTMLElement).isContentEditable === true\n}\n\nfunction hasText(el: Element): boolean {\n if (el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement) {\n return el.value.trim() !== ''\n }\n return (el.textContent ?? '').trim() !== ''\n}\n\n/**\n * Whether reloading now could cost the user something: a sign-in form, a `[data-reload-guard]`\n * region, a focused text field, or a field they typed into that still holds text.\n */\nexport function hasUnsavedInput(doc: Document = document): boolean {\n if (doc.querySelector(GUARD_SELECTOR)) return true\n const active = doc.activeElement\n if (active && active !== doc.body && isTextField(active)) return true\n for (const el of edited) {\n if (!el.isConnected) edited.delete(el)\n else if (hasText(el)) return true\n }\n return false\n}\n\n/** Take this tab's reload slot. False within the guard window, or when storage can't record it. */\nfunction claimReload(): boolean {\n const now = deps.now()\n let last = 0\n try {\n last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n } catch {\n // Unreadable: treat as never reloaded. Writing below decides.\n }\n if (last && now - last < RELOAD_GUARD_MS) return false\n try {\n sessionStorage.setItem(CHUNK_RELOAD_KEY, String(now))\n } catch {\n // Without the guard we can't tell a loop from a stale build: don't risk one.\n return false\n }\n return true\n}\n\nfunction guardHot(): boolean {\n try {\n const last = Number(sessionStorage.getItem(CHUNK_RELOAD_KEY)) || 0\n return !!last && deps.now() - last < RELOAD_GUARD_MS\n } catch {\n return false\n }\n}\n\nfunction settle(): void {\n stale = false\n reloadWanted = false\n if (idleTimer !== undefined) clearInterval(idleTimer)\n idleTimer = undefined\n restoreNavigation?.()\n restoreNavigation = null\n}\n\nfunction reloadNow(): boolean {\n if (!claimReload()) {\n settle()\n return false\n }\n settle()\n deps.reload()\n return true\n}\n\n/** A client-side navigation to `url` becomes a full page load of it while the build is stale. */\nfunction loadsFresh(url: string | URL | null | undefined): string | null {\n if (!stale || url == null) return null\n const target = new URL(String(url), window.location.href)\n if (target.pathname === window.location.pathname) return null\n // Leaving a sign-in page establishes the session: a full load there races its persistence.\n if (document.querySelector(GUARD_SELECTOR)) return null\n return target.href\n}\n\nfunction interceptNavigation(): void {\n if (restoreNavigation) return\n const history = window.history\n const push = history.pushState\n const replace = history.replaceState\n let shownPath = window.location.pathname\n const wrap = (original: History['pushState'], replaceEntry: boolean): History['pushState'] =>\n function (this: History, data, unused, url) {\n const target = loadsFresh(url)\n if (target && claimReload()) {\n settle()\n deps.load(target, replaceEntry)\n return\n }\n original.call(this, data, unused, url)\n shownPath = window.location.pathname\n }\n history.pushState = wrap(push, false)\n history.replaceState = wrap(replace, true)\n // Back/forward already changed the address: reloading loads that target.\n const onPopState = () => {\n if (window.location.pathname === shownPath) return\n shownPath = window.location.pathname\n if (!document.querySelector(GUARD_SELECTOR)) reloadNow()\n }\n window.addEventListener('popstate', onPopState)\n restoreNavigation = () => {\n history.pushState = push\n history.replaceState = replace\n window.removeEventListener('popstate', onPopState)\n }\n}\n\nfunction watchForIdle(): void {\n if (idleTimer !== undefined) return\n idleTimer = setInterval(() => {\n if (!reloadWanted) return\n const idle = document.visibilityState === 'hidden' || deps.now() - lastActivity >= IDLE_MS\n if (idle && !hasUnsavedInput()) reloadNow()\n }, IDLE_CHECK_MS)\n}\n\n/**\n * The running build is out of date (a chunk 404'd, or a new service worker took over): the next\n * route navigation loads its target fresh instead of rendering it client-side.\n */\nexport function markBuildStale(): void {\n stale = true\n interceptNavigation()\n}\n\nexport type ReloadOutcome = 'reloaded' | 'deferred' | 'guarded'\n\n/**\n * Reload onto the current build when nothing would be lost; otherwise defer to the next route\n * navigation or to the moment the user is idle with nothing unsaved. `guarded` means a policy\n * reload just happened in this tab, so the failure should surface instead.\n */\nexport function requestReload(): ReloadOutcome {\n if (guardHot()) return 'guarded'\n if (!hasUnsavedInput()) return reloadNow() ? 'reloaded' : 'guarded'\n reloadWanted = true\n markBuildStale()\n watchForIdle()\n return 'deferred'\n}\n\n/**\n * Load a chunk ahead of need (warming a route the user may open next). Never rejects, and a\n * failure never reloads the page: it only marks the build stale so the next navigation loads\n * fresh.\n */\nexport function prefetchChunk(load: () => Promise<unknown>): Promise<void> {\n let loading: Promise<unknown>\n try {\n loading = load()\n } catch (error) {\n loading = Promise.reject(error)\n }\n return loading.then(\n () => undefined,\n (error: unknown) => {\n if (typeof error === 'object' && error !== null) prefetchFailures.add(error)\n }\n )\n}\n\nfunction decide(payload: unknown): void {\n const prefetch = typeof payload === 'object' && payload !== null && prefetchFailures.has(payload)\n // Offline the chunk simply couldn't be downloaded (it isn't cached yet). Reloading can't fix\n // that and would throw away what's on screen; say what happened instead, and let the failed\n // import reach the nearest error boundary as usual.\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n if (!prefetch) {\n notify.warning(\"This part of ARBI isn't available offline yet\", {\n description: 'Reconnect to open it. Once you have, it will work offline too.',\n })\n }\n return\n }\n markBuildStale()\n if (prefetch) return\n const outcome = requestReload()\n console.warn(`[chunk] A code chunk failed to load (stale build?): ${outcome}`, payload)\n}\n\n/**\n * The `vite:preloadError` handler. Decides once the failed import's own handlers have run, so a\n * `prefetchChunk` failure is known as one. Never cancels the event: the import rejects as usual\n * and, if a reload follows, the page is replaced anyway.\n */\nexport function handleChunkLoadError(event: Event): void {\n const payload = (event as Event & { payload?: unknown }).payload\n setTimeout(() => decide(payload), 0)\n}\n\nfunction onActivity(event: Event): void {\n lastActivity = deps.now()\n if (event.type === 'input' && event.target instanceof Element && isTextField(event.target)) {\n edited.add(event.target)\n }\n}\n\nconst ACTIVITY_EVENTS = ['input', 'keydown', 'pointerdown', 'wheel', 'touchstart'] as const\n\n/** Install the reload policy. Call once at startup; later calls are no-ops. */\nexport function installReloadPolicy(overrides: Partial<ReloadPolicyDeps> = {}): void {\n deps = { ...browserDeps, ...overrides }\n if (installed || typeof window === 'undefined') return\n installed = true\n lastActivity = deps.now()\n window.addEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) {\n document.addEventListener(type, onActivity, { capture: true, passive: true })\n }\n}\n\n/** Undo `installReloadPolicy` and forget all state (tests). */\nexport function resetReloadPolicy(): void {\n settle()\n edited.clear()\n if (installed) {\n window.removeEventListener('vite:preloadError', handleChunkLoadError)\n for (const type of ACTIVITY_EVENTS) document.removeEventListener(type, onActivity, true)\n }\n installed = false\n deps = browserDeps\n}\n"]}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  'use strict';
3
3
 
4
- var chunk7OPOPYV6_cjs = require('./chunk-7OPOPYV6.cjs');
4
+ var chunkM2FOXGJU_cjs = require('./chunk-M2FOXGJU.cjs');
5
+ var chunkH5OLHP2U_cjs = require('./chunk-H5OLHP2U.cjs');
5
6
  var chunkOAIOOVFN_cjs = require('./chunk-OAIOOVFN.cjs');
6
7
  var chunk7IF3E3I2_cjs = require('./chunk-7IF3E3I2.cjs');
7
- var chunkM2FOXGJU_cjs = require('./chunk-M2FOXGJU.cjs');
8
8
  var chunkZBP4ZSAJ_cjs = require('./chunk-ZBP4ZSAJ.cjs');
9
9
  var chunkWGWP4ATS_cjs = require('./chunk-WGWP4ATS.cjs');
10
10
  var react$1 = require('react');
@@ -23,7 +23,7 @@ function TranscriptionToggle({
23
23
  if (!available || !canToggle) return null;
24
24
  const label = on ? "Stop transcription" : "Transcribe the call";
25
25
  return /* @__PURE__ */ jsxRuntime.jsxs(
26
- chunk7OPOPYV6_cjs.CallControlButton,
26
+ chunkH5OLHP2U_cjs.CallControlButton,
27
27
  {
28
28
  label,
29
29
  shortcut: "C",
@@ -54,7 +54,7 @@ function TranscriptionIndicator({
54
54
  }, [setIndicatorShown]);
55
55
  const by = startedByMe ? "you" : startedByName || "a participant";
56
56
  return /* @__PURE__ */ jsxRuntime.jsx(
57
- chunk7OPOPYV6_cjs.TranscriptionStatusChip,
57
+ chunkH5OLHP2U_cjs.TranscriptionStatusChip,
58
58
  {
59
59
  sentence: `Transcription on \u2014 started by ${by}`,
60
60
  short: muted ? "Transcribing \xB7 you are muted" : "Transcribing",
@@ -87,7 +87,7 @@ function CaptionsOverlay({
87
87
  })),
88
88
  [captions]
89
89
  );
90
- return /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.CaptionsStrip, { captions: entries, reserve, className });
90
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.CaptionsStrip, { captions: entries, reserve, className });
91
91
  }
92
92
  function TranscriptionSender({ transcription }) {
93
93
  const { isMicrophoneEnabled, microphoneTrack } = componentsReact.useLocalParticipant();
@@ -113,7 +113,7 @@ function RecordingControl({
113
113
  const canHost = react.useIsEntitled("host_calls");
114
114
  if (!available || !canControl || !on && !canHost) return null;
115
115
  return /* @__PURE__ */ jsxRuntime.jsx(
116
- chunk7OPOPYV6_cjs.RecordControl,
116
+ chunkH5OLHP2U_cjs.RecordControl,
117
117
  {
118
118
  on,
119
119
  busy,
@@ -177,7 +177,7 @@ function RecordingIndicator({
177
177
  }, [setIndicatorShown]);
178
178
  const by = startedByMe ? "you" : startedByName || "the host";
179
179
  return /* @__PURE__ */ jsxRuntime.jsx(
180
- chunk7OPOPYV6_cjs.RecordingStatusChip,
180
+ chunkH5OLHP2U_cjs.RecordingStatusChip,
181
181
  {
182
182
  sentence: `Recording${mode ? ` (${chunk7IF3E3I2_cjs.MODE_LABEL[mode]})` : ""} \u2014 started by ${by}`,
183
183
  compact,
@@ -247,7 +247,7 @@ function CompositeRecorder({
247
247
  if (!uploader || !stage) return;
248
248
  let capture;
249
249
  try {
250
- capture = chunk7OPOPYV6_cjs.startCompositeCapture(stage);
250
+ capture = chunkH5OLHP2U_cjs.startCompositeCapture(stage);
251
251
  } catch (err) {
252
252
  console.warn("[calls] cannot record the composite", err);
253
253
  notify("This browser cannot record the call video; audio is still recorded.", "warning");
@@ -300,9 +300,9 @@ function RoomMediaControl({
300
300
  const { devices, activeDeviceId, setActiveMediaDevice } = componentsReact.useMediaDeviceSelect({
301
301
  kind: mic ? "audioinput" : "videoinput"
302
302
  });
303
- const [mirror, setMirror] = chunk7OPOPYV6_cjs.useMirrorSelfView();
303
+ const [mirror, setMirror] = chunkH5OLHP2U_cjs.useMirrorSelfView();
304
304
  return /* @__PURE__ */ jsxRuntime.jsx(
305
- chunk7OPOPYV6_cjs.MediaControl,
305
+ chunkH5OLHP2U_cjs.MediaControl,
306
306
  {
307
307
  kind: mic ? "microphone" : "camera",
308
308
  enabled,
@@ -456,15 +456,15 @@ function CallControls({
456
456
  ] : []
457
457
  ];
458
458
  return /* @__PURE__ */ jsxRuntime.jsxs(
459
- chunk7OPOPYV6_cjs.CallControlBar,
459
+ chunkH5OLHP2U_cjs.CallControlBar,
460
460
  {
461
461
  shortcuts,
462
462
  left: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
463
- full && /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.ElapsedTime, { since: startedAt, title: "Time in this call" }),
463
+ full && /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.ElapsedTime, { since: startedAt, title: "Time in this call" }),
464
464
  /* @__PURE__ */ jsxRuntime.jsx(EnableAudioButton, { compact: !full })
465
465
  ] }),
466
466
  right: /* @__PURE__ */ jsxRuntime.jsx(
467
- chunk7OPOPYV6_cjs.LeaveButton,
467
+ chunkH5OLHP2U_cjs.LeaveButton,
468
468
  {
469
469
  compact: !full,
470
470
  onLeave: () => void room.disconnect(),
@@ -472,15 +472,15 @@ function CallControls({
472
472
  }
473
473
  ),
474
474
  children: [
475
- /* @__PURE__ */ jsxRuntime.jsxs(chunk7OPOPYV6_cjs.ControlGroup, { children: [
475
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkH5OLHP2U_cjs.ControlGroup, { children: [
476
476
  /* @__PURE__ */ jsxRuntime.jsx(RoomMediaControl, { source: livekitClient.Track.Source.Microphone, shortcut: "M", testId: "call-mic-toggle" }),
477
477
  /* @__PURE__ */ jsxRuntime.jsx(RoomMediaControl, { source: livekitClient.Track.Source.Camera, shortcut: "V", testId: "call-camera-toggle" })
478
478
  ] }),
479
479
  !tiny && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
480
- /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.ControlDivider, {}),
481
- /* @__PURE__ */ jsxRuntime.jsxs(chunk7OPOPYV6_cjs.ControlGroup, { children: [
480
+ /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.ControlDivider, {}),
481
+ /* @__PURE__ */ jsxRuntime.jsxs(chunkH5OLHP2U_cjs.ControlGroup, { children: [
482
482
  full && /* @__PURE__ */ jsxRuntime.jsx(
483
- chunk7OPOPYV6_cjs.CallControlButton,
483
+ chunkH5OLHP2U_cjs.CallControlButton,
484
484
  {
485
485
  label: share.enabled ? "Stop sharing" : "Share your screen",
486
486
  tone: share.enabled ? "active" : "neutral",
@@ -496,7 +496,7 @@ function CallControls({
496
496
  ] })
497
497
  ] }),
498
498
  /* @__PURE__ */ jsxRuntime.jsx(
499
- chunk7OPOPYV6_cjs.MoreMenu,
499
+ chunkH5OLHP2U_cjs.MoreMenu,
500
500
  {
501
501
  details: experimental ? /* @__PURE__ */ jsxRuntime.jsxs(
502
502
  "span",
@@ -551,7 +551,7 @@ function WebinarChat({ chat }) {
551
551
  /* @__PURE__ */ jsxRuntime.jsx("div", { ref: end })
552
552
  ] }),
553
553
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0 border-t border-border p-3", children: /* @__PURE__ */ jsxRuntime.jsx(
554
- chunk7OPOPYV6_cjs.PanelComposer,
554
+ chunkH5OLHP2U_cjs.PanelComposer,
555
555
  {
556
556
  placeholder: "Message everyone",
557
557
  ariaLabel: "Message everyone",
@@ -613,7 +613,7 @@ function WebinarQA({ webinar }) {
613
613
  [webinar.questions]
614
614
  );
615
615
  return /* @__PURE__ */ jsxRuntime.jsx(
616
- chunk7OPOPYV6_cjs.QAPanel,
616
+ chunkH5OLHP2U_cjs.QAPanel,
617
617
  {
618
618
  questions,
619
619
  team: webinar.team,
@@ -633,7 +633,7 @@ function WebinarAudience({ webinar }) {
633
633
  return () => clearInterval(id);
634
634
  }, [refresh]);
635
635
  return /* @__PURE__ */ jsxRuntime.jsx(
636
- chunk7OPOPYV6_cjs.WebinarAudiencePanel,
636
+ chunkH5OLHP2U_cjs.WebinarAudiencePanel,
637
637
  {
638
638
  className: "min-h-0 flex-1 overflow-y-auto",
639
639
  hands: webinar.hands.map((h) => ({
@@ -667,7 +667,7 @@ function WebinarSidePanel({
667
667
  const tabs = webinarTabs(webinar, { people: !!people, unreadChat: chat.unread });
668
668
  const current = tabs.some((t) => t.id === tab) ? tab : tabs[0].id;
669
669
  return /* @__PURE__ */ jsxRuntime.jsxs(
670
- chunk7OPOPYV6_cjs.CallSidePanel,
670
+ chunkH5OLHP2U_cjs.CallSidePanel,
671
671
  {
672
672
  title: "Webinar",
673
673
  tabs,
@@ -720,7 +720,7 @@ function ConnectedCallRoom({
720
720
  ] });
721
721
  }
722
722
  if (!room) {
723
- return /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.CallStateMessage, { title: "Connecting\u2026", testId: "call-connecting" });
723
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.CallStateMessage, { title: "Connecting\u2026", testId: "call-connecting" });
724
724
  }
725
725
  return /* @__PURE__ */ jsxRuntime.jsxs(
726
726
  componentsReact.LiveKitRoom,
@@ -844,7 +844,7 @@ function CallBody({
844
844
  const [endConfirm, setEndConfirm] = react$1.useState(false);
845
845
  const [viewerSide, setViewerSide] = react$1.useState(null);
846
846
  const [tab, setTab] = react$1.useState("people");
847
- const [frameRef, frame] = chunk7OPOPYV6_cjs.useElementSize();
847
+ const [frameRef, frame] = chunkH5OLHP2U_cjs.useElementSize();
848
848
  const viewerSideOpen = viewerSide ?? frame.width >= VIEWER_SIDE_DOCKS_AT;
849
849
  const sideOpen = audienceView ? viewerSideOpen : teamPanelOpen;
850
850
  const chat = calls.useInCallChat({
@@ -871,9 +871,9 @@ function CallBody({
871
871
  const drawsComposite = recording.on && recording.canControl && recording.mode === "audio_video";
872
872
  const density = frame.width === 0 || frame.width >= 620 ? "full" : frame.width >= 400 ? "compact" : "tiny";
873
873
  const shortPanel = frame.height > 0 && frame.height < 520;
874
- const [mirrorSelf] = chunk7OPOPYV6_cjs.useMirrorSelfView();
874
+ const [mirrorSelf] = chunkH5OLHP2U_cjs.useMirrorSelfView();
875
875
  const status = (small) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
876
- webinar.enabled && webinar.live && /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.WebinarLiveChip, { compact: small }),
876
+ webinar.enabled && webinar.live && /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.WebinarLiveChip, { compact: small }),
877
877
  /* @__PURE__ */ jsxRuntime.jsx(
878
878
  StatusChips,
879
879
  {
@@ -885,7 +885,7 @@ function CallBody({
885
885
  )
886
886
  ] });
887
887
  const header = !minimized && /* @__PURE__ */ jsxRuntime.jsx(
888
- chunk7OPOPYV6_cjs.CallHeader,
888
+ chunkH5OLHP2U_cjs.CallHeader,
889
889
  {
890
890
  title,
891
891
  status,
@@ -921,9 +921,9 @@ function CallBody({
921
921
  sendsMedia && /* @__PURE__ */ jsxRuntime.jsx(SpeakerRecorder, { recording, callKey: e2eeKey }),
922
922
  recording.canControl && recording.mode === "audio_video" && /* @__PURE__ */ jsxRuntime.jsx(CompositeRecorder, { recording, callKey: e2eeKey, stageRef }),
923
923
  /* @__PURE__ */ jsxRuntime.jsx(RecordingQuotaWarning, { recording }),
924
- webinar.moderator && /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.WebinarEndConfirm, { open: endConfirm, onOpenChange: setEndConfirm, onEnd: webinar.end }),
924
+ webinar.moderator && /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.WebinarEndConfirm, { open: endConfirm, onOpenChange: setEndConfirm, onEnd: webinar.end }),
925
925
  webinar.stageCheck && /* @__PURE__ */ jsxRuntime.jsx(
926
- chunk7OPOPYV6_cjs.OnStageCheck,
926
+ chunkH5OLHP2U_cjs.OnStageCheck,
927
927
  {
928
928
  initialChoices: react.DEFAULT_JOIN_CHOICES,
929
929
  open: true,
@@ -946,7 +946,7 @@ function CallBody({
946
946
  inert: minimized || void 0,
947
947
  "data-testid": "call-stage-frame",
948
948
  children: audienceView ? /* @__PURE__ */ jsxRuntime.jsx(
949
- chunk7OPOPYV6_cjs.WebinarViewer,
949
+ chunkH5OLHP2U_cjs.WebinarViewer,
950
950
  {
951
951
  header,
952
952
  stage: /* @__PURE__ */ jsxRuntime.jsx(CallTiles, { view: "speaker", includeLocal: false }),
@@ -970,14 +970,14 @@ function CallBody({
970
970
  shortcuts: !minimized
971
971
  }
972
972
  ) : /* @__PURE__ */ jsxRuntime.jsx(
973
- chunk7OPOPYV6_cjs.CallStageFrame,
973
+ chunkH5OLHP2U_cjs.CallStageFrame,
974
974
  {
975
975
  stageRef,
976
976
  header,
977
977
  subheader: !minimized && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
978
- webinar.team && !webinar.live && /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.BackstageBanner, { onGoLive: webinar.moderator ? webinar.goLive : void 0 }),
979
- notices.map((n) => /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.CallNotice, { children: n }, n)),
980
- /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.SpeakingNow, { names: speakingNames })
978
+ webinar.team && !webinar.live && /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.BackstageBanner, { onGoLive: webinar.moderator ? webinar.goLive : void 0 }),
979
+ notices.map((n) => /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.CallNotice, { children: n }, n)),
980
+ /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.SpeakingNow, { names: speakingNames })
981
981
  ] }),
982
982
  stage: /* @__PURE__ */ jsxRuntime.jsx(CallTiles, { view }),
983
983
  stageOverlay: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -1059,7 +1059,7 @@ function webinarControls(webinar, opts) {
1059
1059
  ];
1060
1060
  return {
1061
1061
  menuGroups: [
1062
- ...webinar.moderator ? [chunk7OPOPYV6_cjs.chatPermissionSection({ value: webinar.chat, onChange: webinar.setChat })] : [],
1062
+ ...webinar.moderator ? [chunkH5OLHP2U_cjs.chatPermissionSection({ value: webinar.chat, onChange: webinar.setChat })] : [],
1063
1063
  items
1064
1064
  ],
1065
1065
  leaveOptions: webinar.moderator && webinar.live ? [
@@ -1120,7 +1120,7 @@ function StatusChips({
1120
1120
  recording.on && /* @__PURE__ */ jsxRuntime.jsx(RecordingIndicator, { recording, compact, announce: false }),
1121
1121
  transcription.on && /* @__PURE__ */ jsxRuntime.jsx(TranscriptionIndicator, { transcription, compact, announce: false }),
1122
1122
  /* @__PURE__ */ jsxRuntime.jsx(
1123
- chunk7OPOPYV6_cjs.EncryptionStatusChip,
1123
+ chunkH5OLHP2U_cjs.EncryptionStatusChip,
1124
1124
  {
1125
1125
  state: isE2ee ? encrypted ? "on" : "pending" : "off",
1126
1126
  compact
@@ -1143,9 +1143,9 @@ function RoomTile({
1143
1143
  const { quality } = componentsReact.useConnectionQualityIndicator({ participant });
1144
1144
  const hasVideo = componentsReact.isTrackReference(trackRef) && !!trackRef.publication.track && !videoMuted;
1145
1145
  const name = participant.name || participant.identity;
1146
- const [mirrorSelf] = chunk7OPOPYV6_cjs.useMirrorSelfView();
1146
+ const [mirrorSelf] = chunkH5OLHP2U_cjs.useMirrorSelfView();
1147
1147
  return /* @__PURE__ */ jsxRuntime.jsx(
1148
- chunk7OPOPYV6_cjs.CallTile,
1148
+ chunkH5OLHP2U_cjs.CallTile,
1149
1149
  {
1150
1150
  ...elementProps,
1151
1151
  name: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -1203,10 +1203,10 @@ function CallTiles({
1203
1203
  const spotlight = useSpotlightCamera(cameras);
1204
1204
  const focus = share ?? (view === "speaker" ? spotlight : void 0);
1205
1205
  if (!focus || cameras.length < 2 && !share) {
1206
- return /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.CallGrid, { items: cameras, getKey: trackKey, renderTile: (t) => /* @__PURE__ */ jsxRuntime.jsx(RoomTile, { trackRef: t }) });
1206
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.CallGrid, { items: cameras, getKey: trackKey, renderTile: (t) => /* @__PURE__ */ jsxRuntime.jsx(RoomTile, { trackRef: t }) });
1207
1207
  }
1208
1208
  return /* @__PURE__ */ jsxRuntime.jsx(
1209
- chunk7OPOPYV6_cjs.CallFocus,
1209
+ chunkH5OLHP2U_cjs.CallFocus,
1210
1210
  {
1211
1211
  focus,
1212
1212
  others: cameras.filter((t) => t !== focus),
@@ -1230,12 +1230,12 @@ function MinimisedRoom({
1230
1230
  const mic = componentsReact.useTrackToggle({ source: livekitClient.Track.Source.Microphone });
1231
1231
  const camera = componentsReact.useTrackToggle({ source: livekitClient.Track.Source.Camera });
1232
1232
  return /* @__PURE__ */ jsxRuntime.jsx(
1233
- chunk7OPOPYV6_cjs.MinimisedCall,
1233
+ chunkH5OLHP2U_cjs.MinimisedCall,
1234
1234
  {
1235
1235
  title,
1236
1236
  video: track ? /* @__PURE__ */ jsxRuntime.jsx(RoomTile, { trackRef: track, size: "sm" }) : null,
1237
1237
  status,
1238
- speaking: /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.SpeakingNow, { names: speakingNames, className: "text-xs" }),
1238
+ speaking: /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.SpeakingNow, { names: speakingNames, className: "text-xs" }),
1239
1239
  micEnabled: audience ? void 0 : mic.enabled,
1240
1240
  onToggleMic: audience ? void 0 : () => void mic.toggle(),
1241
1241
  cameraEnabled: audience ? void 0 : camera.enabled,
@@ -1284,7 +1284,7 @@ function ParticipantsList({
1284
1284
  ...participants.filter((p) => !speakingIds.includes(p.identity))
1285
1285
  ];
1286
1286
  return /* @__PURE__ */ jsxRuntime.jsx(
1287
- chunk7OPOPYV6_cjs.CallParticipants,
1287
+ chunkH5OLHP2U_cjs.CallParticipants,
1288
1288
  {
1289
1289
  className: compact ? void 0 : "flex-1",
1290
1290
  compact,
@@ -1320,7 +1320,7 @@ function Lobby({ callExtId }) {
1320
1320
  }
1321
1321
  };
1322
1322
  return /* @__PURE__ */ jsxRuntime.jsx(
1323
- chunk7OPOPYV6_cjs.LobbyRequests,
1323
+ chunkH5OLHP2U_cjs.LobbyRequests,
1324
1324
  {
1325
1325
  requests: mine.map((k) => ({
1326
1326
  id: k.knockId,
@@ -1335,9 +1335,9 @@ function ConnectingOverlay() {
1335
1335
  const state = componentsReact.useConnectionState();
1336
1336
  if (state === livekitClient.ConnectionState.Connected) return null;
1337
1337
  const label = state === livekitClient.ConnectionState.Reconnecting || state === livekitClient.ConnectionState.SignalReconnecting ? "Reconnecting\u2026" : state === livekitClient.ConnectionState.Disconnected ? "Disconnected" : "Connecting\u2026";
1338
- return /* @__PURE__ */ jsxRuntime.jsx(chunk7OPOPYV6_cjs.ConnectionOverlay, { label });
1338
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkH5OLHP2U_cjs.ConnectionOverlay, { label });
1339
1339
  }
1340
1340
 
1341
1341
  exports.ConnectedCallRoom = ConnectedCallRoom;
1342
- //# sourceMappingURL=chunk-M4TM3K52.cjs.map
1343
- //# sourceMappingURL=chunk-M4TM3K52.cjs.map
1342
+ //# sourceMappingURL=chunk-XCTQ6MLJ.cjs.map
1343
+ //# sourceMappingURL=chunk-XCTQ6MLJ.cjs.map