ColorField (색상필드)
Va.ColorField — 라벨 + 컬러 스와치 + 팝업 팔레트
Va.ColorPicker가 순수 색상 입력이라면, Va.ColorField는 그 위에 라벨·필수 표시·검증 메시지를 얹은 완성 폼 필드입니다. Field 계열 아키텍처 그대로, 내부에 Va.ColorPicker를 소유하는 Composition 구조.
- 클래스: Va.ColorField — va_colorpicker.js:446
- short name: colorField
- 상속: Va.Field (InputField·NumberField 등과 형제)
- 파일: va_colorpicker.js (import 필요)
- 내부 컴포넌트: Va.ColorPicker 인스턴스 (fieldComponent)
- isContainer: true
- 베이스 CSS: va-field

1. 기본 사용
import '../../lib/va_colorpicker.js'; // ← 필수 (colorPicker + colorField 둘 다 이 파일에)
// config 안에서
{
tagName: 'colorField',
label: '카테고리 색상',
value: '#FF6600',
required: true,
onSelect: 'onColorPicked'
}
2. Field 계열 아키텍처에서의 위치
Va.Field
├─ Va.InputField ← Va.Input (text)
├─ Va.SearchField ← Va.Search (search)
├─ Va.NumberField ← Va.Number (number)
├─ Va.TextareaField
├─ Va.ComboboxField
├─ Va.ColorField ← Va.ColorPicker ← 이 문서
└─ ...
ColorField의 정체: Field 베이스가 라벨/필드/검증 영역을 만들고, 필드 영역에 새로 만든 Va.ColorPicker를 꽂아 넣는 표준 Composition (va_colorpicker.js:479):
this.fieldComponent = new Va.ColorPicker(optionField);
즉, ColorField = Field 껍데기 + Va.ColorPicker 인스턴스.
3. Va.ColorPicker / 다른 Field와의 차이
항목Va.ColorPickerVa.ColorFieldVa.InputField
| 라벨 | ✕ | ✓ | ✓ |
| 검증 메시지 | ✕ | ✓ | ✓ |
| 필수 표시 | ✕ | ✓ | ✓ |
| info 툴팁 | ✕ | ✓ | ✓ |
| 팝업 팔레트 | ✓ | ✓ (내부 위임) | ✕ |
| 스와치 미리보기 | ✓ | ✓ (내부 위임) | ✕ |
| 파일 | va_colorpicker.js | va_colorpicker.js | va_component.js |
| popWidth 기본값 | 270 | 280 (미묘하게 다름) | — |
| 이벤트 재발화 로직 | 없음 | beforePop/afterPop/hidePop/select/expand/collapse 모두 리렌더 | 없음 |
4. 주요 속성
ColorField 전용 / ColorPicker에서 전달
속성기본값설명
| popWidth | 280 | 팝업 너비. ColorPicker의 270과 다르니 주의 |
| expanded | false | 팝업 초기 상태 |
| min / max | — | properties 배열에 있으나 색상 필드에선 사용 안 됨 (Number에서 복사된 잔재) |
라벨 관련 (Field 상속)
속성기본값설명
| label | — | 라벨 텍스트 또는 옵션 객체 |
| labelPosition | 'top' | top / bottom / left / right |
| labelWidth | 자동 | 라벨 영역 폭 |
| labelAlign | — | 라벨 정렬 |
| noLabel | false | 라벨 영역 숨김 |
| infoButton | — | 라벨 옆 info 아이콘 |
| required | false | 필수 표시 |
필드 관련 (ColorPicker로 위임)
속성설명
| value | 색상 hex 문자열 ('#FF0000') |
| placeholder | 플레이스홀더 |
| readonly / disabled | 상태 |
| size / appearance / shape | 시각 스타일 |
| textAlign | 텍스트 필드 정렬 |
| stopPropagation | 이벤트 버블링 |
⚠️ showText 옵션이 명시적으로 통과되지 않음 — ColorPicker의 showText(hex 텍스트 표시)는 ColorField의 optionField 목록에 없습니다 (va_colorpicker.js:460-478). 필요하면 colorPicker 옵션 객체 통해서 넘겨야 합니다.
세부 커스터마이즈 (colorPicker 옵션 키)
{
tagName: 'colorField',
label: '태그 색상',
value: '#3366CC',
colorPicker: { // ← 내부 ColorPicker에 직접 전달
showText: false, // 스와치만 표시
popWidth: 320
}
}
각 Field 계열 옵션 키:
- InputField → input
- SearchField → search
- NumberField → number
- ColorField → colorPicker
검증
속성설명
| validation | {state, size, message} 객체 |
| validationState | success / warning / error |
| validationMessage | 메시지 텍스트 |
5. 이벤트
ColorPicker의 이벤트를 모두 재발화합니다 (va_colorpicker.js:489-535):
이벤트시그니처발생 시점
| select | (component, element, value, evt) | 팝업에서 색상 클릭. value는 hex 문자열. 발생 시 검증 자동 리셋 |
| beforePop | (component, element, evt) | 팝업 열리기 직전 |
| afterPop | (component, element, evt) | 팝업 열린 직후 |
| hidePop | (component, element, evt) | 팝업 닫힘 요청 시 |
| expand / collapse | 팝업 확장/축소 | |
| focus / blur | 필드 포커스 진입/이탈 | |
| keydown | 키다운 (검증 자동 리셋) |
⚠️ select 이벤트 리스너가 두 번 등록됨 — va_colorpicker.js:489와 va_colorpicker.js:519에서 각각 dispatch. 콜백이 두 번 호출될 수 있으니 주의(첫 번째는 evt만, 두 번째는 value, evt).
⚠️ change 이벤트가 없음 — 다른 Field 계열은 setFieldComponentEvent() 호출로 change/click 등 기본 이벤트가 걸리는데, ColorField는 그 호출이 주석 처리되어 있음 (va_colorpicker.js:488). hex 텍스트 직접 입력 후 change를 잡으려면 component.fieldComponent에 직접 리스너 필요.
색상 선택 콜백 예시
onColorPicked(component, element, value, evt) {
console.log('선택된 색:', value); // 예: "#0066CC"
// 검증 표시는 자동으로 사라짐
}
6. 메서드 (Field 상속)
InputField·NumberField와 동일한 세트:
값
메서드설명
| getValue() | 내부 ColorPicker의 getValue() 위임 (hex 문자열) |
| setValue(value) | 값 세팅 + 검증 자동 리셋. 스와치 배경색도 자동 반영 |
상태
메서드설명
| setDisabled(bool) / getDisabled() | 비활성화 |
| setReadOnly(bool) / setReadonly(bool) | 읽기 전용 |
| setLabel(label) | 라벨 변경 |
| setPlaceholder(text) | 플레이스홀더 변경 |
| setSize(size) | 크기 변경 |
검증
메서드설명
| setValidation(state, message) | 검증 표시 + aria 자동 |
| clearValidation() | 검증 해제 |
포커스
메서드설명
| focus() / blur() | 내부 ColorPicker에 위임 |
주의: ColorPicker 전용 메서드(showColorPickerPop, hideColorPickerPop)는 ColorField에 직접 없음. 필요하면 component.fieldComponent.showColorPickerPop()로 접근.
7. 내부 구조
<div elname="element" class="va-field [vertical|horizontal]" field="true">
<div elname="inner" class="field-inner">
<div elname="labelDiv" class="label-div">
<label cpname="label">카테고리 색상 <span class="required">*</span></label>
</div>
<div elname="comment" class="field-comment"></div>
<div elname="fieldDiv" class="field-div">
<div cpname="field" class="va-colorpicker" style="flex:1"> ← 내부 Va.ColorPicker
<div class="field-wrapper">
<div class="color-div" style="background:#FF6600"></div> ← 스와치
<input type="text" value="#FF6600"> ← hex 입력
<div class="focus-line"></div>
</div>
<!-- 팝업은 열릴 때 hiddenArea로 이동 -->
</div>
</div>
</div>
<div elname="validationDiv" style="display:none">
<div class="va-validation">...</div>
</div>
</div>
핵심 스타일 조정: 내부 ColorPicker 옵션에 style: 'flex:1'이 강제로 들어감 (va_colorpicker.js:477) — Field 영역을 꽉 채우게.
8. 언제 쓰나
ColorField가 맞을 때
- 폼 안에 라벨 붙은 색상 선택 필드
- 검증 메시지("색상을 선택하세요")를 표시해야 할 때
- 관리자 설정 페이지의 카테고리·태그 색상
- 사용자 프로필 강조 색상 지정
다른 걸 쓸 때
- 라벨 없는 인라인 색상 선택 → Va.ColorPicker
- 툴바 아이콘형 → Va.ColorPicker + showText:false
- 미리 정의된 몇 개 색만 → Va.ComboboxField + 각 옵션에 스와치 렌더링
9. 흔한 조합 예시
// 폼 안 표준 사용
{
tagName: 'colorField',
label: '배경색',
value: '#FFFFFF',
onSelect: 'onBgColor'
}
// 세로 폼에 스와치만
{
tagName: 'colorField',
label: '강조색',
value: '#FF0000',
colorPicker: { showText: false },
style: 'width:60px'
}
// 좌측 라벨 + 필수
{
tagName: 'colorField',
label: '태그 색상',
labelPosition: 'left',
labelWidth: 100,
required: true,
value: '#3366CC'
}
// 팝업 폭 크게
{
tagName: 'colorField',
label: '테마 색상',
popWidth: 400,
value: '#333333'
}
10. 알아두면 좋을 주의사항
- va_colorpicker.js import 필수 — ColorPicker와 ColorField가 같이 들어 있음. import 없으면 둘 다 인식 안 됨.
- select 이벤트 두 번 발화 위험 — 소스에 dispatch 코드가 중복되어 있음. 콜백 로직이 idempotent하지 않으면 가드 필요.
- change 이벤트 없음 — hex 텍스트 직접 편집 감지 필요하면 fieldComponent에 직접 리스너.
- showText는 colorPicker 옵션 키로만 — 직접 속성으론 안 됨. {colorPicker: {showText: false}} 형태.
- popWidth 기본값 차이 — ColorPicker는 270, ColorField는 280. 통일해서 쓰려면 명시 지정.
- min/max 속성은 무의미 — Number에서 복사된 잔재로 properties 배열에 있으나 사용 안 됨.
- 팝업 상태머신 참여 — 다른 팝업(Combobox, DatePicker 등)과 자동 상호 배타.
- hex 값 대소문자 — 팝업 선택 시 대문자로 반환. 서버 규약이 소문자면 변환 필요.
- 투명도(alpha) 미지원 — RGBA 형식 안 됨. 순수 RGB hex만.
- 접근성 취약 — 색상 팝업 UI에 ARIA/키보드 네비 부족. 색맹 사용자 대비 텍스트 라벨 병기 권장.
- focus() 위임 — Field의 focus()는 내부 ColorPicker의 hex 텍스트 input에 포커스. 팝업 자동 열기는 아님.
- 팝업이 hiddenArea로 이동 — 열릴 때 부모 컨테이너의 overflow/z-index 영향 없음. 닫히면 원위치.