Component
Navigation

Sidebar

Conversation list UI you can run standalone or as part of ChatInterface.

Full working example

Each prop in this snippet is commented so you can map Sidebar behavior quickly.

AppSidebar.tsx
import React from 'react';
import { Sidebar } from '@jazzmine-ui/react';
import type { Chat } from '@jazzmine-ui/react';
import '@jazzmine-ui/react/styles';

export function AppSidebar() {
  const [chats] = React.useState<Chat[]>([]);
  const [activeChatId, setActiveChatId] = React.useState<string>();
  const [collapsed, setCollapsed] = React.useState(false);

  return (
    <div style={{ height: '100vh' }}>
      <Sidebar
        chats={chats} /* Required: list of conversations */
        activeChatId={activeChatId} /* Optional: selected conversation id */
        assistantName="Support Assistant" /* Optional: sidebar header label */
        onNewChat={() => {
          /* Required: define how new chats are created */
          console.log('Create new chat in your backend.');
        }}
        onSelectChat={setActiveChatId} /* Required: select active conversation */
        onDeleteChat={(chatId) => {
          /* Optional: enables built-in delete action */
          console.log('Delete chat:', chatId);
        }}
        onSearchClick={() => {
          /* Optional: open a separate search modal/workflow */
          console.log('Open conversation search modal.');
        }}
        onLoadMore={() => {
          /* Optional: pagination callback for infinite lists */
          console.log('Load more chats from backend.');
        }}
        hasMore={false} /* Optional: more pages flag */
        isLoadingChats={false} /* Optional: list loading state */
        collapsed={collapsed} /* Optional: controlled collapse state */
        onToggleCollapse={(value) => {
          /* Optional: controlled collapse toggle handler */
          setCollapsed((prev) => (typeof value === 'boolean' ? value : !prev));
        }}
        chatActions={[
          {
            label: 'Archive',
            onClick: (chatId) => {
              console.log('Archive chat:', chatId);
            },
          },
          {
            label: 'Delete permanently',
            danger: true,
            onClick: (chatId) => {
              console.log('Delete chat permanently:', chatId);
            },
          },
        ]}
      />
    </div>
  );
}

Sidebar props

PropTypeRequiredDefaultDescription
chatsChat[]Yes-Conversations to render.
onNewChat() => voidYes-New chat button callback.
onSelectChat(chatId: string) => voidYes-Select chat callback.
activeChatIdstringNo-Current selected chat id.
assistantNamestringNo-Header title label.
logostringNoBuilt-in logoCustom header/logo image.
logoAltstringNo-Logo alt text.
chatActionsChatAction[]NoBuilt-in actionsCustom chat action menu items.
onRenameChat(chatId: string, newTitle?: string) => voidNo-Enables default rename action.
onDeleteChat(chatId: string) => voidNo-Enables default delete action.
onArchiveChat(chatId: string) => voidNo-Enables default archive action.
onSearchClick() => voidNo-Search trigger callback.
onLoadMore() => voidNo-Infinite-scroll load callback.
hasMorebooleanNofalseMore pages available.
isLoadingChatsbooleanNofalseLoading state for chat list.
isSearchOpenbooleanNofalseSearch input visibility.
searchQuerystringNo''Search query value.
onSearchQueryChange(query: string) => voidNo-Search query change callback.
classNamestringNo''Root class override.
collapsedbooleanNoInternal stateControlled collapse mode.
onToggleCollapse(value?: boolean) => voidNo-Controlled collapse handler.

Collapse behavior

Controlled collapse mode

Pass both collapsed and onToggleCollapse to control expansion state from your app. If you omit them, Sidebar manages collapse state internally.

Custom chatActions

Provide chatActions to replace or extend the default action menu per conversation.

chat-action.ts
interface ChatAction {
  label: string;
  icon?: React.ReactNode;
  onClick: (chatId: string) => void;
  danger?: boolean;
}