# Component/InputGroup
> Props: component-inputgroup.props.txt
## Examples
### Amount With Currency
Dropdown이 뒤에 오는 조합. 값을 입력하는 칸에 `flex`를 주면 Dropdown은 내용 폭만 차지한다.
```tsx
{
render: function Render(args) {
const [currency, setCurrency] = useState('krw');
return ;
},
args: {
width: 320
},
parameters: {
docs: {
description: {
story: 'Dropdown이 뒤에 오는 조합. 값을 입력하는 칸에 `flex`를 주면 Dropdown은 내용 폭만 차지한다.'
}
}
}
}
```
### Base
```tsx
{
render: args => ,
args: {
width: 320
}
}
```
### Conditional Segment
`{condition && }` 형태의 조건부 세그먼트는 구분선 개수에 그대로 반영된다.
```tsx
{
render: function Render(args) {
const [hasSuffix, setHasSuffix] = useState(false);
return
{hasSuffix && 원}
;
},
args: {
width: 360
},
parameters: {
docs: {
description: {
story: '`{condition && }` 형태의 조건부 세그먼트는 구분선 개수에 그대로 반영된다.'
}
}
}
}
```
### Disabled
```tsx
{
render: args => ,
args: {
width: 320
},
args: {
...Base.args,
disabled: true
}
}
```
### Error
status는 그룹 테두리 색만 바꾼다. 세그먼트의 경고 아이콘은 `WithSegmentStatus`를 참고한다.
```tsx
{
render: args => ,
args: {
width: 320
},
args: {
...Base.args,
status: 'error'
},
parameters: {
docs: {
description: {
story: 'status는 그룹 테두리 색만 바꾼다. 세그먼트의 경고 아이콘은 `WithSegmentStatus`를 참고한다.'
}
}
}
}
```
### Filter Bar
목록 화면 필터 바에서 쓰는 형태. 그룹끼리는 서로 독립적이고, 버튼은 그룹 밖에 둔다.
```tsx
{
render: function Render() {
const [column, setColumn] = useState('product_id');
const [dateColumn, setDateColumn] = useState('expected_shipping');
const [period, setPeriod] = useState('1m');
const [value, setValue] = useState([]);
return ;
},
parameters: {
docs: {
description: {
story: '목록 화면 필터 바에서 쓰는 형태. 그룹끼리는 서로 독립적이고, 버튼은 그룹 밖에 둔다.'
}
}
}
}
```
### Flex
세그먼트는 기본적으로 내용 폭을 유지한다. 남는 공간을 채우려면 `flex`를 지정한다.
```tsx
{
render: args => 010,
args: {
width: 360
},
parameters: {
docs: {
description: {
story: '세그먼트는 기본적으로 내용 폭을 유지한다. 남는 공간을 채우려면 `flex`를 지정한다.'
}
}
}
}
```
### Highlighted
```tsx
{
render: args => ,
args: {
width: 320
},
args: {
...Base.args,
status: 'highlighted'
}
}
```
### Nested
`InputGroup`은 중첩할 수 있다. 안쪽 그룹은 테두리를 그리지 않고 바깥 필드에 얹히며, 여백과 라운드는 필드 가장자리에 닿은 칸만 가져간다.
```tsx
{
render: function Render(args) {
const [currency, setCurrency] = useState('krw');
return 최소;
},
args: {
size: 'medium',
width: 400
},
parameters: {
docs: {
description: {
story: '`InputGroup`은 중첩할 수 있다. 안쪽 그룹은 테두리를 그리지 않고 바깥 필드에 얹히며, 여백과 라운드는 필드 가장자리에 닿은 칸만 가져간다.'
}
}
}
}
```
### Number Range
`prefix`/`suffix`를 지정한 `Input`은 스스로 InputGroup을 렌더한다. 그래서 이렇게 그룹 안에 넣으면 중첩 그룹이 되어 바깥 테두리를 그대로 쓴다. 단위까지 포함해 한 칸으로 묶이므로 구분선도 알맞게 들어간다.
```tsx
{
render: args => ,
args: {
width: 400
},
parameters: {
docs: {
description: {
story: ['`prefix`/`suffix`를 지정한 `Input`은 스스로 InputGroup을 렌더한다. 그래서 이렇게 그룹 안에 넣으면', '중첩 그룹이 되어 바깥 테두리를 그대로 쓴다. 단위까지 포함해 한 칸으로 묶이므로 구분선도 알맞게 들어간다.'].join(' ')
}
}
}
}
```
### Number Range Without Unit Divider
`NumberRange`에서 값과 단위 사이의 구분선만 지운 형태. `Input`의 `suffix` 대신 단위를 중첩 `InputGroup`으로 직접 묶고, 그 그룹에만 `dividerVariant='none'`을 지정한다. 최소/최대를 가르는 바깥 그룹의 구분선은 그대로 남는다.
```tsx
{
render: args => 원원,
args: {
width: 400
},
parameters: {
docs: {
description: {
story: ['`NumberRange`에서 값과 단위 사이의 구분선만 지운 형태. `Input`의 `suffix` 대신 단위를 중첩 `InputGroup`으로 직접 묶고,', "그 그룹에만 `dividerVariant='none'`을 지정한다. 최소/최대를 가르는 바깥 그룹의 구분선은 그대로 남는다."].join(' ')
}
}
}
}
```
### Size
```tsx
{
render: () =>
{(['large', 'medium', 'small', 'xsmall'] as InputSize[]).map(size => )}
}
```
### With Addon
`InputGroupAddon`은 문자열이 아닌 요소도 받는다. `Input`의 `prefix`/`suffix`를 그룹 안에서 쓰면 자동으로 이 형태로 렌더링된다.
```tsx
{
render: args => https://.kakaostyle.com,
args: {
width: 400
},
parameters: {
docs: {
description: {
story: '`InputGroupAddon`은 문자열이 아닌 요소도 받는다. `Input`의 `prefix`/`suffix`를 그룹 안에서 쓰면 자동으로 이 형태로 렌더링된다.'
}
}
}
}
```
### With Date Picker
단일 날짜 선택(`target='all'`). 날짜 입력이 하나의 세그먼트가 된다.
```tsx
{
render: function Render(args) {
const [period, setPeriod] = useState('1m');
const [value, setValue] = useState([]);
return ;
},
args: {
size: 'xsmall',
width: 280
},
parameters: {
docs: {
description: {
story: "단일 날짜 선택(`target='all'`). 날짜 입력이 하나의 세그먼트가 된다."
}
}
}
}
```
### With Date Range Picker
범위 선택. 시작일/종료일은 중첩 그룹의 각 칸이 되고, 편집 중인 칸 아래에 인디케이터가 붙는다. 인디케이터는 DatePicker 전용 표현이라 다른 조합에서는 나오지 않는다.
```tsx
{
render: function Render(args) {
const [dateColumn, setDateColumn] = useState('expected_shipping');
const [period, setPeriod] = useState('1m');
const [value, setValue] = useState([]);
return ;
},
args: {
size: 'xsmall',
width: 400
},
parameters: {
docs: {
description: {
story: '범위 선택. 시작일/종료일은 중첩 그룹의 각 칸이 되고, 편집 중인 칸 아래에 인디케이터가 붙는다. 인디케이터는 DatePicker 전용 표현이라 다른 조합에서는 나오지 않는다.'
}
}
}
}
```
### With Dropdown
서로 다른 종류의 컨트롤을 하나의 필드로 합성한다.
```tsx
{
render: function Render(args) {
const [column, setColumn] = useState('product_id');
return 정렬;
},
args: {
size: 'xsmall',
width: 'auto'
},
parameters: {
docs: {
description: {
story: '서로 다른 종류의 컨트롤을 하나의 필드로 합성한다.'
}
}
}
}
```
### With Form Field
FormField의 라벨·헬퍼텍스트와 함께 쓰는 형태. FormField는 InputGroup에 status를 자동으로 공유하지 않으므로 그룹에도 직접 지정한다.
```tsx
{
render: function Render(args) {
const [column, setColumn] = useState('product_id');
return ;
},
parameters: {
docs: {
description: {
story: 'FormField의 라벨·헬퍼텍스트와 함께 쓰는 형태. FormField는 InputGroup에 status를 자동으로 공유하지 않으므로 그룹에도 직접 지정한다.'
}
}
}
}
```
### With Input
서로 다른 종류의 컨트롤을 하나의 필드로 합성한다.
```tsx
{
render: function Render(args) {
const [column, setColumn] = useState('product_id');
return ;
},
args: {
size: 'xsmall',
width: 400
},
parameters: {
docs: {
description: {
story: '서로 다른 종류의 컨트롤을 하나의 필드로 합성한다.'
}
}
}
}
```
### With Numeric Input
`NumericInput`도 세그먼트로 동작한다. 자체 `suffix`는 중첩 그룹의 addon으로 렌더된다.
```tsx
{
render: args => 배송비,
args: {
width: 320
},
parameters: {
docs: {
description: {
story: '`NumericInput`도 세그먼트로 동작한다. 자체 `suffix`는 중첩 그룹의 addon으로 렌더된다.'
}
}
}
}
```
### With Numeric Input Without Unit Divider
`WithNumericInput`에서 단위 앞 구분선만 지운 형태. prefix/suffix를 `InputGroupAddon`으로 직접 쓰면 어느 구분선을 남길지 중첩 단위로 고를 수 있다. 여기서는 `배송비`와 값 사이의 구분선은 남기고 값과 `원` 사이만 지웠다.
```tsx
{
render: args => 배송비원,
args: {
width: 320
},
parameters: {
docs: {
description: {
story: ['`WithNumericInput`에서 단위 앞 구분선만 지운 형태. prefix/suffix를 `InputGroupAddon`으로 직접 쓰면', '어느 구분선을 남길지 중첩 단위로 고를 수 있다. 여기서는 `배송비`와 값 사이의 구분선은 남기고 값과 `원` 사이만 지웠다.'].join(' ')
}
}
}
}
```
### With Segment Status
```tsx
{
render: args => ,
args: {
width: 320,
status: 'error'
}
}
```
### With Time Picker
날짜와 시각을 한 필드로 묶는 조합. 두 팝오버는 각자 자기 세그먼트를 기준으로 열린다.
```tsx
{
render: function Render(args) {
const [date, setDate] = useState([]);
const [time, setTime] = useState(undefined);
return setTime(next ?? undefined)} flex={1} />
;
},
args: {
size: 'xsmall',
width: 360
},
parameters: {
docs: {
description: {
story: '날짜와 시각을 한 필드로 묶는 조합. 두 팝오버는 각자 자기 세그먼트를 기준으로 열린다.'
}
}
}
}
```
### With Time Range Picker
`TimeRangePicker`는 `DatePicker`와 마찬가지로 중첩 그룹으로 렌더되어 시작/종료 시각이 각각의 칸이 된다.
```tsx
{
render: function Render(args) {
const [range, setRange] = useState({
from: null,
to: null
});
return 운영 시간 setRange({
from,
to
})} flex={1} />
;
},
args: {
size: 'xsmall',
width: 360
},
parameters: {
docs: {
description: {
story: '`TimeRangePicker`는 `DatePicker`와 마찬가지로 중첩 그룹으로 렌더되어 시작/종료 시각이 각각의 칸이 된다.'
}
}
}
}
```