타임라인
타임라인 (Timeline)
시간 순서(오름차순·내림차순)에 따라 일련의 정보를 시각적으로 연결해 보여주는 컴포넌트입니다.
출처: 문서
본문
언제 사용하나요 (When To Use)
- 일련의 정보를 시간 순서(오름차순 또는 내림차순)로 정렬해야 할 때
- 시각적 연결을 위해 타임라인이 필요할 때
예제 (Examples)
기본 (Basic)
기본 타임라인입니다.
import React from 'react';
import { Timeline } from 'antd';
const App: React.FC = () => (
<Timeline
items={[
{
content: 'Create a services site 2015-09-01',
},
{
content: 'Solve initial network problems 2015-09-01',
},
{
content: 'Technical testing 2015-09-01',
},
{
content: 'Network problems being solved 2015-09-01',
},
]}
/>
);
export default App;
변형 (Variant)
variant를 사용해 타임라인의 스타일을 설정합니다.
import React from 'react';
import { Timeline } from 'antd';
const App: React.FC = () => (
<Timeline
variant="filled"
items={[
{
content: 'Create a services site 2015-09-01',
},
{
content: 'Solve initial network problems 2015-09-01',
},
{
content: 'Technical testing 2015-09-01',
},
{
content: 'Network problems being solved 2015-09-01',
},
]}
/>
);
export default App;
로딩과 역순 (Loading and Reversing)
노드는 loading을 지원해 로딩을 표시하고, reverse 속성으로 노드의 순서를 제어합니다.
import React, { useState } from 'react';
import { Button, Flex, Timeline } from 'antd';
const App: React.FC = () => {
const [reverse, setReverse] = useState(false);
const handleClick = () => {
setReverse(!reverse);
};
return (
<Flex vertical gap="medium" align="flex-start">
<Timeline
reverse={reverse}
items={[
{
content: 'Create a services site 2015-09-01',
},
{
content: 'Solve initial network problems 2015-09-01',
},
{
content: 'Technical testing 2015-09-01',
},
{
loading: true,
content: 'Recording...',
},
]}
/>
<Button type="primary" onClick={handleClick}>
Toggle Reverse
</Button>
</Flex>
);
};
export default App;
교차 (Alternate)
교차 배치된 타임라인입니다.
import React from 'react';
import { ClockCircleOutlined } from '@ant-design/icons';
import { Timeline } from 'antd';
const App: React.FC = () => (
<Timeline
mode="alternate"
items={[
{
content: 'Create a services site 2015-09-01',
},
{
content: 'Solve initial network problems 2015-09-01',
color: 'green',
},
{
icon: <ClockCircleOutlined style={{ fontSize: '16px' }} />,
content: `Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo.`,
},
{
color: 'red',
content: 'Network problems being solved 2015-09-01',
},
{
content: 'Create a services site 2015-09-01',
},
{
icon: <ClockCircleOutlined style={{ fontSize: '16px' }} />,
content: 'Technical testing 2015-09-01',
},
]}
/>
);
export default App;
가로 (Horizontal)
가로 레이아웃입니다.
import React from 'react';
import { Divider, Flex, Timeline } from 'antd';
import type { TimelineProps } from 'antd';
const sharedProps: TimelineProps = {
orientation: 'horizontal',
items: [
{
content: 'Init',
},
{
content: 'Start',
},
{
content: 'Pending',
},
{
content: 'Complete',
},
],
};
const App: React.FC = () => (
<Flex vertical>
<Timeline {...sharedProps} mode="start" />
<Divider />
<Timeline {...sharedProps} mode="end" />
<Divider />
<Timeline {...sharedProps} mode="alternate" />
</Flex>
);
export default App;
커스텀 (Custom)
노드를 아이콘이나 다른 커스텀 요소로 설정합니다.
import React from 'react';
import { ClockCircleOutlined } from '@ant-design/icons';
import { theme, Timeline } from 'antd';
const App: React.FC = () => {
const { token } = theme.useToken();
return (
<Timeline
items={[
{
content: 'Create a services site 2015-09-01',
},
{
content: 'Solve initial network problems 2015-09-01',
},
{
icon: (
<ClockCircleOutlined
style={{
fontSize: 20,
// Only need to set when `fontSize` is customized
background: token.colorBgContainer,
}}
/>
),
color: 'red',
content: 'Technical testing 2015-09-01',
},
{
content: 'Network problems being solved 2015-09-01',
},
]}
/>
);
};
export default App;
끝 교차 (End alternate)
끝에서 교차 배치된 타임라인입니다.
import React from 'react';
import { ClockCircleOutlined } from '@ant-design/icons';
import { Timeline } from 'antd';
const App: React.FC = () => (
<Timeline
mode="end"
items={[
{
content: 'Create a services site 2015-09-01',
},
{
content: 'Solve initial network problems 2015-09-01',
},
{
icon: <ClockCircleOutlined />,
color: 'red',
content: 'Technical testing 2015-09-01',
},
{
content: 'Network problems being solved 2015-09-01',
},
]}
/>
);
export default App;
제목 (Title)
title을 사용해 시간을 단독으로 표시합니다.
import React, { useState } from 'react';
import type { RadioChangeEvent } from 'antd';
import { Radio, Timeline } from 'antd';
const App: React.FC = () => {
const [mode, setMode] = useState<'start' | 'alternate' | 'end'>('start');
const onChange = (e: RadioChangeEvent) => {
setMode(e.target.value);
};
return (
<>
<Radio.Group
onChange={onChange}
value={mode}
style={{
marginBottom: 20,
}}
>
<Radio value="start">Start</Radio>
<Radio value="end">End</Radio>
<Radio value="alternate">Alternate</Radio>
</Radio.Group>
<Timeline
mode={mode}
items={[
{
title: '2015-09-01',
content: 'Create a services',
},
{
title: '2015-09-01 09:12:11',
content: 'Solve initial network problems',
},
{
content: 'Technical testing',
},
{
title: '2015-09-01 09:12:11',
content: 'Network problems being solved',
},
]}
/>
</>
);
};
export default App;
제목 오프셋 (Title Offset)
titleSpan을 사용해 제목의 스팬 공간을 설정합니다.
import React from 'react';
import { Flex, Timeline, Typography } from 'antd';
import type { TimelineProps } from 'antd';
const items: TimelineProps['items'] = [
{ title: '05:10', content: 'Create a services' },
{ title: '09:03', content: 'Solve initial network problems' },
{ content: 'Technical testing' },
{ title: '11:28', content: 'Network problems being solved' },
];
const App: React.FC = () => {
return (
<Flex vertical gap="medium">
<Typography.Title level={5} style={{ margin: 0 }}>
titleSpan = 100px
</Typography.Title>
<Timeline items={items} titleSpan="100px" />
<Typography.Title level={5} style={{ margin: 0 }}>
titleSpan = 25%
</Typography.Title>
<Timeline items={items} titleSpan="25%" />
<Typography.Title level={5} style={{ margin: 0 }}>
titleSpan = 18, mode = end
</Typography.Title>
<Timeline items={items} titleSpan={18} mode="end" />
</Flex>
);
};
export default App;
시맨틱 샘플 (Semantic Sample)
시맨틱 구조를 사용해 더 풍부한 커스텀 스타일을 구현합니다.
import React from 'react';
import { Timeline } from 'antd';
const App: React.FC = () => (
<Timeline
items={[
{
content: 'Create a services site 2015-09-01',
},
{
content: 'Solve initial network problems 2015-09-01',
styles: {
root: {
height: 100,
},
rail: {
borderStyle: 'dashed',
},
},
},
{
content: '...for a long time...',
styles: {
root: {
height: 100,
},
rail: {
borderStyle: 'dashed',
},
content: {
opacity: 0.45,
},
},
},
{
content: 'Technical testing 2015-09-01',
},
{
content: 'Network problems being solved 2015-09-01',
},
]}
/>
);
export default App;
커스텀 시맨틱 DOM 스타일링 (Custom semantic dom styling)
classNames와 styles에 객체 또는 함수를 넘겨서 Timeline의 시맨틱 DOM 스타일을 커스터마이즈할 수 있습니다.
import React from 'react';
import { Flex, Timeline } from 'antd';
import type { GetProp, TimelineProps } from 'antd';
import { createStaticStyles } from 'antd-style';
const classNames = createStaticStyles(({ css }) => ({
root: css`
padding: 8px;
border-radius: 4px;
`,
}));
const styles: TimelineProps['styles'] = {
itemIcon: {
borderColor: '#1890ff',
},
};
const stylesFn: TimelineProps['styles'] = (info): GetProp<TimelineProps, 'styles', 'Return'> => {
if (info.props.orientation === 'vertical') {
return {
root: {
padding: '10px 6px',
border: '1px solid #A294F9',
},
itemIcon: {
borderColor: '#A294F9',
},
};
}
return {};
};
const App: React.FC = () => {
const sharedProps: TimelineProps = {
classNames,
items: [
{
title: '2015-09-01',
content: 'Create a services site',
},
{
title: '2015-09-01 09:12:11',
content: 'Solve initial network problems',
},
{
content: 'Technical testing',
},
],
};
return (
<Flex vertical gap="medium">
<Timeline {...sharedProps} orientation="horizontal" styles={styles} />
<Timeline {...sharedProps} orientation="vertical" styles={stylesFn} />
</Flex>
);
};
export default App;
API
Common props ref:Common props
Timeline
| Property | Description | Type | Default | Version | Global Config |
|---|---|---|---|---|---|
| classNames | Customize class for each semantic structure inside the component. Supports object or function. | Record<SemanticDOM, string> | (info: { props })=> Record<SemanticDOM, string> | - | 6.0.0 | |
| items | Each node of timeline | Items[] | - | × | |
| mode | By sending alternate the timeline will distribute the nodes to the left and right |
start | alternate | end |
start |
× | |
| orientation | Set the direction of the timeline | vertical | horizontal |
vertical |
× | |
Set the last ghost node's existence or its content. Use item.loading instead |
ReactNode | false | × | ||
Set the dot of the last ghost node when pending is true. Use item.icon instead |
ReactNode | <LoadingOutlined /> | × | ||
| reverse | Whether reverse nodes or not | boolean | false | × | |
| styles | Customize inline style for each semantic structure inside the component. Supports object or function. | Record<SemanticDOM, CSSProperties> | (info: { props })=> Record<SemanticDOM, CSSProperties> | - | 6.0.0 | |
| titleSpan | Set the title span space. It is the distance to the center of the dot |
number | string | 12 | × | |
| variant | Config style variant | filled | outlined |
outlined |
× |
Items
타임라인의 노드입니다.
| Property | Description | Type | Default |
|---|---|---|---|
| color | Set the circle's color to blue, red, green, gray or other custom colors |
string | blue |
| content | Set the content | ReactNode | - |
Set the content. Please use content instead |
ReactNode | - | |
Customize timeline dot. Please use icon instead |
ReactNode | - | |
| icon | Customize node icon | ReactNode | - |
Set the label. Please use title instead |
ReactNode | - | |
| loading | Set loading state | boolean | false |
| placement | Customize node placement | start | end |
- |
Customize node position. Please use placement instead |
start | end |
- | |
| title | Set the title | ReactNode | - |
시맨틱 DOM (Semantic DOM)
Timeline
https://ant.design/components/timeline/semantic.md
Timeline Items
https://ant.design/components/timeline/semantic_items.md
디자인 토큰 (Design Token)
컴포넌트 토큰 (Component Token - Timeline)
| Token Name | Description | Type | Default Value |
|---|---|---|---|
| dotBg | Background color of node | string | |
| dotBorderWidth | Border width of node | string | number | 2 |
| dotSize | Node size | string | number | |
| itemPaddingBottom | Bottom padding of item | number | 20 |
| tailColor | Line color | string | rgba(5,5,5,0.06) |
| tailWidth | Line width | string | number | 2 |
글로벌 토큰 (Global Token)
| Token Name | Description | Type | Default Value |
|---|---|---|---|
| colorError | Used to represent the visual elements of the operation failure, such as the error Button, error Result component, etc. | string | |
| colorPrimary | Brand color is one of the most direct visual elements to reflect the characteristics and communication of the product. After you have selected the brand color, we will automatically generate a complete color palette and assign it effective design semantics. | string | |
| colorSuccess | Used to represent the token sequence of operation success, such as Result, Progress and other components will use these map tokens. | string | |
| colorText | Default text color which comply with W3C standards, and this color is also the darkest neutral color. | string | |
| colorTextDisabled | Control the color of text in disabled state. | string | |
| fontFamily | The font family of Ant Design prioritizes the default interface font of the system, and provides a set of alternative font libraries that are suitable for screen display to maintain the readability and readability of the font under different platforms and browsers, reflecting the friendly, stable and professional characteristics. | string | |
| fontSize | The most widely used font size in the design system, from which the text gradient will be derived. | number | |
| lineHeight | Line height of text. | number | |
| margin | Control the margin of an element, with a medium size. | number | |
| paddingXS | Control the extra small padding of the element. | number | |
| paddingXXS | Control the extra extra small padding of the element. | number |