Headless Primitives

Unstyled Chat.* compound components — all behavior, zero styling opinions. Terminal-style custom theme to prove it.

terminal-chat v1.0
$
CustomChat.tsx · tsx
import { Chat, useChatSuggestions, useChatRootContext } from "@hikari/chat-react";

function CustomChat() {
  return (
    <Chat.Root baseUrl="https://agent-api.zenku.dev" defaultOpen>
      <TerminalUI />
    </Chat.Root>
  );
}

function TerminalUI() {
  const { isOpen } = useChatRootContext();
  return (
    <>
      {!isOpen && (
        <Chat.Trigger className={styles.trigger}>
          &gt; open_chat
        </Chat.Trigger>
      )}
      <Chat.Panel className={styles.panel}>
        <header className={styles.header}>
          <span>terminal-chat v1.0</span>
          <Chat.CloseButton className={styles.close}>
            [x]
          </Chat.CloseButton>
        </header>
        <Chat.Messages className={styles.messages}>
          {(message, index) => (
            <Chat.Message key={message.id} message={message} index={index}>
              <Chat.MessageContent renderA2UI renderToolCalls />
              <Chat.Interrupt>
                {({ approval, onRespond, isResolved }) => (
                  <ApprovalUI approval={approval}
                    onRespond={onRespond} isResolved={isResolved} />
                )}
              </Chat.Interrupt>
            </Chat.Message>
          )}
        </Chat.Messages>
        <Chat.LoadingIndicator className={styles.loading}>
          <span className={styles.blink}>_</span>
        </Chat.LoadingIndicator>
        <SuggestionsBar />
        <Chat.InputArea className={styles.inputArea}>
          <span className={styles.prompt}>$</span>
          <Chat.Input className={styles.input}
            placeholder="Type a message..." />
          <Chat.SendButton className={styles.send}>
            Enter
          </Chat.SendButton>
        </Chat.InputArea>
      </Chat.Panel>
    </>
  );
}

Shared State (useChatReadable)

shoppingCart: 2 items, $105.97
1x Wireless Headphones ($79.99)
2x USB-C Cable ($12.99)

Registered Actions (useChatAction)

showNotification(title, message, type)
addToCart(productId, productName, price, quantity?)

Custom Tool Renderer (useRenderToolCall)

search_knowledge_base → custom card UI