Tabler 1.6.1 컴파일 버전 CSS 및 기본 제공 Modal JavaScript. 원본 프로젝트 콘텐츠와 표지 연구. · 구현 레퍼런스
02
Tabler 디자인 시스템 디자인 참조
Tabler 1.6.1 컴파일 버전 CSS 변수. 이 릴리스는 원시 색상에 OKLCH를 사용하고, 시맨틱 역할에는 light-dark()/color-mix()를 사용합니다. 이전의 헥스 기반 Tabler 예제를 같은 테마로 간주해서는 안 됩니다. 아래 값은 실제 설치 기본값입니다.
프로젝트 기록은 Tabler 1.6.1로 빌드되었습니다. 컴파일된 팔레트는 OKLCH 색상을 사용하고, 시맨틱 변수는 light-dark와 color-mix를 사용합니다. 따라서 이 참조 자료에는 이전 Bootstrap 또는 Tabler 가이드의 16진수 값을 옮겨 적는 대신 실제 표현식을 표시했습니다. 주요 동작, 상태 배지, 표면 역할은 모두 설치된 릴리스에서 가져옵니다.
Tabler은 Bootstrap 컴포넌트 어휘를 확장하고 고유한 레이아웃 및 정보 표시 패턴을 제공합니다. 이 예제는 익숙한 카드, 양식, Modal과 함께 네이티브 타임라인, 페이지 헤더, datagrid, 아바타 클래스를 사용합니다. 이러한 요소를 통해 단순히 로고만 바꾼 일반적인 카드 그리드가 아닌 Tabler 스타일의 구성을 구현합니다.
테마 컨트롤은 html 요소의 data-bs-theme을 변경하고, 자체 눌림 상태와 동작 레이블도 업데이트합니다. 그러면 Tabler의 시맨틱 표현식이 밝은 값 또는 어두운 값을 선택합니다. 두 가지 상태만 있는 이 간단한 예제에는 별도의 JavaScript 테마 관리자가 필요하지 않으며, 페이지 밖에 설정을 저장하지도 않습니다.
Decision, Prototype, Review에는 기본 파란색, 보라색, 녹색 색조 클래스가 사용됩니다. 텍스트 레이블만으로도 의미를 파악할 수 있어 색상에만 의존하지 않습니다. 표지 시안의 아트워크는 두 모드 모두 원래의 종이 같은 색상 팔레트를 유지하며, 주변 카드와 페이지, 텍스트에는 실제 구성 요소 테마가 적용됩니다.
기본 본문 글꼴 크기는 0.875rem이고 줄 높이는 약 1.4286으로, 루트 크기가 16픽셀일 때 대략 14픽셀의 텍스트를 표시합니다. 설치된 글꼴 스택은 시스템 산세리프이므로 이 미리 보기에는 원격 글꼴이 필요하지 않습니다. 카드 제목과 메타데이터에는 기본 클래스를 유지하고, 페이지 제목에는 별도로 32픽셀 크기를 적용합니다.
기본 여백 값은 0, 0.25, 0.5, 1, 1.5, 2, 2.5rem 순으로 늘어납니다. 이는 설치된 CSS에 정의된 변수이며, 임의로 추정한 배율이 아닙니다. 기본 카드 본문 패딩은 가로와 세로 모두 1.25rem입니다. 타임라인 노드는 2.5rem이고, 연결선은 페이지 패딩 변수를 사용해 항목 사이를 이어 줍니다.
각 체크포인트는 timeline-event 목록 항목이며, timeline-event-icon과 timeline-event-card를 포함합니다. 기본 CSS는 노드 위치를 정하고, 마지막 항목을 제외한 항목 사이에 연결선을 그리며, 노드 너비에 페이지 패딩을 더한 만큼 콘텐츠 카드를 띄웁니다. 이 예시에서는 배경 이미지로 선을 흉내 내거나 모든 카드에 절대 위치를 지정하지 않습니다.
카드마다 콘텐츠가 다릅니다. 하나는 구조적 결정을 기록하고, 하나는 실제 표지 시안 세 가지를 담으며, 하나는 참고 자료 검토 내용을 기록합니다. 프로젝트 맥락은 형식과 현재 중점이 날짜가 있는 이벤트가 아니라 계속 유지되는 속성이므로 순서 목록 바깥에 배치합니다. 작은 화면에서는 사이드바가 문서 순서에 따라 타임라인 다음에 표시됩니다.
프로젝트 맥락 카드에는 datagrid-item, datagrid-title, datagrid-content 쌍이 사용됩니다. 형식, 팀, 체크포인트, 현재 중점은 서로 나란히 비교할 속성이므로, 중복된 행 제목이 있는 표 대신 기본 datagrid에 간결하게 표시합니다. 아바타에는 텍스트 이니셜을 사용하므로 원격 이미지 에셋이 필요하지 않습니다.
이 예시에서 변경되는 맥락 값은 체크포인트 수뿐입니다. 로컬 항목을 추가하면 원래 프로젝트 설명은 그대로 둔 채 체크포인트 수가 3에서 4로 바뀝니다. 표시된 목록 항목 수와 직접 대응하므로 대시보드 지표를 임의로 만들어 내지 않습니다.
Add checkpoint는 data-bs-toggle과 data-bs-target을 통해 기본 모달을 엽니다. 번들로 제공되는 Tabler JavaScript가 모달 구현을 담당합니다. shown.bs.modal 리스너는 전환이 끝나 입력 필드가 실제로 표시된 뒤 제목 필드에 포커스를 맞춥니다. 닫기와 취소에는 data-bs-dismiss를 사용해 동일한 구성 요소 생명주기를 따릅니다.
모달에는 실제 양식이 들어 있습니다. 필수 입력 및 길이 제약 조건은 제출 핸들러가 실행되기 전에 입력이 누락된 필드를 거부합니다. 핸들러에서는 앞뒤 공백을 제거한 뒤 길이도 확인합니다. 공백만 입력한 문자열은 유효한 제목이나 사유가 아니기 때문입니다. 유효성 검사를 해도 수정할 수 있도록 입력한 텍스트는 그대로 남으며, 항목이 성공적으로 추가된 뒤에만 양식이 초기화됩니다.
애플리케이션은 정해진 카드 구조를 만들고 제목과 사유를 textContent로 삽입합니다. 선택 메뉴의 세 가지 종류에 고정 매핑을 적용해 색조 클래스만 선택합니다. 사용자가 입력한 텍스트는 카드 HTML에 절대 문자열 보간으로 삽입하지 않습니다. 새 항목은 조작된 서버 타임스탬프 대신 명확한 로컬 항목 레이블과 함께 목록 맨 앞에 추가됩니다.
항목을 삽입한 뒤 기존 모달 인스턴스를 닫고 새 체크포인트의 이름을 알리는 상태 알림을 표시합니다. 이 알림에는 프로젝트 서비스가 업데이트되지 않았다는 점도 명시됩니다. 실제 협업 저널에는 지속성, 작성자 식별, 순서 보장이 필요합니다. 로컬 DOM에 항목을 추가하는 것만으로는 이러한 기능이 제공되지 않습니다.
기본 그리드에는 col-lg-8과 col-lg-4를 사용합니다. 기본 큰 화면 중단점보다 작아지면 프로젝트 맥락이 저널 아래로 이동합니다. 원래의 작은 화면용 스타일시트는 타임라인의 측면 간격을 줄이고, 제목과 배지 그룹이 줄바꿈되도록 하며, 표지 시안 크기를 조정합니다. 텍스트와 동작은 그대로 유지됩니다.
아이콘 열과 카드 패딩, 긴 제목이 같은 너비를 놓고 경쟁하면 타임라인이 비좁아질 수 있습니다. 모바일 예시에서는 노드를 안정적인 안내 요소로 유지하면서 오프셋을 줄였습니다. 원래의 표지 시안 세 가지는 서로의 관계가 중요하므로 작은 비교 이미지로 유지합니다. 각 캡션은 인접한 설명 문단을 보완하는 역할을 합니다.
설정에서는 @tabler/core 1.6.1을 사용하고 dist 에셋을 로컬 공개 디렉터리에 복사합니다. tabler.min.css는 애플리케이션 스타일시트보다 먼저 불러오고, tabler.min.js는 로컬 상호작용 코드보다 먼저 불러옵니다. 관련 없는 Bootstrap 번들을 하나 더 추가하면 동일한 데이터 속성이 두 번 초기화될 수 있습니다. 이 예시에서는 호환되는 Tabler 번들만 사용합니다.
현재 스타일시트에서는 최신 색상 함수를 사용합니다. 오래된 브라우저 지원이 필요한 제품에 적용할 때는 Tabler의 브라우저 지원 지침을 확인하세요. 로컬 예시는 Chromium에서 기본 모달 유효성 검사, 타임라인 항목 추가, 다크 모드, 390px 레이아웃을 확인했습니다. 이는 프로덕션 배포가 아니며 가능한 모든 브라우저에서의 동작을 보장하지 않습니다.
Tabler 1.6.1을 확인했습니다. 함께 제공된 레이아웃 및 애플리케이션 모듈을 style.css와 app.js로 저장하세요. 기본 모달 데이터 API을 사용합니다. HTML 래퍼에는 전체 본문 마크업이 포함되어 있습니다. 제공된 상호작용 예제와 CSS 예제는 여기에 표시된 파일 이름으로 저장하세요.
html
<!-- npm install @tabler/[email protected] -->
<!-- Copy node_modules/@tabler/core/dist to public/vendor/tabler. -->
<html lang="en" data-bs-theme="light">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="stylesheet" href="/vendor/tabler/css/tabler.min.css">
<link rel="stylesheet" href="style.css">
<main class="project-log"><header class="page-header d-print-none"><div class="row align-items-center"><div class="col"><div class="page-pretitle">TABLER · PROJECT JOURNAL</div><h1 class="page-title">Atlas field notes</h1><p class="text-secondary mt-2 mb-0">Decisions, prototypes and review checkpoints for a small editorial project.</p></div><div class="col-auto d-flex gap-2"><button id="theme" class="btn" aria-pressed="false">Dark mode</button><button id="add" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#entry-modal">Add checkpoint</button></div></div></header><div class="row g-4 mt-1"><section class="col-lg-8" aria-label="Project checkpoints"><ul id="timeline" class="timeline"><li class="timeline-event"><div class="timeline-event-icon bg-blue-lt" aria-hidden="true">AM</div><div class="card timeline-event-card"><div class="card-body"><div class="d-flex justify-content-between gap-3"><h2 class="card-title mb-1">A clearer route through the issue</h2><span class="badge bg-blue-lt">Decision</span></div><div class="text-secondary small mb-3">Alex Morgan · 02 OCT</div><p class="mb-0">Group the field essays by landscape rather than author. Each chapter opens with a short map and a single question.</p></div></div></li><li class="timeline-event"><div class="timeline-event-icon bg-purple-lt" aria-hidden="true">JC</div><div class="card timeline-event-card"><div class="card-body"><div class="d-flex justify-content-between gap-3"><h2 class="card-title mb-1">Three cover directions</h2><span class="badge bg-purple-lt">Prototype</span></div><div class="text-secondary small mb-3">Jules Chen · 01 OCT</div><div class="cover-strip" aria-label="Three original cover studies"><div><b>ATLAS</b><i></i><small>RIDGE / 01</small></div><div><b>ATLAS</b><i></i><small>RIVER / 02</small></div><div><b>ATLAS</b><i></i><small>PLAIN / 03</small></div></div><p class="mt-3 mb-0">Compare the quiet title treatment against the stronger geographic silhouette before selecting a direction.</p></div></div></li><li class="timeline-event"><div class="timeline-event-icon bg-green-lt" aria-hidden="true">SR</div><div class="card timeline-event-card"><div class="card-body"><div class="d-flex justify-content-between gap-3"><h2 class="card-title mb-1">Reference package reviewed</h2><span class="badge bg-green-lt">Review</span></div><div class="text-secondary small mb-3">Sam Rivera · 30 SEP</div><p class="mb-0">Image captions, credit lines and print dimensions are recorded alongside each selected reference.</p></div></div></li></ul></section><aside class="col-lg-4"><div class="card"><div class="card-header"><h2 class="card-title">Project context</h2></div><div class="card-body"><div class="datagrid"><div class="datagrid-item"><div class="datagrid-title">Format</div><div class="datagrid-content">Editorial field journal</div></div><div class="datagrid-item"><div class="datagrid-title">Team</div><div class="datagrid-content"><span class="avatar avatar-xs me-1">AM</span><span class="avatar avatar-xs me-1">JC</span><span class="avatar avatar-xs">SR</span></div></div><div class="datagrid-item"><div class="datagrid-title">Checkpoints</div><div id="count" class="datagrid-content">3 recorded</div></div><div class="datagrid-item"><div class="datagrid-title">Current focus</div><div class="datagrid-content">Cover selection</div></div></div></div><div class="card-footer text-secondary">Sample project. New entries stay in this page.</div></div><div class="card mt-4"><div class="card-body"><h2 class="card-title">A useful checkpoint</h2><p class="text-secondary">Record the decision and the reason together. A future reader should understand what changed without reopening the meeting.</p><p class="mb-0 small">Choose Decision, Prototype or Review when adding a local entry.</p></div></div></aside></div><div id="notice" class="alert alert-success mt-3" role="status" hidden></div></main><div id="entry-modal" class="modal modal-blur fade" tabindex="-1" aria-labelledby="entry-title" aria-hidden="true"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><form id="entry-form"><div class="modal-header"><h2 id="entry-title" class="modal-title">Add a local checkpoint</h2><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><div class="mb-3"><label for="entry-name" class="form-label">Title</label><input id="entry-name" class="form-control" required minlength="5" maxlength="80" placeholder="What changed?"></div><div class="mb-3"><label for="entry-type" class="form-label">Kind</label><select id="entry-type" class="form-select"><option>Decision</option><option>Prototype</option><option>Review</option></select></div><div><label for="entry-detail" class="form-label">Reason or evidence</label><textarea id="entry-detail" class="form-control" required minlength="15" maxlength="360" rows="4" placeholder="Explain why this checkpoint matters."></textarea></div></div><div class="modal-footer"><button type="button" class="btn" data-bs-dismiss="modal">Cancel</button><button class="btn btn-primary" type="submit">Add to journal</button></div></form></div></div></div>
<script src="/vendor/tabler/js/tabler.min.js"></script>
<script src="app.js"></script>
<!-- The bundle exposes tabler.Modal; no second Bootstrap bundle is needed. -->
</html>
프로젝트를 위한 프롬프트
에이전트 프롬프트
Tabler 1.6.1을 사용해 타임라인, 컨텍스트 카드, 데이터그리드 및 기본 Modal을 포함한 Atlas 프로젝트 저널을 재현하세요. 유효성 검사를 거친 체크포인트 양식은 확정된 타임라인과 분리하세요. 취소하면 저널이 그대로 유지되고, 유효한 내용을 제출하면 입력한 체크포인트가 로컬 기록에 추가됩니다. data-bs 속성, 이에 맞는 Tabler 번들 및 테마 처리를 유지하세요. 기존 표지 시안은 장식용으로 두고, 좁은 화면에서도 체크포인트 텍스트를 읽기 쉽게 표시하세요. 인프라 목록을 제공하거나 외부에 게시한다고 암시하지 마세요.
05
Tabler 디자인 시스템의 출처 및 범위
Tabler 1.6.1. 실제 테마 변수와 기본 구성 요소를 기존 프로젝트 콘텐츠 및 표지 아트워크와 구분합니다. 새 체크포인트는 로컬에만 저장됩니다.