# POP v4 핵심 규칙 가이드 ## 개요 v4에서는 **"위치"를 설정하는 게 아니라 "규칙"을 설정**합니다. ``` v3 (기존): 4개 모드 각각 컴포넌트 위치 설정 → 4배 작업량 v4 (신규): 3가지 규칙만 설정 → 모든 화면 자동 적응 ``` --- ## 핵심 규칙 3가지 ### 1. 크기 규칙 (Size Rules) 각 컴포넌트의 **너비**와 **높이**를 어떻게 결정할지 정합니다. | 모드 | 설명 | 예시 | |------|------|------| | **fixed** | 고정 px | 버튼 높이 48px | | **fill** | 부모 공간 채움 | 입력창 너비 = 화면 너비 | | **hug** | 내용에 맞춤 | 라벨 너비 = 텍스트 길이 | ```typescript // 예시: 버튼 { width: "fill", // 화면 너비에 맞춤 height: "fixed", // 고정 fixedHeight: 48 // 48px } // 예시: 라벨 { width: "hug", // 텍스트 길이만큼 height: "hug" // 텍스트 높이만큼 } ``` #### 크기 모드 시각화 ``` fixed (고정): ├────48px────┤ ┌────────────┐ │ 버튼 │ ← 화면 커져도 48px 유지 └────────────┘ fill (채움): ├─────────────────────────────────┤ ┌─────────────────────────────────┐ │ 입력창 │ ← 화면 크기에 맞춤 └─────────────────────────────────┘ hug (맞춤): ├──────┤ ┌──────┐ │라벨 │ ← 내용 길이만큼만 └──────┘ ``` --- ### 2. 배치 규칙 (Layout Rules) 컴포넌트들을 **어떻게 나열할지** 정합니다. #### 스택 방향 ``` 가로 스택 (horizontal): 세로 스택 (vertical): ┌─────┬─────┬─────┐ ┌─────────────┐ │ A │ B │ C │ │ A │ └─────┴─────┴─────┘ ├─────────────┤ │ B │ ├─────────────┤ │ C │ └─────────────┘ ``` #### 설정 항목 | 항목 | 설명 | 옵션 | |------|------|------| | **direction** | 스택 방향 | horizontal / vertical | | **wrap** | 줄바꿈 허용 | true / false | | **gap** | 요소 간 간격 | 8 / 16 / 24 px | | **alignItems** | 교차축 정렬 | start / center / end / stretch | | **justifyContent** | 주축 정렬 | start / center / end / space-between | ```typescript // 예시: 버튼 그룹 (가로 배치) { direction: "horizontal", wrap: true, // 공간 부족하면 줄바꿈 gap: 16, // 버튼 간격 16px alignItems: "center" // 세로 중앙 정렬 } ``` --- ### 3. 반응형 규칙 (Responsive Rules) **화면이 좁아지면** 어떻게 바꿀지 정합니다. ```typescript // 예시: 768px 이하면 가로→세로 전환 { direction: "horizontal", responsive: [ { breakpoint: 768, // 768px 이하일 때 direction: "vertical" // 세로로 바꿈 } ] } ``` #### 시각화 ``` 768px 이상 (태블릿): 768px 이하 (모바일): ┌─────┬─────┬─────┐ ┌─────────────┐ │ A │ B │ C │ → │ A │ └─────┴─────┴─────┘ │ B │ │ C │ └─────────────┘ ``` --- ## 실제 예시: 작업지시 화면 ### 규칙 설정 ```typescript { root: { type: "stack", direction: "vertical", gap: 16, padding: { top: 16, right: 16, bottom: 16, left: 16 }, children: ["header", "form", "buttons"] }, containers: { "header": { type: "stack", direction: "horizontal", alignItems: "center", children: ["title", "status"] }, "form": { type: "stack", direction: "vertical", gap: 12, children: ["field1", "field2", "field3"] }, "buttons": { type: "stack", direction: "horizontal", gap: 12, responsive: [ { breakpoint: 480, direction: "vertical" } ], children: ["cancelBtn", "submitBtn"] } }, components: { "title": { width: "hug", height: "hug" }, "status": { width: "hug", height: "hug" }, "field1": { width: "fill", height: "fixed", fixedHeight: 48 }, "field2": { width: "fill", height: "fixed", fixedHeight: 48 }, "field3": { width: "fill", height: "fixed", fixedHeight: 48 }, "cancelBtn": { width: "fill", height: "fixed", fixedHeight: 48 }, "submitBtn": { width: "fill", height: "fixed", fixedHeight: 48 } } } ``` ### 결과 ``` 태블릿 가로 (1024px) 모바일 세로 (375px) ┌──────────────────────────┐ ┌─────────────────┐ │ 작업지시 #1234 [진행중]│ │작업지시 [진행]│ ├──────────────────────────┤ ├─────────────────┤ │ [품번____________] │ │[품번_________] │ │ [품명____________] │ │[품명_________] │ │ [수량____________] │ │[수량_________] │ ├──────────────────────────┤ ├─────────────────┤ │ [취소] [작업완료] │ │[취소] │ └──────────────────────────┘ │[작업완료] │ └─────────────────┘ ``` --- ## v3 vs v4 비교 | 항목 | v3 (기존) | v4 (신규) | |------|----------|----------| | **설계 방식** | 4개 모드 각각 위치 설정 | 3가지 규칙 설정 | | **작업량** | 4배 | 1배 | | **데이터** | col, row, colSpan, rowSpan | width, height, direction, gap | | **반응형** | 수동 (모드별 설정) | 자동 (브레이크포인트) | | **유지보수** | 4곳 수정 | 1곳 수정 | --- ## 규칙 설계 체크리스트 ### 크기 규칙 - [ ] 터치 요소(버튼, 입력창) 높이: fixed 48px - [ ] 너비가 화면에 맞아야 하는 요소: fill - [ ] 내용 길이에 맞아야 하는 요소: hug ### 배치 규칙 - [ ] 컴포넌트 나열 방향 결정 (가로/세로) - [ ] 간격 설정 (8/16/24px) - [ ] 정렬 방식 결정 (start/center/stretch) ### 반응형 규칙 - [ ] 768px 이하에서 가로→세로 전환 필요한 곳 - [ ] 480px 이하에서 추가 조정 필요한 곳 --- ## 관련 문서 - [반응형 디자인 가이드](./RESPONSIVE_DESIGN_GUIDE.md) - 크기 기준 - [크기 프리셋](./SIZE_PRESETS.md) - 컴포넌트별 기본값 - [v4 구현 계획](./POP_V4_CONSTRAINT_SYSTEM_PLAN.md) - 전체 계획 --- *최종 업데이트: 2026-02-04*