TimeSelect
시/분 컬럼 기반 팝오버로 시간을 선택하는 입력 컴포넌트
개요
Cals TimeSelect는 Foundation TimePicker를 래핑하여 CALS 제품의 시간 입력 UI를 선언적으로 구현하는 컴포넌트입니다. 폼 레이블, 시간 간격, 12시간 형식, 범위 제한 등 CALS에서 자주 쓰이는 시간 처리를 prop으로 제공합니다.
주요 특징
- ✅ 시/분/초 선택: 팝오버 기반 컬럼 UI로 시간 선택
- ✅ controlled / uncontrolled: value/onChange 또는 defaultValue로 값 관리
- ✅ 시간 간격: interval prop으로 분 단위 간격 설정
- ✅ 12시간 형식: use12Hour로 AM/PM 표시 전환
- ✅ 시간 범위 제한: startTime/endTime으로 선택 가능 범위 설정
- ✅ FormItem 내장: label/required/description/error prop으로 폼 레이블 자동 래핑
- ✅ 라벨 도움말: labelTooltip으로 레이블 옆 도움말 아이콘 표시
- ✅ 가시성/포커스 제어: visible prop, ref.focus()/blur()/element
- ✅ 디자인 토큰: 조건부 토큰 오버라이드 (prop이 있을 때만 적용)
기본 사용
기본 상태의 시간 선택 컴포넌트입니다. 팝오버를 열어 시/분을 선택합니다.
Preview
기본값 설정
defaultValue로 초기 시간을 설정합니다.
Preview
시간 간격 (interval)
interval prop으로 분 단위 간격을 설정합니다. 기본값은 1분입니다.
Preview
12시간 형식 (use12Hour)
use12Hour=true이면 AM/PM 표시 형식을 사용합니다.
Preview
초 표시 (showSeconds)
showSeconds=true이면 초 단위 선택도 가능합니다.
Preview
시간 범위 제한 (startTime / endTime)
startTime/endTime으로 선택 가능한 시간 범위를 제한합니다. 범위 밖 시간 선택 시 onChange가 호출되지 않습니다.
Preview
크기
size prop으로 입력란 크기를 지정합니다. xs / sm / md / lg / xl을 지원합니다.
Preview
비활성화 / 읽기 전용
disabled, readOnly는 모두 비활성화된 외관으로 표시되며 시간을 변경할 수 없습니다.
Preview
레이블 / 필수 입력
label로 레이블을 표시하고, required로 필수 표시 기호(*)를 추가합니다.
Preview
레이블 위치
orientation=“horizontal”이면 레이블이 입력란 왼쪽에 배치됩니다.
Preview
라벨 도움말
labelTooltip 지정 시 레이블 옆 아이콘에 마우스를 올리면 도움말이 표시됩니다.
Preview
Controlled 패턴
value/onChange로 외부에서 시간 상태를 제어합니다.
Preview
선택된 시간: (없음)
스타일 설정
backgroundColor, color, borderColor 등으로 디자인 토큰을 오버라이드합니다.
Preview
API Reference
Props
| Prop | Type | Default | Description |
|---|---|---|---|
value | Date | - | 선택된 시간 값 (controlled) |
defaultValue | Date | - | 초기 기본값 (uncontrolled) |
interval | number | 1 | 분 단위 시간 간격 |
startTime | string | - | 선택 가능 시작 시간 (“HH:mm” 형식) |
endTime | string | - | 선택 가능 종료 시간 (“HH:mm” 형식) |
use12Hour | boolean | false | 12시간 형식 사용 여부 |
showSeconds | boolean | false | 초 표시 여부 |
editable | boolean | true | 키보드 직접 입력 허용 여부 |
placeholder | string | - | 빈 상태 안내 문구 |
showPlaceholder | boolean | true | 안내 문구 표시 여부 |
size | "xs" | "sm" | "md" | "lg" | "xl" | "md" | 입력란 크기 |
visible | boolean | true | 표시 여부 (false → 렌더링 안 함) |
disabled | boolean | false | 비활성화 |
readOnly | boolean | false | 읽기 전용 (disabled와 동일 처리) |
width | string | number | "100%" | 컨트롤 너비 |
title | string | - | HTML title 속성 (native tooltip) |
required | boolean | - | 필수 입력 (FormItem 필수 표시) |
showLabel | boolean | false | 빈 레이블 공간 표시 여부 |
labelTooltip | string | - | 레이블 도움말 (아이콘 hover 시 표시) |
backgroundColor | string | - | 배경색 토큰 오버라이드 |
color | string | - | 텍스트 색상 토큰 오버라이드 |
borderColor | string | - | 테두리 색상 토큰 오버라이드 |
borderWidth | string | - | 테두리 두께 |
fontSize | string | - | 폰트 크기 |
fontWeight | string | number | - | 폰트 굵기 |
fontFamily | string | - | 폰트 패밀리 |
fontStyle | string | - | 폰트 스타일 (italic 등) |
textAlign | string | - | 텍스트 정렬 |
className | string | - | 컴포넌트 컨테이너에 적용할 CSS 클래스 |
formClassName | string | - | FormItem 래퍼에 적용할 CSS 클래스 |
label | string | - | FormItem 레이블 |
orientation | "horizontal" | "vertical" | - | FormItem 레이블 방향 |
description | string | - | FormItem 설명 |
error | string | - | FormItem 에러 메시지 |
Events
| Event | Type | Description |
|---|---|---|
onChange | (value: Date | undefined) => void | 값 변경 시 호출 |
Ref
| 메서드/속성 | Type | Description |
|---|---|---|
focus() | () => void | 입력란에 포커스 |
blur() | () => void | 포커스 해제 |
element | HTMLElement | null | 내부 DOM 요소 |
접근성
권장 사항
- ✅ label 또는 aria-label로 입력란의 목적을 명확히 제공하세요.
- ✅ 필수 입력은 required로 설정하여 스크린 리더에 전달하세요.
- ❌ placeholder만으로 레이블을 대체하지 마세요. 값 입력 시 사라집니다.
관련 컴포넌트
- Foundation TimePicker: 기본 시간 선택 컴포넌트
- Cals DatePicker: 날짜 선택 컴포넌트
- FormItem: 폼 레이블 래퍼