Skip to content
fandhe-frontendcore v0.4.3
GitHub

Toggle Tip

クリック開閉の小型ヒントです。fandhe-frontend-headless-ui の toggle_tip mod は Root / Trigger / Positioner / Content / Arrow / ArrowTip の 6 anatomy パーツを提供します。見た目は Tooltip(小型・非モーダル)、挙動は Popover(クリックで開閉し明示的に閉じるまで持続)の変種と位置づけられ、trigger は aria-expanded を持ちますが aria-haspopup は付与せず、content も role="tooltip" を持ちません(Tooltip・Popover いずれとも異なる 3 者境界)。本部品は SSR での属性出力と状態機械のみを担い、click → dispatch・Escape 閉鎖・外側クリック閉鎖・placement 計算は fandhe-frontend-wasm-full 側の責務ですが、"toggle-tip" scope は未登録のため現時点では未配線です。

キーボード操作

キー対象効果
TabTriggertrigger はネイティブ button 要素のため、ブラウザ標準でフォーカス到達します(disabled 時は除外)。
Enter / SpaceTriggerclick は発火しますが、fandhe-frontend-wasm-full の MAPPING_TABLE に toggle-tip scope の行が無いため開閉 dispatch は未配線です。
Escape—参考サイト(chakra-ui、既定 closeOnEscape: true)では最上位のツールチップを閉じますが、本リポジトリでは未配線です。

参考サイトとの差分

ark-ui に Toggle Tip コンポーネントは存在せず(ark-ui.com/docs/components/toggle-tip は 2026-09-06 時点で HTTP 404)、Radix Primitives / Radix Themes にも該当部品はありません。唯一の直接参照は chakra-ui ToggleTip(Ark Popover を内包したラッパー)で、これと突合した結果、是正すべき具体的な欠落は見つかりませんでした(イシュー #1644)。anatomy(6 パート)・data-state/data-disabled 語彙はいずれも一致しています。一方、以下は意図的に合わせていません。

  • aria-haspopup="dialog" / role="dialog" / tabindex="-1": chakra-ui ToggleTip は Ark Popover 基盤のためこれらを持ちますが、本部品の content は非対話の短文テキストであり dialog ロールは不適合と判断し、非付与を維持しています。tabindex="-1" は fandhe-frontend-wasm-full 配線後に再評価します。
  • Zag/chakra の data-placement: positioner の data-side/ data-align(positioning、#590)が同役割を担うため置き換えていません。
  • Zag の data-expanded(content): data-state + aria-expanded と重複するため不採用です。
  • 複数トリガー識別(data-value/data-current/data-ownedby): 機能拡張でありスコープ外候補です(下記参照)。
  • Portal: DOM 配置の関心のため headless anatomy には持ち込みません。
  • chakra-ui の Sizes / InfoTip: fandhe-frontend-pre-styled-ui(Themes 層)の関心のため headless anatomy には持ち込みません。

上記の差分に伴う data-*・パートの増減は無いため、Themes 側イシュー #1546(closed)への追加コメントは行っていません。

スコープ外候補(是正対象ではなく、別途起票を検討する余地がある事項):

  • fandhe-frontend-wasm-full への "toggle-tip" scope 登録(headless::MAPPING_TABLE の trigger→toggle 対応・overlay::OverlayKind・position::PositionedKind への追加。click → dispatch・Escape・外側クリック閉鎖・placement 計算の配線)
  • 配線後の content tabindex="-1" 付与の再評価
  • docs/api/headless-ui-api.md §4a.1 表の ToggleTip 行が PositionedKind 未登録の実装と整合していない点(hover-card と同状態)

スタイル済みの表示例は Toggle Tip を参照してください。

関連 API: fandhe-frontend-headless-ui API

自前 CSS の最小例

Themes 版を使わず本部品を直接使う場合、[data-scope="toggle-tip"][data-part="..."] セレクタでスタイルを当てます。author スタイルの display が UA の [hidden] { display: none } を上書きして closed 状態が見えてしまわないよう、positioner/content には [hidden] ガードを必ず含めます。

CSS
[data-scope="toggle-tip"][data-part="root"] {
  position: relative;
  display: inline-block;
}

[data-scope="toggle-tip"][data-part="positioner"] {
  position: absolute;
  top: 100%;
  left: 0;
}

[data-scope="toggle-tip"][data-part="positioner"][hidden],
[data-scope="toggle-tip"][data-part="content"][hidden] {
  display: none;
}

[data-scope="toggle-tip"][data-part="content"] {
  background: #fff;
  border: 1px solid rgb(0 0 0 / 0.1);
  border-radius: 6px;
  padding: 0.5rem 0.75rem;
  box-shadow: 0 0.25rem 1rem rgb(0 0 0 / 0.15);
}

[data-scope="toggle-tip"][data-part="trigger"][data-state="open"] {
  background: #eef2ff;
}

[data-scope="toggle-tip"][data-part="trigger"][data-disabled] {
  opacity: 0.5;
  cursor: not-allowed;
}

[data-scope="toggle-tip"][data-part="arrow"] {
  position: absolute;
  width: 0.5rem;
  height: 0.5rem;
}

Demo

枠線・余白は docs サイト側のデモ枠であり、fandhe-frontend-headless-ui 自体はスタイルを持ちません。

Click again to dismiss.

Features

  • Tooltip(hover/focus 由来)・Popover(クリック起点のダイアログ相当)のいずれとも異なる立ち位置を持つ: trigger は aria-expanded と(controls が Some のとき)aria-controls を持つが aria-haspopup は付与せず、content は role="tooltip" を持たない非対話テキストとして扱う(モジュール doc §3 者境界)。
  • Root / Trigger / Positioner / Content / Arrow / ArrowTip の 6 anatomy パーツと、Disclosure を埋め込んだ開閉状態機械 ToggleTip を提供する。
  • click-outside dismiss(トリガー外クリックでの自動閉鎖)・Escape 閉鎖・click → dispatch 配線・placement 計算は fandhe-frontend-wasm-full の責務だが、headless::MAPPING_TABLE / overlay::OverlayKind / position::PositionedKind に "toggle-tip" scope が未登録のため現時点では未配線(イシュー #1644 で確認、別イシュー提案)。
  • chakra-ui ToggleTip(Ark Popover 基盤)と突合し、anatomy 6 パーツ・data-state/data-disabled 語彙は一致することを確認した。ARIA 3 者境界(aria-haspopup/role="dialog" 非付与)は意図的差分として維持している(イシュー #1644、是正なし)。

Anatomy

root
  trigger
  positioner
    content
      arrow
        arrow-tip

API Reference

Arguments

NameTypeDefaultDescription
root: stateOpenStateClosed開閉状態(data-state へ反映)。
trigger: stateOpenStateClosedaria-expanded/data-state へ反映される開閉状態。
trigger: disabledbool—ネイティブ disabled 存在属性と data-disabled の両方へ反映する disabled 状態。
trigger: controlsOption<&str>—Some のとき aria-controls で content と関連付ける。
positioner: stateOpenStateClosedclosed のとき hidden 存在属性を付与する配置ラッパーの開閉状態。
content: stateOpenStateClosed開閉状態(closed のとき hidden 存在属性を付与)。
content: idOption<&str>—trigger の controls と対で aria-controls 関連付けを成立させる。

Data Attributes

PartAttributeObserved Values
contentdata-stateclosed, open
positionerdata-stateclosed, open
rootdata-stateclosed, open
triggerdata-disabled(値なし)
triggerdata-stateclosed, open

Examples

Disabled trigger

disabled な trigger はネイティブ disabled 属性と data-disabled が付与され、フォーカス・展開ができなくなります。

Custom CSS

data-scope / data-part / data-state / data-disabled セレクタで自前 CSS を当てる最小例です。

利用者が data-scope / data-part / data-state / data-disabled セレクタで自前 CSS を当てる最小例です。headless-ui 自体はスタイルを持ちません。

Custom-styled toggle tip.
CSS
[data-scope="toggle-tip"][data-part="root"] {
  position: relative;
  display: inline-block;
}
[data-scope="toggle-tip"][data-part="positioner"] {
  position: absolute;
  top: 100%;
  left: 0;
}
[data-scope="toggle-tip"][data-part="positioner"][hidden],
[data-scope="toggle-tip"][data-part="content"][hidden] {
  display: none;
}
[data-scope="toggle-tip"][data-part="content"] {
  background: #fff;
  border: 1px solid rgb(0 0 0 / 0.1);
  border-radius: 6px;
  padding: 0.5rem 0.75rem;
  box-shadow: 0 0.25rem 1rem rgb(0 0 0 / 0.15);
}
[data-scope="toggle-tip"][data-part="trigger"][data-state="open"] {
  background: #eef2ff;
}
[data-scope="toggle-tip"][data-part="trigger"][data-disabled] {
  opacity: 0.5;
  cursor: not-allowed;
}
[data-scope="toggle-tip"][data-part="arrow"] {
  position: absolute;
  width: 0.5rem;
  height: 0.5rem;
}

Accessibility

Keyboard Interactions

KeyDescription
Tabtrigger はネイティブ button 要素(toggle_tip.rs の trigger)のためブラウザ標準でフォーカス到達する(disabled 時は除外)。Enter/Space は click を発火するが、fandhe-frontend-wasm-full の MAPPING_TABLE に toggle-tip scope の行が無いため開閉 dispatch は未配線(イシュー #1644)。

WAI-ARIA

AttributeDescription
aria-expandedtrigger に付与。開閉状態を反映する。
aria-controlstrigger に付与。controls が Some のとき content と関連付ける。
aria-haspopup / role="tooltip"(非付与)trigger には aria-haspopup を、content には role="tooltip" を付与しない(Tooltip/Popover との違い、モジュール doc §3 者境界参照)。chakra-ui ToggleTip(Ark Popover 基盤)は aria-haspopup="dialog"/role="dialog"/tabindex="-1" を持つが、非対話の短文テキストという性質上 dialog ロールは不適合と判断し、意図的差分として非付与を維持する(イシュー #1644 突合)。
aria-hidden="true"arrow/arrow_tip に固定付与(装飾用のみ、スクリーンリーダーの読み上げ対象外)。