Pluto Design System
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-colorcolor duration-fast ease-standard
--pds-transition-bgbackground-color duration-fast ease-standard
--pds-transition-transformtransform duration-normal ease-standard
--pds-transition-opacityopacity duration-normal ease-standard
--pds-transition-allall 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-in
step-in
@keyframes pds-fade-in-card500ms

카드 10px 등장 (500ms)

.pds-animate-card-in
card
@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 loop

Agent 상태 pulse — idle dot 주변 ripple

@keyframes pds-shimmer1.6s loop

스켈레톤 로더 (1.6s linear 루프)

.pds-animate-shimmer

Framer 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;
  }
}