# 퍼블리싱 가이드라인 ## 1. 퍼블리싱 포인트
**퍼블리싱 포인트란 eXBuilder6** 런타임에서 디자이너 및 퍼블리셔가 **개인화 할 수 있도록 의도된 스타일링 지점**들을 의미합니다. **eXBuilder6**에서는 이러한 스타일링이 의도된 단위들을 **스타일러**라고 부르며, 스크립트 및 CSS를 통해 접근하고 수정할 수 있습니다. ### 1.1. 스타일러의 유형 퍼블리싱 포인트들은 스크립트로는 **스타일러** 객체 형태로, 퍼블리셔 측면으로는 CSS 스타일러 **클래스 셀렉터** 형태로 공급되며, 크게 두 가지 형태로 공급됩니다:| 스타일러 셀렉터 유형 | 설명 | 예시 |
| 컨트롤 타입 클래스 셀렉터 (기본 스타일러 셀렉터) | 컨트롤의 최외곽 DOM 요소를 스타일링 하기 위해 공급됩니다. `cl-컨트롤 타입명` 형태로 제공됩니다. 이하 **기본 스타일러**로 지칭합니다. | cl-radiobutton |
| 컨트롤 내부 요소 타입 클래스 셀렉터 (서브 스타일러 셀렉터) | 컨트롤을 구성하는 내부 DOM 요소를 스타일링 하기 위해 공급됩니다. `cl-컨트롤 타입명-스타일러 이름` 형태로 공급됩니다. 이하 **서브 스타일러**로 지칭합니다. | cl-radiobutton-item |
| 변경 전 | 변경 후 |
|  |  |
| item의 태그 명이 li에서 div로 변경되었고, 부모 노드가 추가되었습니다. |
| 속성 | 이유 |
| display | DOM의 레이아웃 규칙 및 가시성에 영향을 미칩니다. 예를 들어 display를 none으로 강제로 지정한 경우, control.visible = true로 프로그래밍 하여도 화면에 표시되지 않게 됩니다. |
| position | DOM의 레이아웃 규칙에 영향을 미쳐, 내부 좌표계 전체에 왜곡을 가져오게 됩니다. 모든 컨트롤들은 부모의 레이아웃 시스템에 따라 적절한 position 속성을 부여 받게 됩니다. |
| left | DOM의 위치및 크기는 eXBuilder6의 레이아웃 시스템 및 개발자가 입력한 레이아웃 컨스트레인트에 의해 결정됩니다. |
| top | DOM의 위치및 크기는 eXBuilder6의 레이아웃 시스템 및 개발자가 입력한 레이아웃 컨스트레인트에 의해 결정됩니다. |
| right | DOM의 위치및 크기는 eXBuilder6의 레이아웃 시스템 및 개발자가 입력한 레이아웃 컨스트레인트에 의해 결정됩니다. |
| bottom | DOM의 위치및 크기는 eXBuilder6의 레이아웃 시스템 및 개발자가 입력한 레이아웃 컨스트레인트에 의해 결정됩니다. |
| width, min-width | DOM의 위치및 크기는 eXBuilder6의 레이아웃 시스템 및 개발자가 입력한 레이아웃 컨스트레인트에 의해 결정됩니다. |
| height, min-height | DOM의 위치및 크기는 eXBuilder6의 레이아웃 시스템 및 개발자가 입력한 레이아웃 컨스트레인트에 의해 결정됩니다. |
| 번호 | 규칙 | 이유 |
| 1 | CSS의 셀렉터 콤비네이션은 **기본 스타일러**, **서브 스타일러**의 클래스 명 및 **사용자 지정 클래스 명**의 조합으로 이루어져야 합니다. | 비 API 요소를 통한 셀렉터는 버전 호환성이 보증되지 않습니다. |
| 2 | 차일드 셀렉터 컴비네이터(>)를 사용해서는 안됩니다. | 2장에서 언급된 것처럼, 런타임 업데이트가 논리적 스타일링의 구조는 변경하지 않으나, DOM의 직계 자손 구조 및 태그 명 등은 변경될 수 있습니다. |
| 3 | 레이아웃 시스템 및 컨트롤 내부 레이아웃에 영향을 주는 속성을 지정하지 마십시오. | 3장에서 언급된 것처럼, 레이아웃과 관련한 CSS 속성들은 런타임이 자동으로 만들어 내므로, 이들과 충돌을 일으킬 수 있습니다. |
| 4 | DOM을 관측한 결과를 바탕으로 퍼블리싱을 수행하지 마십시오. | DOM은 애플리케이션이 수행되는 동안 계속해서 바뀌게 됩니다. 예를 들어 컨트롤의 특정 속성이 변경되면, DOM구조 전체가 완전히 변경될 수도 있습니다. 따라서, 반드시 논리적인 스타일링 구조에 따라 퍼블리싱을 수행하여 주십시오. |
| 5 | eXBuilder6가 제공하는 컨트롤이 원하는 스타일링 요소를 통제하는 속성을 갖고 있다면, 그것을 CSS로 지정하지 마십시오. | 예를 들어 라디오 버튼의 경우 각 아이템 사이의 간격을 결정하는 itemSpacing 속성을 제공합니다. 라디오 버튼이 배치되는 규칙이나 부모의 상황에 따라, 이 값을 DOM에 반영하는 스타일 형태는 크게 변할 수 있습니다. 따라서 특정한 한 유형의 상태에만 의존하여, 컨트롤이 제공하는 기능을 우회하여 CSS로 구현하여서는 안됩니다. 스타일 요소처럼 보이지만, 컨트롤이 관련 속성을 제공하는 경우는, 다양한 문맥에서 정상적인 동작을 보증하기 위하여 불가피한 경우에만 제공됩니다. |
| 6 | 레이아웃 시스템이 여백과 정렬과 관련한 속성들을 제공하는 경우, 해당 속성을 이용하고 CSS로 지정하지 마십시오. | 레이아웃 시스템은 설정에 따라, 동적으로 하위 노드 구조에 많은 변화가 있을 수 있으므로, 이를 CSS로 안전하게 통제하기 어렵습니다. |
| 셀렉터 | 설명 | 적용 대상 |
| .cl-first-row | 특정 레이아웃 내 첫번째 행에 배치된 자식 컨트롤이나, 컨트롤 내의 첫번째 행에 배치된 아이템에 적용됩니다. | - 라디오 버튼의 첫번째 행에 배치된 아이템
- 체크 박스 그룹의 첫번째 행에 배치된 아이템
- 버티컬 레이아웃이 적용된 컨테이너에 부착된 첫번째 자식
- 폼 레이아웃이 적용된 컨테이너에 부착된 첫번째 행에 존재하는 자식 컨트롤들
- 폼 레이아웃 내 구분선
|
| .cl-last-row | 특정 레이아웃 내 마지막 행에 배치된 자식 컨트롤이나, 컨트롤 내의 마지막 행에 배치된 아이템에 적용됩니다. | - 라디오 버튼의 마지막 행에 배치된 아이템
- 체크 박스 그룹의 마지막 행에 배치된 아이템
- 버티컬 레이아웃이 적용된 컨테이너에 부착된 첫번째 자식
- 폼 레이아웃이 적용된 컨테이너에 부착된 첫번째 행에 존재하는 자식 컨트롤들
- 폼 레이아웃 내 구분선
|
| .cl-first-column | 특정 레이아웃 내 첫번째 열에 배치된 자식 컨트롤이나, 컨트롤 내의 첫번째 열에 배치된 아이템에 적용됩니다. | - 라디오 버튼의 첫번째 열에 배치된 아이템
- 체크 박스 그룹의 첫번째 열에 배치된 아이템
- 폼 레이아웃이 적용된 컨테이너에 부착된 첫번째 열에 존재하는 자식 컨트롤들
- 폼 레이아웃 내 구분선
|
| .cl-last-row | 특정 레이아웃 내 마지막 열에 배치된 자식 컨트롤이나, 컨트롤 내의 마지막 열에 배치된 아이템에 적용됩니다. | - 라디오 버튼의 마지막 열에 배치된 아이템
- 체크 박스 그룹의 마지막 열에 배치된 아이템
- 폼 레이아웃이 적용된 컨테이너에 부착된 마지막 열에 존재하는 자식 컨트롤들
- 폼 레이아웃 내 구분선
|
| .cl-odd-row .cl-even-row | 폼 레이아웃 및 그리드에서 홀수 행 및 짝수 행에 위치하는 컨트롤에 적용됩니다. | - 그리드의 행
- 폼 레이아웃이 배치된 컨트롤
- 폼 레이아웃 내 구분선
|
| .cl-odd-column .cl-even-column | 폼 레이아웃에서 홀수 열 및 짝수 열에 위치하는 컨트롤에 적용됩니다. | - 폼 레이아웃에 배치된 컨트롤
- 폼 레이아웃 내 구분선
|
| .cl-nth-of-row-n | 폼 레이아웃 내에서 몇 번째 행에 대한 요소인지를 나타냅니다. | - 폼 레이아웃 내 구분선
|
| .cl-nth-of-column-n | 폼 레이아웃 내에서 몇 번째 열에 대한 요소인지를 나타냅니다. | - 폼 레이아웃 내 구분선
|
| 셀렉터 | 설명 | 적용 레이아웃 |
| .cl-layout, .cl-scroll | 특정 컨테이너의 레이아웃 시스템이 사용하는 루트 팬을 얻습니다. 해당 레이아웃이 스크롤을 허용하도록 설정되어 있는 경우, cl-scroll 클래스를 동시에 보유합니다. | 모든 레이아웃 |
| .cl-layout-content | 레이아웃 시스템 내에서 스크롤 되는 전체 영역을 나타내는 컨텐트 팬을 얻을 수 있습니다. | Vertical, Flow |
| .cl-layout-wrap | 특정 컨트롤이 레이아웃에 포함되기 위해 특수한 노드에 래핑되었다면, 이 셀렉터를 통해 얻을 수 있습니다. | Vertical, Flow |
| .cl-layout-margin, .cl-layout-margin-top .cl-layout-margin-bottom | 특정 레이아웃의 마진 관련 속성으로 공간을 확보하기 위한 노드가 만들어졌다면, 이 셀렉터로 선택할 수 있습니다. | Vertical, Flow |
| .cl-form-placeholder | 폼 레이아웃 사용시, 픽셀 기반의 자동 높이나 너비가 사용된 구획이 있는 경우, 최소 크기를 보장하기 위해 만들어진 노드들을 선택할 수 있습니다. | Form 레이아웃 |
| 셀렉터 | 설명 |
| .cl-aside | 컨테이너(그룹) 내에서 컨트롤을 플롯시키는 API를 사용했을 때, 플로팅 영역을 담당하는 레이어 노드를 얻을 수 있습니다. |
| .cl-global-aside | 다이얼로그, 콤보박스의 드랍다운 선택 상자등, 전역적으로 플로팅되는 영역을 담당하는 레이어 노드를 얻을 수 있습니다. |