Skip to content
fandhe-frontendcore v0.4.3
GitHub

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 の最小例:

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 自体はスタイルを持ちません。

How do I center a div?
Use flexbox:
display: flex; align-items: center; justify-content: center;
That should do it.
👍❤
Sent 09:41 · Edited
Thanks!

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-content

API Reference

Arguments

NameTypeDefaultDescription
root: props.variantBubbleVariantBubbleVariant::Solid見た目の形態(solid/outline/plain)。data-variant へ出力する(bubble.rs)。
root: props.alignMessageAlignMessageAlign::Start水平整列(start/end)。message::MessageAlign を再利用し data-align へ出力する(bubble.rs)。
root: props.group_positionBubbleGroupPositionBubbleGroupPosition::Single連続発言中の位置(single/first/middle/last)。算出は利用者責務。data-group-position へ出力する(bubble.rs)。
reactions: label&str""空でなければ aria-label へ出力する(bubble.rs)。
reaction: selectedboolfalsetrue のとき data-selected 存在属性を付与する(bubble.rs)。
collapse-trigger: stateOpenState(呼び出し側が指定)aria-expanded・data-state を同期させる開閉状態(collapsible.rs の属性契約を再利用、bubble.rs)。
collapse-trigger: controlsOption<&str>NoneSome のとき aria-controls で collapse-content と関連付ける(bubble.rs)。
collapse-content: stateOpenState(呼び出し側が指定)closed のとき hidden 存在属性を付与する(bubble.rs)。
collapse-content: idOption<&str>NoneSome のとき id 属性を出力し、collapse-trigger の controls と対で関連付ける(bubble.rs)。

Data Attributes

PartAttributeObserved Values
collapse-contentdata-stateclosed, open
collapse-triggerdata-stateclosed, open
reactiondata-selected(値なし)
rootdata-alignend, start
rootdata-group-positionfirst, last, middle, single
rootdata-variantoutline, plain, solid

Examples

Basic bubble pair

outline(自分側、右寄せ)と solid(相手側、左寄せ)の 1 往復です。

How do I center a div?
Use display: flex + place-items: center.

Consecutive bubbles with group position

同じ発言者の連続発言で data-group-position(first/middle/last)を使い分ける例です。

First, install the crate.
Then add it to your Cargo.toml.
Then call render().

自前 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 自体はスタイルを持ちません。

Styled with plain CSS.
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;
}

Accessibility

Keyboard Interactions

KeyDescription
Space / Entercollapse-trigger はネイティブ <button type="button"> として描画され、ブラウザ標準の Space/Enter → click 発火に従う(bubble.rs。fandhe-frontend-wasm-full の click → "toggle" dispatch 配線は現時点で未整備のため、CSR での実際の開閉には呼び出し側の配線が必要)。

WAI-ARIA

AttributeDescription
role="group" / aria-labelreactions パーツに固定付与する。label が空でなければ aria-label を出力する(bubble.rs「reactions/reaction」節)。
aria-expanded / aria-controlscollapse-trigger パーツに付与する。controls が Some のとき aria-controls で collapse-content と関連付ける(collapsible.rs の属性契約を再利用、bubble.rs)。