@natoe/colab 0.1.30 → 0.1.34

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/index.d.mts CHANGED
@@ -369,10 +369,13 @@ interface CollabPanelProps {
369
369
  declare function CollabPanel({ orderId, conversation: providedConversation, patientData, participantIds, kind, showSeenBy, onBack, hidePatientName, hideOpenCase, onConversationChange, themeMode, showSettings: controlledShowSettings, onSettingsChange, className, style, }: CollabPanelProps): react_jsx_runtime.JSX.Element;
370
370
 
371
371
  interface CollabPopupProps {
372
- /** Order ID for this conversation */
373
- orderId: string;
372
+ /** Order this thread belongs to. Required for a `case` thread; omitted for a
373
+ * help channel, which belongs to a lab rather than an order. */
374
+ orderId?: string;
375
+ /** A thread the caller already resolved — how a help channel is opened. */
376
+ conversation?: Conversation | null;
374
377
  /** Patient/study data */
375
- patientData: PatientData;
378
+ patientData?: PatientData;
376
379
  /** Participant user IDs — only used when creating a brand-new conversation */
377
380
  participantIds?: string[];
378
381
  /** Which thread on the case. Defaults to the shared `case` thread. */
@@ -406,7 +409,7 @@ interface CollabPopupProps {
406
409
  * Draggable floating chat popup — drop-in replacement for DraggableChatPopup.
407
410
  * Renders a CollabPanel inside a movable, resizable container.
408
411
  */
409
- declare function CollabPopup({ orderId, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
412
+ declare function CollabPopup({ orderId, conversation: providedConversation, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
410
413
 
411
414
  type ColabInlineMode = 'light' | 'dark';
412
415
  interface CollabInlineProps {
@@ -462,6 +465,49 @@ interface CollabInboxProps {
462
465
  */
463
466
  declare function CollabInbox({ initialConversationId, onSelectConversation, className, style, }: CollabInboxProps): react_jsx_runtime.JSX.Element;
464
467
 
468
+ interface HelpPanelProps {
469
+ /**
470
+ * The lab's help channel, already resolved by the host from
471
+ * `GET /help_channel`. Required — unlike a case thread there is nothing to
472
+ * look up and nothing to lazily create, so a HelpPanel without a channel has
473
+ * nothing to render.
474
+ */
475
+ conversation: Conversation;
476
+ /** Show "seen by" under own messages (default true) */
477
+ showSeenBy?: boolean;
478
+ /** Rendered above the composer — the host's case-reference control lives here. */
479
+ composerAccessory?: React.ReactNode;
480
+ className?: string;
481
+ style?: React.CSSProperties;
482
+ }
483
+ /**
484
+ * The imaging centre's support thread.
485
+ *
486
+ * A deliberately SEPARATE shell from CollabPanel rather than CollabPanel with
487
+ * flags. The two surfaces only look similar — CollabPanel is case-shaped, and
488
+ * serving support through it meant suppressing the patient header, the DICOM
489
+ * button, the open-case action, the participant roster and channel settings one
490
+ * at a time. Every case-oriented feature added another thing to suppress, and
491
+ * missing one is not cosmetic: a roster control that slipped through crashed
492
+ * the whole tree on an unmapped participant role.
493
+ *
494
+ * Building additively instead means a support thread can never inherit a
495
+ * case affordance by accident. What IS shared is the part worth sharing — the
496
+ * engine. useConversation, MessageList and MessageInput are identical here, so
497
+ * socket lifecycle, optimistic sends, read receipts, typing, attachments,
498
+ * audio and pagination all behave exactly as they do on a case thread, with no
499
+ * second implementation to drift.
500
+ *
501
+ * Deliberately absent, and none of it by oversight:
502
+ * - patient / study header — there is no patient
503
+ * - View DICOM, Open case — there is no order
504
+ * - participant roster — the roster is fixed by the backend (this lab
505
+ * plus Natoe support) and is not editable
506
+ * - channel settings — invite / remove / leave do not apply
507
+ * - pinned messages — a support thread is chronological
508
+ */
509
+ declare function HelpPanel({ conversation, showSeenBy, composerAccessory, className, style, }: HelpPanelProps): react_jsx_runtime.JSX.Element;
510
+
465
511
  type MessageCallback = (message: Message) => void;
466
512
  type TypingCallback = (event: TypingEvent) => void;
467
513
  type ParticipantCallback = (participant: Participant) => void;
@@ -1277,4 +1323,4 @@ declare const SUPPORTED_IMAGE_TYPES: string[];
1277
1323
  /** Max file size in bytes (20MB) */
1278
1324
  declare const MAX_FILE_SIZE: number;
1279
1325
 
1280
- export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
1326
+ export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, HelpPanel, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
package/dist/index.d.ts CHANGED
@@ -369,10 +369,13 @@ interface CollabPanelProps {
369
369
  declare function CollabPanel({ orderId, conversation: providedConversation, patientData, participantIds, kind, showSeenBy, onBack, hidePatientName, hideOpenCase, onConversationChange, themeMode, showSettings: controlledShowSettings, onSettingsChange, className, style, }: CollabPanelProps): react_jsx_runtime.JSX.Element;
370
370
 
371
371
  interface CollabPopupProps {
372
- /** Order ID for this conversation */
373
- orderId: string;
372
+ /** Order this thread belongs to. Required for a `case` thread; omitted for a
373
+ * help channel, which belongs to a lab rather than an order. */
374
+ orderId?: string;
375
+ /** A thread the caller already resolved — how a help channel is opened. */
376
+ conversation?: Conversation | null;
374
377
  /** Patient/study data */
375
- patientData: PatientData;
378
+ patientData?: PatientData;
376
379
  /** Participant user IDs — only used when creating a brand-new conversation */
377
380
  participantIds?: string[];
378
381
  /** Which thread on the case. Defaults to the shared `case` thread. */
@@ -406,7 +409,7 @@ interface CollabPopupProps {
406
409
  * Draggable floating chat popup — drop-in replacement for DraggableChatPopup.
407
410
  * Renders a CollabPanel inside a movable, resizable container.
408
411
  */
409
- declare function CollabPopup({ orderId, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
412
+ declare function CollabPopup({ orderId, conversation: providedConversation, patientData, participantIds, kind, isOpen, onClose, onBack, onMinimize, initialPosition, width, height, className, }: CollabPopupProps): react_jsx_runtime.JSX.Element | null;
410
413
 
411
414
  type ColabInlineMode = 'light' | 'dark';
412
415
  interface CollabInlineProps {
@@ -462,6 +465,49 @@ interface CollabInboxProps {
462
465
  */
463
466
  declare function CollabInbox({ initialConversationId, onSelectConversation, className, style, }: CollabInboxProps): react_jsx_runtime.JSX.Element;
464
467
 
468
+ interface HelpPanelProps {
469
+ /**
470
+ * The lab's help channel, already resolved by the host from
471
+ * `GET /help_channel`. Required — unlike a case thread there is nothing to
472
+ * look up and nothing to lazily create, so a HelpPanel without a channel has
473
+ * nothing to render.
474
+ */
475
+ conversation: Conversation;
476
+ /** Show "seen by" under own messages (default true) */
477
+ showSeenBy?: boolean;
478
+ /** Rendered above the composer — the host's case-reference control lives here. */
479
+ composerAccessory?: React.ReactNode;
480
+ className?: string;
481
+ style?: React.CSSProperties;
482
+ }
483
+ /**
484
+ * The imaging centre's support thread.
485
+ *
486
+ * A deliberately SEPARATE shell from CollabPanel rather than CollabPanel with
487
+ * flags. The two surfaces only look similar — CollabPanel is case-shaped, and
488
+ * serving support through it meant suppressing the patient header, the DICOM
489
+ * button, the open-case action, the participant roster and channel settings one
490
+ * at a time. Every case-oriented feature added another thing to suppress, and
491
+ * missing one is not cosmetic: a roster control that slipped through crashed
492
+ * the whole tree on an unmapped participant role.
493
+ *
494
+ * Building additively instead means a support thread can never inherit a
495
+ * case affordance by accident. What IS shared is the part worth sharing — the
496
+ * engine. useConversation, MessageList and MessageInput are identical here, so
497
+ * socket lifecycle, optimistic sends, read receipts, typing, attachments,
498
+ * audio and pagination all behave exactly as they do on a case thread, with no
499
+ * second implementation to drift.
500
+ *
501
+ * Deliberately absent, and none of it by oversight:
502
+ * - patient / study header — there is no patient
503
+ * - View DICOM, Open case — there is no order
504
+ * - participant roster — the roster is fixed by the backend (this lab
505
+ * plus Natoe support) and is not editable
506
+ * - channel settings — invite / remove / leave do not apply
507
+ * - pinned messages — a support thread is chronological
508
+ */
509
+ declare function HelpPanel({ conversation, showSeenBy, composerAccessory, className, style, }: HelpPanelProps): react_jsx_runtime.JSX.Element;
510
+
465
511
  type MessageCallback = (message: Message) => void;
466
512
  type TypingCallback = (event: TypingEvent) => void;
467
513
  type ParticipantCallback = (participant: Participant) => void;
@@ -1277,4 +1323,4 @@ declare const SUPPORTED_IMAGE_TYPES: string[];
1277
1323
  /** Max file size in bytes (20MB) */
1278
1324
  declare const MAX_FILE_SIZE: number;
1279
1325
 
1280
- export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
1326
+ export { AUDIO_MIME_TYPE, type ChannelEvent, ChannelSettings, type ChannelUpdatePayload, type CollabConfig, type CollabError, CollabInbox, CollabInline, CollabPanel, CollabPopup, CollabProvider, CollabSocket, type Conversation, type ConversationKind, ConversationList, ConversationListItem, type ConversationListItem$1 as ConversationListItemData, type ConversationPreview, type CreateConversationResponse, DEEP_LINK_PREFIX, EVENTS, HelpPanel, type InviteUserPayload, MAX_FILE_SIZE, MAX_PINNED_MESSAGES, MESSAGES_PAGE_SIZE, MESSAGE_TYPES, type Message, MessageActionsMenu, MessageBubble, MessageInput, MessageList, type MessageListHandle, type MessageSnapshot, type MessageType, type Participant, ParticipantsList, type PatientData, PatientHeader, PinnedMessagesBar, type PreviewBatchResponse, ReplyPreview, ReplyQuoteBlock, SUPPORTED_IMAGE_TYPES, SeenByIndicator, type SendMessagePayload, THEME_DEFAULTS, THEME_VAR, TYPING_DEBOUNCE_MS, type Theme, type TypingEvent, type UserRole, applyThemeOverrides, isCaseKind, isHelpKind, useAudioRecorder, useChannelSettings, useCollab, useConversation, useConversationList, useDeepLinks, useInlineCollab, useMessages, usePinnedMessages, useUnreadCount };
package/dist/index.js CHANGED
@@ -1645,7 +1645,7 @@ function PatientHeader({
1645
1645
  }
1646
1646
  )
1647
1647
  ] }) : null;
1648
- const settingsButton = onOpenSettings ? /* @__PURE__ */ jsxRuntime.jsxs(
1648
+ const settingsButton = onOpenSettings && !isSupportChannel ? /* @__PURE__ */ jsxRuntime.jsxs(
1649
1649
  "button",
1650
1650
  {
1651
1651
  onClick: onOpenSettings,
@@ -3937,6 +3937,7 @@ function fallbackName(role) {
3937
3937
  return "User";
3938
3938
  }
3939
3939
  }
3940
+ var FALLBACK_ROLE_COLOR = { bg: "#f1f5f9", text: "#64748b" };
3940
3941
  function RoleBadge({ role }) {
3941
3942
  const colors = {
3942
3943
  radiologist: { bg: "#eef2ff", text: "#4f46e5" },
@@ -3948,8 +3949,8 @@ function RoleBadge({ role }) {
3948
3949
  admin: { bg: "#f1f5f9", text: "#64748b" }
3949
3950
  // slate
3950
3951
  };
3951
- const color = colors[role];
3952
- return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { ...styles9.roleBadge, backgroundColor: color.bg, color: color.text }, children: role });
3952
+ const color = colors[role] ?? FALLBACK_ROLE_COLOR;
3953
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { style: { ...styles9.roleBadge, backgroundColor: color.bg, color: color.text }, children: fallbackName(role) });
3953
3954
  }
3954
3955
  var styles9 = {
3955
3956
  list: {
@@ -4835,6 +4836,7 @@ ensureGlobalStyles();
4835
4836
  var FOCUSABLE_SELECTOR = 'a[href], button:not([disabled]), textarea:not([disabled]), input:not([disabled]), select:not([disabled]), [tabindex]:not([tabindex="-1"])';
4836
4837
  function CollabPopup({
4837
4838
  orderId,
4839
+ conversation: providedConversation,
4838
4840
  patientData,
4839
4841
  participantIds,
4840
4842
  kind,
@@ -4861,7 +4863,8 @@ function CollabPopup({
4861
4863
  const containerRef = React4.useRef(null);
4862
4864
  const previouslyFocused = React4.useRef(null);
4863
4865
  const titleId = React4.useId();
4864
- const titleText = cleanChannelName(loadedConversation?.name) || buildChannelName(patientData);
4866
+ const titleText = cleanChannelName(loadedConversation?.name) || (patientData ? buildChannelName(patientData) : "Natoe Support");
4867
+ const isSupportChannel = !patientData;
4865
4868
  const handleMouseDown = React4.useCallback(
4866
4869
  (e) => {
4867
4870
  if (!e.target.closest("[data-drag-handle]")) return;
@@ -4966,8 +4969,9 @@ function CollabPopup({
4966
4969
  }
4967
4970
  ),
4968
4971
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles13.titleCenter, children: [
4969
- /* @__PURE__ */ jsxRuntime.jsx("h2", { id: titleId, style: styles13.patientName, children: patientData.patientName || titleText }),
4972
+ /* @__PURE__ */ jsxRuntime.jsx("h2", { id: titleId, style: styles13.patientName, children: patientData?.patientName || titleText }),
4970
4973
  (() => {
4974
+ if (!patientData) return /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles13.subRow, children: /* @__PURE__ */ jsxRuntime.jsx("span", { style: styles13.metaText, children: "Help and support" }) });
4971
4975
  const parts = [];
4972
4976
  if (patientData.patientAge) parts.push(String(patientData.patientAge));
4973
4977
  if (patientData.patientSex) parts.push(String(patientData.patientSex));
@@ -4979,7 +4983,7 @@ function CollabPopup({
4979
4983
  })()
4980
4984
  ] }),
4981
4985
  /* @__PURE__ */ jsxRuntime.jsxs("div", { style: styles13.titleActions, children: [
4982
- loadedConversation && /* @__PURE__ */ jsxRuntime.jsxs(
4986
+ loadedConversation && !isSupportChannel && /* @__PURE__ */ jsxRuntime.jsxs(
4983
4987
  "button",
4984
4988
  {
4985
4989
  type: "button",
@@ -5024,6 +5028,7 @@ function CollabPopup({
5024
5028
  CollabPanel,
5025
5029
  {
5026
5030
  orderId,
5031
+ conversation: providedConversation,
5027
5032
  patientData,
5028
5033
  participantIds,
5029
5034
  kind,
@@ -6684,6 +6689,143 @@ var styles17 = {
6684
6689
  maxWidth: "320px"
6685
6690
  }
6686
6691
  };
6692
+ ensureGlobalStyles();
6693
+ function HelpPanel({
6694
+ conversation,
6695
+ showSeenBy = true,
6696
+ composerAccessory,
6697
+ className,
6698
+ style
6699
+ }) {
6700
+ const { config } = useCollab();
6701
+ const { handleDeepLink } = useDeepLinks();
6702
+ const messageListRef = React4.useRef(null);
6703
+ const {
6704
+ messages,
6705
+ typingUsers,
6706
+ isLoading,
6707
+ hasMore,
6708
+ error,
6709
+ replyTo,
6710
+ setReplyTo,
6711
+ sendMessage,
6712
+ retryMessage,
6713
+ sendAudioMessage,
6714
+ sendFileMessage,
6715
+ sendTyping,
6716
+ markAsRead,
6717
+ loadMoreMessages
6718
+ } = useConversation({ conversation, kind: "help_lab" });
6719
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6720
+ "div",
6721
+ {
6722
+ className: [ROOT_CLASS, className].filter(Boolean).join(" "),
6723
+ style: { ...styles18.container, ...style },
6724
+ children: [
6725
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { style: styles18.header, children: [
6726
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: styles18.avatar, "aria-hidden": "true", children: "N" }),
6727
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { style: styles18.headerText, children: [
6728
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: styles18.title, children: "Natoe Support" }),
6729
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: styles18.subtitle, children: "Questions about your account, billing or a case" })
6730
+ ] })
6731
+ ] }),
6732
+ error && /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles18.error, role: "alert", children: error }),
6733
+ isLoading && messages.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: styles18.loading, children: /* @__PURE__ */ jsxRuntime.jsx(Spinner, {}) }) : /* @__PURE__ */ jsxRuntime.jsx(
6734
+ MessageList,
6735
+ {
6736
+ ref: messageListRef,
6737
+ messages,
6738
+ currentUserId: config.userId,
6739
+ showSeenBy,
6740
+ typingUsers,
6741
+ hasMore,
6742
+ isLoading,
6743
+ onLoadMore: loadMoreMessages,
6744
+ onDeepLinkClick: handleDeepLink,
6745
+ onMessageVisible: markAsRead,
6746
+ onReply: setReplyTo,
6747
+ onRetry: retryMessage,
6748
+ pinDisabled: true
6749
+ }
6750
+ ),
6751
+ composerAccessory,
6752
+ /* @__PURE__ */ jsxRuntime.jsx(
6753
+ MessageInput,
6754
+ {
6755
+ onSendText: sendMessage,
6756
+ onSendAudio: sendAudioMessage,
6757
+ onSendFile: sendFileMessage,
6758
+ onTyping: sendTyping,
6759
+ replyTo,
6760
+ onCancelReply: () => setReplyTo(null),
6761
+ placeholder: "Ask Natoe support\u2026"
6762
+ }
6763
+ )
6764
+ ]
6765
+ }
6766
+ );
6767
+ }
6768
+ var styles18 = {
6769
+ container: {
6770
+ display: "flex",
6771
+ flexDirection: "column",
6772
+ height: "100%",
6773
+ minHeight: 0,
6774
+ fontFamily: FONT_STACK,
6775
+ background: COLOR.white
6776
+ },
6777
+ header: {
6778
+ display: "flex",
6779
+ alignItems: "center",
6780
+ gap: SPACE.S3,
6781
+ padding: `${SPACE.S3} ${SPACE.S4}`,
6782
+ borderBottom: `1px solid ${COLOR.neutral200}`,
6783
+ flex: "0 0 auto"
6784
+ },
6785
+ avatar: {
6786
+ flex: "0 0 auto",
6787
+ width: 32,
6788
+ height: 32,
6789
+ borderRadius: RADIUS.full,
6790
+ background: COLOR.primary,
6791
+ color: COLOR.white,
6792
+ display: "flex",
6793
+ alignItems: "center",
6794
+ justifyContent: "center",
6795
+ fontSize: FONT_SIZE.md,
6796
+ fontWeight: FONT_WEIGHT.semibold
6797
+ },
6798
+ headerText: {
6799
+ display: "flex",
6800
+ flexDirection: "column",
6801
+ minWidth: 0
6802
+ },
6803
+ title: {
6804
+ fontSize: FONT_SIZE.md,
6805
+ fontWeight: FONT_WEIGHT.semibold,
6806
+ color: COLOR.neutral900
6807
+ },
6808
+ subtitle: {
6809
+ fontSize: FONT_SIZE.sm,
6810
+ color: COLOR.neutral500,
6811
+ overflow: "hidden",
6812
+ textOverflow: "ellipsis",
6813
+ whiteSpace: "nowrap"
6814
+ },
6815
+ error: {
6816
+ padding: `${SPACE.S2} ${SPACE.S4}`,
6817
+ fontSize: FONT_SIZE.sm,
6818
+ color: COLOR.danger,
6819
+ background: COLOR.dangerBg,
6820
+ flex: "0 0 auto"
6821
+ },
6822
+ loading: {
6823
+ flex: "1 1 auto",
6824
+ display: "flex",
6825
+ alignItems: "center",
6826
+ justifyContent: "center"
6827
+ }
6828
+ };
6687
6829
  function useMessages({
6688
6830
  conversationId,
6689
6831
  initialLimit = MESSAGES_PAGE_SIZE
@@ -6901,6 +7043,7 @@ exports.ConversationList = ConversationList;
6901
7043
  exports.ConversationListItem = ConversationListItem;
6902
7044
  exports.DEEP_LINK_PREFIX = DEEP_LINK_PREFIX;
6903
7045
  exports.EVENTS = EVENTS;
7046
+ exports.HelpPanel = HelpPanel;
6904
7047
  exports.MAX_FILE_SIZE = MAX_FILE_SIZE;
6905
7048
  exports.MAX_PINNED_MESSAGES = MAX_PINNED_MESSAGES;
6906
7049
  exports.MESSAGES_PAGE_SIZE = MESSAGES_PAGE_SIZE;