Motion
컴포넌트는 색과 투명도만 느긋하게 바꾸고, 움직이는 것은 페이지가 바뀌는 순간뿐입니다.
전환 기본값
커스텀 유틸을 만들지 않고 Tailwind 토큰을 덮었습니다 — transition-colors 만 쓰면 이 시스템의 속도가 적용됩니다.
- ·
--default-transition-duration300ms ·--default-transition-timing-functionease-out - · 그래서 컴포넌트는
transition-colors한 줄만 씁니다. duration·easing 을 매번 붙이지 않습니다 (Tailwind 기본값은 150ms cubic-bezier 로, 이 시스템의 “느림”과 다릅니다) - ·
transition-all은 쓰지 않습니다 — 의도하지 않은 속성까지 움직입니다 - · 테마 전환만 예외적으로 500ms (눈부심 완화)
상호작용 상태
마우스를 올려보고, Tab 키로도 이동해 보세요 — 모든 인터랙티브 요소는 키보드 포커스 링을 가집니다.
라우트 전환
이 시스템에서 위치가 움직이는 유일한 자리입니다 — 지금 이 페이지로 들어오실 때도 돌았습니다.
- · 옛 본문이 12px 아래로 물러나며 사라지고(200ms), 그게 끝난 뒤 새 본문이 아래에서 올라옵니다(300ms). 합 500ms
- · 겹치지 않습니다. 동시에 교차시키면 글자 위에 글자가 포개져 읽을 수 없는 잔상이 됩니다
- · 나가는 쪽만
ease-in입니다 —ease-out은 초반에 급격히 투명해져 후반 내내 본문이 비어 보입니다 - · 500ms 를 넘기지 않습니다. 전환이 도는 동안 화면은 스냅샷으로 대체되고 그 사이 클릭이 먹지 않습니다 — 전환 시간은 곧 입력이 죽는 시간입니다
- · 브라우저 뒤로·앞으로 가기에는 걸리지 않습니다(링크 클릭에만)
reduced-motion
움직임을 줄여달라는 요청은 시스템 전체가 따릅니다.
prefers-reduced-motion: reduce 에서 모든 transition·animation 을 사실상 끕니다(0.01ms). 전역 media query 라 컴포넌트가 개별로 처리하지 않아도 됩니다. 라우트 전환은 별도 트리에 그려져 그 전역 규칙에 걸리지 않으므로, 같은 블록 안에서 ::view-transition-* 를 따로 잡습니다 — 지연까지 0 으로 눌러야 빈 화면이 남지 않습니다.