リファレンス

0.3.3 時点。パーツ名・プロパティ名・イベント名・スロット名・CSS カスタムプロパティ名は 公開 API として扱い、変更はメジャーバージョンでのみ行います。

エントリポイント

指定中身
@hidemikimura/chit-ui<chit-ui> を登録する。型もここから読める
@hidemikimura/chit-ui/element.js登録しない。ChitUI クラスだけ
@hidemikimura/chit-ui/themes.js付属テーマ(greenTheme)
dist/chit-ui.min.jsLit 同梱の ESM 単一バンドル
dist/chit-ui.iife.min.js同上の IIFE 版。window.ChitUI

プロパティ

プロパティ型既定内容
state'closed' | 'open' | 'hidden''closed'現在の状態
themeTheme{}テーマ(部分指定可)
messagesMessage[][]描画する発言。必ず新しい配列を代入する
typingboolean | { html }false相手が入力中の表示。loading とは排他
loadingbooleanfalse応答待ちの表示。属性にも反映される
busybooleanfalse送信中。入力をロックする
inputDisabledbooleanfalse入力欄を見せたままロック
inputHiddenbooleanfalse入力欄を消す
valuestring''入力欄の内容
placeholderstringテーマの値入力欄のプレースホルダー
sendOnEnterbooleantrueEnter で送信するか
maxLengthnumberなし入力の上限(コードポイント単位)
focusOnOpen'auto' | 'always' | 'never''auto'開いたときの自動フォーカス。auto は PC のみ
sanitize(html) => stringなしhtml 発言のサニタイズ
formatTime(time: Date) => stringHH:mm時刻表示
messageStylesstring''発言の中に適用する追加 CSS
localestring<html lang>ラベルと時刻の言語
labelsPartial<Labels>なしUI 文字列の上書き
dragOffset{ x, y } | nullnullドラッグで生じたずれ。読み書きできる

読み取り専用: renderedState、device ('pc' | 'mobile')、hasUnseen、canSend、 currentTheme、currentLabels、resolvedLocale。

メソッド

メソッド内容
open() close() hide() show() toggle()状態遷移。アニメーション完了で resolve する Promise(中止されたら false)
submit(text?)chat-submit を発火。省略時は入力欄の内容
focusInput() clearInput()入力欄の操作
scrollToBottom({ smooth })最新へスクロール。省略時はテーマの設定に従う
getMessageElement(id)その発言のコンテナ DOM(未描画なら null)
home()chat-home を発火(ホームボタンと同じ)
openAttach()添付のファイル選択を開く
resetPosition()ドラッグで動かした位置を忘れる

イベント

すべて CustomEvent で、bubbles と composed が 立っているので document でも拾えます。trigger は 'user'(クリックや Esc)か 'api'(メソッドやプロパティ代入)です。

イベントタイミングdetail中止
chat-submit送信された{ text }○
chat-before-open / chat-before-close遷移の直前{ from, trigger }○
chat-open / chat-close遷移アニメーション完了{ from, trigger }
chat-hide / chat-show非表示になった / 戻った{ from, to }
chat-state-changestate が変わった直後{ from, to, trigger }
chat-input入力欄が編集された{ value }
chat-message-render発言が描画・更新された{ message, element, instance }
chat-message-click発言の中がクリックされた{ message, target, originalEvent }○
chat-scroll-top一覧が最上部に達した{}
chat-breakpoint-changePC / スマホの判定が変わった{ device }
chat-homeホームボタン、または home(){ trigger }
chat-attach添付ファイルが選ばれた{ files: File[] }
chat-moveドラッグまたは矢印キー{ target, position, offset, displacement }

発言オブジェクト

{
  id: string,                       // 必須・安定していること
  role: 'user' | 'assistant' | 'system',
  name?: string | null,             // テーマの既定を打ち消すなら null
  avatar?: string | null,
  time?: Date | string | number,
  status?: 'sending' | 'sent' | 'error',
  streaming?: boolean,              // 末尾にカーソル、aria-busy
  meta?: unknown,                   // 自由欄。イベントでそのまま返る

  // 以下のいずれか 1 つ
  text?: string,
  html?: string,
  template?: TemplateResult,
  element?: HTMLElement,
  component?: (new () => HTMLElement) | string,
  props?: Record<string, unknown>,
}

テーマ

{
  breakpoint?: number,                       // 既定 768
  closed?: {
    // pc / mobile に分けて書ける。分けなければ両方に同じ設定
    position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left',
    offset?: { x: number, y: number },
    size?: number | 'auto',
    radius?: number,
    image?: string | null,
    label?: string | null,
    component?: (new () => HTMLElement) | string,
    props?: Record<string, unknown>,
    colors?: { bg?, text?, shadow? },
    draggable?: boolean,                     // 既定 false
    animation?: { enter?, exit?, duration? },
  },
  open?: {
    width?: number, height?: number,         // スマホでは無視(常に全画面)
    position?: Position, offset?: { x, y },
    radius?: number,
    launcher?: 'hidden' | 'visible',
    draggable?: boolean,                     // 取っ手はタイトルバー。スマホでは無効
    header?: { visible?, title?, logo?, home? },
    bubble?: { radius?: number, tail?: 'none' | 'top' | 'bottom' },
    speaker?: { assistant?: { name?, avatar? }, user?: { name?, avatar? } },
    loading?: { auto?, style?: 'dots' | 'spinner' | 'text', text?, timeout? },
    input?: { maxRows?, placeholder?, attach?, accept?, multiple? },
    colors?: { bg?, text?, accent?, border?, userBubble?, userText?, assistantBubble?,
               assistantText?, systemText?, headerBg?, headerText?, inputBg?, inputText?,
               inputPlaceholder? },
    bgImage?: string | null,
    animation?: { enter?, exit?, duration?, scroll?: 'smooth' | 'instant' },
  },
  hidden?: { animation?: { exit?, duration? } },
}

animation の enter / exit は 'fade' / 'scale' / 'slide' / 'none'。長さは duration(ms)で、CSS 変数にはしていません (遷移の完了を JavaScript 側が知る必要があるためです)。

スロット

スロット差し替え対象
launcher閉じた状態のアイコンの中身
headerパネルヘッダー全体(header-title / header-actions で部分差し替えも可)
empty発言が 1 件もないときの表示
input-before / input-after入力欄の前後
composer入力欄全体。差し替えたら submit(text) を自分で呼ぶ
footer入力欄の下(免責事項など)

CSS パーツ

::part() で外からスタイルを当てられます。

launcher launcher-icon launcher-label panel header header-title header-heading header-logo header-actions home-button close-button messages messages-inner message message-user message-assistant message-system bubble message-content avatar name meta time status cursor typing loading loading-text to-latest composer input attach-button attach-input counter send-button spinner

CSS カスタムプロパティ

テーマの値はここに出ます。ページ側の指定のほうが優先されます。

色

--chit-color-bg --chit-color-text --chit-color-accent --chit-color-border --chit-color-user-bg --chit-color-user-text --chit-color-assistant-bg --chit-color-assistant-text --chit-color-system-text --chit-color-header-bg --chit-color-header-text --chit-color-input-bg --chit-color-input-text --chit-color-input-placeholder

ランチャー

--chit-launcher-size --chit-launcher-radius --chit-launcher-offset-x --chit-launcher-offset-y --chit-launcher-bg --chit-launcher-text --chit-launcher-shadow --chit-launcher-image

パネルと吹き出し

--chit-panel-width --chit-panel-height --chit-panel-radius --chit-panel-offset-x --chit-panel-offset-y --chit-panel-shadow --chit-panel-bg-image --chit-bubble-radius

全体

--chit-font-family --chit-font-size --chit-z-index

--_chit- で始まる変数は内部用です。変更しないでください。

型

import type { Message, Theme, Position, Role, ChatState, Device } from '@hidemikimura/chit-ui';

chit-ui 要素と chat-* イベントの型も一緒に入るので、 document.querySelector('chit-ui') の戻り値や addEventListener('chat-submit', ...) の detail に型が付きます。