@portablecore/chat 0.2.14 → 0.2.16
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/chat-interface-core.d.ts.map +1 -1
- package/dist/chat-interface-core.js +30 -1
- package/dist/chat-interface-core.js.map +1 -1
- package/dist/components/focus-mode-control.d.ts +13 -0
- package/dist/components/focus-mode-control.d.ts.map +1 -0
- package/dist/components/focus-mode-control.js +16 -0
- package/dist/components/focus-mode-control.js.map +1 -0
- package/dist/components/message-bubble.d.ts +6 -0
- package/dist/components/message-bubble.d.ts.map +1 -1
- package/dist/components/message-bubble.js +12 -3
- package/dist/components/message-bubble.js.map +1 -1
- package/dist/components/message-list.d.ts +16 -2
- package/dist/components/message-list.d.ts.map +1 -1
- package/dist/components/message-list.js +35 -6
- package/dist/components/message-list.js.map +1 -1
- package/dist/hooks/use-chat-scroll.d.ts +4 -1
- package/dist/hooks/use-chat-scroll.d.ts.map +1 -1
- package/dist/hooks/use-chat-scroll.js +57 -24
- package/dist/hooks/use-chat-scroll.js.map +1 -1
- package/dist/hooks/use-focus-mode.d.ts +29 -0
- package/dist/hooks/use-focus-mode.d.ts.map +1 -0
- package/dist/hooks/use-focus-mode.js +81 -0
- package/dist/hooks/use-focus-mode.js.map +1 -0
- package/dist/hooks/use-virtual-messages.d.ts +21 -0
- package/dist/hooks/use-virtual-messages.d.ts.map +1 -0
- package/dist/hooks/use-virtual-messages.js +65 -0
- package/dist/hooks/use-virtual-messages.js.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +12 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-interface-core.d.ts","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chat-interface-core.d.ts","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAa,MAAM,YAAY,CAAA;AAmBhE,UAAU,sBAAsB;IAC9B,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACzC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,kBAAkB,GACnB,EAAE,sBAAsB,2CAyPxB"}
|
|
@@ -9,6 +9,9 @@ const use_chat_scroll_js_1 = require("./hooks/use-chat-scroll.js");
|
|
|
9
9
|
const use_attachments_js_1 = require("./hooks/use-attachments.js");
|
|
10
10
|
const use_whisper_mode_js_1 = require("./hooks/use-whisper-mode.js");
|
|
11
11
|
const use_thread_filter_js_1 = require("./hooks/use-thread-filter.js");
|
|
12
|
+
const use_focus_mode_js_1 = require("./hooks/use-focus-mode.js");
|
|
13
|
+
const use_virtual_messages_js_1 = require("./hooks/use-virtual-messages.js");
|
|
14
|
+
const message_grouping_js_1 = require("./utils/message-grouping.js");
|
|
12
15
|
const message_list_js_1 = require("./components/message-list.js");
|
|
13
16
|
const input_area_js_1 = require("./components/input-area.js");
|
|
14
17
|
const bouncing_dots_js_1 = require("./components/bouncing-dots.js");
|
|
@@ -16,6 +19,7 @@ const thinking_indicator_js_1 = require("./components/thinking-indicator.js");
|
|
|
16
19
|
const skill_indicator_js_1 = require("./components/skill-indicator.js");
|
|
17
20
|
const empty_state_js_1 = require("./components/empty-state.js");
|
|
18
21
|
const thread_filter_header_js_1 = require("./components/thread-filter-header.js");
|
|
22
|
+
const focus_mode_control_js_1 = require("./components/focus-mode-control.js");
|
|
19
23
|
/**
|
|
20
24
|
* ChatInterfaceCore — The unified chat experience.
|
|
21
25
|
*
|
|
@@ -43,12 +47,37 @@ function ChatInterfaceCore({ config, markdownComponents, }) {
|
|
|
43
47
|
selectedThreadId,
|
|
44
48
|
onMessageCountChange: onThreadMessageCountChange,
|
|
45
49
|
});
|
|
50
|
+
const focusModeConfig = config.focusMode;
|
|
51
|
+
const focusMode = (0, use_focus_mode_js_1.useFocusMode)({
|
|
52
|
+
messages: threadFilter.filteredMessages,
|
|
53
|
+
enabled: focusModeConfig?.enabled ?? false,
|
|
54
|
+
initialViewMode: focusModeConfig?.initialViewMode,
|
|
55
|
+
currentUserId: config.currentUser.id,
|
|
56
|
+
onViewModeChange: focusModeConfig?.onViewModeChange,
|
|
57
|
+
});
|
|
46
58
|
const displayMessages = threadFilter.filteredMessages;
|
|
59
|
+
// Compute renderableMessages here so it's shared between virtualization and rendering
|
|
60
|
+
const renderableMessages = (0, react_1.useMemo)(() => (0, message_grouping_js_1.groupMessages)(displayMessages), [displayMessages]);
|
|
61
|
+
// measureVersion triggers virtualizer re-measurement on focus mode or thread changes
|
|
62
|
+
const measureVersion = (0, react_1.useMemo)(() => {
|
|
63
|
+
const parts = [focusMode.viewMode, selectedThreadId ?? "all"];
|
|
64
|
+
return parts.join("|");
|
|
65
|
+
}, [focusMode.viewMode, selectedThreadId]);
|
|
66
|
+
// Ref bridge: virtualizer is created after scroll hook, but scroll hook reads it via ref
|
|
67
|
+
const virtualizerRef = (0, react_1.useRef)(null);
|
|
47
68
|
const scroll = (0, use_chat_scroll_js_1.useChatScroll)({
|
|
48
69
|
messages: displayMessages,
|
|
49
70
|
streaming: session.streaming,
|
|
50
71
|
selectedThreadId,
|
|
72
|
+
virtualizerRef,
|
|
73
|
+
});
|
|
74
|
+
const virt = (0, use_virtual_messages_js_1.useVirtualMessages)({
|
|
75
|
+
renderableMessages,
|
|
76
|
+
scrollRef: scroll.scrollRef,
|
|
77
|
+
measureVersion: measureVersion.length,
|
|
51
78
|
});
|
|
79
|
+
// Keep the ref in sync (effects/callbacks in useChatScroll read this)
|
|
80
|
+
virtualizerRef.current = virt.active ? virt.virtualizer : null;
|
|
52
81
|
const attachmentState = (0, use_attachments_js_1.useAttachments)(config.resolvers?.documentResolver);
|
|
53
82
|
const slots = (config.slots || {});
|
|
54
83
|
const variant = config.variant || "full";
|
|
@@ -131,7 +160,7 @@ function ChatInterfaceCore({ config, markdownComponents, }) {
|
|
|
131
160
|
}
|
|
132
161
|
return ((0, jsx_runtime_1.jsx)("div", { className: `${indicatorMaxWidth} mx-auto px-4`, children: (0, jsx_runtime_1.jsx)(bouncing_dots_js_1.BouncingDots, { expertName: config.expert?.name, expertAvatarUrl: config.expert?.avatarUrl, expertEmoji: config.expert?.emoji }) }));
|
|
133
162
|
};
|
|
134
|
-
return ((0, jsx_runtime_1.jsxs)("div", { className: rootClasses, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 min-w-0", children: [threadsEnabled && threadFilter.isFiltered && threadConfig?.selectedTitle && threadConfig.onClear && ((0, jsx_runtime_1.jsx)(thread_filter_header_js_1.ThreadFilterHeader, { threadTitle: threadConfig.selectedTitle, messageCount: displayMessages.length, onClear: threadConfig.onClear })), (0, jsx_runtime_1.jsx)(message_list_js_1.MessageList, { messages: displayMessages, streaming: session.streaming, config: config, markdownComponents: markdownComponents, scrollRef: scroll.scrollRef, emptyState: slots.emptyState || ((0, jsx_runtime_1.jsx)(empty_state_js_1.EmptyState, { expertName: config.expert?.name })), beforeMessageList: slots.beforeMessageList, afterMessageList: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [renderIndicator(), slots.afterMessageList] }) }), (0, jsx_runtime_1.jsx)(input_area_js_1.InputArea, { onSend: handleSend, onAbort: session.abort, streaming: session.streaming, sending: session.sending, placeholder: config.expert
|
|
163
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: rootClasses, children: [(0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col flex-1 min-w-0", children: [threadsEnabled && threadFilter.isFiltered && threadConfig?.selectedTitle && threadConfig.onClear && ((0, jsx_runtime_1.jsx)(thread_filter_header_js_1.ThreadFilterHeader, { threadTitle: threadConfig.selectedTitle, messageCount: displayMessages.length, onClear: threadConfig.onClear })), (0, jsx_runtime_1.jsxs)("div", { className: "relative flex-1 flex flex-col min-h-0", children: [(0, jsx_runtime_1.jsx)(message_list_js_1.MessageList, { messages: displayMessages, renderableMessages: renderableMessages, streaming: session.streaming, config: config, markdownComponents: markdownComponents, scrollRef: scroll.scrollRef, virt: virt, emptyState: slots.emptyState || ((0, jsx_runtime_1.jsx)(empty_state_js_1.EmptyState, { expertName: config.expert?.name })), beforeMessageList: slots.beforeMessageList, afterMessageList: (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [renderIndicator(), slots.afterMessageList] }), shouldShowShort: focusMode.enabled ? focusMode.shouldShowShort : undefined, focusModeEnabled: focusMode.enabled, onToggleExpanded: focusMode.enabled ? focusMode.toggleExpanded : undefined }), focusMode.enabled && displayMessages.length > 0 && ((0, jsx_runtime_1.jsx)(focus_mode_control_js_1.FocusModeControl, { viewMode: focusMode.viewMode, onSetViewMode: focusMode.setViewMode }))] }), (0, jsx_runtime_1.jsx)(input_area_js_1.InputArea, { onSend: handleSend, onAbort: session.abort, streaming: session.streaming, sending: session.sending, placeholder: config.expert
|
|
135
164
|
? `Message ${config.expert.name}...`
|
|
136
165
|
: "Send a message...", prefillText: config.prefillText, inputPrefix: slots.inputPrefix, inputSuffix: slots.inputSuffix, attachments: attachmentState.attachments, uploading: attachmentState.uploading, onAddFiles: attachmentState.addFiles, onRemoveAttachment: attachmentState.remove, hasDocumentResolver: !!config.resolvers?.documentResolver, variant: variant, classNames: config.classNames, mentionResolver: config.resolvers?.mentionResolver, skillResolver: config.resolvers?.skillResolver, whisper: whisperInputProps })] }), slots.sidePanel && ((0, jsx_runtime_1.jsx)("div", { className: "w-80 border-l border-border overflow-y-auto", children: slots.sidePanel }))] }));
|
|
137
166
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-interface-core.js","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;
|
|
1
|
+
{"version":3,"file":"chat-interface-core.js","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AA0CZ,8CA4PC;;AApSD,iCAAoE;AAGpE,qEAA4D;AAC5D,mEAA0D;AAC1D,mEAA2D;AAC3D,qEAA4D;AAC5D,uEAA8D;AAC9D,iEAAwD;AACxD,6EAAoE;AACpE,qEAA2D;AAE3D,kEAA0D;AAC1D,8DAA8E;AAC9E,oEAA4D;AAC5D,8EAAsE;AACtE,wEAAgE;AAChE,gEAAwD;AACxD,kFAAyE;AACzE,8EAAqE;AAQrE;;;;;;;;;;;;GAYG;AACH,SAAgB,iBAAiB,CAAC,EAChC,MAAM,EACN,kBAAkB,GACK;IACvB,MAAM,OAAO,GAAG,IAAA,oCAAc,EAAC,MAAM,CAAC,CAAA;IACtC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAA;IAClC,MAAM,gBAAgB,GAAG,YAAY,EAAE,UAAU,IAAI,IAAI,CAAA;IAEzD,MAAM,0BAA0B,GAAG,IAAA,mBAAW,EAC5C,CAAC,QAAgB,EAAE,KAAa,EAAE,EAAE;QAClC,YAAY,EAAE,oBAAoB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;IACvD,CAAC;IACD,uDAAuD;IACvD,CAAC,YAAY,EAAE,oBAAoB,CAAC,CACrC,CAAA;IAED,MAAM,YAAY,GAAG,IAAA,sCAAe,EAAC;QACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB;QAChB,oBAAoB,EAAE,0BAA0B;KACjD,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,MAAM,CAAC,SAAS,CAAA;IACxC,MAAM,SAAS,GAAG,IAAA,gCAAY,EAAC;QAC7B,QAAQ,EAAE,YAAY,CAAC,gBAAgB;QACvC,OAAO,EAAE,eAAe,EAAE,OAAO,IAAI,KAAK;QAC1C,eAAe,EAAE,eAAe,EAAE,eAAe;QACjD,aAAa,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE;QACpC,gBAAgB,EAAE,eAAe,EAAE,gBAAgB;KACpD,CAAC,CAAA;IAEF,MAAM,eAAe,GAAG,YAAY,CAAC,gBAAgB,CAAA;IAErD,sFAAsF;IACtF,MAAM,kBAAkB,GAAG,IAAA,eAAO,EAChC,GAAG,EAAE,CAAC,IAAA,mCAAa,EAAC,eAAe,CAAC,EACpC,CAAC,eAAe,CAAC,CAClB,CAAA;IAED,qFAAqF;IACrF,MAAM,cAAc,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAClC,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,IAAI,KAAK,CAAC,CAAA;QAC7D,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAA;IAE1C,yFAAyF;IACzF,MAAM,cAAc,GAAG,IAAA,cAAM,EAA8C,IAAI,CAAC,CAAA;IAEhF,MAAM,MAAM,GAAG,IAAA,kCAAa,EAAC;QAC3B,QAAQ,EAAE,eAAe;QACzB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,gBAAgB;QAChB,cAAc;KACf,CAAC,CAAA;IAEF,MAAM,IAAI,GAAG,IAAA,4CAAkB,EAAC;QAC9B,kBAAkB;QAClB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,cAAc,EAAE,cAAc,CAAC,MAAM;KACtC,CAAC,CAAA;IAEF,sEAAsE;IACtE,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAA;IAE9D,MAAM,eAAe,GAAG,IAAA,mCAAc,EAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAA;IAC1E,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAc,CAAA;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAA;IACxC,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,CAAA;IACvC,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAA;IACzD,MAAM,cAAc,GAAG,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;IAExD,uDAAuD;IACvD,MAAM,iBAAiB,GAAuB,IAAA,eAAO,EAAC,GAAG,EAAE;QACzD,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,CAAA;QAC9B,MAAM,MAAM,GAAuB,EAAE,CAAA;QACrC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;oBACtB,KAAK,EAAE,CAAC,CAAC,KAAK;iBACf,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACV,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE;gBACpB,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;gBACxB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS;gBAClC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;aAC3B,CAAC,CAAA;QACJ,CAAC;QACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAC7B,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,SAAS,EAAE,CAAC,CAAC,SAAS;iBACvB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAEjE,MAAM,OAAO,GAAG,IAAA,oCAAc,EAAC,iBAAiB,CAAC,CAAA;IAEjD,MAAM,UAAU,GAAG,CAAC,OAAe,EAAE,EAAE;QACrC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE;gBACpB,WAAW,EAAE,SAAS;gBACtB,mBAAmB,EAAE,OAAO,CAAC,WAAW;aACzC,CAAC,CAAA;QACJ,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACvB,CAAC;QACD,eAAe,CAAC,KAAK,EAAE,CAAA;IACzB,CAAC,CAAA;IAED,MAAM,iBAAiB,GACrB,cAAc,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC;QAC5C,CAAC,CAAC;YACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,UAAU,EAAE,iBAAiB;YAC7B,QAAQ,EAAE,OAAO,CAAC,YAAY;YAC9B,YAAY,EAAE,OAAO,CAAC,UAAU;YAChC,aAAa,EAAE,OAAO,CAAC,WAAW;YAClC,SAAS,EAAE,OAAO,CAAC,QAAQ;YAC3B,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B;QACH,CAAC,CAAC,SAAS,CAAA;IAEf,MAAM,iBAAiB,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAA;IAC/D,MAAM,WAAW,GAAG,eAAe,MAAM,CAAC,UAAU,EAAE,IAAI,IAAI,EAAE,EAAE,CAAA;IAElE,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,CAAC,OAAO,CAAC,YAAY;YAAE,OAAO,IAAI,CAAA;QAEtC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CACL,gCAAK,SAAS,EAAE,GAAG,iBAAiB,eAAe,YACjD,uBAAC,mCAAc,IAAC,KAAK,EAAE,OAAO,CAAC,WAAW,GAAI,GAC1C,CACP,CAAA;QACH,CAAC;QAED,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,OAAO,CACL,gCAAK,SAAS,EAAE,GAAG,iBAAiB,eAAe,YACjD,uBAAC,yCAAiB,IAChB,MAAM,EAAE,OAAO,CAAC,cAAc,EAC9B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,GACzC,GACE,CACP,CAAA;QACH,CAAC;QAED,OAAO,CACL,gCAAK,SAAS,EAAE,GAAG,iBAAiB,eAAe,YACjD,uBAAC,+BAAY,IACX,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,EAC/B,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EACzC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GACjC,GACE,CACP,CAAA;IACH,CAAC,CAAA;IAED,OAAO,CACL,iCAAK,SAAS,EAAE,WAAW,aACzB,iCAAK,SAAS,EAAC,8BAA8B,aAE1C,cAAc,IAAI,YAAY,CAAC,UAAU,IAAI,YAAY,EAAE,aAAa,IAAI,YAAY,CAAC,OAAO,IAAI,CACnG,uBAAC,4CAAkB,IACjB,WAAW,EAAE,YAAY,CAAC,aAAa,EACvC,YAAY,EAAE,eAAe,CAAC,MAAM,EACpC,OAAO,EAAE,YAAY,CAAC,OAAO,GAC7B,CACH,EAED,iCAAK,SAAS,EAAC,uCAAuC,aACpD,uBAAC,6BAAW,IACV,QAAQ,EAAE,eAAe,EACzB,kBAAkB,EAAE,kBAAkB,EACtC,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,SAAS,EAAE,MAAM,CAAC,SAAS,EAC3B,IAAI,EAAE,IAAI,EACV,UAAU,EACP,KAAK,CAAC,UAAwB,IAAI,CACjC,uBAAC,2BAAU,IAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,GAAI,CAChD,EAEH,iBAAiB,EAAE,KAAK,CAAC,iBAA8B,EACvD,gBAAgB,EACd,6DACG,eAAe,EAAE,EACjB,KAAK,CAAC,gBAA6B,IACnC,EAEL,eAAe,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS,EAC1E,gBAAgB,EAAE,SAAS,CAAC,OAAO,EACnC,gBAAgB,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,GAC1E,EAED,SAAS,CAAC,OAAO,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAClD,uBAAC,wCAAgB,IACf,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAC5B,aAAa,EAAE,SAAS,CAAC,WAAW,GACpC,CACH,IACG,EAEN,uBAAC,yBAAS,IACR,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,OAAO,CAAC,KAAK,EACtB,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,WAAW,EACT,MAAM,CAAC,MAAM;4BACX,CAAC,CAAC,WAAW,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK;4BACpC,CAAC,CAAC,mBAAmB,EAEzB,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,WAAW,EAAE,KAAK,CAAC,WAAwB,EAC3C,WAAW,EAAE,KAAK,CAAC,WAAwB,EAC3C,WAAW,EAAE,eAAe,CAAC,WAAW,EACxC,SAAS,EAAE,eAAe,CAAC,SAAS,EACpC,UAAU,EAAE,eAAe,CAAC,QAAQ,EACpC,kBAAkB,EAAE,eAAe,CAAC,MAAM,EAC1C,mBAAmB,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,gBAAgB,EACzD,OAAO,EAAE,OAAO,EAChB,UAAU,EAAE,MAAM,CAAC,UAAU,EAC7B,eAAe,EAAE,MAAM,CAAC,SAAS,EAAE,eAAe,EAClD,aAAa,EAAE,MAAM,CAAC,SAAS,EAAE,aAAa,EAC9C,OAAO,EAAE,iBAAiB,GAC1B,IACE,EAEL,KAAK,CAAC,SAAS,IAAI,CAClB,gCAAK,SAAS,EAAC,6CAA6C,YACzD,KAAK,CAAC,SAAsB,GACzB,CACP,IACG,CACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MessageViewMode } from "@portablecore/types/chat";
|
|
2
|
+
interface FocusModeControlProps {
|
|
3
|
+
viewMode: MessageViewMode;
|
|
4
|
+
onSetViewMode: (mode: MessageViewMode) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Segmented control for Focus Mode: Long / Short / Focus.
|
|
8
|
+
* Positioned at bottom-left of the chat area.
|
|
9
|
+
* Faithfully reproduces the legacy ChatInterface segmented control.
|
|
10
|
+
*/
|
|
11
|
+
export declare function FocusModeControl({ viewMode, onSetViewMode, }: FocusModeControlProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=focus-mode-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-mode-control.d.ts","sourceRoot":"","sources":["../../src/components/focus-mode-control.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE/D,UAAU,qBAAqB;IAC7B,QAAQ,EAAE,eAAe,CAAA;IACzB,aAAa,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;CAC/C;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,aAAa,GACd,EAAE,qBAAqB,2CAkEvB"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.FocusModeControl = FocusModeControl;
|
|
5
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
+
/**
|
|
7
|
+
* Segmented control for Focus Mode: Long / Short / Focus.
|
|
8
|
+
* Positioned at bottom-left of the chat area.
|
|
9
|
+
* Faithfully reproduces the legacy ChatInterface segmented control.
|
|
10
|
+
*/
|
|
11
|
+
function FocusModeControl({ viewMode, onSetViewMode, }) {
|
|
12
|
+
const activeClasses = "bg-blue-100 dark:bg-blue-900/50 text-blue-600 dark:text-blue-400";
|
|
13
|
+
const inactiveClasses = "text-slate-400 dark:text-slate-500 hover:text-slate-600 dark:hover:text-slate-300 hover:bg-slate-100 dark:hover:bg-slate-700";
|
|
14
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: "absolute bottom-4 left-4 sm:left-6 z-10", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center bg-white dark:bg-slate-800 rounded-lg shadow-md border border-slate-200 dark:border-slate-700 p-0.5", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => onSetViewMode("long"), className: `p-1.5 rounded-md transition-all ${viewMode === "long" ? activeClasses : inactiveClasses}`, title: "Long: All expanded", children: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", className: "w-4 h-4", children: (0, jsx_runtime_1.jsx)("path", { d: "M2 4.75A.75.75 0 012.75 4h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 4.75zm0 10.5a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75a.75.75 0 01-.75-.75zM2 10a.75.75 0 01.75-.75h14.5a.75.75 0 010 1.5H2.75A.75.75 0 012 10z" }) }) }), (0, jsx_runtime_1.jsx)("button", { onClick: () => onSetViewMode("short"), className: `p-1.5 rounded-md transition-all ${viewMode === "short" ? activeClasses : inactiveClasses}`, title: "Short: All compressed", children: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", className: "w-4 h-4", children: (0, jsx_runtime_1.jsx)("path", { d: "M5.75 4a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zm0 10.5a.75.75 0 000 1.5h8.5a.75.75 0 000-1.5h-8.5zM5 10a.75.75 0 01.75-.75h8.5a.75.75 0 010 1.5h-8.5A.75.75 0 015 10z" }) }) }), (0, jsx_runtime_1.jsx)("button", { onClick: () => onSetViewMode("focus"), className: `p-1.5 rounded-md transition-all ${viewMode === "focus" ? activeClasses : inactiveClasses}`, title: "Focus: Your threads expanded", children: (0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", className: "w-4 h-4", children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", d: "M10 18a8 8 0 100-16 8 8 0 000 16zm0-2a6 6 0 100-12 6 6 0 000 12zm0-2a4 4 0 100-8 4 4 0 000 8zm0-2a2 2 0 100-4 2 2 0 000 4z", clipRule: "evenodd" }) }) })] }) }));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=focus-mode-control.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focus-mode-control.js","sourceRoot":"","sources":["../../src/components/focus-mode-control.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;AAcZ,4CAqEC;;AA1ED;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,aAAa,GACS;IACtB,MAAM,aAAa,GACjB,kEAAkE,CAAA;IACpE,MAAM,eAAe,GACnB,8HAA8H,CAAA;IAEhI,OAAO,CACL,gCAAK,SAAS,EAAC,yCAAyC,YACtD,iCAAK,SAAS,EAAC,uHAAuH,aACpI,mCACE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,EACpC,SAAS,EAAE,mCACT,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eACxC,EAAE,EACF,KAAK,EAAC,oBAAoB,YAE1B,gCACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,EACnB,SAAS,EAAC,SAAS,YAEnB,iCAAM,CAAC,EAAC,uNAAuN,GAAG,GAC9N,GACC,EAET,mCACE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EACrC,SAAS,EAAE,mCACT,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eACzC,EAAE,EACF,KAAK,EAAC,uBAAuB,YAE7B,gCACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,EACnB,SAAS,EAAC,SAAS,YAEnB,iCAAM,CAAC,EAAC,2KAA2K,GAAG,GAClL,GACC,EAET,mCACE,OAAO,EAAE,GAAG,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,EACrC,SAAS,EAAE,mCACT,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eACzC,EAAE,EACF,KAAK,EAAC,8BAA8B,YAEpC,gCACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,cAAc,EACnB,SAAS,EAAC,SAAS,YAEnB,iCACE,QAAQ,EAAC,SAAS,EAClB,CAAC,EAAC,4HAA4H,EAC9H,QAAQ,EAAC,SAAS,GAClB,GACE,GACC,IACL,GACF,CACP,CAAA;AACH,CAAC"}
|
|
@@ -6,6 +6,12 @@ interface MessageBubbleProps {
|
|
|
6
6
|
isLastInGroup: boolean;
|
|
7
7
|
config: ChatInterfaceConfig;
|
|
8
8
|
markdownComponents?: Record<string, any>;
|
|
9
|
+
/** When true, render shortContent instead of content */
|
|
10
|
+
showShortContent?: boolean;
|
|
11
|
+
/** Focus mode enabled and message has shortContent */
|
|
12
|
+
focusExpandable?: boolean;
|
|
13
|
+
/** Callback to toggle between short/full content */
|
|
14
|
+
onToggleExpanded?: (messageId: string, currentlyShowingFull: boolean) => void;
|
|
9
15
|
}
|
|
10
16
|
/**
|
|
11
17
|
* A single message bubble. Handles user/assistant roles, markdown rendering,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-bubble.d.ts","sourceRoot":"","sources":["../../src/components/message-bubble.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,0BAA0B,CAAA;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMtD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,WAAW,CAAA;IACpB,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;IACtB,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"message-bubble.d.ts","sourceRoot":"","sources":["../../src/components/message-bubble.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,0BAA0B,CAAA;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAMtD,UAAU,kBAAkB;IAC1B,OAAO,EAAE,WAAW,CAAA;IACpB,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;IACtB,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,wDAAwD;IACxD,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,sDAAsD;IACtD,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,oDAAoD;IACpD,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9E;AA8CD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,0DA8VxB,CAAA"}
|
|
@@ -57,7 +57,7 @@ function getBubbleTypeClasses(messageType, role, isInboxItem, approvalStatus) {
|
|
|
57
57
|
* - "full" (default): Corner-positioned avatars, hover-only timestamps, Expert aesthetic
|
|
58
58
|
* - "compact": Inline avatars, always-visible timestamps, drawer/lite aesthetic
|
|
59
59
|
*/
|
|
60
|
-
exports.MessageBubble = (0, react_1.memo)(function MessageBubble({ message, isFirstInGroup, isLastInGroup, config, markdownComponents, }) {
|
|
60
|
+
exports.MessageBubble = (0, react_1.memo)(function MessageBubble({ message, isFirstInGroup, isLastInGroup, config, markdownComponents, showShortContent = false, focusExpandable = false, onToggleExpanded, }) {
|
|
61
61
|
const isUser = message.role === "user";
|
|
62
62
|
const isStreaming = message.streaming === true;
|
|
63
63
|
const variant = config.variant || "full";
|
|
@@ -118,8 +118,17 @@ exports.MessageBubble = (0, react_1.memo)(function MessageBubble({ message, isFi
|
|
|
118
118
|
const bubbleTypeClasses = getBubbleTypeClasses(message.messageType, message.role, message.isInboxItem, message.approvalStatus);
|
|
119
119
|
const classNameOverride = config.classNames?.bubble || "";
|
|
120
120
|
const mergedComponents = (0, react_1.useMemo)(() => ({ ...markdown_config_js_1.defaultMarkdownComponents, ...markdownComponents }), [markdownComponents]);
|
|
121
|
+
const hasShortContent = message.role === "assistant" && !!message.shortContent;
|
|
122
|
+
const isShowingFull = hasShortContent && !showShortContent;
|
|
123
|
+
const displayContent = showShortContent && message.shortContent
|
|
124
|
+
? message.shortContent
|
|
125
|
+
: message.content;
|
|
121
126
|
// Whisper header element (eye-off icon + label)
|
|
122
127
|
const whisperHeader = isWhisper ? ((0, jsx_runtime_1.jsxs)("div", { className: "mb-2 flex items-center gap-2", children: [(0, jsx_runtime_1.jsxs)("svg", { xmlns: "http://www.w3.org/2000/svg", width: "12", height: "12", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "text-slate-400 dark:text-slate-500 flex-shrink-0", children: [(0, jsx_runtime_1.jsx)("path", { d: "M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94" }), (0, jsx_runtime_1.jsx)("path", { d: "M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19" }), (0, jsx_runtime_1.jsx)("line", { x1: "1", y1: "1", x2: "23", y2: "23" }), (0, jsx_runtime_1.jsx)("path", { d: "M14.12 14.12a3 3 0 1 1-4.24-4.24" })] }), (0, jsx_runtime_1.jsx)("span", { className: "text-[11px] font-semibold uppercase tracking-wide text-slate-400 dark:text-slate-500", children: "Whisper" }), (0, jsx_runtime_1.jsx)("span", { className: "text-[10px] text-slate-400/60 dark:text-slate-500/60 ml-auto", children: isUser ? "Only visible to recipients" : "Only visible to you" })] })) : null;
|
|
128
|
+
const expandCollapseButton = focusExpandable && hasShortContent && onToggleExpanded ? ((0, jsx_runtime_1.jsx)("button", { onClick: (e) => {
|
|
129
|
+
e.stopPropagation();
|
|
130
|
+
onToggleExpanded(message.id, isShowingFull);
|
|
131
|
+
}, className: "mt-2 text-xs text-slate-400 dark:text-slate-500 hover:text-slate-600 dark:hover:text-slate-300 flex items-center gap-1 transition-colors group", children: isShowingFull ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", fill: "currentColor", className: "w-3 h-3 transition-transform group-hover:-translate-y-0.5", children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", d: "M11.78 9.78a.75.75 0 0 1-1.06 0L8 7.06 5.28 9.78a.75.75 0 0 1-1.06-1.06l3.25-3.25a.75.75 0 0 1 1.06 0l3.25 3.25a.75.75 0 0 1 0 1.06Z", clipRule: "evenodd" }) }), "Show less"] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 16 16", fill: "currentColor", className: "w-3 h-3 transition-transform group-hover:translate-y-0.5", children: (0, jsx_runtime_1.jsx)("path", { fillRule: "evenodd", d: "M4.22 6.22a.75.75 0 0 1 1.06 0L8 8.94l2.72-2.72a.75.75 0 1 1 1.06 1.06l-3.25 3.25a.75.75 0 0 1-1.06 0L4.22 7.28a.75.75 0 0 1 0-1.06Z", clipRule: "evenodd" }) }), "Show more"] })) })) : null;
|
|
123
132
|
// Prose classes per role
|
|
124
133
|
const proseClasses = isUser
|
|
125
134
|
? "prose prose-sm max-w-none text-white prose-headings:text-white prose-strong:text-white prose-em:text-white prose-code:text-blue-100 prose-pre:bg-blue-900/50 prose-pre:border-blue-700 prose-a:text-blue-200 prose-a:underline prose-p:my-2 prose-headings:my-2 prose-ul:my-2 prose-ol:my-2 prose-li:my-0.5 prose-li:text-white prose-pre:my-2"
|
|
@@ -129,11 +138,11 @@ exports.MessageBubble = (0, react_1.memo)(function MessageBubble({ message, isFi
|
|
|
129
138
|
// -------------------------------------------------------------------------
|
|
130
139
|
if (isCompact) {
|
|
131
140
|
return ((0, jsx_runtime_1.jsx)("div", { "data-role": message.role, className: `flex ${isUser ? "justify-end" : "justify-start"} ${isFirstInGroup ? "mt-4" : "mt-0.5"} ${isWhisper ? (isUser ? "mr-4" : "ml-4") : ""}`, children: (0, jsx_runtime_1.jsxs)("div", { className: `flex gap-2.5 max-w-[85%] ${isUser ? "flex-row-reverse" : "flex-row"}`, children: [(0, jsx_runtime_1.jsx)("div", { className: "w-7 h-7 shrink-0", children: isFirstInGroup &&
|
|
132
|
-
(avatarUrl ? ((0, jsx_runtime_1.jsx)("img", { src: avatarUrl, alt: senderName || "", className: "w-7 h-7 rounded-full object-cover" })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-7 h-7 rounded-full bg-muted flex items-center justify-center text-xs font-medium text-muted-foreground", children: (senderName || "?").charAt(0).toUpperCase() }))) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-0.5", children: [isFirstInGroup && senderName && ((0, jsx_runtime_1.jsx)("span", { className: `text-xs font-medium text-muted-foreground ${isUser ? "text-right" : "text-left"}`, children: senderName })), (0, jsx_runtime_1.jsxs)("div", { className: `group relative px-4 py-2.5 rounded-2xl ${bubbleTypeClasses} ${classNameOverride}`, children: [whisperHeader, (0, jsx_runtime_1.jsx)("div", { className: proseClasses, children: isStreaming ? ((0, jsx_runtime_1.jsx)(streaming_text_js_1.StreamingText, { content:
|
|
141
|
+
(avatarUrl ? ((0, jsx_runtime_1.jsx)("img", { src: avatarUrl, alt: senderName || "", className: "w-7 h-7 rounded-full object-cover" })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-7 h-7 rounded-full bg-muted flex items-center justify-center text-xs font-medium text-muted-foreground", children: (senderName || "?").charAt(0).toUpperCase() }))) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-0.5", children: [isFirstInGroup && senderName && ((0, jsx_runtime_1.jsx)("span", { className: `text-xs font-medium text-muted-foreground ${isUser ? "text-right" : "text-left"}`, children: senderName })), (0, jsx_runtime_1.jsxs)("div", { className: `group relative px-4 py-2.5 rounded-2xl ${bubbleTypeClasses} ${classNameOverride}`, children: [whisperHeader, (0, jsx_runtime_1.jsx)("div", { className: proseClasses, children: isStreaming ? ((0, jsx_runtime_1.jsx)(streaming_text_js_1.StreamingText, { content: displayContent, isStreaming: true, markdownComponents: mergedComponents })) : ((0, jsx_runtime_1.jsx)(react_markdown_1.default, { remarkPlugins: markdown_config_js_1.remarkPlugins, rehypePlugins: markdown_config_js_1.rehypePlugins, components: mergedComponents, children: displayContent })) }), expandCollapseButton, (0, jsx_runtime_1.jsx)(message_actions_js_1.MessageActions, { content: displayContent, role: message.role, messageId: message.id, isStreaming: isStreaming })] }), isLastInGroup && timestamp && ((0, jsx_runtime_1.jsx)("span", { className: `text-[10px] text-muted-foreground mt-0.5 ${isUser ? "text-right" : "text-left"}`, children: timestamp }))] })] }) }));
|
|
133
142
|
}
|
|
134
143
|
// -------------------------------------------------------------------------
|
|
135
144
|
// Full variant: corner avatars, hover timestamps, Expert aesthetic
|
|
136
145
|
// -------------------------------------------------------------------------
|
|
137
|
-
return ((0, jsx_runtime_1.jsx)("div", { "data-role": message.role, className: `flex ${isUser ? "justify-end" : "justify-start"} ${isFirstInGroup ? "mt-6" : "mt-0.5"} ${isWhisper ? (isUser ? "mr-8 sm:mr-16" : "ml-8 sm:ml-16") : ""}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "group relative max-w-[85%] sm:max-w-[70%]", children: [isFirstInGroup && !isUser && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-2 -left-2 z-10", children: avatarUrl ? ((0, jsx_runtime_1.jsx)("img", { src: avatarUrl, alt: senderName || "", className: "w-6 h-6 rounded-full object-cover ring-2 ring-slate-100 dark:ring-slate-800 shadow-sm" })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-6 h-6 rounded-full bg-slate-300 dark:bg-slate-600 ring-2 ring-slate-100 dark:ring-slate-800 shadow-sm flex items-center justify-center text-slate-600 dark:text-slate-300 text-xs font-medium", children: (senderName || "?").charAt(0).toUpperCase() })) })), isFirstInGroup && isUser && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-2 -right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity", children: avatarUrl ? ((0, jsx_runtime_1.jsx)("img", { src: avatarUrl, alt: senderName || "", className: "w-6 h-6 rounded-full object-cover ring-2 ring-blue-100 dark:ring-blue-900/50 shadow-sm" })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-6 h-6 rounded-full bg-blue-500 ring-2 ring-blue-100 dark:ring-blue-900/50 shadow-sm flex items-center justify-center text-white text-xs font-medium", children: (senderName || "?").charAt(0).toUpperCase() })) })), (0, jsx_runtime_1.jsxs)("div", { className: `relative rounded-2xl transform-gpu cursor-pointer sm:cursor-default select-none sm:select-text transition-shadow duration-500 px-3 sm:px-4 py-1 sm:py-1.5 ${bubbleTypeClasses} ${classNameOverride}`, children: [whisperHeader, (0, jsx_runtime_1.jsx)("div", { className: proseClasses, children: isStreaming ? ((0, jsx_runtime_1.jsx)(streaming_text_js_1.StreamingText, { content:
|
|
146
|
+
return ((0, jsx_runtime_1.jsx)("div", { "data-role": message.role, className: `flex ${isUser ? "justify-end" : "justify-start"} ${isFirstInGroup ? "mt-6" : "mt-0.5"} ${isWhisper ? (isUser ? "mr-8 sm:mr-16" : "ml-8 sm:ml-16") : ""}`, children: (0, jsx_runtime_1.jsxs)("div", { className: "group relative max-w-[85%] sm:max-w-[70%]", children: [isFirstInGroup && !isUser && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-2 -left-2 z-10", children: avatarUrl ? ((0, jsx_runtime_1.jsx)("img", { src: avatarUrl, alt: senderName || "", className: "w-6 h-6 rounded-full object-cover ring-2 ring-slate-100 dark:ring-slate-800 shadow-sm" })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-6 h-6 rounded-full bg-slate-300 dark:bg-slate-600 ring-2 ring-slate-100 dark:ring-slate-800 shadow-sm flex items-center justify-center text-slate-600 dark:text-slate-300 text-xs font-medium", children: (senderName || "?").charAt(0).toUpperCase() })) })), isFirstInGroup && isUser && ((0, jsx_runtime_1.jsx)("div", { className: "absolute -top-2 -right-2 z-10 opacity-0 group-hover:opacity-100 transition-opacity", children: avatarUrl ? ((0, jsx_runtime_1.jsx)("img", { src: avatarUrl, alt: senderName || "", className: "w-6 h-6 rounded-full object-cover ring-2 ring-blue-100 dark:ring-blue-900/50 shadow-sm" })) : ((0, jsx_runtime_1.jsx)("div", { className: "w-6 h-6 rounded-full bg-blue-500 ring-2 ring-blue-100 dark:ring-blue-900/50 shadow-sm flex items-center justify-center text-white text-xs font-medium", children: (senderName || "?").charAt(0).toUpperCase() })) })), (0, jsx_runtime_1.jsxs)("div", { className: `relative rounded-2xl transform-gpu cursor-pointer sm:cursor-default select-none sm:select-text transition-shadow duration-500 px-3 sm:px-4 py-1 sm:py-1.5 ${bubbleTypeClasses} ${classNameOverride}`, children: [whisperHeader, (0, jsx_runtime_1.jsx)("div", { className: proseClasses, children: isStreaming ? ((0, jsx_runtime_1.jsx)(streaming_text_js_1.StreamingText, { content: displayContent, isStreaming: true, markdownComponents: mergedComponents })) : ((0, jsx_runtime_1.jsx)(react_markdown_1.default, { remarkPlugins: markdown_config_js_1.remarkPlugins, rehypePlugins: markdown_config_js_1.rehypePlugins, components: mergedComponents, children: displayContent })) }), expandCollapseButton] }), (0, jsx_runtime_1.jsx)(message_actions_js_1.MessageActions, { content: displayContent, role: message.role, messageId: message.id, isStreaming: isStreaming }), isLastInGroup && timestamp && ((0, jsx_runtime_1.jsx)("div", { className: `absolute -bottom-5 ${isUser ? "right-1" : "left-1"} flex items-center gap-1.5 text-[10px] text-slate-400 dark:text-slate-500 opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap`, children: timestamp }))] }) }));
|
|
138
147
|
});
|
|
139
148
|
//# sourceMappingURL=message-bubble.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../src/components/message-bubble.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;;;;;;AAEZ,iCAAqC;AACrC,oEAA0C;AAG1C,oEAAqG;AACrG,8CAA6C;AAC7C,2DAAmD;AACnD,6DAAqD;
|
|
1
|
+
{"version":3,"file":"message-bubble.js","sourceRoot":"","sources":["../../src/components/message-bubble.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { type ReactNode, type RefObject } from "react";
|
|
2
2
|
import type { LiteMessage } from "@portablecore/types/chat";
|
|
3
|
-
import type { ChatInterfaceConfig } from "../types.js";
|
|
3
|
+
import type { ChatInterfaceConfig, RenderableMessage } from "../types.js";
|
|
4
|
+
import type { VirtualState } from "../hooks/use-virtual-messages.js";
|
|
4
5
|
interface MessageListProps {
|
|
5
6
|
messages: LiteMessage[];
|
|
7
|
+
renderableMessages: RenderableMessage[];
|
|
6
8
|
streaming: boolean;
|
|
7
9
|
config: ChatInterfaceConfig;
|
|
8
10
|
markdownComponents?: Record<string, any>;
|
|
@@ -10,15 +12,27 @@ interface MessageListProps {
|
|
|
10
12
|
beforeMessageList?: ReactNode;
|
|
11
13
|
afterMessageList?: ReactNode;
|
|
12
14
|
scrollRef: RefObject<HTMLDivElement>;
|
|
15
|
+
/** Virtualization state from useVirtualMessages */
|
|
16
|
+
virt: VirtualState;
|
|
17
|
+
/** Focus mode: returns true if message should show shortContent */
|
|
18
|
+
shouldShowShort?: (messageId: string) => boolean;
|
|
19
|
+
/** Focus mode: whether expand/collapse buttons should show */
|
|
20
|
+
focusModeEnabled?: boolean;
|
|
21
|
+
/** Focus mode: toggle a message between short/full */
|
|
22
|
+
onToggleExpanded?: (messageId: string, currentlyShowingFull: boolean) => void;
|
|
13
23
|
}
|
|
14
24
|
/**
|
|
15
25
|
* Scrollable message list with auto-scroll, date separators,
|
|
16
26
|
* and message grouping.
|
|
17
27
|
*
|
|
28
|
+
* Automatically virtualizes when the parent passes an active VirtualState
|
|
29
|
+
* (triggered by message count exceeding the threshold in useVirtualMessages).
|
|
30
|
+
* Below threshold, renders with .map() for zero-overhead simplicity.
|
|
31
|
+
*
|
|
18
32
|
* Supports two layout variants:
|
|
19
33
|
* - "full": max-w-5xl, wider padding, extra bottom space for scroll
|
|
20
34
|
* - "compact": max-w-3xl, tighter padding
|
|
21
35
|
*/
|
|
22
|
-
export declare function MessageList({ messages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, }: MessageListProps): import("react/jsx-runtime").JSX.Element;
|
|
36
|
+
export declare function MessageList({ messages, renderableMessages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, virt, shouldShowShort, focusModeEnabled, onToggleExpanded, }: MessageListProps): import("react/jsx-runtime").JSX.Element;
|
|
23
37
|
export {};
|
|
24
38
|
//# sourceMappingURL=message-list.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-list.d.ts","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"message-list.d.ts","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AACzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAGpE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IACvC,SAAS,EAAE,OAAO,CAAA;IAClB,MAAM,EAAE,mBAAmB,CAAA;IAE3B,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACxC,UAAU,CAAC,EAAE,SAAS,CAAA;IACtB,iBAAiB,CAAC,EAAE,SAAS,CAAA;IAC7B,gBAAgB,CAAC,EAAE,SAAS,CAAA;IAC5B,SAAS,EAAE,SAAS,CAAC,cAAc,CAAC,CAAA;IACpC,mDAAmD;IACnD,IAAI,EAAE,YAAY,CAAA;IAClB,mEAAmE;IACnE,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;IAChD,8DAA8D;IAC9D,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,KAAK,IAAI,CAAA;CAC9E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,kBAAkB,EAClB,SAAS,EACT,MAAM,EACN,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,EACT,IAAI,EACJ,eAAe,EACf,gBAAwB,EACxB,gBAAgB,GACjB,EAAE,gBAAgB,2CA2DlB"}
|
|
@@ -3,29 +3,58 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.MessageList = MessageList;
|
|
5
5
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
6
|
-
const react_1 = require("react");
|
|
7
|
-
const message_grouping_js_1 = require("../utils/message-grouping.js");
|
|
8
6
|
const message_bubble_js_1 = require("./message-bubble.js");
|
|
9
7
|
/**
|
|
10
8
|
* Scrollable message list with auto-scroll, date separators,
|
|
11
9
|
* and message grouping.
|
|
12
10
|
*
|
|
11
|
+
* Automatically virtualizes when the parent passes an active VirtualState
|
|
12
|
+
* (triggered by message count exceeding the threshold in useVirtualMessages).
|
|
13
|
+
* Below threshold, renders with .map() for zero-overhead simplicity.
|
|
14
|
+
*
|
|
13
15
|
* Supports two layout variants:
|
|
14
16
|
* - "full": max-w-5xl, wider padding, extra bottom space for scroll
|
|
15
17
|
* - "compact": max-w-3xl, tighter padding
|
|
16
18
|
*/
|
|
17
|
-
function MessageList({ messages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, }) {
|
|
19
|
+
function MessageList({ messages, renderableMessages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, virt, shouldShowShort, focusModeEnabled = false, onToggleExpanded, }) {
|
|
18
20
|
const variant = config.variant || "full";
|
|
19
21
|
const isCompact = variant === "compact";
|
|
20
|
-
const renderableMessages = (0, react_1.useMemo)(() => (0, message_grouping_js_1.groupMessages)(messages), [messages]);
|
|
21
22
|
const isEmpty = messages.length === 0;
|
|
22
23
|
const scrollClasses = isCompact
|
|
23
24
|
? "flex-1 overflow-y-auto px-4 py-4"
|
|
24
25
|
: "flex-1 overflow-y-auto";
|
|
26
|
+
const listClasses = config.classNames?.messageList || "";
|
|
27
|
+
const rowClasses = isCompact
|
|
28
|
+
? `max-w-3xl mx-auto ${config.classNames?.messageListInner || ""}`
|
|
29
|
+
: `max-w-5xl mx-auto px-4 sm:px-6 ${config.classNames?.messageListInner || ""}`;
|
|
30
|
+
const scrollStyle = virt.active ? { overflowAnchor: "none" } : undefined;
|
|
31
|
+
return ((0, jsx_runtime_1.jsxs)("div", { ref: scrollRef, className: `${scrollClasses} ${listClasses}`, style: scrollStyle, children: [beforeMessageList, isEmpty && emptyState ? ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center h-full", children: emptyState })) : virt.active ? ((0, jsx_runtime_1.jsx)(VirtualizedList, { virt: virt, renderableMessages: renderableMessages, config: config, markdownComponents: markdownComponents, shouldShowShort: shouldShowShort, focusModeEnabled: focusModeEnabled, onToggleExpanded: onToggleExpanded, rowClasses: rowClasses, isCompact: isCompact })) : ((0, jsx_runtime_1.jsx)(PlainList, { renderableMessages: renderableMessages, config: config, markdownComponents: markdownComponents, shouldShowShort: shouldShowShort, focusModeEnabled: focusModeEnabled, onToggleExpanded: onToggleExpanded, isCompact: isCompact })), afterMessageList && ((0, jsx_runtime_1.jsx)("div", { className: "pb-4", children: afterMessageList }))] }));
|
|
32
|
+
}
|
|
33
|
+
function PlainList({ renderableMessages, config, markdownComponents, shouldShowShort, focusModeEnabled, onToggleExpanded, isCompact, }) {
|
|
25
34
|
const innerClasses = isCompact
|
|
26
35
|
? `max-w-3xl mx-auto space-y-0 ${config.classNames?.messageListInner || ""}`
|
|
27
36
|
: `max-w-5xl mx-auto px-4 sm:px-6 pt-2 pb-12 sm:pb-4 space-y-0 ${config.classNames?.messageListInner || ""}`;
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: innerClasses, children: renderableMessages.map((rm) => ((0, jsx_runtime_1.jsxs)("div", { children: [rm.showDateSeparator && rm.dateSeparatorLabel && ((0, jsx_runtime_1.jsx)("div", { className: `flex items-center justify-center ${isCompact ? "py-4" : "my-6"}`, children: (0, jsx_runtime_1.jsx)("div", { className: `px-3 py-1 rounded-full text-xs font-medium bg-slate-100 dark:bg-slate-800 text-slate-500 dark:text-slate-400 ${config.classNames?.dateSeparator || ""}`, children: rm.dateSeparatorLabel }) })), (0, jsx_runtime_1.jsx)(message_bubble_js_1.MessageBubble, { message: rm.message, isFirstInGroup: rm.isFirstInGroup, isLastInGroup: rm.isLastInGroup, config: config, markdownComponents: markdownComponents, showShortContent: shouldShowShort?.(rm.message.id) ?? false, focusExpandable: focusModeEnabled && !!rm.message.shortContent, onToggleExpanded: onToggleExpanded })] }, rm.message.id))) }));
|
|
38
|
+
}
|
|
39
|
+
function VirtualizedList({ virt, renderableMessages, config, markdownComponents, shouldShowShort, focusModeEnabled, onToggleExpanded, rowClasses, isCompact, }) {
|
|
40
|
+
const { virtualizer, virtualItems, totalSize } = virt;
|
|
41
|
+
return ((0, jsx_runtime_1.jsx)("div", { style: {
|
|
42
|
+
height: totalSize,
|
|
43
|
+
width: "100%",
|
|
44
|
+
position: "relative",
|
|
45
|
+
}, children: virtualItems.map((virtualRow) => {
|
|
46
|
+
const rm = renderableMessages[virtualRow.index];
|
|
47
|
+
if (!rm)
|
|
48
|
+
return null;
|
|
49
|
+
return ((0, jsx_runtime_1.jsx)("div", { ref: virtualizer.measureElement, "data-index": virtualRow.index, style: {
|
|
50
|
+
position: "absolute",
|
|
51
|
+
top: 0,
|
|
52
|
+
left: 0,
|
|
53
|
+
width: "100%",
|
|
54
|
+
transform: `translateY(${virtualRow.start}px)`,
|
|
55
|
+
contentVisibility: "auto",
|
|
56
|
+
containIntrinsicSize: `auto ${virtualRow.size}px`,
|
|
57
|
+
}, children: (0, jsx_runtime_1.jsxs)("div", { className: rowClasses, children: [rm.showDateSeparator && rm.dateSeparatorLabel && ((0, jsx_runtime_1.jsx)("div", { className: `flex items-center justify-center ${isCompact ? "py-4" : "my-6"}`, children: (0, jsx_runtime_1.jsx)("div", { className: `px-3 py-1 rounded-full text-xs font-medium bg-slate-100 dark:bg-slate-800 text-slate-500 dark:text-slate-400 ${config.classNames?.dateSeparator || ""}`, children: rm.dateSeparatorLabel }) })), (0, jsx_runtime_1.jsx)(message_bubble_js_1.MessageBubble, { message: rm.message, isFirstInGroup: rm.isFirstInGroup, isLastInGroup: rm.isLastInGroup, config: config, markdownComponents: markdownComponents, showShortContent: shouldShowShort?.(rm.message.id) ?? false, focusExpandable: focusModeEnabled && !!rm.message.shortContent, onToggleExpanded: onToggleExpanded })] }) }, rm.message.id));
|
|
58
|
+
}) }));
|
|
30
59
|
}
|
|
31
60
|
//# sourceMappingURL=message-list.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-list.js","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;
|
|
1
|
+
{"version":3,"file":"message-list.js","sourceRoot":"","sources":["../../src/components/message-list.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import type { LiteMessage } from "@portablecore/types/chat";
|
|
2
|
+
import type { Virtualizer } from "@tanstack/react-virtual";
|
|
2
3
|
interface UseChatScrollOptions {
|
|
3
4
|
messages: LiteMessage[];
|
|
4
5
|
streaming: boolean;
|
|
5
6
|
/** When provided, drives scroll-on-thread-change: top for a thread, bottom for all */
|
|
6
7
|
selectedThreadId?: string | null;
|
|
8
|
+
/** Mutable ref to the virtualizer; read at scroll time to avoid hook ordering issues */
|
|
9
|
+
virtualizerRef?: React.RefObject<Virtualizer<HTMLDivElement, Element> | null>;
|
|
7
10
|
}
|
|
8
11
|
interface UseChatScrollReturn {
|
|
9
12
|
scrollRef: React.RefObject<HTMLDivElement>;
|
|
10
13
|
scrollToBottom: (behavior?: ScrollBehavior) => void;
|
|
11
14
|
isNearBottom: () => boolean;
|
|
12
15
|
}
|
|
13
|
-
export declare function useChatScroll({ messages, streaming, selectedThreadId, }: UseChatScrollOptions): UseChatScrollReturn;
|
|
16
|
+
export declare function useChatScroll({ messages, streaming, selectedThreadId, virtualizerRef, }: UseChatScrollOptions): UseChatScrollReturn;
|
|
14
17
|
export {};
|
|
15
18
|
//# sourceMappingURL=use-chat-scroll.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-chat-scroll.d.ts","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE1D,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,wFAAwF;IACxF,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;CAC9E;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC1C,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAA;IACnD,YAAY,EAAE,MAAM,OAAO,CAAA;CAC5B;AAKD,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,gBAAgB,EAChB,cAAc,GACf,EAAE,oBAAoB,GAAG,mBAAmB,CAiH5C"}
|
|
@@ -3,43 +3,63 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
4
|
exports.useChatScroll = useChatScroll;
|
|
5
5
|
/**
|
|
6
|
-
* useChatScroll —
|
|
6
|
+
* useChatScroll — Reliable scroll management for chat.
|
|
7
7
|
*
|
|
8
8
|
* Auto-scrolls to bottom when:
|
|
9
9
|
* - Component mounts (instant)
|
|
10
10
|
* - A new message arrives (smooth, if user was near bottom)
|
|
11
|
-
* - Streaming content grows (
|
|
11
|
+
* - Streaming content grows (RAF-gated, if user was near bottom)
|
|
12
12
|
*
|
|
13
13
|
* Respects user intent: if user scrolled up, don't pull them down.
|
|
14
|
+
* Includes a programmatic scroll guard so auto-scrolls don't
|
|
15
|
+
* accidentally trip the "user scrolled away" detection.
|
|
14
16
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* be ported together with virtualization.
|
|
17
|
+
* Supports an optional virtualizer ref for large message lists.
|
|
18
|
+
* The ref is read at call time (not a dependency) to avoid circular hooks.
|
|
18
19
|
*/
|
|
19
20
|
const react_1 = require("react");
|
|
20
|
-
|
|
21
|
+
const NEAR_BOTTOM_THRESHOLD = 100;
|
|
22
|
+
const PROGRAMMATIC_SCROLL_GUARD_MS = 150;
|
|
23
|
+
function useChatScroll({ messages, streaming, selectedThreadId, virtualizerRef, }) {
|
|
21
24
|
const scrollRef = (0, react_1.useRef)(null);
|
|
22
25
|
const wasNearBottom = (0, react_1.useRef)(true);
|
|
23
26
|
const prevThreadIdRef = (0, react_1.useRef)(undefined);
|
|
27
|
+
const lastProgrammaticScroll = (0, react_1.useRef)(0);
|
|
28
|
+
const rafRef = (0, react_1.useRef)(null);
|
|
24
29
|
const isNearBottom = (0, react_1.useCallback)(() => {
|
|
25
30
|
const el = scrollRef.current;
|
|
26
31
|
if (!el)
|
|
27
32
|
return true;
|
|
28
|
-
|
|
29
|
-
return el.scrollHeight - el.scrollTop - el.clientHeight < threshold;
|
|
33
|
+
return el.scrollHeight - el.scrollTop - el.clientHeight < NEAR_BOTTOM_THRESHOLD;
|
|
30
34
|
}, []);
|
|
31
35
|
const scrollToBottom = (0, react_1.useCallback)((behavior = "smooth") => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
lastProgrammaticScroll.current = Date.now();
|
|
37
|
+
const v = virtualizerRef?.current;
|
|
38
|
+
if (v && messages.length > 0) {
|
|
39
|
+
v.scrollToIndex(messages.length - 1, {
|
|
40
|
+
align: "end",
|
|
41
|
+
behavior,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const el = scrollRef.current;
|
|
46
|
+
if (!el)
|
|
47
|
+
return;
|
|
48
|
+
el.scrollTo({ top: el.scrollHeight, behavior });
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
// virtualizerRef is a stable ref, not a dependency
|
|
52
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
53
|
+
[messages.length]);
|
|
54
|
+
// Track whether user is near bottom (with programmatic scroll guard)
|
|
38
55
|
(0, react_1.useEffect)(() => {
|
|
39
56
|
const el = scrollRef.current;
|
|
40
57
|
if (!el)
|
|
41
58
|
return;
|
|
42
59
|
const onScroll = () => {
|
|
60
|
+
const elapsed = Date.now() - lastProgrammaticScroll.current;
|
|
61
|
+
if (elapsed < PROGRAMMATIC_SCROLL_GUARD_MS)
|
|
62
|
+
return;
|
|
43
63
|
wasNearBottom.current = isNearBottom();
|
|
44
64
|
};
|
|
45
65
|
el.addEventListener("scroll", onScroll, { passive: true });
|
|
@@ -51,16 +71,28 @@ function useChatScroll({ messages, streaming, selectedThreadId, }) {
|
|
|
51
71
|
scrollToBottom("smooth");
|
|
52
72
|
}
|
|
53
73
|
}, [messages.length, scrollToBottom]);
|
|
54
|
-
//
|
|
74
|
+
// RAF-gated auto-scroll during streaming
|
|
55
75
|
(0, react_1.useEffect)(() => {
|
|
56
|
-
if (!streaming)
|
|
76
|
+
if (!streaming) {
|
|
77
|
+
if (rafRef.current != null) {
|
|
78
|
+
cancelAnimationFrame(rafRef.current);
|
|
79
|
+
rafRef.current = null;
|
|
80
|
+
}
|
|
57
81
|
return;
|
|
58
|
-
|
|
82
|
+
}
|
|
83
|
+
const tick = () => {
|
|
59
84
|
if (wasNearBottom.current) {
|
|
60
85
|
scrollToBottom("smooth");
|
|
61
86
|
}
|
|
62
|
-
|
|
63
|
-
|
|
87
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
88
|
+
};
|
|
89
|
+
rafRef.current = requestAnimationFrame(tick);
|
|
90
|
+
return () => {
|
|
91
|
+
if (rafRef.current != null) {
|
|
92
|
+
cancelAnimationFrame(rafRef.current);
|
|
93
|
+
rafRef.current = null;
|
|
94
|
+
}
|
|
95
|
+
};
|
|
64
96
|
}, [streaming, scrollToBottom]);
|
|
65
97
|
// Instant scroll on mount
|
|
66
98
|
(0, react_1.useEffect)(() => {
|
|
@@ -79,17 +111,18 @@ function useChatScroll({ messages, streaming, selectedThreadId, }) {
|
|
|
79
111
|
return;
|
|
80
112
|
prevThreadIdRef.current = newId;
|
|
81
113
|
requestAnimationFrame(() => {
|
|
82
|
-
const el = scrollRef.current;
|
|
83
|
-
if (!el)
|
|
84
|
-
return;
|
|
85
114
|
if (newId) {
|
|
115
|
+
const el = scrollRef.current;
|
|
116
|
+
if (!el)
|
|
117
|
+
return;
|
|
118
|
+
lastProgrammaticScroll.current = Date.now();
|
|
86
119
|
el.scrollTo({ top: 0, behavior: "instant" });
|
|
87
120
|
}
|
|
88
121
|
else {
|
|
89
|
-
|
|
122
|
+
scrollToBottom("instant");
|
|
90
123
|
}
|
|
91
124
|
});
|
|
92
|
-
}, [selectedThreadId]);
|
|
125
|
+
}, [selectedThreadId, scrollToBottom]);
|
|
93
126
|
return { scrollRef, scrollToBottom, isNearBottom };
|
|
94
127
|
}
|
|
95
128
|
//# sourceMappingURL=use-chat-scroll.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-chat-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;
|
|
1
|
+
{"version":3,"file":"use-chat-scroll.js","sourceRoot":"","sources":["../../src/hooks/use-chat-scroll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { LiteMessage, MessageViewMode } from "@portablecore/types/chat";
|
|
2
|
+
interface UseFocusModeOptions {
|
|
3
|
+
messages: LiteMessage[];
|
|
4
|
+
enabled: boolean;
|
|
5
|
+
initialViewMode?: MessageViewMode;
|
|
6
|
+
currentUserId: string;
|
|
7
|
+
onViewModeChange?: (mode: MessageViewMode) => void;
|
|
8
|
+
}
|
|
9
|
+
export interface FocusModeState {
|
|
10
|
+
viewMode: MessageViewMode;
|
|
11
|
+
setViewMode: (mode: MessageViewMode) => void;
|
|
12
|
+
/** True when the message should render shortContent instead of content */
|
|
13
|
+
shouldShowShort: (messageId: string) => boolean;
|
|
14
|
+
/** Toggle a single message between expanded/collapsed */
|
|
15
|
+
toggleExpanded: (messageId: string, currentlyShowingFull: boolean) => void;
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Manages focus mode state: view mode, per-message expansion overrides,
|
|
20
|
+
* and the core logic for deciding whether to show short or full content.
|
|
21
|
+
*
|
|
22
|
+
* Mirrors the legacy ChatInterface focus mode exactly:
|
|
23
|
+
* - "long": all messages expanded
|
|
24
|
+
* - "short": all messages with shortContent are compressed
|
|
25
|
+
* - "focus": messages you prompted are expanded, others' compressed
|
|
26
|
+
*/
|
|
27
|
+
export declare function useFocusMode({ messages, enabled, initialViewMode, currentUserId, onViewModeChange, }: UseFocusModeOptions): FocusModeState;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=use-focus-mode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-focus-mode.d.ts","sourceRoot":"","sources":["../../src/hooks/use-focus-mode.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAE5E,UAAU,mBAAmB;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;CACnD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,eAAe,CAAA;IACzB,WAAW,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAA;IAC5C,0EAA0E;IAC1E,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;IAC/C,yDAAyD;IACzD,cAAc,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,KAAK,IAAI,CAAA;IAC1E,OAAO,EAAE,OAAO,CAAA;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,OAAO,EACP,eAAyB,EACzB,aAAa,EACb,gBAAgB,GACjB,EAAE,mBAAmB,GAAG,cAAc,CAkFtC"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.useFocusMode = useFocusMode;
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
/**
|
|
7
|
+
* Manages focus mode state: view mode, per-message expansion overrides,
|
|
8
|
+
* and the core logic for deciding whether to show short or full content.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors the legacy ChatInterface focus mode exactly:
|
|
11
|
+
* - "long": all messages expanded
|
|
12
|
+
* - "short": all messages with shortContent are compressed
|
|
13
|
+
* - "focus": messages you prompted are expanded, others' compressed
|
|
14
|
+
*/
|
|
15
|
+
function useFocusMode({ messages, enabled, initialViewMode = "focus", currentUserId, onViewModeChange, }) {
|
|
16
|
+
const [viewMode, setViewModeInternal] = (0, react_1.useState)(enabled ? initialViewMode : "long");
|
|
17
|
+
const [overrides, setOverrides] = (0, react_1.useState)(() => new Map());
|
|
18
|
+
const initialViewModeRef = (0, react_1.useRef)(initialViewMode);
|
|
19
|
+
const setViewMode = (0, react_1.useCallback)((mode) => {
|
|
20
|
+
setViewModeInternal(mode);
|
|
21
|
+
setOverrides(new Map());
|
|
22
|
+
onViewModeChange?.(mode);
|
|
23
|
+
}, [onViewModeChange]);
|
|
24
|
+
(0, react_1.useEffect)(() => {
|
|
25
|
+
if (viewMode !== initialViewModeRef.current) {
|
|
26
|
+
onViewModeChange?.(viewMode);
|
|
27
|
+
}
|
|
28
|
+
}, []); // eslint-disable-line react-hooks/exhaustive-deps
|
|
29
|
+
const messageIndex = (0, react_1.useMemo)(() => {
|
|
30
|
+
const map = new Map();
|
|
31
|
+
for (let i = 0; i < messages.length; i++) {
|
|
32
|
+
map.set(messages[i].id, i);
|
|
33
|
+
}
|
|
34
|
+
return map;
|
|
35
|
+
}, [messages]);
|
|
36
|
+
const shouldShowShort = (0, react_1.useCallback)((messageId) => {
|
|
37
|
+
if (!enabled)
|
|
38
|
+
return false;
|
|
39
|
+
const idx = messageIndex.get(messageId);
|
|
40
|
+
if (idx === undefined)
|
|
41
|
+
return false;
|
|
42
|
+
const msg = messages[idx];
|
|
43
|
+
if (!msg || msg.role !== "assistant" || !msg.shortContent)
|
|
44
|
+
return false;
|
|
45
|
+
const override = overrides.get(messageId);
|
|
46
|
+
if (override === "expanded")
|
|
47
|
+
return false;
|
|
48
|
+
if (override === "collapsed")
|
|
49
|
+
return true;
|
|
50
|
+
if (viewMode === "long")
|
|
51
|
+
return false;
|
|
52
|
+
if (viewMode === "short")
|
|
53
|
+
return true;
|
|
54
|
+
// Focus mode: expand if current user prompted this response
|
|
55
|
+
if (viewMode === "focus") {
|
|
56
|
+
for (let i = idx - 1; i >= 0; i--) {
|
|
57
|
+
const prevMsg = messages[i];
|
|
58
|
+
if (prevMsg && prevMsg.role === "user") {
|
|
59
|
+
const promptingUserId = prevMsg.senderUserId || currentUserId;
|
|
60
|
+
return promptingUserId !== currentUserId;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}, [enabled, messages, messageIndex, overrides, viewMode, currentUserId]);
|
|
66
|
+
const toggleExpanded = (0, react_1.useCallback)((messageId, currentlyShowingFull) => {
|
|
67
|
+
setOverrides((prev) => {
|
|
68
|
+
const next = new Map(prev);
|
|
69
|
+
next.set(messageId, currentlyShowingFull ? "collapsed" : "expanded");
|
|
70
|
+
return next;
|
|
71
|
+
});
|
|
72
|
+
}, []);
|
|
73
|
+
return {
|
|
74
|
+
viewMode,
|
|
75
|
+
setViewMode,
|
|
76
|
+
shouldShowShort,
|
|
77
|
+
toggleExpanded,
|
|
78
|
+
enabled,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=use-focus-mode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-focus-mode.js","sourceRoot":"","sources":["../../src/hooks/use-focus-mode.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type Virtualizer } from "@tanstack/react-virtual";
|
|
2
|
+
import type { RenderableMessage } from "../types.js";
|
|
3
|
+
export declare const VIRTUALIZATION_THRESHOLD = 100;
|
|
4
|
+
interface UseVirtualMessagesOptions {
|
|
5
|
+
renderableMessages: RenderableMessage[];
|
|
6
|
+
scrollRef: React.RefObject<HTMLDivElement>;
|
|
7
|
+
/** Increment to force re-measurement (focus mode toggle, thread switch) */
|
|
8
|
+
measureVersion?: number;
|
|
9
|
+
enabled?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export type VirtualState = {
|
|
12
|
+
active: false;
|
|
13
|
+
} | {
|
|
14
|
+
active: true;
|
|
15
|
+
virtualizer: Virtualizer<HTMLDivElement, Element>;
|
|
16
|
+
virtualItems: ReturnType<Virtualizer<HTMLDivElement, Element>["getVirtualItems"]>;
|
|
17
|
+
totalSize: number;
|
|
18
|
+
};
|
|
19
|
+
export declare function useVirtualMessages({ renderableMessages, scrollRef, measureVersion, enabled, }: UseVirtualMessagesOptions): VirtualState;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=use-virtual-messages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-virtual-messages.d.ts","sourceRoot":"","sources":["../../src/hooks/use-virtual-messages.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEpD,eAAO,MAAM,wBAAwB,MAAM,CAAA;AAE3C,UAAU,yBAAyB;IACjC,kBAAkB,EAAE,iBAAiB,EAAE,CAAA;IACvC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC1C,2EAA2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,MAAM,EAAE,KAAK,CAAA;CAAE,GACjB;IACE,MAAM,EAAE,IAAI,CAAA;IACZ,WAAW,EAAE,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IACjD,YAAY,EAAE,UAAU,CAAC,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAA;IACjF,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAyBL,wBAAgB,kBAAkB,CAAC,EACjC,kBAAkB,EAClB,SAAS,EACT,cAAkB,EAClB,OAAc,GACf,EAAE,yBAAyB,GAAG,YAAY,CA8C1C"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.VIRTUALIZATION_THRESHOLD = void 0;
|
|
5
|
+
exports.useVirtualMessages = useVirtualMessages;
|
|
6
|
+
const react_1 = require("react");
|
|
7
|
+
const react_virtual_1 = require("@tanstack/react-virtual");
|
|
8
|
+
exports.VIRTUALIZATION_THRESHOLD = 100;
|
|
9
|
+
function estimateMessageHeight(rm) {
|
|
10
|
+
const content = rm.message.content || "";
|
|
11
|
+
const len = content.length;
|
|
12
|
+
const charsPerLine = 80;
|
|
13
|
+
const lineHeight = 24;
|
|
14
|
+
let base;
|
|
15
|
+
if (rm.message.role === "user") {
|
|
16
|
+
base = 40;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
base = 60;
|
|
20
|
+
}
|
|
21
|
+
if (rm.showDateSeparator) {
|
|
22
|
+
base += 48;
|
|
23
|
+
}
|
|
24
|
+
const lines = Math.ceil(len / charsPerLine);
|
|
25
|
+
const estimated = base + lines * lineHeight;
|
|
26
|
+
return Math.max(60, Math.min(estimated, 800));
|
|
27
|
+
}
|
|
28
|
+
function useVirtualMessages({ renderableMessages, scrollRef, measureVersion = 0, enabled = true, }) {
|
|
29
|
+
const count = renderableMessages.length;
|
|
30
|
+
const shouldVirtualize = enabled && count >= exports.VIRTUALIZATION_THRESHOLD;
|
|
31
|
+
const messagesRef = (0, react_1.useRef)(renderableMessages);
|
|
32
|
+
messagesRef.current = renderableMessages;
|
|
33
|
+
const virtualizer = (0, react_virtual_1.useVirtualizer)({
|
|
34
|
+
count: shouldVirtualize ? count : 0,
|
|
35
|
+
getScrollElement: () => scrollRef.current,
|
|
36
|
+
estimateSize: (0, react_1.useCallback)((index) => {
|
|
37
|
+
const rm = messagesRef.current[index];
|
|
38
|
+
if (!rm)
|
|
39
|
+
return 100;
|
|
40
|
+
return estimateMessageHeight(rm);
|
|
41
|
+
}, []),
|
|
42
|
+
getItemKey: (0, react_1.useCallback)((index) => {
|
|
43
|
+
const rm = messagesRef.current[index];
|
|
44
|
+
return rm?.message.id ?? index;
|
|
45
|
+
}, []),
|
|
46
|
+
overscan: 30,
|
|
47
|
+
});
|
|
48
|
+
const prevMeasureVersion = (0, react_1.useRef)(measureVersion);
|
|
49
|
+
(0, react_1.useEffect)(() => {
|
|
50
|
+
if (prevMeasureVersion.current !== measureVersion && shouldVirtualize) {
|
|
51
|
+
prevMeasureVersion.current = measureVersion;
|
|
52
|
+
virtualizer.measure();
|
|
53
|
+
}
|
|
54
|
+
}, [measureVersion, shouldVirtualize, virtualizer]);
|
|
55
|
+
if (!shouldVirtualize) {
|
|
56
|
+
return { active: false };
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
active: true,
|
|
60
|
+
virtualizer,
|
|
61
|
+
virtualItems: virtualizer.getVirtualItems(),
|
|
62
|
+
totalSize: virtualizer.getTotalSize(),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=use-virtual-messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-virtual-messages.js","sourceRoot":"","sources":["../../src/hooks/use-virtual-messages.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;;;;AAgDZ,gDAmDC;AAjGD,iCAAsD;AACtD,2DAA0E;AAG7D,QAAA,wBAAwB,GAAG,GAAG,CAAA;AAmB3C,SAAS,qBAAqB,CAAC,EAAqB;IAClD,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAA;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAA;IAC1B,MAAM,YAAY,GAAG,EAAE,CAAA;IACvB,MAAM,UAAU,GAAG,EAAE,CAAA;IAErB,IAAI,IAAY,CAAA;IAChB,IAAI,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC/B,IAAI,GAAG,EAAE,CAAA;IACX,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,EAAE,CAAA;IACX,CAAC;IAED,IAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,IAAI,EAAE,CAAA;IACZ,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,CAAA;IAC3C,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG,UAAU,CAAA;IAE3C,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAA;AAC/C,CAAC;AAED,SAAgB,kBAAkB,CAAC,EACjC,kBAAkB,EAClB,SAAS,EACT,cAAc,GAAG,CAAC,EAClB,OAAO,GAAG,IAAI,GACY;IAC1B,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAA;IACvC,MAAM,gBAAgB,GAAG,OAAO,IAAI,KAAK,IAAI,gCAAwB,CAAA;IAErE,MAAM,WAAW,GAAG,IAAA,cAAM,EAAC,kBAAkB,CAAC,CAAA;IAC9C,WAAW,CAAC,OAAO,GAAG,kBAAkB,CAAA;IAExC,MAAM,WAAW,GAAG,IAAA,8BAAc,EAAC;QACjC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,gBAAgB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO;QACzC,YAAY,EAAE,IAAA,mBAAW,EACvB,CAAC,KAAa,EAAE,EAAE;YAChB,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACrC,IAAI,CAAC,EAAE;gBAAE,OAAO,GAAG,CAAA;YACnB,OAAO,qBAAqB,CAAC,EAAE,CAAC,CAAA;QAClC,CAAC,EACD,EAAE,CACH;QACD,UAAU,EAAE,IAAA,mBAAW,EACrB,CAAC,KAAa,EAAE,EAAE;YAChB,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACrC,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,IAAI,KAAK,CAAA;QAChC,CAAC,EACD,EAAE,CACH;QACD,QAAQ,EAAE,EAAE;KACb,CAAC,CAAA;IAEF,MAAM,kBAAkB,GAAG,IAAA,cAAM,EAAC,cAAc,CAAC,CAAA;IACjD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,kBAAkB,CAAC,OAAO,KAAK,cAAc,IAAI,gBAAgB,EAAE,CAAC;YACtE,kBAAkB,CAAC,OAAO,GAAG,cAAc,CAAA;YAC3C,WAAW,CAAC,OAAO,EAAE,CAAA;QACvB,CAAC;IACH,CAAC,EAAE,CAAC,cAAc,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC,CAAA;IAEnD,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,WAAW;QACX,YAAY,EAAE,WAAW,CAAC,eAAe,EAAE;QAC3C,SAAS,EAAE,WAAW,CAAC,YAAY,EAAE;KACtC,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -38,8 +38,13 @@ export { useProviderSelection } from "./hooks/use-provider-selection.js";
|
|
|
38
38
|
export type { ProviderSelectionState } from "./hooks/use-provider-selection.js";
|
|
39
39
|
export { ThreadFilterHeader } from "./components/thread-filter-header.js";
|
|
40
40
|
export { useThreadFilter } from "./hooks/use-thread-filter.js";
|
|
41
|
+
export { FocusModeControl } from "./components/focus-mode-control.js";
|
|
42
|
+
export { useFocusMode } from "./hooks/use-focus-mode.js";
|
|
43
|
+
export type { FocusModeState } from "./hooks/use-focus-mode.js";
|
|
44
|
+
export { useVirtualMessages, VIRTUALIZATION_THRESHOLD } from "./hooks/use-virtual-messages.js";
|
|
45
|
+
export type { VirtualState } from "./hooks/use-virtual-messages.js";
|
|
41
46
|
export { formatTime, getDateSeparator, isDifferentDay } from "./utils/time.js";
|
|
42
47
|
export { groupMessages } from "./utils/message-grouping.js";
|
|
43
48
|
export { remarkPlugins, rehypePlugins, defaultMarkdownComponents } from "./utils/markdown-config.js";
|
|
44
|
-
export type { ChatInterfaceConfig, ChatFeatureFlags, ChatVariant, ChatClassNames, StreamBodyOpts, MentionSuggestion, SkillSuggestion, DocumentRef, ProviderOption, LiteMessage, MessageType, SseEvent, ChatSlots, RenderableMessage, } from "./types.js";
|
|
49
|
+
export type { ChatInterfaceConfig, ChatFeatureFlags, ChatVariant, ChatClassNames, StreamBodyOpts, MentionSuggestion, SkillSuggestion, DocumentRef, ProviderOption, MessageViewMode, LiteMessage, MessageType, SseEvent, ChatSlots, RenderableMessage, } from "./types.js";
|
|
45
50
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,YAAY,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAG/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAGpG,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,cAAc,EACd,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,iBAAiB,GAClB,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAG5D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAG3E,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAG1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AAGtE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAGjE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAA;AACtE,YAAY,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAA;AACjF,YAAY,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAA;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAGzF,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAA;AACxE,YAAY,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAG/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AACxD,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAG/D,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAA;AAC9F,YAAY,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAGnE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAA;AAGpG,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,cAAc,EACd,eAAe,EACf,WAAW,EACX,WAAW,EACX,QAAQ,EACR,SAAS,EACT,iBAAiB,GAClB,MAAM,YAAY,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* slots, resolvers, handlers).
|
|
12
12
|
*/
|
|
13
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
-
exports.defaultMarkdownComponents = exports.rehypePlugins = exports.remarkPlugins = exports.groupMessages = exports.isDifferentDay = exports.getDateSeparator = exports.formatTime = exports.useThreadFilter = exports.ThreadFilterHeader = exports.useProviderSelection = exports.ProviderSelector = exports.useWhisperMode = exports.WhisperRecipientPicker = exports.EmptyState = exports.MessageActions = exports.CodeBlock = exports.SkillIndicator = exports.ThinkingIndicator = exports.BouncingDots = exports.StreamingText = exports.InputArea = exports.MessageBubble = exports.MessageList = exports.useAttachments = exports.AutocompletePopup = exports.useAutocomplete = exports.useChatScroll = exports.useChatSession = exports.ChatInterfaceCore = void 0;
|
|
14
|
+
exports.defaultMarkdownComponents = exports.rehypePlugins = exports.remarkPlugins = exports.groupMessages = exports.isDifferentDay = exports.getDateSeparator = exports.formatTime = exports.VIRTUALIZATION_THRESHOLD = exports.useVirtualMessages = exports.useFocusMode = exports.FocusModeControl = exports.useThreadFilter = exports.ThreadFilterHeader = exports.useProviderSelection = exports.ProviderSelector = exports.useWhisperMode = exports.WhisperRecipientPicker = exports.EmptyState = exports.MessageActions = exports.CodeBlock = exports.SkillIndicator = exports.ThinkingIndicator = exports.BouncingDots = exports.StreamingText = exports.InputArea = exports.MessageBubble = exports.MessageList = exports.useAttachments = exports.AutocompletePopup = exports.useAutocomplete = exports.useChatScroll = exports.useChatSession = exports.ChatInterfaceCore = void 0;
|
|
15
15
|
// The main product
|
|
16
16
|
var chat_interface_core_js_1 = require("./chat-interface-core.js");
|
|
17
17
|
Object.defineProperty(exports, "ChatInterfaceCore", { enumerable: true, get: function () { return chat_interface_core_js_1.ChatInterfaceCore; } });
|
|
@@ -64,6 +64,15 @@ var thread_filter_header_js_1 = require("./components/thread-filter-header.js");
|
|
|
64
64
|
Object.defineProperty(exports, "ThreadFilterHeader", { enumerable: true, get: function () { return thread_filter_header_js_1.ThreadFilterHeader; } });
|
|
65
65
|
var use_thread_filter_js_1 = require("./hooks/use-thread-filter.js");
|
|
66
66
|
Object.defineProperty(exports, "useThreadFilter", { enumerable: true, get: function () { return use_thread_filter_js_1.useThreadFilter; } });
|
|
67
|
+
// Focus mode
|
|
68
|
+
var focus_mode_control_js_1 = require("./components/focus-mode-control.js");
|
|
69
|
+
Object.defineProperty(exports, "FocusModeControl", { enumerable: true, get: function () { return focus_mode_control_js_1.FocusModeControl; } });
|
|
70
|
+
var use_focus_mode_js_1 = require("./hooks/use-focus-mode.js");
|
|
71
|
+
Object.defineProperty(exports, "useFocusMode", { enumerable: true, get: function () { return use_focus_mode_js_1.useFocusMode; } });
|
|
72
|
+
// Virtualization
|
|
73
|
+
var use_virtual_messages_js_1 = require("./hooks/use-virtual-messages.js");
|
|
74
|
+
Object.defineProperty(exports, "useVirtualMessages", { enumerable: true, get: function () { return use_virtual_messages_js_1.useVirtualMessages; } });
|
|
75
|
+
Object.defineProperty(exports, "VIRTUALIZATION_THRESHOLD", { enumerable: true, get: function () { return use_virtual_messages_js_1.VIRTUALIZATION_THRESHOLD; } });
|
|
67
76
|
// Utilities
|
|
68
77
|
var time_js_1 = require("./utils/time.js");
|
|
69
78
|
Object.defineProperty(exports, "formatTime", { enumerable: true, get: function () { return time_js_1.formatTime; } });
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,mBAAmB;AACnB,mEAA4D;AAAnD,2HAAA,iBAAiB,OAAA;AAE1B,qEAAqE;AACrE,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,oBAAoB;AACpB,iEAA0D;AAAjD,mHAAA,aAAa,OAAA;AAEtB,eAAe;AACf,mEAA6D;AAApD,sHAAA,eAAe,OAAA;AACxB,4EAAsE;AAA7D,0HAAA,iBAAiB,OAAA;AAE1B,cAAc;AACd,iEAA2D;AAAlD,oHAAA,cAAc,OAAA;AAGvB,sEAAsE;AACtE,gEAA0D;AAAjD,8GAAA,WAAW,OAAA;AACpB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,4DAAsD;AAA7C,0GAAA,SAAS,OAAA;AAClB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,kEAA4D;AAAnD,gHAAA,YAAY,OAAA;AACrB,4EAAsE;AAA7D,0HAAA,iBAAiB,OAAA;AAE1B,sEAAgE;AAAvD,oHAAA,cAAc,OAAA;AACvB,4DAAsD;AAA7C,0GAAA,SAAS,OAAA;AAClB,sEAAgE;AAAvD,oHAAA,cAAc,OAAA;AAEvB,8DAAwD;AAA/C,4GAAA,UAAU,OAAA;AACnB,wFAAiF;AAAxE,qIAAA,sBAAsB,OAAA;AAE/B,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,qBAAqB;AACrB,0EAAoE;AAA3D,wHAAA,gBAAgB,OAAA;AACzB,+EAAwE;AAA/D,iIAAA,oBAAoB,OAAA;AAG7B,mBAAmB;AACnB,gFAAyE;AAAhE,6HAAA,kBAAkB,OAAA;AAC3B,qEAA8D;AAArD,uHAAA,eAAe,OAAA;AAExB,YAAY;AACZ,2CAA8E;AAArE,qGAAA,UAAU,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,yGAAA,cAAc,OAAA;AACrD,mEAA2D;AAAlD,oHAAA,aAAa,OAAA;AACtB,iEAAoG;AAA3F,mHAAA,aAAa,OAAA;AAAE,mHAAA,aAAa,OAAA;AAAE,+HAAA,yBAAyB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,mBAAmB;AACnB,mEAA4D;AAAnD,2HAAA,iBAAiB,OAAA;AAE1B,qEAAqE;AACrE,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,oBAAoB;AACpB,iEAA0D;AAAjD,mHAAA,aAAa,OAAA;AAEtB,eAAe;AACf,mEAA6D;AAApD,sHAAA,eAAe,OAAA;AACxB,4EAAsE;AAA7D,0HAAA,iBAAiB,OAAA;AAE1B,cAAc;AACd,iEAA2D;AAAlD,oHAAA,cAAc,OAAA;AAGvB,sEAAsE;AACtE,gEAA0D;AAAjD,8GAAA,WAAW,OAAA;AACpB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,4DAAsD;AAA7C,0GAAA,SAAS,OAAA;AAClB,oEAA8D;AAArD,kHAAA,aAAa,OAAA;AACtB,kEAA4D;AAAnD,gHAAA,YAAY,OAAA;AACrB,4EAAsE;AAA7D,0HAAA,iBAAiB,OAAA;AAE1B,sEAAgE;AAAvD,oHAAA,cAAc,OAAA;AACvB,4DAAsD;AAA7C,0GAAA,SAAS,OAAA;AAClB,sEAAgE;AAAvD,oHAAA,cAAc,OAAA;AAEvB,8DAAwD;AAA/C,4GAAA,UAAU,OAAA;AACnB,wFAAiF;AAAxE,qIAAA,sBAAsB,OAAA;AAE/B,mEAA4D;AAAnD,qHAAA,cAAc,OAAA;AAGvB,qBAAqB;AACrB,0EAAoE;AAA3D,wHAAA,gBAAgB,OAAA;AACzB,+EAAwE;AAA/D,iIAAA,oBAAoB,OAAA;AAG7B,mBAAmB;AACnB,gFAAyE;AAAhE,6HAAA,kBAAkB,OAAA;AAC3B,qEAA8D;AAArD,uHAAA,eAAe,OAAA;AAExB,aAAa;AACb,4EAAqE;AAA5D,yHAAA,gBAAgB,OAAA;AACzB,+DAAwD;AAA/C,iHAAA,YAAY,OAAA;AAGrB,iBAAiB;AACjB,2EAA8F;AAArF,6HAAA,kBAAkB,OAAA;AAAE,mIAAA,wBAAwB,OAAA;AAGrD,YAAY;AACZ,2CAA8E;AAArE,qGAAA,UAAU,OAAA;AAAE,2GAAA,gBAAgB,OAAA;AAAE,yGAAA,cAAc,OAAA;AACrD,mEAA2D;AAAlD,oHAAA,aAAa,OAAA;AACtB,iEAAoG;AAA3F,mHAAA,aAAa,OAAA;AAAE,mHAAA,aAAa,OAAA;AAAE,+HAAA,yBAAyB,OAAA"}
|
package/dist/types.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import type { ReactNode } from "react";
|
|
8
8
|
import type { LiteMessage } from "@portablecore/types/chat";
|
|
9
|
-
export type { ChatInterfaceConfig, ChatFeatureFlags, ChatVariant, ChatClassNames, StreamBodyOpts, MentionSuggestion, SkillSuggestion, DocumentRef, ProviderOption, } from "@portablecore/types/chat";
|
|
9
|
+
export type { ChatInterfaceConfig, ChatFeatureFlags, ChatVariant, ChatClassNames, StreamBodyOpts, MentionSuggestion, SkillSuggestion, DocumentRef, ProviderOption, MessageViewMode, } from "@portablecore/types/chat";
|
|
10
10
|
export type { LiteMessage, MessageType, SseEvent } from "@portablecore/types/chat";
|
|
11
11
|
/**
|
|
12
12
|
* Slots narrowed to ReactNode for use inside React components.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAG3D,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,cAAc,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAG3D,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,WAAW,EACX,cAAc,EACd,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,0BAA0B,CAAA;AAEjC,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAElF;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,iBAAiB,CAAC,EAAE,SAAS,CAAA;IAC7B,gBAAgB,CAAC,EAAE,SAAS,CAAA;IAC5B,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,WAAW,CAAC,EAAE,SAAS,CAAA;IACvB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,UAAU,CAAC,EAAE,SAAS,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAA;IACpB,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,EAAE,OAAO,CAAA;IACtB,iBAAiB,EAAE,OAAO,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@portablecore/chat",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.16",
|
|
4
4
|
"description": "Unified chat UI for Portable platforms — composable ChatInterface with extension points",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -23,26 +23,27 @@
|
|
|
23
23
|
"author": "Portable",
|
|
24
24
|
"license": "UNLICENSED",
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"
|
|
27
|
-
"remark-breaks": "^4.0.0",
|
|
28
|
-
"rehype-raw": "^7.0.0",
|
|
26
|
+
"@tanstack/react-virtual": "^3.13.22",
|
|
29
27
|
"rehype-highlight": "^7.0.2",
|
|
28
|
+
"rehype-raw": "^7.0.0",
|
|
29
|
+
"remark-breaks": "^4.0.0",
|
|
30
|
+
"remark-gfm": "^4.0.1",
|
|
30
31
|
"@portablecore/chat-runtime": "0.1.0",
|
|
31
|
-
"@portablecore/types": "0.11.
|
|
32
|
+
"@portablecore/types": "0.11.6"
|
|
32
33
|
},
|
|
33
34
|
"peerDependencies": {
|
|
34
|
-
"react": ">=18.0.0",
|
|
35
|
-
"react-markdown": ">=9.0.0",
|
|
36
35
|
"@nvq/flowtoken": ">=2.0.0",
|
|
37
|
-
"lucide-react": ">=0.300.0"
|
|
36
|
+
"lucide-react": ">=0.300.0",
|
|
37
|
+
"react": ">=18.0.0",
|
|
38
|
+
"react-markdown": ">=9.0.0"
|
|
38
39
|
},
|
|
39
40
|
"devDependencies": {
|
|
40
|
-
"
|
|
41
|
+
"@nvq/flowtoken": "^2.0.6",
|
|
41
42
|
"@types/react": "^18.0.0",
|
|
43
|
+
"lucide-react": "^0.562.0",
|
|
42
44
|
"react": "^18.0.0",
|
|
43
45
|
"react-markdown": "^10.1.0",
|
|
44
|
-
"
|
|
45
|
-
"lucide-react": "^0.562.0"
|
|
46
|
+
"typescript": "^5.3.0"
|
|
46
47
|
},
|
|
47
48
|
"scripts": {
|
|
48
49
|
"build": "tsc",
|