@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.
Files changed (34) hide show
  1. package/dist/chat-interface-core.d.ts.map +1 -1
  2. package/dist/chat-interface-core.js +30 -1
  3. package/dist/chat-interface-core.js.map +1 -1
  4. package/dist/components/focus-mode-control.d.ts +13 -0
  5. package/dist/components/focus-mode-control.d.ts.map +1 -0
  6. package/dist/components/focus-mode-control.js +16 -0
  7. package/dist/components/focus-mode-control.js.map +1 -0
  8. package/dist/components/message-bubble.d.ts +6 -0
  9. package/dist/components/message-bubble.d.ts.map +1 -1
  10. package/dist/components/message-bubble.js +12 -3
  11. package/dist/components/message-bubble.js.map +1 -1
  12. package/dist/components/message-list.d.ts +16 -2
  13. package/dist/components/message-list.d.ts.map +1 -1
  14. package/dist/components/message-list.js +35 -6
  15. package/dist/components/message-list.js.map +1 -1
  16. package/dist/hooks/use-chat-scroll.d.ts +4 -1
  17. package/dist/hooks/use-chat-scroll.d.ts.map +1 -1
  18. package/dist/hooks/use-chat-scroll.js +57 -24
  19. package/dist/hooks/use-chat-scroll.js.map +1 -1
  20. package/dist/hooks/use-focus-mode.d.ts +29 -0
  21. package/dist/hooks/use-focus-mode.d.ts.map +1 -0
  22. package/dist/hooks/use-focus-mode.js +81 -0
  23. package/dist/hooks/use-focus-mode.js.map +1 -0
  24. package/dist/hooks/use-virtual-messages.d.ts +21 -0
  25. package/dist/hooks/use-virtual-messages.d.ts.map +1 -0
  26. package/dist/hooks/use-virtual-messages.js +65 -0
  27. package/dist/hooks/use-virtual-messages.js.map +1 -0
  28. package/dist/index.d.ts +6 -1
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +10 -1
  31. package/dist/index.js.map +1 -1
  32. package/dist/types.d.ts +1 -1
  33. package/dist/types.d.ts.map +1 -1
  34. 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":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAa,MAAM,YAAY,CAAA;AAehE,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,2CAuMxB"}
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":"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"}
1
+ {"version":3,"file":"chat-interface-core.js","sourceRoot":"","sources":["../src/chat-interface-core.tsx"],"names":[],"mappings":"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"}
@@ -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;CACzC;AA8CD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,0DAsSxB,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: message.content, 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: message.content })) }), (0, jsx_runtime_1.jsx)(message_actions_js_1.MessageActions, { content: message.content, 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 }))] })] }) }));
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: message.content, 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: message.content })) })] }), (0, jsx_runtime_1.jsx)(message_actions_js_1.MessageActions, { content: message.content, 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 }))] }) }));
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":"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"}
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,EAAW,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AAItD,UAAU,gBAAgB;IACxB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,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;CACrC;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,MAAM,EACN,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACV,EAAE,gBAAgB,2CA8DlB"}
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
- const listClasses = config.classNames?.messageList || "";
29
- return ((0, jsx_runtime_1.jsxs)("div", { ref: scrollRef, className: `${scrollClasses} ${listClasses}`, children: [beforeMessageList, isEmpty && emptyState ? ((0, jsx_runtime_1.jsx)("div", { className: "flex items-center justify-center h-full", children: emptyState })) : ((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 })] }, rm.message.id))) })), afterMessageList && ((0, jsx_runtime_1.jsx)("div", { className: "pb-4", children: afterMessageList }))] }));
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;;;AA4BZ,kCAuEC;;AAjGD,iCAA+D;AAG/D,sEAA4D;AAC5D,2DAAmD;AAcnD;;;;;;;GAOG;AACH,SAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,MAAM,EACN,kBAAkB,EAClB,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,SAAS,GACQ;IACjB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAA;IACxC,MAAM,SAAS,GAAG,OAAO,KAAK,SAAS,CAAA;IAEvC,MAAM,kBAAkB,GAAG,IAAA,eAAO,EAChC,GAAG,EAAE,CAAC,IAAA,mCAAa,EAAC,QAAQ,CAAC,EAC7B,CAAC,QAAQ,CAAC,CACX,CAAA;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAA;IAErC,MAAM,aAAa,GAAG,SAAS;QAC7B,CAAC,CAAC,kCAAkC;QACpC,CAAC,CAAC,wBAAwB,CAAA;IAE5B,MAAM,YAAY,GAAG,SAAS;QAC5B,CAAC,CAAC,+BAA+B,MAAM,CAAC,UAAU,EAAE,gBAAgB,IAAI,EAAE,EAAE;QAC5E,CAAC,CAAC,+DAA+D,MAAM,CAAC,UAAU,EAAE,gBAAgB,IAAI,EAAE,EAAE,CAAA;IAE9G,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,WAAW,IAAI,EAAE,CAAA;IAExD,OAAO,CACL,iCACE,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,GAAG,aAAa,IAAI,WAAW,EAAE,aAE3C,iBAAiB,EAEjB,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC,CACvB,gCAAK,SAAS,EAAC,yCAAyC,YACrD,UAAU,GACP,CACP,CAAC,CAAC,CAAC,CACF,gCAAK,SAAS,EAAE,YAAY,YACzB,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAC9B,4CACG,EAAE,CAAC,iBAAiB,IAAI,EAAE,CAAC,kBAAkB,IAAI,CAChD,gCAAK,SAAS,EAAE,oCAAoC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,YAC/E,gCACE,SAAS,EAAE,gHAAgH,MAAM,CAAC,UAAU,EAAE,aAAa,IAAI,EAAE,EAAE,YAElK,EAAE,CAAC,kBAAkB,GAClB,GACF,CACP,EACD,uBAAC,iCAAa,IACZ,OAAO,EAAE,EAAE,CAAC,OAAO,EACnB,cAAc,EAAE,EAAE,CAAC,cAAc,EACjC,aAAa,EAAE,EAAE,CAAC,aAAa,EAC/B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,GACtC,KAhBM,EAAE,CAAC,OAAO,CAAC,EAAE,CAiBjB,CACP,CAAC,GACE,CACP,EAEA,gBAAgB,IAAI,CACnB,gCAAK,SAAS,EAAC,MAAM,YAAE,gBAAgB,GAAO,CAC/C,IACG,CACP,CAAA;AACH,CAAC"}
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":"AAkBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAE3D,UAAU,oBAAoB;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,SAAS,EAAE,OAAO,CAAA;IAClB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACjC;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;AAED,wBAAgB,aAAa,CAAC,EAC5B,QAAQ,EACR,SAAS,EACT,gBAAgB,GACjB,EAAE,oBAAoB,GAAG,mBAAmB,CAkF5C"}
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 — Simple, reliable scroll management for chat.
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 (smooth, if user was near bottom)
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
- * The spacer system from legacy ChatInterface is intentionally NOT
16
- * included here. It depends on the virtualizer (item 9) and will
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
- function useChatScroll({ messages, streaming, selectedThreadId, }) {
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
- const threshold = 100;
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
- const el = scrollRef.current;
33
- if (!el)
34
- return;
35
- el.scrollTo({ top: el.scrollHeight, behavior });
36
- }, []);
37
- // Track whether user is near bottom
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
- // Auto-scroll during streaming if near bottom
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
- const interval = setInterval(() => {
82
+ }
83
+ const tick = () => {
59
84
  if (wasNearBottom.current) {
60
85
  scrollToBottom("smooth");
61
86
  }
62
- }, 200);
63
- return () => clearInterval(interval);
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
- el.scrollTo({ top: el.scrollHeight, behavior: "instant" });
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":"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"}
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":"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"}
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
@@ -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.
@@ -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,GACf,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"}
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.14",
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
- "remark-gfm": "^4.0.1",
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.5"
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
- "typescript": "^5.3.0",
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
- "@nvq/flowtoken": "^2.0.6",
45
- "lucide-react": "^0.562.0"
46
+ "typescript": "^5.3.0"
46
47
  },
47
48
  "scripts": {
48
49
  "build": "tsc",