@arbidocs/blocks 0.5.73 → 0.5.74
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-H7BIPVSJ.cjs → ConnectedCallDock-3SRG4QYZ.cjs} +15 -15
- package/dist/{ConnectedCallDock-H7BIPVSJ.cjs.map → ConnectedCallDock-3SRG4QYZ.cjs.map} +1 -1
- package/dist/{ConnectedCallDock-BXL37OAD.js → ConnectedCallDock-BUDIHBES.js} +6 -6
- package/dist/{ConnectedCallDock-BXL37OAD.js.map → ConnectedCallDock-BUDIHBES.js.map} +1 -1
- package/dist/{ConnectedCallRoom-SGASQJJV.cjs → ConnectedCallRoom-U5UZUI5C.cjs} +7 -7
- package/dist/{ConnectedCallRoom-SGASQJJV.cjs.map → ConnectedCallRoom-U5UZUI5C.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-WKWJVJXC.js → ConnectedCallRoom-X2XU5X5B.js} +6 -6
- package/dist/{ConnectedCallRoom-WKWJVJXC.js.map → ConnectedCallRoom-X2XU5X5B.js.map} +1 -1
- package/dist/{ConnectedDocumentViewer-RHVKM7RG.js → ConnectedDocumentViewer-6GTO2LYM.js} +25 -25
- package/dist/{ConnectedDocumentViewer-RHVKM7RG.js.map → ConnectedDocumentViewer-6GTO2LYM.js.map} +1 -1
- package/dist/{ConnectedDocumentViewer-SG6ZWXK7.cjs → ConnectedDocumentViewer-JZWQFKYH.cjs} +26 -26
- package/dist/{ConnectedDocumentViewer-SG6ZWXK7.cjs.map → ConnectedDocumentViewer-JZWQFKYH.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-6SHIVVKM.js → ConnectedNativeDocxComparison-PBMS77ZP.js} +12 -12
- package/dist/ConnectedNativeDocxComparison-PBMS77ZP.js.map +1 -0
- package/dist/{ConnectedNativeDocxComparison-QC6JDXYK.cjs → ConnectedNativeDocxComparison-R4OFGVHY.cjs} +13 -13
- package/dist/ConnectedNativeDocxComparison-R4OFGVHY.cjs.map +1 -0
- package/dist/{ConnectedNativeDocxEditor-QNT5362V.js → ConnectedNativeDocxEditor-27JZI2D5.js} +11 -11
- package/dist/ConnectedNativeDocxEditor-27JZI2D5.js.map +1 -0
- package/dist/{ConnectedNativeDocxEditor-4OJUNP6S.cjs → ConnectedNativeDocxEditor-774XRIP3.cjs} +13 -13
- package/dist/ConnectedNativeDocxEditor-774XRIP3.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-ADL2W26Z.cjs → ConnectedStreamedWordArtifact-7TNIQTVE.cjs} +13 -13
- package/dist/ConnectedStreamedWordArtifact-7TNIQTVE.cjs.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-QNITXEPJ.js → ConnectedStreamedWordArtifact-XEFXYMKS.js} +12 -12
- package/dist/ConnectedStreamedWordArtifact-XEFXYMKS.js.map +1 -0
- package/dist/{DocumentReviewCard-35TDEAPY.cjs → DocumentReviewCard-BGQUXMPU.cjs} +17 -17
- package/dist/{DocumentReviewCard-35TDEAPY.cjs.map → DocumentReviewCard-BGQUXMPU.cjs.map} +1 -1
- package/dist/{DocumentReviewCard-UWPIOAJB.js → DocumentReviewCard-VJP5VO4F.js} +12 -12
- package/dist/{DocumentReviewCard-UWPIOAJB.js.map → DocumentReviewCard-VJP5VO4F.js.map} +1 -1
- package/dist/{WorkspaceTableView-VWCDUNKJ.cjs → WorkspaceTableView-KINAZSXG.cjs} +9 -9
- package/dist/{WorkspaceTableView-VWCDUNKJ.cjs.map → WorkspaceTableView-KINAZSXG.cjs.map} +1 -1
- package/dist/{WorkspaceTableView-P2X7N2NO.js → WorkspaceTableView-T26UN2HI.js} +7 -7
- package/dist/{WorkspaceTableView-P2X7N2NO.js.map → WorkspaceTableView-T26UN2HI.js.map} +1 -1
- package/dist/agents/index.cjs +379 -379
- package/dist/agents/index.js +13 -13
- package/dist/calls/index.cjs +135 -135
- package/dist/calls/index.js +11 -11
- package/dist/chat/index.cjs +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/{chunk-PNJKRZ2F.cjs → chunk-2LUI2FUC.cjs} +67 -67
- package/dist/{chunk-PNJKRZ2F.cjs.map → chunk-2LUI2FUC.cjs.map} +1 -1
- package/dist/{chunk-UOC3C3FN.js → chunk-2P43MR5P.js} +4 -4
- package/dist/{chunk-UOC3C3FN.js.map → chunk-2P43MR5P.js.map} +1 -1
- package/dist/{chunk-AEHV2DHR.js → chunk-3TKRCYFN.js} +3 -3
- package/dist/{chunk-AEHV2DHR.js.map → chunk-3TKRCYFN.js.map} +1 -1
- package/dist/{chunk-XKFVESOU.cjs → chunk-4FVKWJT2.cjs} +19 -19
- package/dist/{chunk-XKFVESOU.cjs.map → chunk-4FVKWJT2.cjs.map} +1 -1
- package/dist/{chunk-MTUSMN2P.cjs → chunk-55JI2IGZ.cjs} +4 -4
- package/dist/{chunk-MTUSMN2P.cjs.map → chunk-55JI2IGZ.cjs.map} +1 -1
- package/dist/{chunk-ZWY44PC4.cjs → chunk-5Q2U7GLI.cjs} +4 -4
- package/dist/{chunk-ZWY44PC4.cjs.map → chunk-5Q2U7GLI.cjs.map} +1 -1
- package/dist/{chunk-UXHVJZGR.js → chunk-65BJLW4F.js} +3 -3
- package/dist/{chunk-UXHVJZGR.js.map → chunk-65BJLW4F.js.map} +1 -1
- package/dist/{chunk-T3KZXTVK.js → chunk-7LX6GPX4.js} +3 -3
- package/dist/{chunk-T3KZXTVK.js.map → chunk-7LX6GPX4.js.map} +1 -1
- package/dist/{chunk-UYPQAII2.js → chunk-7NOVQP2Y.js} +13 -13
- package/dist/{chunk-UYPQAII2.js.map → chunk-7NOVQP2Y.js.map} +1 -1
- package/dist/{chunk-DOLIOPTR.js → chunk-7ZCM2GR2.js} +5 -5
- package/dist/{chunk-DOLIOPTR.js.map → chunk-7ZCM2GR2.js.map} +1 -1
- package/dist/{chunk-HQCRGBPC.cjs → chunk-7ZL6OVGO.cjs} +3 -3
- package/dist/{chunk-HQCRGBPC.cjs.map → chunk-7ZL6OVGO.cjs.map} +1 -1
- package/dist/{chunk-G5YMIMBD.cjs → chunk-AWUSTKQ7.cjs} +27 -27
- package/dist/{chunk-G5YMIMBD.cjs.map → chunk-AWUSTKQ7.cjs.map} +1 -1
- package/dist/{chunk-R3VZRC4E.cjs → chunk-BPHRHJO6.cjs} +19 -19
- package/dist/{chunk-R3VZRC4E.cjs.map → chunk-BPHRHJO6.cjs.map} +1 -1
- package/dist/{chunk-5RWNJQH3.js → chunk-BV34QPKE.js} +5 -5
- package/dist/{chunk-5RWNJQH3.js.map → chunk-BV34QPKE.js.map} +1 -1
- package/dist/{chunk-V3PGYBG6.cjs → chunk-C3XE65OA.cjs} +3 -3
- package/dist/{chunk-V3PGYBG6.cjs.map → chunk-C3XE65OA.cjs.map} +1 -1
- package/dist/{chunk-KRWCL3CF.cjs → chunk-CDQDBUS2.cjs} +7 -7
- package/dist/{chunk-KRWCL3CF.cjs.map → chunk-CDQDBUS2.cjs.map} +1 -1
- package/dist/{chunk-CH225H5Z.cjs → chunk-DE262536.cjs} +3 -3
- package/dist/{chunk-CH225H5Z.cjs.map → chunk-DE262536.cjs.map} +1 -1
- package/dist/{chunk-RC2WAHJ5.cjs → chunk-EHZGODA4.cjs} +3 -3
- package/dist/{chunk-RC2WAHJ5.cjs.map → chunk-EHZGODA4.cjs.map} +1 -1
- package/dist/{chunk-AASVQZHW.js → chunk-EWHD3BY5.js} +3 -3
- package/dist/{chunk-AASVQZHW.js.map → chunk-EWHD3BY5.js.map} +1 -1
- package/dist/{chunk-W3UUJUNA.cjs → chunk-FI2SDF5X.cjs} +22 -22
- package/dist/{chunk-W3UUJUNA.cjs.map → chunk-FI2SDF5X.cjs.map} +1 -1
- package/dist/{chunk-GJ3CQ6ND.cjs → chunk-FT5WHS5K.cjs} +29 -29
- package/dist/{chunk-GJ3CQ6ND.cjs.map → chunk-FT5WHS5K.cjs.map} +1 -1
- package/dist/{chunk-MPKLFCBD.js → chunk-FZOSUEE5.js} +3 -3
- package/dist/{chunk-MPKLFCBD.js.map → chunk-FZOSUEE5.js.map} +1 -1
- package/dist/{chunk-E5F3AVWB.js → chunk-GALELOTT.js} +11 -11
- package/dist/{chunk-E5F3AVWB.js.map → chunk-GALELOTT.js.map} +1 -1
- package/dist/{chunk-DILPI4LO.js → chunk-GI3VQ4Q2.js} +3 -3
- package/dist/{chunk-DILPI4LO.js.map → chunk-GI3VQ4Q2.js.map} +1 -1
- package/dist/{chunk-HZMQ4W7P.js → chunk-HO53IJIQ.js} +3 -3
- package/dist/{chunk-HZMQ4W7P.js.map → chunk-HO53IJIQ.js.map} +1 -1
- package/dist/{chunk-SJO5ETZS.cjs → chunk-HTD7PMZ3.cjs} +14 -14
- package/dist/{chunk-SJO5ETZS.cjs.map → chunk-HTD7PMZ3.cjs.map} +1 -1
- package/dist/{chunk-KENIEIQ6.js → chunk-IJUNXPGS.js} +3 -3
- package/dist/{chunk-KENIEIQ6.js.map → chunk-IJUNXPGS.js.map} +1 -1
- package/dist/{chunk-CKE3CF2C.js → chunk-IMIE5NOQ.js} +4 -4
- package/dist/{chunk-CKE3CF2C.js.map → chunk-IMIE5NOQ.js.map} +1 -1
- package/dist/{chunk-QBCY4UZ4.cjs → chunk-J423JAH7.cjs} +3 -3
- package/dist/{chunk-QBCY4UZ4.cjs.map → chunk-J423JAH7.cjs.map} +1 -1
- package/dist/{chunk-23ZFQRVZ.js → chunk-JC5EZT67.js} +6 -6
- package/dist/{chunk-23ZFQRVZ.js.map → chunk-JC5EZT67.js.map} +1 -1
- package/dist/{chunk-OTJGPNDD.js → chunk-JLR7FXZJ.js} +7 -7
- package/dist/{chunk-OTJGPNDD.js.map → chunk-JLR7FXZJ.js.map} +1 -1
- package/dist/{chunk-P2N4ARP3.cjs → chunk-JVHO5PAJ.cjs} +5 -5
- package/dist/{chunk-P2N4ARP3.cjs.map → chunk-JVHO5PAJ.cjs.map} +1 -1
- package/dist/{chunk-NJBUFLPJ.js → chunk-KYLNAAYI.js} +3 -3
- package/dist/{chunk-NJBUFLPJ.js.map → chunk-KYLNAAYI.js.map} +1 -1
- package/dist/{chunk-GB3XD7CM.cjs → chunk-LZSYUVDG.cjs} +73 -73
- package/dist/{chunk-GB3XD7CM.cjs.map → chunk-LZSYUVDG.cjs.map} +1 -1
- package/dist/{chunk-TPK4DNEV.js → chunk-MXF3MHYC.js} +3 -3
- package/dist/{chunk-TPK4DNEV.js.map → chunk-MXF3MHYC.js.map} +1 -1
- package/dist/{chunk-W76J76SI.js → chunk-ND4SFASU.js} +12 -12
- package/dist/{chunk-W76J76SI.js.map → chunk-ND4SFASU.js.map} +1 -1
- package/dist/{chunk-I42TAD2S.js → chunk-NNFGR27U.js} +3 -3
- package/dist/{chunk-I42TAD2S.js.map → chunk-NNFGR27U.js.map} +1 -1
- package/dist/{chunk-EREULRPU.cjs → chunk-NTV5XMJT.cjs} +34 -34
- package/dist/{chunk-EREULRPU.cjs.map → chunk-NTV5XMJT.cjs.map} +1 -1
- package/dist/{chunk-3BBM2UQJ.cjs → chunk-O7TUZNIQ.cjs} +4 -4
- package/dist/{chunk-3BBM2UQJ.cjs.map → chunk-O7TUZNIQ.cjs.map} +1 -1
- package/dist/{chunk-SWT7YQPY.cjs → chunk-OBCGNZ54.cjs} +62 -62
- package/dist/{chunk-SWT7YQPY.cjs.map → chunk-OBCGNZ54.cjs.map} +1 -1
- package/dist/{chunk-6FTL6XGO.cjs → chunk-OJCTMOWL.cjs} +7 -7
- package/dist/{chunk-6FTL6XGO.cjs.map → chunk-OJCTMOWL.cjs.map} +1 -1
- package/dist/{chunk-I5RD6Q6S.js → chunk-OUOKUBUE.js} +3 -3
- package/dist/{chunk-I5RD6Q6S.js.map → chunk-OUOKUBUE.js.map} +1 -1
- package/dist/{chunk-4QVHQX5J.cjs → chunk-P66OI6E4.cjs} +3 -3
- package/dist/{chunk-4QVHQX5J.cjs.map → chunk-P66OI6E4.cjs.map} +1 -1
- package/dist/{chunk-LIEID4J2.js → chunk-PA4EGGCI.js} +3 -3
- package/dist/{chunk-LIEID4J2.js.map → chunk-PA4EGGCI.js.map} +1 -1
- package/dist/{chunk-JXIMOCZI.cjs → chunk-POLG3CR3.cjs} +3 -3
- package/dist/{chunk-JXIMOCZI.cjs.map → chunk-POLG3CR3.cjs.map} +1 -1
- package/dist/{chunk-GZAM727N.js → chunk-PV5ICMAE.js} +4 -4
- package/dist/{chunk-GZAM727N.js.map → chunk-PV5ICMAE.js.map} +1 -1
- package/dist/{chunk-T3CILFBC.js → chunk-QZ5FDIT6.js} +3 -3
- package/dist/{chunk-T3CILFBC.js.map → chunk-QZ5FDIT6.js.map} +1 -1
- package/dist/{chunk-3HZPDO4D.cjs → chunk-RADE22SM.cjs} +10 -10
- package/dist/{chunk-3HZPDO4D.cjs.map → chunk-RADE22SM.cjs.map} +1 -1
- package/dist/{chunk-OSVVM2VE.js → chunk-RDIFRGGF.js} +4 -4
- package/dist/{chunk-OSVVM2VE.js.map → chunk-RDIFRGGF.js.map} +1 -1
- package/dist/{chunk-SV56GBJW.cjs → chunk-RTYU6ZGO.cjs} +4 -4
- package/dist/{chunk-SV56GBJW.cjs.map → chunk-RTYU6ZGO.cjs.map} +1 -1
- package/dist/{chunk-L26C3Q6T.cjs → chunk-SYPW2WUW.cjs} +5 -5
- package/dist/{chunk-L26C3Q6T.cjs.map → chunk-SYPW2WUW.cjs.map} +1 -1
- package/dist/{chunk-7JKW5CZ3.js → chunk-TOE3LBYG.js} +4 -4
- package/dist/{chunk-7JKW5CZ3.js.map → chunk-TOE3LBYG.js.map} +1 -1
- package/dist/{chunk-MKCBXCUC.js → chunk-TQ4VGQHG.js} +3 -3
- package/dist/{chunk-MKCBXCUC.js.map → chunk-TQ4VGQHG.js.map} +1 -1
- package/dist/{chunk-IZZUBJQE.cjs → chunk-UAOBHZ4D.cjs} +3 -3
- package/dist/{chunk-IZZUBJQE.cjs.map → chunk-UAOBHZ4D.cjs.map} +1 -1
- package/dist/{chunk-Y37HQ4M2.cjs → chunk-UICJN7O2.cjs} +3 -3
- package/dist/{chunk-Y37HQ4M2.cjs.map → chunk-UICJN7O2.cjs.map} +1 -1
- package/dist/{chunk-UWGGRZXN.cjs → chunk-URW6E5SG.cjs} +62 -62
- package/dist/{chunk-UWGGRZXN.cjs.map → chunk-URW6E5SG.cjs.map} +1 -1
- package/dist/{chunk-4NZ65WVN.cjs → chunk-W3BECCTZ.cjs} +3 -3
- package/dist/{chunk-4NZ65WVN.cjs.map → chunk-W3BECCTZ.cjs.map} +1 -1
- package/dist/{chunk-M3SVHBUH.cjs → chunk-W5FED2H2.cjs} +4 -4
- package/dist/{chunk-M3SVHBUH.cjs.map → chunk-W5FED2H2.cjs.map} +1 -1
- package/dist/{chunk-KQT6Y7MY.js → chunk-WZRWV6EZ.js} +3 -3
- package/dist/{chunk-KQT6Y7MY.js.map → chunk-WZRWV6EZ.js.map} +1 -1
- package/dist/{chunk-W5KIGSYL.cjs → chunk-X5AG2UZZ.cjs} +3 -3
- package/dist/{chunk-W5KIGSYL.cjs.map → chunk-X5AG2UZZ.cjs.map} +1 -1
- package/dist/{chunk-SP6ILDTM.js → chunk-XJ3WWAYV.js} +3 -3
- package/dist/{chunk-SP6ILDTM.js.map → chunk-XJ3WWAYV.js.map} +1 -1
- package/dist/{chunk-QNAVJ73S.js → chunk-XTEH237Z.js} +17 -17
- package/dist/{chunk-QNAVJ73S.js.map → chunk-XTEH237Z.js.map} +1 -1
- package/dist/{chunk-XBXCEPCP.cjs → chunk-XXPDAENX.cjs} +9 -9
- package/dist/{chunk-XBXCEPCP.cjs.map → chunk-XXPDAENX.cjs.map} +1 -1
- package/dist/{chunk-MBXYJIK3.js → chunk-YGXW2XAU.js} +3 -3
- package/dist/{chunk-MBXYJIK3.js.map → chunk-YGXW2XAU.js.map} +1 -1
- package/dist/{chunk-CR7S4CJD.js → chunk-YUAPBWLL.js} +3 -3
- package/dist/{chunk-CR7S4CJD.js.map → chunk-YUAPBWLL.js.map} +1 -1
- package/dist/{chunk-5MPTUH5L.cjs → chunk-Z3UBSASC.cjs} +11 -11
- package/dist/{chunk-5MPTUH5L.cjs.map → chunk-Z3UBSASC.cjs.map} +1 -1
- package/dist/{chunk-VE3Q4MPI.js → chunk-Z5JLS5DX.js} +3 -3
- package/dist/{chunk-VE3Q4MPI.js.map → chunk-Z5JLS5DX.js.map} +1 -1
- package/dist/{chunk-5II4FQEQ.js → chunk-ZVQK7TNZ.js} +3 -3
- package/dist/{chunk-5II4FQEQ.js.map → chunk-ZVQK7TNZ.js.map} +1 -1
- package/dist/collaboration/index.cjs +1 -1
- package/dist/collaboration/index.js +1 -1
- package/dist/connect/docx.cjs +19 -19
- package/dist/connect/docx.js +15 -15
- package/dist/connect/index.cjs +1042 -1042
- package/dist/connect/index.js +72 -72
- package/dist/connect/viewer.cjs +24 -24
- package/dist/connect/viewer.js +23 -23
- package/dist/dashboards/index.cjs +1 -1
- package/dist/dashboards/index.js +1 -1
- package/dist/document-tools/index.cjs +17 -17
- package/dist/document-tools/index.js +2 -2
- package/dist/embed/index.cjs +36 -36
- package/dist/embed/index.js +31 -31
- package/dist/facts/index.cjs +48 -48
- package/dist/facts/index.js +5 -5
- package/dist/files/index.cjs +224 -224
- package/dist/files/index.js +4 -4
- package/dist/home/index.cjs +31 -31
- package/dist/home/index.js +4 -4
- package/dist/index.cjs +1877 -1877
- package/dist/index.js +47 -47
- package/dist/settings/index.cjs +157 -157
- package/dist/settings/index.js +3 -3
- package/dist/shell/index.cjs +113 -113
- package/dist/shell/index.js +9 -9
- package/dist/site/index.cjs +17 -17
- package/dist/site/index.js +1 -1
- package/dist/studio/index.cjs +19 -19
- package/dist/studio/index.js +16 -16
- package/dist/workflow-canvas/index.cjs +55 -55
- package/dist/workflow-canvas/index.js +31 -31
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedNativeDocxComparison-6SHIVVKM.js.map +0 -1
- package/dist/ConnectedNativeDocxComparison-QC6JDXYK.cjs.map +0 -1
- package/dist/ConnectedNativeDocxEditor-4OJUNP6S.cjs.map +0 -1
- package/dist/ConnectedNativeDocxEditor-QNT5362V.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-ADL2W26Z.cjs.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-QNITXEPJ.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { NativeDocxComparison } from './chunk-CTM2RAZI.js';
|
|
3
|
-
import { useConnectedNativeDocxAdapter } from './chunk-
|
|
3
|
+
import { useConnectedNativeDocxAdapter } from './chunk-BV34QPKE.js';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
function ConnectedNativeDocxComparison({
|
|
@@ -12,5 +12,5 @@ function ConnectedNativeDocxComparison({
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
export { ConnectedNativeDocxComparison };
|
|
15
|
-
//# sourceMappingURL=chunk-
|
|
16
|
-
//# sourceMappingURL=chunk-
|
|
15
|
+
//# sourceMappingURL=chunk-PA4EGGCI.js.map
|
|
16
|
+
//# sourceMappingURL=chunk-PA4EGGCI.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":[],"mappings":";;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAU,8BAA8B,WAAW,CAAA;AACzD,EAAA,2BAAQ,oBAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/connection/docx/ConnectedNativeDocxComparison.tsx"],"names":[],"mappings":";;;;AAOO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAyF;AACvF,EAAA,MAAM,OAAA,GAAU,8BAA8B,WAAW,CAAA;AACzD,EAAA,2BAAQ,oBAAA,EAAA,EAAsB,GAAG,OAAO,OAAA,EAAkB,UAAA,EAAY,QAAQ,cAAA,EAAgB,CAAA;AAChG","file":"chunk-PA4EGGCI.js","sourcesContent":["import {\n NativeDocxComparison,\n type NativeDocxComparisonProps,\n} from '../../docx/NativeDocxComparison'\nimport { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\n\n/** The Word redline of two documents or versions, on the signed-in session. */\nexport function ConnectedNativeDocxComparison({\n fontBaseUrl,\n ...props\n}: Omit<NativeDocxComparisonProps, 'adapter' | 'onCompared'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <NativeDocxComparison {...props} adapter={adapter} onCompared={adapter.onVersionSaved} />\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var chunkQB2SSUZJ_cjs = require('./chunk-QB2SSUZJ.cjs');
|
|
5
4
|
var chunkYZSQ7F5K_cjs = require('./chunk-YZSQ7F5K.cjs');
|
|
5
|
+
var chunkQB2SSUZJ_cjs = require('./chunk-QB2SSUZJ.cjs');
|
|
6
6
|
var chunkPLIF5CUV_cjs = require('./chunk-PLIF5CUV.cjs');
|
|
7
7
|
var react = require('react');
|
|
8
8
|
var ui = require('@arbidocs/react/ui');
|
|
@@ -599,5 +599,5 @@ exports.SidebarBadgeRow = SidebarBadgeRow;
|
|
|
599
599
|
exports.SidebarRowHoverContext = SidebarRowHoverContext;
|
|
600
600
|
exports.useShellStartInset = useShellStartInset;
|
|
601
601
|
exports.useSidebarContext = useSidebarContext;
|
|
602
|
-
//# sourceMappingURL=chunk-
|
|
603
|
-
//# sourceMappingURL=chunk-
|
|
602
|
+
//# sourceMappingURL=chunk-POLG3CR3.cjs.map
|
|
603
|
+
//# sourceMappingURL=chunk-POLG3CR3.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shell/sidebar-context.ts","../src/shell/SidebarBadgeRow.tsx","../src/lib/start-inset.ts","../src/shell/Sidebar.tsx"],"names":["createContext","useContext","forwardRef","SidebarBadgeRow","jsxs","cn","jsx","Tooltip","TooltipTrigger","TooltipContent","useEffect","useMemo","useRef","useDrawerBehavior","testIdOr","Fragment","BlocksTooltipProvider","useState","ActionLink","PanelLeftClose","PanelLeftOpen","X"],"mappings":"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","file":"chunk-JXIMOCZI.cjs","sourcesContent":["import { createContext, useContext } from 'react'\n\n/** Fixed strings of the sidebar family. Set once on `Sidebar.Root`; parts read them from context. */\nexport interface SidebarLabels {\n /** The sidebar's accessible name (the Root `aria-label` prop wins). */\n mainNavigation: string\n hideSidebar: string\n showSidebar: string\n /** The drawer's close button (the `closeLabel` prop wins). */\n closeNavigationMenu: string\n}\n\nexport const DEFAULT_SIDEBAR_LABELS: SidebarLabels = {\n mainNavigation: 'Main navigation',\n hideSidebar: 'Hide sidebar',\n showSidebar: 'Show sidebar',\n closeNavigationMenu: 'Close navigation menu',\n}\n\nexport interface SidebarContextValue {\n /** Labels are visible (full width), as opposed to the icon-only rail. */\n expanded: boolean\n labels: SidebarLabels\n}\nexport const SidebarContext = createContext<SidebarContextValue>({\n expanded: true,\n labels: DEFAULT_SIDEBAR_LABELS,\n})\nexport const useSidebarContext = (): SidebarContextValue => useContext(SidebarContext)\n\n/** True while the surrounding row is hovered/focused; trailing controls may brighten on it. */\nexport const SidebarRowHoverContext = createContext(false)\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { useSidebarContext } from './sidebar-context'\n\nexport interface SidebarBadgeRowProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n /** Glyph (20px). */\n icon: ReactNode\n /** Visible label of the expanded row; the tooltip of the icon-only rail. */\n label: string\n /** Unread/pending number. Hidden at 0 or `undefined`; values above 9 read \"9+\". */\n count?: number\n /**\n * Accessible name including the count, for example \"Notifications, 2 unread\". Defaults to\n * `label` plus the count.\n */\n ariaLabel?: string\n /**\n * `row`: a labelled row styled like the module rows, badge at the right. `icon`: icon-only with\n * the badge on the corner. Default follows the sidebar (`row` expanded, `icon` on the rail).\n */\n variant?: 'row' | 'icon'\n /** Test id of the count badge. */\n badgeTestId?: string\n}\n\n/**\n * A sidebar row that carries a badge and may open something (a panel, a popover): the\n * notifications and contacts rows above the account bar. A real button that forwards its ref and\n * rest props, so it can be a popover trigger (`<DropdownMenuTrigger asChild>`). The badge is\n * visible in both the expanded row and the icon-only rail, and the accessible name carries the\n * count in both.\n */\nexport const SidebarBadgeRow = forwardRef<HTMLButtonElement, SidebarBadgeRowProps>(\n function SidebarBadgeRow(\n { icon, label, count, ariaLabel, variant, badgeTestId, className, type = 'button', ...rest },\n ref\n ) {\n const { expanded } = useSidebarContext()\n const resolved = variant ?? (expanded ? 'row' : 'icon')\n const hasCount = count !== undefined && count > 0\n const badgeText = hasCount ? (count > 9 ? '9+' : String(count)) : null\n const name = ariaLabel ?? (hasCount ? `${label}, ${count}` : label)\n\n if (resolved === 'row') {\n return (\n <button\n ref={ref}\n type={type}\n aria-label={name}\n data-slot=\"sidebar-badge-row\"\n data-variant=\"row\"\n className={cn(\n 'group flex h-9 w-full cursor-pointer items-center rounded-md px-3 text-left text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11',\n className\n )}\n {...rest}\n >\n <span className=\"flex size-5 flex-shrink-0 items-center justify-center\" aria-hidden>\n {icon}\n </span>\n <span className=\"ml-3 min-w-0 truncate\" aria-hidden>\n {label}\n </span>\n {badgeText && (\n <span\n aria-hidden\n data-testid={badgeTestId}\n className=\"ml-auto inline-flex min-w-5 flex-shrink-0 items-center justify-center rounded-full bg-primary px-1.5 text-xs font-semibold leading-5 tabular-nums text-primary-foreground\"\n >\n {badgeText}\n </span>\n )}\n </button>\n )\n }\n\n const iconButton = (\n <button\n ref={ref}\n type={type}\n aria-label={name}\n data-slot=\"sidebar-badge-row\"\n data-variant=\"icon\"\n title={variant === 'icon' ? label : undefined}\n className={cn(\n 'relative m-0 flex h-9 w-12 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11',\n className\n )}\n {...rest}\n >\n <span className=\"flex size-5 items-center justify-center\" aria-hidden>\n {icon}\n </span>\n {badgeText && (\n <span\n aria-hidden\n data-testid={badgeTestId}\n className=\"absolute right-1 top-0.5 flex min-w-4 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold leading-4 tabular-nums text-primary-foreground\"\n >\n {badgeText}\n </span>\n )}\n </button>\n )\n // A standalone icon button (the page header) keeps its native title; the rail uses a tooltip.\n if (variant === 'icon') return iconButton\n return (\n <Tooltip delayDuration={50}>\n <TooltipTrigger asChild>{iconButton}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {label}\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n","import { useEffect } from 'react'\n\n/**\n * The CSS custom property that carries how much of the screen's start (left) edge a docked sidebar\n * takes, set on `<html>`. A floating element pinned to the start corner (the install prompt)\n * positions itself `calc(var(--shell-start-inset, 0px) + 0.75rem)` so it never covers the\n * sidebar's footer (the account menu).\n */\nexport const SHELL_START_INSET_VAR = '--shell-start-inset'\n\nconst widths = new Map<symbol, number>()\n\nfunction apply(): void {\n if (typeof document === 'undefined') return\n const inset = Math.max(0, ...widths.values())\n const style = document.documentElement.style\n if (inset > 0) style.setProperty(SHELL_START_INSET_VAR, `${inset}px`)\n else style.removeProperty(SHELL_START_INSET_VAR)\n}\n\n/**\n * Report a sidebar docked at the start edge, `width` px wide (0 while it is collapsed or is an\n * overlay drawer), to {@link SHELL_START_INSET_VAR}. `Sidebar.Root` calls it; call it from your\n * own docked side panel.\n */\nexport function useShellStartInset(width: number): void {\n useEffect(() => {\n const key = Symbol('shell-start-inset')\n widths.set(key, width)\n apply()\n return () => {\n widths.delete(key)\n apply()\n }\n }, [width])\n}\n","import { useMemo, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { PanelLeftClose, PanelLeftOpen, X } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport {\n DEFAULT_SIDEBAR_LABELS,\n SidebarContext,\n SidebarRowHoverContext,\n useSidebarContext,\n type SidebarLabels,\n} from './sidebar-context'\nimport { SidebarBadgeRow } from './SidebarBadgeRow'\nimport { ActionLink } from '../components/ActionLink'\nimport { BlocksTooltipProvider } from '../provider/TooltipScope'\nimport { useDrawerBehavior } from '../lib/use-drawer'\nimport { useShellStartInset } from '../lib/start-inset'\nimport type { SidebarMode } from '../lib/sidebar-mode'\nimport type { NavItem, NavItemIndicator, NavSection } from './types'\n\n/**\n * Sidebar: the one tinted column that carries the app frame. Compound parts:\n * Sidebar.Root positioning shell for the four modes (drawer / collapsed / pinned / rail)\n * Sidebar.Header top block (switcher, ask field, pin toggle)\n * Sidebar.Nav the rows: pass `items` (NavItem[]) or compose Sidebar.NavItem children\n * Sidebar.Group a labelled run of rows (heading when expanded, divider on the rail)\n * Sidebar.Footer pinned to the bottom (offline pill, tips card, action cluster)\n * Sidebar.PinToggle / Sidebar.DrawerHeader the header's two stock controls\n *\n * Presentational and controlled: the app resolves `mode`/`expanded` (see `resolveSidebarLayout`\n * and `useSidebarSettle`) and owns where hover/pin/drawer state lives.\n */\n\nconst noop = () => {}\n\nconst COLLAPSED_PX = 64\nconst EXPANDED_PX = 256\nconst COLLAPSED_WIDTH = `${COLLAPSED_PX}px`\nconst EXPANDED_WIDTH = `${EXPANDED_PX}px`\n\nexport interface SidebarRootProps {\n /** Constrain the drawer to an embedded frame. The app keeps the viewport default. */\n contained?: boolean\n mode: SidebarMode\n /** Labels visible. Provided to every part through context. */\n expanded: boolean\n /** `rail` mode: floats open to full width. */\n isHovering?: boolean\n onBackdropClick?: () => void\n /** `rail` mode on touch: the floated-open rail dims the content behind it; tapping it closes. */\n hasRailBackdrop?: boolean\n onMouseEnter?: () => void\n onMouseLeave?: () => void\n children: ReactNode\n className?: string\n 'aria-label'?: string\n labels?: Partial<SidebarLabels>\n /** Root id (default `sidebar`). */\n 'data-testid'?: string\n /** Drawer backdrop id (default `sidebar-backdrop`). */\n backdropTestId?: string\n}\n\nfunction SidebarRoot({\n mode,\n contained = false,\n expanded,\n isHovering = false,\n onBackdropClick,\n hasRailBackdrop = false,\n onMouseEnter,\n onMouseLeave,\n children,\n className,\n 'aria-label': ariaLabelProp,\n labels,\n 'data-testid': testId,\n backdropTestId,\n}: SidebarRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_SIDEBAR_LABELS, ...labels }), [labels])\n // The drawer is a modal: scroll lock, Escape, focus trap and focus return to the opener.\n const drawerRef = useRef<HTMLDivElement>(null)\n const isDrawer = mode === 'drawer'\n useDrawerBehavior(isDrawer, onBackdropClick ?? noop, drawerRef)\n // Floating start-corner elements (the install prompt) sit clear of the docked sidebar; a rail\n // expanding on hover floats over the page, so only its collapsed width counts.\n useShellStartInset(mode === 'pinned' ? EXPANDED_PX : mode === 'rail' ? COLLAPSED_PX : 0)\n const ariaLabel = ariaLabelProp ?? mergedLabels.mainNavigation\n const contextValue = useMemo(() => ({ expanded, labels: mergedLabels }), [expanded, mergedLabels])\n // `navBase` omits horizontal padding so each mode owns its own: the collapsed state must\n // reach a true 0 width, which an `!important` px would block.\n const navBase =\n 'group/sidebar bg-sidebar border-r border-border text-foreground scrollbar-themed flex flex-col h-full overflow-y-auto overflow-x-hidden pb-safe pt-3 transition-all duration-300 ease-in-out'\n const common = {\n 'aria-label': ariaLabel,\n 'data-testid': testIdOr(testId, { testId: 'sidebar' }),\n 'data-slot': 'sidebar',\n 'data-mode': mode,\n } as const\n const fixedWidth: CSSProperties = { width: EXPANDED_WIDTH, minWidth: EXPANDED_WIDTH }\n\n let body: ReactNode\n if (mode === 'drawer') {\n // Small-screen off-canvas panel + dismiss backdrop; bypasses the hover/collapse model. The\n // wrapper is the modal dialog; the nav landmark sits inside it.\n body = (\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n data-slot=\"sidebar-drawer\"\n className={cn(contained ? 'absolute' : 'fixed', 'inset-0 z-50')}\n >\n <div\n className=\"absolute inset-0 bg-black/50\"\n onClick={onBackdropClick}\n aria-hidden=\"true\"\n data-testid={testIdOr(backdropTestId, { testId: 'sidebar-backdrop' })}\n />\n <nav\n {...common}\n className={cn(navBase, '!px-3 absolute left-0 top-0 pt-safe shadow-xl', className)}\n style={fixedWidth}\n >\n {children}\n </nav>\n </div>\n )\n } else if (mode === 'collapsed') {\n // Stays mounted at width 0 so the transition runs on both enter and leave. Horizontal padding\n // is dropped or overflow-hidden would reveal a clipped sliver of the icons.\n body = (\n <nav\n {...common}\n className={cn(navBase, 'absolute left-0 top-0 z-[45]', className)}\n style={{\n width: '0px',\n minWidth: 0,\n paddingLeft: 0,\n paddingRight: 0,\n borderRightWidth: 0,\n pointerEvents: 'none',\n }}\n // Width 0 hides the links visually; inert also takes them out of the tab order and the\n // accessibility tree.\n inert\n >\n {children}\n </nav>\n )\n } else if (mode === 'pinned') {\n body = (\n <nav\n {...common}\n className={cn(navBase, '!px-3 relative flex-shrink-0', className)}\n style={fixedWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </nav>\n )\n } else {\n // Rail: a permanent spacer keeps the flex layout still; the nav is always absolute so only\n // its width animates on hover (no layout jump).\n body = (\n <>\n <div\n className=\"bg-sidebar border-r border-border flex flex-col h-full relative px-0 pb-safe flex-shrink-0\"\n style={{ width: COLLAPSED_WIDTH, minWidth: COLLAPSED_WIDTH }}\n aria-hidden=\"true\"\n />\n {isHovering && hasRailBackdrop && (\n <div\n className=\"fixed inset-0 z-[44] bg-black/40\"\n onClick={onBackdropClick}\n aria-hidden=\"true\"\n data-testid={testIdOr(backdropTestId, { testId: 'sidebar-backdrop' })}\n />\n )}\n <nav\n {...common}\n className={cn(\n navBase,\n isHovering ? '!px-3 shadow-xl' : '!px-2',\n 'absolute left-0 top-0 z-[45]',\n className\n )}\n style={{\n width: isHovering ? EXPANDED_WIDTH : COLLAPSED_WIDTH,\n minWidth: isHovering ? EXPANDED_WIDTH : COLLAPSED_WIDTH,\n }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </nav>\n </>\n )\n }\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <BlocksTooltipProvider>{body}</BlocksTooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nexport interface SidebarSectionProps {\n children: ReactNode\n className?: string\n 'data-testid'?: string\n}\n\nfunction SidebarHeader({ children, className, 'data-testid': testId }: SidebarSectionProps) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-3 pb-3', className)}\n >\n {children}\n </div>\n )\n}\n\nexport interface SidebarNavProps extends Omit<SidebarSectionProps, 'children'> {\n children?: ReactNode\n /** Rows as data. Children render after them. */\n items?: NavItem[]\n /** Labelled groups of rows as data (each a `Sidebar.Group`), after `items`. */\n sections?: NavSection[]\n}\n\nfunction SidebarNav({\n items,\n sections,\n children,\n className,\n 'data-testid': testId,\n}: SidebarNavProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n data-slot=\"sidebar-nav\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-0.5', !expanded && 'items-center', className)}\n >\n {items?.map((item) => (\n <SidebarNavItem key={item.id} {...item} />\n ))}\n {sections?.map((section) => (\n <SidebarGroup\n key={section.id}\n label={section.label}\n ariaLabel={section.ariaLabel}\n data-testid={section.testId}\n >\n {section.items.map((item) => (\n <SidebarNavItem key={item.id} {...item} />\n ))}\n </SidebarGroup>\n ))}\n {children}\n </div>\n )\n}\n\nexport interface SidebarGroupProps extends SidebarSectionProps {\n /** Group heading. Shown above the rows when expanded; a thin divider stands in on the rail. */\n label?: ReactNode\n /** Accessible name when `label` is not plain text. */\n ariaLabel?: string\n}\n\n/** A labelled run of rows inside the nav (for example \"Workspace\", \"Tools\"). */\nfunction SidebarGroup({\n label,\n ariaLabel,\n children,\n className,\n 'data-testid': testId,\n}: SidebarGroupProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}\n data-slot=\"sidebar-group\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-0.5', !expanded && 'items-center', className)}\n >\n {label &&\n (expanded ? (\n <SidebarGroupLabel>{label}</SidebarGroupLabel>\n ) : (\n <div\n role=\"separator\"\n data-slot=\"sidebar-group-divider\"\n className=\"my-1 h-px w-6 bg-border\"\n />\n ))}\n {children}\n </div>\n )\n}\n\n/** The heading of a `Sidebar.Group` (exported for custom headings). Hidden by the group on the rail. */\nfunction SidebarGroupLabel({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div\n data-slot=\"sidebar-group-label\"\n className={cn(\n 'px-2 pb-0.5 pt-2 text-xs font-medium uppercase tracking-wide text-muted-foreground',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nfunction SidebarFooter({ children, className, 'data-testid': testId }: SidebarSectionProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-testid={testId}\n className={cn(\n 'mt-auto flex flex-shrink-0 flex-col gap-2 pt-3 pb-3',\n !expanded && 'items-center',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nconst INDICATOR_TONES: Record<NavItemIndicator, string> = {\n progress: 'bg-primary',\n error: 'bg-red-solid',\n attention: 'bg-yellow-solid',\n}\n\nexport type SidebarNavItemProps = Omit<NavItem, 'id'> & {\n id?: string\n className?: string\n /** Tooltip shown on the icon-only rail; defaults to the label. */\n tooltip?: string\n}\n\n/**\n * One row: [icon] [label] [count] [trailing]. 36px (44px on coarse pointers). The active row is\n * the selection tint, never a filled block; counts are quiet numbers, not pills.\n *\n * The expanded row is a div with role=\"button\" (not a native <button>) so an interactive\n * `trailing` control can be nested without producing button-in-button markup.\n */\nfunction SidebarNavItem({\n label,\n icon,\n active = false,\n onSelect,\n href,\n count,\n countIcon,\n testId,\n disabled = false,\n trailing,\n indicator,\n className,\n tooltip,\n}: SidebarNavItemProps) {\n const { expanded } = useSidebarContext()\n // Tracked as state (not CSS :hover) so a trailing control can read it via context.\n const [isRowActive, setIsRowActive] = useState(false)\n const tip = expanded ? undefined : (tooltip ?? label)\n\n if (!expanded) {\n const railButton = (\n <ActionLink\n href={href}\n onSelect={onSelect}\n disabled={disabled}\n aria-label={label}\n aria-current={active ? 'page' : undefined}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={cn(\n 'm-0 flex h-9 w-12 items-center justify-center rounded-md transition-colors pointer-coarse:h-11',\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n disabled && 'pointer-events-none cursor-not-allowed opacity-30',\n className\n )}\n >\n <div className=\"flex size-5 items-center justify-center\">\n {indicator ? (\n <div className=\"relative\">\n {icon}\n <div\n data-slot=\"sidebar-nav-indicator\"\n data-tone={indicator}\n className={cn(\n 'absolute -right-1 -top-1 size-2.5 rounded-full border border-sidebar',\n INDICATOR_TONES[indicator]\n )}\n />\n </div>\n ) : (\n icon\n )}\n </div>\n </ActionLink>\n )\n if (!tip) return railButton\n return (\n <Tooltip delayDuration={50}>\n <TooltipTrigger asChild>{railButton}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {tip}\n </TooltipContent>\n </Tooltip>\n )\n }\n\n const rowClass = cn(\n 'group flex h-9 w-full cursor-pointer items-center rounded-md px-3 text-sm transition-colors pointer-coarse:h-11',\n active\n ? 'bg-accent font-semibold text-accent-foreground'\n : 'font-medium text-muted-foreground hover:bg-muted hover:text-foreground',\n disabled && 'pointer-events-none cursor-not-allowed opacity-30',\n className\n )\n const countNode = count !== undefined && (\n <span\n // `ml-auto` lines the counts up on the right edge as one column of numbers.\n className={cn(\n 'ml-auto inline-flex flex-shrink-0 items-center gap-0.5 pl-2 text-xs font-normal tabular-nums',\n active ? 'text-accent-foreground' : 'text-muted-foreground'\n )}\n >\n {countIcon}\n {count}\n </span>\n )\n\n // A link row without a nested control is the anchor itself.\n if (href && !disabled && !trailing) {\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-current={active ? 'page' : undefined}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={rowClass}\n >\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n </ActionLink>\n )\n }\n\n // A link row with a nested control: a stretched anchor sits under the content, and the\n // trailing control rises above it, so there is never an interactive element inside an anchor.\n if (href && !disabled) {\n return (\n <div\n onMouseEnter={() => setIsRowActive(true)}\n onMouseLeave={() => setIsRowActive(false)}\n onFocusCapture={() => setIsRowActive(true)}\n onBlurCapture={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setIsRowActive(false)\n }}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={cn(rowClass, 'relative')}\n >\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={active ? 'page' : undefined}\n className=\"absolute inset-0 rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <div className=\"pointer-events-none flex min-w-0 flex-1 items-center\">\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n </div>\n <SidebarRowHoverContext.Provider value={isRowActive}>\n <span className=\"relative ml-2 flex flex-shrink-0 items-center\">{trailing}</span>\n </SidebarRowHoverContext.Provider>\n </div>\n )\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-current={active ? 'page' : undefined}\n onClick={disabled ? undefined : onSelect}\n onMouseEnter={() => setIsRowActive(true)}\n onMouseLeave={() => setIsRowActive(false)}\n onFocusCapture={() => setIsRowActive(true)}\n onBlurCapture={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setIsRowActive(false)\n }}\n onKeyDown={\n disabled\n ? undefined\n : (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect()\n }\n }\n }\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={rowClass}\n >\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n {trailing && (\n <SidebarRowHoverContext.Provider value={isRowActive}>\n <span className=\"ml-auto flex flex-shrink-0 items-center pl-2\">{trailing}</span>\n </SidebarRowHoverContext.Provider>\n )}\n </div>\n )\n}\n\nexport interface SidebarPinToggleProps {\n isPinned: boolean\n onToggle: () => void\n className?: string\n /** Default `sidebar-pin-button`. */\n 'data-testid'?: string\n}\n\n/**\n * Pin/unpin button, revealed while the pointer is over the sidebar. It is always visible on\n * coarse pointers (no hover on touch) and revealed by keyboard focus anywhere in the sidebar. It\n * is hidden with opacity and pointer-events, never display:none, so it keeps its accessible name\n * and stays in the tab order.\n */\nfunction SidebarPinToggle({\n isPinned,\n onToggle,\n className,\n 'data-testid': testId,\n}: SidebarPinToggleProps) {\n const { expanded, labels } = useSidebarContext()\n const label = isPinned ? labels.hideSidebar : labels.showSidebar\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n title={label}\n aria-label={label}\n aria-pressed={isPinned}\n data-testid={testIdOr(testId, { testId: 'sidebar-pin-button' })}\n className={cn(\n 'flex flex-shrink-0 items-center justify-center rounded-md text-muted-foreground transition-[opacity,colors] hover:bg-muted hover:text-foreground pointer-coarse:size-11',\n 'pointer-events-none opacity-0 group-hover/sidebar:pointer-events-auto group-hover/sidebar:opacity-100',\n 'group-focus-within/sidebar:pointer-events-auto group-focus-within/sidebar:opacity-100',\n 'pointer-coarse:pointer-events-auto pointer-coarse:opacity-100 focus-visible:pointer-events-auto focus-visible:opacity-100',\n expanded ? 'size-9' : 'h-9 w-12',\n className\n )}\n >\n {isPinned ? <PanelLeftClose className=\"size-5\" /> : <PanelLeftOpen className=\"size-5\" />}\n </button>\n )\n}\n\nexport interface SidebarDrawerHeaderProps {\n /** Brand mark. */\n logo: ReactNode\n onClose: () => void\n closeLabel?: string\n /** Close button id (default `mobile-nav-close`). */\n 'data-testid'?: string\n}\n\n/** The phone drawer's header: brand mark and a 44px close button. */\nfunction SidebarDrawerHeader({\n logo,\n onClose,\n closeLabel: closeLabelProp,\n 'data-testid': testId,\n}: SidebarDrawerHeaderProps) {\n const { labels } = useSidebarContext()\n const closeLabel = closeLabelProp ?? labels.closeNavigationMenu\n return (\n <div\n data-slot=\"sidebar-drawer-header\"\n className=\"flex flex-shrink-0 items-center justify-between pb-2\"\n >\n {logo}\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={closeLabel}\n data-testid={testIdOr(testId, { testId: 'mobile-nav-close' })}\n className=\"flex size-11 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"size-5\" />\n </button>\n </div>\n )\n}\n\nexport { DEFAULT_SIDEBAR_LABELS, SidebarRowHoverContext, useSidebarContext, type SidebarLabels }\n\nexport const Sidebar = {\n Root: SidebarRoot,\n Header: SidebarHeader,\n Nav: SidebarNav,\n Group: SidebarGroup,\n GroupLabel: SidebarGroupLabel,\n NavItem: SidebarNavItem,\n Footer: SidebarFooter,\n PinToggle: SidebarPinToggle,\n BadgeRow: SidebarBadgeRow,\n DrawerHeader: SidebarDrawerHeader,\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/shell/sidebar-context.ts","../src/shell/SidebarBadgeRow.tsx","../src/lib/start-inset.ts","../src/shell/Sidebar.tsx"],"names":["createContext","useContext","forwardRef","SidebarBadgeRow","jsxs","cn","jsx","Tooltip","TooltipTrigger","TooltipContent","useEffect","useMemo","useRef","useDrawerBehavior","testIdOr","Fragment","BlocksTooltipProvider","useState","ActionLink","PanelLeftClose","PanelLeftOpen","X"],"mappings":"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","file":"chunk-POLG3CR3.cjs","sourcesContent":["import { createContext, useContext } from 'react'\n\n/** Fixed strings of the sidebar family. Set once on `Sidebar.Root`; parts read them from context. */\nexport interface SidebarLabels {\n /** The sidebar's accessible name (the Root `aria-label` prop wins). */\n mainNavigation: string\n hideSidebar: string\n showSidebar: string\n /** The drawer's close button (the `closeLabel` prop wins). */\n closeNavigationMenu: string\n}\n\nexport const DEFAULT_SIDEBAR_LABELS: SidebarLabels = {\n mainNavigation: 'Main navigation',\n hideSidebar: 'Hide sidebar',\n showSidebar: 'Show sidebar',\n closeNavigationMenu: 'Close navigation menu',\n}\n\nexport interface SidebarContextValue {\n /** Labels are visible (full width), as opposed to the icon-only rail. */\n expanded: boolean\n labels: SidebarLabels\n}\nexport const SidebarContext = createContext<SidebarContextValue>({\n expanded: true,\n labels: DEFAULT_SIDEBAR_LABELS,\n})\nexport const useSidebarContext = (): SidebarContextValue => useContext(SidebarContext)\n\n/** True while the surrounding row is hovered/focused; trailing controls may brighten on it. */\nexport const SidebarRowHoverContext = createContext(false)\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { useSidebarContext } from './sidebar-context'\n\nexport interface SidebarBadgeRowProps extends Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n 'children'\n> {\n /** Glyph (20px). */\n icon: ReactNode\n /** Visible label of the expanded row; the tooltip of the icon-only rail. */\n label: string\n /** Unread/pending number. Hidden at 0 or `undefined`; values above 9 read \"9+\". */\n count?: number\n /**\n * Accessible name including the count, for example \"Notifications, 2 unread\". Defaults to\n * `label` plus the count.\n */\n ariaLabel?: string\n /**\n * `row`: a labelled row styled like the module rows, badge at the right. `icon`: icon-only with\n * the badge on the corner. Default follows the sidebar (`row` expanded, `icon` on the rail).\n */\n variant?: 'row' | 'icon'\n /** Test id of the count badge. */\n badgeTestId?: string\n}\n\n/**\n * A sidebar row that carries a badge and may open something (a panel, a popover): the\n * notifications and contacts rows above the account bar. A real button that forwards its ref and\n * rest props, so it can be a popover trigger (`<DropdownMenuTrigger asChild>`). The badge is\n * visible in both the expanded row and the icon-only rail, and the accessible name carries the\n * count in both.\n */\nexport const SidebarBadgeRow = forwardRef<HTMLButtonElement, SidebarBadgeRowProps>(\n function SidebarBadgeRow(\n { icon, label, count, ariaLabel, variant, badgeTestId, className, type = 'button', ...rest },\n ref\n ) {\n const { expanded } = useSidebarContext()\n const resolved = variant ?? (expanded ? 'row' : 'icon')\n const hasCount = count !== undefined && count > 0\n const badgeText = hasCount ? (count > 9 ? '9+' : String(count)) : null\n const name = ariaLabel ?? (hasCount ? `${label}, ${count}` : label)\n\n if (resolved === 'row') {\n return (\n <button\n ref={ref}\n type={type}\n aria-label={name}\n data-slot=\"sidebar-badge-row\"\n data-variant=\"row\"\n className={cn(\n 'group flex h-9 w-full cursor-pointer items-center rounded-md px-3 text-left text-sm font-medium text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11',\n className\n )}\n {...rest}\n >\n <span className=\"flex size-5 flex-shrink-0 items-center justify-center\" aria-hidden>\n {icon}\n </span>\n <span className=\"ml-3 min-w-0 truncate\" aria-hidden>\n {label}\n </span>\n {badgeText && (\n <span\n aria-hidden\n data-testid={badgeTestId}\n className=\"ml-auto inline-flex min-w-5 flex-shrink-0 items-center justify-center rounded-full bg-primary px-1.5 text-xs font-semibold leading-5 tabular-nums text-primary-foreground\"\n >\n {badgeText}\n </span>\n )}\n </button>\n )\n }\n\n const iconButton = (\n <button\n ref={ref}\n type={type}\n aria-label={name}\n data-slot=\"sidebar-badge-row\"\n data-variant=\"icon\"\n title={variant === 'icon' ? label : undefined}\n className={cn(\n 'relative m-0 flex h-9 w-12 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:h-11',\n className\n )}\n {...rest}\n >\n <span className=\"flex size-5 items-center justify-center\" aria-hidden>\n {icon}\n </span>\n {badgeText && (\n <span\n aria-hidden\n data-testid={badgeTestId}\n className=\"absolute right-1 top-0.5 flex min-w-4 items-center justify-center rounded-full bg-primary px-1 text-xs font-semibold leading-4 tabular-nums text-primary-foreground\"\n >\n {badgeText}\n </span>\n )}\n </button>\n )\n // A standalone icon button (the page header) keeps its native title; the rail uses a tooltip.\n if (variant === 'icon') return iconButton\n return (\n <Tooltip delayDuration={50}>\n <TooltipTrigger asChild>{iconButton}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {label}\n </TooltipContent>\n </Tooltip>\n )\n }\n)\n","import { useEffect } from 'react'\n\n/**\n * The CSS custom property that carries how much of the screen's start (left) edge a docked sidebar\n * takes, set on `<html>`. A floating element pinned to the start corner (the install prompt)\n * positions itself `calc(var(--shell-start-inset, 0px) + 0.75rem)` so it never covers the\n * sidebar's footer (the account menu).\n */\nexport const SHELL_START_INSET_VAR = '--shell-start-inset'\n\nconst widths = new Map<symbol, number>()\n\nfunction apply(): void {\n if (typeof document === 'undefined') return\n const inset = Math.max(0, ...widths.values())\n const style = document.documentElement.style\n if (inset > 0) style.setProperty(SHELL_START_INSET_VAR, `${inset}px`)\n else style.removeProperty(SHELL_START_INSET_VAR)\n}\n\n/**\n * Report a sidebar docked at the start edge, `width` px wide (0 while it is collapsed or is an\n * overlay drawer), to {@link SHELL_START_INSET_VAR}. `Sidebar.Root` calls it; call it from your\n * own docked side panel.\n */\nexport function useShellStartInset(width: number): void {\n useEffect(() => {\n const key = Symbol('shell-start-inset')\n widths.set(key, width)\n apply()\n return () => {\n widths.delete(key)\n apply()\n }\n }, [width])\n}\n","import { useMemo, useRef, useState, type CSSProperties, type ReactNode } from 'react'\nimport { PanelLeftClose, PanelLeftOpen, X } from 'lucide-react'\nimport { cn, Tooltip, TooltipContent, TooltipTrigger } from '@arbidocs/react/ui'\nimport { testIdOr } from '../chat/test-id'\nimport {\n DEFAULT_SIDEBAR_LABELS,\n SidebarContext,\n SidebarRowHoverContext,\n useSidebarContext,\n type SidebarLabels,\n} from './sidebar-context'\nimport { SidebarBadgeRow } from './SidebarBadgeRow'\nimport { ActionLink } from '../components/ActionLink'\nimport { BlocksTooltipProvider } from '../provider/TooltipScope'\nimport { useDrawerBehavior } from '../lib/use-drawer'\nimport { useShellStartInset } from '../lib/start-inset'\nimport type { SidebarMode } from '../lib/sidebar-mode'\nimport type { NavItem, NavItemIndicator, NavSection } from './types'\n\n/**\n * Sidebar: the one tinted column that carries the app frame. Compound parts:\n * Sidebar.Root positioning shell for the four modes (drawer / collapsed / pinned / rail)\n * Sidebar.Header top block (switcher, ask field, pin toggle)\n * Sidebar.Nav the rows: pass `items` (NavItem[]) or compose Sidebar.NavItem children\n * Sidebar.Group a labelled run of rows (heading when expanded, divider on the rail)\n * Sidebar.Footer pinned to the bottom (offline pill, tips card, action cluster)\n * Sidebar.PinToggle / Sidebar.DrawerHeader the header's two stock controls\n *\n * Presentational and controlled: the app resolves `mode`/`expanded` (see `resolveSidebarLayout`\n * and `useSidebarSettle`) and owns where hover/pin/drawer state lives.\n */\n\nconst noop = () => {}\n\nconst COLLAPSED_PX = 64\nconst EXPANDED_PX = 256\nconst COLLAPSED_WIDTH = `${COLLAPSED_PX}px`\nconst EXPANDED_WIDTH = `${EXPANDED_PX}px`\n\nexport interface SidebarRootProps {\n /** Constrain the drawer to an embedded frame. The app keeps the viewport default. */\n contained?: boolean\n mode: SidebarMode\n /** Labels visible. Provided to every part through context. */\n expanded: boolean\n /** `rail` mode: floats open to full width. */\n isHovering?: boolean\n onBackdropClick?: () => void\n /** `rail` mode on touch: the floated-open rail dims the content behind it; tapping it closes. */\n hasRailBackdrop?: boolean\n onMouseEnter?: () => void\n onMouseLeave?: () => void\n children: ReactNode\n className?: string\n 'aria-label'?: string\n labels?: Partial<SidebarLabels>\n /** Root id (default `sidebar`). */\n 'data-testid'?: string\n /** Drawer backdrop id (default `sidebar-backdrop`). */\n backdropTestId?: string\n}\n\nfunction SidebarRoot({\n mode,\n contained = false,\n expanded,\n isHovering = false,\n onBackdropClick,\n hasRailBackdrop = false,\n onMouseEnter,\n onMouseLeave,\n children,\n className,\n 'aria-label': ariaLabelProp,\n labels,\n 'data-testid': testId,\n backdropTestId,\n}: SidebarRootProps) {\n const mergedLabels = useMemo(() => ({ ...DEFAULT_SIDEBAR_LABELS, ...labels }), [labels])\n // The drawer is a modal: scroll lock, Escape, focus trap and focus return to the opener.\n const drawerRef = useRef<HTMLDivElement>(null)\n const isDrawer = mode === 'drawer'\n useDrawerBehavior(isDrawer, onBackdropClick ?? noop, drawerRef)\n // Floating start-corner elements (the install prompt) sit clear of the docked sidebar; a rail\n // expanding on hover floats over the page, so only its collapsed width counts.\n useShellStartInset(mode === 'pinned' ? EXPANDED_PX : mode === 'rail' ? COLLAPSED_PX : 0)\n const ariaLabel = ariaLabelProp ?? mergedLabels.mainNavigation\n const contextValue = useMemo(() => ({ expanded, labels: mergedLabels }), [expanded, mergedLabels])\n // `navBase` omits horizontal padding so each mode owns its own: the collapsed state must\n // reach a true 0 width, which an `!important` px would block.\n const navBase =\n 'group/sidebar bg-sidebar border-r border-border text-foreground scrollbar-themed flex flex-col h-full overflow-y-auto overflow-x-hidden pb-safe pt-3 transition-all duration-300 ease-in-out'\n const common = {\n 'aria-label': ariaLabel,\n 'data-testid': testIdOr(testId, { testId: 'sidebar' }),\n 'data-slot': 'sidebar',\n 'data-mode': mode,\n } as const\n const fixedWidth: CSSProperties = { width: EXPANDED_WIDTH, minWidth: EXPANDED_WIDTH }\n\n let body: ReactNode\n if (mode === 'drawer') {\n // Small-screen off-canvas panel + dismiss backdrop; bypasses the hover/collapse model. The\n // wrapper is the modal dialog; the nav landmark sits inside it.\n body = (\n <div\n ref={drawerRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={ariaLabel}\n data-slot=\"sidebar-drawer\"\n className={cn(contained ? 'absolute' : 'fixed', 'inset-0 z-50')}\n >\n <div\n className=\"absolute inset-0 bg-black/50\"\n onClick={onBackdropClick}\n aria-hidden=\"true\"\n data-testid={testIdOr(backdropTestId, { testId: 'sidebar-backdrop' })}\n />\n <nav\n {...common}\n className={cn(navBase, '!px-3 absolute left-0 top-0 pt-safe shadow-xl', className)}\n style={fixedWidth}\n >\n {children}\n </nav>\n </div>\n )\n } else if (mode === 'collapsed') {\n // Stays mounted at width 0 so the transition runs on both enter and leave. Horizontal padding\n // is dropped or overflow-hidden would reveal a clipped sliver of the icons.\n body = (\n <nav\n {...common}\n className={cn(navBase, 'absolute left-0 top-0 z-[45]', className)}\n style={{\n width: '0px',\n minWidth: 0,\n paddingLeft: 0,\n paddingRight: 0,\n borderRightWidth: 0,\n pointerEvents: 'none',\n }}\n // Width 0 hides the links visually; inert also takes them out of the tab order and the\n // accessibility tree.\n inert\n >\n {children}\n </nav>\n )\n } else if (mode === 'pinned') {\n body = (\n <nav\n {...common}\n className={cn(navBase, '!px-3 relative flex-shrink-0', className)}\n style={fixedWidth}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </nav>\n )\n } else {\n // Rail: a permanent spacer keeps the flex layout still; the nav is always absolute so only\n // its width animates on hover (no layout jump).\n body = (\n <>\n <div\n className=\"bg-sidebar border-r border-border flex flex-col h-full relative px-0 pb-safe flex-shrink-0\"\n style={{ width: COLLAPSED_WIDTH, minWidth: COLLAPSED_WIDTH }}\n aria-hidden=\"true\"\n />\n {isHovering && hasRailBackdrop && (\n <div\n className=\"fixed inset-0 z-[44] bg-black/40\"\n onClick={onBackdropClick}\n aria-hidden=\"true\"\n data-testid={testIdOr(backdropTestId, { testId: 'sidebar-backdrop' })}\n />\n )}\n <nav\n {...common}\n className={cn(\n navBase,\n isHovering ? '!px-3 shadow-xl' : '!px-2',\n 'absolute left-0 top-0 z-[45]',\n className\n )}\n style={{\n width: isHovering ? EXPANDED_WIDTH : COLLAPSED_WIDTH,\n minWidth: isHovering ? EXPANDED_WIDTH : COLLAPSED_WIDTH,\n }}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n >\n {children}\n </nav>\n </>\n )\n }\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <BlocksTooltipProvider>{body}</BlocksTooltipProvider>\n </SidebarContext.Provider>\n )\n}\n\nexport interface SidebarSectionProps {\n children: ReactNode\n className?: string\n 'data-testid'?: string\n}\n\nfunction SidebarHeader({ children, className, 'data-testid': testId }: SidebarSectionProps) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-3 pb-3', className)}\n >\n {children}\n </div>\n )\n}\n\nexport interface SidebarNavProps extends Omit<SidebarSectionProps, 'children'> {\n children?: ReactNode\n /** Rows as data. Children render after them. */\n items?: NavItem[]\n /** Labelled groups of rows as data (each a `Sidebar.Group`), after `items`. */\n sections?: NavSection[]\n}\n\nfunction SidebarNav({\n items,\n sections,\n children,\n className,\n 'data-testid': testId,\n}: SidebarNavProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n data-slot=\"sidebar-nav\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-0.5', !expanded && 'items-center', className)}\n >\n {items?.map((item) => (\n <SidebarNavItem key={item.id} {...item} />\n ))}\n {sections?.map((section) => (\n <SidebarGroup\n key={section.id}\n label={section.label}\n ariaLabel={section.ariaLabel}\n data-testid={section.testId}\n >\n {section.items.map((item) => (\n <SidebarNavItem key={item.id} {...item} />\n ))}\n </SidebarGroup>\n ))}\n {children}\n </div>\n )\n}\n\nexport interface SidebarGroupProps extends SidebarSectionProps {\n /** Group heading. Shown above the rows when expanded; a thin divider stands in on the rail. */\n label?: ReactNode\n /** Accessible name when `label` is not plain text. */\n ariaLabel?: string\n}\n\n/** A labelled run of rows inside the nav (for example \"Workspace\", \"Tools\"). */\nfunction SidebarGroup({\n label,\n ariaLabel,\n children,\n className,\n 'data-testid': testId,\n}: SidebarGroupProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel ?? (typeof label === 'string' ? label : undefined)}\n data-slot=\"sidebar-group\"\n data-testid={testId}\n className={cn('flex flex-shrink-0 flex-col gap-0.5', !expanded && 'items-center', className)}\n >\n {label &&\n (expanded ? (\n <SidebarGroupLabel>{label}</SidebarGroupLabel>\n ) : (\n <div\n role=\"separator\"\n data-slot=\"sidebar-group-divider\"\n className=\"my-1 h-px w-6 bg-border\"\n />\n ))}\n {children}\n </div>\n )\n}\n\n/** The heading of a `Sidebar.Group` (exported for custom headings). Hidden by the group on the rail. */\nfunction SidebarGroupLabel({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div\n data-slot=\"sidebar-group-label\"\n className={cn(\n 'px-2 pb-0.5 pt-2 text-xs font-medium uppercase tracking-wide text-muted-foreground',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nfunction SidebarFooter({ children, className, 'data-testid': testId }: SidebarSectionProps) {\n const { expanded } = useSidebarContext()\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-testid={testId}\n className={cn(\n 'mt-auto flex flex-shrink-0 flex-col gap-2 pt-3 pb-3',\n !expanded && 'items-center',\n className\n )}\n >\n {children}\n </div>\n )\n}\n\nconst INDICATOR_TONES: Record<NavItemIndicator, string> = {\n progress: 'bg-primary',\n error: 'bg-red-solid',\n attention: 'bg-yellow-solid',\n}\n\nexport type SidebarNavItemProps = Omit<NavItem, 'id'> & {\n id?: string\n className?: string\n /** Tooltip shown on the icon-only rail; defaults to the label. */\n tooltip?: string\n}\n\n/**\n * One row: [icon] [label] [count] [trailing]. 36px (44px on coarse pointers). The active row is\n * the selection tint, never a filled block; counts are quiet numbers, not pills.\n *\n * The expanded row is a div with role=\"button\" (not a native <button>) so an interactive\n * `trailing` control can be nested without producing button-in-button markup.\n */\nfunction SidebarNavItem({\n label,\n icon,\n active = false,\n onSelect,\n href,\n count,\n countIcon,\n testId,\n disabled = false,\n trailing,\n indicator,\n className,\n tooltip,\n}: SidebarNavItemProps) {\n const { expanded } = useSidebarContext()\n // Tracked as state (not CSS :hover) so a trailing control can read it via context.\n const [isRowActive, setIsRowActive] = useState(false)\n const tip = expanded ? undefined : (tooltip ?? label)\n\n if (!expanded) {\n const railButton = (\n <ActionLink\n href={href}\n onSelect={onSelect}\n disabled={disabled}\n aria-label={label}\n aria-current={active ? 'page' : undefined}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={cn(\n 'm-0 flex h-9 w-12 items-center justify-center rounded-md transition-colors pointer-coarse:h-11',\n active\n ? 'bg-accent text-accent-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground',\n disabled && 'pointer-events-none cursor-not-allowed opacity-30',\n className\n )}\n >\n <div className=\"flex size-5 items-center justify-center\">\n {indicator ? (\n <div className=\"relative\">\n {icon}\n <div\n data-slot=\"sidebar-nav-indicator\"\n data-tone={indicator}\n className={cn(\n 'absolute -right-1 -top-1 size-2.5 rounded-full border border-sidebar',\n INDICATOR_TONES[indicator]\n )}\n />\n </div>\n ) : (\n icon\n )}\n </div>\n </ActionLink>\n )\n if (!tip) return railButton\n return (\n <Tooltip delayDuration={50}>\n <TooltipTrigger asChild>{railButton}</TooltipTrigger>\n <TooltipContent side=\"right\" sideOffset={8}>\n {tip}\n </TooltipContent>\n </Tooltip>\n )\n }\n\n const rowClass = cn(\n 'group flex h-9 w-full cursor-pointer items-center rounded-md px-3 text-sm transition-colors pointer-coarse:h-11',\n active\n ? 'bg-accent font-semibold text-accent-foreground'\n : 'font-medium text-muted-foreground hover:bg-muted hover:text-foreground',\n disabled && 'pointer-events-none cursor-not-allowed opacity-30',\n className\n )\n const countNode = count !== undefined && (\n <span\n // `ml-auto` lines the counts up on the right edge as one column of numbers.\n className={cn(\n 'ml-auto inline-flex flex-shrink-0 items-center gap-0.5 pl-2 text-xs font-normal tabular-nums',\n active ? 'text-accent-foreground' : 'text-muted-foreground'\n )}\n >\n {countIcon}\n {count}\n </span>\n )\n\n // A link row without a nested control is the anchor itself.\n if (href && !disabled && !trailing) {\n return (\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-current={active ? 'page' : undefined}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={rowClass}\n >\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n </ActionLink>\n )\n }\n\n // A link row with a nested control: a stretched anchor sits under the content, and the\n // trailing control rises above it, so there is never an interactive element inside an anchor.\n if (href && !disabled) {\n return (\n <div\n onMouseEnter={() => setIsRowActive(true)}\n onMouseLeave={() => setIsRowActive(false)}\n onFocusCapture={() => setIsRowActive(true)}\n onBlurCapture={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setIsRowActive(false)\n }}\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={cn(rowClass, 'relative')}\n >\n <ActionLink\n href={href}\n onSelect={onSelect}\n aria-label={label}\n aria-current={active ? 'page' : undefined}\n className=\"absolute inset-0 rounded-md focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n />\n <div className=\"pointer-events-none flex min-w-0 flex-1 items-center\">\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n </div>\n <SidebarRowHoverContext.Provider value={isRowActive}>\n <span className=\"relative ml-2 flex flex-shrink-0 items-center\">{trailing}</span>\n </SidebarRowHoverContext.Provider>\n </div>\n )\n }\n\n return (\n <div\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n aria-current={active ? 'page' : undefined}\n onClick={disabled ? undefined : onSelect}\n onMouseEnter={() => setIsRowActive(true)}\n onMouseLeave={() => setIsRowActive(false)}\n onFocusCapture={() => setIsRowActive(true)}\n onBlurCapture={(e) => {\n if (!e.currentTarget.contains(e.relatedTarget as Node | null)) setIsRowActive(false)\n }}\n onKeyDown={\n disabled\n ? undefined\n : (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onSelect()\n }\n }\n }\n data-slot=\"sidebar-nav-item\"\n data-testid={testId}\n className={rowClass}\n >\n <div className=\"flex size-5 flex-shrink-0 items-center justify-center\">{icon}</div>\n <span className=\"ml-3 min-w-0 truncate text-left\">{label}</span>\n {countNode}\n {trailing && (\n <SidebarRowHoverContext.Provider value={isRowActive}>\n <span className=\"ml-auto flex flex-shrink-0 items-center pl-2\">{trailing}</span>\n </SidebarRowHoverContext.Provider>\n )}\n </div>\n )\n}\n\nexport interface SidebarPinToggleProps {\n isPinned: boolean\n onToggle: () => void\n className?: string\n /** Default `sidebar-pin-button`. */\n 'data-testid'?: string\n}\n\n/**\n * Pin/unpin button, revealed while the pointer is over the sidebar. It is always visible on\n * coarse pointers (no hover on touch) and revealed by keyboard focus anywhere in the sidebar. It\n * is hidden with opacity and pointer-events, never display:none, so it keeps its accessible name\n * and stays in the tab order.\n */\nfunction SidebarPinToggle({\n isPinned,\n onToggle,\n className,\n 'data-testid': testId,\n}: SidebarPinToggleProps) {\n const { expanded, labels } = useSidebarContext()\n const label = isPinned ? labels.hideSidebar : labels.showSidebar\n return (\n <button\n type=\"button\"\n onClick={onToggle}\n title={label}\n aria-label={label}\n aria-pressed={isPinned}\n data-testid={testIdOr(testId, { testId: 'sidebar-pin-button' })}\n className={cn(\n 'flex flex-shrink-0 items-center justify-center rounded-md text-muted-foreground transition-[opacity,colors] hover:bg-muted hover:text-foreground pointer-coarse:size-11',\n 'pointer-events-none opacity-0 group-hover/sidebar:pointer-events-auto group-hover/sidebar:opacity-100',\n 'group-focus-within/sidebar:pointer-events-auto group-focus-within/sidebar:opacity-100',\n 'pointer-coarse:pointer-events-auto pointer-coarse:opacity-100 focus-visible:pointer-events-auto focus-visible:opacity-100',\n expanded ? 'size-9' : 'h-9 w-12',\n className\n )}\n >\n {isPinned ? <PanelLeftClose className=\"size-5\" /> : <PanelLeftOpen className=\"size-5\" />}\n </button>\n )\n}\n\nexport interface SidebarDrawerHeaderProps {\n /** Brand mark. */\n logo: ReactNode\n onClose: () => void\n closeLabel?: string\n /** Close button id (default `mobile-nav-close`). */\n 'data-testid'?: string\n}\n\n/** The phone drawer's header: brand mark and a 44px close button. */\nfunction SidebarDrawerHeader({\n logo,\n onClose,\n closeLabel: closeLabelProp,\n 'data-testid': testId,\n}: SidebarDrawerHeaderProps) {\n const { labels } = useSidebarContext()\n const closeLabel = closeLabelProp ?? labels.closeNavigationMenu\n return (\n <div\n data-slot=\"sidebar-drawer-header\"\n className=\"flex flex-shrink-0 items-center justify-between pb-2\"\n >\n {logo}\n <button\n type=\"button\"\n onClick={onClose}\n aria-label={closeLabel}\n data-testid={testIdOr(testId, { testId: 'mobile-nav-close' })}\n className=\"flex size-11 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"size-5\" />\n </button>\n </div>\n )\n}\n\nexport { DEFAULT_SIDEBAR_LABELS, SidebarRowHoverContext, useSidebarContext, type SidebarLabels }\n\nexport const Sidebar = {\n Root: SidebarRoot,\n Header: SidebarHeader,\n Nav: SidebarNav,\n Group: SidebarGroup,\n GroupLabel: SidebarGroupLabel,\n NavItem: SidebarNavItem,\n Footer: SidebarFooter,\n PinToggle: SidebarPinToggle,\n BadgeRow: SidebarBadgeRow,\n DrawerHeader: SidebarDrawerHeader,\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { UserAvatar, DocumentUser, useDocumentFolders, RelatedDocumentsCell } from './chunk-
|
|
3
|
-
import { FieldValue, FieldFolderSelect, FieldFolderValue, FieldNativeSelect, FieldWithAttribution, FolderCommandList, FieldLabelsSelect, FieldAttribution } from './chunk-
|
|
2
|
+
import { UserAvatar, DocumentUser, useDocumentFolders, RelatedDocumentsCell } from './chunk-HO53IJIQ.js';
|
|
3
|
+
import { FieldValue, FieldFolderSelect, FieldFolderValue, FieldNativeSelect, FieldWithAttribution, FolderCommandList, FieldLabelsSelect, FieldAttribution } from './chunk-WZRWV6EZ.js';
|
|
4
4
|
import { EntityTooltip, EntityTooltipHeader } from './chunk-3UIJLUXN.js';
|
|
5
5
|
import { useCallback, useMemo } from 'react';
|
|
6
6
|
import { useWorkspaceUsers, useTags, useOpenViewerDocumentId } from '@arbidocs/react';
|
|
@@ -335,5 +335,5 @@ function documentFieldContent(options) {
|
|
|
335
335
|
}
|
|
336
336
|
|
|
337
337
|
export { ConnectedTagEntity, documentFieldContent, useMemberLookup };
|
|
338
|
-
//# sourceMappingURL=chunk-
|
|
339
|
-
//# sourceMappingURL=chunk-
|
|
338
|
+
//# sourceMappingURL=chunk-PV5ICMAE.js.map
|
|
339
|
+
//# sourceMappingURL=chunk-PV5ICMAE.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/files/fields/useMemberLookup.ts","../src/connection/files/grid/ConnectedTagEntity.tsx","../src/connection/files/fields/DocumentFieldParts.tsx","../src/connection/files/fields/documentField.tsx"],"names":["useWorkspaceUsers","SharedTagEntity","jsx","formatFriendlyDate","useMemo","getEntityColor","value","tag"],"mappings":"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","file":"chunk-GZAM727N.js","sourcesContent":["import { useCallback } from 'react'\nimport { useWorkspaceUsers, type DocumentPerson } from '@arbidocs/react'\n\n/** Finds a workspace member by id (undefined for anyone else, or no id). */\nexport function useMemberLookup(): (\n userId: string | null | undefined\n) => DocumentPerson | undefined {\n const { data: members = [] } = useWorkspaceUsers()\n return useCallback(\n (userId) => (userId ? members.find((m) => m.user.external_id === userId)?.user : undefined),\n [members]\n )\n}\n","/**\n * A label or field as a pill, with the rich hover card: its type, how many documents carry it, who\n * can see it (a toggle for its owner), and who created and last changed it. The pill itself is the\n * shared `TagEntity` of `@arbidocs/react/ui`; this adds what it reads from the session.\n */\n\nimport { useMemo } from 'react'\nimport { useTags, useWorkspaceUsers } from '@arbidocs/react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport {\n Badge,\n formatFriendlyDate,\n getEntityColor,\n getTagTypeIcon,\n getTagTypeLabel,\n TagEntity as SharedTagEntity,\n VisibilityToggle,\n} from '@arbidocs/react/ui'\nimport { EntityTooltip, EntityTooltipHeader } from '../../../components/EntityTooltip'\nimport { UserAvatar } from './cells'\n\nexport interface ConnectedTagEntityProps {\n tag: TagResponse\n size?: 'sm' | 'md' | 'lg'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Whether to show the detailed tooltip (default: true) */\n showTooltip?: boolean\n /** Whether current user can edit this tag (owner) */\n canEdit?: boolean\n /** Callback when edit is requested (clicking visibility toggle as owner) */\n onEditClick?: () => void\n}\n\nexport function ConnectedTagEntity({\n tag,\n size = 'md',\n className = '',\n onClick,\n showTooltip = true,\n canEdit = false,\n onEditClick,\n}: ConnectedTagEntityProps) {\n // Get fresh tag data from React Query cache for accurate doctag_count\n const { data: workspaceTags } = useTags()\n\n // The workspace's members: who created and last changed it.\n const { data: members = [] } = useWorkspaceUsers()\n const byId = (id: string | null | undefined) =>\n id ? members.find((m) => m.user.external_id === id)?.user : undefined\n\n // Look up fresh tag from query cache, fall back to prop if not found\n const freshTag = useMemo(() => {\n if (!workspaceTags) return tag\n const found = workspaceTags.find((t) => t.external_id === tag.external_id)\n return found || tag\n }, [workspaceTags, tag])\n\n // Look up creator and updater from the people you know\n const creator = byId(tag.created_by_ext_id) ?? null\n const updater = byId(tag.updated_by_ext_id) ?? null\n\n const Icon = getTagTypeIcon(tag.tag_type.type)\n const tagColor = getEntityColor(tag.external_id, 'medium')\n\n // Handle visibility toggle click for owner\n const handleVisibilityToggle = () => {\n if (canEdit && onEditClick) {\n onEditClick()\n }\n }\n\n // Rich, store-coupled tooltip — injected into the shared pill.\n const tooltipContent = showTooltip ? (\n <EntityTooltip>\n <EntityTooltipHeader\n lead={\n <span\n className=\"inline-flex items-center justify-center rounded-md text-white p-1\"\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={16} />\n </span>\n }\n title={tag.name}\n />\n\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Type:</span>\n <span>{getTagTypeLabel(tag.tag_type.type)}</span>\n </div>\n\n {/* Files count - use freshTag for accurate count */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Documents:</span>\n <Badge variant=\"secondary\" className=\"h-5 min-w-[20px] justify-center\">\n {freshTag.doctag_count ?? 0}\n </Badge>\n </div>\n\n {/* Visibility with toggle */}\n <div className=\"flex items-center gap-2\">\n <VisibilityToggle\n items={freshTag}\n onToggle={handleVisibilityToggle}\n disabled={!canEdit}\n showLabel={false}\n showTooltip={canEdit}\n tooltipActive=\"Click to edit\"\n tooltipInactive=\"Click to edit\"\n />\n <span className=\"text-muted-foreground\">{freshTag.shared ? 'Shared' : 'Private'}</span>\n </div>\n\n {/* Created at/by */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Created:</span>\n <span>{formatFriendlyDate(tag.created_at)}</span>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={creator ?? undefined} />\n </div>\n\n {/* Updated at/by */}\n {tag.updated_at && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Updated:</span>\n <span>{formatFriendlyDate(tag.updated_at)}</span>\n {updater && (\n <>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={updater} />\n </>\n )}\n </div>\n )}\n </div>\n </EntityTooltip>\n ) : undefined\n\n return (\n <SharedTagEntity\n tag={{ ...tag, color: tagColor }}\n size={size}\n className={className}\n onClick={onClick}\n showTooltip={showTooltip}\n tooltipContent={tooltipContent}\n />\n )\n}\n","/**\n * The parts of the review form's fields: the folder picker, the related documents, who last set a\n * value, and the labels picker.\n */\n\nimport { useMemo } from 'react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport { useOpenViewerDocumentId, type RelatedDocs, type WorkspaceDocument } from '@arbidocs/react'\nimport { formatFriendlyDate, getEntityColor } from '@arbidocs/react/ui'\nimport { FieldAttribution, FieldLabelsSelect } from '../../../files/FieldParts'\nimport type { LabelOption } from '../../../files/cells/LabelMultiSelect'\nimport { FolderCommandList } from '../../../files/FolderPicker'\nimport { RelatedDocumentsCell, useDocumentFolders } from '../grid/cells'\nimport { DocumentUser } from './DocumentUser'\nimport { useMemberLookup } from './useMemberLookup'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\n\n/** The workspace's folders to move the document to. */\nexport function FolderPicker({\n documents,\n value,\n onSelect,\n}: {\n documents: WorkspaceDocument[]\n value: string | null | undefined\n onSelect: (folder: string | null) => void\n}) {\n const folders = useDocumentFolders(documents, value)\n return (\n <FolderCommandList folders={folders} value={value} onSelect={onSelect} showRemove={!!value} />\n )\n}\n\n/** The related documents, the one open in the viewer marked. */\nexport function RelatedDocuments({\n doc,\n related,\n onOpen,\n onDelete,\n canDelete,\n onCompare,\n}: {\n doc: WorkspaceDocument\n related: RelatedDocs<WorkspaceDocument>\n onOpen?: (docId: string) => void\n onDelete?: (docId: string) => void\n canDelete?: (doc: WorkspaceDocument) => boolean\n onCompare?: (docId: string, otherDocId: string) => void\n}) {\n const viewingDocumentId = useOpenViewerDocumentId()\n return (\n <RelatedDocumentsCell\n currentDoc={doc}\n related={related}\n viewingDocumentId={viewingDocumentId}\n onDocumentClick={(id) => onOpen?.(id)}\n onDelete={(other) => onDelete?.(other.external_id)}\n canDelete={canDelete}\n onCompare={onCompare}\n />\n )\n}\n\n/** Who last set a value, and when: shown on hover. */\nexport function DocTagAttribution({ doctag }: { doctag: DocTag }) {\n const memberById = useMemberLookup()\n const creator = memberById(doctag.created_by_ext_id)\n const updater =\n doctag.updated_by_ext_id && doctag.updated_by_ext_id !== doctag.created_by_ext_id\n ? memberById(doctag.updated_by_ext_id)\n : undefined\n const lastUser = updater || creator\n if (!lastUser) return null\n const lines = [\n creator &&\n `Created ${formatFriendlyDate(doctag.created_at)} by ${creator.given_name || creator.email}`,\n updater &&\n `Updated ${formatFriendlyDate(doctag.updated_at)} by ${updater.given_name || updater.email}`,\n ].filter((line): line is string => !!line)\n return (\n <FieldAttribution\n avatar={<DocumentUser user={lastUser} tooltip={false} />}\n date={formatFriendlyDate(updater ? doctag.updated_at : doctag.created_at)}\n lines={lines}\n />\n )\n}\n\n/** The labels as a picker: toggle one, or create one by name and apply it. */\nexport function LabelsCombobox({\n labelTags,\n appliedTagIds,\n onToggle,\n onCreateAndApply,\n}: {\n labelTags: TagResponse[]\n appliedTagIds: ReadonlySet<string>\n onToggle: (tag: TagResponse) => void\n onCreateAndApply?: (name: string) => void\n}) {\n const options: LabelOption[] = useMemo(\n () =>\n labelTags.map((t) => ({\n id: t.external_id,\n name: t.name,\n color: getEntityColor(t.external_id, 'medium'),\n })),\n [labelTags]\n )\n\n // An existing label of that name (any case) is applied rather than made again.\n const handleCreate = (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = labelTags.find((t) => t.name.toLowerCase() === trimmed.toLowerCase())\n if (!existing) onCreateAndApply?.(trimmed)\n else if (!appliedTagIds.has(existing.external_id)) onToggle(existing)\n }\n\n return (\n <FieldLabelsSelect\n options={options}\n appliedIds={appliedTagIds}\n onToggle={(id) => {\n const tag = labelTags.find((t) => t.external_id === id)\n if (tag) onToggle(tag)\n }}\n onCreate={onCreateAndApply ? handleCreate : undefined}\n />\n )\n}\n","/**\n * One field of a document as the review form shows it (a column of the documents table, one per\n * row): its label, icon and the value, editable where the table's column is. Standard fields,\n * metadata, the folder, related documents, the labels and each annotation (with who last set it).\n */\n\nimport type { ElementType, ReactNode } from 'react'\nimport { isAnnotationTag, isLabelTag, type TagResponse } from '@arbidocs/sdk/browser'\nimport type { DocumentPerson, RelatedDocs, WorkspaceDocument } from '@arbidocs/react'\nimport {\n DebouncedInput,\n formatFriendlyDate,\n friendlyFileType,\n Textarea,\n formatDocDate,\n getDocumentDate,\n getDocumentTitle,\n} from '@arbidocs/react/ui'\nimport {\n FieldFolderSelect,\n FieldFolderValue,\n FieldNativeSelect,\n FieldValue,\n FieldWithAttribution,\n} from '../../../files/FieldParts'\nimport { DocumentUser } from './DocumentUser'\nimport {\n DocTagAttribution,\n FolderPicker,\n LabelsCombobox,\n RelatedDocuments,\n} from './DocumentFieldParts'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\nexport type DocTagCitations = NonNullable<DocTag['citations']> | null\n\n/** A field as the form lays it out. */\nexport interface DocumentFieldContent {\n label: string\n icon?: ReactNode\n /** The annotation the field is (its pill is shown as the label). */\n tag?: TagResponse\n children: ReactNode\n}\n\nexport interface DocumentFieldOptions {\n /** The column (a standard field's id, or an annotation's tag id). */\n columnId: string\n doc: WorkspaceDocument\n canEdit: boolean\n workspaceTags: TagResponse[]\n /** The workspace's documents (the folders to pick from). */\n allDocuments?: WorkspaceDocument[]\n /** Who uploaded the document. */\n creator?: DocumentPerson\n getColumnLabel: (colId: string) => string\n getColumnIcon: (colId: string) => ElementType | undefined\n isColumnEditable: (colId: string) => boolean\n onUpdateDocumentField: (field: string, value: unknown) => void\n onUpdateTagValue: (tag: TagResponse, value: string | boolean) => void\n onUpdateTagWithCitations: (tag: TagResponse, note: string, citations: DocTagCitations) => void\n /** Create a label and apply it (the labels picker). Absent: the picker only toggles. */\n onCreateAndApplyLabel?: (name: string) => void\n /** The document's related documents (email family, copies, duplicates, similar). */\n relatedDocs?: RelatedDocs<WorkspaceDocument>\n /** Open a related document. */\n onOpenDocument?: (docId: string) => void\n /** Delete a related document (asks first). */\n onDeleteDocument?: (docId: string) => void\n canDeleteRelatedDocument?: (doc: WorkspaceDocument) => boolean\n /** Compare with a similar document. Absent: not offered. */\n onCompareDocuments?: (docId: string, otherDocId: string) => void\n}\n\n/** The document metadata a field edits as text. */\nconst METADATA_FIELDS: Record<string, (doc: WorkspaceDocument) => string> = {\n title: (doc) => getDocumentTitle(doc),\n doc_nature: (doc) => doc.doc_metadata?.doc_nature || '',\n doc_author: (doc) => doc.doc_metadata?.doc_author || '',\n doc_subject: (doc) => doc.doc_metadata?.doc_subject || '',\n // As the table shows it: with the time when the value has one (emails).\n doc_date: (doc) => formatDocDate(getDocumentDate(doc)),\n}\n\nconst INPUT_CLASS = 'text-sm bg-muted/40 focus:bg-background transition-colors'\n\n/** A read-only standard field: its value (muted unless said otherwise). */\nconst READ_ONLY_FIELDS: Record<string, (doc: WorkspaceDocument) => ReactNode> = {\n file_name: (doc) => <FieldValue tone=\"strong\">{doc.file_name || 'N/A'}</FieldValue>,\n status: (doc) => <FieldValue tone=\"muted\">{doc.status || 'N/A'}</FieldValue>,\n n_pages: (doc) => <FieldValue tone=\"muted\">{doc.n_pages || 'N/A'}</FieldValue>,\n created_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.created_at ? formatFriendlyDate(doc.created_at) : 'N/A'}\n </FieldValue>\n ),\n updated_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.updated_at ? formatFriendlyDate(doc.updated_at) : 'N/A'}\n </FieldValue>\n ),\n file_type: (doc) => (\n <FieldValue tone=\"muted\">{friendlyFileType(doc.file_type, doc.file_name)}</FieldValue>\n ),\n file_size: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.file_size ? `${Math.round(doc.file_size / 1024)} KB` : 'N/A'}\n </FieldValue>\n ),\n doc_id: (doc) => (\n <FieldValue tone=\"muted\" isMono>\n {doc.external_id || 'N/A'}\n </FieldValue>\n ),\n content_hash: (doc) => (\n <FieldValue tone=\"muted\" isMono isTruncated>\n {doc.content_hash || 'N/A'}\n </FieldValue>\n ),\n}\n\n/** The field of `columnId`, or null when the document has none to show there. */\nexport function documentFieldContent(options: DocumentFieldOptions): DocumentFieldContent | null {\n const { columnId, doc, canEdit, workspaceTags, getColumnLabel, getColumnIcon } = options\n const Icon = getColumnIcon(columnId)\n const standard = (children: ReactNode): DocumentFieldContent => ({\n label: getColumnLabel(columnId),\n icon: Icon ? <Icon size={14} /> : undefined,\n children,\n })\n\n const metadata = METADATA_FIELDS[columnId]\n if (metadata) {\n const editable = options.isColumnEditable(columnId) && canEdit\n return standard(\n editable ? (\n <DebouncedInput\n value={metadata(doc)}\n onChange={(value) => options.onUpdateDocumentField(columnId, value)}\n multiline={true}\n placeholder={`Add ${getColumnLabel(columnId).toLowerCase()}…`}\n className={INPUT_CLASS}\n />\n ) : (\n <FieldValue>{metadata(doc) || 'N/A'}</FieldValue>\n )\n )\n }\n\n const readOnly = READ_ONLY_FIELDS[columnId]\n if (readOnly) return standard(readOnly(doc))\n\n if (columnId === 'created_by') return standard(<DocumentUser user={options.creator} />)\n\n if (columnId === 'folder') {\n return standard(\n canEdit ? (\n <FieldFolderSelect\n folder={doc.folder}\n picker={\n <FolderPicker\n documents={options.allDocuments ?? []}\n value={doc.folder}\n onSelect={(folder) => options.onUpdateDocumentField('folder', folder)}\n />\n }\n />\n ) : (\n <FieldFolderValue folder={doc.folder} />\n )\n )\n }\n\n if (columnId === 'related') {\n const related = options.relatedDocs\n if (!related) return null\n return standard(\n <RelatedDocuments\n doc={doc}\n related={related}\n onOpen={options.onOpenDocument}\n onDelete={options.onDeleteDocument}\n canDelete={options.canDeleteRelatedDocument}\n onCompare={options.onCompareDocuments}\n />\n )\n }\n\n if (columnId === 'all_tags') {\n // The labels (and issues), toggled in place.\n const labelTags = workspaceTags.filter(isLabelTag)\n const appliedIds = new Set(\n (doc.doctags ?? [])\n .filter((dt) => labelTags.some((t) => t.external_id === dt.tag_ext_id))\n .map((dt) => dt.tag_ext_id)\n )\n return standard(\n <LabelsCombobox\n labelTags={labelTags}\n appliedTagIds={appliedIds}\n onToggle={(tag) => options.onUpdateTagValue(tag, !appliedIds.has(tag.external_id))}\n onCreateAndApply={options.onCreateAndApplyLabel}\n />\n )\n }\n\n // An annotation (a label is a value of the Labels field, not a field of its own).\n const tag = workspaceTags.find((t) => t.external_id === columnId)\n if (!tag || !isAnnotationTag(tag)) return null\n const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === tag.external_id)\n\n let value: ReactNode\n if (tag.tag_type.type === 'select') {\n value = (\n <FieldNativeSelect\n value={doctag?.note || ''}\n options={tag.tag_type.options}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n ariaLabel={tag.name}\n />\n )\n } else if (tag.tag_type.type === 'number') {\n value = (\n <DebouncedInput\n type=\"number\"\n value={doctag?.note || ''}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n placeholder={`Add ${tag.name.toLowerCase()}…`}\n className={INPUT_CLASS}\n />\n )\n } else {\n // A plain note: a value's citations come from generation and are kept as they are.\n value = (\n <Textarea\n value={doctag?.note || ''}\n onChange={(e) =>\n options.onUpdateTagWithCitations(tag, e.target.value, doctag?.citations ?? null)\n }\n placeholder=\"Add a note...\"\n rows={2}\n className={INPUT_CLASS}\n />\n )\n }\n\n return {\n label: tag.name,\n tag,\n children: doctag ? (\n <FieldWithAttribution attribution={<DocTagAttribution doctag={doctag} />}>\n {value}\n </FieldWithAttribution>\n ) : (\n value\n ),\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/connection/files/fields/useMemberLookup.ts","../src/connection/files/grid/ConnectedTagEntity.tsx","../src/connection/files/fields/DocumentFieldParts.tsx","../src/connection/files/fields/documentField.tsx"],"names":["useWorkspaceUsers","SharedTagEntity","jsx","formatFriendlyDate","useMemo","getEntityColor","value","tag"],"mappings":"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","file":"chunk-PV5ICMAE.js","sourcesContent":["import { useCallback } from 'react'\nimport { useWorkspaceUsers, type DocumentPerson } from '@arbidocs/react'\n\n/** Finds a workspace member by id (undefined for anyone else, or no id). */\nexport function useMemberLookup(): (\n userId: string | null | undefined\n) => DocumentPerson | undefined {\n const { data: members = [] } = useWorkspaceUsers()\n return useCallback(\n (userId) => (userId ? members.find((m) => m.user.external_id === userId)?.user : undefined),\n [members]\n )\n}\n","/**\n * A label or field as a pill, with the rich hover card: its type, how many documents carry it, who\n * can see it (a toggle for its owner), and who created and last changed it. The pill itself is the\n * shared `TagEntity` of `@arbidocs/react/ui`; this adds what it reads from the session.\n */\n\nimport { useMemo } from 'react'\nimport { useTags, useWorkspaceUsers } from '@arbidocs/react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport {\n Badge,\n formatFriendlyDate,\n getEntityColor,\n getTagTypeIcon,\n getTagTypeLabel,\n TagEntity as SharedTagEntity,\n VisibilityToggle,\n} from '@arbidocs/react/ui'\nimport { EntityTooltip, EntityTooltipHeader } from '../../../components/EntityTooltip'\nimport { UserAvatar } from './cells'\n\nexport interface ConnectedTagEntityProps {\n tag: TagResponse\n size?: 'sm' | 'md' | 'lg'\n className?: string\n onClick?: (e: React.MouseEvent) => void\n /** Whether to show the detailed tooltip (default: true) */\n showTooltip?: boolean\n /** Whether current user can edit this tag (owner) */\n canEdit?: boolean\n /** Callback when edit is requested (clicking visibility toggle as owner) */\n onEditClick?: () => void\n}\n\nexport function ConnectedTagEntity({\n tag,\n size = 'md',\n className = '',\n onClick,\n showTooltip = true,\n canEdit = false,\n onEditClick,\n}: ConnectedTagEntityProps) {\n // Get fresh tag data from React Query cache for accurate doctag_count\n const { data: workspaceTags } = useTags()\n\n // The workspace's members: who created and last changed it.\n const { data: members = [] } = useWorkspaceUsers()\n const byId = (id: string | null | undefined) =>\n id ? members.find((m) => m.user.external_id === id)?.user : undefined\n\n // Look up fresh tag from query cache, fall back to prop if not found\n const freshTag = useMemo(() => {\n if (!workspaceTags) return tag\n const found = workspaceTags.find((t) => t.external_id === tag.external_id)\n return found || tag\n }, [workspaceTags, tag])\n\n // Look up creator and updater from the people you know\n const creator = byId(tag.created_by_ext_id) ?? null\n const updater = byId(tag.updated_by_ext_id) ?? null\n\n const Icon = getTagTypeIcon(tag.tag_type.type)\n const tagColor = getEntityColor(tag.external_id, 'medium')\n\n // Handle visibility toggle click for owner\n const handleVisibilityToggle = () => {\n if (canEdit && onEditClick) {\n onEditClick()\n }\n }\n\n // Rich, store-coupled tooltip — injected into the shared pill.\n const tooltipContent = showTooltip ? (\n <EntityTooltip>\n <EntityTooltipHeader\n lead={\n <span\n className=\"inline-flex items-center justify-center rounded-md text-white p-1\"\n style={{ backgroundColor: tagColor }}\n >\n <Icon size={16} />\n </span>\n }\n title={tag.name}\n />\n\n <div className=\"flex flex-col gap-1.5 text-sm\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Type:</span>\n <span>{getTagTypeLabel(tag.tag_type.type)}</span>\n </div>\n\n {/* Files count - use freshTag for accurate count */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Documents:</span>\n <Badge variant=\"secondary\" className=\"h-5 min-w-[20px] justify-center\">\n {freshTag.doctag_count ?? 0}\n </Badge>\n </div>\n\n {/* Visibility with toggle */}\n <div className=\"flex items-center gap-2\">\n <VisibilityToggle\n items={freshTag}\n onToggle={handleVisibilityToggle}\n disabled={!canEdit}\n showLabel={false}\n showTooltip={canEdit}\n tooltipActive=\"Click to edit\"\n tooltipInactive=\"Click to edit\"\n />\n <span className=\"text-muted-foreground\">{freshTag.shared ? 'Shared' : 'Private'}</span>\n </div>\n\n {/* Created at/by */}\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Created:</span>\n <span>{formatFriendlyDate(tag.created_at)}</span>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={creator ?? undefined} />\n </div>\n\n {/* Updated at/by */}\n {tag.updated_at && (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">Updated:</span>\n <span>{formatFriendlyDate(tag.updated_at)}</span>\n {updater && (\n <>\n <span className=\"text-muted-foreground\">by</span>\n <UserAvatar user={updater} />\n </>\n )}\n </div>\n )}\n </div>\n </EntityTooltip>\n ) : undefined\n\n return (\n <SharedTagEntity\n tag={{ ...tag, color: tagColor }}\n size={size}\n className={className}\n onClick={onClick}\n showTooltip={showTooltip}\n tooltipContent={tooltipContent}\n />\n )\n}\n","/**\n * The parts of the review form's fields: the folder picker, the related documents, who last set a\n * value, and the labels picker.\n */\n\nimport { useMemo } from 'react'\nimport type { TagResponse } from '@arbidocs/sdk/browser'\nimport { useOpenViewerDocumentId, type RelatedDocs, type WorkspaceDocument } from '@arbidocs/react'\nimport { formatFriendlyDate, getEntityColor } from '@arbidocs/react/ui'\nimport { FieldAttribution, FieldLabelsSelect } from '../../../files/FieldParts'\nimport type { LabelOption } from '../../../files/cells/LabelMultiSelect'\nimport { FolderCommandList } from '../../../files/FolderPicker'\nimport { RelatedDocumentsCell, useDocumentFolders } from '../grid/cells'\nimport { DocumentUser } from './DocumentUser'\nimport { useMemberLookup } from './useMemberLookup'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\n\n/** The workspace's folders to move the document to. */\nexport function FolderPicker({\n documents,\n value,\n onSelect,\n}: {\n documents: WorkspaceDocument[]\n value: string | null | undefined\n onSelect: (folder: string | null) => void\n}) {\n const folders = useDocumentFolders(documents, value)\n return (\n <FolderCommandList folders={folders} value={value} onSelect={onSelect} showRemove={!!value} />\n )\n}\n\n/** The related documents, the one open in the viewer marked. */\nexport function RelatedDocuments({\n doc,\n related,\n onOpen,\n onDelete,\n canDelete,\n onCompare,\n}: {\n doc: WorkspaceDocument\n related: RelatedDocs<WorkspaceDocument>\n onOpen?: (docId: string) => void\n onDelete?: (docId: string) => void\n canDelete?: (doc: WorkspaceDocument) => boolean\n onCompare?: (docId: string, otherDocId: string) => void\n}) {\n const viewingDocumentId = useOpenViewerDocumentId()\n return (\n <RelatedDocumentsCell\n currentDoc={doc}\n related={related}\n viewingDocumentId={viewingDocumentId}\n onDocumentClick={(id) => onOpen?.(id)}\n onDelete={(other) => onDelete?.(other.external_id)}\n canDelete={canDelete}\n onCompare={onCompare}\n />\n )\n}\n\n/** Who last set a value, and when: shown on hover. */\nexport function DocTagAttribution({ doctag }: { doctag: DocTag }) {\n const memberById = useMemberLookup()\n const creator = memberById(doctag.created_by_ext_id)\n const updater =\n doctag.updated_by_ext_id && doctag.updated_by_ext_id !== doctag.created_by_ext_id\n ? memberById(doctag.updated_by_ext_id)\n : undefined\n const lastUser = updater || creator\n if (!lastUser) return null\n const lines = [\n creator &&\n `Created ${formatFriendlyDate(doctag.created_at)} by ${creator.given_name || creator.email}`,\n updater &&\n `Updated ${formatFriendlyDate(doctag.updated_at)} by ${updater.given_name || updater.email}`,\n ].filter((line): line is string => !!line)\n return (\n <FieldAttribution\n avatar={<DocumentUser user={lastUser} tooltip={false} />}\n date={formatFriendlyDate(updater ? doctag.updated_at : doctag.created_at)}\n lines={lines}\n />\n )\n}\n\n/** The labels as a picker: toggle one, or create one by name and apply it. */\nexport function LabelsCombobox({\n labelTags,\n appliedTagIds,\n onToggle,\n onCreateAndApply,\n}: {\n labelTags: TagResponse[]\n appliedTagIds: ReadonlySet<string>\n onToggle: (tag: TagResponse) => void\n onCreateAndApply?: (name: string) => void\n}) {\n const options: LabelOption[] = useMemo(\n () =>\n labelTags.map((t) => ({\n id: t.external_id,\n name: t.name,\n color: getEntityColor(t.external_id, 'medium'),\n })),\n [labelTags]\n )\n\n // An existing label of that name (any case) is applied rather than made again.\n const handleCreate = (name: string) => {\n const trimmed = name.trim()\n if (!trimmed) return\n const existing = labelTags.find((t) => t.name.toLowerCase() === trimmed.toLowerCase())\n if (!existing) onCreateAndApply?.(trimmed)\n else if (!appliedTagIds.has(existing.external_id)) onToggle(existing)\n }\n\n return (\n <FieldLabelsSelect\n options={options}\n appliedIds={appliedTagIds}\n onToggle={(id) => {\n const tag = labelTags.find((t) => t.external_id === id)\n if (tag) onToggle(tag)\n }}\n onCreate={onCreateAndApply ? handleCreate : undefined}\n />\n )\n}\n","/**\n * One field of a document as the review form shows it (a column of the documents table, one per\n * row): its label, icon and the value, editable where the table's column is. Standard fields,\n * metadata, the folder, related documents, the labels and each annotation (with who last set it).\n */\n\nimport type { ElementType, ReactNode } from 'react'\nimport { isAnnotationTag, isLabelTag, type TagResponse } from '@arbidocs/sdk/browser'\nimport type { DocumentPerson, RelatedDocs, WorkspaceDocument } from '@arbidocs/react'\nimport {\n DebouncedInput,\n formatFriendlyDate,\n friendlyFileType,\n Textarea,\n formatDocDate,\n getDocumentDate,\n getDocumentTitle,\n} from '@arbidocs/react/ui'\nimport {\n FieldFolderSelect,\n FieldFolderValue,\n FieldNativeSelect,\n FieldValue,\n FieldWithAttribution,\n} from '../../../files/FieldParts'\nimport { DocumentUser } from './DocumentUser'\nimport {\n DocTagAttribution,\n FolderPicker,\n LabelsCombobox,\n RelatedDocuments,\n} from './DocumentFieldParts'\n\ntype DocTag = NonNullable<WorkspaceDocument['doctags']>[number]\nexport type DocTagCitations = NonNullable<DocTag['citations']> | null\n\n/** A field as the form lays it out. */\nexport interface DocumentFieldContent {\n label: string\n icon?: ReactNode\n /** The annotation the field is (its pill is shown as the label). */\n tag?: TagResponse\n children: ReactNode\n}\n\nexport interface DocumentFieldOptions {\n /** The column (a standard field's id, or an annotation's tag id). */\n columnId: string\n doc: WorkspaceDocument\n canEdit: boolean\n workspaceTags: TagResponse[]\n /** The workspace's documents (the folders to pick from). */\n allDocuments?: WorkspaceDocument[]\n /** Who uploaded the document. */\n creator?: DocumentPerson\n getColumnLabel: (colId: string) => string\n getColumnIcon: (colId: string) => ElementType | undefined\n isColumnEditable: (colId: string) => boolean\n onUpdateDocumentField: (field: string, value: unknown) => void\n onUpdateTagValue: (tag: TagResponse, value: string | boolean) => void\n onUpdateTagWithCitations: (tag: TagResponse, note: string, citations: DocTagCitations) => void\n /** Create a label and apply it (the labels picker). Absent: the picker only toggles. */\n onCreateAndApplyLabel?: (name: string) => void\n /** The document's related documents (email family, copies, duplicates, similar). */\n relatedDocs?: RelatedDocs<WorkspaceDocument>\n /** Open a related document. */\n onOpenDocument?: (docId: string) => void\n /** Delete a related document (asks first). */\n onDeleteDocument?: (docId: string) => void\n canDeleteRelatedDocument?: (doc: WorkspaceDocument) => boolean\n /** Compare with a similar document. Absent: not offered. */\n onCompareDocuments?: (docId: string, otherDocId: string) => void\n}\n\n/** The document metadata a field edits as text. */\nconst METADATA_FIELDS: Record<string, (doc: WorkspaceDocument) => string> = {\n title: (doc) => getDocumentTitle(doc),\n doc_nature: (doc) => doc.doc_metadata?.doc_nature || '',\n doc_author: (doc) => doc.doc_metadata?.doc_author || '',\n doc_subject: (doc) => doc.doc_metadata?.doc_subject || '',\n // As the table shows it: with the time when the value has one (emails).\n doc_date: (doc) => formatDocDate(getDocumentDate(doc)),\n}\n\nconst INPUT_CLASS = 'text-sm bg-muted/40 focus:bg-background transition-colors'\n\n/** A read-only standard field: its value (muted unless said otherwise). */\nconst READ_ONLY_FIELDS: Record<string, (doc: WorkspaceDocument) => ReactNode> = {\n file_name: (doc) => <FieldValue tone=\"strong\">{doc.file_name || 'N/A'}</FieldValue>,\n status: (doc) => <FieldValue tone=\"muted\">{doc.status || 'N/A'}</FieldValue>,\n n_pages: (doc) => <FieldValue tone=\"muted\">{doc.n_pages || 'N/A'}</FieldValue>,\n created_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.created_at ? formatFriendlyDate(doc.created_at) : 'N/A'}\n </FieldValue>\n ),\n updated_at: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.updated_at ? formatFriendlyDate(doc.updated_at) : 'N/A'}\n </FieldValue>\n ),\n file_type: (doc) => (\n <FieldValue tone=\"muted\">{friendlyFileType(doc.file_type, doc.file_name)}</FieldValue>\n ),\n file_size: (doc) => (\n <FieldValue tone=\"muted\">\n {doc.file_size ? `${Math.round(doc.file_size / 1024)} KB` : 'N/A'}\n </FieldValue>\n ),\n doc_id: (doc) => (\n <FieldValue tone=\"muted\" isMono>\n {doc.external_id || 'N/A'}\n </FieldValue>\n ),\n content_hash: (doc) => (\n <FieldValue tone=\"muted\" isMono isTruncated>\n {doc.content_hash || 'N/A'}\n </FieldValue>\n ),\n}\n\n/** The field of `columnId`, or null when the document has none to show there. */\nexport function documentFieldContent(options: DocumentFieldOptions): DocumentFieldContent | null {\n const { columnId, doc, canEdit, workspaceTags, getColumnLabel, getColumnIcon } = options\n const Icon = getColumnIcon(columnId)\n const standard = (children: ReactNode): DocumentFieldContent => ({\n label: getColumnLabel(columnId),\n icon: Icon ? <Icon size={14} /> : undefined,\n children,\n })\n\n const metadata = METADATA_FIELDS[columnId]\n if (metadata) {\n const editable = options.isColumnEditable(columnId) && canEdit\n return standard(\n editable ? (\n <DebouncedInput\n value={metadata(doc)}\n onChange={(value) => options.onUpdateDocumentField(columnId, value)}\n multiline={true}\n placeholder={`Add ${getColumnLabel(columnId).toLowerCase()}…`}\n className={INPUT_CLASS}\n />\n ) : (\n <FieldValue>{metadata(doc) || 'N/A'}</FieldValue>\n )\n )\n }\n\n const readOnly = READ_ONLY_FIELDS[columnId]\n if (readOnly) return standard(readOnly(doc))\n\n if (columnId === 'created_by') return standard(<DocumentUser user={options.creator} />)\n\n if (columnId === 'folder') {\n return standard(\n canEdit ? (\n <FieldFolderSelect\n folder={doc.folder}\n picker={\n <FolderPicker\n documents={options.allDocuments ?? []}\n value={doc.folder}\n onSelect={(folder) => options.onUpdateDocumentField('folder', folder)}\n />\n }\n />\n ) : (\n <FieldFolderValue folder={doc.folder} />\n )\n )\n }\n\n if (columnId === 'related') {\n const related = options.relatedDocs\n if (!related) return null\n return standard(\n <RelatedDocuments\n doc={doc}\n related={related}\n onOpen={options.onOpenDocument}\n onDelete={options.onDeleteDocument}\n canDelete={options.canDeleteRelatedDocument}\n onCompare={options.onCompareDocuments}\n />\n )\n }\n\n if (columnId === 'all_tags') {\n // The labels (and issues), toggled in place.\n const labelTags = workspaceTags.filter(isLabelTag)\n const appliedIds = new Set(\n (doc.doctags ?? [])\n .filter((dt) => labelTags.some((t) => t.external_id === dt.tag_ext_id))\n .map((dt) => dt.tag_ext_id)\n )\n return standard(\n <LabelsCombobox\n labelTags={labelTags}\n appliedTagIds={appliedIds}\n onToggle={(tag) => options.onUpdateTagValue(tag, !appliedIds.has(tag.external_id))}\n onCreateAndApply={options.onCreateAndApplyLabel}\n />\n )\n }\n\n // An annotation (a label is a value of the Labels field, not a field of its own).\n const tag = workspaceTags.find((t) => t.external_id === columnId)\n if (!tag || !isAnnotationTag(tag)) return null\n const doctag = doc.doctags?.find((dt) => dt.tag_ext_id === tag.external_id)\n\n let value: ReactNode\n if (tag.tag_type.type === 'select') {\n value = (\n <FieldNativeSelect\n value={doctag?.note || ''}\n options={tag.tag_type.options}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n ariaLabel={tag.name}\n />\n )\n } else if (tag.tag_type.type === 'number') {\n value = (\n <DebouncedInput\n type=\"number\"\n value={doctag?.note || ''}\n onChange={(next) => options.onUpdateTagValue(tag, next)}\n placeholder={`Add ${tag.name.toLowerCase()}…`}\n className={INPUT_CLASS}\n />\n )\n } else {\n // A plain note: a value's citations come from generation and are kept as they are.\n value = (\n <Textarea\n value={doctag?.note || ''}\n onChange={(e) =>\n options.onUpdateTagWithCitations(tag, e.target.value, doctag?.citations ?? null)\n }\n placeholder=\"Add a note...\"\n rows={2}\n className={INPUT_CLASS}\n />\n )\n }\n\n return {\n label: tag.name,\n tag,\n children: doctag ? (\n <FieldWithAttribution attribution={<DocTagAttribution doctag={doctag} />}>\n {value}\n </FieldWithAttribution>\n ) : (\n value\n ),\n }\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { QuietLink } from './chunk-ABYZJANO.js';
|
|
3
2
|
import { rehypeDocEntityPills, workspaceDocIdFromHref } from './chunk-DDCMLHXF.js';
|
|
4
3
|
import { useCompactChat } from './chunk-5B74B62N.js';
|
|
5
4
|
import { MentionChip } from './chunk-7SQVZML4.js';
|
|
5
|
+
import { QuietLink } from './chunk-ABYZJANO.js';
|
|
6
6
|
import { useBlocksEnvironment } from './chunk-DMVNEIJ4.js';
|
|
7
7
|
import React, { createContext, useMemo, useContext, useState, useId, useEffect } from 'react';
|
|
8
8
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
@@ -272,5 +272,5 @@ function ConnectedMarkdownComponent({ components, ...props }) {
|
|
|
272
272
|
var ConnectedMarkdown = React.memo(ConnectedMarkdownComponent);
|
|
273
273
|
|
|
274
274
|
export { ConnectedMarkdown, DocumentChip, DocumentWorkspaceContext, ExternalLink, InternalDocLink, MailChip, MermaidDiagram, WorkspaceDocumentReference, useDocumentWorkspace };
|
|
275
|
-
//# sourceMappingURL=chunk-
|
|
276
|
-
//# sourceMappingURL=chunk-
|
|
275
|
+
//# sourceMappingURL=chunk-QZ5FDIT6.js.map
|
|
276
|
+
//# sourceMappingURL=chunk-QZ5FDIT6.js.map
|