Tabs
タブ要素を作成できるコンポーネントです。
スタイリングはほぼなく、動きに関わる部分だけを提供しています。表示スタイルは適宜カスタマイズしてご利用ください。
How to use
@lism-css/ui パッケージでTabsとして提供しています。
Import
import { Tabs } from '@lism-css/ui/react'; Props
| プロパティ | 説明 |
|---|---|
<Tabs.Root> variant | c--tabs--{variant}クラスが出力されます。 |
<Tabs.Root> tabId | aria-controlsの値として使用されるタブを特定するためのIDを文字列で指定できます。 |
<Tabs.Root> defaultIndex | 最初に開いておくタブ番号を指定できます。 |
<Tabs.Root> listProps | タブボタンを囲むリスト要素(c--tabs_list)へ渡すpropsを指定できます。 |
基本構造
<Tabs.Root> <Tabs.Item> <Tabs.Tab>Tab label</Tabs.Tab> <Tabs.Panel>...Contents...</Tabs.Panel> </Tabs.Item></Tabs.Root><Tabs.Item>の子要素は<Tabs.Tab>と<Tabs.Panel>のみしか認識しません。また、この2つは必ず両方使用してください。
ソースコード
ソースコードは GitHub で公開しています。
Examples
基本例
Tab 01: Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
<Tabs.Root> <Tabs.Item> <Tabs.Tab>Tab 1</Tabs.Tab> <Tabs.Panel> <DummyText pre="Tab 01: "/> </Tabs.Panel> </Tabs.Item> <Tabs.Item> <Tabs.Tab>Tab 2</Tabs.Tab> <Tabs.Panel> <DummyText length="l" offset={1} pre="Tab 02: " /> </Tabs.Panel> </Tabs.Item></Tabs.Root>最初に開いておくタブ番号を指定する
<Tabs.Root>の defaultIndex で、最初に開いておくタブ番号を指定できます。
(インデックス番号は1から始まります。)
Tab 02: Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut. Aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint.
<Tabs.Root defaultIndex={2}> <Tabs.Item> <Tabs.Tab>Tab 1</Tabs.Tab> <Tabs.Panel> <DummyText pre="Tab 01: "/> </Tabs.Panel> </Tabs.Item> <Tabs.Item> <Tabs.Tab>Tab 2</Tabs.Tab> <Tabs.Panel> <DummyText length="l" offset={1} pre="Tab 02: " /> </Tabs.Panel> </Tabs.Item></Tabs.Root>タブコンテンツを横並び配置にする
<Tabs.Root>(.c--tabs)にgrid-template:'list panel' auto / auto 1fr; を指定すると、タブリストとコンテンツが横並びになります。
それと同時に、タブリスト(.c--tabs_list)のボタンを縦並び(flex-direction:column;)に変更すると、以下のようなレイアウトが実現できます。
@smサイズより大きい場合、コンテンツを横並びにする例Tab 01: Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
<Tabs.Root gt={[null, '"list panel" auto / auto 1fr']} listProps={{ fxd: [null, 'column'] }}> <Tabs.Item> <Tabs.Tab>Tab 1</Tabs.Tab> <Tabs.Panel> <DummyText pre="Tab 01: "/> </Tabs.Panel> </Tabs.Item> <Tabs.Item> <Tabs.Tab>Tab 2</Tabs.Tab> <Tabs.Panel> <DummyText length="l" offset={1} pre="Tab 02: " /> </Tabs.Panel> </Tabs.Item></Tabs.Root>Opt-in
スタイルバリエーションの作成例
c--tabs_tabでは--_isSelected と --_notSelected 変数が使えるようになっていますので、活用していただくと便利です。
(set--var:hovの--_isHov,--_notHovと同じようにして使用できます。)
ここではいくつかのスタイリング例を紹介します。
c--tabs--line
@layer lism-component {
.c--tabs--line > .c--tabs_list {
/* Memo: ov-x='auto' の時に margin がネガティブだと崩れるので、box-shadowで表現する。 */
box-shadow: inset 0 -2px 0 var(--divider);
}
.c--tabs--line .c--tabs_tab {
font-size: var(--fz--s);
background-color: transparent;
box-shadow: var(--_isSelected, inset 0 -2px 0 0 currentColor);
}
} variant='line'Tab 01: Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
<Tabs.Root variant="line"> <Tabs.Item> <Tabs.Tab>Tab 1</Tabs.Tab> <Tabs.Panel> <DummyText pre="Tab 01: " /> </Tabs.Panel> </Tabs.Item> <Tabs.Item> <Tabs.Tab>Tab 2</Tabs.Tab> <Tabs.Panel> <DummyText length="l" offset={1} pre="Tab 02: " /> </Tabs.Panel> </Tabs.Item></Tabs.Root>c--tabs--emboss
@layer lism-component {
.c--tabs--emboss > .c--tabs_list {
justify-self: center;
padding: 4px;
font-size: var(--fz--s);
background-color: var(--base-2);
border-radius: var(--bdrs--20);
}
.c--tabs--emboss .c--tabs_tab {
padding: 0.25em 0.75em;
border-radius: calc(var(--bdrs--20) - 2px); /* 親の bdrs - (親のpadding / 2) */
background-color: var(--_isSelected, var(--base));
box-shadow: var(--_isSelected, var(--bxsh--10));
}
} variant='emboss'Tab 01: Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
<Tabs.Root variant="emboss"> <Tabs.Item> <Tabs.Tab>Tab 1</Tabs.Tab> <Tabs.Panel> <DummyText pre="Tab 01: " /> </Tabs.Panel> </Tabs.Item> <Tabs.Item> <Tabs.Tab>Tab 2</Tabs.Tab> <Tabs.Panel> <DummyText length="l" offset={1} pre="Tab 02: " /> </Tabs.Panel> </Tabs.Item></Tabs.Root>高さを固定する方法
タブ全体の高さを一番長いコンテンツパネルに合わせて固定する方法を紹介します。
@layer lism-component {
[data-tabs-keep-height] > [aria-hidden='true'] {
display: block;
visibility: hidden;
opacity: 0;
}
} Tab 01: Lorem ipsum dolor sit amet. Consectetur adipiscing elit, sed do eiusmod tempor Incididunt ut. Labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut.
<Tabs.Root data-tabs-keep-height g="15"> <Tabs.Item> <Tabs.Tab px="10">Tab 1</Tabs.Tab> <Tabs.Panel> <DummyText pre="Tab 01: " /> </Tabs.Panel> </Tabs.Item> <Tabs.Item> <Tabs.Tab px="10">Tab 2</Tabs.Tab> <Tabs.Panel> <DummyText length="xl" offset={1} pre="Tab 02: " /> </Tabs.Panel> </Tabs.Item></Tabs.Root>