Foundations
Motion
duration / easing / 7 keyframe + prefers-reduced-motion
PDS의 모션은 pluto-note chat-animations를 승계했다. --pds-ease-standard가 모든 step-in·fade·collapse의 기본 이징이며, chat 토큰 묶음의 --pds-chat-easing은 동일 값(cubic-bezier(0.23, 1, 0.32, 1))을 같은 의도로 정의해 둔 별칭이다.
Duration · Easing
Duration
--pds-duration-instant80mstooltip 등장 등--pds-duration-fast150mshover/focus 색 변경--pds-duration-normal200ms기본 transition--pds-duration-slow300msfade-collapse--pds-duration-slower450msstep-in 기본Easing
--pds-ease-linearlinear--pds-ease-standardcubic-bezier(0.23, 1, 0.32, 1)★ 기본--pds-ease-incubic-bezier(0.4, 0, 1, 1)--pds-ease-outcubic-bezier(0, 0, 0.2, 1)--pds-ease-in-outcubic-bezier(0.4, 0, 0.2, 1)--pds-ease-springcubic-bezier(0.34, 1.56, 0.64, 1)Transition 프리셋
자주 쓰는 조합은 --pds-transition-*로 묶여 있다.
| 토큰 | 정의 |
|---|---|
--pds-transition-color | color duration-fast ease-standard |
--pds-transition-bg | background-color duration-fast ease-standard |
--pds-transition-transform | transform duration-normal ease-standard |
--pds-transition-opacity | opacity duration-normal ease-standard |
--pds-transition-all | all duration-normal ease-standard |
Keyframe 데모
각 패널의 재생 버튼으로 트리거. pds-fade-in-up, pds-fade-in-card, pds-fade-collapse는 한 번만, 나머지는 루프 애니메이션.
@keyframes pds-fade-in-upduration-slower (450ms)메시지 6px step-in — 채팅 말풍선 기본
.pds-animate-step-instep-in
@keyframes pds-fade-in-card500ms카드 10px 등장 (500ms)
.pds-animate-card-incard
@keyframes pds-fade-collapseduration-normal (200ms)섹션 접기 (max-height → 0). --pds-collapse-from 로 시작 높이 제어
접히는 섹션
@keyframes pds-dot-pulse1.4s loop단일 점 펄스 (scale 0.85↔1, opacity 0.5↔1)
.pds-animate-dot-pulse@keyframes pds-dot-ripple1.6s loopAgent 상태 pulse — idle dot 주변 ripple
@keyframes pds-shimmer1.6s loop스켈레톤 로더 (1.6s linear 루프)
.pds-animate-shimmerFramer Motion Preset
@fluxloop-ai/pds-core/motion 에서 variants로 export:
import { motion } from "framer-motion";
import { pdsStepIn, pdsCardIn } from "@fluxloop-ai/pds-core/motion";
<motion.div variants={pdsStepIn} initial="hidden" animate="visible" />
접근성
OS의 "동작 줄이기" 설정(prefers-reduced-motion: reduce)이 켜져 있으면 .pds-animate-* 클래스의 애니메이션은 0.01ms로 단축된다. 사용자 설정이 우선이므로 !important로 덮어쓰는 것이 맞다.
@media (prefers-reduced-motion: reduce) {
.pds-animate-step-in,
.pds-animate-card-in,
.pds-animate-dot-pulse,
.pds-animate-shimmer {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}