@arbidocs/blocks 0.4.169 → 0.5.0
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-W7OWNQEB.cjs → ConnectedCallDock-BNKBAKIT.cjs} +20 -20
- package/dist/{ConnectedCallDock-W7OWNQEB.cjs.map → ConnectedCallDock-BNKBAKIT.cjs.map} +1 -1
- package/dist/{ConnectedCallDock-7IUGEVSF.js → ConnectedCallDock-MBAAUETC.js} +11 -11
- package/dist/{ConnectedCallDock-7IUGEVSF.js.map → ConnectedCallDock-MBAAUETC.js.map} +1 -1
- package/dist/{ConnectedCallRoom-N6JBHP6P.cjs → ConnectedCallRoom-QRWD2SDG.cjs} +12 -12
- package/dist/{ConnectedCallRoom-N6JBHP6P.cjs.map → ConnectedCallRoom-QRWD2SDG.cjs.map} +1 -1
- package/dist/{ConnectedCallRoom-7CUZBW6C.js → ConnectedCallRoom-XJUXVNMB.js} +11 -11
- package/dist/{ConnectedCallRoom-7CUZBW6C.js.map → ConnectedCallRoom-XJUXVNMB.js.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-OJWVE6L4.cjs → ConnectedNativeDocxComparison-A7PMTYD7.cjs} +17 -17
- package/dist/{ConnectedNativeDocxComparison-OJWVE6L4.cjs.map → ConnectedNativeDocxComparison-A7PMTYD7.cjs.map} +1 -1
- package/dist/{ConnectedNativeDocxComparison-VC5SPVCR.js → ConnectedNativeDocxComparison-CWEW7GV3.js} +16 -16
- package/dist/{ConnectedNativeDocxComparison-VC5SPVCR.js.map → ConnectedNativeDocxComparison-CWEW7GV3.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-EMSFPHRB.js → ConnectedNativeDocxEditor-6EBF7U4E.js} +15 -15
- package/dist/{ConnectedNativeDocxEditor-EMSFPHRB.js.map → ConnectedNativeDocxEditor-6EBF7U4E.js.map} +1 -1
- package/dist/{ConnectedNativeDocxEditor-BTF426RO.cjs → ConnectedNativeDocxEditor-IWXEOAIF.cjs} +17 -17
- package/dist/{ConnectedNativeDocxEditor-BTF426RO.cjs.map → ConnectedNativeDocxEditor-IWXEOAIF.cjs.map} +1 -1
- package/dist/{ConnectedStreamedWordArtifact-2OYI4U4W.js → ConnectedStreamedWordArtifact-27ISQYHI.js} +16 -16
- package/dist/ConnectedStreamedWordArtifact-27ISQYHI.js.map +1 -0
- package/dist/{ConnectedStreamedWordArtifact-XY6QMCXF.cjs → ConnectedStreamedWordArtifact-WRGCCU5H.cjs} +17 -17
- package/dist/ConnectedStreamedWordArtifact-WRGCCU5H.cjs.map +1 -0
- package/dist/NativeDocxEditor-ATPL3Q3O.js +1 -1
- package/dist/NativeDocxEditor-R4EIHWNL.cjs +1 -1
- package/dist/{WorkspaceTableView-IF5UQRZP.js → WorkspaceTableView-3TIMUU2J.js} +9 -9
- package/dist/{WorkspaceTableView-IF5UQRZP.js.map → WorkspaceTableView-3TIMUU2J.js.map} +1 -1
- package/dist/{WorkspaceTableView-4O3O47ES.cjs → WorkspaceTableView-FROHEPCT.cjs} +11 -11
- package/dist/{WorkspaceTableView-4O3O47ES.cjs.map → WorkspaceTableView-FROHEPCT.cjs.map} +1 -1
- package/dist/agents/index.cjs +403 -403
- package/dist/agents/index.js +12 -12
- package/dist/calls/index.cjs +143 -143
- package/dist/calls/index.js +15 -15
- package/dist/chat/index.cjs +80 -80
- package/dist/chat/index.js +3 -3
- package/dist/{chunk-22ENWLSI.js → chunk-26EQQQBX.js} +6 -6
- package/dist/{chunk-22ENWLSI.js.map → chunk-26EQQQBX.js.map} +1 -1
- package/dist/{chunk-KEV5G3S4.cjs → chunk-2BNWISLH.cjs} +4 -4
- package/dist/{chunk-KEV5G3S4.cjs.map → chunk-2BNWISLH.cjs.map} +1 -1
- package/dist/{chunk-OK4HKHV4.js → chunk-2RSUVU5V.js} +3 -3
- package/dist/{chunk-OK4HKHV4.js.map → chunk-2RSUVU5V.js.map} +1 -1
- package/dist/{chunk-EZS4RBYU.cjs → chunk-32W6STZ2.cjs} +5 -5
- package/dist/{chunk-EZS4RBYU.cjs.map → chunk-32W6STZ2.cjs.map} +1 -1
- package/dist/{chunk-CZ3T3TLT.js → chunk-34LBKTII.js} +6 -6
- package/dist/{chunk-CZ3T3TLT.js.map → chunk-34LBKTII.js.map} +1 -1
- package/dist/{chunk-V7XKIJHO.cjs → chunk-3BJIS4GV.cjs} +9 -9
- package/dist/{chunk-V7XKIJHO.cjs.map → chunk-3BJIS4GV.cjs.map} +1 -1
- package/dist/{chunk-OJDQ3TBF.cjs → chunk-3XA7EDPS.cjs} +25 -25
- package/dist/{chunk-OJDQ3TBF.cjs.map → chunk-3XA7EDPS.cjs.map} +1 -1
- package/dist/{chunk-RD6M6J3N.js → chunk-4MQKXHMC.js} +3 -3
- package/dist/{chunk-RD6M6J3N.js.map → chunk-4MQKXHMC.js.map} +1 -1
- package/dist/{chunk-HAYIPKKI.cjs → chunk-5DXTO7CE.cjs} +6 -6
- package/dist/{chunk-HAYIPKKI.cjs.map → chunk-5DXTO7CE.cjs.map} +1 -1
- package/dist/{chunk-LUKMLQYG.cjs → chunk-6TEYZRY5.cjs} +3 -3
- package/dist/{chunk-LUKMLQYG.cjs.map → chunk-6TEYZRY5.cjs.map} +1 -1
- package/dist/{chunk-SM774TX7.js → chunk-AU6ZSYW6.js} +3 -3
- package/dist/{chunk-SM774TX7.js.map → chunk-AU6ZSYW6.js.map} +1 -1
- package/dist/{chunk-RSIYQNV6.cjs → chunk-BMFXDDJG.cjs} +7 -7
- package/dist/{chunk-RSIYQNV6.cjs.map → chunk-BMFXDDJG.cjs.map} +1 -1
- package/dist/{chunk-DVGKBEZH.cjs → chunk-CEAUPIRB.cjs} +5 -5
- package/dist/{chunk-DVGKBEZH.cjs.map → chunk-CEAUPIRB.cjs.map} +1 -1
- package/dist/{chunk-EZRXRCQT.js → chunk-CSUKLEQH.js} +3 -3
- package/dist/{chunk-EZRXRCQT.js.map → chunk-CSUKLEQH.js.map} +1 -1
- package/dist/{chunk-W3UDZRRL.cjs → chunk-DAEDRTIN.cjs} +5 -5
- package/dist/{chunk-W3UDZRRL.cjs.map → chunk-DAEDRTIN.cjs.map} +1 -1
- package/dist/{chunk-TTH6LLQQ.js → chunk-DRLRR44Q.js} +8 -8
- package/dist/{chunk-TTH6LLQQ.js.map → chunk-DRLRR44Q.js.map} +1 -1
- package/dist/{chunk-VHJHY7TT.js → chunk-ECERC6TI.js} +3 -3
- package/dist/{chunk-VHJHY7TT.js.map → chunk-ECERC6TI.js.map} +1 -1
- package/dist/{chunk-YDJQFVEW.js → chunk-G4O5AKUO.js} +5 -5
- package/dist/{chunk-YDJQFVEW.js.map → chunk-G4O5AKUO.js.map} +1 -1
- package/dist/{chunk-6BBZP4ES.cjs → chunk-HJQLVCIK.cjs} +3 -3
- package/dist/{chunk-6BBZP4ES.cjs.map → chunk-HJQLVCIK.cjs.map} +1 -1
- package/dist/{chunk-FOGNAIDQ.js → chunk-HTOYFP3D.js} +7 -7
- package/dist/{chunk-FOGNAIDQ.js.map → chunk-HTOYFP3D.js.map} +1 -1
- package/dist/{chunk-Z3U6ZBUK.cjs → chunk-IFAIUKQQ.cjs} +5 -5
- package/dist/{chunk-Z3U6ZBUK.cjs.map → chunk-IFAIUKQQ.cjs.map} +1 -1
- package/dist/{chunk-3H4UW7A2.js → chunk-IFE4MZXD.js} +3 -3
- package/dist/{chunk-3H4UW7A2.js.map → chunk-IFE4MZXD.js.map} +1 -1
- package/dist/{chunk-RI52SNGX.cjs → chunk-J6JED6TA.cjs} +51 -51
- package/dist/{chunk-RI52SNGX.cjs.map → chunk-J6JED6TA.cjs.map} +1 -1
- package/dist/{chunk-OAFJGXJC.cjs → chunk-JBG5MFVX.cjs} +5 -5
- package/dist/{chunk-OAFJGXJC.cjs.map → chunk-JBG5MFVX.cjs.map} +1 -1
- package/dist/{chunk-WSI5W5GN.js → chunk-KRNX2PVC.js} +3 -3
- package/dist/{chunk-WSI5W5GN.js.map → chunk-KRNX2PVC.js.map} +1 -1
- package/dist/{chunk-HIEGVZB3.cjs → chunk-LDRHUYRE.cjs} +7 -7
- package/dist/{chunk-HIEGVZB3.cjs.map → chunk-LDRHUYRE.cjs.map} +1 -1
- package/dist/{chunk-2TEST7FZ.cjs → chunk-LMXMUWPA.cjs} +8 -11
- package/dist/chunk-LMXMUWPA.cjs.map +1 -0
- package/dist/{chunk-3VW7ZXQ6.cjs → chunk-LPUQHIVP.cjs} +4 -4
- package/dist/{chunk-3VW7ZXQ6.cjs.map → chunk-LPUQHIVP.cjs.map} +1 -1
- package/dist/{chunk-DPIWB4DF.cjs → chunk-MDFXGRLY.cjs} +22 -22
- package/dist/{chunk-DPIWB4DF.cjs.map → chunk-MDFXGRLY.cjs.map} +1 -1
- package/dist/{chunk-XHPCH3QQ.js → chunk-NHY4AKA4.js} +5 -5
- package/dist/{chunk-XHPCH3QQ.js.map → chunk-NHY4AKA4.js.map} +1 -1
- package/dist/{chunk-45R356CO.js → chunk-NNPFFPBF.js} +4 -4
- package/dist/{chunk-45R356CO.js.map → chunk-NNPFFPBF.js.map} +1 -1
- package/dist/{chunk-NXSQRRFY.js → chunk-OD3UJ7XR.js} +3 -3
- package/dist/{chunk-NXSQRRFY.js.map → chunk-OD3UJ7XR.js.map} +1 -1
- package/dist/{chunk-B35WPZOB.js → chunk-QE7MS7NA.js} +5 -5
- package/dist/{chunk-B35WPZOB.js.map → chunk-QE7MS7NA.js.map} +1 -1
- package/dist/{chunk-HTHEAOEW.cjs → chunk-QEE4DOEU.cjs} +17 -17
- package/dist/{chunk-HTHEAOEW.cjs.map → chunk-QEE4DOEU.cjs.map} +1 -1
- package/dist/{chunk-GTAUDUAZ.js → chunk-QK2HR3LC.js} +6 -6
- package/dist/{chunk-GTAUDUAZ.js.map → chunk-QK2HR3LC.js.map} +1 -1
- package/dist/{chunk-TKBFWHOH.cjs → chunk-QSC6Y55X.cjs} +75 -75
- package/dist/{chunk-TKBFWHOH.cjs.map → chunk-QSC6Y55X.cjs.map} +1 -1
- package/dist/{chunk-6L4SOUDT.cjs → chunk-RMLU363Q.cjs} +4 -4
- package/dist/{chunk-6L4SOUDT.cjs.map → chunk-RMLU363Q.cjs.map} +1 -1
- package/dist/{chunk-FHCXWMR7.js → chunk-TBRX5RNH.js} +3 -3
- package/dist/{chunk-FHCXWMR7.js.map → chunk-TBRX5RNH.js.map} +1 -1
- package/dist/{chunk-GA77ONJJ.js → chunk-TXPOODAY.js} +8 -11
- package/dist/chunk-TXPOODAY.js.map +1 -0
- package/dist/{chunk-XAS4VRBY.cjs → chunk-UIZZFZ5Z.cjs} +3 -3
- package/dist/{chunk-XAS4VRBY.cjs.map → chunk-UIZZFZ5Z.cjs.map} +1 -1
- package/dist/{chunk-H226UFOX.js → chunk-VMXLNBHF.js} +3 -3
- package/dist/{chunk-H226UFOX.js.map → chunk-VMXLNBHF.js.map} +1 -1
- package/dist/{chunk-JQPYE3TT.cjs → chunk-WT2AGQYY.cjs} +5 -5
- package/dist/{chunk-JQPYE3TT.cjs.map → chunk-WT2AGQYY.cjs.map} +1 -1
- package/dist/{chunk-JTJCCL2E.js → chunk-XHJAYCPQ.js} +3 -3
- package/dist/{chunk-JTJCCL2E.js.map → chunk-XHJAYCPQ.js.map} +1 -1
- package/dist/{chunk-F6GZCQ5I.js → chunk-XKTYKZWV.js} +4 -4
- package/dist/{chunk-F6GZCQ5I.js.map → chunk-XKTYKZWV.js.map} +1 -1
- package/dist/{chunk-ZW7RH5ET.cjs → chunk-YBB3KRTU.cjs} +3 -3
- package/dist/{chunk-ZW7RH5ET.cjs.map → chunk-YBB3KRTU.cjs.map} +1 -1
- package/dist/{chunk-ICP2IQW5.js → chunk-YMBDPI7X.js} +3 -3
- package/dist/{chunk-ICP2IQW5.js.map → chunk-YMBDPI7X.js.map} +1 -1
- package/dist/{chunk-VRTR6OQA.js → chunk-YSNQWUQQ.js} +6 -6
- package/dist/{chunk-VRTR6OQA.js.map → chunk-YSNQWUQQ.js.map} +1 -1
- package/dist/{chunk-DWZXSPMB.cjs → chunk-ZAVEMQ37.cjs} +3 -3
- package/dist/{chunk-DWZXSPMB.cjs.map → chunk-ZAVEMQ37.cjs.map} +1 -1
- package/dist/{chunk-CDP7S6RA.js → chunk-ZC5MJIRC.js} +3 -3
- package/dist/{chunk-CDP7S6RA.js.map → chunk-ZC5MJIRC.js.map} +1 -1
- package/dist/{chunk-S5KBZHX6.cjs → chunk-ZSW6FZG5.cjs} +11 -11
- package/dist/{chunk-S5KBZHX6.cjs.map → chunk-ZSW6FZG5.cjs.map} +1 -1
- package/dist/citations/index.cjs +1 -1
- package/dist/citations/index.js +1 -1
- package/dist/collaboration/index.cjs +69 -69
- package/dist/collaboration/index.js +3 -3
- package/dist/connect/docx.cjs +19 -19
- package/dist/connect/docx.js +15 -15
- package/dist/connect/index.cjs +972 -972
- package/dist/connect/index.js +39 -39
- package/dist/connect/viewer.cjs +91 -91
- package/dist/connect/viewer.js +22 -22
- package/dist/connection/ConnectionProvider.d.ts +4 -1
- package/dist/document-tools/index.cjs +20 -20
- package/dist/document-tools/index.js +3 -3
- package/dist/docx/index.cjs +1 -1
- package/dist/docx/index.js +1 -1
- package/dist/facts/index.cjs +4 -4
- package/dist/facts/index.js +4 -4
- package/dist/files/index.cjs +225 -225
- package/dist/files/index.js +5 -5
- package/dist/home/index.cjs +31 -31
- package/dist/home/index.js +6 -6
- package/dist/index.cjs +1640 -1640
- package/dist/index.js +25 -25
- package/dist/retrieval/index.cjs +1 -1
- package/dist/retrieval/index.js +1 -1
- package/dist/settings/index.cjs +160 -160
- package/dist/settings/index.js +5 -5
- package/dist/shell/index.cjs +77 -77
- package/dist/shell/index.js +6 -6
- package/dist/studio/index.cjs +11 -11
- package/dist/studio/index.js +9 -9
- package/dist/workflow-canvas/index.cjs +31 -31
- package/dist/workflow-canvas/index.js +14 -14
- package/dist/workspaces/index.cjs +1 -1
- package/dist/workspaces/index.js +1 -1
- package/node_modules/@arbidocs/coedit/package.json +1 -1
- package/package.json +5 -5
- package/dist/ConnectedStreamedWordArtifact-2OYI4U4W.js.map +0 -1
- package/dist/ConnectedStreamedWordArtifact-XY6QMCXF.cjs.map +0 -1
- package/dist/chunk-2TEST7FZ.cjs.map +0 -1
- package/dist/chunk-GA77ONJJ.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkMDFXGRLY_cjs = require('./chunk-MDFXGRLY.cjs');
|
|
5
5
|
var chunkZ2CVGUWR_cjs = require('./chunk-Z2CVGUWR.cjs');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
|
|
@@ -9,10 +9,10 @@ function ConnectedStreamedWordArtifact({
|
|
|
9
9
|
fontBaseUrl,
|
|
10
10
|
...props
|
|
11
11
|
}) {
|
|
12
|
-
const adapter =
|
|
12
|
+
const adapter = chunkMDFXGRLY_cjs.useConnectedNativeDocxAdapter(fontBaseUrl);
|
|
13
13
|
return /* @__PURE__ */ jsxRuntime.jsx(chunkZ2CVGUWR_cjs.StreamedWordArtifact, { ...props, adapter });
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
exports.ConnectedStreamedWordArtifact = ConnectedStreamedWordArtifact;
|
|
17
|
-
//# sourceMappingURL=chunk-
|
|
18
|
-
//# sourceMappingURL=chunk-
|
|
17
|
+
//# sourceMappingURL=chunk-RMLU363Q.cjs.map
|
|
18
|
+
//# sourceMappingURL=chunk-RMLU363Q.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-
|
|
1
|
+
{"version":3,"sources":["../src/connection/docx/ConnectedStreamedWordArtifact.tsx"],"names":["useConnectedNativeDocxAdapter","jsx","StreamedWordArtifact"],"mappings":";;;;;;AAMO,SAAS,6BAAA,CAA8B;AAAA,EAC5C,WAAA;AAAA,EACA,GAAG;AACL,CAAA,EAA0E;AACxE,EAAA,MAAM,OAAA,GAAUA,gDAA8B,WAAW,CAAA;AACzD,EAAA,uBAAOC,cAAA,CAACC,sCAAA,EAAA,EAAsB,GAAG,KAAA,EAAO,OAAA,EAAkB,CAAA;AAC5D","file":"chunk-RMLU363Q.cjs","sourcesContent":["import { useConnectedNativeDocxAdapter } from './ConnectedNativeDocxEditor'\nimport {\n StreamedWordArtifact,\n type StreamedWordArtifactProps,\n} from '../../docx/StreamedWordArtifact'\n\nexport function ConnectedStreamedWordArtifact({\n fontBaseUrl,\n ...props\n}: Omit<StreamedWordArtifactProps, 'adapter'> & { fontBaseUrl?: string }) {\n const adapter = useConnectedNativeDocxAdapter(fontBaseUrl)\n return <StreamedWordArtifact {...props} adapter={adapter} />\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { useAssistantDock, useChatSurface } from './chunk-
|
|
2
|
+
import { useAssistantDock, useChatSurface } from './chunk-YMBDPI7X.js';
|
|
3
3
|
import { Toaster } from './chunk-OKERRHLH.js';
|
|
4
4
|
import { Search, Pin, X, Loader2, MessageSquare, CheckCircle, Tag, User, Bot, Check } from 'lucide-react';
|
|
5
5
|
import { HoverCardContent, cn, Input, Button, Badge, PassageCard, Tabs, TabsList, TabsTrigger, TabsContent } from '@arbidocs/react/ui';
|
|
@@ -571,5 +571,5 @@ function AssistantToaster(props) {
|
|
|
571
571
|
}
|
|
572
572
|
|
|
573
573
|
export { AssistantToaster, ContextActionButton, ContextCheckRow, ContextPanelContent, ContextPanelFooter, ContextPanelTabs, ContextPickerList, ContextPickerRow, ContextSearchInput, ContextSelectList, ContextSelectRow, ConversationSearchView, DEFAULT_CONVERSATION_SEARCH_LABELS, DEFAULT_LABEL_PIN_ROW_LABELS, DEFAULT_PINNED_DOC_CHIP_LABELS, LabelPinRow, PinnedDocChip, useDismissibleCard };
|
|
574
|
-
//# sourceMappingURL=chunk-
|
|
575
|
-
//# sourceMappingURL=chunk-
|
|
574
|
+
//# sourceMappingURL=chunk-TBRX5RNH.js.map
|
|
575
|
+
//# sourceMappingURL=chunk-TBRX5RNH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/chat/PinnedDocChip.tsx","../src/chat/ConversationSearchView.tsx","../src/chat/ContextPanel.tsx","../src/lib/useDismissibleCard.ts","../src/chat/LabelPinRow.tsx","../src/chat/AssistantToaster.tsx"],"names":["jsxs","jsx","X","ContextPanelContent","cn","Fragment","ContextSearchInput","Search","ContextActionButton","Button","TagIcon"],"mappings":"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","file":"chunk-FHCXWMR7.js","sourcesContent":["import { Pin, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the chip. Pass a partial `labels` to translate or reword. */\nexport interface PinnedDocChipLabels {\n unpin: string\n /** Accessible name; `title` is the pinned document's name. */\n unpinDocument: (title: string) => string\n}\n\nexport const DEFAULT_PINNED_DOC_CHIP_LABELS: PinnedDocChipLabels = {\n unpin: 'Unpin',\n unpinDocument: (title) => `Unpin ${title}`,\n}\n\nexport interface PinnedDocChipProps {\n title: string\n onUnpin: () => void\n className?: string\n labels?: Partial<PinnedDocChipLabels>\n testId?: string\n}\n\n/**\n * The pinned-document chip that lives inside a composer's attach button: shows which document\n * holds the full-context pin and unpins it in ONE tap (the X is always visible, so touch and\n * keyboard reach it). It is a span with button semantics because it sits inside the attach\n * `<button>`, where nested buttons are invalid; `stopPropagation` keeps the tap from also\n * triggering the parent.\n */\nexport function PinnedDocChip({\n title,\n onUnpin,\n className,\n labels,\n testId = 'unpin-document-button',\n}: PinnedDocChipProps) {\n const l = { ...DEFAULT_PINNED_DOC_CHIP_LABELS, ...labels }\n return (\n <span\n role=\"button\"\n tabIndex={0}\n data-slot=\"pinned-doc-chip\"\n onClick={(e) => {\n e.stopPropagation()\n onUnpin()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation()\n onUnpin()\n }\n }}\n title={l.unpin}\n aria-label={l.unpinDocument(title)}\n className={cn(\n '-mx-0.5 flex min-w-0 items-center gap-1 rounded-sm px-1 text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n data-testid={testId}\n >\n <Pin className=\"h-3 w-3 shrink-0 fill-primary\" />\n <X className=\"order-last h-3 w-3 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm\">{title}</span>\n </span>\n )\n}\n","import { useMemo, type ComponentType, type ReactNode } from 'react'\nimport { Bot, Loader2, MessageSquare, Search, User, X } from 'lucide-react'\n\nimport { Button, PassageCard } from '@arbidocs/react/ui'\n\n/** One matching message of a conversation. */\nexport interface ConversationSearchMatch {\n id: string\n role: string\n score: number\n snippet: string\n}\n\n/** A conversation with the messages that matched the query. */\nexport interface ConversationSearchGroup {\n id: string\n title?: string | null\n matches: ConversationSearchMatch[]\n}\n\n/** Every fixed string of the conversation search. */\nexport interface ConversationSearchLabels {\n placeholder: string\n search: string\n searching: string\n matched: (count: number, query: string) => string\n matchCount: (count: number) => string\n untitled: string\n you: string\n assistant: string\n clear: string\n noResults: (query: string) => string\n reindexHint: ReactNode\n backToList: string\n}\n\nexport const DEFAULT_CONVERSATION_SEARCH_LABELS: ConversationSearchLabels = {\n placeholder: 'Search your conversations...',\n search: 'Search',\n searching: 'Searching conversations…',\n matched: (count, query) => `${count} conversation${count === 1 ? '' : 's'} matched “${query}”`,\n matchCount: (count) => `${count} match${count === 1 ? '' : 'es'}`,\n untitled: 'Untitled conversation',\n you: 'You',\n assistant: 'Assistant',\n clear: 'Clear',\n noResults: (query) => `No conversations matched “${query}”.`,\n reindexHint: (\n <>\n Older conversations may need indexing — try <span className=\"font-medium\">Re-index</span>.\n </>\n ),\n backToList: 'Back to list',\n}\n\nexport interface ConversationSearchViewProps {\n query: string\n onQueryChange: (query: string) => void\n /** Enter (without Shift) or the submit button. */\n onSubmit: () => void\n canSubmit: boolean\n isSearching: boolean\n /** The query the shown results answer; empty while no search has run. */\n submittedQuery: string\n /** Results of `submittedQuery`. */\n groups: ConversationSearchGroup[]\n onOpenConversation: (conversationId: string, messageId?: string) => void\n /** Back to the idle body. */\n onClear: () => void\n /** Shown beneath the bar until a search is run (e.g. the history list). */\n children?: ReactNode\n /** Wraps the results area (e.g. an error boundary). */\n ResultsBoundary?: ComponentType<{ children: ReactNode }>\n labels?: Partial<ConversationSearchLabels>\n}\n\nfunction RoleChip({ isUser, labels }: { isUser: boolean; labels: ConversationSearchLabels }) {\n const Icon = isUser ? User : Bot\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <Icon className=\"size-3\" />\n {isUser ? labels.you : labels.assistant}\n </span>\n )\n}\n\nconst Passthrough = ({ children }: { children: ReactNode }) => <>{children}</>\n\n/**\n * Search across past conversations: a search bar, then either the idle body (history list) or\n * the matches grouped by conversation. Opening a group or a hit is the host's navigation.\n */\nexport function ConversationSearchView({\n query,\n onQueryChange,\n onSubmit,\n canSubmit,\n isSearching,\n submittedQuery,\n groups,\n onOpenConversation,\n onClear,\n children,\n ResultsBoundary = Passthrough,\n labels,\n}: ConversationSearchViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONVERSATION_SEARCH_LABELS, ...labels }), [labels])\n const hasResults = !!submittedQuery && !isSearching && groups.length > 0\n\n return (\n <div\n data-slot=\"conversation-search\"\n className=\"flex h-full flex-col\"\n data-testid=\"conversation-search-page\"\n >\n <div className=\"flex items-start gap-3 px-6 py-4\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"flex-1\"\n >\n <div className=\"flex items-start gap-2 rounded-md border border-input bg-muted px-3 py-1.5 focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={l.placeholder}\n aria-label={l.search}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid=\"conversation-search-input\"\n />\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!canSubmit}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid=\"conversation-search-submit-button\"\n title={l.search}\n aria-label={l.search}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n\n {!submittedQuery ? (\n <div className=\"flex-1 overflow-hidden\">{children}</div>\n ) : (\n <ResultsBoundary>\n <main className=\"flex-1 overflow-auto px-6 pb-6\">\n {isSearching ? (\n <div className=\"flex items-center justify-center gap-2 py-16 text-muted-foreground\">\n <Loader2 className=\"size-5 animate-spin\" />\n {l.searching}\n </div>\n ) : hasResults ? (\n <div className=\"space-y-4\" data-testid=\"conversation-search-results\">\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-sm text-muted-foreground\">\n {l.matched(groups.length, submittedQuery)}\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n data-testid=\"conversation-search-clear\"\n >\n <X className=\"size-3.5\" />\n {l.clear}\n </Button>\n </div>\n {groups.map((group) => (\n <div\n key={group.id}\n className=\"rounded-lg border border-border bg-card\"\n data-testid=\"conversation-search-group\"\n >\n <button\n type=\"button\"\n onClick={() => onOpenConversation(group.id)}\n className=\"flex w-full items-center justify-between gap-3 rounded-t-lg px-4 py-2.5 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <MessageSquare className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"truncate font-medium\">{group.title || l.untitled}</span>\n </span>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground\">\n {l.matchCount(group.matches.length)}\n </span>\n </button>\n <div className=\"space-y-2 border-t border-border p-3\">\n {group.matches.map((m) => (\n <PassageCard\n key={m.id}\n header={<RoleChip isUser={m.role === 'user'} labels={l} />}\n score={m.score}\n onClick={() => onOpenConversation(group.id, m.id)}\n data-testid=\"conversation-search-hit\"\n >\n <p className=\"line-clamp-3 text-sm text-foreground/90\">{m.snippet}</p>\n </PassageCard>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div\n className=\"py-16 text-center text-muted-foreground\"\n data-testid=\"conversation-search-no-results\"\n >\n <MessageSquare className=\"mx-auto mb-3 size-8 opacity-40\" />\n <p>{l.noResults(submittedQuery)}</p>\n <p className=\"mt-1 text-sm\">{l.reindexHint}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-3 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n >\n <X className=\"size-3.5\" />\n {l.backToList}\n </Button>\n </div>\n )}\n </main>\n </ResultsBoundary>\n )}\n </div>\n )\n}\n","import {\n forwardRef,\n Fragment,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\nimport { Check, CheckCircle, Search } from 'lucide-react'\nimport {\n Badge,\n Button,\n HoverCardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n cn,\n type ButtonProps,\n} from '@arbidocs/react/ui'\n\n/**\n * Parts of the composer's \"in this chat\" panels (files, facts): a card that opens upward from the\n * composer, a grouped pick list, and below it the labels, search and bulk actions.\n */\n\n/** The card itself: width follows the chat input (`--chat-input-width`), bounded on small screens. */\nexport const ContextPanelContent = forwardRef<\n ElementRef<typeof HoverCardContent>,\n ComponentPropsWithoutRef<typeof HoverCardContent>\n>(function ContextPanelContent({ className, onClick, ...props }, ref) {\n return (\n <HoverCardContent\n ref={ref}\n side=\"top\"\n align=\"start\"\n data-slot=\"context-panel\"\n // Clicks inside must not bubble (via the React portal) to a click-to-toggle wrapper.\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n className={cn(\n 'w-[var(--chat-input-width,var(--radix-hover-card-content-available-width))] max-h-[var(--radix-hover-card-content-available-height)] max-w-[95vw] overflow-y-auto overscroll-contain rounded-md border border-border bg-muted p-3 shadow-lg',\n className\n )}\n {...props}\n />\n )\n})\n\nexport interface ContextPickerGroup {\n key: string\n heading: string\n /** Id of the heading element. */\n testId?: string\n /** Shown after the heading as `(n)`. */\n count: number\n children: ReactNode\n}\n\nexport interface ContextPickerListProps {\n groups: ContextPickerGroup[]\n /** Shown instead of the groups when every group is empty. */\n emptyText: string\n testId: string\n className?: string\n}\n\n/**\n * Two (or more) headed groups, e.g. \"In this conversation\" then \"In this workspace\". Each heading\n * pins to the top of the scroller and is pushed out by the next one; the second parks below the\n * first (32px = a heading's own height), so both stay visible however far down you scroll.\n */\nexport function ContextPickerList({\n groups,\n emptyText,\n testId,\n className,\n}: ContextPickerListProps) {\n const isEmpty = groups.every((g) => g.count === 0)\n return (\n <div\n className={cn('max-h-[400px] space-y-1 overflow-y-auto', className)}\n data-slot=\"context-picker-list\"\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n >\n {isEmpty ? (\n <p className=\"p-2 text-sm text-muted-foreground\">{emptyText}</p>\n ) : (\n groups.map((g, index) => (\n <Fragment key={g.key}>\n <div\n className={cn(\n 'sticky z-10 bg-muted px-2 py-1.5 text-sm font-medium text-muted-foreground',\n index === 0 ? 'top-0' : 'top-8'\n )}\n data-testid={g.testId}\n >\n {g.heading} ({g.count})\n </div>\n {g.children}\n </Fragment>\n ))\n )}\n </div>\n )\n}\n\nfunction CheckGlyph({ isChecked, className }: { isChecked: boolean; className?: string }) {\n return (\n <span\n className={cn(\n 'flex size-3.5 shrink-0 items-center justify-center rounded-sm border',\n isChecked ? 'border-primary bg-primary text-primary-foreground' : 'border-input',\n className\n )}\n >\n {isChecked && <Check className=\"size-3\" />}\n </span>\n )\n}\n\nexport interface ContextPickerRowProps {\n isSelected: boolean\n onToggle: () => void\n testId?: string\n children: ReactNode\n}\n\n/** A whole-row toggle (e.g. a fact): check glyph then clamped text. */\nexport function ContextPickerRow({\n isSelected,\n onToggle,\n testId,\n children,\n}: ContextPickerRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onToggle()\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-start gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n <CheckGlyph isChecked={isSelected} className=\"mt-0.5\" />\n <span className=\"line-clamp-2 min-w-0 text-foreground\">{children}</span>\n </button>\n )\n}\n\nexport interface ContextCheckRowProps {\n isSelected: boolean\n /** The check toggle: accessible name (e.g. \"Add to conversation\"), handler and test id. */\n toggle: { label: string; onToggle: () => void; testId?: string }\n /** Status glyph between the toggle and the content. */\n status?: ReactNode\n testId?: string\n /** The row's content (e.g. a document pill that opens the document). */\n children: ReactNode\n}\n\n/** A row with its own check toggle plus a content slot (e.g. a document, which opens on click). */\nexport function ContextCheckRow({\n isSelected,\n toggle,\n status,\n testId,\n children,\n}: ContextCheckRowProps) {\n return (\n <div\n className=\"flex items-center gap-2 rounded px-1 py-0.5\"\n data-slot=\"context-check-row\"\n data-testid={testId}\n >\n <button\n type=\"button\"\n aria-label={toggle.label}\n aria-pressed={isSelected}\n onClick={toggle.onToggle}\n data-testid={toggle.testId}\n className=\"flex shrink-0 items-center justify-center rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11\"\n >\n <CheckGlyph isChecked={isSelected} />\n </button>\n {status}\n {children}\n </div>\n )\n}\n\nexport interface ContextSelectListProps {\n children: ReactNode\n}\n\n/** Compact single-select list (e.g. choose the document to pin). */\nexport function ContextSelectList({ children }: ContextSelectListProps) {\n return <div className=\"max-h-[150px] space-y-2 overflow-y-auto\">{children}</div>\n}\n\nexport interface ContextSelectRowProps {\n isSelected: boolean\n onSelect: MouseEventHandler<HTMLButtonElement>\n status?: ReactNode\n title: string\n testId?: string\n}\n\nexport function ContextSelectRow({\n isSelected,\n onSelect,\n status,\n title,\n testId,\n}: ContextSelectRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onSelect(e)\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-center gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'border border-primary/30 bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n {status}\n <span className=\"min-w-0 flex-1 truncate text-foreground\" title={title}>\n {title}\n </span>\n {isSelected && <CheckCircle className=\"size-3.5 shrink-0 text-primary\" />}\n </button>\n )\n}\n\nexport interface ContextPanelFooterProps {\n /** Label shortcut chips (host-supplied row). */\n labels?: ReactNode\n /** The search box. */\n search: ReactNode\n /** Icon + title of the panel; omit when tabs already name it. */\n title?: ReactNode\n /** The action buttons, right aligned. */\n actions: ReactNode\n}\n\n/** Everything below the list: the panel opens upward, so its controls sit nearest the button. */\nexport function ContextPanelFooter({ labels, search, title, actions }: ContextPanelFooterProps) {\n return (\n <div className=\"mt-3 space-y-2 border-t border-border pt-3\" data-slot=\"context-panel-footer\">\n {labels}\n {search}\n <div\n className={cn(\n 'flex flex-wrap items-center gap-x-2 gap-y-1.5',\n title ? 'justify-between' : 'justify-end'\n )}\n >\n {title && (\n <div className=\"flex min-w-0 items-center gap-2 text-sm font-medium text-foreground\">\n {title}\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">{actions}</div>\n </div>\n </div>\n )\n}\n\nexport const ContextSearchInput = forwardRef<\n HTMLInputElement,\n ComponentPropsWithoutRef<typeof Input>\n>(function ContextSearchInput({ className, onClick, ...props }, ref) {\n return (\n <div className=\"relative\" onClick={(e) => e.stopPropagation()}>\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n ref={ref}\n className={cn('h-7 bg-background pl-7 text-sm', className)}\n onClick={onClick}\n {...props}\n />\n </div>\n )\n})\n\nexport interface ContextActionButtonProps extends Omit<ButtonProps, 'size'> {\n icon?: ReactNode\n /** Badge after the label; hidden at 0 / undefined. */\n count?: number\n /** Put the icon after the label (bulk Add / Remove) rather than before it. */\n isIconTrailing?: boolean\n}\n\n/** Compact action of the panel footer (stops click propagation so the card stays open). */\nexport const ContextActionButton = forwardRef<HTMLButtonElement, ContextActionButtonProps>(\n function ContextActionButton(\n { icon, count, isIconTrailing, onClick, children, className, variant = 'outline', ...props },\n ref\n ) {\n return (\n <Button\n ref={ref}\n variant={variant}\n size=\"sm\"\n className={cn('flex h-6 items-center gap-1 px-2 text-sm pointer-coarse:h-11', className)}\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n {...props}\n >\n {!isIconTrailing && icon}\n {children}\n {isIconTrailing && icon}\n {count != null && count > 0 && (\n <Badge variant=\"outline\" className=\"badge-count ml-1\">\n {count}\n </Badge>\n )}\n </Button>\n )\n }\n)\n\nexport interface ContextTab {\n value: string\n /** Visible tab name, e.g. \"Documents\". */\n label: string\n /** Count shown in the tab label. */\n count: number\n testId?: string\n content: ReactNode\n}\n\nexport interface ContextPanelTabsProps {\n tabs: ContextTab[]\n value: string\n onValueChange: (value: string) => void\n testId?: string\n /** Extra classes for the tab strip (e.g. leave room for a sheet's close button). */\n listClassName?: string\n}\n\n/** The panel's tab strip (Radix tabs: roving tabindex, arrow keys) and the active tab's content. */\nexport function ContextPanelTabs({\n tabs,\n value,\n onValueChange,\n testId,\n listClassName,\n}: ContextPanelTabsProps) {\n return (\n <Tabs value={value} onValueChange={onValueChange} data-testid={testId}>\n <TabsList\n className={cn('grid h-auto w-full grid-cols-2 pointer-coarse:h-auto', listClassName)}\n >\n {tabs.map((t) => (\n <TabsTrigger key={t.value} value={t.value} data-testid={t.testId} className=\"gap-1.5\">\n {t.label}\n <Badge variant=\"outline\" className=\"badge-count\">\n {t.count}\n </Badge>\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((t) => (\n <TabsContent key={t.value} value={t.value} className=\"mt-3\">\n {t.content}\n </TabsContent>\n ))}\n </Tabs>\n )\n}\n","import { useEffect, type RefObject } from 'react'\n\nexport interface UseDismissibleCardOptions {\n isOpen: boolean\n onClose: () => void\n /** The card's content: clicks inside never dismiss. */\n contentRef: RefObject<HTMLElement | null>\n /** Focused when the card opens (the panel is opened to find something: typing just works). */\n focusRef?: RefObject<HTMLElement | null>\n}\n\n/**\n * Behaviour of a click-opened card: focus its search box on open, Escape closes it, and a press\n * outside it (or outside any portaled popper that belongs to it, e.g. a dropdown menu opened from\n * inside) closes it too. Bound only while open.\n */\nexport function useDismissibleCard({\n isOpen,\n onClose,\n contentRef,\n focusRef,\n}: UseDismissibleCardOptions): void {\n // rAF lets the portaled content mount before focusing.\n useEffect(() => {\n if (!isOpen) return\n const id = requestAnimationFrame(() => focusRef?.current?.focus())\n return () => cancelAnimationFrame(id)\n }, [isOpen, focusRef])\n\n useEffect(() => {\n if (!isOpen) return\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return\n e.stopPropagation()\n onClose()\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [isOpen, onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null\n if (!target) return\n if (contentRef.current?.contains(target)) return\n if (target.closest('[data-radix-popper-content-wrapper]')) return\n onClose()\n }\n document.addEventListener('mousedown', onPointerDown)\n return () => document.removeEventListener('mousedown', onPointerDown)\n }, [isOpen, onClose, contentRef])\n}\n","import { Tag as TagIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PinnableLabel {\n id: string\n name: string\n /** The label's own colour (any CSS colour): the same hue everywhere the label appears. */\n color: string\n /** Ids of the items carrying this label. */\n itemIds: string[]\n}\n\nexport interface LabelPinRowLabels {\n remove: (count: number, name: string) => string\n add: (count: number, name: string) => string\n}\n\nexport const DEFAULT_LABEL_PIN_ROW_LABELS: LabelPinRowLabels = {\n remove: (count, name) => `Remove the ${count} “${name}” item(s) from this chat`,\n add: (count, name) => `Add the ${count} “${name}” item(s) to this chat`,\n}\n\nexport interface LabelPinRowProps {\n labels: PinnableLabel[]\n /** Ids currently in the conversation. */\n selectedIds: string[]\n /** Add every id (already de-duplicated against the chat). */\n onAdd: (ids: string[]) => void\n /** Remove every id. */\n onRemove: (ids: string[]) => void\n testId?: string\n copy?: Partial<LabelPinRowLabels>\n}\n\n/**\n * Label shortcuts inside the in-chat panels: one chip per label in use; clicking it pins\n * everything carrying that label. A chip whose items are ALL in the chat reads as active and\n * clicking it takes them back out, so a label is a toggle rather than a one-way add.\n */\nexport function LabelPinRow({\n labels,\n selectedIds,\n onAdd,\n onRemove,\n testId = 'label-pin-row',\n copy,\n}: LabelPinRowProps) {\n const l = { ...DEFAULT_LABEL_PIN_ROW_LABELS, ...copy }\n const usable = labels.filter((label) => label.itemIds.length > 0)\n if (usable.length === 0) return null\n\n const selectedSet = new Set(selectedIds)\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1\"\n data-slot=\"label-pin-row\"\n data-testid={testId}\n >\n <TagIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n {usable.map((label) => {\n const allIn = label.itemIds.every((id) => selectedSet.has(id))\n return (\n <button\n key={label.id}\n type=\"button\"\n aria-pressed={allIn}\n title={\n allIn\n ? l.remove(label.itemIds.length, label.name)\n : l.add(label.itemIds.length, label.name)\n }\n onClick={() =>\n allIn\n ? onRemove(label.itemIds)\n : onAdd(label.itemIds.filter((id) => !selectedSet.has(id)))\n }\n className={cn(\n 'flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n allIn ? 'text-white' : 'bg-muted text-foreground hover:brightness-95'\n )}\n // Pinned reads as the label filled in with its own colour; at rest it's the muted\n // pill with the colour on the dot, matching the label pills on documents and facts.\n style={\n allIn\n ? { backgroundColor: label.color, borderColor: label.color }\n : { borderColor: `${label.color}66` }\n }\n data-testid={`${testId}-${label.id}`}\n >\n {!allIn && (\n <span\n className=\"size-1.5 shrink-0 rounded-full\"\n style={{ backgroundColor: label.color }}\n aria-hidden\n />\n )}\n <span className=\"max-w-[120px] truncate\">{label.name}</span>\n <span className=\"tabular-nums opacity-70\">{label.itemIds.length}</span>\n </button>\n )\n })}\n </div>\n )\n}\n","import { Toaster, type ShellToasterProps } from '../shell/Toaster'\nimport { useAssistantDock } from './AssistantDock'\nimport { useChatSurface } from './chat-surface'\n\nexport type AssistantToasterProps = Omit<ShellToasterProps, 'dockOpen'>\n\n/**\n * The shell `Toaster` wired to the assistant dock: while the dock is open (and offered: a mounted\n * page chat hides it) a right-aligned toast stack slides clear of it. Pass `dockWidth` when the\n * `AssistantDock` has a custom `width`.\n */\nexport function AssistantToaster(props: AssistantToasterProps) {\n const dock = useAssistantDock()\n const { isDockAvailable } = useChatSurface()\n return <Toaster {...props} dockOpen={dock.isOpen && isDockAvailable} />\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/chat/PinnedDocChip.tsx","../src/chat/ConversationSearchView.tsx","../src/chat/ContextPanel.tsx","../src/lib/useDismissibleCard.ts","../src/chat/LabelPinRow.tsx","../src/chat/AssistantToaster.tsx"],"names":["jsxs","jsx","X","ContextPanelContent","cn","Fragment","ContextSearchInput","Search","ContextActionButton","Button","TagIcon"],"mappings":"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","file":"chunk-TBRX5RNH.js","sourcesContent":["import { Pin, X } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\n/** Every fixed string of the chip. Pass a partial `labels` to translate or reword. */\nexport interface PinnedDocChipLabels {\n unpin: string\n /** Accessible name; `title` is the pinned document's name. */\n unpinDocument: (title: string) => string\n}\n\nexport const DEFAULT_PINNED_DOC_CHIP_LABELS: PinnedDocChipLabels = {\n unpin: 'Unpin',\n unpinDocument: (title) => `Unpin ${title}`,\n}\n\nexport interface PinnedDocChipProps {\n title: string\n onUnpin: () => void\n className?: string\n labels?: Partial<PinnedDocChipLabels>\n testId?: string\n}\n\n/**\n * The pinned-document chip that lives inside a composer's attach button: shows which document\n * holds the full-context pin and unpins it in ONE tap (the X is always visible, so touch and\n * keyboard reach it). It is a span with button semantics because it sits inside the attach\n * `<button>`, where nested buttons are invalid; `stopPropagation` keeps the tap from also\n * triggering the parent.\n */\nexport function PinnedDocChip({\n title,\n onUnpin,\n className,\n labels,\n testId = 'unpin-document-button',\n}: PinnedDocChipProps) {\n const l = { ...DEFAULT_PINNED_DOC_CHIP_LABELS, ...labels }\n return (\n <span\n role=\"button\"\n tabIndex={0}\n data-slot=\"pinned-doc-chip\"\n onClick={(e) => {\n e.stopPropagation()\n onUnpin()\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.stopPropagation()\n onUnpin()\n }\n }}\n title={l.unpin}\n aria-label={l.unpinDocument(title)}\n className={cn(\n '-mx-0.5 flex min-w-0 items-center gap-1 rounded-sm px-1 text-foreground hover:bg-accent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className\n )}\n data-testid={testId}\n >\n <Pin className=\"h-3 w-3 shrink-0 fill-primary\" />\n <X className=\"order-last h-3 w-3 shrink-0 text-muted-foreground\" />\n <span className=\"truncate text-sm\">{title}</span>\n </span>\n )\n}\n","import { useMemo, type ComponentType, type ReactNode } from 'react'\nimport { Bot, Loader2, MessageSquare, Search, User, X } from 'lucide-react'\n\nimport { Button, PassageCard } from '@arbidocs/react/ui'\n\n/** One matching message of a conversation. */\nexport interface ConversationSearchMatch {\n id: string\n role: string\n score: number\n snippet: string\n}\n\n/** A conversation with the messages that matched the query. */\nexport interface ConversationSearchGroup {\n id: string\n title?: string | null\n matches: ConversationSearchMatch[]\n}\n\n/** Every fixed string of the conversation search. */\nexport interface ConversationSearchLabels {\n placeholder: string\n search: string\n searching: string\n matched: (count: number, query: string) => string\n matchCount: (count: number) => string\n untitled: string\n you: string\n assistant: string\n clear: string\n noResults: (query: string) => string\n reindexHint: ReactNode\n backToList: string\n}\n\nexport const DEFAULT_CONVERSATION_SEARCH_LABELS: ConversationSearchLabels = {\n placeholder: 'Search your conversations...',\n search: 'Search',\n searching: 'Searching conversations…',\n matched: (count, query) => `${count} conversation${count === 1 ? '' : 's'} matched “${query}”`,\n matchCount: (count) => `${count} match${count === 1 ? '' : 'es'}`,\n untitled: 'Untitled conversation',\n you: 'You',\n assistant: 'Assistant',\n clear: 'Clear',\n noResults: (query) => `No conversations matched “${query}”.`,\n reindexHint: (\n <>\n Older conversations may need indexing — try <span className=\"font-medium\">Re-index</span>.\n </>\n ),\n backToList: 'Back to list',\n}\n\nexport interface ConversationSearchViewProps {\n query: string\n onQueryChange: (query: string) => void\n /** Enter (without Shift) or the submit button. */\n onSubmit: () => void\n canSubmit: boolean\n isSearching: boolean\n /** The query the shown results answer; empty while no search has run. */\n submittedQuery: string\n /** Results of `submittedQuery`. */\n groups: ConversationSearchGroup[]\n onOpenConversation: (conversationId: string, messageId?: string) => void\n /** Back to the idle body. */\n onClear: () => void\n /** Shown beneath the bar until a search is run (e.g. the history list). */\n children?: ReactNode\n /** Wraps the results area (e.g. an error boundary). */\n ResultsBoundary?: ComponentType<{ children: ReactNode }>\n labels?: Partial<ConversationSearchLabels>\n}\n\nfunction RoleChip({ isUser, labels }: { isUser: boolean; labels: ConversationSearchLabels }) {\n const Icon = isUser ? User : Bot\n return (\n <span className=\"inline-flex items-center gap-1 text-xs font-medium text-muted-foreground\">\n <Icon className=\"size-3\" />\n {isUser ? labels.you : labels.assistant}\n </span>\n )\n}\n\nconst Passthrough = ({ children }: { children: ReactNode }) => <>{children}</>\n\n/**\n * Search across past conversations: a search bar, then either the idle body (history list) or\n * the matches grouped by conversation. Opening a group or a hit is the host's navigation.\n */\nexport function ConversationSearchView({\n query,\n onQueryChange,\n onSubmit,\n canSubmit,\n isSearching,\n submittedQuery,\n groups,\n onOpenConversation,\n onClear,\n children,\n ResultsBoundary = Passthrough,\n labels,\n}: ConversationSearchViewProps) {\n const l = useMemo(() => ({ ...DEFAULT_CONVERSATION_SEARCH_LABELS, ...labels }), [labels])\n const hasResults = !!submittedQuery && !isSearching && groups.length > 0\n\n return (\n <div\n data-slot=\"conversation-search\"\n className=\"flex h-full flex-col\"\n data-testid=\"conversation-search-page\"\n >\n <div className=\"flex items-start gap-3 px-6 py-4\">\n <form\n onSubmit={(e) => {\n e.preventDefault()\n onSubmit()\n }}\n className=\"flex-1\"\n >\n <div className=\"flex items-start gap-2 rounded-md border border-input bg-muted px-3 py-1.5 focus-within:ring-2 focus-within:ring-ring\">\n <textarea\n rows={1}\n value={query}\n onChange={(e) => {\n onQueryChange(e.target.value)\n e.target.style.height = 'auto'\n e.target.style.height = `${e.target.scrollHeight}px`\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && !e.shiftKey) {\n e.preventDefault()\n onSubmit()\n }\n }}\n placeholder={l.placeholder}\n aria-label={l.search}\n className=\"flex-1 resize-none overflow-hidden border-0 bg-transparent p-0 text-base leading-relaxed text-foreground outline-none placeholder:text-muted-foreground\"\n data-testid=\"conversation-search-input\"\n />\n <div className=\"flex flex-shrink-0 items-center gap-1\">\n <Button\n type=\"submit\"\n size=\"icon\"\n disabled={!canSubmit}\n className=\"size-7 pointer-coarse:size-11\"\n data-testid=\"conversation-search-submit-button\"\n title={l.search}\n aria-label={l.search}\n >\n {isSearching ? (\n <Loader2 className=\"size-4 animate-spin\" />\n ) : (\n <Search className=\"size-4\" />\n )}\n </Button>\n </div>\n </div>\n </form>\n </div>\n\n {!submittedQuery ? (\n <div className=\"flex-1 overflow-hidden\">{children}</div>\n ) : (\n <ResultsBoundary>\n <main className=\"flex-1 overflow-auto px-6 pb-6\">\n {isSearching ? (\n <div className=\"flex items-center justify-center gap-2 py-16 text-muted-foreground\">\n <Loader2 className=\"size-5 animate-spin\" />\n {l.searching}\n </div>\n ) : hasResults ? (\n <div className=\"space-y-4\" data-testid=\"conversation-search-results\">\n <div className=\"flex items-center justify-between gap-3\">\n <p className=\"text-sm text-muted-foreground\">\n {l.matched(groups.length, submittedQuery)}\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"h-7 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n data-testid=\"conversation-search-clear\"\n >\n <X className=\"size-3.5\" />\n {l.clear}\n </Button>\n </div>\n {groups.map((group) => (\n <div\n key={group.id}\n className=\"rounded-lg border border-border bg-card\"\n data-testid=\"conversation-search-group\"\n >\n <button\n type=\"button\"\n onClick={() => onOpenConversation(group.id)}\n className=\"flex w-full items-center justify-between gap-3 rounded-t-lg px-4 py-2.5 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring pointer-coarse:min-h-11\"\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n <MessageSquare className=\"size-4 flex-shrink-0 text-muted-foreground\" />\n <span className=\"truncate font-medium\">{group.title || l.untitled}</span>\n </span>\n <span className=\"flex-shrink-0 text-xs text-muted-foreground\">\n {l.matchCount(group.matches.length)}\n </span>\n </button>\n <div className=\"space-y-2 border-t border-border p-3\">\n {group.matches.map((m) => (\n <PassageCard\n key={m.id}\n header={<RoleChip isUser={m.role === 'user'} labels={l} />}\n score={m.score}\n onClick={() => onOpenConversation(group.id, m.id)}\n data-testid=\"conversation-search-hit\"\n >\n <p className=\"line-clamp-3 text-sm text-foreground/90\">{m.snippet}</p>\n </PassageCard>\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div\n className=\"py-16 text-center text-muted-foreground\"\n data-testid=\"conversation-search-no-results\"\n >\n <MessageSquare className=\"mx-auto mb-3 size-8 opacity-40\" />\n <p>{l.noResults(submittedQuery)}</p>\n <p className=\"mt-1 text-sm\">{l.reindexHint}</p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n className=\"mt-3 gap-1 text-muted-foreground pointer-coarse:h-11\"\n onClick={onClear}\n >\n <X className=\"size-3.5\" />\n {l.backToList}\n </Button>\n </div>\n )}\n </main>\n </ResultsBoundary>\n )}\n </div>\n )\n}\n","import {\n forwardRef,\n Fragment,\n type ComponentPropsWithoutRef,\n type ElementRef,\n type MouseEventHandler,\n type ReactNode,\n} from 'react'\nimport { Check, CheckCircle, Search } from 'lucide-react'\nimport {\n Badge,\n Button,\n HoverCardContent,\n Input,\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n cn,\n type ButtonProps,\n} from '@arbidocs/react/ui'\n\n/**\n * Parts of the composer's \"in this chat\" panels (files, facts): a card that opens upward from the\n * composer, a grouped pick list, and below it the labels, search and bulk actions.\n */\n\n/** The card itself: width follows the chat input (`--chat-input-width`), bounded on small screens. */\nexport const ContextPanelContent = forwardRef<\n ElementRef<typeof HoverCardContent>,\n ComponentPropsWithoutRef<typeof HoverCardContent>\n>(function ContextPanelContent({ className, onClick, ...props }, ref) {\n return (\n <HoverCardContent\n ref={ref}\n side=\"top\"\n align=\"start\"\n data-slot=\"context-panel\"\n // Clicks inside must not bubble (via the React portal) to a click-to-toggle wrapper.\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n className={cn(\n 'w-[var(--chat-input-width,var(--radix-hover-card-content-available-width))] max-h-[var(--radix-hover-card-content-available-height)] max-w-[95vw] overflow-y-auto overscroll-contain rounded-md border border-border bg-muted p-3 shadow-lg',\n className\n )}\n {...props}\n />\n )\n})\n\nexport interface ContextPickerGroup {\n key: string\n heading: string\n /** Id of the heading element. */\n testId?: string\n /** Shown after the heading as `(n)`. */\n count: number\n children: ReactNode\n}\n\nexport interface ContextPickerListProps {\n groups: ContextPickerGroup[]\n /** Shown instead of the groups when every group is empty. */\n emptyText: string\n testId: string\n className?: string\n}\n\n/**\n * Two (or more) headed groups, e.g. \"In this conversation\" then \"In this workspace\". Each heading\n * pins to the top of the scroller and is pushed out by the next one; the second parks below the\n * first (32px = a heading's own height), so both stay visible however far down you scroll.\n */\nexport function ContextPickerList({\n groups,\n emptyText,\n testId,\n className,\n}: ContextPickerListProps) {\n const isEmpty = groups.every((g) => g.count === 0)\n return (\n <div\n className={cn('max-h-[400px] space-y-1 overflow-y-auto', className)}\n data-slot=\"context-picker-list\"\n data-testid={testId}\n onClick={(e) => e.stopPropagation()}\n >\n {isEmpty ? (\n <p className=\"p-2 text-sm text-muted-foreground\">{emptyText}</p>\n ) : (\n groups.map((g, index) => (\n <Fragment key={g.key}>\n <div\n className={cn(\n 'sticky z-10 bg-muted px-2 py-1.5 text-sm font-medium text-muted-foreground',\n index === 0 ? 'top-0' : 'top-8'\n )}\n data-testid={g.testId}\n >\n {g.heading} ({g.count})\n </div>\n {g.children}\n </Fragment>\n ))\n )}\n </div>\n )\n}\n\nfunction CheckGlyph({ isChecked, className }: { isChecked: boolean; className?: string }) {\n return (\n <span\n className={cn(\n 'flex size-3.5 shrink-0 items-center justify-center rounded-sm border',\n isChecked ? 'border-primary bg-primary text-primary-foreground' : 'border-input',\n className\n )}\n >\n {isChecked && <Check className=\"size-3\" />}\n </span>\n )\n}\n\nexport interface ContextPickerRowProps {\n isSelected: boolean\n onToggle: () => void\n testId?: string\n children: ReactNode\n}\n\n/** A whole-row toggle (e.g. a fact): check glyph then clamped text. */\nexport function ContextPickerRow({\n isSelected,\n onToggle,\n testId,\n children,\n}: ContextPickerRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onToggle()\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-start gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n <CheckGlyph isChecked={isSelected} className=\"mt-0.5\" />\n <span className=\"line-clamp-2 min-w-0 text-foreground\">{children}</span>\n </button>\n )\n}\n\nexport interface ContextCheckRowProps {\n isSelected: boolean\n /** The check toggle: accessible name (e.g. \"Add to conversation\"), handler and test id. */\n toggle: { label: string; onToggle: () => void; testId?: string }\n /** Status glyph between the toggle and the content. */\n status?: ReactNode\n testId?: string\n /** The row's content (e.g. a document pill that opens the document). */\n children: ReactNode\n}\n\n/** A row with its own check toggle plus a content slot (e.g. a document, which opens on click). */\nexport function ContextCheckRow({\n isSelected,\n toggle,\n status,\n testId,\n children,\n}: ContextCheckRowProps) {\n return (\n <div\n className=\"flex items-center gap-2 rounded px-1 py-0.5\"\n data-slot=\"context-check-row\"\n data-testid={testId}\n >\n <button\n type=\"button\"\n aria-label={toggle.label}\n aria-pressed={isSelected}\n onClick={toggle.onToggle}\n data-testid={toggle.testId}\n className=\"flex shrink-0 items-center justify-center rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:size-11\"\n >\n <CheckGlyph isChecked={isSelected} />\n </button>\n {status}\n {children}\n </div>\n )\n}\n\nexport interface ContextSelectListProps {\n children: ReactNode\n}\n\n/** Compact single-select list (e.g. choose the document to pin). */\nexport function ContextSelectList({ children }: ContextSelectListProps) {\n return <div className=\"max-h-[150px] space-y-2 overflow-y-auto\">{children}</div>\n}\n\nexport interface ContextSelectRowProps {\n isSelected: boolean\n onSelect: MouseEventHandler<HTMLButtonElement>\n status?: ReactNode\n title: string\n testId?: string\n}\n\nexport function ContextSelectRow({\n isSelected,\n onSelect,\n status,\n title,\n testId,\n}: ContextSelectRowProps) {\n return (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n onSelect(e)\n }}\n aria-pressed={isSelected}\n data-testid={testId}\n className={cn(\n 'flex w-full items-center gap-2 rounded p-2 text-left text-sm transition-colors pointer-coarse:min-h-11',\n isSelected ? 'border border-primary/30 bg-primary/10' : 'bg-card hover:bg-muted'\n )}\n >\n {status}\n <span className=\"min-w-0 flex-1 truncate text-foreground\" title={title}>\n {title}\n </span>\n {isSelected && <CheckCircle className=\"size-3.5 shrink-0 text-primary\" />}\n </button>\n )\n}\n\nexport interface ContextPanelFooterProps {\n /** Label shortcut chips (host-supplied row). */\n labels?: ReactNode\n /** The search box. */\n search: ReactNode\n /** Icon + title of the panel; omit when tabs already name it. */\n title?: ReactNode\n /** The action buttons, right aligned. */\n actions: ReactNode\n}\n\n/** Everything below the list: the panel opens upward, so its controls sit nearest the button. */\nexport function ContextPanelFooter({ labels, search, title, actions }: ContextPanelFooterProps) {\n return (\n <div className=\"mt-3 space-y-2 border-t border-border pt-3\" data-slot=\"context-panel-footer\">\n {labels}\n {search}\n <div\n className={cn(\n 'flex flex-wrap items-center gap-x-2 gap-y-1.5',\n title ? 'justify-between' : 'justify-end'\n )}\n >\n {title && (\n <div className=\"flex min-w-0 items-center gap-2 text-sm font-medium text-foreground\">\n {title}\n </div>\n )}\n <div className=\"flex flex-wrap items-center gap-1.5\">{actions}</div>\n </div>\n </div>\n )\n}\n\nexport const ContextSearchInput = forwardRef<\n HTMLInputElement,\n ComponentPropsWithoutRef<typeof Input>\n>(function ContextSearchInput({ className, onClick, ...props }, ref) {\n return (\n <div className=\"relative\" onClick={(e) => e.stopPropagation()}>\n <Search className=\"pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground\" />\n <Input\n ref={ref}\n className={cn('h-7 bg-background pl-7 text-sm', className)}\n onClick={onClick}\n {...props}\n />\n </div>\n )\n})\n\nexport interface ContextActionButtonProps extends Omit<ButtonProps, 'size'> {\n icon?: ReactNode\n /** Badge after the label; hidden at 0 / undefined. */\n count?: number\n /** Put the icon after the label (bulk Add / Remove) rather than before it. */\n isIconTrailing?: boolean\n}\n\n/** Compact action of the panel footer (stops click propagation so the card stays open). */\nexport const ContextActionButton = forwardRef<HTMLButtonElement, ContextActionButtonProps>(\n function ContextActionButton(\n { icon, count, isIconTrailing, onClick, children, className, variant = 'outline', ...props },\n ref\n ) {\n return (\n <Button\n ref={ref}\n variant={variant}\n size=\"sm\"\n className={cn('flex h-6 items-center gap-1 px-2 text-sm pointer-coarse:h-11', className)}\n onClick={(e) => {\n e.stopPropagation()\n onClick?.(e)\n }}\n {...props}\n >\n {!isIconTrailing && icon}\n {children}\n {isIconTrailing && icon}\n {count != null && count > 0 && (\n <Badge variant=\"outline\" className=\"badge-count ml-1\">\n {count}\n </Badge>\n )}\n </Button>\n )\n }\n)\n\nexport interface ContextTab {\n value: string\n /** Visible tab name, e.g. \"Documents\". */\n label: string\n /** Count shown in the tab label. */\n count: number\n testId?: string\n content: ReactNode\n}\n\nexport interface ContextPanelTabsProps {\n tabs: ContextTab[]\n value: string\n onValueChange: (value: string) => void\n testId?: string\n /** Extra classes for the tab strip (e.g. leave room for a sheet's close button). */\n listClassName?: string\n}\n\n/** The panel's tab strip (Radix tabs: roving tabindex, arrow keys) and the active tab's content. */\nexport function ContextPanelTabs({\n tabs,\n value,\n onValueChange,\n testId,\n listClassName,\n}: ContextPanelTabsProps) {\n return (\n <Tabs value={value} onValueChange={onValueChange} data-testid={testId}>\n <TabsList\n className={cn('grid h-auto w-full grid-cols-2 pointer-coarse:h-auto', listClassName)}\n >\n {tabs.map((t) => (\n <TabsTrigger key={t.value} value={t.value} data-testid={t.testId} className=\"gap-1.5\">\n {t.label}\n <Badge variant=\"outline\" className=\"badge-count\">\n {t.count}\n </Badge>\n </TabsTrigger>\n ))}\n </TabsList>\n {tabs.map((t) => (\n <TabsContent key={t.value} value={t.value} className=\"mt-3\">\n {t.content}\n </TabsContent>\n ))}\n </Tabs>\n )\n}\n","import { useEffect, type RefObject } from 'react'\n\nexport interface UseDismissibleCardOptions {\n isOpen: boolean\n onClose: () => void\n /** The card's content: clicks inside never dismiss. */\n contentRef: RefObject<HTMLElement | null>\n /** Focused when the card opens (the panel is opened to find something: typing just works). */\n focusRef?: RefObject<HTMLElement | null>\n}\n\n/**\n * Behaviour of a click-opened card: focus its search box on open, Escape closes it, and a press\n * outside it (or outside any portaled popper that belongs to it, e.g. a dropdown menu opened from\n * inside) closes it too. Bound only while open.\n */\nexport function useDismissibleCard({\n isOpen,\n onClose,\n contentRef,\n focusRef,\n}: UseDismissibleCardOptions): void {\n // rAF lets the portaled content mount before focusing.\n useEffect(() => {\n if (!isOpen) return\n const id = requestAnimationFrame(() => focusRef?.current?.focus())\n return () => cancelAnimationFrame(id)\n }, [isOpen, focusRef])\n\n useEffect(() => {\n if (!isOpen) return\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key !== 'Escape') return\n e.stopPropagation()\n onClose()\n }\n document.addEventListener('keydown', onKeyDown)\n return () => document.removeEventListener('keydown', onKeyDown)\n }, [isOpen, onClose])\n\n useEffect(() => {\n if (!isOpen) return\n const onPointerDown = (e: MouseEvent) => {\n const target = e.target as HTMLElement | null\n if (!target) return\n if (contentRef.current?.contains(target)) return\n if (target.closest('[data-radix-popper-content-wrapper]')) return\n onClose()\n }\n document.addEventListener('mousedown', onPointerDown)\n return () => document.removeEventListener('mousedown', onPointerDown)\n }, [isOpen, onClose, contentRef])\n}\n","import { Tag as TagIcon } from 'lucide-react'\nimport { cn } from '@arbidocs/react/ui'\n\nexport interface PinnableLabel {\n id: string\n name: string\n /** The label's own colour (any CSS colour): the same hue everywhere the label appears. */\n color: string\n /** Ids of the items carrying this label. */\n itemIds: string[]\n}\n\nexport interface LabelPinRowLabels {\n remove: (count: number, name: string) => string\n add: (count: number, name: string) => string\n}\n\nexport const DEFAULT_LABEL_PIN_ROW_LABELS: LabelPinRowLabels = {\n remove: (count, name) => `Remove the ${count} “${name}” item(s) from this chat`,\n add: (count, name) => `Add the ${count} “${name}” item(s) to this chat`,\n}\n\nexport interface LabelPinRowProps {\n labels: PinnableLabel[]\n /** Ids currently in the conversation. */\n selectedIds: string[]\n /** Add every id (already de-duplicated against the chat). */\n onAdd: (ids: string[]) => void\n /** Remove every id. */\n onRemove: (ids: string[]) => void\n testId?: string\n copy?: Partial<LabelPinRowLabels>\n}\n\n/**\n * Label shortcuts inside the in-chat panels: one chip per label in use; clicking it pins\n * everything carrying that label. A chip whose items are ALL in the chat reads as active and\n * clicking it takes them back out, so a label is a toggle rather than a one-way add.\n */\nexport function LabelPinRow({\n labels,\n selectedIds,\n onAdd,\n onRemove,\n testId = 'label-pin-row',\n copy,\n}: LabelPinRowProps) {\n const l = { ...DEFAULT_LABEL_PIN_ROW_LABELS, ...copy }\n const usable = labels.filter((label) => label.itemIds.length > 0)\n if (usable.length === 0) return null\n\n const selectedSet = new Set(selectedIds)\n\n return (\n <div\n className=\"flex flex-wrap items-center gap-1\"\n data-slot=\"label-pin-row\"\n data-testid={testId}\n >\n <TagIcon className=\"size-3.5 shrink-0 text-muted-foreground\" aria-hidden />\n {usable.map((label) => {\n const allIn = label.itemIds.every((id) => selectedSet.has(id))\n return (\n <button\n key={label.id}\n type=\"button\"\n aria-pressed={allIn}\n title={\n allIn\n ? l.remove(label.itemIds.length, label.name)\n : l.add(label.itemIds.length, label.name)\n }\n onClick={() =>\n allIn\n ? onRemove(label.itemIds)\n : onAdd(label.itemIds.filter((id) => !selectedSet.has(id)))\n }\n className={cn(\n 'flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring pointer-coarse:min-h-11',\n allIn ? 'text-white' : 'bg-muted text-foreground hover:brightness-95'\n )}\n // Pinned reads as the label filled in with its own colour; at rest it's the muted\n // pill with the colour on the dot, matching the label pills on documents and facts.\n style={\n allIn\n ? { backgroundColor: label.color, borderColor: label.color }\n : { borderColor: `${label.color}66` }\n }\n data-testid={`${testId}-${label.id}`}\n >\n {!allIn && (\n <span\n className=\"size-1.5 shrink-0 rounded-full\"\n style={{ backgroundColor: label.color }}\n aria-hidden\n />\n )}\n <span className=\"max-w-[120px] truncate\">{label.name}</span>\n <span className=\"tabular-nums opacity-70\">{label.itemIds.length}</span>\n </button>\n )\n })}\n </div>\n )\n}\n","import { Toaster, type ShellToasterProps } from '../shell/Toaster'\nimport { useAssistantDock } from './AssistantDock'\nimport { useChatSurface } from './chat-surface'\n\nexport type AssistantToasterProps = Omit<ShellToasterProps, 'dockOpen'>\n\n/**\n * The shell `Toaster` wired to the assistant dock: while the dock is open (and offered: a mounted\n * page chat hides it) a right-aligned toast stack slides clear of it. Pass `dockWidth` when the\n * `AssistantDock` has a custom `width`.\n */\nexport function AssistantToaster(props: AssistantToasterProps) {\n const dock = useAssistantDock()\n const { isDockAvailable } = useChatSurface()\n return <Toaster {...props} dockOpen={dock.isOpen && isDockAvailable} />\n}\n"]}
|
|
@@ -43,7 +43,7 @@ function ConnectionProvider({
|
|
|
43
43
|
}) {
|
|
44
44
|
const arbi = useArbi();
|
|
45
45
|
const session = useArbiSessionStore();
|
|
46
|
-
const { switchWorkspace, openSelectedWorkspace } = useSwitchWorkspace();
|
|
46
|
+
const { switchWorkspace, openSelectedWorkspace, settled } = useSwitchWorkspace();
|
|
47
47
|
const isLiveConfigured = config.apiUrl.length > 0;
|
|
48
48
|
const demoWorkspaceId = config.demoWorkspaceId ?? "demo-workspace";
|
|
49
49
|
const [status, setStatus] = useState(
|
|
@@ -189,13 +189,10 @@ function ConnectionProvider({
|
|
|
189
189
|
);
|
|
190
190
|
const ensureWorkspaceOpen = useCallback(async () => {
|
|
191
191
|
if (mode !== "live" || !arbi.isLoggedIn) return;
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
const fallback = readPersistedWorkspace(config.apiUrl, storageUserRef.current) ?? config.workspaceId;
|
|
197
|
-
if (fallback) await arbi.selectWorkspace(fallback);
|
|
198
|
-
}, [arbi, session, mode, config.apiUrl, config.workspaceId, openSelectedWorkspace]);
|
|
192
|
+
await settled();
|
|
193
|
+
if (!session.getState().workspaceId) return;
|
|
194
|
+
await openSelectedWorkspace();
|
|
195
|
+
}, [arbi, session, mode, settled, openSelectedWorkspace]);
|
|
199
196
|
const value = useMemo(
|
|
200
197
|
() => ({
|
|
201
198
|
mode,
|
|
@@ -207,7 +204,7 @@ function ConnectionProvider({
|
|
|
207
204
|
deploymentDomain: isLiveConfigured ? arbi.getDeploymentDomain() : void 0,
|
|
208
205
|
error,
|
|
209
206
|
assistantConfig: config.assistantConfig,
|
|
210
|
-
fallbackWorkspaceId: config.workspaceId,
|
|
207
|
+
fallbackWorkspaceId: mode === "live" ? void 0 : config.workspaceId,
|
|
211
208
|
login,
|
|
212
209
|
enterDemo,
|
|
213
210
|
logout,
|
|
@@ -328,5 +325,5 @@ function useConnectedWorkspace() {
|
|
|
328
325
|
}
|
|
329
326
|
|
|
330
327
|
export { ConnectionProvider, SESSION_EXPIRED_MESSAGE, isAuthenticated, useConnectedWorkspace, useConnection };
|
|
331
|
-
//# sourceMappingURL=chunk-
|
|
332
|
-
//# sourceMappingURL=chunk-
|
|
328
|
+
//# sourceMappingURL=chunk-TXPOODAY.js.map
|
|
329
|
+
//# sourceMappingURL=chunk-TXPOODAY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/connection/ConnectionProvider.tsx"],"names":["login"],"mappings":"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","file":"chunk-TXPOODAY.js","sourcesContent":["/**\n * The demo/live connection layer for a host app. Holds auth + workspace\n * selection state and exposes it via {@link useConnection}, so every surface\n * works identically whether it's talking to a live ARBI backend or the seeded\n * demo workspace. Host-specific values (backend URL, demo identity, default\n * workspace/assistant ids) arrive once through {@link ArbiConnectionConfig}.\n */\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport {\n arbiAccountClient,\n clearSealedDrafts,\n toProfileView,\n useArbi,\n useArbiSessionState,\n useArbiSessionStore,\n useSwitchWorkspace,\n type AccountClient,\n type LoginProfile,\n type ProfileView,\n} from '@arbidocs/react'\nimport type { ArbiMode, ArbiUser, ConnectionStatus, ArbiConnectionConfig } from './types'\nimport { useBlocksEnvironment } from '../provider/environment'\nimport { ArbiHost } from '../provider/host'\n\ninterface ConnectionValue {\n mode: ArbiMode\n status: ConnectionStatus\n user: ArbiUser | null\n /** The selected workspace: the session state's (`useArbiSessionState`), set by `setWorkspace`. */\n workspaceId: string | null\n apiConfigured: boolean\n apiUrl: string\n /**\n * The deployment domain the user's keys are derived for (`arbi.getDeploymentDomain()`), for the\n * document tools' e-signing. `undefined` in demo mode.\n */\n deploymentDomain: string | undefined\n error: string | null\n /** Default assistant config ext_id (for the AI hooks). */\n assistantConfig?: string\n /**\n * The demo's workspace when none is selected. Never set signed in to a live backend: there the\n * selection is the only workspace (none while a switch is in flight), never a remembered one.\n */\n fallbackWorkspaceId?: string\n /** Authenticate. Live login when a backend is configured, otherwise the demo workspace. */\n login: (email: string, password: string) => Promise<void>\n /** One-click demo entry (no backend required). */\n enterDemo: () => void\n logout: () => void\n /**\n * Affirmatively select a workspace: opens it on the server (via the SDK),\n * updates the app-wide state, and persists the choice so it survives future\n * logins. This is the single entry point for \"the user is now in workspace X\".\n */\n setWorkspace: (id: string) => Promise<void>\n /**\n * Re-assert the selected workspace on the server session (idempotent `/open`).\n * Call before a workspace-scoped write when the session may have lost its open\n * workspace (token re-login, backend restart, session expiry) — the server\n * resolves the workspace from the session, so a dropped `/open` yields\n * \"No active workspace\" until it's re-opened.\n */\n ensureWorkspaceOpen: () => Promise<void>\n}\n\nconst ConnectionContext = createContext<ConnectionValue | null>(null)\n\n/**\n * Persist the affirmatively-selected workspace per backend AND per signed-in user, so a returning\n * user lands back in the workspace they last chose, while the next person on a shared browser\n * never starts from someone else's workspace id. Namespaced by apiUrl so distinct deployments\n * (and the demo workspace) don't clobber each other. Cleared on logout.\n */\nconst WORKSPACE_STORAGE_PREFIX = 'arbi:selectedWorkspace'\nconst normalizeUserKey = (email: string) => email.trim().toLowerCase()\n\n/** Exported for tests. */\nexport const workspaceStorageKey = (apiUrl: string, userKey: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}:${normalizeUserKey(userKey)}`\n\n/** The pre-isolation key (apiUrl only). Never read: removed so it cannot leak across users. */\nconst legacyWorkspaceStorageKey = (apiUrl: string) =>\n `${WORKSPACE_STORAGE_PREFIX}:${apiUrl || 'demo'}`\n\nfunction readPersistedWorkspace(apiUrl: string, userKey: string | null): string | null {\n if (!userKey) return null\n try {\n return window.localStorage.getItem(workspaceStorageKey(apiUrl, userKey))\n } catch {\n return null\n }\n}\n\nfunction persistWorkspace(apiUrl: string, userKey: string | null, id: string | null): void {\n if (!userKey) return\n try {\n if (id) window.localStorage.setItem(workspaceStorageKey(apiUrl, userKey), id)\n else window.localStorage.removeItem(workspaceStorageKey(apiUrl, userKey))\n window.localStorage.removeItem(legacyWorkspaceStorageKey(apiUrl))\n } catch {\n // Storage unavailable (private mode, SSR) — selection stays in-memory only.\n }\n}\n\n/** Shown on the sign-in screen after the session could not be recovered. */\nexport const SESSION_EXPIRED_MESSAGE = 'Your session expired. Sign in again.'\n\n/** The connection user for a profile: its full name, falling back to the email local part. */\nfunction userFromProfile(profile: LoginProfile, externalId?: string): ArbiUser {\n const fullName = [profile.givenName, profile.familyName]\n .map((part) => part?.trim())\n .filter(Boolean)\n .join(' ')\n return {\n name: fullName || profile.email.split('@')[0],\n email: profile.email,\n externalId,\n picture: profile.picture,\n }\n}\n\n/**\n * The sign-in layer of a blocks-only site, mounted by its host (`defaultHost`): login, demo mode\n * and the selected workspace, over the host's session state (the selected workspace lives there,\n * so every block reads one value). Its account client is the host's `account` below it.\n */\nexport function ConnectionProvider({\n config,\n children,\n}: {\n config: ArbiConnectionConfig\n children: ReactNode\n}) {\n const arbi = useArbi()\n const session = useArbiSessionStore()\n const { switchWorkspace, openSelectedWorkspace, settled } = useSwitchWorkspace()\n const isLiveConfigured = config.apiUrl.length > 0\n const demoWorkspaceId = config.demoWorkspaceId ?? 'demo-workspace'\n\n const [status, setStatus] = useState<ConnectionStatus>(\n isLiveConfigured ? 'connecting' : 'disconnected'\n )\n const [user, setUser] = useState<ArbiUser | null>(null)\n const workspaceId = useArbiSessionState((s) => s.workspaceId)\n const selectWorkspaceId = session.setWorkspaceId\n const [mode, setMode] = useState<ArbiMode>('demo')\n const [error, setError] = useState<string | null>(null)\n // Who the persisted workspace belongs to; set at sign-in, cleared at logout.\n const storageUserRef = useRef<string | null>(null)\n\n // The SDK could not recover the session (token refused, workspace not re-openable): drop to\n // 'disconnected' with a plain message, so the host's gate sends the user to sign in instead of\n // every call failing with a raw backend error. The remembered workspace is kept for next login.\n useEffect(\n () =>\n arbi.onSessionExpired?.(() => {\n storageUserRef.current = null\n setUser(null)\n selectWorkspaceId(null)\n setStatus('disconnected')\n setError(SESSION_EXPIRED_MESSAGE)\n }),\n [arbi, selectWorkspaceId]\n )\n\n // A saved name, picture or email reaches every surface reading `useConnection().user`.\n useEffect(\n () =>\n arbi.user.onProfileChange?.((profile) =>\n setUser((current) => (current ? userFromProfile(profile, current.externalId) : current))\n ),\n [arbi]\n )\n\n const enterDemo = useCallback(() => {\n setMode('demo')\n setStatus('demo')\n setError(null)\n setUser({ name: config.demoUser.name, email: config.demoUser.email })\n selectWorkspaceId(demoWorkspaceId)\n }, [config.demoUser.name, config.demoUser.email, demoWorkspaceId, selectWorkspaceId])\n\n /**\n * The session signed in, by whatever path (`login` below, a sign-in page on the host's `Arbi`,\n * a restored session): open the user's workspace and resolve who they are.\n */\n const completeSignIn = useCallback(\n async (email: string) => {\n setMode('live')\n setStatus('connecting')\n setError(null)\n try {\n storageUserRef.current = normalizeUserKey(email)\n const workspaces = await arbi.workspaces.list()\n if (workspaces?.length) {\n // Prefer the workspace the user last affirmatively selected (persisted),\n // then the configured workspace (there may be several — e.g. a\n // marketing/KM workspace), then whichever happens to be first. Ternary\n // (not `&&`) so an empty value can't leak `\"\"` into `target`.\n const persisted = readPersistedWorkspace(config.apiUrl, storageUserRef.current)\n const preferred = persisted ?? config.workspaceId\n const target =\n (preferred ? workspaces.find((w) => w.external_id === preferred) : undefined) ??\n workspaces[0]\n selectWorkspaceId(target.external_id)\n if (!(await openSelectedWorkspace()))\n throw new Error('Could not open your workspace. Try signing in again.')\n persistWorkspace(config.apiUrl, storageUserRef.current, target.external_id)\n }\n // The profile (name + avatar) comes with the login response. A session restored without\n // a login has none, so fall back to finding ourselves in the workspace roster; the email\n // local part is only the last resort, never the answer when a profile name exists.\n let resolved: ArbiUser = { name: email.split('@')[0], email }\n const me = arbi.user.identity()\n const profile = arbi.user.profile?.()\n if (profile) {\n resolved = userFromProfile(profile, me?.externalId)\n } else {\n try {\n const members = await arbi.workspaces.listUsers()\n const self = members.find((m) => m.user.external_id === me?.externalId)?.user\n if (self) {\n const fullName = [self.given_name, self.family_name].filter(Boolean).join(' ').trim()\n resolved = {\n name: fullName || email.split('@')[0],\n email: self.email || email,\n externalId: self.external_id,\n picture: self.picture ?? null,\n }\n } else if (me?.externalId) {\n resolved.externalId = me.externalId\n }\n } catch {\n // Roster not available (e.g. no workspace) — keep the fallback identity.\n }\n }\n setUser(resolved)\n setStatus('authenticated')\n } catch (e) {\n // Surface the real error — no silent fallback to a fake session.\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, config.workspaceId, config.apiUrl, selectWorkspaceId, openSelectedWorkspace]\n )\n\n // Every sign-in on the host's `Arbi` lands here, whichever page or kit made it.\n const signingIn = useRef<Promise<void>>(Promise.resolve())\n useEffect(\n () =>\n arbi.onSignedIn?.((login) => {\n signingIn.current = completeSignIn(\n login.profile?.email ??\n arbi.session?.getState().userEmail ??\n arbi.user.identity()?.email ??\n ''\n )\n }),\n [arbi, completeSignIn]\n )\n\n /** Authenticate: a live login when a backend is configured, otherwise the demo workspace. */\n const login = useCallback(\n async (email: string, password: string) => {\n setError(null)\n if (!isLiveConfigured) {\n enterDemo()\n return\n }\n setStatus('connecting')\n setMode('live')\n try {\n // Signed in: `completeSignIn` follows (onSignedIn); done once it is.\n await arbi.login(email, password)\n await signingIn.current\n } catch (e) {\n setError(e instanceof Error ? e.message : 'Sign-in failed. Check your credentials.')\n setStatus('error')\n }\n },\n [arbi, enterDemo, isLiveConfigured]\n )\n\n // The session kept on this device signs in again (no password; the key stays encrypted on the\n // device). Run once even under StrictMode.\n const restoreStarted = useRef(false)\n useEffect(() => {\n if (restoreStarted.current || !isLiveConfigured) return\n restoreStarted.current = true\n arbi\n .restore()\n .catch(() => false)\n .then(async (restored) => {\n if (restored) await signingIn.current\n else setStatus('disconnected')\n })\n }, [arbi, isLiveConfigured])\n\n const logout = useCallback(() => {\n if (mode === 'live') {\n void arbi.logout?.()\n }\n // What was typed never outlives the session (it is sealed, but kept for no one now).\n clearSealedDrafts()\n setUser(null)\n selectWorkspaceId(null)\n persistWorkspace(config.apiUrl, storageUserRef.current, null)\n storageUserRef.current = null\n setStatus('disconnected')\n setError(null)\n }, [arbi, mode, config.apiUrl, selectWorkspaceId])\n\n // Affirmative selection: the shared workspace switch (live), then remember it so the next\n // login lands there too. This provider IS the host's navigation, so it alone (with sign-in and\n // ensureWorkspaceOpen, which re-open the host's own selection) changes the workspace; kits reach\n // another workspace with `arbi.workspaces.open`.\n const setWorkspace = useCallback(\n async (id: string) => {\n if (mode === 'live' && arbi.isLoggedIn) {\n if (!(await switchWorkspace({ id }))) throw new Error('Could not open the workspace')\n } else {\n selectWorkspaceId(id)\n }\n persistWorkspace(config.apiUrl, storageUserRef.current, id)\n },\n [arbi, mode, config.apiUrl, selectWorkspaceId, switchWorkspace]\n )\n\n // Re-open the selected workspace on the session if the server may have dropped it. Idempotent.\n // A switch in flight is waited out first, then only the selection as of then is opened (none:\n // nothing). Never a remembered or configured workspace: kits call this before reading, and\n // opening another workspace than the selected one would leave the server session in it.\n const ensureWorkspaceOpen = useCallback(async () => {\n if (mode !== 'live' || !arbi.isLoggedIn) return\n await settled()\n if (!session.getState().workspaceId) return\n await openSelectedWorkspace()\n }, [arbi, session, mode, settled, openSelectedWorkspace])\n\n const value = useMemo<ConnectionValue>(\n () => ({\n mode,\n status,\n user,\n workspaceId,\n apiConfigured: isLiveConfigured,\n apiUrl: config.apiUrl,\n deploymentDomain: isLiveConfigured ? arbi.getDeploymentDomain() : undefined,\n error,\n assistantConfig: config.assistantConfig,\n fallbackWorkspaceId: mode === 'live' ? undefined : config.workspaceId,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n }),\n [\n mode,\n status,\n user,\n workspaceId,\n isLiveConfigured,\n config.apiUrl,\n arbi,\n config.assistantConfig,\n config.workspaceId,\n error,\n login,\n enterDemo,\n logout,\n setWorkspace,\n ensureWorkspaceOpen,\n ]\n )\n\n const account = useConnectionAccount(arbi, user, logout)\n const authenticated = status === 'authenticated'\n const host = useMemo(\n () => ({ account: { client: account, useEnabled: () => authenticated } }),\n [account, authenticated]\n )\n\n return (\n <ConnectionContext.Provider value={value}>\n <ArbiHost config={host}>{children}</ArbiHost>\n </ConnectionContext.Provider>\n )\n}\n\n/**\n * The account client of the settings blocks below: the SDK's, with sign-out going through this\n * connection (so its state is cleared too) and, for a session restored without a login (no SDK\n * profile), the connection user as the profile.\n */\nfunction useConnectionAccount(\n arbi: ReturnType<typeof useArbi>,\n user: ArbiUser | null,\n logout: () => void\n): AccountClient {\n const userRef = useRef(user)\n const logoutRef = useRef(logout)\n logoutRef.current = logout\n const listeners = useRef(new Set<() => void>())\n useEffect(() => {\n userRef.current = user\n listeners.current.forEach((listener) => listener())\n }, [user])\n return useMemo(() => {\n const base = arbiAccountClient(arbi)\n return {\n ...base,\n profile: (): ProfileView | null => {\n const own = base.profile()\n const fallback = userRef.current\n if (own || !fallback) return own\n return {\n ...toProfileView({\n givenName: '',\n familyName: null,\n picture: fallback.picture ?? null,\n email: fallback.email,\n isSso: false,\n }),\n fullName: fallback.name,\n }\n },\n onProfileChange: (listener) => {\n listeners.current.add(listener)\n const off = base.onProfileChange(listener)\n return () => {\n listeners.current.delete(listener)\n off()\n }\n },\n signOut: async ({ everywhere } = {}) => {\n try {\n if (everywhere) await arbi.sessions.logoutAll()\n } finally {\n logoutRef.current()\n }\n },\n }\n }, [arbi])\n}\n\nexport function useConnection(): ConnectionValue {\n const ctx = useContext(ConnectionContext)\n if (!ctx) throw new Error('useConnection needs the sign-in layer of `defaultHost` above it')\n return ctx\n}\n\nexport const isAuthenticated = (s: ConnectionStatus) => s === 'demo' || s === 'authenticated'\n\n/** The open workspace as the connected kits see it, whoever hosts them. */\nexport interface ConnectedWorkspace {\n /** The selected workspace (the session state's; with a connection, else its fallback). */\n workspaceId: string | null\n /** Signed in to a live backend: workspace-scoped queries may run. */\n live: boolean\n /** The signed-in user (their name and email, e.g. to sign a document). */\n user: ArbiUser | null\n /** The signed-in user's external id. */\n userId: string | undefined\n /** Re-assert the workspace on the server session before a workspace-scoped write. */\n ensureWorkspaceOpen: () => Promise<void>\n /**\n * Go into a workspace: select it (with a connection) and show it (`BlocksEnvironment.\n * openWorkspace`, where a host without a connection also switches its session).\n */\n openWorkspace: (workspaceId: string, options?: { name?: string }) => Promise<void>\n}\n\nconst keptOpenByHost = async () => {}\n\n/** The signed-in user of a host's own session, from its login profile. */\nfunction sessionUser(arbi: ReturnType<typeof useArbi>): ArbiUser | null {\n if (!arbi.isLoggedIn) return null\n const me = arbi.user.identity()\n const profile = arbi.user.profile()\n if (!me) return null\n return profile\n ? userFromProfile(profile, me.externalId)\n : { name: (me.email ?? '').split('@')[0], email: me.email ?? '', externalId: me.externalId }\n}\n\n/**\n * The workspace for a connected kit: the sign-in layer's (`defaultHost`) when there is one, else the\n * host's own session (an app whose host config has its `arbi` and `session` and keeps its\n * workspace open itself). So a kit runs the same in Clarum and in the ARBI app.\n */\nexport function useConnectedWorkspace(): ConnectedWorkspace {\n const connection = useContext(ConnectionContext)\n const arbi = useArbi()\n const sessionWorkspaceId = useArbiSessionState((s) => s.workspaceId)\n const live = connection ? connection.status === 'authenticated' : arbi.isLoggedIn\n const user = connection ? connection.user : live ? sessionUser(arbi) : null\n const userKey = `${user?.externalId ?? ''}|${user?.name ?? ''}|${user?.email ?? ''}`\n const { openWorkspace: showWorkspace } = useBlocksEnvironment()\n return useMemo(\n () => ({\n workspaceId: connection\n ? (connection.workspaceId ?? connection.fallbackWorkspaceId ?? null)\n : sessionWorkspaceId,\n live,\n user,\n userId: user?.externalId,\n ensureWorkspaceOpen: connection?.ensureWorkspaceOpen ?? keptOpenByHost,\n openWorkspace: async (workspaceId: string, options?: { name?: string }) => {\n if (connection) await connection.setWorkspace(workspaceId)\n showWorkspace(workspaceId, options)\n },\n }),\n // `user` is rebuilt each render without a connection: its key says when it changed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [connection, sessionWorkspaceId, live, userKey, showWorkspace]\n )\n}\n"]}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
var chunkCNHLPFFK_cjs = require('./chunk-CNHLPFFK.cjs');
|
|
5
5
|
var chunkPPCATBOY_cjs = require('./chunk-PPCATBOY.cjs');
|
|
6
|
-
var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
|
|
7
6
|
var chunkKDG6FER6_cjs = require('./chunk-KDG6FER6.cjs');
|
|
7
|
+
var chunkMHVNT4J3_cjs = require('./chunk-MHVNT4J3.cjs');
|
|
8
8
|
var lucideReact = require('lucide-react');
|
|
9
9
|
var ui = require('@arbidocs/react/ui');
|
|
10
10
|
var jsxRuntime = require('react/jsx-runtime');
|
|
@@ -516,5 +516,5 @@ exports.SectionHeader = SectionHeader;
|
|
|
516
516
|
exports.SectionLabel = SectionLabel;
|
|
517
517
|
exports.StartTiles = StartTiles;
|
|
518
518
|
exports.useScopeSelection = useScopeSelection;
|
|
519
|
-
//# sourceMappingURL=chunk-
|
|
520
|
-
//# sourceMappingURL=chunk-
|
|
519
|
+
//# sourceMappingURL=chunk-UIZZFZ5Z.cjs.map
|
|
520
|
+
//# sourceMappingURL=chunk-UIZZFZ5Z.cjs.map
|