Overview

Components Library

Headless primitives and copy-paste blocks for building AI chat interfaces

Arlopass ships two complementary layers for UI development:

Package What it is Install
@arlopass/react-ui Headless compound components — no styles, full control pnpm add
@arlopass/ui Styled Tailwind blocks — copy into your project via CLI pnpm dlx @arlopass/ui add

Install

pnpm add @arlopass/react-ui

Quick example

A fully functional uncontrolled chat in under 20 lines. The Chat.Root manages conversation state internally — just drop it in and go.

import { Chat, StreamingText, Message } from "@arlopass/react-ui";

function MyChat() {
  return (
    <Chat.Root systemPrompt="You are a helpful assistant.">
      <Chat.Messages>
        {(messages, streamingContent) => (
          <>
            {messages.map((msg) => (
              <Chat.Message key={msg.id} message={msg}>
                <Message.Root>
                  <Message.Content />
                </Message.Root>
              </Chat.Message>
            ))}
            {streamingContent && <StreamingText content={streamingContent} />}
          </>
        )}
      </Chat.Messages>
      <Chat.Input placeholder="Type a message…" />
      <Chat.SendButton>Send</Chat.SendButton>
    </Chat.Root>
  );
}

Primitives

All primitives are exported from @arlopass/react-ui. Each is a compound component with dot-notation sub-components (e.g. Chat.Root, Chat.Messages).

Component Description
Chat Compound component for a full chat interface — manages conversation state, message rendering, input, send/stop buttons, and streaming.
Message Renders a single message with role-aware layout, markdown content, and tool-call display slots.
StreamingText Renders in-progress assistant output with token-by-token display.
ProviderPicker Compound component for selecting an AI provider and model from the user’s configured list.
ToolActivity Displays tool-call invocations and their results inline within a message.
ConnectionStatus Renders content conditionally based on the Arlopass extension connection state (connected / disconnected / not installed).

Data attributes

Primitives expose semantic data-* attributes on their rendered DOM elements so you can style states with plain CSS — no JavaScript required.

Attribute Purpose Example values
data-role Message author role user, assistant, system
data-state Component state idle, streaming, error
data-status Connection status connected, disconnected, not-installed
/* Style user messages differently using data attributes */
[data-role="user"] {
  background: #2563eb;
  color: white;
}

[data-role="assistant"] {
  background: #f4f4f5;
}

[data-state="streaming"] {
  opacity: 0.8;
}

[data-status="connected"] {
  color: #22c55e;
}