Collapsible
高さのモーションで表示と非表示を切り替えるパネルです。途中で反転でき、レイアウトが跳ねません。
@preetsuthar17 starred 3 repositories
pnpm dlx shadcn@latest add https://hextaui.com/r/collapsible.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @base-ui/react @tabler/icons-react cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/collapsible.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
デフォルトで開く
defaultOpen は、state を引き受けずに、パネルを開いた状態で開始します。
さらに表示
パネルはトリガーの上に配置されます。閉じるときは、親の flex レイアウトの余白が同じアニメーションで詰まるため、下のボタンが跳ねることはありません。
制御
パネルを自分の state で制御するには、open と onOpenChange を渡します。アニメーションの途中で切り替えると、パネルの現在位置から逆再生されます。
無効
ルートの disabled は、パネルを現在の状態に保ち、トリガーがクリックとキー操作を無視するようにします。
カスタムアイコン
<CollapsibleTriggerIcon /> の子要素は山形アイコンを置き換えます。開いた状態のスタイルは group-data-panel-open/collapsible-trigger で指定します。
ファイルツリー
各フォルダーは独立した collapsible です。内側が開くと、外側のパネルがなめらかに広がります。
カードの内側
閉じたパネルは hidden=“until-found” でページ内に残るため、Cmd/Ctrl+F で「webhook」を検索するとこのパネルが開きます。
閉じるとアンマウント
コンテンツに hiddenUntilFound={false} を設定すると、閉じている間は DOM から削除されます。最初にレンダリングしたくない重いパネル向けです。
長いコンテンツ
区切りのない文字列は、ページを広げず、パネル内で折り返されます。
右から左
山形アイコンは反転し、ネストしたインデントは読む方向に従います。
| キー | アクション |
|---|---|
| EnterSpace | トリガーからパネルを開閉します。 |
| Tab | フォーカスをトリガーから開いたパネルの中へ移動します。閉じたパネルはスキップされます。 |
- トリガーには
aria-expandedとaria-controlsが自動で付きます。 - アイコンのみのトリガーには
aria-labelが必要です。<CollapsibleTriggerIcon />は支援技術からは隠されます。 - モーションの低減が有効な場合、パネルは高さのアニメーションなしで開閉します。
Base UI の collapsible をベースにしています。各パーツは、ラップしているプリミティブの props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
open | boolean | – |
defaultOpen | boolean | false |
onOpenChange | (open: boolean, details) => void | – |
disabled | boolean | false |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="collapsible" | CSSでルートを指定します。 |
data-open | 開いているときに付与されます。 |
data-closed | 閉じているときに付与されます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
render通常は Button です。 | ReactElement | (props, state) => ReactElement | <button> |
| 属性 | 説明 |
|---|---|
data-slot="collapsible-trigger" | CSSでトリガーを指定します。 |
data-panel-open | パネルが開いているときに付与されます。子要素のスタイルは group-data-panel-open/collapsible-trigger で指定します。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
childrenパネルが開くと、デフォルトの山形アイコンが反転します。 | ReactNode | <IconChevronDown /> |
render | ReactElement | (props, state) => ReactElement | <span> |
| 属性 | 説明 |
|---|---|
data-slot="collapsible-trigger-icon" | 支援技術からは隠されます。トリガーが押されている間、少し下に動きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
className内側のラッパーに適用されるため、パディングが高さのアニメーションと干渉しません。 | string | – |
hiddenUntilFound閉じたパネルを DOM に残すため、ページ内検索で見つけて開くことができます。 | boolean | true |
keepMountedhiddenUntilFound が有効な間は無視されます。 | boolean | false |
| 属性 | 説明 |
|---|---|
data-slot="collapsible-content" | CSS でパネルを指定します。 |
data-open | 開いているときに付与されます。 |
data-closed | 閉じているときに付与されます。 |
data-starting-style | パネルが開くアニメーションの間、付与されます。 |
data-ending-style | パネルが閉じるアニメーションの間、付与されます。 |
--collapsible-panel-height | パネルの計測された高さ。 |
--collapsible-panel-width | パネルの計測された幅。 |
--collapsible-gap-start | パネルの前にある親の余白。閉じている間は詰められます。 |
--collapsible-gap-end | パネルの後ろにある親の余白。閉じている間は詰められます。 |
- Accordionそれぞれがパネルを表示する見出しの積み重ねです。途中で反転できる高さのモーションを持ち、閉じている間もパネルの内容を検索できます。
- Aspect ratioメディアの読み込み前も形を保ち、読み込み中はシマー表示になり、メディアをフェードインさせ、失敗時はフォールバックを表示するボックスです。
- Carouselネイティブのスクロールスナップによるスライドです。タッチでの慣性、マウスドラッグ、矢印キー、ドット、サムネイル、適切なタイミングで一時停止する自動再生に対応します。
- Resizableドラッグで分割できるパネルです。ホバーで目覚める控えめな区切り線、リセットや折りたたみで滑らかに動くサイズ、永続化されるレイアウトに対応します。
- Scroll area最小限のスクロールバーを備えたネイティブスクロールです。端は続きがある側だけフェードし、最後の項目を半分で切って見せるピークも任意で使えます。
- Separatorコンテンツを水平または垂直に区切る細線です。ラベルを付けたり、見た目だけの線として装飾モードにしたりできます。
使用しているブロック
Collapsible の上に構築されるブロック。
- Agent Todosエージェントの作業中のプランを表示します。すべてのステップはバックログからToDo、進行中、完了へと移り、リアルタイムの所要時間、失敗、その裏にあるツール呼び出しも確認できます。コンポーザーの上に置くステータスピル、目に見えるプランの変更、実行前にプランを編集できるレビューステップを備えています。
- API keysOpenAIやAnthropicのコンソールのような、AIプロダクトのAPIキーのページです。スコープ付きの権限と有効期限を持つキーを作成し、シークレットは一度だけ表示され、コピーで確認でき、取り消しは元に戻せ、その場で名前を変更でき、猶予期間つきでローテーションでき、キーごとの使用量を確認できます。
- BillingCursor、Claude、Vercelのスタイルによる、AIプロダクト向けのプランと使用量です。モデルごとに分かれ、サイクル終了時を予測してクレジット切れの前に警告する使用量メーター、ドラッグで確認できる日別チャート、メーター上でプレビューできるアラートつきの支出上限、正確な日割り計算によるプラン変更、実際のバリデーションを備えたカードフォーム、PDFでダウンロードできる請求書を備えています。
- Chat Sidebarチャットアプリ向けのサイドバーです。上部にロゴ、検索、New chat、その下に独自のリンク、ピン留めされたチャット、チャットを表示するために展開するプロジェクト、日ごとにグループ化された最近のチャットを配置します。行にはホバーメニューと右クリックメニュー、インラインでの名前変更、取り消しできる削除、リアルタイムの返信状態があります。