HandStack 화면 HTML 작성 지침
이 문서는 HandStack 화면 개발 시 준수해야 할 한국어 응답 규칙 및 Tabler CSS Framework 기반의 HTML 작성 지침을 명시합니다.
한국어 응답 규칙
모든 응답은 한국어로 작성하며, 다음 원칙을 따릅니다.
- 언어 통일: 모든 응답 콘텐츠는 한국어로 작성합니다.
- 코드 주석: 주석을 만들지 않아야 합니다. No Comment.
- 기술 용어: 필요시 영어 원문과 한국어를 병행 표기합니다 (예: "컨테이너(container)").
- 원문 유지: 에러 메시지나 로그는 원본 언어를 유지하되, 이에 대한 설명은 한국어로 제공합니다.
- 예외 상황:
- 코드 자체(변수명, 함수명 등)는 영어로 작성합니다.
- 공식 문서나 명령어는 원본 언어를 유지합니다.
- 사용자가 명시적으로 다른 언어를 요청하는 경우에만 해당 언어를 사용합니다.
Tabler CSS Framework 기반 HTML 작성 지침
HandStack 화면은 UI/UX의 일관성과 개발 효율성을 위해 다음 오픈소스 프레임워크와 라이브러리를 기반으로 합니다.
- Tabler CSS Framework:
- Bootstrap 5 기반으로 견고하며, 다양한 UI 컴포넌트와 아이콘을 제공합니다.
- 모바일, 태블릿, 데스크톱 등 다양한 디바이스에 최적화된 반응형(responsive) 화면을 효율적으로 구성할 수 있습니다.
- master-css:
- 직관적인 CSS 클래스 문법(유틸리티 우선 접근)으로 스타일을 간편하게 작성할 수 있어 코드 가독성 및 유지보수성을 높입니다.
- 다양한 스타일링 옵션을 제공하며, 불필요한 코드 없이 빠 른 페이지 로딩을 지원합니다.
- Mustache:
- HTML과 데이터를 결합하여 동적인 콘텐츠를 생성하는 템플릿 엔진입니다.
- 직관적인 문법으로 데이터 바인딩을 쉽게 처리하며, 복잡한 로직 없이 템플릿 작성을 가능하게 합니다.
UI 패턴 화면 예제
| ID | 패턴명 | 용도 |
|---|---|---|
| TPL000 | UX 레퍼런스 | 인터페이스, 항목 디자인 |
| TPL010 | 마스터/디테일 | 조회 조건 및 CRUD 가능한 그리드 목록 |
| TPL020 | 단일 마스터 | 단일 Row 입력 폼 서식 |
| TPL030 | 멀티 마스터 | 데이터가 많지 않은 단일 Row 입력 폼 서식 |
| TPL040 | 멀티 마스터/멀티 디테일 | 데이터가 많지 않은 단일 Row 입력 폼 서식 |
기본 레이아웃 구성
Tabler는 page, page-wrapper, page-header, page-body 등의 클래스를 활용하여 기본 레이아웃을 구성합니다.
최소 레이아웃 구조
HTML 문서의 기본 구조는 다음과 같습니다. <body> 태그에 style="visibility: hidden;"이 적용된 것은 HandStack 시스템의 초기 로딩 성능 최적화를 위한 것으로, 화면 로딩 전 깜빡임(FOUC, Flash Of Unstyled Content)을 방지하기 위함입니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body style="visibility: hidden;">
<form autocomplete="off" id="form1" syn-datafield="MainForm">
<div class="page">
<div class="page-wrapper">
<div class="page-header mt-2 d-print-none">
<div class="container-fluid max-width:1600!">
<div class="row g-2 align-items-center">
<div class="col">
<div class="page-pretitle f:12!">
GNB 메뉴 / LNB 메뉴
</div>
<h2 class="page-title">
프로젝트 항목
</h2>
</div>
</div>
</div>
</div>
<div class="page-body mt-2">
<div class="container-fluid max-width:1600!">
<!-- 여기에 화면 레이아웃과 디자인을 생성 -->
</div>
</div>
</div>
</div>
</form>
<script src="/arha/js/syn.loader.js"></script>
</body>
</html>
레이아웃 작성 지침
- 반응형 디자인:
col-,d-none,d-md-block등 Bootstrap 5의 반응형 클래스를 적극적으로 활용하여 다양한 디바이스에 최적화된 화면을 구성합니다. - 시맨틱 태그:
<header>,<footer>,<main>,<aside>와 같은 시맨틱 태그를 사용하여 문서 구조의 의미를 명확히 하고 웹 접근성 및 검색 엔진 최적화(SEO)를 고려합니다. - Master CSS 활용: 필요시 커스텀 CSS는 Master CSS 문법(
f:12!,max-width:1600!,mr:4등)을 활용하여 인라인 스타일처럼 간편하게 적용합니다. - Tabler 구성 요소 및 아이콘: Tabler에서 제공하는 다양한 UI 컴포넌트(
alert,card,form-control등)와 아이콘을 활용하여 일관된 디자인을 유지합니다. 아이콘은 Tabler Icons를 참조하세요.
HTML Element ID 및 속성 규칙 (HandStack 특화)
HandStack 화면은 HTML Element(이하 UI 컨트롤)에 다음과 같은 확장 속성을 사용하여 서버와의 데이터 연동 및 이벤트 처리를 담당합니다.
syn-datafield: 서버와의 데이터 교환(요청 및 응답)이 필요한 UI 컨트롤에 선언됩니다.syn-events: HTML Element의 이벤트 핸들러를 문자열 배열 형태로 선언할 수 있습니다 (예:['click', 'change']).syn-options: UI 컨트롤의 외형과 기능을 제어하는 옵션입니다. 각 컨트롤별로 지원하는 옵션 항목이 다르며, JSON 문법을 사용합니다. 문법 오 류 시 초기 렌더링 오류가 발생할 수 있으므로 주의해야 합니다.
ID 속성 및 헝가리안 표기법:
위 확장 속성을 사용하는 HTML Element는 반드시 id 속성을 선언해야 합니다. id 값은 가독성과 일관성을 위해 헝가리안 표기법을 따르며, 태그 이름에 따라 다음 접두사를 사용합니다.
| 접두사(Prefix) | HTML 태그/유형 | 설명 |
|---|---|---|
btn | BUTTON, INPUT[type=button], A | 버튼 |
hdn | INPUT[type=hidden] | 숨김 입력 필드 |
txt | INPUT[type=text], INPUT[type=search] | 단일 텍스트 입력 필드 |
pin | INPUT[type=password] | 비밀번호 입력 필드 |
clr | INPUT[type=color] | 색상 선택 입력 필드 |
eml | INPUT[type=email] | 이메일 입력 필드 |
num | INPUT[type=number] | 숫자 입력 필드 |
tel | INPUT[type=tel] | 전화번호 입력 필드 |
url | INPUT[type=url] | URL 입력 필드 |
smt | INPUT[type=submit] | 제출 버튼 |
rst | INPUT[type=reset] | 초기화 버튼 |
rdo | INPUT[type=radio] | 라디오 버튼 |
chk | INPUT[type=checkbox] | 체크박스 |
txt | TEXTAREA | 여러 줄 텍스트 입력 필드 |
ddl | SELECT | 드롭다운 목록 (단일 또는 다중 선택) |
grd | syn_auigrid (커스텀 태그) | AUIGrid 기반 데이터 그리드 |
cht | syn_chart (커스텀 태그) | Chart.js 기반 차트 |
chp | syn_codepicker (커스텀 태그) | 코드 도움 팝업 |
clp | syn_colorpicker (커스텀 태그) | 색상 팔레트 |
dtp | syn_datepicker, syn_dateperiodpicker (커스텀 태그) | 날짜/기간 선택 |
edt | syn_htmleditor, syn_sourceeditor (커스텀 태그) | HTML/소스 코드 편집기 |
lst | syn_list (커스텀 태그) | DataTable 기반 목록 그리드 |
tvl | syn_tree (커스텀 태그) | Fancytree 기반 트리 뷰 |
org | syn_organization (커스텀 태그) | 조직도 뷰 |
txt | syn_jsoneditor (커스텀 태그) | JSON 데이터 편집기 |
div, lbl 등 | DIV, SPAN, LABEL (게더링/바인딩 필요 시) | syn-datafield 속성 사용 시 해당 태그명에 따라 id 부여 규칙 적용 |
src | syn_data (커스텀 태그) | 데이터 소스 객체 |
ctx | syn_contextmenu (커스텀 태그) | 컨텍스트 메뉴 |
syn-datafield와 belongID:
syn-datafield를 이용한 데이터 거래 시, syn-options 속성의 belongID 항목이 선언되어 데이터 그룹을 지정합니다.
UI 컨트롤 예시:
<input type="text" id="txtApplicationID" syn-datafield="ApplicationID" syn-options="{editType: 'english'}" syn-events="['click']">
<input type="text" id="txtApplicationName" syn-datafield="ApplicationName" syn-events="['focus', 'change']">
<select id="ddlApplicationType" syn-datafield="ApplicationType" syn-options="{belongID: ['GD01']}" syn-events="['change']"></select>
<input type="text" id="txtRemark" syn-datafield="Remark" syn-options="{belongID: ['GD01']}">
<input id="txtEmailID" syn-datafield="EmailID" syn-options="{editType: 'text', belongID: ['LD01']}" type="text" class="form-control" maxlengthB="256">
<select class="form-select" id="ddlProjectRole" syn-datafield="ProjectRole" syn-options="{toSynControl: false, belongID: ['LD01']}">
<option value="" selected="">전체</option>
<option value="D">개발</option>
<option value="B">업무</option>
<option value="O">운영</option>
<option value="M">관리</option>
</select>
<input id="txtMemberName" syn-datafield="MemberName" syn-options="{editType: 'text', belongID: ['LD01']}" type="text" class="form-control" maxlengthB="50">
<div class="input-group">
<syn_datepicker id="dtpCreatedStartAt" syn-datafield="CreatedStartAt" syn-options="{value: 'month:-6', useRangeSelect: true, rangeEndControlID: 'dtpCreatedEndAt', belongID: ['LD01']}"></syn_datepicker>
</div>
<div class="input-group">
<syn_datepicker id="dtpCreatedEndAt" syn-datafield="CreatedEndAt" syn-options="{value: 'now', useRangeSelect: true, rangeStartControlID: 'dtpCreatedStartAt', belongID: ['LD01']}"></syn_datepicker>
</div>
Tabler 구성 요소와 아이콘 사용 예시
Tabler는 Bootstrap 5 기반 위에 다양한 UI 컴포넌트와 유틸리티 클래스를 제공하여 화면 개발을 용이하게 합니다. 아이콘은 Tabler Icons의 클래스명(ti ti-[icon-name])을 사용하며, 크기 는 Master CSS의 f:XX 클래스(예: f:18, f:20, f:24)로 조절합니다.
아이콘 (<i> 태그 활용)
- 사용법:
<i class="f:XX ti ti-[icon-name]"></i>형태로 사용합니다. - 예시:
<!-- 검색 아이콘 (크기 18px) -->
<i class="f:18 ti ti-search"></i>
<!-- 알림 아이콘 (크기 20px) -->
<i class="f:20 ti ti-bell"></i>
경고/정보 (alert)
- 설명: 사용자에게 정보, 성공, 경고, 오류 등의 메시지를 표시할 때 사용합니다.
alert-dismissible클래스를 사용하여 닫기 버튼을 추가할 수 있습니다. - 클래스:
alert,alert-info,alert-success,alert-warning,alert-danger,alert-dismissible,btn-close - 예시:
<div class="alert alert-info alert-dismissible" role="alert">
<div class="d-flex">
<div class="mr-2">
<i class="f:20 ti ti-check"></i>
</div>
<div>
<h4 class="alert-title">작업일자통제 참고사항</h4>
<div class="text-secondary">
<ul class="m-0">
<li>이월: 현재 기수의 회계기간 말일 자로 마감일이 자동 입력되어 통제합니다.</li>
<li>취소: 이전 기수 회계기간 말일 자로 마감일이 자동 입력되어 통제합니다.</li>
<li>일마감, 월마감 등으로 관리하는 경우 마감일을 직접 입력하여 통제합니다.</li>
</ul>
</div>
</div>
</div>
<span class="btn-close" data-bs-dismiss="alert" aria-label="close"></span>
</div>
<div class="alert alert-success" role="alert">
<div class="d-flex">
<div class="mr-2">
<i class="f:20 ti ti-check"></i>
</div>
<div>
Wow! Everything worked!
</div>
</div>
</div>