React · React Native · 컴포넌트 16개

어려운 인터랙션, 이미 끝내 두었습니다.

Animated Chorus는 손으로 제대로 만들기 어려운 인터랙션을 위한 모션 컴포넌트입니다. 굴러가는 숫자, 일정한 속도의 스트리밍 글, 크기가 따라가는 내용 교체, 시트, 페이저, 스와이프 동작, 바뀐 항목만 움직이는 목록까지. 태그 하나와 내 데이터면 됩니다. Provider도 설정도 없습니다.

설치
npm install @kkwaenggwari/animated-chorus

이번 빌드에서 측정한 값

Chrome, 2026-09-28. 모든 조건과 표본은 성능 가이드에 있습니다. 측정 방법 보기

  • 28.0KBKB gzip · 16개 내보내기 전체

    웹 진입점 전체를 압축한 크기입니다. 피어 의존성은 React뿐입니다.

  • 0애니메이션 중 JS 프레임 콜백

    숫자·높이·하이라이트가 함께 바뀌는 동안 12개 애니메이션을 모두 브라우저가 재생합니다.

  • 1값이 바뀔 때마다 React 커밋

    MotionNumber는 값이 바뀔 때 렌더하고, 굴러가는 동안에는 렌더하지 않습니다.

  • 113000자 스트리밍 동안 React 커밋

    MotionStream은 글자를 직접 붙이고 1초에 몇 번만 React에 반영합니다.

01가장 편함

태그 하나와 내 데이터

모든 컴포넌트는 혼자서 동작합니다. Provider, 감싸는 컴포넌트, 설정 호출이 없습니다. 목록형 컴포넌트는 items와 renderItem을 받고, 레이아웃·글자·스타일은 그대로 내 것입니다.

  • 컴포넌트 하나를 가져와 값을 넘기면 연동이 끝납니다.
  • 목록·탭·페이저는 내 배열을 읽고, 키는 기본으로 item.id를 씁니다.
  • 글자는 진짜 글자로 남습니다. 줄바꿈되고, 글꼴 확대를 따르고, 선택할 수 있습니다.
  • <MotionNumber value={total} />;
  • <MotionSwap value={status}>{label}</MotionSwap>;
  • <MotionHeight open={open}>{details}</MotionHeight>;
  • <MotionHighlight items={tabs} value={tab} onValueChange={setTab} />;
  • <MotionList items={tasks} renderItem={(task) => task.title} />;
  • <ProgressRing value={progress} />;

실제로 움직이는 컴포넌트 6개와, 각각을 만드는 코드 한 줄.

예제를 준비하는 중…

02가장 빠름

재생은 브라우저가, React는 가만히

웹에서는 애니메이션 라이브러리를 싣지 않습니다. 컴포넌트가 모션을 Web Animations API에 넘기므로, 숫자가 구르거나 패널 크기가 바뀌는 동안 프레임마다 JavaScript를 돌리지 않고 React도 렌더하지 않습니다.

  • 애니메이션 12개가 함께 도는 동안 JS 프레임 콜백 0회.
  • React 커밋은 프레임마다가 아니라 값이 바뀔 때 한 번.
  • 스트리밍 글 3000자에 React 커밋 11회. 아래 예제가 자신의 렌더 횟수를 직접 셉니다.

예제를 준비하는 중…

03가장 안정적

언제 끊어도 튀지 않습니다

새 값은 항상 화면에 보이는 모습에서 출발하고, 스프링은 속도를 이어받습니다. 연타, 몰려오는 데이터, 방향 전환도 의도한 움직임처럼 보입니다. 움직임이 끝나면 남아 도는 것이 없습니다.

  • 숫자가 갈라지지 않습니다. 남는 자리는 구르면서 제자리로 미끄러집니다.
  • 5ms 간격으로 새 값 200개를 넣은 뒤 남은 애니메이션 0개, 최종 글자는 정확히 일치.
  • React StrictMode에서도 안전합니다. 백그라운드로 간 React Native 앱에서는 모션이 끝 상태로 정리됩니다.

예제를 준비하는 중…

하는 일로 묶은 컴포넌트 16개

숫자와 글, 크기가 바뀌는 내용, 선택, 목록, 제스처, 겹침 화면, 진행. 모두 옆에 props를 조절하는 실행 작업대가 있습니다.

모든 컴포넌트

웹과 React Native, 같은 import

Metro는 네이티브 구현을, 웹 번들러는 DOM 구현을 고릅니다. 각 플랫폼은 가장 잘하는 방식으로 모션을 재생합니다.

App.jsx
// Web and React Native: the same import.
import { MotionNumber, MotionList } from '@kkwaenggwari/animated-chorus';

export function Score({ points, players }) {
  return (
    <>
      <MotionNumber value={points} />
      <MotionList items={players} renderItem={(player) => player.name} />
    </>
  );
}
부분웹React Native
이동·크기 변형과 투명도Web Animations API, 스프링은 해석적으로 샘플링네이티브 드라이버를 쓰는 Animated
너비와 높이Web Animations API레이아웃이므로 JS 드라이버를 쓰는 Animated
스트리밍 글글자를 붙이며 페이드인, React 렌더는 1초에 몇 번진짜 Text, 페이드 없이 공개
시트와 확대최상위 레이어의 네이티브 dialog투명한 Modal, 뒤로 가기 버튼으로 닫힘

2분이면 시작합니다

설치하고, 컴포넌트 하나를 가져와, 값을 넘기세요.

npm install @kkwaenggwari/animated-chorus

검색

입력하면 문서를 검색합니다.