@arbidocs/blocks 0.5.91 → 0.5.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConnectedCallDock-PJE7EZ6T.js → ConnectedCallDock-H5ABOXNR.js} +13 -13
- package/dist/{ConnectedCallDock-PJE7EZ6T.js.map → ConnectedCallDock-H5ABOXNR.js.map} +1 -1
- package/dist/{ConnectedCallDock-ZRSZYSLO.cjs → ConnectedCallDock-XF56C2JA.cjs} +22 -22
- package/dist/{ConnectedCallDock-ZRSZYSLO.cjs.map → ConnectedCallDock-XF56C2JA.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-XK2RPNO6.cjs → ConnectedCallRoom-EEI2ZVTS.cjs} +14 -14
- package/dist/{ConnectedCallRoom-XK2RPNO6.cjs.map → ConnectedCallRoom-EEI2ZVTS.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-S7DO2MP6.js → ConnectedCallRoom-N6DUEV4S.js} +13 -13
- package/dist/{ConnectedCallRoom-S7DO2MP6.js.map → ConnectedCallRoom-N6DUEV4S.js.map} +1 -1
- package/dist/{ConnectedMailInviteCard-YYPLRL6G.js → ConnectedMailInviteCard-2TXUPVV7.js} +4 -4
- package/dist/{ConnectedMailInviteCard-YYPLRL6G.js.map → ConnectedMailInviteCard-2TXUPVV7.js.map} +1 -1
- package/dist/{ConnectedMailInviteCard-OBDYWUFM.cjs → ConnectedMailInviteCard-RSNELYZX.cjs} +5 -5
- package/dist/{ConnectedMailInviteCard-OBDYWUFM.cjs.map → ConnectedMailInviteCard-RSNELYZX.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-2RIERXLW.js → ConnectedNativeDocxComparison-P6GG3ODF.js} +18 -18
- package/dist/ConnectedNativeDocxComparison-P6GG3ODF.js.map +1 -0
- package/dist/{ConnectedNativeDocxComparison-46C7LYGT.cjs → ConnectedNativeDocxComparison-QHAV3K7N.cjs} +19 -19
- package/dist/ConnectedNativeDocxComparison-QHAV3K7N.cjs.map +1 -0
- package/dist/{ConnectedNativeDocxEditor-6XMB2XT7.cjs → ConnectedNativeDocxEditor-6HQD3MHT.cjs} +19 -19
- package/dist/ConnectedNativeDocxEditor-6HQD3MHT.cjs.map +1 -0
- package/dist/{ConnectedNativeDocxEditor-K6X63CPL.js → ConnectedNativeDocxEditor-CWDRJHXN.js} +17 -17
- package/dist/ConnectedNativeDocxEditor-CWDRJHXN.js.map +1 -0
- package/dist/{ConnectedProductionSetDialog-JXQLGDIH.js → ConnectedProductionSetDialog-2SM3ZNBF.js} +3 -3
- package/dist/{ConnectedProductionSetDialog-JXQLGDIH.js.map → ConnectedProductionSetDialog-2SM3ZNBF.js.map} +1 -1
- package/dist/{ConnectedProductionSetDialog-T3Q32XPJ.cjs → ConnectedProductionSetDialog-XNGMUGB6.cjs} +3 -3
- package/dist/{ConnectedProductionSetDialog-T3Q32XPJ.cjs.map → ConnectedProductionSetDialog-XNGMUGB6.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-6UMLSR3G.js → ConnectedStreamedWordArtifact-4SU4FVZE.js} +18 -18
- package/dist/ConnectedStreamedWordArtifact-4SU4FVZE.js.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-GFFLCGF7.cjs → ConnectedStreamedWordArtifact-5V7VRTEY.cjs} +19 -19
- package/dist/ConnectedStreamedWordArtifact-5V7VRTEY.cjs.map +1 -0
- package/dist/{DocumentReviewCard-SAKLHM4Y.js → DocumentReviewCard-LP33IGEL.js} +18 -18
- package/dist/{DocumentReviewCard-SAKLHM4Y.js.map → DocumentReviewCard-LP33IGEL.js.map} +1 -1
- package/dist/{DocumentReviewCard-XGYMO5YS.cjs → DocumentReviewCard-QV3CM7YP.cjs} +23 -23
- package/dist/{DocumentReviewCard-XGYMO5YS.cjs.map → DocumentReviewCard-QV3CM7YP.cjs.map} +1 -1
- package/dist/{FilesViewerDialog-HNBRY7RQ.js → FilesViewerDialog-FZYXO3MS.js} +29 -29
- package/dist/{FilesViewerDialog-HNBRY7RQ.js.map → FilesViewerDialog-FZYXO3MS.js.map} +1 -1
- package/dist/{FilesViewerDialog-3C6JUMVS.cjs → FilesViewerDialog-JKNA25Q3.cjs} +31 -31
- package/dist/{FilesViewerDialog-3C6JUMVS.cjs.map → FilesViewerDialog-JKNA25Q3.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-DFN4WGRI.js → WorkspaceTableView-IFXCT6AJ.js} +10 -10
- package/dist/{WorkspaceTableView-DFN4WGRI.js.map → WorkspaceTableView-IFXCT6AJ.js.map} +1 -1
- package/dist/{WorkspaceTableView-UOP3EB2F.cjs → WorkspaceTableView-PZVCHSOP.cjs} +12 -12
- package/dist/{WorkspaceTableView-UOP3EB2F.cjs.map → WorkspaceTableView-PZVCHSOP.cjs.map} +1 -1
- package/dist/agents/index.cjs +353 -353
- package/dist/agents/index.js +14 -14
- package/dist/calendar/index.cjs +116 -116
- package/dist/calendar/index.js +1 -1
- package/dist/calls/index.cjs +154 -154
- package/dist/calls/index.js +13 -13
- package/dist/chat/index.cjs +18 -18
- package/dist/chat/index.js +2 -2
- package/dist/{chunk-B7RAN4DM.js → chunk-26RAAEFP.js} +3 -3
- package/dist/{chunk-B7RAN4DM.js.map → chunk-26RAAEFP.js.map} +1 -1
- package/dist/{chunk-GUGSUCIK.js → chunk-2A5QNDV2.js} +3 -3
- package/dist/{chunk-GUGSUCIK.js.map → chunk-2A5QNDV2.js.map} +1 -1
- package/dist/{chunk-WWMVVAA5.js → chunk-2AEWXS4X.js} +8 -8
- package/dist/{chunk-WWMVVAA5.js.map → chunk-2AEWXS4X.js.map} +1 -1
- package/dist/{chunk-HMS3GRMI.cjs → chunk-2Q7LETQX.cjs} +6 -6
- package/dist/{chunk-HMS3GRMI.cjs.map → chunk-2Q7LETQX.cjs.map} +1 -1
- package/dist/{chunk-OZS7THEB.js → chunk-2RDH5PVJ.js} +3 -3
- package/dist/{chunk-OZS7THEB.js.map → chunk-2RDH5PVJ.js.map} +1 -1
- package/dist/{chunk-6XOHTWDR.cjs → chunk-2XTU5H2U.cjs} +69 -69
- package/dist/{chunk-6XOHTWDR.cjs.map → chunk-2XTU5H2U.cjs.map} +1 -1
- package/dist/{chunk-JIFXHVO4.js → chunk-3BSFHBHY.js} +4 -4
- package/dist/{chunk-JIFXHVO4.js.map → chunk-3BSFHBHY.js.map} +1 -1
- package/dist/{chunk-SK6BAW7L.js → chunk-46IG4KY7.js} +103 -104
- package/dist/chunk-46IG4KY7.js.map +1 -0
- package/dist/{chunk-BLAWERIU.cjs → chunk-4P553YX2.cjs} +36 -36
- package/dist/{chunk-BLAWERIU.cjs.map → chunk-4P553YX2.cjs.map} +1 -1
- package/dist/{chunk-UAF2J7P7.cjs → chunk-5HEMXXHR.cjs} +103 -104
- package/dist/chunk-5HEMXXHR.cjs.map +1 -0
- package/dist/{chunk-A4MBPDLX.cjs → chunk-5S52732U.cjs} +6 -6
- package/dist/{chunk-A4MBPDLX.cjs.map → chunk-5S52732U.cjs.map} +1 -1
- package/dist/{chunk-4RFNQRUD.js → chunk-5SUIQS75.js} +16 -16
- package/dist/{chunk-4RFNQRUD.js.map → chunk-5SUIQS75.js.map} +1 -1
- package/dist/{chunk-Y2FPWPDB.js → chunk-5XB3H2TJ.js} +3 -3
- package/dist/{chunk-Y2FPWPDB.js.map → chunk-5XB3H2TJ.js.map} +1 -1
- package/dist/{chunk-NZQZ2HFU.cjs → chunk-64KZM3RZ.cjs} +3 -3
- package/dist/{chunk-NZQZ2HFU.cjs.map → chunk-64KZM3RZ.cjs.map} +1 -1
- package/dist/{chunk-YIJ4MFYM.js → chunk-6U6IY7DB.js} +3 -3
- package/dist/{chunk-YIJ4MFYM.js.map → chunk-6U6IY7DB.js.map} +1 -1
- package/dist/{chunk-K6UKLIRR.js → chunk-AS3HX7LL.js} +3 -3
- package/dist/{chunk-K6UKLIRR.js.map → chunk-AS3HX7LL.js.map} +1 -1
- package/dist/{chunk-LBRJA4ZJ.cjs → chunk-AZVKR4JO.cjs} +3 -3
- package/dist/{chunk-LBRJA4ZJ.cjs.map → chunk-AZVKR4JO.cjs.map} +1 -1
- package/dist/{chunk-RIBQCTBQ.js → chunk-B2NHC2KC.js} +3 -3
- package/dist/{chunk-RIBQCTBQ.js.map → chunk-B2NHC2KC.js.map} +1 -1
- package/dist/{chunk-IXA534S4.js → chunk-BCYFZIG6.js} +13 -13
- package/dist/{chunk-IXA534S4.js.map → chunk-BCYFZIG6.js.map} +1 -1
- package/dist/{chunk-VJLW3UPL.cjs → chunk-BDTPWXUW.cjs} +7 -7
- package/dist/{chunk-VJLW3UPL.cjs.map → chunk-BDTPWXUW.cjs.map} +1 -1
- package/dist/{chunk-EXZPKMMP.js → chunk-BSTVTI5G.js} +14 -14
- package/dist/{chunk-EXZPKMMP.js.map → chunk-BSTVTI5G.js.map} +1 -1
- package/dist/{chunk-OTODKLR3.cjs → chunk-C5CWKZ5D.cjs} +3 -3
- package/dist/{chunk-OTODKLR3.cjs.map → chunk-C5CWKZ5D.cjs.map} +1 -1
- package/dist/{chunk-LPGBRMYS.js → chunk-CHQMVIHR.js} +36 -36
- package/dist/chunk-CHQMVIHR.js.map +1 -0
- package/dist/{chunk-Z6NX57CU.js → chunk-CPOFZYKH.js} +4 -4
- package/dist/{chunk-Z6NX57CU.js.map → chunk-CPOFZYKH.js.map} +1 -1
- package/dist/{chunk-Q4ORI364.cjs → chunk-DBGN4M4F.cjs} +19 -19
- package/dist/{chunk-Q4ORI364.cjs.map → chunk-DBGN4M4F.cjs.map} +1 -1
- package/dist/{chunk-3TECBO75.cjs → chunk-DCYVHUSU.cjs} +54 -54
- package/dist/{chunk-3TECBO75.cjs.map → chunk-DCYVHUSU.cjs.map} +1 -1
- package/dist/{chunk-PZXEXHKB.cjs → chunk-DIE5ENQC.cjs} +28 -28
- package/dist/{chunk-PZXEXHKB.cjs.map → chunk-DIE5ENQC.cjs.map} +1 -1
- package/dist/{chunk-TVLY7FTU.js → chunk-DW7LSBIW.js} +3 -3
- package/dist/{chunk-TVLY7FTU.js.map → chunk-DW7LSBIW.js.map} +1 -1
- package/dist/{chunk-RCOJ7JG5.cjs → chunk-EBNY3RTL.cjs} +4 -4
- package/dist/{chunk-RCOJ7JG5.cjs.map → chunk-EBNY3RTL.cjs.map} +1 -1
- package/dist/{chunk-FEBLYTME.js → chunk-ER36PSS7.js} +5 -5
- package/dist/{chunk-FEBLYTME.js.map → chunk-ER36PSS7.js.map} +1 -1
- package/dist/{chunk-VIRQYEFL.cjs → chunk-F5T4W2R2.cjs} +140 -140
- package/dist/chunk-F5T4W2R2.cjs.map +1 -0
- package/dist/{chunk-RQNNHO44.cjs → chunk-GE2O6S44.cjs} +4 -4
- package/dist/{chunk-RQNNHO44.cjs.map → chunk-GE2O6S44.cjs.map} +1 -1
- package/dist/{chunk-4UMSQ67B.js → chunk-H57PBOFE.js} +3 -3
- package/dist/{chunk-4UMSQ67B.js.map → chunk-H57PBOFE.js.map} +1 -1
- package/dist/{chunk-7OPOPYV6.cjs → chunk-H5OLHP2U.cjs} +3 -3
- package/dist/{chunk-7OPOPYV6.cjs.map → chunk-H5OLHP2U.cjs.map} +1 -1
- package/dist/{chunk-VK5Q5JXU.cjs → chunk-HDPT7D6F.cjs} +3 -3
- package/dist/{chunk-VK5Q5JXU.cjs.map → chunk-HDPT7D6F.cjs.map} +1 -1
- package/dist/{chunk-HU7MB33Q.js → chunk-HLVLPDDD.js} +3 -3
- package/dist/{chunk-HU7MB33Q.js.map → chunk-HLVLPDDD.js.map} +1 -1
- package/dist/{chunk-CLPDKHSP.cjs → chunk-HYDIQEDT.cjs} +12 -12
- package/dist/{chunk-CLPDKHSP.cjs.map → chunk-HYDIQEDT.cjs.map} +1 -1
- package/dist/{chunk-HUE76NAI.cjs → chunk-I6SPGHFY.cjs} +2 -2
- package/dist/{chunk-HUE76NAI.cjs.map → chunk-I6SPGHFY.cjs.map} +1 -1
- package/dist/{chunk-M6XUGXCY.cjs → chunk-IHJ7BEI5.cjs} +741 -741
- package/dist/chunk-IHJ7BEI5.cjs.map +1 -0
- package/dist/{chunk-WLQAD6ZY.js → chunk-IL6OWGAU.js} +744 -744
- package/dist/chunk-IL6OWGAU.js.map +1 -0
- package/dist/{chunk-KXRGVY3M.cjs → chunk-ILLWGL7Q.cjs} +4 -4
- package/dist/{chunk-KXRGVY3M.cjs.map → chunk-ILLWGL7Q.cjs.map} +1 -1
- package/dist/{chunk-WFNEZT7S.cjs → chunk-IOCEKN44.cjs} +4 -4
- package/dist/{chunk-WFNEZT7S.cjs.map → chunk-IOCEKN44.cjs.map} +1 -1
- package/dist/{chunk-MFEJKCCZ.js → chunk-JGA2JJEL.js} +3 -3
- package/dist/{chunk-MFEJKCCZ.js.map → chunk-JGA2JJEL.js.map} +1 -1
- package/dist/{chunk-UCQ3VXRB.js → chunk-JM7Z3QNS.js} +5 -5
- package/dist/{chunk-UCQ3VXRB.js.map → chunk-JM7Z3QNS.js.map} +1 -1
- package/dist/{chunk-3KNKAZ5D.cjs → chunk-K3C4WECV.cjs} +5 -5
- package/dist/{chunk-3KNKAZ5D.cjs.map → chunk-K3C4WECV.cjs.map} +1 -1
- package/dist/{chunk-DGG35TPO.cjs → chunk-KB2FH26M.cjs} +4 -4
- package/dist/{chunk-DGG35TPO.cjs.map → chunk-KB2FH26M.cjs.map} +1 -1
- package/dist/{chunk-MB3IQLNN.cjs → chunk-L4USMBHU.cjs} +18 -18
- package/dist/chunk-L4USMBHU.cjs.map +1 -0
- package/dist/{chunk-XIEX3HO3.js → chunk-L4YGZJYR.js} +3 -3
- package/dist/{chunk-XIEX3HO3.js.map → chunk-L4YGZJYR.js.map} +1 -1
- package/dist/{chunk-KNC77LZZ.cjs → chunk-LMOLE5PS.cjs} +3 -3
- package/dist/{chunk-KNC77LZZ.cjs.map → chunk-LMOLE5PS.cjs.map} +1 -1
- package/dist/{chunk-PYLG3M6G.js → chunk-LTRFQ2IC.js} +2 -2
- package/dist/{chunk-PYLG3M6G.js.map → chunk-LTRFQ2IC.js.map} +1 -1
- package/dist/{chunk-636KUL53.js → chunk-NSJUMOLN.js} +5 -5
- package/dist/{chunk-636KUL53.js.map → chunk-NSJUMOLN.js.map} +1 -1
- package/dist/{chunk-7SJXYEZI.cjs → chunk-OAIOOVFN.cjs} +36 -36
- package/dist/chunk-OAIOOVFN.cjs.map +1 -0
- package/dist/{chunk-FKPFKSDT.js → chunk-PA2I7GLY.js} +6 -6
- package/dist/{chunk-FKPFKSDT.js.map → chunk-PA2I7GLY.js.map} +1 -1
- package/dist/{chunk-4KARJ4CC.js → chunk-PCAWLVHE.js} +3 -3
- package/dist/{chunk-4KARJ4CC.js.map → chunk-PCAWLVHE.js.map} +1 -1
- package/dist/{chunk-7QDLONHA.js → chunk-PPFTNP6J.js} +11 -11
- package/dist/chunk-PPFTNP6J.js.map +1 -0
- package/dist/{chunk-2FPBFLOX.cjs → chunk-Q4X5RK4A.cjs} +9 -3
- package/dist/chunk-Q4X5RK4A.cjs.map +1 -0
- package/dist/{chunk-4VUKYB32.cjs → chunk-Q5TOUT2C.cjs} +4 -4
- package/dist/{chunk-4VUKYB32.cjs.map → chunk-Q5TOUT2C.cjs.map} +1 -1
- package/dist/{chunk-DU3H4WC6.cjs → chunk-QIEUKIBH.cjs} +4 -4
- package/dist/{chunk-DU3H4WC6.cjs.map → chunk-QIEUKIBH.cjs.map} +1 -1
- package/dist/{chunk-5YBH5CQD.cjs → chunk-QJNHVQUQ.cjs} +26 -26
- package/dist/{chunk-5YBH5CQD.cjs.map → chunk-QJNHVQUQ.cjs.map} +1 -1
- package/dist/{chunk-C33VIPE2.js → chunk-QZ6XGYGW.js} +9 -3
- package/dist/chunk-QZ6XGYGW.js.map +1 -0
- package/dist/{chunk-YRVE6RX5.cjs → chunk-RB6MAAS7.cjs} +4 -4
- package/dist/{chunk-YRVE6RX5.cjs.map → chunk-RB6MAAS7.cjs.map} +1 -1
- package/dist/{chunk-KPD7WAXP.js → chunk-S6QBLVPP.js} +3 -3
- package/dist/{chunk-KPD7WAXP.js.map → chunk-S6QBLVPP.js.map} +1 -1
- package/dist/{chunk-TIQZ7CXZ.js → chunk-SOLSDXOZ.js} +83 -83
- package/dist/chunk-SOLSDXOZ.js.map +1 -0
- package/dist/{chunk-ZZE3ORJS.js → chunk-SOZIHPO2.js} +3 -3
- package/dist/{chunk-ZZE3ORJS.js.map → chunk-SOZIHPO2.js.map} +1 -1
- package/dist/{chunk-TSP5JJ56.js → chunk-VUXWBUZ7.js} +11 -11
- package/dist/{chunk-TSP5JJ56.js.map → chunk-VUXWBUZ7.js.map} +1 -1
- package/dist/{chunk-NZ26UYEQ.cjs → chunk-VWX36C4Y.cjs} +67 -67
- package/dist/{chunk-NZ26UYEQ.cjs.map → chunk-VWX36C4Y.cjs.map} +1 -1
- package/dist/{chunk-YACOI5ZU.cjs → chunk-WA2U4G43.cjs} +62 -62
- package/dist/{chunk-YACOI5ZU.cjs.map → chunk-WA2U4G43.cjs.map} +1 -1
- package/dist/{chunk-PSJAFPMH.js → chunk-WLWZAS7J.js} +4 -4
- package/dist/{chunk-PSJAFPMH.js.map → chunk-WLWZAS7J.js.map} +1 -1
- package/dist/{chunk-GNKQVCMW.cjs → chunk-WVEYUH6C.cjs} +6 -6
- package/dist/{chunk-GNKQVCMW.cjs.map → chunk-WVEYUH6C.cjs.map} +1 -1
- package/dist/{chunk-2F65OOU3.js → chunk-YB2P5Y52.js} +7 -7
- package/dist/{chunk-2F65OOU3.js.map → chunk-YB2P5Y52.js.map} +1 -1
- package/dist/collaboration/index.cjs +1 -1
- package/dist/collaboration/index.js +1 -1
- package/dist/connect/docx.cjs +22 -22
- package/dist/connect/docx.js +18 -18
- package/dist/connect/index.cjs +1176 -1176
- package/dist/connect/index.js +87 -87
- package/dist/connect/viewer.cjs +28 -28
- package/dist/connect/viewer.js +27 -27
- package/dist/dashboards/index.cjs +1 -1
- package/dist/dashboards/index.js +1 -1
- package/dist/embed/index.cjs +42 -42
- package/dist/embed/index.js +36 -36
- package/dist/facts/index.cjs +44 -44
- package/dist/facts/index.js +3 -3
- package/dist/files/index.cjs +226 -226
- package/dist/files/index.js +5 -5
- package/dist/index.cjs +1631 -1631
- package/dist/index.js +47 -47
- package/dist/settings/index.cjs +153 -153
- package/dist/settings/index.js +4 -4
- package/dist/shell/Sidebar.d.ts +4 -2
- package/dist/shell/index.cjs +89 -89
- package/dist/shell/index.js +10 -10
- package/dist/shell/use-sidebar-controller.d.ts +3 -3
- package/dist/studio/index.cjs +18 -18
- package/dist/studio/index.js +15 -15
- package/dist/workflow-canvas/index.cjs +66 -66
- package/dist/workflow-canvas/index.js +42 -42
- package/dist/workspaces/index.cjs +20 -20
- package/dist/workspaces/index.js +3 -3
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedNativeDocxComparison-2RIERXLW.js.map +0 -1
- package/dist/ConnectedNativeDocxComparison-46C7LYGT.cjs.map +0 -1
- package/dist/ConnectedNativeDocxEditor-6XMB2XT7.cjs.map +0 -1
- package/dist/ConnectedNativeDocxEditor-K6X63CPL.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-6UMLSR3G.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-GFFLCGF7.cjs.map +0 -1
- package/dist/chunk-2FPBFLOX.cjs.map +0 -1
- package/dist/chunk-7QDLONHA.js.map +0 -1
- package/dist/chunk-7SJXYEZI.cjs.map +0 -1
- package/dist/chunk-C33VIPE2.js.map +0 -1
- package/dist/chunk-LPGBRMYS.js.map +0 -1
- package/dist/chunk-M6XUGXCY.cjs.map +0 -1
- package/dist/chunk-MB3IQLNN.cjs.map +0 -1
- package/dist/chunk-SK6BAW7L.js.map +0 -1
- package/dist/chunk-TIQZ7CXZ.js.map +0 -1
- package/dist/chunk-UAF2J7P7.cjs.map +0 -1
- package/dist/chunk-VIRQYEFL.cjs.map +0 -1
- package/dist/chunk-WLQAD6ZY.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/calls/connected/StartCallButton.tsx","../src/calls/connected/call-people.ts","../src/calls/connected/CallPeoplePicker.tsx","../src/calls/connected/ThreadCallButton.tsx","../src/calls/connected/GroupCallButton.tsx","../src/calls/connected/DmCallButton.tsx","../src/calls/connected/NewCallChip.tsx","../src/calls/connected/ScheduleCallButton.tsx","../src/connection/conversation/useMeetingThreadMessages.ts","../src/calls/connected/MeetingThreadTranscriptAction.tsx","../src/calls/connected/MeetingThreadRecordingsAction.tsx","../src/calls/connected/ConnectedConversationCallActions.tsx","../src/calls/connected/ChatCallCard.tsx","../src/calls/connected/call-person-name.ts","../src/calls/connected/CallConversationParts.tsx","../src/calls/connected/provisional-speakers.ts","../src/calls/connected/ConnectedCallChatHistory.tsx"],"names":["jsxs","cn","jsx","Button","Tooltip","TooltipTrigger","TooltipContent","useState","added","useCallSession","useCanHostCalls","useArbi","isAgent","Fragment","openCall","getUserDisplayName","useWorkspaces","useMemo","useEffect","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","useConversationItems","useCall","Phone","usePeople","hasRecordingTranscript","useRecordingWindows"],"mappings":"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","file":"chunk-IL6OWGAU.js","sourcesContent":["/**\n * Header button that starts (or joins) a call. Renders nothing when calling is\n * not configured on this deployment, and offers only joining a live call to people who may\n * not host calls (Free on the hosted service, external on a Box).\n */\n\nimport { useCallSession, useCallsEnabled, useCanHostCalls } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { Phone } from 'lucide-react'\nimport { Button, cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\n\nexport interface StartCallButtonProps {\n /** Starts the call; resolves to whether it opened. */\n onStart(): Promise<boolean>\n /** A call is already running here (the button joins it). */\n isLive?: boolean\n /** Tooltip / accessible label. */\n label?: string\n testId?: string\n}\n\nexport function StartCallButton(props: StartCallButtonProps): ReactElement | null {\n // Gate first so a deployment without calls pays for none of the hooks below.\n const enabled = useCallsEnabled()\n const canHost = useCanHostCalls()\n return enabled && (canHost || props.isLive) ? <EnabledStartCallButton {...props} /> : null\n}\n\nfunction EnabledStartCallButton({\n onStart,\n isLive = false,\n label = 'Start call',\n testId = 'start-call-button',\n}: StartCallButtonProps): ReactElement {\n const [isStarting, setIsStarting] = useState(false)\n const inCall = useCallSession((s) => s.active !== null)\n const text = inCall ? 'Already in a call' : isLive ? 'Join call' : label\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label={isLive ? 'Join call' : label}\n data-testid={testId}\n data-live={isLive || undefined}\n disabled={isStarting || inCall}\n onClick={() => {\n setIsStarting(true)\n void onStart().finally(() => setIsStarting(false))\n }}\n className={cn(\n 'text-muted-foreground hover:text-foreground',\n isLive && 'text-green-text hover:text-green-text'\n )}\n >\n <Phone className={cn('size-5', isLive && 'animate-pulse')} />\n </Button>\n </TooltipTrigger>\n <TooltipContent>\n <p>{text}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n","/**\n * Who a call picker offers, in which order, and what picking them does — pure, so the rules are\n * tested without React (see `CallPeoplePicker`).\n *\n * - `workspace` (a thread call): members of the thread's own workspace only. Nobody else may be\n * rung, admitted or knock on a workspace-locked call.\n * - `chat` (a group's call): the group's members.\n * - `contacts` (\"New call\", calendar): members of the current workspace first, then my other\n * contacts. Only contacts can be picked (the server answers `403 not_a_contact` otherwise): a\n * workspace member who is not one yet offers \"Add contact\". Registered contacts are rung (K\n * sealed to them); unregistered ones (invited / expired / a card with an e-mail) get a personal\n * invite link by e-mail: create an ARBI account, then straight into the call (no anonymous\n * guests).\n *\n * Agents and I are never offered.\n */\n\nimport type { contacts } from '@arbidocs/sdk/browser'\nimport { getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport { type UserResponse } from '@arbidocs/react'\n\ntype Contact = contacts.Contact\n\nexport type CallPickerScope = 'workspace' | 'chat' | 'contacts'\n\n/**\n * - `ring`: an ARBI user, rung in-app.\n * - `invite`: an unregistered contact, e-mailed a personal invite link (register, then join).\n * - `add-contact`: a workspace member who is not my contact yet (add, then pick).\n * - `unavailable`: shown greyed out with `reason`.\n */\ntype CallCandidateStatus = 'ring' | 'invite' | 'add-contact' | 'unavailable'\n\nexport interface CallCandidate {\n /** `usr-…` for a user, `cnt-…` for an unregistered contact. */\n id: string\n name: string\n email: string | null\n section: 'members' | 'contacts'\n status: CallCandidateStatus\n /** Why it cannot be picked (tooltip), or what picking does (\"will get an e-mail link\"). */\n reason?: string\n user: UserResponse | null\n contactExtId: string | null\n}\n\nexport const INVITE_LINK_HINT = 'will get an invitation to create an ARBI account and join'\nconst NO_KEY_REASON = 'Cannot receive encrypted calls yet'\nconst NO_EMAIL_REASON = 'No e-mail address to send a link to'\n\nfunction contactName(contact: Contact): string {\n return (\n contact.card?.name?.trim() ||\n [contact.card?.given_name, contact.card?.family_name].filter(Boolean).join(' ') ||\n (contact.user ? getUserDisplayName(contact.user) : '') ||\n contactEmail(contact) ||\n 'Contact'\n )\n}\n\nfunction contactEmail(contact: Contact): string | null {\n return contact.email ?? contact.user?.email ?? contact.card?.emails?.[0]?.email ?? null\n}\n\n/** One of my contacts, as the picker needs it (from a people search hit, or a contact just added). */\nexport interface CallContact {\n contactExtId: string\n /** The ARBI account; null for a contact not on ARBI yet. */\n user: UserResponse | null\n name: string\n email: string | null\n}\n\n/** A contact row as a {@link CallContact}; null for one that cannot be called (failed, agent, no id). */\nexport function callContactOf(contact: Contact): CallContact | null {\n if (!contact.external_id || contact.status === 'failed') return null\n if (contact.user && isAgent(contact.user)) return null\n return {\n contactExtId: contact.external_id,\n user: contact.user ?? null,\n name: contactName(contact),\n email: contactEmail(contact),\n }\n}\n\nfunction userCandidate(\n user: UserResponse,\n section: CallCandidate['section'],\n status: CallCandidateStatus,\n contactExtId: string | null = null\n): CallCandidate {\n const ringable = status !== 'ring' || !!user.encryption_public_key\n return {\n id: user.external_id,\n name: getUserDisplayName(user) || user.email,\n email: user.email ?? null,\n section,\n status: ringable ? status : 'unavailable',\n reason: ringable ? undefined : NO_KEY_REASON,\n user,\n contactExtId,\n }\n}\n\nexport function buildCallCandidates(opts: {\n scope: CallPickerScope\n /** `workspace` / `contacts`: the workspace's members; `chat`: the chat's members. */\n members: UserResponse[]\n /** `contacts` only: my contacts to offer (the people search's hits). */\n contacts?: CallContact[]\n /** `contacts` only: my contact id for a workspace member, null when they are not my contact. */\n contactIdOf?: (user: UserResponse) => string | null\n me: string | null | undefined\n}): CallCandidate[] {\n const seen = new Set<string>()\n const out: CallCandidate[] = []\n const add = (c: CallCandidate) => {\n if (seen.has(c.id)) return\n seen.add(c.id)\n out.push(c)\n }\n const people = (users: UserResponse[]) =>\n users.filter((u) => !isAgent(u) && u.external_id !== opts.me)\n\n if (opts.scope !== 'contacts') {\n for (const u of people(opts.members)) add(userCandidate(u, 'members', 'ring'))\n return out\n }\n\n const contacts = (opts.contacts ?? []).filter((c) => !(c.user && isAgent(c.user)))\n const contactOf = new Map(\n contacts.filter((c) => c.user).map((c) => [c.user!.external_id, c.contactExtId] as const)\n )\n // Members of the current workspace first: pickable once they are my contacts.\n for (const u of people(opts.members)) {\n const contactId = contactOf.get(u.external_id) ?? opts.contactIdOf?.(u) ?? null\n add(userCandidate(u, 'members', contactId ? 'ring' : 'add-contact', contactId))\n }\n for (const c of contacts) {\n if (c.user) {\n if (c.user.external_id === opts.me) continue\n add(userCandidate(c.user, 'contacts', 'ring', c.contactExtId))\n continue\n }\n const status: CallCandidateStatus = c.email ? 'invite' : 'unavailable'\n add({\n id: c.contactExtId,\n name: c.name,\n email: c.email,\n section: 'contacts',\n status,\n reason: c.email ? INVITE_LINK_HINT : NO_EMAIL_REASON,\n user: null,\n contactExtId: c.contactExtId,\n })\n }\n return out\n}\n\n/** Whether a candidate can be ticked. */\nexport function isPickable(c: CallCandidate): boolean {\n return c.status === 'ring' || c.status === 'invite'\n}\n\n/** Case-insensitive match on name or e-mail. */\nexport function matchesQuery(c: CallCandidate, query: string): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return true\n return c.name.toLowerCase().includes(q) || (c.email ?? '').toLowerCase().includes(q)\n}\n","/**\n * Pick who a call rings — one picker for every way a call starts:\n *\n * - `workspace` (thread call): members of the thread's own workspace, nobody ticked by default;\n * - `chat` (a group's call): the group's members (the caller decides who is pre-ticked);\n * - `contacts` (\"New call\", or adding people to a running call): members of the current\n * workspace first, then my contacts matching the search (the one people search). Only contacts can be picked; \"Add contact…\" creates\n * one inline (and sends the platform invitation) and ticks it. Registered contacts are rung;\n * unregistered ones are marked \"will get an invitation to create an ARBI account and join\" and\n * get a personal invite link by e-mail.\n *\n * With `callExtId` (a running call I host) the invitations already sent are listed with \"Revoke\".\n * Agents are never offered. The rules live in `call-people.ts`.\n */\n\nimport {\n useCallInviteLinks,\n useCreateContact,\n useRevokeCallInviteLink,\n useWorkspaces,\n type CallInviteContact,\n usePeople,\n usePeopleSearch,\n type UserResponse,\n} from '@arbidocs/react'\nimport { useEffect, useMemo, useState, type ReactElement } from 'react'\nimport { ArbiApiError, refusalReason } from '@arbidocs/sdk/browser'\nimport { Mail, UserPlus, X } from 'lucide-react'\nimport {\n Button,\n Checkbox,\n cn,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n Input,\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from '@arbidocs/react/ui'\nimport type { calls } from '@arbidocs/sdk/browser'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport {\n buildCallCandidates,\n callContactOf,\n type CallContact,\n isPickable,\n matchesQuery,\n type CallCandidate,\n type CallPickerScope,\n} from './call-people'\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n\nexport interface CallPeopleSelection {\n /** ARBI users to ring (K sealed to each). */\n ring: UserResponse[]\n /** Unregistered contacts to e-mail a personal invite link. */\n invites: CallInviteContact[]\n}\n\nexport interface CallPeoplePickerProps {\n open: boolean\n onOpenChange: (open: boolean) => void\n scope: CallPickerScope\n /** `workspace`: the thread's workspace; `contacts`: the current one (default: the selected one). */\n workspaceExtId?: string | null\n /** `chat`: the chat's members. */\n members?: UserResponse[]\n /** Ticked when the picker opens. */\n preselected?: string[]\n title?: string\n description?: string\n actionLabel?: string\n /** A running call I host: list its invitations (with revoke). */\n callExtId?: string | null\n /** Start / invite. A rejection keeps the picker open. */\n onSubmit: (selection: CallPeopleSelection) => Promise<unknown>\n}\n\nconst COPY: Record<CallPickerScope, { title: string; description: string; action: string }> = {\n workspace: {\n title: 'Call thread members',\n description:\n 'Only members of this thread’s workspace can join. Pick who to ring — or nobody, and share the call from the thread.',\n action: 'Start call',\n },\n chat: {\n title: 'Call the group',\n description: 'The people you pick are rung.',\n action: 'Start call',\n },\n contacts: {\n title: 'New call',\n description:\n 'Your contacts with an ARBI account are rung. Others get an invitation to create an account and join.',\n action: 'Start call',\n },\n}\n\nfunction CandidateRow({\n candidate,\n checked,\n onToggle,\n onAddContact,\n adding,\n}: {\n candidate: CallCandidate\n checked: boolean\n onToggle: () => void\n onAddContact: () => void\n adding: boolean\n}) {\n const pickable = isPickable(candidate)\n const hint =\n candidate.status === 'invite'\n ? candidate.reason\n : candidate.status === 'add-contact'\n ? 'Not in your contacts'\n : undefined\n const row = (\n <li\n className={cn(\n 'flex items-center gap-3 rounded-md px-2 py-1.5',\n pickable ? 'hover:bg-muted' : 'opacity-60'\n )}\n data-testid={`call-picker-row-${candidate.id}`}\n data-status={candidate.status}\n aria-disabled={!pickable || undefined}\n >\n <Checkbox\n checked={checked}\n disabled={!pickable}\n onCheckedChange={onToggle}\n aria-label={`Invite ${candidate.name}`}\n data-testid={`call-picker-check-${candidate.id}`}\n />\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate text-sm\">{candidate.name}</span>\n <span className=\"block truncate text-xs text-muted-foreground\">\n {candidate.email}\n {hint && (\n <span className=\"ml-1 inline-flex items-center gap-1\">\n {candidate.status === 'invite' && <Mail className=\"size-3\" aria-hidden />}\n {candidate.email ? `· ${hint}` : hint}\n </span>\n )}\n </span>\n </span>\n {candidate.status === 'add-contact' && (\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={adding}\n onClick={onAddContact}\n data-testid={`call-picker-add-${candidate.id}`}\n >\n <UserPlus className=\"mr-1 size-3.5\" />\n Add contact\n </Button>\n )}\n </li>\n )\n if (candidate.status !== 'unavailable' || !candidate.reason) return row\n return (\n <Tooltip>\n <TooltipTrigger asChild>{row}</TooltipTrigger>\n <TooltipContent>\n <p>{candidate.reason}</p>\n </TooltipContent>\n </Tooltip>\n )\n}\n\nfunction InviteLinks({ callExtId }: { callExtId: string }) {\n const { notify } = useBlocksEnvironment()\n const revokeLink = useRevokeCallInviteLink(callExtId)\n const { data: invites = [] } = useCallInviteLinks(callExtId)\n const live = invites.filter((i: calls.CallInviteLinkResponse) => !i.revoked_at)\n if (!live.length) return null\n const revoke = async (id: string) => {\n try {\n await revokeLink(id)\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Could not revoke the link', 'error')\n }\n }\n return (\n <section className=\"flex flex-col gap-1\" data-testid=\"call-picker-invite-links\">\n <h3 className=\"text-xs font-medium text-muted-foreground\">Invitations sent</h3>\n <ul className=\"flex flex-col gap-1\">\n {live.map((invite) => (\n <li key={invite.external_id} className=\"flex items-center gap-2 text-sm\">\n <Mail className=\"size-3.5 text-muted-foreground\" aria-hidden />\n <span className=\"min-w-0 flex-1 truncate\">{invite.email}</span>\n {invite.used_at && <span className=\"text-xs text-muted-foreground\">joined</span>}\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => void revoke(invite.external_id)}\n data-testid={`call-picker-revoke-${invite.external_id}`}\n >\n <X className=\"mr-1 size-3.5\" />\n Revoke\n </Button>\n </li>\n ))}\n </ul>\n </section>\n )\n}\n\nexport function CallPeoplePicker({\n open,\n onOpenChange,\n scope,\n workspaceExtId,\n members: chatMembers = [],\n preselected = [],\n title,\n description,\n actionLabel,\n callExtId,\n onSubmit,\n}: CallPeoplePickerProps): ReactElement {\n const { notify } = useBlocksEnvironment()\n const createContact = useCreateContact()\n const { userId: me, workspaceId: selectedWorkspaceId } = useConnectedWorkspace()\n const { data: workspaces = [] } = useWorkspaces({ enabled: scope !== 'chat' })\n const [picked, setPicked] = useState<Set<string>>(() => new Set(preselected))\n const [query, setQuery] = useState('')\n const [newEmail, setNewEmail] = useState<string | null>(null)\n const [newName, setNewName] = useState('')\n const [adding, setAdding] = useState(false)\n const [busy, setBusy] = useState(false)\n // Contacts added here (the search may not have them yet).\n const [added, setAdded] = useState<CallContact[]>([])\n const { byEmail } = usePeople()\n const { people: hits } = usePeopleSearch(open && scope === 'contacts' ? query : '')\n\n const preselectedKey = preselected.join(',')\n useEffect(() => {\n if (open) setPicked(new Set(preselectedKey ? preselectedKey.split(',') : []))\n }, [open, preselectedKey])\n\n const workspaceId = workspaceExtId ?? (scope === 'contacts' ? selectedWorkspaceId : null)\n const workspaceMembers = useMemo(\n () => (workspaces.find((w) => w.external_id === workspaceId)?.users ?? []).map((wu) => wu.user),\n [workspaces, workspaceId]\n )\n const candidates = useMemo(() => {\n // Only my contacts can be picked: the hits that are contacts, and anyone added here.\n const found: CallContact[] = hits.flatMap((p) =>\n p.contactId ? [{ contactExtId: p.contactId, user: p.user, name: p.name, email: p.email }] : []\n )\n return buildCallCandidates({\n scope,\n members: scope === 'chat' ? chatMembers : workspaceMembers,\n contacts: [...added, ...found],\n contactIdOf: (u) => byEmail(u.email)?.contactId ?? null,\n me,\n })\n }, [scope, chatMembers, workspaceMembers, hits, added, byEmail, me])\n const shown = candidates.filter((c) => matchesQuery(c, query))\n const copy = COPY[scope]\n\n const toggle = (id: string) =>\n setPicked((prev) => {\n const next = new Set(prev)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n return next\n })\n\n /**\n * Add a contact (and send the platform invitation), then tick it. `name` (optional) is kept as the\n * contact card's name, so the invitation and the call title show it instead of the e-mail.\n */\n const addContact = async (email: string, name?: string) => {\n setAdding(true)\n try {\n const cardName = name?.trim()\n const contact = await createContact.mutateAsync({\n email,\n invite: true,\n ...(cardName ? { card: { name: cardName, emails: [{ email }] } } : {}),\n })\n if (contact.status === 'failed') {\n throw new Error(contact.outcome_detail || 'Could not add the contact')\n }\n const added = callContactOf(contact)\n if (added) setAdded((prev) => [...prev, added])\n const id = contact.user?.external_id ?? contact.external_id\n const pickable = contact.user ? !!contact.user.encryption_public_key : !!added?.email\n if (id && pickable) setPicked((prev) => new Set(prev).add(id))\n setNewEmail(null)\n setNewName('')\n } catch (err) {\n notify(\n err instanceof ArbiApiError\n ? refusalReason(err, 'Could not add the contact')\n : err instanceof Error\n ? err.message\n : 'Could not add the contact',\n 'error'\n )\n } finally {\n setAdding(false)\n }\n }\n\n const submit = async () => {\n if (busy) return\n const chosen = candidates.filter((c) => picked.has(c.id) && isPickable(c))\n setBusy(true)\n try {\n await onSubmit({\n ring: chosen.filter((c) => c.status === 'ring' && c.user).map((c) => c.user!),\n invites: chosen\n .filter((c) => c.status === 'invite' && c.contactExtId)\n .map((c) => ({ contactExtId: c.contactExtId!, name: c.name })),\n })\n onOpenChange(false)\n } catch (err) {\n notify(err instanceof Error ? err.message : 'Something went wrong', 'error')\n } finally {\n setBusy(false)\n }\n }\n\n const sections: { id: CallCandidate['section']; label: string }[] =\n scope === 'contacts'\n ? [\n { id: 'members', label: 'Workspace members' },\n { id: 'contacts', label: 'Contacts' },\n ]\n : [{ id: 'members', label: scope === 'chat' ? 'Members' : 'Workspace members' }]\n const count = candidates.filter((c) => picked.has(c.id) && isPickable(c)).length\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"sm:max-w-md\" data-testid=\"call-people-picker\">\n <DialogHeader>\n <DialogTitle>{title ?? copy.title}</DialogTitle>\n <DialogDescription>{description ?? copy.description}</DialogDescription>\n </DialogHeader>\n <div className=\"flex min-h-0 flex-col gap-3\">\n <Input\n placeholder=\"Search people\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n aria-label=\"Search people\"\n data-testid=\"call-picker-search\"\n />\n <div className=\"max-h-80 overflow-y-auto\">\n {sections.map((section) => {\n const rows = shown.filter((c) => c.section === section.id)\n if (!rows.length) return null\n return (\n <section key={section.id} className=\"mb-2\">\n <h3 className=\"px-2 pb-1 text-xs font-medium text-muted-foreground\">\n {section.label}\n </h3>\n <ul data-testid={`call-picker-section-${section.id}`}>\n {rows.map((c) => (\n <CandidateRow\n key={c.id}\n candidate={c}\n checked={picked.has(c.id)}\n onToggle={() => toggle(c.id)}\n adding={adding}\n onAddContact={() => c.email && void addContact(c.email)}\n />\n ))}\n </ul>\n </section>\n )\n })}\n {!shown.length && (\n <p className=\"px-2 py-3 text-sm text-muted-foreground\">\n {scope === 'contacts' && !query.trim()\n ? 'Search your contacts by name or e-mail.'\n : candidates.length\n ? 'Nobody matches.'\n : 'Nobody to call here yet.'}\n </p>\n )}\n </div>\n {scope === 'contacts' &&\n (newEmail === null ? (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"self-start\"\n onClick={() => setNewEmail(EMAIL_RE.test(query.trim()) ? query.trim() : '')}\n data-testid=\"call-picker-add-contact\"\n >\n <UserPlus className=\"mr-1 size-4\" />\n Add contact…\n </Button>\n ) : (\n <form\n className=\"flex flex-wrap items-center gap-2\"\n onSubmit={(e) => {\n e.preventDefault()\n if (EMAIL_RE.test(newEmail.trim())) void addContact(newEmail.trim(), newName)\n }}\n >\n <Input\n className=\"min-w-[8rem] flex-1\"\n placeholder=\"Name (optional)\"\n value={newName}\n maxLength={200}\n onChange={(e) => setNewName(e.target.value)}\n aria-label=\"New contact's name\"\n autoComplete=\"off\"\n data-testid=\"call-picker-new-name\"\n />\n <Input\n className=\"min-w-[10rem] flex-1\"\n type=\"email\"\n autoFocus\n placeholder=\"name@example.com\"\n value={newEmail}\n onChange={(e) => setNewEmail(e.target.value)}\n aria-label=\"New contact's e-mail\"\n data-testid=\"call-picker-new-email\"\n />\n <Button\n type=\"submit\"\n size=\"sm\"\n disabled={adding || !EMAIL_RE.test(newEmail.trim())}\n data-testid=\"call-picker-new-submit\"\n >\n Add\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n setNewEmail(null)\n setNewName('')\n }}\n >\n Cancel\n </Button>\n </form>\n ))}\n {callExtId && scope === 'contacts' && <InviteLinks callExtId={callExtId} />}\n <p className=\"text-xs text-muted-foreground\">Agents can’t join calls.</p>\n </div>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)} disabled={busy}>\n Cancel\n </Button>\n <Button onClick={() => void submit()} disabled={busy} data-testid=\"call-picker-submit\">\n {busy ? 'Working…' : `${actionLabel ?? copy.action}${count ? ` (${count})` : ''}`}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n )\n}\n","/**\n * Call button for the open thread — shared threads only. A thread call is locked to the thread's\n * workspace and logged in the thread (a log card). The button opens a members-only picker with\n * nobody ticked: only the members picked are rung (never the whole workspace). While the thread's\n * call is live, the button joins it instead.\n */\n\nimport {\n useArbi,\n threadLiveCallId,\n useCallSession,\n useCanHostCalls,\n openCall,\n startThreadCall,\n} from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { useConnectedConversations } from '../../connection/workspaceData'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { StartCallButton } from './StartCallButton'\nimport { CallPeoplePicker } from './CallPeoplePicker'\n\nexport function ThreadCallButton({\n conversationId,\n}: {\n conversationId: string\n}): ReactElement | null {\n const arbi = useArbi()\n const { data: conversations } = useConnectedConversations()\n // The conversation list is the workspace open in this session: the thread's own workspace.\n const { workspaceId: workspaceExtId } = useConnectedWorkspace()\n const liveCallId = useCallSession((s) => threadLiveCallId(s, conversationId))\n const isLive = liveCallId !== null\n const canHost = useCanHostCalls()\n const [picking, setPicking] = useState(false)\n const conversation = conversations.find((c) => c.external_id === conversationId)\n if (!conversation?.is_shared) return null\n const title = conversation.title ?? null\n\n return (\n <>\n <StartCallButton\n onStart={async () => {\n // Live: join the thread's running call (get-or-create), ringing nobody. Someone who may not host\n // opens that call directly: get-or-create would make them the host of a new one.\n if (liveCallId && !canHost) return openCall(arbi, { callExtId: liveCallId })\n if (isLive) return startThreadCall(arbi, { threadExtId: conversationId, title, ring: [] })\n setPicking(true)\n return true\n }}\n isLive={isLive}\n label=\"Call thread members\"\n testId=\"thread-call-button\"\n />\n {picking && (\n <CallPeoplePicker\n open\n onOpenChange={setPicking}\n scope=\"workspace\"\n workspaceExtId={workspaceExtId}\n onSubmit={async ({ ring }) => {\n await startThreadCall(arbi, { threadExtId: conversationId, title, ring })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * Call button for an open group chat: the group's call (the group is its meeting chat). The\n * members picker opens with everyone ticked; only the people left ticked are rung.\n */\n\nimport {\n useArbi,\n chatLiveCallId,\n useCallSession,\n openCall,\n startChatCall,\n useCanHostCalls,\n type UserResponse,\n} from '@arbidocs/react'\nimport { isAgent } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { StartCallButton } from './StartCallButton'\nimport { CallPeoplePicker } from './CallPeoplePicker'\n\nexport function GroupCallButton({\n chatExtId,\n title,\n members,\n}: {\n chatExtId: string\n title: string | null\n members: UserResponse[]\n}): ReactElement {\n const arbi = useArbi()\n const { userId: me } = useConnectedWorkspace()\n const liveCallId = useCallSession((s) => chatLiveCallId(s, chatExtId))\n const isLive = liveCallId !== null\n const canHost = useCanHostCalls()\n const [picking, setPicking] = useState(false)\n const others = members.filter((u) => u.external_id !== me && !isAgent(u))\n\n return (\n <>\n <StartCallButton\n onStart={async () => {\n // Someone who may not host opens the running call itself (a new create would make them its host).\n if (liveCallId && !canHost) return openCall(arbi, { callExtId: liveCallId })\n if (isLive) return startChatCall(arbi, { chatExtId, title, ring: [] })\n setPicking(true)\n return true\n }}\n isLive={isLive}\n label=\"Call the group\"\n testId=\"group-call-button\"\n />\n {picking && (\n <CallPeoplePicker\n open\n onOpenChange={setPicking}\n scope=\"chat\"\n members={others}\n preselected={others.map((u) => u.external_id)}\n onSubmit={async ({ ring }) => {\n await startChatCall(arbi, { chatExtId, title, ring })\n }}\n />\n )}\n </>\n )\n}\n","/** Call button for an open DM thread: a new call with the peer as context, ringing the peer. */\n\nimport { useArbi, userDisplayName, startDmCall, type UserResponse } from '@arbidocs/react'\nimport type { ReactElement } from 'react'\nimport { StartCallButton } from './StartCallButton'\n\nexport function DmCallButton({ peer }: { peer: UserResponse }): ReactElement {\n const arbi = useArbi()\n const name = userDisplayName(peer)\n return (\n <StartCallButton\n onStart={() =>\n startDmCall(arbi, {\n external_id: peer.external_id,\n encryption_public_key: peer.encryption_public_key ?? null,\n name,\n })\n }\n label={`Call ${name}`}\n testId=\"dm-call-button\"\n />\n )\n}\n","/**\n * \"New call\" — a call with people from my contacts (no thread or chat). Registered contacts are\n * rung; unregistered ones get a personal invite link by e-mail (register, then join). Its meeting chat is made on first\n * use. Renders nothing unless the person may host calls (server + Settings → Experimental + entitlement).\n */\n\nimport { useArbi, useCallSession, useCanHostCalls, startContactsCall } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\nimport { useState, type ReactElement } from 'react'\nimport { DmInviteChip } from '../../collaboration/direct-messages/DirectMessages'\nimport { CallPeoplePicker } from './CallPeoplePicker'\nimport { contactsCallTitle } from '../call-cards'\n\nexport function NewCallChip(): ReactElement | null {\n // Gate first so a deployment without calls pays for none of the hooks below.\n return useCanHostCalls() ? <EnabledNewCallChip /> : null\n}\n\nfunction EnabledNewCallChip(): ReactElement {\n const arbi = useArbi()\n const inCall = useCallSession((s) => s.active !== null)\n const [open, setOpen] = useState(false)\n return (\n <>\n <DmInviteChip\n testId=\"dm-new-call-chip\"\n title=\"New call\"\n description={inCall ? 'You are already in a call' : 'Call people from your contacts'}\n onClick={() => !inCall && setOpen(true)}\n />\n {open && (\n <CallPeoplePicker\n open\n onOpenChange={setOpen}\n scope=\"contacts\"\n onSubmit={async ({ ring, invites }) => {\n await startContactsCall(arbi, {\n title: contactsCallTitle([\n ...ring.map((u) => getUserDisplayName(u)),\n ...invites.map((g) => g.name),\n ]),\n ring,\n invites,\n })\n }}\n />\n )}\n </>\n )\n}\n","/**\n * \"Schedule call\": one scheduling system — the calendar. Opens the calendar's event editor prefilled with the\n * context's people (a shared thread's workspace members, or a DM peer), the thread linked, and \"Add ARBI call\"\n * ticked; saving makes the event and its ARBI call (key sealed to the ARBI attendees). The calendar opens\n * where the host shows it (`BlocksEnvironment.openCalendar`).\n */\nimport { CalendarPlus } from 'lucide-react'\nimport { Button, cn, getUserDisplayName, isAgent } from '@arbidocs/react/ui'\nimport {\n useCanHostCalls,\n useConversationItems,\n useWorkspaces,\n type UserResponse,\n} from '@arbidocs/react'\nimport { useBlocksEnvironment } from '../../provider/environment'\nimport { useConnectedWorkspace } from '../../connection/ConnectionProvider'\nimport { requestCalendarComposer } from '../../connection/calendar/store'\n\nexport interface ScheduleCallButtonProps {\n /** A thread: its workspace members are invited when the thread is shared. */\n conversationId?: string | null\n /** A DM peer to invite. */\n peer?: UserResponse | null\n /** `icon` for headers, `label` for a text button. */\n variant?: 'icon' | 'label'\n className?: string\n}\n\nexport function ScheduleCallButton({\n conversationId,\n peer,\n variant = 'icon',\n className,\n}: ScheduleCallButtonProps) {\n // Scheduling a call is hosting it.\n const callsEnabled = useCanHostCalls()\n const { conversations } = useConversationItems()\n const { data: workspaces = [] } = useWorkspaces()\n const { workspaceId: selectedWorkspaceId, userId: me } = useConnectedWorkspace()\n const { openCalendar } = useBlocksEnvironment()\n if (!callsEnabled) return null\n\n const open = () => {\n const conversation = conversationId\n ? conversations?.find((c) => c.external_id === conversationId)\n : undefined\n let people: UserResponse[] = []\n if (peer) people = [peer]\n else if (conversation?.is_shared) {\n const workspace = workspaces.find((w) => w.external_id === selectedWorkspaceId)\n people = (workspace?.users ?? []).map((wu) => wu.user as UserResponse)\n }\n requestCalendarComposer({\n title: peer\n ? `Call with ${getUserDisplayName(peer) || peer.email}`\n : (conversation?.title ?? ''),\n conversationId: conversationId ?? null,\n attendees: people\n .filter((u) => !isAgent(u) && u.external_id !== me)\n .map((u) => ({\n email: u.email,\n user_id: u.external_id,\n name: getUserDisplayName(u) || null,\n })),\n addCall: true,\n })\n openCalendar()\n }\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={variant === 'icon' ? 'icon' : 'sm'}\n className={cn(variant === 'icon' && 'size-8', className)}\n onClick={open}\n aria-label=\"Schedule call\"\n title=\"Schedule call\"\n data-testid=\"schedule-call-button\"\n >\n <CalendarPlus className=\"size-4\" />\n {variant === 'label' && <span className=\"ml-1.5\">Schedule call</span>}\n </Button>\n )\n}\n","/**\n * A conversation's messages as its thread shows them: in a call's meeting thread, a recording's\n * transcript supersedes the live lines spoken while it recorded (else both would show).\n */\nimport { useMemo } from 'react'\nimport {\n hasRecordingTranscript,\n supersedeLiveTranscript,\n threadTranscriptRef,\n useRecordingWindows,\n} from '@arbidocs/react'\nimport type { ChatMessage } from '@arbidocs/sdk/browser'\n\nexport function useMeetingThreadMessages(\n meetingCallExtId: string | null,\n messageHistory: ChatMessage[]\n): ChatMessage[] {\n const hasRecTranscript = useMemo(\n () => !!meetingCallExtId && hasRecordingTranscript(messageHistory, threadTranscriptRef),\n [meetingCallExtId, messageHistory]\n )\n const recordingWindows = useRecordingWindows(meetingCallExtId, hasRecTranscript)\n return useMemo(\n () =>\n hasRecTranscript\n ? supersedeLiveTranscript(messageHistory, threadTranscriptRef, recordingWindows)\n : messageHistory,\n [hasRecTranscript, messageHistory, recordingWindows]\n )\n}\n","/**\n * \"Save transcript to thread\" in a WORKSPACE meeting thread (a thread call's meeting chat): for the\n * call's creator, the thread's `transcript_segment` comments are posted as one attributed transcript\n * comment into another thread they pick. Renders nothing for anyone else or without a transcript.\n */\n\nimport { useMemo, type ReactElement } from 'react'\nimport { useCall, useWorkspaceUsers, threadTranscriptLines } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\nimport { SaveTranscriptToThread } from './SaveTranscriptToThread'\n\nexport function MeetingThreadTranscriptAction({\n conversationExtId,\n meetingCallExtId,\n title,\n messages,\n}: {\n conversationExtId: string\n /** The thread's call (`meeting_call_ext_id`), or null when it is not a meeting thread. */\n meetingCallExtId: string | null | undefined\n title: string | null | undefined\n messages: { content?: string | null; created_at?: string | null; tools?: unknown }[]\n}): ReactElement | null {\n const { data: call } = useCall(meetingCallExtId)\n const { data: workspaceUsers = [] } = useWorkspaceUsers()\n const lines = useMemo(\n () =>\n threadTranscriptLines(messages, (id) => {\n const user = workspaceUsers.find((wu) => wu.user.external_id === id)?.user\n return user ? getUserDisplayName(user) : null\n }),\n [messages, workspaceUsers]\n )\n if (!meetingCallExtId || !call?.is_creator) return null\n return (\n <SaveTranscriptToThread\n title={title}\n lines={lines}\n excludeConversationExtId={conversationExtId}\n iconOnly\n />\n )\n}\n","/**\n * \"Recordings\" in a WORKSPACE meeting thread (a thread call's meeting chat): the call's recordings\n * in a dialog — for members of the thread's workspace (the recordings are under its key). A\n * recording link (`/<wrk>/<con>?recording=<crc>`) opens it.\n */\n\nimport { useEffect, useState, type ReactElement } from 'react'\nimport { Disc } from 'lucide-react'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { usePendingRecording } from '../recording-link'\nimport { HeaderAction } from '../HeaderAction'\nimport { RecordingsList } from './RecordingCard'\n\nexport function MeetingThreadRecordingsAction({\n meetingCallExtId,\n title,\n}: {\n /** The thread's call (`meeting_call_ext_id`). */\n meetingCallExtId: string\n title: string | null | undefined\n}): ReactElement {\n const [open, setOpen] = useState(false)\n const pending = usePendingRecording()\n useEffect(() => {\n if (pending) setOpen(true)\n }, [pending])\n return (\n <>\n <HeaderAction\n label=\"Recordings\"\n icon={<Disc className=\"size-3.5\" aria-hidden />}\n // Icon only, the label in a tooltip: in a crowded header the thread's title keeps the room.\n iconOnly\n onClick={() => setOpen(true)}\n testId=\"meeting-recordings\"\n />\n {open && (\n <Dialog open onOpenChange={(o) => !o && setOpen(false)}>\n <DialogContent className=\"sm:max-w-2xl\" data-testid=\"meeting-recordings-dialog\">\n <DialogHeader>\n <DialogTitle>Recordings</DialogTitle>\n <DialogDescription>\n Recordings of this meeting, encrypted under the workspace key. Playing or\n downloading one decrypts it in this browser.\n </DialogDescription>\n </DialogHeader>\n <RecordingsList\n callExtId={meetingCallExtId}\n title={title}\n className=\"max-h-[60vh] overflow-y-auto\"\n />\n </DialogContent>\n </Dialog>\n )}\n </>\n )\n}\n","/**\n * The call actions of the open conversation (`ConnectedConversationPage`), for the host's header: call\n * the thread's members (or join its live call), schedule a call, and in a meeting thread the host's\n * \"Save transcript to thread\" and the meeting's Recordings. Renders nothing without an open\n * conversation; each action hides itself when calls are off or it does not apply.\n */\n\nimport { useMemo, type ReactElement } from 'react'\nimport { useArbiSessionState, useConversationData, useConversationItems } from '@arbidocs/react'\nimport { useMeetingThreadMessages } from '../../connection/conversation/useMeetingThreadMessages'\nimport { ThreadCallButton } from './ThreadCallButton'\nimport { ScheduleCallButton } from './ScheduleCallButton'\nimport { MeetingThreadTranscriptAction } from './MeetingThreadTranscriptAction'\nimport { MeetingThreadRecordingsAction } from './MeetingThreadRecordingsAction'\n\nexport function ConnectedConversationCallActions(): ReactElement | null {\n const conversationId = useArbiSessionState((state) => state.conversationId)\n const { conversations } = useConversationItems()\n const conversation = conversationId\n ? conversations.find((c) => c.external_id === conversationId)\n : undefined\n const meetingCallExtId = conversation?.meeting_call_ext_id ?? null\n const { messageHistory } = useConversationData()\n // Its transcript lines (a recording's transcript supersedes the live ones), for the host's save.\n const threadMessages = useMeetingThreadMessages(meetingCallExtId, messageHistory)\n const meetingMessages = useMemo(\n () =>\n meetingCallExtId\n ? threadMessages.map((m) => ({\n content: m.content,\n created_at: m.created_at,\n tools: m.tools ?? m.meta?.tools,\n }))\n : [],\n [meetingCallExtId, threadMessages]\n )\n if (!conversationId) return null\n return (\n <>\n <ThreadCallButton conversationId={conversationId} />\n <ScheduleCallButton conversationId={conversationId} />\n {meetingCallExtId && (\n <MeetingThreadTranscriptAction\n conversationExtId={conversationId}\n meetingCallExtId={meetingCallExtId}\n title={conversation?.title}\n messages={meetingMessages}\n />\n )}\n {meetingCallExtId && (\n <MeetingThreadRecordingsAction\n meetingCallExtId={meetingCallExtId}\n title={conversation?.title}\n />\n )}\n </>\n )\n}\n","/**\n * A `kind=call` chat message (the server posts one into the call's chat — a DM, a group or a\n * meeting chat — when a session starts). The newest card of a call shows its state:\n *\n * live: \"Ada started a call\" · Join\n * ended: \"Call · 12 min · joined Ada, Bob\"\n *\n * Older cards of the same call (earlier sessions) stay a plain \"Call\" line. The call is re-read on\n * `call.started` / `call.ended` (see `refreshCallCards`).\n */\n\nimport { useArbi, useCallSession, useCall, openCall } from '@arbidocs/react'\nimport { useState, type ReactElement } from 'react'\nimport { Phone, PhoneOff } from 'lucide-react'\nimport { Button } from '@arbidocs/react/ui'\nimport { formatCallDuration, isCallLive } from '../call-cards'\n\nexport function ChatCallCard({\n callExtId,\n senderName,\n latest,\n name,\n time,\n}: {\n callExtId: string\n /** Who started the session (the card's sender). */\n senderName: string | null\n /** The newest card of this call in the chat. */\n latest: boolean\n /** A member's display name by user ext id. */\n name: (userExtId: string) => string\n time?: string\n}): ReactElement {\n const arbi = useArbi()\n const { data: call } = useCall(latest ? callExtId : null)\n const liveNow = useCallSession((s) => callExtId in s.liveCalls)\n const inThisCall = useCallSession((s) => s.active?.callExtId === callExtId)\n const inAnotherCall = useCallSession((s) => !!s.active && s.active.callExtId !== callExtId)\n const [busy, setBusy] = useState(false)\n const live = latest && isCallLive(call, liveNow)\n\n let summary: string\n if (live) summary = senderName ? `${senderName} started a call` : 'Call in progress'\n else if (latest && call?.started_at && call.ended_at) {\n const seconds = (Date.parse(call.ended_at) - Date.parse(call.started_at)) / 1000\n const joined = (call.last_participants ?? []).map(name)\n summary = [\n 'Call',\n formatCallDuration(seconds),\n joined.length ? `joined ${joined.join(', ')}` : null,\n ]\n .filter(Boolean)\n .join(' · ')\n } else summary = senderName ? `Call started by ${senderName}` : 'Call'\n\n return (\n <div\n className=\"mx-auto my-2 flex w-fit max-w-full flex-wrap items-center justify-center gap-2 rounded-md border border-border bg-card px-3 py-2 text-xs\"\n data-testid=\"chat-call-card\"\n data-live={live || undefined}\n >\n {live ? (\n <Phone className=\"size-4 animate-pulse text-green-text\" aria-hidden />\n ) : (\n <PhoneOff className=\"size-4 text-muted-foreground\" aria-hidden />\n )}\n <span data-testid=\"chat-call-card-summary\">{summary}</span>\n {time && <time className=\"text-muted-foreground\">{time}</time>}\n {live && (\n <Button\n type=\"button\"\n size=\"sm\"\n className=\"h-7 bg-green-600 text-white hover:bg-green-700\"\n disabled={busy || inThisCall || inAnotherCall}\n title={inAnotherCall ? 'You are already in a call' : undefined}\n onClick={() => {\n setBusy(true)\n void openCall(arbi, { callExtId }).finally(() => setBusy(false))\n }}\n data-testid=\"chat-call-card-join\"\n >\n {inThisCall ? 'In call' : 'Join'}\n </Button>\n )}\n </div>\n )\n}\n","/** A call participant's name, as the people directory knows them. */\n\nimport { useMemo } from 'react'\nimport { useArbi, usePeople } from '@arbidocs/react'\nimport { getUserDisplayName } from '@arbidocs/react/ui'\n\n/** The name for an identity (user ext id): mine, a known person's, else the call's name for them. */\nexport function useCallPersonName(identity: string, fallbackName?: string | null): string {\n const arbi = useArbi()\n const { byId } = usePeople()\n const me = arbi.isLoggedIn && arbi.user.identity()?.externalId === identity\n const profile = me ? arbi.user.profile() : null\n return useMemo(() => {\n if (profile)\n return getUserDisplayName({ given_name: profile.givenName, family_name: profile.familyName })\n const user = byId(identity)\n if (user) return getUserDisplayName(user)\n return (fallbackName || identity).trim().split(/\\s+/).join(' ')\n }, [profile, byId, identity, fallbackName])\n}\n","/**\n * A call's conversation (meeting chat or meeting thread), call-aware: its empty state (\"Call in\n * progress — the transcript will appear here\", or \"No transcript\" afterwards) instead of the\n * generic one, and provisional \"<speaker> is speaking…\" rows while a line is on its way.\n */\n\nimport { useCallSession } from '@arbidocs/react'\nimport type { ReactElement } from 'react'\nimport { AudioLines, Captions, CaptionsOff } from 'lucide-react'\nimport { EmptyState } from '../../components/EmptyState'\nimport { ProvisionalTranscriptLine } from '../../chat/TranscriptLine'\nimport { useMyCallStatus } from '../call-status'\nimport { CallUserPill } from './CallUserPill'\nimport { useCallPersonName } from './call-person-name'\n\n/** The empty conversation of a call: live while the call runs, \"No transcript\" after. */\nexport function CallConversationEmpty({ callExtId }: { callExtId: string }): ReactElement {\n const { inCall, transcribing } = useMyCallStatus(callExtId)\n const live = useCallSession((s) => !!s.liveCalls[callExtId]) || inCall\n if (!live) {\n return (\n <EmptyState\n icon={AudioLines}\n title=\"No transcript\"\n description=\"This call was not transcribed. When a call here is transcribed, what people say appears in this conversation.\"\n className=\"mx-auto my-8 max-w-xl\"\n testId=\"call-conversation-empty\"\n />\n )\n }\n return (\n <EmptyState\n icon={transcribing ? Captions : CaptionsOff}\n title=\"Call in progress — the transcript will appear here\"\n description={\n transcribing\n ? 'Transcription is on: what people say shows up here as they speak.'\n : 'Transcription is off. The host can turn it on with CC in the call.'\n }\n className=\"mx-auto my-8 max-w-xl\"\n testId=\"call-conversation-empty\"\n />\n )\n}\n\nfunction ProvisionalRow({ identity }: { identity: string }): ReactElement {\n const name = useCallPersonName(identity)\n return (\n <ProvisionalTranscriptLine\n speakerId={identity}\n speakerName={name}\n speaker={<CallUserPill identity={identity} />}\n />\n )\n}\n\n/** The provisional rows at the bottom of a call's conversation (never stored). */\nexport function ProvisionalSpeakers({ ids }: { ids: string[] }): ReactElement | null {\n if (!ids.length) return null\n return (\n <div className=\"pb-2\" data-testid=\"transcript-provisional-rows\">\n {ids.map((id) => (\n <ProvisionalRow key={id} identity={id} />\n ))}\n </div>\n )\n}\n","/** Who gets a provisional \"is speaking…\" row in a call's conversation. */\n\nimport { useEffect, useMemo, useRef, useState } from 'react'\nimport { useMyCallStatus } from '../call-status'\nimport { useSpeakingIds } from '../voice-levels'\n\n/** A spoken stretch whose line has not arrived yet. */\ninterface Pending {\n startedAt: number\n lastHeardAt: number\n}\n\n/** How long after someone stops a provisional row waits for their line before it gives up. */\nconst LINE_WAIT_MS = 10_000\n/** A burst shorter than this (a cough, a word) gets no row. */\nconst MIN_SPEECH_MS = 800\n\n/**\n * Who should show a provisional row: people talking now, and people who stopped but whose line\n * has not arrived yet (a line started at or after their stretch began replaces the row).\n */\nexport function useProvisionalSpeakers(\n callExtId: string | null | undefined,\n lines: { speakerId: string; at: number }[]\n): string[] {\n const { inCall, transcribing } = useMyCallStatus(callExtId)\n const speaking = useSpeakingIds()\n const pending = useRef(new Map<string, Pending>())\n const [, tick] = useState(0)\n const active = inCall && transcribing\n const now = Date.now()\n if (active) {\n for (const id of speaking) {\n const p = pending.current.get(id)\n if (p) p.lastHeardAt = now\n else pending.current.set(id, { startedAt: now, lastHeardAt: now })\n }\n } else if (pending.current.size) {\n pending.current.clear()\n }\n // A line that began within the stretch (a little slack for clock skew) replaces the row.\n const latest = useMemo(() => {\n const m = new Map<string, number>()\n for (const l of lines) m.set(l.speakerId, Math.max(m.get(l.speakerId) ?? 0, l.at))\n return m\n }, [lines])\n for (const [id, p] of [...pending.current]) {\n const arrived = (latest.get(id) ?? 0) >= p.startedAt - 3000\n const stale = !speaking.includes(id) && now - p.lastHeardAt > LINE_WAIT_MS\n if ((arrived && !speaking.includes(id)) || stale) pending.current.delete(id)\n else if (arrived) p.startedAt = now\n }\n // Re-check while rows wait for their lines.\n const waiting = pending.current.size > 0\n useEffect(() => {\n if (!waiting) return\n const id = setInterval(() => tick((n) => n + 1), 1000)\n return () => clearInterval(id)\n }, [waiting])\n return [...pending.current]\n .filter(([, p]) => p.lastHeardAt - p.startedAt >= MIN_SPEECH_MS)\n .map(([id]) => id)\n}\n","/**\n * A chat thread's history with its call: the messenger kit's `ThreadHistory` (blocks\n * `ConnectedChatThread`). A chat with a call (a meeting chat, or a direct or group chat a call was\n * started from) shows its call cards, live transcript, recordings and the speakers talking right\n * now, and filters between everything, the typed chat, the transcript and the recordings. Typed\n * messages are drawn by the kit (`renderItem`).\n */\n\nimport { Fragment, useEffect, useMemo, useState } from 'react'\nimport {\n DateSeparator,\n useArbi,\n type ChatThreadMessage,\n useCall,\n chatTranscriptRef,\n hasRecordingTranscript,\n sortTranscriptMessages,\n supersededTranscriptLines,\n type TranscriptExportLine,\n useRecordingWindows,\n} from '@arbidocs/react'\nimport { chats } from '@arbidocs/sdk/browser'\nimport { ConversationFilter } from '../../chat/TranscriptLine'\nimport { transcriptRuns } from '../../chat/transcript-runs'\nimport type { ChatHistoryProps } from '../../connection/messenger/types'\nimport { usePendingRecording } from '../recording-link'\nimport { ChatCallCard } from './ChatCallCard'\nimport { TranscriptEntry } from './TranscriptEntry'\nimport { CallConversationEmpty, ProvisionalSpeakers } from './CallConversationParts'\nimport { useProvisionalSpeakers } from './provisional-speakers'\nimport { SaveTranscriptToThread } from './SaveTranscriptToThread'\nimport { RecordingCard, RecordingsList } from './RecordingCard'\n\nconst { isTranscriptMessage, parseTranscriptContent } = chats\n\nexport function ConnectedCallChatHistory({\n chat,\n messages,\n items,\n renderItem,\n loadOlder,\n memberById,\n senderName,\n myExtId,\n formatTime,\n formatDay,\n}: ChatHistoryProps) {\n const arbi = useArbi()\n // A call's chat: everything, typed chat only, the transcript only, or the recordings.\n const [view, setView] = useState<'all' | 'chat' | 'transcript' | 'recordings'>('all')\n useEffect(() => setView('all'), [chat?.external_id])\n // A call's chat (meeting, DM or group with a call) lists the call's recordings.\n const recordingsCallExtId = chat?.call_ext_id ?? null\n // A recording link opened this chat: show its recordings.\n const pendingRecording = usePendingRecording()\n useEffect(() => {\n if (pendingRecording && recordingsCallExtId) setView('recordings')\n }, [pendingRecording, recordingsCallExtId])\n\n // The newest call card of each call shows its live / ended state; older ones are a plain line.\n const latestCallCards = useMemo(() => {\n const latest = new Map<string, string>()\n for (const m of messages)\n if (m.kind === 'call' && m.call_ext_id && !m.deleted) latest.set(m.call_ext_id, m.external_id)\n return new Set(latest.values())\n }, [messages])\n\n // A recording's transcript supersedes the live lines spoken while it recorded (else both show).\n const hasRecTranscript = useMemo(\n () => hasRecordingTranscript(messages, chatTranscriptRef),\n [messages]\n )\n const recordingWindows = useRecordingWindows(recordingsCallExtId, hasRecTranscript)\n const supersededTranscript = useMemo(\n () => supersededTranscriptLines(messages, chatTranscriptRef, recordingWindows),\n [messages, recordingWindows]\n )\n const transcriptMessages = useMemo(\n () =>\n sortTranscriptMessages(\n messages.filter((m) => isTranscriptMessage(m) && !m.deleted && !supersededTranscript.has(m))\n ),\n [messages, supersededTranscript]\n )\n const hasTranscript = transcriptMessages.length > 0\n\n // The host can save the decrypted transcript as one comment into a workspace thread.\n const { data: meetingCall } = useCall(hasTranscript ? chat?.call_ext_id : null)\n const isHost = !!meetingCall?.is_creator\n const [meetingTitle, setMeetingTitle] = useState<string | null>(null)\n useEffect(() => {\n if (!chat || (!isHost && !recordingsCallExtId)) return\n let cancelled = false\n arbi.chats\n .title(chat)\n .then((t) => !cancelled && setMeetingTitle(t))\n .catch(() => undefined)\n return () => {\n cancelled = true\n }\n }, [arbi, isHost, chat, recordingsCallExtId])\n\n const transcriptSpeaker = (msg: ChatThreadMessage) => {\n const parsed = msg.decryptFailed ? null : parseTranscriptContent(msg.content)\n return { parsed, speakerId: parsed?.speaker_identity || msg.sender_ext_id || '' }\n }\n const transcriptExport = useMemo<TranscriptExportLine[]>(\n () =>\n transcriptMessages\n .filter((m) => !m.decryptFailed)\n .map((m) => {\n const parsed = parseTranscriptContent(m.content)\n const speakerId = parsed?.speaker_identity || m.sender_ext_id || ''\n return {\n speaker:\n parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : '') ||\n 'Former member',\n at: parsed?.started_at ?? m.created_at,\n text: parsed?.text ?? m.content ?? '',\n }\n }),\n [transcriptMessages, memberById, senderName]\n )\n // Consecutive lines of one speaker are one run (the name once); each speaker's newest line is\n // highlighted while they talk in the call.\n const transcriptLayout = useMemo(() => {\n const shown = view === 'transcript' ? transcriptMessages : messages\n const continued = transcriptRuns(\n shown,\n (m) =>\n isTranscriptMessage(m) && !supersededTranscript.has(m)\n ? transcriptSpeaker(m).speakerId\n : null,\n (m) => Date.parse(transcriptSpeaker(m).parsed?.started_at ?? m.created_at ?? '') || 0\n )\n return { continued }\n }, [view, messages, transcriptMessages, supersededTranscript])\n const transcriptEntry = (msg: ChatThreadMessage) => {\n const { parsed, speakerId } = transcriptSpeaker(msg)\n return (\n <TranscriptEntry\n key={msg.external_id}\n speakerId={speakerId}\n speakerName={\n speakerId === myExtId\n ? 'Me'\n : parsed?.speaker_name ||\n (memberById(speakerId) ? senderName(speakerId) : senderName(msg.sender_ext_id))\n }\n text={parsed?.text ?? msg.content ?? ''}\n at={parsed?.started_at ?? msg.created_at}\n continued={transcriptLayout.continued.has(msg)}\n />\n )\n }\n // While I am in this chat's call: \"<speaker> is speaking…\" until their line arrives.\n const chatLines = useMemo(\n () =>\n transcriptMessages.map((m) => {\n const { parsed, speakerId } = transcriptSpeaker(m)\n return { speakerId, at: Date.parse(parsed?.started_at ?? m.created_at ?? '') || 0 }\n }),\n\n [transcriptMessages]\n )\n const provisionalSpeakers = useProvisionalSpeakers(recordingsCallExtId, chatLines)\n\n const filterOptions = [\n { value: 'all' as const, label: 'All' },\n { value: 'chat' as const, label: 'Chat', testId: 'chat-filter' },\n {\n value: 'transcript' as const,\n label: 'Transcript',\n count: transcriptMessages.length,\n testId: 'transcript-filter',\n },\n ...(recordingsCallExtId\n ? [{ value: 'recordings' as const, label: 'Recordings', testId: 'recordings-filter' }]\n : []),\n ]\n\n return (\n <>\n {messages.length === 0 && recordingsCallExtId && (\n <CallConversationEmpty callExtId={recordingsCallExtId} />\n )}\n {(hasTranscript || recordingsCallExtId) && (\n <div className=\"sticky top-0 z-10 flex justify-center py-1\">\n <ConversationFilter<typeof view>\n value={view}\n options={filterOptions}\n onChange={setView}\n />\n </div>\n )}\n {view === 'recordings' && recordingsCallExtId && (\n <RecordingsList callExtId={recordingsCallExtId} title={meetingTitle} className=\"py-1\" />\n )}\n {loadOlder}\n {view === 'transcript' && (\n <div className=\"flex flex-col py-1\" data-testid=\"transcript-view\">\n {isHost && (\n <SaveTranscriptToThread\n title={meetingTitle}\n lines={transcriptExport}\n className=\"mx-3 mb-2 self-start\"\n />\n )}\n {transcriptMessages.map((msg) => transcriptEntry(msg))}\n <ProvisionalSpeakers ids={provisionalSpeakers} />\n </div>\n )}\n {(view === 'all' || view === 'chat') &&\n items.map((item, i) => {\n const { message: msg, isFirstOfDay } = item\n const deleted = !!msg.deleted\n // A deleted transcript line is not part of the record (it may be stored again).\n if (deleted && isTranscriptMessage(msg)) return null\n const separator = isFirstOfDay && (\n <DateSeparator>{formatDay(msg.created_at)}</DateSeparator>\n )\n if (isTranscriptMessage(msg)) {\n if (view === 'chat') return null\n // A live line superseded by the recording's transcript is not shown.\n const superseded = supersededTranscript.has(msg)\n if (superseded && !isFirstOfDay) return null\n return (\n <Fragment key={msg.external_id}>\n {separator}\n {!superseded && transcriptEntry(msg)}\n </Fragment>\n )\n }\n if (msg.kind === 'recording' && msg.call_ext_id && !deleted) {\n // The server's Recording card (posted when a recording stops).\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <RecordingCard\n callExtId={msg.call_ext_id}\n recordingExtId={msg.recording_ext_id ?? null}\n title={meetingTitle}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n if (msg.kind === 'call' && msg.call_ext_id && !deleted) {\n return (\n <Fragment key={msg.external_id}>\n {separator}\n <ChatCallCard\n callExtId={msg.call_ext_id}\n senderName={msg.sender_ext_id ? senderName(msg.sender_ext_id) : null}\n latest={latestCallCards.has(msg.external_id)}\n name={senderName}\n time={formatTime(msg.created_at)}\n />\n </Fragment>\n )\n }\n return renderItem(item, i)\n })}\n {view === 'all' && <ProvisionalSpeakers ids={provisionalSpeakers} />}\n </>\n )\n}\n"]}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var chunkCLPDKHSP_cjs = require('./chunk-CLPDKHSP.cjs');
|
|
5
4
|
var chunkO2FV2HK2_cjs = require('./chunk-O2FV2HK2.cjs');
|
|
5
|
+
var chunkHYDIQEDT_cjs = require('./chunk-HYDIQEDT.cjs');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
|
|
8
8
|
function ConnectedStreamedWordArtifact({
|
|
9
9
|
fontBaseUrl,
|
|
10
10
|
...props
|
|
11
11
|
}) {
|
|
12
|
-
const adapter =
|
|
12
|
+
const adapter = chunkHYDIQEDT_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
|
|
13
13
|
return /* @__PURE__ */ jsxRuntime.jsx(chunkO2FV2HK2_cjs.StreamedWordArtifact, { ...props, adapter });
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
exports.ConnectedStreamedWordArtifact = ConnectedStreamedWordArtifact;
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
18
|
-
//# sourceMappingURL=chunk-
|
|
17
|
+
//# sourceMappingURL=chunk-ILLWGL7Q.cjs.map
|
|
18
|
+
//# sourceMappingURL=chunk-ILLWGL7Q.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-ILLWGL7Q.cjs","sourcesContent":["import { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\nimport {\n StreamedWordArtifact,\n type StreamedWordArtifactProps,\n} from '../../docx/StreamedWordArtifact'\n\nexport function ConnectedStreamedWordArtifact({\n fontBaseUrl,\n ...props\n}: Omit<StreamedWordArtifactProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <StreamedWordArtifact {...props} adapter={adapter} />\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunk5HEMXXHR_cjs = require('./chunk-5HEMXXHR.cjs');
|
|
5
5
|
var chunkZBP4ZSAJ_cjs = require('./chunk-ZBP4ZSAJ.cjs');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
var react = require('react');
|
|
@@ -26,7 +26,7 @@ function TranscriptEntry({
|
|
|
26
26
|
{
|
|
27
27
|
speakerId,
|
|
28
28
|
speakerName,
|
|
29
|
-
speaker: /* @__PURE__ */ jsxRuntime.jsx(
|
|
29
|
+
speaker: /* @__PURE__ */ jsxRuntime.jsx(chunk5HEMXXHR_cjs.CallUserPill, { identity: speakerId, name: speakerName }),
|
|
30
30
|
time: formatTime(at),
|
|
31
31
|
text,
|
|
32
32
|
continued,
|
|
@@ -57,5 +57,5 @@ exports.TranscriptEntry = TranscriptEntry;
|
|
|
57
57
|
exports.TranscriptRunsContext = TranscriptRunsContext;
|
|
58
58
|
exports.threadTranscriptRuns = threadTranscriptRuns;
|
|
59
59
|
exports.useTranscriptRuns = useTranscriptRuns;
|
|
60
|
-
//# sourceMappingURL=chunk-
|
|
61
|
-
//# sourceMappingURL=chunk-
|
|
60
|
+
//# sourceMappingURL=chunk-IOCEKN44.cjs.map
|
|
61
|
+
//# sourceMappingURL=chunk-IOCEKN44.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/calls/connected/TranscriptEntry.tsx","../src/calls/connected/transcript-runs-context.ts"],"names":["jsx","TranscriptLine","CallUserPill","createContext","useContext","transcriptSegmentOf","transcriptRuns"],"mappings":";;;;;;;;AAUA,SAAS,WAAW,GAAA,EAAwC;AAC1D,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACzB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,OAAO,IAAI,IAAA,CAAK,EAAE,CAAA,CAAE,kBAAA,CAAmB,EAAC,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AACnF;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAWiB;AACf,EAAA,uBACEA,cAAA;AAAA,IAACC,gCAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAA;AAAA,MACA,yBAASD,cAAA,CAACE,8BAAA,EAAA,EAAa,QAAA,EAAU,SAAA,EAAW,MAAM,WAAA,EAAa,CAAA;AAAA,MAC/D,IAAA,EAAM,WAAW,EAAE,CAAA;AAAA,MACnB,IAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AClCA,IAAM,KAAA,GAA2B,EAAE,SAAA,kBAAW,IAAI,KAAI,EAAE;AAEjD,IAAM,qBAAA,GAAwBC,oBAAiC,KAAK;AAEpE,SAAS,iBAAA,GAAuC;AACrD,EAAA,OAAOC,iBAAW,qBAAqB,CAAA;AACzC;AAUO,SAAS,qBAAqB,QAAA,EAAkD;AACrF,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAyBC,2BAAA,CAAoB,EAAE,KAAA,IAAS,CAAA,CAAE,MAAM,KAAK,CAAA;AACxF,EAAA,MAAM,cAAA,GAAiBC,gCAAA;AAAA,IACrB,QAAA;AAAA,IACA,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,GAAG,cAAA,IAAkB,IAAA;AAAA,IACvC,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,UAAA,IAAc,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,IAAK;AAAA,GACvE;AACA,EAAA,OAAO;AAAA,IACL,WAAW,IAAI,GAAA;AAAA,MACb,CAAC,GAAG,cAAc,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,EAAE,MAAA,CAAO,CAAC,EAAA,KAAqB,CAAC,CAAC,EAAE;AAAA;AACjF,GACF;AACF","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/calls/connected/TranscriptEntry.tsx","../src/calls/connected/transcript-runs-context.ts"],"names":["jsx","TranscriptLine","CallUserPill","createContext","useContext","transcriptSegmentOf","transcriptRuns"],"mappings":";;;;;;;;AAUA,SAAS,WAAW,GAAA,EAAwC;AAC1D,EAAA,IAAI,CAAC,KAAK,OAAO,EAAA;AACjB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACzB,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,EAAE,CAAA,EAAG,OAAO,EAAA;AAC7B,EAAA,OAAO,IAAI,IAAA,CAAK,EAAE,CAAA,CAAE,kBAAA,CAAmB,EAAC,EAAG,EAAE,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAA,EAAW,CAAA;AACnF;AAEO,SAAS,eAAA,CAAgB;AAAA,EAC9B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,EAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ;AACF,CAAA,EAWiB;AACf,EAAA,uBACEA,cAAA;AAAA,IAACC,gCAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,WAAA;AAAA,MACA,yBAASD,cAAA,CAACE,8BAAA,EAAA,EAAa,QAAA,EAAU,SAAA,EAAW,MAAM,WAAA,EAAa,CAAA;AAAA,MAC/D,IAAA,EAAM,WAAW,EAAE,CAAA;AAAA,MACnB,IAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA;AAAA,GACF;AAEJ;AClCA,IAAM,KAAA,GAA2B,EAAE,SAAA,kBAAW,IAAI,KAAI,EAAE;AAEjD,IAAM,qBAAA,GAAwBC,oBAAiC,KAAK;AAEpE,SAAS,iBAAA,GAAuC;AACrD,EAAA,OAAOC,iBAAW,qBAAqB,CAAA;AACzC;AAUO,SAAS,qBAAqB,QAAA,EAAkD;AACrF,EAAA,MAAM,SAAA,GAAY,CAAC,CAAA,KAAyBC,2BAAA,CAAoB,EAAE,KAAA,IAAS,CAAA,CAAE,MAAM,KAAK,CAAA;AACxF,EAAA,MAAM,cAAA,GAAiBC,gCAAA;AAAA,IACrB,QAAA;AAAA,IACA,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,GAAG,cAAA,IAAkB,IAAA;AAAA,IACvC,CAAC,CAAA,KAAM,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,CAAC,CAAA,EAAG,UAAA,IAAc,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,IAAK;AAAA,GACvE;AACA,EAAA,OAAO;AAAA,IACL,WAAW,IAAI,GAAA;AAAA,MACb,CAAC,GAAG,cAAc,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,EAAE,MAAA,CAAO,CAAC,EAAA,KAAqB,CAAC,CAAC,EAAE;AAAA;AACjF,GACF;AACF","file":"chunk-IOCEKN44.cjs","sourcesContent":["/**\n * One stored line of a call transcript in its conversation (meeting chat or workspace meeting\n * thread): `TranscriptLine` from `@arbidocs/blocks`, centred for everyone. What someone is saying\n * right now shows as a provisional \"is speaking…\" row below, not as a highlight on a past line.\n */\n\nimport type { ReactElement } from 'react'\nimport { TranscriptLine } from '../../chat/TranscriptLine'\nimport { CallUserPill } from './CallUserPill'\n\nfunction formatTime(iso: string | null | undefined): string {\n if (!iso) return ''\n const at = Date.parse(iso)\n if (Number.isNaN(at)) return ''\n return new Date(at).toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })\n}\n\nexport function TranscriptEntry({\n speakerId,\n speakerName,\n text,\n at,\n continued = false,\n className,\n}: {\n /** The speaker's identity (user ext id), for `data-speaker`. */\n speakerId: string\n /** The name to show (\"Me\" for my own lines). */\n speakerName: string\n text: string\n /** ISO time the segment started (or the message was stored). */\n at: string | null | undefined\n /** A further line of the same speaker's run (no name repeated). */\n continued?: boolean\n className?: string\n}): ReactElement {\n return (\n <TranscriptLine\n speakerId={speakerId}\n speakerName={speakerName}\n speaker={<CallUserPill identity={speakerId} name={speakerName} />}\n time={formatTime(at)}\n text={text}\n continued={continued}\n className={className}\n />\n )\n}\n","/**\n * How a meeting thread's transcript lines group: which messages continue their speaker's run (the\n * name is not repeated). Provided by the conversation page, read by each transcript message.\n */\n\nimport { createContext, useContext } from 'react'\nimport { transcriptRuns } from '../../chat/transcript-runs'\nimport { transcriptSegmentOf } from '@arbidocs/react'\n\nexport interface TranscriptRunInfo {\n continued: ReadonlySet<string>\n}\n\nconst EMPTY: TranscriptRunInfo = { continued: new Set() }\n\nexport const TranscriptRunsContext = createContext<TranscriptRunInfo>(EMPTY)\n\nexport function useTranscriptRuns(): TranscriptRunInfo {\n return useContext(TranscriptRunsContext)\n}\n\ninterface ThreadMessageLike {\n external_id?: string | null\n created_at?: string | null\n tools?: unknown\n meta?: { tools?: unknown } | null\n}\n\n/** Runs of a thread's messages (in display order). */\nexport function threadTranscriptRuns(messages: ThreadMessageLike[]): TranscriptRunInfo {\n const segmentOf = (m: ThreadMessageLike) => transcriptSegmentOf(m.tools ?? m.meta?.tools)\n const continuedItems = transcriptRuns(\n messages,\n (m) => segmentOf(m)?.speaker_ext_id ?? null,\n (m) => Date.parse(segmentOf(m)?.started_at ?? m.created_at ?? '') || 0\n )\n return {\n continued: new Set(\n [...continuedItems].map((m) => m.external_id).filter((id): id is string => !!id)\n ),\n }\n}\n"]}
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import { getHumanUserCount, getWorkspaceTypeInfo, getVariantBgClass } from './chunk-57CG33XJ.js';
|
|
3
3
|
import { CollapsibleSection } from './chunk-CPLZ6XGT.js';
|
|
4
4
|
import { MemberAvatarStack } from './chunk-VGHPCF7Q.js';
|
|
5
|
+
import { WorkspaceTypeBadgeView } from './chunk-NBV56SGU.js';
|
|
5
6
|
import { ActionLink } from './chunk-KPLWLHWH.js';
|
|
6
7
|
import { fmtDate } from './chunk-X5YMI6A7.js';
|
|
7
|
-
import { WorkspaceTypeBadgeView } from './chunk-NBV56SGU.js';
|
|
8
8
|
import { FileText, MessagesSquare, Users, Check, ChevronRight, Globe, User, UserPlus, LogOut } from 'lucide-react';
|
|
9
9
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
10
10
|
import { formatRelativeTime, cn, Popover, PopoverTrigger, PopoverContent, Button, IconToggle } from '@arbidocs/react/ui';
|
|
@@ -486,5 +486,5 @@ function WorkspaceGroup({
|
|
|
486
486
|
}
|
|
487
487
|
|
|
488
488
|
export { CommonWorkspaceToggle, DEFAULT_WORKSPACE_CARD_LABELS, ExpandableSection, ItalicNone, LeaveFooter, PageLoading, WorkspaceAudienceLine, WorkspaceCard, WorkspaceGroup, WorkspaceIdentityPanel, WorkspaceList, WorkspacePageFrame, WorkspaceProjectSlot, WorkspaceTypeBadge, formatRole, getRoleBadgeClass, getRoleDescription };
|
|
489
|
-
//# sourceMappingURL=chunk-
|
|
490
|
-
//# sourceMappingURL=chunk-
|
|
489
|
+
//# sourceMappingURL=chunk-JGA2JJEL.js.map
|
|
490
|
+
//# sourceMappingURL=chunk-JGA2JJEL.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/workspaces/WorkspaceTypeBadge.tsx","../src/workspaces/WorkspaceSettingsParts.tsx","../src/workspaces/CommonWorkspaceToggle.tsx","../src/workspaces/workspace-roles.ts","../src/workspaces/WorkspaceCard.tsx","../src/workspaces/WorkspaceGroup.tsx"],"names":["jsx","Globe","cn","jsxs","Users","ChevronRight"],"mappings":"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","file":"chunk-MFEJKCCZ.js","sourcesContent":["/**\n * WorkspaceTypeBadge: a workspace's type badge (private, shared or public: icon, colour, label).\n */\n\nimport { User, Users, Globe } from 'lucide-react'\nimport type { components } from '@arbidocs/client'\nimport { WorkspaceTypeBadgeView } from './WorkspaceBadges'\nimport { getHumanUserCount, getVariantBgClass, getWorkspaceTypeInfo } from './workspace-type'\n\ntype Workspace = Pick<components['schemas']['WorkspaceResponse'], 'is_public' | 'users'>\n\nexport interface WorkspaceTypeBadgeProps {\n workspace: Workspace\n showTooltip?: boolean\n size?: 'sm' | 'md'\n isSelected?: boolean\n className?: string\n}\n\nexport function WorkspaceTypeBadge({\n workspace,\n showTooltip = false,\n size = 'md',\n isSelected = false,\n className,\n}: WorkspaceTypeBadgeProps) {\n const userCount = getHumanUserCount(workspace.users)\n const { type, variant } = getWorkspaceTypeInfo(workspace.is_public, userCount)\n const icon = workspace.is_public ? Globe : userCount > 1 ? Users : User\n\n return (\n <WorkspaceTypeBadgeView\n icon={icon}\n bgClass={getVariantBgClass(variant)}\n typeLabel={type}\n showTooltip={showTooltip}\n size={size}\n isSelected={isSelected}\n className={className}\n />\n )\n}\n","import type { ReactNode } from 'react'\nimport { LogOut, UserPlus } from 'lucide-react'\nimport { Button, cn, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/**\n * Page frame of a workspace's home: a bounded column whose ONE scroll region spans the full\n * width (scrollbar on the outer edge), the inset living on the content inside it. A container,\n * so children can use `@2xl:` queries.\n */\nexport function WorkspacePageFrame({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div\n className=\"flex h-full flex-col @container\"\n data-slot=\"workspace-page\"\n data-testid={testId}\n >\n {/* scrollbar-gutter:stable keeps the content from jumping when a scrollbar appears. */}\n <div className=\"scrollbar-subtle min-h-0 flex-1 overflow-y-auto [scrollbar-gutter:stable]\">\n <div className=\"space-y-6 px-4 pb-6 sm:px-6 pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Tinted card holding the identity bar and the expandable member list. */\nexport function WorkspaceIdentityPanel({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"workspace-identity-panel\"\n className=\"group rounded-lg border border-border bg-card px-4 py-3 shadow-xs\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceProjectSlotProps {\n testId: string\n /** Screen-reader caption (\"Project:\"): the chip says what it is without a word in front. */\n caption: string\n children: ReactNode\n}\n\n/** The project control / chip pinned to the end of the name row. */\nexport function WorkspaceProjectSlot({ testId, caption, children }: WorkspaceProjectSlotProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\" data-testid={testId}>\n <span className=\"sr-only\">{caption}</span>\n {children}\n </div>\n </div>\n )\n}\n\n/** Stated absence (\"None\") rather than a blank gap. */\nexport function ItalicNone({ children }: { children: ReactNode }) {\n return <span className=\"text-sm italic text-muted-foreground\">{children}</span>\n}\n\nexport interface WorkspaceAudienceLineProps {\n visibility: {\n testId: string\n caption: string\n /** The owner's visibility switch (developers only). */\n toggle?: ReactNode\n /** The state named in words, so the switch is never a puzzle. */\n stateText: string\n /** What the state means for who can see the workspace; opened by tapping the state words. */\n stateHelp: string\n }\n /** Member avatar stack. */\n members: ReactNode\n /** \"Share\" button (owners). */\n share?: { label: string; onClick: () => void; testId: string }\n}\n\n/** Visibility and members end the description line together: who can see and use the workspace. */\nexport function WorkspaceAudienceLine({ visibility, members, share }: WorkspaceAudienceLineProps) {\n return (\n <span className=\"flex flex-wrap items-center gap-x-4 gap-y-2\" data-slot=\"workspace-audience\">\n <span className=\"flex items-center gap-2\" data-testid={visibility.testId}>\n <span className=\"sr-only\">{visibility.caption}</span>\n {visibility.toggle}\n {/* Tap-to-explain, not hover-only: the words must answer a click on touch screens too. */}\n <Popover>\n <PopoverTrigger className=\"touch-hit cursor-pointer rounded-sm text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n {visibility.stateText}\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 text-sm\">\n {visibility.stateHelp}\n </PopoverContent>\n </Popover>\n </span>\n {/* Faces first, then Share: \"these people ... add more\". */}\n <span className=\"flex items-center gap-1\">\n {members}\n {share && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11\"\n onClick={share.onClick}\n data-testid={share.testId}\n >\n <UserPlus className=\"size-4\" />\n {share.label}\n </Button>\n )}\n </span>\n </span>\n )\n}\n\n/**\n * Collapsible block under the identity bar. Stays mounted and animates its height (grid-rows\n * 0fr to 1fr), so opening and closing glides instead of snapping.\n */\nexport function ExpandableSection({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n data-slot=\"expandable-section\"\n data-expanded={expanded}\n data-testid={testId}\n >\n <div className=\"overflow-hidden\">\n <div className=\"mt-4 border-t border-border pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Centered loading placeholder of a page body. */\nexport function PageLoading({ children }: { children: ReactNode }) {\n return <div className=\"flex h-64 items-center justify-center\">{children}</div>\n}\n\nexport interface LeaveFooterProps {\n testId?: string\n leave: { label: string; disabled?: boolean; onClick: () => void; testId?: string }\n}\n\n/** Leaving ENDS your part in the workspace, so it sits last and alone at the foot of the page. */\nexport function LeaveFooter({ testId, leave }: LeaveFooterProps) {\n return (\n <div className=\"flex justify-end\" data-slot=\"leave-footer\" data-testid={testId}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={leave.onClick}\n disabled={leave.disabled}\n className=\"h-7 px-2 text-sm text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid={leave.testId}\n >\n <LogOut className=\"mr-1 size-3.5\" />\n {leave.label}\n </Button>\n </div>\n )\n}\n","/**\n * CommonWorkspaceToggle Component\n *\n * Toggle for workspace common/members-only visibility.\n * Takes isCommon and onToggle as props for form integration.\n */\n\nimport { Globe } from 'lucide-react'\nimport { IconToggle } from '@arbidocs/react/ui'\n\nexport interface CommonWorkspaceToggleProps {\n isCommon: boolean\n onToggle: (isCommon: boolean) => void\n disabled?: boolean\n /** Tooltip to show when disabled */\n disabledTooltip?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-muted-foreground',\n bg: 'bg-gray-600',\n}\n\nexport function CommonWorkspaceToggle({\n isCommon,\n onToggle,\n disabled = false,\n disabledTooltip,\n 'data-testid': dataTestId,\n}: CommonWorkspaceToggleProps) {\n return (\n <IconToggle\n icon={Globe}\n isActive={isCommon}\n onToggle={onToggle}\n colors={COLORS}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n tooltipActive=\"On: everyone on this deployment can see it. Turn off to limit it to members.\"\n tooltipInactive=\"Off: only members of this workspace can see it. Turn on to let everyone on this deployment see it.\"\n data-testid={dataTestId}\n />\n )\n}\n","/**\n * A workspace role ('owner' | 'collaborator' | 'guest') as people see it: its name, its badge\n * colours and what it lets a member do.\n */\n\nexport type WorkspaceRoleName = 'owner' | 'collaborator' | 'guest'\n\n/** \"Owner\", \"Collaborator\", \"Guest\". */\nexport function formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1)\n}\n\nconst ROLE_BADGE_CLASSES: Record<WorkspaceRoleName, string> = {\n owner: 'bg-primary text-white hover:bg-primary border border-primary',\n collaborator: 'bg-secondary text-white hover:bg-secondary border border-secondary',\n guest: 'bg-gray-600 text-white hover:bg-gray-600 border border-gray-600',\n}\n\n/** The badge classes of a role. */\nexport function getRoleBadgeClass(role: WorkspaceRoleName): string {\n return ROLE_BADGE_CLASSES[role]\n}\n\nconst ROLE_DESCRIPTIONS: Record<WorkspaceRoleName, string> = {\n owner:\n 'Owners have full control of the workspace, including adding and removing members, but cannot see private content created by other members.',\n collaborator:\n 'Collaborators can create and edit shared content, but cannot delete shared content created by others and cannot manage workspace settings or membership.',\n guest:\n 'Guests can create private content and view shared content, but cannot create or edit shared content.',\n}\n\n/** What a role lets a member do (a tooltip). */\nexport function getRoleDescription(role: WorkspaceRoleName): string {\n return ROLE_DESCRIPTIONS[role]\n}\n","import {\n createContext,\n useContext,\n type HTMLAttributes,\n useMemo,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { Check, ChevronRight, FileText, MessagesSquare, Users } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport { fmtDate } from '../lib/format'\nimport { ActionLink } from '../components/ActionLink'\nimport { MemberAvatarStack, type StackedMember } from '../components/MemberAvatarStack'\n\n/** Everything a workspace tile shows, source-agnostic (not the raw SDK shape). */\nexport interface WorkspaceSummary {\n id: string\n name: string\n description?: string | null\n /** Host-supplied line under the name (a reference, a client, a status...). Not interpreted. */\n subtitle?: ReactNode\n docCount: number\n /** Hidden when undefined, so a host without chats shows no empty counter. */\n chatCount?: number\n /** Number of visible members (agents excluded by the caller). */\n memberCount: number\n members: StackedMember[]\n /** The viewer may not see who is here (RLS): renders an em dash, not a `0`. */\n membersHidden?: boolean\n /** ISO timestamp: rendered as \"Updated {relative}\". */\n updatedAt?: string | null\n}\n\n/** Every fixed string of the workspace tile. Pass a partial `labels` to translate or reword. */\nexport interface WorkspaceCardLabels {\n /** The tile's accessible name. */\n openWorkspace: (name: string) => string\n currentWorkspace: string\n documents: string\n chats: string\n members: string\n /** `relative` is the formatted \"3 days ago\". */\n updated: (relative: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_CARD_LABELS: WorkspaceCardLabels = {\n openWorkspace: (name) => `Open workspace ${name}`,\n currentWorkspace: 'Current workspace',\n documents: 'Documents',\n chats: 'Tasks',\n members: 'Members',\n updated: (relative) => `Updated ${relative}`,\n}\n\ninterface CardContextValue {\n current: boolean\n testId?: string\n labels: WorkspaceCardLabels\n}\n\nconst CardContext = createContext<CardContextValue>({\n current: false,\n labels: DEFAULT_WORKSPACE_CARD_LABELS,\n})\n\ntype DivProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'>\n\n/* ------------------------------------------------------------------ */\n/* Parts */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardRootProps extends DivProps {\n /** This is the workspace you are in: accented surface, \"Current workspace\" cue. */\n current?: boolean\n onSelect: () => void\n /**\n * Real link target. The tile then renders as an anchor (ctrl-click / new tab, in-SPA through\n * the host environment's `linkComponent`); `onSelect` still fires on a plain click.\n */\n href?: string\n /** Accessible name; defaults to `labels.openWorkspace(name)` when composed via `WorkspaceCard`. */\n label: string\n testId?: string\n labels?: Partial<WorkspaceCardLabels>\n children: ReactNode\n}\n\n/**\n * The tile surface: one button that opens the workspace. A raised white card\n * (hairline border, soft shadow, hover lift); the current workspace takes the selection tint.\n */\nfunction WorkspaceCardRoot({\n current = false,\n onSelect,\n href,\n label,\n testId,\n labels,\n className,\n children,\n ...rest\n}: WorkspaceCardRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }), [labels])\n const surfaceClass = cn(\n '@container/ws-card flex min-h-40 w-full cursor-pointer flex-col gap-3 rounded-lg p-4 text-left transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n current\n ? 'bg-accent text-accent-foreground'\n : 'border border-border bg-card shadow-xs transition-colors hover:border-ring/50 hover:bg-accent/40',\n className\n )\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onSelect()\n }\n }\n return (\n <CardContext.Provider value={{ current, testId, labels: mergedLabels }}>\n {href ? (\n <ActionLink\n {...(rest as object)}\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n className={surfaceClass}\n >\n {children}\n </ActionLink>\n ) : (\n <div\n {...rest}\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n onClick={onSelect}\n onKeyDown={handleKeyDown}\n className={surfaceClass}\n >\n {children}\n </div>\n )}\n </CardContext.Provider>\n )\n}\n\n/** Mark + name + open cue, on one row. Put the entity mark first. */\nfunction WorkspaceCardHeader({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('flex flex-wrap items-center gap-x-3 gap-y-2', className)}\n data-slot=\"workspace-card-header\"\n >\n {children}\n </div>\n )\n}\n\nfunction WorkspaceCardTitle({ children, className }: { children: ReactNode; className?: string }) {\n const { testId } = useContext(CardContext)\n return (\n <h3\n className={cn(\n 'line-clamp-2 min-w-24 flex-1 break-words text-base font-semibold leading-tight text-foreground',\n className\n )}\n data-slot=\"workspace-card-title\"\n data-testid={testId && `${testId}-title`}\n >\n {children}\n </h3>\n )\n}\n\n/**\n * The open cue is always on screen (never hover-only): a chevron, or the words\n * \"Current workspace\" on the one you are in.\n */\nfunction WorkspaceCardOpenCue({\n testId,\n currentLabel,\n}: {\n /** Deliberately separate from the card id: suites count cards by prefix. */\n testId?: string\n /** Overrides `labels.currentWorkspace`. */\n currentLabel?: string\n}) {\n const { current, labels } = useContext(CardContext)\n return (\n <span\n className=\"inline-flex max-w-full min-w-0 shrink-0 items-center text-sm text-muted-foreground\"\n data-slot=\"workspace-card-open-cue\"\n data-testid={testId}\n >\n {current ? (\n // Never wider than the card: the words truncate, and in a card narrower than 20rem\n // the pill shrinks to a check (the words stay as the accessible name).\n <span className=\"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full bg-background px-2 py-0.5 text-xs font-medium text-foreground\">\n <Check className=\"hidden size-3 shrink-0 @max-xs/ws-card:block\" aria-hidden=\"true\" />\n <span className=\"min-w-0 truncate @max-xs/ws-card:sr-only\">\n {currentLabel ?? labels.currentWorkspace}\n </span>\n </span>\n ) : (\n <ChevronRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n </span>\n )\n}\n\nfunction WorkspaceCardDescription({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <p\n className={cn('line-clamp-2 text-sm text-muted-foreground', className)}\n title={typeof children === 'string' ? children : undefined}\n data-slot=\"workspace-card-description\"\n >\n {children}\n </p>\n )\n}\n\n/** Host-supplied line under the title. */\nfunction WorkspaceCardSubtitle({\n className,\n children,\n ...rest\n}: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('truncate text-xs text-muted-foreground', className)}\n data-slot=\"workspace-card-subtitle\"\n >\n {children}\n </div>\n )\n}\n\n/** Footer block: stats row and meta line, pinned to the bottom of the tile. */\nfunction WorkspaceCardFooter({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div {...rest} className={cn('mt-auto flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceCardStatsProps {\n docCount: number\n /** Omit to hide the chats counter. */\n chatCount?: number\n memberCount: number\n members?: StackedMember[]\n membersHidden?: boolean\n /** Faces before the rest collapse into `+N`. */\n maxAvatars?: number\n className?: string\n}\n\n/** Documents / chats / members counts, with the member faces at the trailing edge. */\nfunction WorkspaceCardStats({\n docCount,\n chatCount,\n memberCount,\n members = [],\n membersHidden = false,\n maxAvatars = 3,\n className,\n}: WorkspaceCardStatsProps) {\n const { current, testId, labels } = useContext(CardContext)\n return (\n <div\n className={cn('flex w-full items-center gap-x-4 text-sm text-muted-foreground', className)}\n data-slot=\"workspace-card-stats\"\n >\n <span className=\"inline-flex items-center gap-1.5\" title={labels.documents}>\n <FileText className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{docCount.toLocaleString()}</span>\n </span>\n {chatCount !== undefined && (\n <span className=\"inline-flex items-center gap-1.5\" title={labels.chats}>\n <MessagesSquare className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{chatCount.toLocaleString()}</span>\n </span>\n )}\n <span className=\"inline-flex items-center gap-1.5\" title={labels.members}>\n <Users className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\" data-testid={testId && `${testId}-member-count`}>\n {membersHidden ? '—' : memberCount}\n </span>\n </span>\n <MemberAvatarStack\n members={members}\n total={memberCount}\n max={maxAvatars}\n hidden={membersHidden}\n ringClassName={current ? 'ring-accent' : 'ring-muted'}\n label={labels.members}\n className=\"ml-auto\"\n testId={testId && `${testId}-member-avatars`}\n />\n </div>\n )\n}\n\n/** \"Updated 3 days ago\", with the exact date on the title. */\nfunction WorkspaceCardMeta({ updatedAt }: { updatedAt: string }) {\n const { labels } = useContext(CardContext)\n return (\n <span\n className=\"min-w-0 max-w-full self-start truncate text-xs text-muted-foreground\"\n title={fmtDate(updatedAt)}\n data-slot=\"workspace-card-meta\"\n >\n {labels.updated(formatRelativeTime(updatedAt))}\n </span>\n )\n}\n\n/* ------------------------------------------------------------------ */\n/* Default composition */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardProps {\n workspace: WorkspaceSummary\n current?: boolean\n onSelect: () => void\n /** Real link target; see `WorkspaceCard.Root`. */\n href?: string\n /** The entity mark shown before the name (the host's own workspace glyph). */\n mark?: ReactNode\n /** Card id; derived ids: `-title`, `-member-count`, `-member-avatars`. */\n testId?: string\n /** Id for the open cue (kept apart from `testId`, see `WorkspaceCard.OpenCue`). */\n openCueTestId?: string\n maxAvatars?: number\n /**\n * The stats row: omit for the default counts + member faces, `false` to hide it, or any node to\n * replace it.\n */\n stats?: ReactNode | false\n /** Reword the tile's fixed strings. */\n labels?: Partial<WorkspaceCardLabels>\n className?: string\n}\n\n/**\n * The workspace tile: mark + name + open cue, description, stats and meta.\n * The whole tile opens the workspace; nothing on it is hover-only.\n *\n * Need a different layout? Compose the parts: `WorkspaceCard.Root`, `.Header`,\n * `.Title`, `.OpenCue`, `.Subtitle`, `.Description`, `.Footer`, `.Stats`, `.Meta`.\n */\nfunction WorkspaceCardBase({\n workspace,\n current = false,\n onSelect,\n href,\n mark,\n testId,\n openCueTestId,\n maxAvatars,\n stats,\n labels,\n className,\n}: WorkspaceCardProps) {\n const mergedLabels = { ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }\n return (\n <WorkspaceCardRoot\n current={current}\n onSelect={onSelect}\n href={href}\n label={mergedLabels.openWorkspace(workspace.name)}\n labels={labels}\n testId={testId}\n className={className}\n >\n <WorkspaceCardHeader>\n {mark}\n <WorkspaceCardTitle>{workspace.name}</WorkspaceCardTitle>\n <WorkspaceCardOpenCue testId={openCueTestId} />\n </WorkspaceCardHeader>\n {workspace.subtitle && <WorkspaceCardSubtitle>{workspace.subtitle}</WorkspaceCardSubtitle>}\n {workspace.description && (\n <WorkspaceCardDescription>{workspace.description}</WorkspaceCardDescription>\n )}\n <WorkspaceCardFooter>\n {stats === undefined ? (\n <WorkspaceCardStats\n docCount={workspace.docCount}\n chatCount={workspace.chatCount}\n memberCount={workspace.memberCount}\n members={workspace.members}\n membersHidden={workspace.membersHidden}\n maxAvatars={maxAvatars}\n />\n ) : (\n stats\n )}\n {workspace.updatedAt && <WorkspaceCardMeta updatedAt={workspace.updatedAt} />}\n </WorkspaceCardFooter>\n </WorkspaceCardRoot>\n )\n}\n\nexport const WorkspaceCard = Object.assign(WorkspaceCardBase, {\n Root: WorkspaceCardRoot,\n Header: WorkspaceCardHeader,\n Title: WorkspaceCardTitle,\n OpenCue: WorkspaceCardOpenCue,\n Subtitle: WorkspaceCardSubtitle,\n Description: WorkspaceCardDescription,\n Footer: WorkspaceCardFooter,\n Stats: WorkspaceCardStats,\n Meta: WorkspaceCardMeta,\n})\n","import type { ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { CollapsibleSection } from '../home/CollapsibleSection'\n\nexport interface WorkspaceListProps {\n children: ReactNode\n className?: string\n testId?: string\n}\n\n/** The column that stacks workspace groups (padding follows the page gutter). */\nexport function WorkspaceList({ children, className, testId }: WorkspaceListProps) {\n return (\n <div\n className={cn('flex w-full flex-col gap-2 px-4 py-4 sm:px-8', className)}\n data-slot=\"workspace-list\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceGroupProps {\n /** Group heading: name, count, badges. Plain text on the canvas, no band. */\n title: ReactNode\n isExpanded: boolean\n onToggle: () => void\n /**\n * Makes the whole header one target (e.g. open the project panel); the\n * chevron stays a separate toggle. Adds a trailing `openLabel` affordance.\n */\n onOpen?: () => void\n /** Words beside the trailing chevron when `onOpen` is set, e.g. \"Plans & Usage\". */\n openLabel?: string\n /** Muted words on the right of a collapsed group without `onOpen`, e.g. \"Show 11 shared workspaces\". */\n collapsedHint?: string\n /** The cards, laid out in a responsive grid (1 / 2 / 3 columns). */\n children: ReactNode\n className?: string\n}\n\n/**\n * One collapsible band of workspace tiles under a slim header. The open\n * affordance is always visible, so nothing is reachable by hover alone.\n */\nexport function WorkspaceGroup({\n title,\n isExpanded,\n onToggle,\n onOpen,\n openLabel,\n collapsedHint,\n children,\n className,\n}: WorkspaceGroupProps) {\n return (\n <CollapsibleSection\n title={title}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onHeaderClick={onOpen}\n rightContent={\n onOpen && openLabel ? (\n <span className=\"flex shrink-0 items-center gap-1 text-sm font-medium text-muted-foreground\">\n {openLabel}\n <ChevronRight className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n </span>\n ) : collapsedHint && !isExpanded ? (\n <span className=\"shrink-0 text-sm text-muted-foreground\">{collapsedHint}</span>\n ) : undefined\n }\n className={cn('group', className)}\n headerClassName=\"mb-3 flex-wrap gap-y-2 rounded-md px-1 py-1 pointer-coarse:min-h-11\"\n childrenClassName=\"mb-8 grid gap-3 @xl:grid-cols-2 @5xl:grid-cols-3\"\n >\n {children}\n </CollapsibleSection>\n )\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/workspaces/WorkspaceTypeBadge.tsx","../src/workspaces/WorkspaceSettingsParts.tsx","../src/workspaces/CommonWorkspaceToggle.tsx","../src/workspaces/workspace-roles.ts","../src/workspaces/WorkspaceCard.tsx","../src/workspaces/WorkspaceGroup.tsx"],"names":["jsx","Globe","cn","jsxs","Users","ChevronRight"],"mappings":"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","file":"chunk-JGA2JJEL.js","sourcesContent":["/**\n * WorkspaceTypeBadge: a workspace's type badge (private, shared or public: icon, colour, label).\n */\n\nimport { User, Users, Globe } from 'lucide-react'\nimport type { components } from '@arbidocs/client'\nimport { WorkspaceTypeBadgeView } from './WorkspaceBadges'\nimport { getHumanUserCount, getVariantBgClass, getWorkspaceTypeInfo } from './workspace-type'\n\ntype Workspace = Pick<components['schemas']['WorkspaceResponse'], 'is_public' | 'users'>\n\nexport interface WorkspaceTypeBadgeProps {\n workspace: Workspace\n showTooltip?: boolean\n size?: 'sm' | 'md'\n isSelected?: boolean\n className?: string\n}\n\nexport function WorkspaceTypeBadge({\n workspace,\n showTooltip = false,\n size = 'md',\n isSelected = false,\n className,\n}: WorkspaceTypeBadgeProps) {\n const userCount = getHumanUserCount(workspace.users)\n const { type, variant } = getWorkspaceTypeInfo(workspace.is_public, userCount)\n const icon = workspace.is_public ? Globe : userCount > 1 ? Users : User\n\n return (\n <WorkspaceTypeBadgeView\n icon={icon}\n bgClass={getVariantBgClass(variant)}\n typeLabel={type}\n showTooltip={showTooltip}\n size={size}\n isSelected={isSelected}\n className={className}\n />\n )\n}\n","import type { ReactNode } from 'react'\nimport { LogOut, UserPlus } from 'lucide-react'\nimport { Button, cn, Popover, PopoverContent, PopoverTrigger } from '@arbidocs/react/ui'\n\n/**\n * Page frame of a workspace's home: a bounded column whose ONE scroll region spans the full\n * width (scrollbar on the outer edge), the inset living on the content inside it. A container,\n * so children can use `@2xl:` queries.\n */\nexport function WorkspacePageFrame({ testId, children }: { testId?: string; children: ReactNode }) {\n return (\n <div\n className=\"flex h-full flex-col @container\"\n data-slot=\"workspace-page\"\n data-testid={testId}\n >\n {/* scrollbar-gutter:stable keeps the content from jumping when a scrollbar appears. */}\n <div className=\"scrollbar-subtle min-h-0 flex-1 overflow-y-auto [scrollbar-gutter:stable]\">\n <div className=\"space-y-6 px-4 pb-6 sm:px-6 pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Tinted card holding the identity bar and the expandable member list. */\nexport function WorkspaceIdentityPanel({ children }: { children: ReactNode }) {\n return (\n <div\n data-slot=\"workspace-identity-panel\"\n className=\"group rounded-lg border border-border bg-card px-4 py-3 shadow-xs\"\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceProjectSlotProps {\n testId: string\n /** Screen-reader caption (\"Project:\"): the chip says what it is without a word in front. */\n caption: string\n children: ReactNode\n}\n\n/** The project control / chip pinned to the end of the name row. */\nexport function WorkspaceProjectSlot({ testId, caption, children }: WorkspaceProjectSlotProps) {\n return (\n <div className=\"flex min-w-0 items-center gap-3\">\n <div className=\"flex min-w-0 flex-1 items-center gap-2\" data-testid={testId}>\n <span className=\"sr-only\">{caption}</span>\n {children}\n </div>\n </div>\n )\n}\n\n/** Stated absence (\"None\") rather than a blank gap. */\nexport function ItalicNone({ children }: { children: ReactNode }) {\n return <span className=\"text-sm italic text-muted-foreground\">{children}</span>\n}\n\nexport interface WorkspaceAudienceLineProps {\n visibility: {\n testId: string\n caption: string\n /** The owner's visibility switch (developers only). */\n toggle?: ReactNode\n /** The state named in words, so the switch is never a puzzle. */\n stateText: string\n /** What the state means for who can see the workspace; opened by tapping the state words. */\n stateHelp: string\n }\n /** Member avatar stack. */\n members: ReactNode\n /** \"Share\" button (owners). */\n share?: { label: string; onClick: () => void; testId: string }\n}\n\n/** Visibility and members end the description line together: who can see and use the workspace. */\nexport function WorkspaceAudienceLine({ visibility, members, share }: WorkspaceAudienceLineProps) {\n return (\n <span className=\"flex flex-wrap items-center gap-x-4 gap-y-2\" data-slot=\"workspace-audience\">\n <span className=\"flex items-center gap-2\" data-testid={visibility.testId}>\n <span className=\"sr-only\">{visibility.caption}</span>\n {visibility.toggle}\n {/* Tap-to-explain, not hover-only: the words must answer a click on touch screens too. */}\n <Popover>\n <PopoverTrigger className=\"touch-hit cursor-pointer rounded-sm text-sm text-muted-foreground underline decoration-dotted underline-offset-4 hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\">\n {visibility.stateText}\n </PopoverTrigger>\n <PopoverContent align=\"start\" className=\"w-64 text-sm\">\n {visibility.stateHelp}\n </PopoverContent>\n </Popover>\n </span>\n {/* Faces first, then Share: \"these people ... add more\". */}\n <span className=\"flex items-center gap-1\">\n {members}\n {share && (\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 gap-1.5 px-3 text-sm pointer-coarse:h-11\"\n onClick={share.onClick}\n data-testid={share.testId}\n >\n <UserPlus className=\"size-4\" />\n {share.label}\n </Button>\n )}\n </span>\n </span>\n )\n}\n\n/**\n * Collapsible block under the identity bar. Stays mounted and animates its height (grid-rows\n * 0fr to 1fr), so opening and closing glides instead of snapping.\n */\nexport function ExpandableSection({\n expanded,\n testId,\n children,\n}: {\n expanded: boolean\n testId?: string\n children: ReactNode\n}) {\n return (\n <div\n className={cn(\n 'grid transition-[grid-template-rows] duration-300 ease-in-out',\n expanded ? 'grid-rows-[1fr]' : 'grid-rows-[0fr]'\n )}\n data-slot=\"expandable-section\"\n data-expanded={expanded}\n data-testid={testId}\n >\n <div className=\"overflow-hidden\">\n <div className=\"mt-4 border-t border-border pt-4\">{children}</div>\n </div>\n </div>\n )\n}\n\n/** Centered loading placeholder of a page body. */\nexport function PageLoading({ children }: { children: ReactNode }) {\n return <div className=\"flex h-64 items-center justify-center\">{children}</div>\n}\n\nexport interface LeaveFooterProps {\n testId?: string\n leave: { label: string; disabled?: boolean; onClick: () => void; testId?: string }\n}\n\n/** Leaving ENDS your part in the workspace, so it sits last and alone at the foot of the page. */\nexport function LeaveFooter({ testId, leave }: LeaveFooterProps) {\n return (\n <div className=\"flex justify-end\" data-slot=\"leave-footer\" data-testid={testId}>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={leave.onClick}\n disabled={leave.disabled}\n className=\"h-7 px-2 text-sm text-destructive hover:bg-destructive/10 hover:text-destructive pointer-coarse:h-11\"\n data-testid={leave.testId}\n >\n <LogOut className=\"mr-1 size-3.5\" />\n {leave.label}\n </Button>\n </div>\n )\n}\n","/**\n * CommonWorkspaceToggle Component\n *\n * Toggle for workspace common/members-only visibility.\n * Takes isCommon and onToggle as props for form integration.\n */\n\nimport { Globe } from 'lucide-react'\nimport { IconToggle } from '@arbidocs/react/ui'\n\nexport interface CommonWorkspaceToggleProps {\n isCommon: boolean\n onToggle: (isCommon: boolean) => void\n disabled?: boolean\n /** Tooltip to show when disabled */\n disabledTooltip?: string\n 'data-testid'?: string\n}\n\nconst COLORS = {\n text: 'text-muted-foreground',\n bg: 'bg-gray-600',\n}\n\nexport function CommonWorkspaceToggle({\n isCommon,\n onToggle,\n disabled = false,\n disabledTooltip,\n 'data-testid': dataTestId,\n}: CommonWorkspaceToggleProps) {\n return (\n <IconToggle\n icon={Globe}\n isActive={isCommon}\n onToggle={onToggle}\n colors={COLORS}\n disabled={disabled}\n disabledTooltip={disabledTooltip}\n tooltipActive=\"On: everyone on this deployment can see it. Turn off to limit it to members.\"\n tooltipInactive=\"Off: only members of this workspace can see it. Turn on to let everyone on this deployment see it.\"\n data-testid={dataTestId}\n />\n )\n}\n","/**\n * A workspace role ('owner' | 'collaborator' | 'guest') as people see it: its name, its badge\n * colours and what it lets a member do.\n */\n\nexport type WorkspaceRoleName = 'owner' | 'collaborator' | 'guest'\n\n/** \"Owner\", \"Collaborator\", \"Guest\". */\nexport function formatRole(role: string): string {\n return role.charAt(0).toUpperCase() + role.slice(1)\n}\n\nconst ROLE_BADGE_CLASSES: Record<WorkspaceRoleName, string> = {\n owner: 'bg-primary text-white hover:bg-primary border border-primary',\n collaborator: 'bg-secondary text-white hover:bg-secondary border border-secondary',\n guest: 'bg-gray-600 text-white hover:bg-gray-600 border border-gray-600',\n}\n\n/** The badge classes of a role. */\nexport function getRoleBadgeClass(role: WorkspaceRoleName): string {\n return ROLE_BADGE_CLASSES[role]\n}\n\nconst ROLE_DESCRIPTIONS: Record<WorkspaceRoleName, string> = {\n owner:\n 'Owners have full control of the workspace, including adding and removing members, but cannot see private content created by other members.',\n collaborator:\n 'Collaborators can create and edit shared content, but cannot delete shared content created by others and cannot manage workspace settings or membership.',\n guest:\n 'Guests can create private content and view shared content, but cannot create or edit shared content.',\n}\n\n/** What a role lets a member do (a tooltip). */\nexport function getRoleDescription(role: WorkspaceRoleName): string {\n return ROLE_DESCRIPTIONS[role]\n}\n","import {\n createContext,\n useContext,\n type HTMLAttributes,\n useMemo,\n type KeyboardEvent,\n type ReactNode,\n} from 'react'\nimport { Check, ChevronRight, FileText, MessagesSquare, Users } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { formatRelativeTime } from '@arbidocs/react/ui'\nimport { fmtDate } from '../lib/format'\nimport { ActionLink } from '../components/ActionLink'\nimport { MemberAvatarStack, type StackedMember } from '../components/MemberAvatarStack'\n\n/** Everything a workspace tile shows, source-agnostic (not the raw SDK shape). */\nexport interface WorkspaceSummary {\n id: string\n name: string\n description?: string | null\n /** Host-supplied line under the name (a reference, a client, a status...). Not interpreted. */\n subtitle?: ReactNode\n docCount: number\n /** Hidden when undefined, so a host without chats shows no empty counter. */\n chatCount?: number\n /** Number of visible members (agents excluded by the caller). */\n memberCount: number\n members: StackedMember[]\n /** The viewer may not see who is here (RLS): renders an em dash, not a `0`. */\n membersHidden?: boolean\n /** ISO timestamp: rendered as \"Updated {relative}\". */\n updatedAt?: string | null\n}\n\n/** Every fixed string of the workspace tile. Pass a partial `labels` to translate or reword. */\nexport interface WorkspaceCardLabels {\n /** The tile's accessible name. */\n openWorkspace: (name: string) => string\n currentWorkspace: string\n documents: string\n chats: string\n members: string\n /** `relative` is the formatted \"3 days ago\". */\n updated: (relative: string) => string\n}\n\nexport const DEFAULT_WORKSPACE_CARD_LABELS: WorkspaceCardLabels = {\n openWorkspace: (name) => `Open workspace ${name}`,\n currentWorkspace: 'Current workspace',\n documents: 'Documents',\n chats: 'Tasks',\n members: 'Members',\n updated: (relative) => `Updated ${relative}`,\n}\n\ninterface CardContextValue {\n current: boolean\n testId?: string\n labels: WorkspaceCardLabels\n}\n\nconst CardContext = createContext<CardContextValue>({\n current: false,\n labels: DEFAULT_WORKSPACE_CARD_LABELS,\n})\n\ntype DivProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'>\n\n/* ------------------------------------------------------------------ */\n/* Parts */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardRootProps extends DivProps {\n /** This is the workspace you are in: accented surface, \"Current workspace\" cue. */\n current?: boolean\n onSelect: () => void\n /**\n * Real link target. The tile then renders as an anchor (ctrl-click / new tab, in-SPA through\n * the host environment's `linkComponent`); `onSelect` still fires on a plain click.\n */\n href?: string\n /** Accessible name; defaults to `labels.openWorkspace(name)` when composed via `WorkspaceCard`. */\n label: string\n testId?: string\n labels?: Partial<WorkspaceCardLabels>\n children: ReactNode\n}\n\n/**\n * The tile surface: one button that opens the workspace. A raised white card\n * (hairline border, soft shadow, hover lift); the current workspace takes the selection tint.\n */\nfunction WorkspaceCardRoot({\n current = false,\n onSelect,\n href,\n label,\n testId,\n labels,\n className,\n children,\n ...rest\n}: WorkspaceCardRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }), [labels])\n const surfaceClass = cn(\n '@container/ws-card flex min-h-40 w-full cursor-pointer flex-col gap-3 rounded-lg p-4 text-left transition-colors',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n current\n ? 'bg-accent text-accent-foreground'\n : 'border border-border bg-card shadow-xs transition-colors hover:border-ring/50 hover:bg-accent/40',\n className\n )\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault()\n onSelect()\n }\n }\n return (\n <CardContext.Provider value={{ current, testId, labels: mergedLabels }}>\n {href ? (\n <ActionLink\n {...(rest as object)}\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n className={surfaceClass}\n >\n {children}\n </ActionLink>\n ) : (\n <div\n {...rest}\n role=\"button\"\n tabIndex={0}\n aria-label={label}\n aria-current={current ? 'page' : undefined}\n data-slot=\"workspace-card\"\n data-testid={testId}\n data-active={current || undefined}\n onClick={onSelect}\n onKeyDown={handleKeyDown}\n className={surfaceClass}\n >\n {children}\n </div>\n )}\n </CardContext.Provider>\n )\n}\n\n/** Mark + name + open cue, on one row. Put the entity mark first. */\nfunction WorkspaceCardHeader({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('flex flex-wrap items-center gap-x-3 gap-y-2', className)}\n data-slot=\"workspace-card-header\"\n >\n {children}\n </div>\n )\n}\n\nfunction WorkspaceCardTitle({ children, className }: { children: ReactNode; className?: string }) {\n const { testId } = useContext(CardContext)\n return (\n <h3\n className={cn(\n 'line-clamp-2 min-w-24 flex-1 break-words text-base font-semibold leading-tight text-foreground',\n className\n )}\n data-slot=\"workspace-card-title\"\n data-testid={testId && `${testId}-title`}\n >\n {children}\n </h3>\n )\n}\n\n/**\n * The open cue is always on screen (never hover-only): a chevron, or the words\n * \"Current workspace\" on the one you are in.\n */\nfunction WorkspaceCardOpenCue({\n testId,\n currentLabel,\n}: {\n /** Deliberately separate from the card id: suites count cards by prefix. */\n testId?: string\n /** Overrides `labels.currentWorkspace`. */\n currentLabel?: string\n}) {\n const { current, labels } = useContext(CardContext)\n return (\n <span\n className=\"inline-flex max-w-full min-w-0 shrink-0 items-center text-sm text-muted-foreground\"\n data-slot=\"workspace-card-open-cue\"\n data-testid={testId}\n >\n {current ? (\n // Never wider than the card: the words truncate, and in a card narrower than 20rem\n // the pill shrinks to a check (the words stay as the accessible name).\n <span className=\"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full bg-background px-2 py-0.5 text-xs font-medium text-foreground\">\n <Check className=\"hidden size-3 shrink-0 @max-xs/ws-card:block\" aria-hidden=\"true\" />\n <span className=\"min-w-0 truncate @max-xs/ws-card:sr-only\">\n {currentLabel ?? labels.currentWorkspace}\n </span>\n </span>\n ) : (\n <ChevronRight className=\"size-4\" aria-hidden=\"true\" />\n )}\n </span>\n )\n}\n\nfunction WorkspaceCardDescription({\n children,\n className,\n}: {\n children: ReactNode\n className?: string\n}) {\n return (\n <p\n className={cn('line-clamp-2 text-sm text-muted-foreground', className)}\n title={typeof children === 'string' ? children : undefined}\n data-slot=\"workspace-card-description\"\n >\n {children}\n </p>\n )\n}\n\n/** Host-supplied line under the title. */\nfunction WorkspaceCardSubtitle({\n className,\n children,\n ...rest\n}: DivProps & { children: ReactNode }) {\n return (\n <div\n {...rest}\n className={cn('truncate text-xs text-muted-foreground', className)}\n data-slot=\"workspace-card-subtitle\"\n >\n {children}\n </div>\n )\n}\n\n/** Footer block: stats row and meta line, pinned to the bottom of the tile. */\nfunction WorkspaceCardFooter({ className, children, ...rest }: DivProps & { children: ReactNode }) {\n return (\n <div {...rest} className={cn('mt-auto flex flex-col gap-2', className)}>\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceCardStatsProps {\n docCount: number\n /** Omit to hide the chats counter. */\n chatCount?: number\n memberCount: number\n members?: StackedMember[]\n membersHidden?: boolean\n /** Faces before the rest collapse into `+N`. */\n maxAvatars?: number\n className?: string\n}\n\n/** Documents / chats / members counts, with the member faces at the trailing edge. */\nfunction WorkspaceCardStats({\n docCount,\n chatCount,\n memberCount,\n members = [],\n membersHidden = false,\n maxAvatars = 3,\n className,\n}: WorkspaceCardStatsProps) {\n const { current, testId, labels } = useContext(CardContext)\n return (\n <div\n className={cn('flex w-full items-center gap-x-4 text-sm text-muted-foreground', className)}\n data-slot=\"workspace-card-stats\"\n >\n <span className=\"inline-flex items-center gap-1.5\" title={labels.documents}>\n <FileText className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{docCount.toLocaleString()}</span>\n </span>\n {chatCount !== undefined && (\n <span className=\"inline-flex items-center gap-1.5\" title={labels.chats}>\n <MessagesSquare className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\">{chatCount.toLocaleString()}</span>\n </span>\n )}\n <span className=\"inline-flex items-center gap-1.5\" title={labels.members}>\n <Users className=\"size-4\" aria-hidden=\"true\" />\n <span className=\"tabular-nums\" data-testid={testId && `${testId}-member-count`}>\n {membersHidden ? '—' : memberCount}\n </span>\n </span>\n <MemberAvatarStack\n members={members}\n total={memberCount}\n max={maxAvatars}\n hidden={membersHidden}\n ringClassName={current ? 'ring-accent' : 'ring-muted'}\n label={labels.members}\n className=\"ml-auto\"\n testId={testId && `${testId}-member-avatars`}\n />\n </div>\n )\n}\n\n/** \"Updated 3 days ago\", with the exact date on the title. */\nfunction WorkspaceCardMeta({ updatedAt }: { updatedAt: string }) {\n const { labels } = useContext(CardContext)\n return (\n <span\n className=\"min-w-0 max-w-full self-start truncate text-xs text-muted-foreground\"\n title={fmtDate(updatedAt)}\n data-slot=\"workspace-card-meta\"\n >\n {labels.updated(formatRelativeTime(updatedAt))}\n </span>\n )\n}\n\n/* ------------------------------------------------------------------ */\n/* Default composition */\n/* ------------------------------------------------------------------ */\n\nexport interface WorkspaceCardProps {\n workspace: WorkspaceSummary\n current?: boolean\n onSelect: () => void\n /** Real link target; see `WorkspaceCard.Root`. */\n href?: string\n /** The entity mark shown before the name (the host's own workspace glyph). */\n mark?: ReactNode\n /** Card id; derived ids: `-title`, `-member-count`, `-member-avatars`. */\n testId?: string\n /** Id for the open cue (kept apart from `testId`, see `WorkspaceCard.OpenCue`). */\n openCueTestId?: string\n maxAvatars?: number\n /**\n * The stats row: omit for the default counts + member faces, `false` to hide it, or any node to\n * replace it.\n */\n stats?: ReactNode | false\n /** Reword the tile's fixed strings. */\n labels?: Partial<WorkspaceCardLabels>\n className?: string\n}\n\n/**\n * The workspace tile: mark + name + open cue, description, stats and meta.\n * The whole tile opens the workspace; nothing on it is hover-only.\n *\n * Need a different layout? Compose the parts: `WorkspaceCard.Root`, `.Header`,\n * `.Title`, `.OpenCue`, `.Subtitle`, `.Description`, `.Footer`, `.Stats`, `.Meta`.\n */\nfunction WorkspaceCardBase({\n workspace,\n current = false,\n onSelect,\n href,\n mark,\n testId,\n openCueTestId,\n maxAvatars,\n stats,\n labels,\n className,\n}: WorkspaceCardProps) {\n const mergedLabels = { ...DEFAULT_WORKSPACE_CARD_LABELS, ...labels }\n return (\n <WorkspaceCardRoot\n current={current}\n onSelect={onSelect}\n href={href}\n label={mergedLabels.openWorkspace(workspace.name)}\n labels={labels}\n testId={testId}\n className={className}\n >\n <WorkspaceCardHeader>\n {mark}\n <WorkspaceCardTitle>{workspace.name}</WorkspaceCardTitle>\n <WorkspaceCardOpenCue testId={openCueTestId} />\n </WorkspaceCardHeader>\n {workspace.subtitle && <WorkspaceCardSubtitle>{workspace.subtitle}</WorkspaceCardSubtitle>}\n {workspace.description && (\n <WorkspaceCardDescription>{workspace.description}</WorkspaceCardDescription>\n )}\n <WorkspaceCardFooter>\n {stats === undefined ? (\n <WorkspaceCardStats\n docCount={workspace.docCount}\n chatCount={workspace.chatCount}\n memberCount={workspace.memberCount}\n members={workspace.members}\n membersHidden={workspace.membersHidden}\n maxAvatars={maxAvatars}\n />\n ) : (\n stats\n )}\n {workspace.updatedAt && <WorkspaceCardMeta updatedAt={workspace.updatedAt} />}\n </WorkspaceCardFooter>\n </WorkspaceCardRoot>\n )\n}\n\nexport const WorkspaceCard = Object.assign(WorkspaceCardBase, {\n Root: WorkspaceCardRoot,\n Header: WorkspaceCardHeader,\n Title: WorkspaceCardTitle,\n OpenCue: WorkspaceCardOpenCue,\n Subtitle: WorkspaceCardSubtitle,\n Description: WorkspaceCardDescription,\n Footer: WorkspaceCardFooter,\n Stats: WorkspaceCardStats,\n Meta: WorkspaceCardMeta,\n})\n","import type { ReactNode } from 'react'\nimport { ChevronRight } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\nimport { CollapsibleSection } from '../home/CollapsibleSection'\n\nexport interface WorkspaceListProps {\n children: ReactNode\n className?: string\n testId?: string\n}\n\n/** The column that stacks workspace groups (padding follows the page gutter). */\nexport function WorkspaceList({ children, className, testId }: WorkspaceListProps) {\n return (\n <div\n className={cn('flex w-full flex-col gap-2 px-4 py-4 sm:px-8', className)}\n data-slot=\"workspace-list\"\n data-testid={testId}\n >\n {children}\n </div>\n )\n}\n\nexport interface WorkspaceGroupProps {\n /** Group heading: name, count, badges. Plain text on the canvas, no band. */\n title: ReactNode\n isExpanded: boolean\n onToggle: () => void\n /**\n * Makes the whole header one target (e.g. open the project panel); the\n * chevron stays a separate toggle. Adds a trailing `openLabel` affordance.\n */\n onOpen?: () => void\n /** Words beside the trailing chevron when `onOpen` is set, e.g. \"Plans & Usage\". */\n openLabel?: string\n /** Muted words on the right of a collapsed group without `onOpen`, e.g. \"Show 11 shared workspaces\". */\n collapsedHint?: string\n /** The cards, laid out in a responsive grid (1 / 2 / 3 columns). */\n children: ReactNode\n className?: string\n}\n\n/**\n * One collapsible band of workspace tiles under a slim header. The open\n * affordance is always visible, so nothing is reachable by hover alone.\n */\nexport function WorkspaceGroup({\n title,\n isExpanded,\n onToggle,\n onOpen,\n openLabel,\n collapsedHint,\n children,\n className,\n}: WorkspaceGroupProps) {\n return (\n <CollapsibleSection\n title={title}\n isExpanded={isExpanded}\n onToggle={onToggle}\n onHeaderClick={onOpen}\n rightContent={\n onOpen && openLabel ? (\n <span className=\"flex shrink-0 items-center gap-1 text-sm font-medium text-muted-foreground\">\n {openLabel}\n <ChevronRight className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n </span>\n ) : collapsedHint && !isExpanded ? (\n <span className=\"shrink-0 text-sm text-muted-foreground\">{collapsedHint}</span>\n ) : undefined\n }\n className={cn('group', className)}\n headerClassName=\"mb-3 flex-wrap gap-y-2 rounded-md px-1 py-1 pointer-coarse:min-h-11\"\n childrenClassName=\"mb-8 grid gap-3 @xl:grid-cols-2 @5xl:grid-cols-3\"\n >\n {children}\n </CollapsibleSection>\n )\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { DocumentUser } from './chunk-
|
|
3
|
-
import { UserAvatar, useDocumentFolders, RelatedDocumentsCell } from './chunk-
|
|
4
|
-
import { FieldValue, FieldFolderSelect, FieldFolderValue, FieldNativeSelect, FieldWithAttribution, FolderCommandList, FieldLabelsSelect, FieldAttribution } from './chunk-
|
|
2
|
+
import { DocumentUser } from './chunk-SOZIHPO2.js';
|
|
3
|
+
import { UserAvatar, useDocumentFolders, RelatedDocumentsCell } from './chunk-CPOFZYKH.js';
|
|
4
|
+
import { FieldValue, FieldFolderSelect, FieldFolderValue, FieldNativeSelect, FieldWithAttribution, FolderCommandList, FieldLabelsSelect, FieldAttribution } from './chunk-WLWZAS7J.js';
|
|
5
5
|
import { EntityTooltip, EntityTooltipHeader } from './chunk-3UIJLUXN.js';
|
|
6
6
|
import { useCallback, useMemo } from 'react';
|
|
7
7
|
import { useWorkspaceUsers, useTags, useOpenViewerDocumentId } from '@arbidocs/react';
|
|
@@ -336,5 +336,5 @@ function documentFieldContent(options) {
|
|
|
336
336
|
}
|
|
337
337
|
|
|
338
338
|
export { ConnectedTagEntity, documentFieldContent, useMemberLookup };
|
|
339
|
-
//# sourceMappingURL=chunk-
|
|
340
|
-
//# sourceMappingURL=chunk-
|
|
339
|
+
//# sourceMappingURL=chunk-JM7Z3QNS.js.map
|
|
340
|
+
//# sourceMappingURL=chunk-JM7Z3QNS.js.map
|