Section 01
타이포그래피 시스템
팀 보고서 전반에 적용되는 폰트·크기·굵기·행간 표준입니다. Google Fonts CDN으로 로드하며 한글(Pretendard Variable)과 코드(JetBrains Mono) 두 종만 사용합니다.
폰트 선언 — <head> 복사용
HTML
<link href="https://fonts.googleapis.com/css2?family=Pretendard+Variable:wght@100..900&family=JetBrains+Mono:wght@400;600&display=swap" rel="stylesheet">
CSS
--font: 'Pretendard Variable', 'Noto Sans KR', sans-serif;
--mono: 'JetBrains Mono', monospace;
타입 스케일 — 실제 렌더링
H1 보고서 제목
32px · weight 800 · line-height 1.2
CSS
font-size: 32px;
font-weight: 800;
line-height: 1.2;
H2 섹션 헤더
24px · weight 700 · line-height 1.3
CSS
font-size: 24px;
font-weight: 700;
line-height: 1.3;
H3 소제목
18px · weight 700 · line-height 1.4
CSS
font-size: 18px;
font-weight: 700;
line-height: 1.4;
H4 항목 제목
15px · weight 600 · line-height 1.4
CSS
font-size: 15px;
font-weight: 600;
line-height: 1.4;
본문 텍스트. 측정 결과를 기술하는 문장으로 행간을 확인합니다. 공학 보고서의 기본 단위입니다.
14px · weight 400 · line-height 1.7
CSS
font-size: 14px;
font-weight: 400;
line-height: 1.7;
그림 1. 4기통 엔진 RPM 구간별 진동 가속도 측정 결과 (단위: g)
12px · weight 400 · color: --text2
CSS
font-size: 12px;
font-weight: 400;
color: var(--text2);
표 내부 데이터 · 13px 기준
13px · weight 400 · line-height 1.5
CSS
font-size: 13px;
font-weight: 400;
line-height: 1.5;
Section 02
색상 토큰
모든 색상은 :root CSS 변수로 선언합니다. 코드에 hex 값을 직접 쓰지 않고 변수명만 사용합니다.
브랜드 컬러
Brand
--brand
#2E86C1
Brand Dark
--brand-d
#1a5276
Brand Light
--brand-l
#aed6f1
시맨틱 컬러
Success
--success
#27AE60
Warning
--warning
#F39C12
Danger
--danger
#E74C3C
Info
--info
#8E44AD
차트 전용 팔레트 (순서 고정)
Chart 1
--c1
#2E86C1
Chart 2
--c2
#E74C3C
Chart 3
--c3
#27AE60
Chart 4
--c4
#F39C12
Chart 5
--c5
#8E44AD
Chart 6
--c6
#E67E22
배경·텍스트·선
BG
--bg
#f4f6f9
Surface
--surface
#ffffff
Surface 2
--surface2
#f0f2f5
Line
--line
#dde1e7
Text
--text
#1a1d26
Text 2
--text2
#4a5568
Muted
--muted
#8899aa
Section 03
레이아웃·그리드
A4 기준 여백, 컬럼 분할, 간격 단위 체계. 모든 간격은 8px 배수로 통일합니다.
A4 여백 기준
top: 20mm
left: 25mm
right: 25mm
본문 영역 (max-width: 800px)
bottom: 20mm
CSS · @media print
@media print {
  body { margin: 0; padding: 0; }
  .report { padding: 20mm 25mm; max-width: 100%; }
  .no-print { display: none; }
  .page-break { page-break-before: always; }
  * { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
}
컬럼 분할 예시
6:4 분할 — 그래프 + 설명 텍스트
그래프 영역 (60%)
설명 텍스트 (40%)
7:3 분할 — 본문 + 사이드 노트
본문 (70%)
사이드 (30%)
1:1:1 3등분 — 수치 요약 카드
지표 A
지표 B
지표 C
CSS
.col-6-4 { display: grid; grid-template-columns: 6fr 4fr; gap: 24px; }
.col-7-3 { display: grid; grid-template-columns: 7fr 3fr; gap: 24px; }
.col-3   { display: grid; grid-template-columns: repeat(3,1fr); gap: 16px; }
간격 단위 체계 (8px 배수)
--sp-1: 4px
아이콘-텍스트 간격, 태그 내부 패딩
--sp-2: 8px
인접 요소 간격, 소규모 패딩
--sp-3: 12px
카드 내부 항목 간격
--sp-4: 16px
카드 패딩, 섹션 내 요소 간격
--sp-5: 24px
카드 간격, 컬럼 gutter
--sp-6: 32px
주요 섹션 내 블록 간격
--sp-7: 48px
섹션 간 여백
--sp-8: 64px
페이지 최상단 패딩
Section 04
컴포넌트 라이브러리
실제 렌더링(좌)과 HTML 코드(우)를 나란히 표시합니다. 우측 코드를 복사해 보고서에 바로 붙여 넣으세요.
섹션 헤더
1

진동 측정 결과

코드
HTML
<div class="rpt-sec-hd">
  <div class="rpt-num-badge">1</div>
  <h3>진동 측정 결과</h3>
</div>
<div class="rpt-divider"></div>
데이터 표
측정 위치RPM가속도(g)판정
엔진 마운트3,0002.4정상
서브프레임3,0003.1⚠ 주의
대시보드3,0000.8정상
최대값3.1—
코드
HTML
<table class="rpt-table">
  <thead>
    <tr><th>측정 위치</th>...</tr>
  </thead>
  <tbody>
    <tr><td>...</td></tr>
    <tr class="hl">...</tr> <!-- 강조행 -->
    <tr class="tot">...</tr> <!-- 합계행 -->
  </tbody>
</table>
그림 + 캡션
[ 그래프 / 이미지 영역 ]
그림 1. RPM 구간별 진동 가속도 측정 결과 (단위: g, 측정일: 2026-08-22)
코드
HTML
<figure class="rpt-fig">
  <img src="./assets/fig1.png" alt="그래프">
  <figcaption class="rpt-figcap">
    <strong>그림 1.</strong> 설명 텍스트
  </figcaption>
</figure>
콜아웃 박스 3종
ℹ️
참고 — 이 측정값은 공회전 조건 기준입니다.
⚠️
주의 — 3,000 RPM 구간에서 한계값(3.0g) 초과.
✅
결론 — 엔진 마운트·대시보드는 허용 범위 내 정상.
코드
HTML
<div class="rpt-callout info">
  <span>ℹ️</span>
  <div><strong>참고</strong> — 내용</div>
</div>
<div class="rpt-callout warn">...</div>
<div class="rpt-callout ok">...</div>
코드·수식 블록
f_n = (1/2π) × √(k/m)
여기서 k = 강성 [N/m], m = 질량 [kg]
코드
HTML
<div class="rpt-code-blk">
  f_n = (1/2π) × √(k/m)
</div>
인라인 강조 — 수치·단위

최대 가속도는 3.1g로 한계값 대비 103% 수준이며, 측정 온도는 72.4°C를 기록했습니다.

코드
HTML
<span class="rpt-hi">3.1</span>
<span class="rpt-unit">g</span>
Section 05
인터랙션 컴포넌트
마우스 반응·애니메이션·소팅 등 사용자 경험을 높이는 인터랙션 컴포넌트입니다. 복사 버튼으로 코드 전체를 가져가세요.
마그네틱 카드 — 마우스 접근 시 3D 기울기
📊

진동 분석

FFT 기반 주파수 응답 분석

🌡️

온도 측정

열화상 카메라 데이터 처리

⚡

소음 평가

사운드레벨미터 측정값 분석

코드
HTML + JS
<div class="mag-card" data-mag>내용</div>

<script>
document.querySelectorAll('[data-mag]').forEach(card => {
  card.addEventListener('mousemove', e => {
    const r = card.getBoundingClientRect();
    const x = (e.clientX - r.left) / r.width  - .5;
    const y = (e.clientY - r.top)  / r.height - .5;
    card.style.transform =
      `perspective(600px) rotateY(${x*14}deg) rotateX(${-y*14}deg) scale(1.03)`;
  });
  card.addEventListener('mouseleave', () => {
    card.style.transform = '';
  });
});
</script>
KPI 애니메이션 카드 — 뷰포트 진입 시 카운트업
최대 가속도
0g
▲ 한계 대비 103%
측정 포인트
0개
▲ 전회 대비 +4
평균 온도
0°C
▼ 기준 대비 -5%
코드
HTML + JS
<div class="kpi-val" data-kpi="3.1" data-dec="1">
  0<span>g</span>
</div>

<script>
const obs = new IntersectionObserver(entries => {
  entries.forEach(e => {
    if (!e.isIntersecting) return;
    const el = e.target, end = +el.dataset.kpi;
    const dec = +el.dataset.dec, unit = el.querySelector('span');
    const txt = unit?.outerHTML || '';
    let start = 0, dur = 1200, t0 = null;
    const tick = t => {
      if (!t0) t0 = t;
      const p = Math.min((t - t0) / dur, 1);
      const v = (end * (p < .5 ? 2*p*p : 1-(2*(1-p)**2)));
      el.innerHTML = v.toFixed(dec) + txt;
      if (p < 1) requestAnimationFrame(tick);
    };
    requestAnimationFrame(tick);
    obs.unobserve(el);
  });
});
document.querySelectorAll('[data-kpi]').forEach(el => obs.observe(el));
</script>
리플 버튼 — 클릭 파문 효과
코드
HTML + JS
<button class="rpl-btn" data-ripple>버튼</button>

<script>
document.querySelectorAll('[data-ripple]').forEach(btn => {
  btn.addEventListener('click', e => {
    const r = btn.getBoundingClientRect();
    const d = Math.max(r.width, r.height);
    const rpl = document.createElement('span');
    rpl.className = 'ripple';
    rpl.style.cssText =
      `width:${d}px;height:${d}px;
       left:${e.clientX-r.left-d/2}px;
       top:${e.clientY-r.top-d/2}px`;
    btn.appendChild(rpl);
    setTimeout(() => rpl.remove(), 600);
  });
});
</script>
아코디언 — 클릭 확장·축소
측정 조건 ▼
샘플링 주파수: 10 kHz · 측정 시간: 10 sec · 창함수: Hanning Window · 해상도: 1 Hz
장비 정보 ▼
가속도계: PCB 356A32 · DAQ: NI USB-6341 · 소프트웨어: LabVIEW 2024
판정 기준 ▼
한계값 3.0 g 초과 시 주의, 5.0 g 초과 시 즉시 조치 필요
코드
HTML + JS
<div class="acc-item">
  <div class="acc-head" onclick="toggleAcc(this)">
    제목 <span class="acc-arrow">▼</span>
  </div>
  <div class="acc-body">
    <div class="acc-inner">내용</div>
  </div>
</div>

<script>
function toggleAcc(head) {
  head.closest('.acc-item').classList.toggle('open');
}
</script>
소터블 테이블 — 헤더 클릭 정렬
측정 위치 RPM 가속도(g)
엔진 마운트30002.4
서브프레임30003.1
대시보드30000.8
도어 트림30001.2
코드
HTML + JS
<th onclick="sortTable('id',0,this)">
  컬럼명<span class="sort-ic"></span>
</th>

<script>
function sortTable(id, col, th) {
  const tbl = document.getElementById(id);
  const asc = !th.classList.contains('asc');
  tbl.querySelectorAll('th').forEach(t =>
    t.classList.remove('asc','desc'));
  th.classList.add(asc ? 'asc' : 'desc');
  const rows = [...tbl.tBodies[0].rows];
  rows.sort((a,b) => {
    const av = a.cells[col].textContent.trim();
    const bv = b.cells[col].textContent.trim();
    const n = !isNaN(av) && !isNaN(bv);
    return asc
      ? (n ? av-bv : av.localeCompare(bv))
      : (n ? bv-av : bv.localeCompare(av));
  });
  rows.forEach(r => tbl.tBodies[0].appendChild(r));
}
</script>
툴팁 — 호버 시 설명 말풍선
FFT
Fast Fourier Transform — 시간 신호를 주파수 성분으로 변환
RMS
Root Mean Square — 신호의 실효값
SPL
Sound Pressure Level — 음압 레벨 (dB 단위)
코드
HTML (CSS only)
<div class="tip-wrap">
  <span class="tip-target">FFT</span>
  <div class="tip">설명 텍스트</div>
</div>

/* JS 불필요 — 순수 CSS hover로 동작 */
Section 06
CSS 변수 구조
:root에 선언된 변수만 교체하면 전체 테마가 바뀝니다. 보고서 코드 어디에도 hex 값을 직접 쓰지 마세요.
전체 :root 변수 선언 — 복사 후 <style> 상단에 붙여넣기
CSS
:root {
  /* ── Brand ── */
  --brand:   #2E86C1;
  --brand-d: #1a5276;
  --brand-l: #aed6f1;

  /* ── Semantic ── */
  --success: #27AE60;
  --warning: #F39C12;
  --danger:  #E74C3C;
  --info:    #8E44AD;

  /* ── Chart palette (순서 고정) ── */
  --c1: #2E86C1;  --c2: #E74C3C;
  --c3: #27AE60;  --c4: #F39C12;
  --c5: #8E44AD;  --c6: #E67E22;

  /* ── Surface & Text ── */
  --bg:       #f4f6f9;
  --surface:  #ffffff;
  --surface2: #f0f2f5;
  --line:     #dde1e7;
  --text:     #1a1d26;
  --text2:    #4a5568;
  --muted:    #8899aa;

  /* ── Typography ── */
  --font: 'Pretendard Variable', 'Noto Sans KR', sans-serif;
  --mono: 'JetBrains Mono', monospace;

  /* ── Spacing (8px 배수) ── */
  --sp-1: 4px;   --sp-2: 8px;
  --sp-3: 12px;  --sp-4: 16px;
  --sp-5: 24px;  --sp-6: 32px;
  --sp-7: 48px;  --sp-8: 64px;

  /* ── Border radius ── */
  --r:    8px;
  --r-sm: 4px;
  --r-lg: 14px;
}

/* 다크 모드 오버라이드 */
[data-theme="dark"] {
  --bg:       #0e1016;
  --surface:  #13151c;
  --surface2: #1a1d26;
  --line:     #2a2d3a;
  --text:     #e8eaf0;
  --text2:    #9aa5b8;
  --muted:    #5a6478;
}
변수 사용 원칙
✅
올바른 사용 — color: var(--text); · background: var(--brand);
🚫
금지 — color: #1a1d26; · background: #2E86C1; — hex 직접 사용 시 다크 모드·테마 교체 불가
테마 교체 방법 — :root 값만 변경
/* 예: 빨강 계열 브랜드로 전환 */
:root {
  --brand:   #C0392B;
  --brand-d: #922B21;
  --brand-l: #f1948a;
  /* 나머지 변수는 그대로 유지 */
}
Section 07
파일 운용 가이드
서로 다른 컴퓨터에서 같은 품질의 보고서를 만들기 위한 운용 규칙입니다.
이 레퍼런스 파일의 존재 이유

팀원마다 폰트·색상·여백이 제각각인 보고서가 나오는 문제를 없애기 위해 만든 단일 진실 공급원(Single Source of Truth)입니다.

단일 HTML 파일인 이유 — 외부 CSS 파일·이미지·폰트 파일이 분리되면 컴퓨터를 옮겼을 때 경로가 깨집니다. 이 파일은 Google Fonts CDN을 제외한 모든 코드를 인라인으로 포함해 파일 하나만 공유하면 어디서든 동일하게 열립니다.

새 보고서 작성 시작 절차
1
이 파일에서 <style> 블록 전체 복사
:root 변수 선언부터 컴포넌트 CSS까지 모두 포함
2
새 HTML 파일의 <head>에 붙여넣기
Google Fonts <link> 태그도 함께 복사
3
<body>에서 필요한 컴포넌트 HTML만 복사
섹션 헤더·표·콜아웃 등 04번 탭의 코드 블록 사용
4
내용만 채우기
CSS 클래스명·변수명은 절대 수정하지 않음
수정 금지 항목
🚫
CSS 변수명 변경 금지 — --brand를 --blue로 바꾸는 식의 이름 변경은 팀 전체 파일과 충돌 발생
🚫
컴포넌트 클래스명 변경 금지 — rpt-table, rpt-callout 등 팀 표준 클래스명 임의 변경 금지
🚫
hex 직접 사용 금지 — 색상은 반드시 CSS 변수로만 참조
외부 의존성 규칙
허용 Google Fonts CDN — 폰트 로드 전용
허용 Chart.js CDN — 차트 시각화 전용 (https://cdn.jsdelivr.net/npm/chart.js)
주의 오프라인 환경 — 인터넷 없는 환경에서는 폰트 파일을 ./assets/fonts/에 로컬 배치 후 @font-face로 선언
금지 기타 외부 CSS 프레임워크 — Bootstrap, Tailwind 등 충돌 가능성
이미지 경로 규칙
폴더 구조
보고서파일.html
└── assets/
    ├── fonts/      ← 오프라인 폰트 (필요시)
    ├── figures/    ← 그래프·사진 이미지
    └── data/       ← CSV·JSON 원본 데이터
HTML 경로 표기
<img src="./assets/figures/fig1_vibration.png" alt="진동 측정 결과">
파일 네이밍 컨벤션
규칙
YYYYMMDD_보고서명_vN.html

예시:
  20260822_진동측정결과_v1.html
  20260822_진동측정결과_v2.html   ← 수정 시 버전 번호 올림
  20260901_냉각성능평가_v1.html
ℹ️
파일명에 날짜·버전을 포함하면 여러 버전이 혼재해도 최신본을 즉시 식별 가능합니다.
이 레퍼런스 파일 업데이트 규칙
① 변경 전 팀 채널에 "design-standard.html 수정 예정" 공지
② 파일 상단 주석의 버전·날짜·변경 이유 업데이트
③ 추가 새 컴포넌트는 04번 섹션 하단에 추가, 기존 항목 삭제 금지
④ 변경 색상·폰트·간격 수정 시 팀 전체 기존 파일 영향도 검토 후 진행
⑤ 수정된 파일은 팀 공유 드라이브 /표준파일/ 폴더에 덮어쓰기 배포
Meta · 생성 프롬프트
이 레퍼런스 HTML 생성 프롬프트
이 파일을 처음부터 다시 만들거나, 업데이트 버전을 생성할 때 아래 프롬프트를 사용합니다.
Claude Code 단일 HTML 출력 팀 공용
아래 조건을 모두 충족하는 팀 공용 HTML 보고서 디자인 표준 레퍼런스 파일을 단일 HTML 파일로 만들어줘.

━━━━━━━━━━━━━━━━━━━━━━
[파일 목적]
━━━━━━━━━━━━━━━━━━━━━━
서로 다른 컴퓨터에서 여러 팀원이 HTML 보고서를 작성할 때
동일한 디자인 품질이 나오도록 하는 단일 레퍼런스 파일.
이 파일 하나만 열면 "어떻게 써야 하는지"를 보고 바로 따라 쓸 수 있어야 함.

━━━━━━━━━━━━━━━━━━━━━━
[포함할 내용 — 6개 섹션]
━━━━━━━━━━━━━━━━━━━━━━

① 타이포그래피 시스템
- 사용 폰트 선언 (Google Fonts CDN, 한글+영문 각 1종)
- H1 ~ H4, 본문(p), 캡션, 표 내부 폰트의 크기·굵기·행간·색상을 실제 렌더링으로 보여줌
- 각 항목 옆에 CSS 값을 코드 블록으로 함께 표시

② 색상 토큰
- :root CSS 변수로 선언된 팔레트 전체 표시
- 브랜드 컬러 / 시맨틱 컬러(강조·경고·정보) / 차트 전용 6색 팔레트 / 배경·텍스트·선 색
- 각 색상 스와치(사각형) + 변수명 + hex 값 나란히 표시

③ 레이아웃·그리드
- A4 가로/세로 기준 여백 수치 명시
- 본문 최대 너비, 2단 분할 비율(예: 6:4, 7:3) 예시를 실제 박스로 보여줌
- 섹션 간격·요소 간격 단위 체계 (8px 배수 기준 등)
- @media print 규칙 포함 (인쇄 시 배경색 제거, 페이지 브레이크 기준)

④ 컴포넌트 라이브러리
아래 컴포넌트를 실제 렌더링 + 해당 HTML 코드 나란히 표시:
- 섹션 헤더 (번호 뱃지 + 제목 + 하단 구분선)
- 표(Table): 헤더행·데이터행·강조행·합계행 스타일
- 이미지+캡션 삽입 블록 (figure > img + figcaption)
- 콜아웃 박스 3종: 참고(파랑) / 주의(노랑) / 결론(초록)
- 코드·수식 블록
- 인라인 강조 태그 (수치 강조, 단위 표기)

⑤ CSS 변수 구조 & 사용 규칙
- :root 전체 변수 선언 코드를 복사 가능한 블록으로 제공
- "값만 바꾸면 전체 테마 교체" 원리 설명 텍스트 포함

⑥ 파일 운용 & 작성 가이드 (메타 섹션)
아래 내용을 이 레퍼런스 HTML 안에 문서로 포함:
- 이 레퍼런스 HTML을 만드는 이유와 원칙 (왜 단일 파일인가)
- 새 보고서 작성 시작 절차 (이 파일에서 복사할 부분, 수정 금지 부분)
- 외부 의존성 처리 규칙 (CDN 허용 목록, 오프라인 환경 대응)
- 이미지 경로 규칙 (상대경로 ./assets/ 기준)
- 파일 네이밍 컨벤션 (예: YYYYMMDD_보고서명_v1.html)
- 레퍼런스 파일 자체를 업데이트할 때 지켜야 할 규칙

━━━━━━━━━━━━━━━━━━━━━━
[기술 조건]
━━━━━━━━━━━━━━━━━━━━━━
- 단일 HTML 파일 (CSS·JS 모두 인라인)
- 외부 의존성: Google Fonts CDN 만 허용
- 좌측 네비게이션 또는 상단 탭으로 6개 섹션 이동 가능
- 각 컴포넌트 옆에 "복사" 버튼 — 클릭 시 해당 HTML 코드를 클립보드에 복사
- 다크/라이트 모드 토글 버튼 포함
- CSS 변수 기반 테마 구조 (하드코딩 금지)
- 완성 즉시 브라우저에서 열어 바로 쓸 수 있어야 함

━━━━━━━━━━━━━━━━━━━━━━
[출력]
━━━━━━━━━━━━━━━━━━━━━━
파일명: design-standard.html
<!DOCTYPE html> 부터 </html> 까지 전체 코드 출력.
주석은 섹션 구분용 최소한만.
업데이트 버전 생성 시 추가 지시
위 프롬프트 기준으로 design-standard.html v{버전}을 만들어줘.
이번 버전에서 추가/변경할 내용:

[추가]
- {새 컴포넌트명}: {설명}

[변경]
- 색상 토큰: --brand를 {새 hex값}으로 변경
- {기타 변경사항}

기존 컴포넌트와 규칙은 모두 유지.