FNA Design System

Motion

움직임은 상태 변화를 설명할 때만. 150ms 색 전환, 220ms 시트 등장, 1.4초 경보 점 깜빡임. 그 밖의 애니메이션은 없고, 시스템의 동작 줄이기 설정을 항상 따릅니다.

150 · 220 ms · 1.4 s

단계

이름시간이징쓰임
instant0—값 갱신(온도 숫자). 숫자는 애니메이션하지 않는다 — 읽는 순간 정확해야 한다
quick150msease버튼·입력 배경/테두리, 스위치 손잡이, 토스트 페이드(250)
enter220msease-out시니어 시트 올라오기(24px), 드로어 밀려오기(24px), 팝오버
attention1.4s 반복ease-in-out경보 상태 점 .fna-dot--pulse (불투명도 1 → .4). 경보 해제 시 즉시 정지
loading1.2s 반복linear쌓인 막대 로더 (막대 3개 순차 .2s 지연)

예

경보 점 · 로더 · 스위치
경보 (pulse)
불러오는 중
큰글씨
코드
<div class="fna-row" style="gap:32px">
    <span><i class="fna-dot fna-dot--alarm fna-dot--pulse"></i>경보 (pulse)</span>
    <div class="loader" role="status" aria-live="polite"><svg width="48" height="48" viewBox="0 0 48 48" aria-hidden="true"><rect class="l1" x="20" y="4" width="24" height="10" rx="3"/><rect class="l2" x="12" y="19" width="26" height="10" rx="3"/><rect class="l3" x="4" y="34" width="12" height="10" rx="3"/></svg><span>불러오는 중</span></div>
    <span class="fna-switch is-on" style="margin:0"><i></i>큰글씨</span>
  </div>

규칙

  • 동작 줄이기(prefers-reduced-motion: reduce)이면 반복 애니메이션은 정지, 등장 애니메이션은 생략. 로더는 막대를 70% 불투명도로 고정.
  • 레이아웃 이동 금지: 로딩 중 이전 렌더를 40% 불투명도로 유지(.fna-chart.is-loading). 스켈레톤 깜빡임 금지.
  • 토스트는 2.4초 후 자동 사라짐. 오류 토스트는 사용자가 닫을 때까지 유지(자동 닫힘 없음).
  • 시니어 시트는 자동 닫힘·흔들림 없음. 경보 진동은 OS 알림에서만.
  • 차트 계열 등장 애니메이션 없음. 데이터는 즉시 그린다.

코드

.fna-btn{transition:background .15s,border-color .15s,box-shadow .15s}
@keyframes fna-pulse{0%,100%{opacity:1}50%{opacity:.4}}
.fna-dot--pulse{animation:fna-pulse 1.4s infinite}
@media (prefers-reduced-motion:reduce){.fna-dot--pulse{animation:none}}
@media (prefers-reduced-motion:no-preference){.fna-modal--large .fna-modal__card{animation:fna-sheet-up .22s ease-out}}

안정마지막 갱신 담당 디자인시스템 TF · jjo831@farmzone.kr소스 components.css transition · @keyframes fna-pulse / fna-sheet-upFoundations · FNA 디자인 시스템 v1.0