Skip to content

Responsive

브레이크포인트에 따라 다른 컴포넌트를 렌더링하는 반응형 컴포넌트입니다.

Import

ts
import { Responsive } from '@liner-engineering/orbit-kit';

브레이크포인트

Key설명
xsExtra Small
sSmall
mMedium
lLarge
xlExtra Large
xxl2X Large
xxxl3X Large

사용법

기본 사용법

tsx
<Responsive
  xs={<div>XS 화면</div>}
  s={<div>S 화면</div>}
  m={<div>M 화면</div>}
  l={<div>L 화면</div>}
  xl={<div>XL 화면</div>}
  xxl={<div>XXL 화면</div>}
  xxxl={<div>XXXL 화면</div>}
/>

일부 브레이크포인트만 사용

지정하지 않은 브레이크포인트는 가장 가까운 작은 브레이크포인트의 컴포넌트를 표시합니다.

tsx
<Responsive xs={<MobileHeader />} l={<DesktopHeader />} />
// xs, s, m: MobileHeader 렌더링
// l, xl, xxl, xxxl: DesktopHeader 렌더링

className 적용

tsx
<Responsive className="header-container" xs={<MobileHeader />} l={<DesktopHeader />} />

API

tsx
type BreakPointsKey = 'xs' | 's' | 'm' | 'l' | 'xl' | 'xxl' | 'xxxl';

interface ResponsiveProps {
  xs?: React.ReactNode;
  s?: React.ReactNode;
  m?: React.ReactNode;
  l?: React.ReactNode;
  xl?: React.ReactNode;
  xxl?: React.ReactNode;
  xxxl?: React.ReactNode;
  className?: string;
}

function Responsive(props: ResponsiveProps): JSX.Element;

Props

Prop타입필수설명
xsReact.ReactNode아니오Extra Small 화면에서 렌더링할 컴포넌트
sReact.ReactNode아니오Small 화면에서 렌더링할 컴포넌트
mReact.ReactNode아니오Medium 화면에서 렌더링할 컴포넌트
lReact.ReactNode아니오Large 화면에서 렌더링할 컴포넌트
xlReact.ReactNode아니오Extra Large 화면에서 렌더링할 컴포넌트
xxlReact.ReactNode아니오2X Large 화면에서 렌더링할 컴포넌트
xxxlReact.ReactNode아니오3X Large 화면에서 렌더링할 컴포넌트
classNamestring아니오Media 컴포넌트에 적용할 CSS 클래스

예시

레이아웃 분기

tsx
import { Responsive } from '@liner-engineering/orbit-kit';

function Layout({ children }: { children: React.ReactNode }) {
  return (
    <>
      <Responsive xs={<MobileNavigation />} l={<DesktopSidebar />} />
      <main>{children}</main>
    </>
  );
}

카드 그리드

tsx
function CardGrid({ items }: { items: Item[] }) {
  return (
    <Responsive
      xs={
        <div className="grid grid-cols-1 gap-2">
          {items.map((item) => (
            <Card key={item.id} item={item} size="sm" />
          ))}
        </div>
      }
      m={
        <div className="grid grid-cols-2 gap-4">
          {items.map((item) => (
            <Card key={item.id} item={item} size="md" />
          ))}
        </div>
      }
      xl={
        <div className="grid grid-cols-4 gap-6">
          {items.map((item) => (
            <Card key={item.id} item={item} size="lg" />
          ))}
        </div>
      }
    />
  );
}

@liner-fe/prism

Responsive 컴포넌트는 내부적으로 @liner-fe/prismMedia 컴포넌트를 사용합니다. 브레이크포인트 값은 prism 디자인 시스템을 따릅니다.

SSR 지원

@artsy/fresnel 기반으로 SSR을 지원합니다. 서버에서는 모든 브레이크포인트가 렌더링되고, 클라이언트에서 적절한 것만 표시됩니다.

Released under the MIT License.