TimeRangePicker
Data Input
시작·종료 시간을 휠 패널로 고르는 시간 범위 선택기.
Usage
import
API Reference
같은 패밀리
예제
Usage
시작·종료 시간과 종일 여부를 하나의 시간 범위로 선택하게 할 때 사용한다.
import
import
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';예제를 복사해 쓸 때 필요한 준비
• @mildang/styled-system 은 이 저장소에서 Panda 가 생성하는 산출물이다. 저장소 안에서는 turbo run ship 이후 쓸 수 있고, 패키지 소비자는 자기 Panda 산출물이나 다른 레이아웃 수단으로 바꿔야 한다.
API Reference
TimeRangePicker Props
Prop
Type
Default
side
필수
"end" | "start"
지정 안 함
cancelText
string
지정 안 함
className
string
지정 안 함
confirmText
string
지정 안 함
fullTimeLabel
string
지정 안 함
fullTimeValue
string
지정 안 함
isFullTime
boolean
false
minuteStep
1 | 5 | 10 | 15 | 30
5
onCancel
() => void
지정 안 함
onConfirm
(value: string) => void
지정 안 함
onFullTimeChange
(next: boolean) => void
지정 안 함
showFooter
boolean
true
value
string
지정 안 함
같은 패밀리
@mildang/design-system/TimeRangeField 에서 같이 내보내는 컴포넌트다.
예제
기본 사용
범위용 휠 패널입니다. side 로 시작·종료를 정하고 onFullTimeChange 를 넘기면 종일 체크박스가 붙습니다.
'use client';
import { useState } from 'react';
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';
/**
* 범위 시나리오용 휠 패널. `side` 가 이 패널이 시작·종료 중 어느 쪽인지 정하고,
* `onFullTimeChange` 를 넘길 때만 footer 좌측에 종일(full-time) 체크박스가 나온다 —
* 이 체크박스가 `TimePicker` 와 구분되는 지점이다.
*
* 값 확정은 `onConfirm` 이다. draft 는 패널이 내부에서 관리하므로 `onChange` 가 없다.
*/
export default function TimeRangePickerExample() {
const [value, setValue] = useState('09:00');
const [isFullTime, setIsFullTime] = useState(false);
return (
<TimeRangePicker
side="start"
value={value}
minuteStep={30}
isFullTime={isFullTime}
onFullTimeChange={setIsFullTime}
onConfirm={setValue}
/>
);
}
side="start"
import { useState } from 'react';
import { Stack } from '@mildang/styled-system/jsx';
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';
import { Text } from '@mildang/design-system/Text';
const TimeRangePickerStartSideExample = function Render() {
const [value, setValue] = useState<string | undefined>('09:00');
const [isFullTime, setIsFullTime] = useState(false);
return (
<Stack gap="8">
<TimeRangePicker
side="start"
value={value}
isFullTime={isFullTime}
onFullTimeChange={setIsFullTime}
onCancel={() => {}}
onConfirm={(v) => setValue(v)}
/>
<Text variant="caption-lg-medium" color="neutral.text.lowest">
value: {value ?? '(none)'} · Full-time: {String(isFullTime)}
</Text>
</Stack>
);
};
export default TimeRangePickerStartSideExample;
side="end"
import { useState } from 'react';
import { Stack } from '@mildang/styled-system/jsx';
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';
import { Text } from '@mildang/design-system/Text';
const TimeRangePickerEndSideExample = function Render() {
const [value, setValue] = useState<string | undefined>('18:00');
const [isFullTime, setIsFullTime] = useState(false);
return (
<Stack gap="8">
<TimeRangePicker
side="end"
value={value}
isFullTime={isFullTime}
onFullTimeChange={setIsFullTime}
onCancel={() => {}}
onConfirm={(v) => setValue(v)}
/>
<Text variant="caption-lg-medium" color="neutral.text.lowest">
value: {value ?? '(none)'} · Full-time: {String(isFullTime)}
</Text>
</Stack>
);
};
export default TimeRangePickerEndSideExample;
Full-time 잠금 상태
import { HStack, Stack } from '@mildang/styled-system/jsx';
import { Text } from '@mildang/design-system/Text';
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';
const TimeRangePickerFullTimeLockedExample = () => (
<HStack gap="16" alignItems="flex-start">
<Stack gap="4">
<Text variant="caption-lg-medium" color="neutral.text.lowest">
start (00:00 · AM 12:00)
</Text>
<TimeRangePicker
side="start"
value="00:00"
isFullTime
onFullTimeChange={() => {}}
onCancel={() => {}}
onConfirm={() => {}}
/>
</Stack>
<Stack gap="4">
<Text variant="caption-lg-medium" color="neutral.text.lowest">
end (23:59 · PM 11:59)
</Text>
<TimeRangePicker
side="end"
value="23:59"
isFullTime
onFullTimeChange={() => {}}
onCancel={() => {}}
onConfirm={() => {}}
/>
</Stack>
</HStack>
);
export default TimeRangePickerFullTimeLockedExample;
Full-time 체크박스 없음
import { useState } from 'react';
import { Stack } from '@mildang/styled-system/jsx';
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';
import { Text } from '@mildang/design-system/Text';
const TimeRangePickerWithoutFullTimeExample = function Render() {
const [value, setValue] = useState<string | undefined>('09:00');
return (
<Stack gap="8">
<TimeRangePicker
side="start"
value={value}
onCancel={() => {}}
onConfirm={(v) => setValue(v)}
/>
<Text variant="caption-lg-medium" color="neutral.text.lowest">
value: {value ?? '(none)'}
</Text>
</Stack>
);
};
export default TimeRangePickerWithoutFullTimeExample;
footer 자체 없음 (showFooter=false)
import { useState } from 'react';
import { Stack } from '@mildang/styled-system/jsx';
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';
import { Text } from '@mildang/design-system/Text';
const TimeRangePickerWithoutFooterExample = function Render() {
const [value, setValue] = useState<string | undefined>('09:00');
return (
<Stack gap="8">
<TimeRangePicker
side="start"
value={value}
showFooter={false}
onConfirm={(v) => setValue(v)}
/>
<Text variant="caption-lg-medium" color="neutral.text.lowest">
draft(내부): 스크롤 종료 후 확인이 없으므로 표시되지 않음. 실제 반영은 외부 트리거 필요.
</Text>
</Stack>
);
};
export default TimeRangePickerWithoutFooterExample;
footer 3가지 비교
import { HStack, Stack } from '@mildang/styled-system/jsx';
import { Text } from '@mildang/design-system/Text';
import { TimeRangePicker } from '@mildang/design-system/TimeRangeField';
const TimeRangePickerFooterVariantsExample = () => (
<HStack gap="16" alignItems="flex-start">
<Stack gap="4">
<Text variant="caption-lg-medium" color="neutral.text.lowest">
기본 · Full-time + 취소/확인
</Text>
<TimeRangePicker
side="start"
value="09:00"
isFullTime={false}
onFullTimeChange={() => {}}
onCancel={() => {}}
onConfirm={() => {}}
/>
</Stack>
<Stack gap="4">
<Text variant="caption-lg-medium" color="neutral.text.lowest">
onFullTimeChange 미전달 · 취소/확인만
</Text>
<TimeRangePicker
side="start"
value="09:00"
onCancel={() => {}}
onConfirm={() => {}}
/>
</Stack>
<Stack gap="4">
<Text variant="caption-lg-medium" color="neutral.text.lowest">
showFooter=false · wheel 만
</Text>
<TimeRangePicker
side="start"
value="09:00"
showFooter={false}
onConfirm={() => {}}
/>
</Stack>
</HStack>
);
export default TimeRangePickerFooterVariantsExample;