Timeline
出来事を時系列に並べて表示する UI の実装例です。Lism の primitives と少量の CSS(b--timeline)で構成します。
Overview
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
<Grid class="b--timeline" hl="s"> <Grid class="b--timeline_item" ai="center" cg="20"> <Decorator class="b--timeline_line" bgc="divider" jslf="center" gr="1/-1" gc="1" /> <Center class="b--timeline_shape" pos="relative" z="1" c="base" ar="1/1" bdrs="99" jslf="center" bgc="text" gr="2" gc="1" /> <Lism class="b--timeline_time" fz="xs" fw="bold" gr="2" gc="2">20yy年m月dd日</Lism> <Lism class="b--timeline_title" fz="s" fw="bold" gr="3" gc="2">Lism x.y.z がリリース。</Lism> <Lism class="b--timeline_text" fz="s" mbs="15" gr="4" gc="2"> <p>ロレム・イプサムの座り雨。...</p> </Lism> </Grid> {/* 2件目以降も同じ構造で並べます */}</Grid><div class="b--timeline l--grid -hl:s"> <div class="b--timeline_item l--grid -ai:center -cg:20"> <div class="b--timeline_line a--decorator -bgc -jslf:center -gr:1/-1 -gc" style="--bgc:var(--divider);--gc:1" aria-hidden="true"></div> <div class="b--timeline_shape l--center -pos:relative -z:1 -c:base -ar:1/1 -bdrs:99 -jslf:center -bgc:text -gr -gc" style="--gr:2;--gc:1"></div> <div class="b--timeline_time -fz:xs -fw:bold -gr -gc" style="--gr:2;--gc:2">20yy年m月dd日</div> <div class="b--timeline_title -fz:s -fw:bold -gr -gc" style="--gr:3;--gc:2">Lism x.y.z がリリース。</div> <div class="b--timeline_text -fz:s -mbs:15 -gr -gc" style="--gr:4;--gc:2"> <p>ロレム・イプサムの座り雨。...</p> </div> </div> <!-- 2件目以降も同じ構造で並べます --></div>Styles
Timeline のベーススタイルは、以下の CSS で定義されています。この CSS をプロジェクトにコピーして利用してください。
@layer lism-block のままコピーすると、コア CSS のレイヤー順にそのまま組み込まれ、lism-custom レイヤーから上書きできます。
@layer lism-block {
.b--timeline {
--shape-size: 1.375rem;
--line-len: 100%;
--line-bold: 1px;
--_line-offset: calc(var(--shape-size) / 2);
--highlight-inset: -3px;
--edge: var(--s20);
--startSpace: var(--edge);
--endSpace: var(--edge);
--shapeSpace: calc(var(--shape-size) + var(--highlight-inset) * -1);
}
.b--timeline_item {
grid: var(--startSpace) auto auto auto var(--endSpace) / var(--shapeSpace) 1fr;
}
.b--timeline_line {
width: var(--line-bold);
height: var(--line-len);
}
.b--timeline_shape {
font-size: var(--shape-size);
width: 0.5em; /* icon ない時は 縮める */
}
.b--timeline_shape._hasIcon {
width: 1em;
}
.b--timeline_highlight {
inset: var(--highlight-inset);
}
[data-timeline='start'] {
--startSpace: 0;
--line-len: calc(100% - var(--_line-offset));
}
[data-timeline='end'] {
--endSpace: 0;
--line-len: calc(100% - var(--_line-offset));
}
.b--timeline--horizontal {
--edge: var(--s15);
--_line-offset: calc(50% - var(--edge) / 2);
grid-template-rows: var(--shapeSpace) auto auto auto;
}
.b--timeline--horizontal > .b--timeline_item {
grid-template-columns: var(--startSpace) auto var(--endSpace);
}
.b--timeline--horizontal .b--timeline_line {
width: var(--line-len);
height: var(--line-bold);
}
} Markup
マークアップは以下のクラス・属性で構成します。行・列の配置は Property Class(-gr / -gc)で指定します。
| クラス / 属性 | 説明 |
|---|---|
b--timeline |
ルート要素。l--grid と併用します。横並びにする場合は b--timeline--horizontal を追加します。 |
b--timeline_item |
1件分のラッパー要素。l--grid と併用し、縦並びでは -ai:center -cg:20、横並びでは -ai:center -ji:center -gtr:subgrid -gr:1/-1 -rg:10 を指定します。 |
data-timeline |
先頭・末尾の指定。start / end を指定すると、その方向へのラインのはみ出しをなくします。 |
b--timeline_line |
項目をつなぐライン(a--decorator と併用)。縦並びでは -gr:1/-1、横並びでは -gc:1/-1 で伸ばします。 |
b--timeline_shape |
節目を示すシェイプ(l--center と併用)。-bgc で色を変更でき、アイコンを入れる場合は _hasIcon を追加します。 |
b--timeline_highlight |
シェイプを強調する装飾(a--decorator と併用。省略可)。 |
b--timeline_time |
日時を表示する要素(省略可)。縦並びでは2行目・2列目に配置します。 |
b--timeline_title |
見出しを表示する要素(省略可)。縦並びでは3行目・2列目に配置します。 |
b--timeline_text |
本文を表示する要素(省略可)。縦並びでは4行目・2列目に配置します。 |
--edge |
先頭・末尾に確保する余白(デフォルトは縦並びで var(--s20)、横並びで var(--s15))。 |
シェイプの大きさやラインの太さは、CSS 側の --shape-size / --line-bold を編集して調整します。
Examples
先頭・末尾の指定とシェイプの強調
先頭と末尾の項目に data-timeline="start" / data-timeline="end" を指定すると、ラインの上下のはみ出しをなくせます。
また、シェイプ内に b--timeline_highlight を追加するとハイライト表示になり、シェイプの -bgc で色を変更できます。
data-timeline と b--timeline_highlightLism x.y.z がリリース。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
Lism x.y.z がリリース。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
Lism x.y.z がリリース。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
<Grid class="b--timeline" hl="s"> <Grid class="b--timeline_item" ai="center" cg="20" data-timeline="start"> <Decorator class="b--timeline_line" bgc="divider" jslf="center" gr="1/-1" gc="1" aslf="e" /> <Center class="b--timeline_shape" pos="relative" z="1" c="base" ar="1/1" bdrs="99" jslf="center" bgc="text" gr="2" gc="1" /> <Lism class="b--timeline_time" fz="xs" fw="bold" gr="2" gc="2">20yy年m月dd日</Lism> <Lism class="b--timeline_text" fz="s" mbs="15" gr="4" gc="2"> <p>Lism x.y.z がリリース。</p> </Lism> </Grid> {/* 中間の項目は data-timeline なし・ライン全体を表示 */} <Grid class="b--timeline_item" ai="center" cg="20" data-timeline="end"> <Decorator class="b--timeline_line" bgc="divider" jslf="center" gr="1/3" gc="1" aslf="s" /> <Center class="b--timeline_shape" pos="relative" z="1" c="base" ar="1/1" bdrs="99" jslf="center" bgc="red" gr="2" gc="1"> <Decorator class="b--timeline_highlight" as="span" pos="absolute" z="-1" bgc="inherit" bdrs="99" o="ppp" /> </Center> <Lism class="b--timeline_time" fz="xs" fw="bold" gr="2" gc="2">20yy年m月dd日</Lism> <Lism class="b--timeline_text" fz="s" mbs="15" gr="4" gc="2"> <p>Lism x.y.z がリリース。</p> </Lism> </Grid></Grid><div class="b--timeline l--grid -hl:s"> <div class="b--timeline_item l--grid -ai:center -cg:20" data-timeline="start"> <div class="b--timeline_line a--decorator -bgc -jslf:center -gr:1/-1 -gc -aslf:end" style="--bgc:var(--divider);--gc:1" aria-hidden="true"></div> <div class="b--timeline_shape l--center -pos:relative -z:1 -c:base -ar:1/1 -bdrs:99 -jslf:center -bgc:text -gr -gc" style="--gr:2;--gc:1"></div> <div class="b--timeline_time -fz:xs -fw:bold -gr -gc" style="--gr:2;--gc:2">20yy年m月dd日</div> <div class="b--timeline_text -fz:s -mbs:15 -gr -gc" style="--gr:4;--gc:2"> <p>Lism x.y.z がリリース。</p> </div> </div> <!-- 中間の項目は data-timeline なし・ライン全体を表示 --> <div class="b--timeline_item l--grid -ai:center -cg:20" data-timeline="end"> <div class="b--timeline_line a--decorator -bgc -jslf:center -gr -gc -aslf:start" style="--bgc:var(--divider);--gr:1/3;--gc:1" aria-hidden="true"></div> <div class="b--timeline_shape l--center -pos:relative -z:1 -c:base -ar:1/1 -bdrs:99 -jslf:center -bgc -gr -gc" style="--bgc:var(--red);--gr:2;--gc:1"> <span class="b--timeline_highlight a--decorator -pos:absolute -z:-1 -bgc:inherit -bdrs:99 -o:ppp" aria-hidden="true"></span> </div> <div class="b--timeline_time -fz:xs -fw:bold -gr -gc" style="--gr:2;--gc:2">20yy年m月dd日</div> <div class="b--timeline_text -fz:s -mbs:15 -gr -gc" style="--gr:4;--gc:2"> <p>Lism x.y.z がリリース。</p> </div> </div></div>アイコンの表示
シェイプに _hasIcon を追加し、中に <Icon>(a--icon)を配置するとアイコン付きのシェイプになります。
_hasIconLism x.y.z がリリース。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
Lism x.y.z がリリース。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
Lism x.y.z がリリース。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
import { CheckIcon } from '@lism-css/icons/react';
<Grid class="b--timeline_item" ai="center" cg="20"> <Decorator class="b--timeline_line" bgc="divider" jslf="center" gr="1/-1" gc="1" /> <Center class="b--timeline_shape _hasIcon" pos="relative" z="1" c="base" ar="1/1" bdrs="99" jslf="center" bgc="text" gr="2" gc="1"> <Icon icon={CheckIcon} style={{ scale: '0.625' }} /> </Center> <Lism class="b--timeline_time" fz="xs" fw="bold" gr="2" gc="2">20yy年m月dd日</Lism> <Lism class="b--timeline_text" fz="s" mbs="15" gr="4" gc="2"> <p>Lism x.y.z がリリース。</p> </Lism></Grid><div class="b--timeline_item l--grid -ai:center -cg:20"> <div class="b--timeline_line a--decorator -bgc -jslf:center -gr:1/-1 -gc" style="--bgc:var(--divider);--gc:1" aria-hidden="true"></div> <div class="b--timeline_shape _hasIcon l--center -pos:relative -z:1 -c:base -ar:1/1 -bdrs:99 -jslf:center -bgc:text -gr -gc" style="--gr:2;--gc:1"> <svg class="a--icon" style="scale:0.625" aria-hidden="true">...</svg> </div> <div class="b--timeline_time -fz:xs -fw:bold -gr -gc" style="--gr:2;--gc:2">20yy年m月dd日</div> <div class="b--timeline_text -fz:s -mbs:15 -gr -gc" style="--gr:4;--gc:2"> <p>Lism x.y.z がリリース。</p> </div></div>横並び(b--timeline--horizontal)
ルート要素に b--timeline--horizontal を追加すると、横方向に並ぶタイムラインになります。各項目は -gtr:subgrid でルートの行を共有し、ラインは -gc:1/-1 で横方向に伸ばします。
b--timeline--horizontalロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
ロレム・イプサムの座り雨。目まぐるしい文章の流れの中で、それは静かに歩く仮の言葉です。Elitも穏やかに続いていきますが、積み重ねられてきた「LiberroyとFoogの取り組み」は、余白のようなものです。
<Grid class="b--timeline b--timeline--horizontal" gaf="column" hl="s"> <Grid class="b--timeline_item" ai="center" ji="c" gtr="subgrid" gr="1/-1" rg="10" data-timeline="start"> <Decorator class="b--timeline_line" bgc="divider" jslf="e" gr="1" gc="1/-1" /> <Center class="b--timeline_shape" pos="relative" z="1" c="base" ar="1/1" bdrs="99" jslf="center" bgc="text" gr="1" gc="2" /> <Lism class="b--timeline_time" fz="xs" fw="bold" gr="2" gc="2">20yy年m月dd日</Lism> <Lism class="b--timeline_title" fz="s" fw="bold" gr="3" gc="2">Lism x.y.z がリリース。</Lism> <Lism class="b--timeline_text" fz="s" mbs="15" gr="4" gc="2"> <p>ロレム・イプサムの座り雨。...</p> </Lism> </Grid> {/* 中間の項目はラインを `jslf="center"` で中央に、末尾は `jslf="s"` で手前側だけ表示します */}</Grid><div class="b--timeline b--timeline--horizontal l--grid -gaf:column -hl:s"> <div class="b--timeline_item l--grid -ai:center -ji:center -gtr:subgrid -gr:1/-1 -rg:10" data-timeline="start"> <div class="b--timeline_line a--decorator -bgc -jslf:end -gr -gc:1/-1" style="--bgc:var(--divider);--gr:1" aria-hidden="true"></div> <div class="b--timeline_shape l--center -pos:relative -z:1 -c:base -ar:1/1 -bdrs:99 -jslf:center -bgc:text -gr -gc" style="--gr:1;--gc:2"></div> <div class="b--timeline_time -fz:xs -fw:bold -gr -gc" style="--gr:2;--gc:2">20yy年m月dd日</div> <div class="b--timeline_title -fz:s -fw:bold -gr -gc" style="--gr:3;--gc:2">Lism x.y.z がリリース。</div> <div class="b--timeline_text -fz:s -mbs:15 -gr -gc" style="--gr:4;--gc:2"> <p>ロレム・イプサムの座り雨。...</p> </div> </div> <!-- 中間の項目はラインを -jslf:center に、末尾は -jslf:start にします --></div>