@portablecore/chat 0.2.15 → 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 +20 -1
- package/dist/chat-interface-core.js.map +1 -1
- package/dist/components/message-list.d.ts +10 -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-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 +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/package.json +11 -10
|
@@ -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"}
|
|
@@ -10,6 +10,8 @@ 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
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");
|
|
13
15
|
const message_list_js_1 = require("./components/message-list.js");
|
|
14
16
|
const input_area_js_1 = require("./components/input-area.js");
|
|
15
17
|
const bouncing_dots_js_1 = require("./components/bouncing-dots.js");
|
|
@@ -54,11 +56,28 @@ function ChatInterfaceCore({ config, markdownComponents, }) {
|
|
|
54
56
|
onViewModeChange: focusModeConfig?.onViewModeChange,
|
|
55
57
|
});
|
|
56
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);
|
|
57
68
|
const scroll = (0, use_chat_scroll_js_1.useChatScroll)({
|
|
58
69
|
messages: displayMessages,
|
|
59
70
|
streaming: session.streaming,
|
|
60
71
|
selectedThreadId,
|
|
72
|
+
virtualizerRef,
|
|
61
73
|
});
|
|
74
|
+
const virt = (0, use_virtual_messages_js_1.useVirtualMessages)({
|
|
75
|
+
renderableMessages,
|
|
76
|
+
scrollRef: scroll.scrollRef,
|
|
77
|
+
measureVersion: measureVersion.length,
|
|
78
|
+
});
|
|
79
|
+
// Keep the ref in sync (effects/callbacks in useChatScroll read this)
|
|
80
|
+
virtualizerRef.current = virt.active ? virt.virtualizer : null;
|
|
62
81
|
const attachmentState = (0, use_attachments_js_1.useAttachments)(config.resolvers?.documentResolver);
|
|
63
82
|
const slots = (config.slots || {});
|
|
64
83
|
const variant = config.variant || "full";
|
|
@@ -141,7 +160,7 @@ function ChatInterfaceCore({ config, markdownComponents, }) {
|
|
|
141
160
|
}
|
|
142
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 }) }));
|
|
143
162
|
};
|
|
144
|
-
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, 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] }), 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
|
|
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
|
|
145
164
|
? `Message ${config.expert.name}...`
|
|
146
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 }))] }));
|
|
147
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":"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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,6 +12,8 @@ interface MessageListProps {
|
|
|
10
12
|
beforeMessageList?: ReactNode;
|
|
11
13
|
afterMessageList?: ReactNode;
|
|
12
14
|
scrollRef: RefObject<HTMLDivElement>;
|
|
15
|
+
/** Virtualization state from useVirtualMessages */
|
|
16
|
+
virt: VirtualState;
|
|
13
17
|
/** Focus mode: returns true if message should show shortContent */
|
|
14
18
|
shouldShowShort?: (messageId: string) => boolean;
|
|
15
19
|
/** Focus mode: whether expand/collapse buttons should show */
|
|
@@ -21,10 +25,14 @@ interface MessageListProps {
|
|
|
21
25
|
* Scrollable message list with auto-scroll, date separators,
|
|
22
26
|
* and message grouping.
|
|
23
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
|
+
*
|
|
24
32
|
* Supports two layout variants:
|
|
25
33
|
* - "full": max-w-5xl, wider padding, extra bottom space for scroll
|
|
26
34
|
* - "compact": max-w-3xl, tighter padding
|
|
27
35
|
*/
|
|
28
|
-
export declare function MessageList({ messages, streaming, config, markdownComponents, emptyState, beforeMessageList, afterMessageList, scrollRef, shouldShowShort, focusModeEnabled, onToggleExpanded, }: 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;
|
|
29
37
|
export {};
|
|
30
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, shouldShowShort, focusModeEnabled = false, onToggleExpanded, }) {
|
|
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,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":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -41,6 +41,8 @@ export { useThreadFilter } from "./hooks/use-thread-filter.js";
|
|
|
41
41
|
export { FocusModeControl } from "./components/focus-mode-control.js";
|
|
42
42
|
export { useFocusMode } from "./hooks/use-focus-mode.js";
|
|
43
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";
|
|
44
46
|
export { formatTime, getDateSeparator, isDifferentDay } from "./utils/time.js";
|
|
45
47
|
export { groupMessages } from "./utils/message-grouping.js";
|
|
46
48
|
export { remarkPlugins, rehypePlugins, defaultMarkdownComponents } from "./utils/markdown-config.js";
|
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,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,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"}
|
|
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.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;
|
|
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; } });
|
|
@@ -69,6 +69,10 @@ var focus_mode_control_js_1 = require("./components/focus-mode-control.js");
|
|
|
69
69
|
Object.defineProperty(exports, "FocusModeControl", { enumerable: true, get: function () { return focus_mode_control_js_1.FocusModeControl; } });
|
|
70
70
|
var use_focus_mode_js_1 = require("./hooks/use-focus-mode.js");
|
|
71
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; } });
|
|
72
76
|
// Utilities
|
|
73
77
|
var time_js_1 = require("./utils/time.js");
|
|
74
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,aAAa;AACb,4EAAqE;AAA5D,yHAAA,gBAAgB,OAAA;AACzB,+DAAwD;AAA/C,iHAAA,YAAY,OAAA;AAGrB,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/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
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",
|