Bubble
チャット吹き出し 1 個を表現する shadcn/ui Bubble 相当の部品です(参照軸はイシュー #2001)。fandhe-frontend-headless-ui の bubble mod が構造・アクセシビリティ(WAI-ARIA)・表示状態(data-*)のみを提供する unstyled 部品で、root / content / reactions / reaction / collapse-trigger / collapse-content の 6 anatomy パーツを持ちます。状態機械を持たない静的部品です。
root は variant(solid / outline / plain)・align(start / end)・group_position(single / first / middle / last)の props を受け取り、それぞれ data-variant / data-align / data-group-position として出力します。data-align は会話系部品(message / bubble / attachment / marker)が共有する共通語彙(正は message mod)をそのまま再利用します。data-variant は shadcn/ui の 7 色調バリアントを「塗り・枠線・無装飾」の 3 形態へ縮約したもので、実際の色調選択(アクセント・破壊的操作色等)は fandhe-frontend-pre-styled-ui の ColorPalette 軸の責務です。data-group-position は連続発言の角丸連結用の表示状態のみを持ち、「何番目か」の算出は利用者側の責務です(部品はリスト全体を受け取りません)。
content はスロットで、Markdown レンダリング結果等の中身は利用者側で用意します。reactions は role="group" + 任意 aria-label を固定付与し、内部の reaction は data-selected(存在属性)のみを持つ非インタラクティブな表示用パーツです。押下・集計・トグルはアプリケーション側の責務です。
collapse-trigger / collapse-content は開閉パネル(collapsible mod)と同じ属性契約(aria-expanded / aria-controls / data-state)を bubble scope のまま再利用します。collapse-trigger はネイティブ <button type="button"> として描画され、ブラウザ標準の Space/Enter → click 発火に従います。fandhe-frontend-wasm-full の click → "toggle" dispatch 配線は現時点で未整備のため、CSR での実際の開閉には呼び出し側が状態(OpenState)を保持して各パーツへ注入する配線が必要です。
アクセシビリティ
reactionsはrole="group"を固定付与します。labelを渡すとaria-labelを出力します(空文字列のときは省略します)。collapse-triggerはaria-expandedとdata-stateを開閉状態に同期させます。controlsを渡すとaria-controlsでcollapse-contentと関連付けます。collapse-contentは closed のときhidden存在属性を付与し、JS なしの SSR でも閉状態を表現します。
fandhe-frontend-pre-styled-ui に対応するスタイル済み部品があります。Themes 版は Bubble を参照してください。
自前 CSS の最小例:
[data-scope="bubble"][data-part="root"] {
display: inline-block;
max-width: 32rem;
padding: 0.5rem 0.75rem;
border-radius: 0.75rem;
}
[data-scope="bubble"][data-part="root"][data-variant="solid"] {
background: #e2e8f0;
}
[data-scope="bubble"][data-part="root"][data-variant="outline"] {
border: 1px solid #cbd5e1;
}
[data-scope="bubble"][data-part="root"][data-group-position="first"] {
border-radius: 0.75rem 0.75rem 0.75rem 0.25rem;
}
[data-scope="bubble"][data-part="root"][data-group-position="last"] {
border-radius: 0.75rem 0.75rem 0.25rem 0.75rem;
}関連 API: fandhe-frontend-headless-ui API
Demo
枠線・余白は docs サイト側のデモ枠であり、fandhe-frontend-headless-ui 自体はスタイルを持ちません。
Features
- チャット吹き出し 1 個を表現する 6 anatomy パーツ(root/content/reactions/reaction/collapse-trigger/collapse-content)を提供する(bubble.rs)。状態機械を持たない静的部品。
- data-align は会話系 4 部品(message/bubble/attachment/marker)の共通語彙(正は message.rs)をそのまま再利用する。data-variant(solid/outline/plain)は shadcn の 7 色調を「塗り・枠線・無装飾」の 3 形態へ縮約し、実際の色調選択は fandhe-frontend-pre-styled-ui の ColorPalette 軸へ委ねる(bubble.rs「data-variant」節)。
- data-group-position(single/first/middle/last)は連続発言の角丸連結用の表示状態のみを持ち、算出(何番目かの判定)は利用者責務である(bubble.rs「data-group-position」節)。
- reactions/reaction は role="group" + 任意 aria-label(role="img" は不採用)を採用し、reaction は data-selected 存在属性のみを持つ非インタラクティブな表示用パーツである。押下・集計・トグルは内包しない(bubble.rs「reactions/reaction」節)。
- collapse-trigger/collapse-content は collapsible.rs の属性契約(OpenState・aria-expanded・aria-controls)を bubble scope のまま再利用する。fandhe-frontend-wasm-full の折りたたみクリック配線は現時点で未整備(bubble.rs「wasm-full 未配線」節)。参照実体は shadcn/ui の Bubble のみ(ark-ui・chakra-ui・Radix に対応部品なし、参照軸 #2001)。
Anatomy
root
content
reactions
reaction
collapse-trigger
collapse-contentAPI Reference
Arguments
| Name | Type | Default | Description |
|---|---|---|---|
root: props.variant | BubbleVariant | BubbleVariant::Solid | 見た目の形態(solid/outline/plain)。data-variant へ出力する(bubble.rs)。 |
root: props.align | MessageAlign | MessageAlign::Start | 水平整列(start/end)。message::MessageAlign を再利用し data-align へ出力する(bubble.rs)。 |
root: props.group_position | BubbleGroupPosition | BubbleGroupPosition::Single | 連続発言中の位置(single/first/middle/last)。算出は利用者責務。data-group-position へ出力する(bubble.rs)。 |
reactions: label | &str | "" | 空でなければ aria-label へ出力する(bubble.rs)。 |
reaction: selected | bool | false | true のとき data-selected 存在属性を付与する(bubble.rs)。 |
collapse-trigger: state | OpenState | (呼び出し側が指定) | aria-expanded・data-state を同期させる開閉状態(collapsible.rs の属性契約を再利用、bubble.rs)。 |
collapse-trigger: controls | Option<&str> | None | Some のとき aria-controls で collapse-content と関連付ける(bubble.rs)。 |
collapse-content: state | OpenState | (呼び出し側が指定) | closed のとき hidden 存在属性を付与する(bubble.rs)。 |
collapse-content: id | Option<&str> | None | Some のとき id 属性を出力し、collapse-trigger の controls と対で関連付ける(bubble.rs)。 |
Data Attributes
| Part | Attribute | Observed Values |
|---|---|---|
collapse-content | data-state | closed, open |
collapse-trigger | data-state | closed, open |
reaction | data-selected | (値なし) |
root | data-align | end, start |
root | data-group-position | first, last, middle, single |
root | data-variant | outline, plain, solid |
Examples
Basic bubble pair
outline(自分側、右寄せ)と solid(相手側、左寄せ)の 1 往復です。
Consecutive bubbles with group position
同じ発言者の連続発言で data-group-position(first/middle/last)を使い分ける例です。
自前 CSS の最小例
data-scope/data-part/data-variant/data-align/data-group-position 属性セレクタでスタイルを当てる例です。
data-scope / data-part / data-variant / data-align / data-group-position 属性セレクタで塗り・角丸連結を当てる最小例です。headless-ui 自体はスタイルを持ちません。
[data-scope="bubble"][data-part="root"] {
display: inline-block;
max-width: 32rem;
padding: 0.5rem 0.75rem;
border-radius: 0.75rem;
}
[data-scope="bubble"][data-part="root"][data-variant="solid"] {
background: #e2e8f0;
}
[data-scope="bubble"][data-part="root"][data-variant="outline"] {
border: 1px solid #cbd5e1;
}
[data-scope="bubble"][data-part="root"][data-group-position="first"] {
border-radius: 0.75rem 0.75rem 0.75rem 0.25rem;
}
[data-scope="bubble"][data-part="root"][data-group-position="last"] {
border-radius: 0.75rem 0.75rem 0.25rem 0.75rem;
}
Accessibility
Keyboard Interactions
| Key | Description |
|---|---|
| Space / Enter | collapse-trigger はネイティブ <button type="button"> として描画され、ブラウザ標準の Space/Enter → click 発火に従う(bubble.rs。fandhe-frontend-wasm-full の click → "toggle" dispatch 配線は現時点で未整備のため、CSR での実際の開閉には呼び出し側の配線が必要)。 |
WAI-ARIA
| Attribute | Description |
|---|---|
| role="group" / aria-label | reactions パーツに固定付与する。label が空でなければ aria-label を出力する(bubble.rs「reactions/reaction」節)。 |
| aria-expanded / aria-controls | collapse-trigger パーツに付与する。controls が Some のとき aria-controls で collapse-content と関連付ける(collapsible.rs の属性契約を再利用、bubble.rs)。 |