본문으로 건너뛰기

UI 라이브러리 예제 소개

HandStack 화면(Tabler 기반 UI)에서 자주 쓰는 레이아웃·컴포넌트 마크업을 분류별로 모은 참고 예제입니다. 새 화면을 만들 때 처음부터 마크업을 작성하기보다, 필요한 카테고리에서 비슷한 예제를 찾아 복사한 뒤 문구와 데이터만 바꿔 쓰는 것을 권장합니다.

마크업은 Tabler(tabler-core) 컴포넌트 클래스와 Bootstrap 5 그리드/유틸리티, master-css(f:, b:, m-, p- 등 속성형 유틸리티, w:100!처럼 !가 붙으면 !important) 표기를 함께 사용합니다. syn-으로 시작하는 속성(syn-datafield, syn-options, syn-events 등)은 CSS 클래스가 아니라 HandStack view-designer가 화면 컨트롤을 데이터/이벤트에 연결할 때 사용하는 자체 바인딩 속성이며, 이 예제 모음의 범위를 벗어나므로 별도 가이드를 참고하세요.

각 문서는 소스 마크업, 마크업에 쓰인 주요 클래스의 역할, 그리고 HandStack 웹 호스트의 /sample/ui-library/<파일명>.html 미리보기 페이지 경로를 함께 안내합니다. 원본 소스는 저장소의 2.Modules/wwwroot/wwwroot/sample/ui-library에 있으며, qcn.winform view-designer "UI 라이브러리" 팝업 카탈로그에서 옮긴 것입니다.

일반적인 페이지 레이아웃을 구성할 때 사용하는 가장 기본적인 페이지 구조는 아래처럼 잡으면 됩니다.

<div class="page">

<!-- Navbar / Sidebar 등이 위치 -->

<div class="page-wrapper">

<!-- 페이지 제목 영역 -->
<div class="page-header">
<div class="container-xl">
<div class="row g-2 align-items-center">
<div class="col">
<h2 class="page-title">
사용자 관리
</h2>
</div>

<div class="col-auto ms-auto">
<button class="btn btn-primary">
사용자 추가
</button>
</div>
</div>
</div>
</div>

<!-- 실제 페이지 내용 -->
<div class="page-body">
<div class="container-xl">

<div class="card">
<div class="card-header">
<h3 class="card-title">사용자 목록</h3>
</div>

<div class="card-body">
페이지 내용
</div>
</div>

</div>
</div>

</div>

</div>

구조를 계층으로 보면 더 이해하기 쉽습니다.

.page

├── .navbar / sidebar

└── .page-wrapper

├── .page-header
│ └── .container-xl
│ └── 제목 / 버튼 / breadcrumb 등

└── .page-body
└── .container-xl
└── 실제 콘텐츠
├── .row
├── .col-*
├── .card
├── .table
└── .form-*

각 클래스의 역할을 정리하면 다음처럼 생각하시면 됩니다.

클래스역할
.page페이지 전체를 감싸는 최상위 컨테이너
.page-wrapperNavbar/Sidebar를 제외한 페이지 콘텐츠 영역
.page-header페이지의 제목/설명/버튼/Breadcrumb 영역
.page-body페이지의 실제 본문 영역
.container-xl콘텐츠의 최대 너비 및 좌우 여백 관리
.rowBootstrap Grid 행
.col-*Bootstrap Grid 열
.card실제 업무 화면의 콘텐츠 박스

예를 들어 관리자 화면이라면 이런 식으로 구성하기 좋습니다.

<div class="page">
<div class="page-wrapper">

<div class="page-header">
<div class="container-xl">
<h2 class="page-title">회원 관리</h2>
</div>
</div>

<div class="page-body">
<div class="container-xl">

<!-- 검색 조건 -->
<div class="card mb-3">
<div class="card-body">
검색 조건
</div>
</div>

<!-- 목록 -->
<div class="card">
<div class="card-header">
<h3 class="card-title">회원 목록</h3>
</div>

<div class="card-body">
<table class="table">
...
</table>
</div>
</div>

</div>
</div>

</div>
</div>

container-xl도 중요합니다

Tabler 화면을 만들 때 보통

<div class="page-body">
<div class="container-xl">
...
</div>
</div>

처럼 사용합니다.

화면 전체 너비를 좀 더 적극적으로 사용하고 싶다면 Bootstrap 방식으로:

<div class="container-fluid">

를 사용하는 것도 가능합니다. Tabler 자체가 Bootstrap 5 기반이므로 Bootstrap의 grid/container/spacing 유틸리티를 함께 사용하는 방식입니다. ([Tabler][1])

지금 만들고 계신 HTML 화면 디자인 도구에서 페이지 구조를 컴포넌트화하려는 목적이라면, 저는 계층을

Page
└─ Page Wrapper
├─ Page Header
│ └─ Container
└─ Page Body
└─ Container
└─ Row
└─ Column
└─ Card

정도로 정의하는 것을 추천합니다. 그러면 그 아래에서 row / col / card / form / table 등을 조립하는 방식으로 Tabler 화면 대부분을 만들 수 있습니다.


참고사항

예제설명
참고사항업무 화면 상단에서 지나치기 쉬운 규칙을 alert-info 카드로 안내합니다.

알림 정보

예제설명
알림 정보성공·경고·위험·정보 네 가지 상태의 alert 색상 변형을 한 화면에서 비교합니다.

폼 요소

예제설명
기본 텍스트 입력labelform-control을 짝지어 쓰는 기본형과 disabled·readonly·required 상태를 보여줍니다.
선택(Select)selectform-select 클래스만 붙이는 단일·다중 선택 상자입니다.
입력 그룹input-group으로 입력창에 버튼·드롭다운·아이콘·로딩 스피너를 붙입니다.
폼 컨트롤 스타일form-control-rounded(둥근 모서리)와 form-control-flush(밑줄만 남기는) 스타일 변형입니다.
체크박스·라디오 입력 그룹input-group-text 안에 체크박스·라디오를 넣어 정렬하는 조합입니다.
텍스트·아이콘 부가 입력input-group-flat으로 경계를 없애 하나처럼 보이는 입력 조합입니다.
플로팅 라벨 입력값이 없으면 라벨이 입력창 안에 겹쳐 있다가 포커스를 주면 위로 떠오릅니다.
이미지 선택썸네일 이미지를 클릭해 선택하는 form-imagecheck 컨트롤입니다.
색상 입력색상 스와치로 고르는 form-colorinput과 네이티브 색상 선택기를 보여줍니다.
유효성 검사 상태is-valid/is-invalid로 입력값의 통과·오류 상태를 표시합니다.
폼 필드셋labelform-controlmb-3으로 묶은 필드 세트를 반복하는 기본 패턴입니다.
선택 그룹(버튼형)라디오·체크박스를 박스나 필(pill) 모양의 클릭 카드로 보여주는 form-selectgroup입니다.
버튼 그룹숨겨진 btn-check 라디오에 연결된 버튼으로 하나(또는 여러 개)를 선택하는 세그먼트 컨트롤입니다.
라디오 버튼·체크박스form-check로 감싼 라디오·체크박스의 세로·가로·비활성화 변형을 모았습니다.
스위치form-switch로 체크박스를 On/Off 토글 스위치 모양으로 바꿉니다.
알림항목명과 On/Off 스위치를 좌우로 배치한 알림 수신 설정 목록형 스위치입니다.
파일·날짜·마스크 입력파일 첨부, 여러 select로 구성한 날짜, data-mask 마스크 입력을 모았습니다.
기타 입력 요소자동완성 datalist, 슬라이더, 진행률 표시줄, 소셜 로그인 버튼을 모았습니다.

서식

예제설명
프로젝트 IDAPI와 상호 작용할 때 사용됩니다.
Node.js 버전빌드 단계 및 서버리스 함수에서 사용되는 Node.js 버전입니다. 변경 사항을 적용하려면 새로운 배포가 필요합니다.
기본 폼label + 입력 컨트롤 + form-hint를 반복하는 세로형 기본 폼입니다.
수평 폼라벨과 입력란을 좌우로 나란히 배치하는 폼입니다.
입력 마스크날짜·전화번호처럼 정해진 형식으로 입력받는 data-mask 필드 모음입니다.
내 프로필아바타를 첫 입력 항목 옆에 나란히 배치하는 프로필 편집 폼입니다.
프로필 수정회사·이름·이메일 등 여러 입력 항목을 격자로 배치하는 프로필 수정 화면입니다.
HTTP 요청메서드·URL 입력과 조건(단언) 목록 테이블로 구성한 API 요청 폼입니다.

UI 예제

예제설명
계정에 로그인이메일·비밀번호 입력과 소셜 로그인 버튼을 담은 카드형 로그인 화면입니다.
계정 잠금계정을 잠금 해제하려면 비밀번호를 입력 하세요.
계정 인증+82 10-1234-5678 로 전송된 인증 코드를 입력하여 계정을 확인하세요.

버튼

예제설명
표준 버튼btn-primary, btn-success 등 시맨틱 색상 버튼과 활성·비활성화 상태를 비교합니다.
아웃라인 버튼아웃라인 버튼을 사용하려면 .btn-outline-* 클래스를 사용하세요.
고스트 버튼고스트 버튼을 사용하려면 .btn-ghost-* 클래스를 사용하세요.
사각 버튼사각 버튼을 사용하려면 .btn-square 클래스를 사용하세요.
필 버튼필 버튼을 사용하려면 .btn-pill 클래스를 사용하세요.
추가 색상btn-blue, btn-azure처럼 Tabler 확장 색상 팔레트를 버튼에 직접 지정합니다.

배지

예제설명
배지상태·개수·새 항목 표시에 쓰는 배지의 기본형·색상형·아웃라인·알림 점 등 여섯 가지 패턴입니다.

카드 헤더

예제설명
카드 샘플card-actions에 수량 선택 select와 증감 버튼 그룹을 배치한 헤더입니다.
액션이 있는 카드카드 제목 옆에 주요 동작 버튼 하나를 배치하는 가장 단순한 헤더 액션 형태입니다.
카드 제목card-actions에 강조 없는 보조 버튼 여러 개를 나열합니다.
홍길동아바타와 이름·직함, 전화·이메일 버튼을 함께 보여주는 사용자 카드 헤더입니다.
설명 포함카드 제목 아래에 간단한 설명을 추가할 수 있습니다.
설명 및 액션 포함설명 포함card-actions 버튼을 더한 형태입니다.
김철수홍길동과 같은 구조에 버튼 대신 점 3개(⋮) 드롭다운 메뉴를 붙입니다.
카드 액션btn-actions로 아이콘 버튼 여러 개를 촘촘하게 배치합니다.

목록

예제설명
목록아바타 목록, 체크 가능한 리스트그룹, 알파벳 헤더로 묶인 스크롤 목록 등 세 가지 패턴을 나란히 보여줍니다.

모달

예제설명
기본 모달제목·본문·버튼 영역을 모두 갖춘 가장 기본적인 모달 구조입니다.
큰 모달modal-lg로 너비를 넓혀 입력 항목이 많은 콘텐츠를 담습니다.
작은 모달modal-sm으로 너비를 좁혀 삭제 확인처럼 짧은 문구만 담습니다.
전체 너비 모달modal-full-width로 화면 가로 전체를 모달 상자로 사용합니다.
스크롤 가능 모달이 모달은 내용이 길어질 경우 스크롤이 가능합니다.
폼이 있는 모달modal-lg 안에 텍스트·카드형 라디오·드롭다운 등 여러 입력 컨트롤을 조합한 등록 폼을 담습니다.
성공 모달modal-status bg-success로 작업이 성공적으로 끝났음을 알리는 전용 모달입니다.
위험 모달삭제처럼 되돌릴 수 없는 작업을 실행하기 전 한 번 더 확인받는 모달입니다.
간단한 폼이 있는 모달기본 너비에 입력 항목이 적은 짧은 등록 폼을 담습니다.

타이포그래피

예제설명
타이포그래피이곳에 인용문을 넣을 수 있습니다. 이것은 인용문의 예시 텍스트입니다. 독자에게 영감을 주거나 중요한 내용을 강조할 때 사용됩니다.

단계 진행

예제설명
수평 단계steps 안에 step-item을 나열해 현재 진행 위치를 가로로 안내합니다.
수직 단계steps-vertical로 각 단계마다 설명이 딸린 흐름을 세로로 보여줍니다.

예제설명
nav-bordered로 콘텐츠를 여러 그룹으로 나눠 전환하는 탭 내비게이션입니다.

페이지 헤더와 레이아웃

예제설명
주요 업무 영역카드 안에 핵심 지표를 아이콘·숫자·라벨 순으로 3분할 요약합니다.
빠른 실행list-group-flush로 자주 쓰는 기능을 버튼 목록 형태로 모아 바로가기를 제공합니다.

컴포넌트 종합 예제

예제설명
오늘의 예약 현황카드·배지·아바타·버튼을 조합한 알림형 업무 요약 카드 예제입니다.

진행 상태와 업무 흐름

예제설명
진행 상태와 업무 흐름고객 요구사항과 희망 납기일을 등록했습니다.

폼 구성과 검증

예제설명
폼 구성과 검증필드셋·선택 그룹·유효성 검사 상태를 조합한 업무 상담 폼 예제입니다.

유틸리티

예제설명
유틸리티테두리·여백·커서·세로 정렬 네 가지 유틸리티 클래스를 값별로 비교합니다.

그룹코드 등록

예제설명
그룹코드 등록그룹코드·그룹코드명을 등록하는 실제 HandStack 팝업 화면 예제입니다.