# Responsive Design URL: /react/components/concepts/responsive-design Source: https://github.com/daangn/seed-design/blob/dev/docs/content/react/components/concepts/responsive-design.mdx Viewport 크기에 따라 레이아웃과 스타일을 조정하는 방법을 알아봅니다. SEED는 mobile-first 반응형 시스템을 제공합니다. 특정 breakpoint에 값을 지정하면 더 넓은 viewport에도 동일한 값이 적용됩니다. ## Breakpoints | 이름 | `min-width` | | ------ | ----------- | | `base` | 0px | | `sm` | 480px | | `md` | 768px | | `lg` | 1280px | | `xl` | 1440px | ## 레이아웃 컴포넌트에서 반응형 Prop 사용하기 `Box` 및 Box 기반 컴포넌트(`Flex`, `Grid`, `VStack`, `HStack` 등)에서 레이아웃 프로퍼티의 값으로 breakpoint 이름을 키로 사용하는 객체를 받을 수 있습니다. ```tsx ``` | 분류 | 프로퍼티 | | ----------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | **Layout** | `display`, `flexDirection`, `gap` | | **Sizing** | `width`, `minWidth`, `maxWidth`, `height`, `minHeight`, `maxHeight` | | **Padding** | `padding`, `paddingX`, `paddingY`, `paddingTop`, `paddingRight`, `paddingBottom`, `paddingLeft`, `p`, `px`, `py`, `pt`, `pr`, `pb`, `pl` | | **Bleed** | `bleedX`, `bleedY`, `bleedTop`, `bleedRight`, `bleedBottom`, `bleedLeft` | ```tsx import { Box } from "@seed-design/react"; export default function ResponsivePropsExample() { return ( {`padding={{ base: "x4", md: "x6", xl: "x8" }}`} ); } ``` Box 컴포넌트는 가장 기초적인 레이아웃 컴포넌트입니다. 디자인 토큰을 JSX에서 사용할 수 있도록 도와줍니다. Flex 컴포넌트는 flexbox를 사용하며 디자인 토큰을 JSX에서 사용할 수 있도록 도와줍니다. Grid 컴포넌트는 CSS Grid를 사용하며 디자인 토큰을 JSX에서 사용할 수 있도록 도와줍니다. 세로로 쌓이는 레이아웃을 구성합니다. 디자인 토큰을 JSX에서 사용할 수 있도록 도와줍니다. 가로로 쌓이는 레이아웃을 구성합니다. 디자인 토큰을 JSX에서 사용할 수 있도록 도와줍니다. ### Hiding & Showing Elements `display`에 반응형 값을 전달하여 특정 breakpoint에서 요소를 표시하거나 숨길 수 있습니다. ```tsx import { VStack, Text, Box } from "@seed-design/react"; export default function ResponsiveDisplayExample() { return ( 아래 Box는 md breakpoint 이상에서만 보입니다. {`display={{ base: "none", md: "block" }}`} ); } ``` #### `hideFrom` `hideFrom`을 사용하여 특정 breakpoint 이상에서 요소를 숨깁니다. (`display: none;`) `Box` 및 Box 기반 컴포넌트(`Flex`, `Grid`, `VStack`, `HStack` 등)에서 사용할 수 있습니다. `hideFrom="md"`는 `display={{ md: "none" }}`과 동일합니다. ```tsx import { Box, VStack, Text } from "@seed-design/react"; export default function HideFromExample() { return ( 아래 Box는 xl breakpoint 이상에서는 숨겨집니다. hideFrom="xl" ); } ``` ### Grid Breakpoint 별로 `columns`와 `rows` 속성을 지정할 수 있습니다. ```tsx import { Box, Grid, Text, VStack } from "@seed-design/react"; export default function ResponsiveGridExample() { return ( 아래 Grid는 breakpoint 별로 열 수가 다르게 구성됩니다. 1 2 3 4 ); } ``` Grid 컴포넌트는 CSS Grid를 사용하며 디자인 토큰을 JSX에서 사용할 수 있도록 도와줍니다. ## Hooks `window.matchMedia`를 기반으로 구현된 `useBreakpoint` 및 `useBreakpointValue` 훅을 제공합니다. 가능한 경우 항상 CSS 기반으로 작동하는 반응형 prop을 사용하고, 훅은 JS 로직이 필요한 경우에만 사용하세요. ### `useBreakpoint` 현재 속한 breakpoint 이름을 반환합니다. ```tsx import { Box, useBreakpoint } from "@seed-design/react"; export default function UseBreakpointExample() { const breakpoint = useBreakpoint(); return ( {breakpoint} ); } ``` ### `useBreakpointValue` 파라미터로 전달한 반응형 값 객체를 현재 viewport에 맞는 값으로 resolve합니다. ```tsx import { ActionButton, ActionButtonProps } from "seed-design/ui/action-button"; import { useBreakpointValue, VStack, Text } from "@seed-design/react"; export default function UseBreakpointValueExample() { const actionButtonProps = useBreakpointValue({ base: { variant: "neutralWeak", children: "variant=neutralWeak", }, lg: { variant: "brandSolid", children: "variant=brandSolid", }, }); return ( 아래 ActionButton은 lg breakpoint에서 variant가 변경됩니다. ); } ``` ### Server-Side Rendering SSR 등 viewport 정보를 알 수 없는 환경에서 훅 사용 시 적용될 breakpoint 기본값을 정의하려면 `BreakpointProvider`를 통해 `defaultBreakpoint`를 지정하세요. `BreakpointProvider` 밖에서 훅을 호출했으나 `window.matchMedia`를 사용할 수 없는 경우, `useBreakpoint`는 `base`를, `useBreakpointValue`는 `base` key의 값을 반환합니다. ```tsx import { BreakpointProvider } from "@seed-design/react"; function App() { return ( ); } ```