Component
Embedded UX

Floating Chat Widget

A floating launcher button fixed to the screen corner that opens a compact chat panel when clicked.

How the floating UX works

This works well for support bots, embedded assistants, and any app where chat is secondary to the main page content.

Full working example

Inline comments explain what each prop controls in the launcher and panel flow.

Widget.tsx
import React from 'react';
import { FloatingChatWidget } from '@jazzmine-ui/react';
import type { Message } from '@jazzmine-ui/react';
import '@jazzmine-ui/react/styles';

export function Widget() {
  const [messages, setMessages] = React.useState<Message[]>([]);
  const [isLoading, setIsLoading] = React.useState(false);

  const onSend = (text: string) => {
    setMessages((prev) => [
      ...prev,
      { id: crypto.randomUUID(), text, sender: 'user', timestamp: new Date().toISOString() },
      {
        id: crypto.randomUUID(),
        text: `Echo: ${text}`,
        sender: 'assistant',
        timestamp: new Date().toISOString(),
      },
    ]);
  };

  return (
    <FloatingChatWidget
      messages={messages} /* Required: current widget message feed */
      isLoading={isLoading} /* Optional: assistant loading state */
      initialOpen={false} /* Optional: panel starts closed by default */
      assistantName="Support Assistant" /* Optional: widget header title */
      onSend={onSend} /* Optional: send handler for user messages */
      onOpen={(open) => {
        /* Optional: track open/close transitions for analytics or UI state */
        console.log('Widget open state:', open);
      }}
    />
  );
}

FloatingChatWidget props

PropTypeRequiredDefaultDescription
messagesMessage[]Yes-Message feed data.
assistantNamestringNo-Header title in widget panel.
isLoadingbooleanNofalseLoading state.
loadingTextstringNo'typing'Loading text.
loadingVariant'text-and-dots' | 'dots-only'No'text-and-dots'Loading indicator style.
initialOpenbooleanNofalseInitial panel open state.
onOpen(open: boolean) => voidNo-Open/close change callback.
onSend(text: string) => voidNo-Message send callback.
logostringNoBuilt-in logoWidget button image source.
classNamestringNo''Root class override.

Notes

initialOpen sets first render state

initialOpen only controls whether the panel starts open or closed on mount.

Use onOpen for analytics and app events

onOpen fires when the panel opens or closes, which is useful for tracking engagement or synchronizing global UI state.