값은 크게 · 단위는 작게 — 단위는 <small> (0.42 ~ 0.72em, 회색). 값과 단위 사이 띄어쓰기 없음: 30.6℃ · 11m/s · 68%
고정폭 숫자 — 값 · 시각은 font-variant-numeric: tabular-nums (.num). 값이 바뀌어도 자리가 흔들리지 않는다.
소수점은 측정 정밀도까지 — 온도 한 자리(30.6), 습도 · 토양 · 개폐율 정수(61%), 풍속 한 자리(3.2m/s), 예보 정수(11m/s).
자간 — 큰 숫자 · 제목은 좁게(-0.03 ~ -0.05em), 본문 -0.01em.
습도61%
30.6℃14:12:04
간격
간격은 em 으로 적는다 — 글자 크기(--u)를 따라 같이 커지고 작아진다. 아래 단계 안에서 고른다.
단계
0.3em아이콘 ↔ 글자 (배지 · 칩)
0.5em버튼 묶음 · 목록 항목 사이
0.8em패드 화면의 칸 사이 · 3D 도구 여백
1em모니터 화면의 칸(카드) 사이 · 카드 안쪽 위아래
1.1 ~ 1.3em카드 · 드로어 안쪽 좌우
1.2 / 1.4em본문 바깥 여백 (위아래 / 좌우) · 다이얼로그 안쪽
화면별 여백
위치
모니터
패드
폰
.app__main
1.2em 1.4em
1em 1.1em
0.3em 1em 1.2em
칸 사이 (grid gap)
1em
0.8em
0.9em (세로 쌓기)
.card
1em 1.1em (모든 기기 같음)
.drawer__body
1.1em 1.3em · 항목 사이 1.1em
바텀시트 — 같음
모서리
작은 것일수록 작게, 판일수록 크게. 상태 · 칩 · 스위치처럼 "값 하나"를 담는 것은 알약(999px).
0.45em배지
0.65em입력칸 · 3D 시점 버튼
0.75em버튼 · 세그먼트 · 아이콘 버튼
0.85em알림 항목 · 카메라 영상
1em카드 · KPI · 3D 뷰어
1.2em다이얼로그
1.4em 위폰 바텀시트
999px상태 · 칩 · 스위치 · 3D 라벨
표면 · 그림자
층은 세 개 — 바탕(--bg) · 판(--panel + 테두리 + --shadow-1) · 떠 있는 것(드로어 · 다이얼로그 · 툴팁, --shadow-2). 3D 위에 뜬 도구는 반투명 판으로 뒤가 비친다.
--bg화면 바탕
--panel + --shadow-1카드 · KPI · 기기 카드
--panel-2판 안의 칸 · 알림 항목
--shadow-2드로어 · 다이얼로그 · 툴팁
3D 위 반투명 판
3D 위 도구 · 범례 · 날씨 칩 · 작은 카메라 창은 color-mix(in srgb, var(--panel) 88~90%, transparent) + backdrop-filter: blur(10px). 뒤 3D 가 살짝 비쳐서 "공간 위에 떠 있다"는 것이 보인다. 3D 가 아닌 곳에는 쓰지 않는다.
정상주의경고위험장애
아이콘 개
24 × 24 격자 · 선 두께 1.9 · 둥근 끝 선 아이콘 한 벌. 색은 currentColor — 글자색을 따른다. 스프라이트 한 번 넣고 <use href="#i-이름"/> 로 쓴다. 칸을 누르면 코드가 복사된다.
크기
클래스
크기
쓰는 곳
.ic--sm
1em
배지 · 칩 · 글자 사이 (자동 · 3D 표시)
.ic
1.25em
버튼 · 메뉴 · 카드 제목 · 라벨
.ic--lg
1.6em
알림 상세 머리 · 빈 화면
장비 · 센서 아이콘
온도습도CO₂토양일사EC천창측창유동팬보온커튼난방기관수보광등퇴치기
모션
움직임은 어디서 왔는지 · 어디로 갔는지를 알려줄 때만. 곡선은 하나 — cubic-bezier(0.2, 0.8, 0.2, 1) (빠르게 출발해 부드럽게 멈춤).
2동 센서 T2-3
아래에서 올라옴 · 0.32초
무엇
시간 · 곡선
움직임
메뉴 이동 (본문 교체)
240ms · 감속
본문만 아래 8px → 제자리 + 페이드. 메뉴 · 상단바는 그대로
드로어 · 패널 열기
320ms · 감속
오른쪽에서 밀려 들어옴 (폰 = 아래에서). 뒤 오버레이 200ms 페이드
닫기
200ms · ease-in
들어온 반대 방향으로
3D 시점 이동
750ms · easeInOutCubic
카메라가 날아감. 사용자가 끌면 바로 멈춤
3D 라벨 깜빡임
1.6s 반복
주의 이상 · 장애 라벨만 (.is-pulse)
스위치
200ms
손잡이 이동
권장
반복 움직임은 "지금 봐야 하는 것"에만 — 위험 라벨 깜빡임, 켜진 팬 회전, 퇴치기 소리 고리.
지양
카드가 차례로 튀어나오는 장식 애니메이션 — 상황판처럼 오래 켜 두는 화면에서 눈이 피곤하다.
버튼 .btn
한 화면(또는 한 패널)에 주 버튼(primary)은 하나. 장비를 움직이는 버튼은 동사 + 목표값으로 적는다 (100% 열기).
놀이판
오른쪽에서 값을 바꾸면 미리보기와 코드가 같이 바뀌어요.
html
종류 · 크기
아이콘 버튼
명세
클래스
모양
쓰는 곳
.btn
panel-2 · 테두리 · 높이 2.6em · 650
보조 동작 · 장비 명령 (닫기 · 정지 · 열기)
+ .btn--primary
brand 채움
주 동작 하나 (확인했어요 · 저장 · 100% 열기)
+ .btn--danger
위험 빨강 채움
지우기 · 되돌릴 수 없는 것만
+ .btn--ghost
바탕 없음
취소 · 덜 중요한 동작
+ .is-on
brand-weak 바탕
켜짐 · 끄기 중 지금 상태
.btn--sm / --lg / --block
2.1em / 3.2em / 가로 꽉
표 안 · 3D 도구 / 다이얼로그 · 폰 아래 고정
.icon-btn
2.5em 정사각 · 점 배지(.icon-btn__dot)
상단바 알림 · 패널 닫기
권장
누르면 무슨 일이 생기는지 버튼 글자로 — 확인 창의 주 버튼은 질문의 동사 그대로.
지양
주 버튼 두 개 · "확인 / 예" 처럼 무엇을 하는지 모르는 글자.
세그먼트 .seg
화면을 떠나지 않고 보는 것만 바꿀 때 — 3D 표시 항목, 동 고르기, 지금 / 예보. 2 ~ 5개. 그 이상이면 칩.
클래스
설명
.seg
panel-2 바탕 · 0.2em 안쪽 여백 · 버튼 높이 2em
.seg > button.is-on
panel 흰 판 + 그림자 (하나만)
.seg--full
가로 꽉 · 버튼 같은 폭 (패널 안)
[data-ui]
화면 안 선택 표시 — 이동 없음 (프로토타입 · 가이드가 is-on 을 옮김)
칩 .chip
목록을 거를 때 — 알림 등급 · 종류, 카메라 분할. 선택된 것은 글자색 반전(.is-on). 개수는 <b> 로.
전체 12미확인 2위험경고장애
입력 · 스위치 .field
입력칸은 라벨을 위에, 단위는 칸 안 오른쪽(.input__unit). 규칙 · 기준값처럼 숫자를 넣는 칸은 적정 범위를 바로 아래 보여준다.
R2 고온 환기 켜짐
클래스
설명
.field · .field__label
세로 묶음 · 라벨 0.8em 700
.input
높이 2.6em · panel-2 · line-2 테두리
.input--select · --focus
오른쪽 화살표 / brand 테두리 + 3px 링
.switch (.is-on)
2.7 × 1.6em 알약 — 규칙 · 알림 켜고 끄기
.slider
개폐율 (천창 · 커튼) — 채움 i + 손잡이 b
상태 배지 · 점 .st
상태를 알리는 기본 단위. 점(.dot)은 글자가 바로 옆에 있을 때만 (범례 · 칩 · 목록).
완료주의 1장애 1경고 정상 위험
클래스
설명
.st
알약 · 상태색 16% 바탕 · 아이콘만 상태색 · 글자는 fg (읽힘 우선)
.st--lg
패널 머리 · 큰 상태
.dot · .dot--ring
0.6em 점 / 바깥 링 (지금 진행 중)
배지 .badge
상태가 아닌 정보 — 장비를 지금 누가 움직이는지(자동 · 스케줄 · 수동 · 안전), 개수, 데이터 출처.
자동 · R2스케줄수동안전 R1미확인기상청 단기예보
클래스
뜻
.badge--auto
자동 규칙 · 스케줄이 움직임 (brand)
.badge--manual
사람이 직접 — 자동 규칙 1시간 멈춤 (노랑 옅게)
.badge--safe
안전 규칙 (강풍 · 강우) — 수동보다 우선 (빨강 옅게)
.src
데이터 출처 한 줄 (공공 API · 시뮬레이터)
카드 .card
화면을 나누는 기본 판. 제목 줄(.card__h)은 아이콘 + 제목 + 오른쪽 "더 보기".
오늘 자동제어규칙
14:122동 천창 50% · R2완료
02:14뒤편 퇴치기 30초 · R9 멧돼지완료
KPI 칸 .kpi
라벨 → 큰 값 → 한 줄 설명. 누르면 자세히(알림 센터 · 바람 · 비 3D)로. 3D 로 이어지는 칸은 오른쪽에 .kpi__go 표시.
농장 상태
정상 1주의 1
3동 · 센서 21 · 카메라 4
진행 중 알림3건미확인 2 · 경고 1 · 장애 1
외부 날씨3D24.6℃ 맑음습도 48% · 북서 3.2m/s
클래스
설명
.kpi--alert
진행 중 알림이 있을 때 경고색 테두리
.kpi--wx · .kpi__go
누르면 3D 에 바람 · 비가 겹침 (A-4)
.wxdir
바람이 흘러가는 쪽 화살표 · 위가 북 — --deg 로 돌림
측정값 · 게이지 .metric
값만 보여주지 않고 적정 범위 안에서 어디쯤인지를 같이 — 게이지는 위험 | 주의 | 적정 | 주의 | 위험 다섯 칸.
온도31.4℃
습도61%
CO₂540ppm
1018273340℃
알림 항목 .aitem
한 칸에 "무엇이 · 어디서 · 언제 → 무슨 일 → 자동이 무엇을 했나". 안 읽은 알림(.is-unread)은 상태색 바탕 · 테두리.
경고2동 · 고온14:12
온도 30.6℃ — 천창 50% 자동 열림
30℃ 넘은 상태 2분 지속 → 규칙 R2. 33℃ 넘으면 100% + 유동팬.
확인하기
주의예보13:40
내일 03시 강풍 11m/s 예보
안전 규칙 R1 대기 — 강풍이 감지되면 측창 · 천창이 전부 닫혀요.
권장
제목에 값 + 결과: "온도 30.6℃ — 천창 50% 자동 열림". 설명에 이유(규칙)와 다음 단계.
지양
"이상 감지됨" · "TEMP_HIGH" 처럼 무엇이 얼마나인지 없는 제목.
기록 · 타임라인 .log · .tl
짧은 목록은 .log(시각 · 무엇 · 결과), 하나의 사건 경과는 .tl(점 + 세로선).
13:58
추세 경고 10분 사이 +1.9℃
임계치 전에 먼저 알림
14:10
기준 초과 30.2℃ — 2분 지속
14:12
자동제어 R2 → 천창 50% 열기
14:13
결과 확인 개폐율 50% 도달
표 · 키값 · 안내 .tbl · .kv · .note-inline
센서
위치
값
마지막 수신
상태
T2-3
2동 뒤쪽
31.4℃
14:20
주의
T3-2
3동 가운데
—
14:02 (18분 전)
통신 두절
지금 → 목표
50% → 100%
자동 규칙 R2 · R3
1시간 멈춤 · 15:21 자동 복귀
강풍 · 강우가 감지되면 안전 규칙이 수동 조작보다 먼저 창을 닫아요.
차트 .chart
선은 2px 하나 + 적정 범위 띠(초록 옅게). 비교는 우수농가 띠(회색). 기준선은 경고색. 마우스를 올리면 세로선 + 시각별 값. 축은 하나만 (두 축 차트 금지).
속성
설명
data-chart
계열 이름 (쉼표로 여러 개 — 동 색 순서대로)
data-names · data-unit
범례 이름 · 단위
data-range
적정 범위 띠 (최소,최대)
data-peer
우수농가 범위 띠
data-thr · data-marks
기준선 값 · 사건 표시 ("14:12 천창 50%")
드로어 · 바텀시트 .drawer
3D 라벨 · 카메라 · 날씨를 누르면 뒤 화면(3D)을 그대로 두고 오른쪽에서 열린다. 폰에서는 같은 마크업이 아래에서 올라오는 바텀시트가 된다 (손잡이 자동).
2동 센서 T2-3
온도 · 2동 뒤쪽 1.5m
주의 · 적정보다 높음31.4℃
클래스
설명
.overlay (.overlay--clear)
뒤 어둡게 / 3D 를 보여야 할 때는 투명
.drawer
폭 30em · 오른쪽 · 머리 / 몸통(스크롤) / 바닥(버튼)
.drawer--peek
폰에서 높이 54% — 위 3D 가 보이게 (바람 · 비 · 야생동물)
폰 (< 600)
아래 고정 · 위 모서리 1.4em · 최대 86% · 손잡이
확인 다이얼로그 .dialog
되돌리기 어려운 동작 · 장비 명령 전에만. 제목은 질문, 내용은 지금 → 목표 · 걸리는 시간 · 멈추는 자동 규칙, 주 버튼은 질문의 동사.
2동 천창을 100%까지 열까요?
지금 → 목표
50% → 100%
걸리는 시간
약 40초
자동 규칙 R2 · R3
1시간 멈춤 · 15:21 자동 복귀
메뉴 · 상단바 · 탭바 .side · .top · .tabbar
껍데기는 화면에 적지 않고 data-shell="메뉴키" 로 넣는다 (spec.js). 화면 크기에 따라 같은 메뉴가 왼쪽 메뉴 → 아이콘 레일 → 하단 탭바로 바뀐다 (앱 껍데기 패턴).
대시보드
햇살농원 · 토마토 3동24.6℃북서 3.2m/s
클래스
설명
.nav-i (.is-on)
메뉴 한 줄 · 선택은 brand-weak · 배지는 위험(빨강) / 장애(보라)
.top
제목 · 농장 · 날씨(누르면 3D 바람 · 비) · 시각 · 알림
.tabbar · .tab
폰 하단 5칸: 홈 · 알림 · 제어 · 기기 · 더보기
카메라 영상 .video
16:9 판. 위에 카메라 이름 · LIVE · 시각, 아래에 설명. 알림 순간의 스냅샷도 같은 모양.
LIVECAM-1 · 2동 입구14:20:31
CAM-4 · 뒤편 경계 · 열화상02:14:05
AI 감지 · 멧돼지 92%
3D 라벨 .f3l
3D 엔진이 위치를 계산해 HTML 로 붙인다 (글자가 선명하고 누를 수 있음). 멀리서는 동 대표값 + 이상 센서만, 확대하면 센서 전부. 누르면 센서 상세 · 카메라 영상으로.
2동30.6℃T2-331.4℃T3-2두절CAM-12동 입구T1-225.6℃
클래스
쓰는 곳
.f3l--zone
동 대표값 (동 위 크게)
.f3l.is-pulse
주의 이상 · 장애 — 깜빡이는 고리
.f3l.is-dim
값 없음 · 통신 두절 (점선)
.f3l--cam · --sm · --sel
카메라 / 확대 시 일반 센서 / 공간 편집에서 선택
3D 도구 .f3d-tools · .f3d-views · .f3d-wx
3D 모서리에 고정: 왼쪽 위 = 보는 항목, 왼쪽 아래 = 범례, 오른쪽 아래 = 시점(나침반 · 전체 보기 · 회전 · 바람). 날씨 칩은 바람 · 비가 켜졌을 때만.
서남서 11m/s비 8mm/h · 돌풍 15내일 03시 · 예보
정상주의경고위험장애히트맵 낮음 · 높음
N
앱 껍데기 data-shell
모든 메뉴 화면은 같은 껍데기 안에 본문(.app__main)만 바뀐다. 메뉴 이동 때 메뉴 · 상단바는 그대로, 본문만 교체 (앱처럼). 아래 두 화면은 같은 마크업을 1920 · 390 폭으로 그린 것.