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 は未登録のため現時点では未配線です。
キーボード操作
| キー | 対象 | 効果 |
|---|---|---|
| Tab | Trigger | trigger はネイティブ button 要素のため、ブラウザ標準でフォーカス到達します(disabled 時は除外)。 |
| Enter / Space | Trigger | click は発火しますが、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] ガードを必ず含めます。
[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 自体はスタイルを持ちません。
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-tipAPI Reference
Arguments
| Name | Type | Default | Description |
|---|---|---|---|
root: state | OpenState | Closed | 開閉状態(data-state へ反映)。 |
trigger: state | OpenState | Closed | aria-expanded/data-state へ反映される開閉状態。 |
trigger: disabled | bool | — | ネイティブ disabled 存在属性と data-disabled の両方へ反映する disabled 状態。 |
trigger: controls | Option<&str> | — | Some のとき aria-controls で content と関連付ける。 |
positioner: state | OpenState | Closed | closed のとき hidden 存在属性を付与する配置ラッパーの開閉状態。 |
content: state | OpenState | Closed | 開閉状態(closed のとき hidden 存在属性を付与)。 |
content: id | Option<&str> | — | trigger の controls と対で aria-controls 関連付けを成立させる。 |
Data Attributes
| Part | Attribute | Observed Values |
|---|---|---|
content | data-state | closed, open |
positioner | data-state | closed, open |
root | data-state | closed, open |
trigger | data-disabled | (値なし) |
trigger | data-state | closed, 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 自体はスタイルを持ちません。
[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
| Key | Description |
|---|---|
| Tab | trigger はネイティブ button 要素(toggle_tip.rs の trigger)のためブラウザ標準でフォーカス到達する(disabled 時は除外)。Enter/Space は click を発火するが、fandhe-frontend-wasm-full の MAPPING_TABLE に toggle-tip scope の行が無いため開閉 dispatch は未配線(イシュー #1644)。 |
WAI-ARIA
| Attribute | Description |
|---|---|
| aria-expanded | trigger に付与。開閉状態を反映する。 |
| aria-controls | trigger に付与。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 に固定付与(装飾用のみ、スクリーンリーダーの読み上げ対象外)。 |