--- name: 쏘카 design_system_name: SOCAR Frame 2.0 slug: socar category: mobility last_updated: "2026-06-02" created_at: "2026-05-22" sources: - https://socarframe.socar.kr/ - https://socar.kr/ - https://socarframe.socar.kr/development/components/Alert - https://socarframe.socar.kr/development/foundation/Colors - https://socarframe.socar.kr/development/components - https://socarframe.socar.kr/development/foundation/Spacing - https://socarframe.socar.kr/development/foundation/Icons - https://socarframe.socar.kr/development/foundation/Typography - https://socarframe.socar.kr/development/principle - https://socarframe.socar.kr/ux-principles/overview - https://socarframe.socar.kr/ux-principles - https://socarframe.socar.kr/ux-principles/wow-moment - https://socarframe.socar.kr/development/foundation - https://socarframe.socar.kr/development/components/Buttons/ActionButton - https://socarframe.socar.kr/development/components/Buttons/IconButton - https://socarframe.socar.kr/development/components/Buttons/TextButton - https://socarframe.socar.kr/development/components/Accordion - https://socarframe.socar.kr/development/components/SegmentedControl - https://socarframe.socar.kr/development/components/Chip - https://socarframe.socar.kr/development/components/Checkbox - https://socarframe.socar.kr/development/components/Radio - https://socarframe.socar.kr/development/components/SelectionBox - https://socarframe.socar.kr/development/components/Skeleton - https://socarframe.socar.kr/development/components/Input - https://socarframe.socar.kr/development/components/TextArea - https://socarframe.socar.kr/development/components/Tab - https://socarframe.socar.kr/development/components/TopAppBar - https://socarframe.socar.kr/development/components/DatePicker - https://socarframe.socar.kr/development/components/TimePicker - https://socarframe.socar.kr/development/components/BottomSheet - https://socarframe.socar.kr/development/components/Snackbar - https://socarframe.socar.kr/development/components/Pattern/Carousel - https://socarframe.socar.kr/development/components/Tips/AccentTip - https://socarframe.socar.kr/development/components/Tips/InfoTip - https://socarframe.socar.kr/development/components/Haptic - https://socarframe.socar.kr/ux-principles/release-checklist - https://socarframe.socar.kr/ux-principles/trade-off-rules related_services: [] lang: ko logo: https://getdesign.kr/logos/socar.png --- # SOCAR Frame 2.0 — design.md ## Brand & Style SOCAR Frame 2.0(쏘카프레임 2.0)는 쏘카의 디자인 시스템이며, 브랜드명(쏘카 / SOCAR)과 디자인 시스템명은 별개의 이름이다 [src:9][src:5]. 쏘카는 한국 최대 카셰어링 서비스이며, 전국의 쏘카존(공용 차량 거점)을 기반으로 단기·왕복 차량 대여를 제공하는 한국형 모빌리티 플랫폼이다 [src:1][src:2]. 소비자용 카셰어링 제품과 SOCAR Business 라인을 함께 운영하며, 두 서비스는 토큰 세트에 `{colors.service-socar}`와 `{colors.service-business}` 색으로 각각 기록되어 있다 [src:4]. 시스템의 핵심 가치는 "가장 쏘카다운, 가장 효율적인"이며, UX 원칙은 "복잡함을 덜어내고 본질에 집중합니다 — 더 뺄 것이 없을 때까지 덜어냅니다"로 요약된다 [src:9][src:11]. 디자인 원칙 문서는 점진적 개선을 표방해(Legacy & Consistency) 시각 언어를 절제된 방향으로 고정한다 [src:9]. 시각 톤은 차갑고 차분하며 신뢰 지향적이다 — 채도 높은 파랑(`{colors.primary-regular}`)과 푸른 기가 도는 회색 램프가 밝은 표면 위에 놓이는 구조이며, 장식보다 정보 위계가 앞선다 [src:1][src:4]. 브랜드 단서는 두 픽셀로 압축된다 — 흰 배경 위의 단일 브랜드 블루(`{colors.primary-regular}`)와 옅게 푸른 회색 워시다 [src:4]. 그라데이션·텍스처·손그림·반복 패턴은 어디에도 없고, 표면은 전부 플랫 필이다 [src:5][src:9]. 위계는 색이 아니라 크기와 굵기로 만든다 — Heading 700 / Title 600 / Body 400이며, 숫자는 bold로, 그 단위 라벨은 regular로 렌더한다(예: **11,900** 원 /시간), 이 규칙이 화면을 한눈에 읽히게 하는 핵심이다 [src:8][src:5]. 아이콘은 이모지가 아니라 커스텀 `icon-*-fill` / `icon-*-line` 폰트(약 150 글리프, 2 weight)에서 가져오며, 코드화된 "이모지 금지" 규칙이 문서·예시 전반에 일관되게 적용된다 [src:7]. 주 사용자는 스마트폰 앱으로 가까운 쏘카존에서 차를 빌리는 한국 이용자이며, 야외·한 손 조작 환경에 노출된다 [src:10][src:11]. 릴리스 체크리스트가 "한 손 조작이 가능합니까?", "야외 환경에서도 핵심 정보가 식별됩니까?"를 게이트로 둘 만큼, 이 시스템은 화면 UI가 아니라 이동 경험 전체를 설계 대상으로 본다("Move Better, Design Better") [src:10][src:11]. 원칙 간 트레이드오프 우선순위도 명시되어 있다 — Safety > Essentials > Confidence > Quality > Consistency > Innovation이며, "Wow Moment"는 깜짝 연출이 아니라 차분한 확신과 무마찰로 정의된다 [src:11][src:12]. **SOCAR Frame 2.0은 라이트 모드 전용이다.** 공개된 다크 팔레트가 없으며, 모든 표면 토큰은 밝은 배경(`background-regular`, 본문 흰색)을 전제로 한다 [src:1][src:4]. 다운스트림에서 다크 테마가 필요하다면 별도 제품 근거 위에서 정의해야 하며, 이 문서는 다크 토큰을 추정하지 않는다. ## Colors SOCAR Frame 2.0은 공식 Colors 페이지에 전체 토큰 세트를 게시하며, 색상 클래스는 `tw-{bg|text|border|fill}-{name}-{step}` 패턴을 따른다 [src:4][src:1]. 아래 값은 공개된 hex 토큰을 ko-design-md 표준에 맞게 OKLCH로 변환한 것이며, **라이트 모드 전용으로 다크 변형은 존재하지 않는다** [src:4][src:1]. ```yaml # Brand / primary (action) primary-regular: oklch(0.620 0.219 257) # service-socar / blue-500 primary-strong: oklch(0.586 0.236 261) # pressed / blue-600 primary-heavy: oklch(0.526 0.224 263) # heaviest / blue-700 service-business: oklch(0.395 0.197 266) # SOCAR Business / blue-900 # Blue ramp (brand axis; named steps used by components) blue-50: oklch(0.962 0.022 248) blue-100: oklch(0.917 0.040 240) blue-200: oklch(0.789 0.111 234) # input focus border blue-500: oklch(0.620 0.219 257) # = primary-regular # Neutral grays (faintly blue-tinted ramp) gray-50: oklch(0.984 0.002 286) gray-100: oklch(0.967 0.004 271) gray-200: oklch(0.927 0.009 264) gray-300: oklch(0.851 0.018 264) gray-400: oklch(0.781 0.027 267) gray-500: oklch(0.687 0.035 265) gray-600: oklch(0.519 0.039 263) gray-700: oklch(0.405 0.036 264) gray-800: oklch(0.331 0.034 264) gray-900: oklch(0.268 0.030 263) gray-1000: oklch(0.211 0.026 261) # Semantic — text text-strong: oklch(0.211 0.026 261) # gray-1000 text-primary: oklch(0.331 0.034 264) # gray-800, default body text text-secondary: oklch(0.519 0.039 263) # gray-600 text-tertiary: oklch(0.687 0.035 265) # gray-500 text-disabled: oklch(0.781 0.027 267) # gray-400 # Semantic — surface / structure background-regular: oklch(0.967 0.004 271) # app-surface wash border-regular: oklch(0.927 0.009 264) border-weak: oklch(0.967 0.004 271) divider-regular: oklch(0.927 0.009 264) divider-weak: oklch(0.967 0.004 271) white: oklch(1.000 0.000 0) # body background black: oklch(0.000 0.000 0) # Semantic — overlay (translucent) dimmed-regular: oklch(0.211 0.026 261 / 0.44) # modal/sheet dim pressed-regular: oklch(0.211 0.026 261 / 0.06) # press-ripple pressed-dark-regular: oklch(0.000 0.000 0 / 0.08) # press-ripple on dark fill # Semantic — status (weak / regular / strong) information-weak: oklch(0.962 0.022 248) information-regular: oklch(0.620 0.219 257) information-strong: oklch(0.586 0.236 261) positive-weak: oklch(0.974 0.043 158) positive-regular: oklch(0.745 0.176 162) positive-strong: oklch(0.706 0.165 163) caution-weak: oklch(0.978 0.030 92) caution-regular: oklch(0.741 0.166 56) caution-strong: oklch(0.712 0.166 53) negative-weak: oklch(0.957 0.025 14) negative-regular: oklch(0.649 0.219 19) negative-strong: oklch(0.594 0.249 21) notification-red: oklch(0.649 0.219 19) # badge / notification dot # Semantic — accent (one representative step per hue) accent-red: oklch(0.649 0.219 19) accent-orange: oklch(0.741 0.166 56) accent-green: oklch(0.745 0.176 162) accent-lightblue: oklch(0.681 0.156 232) accent-purple: oklch(0.617 0.214 295) accent-redorange: oklch(0.683 0.205 41) accent-indigo: oklch(0.572 0.234 268) accent-magenta: oklch(0.640 0.245 7) accent-lime: oklch(0.794 0.214 130) accent-cyan: oklch(0.733 0.137 207) # Semantic — domain-specific (mobility) location-rental: oklch(0.620 0.219 257) # pickup marker location-return: oklch(0.487 0.260 268) # return marker / indigo-700 ``` 색상 축은 채도 높은 파랑(`{colors.primary-regular}`)이며, 동일 hue를 strong/heavy로 단계화해 눌림 상태를 표현한다 [src:4]. `{colors.primary-regular}`(blue-500)는 유일한 브랜드 색이고, strong/heavy는 press·강한 CTA 용도일 뿐 장식에 쓰지 않는다 [src:4][src:9]. 회색 램프는 순수 회색이 아니라 푸른 기가 옅게 도는 톤이라 전체 온도가 차갑게 읽힌다 [src:1][src:4]. 상태색은 information / positive / caution / negative를 각각 weak·regular·strong 3단계로 분리하며 — weak는 틴트 표면, regular는 아이콘/텍스트 — 배지·알림 점에는 `{colors.notification-red}`를 사용한다 [src:4][src:1]. accent는 10개의 범주형 램프로 차종·위치·상태를 태깅하는 용도이며, 한 화면에 두 개의 accent가 동시에 나오는 일은 드물다 [src:4]. 모빌리티 도메인 토큰으로 픽업 마커 `{colors.location-rental}`와 반납 마커 `{colors.location-return}`가 별도로 정의되어, 쏘카존 기반 지도 UI를 색으로 구분한다 [src:4][src:2]. ## Typography SOCAR Frame 2.0은 **Pretendard Variable** 단일 패밀리로 일원화한다 — 다른 서체와의 페어링 없이 하드 룰로 고정되어 있고, 토큰 CSS는 jsDelivr 웹폰트(`pretendard@v1.3.9`)로 weight 400/500/600/700을 로드하며 한글 글리프 보강을 위해 `Apple SD Gothic Neo`, `Noto Sans KR`를 폴백 스택에 둔다 [src:8][src:4]. ```yaml font-family: "Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Apple SD Gothic Neo", "Noto Sans KR", sans-serif weight-regular: 400 weight-medium: 500 weight-semibold: 600 weight-bold: 700 # token: size px / line-height px / weight display1: 40 / 50 / 700 # letter-spacing 0 display2: 36 / 44 / 700 # letter-spacing -0.6px (only token with negative tracking) heading1: 26 / 36 / 700 heading2: 24 / 34 / 700 heading3: 22 / 30 / 700 heading4: 20 / 28 / 700 title1: 18 / 26 / 600 title2: 16 / 24 / 600 title3: 14 / 22 / 600 title4: 13 / 20 / 600 body1: 18 / 26 / 400 body2: 16 / 24 / 400 # default body body3: 14 / 22 / 400 body4: 13 / 20 / 400 caption1: 12 / 18 / 600 caption2: 12 / 18 / 500 caption3: 10 / 16 / 600 caption4: 10 / 16 / 400 ``` 위계 패턴은 명확하다 — Display·Heading은 bold(700), Title은 semibold(600), Body는 regular(400), Caption은 600/500/400을 섞는다 [src:8][src:5]. 본문 기본 텍스트 색은 `{colors.text-primary}`이며, 산문성 제목 맥락에서는 `{colors.text-strong}`을 쓴다 [src:4]. letter-spacing은 display2(−0.6px)를 제외하면 전부 0이다 [src:4][src:8]. 줄 높이는 1.22–1.6배로 잡혀 작동하는 앱처럼 빽빽하되 한글 렌더링을 수용한다 [src:8][src:5]. 가격·시간·거리 등 숫자는 title1/title2(semibold)로, 그 단위 라벨은 body weight로 분리하는 컨벤션이 반복된다 [src:5][src:8]. ## Spacing 간격 체계는 4px 기본 단위에 기반한다 — Spacing 페이지는 "1 unit = 4px"를 명시하고, 스케일은 `spacing-{n}` 토큰 램프로 `n ÷ 25 = px` 규칙을 따른다 [src:6][src:4]. Tailwind 유틸리티(`tw-p-spacing-{n}`, `tw-gap-spacing-{n}`)로 적용된다 [src:4]. ```yaml # spacing-{n} : px (n / 25 = px) spacing-0: 0 spacing-25: 1 spacing-50: 2 spacing-100: 4 spacing-125: 5 spacing-150: 6 spacing-200: 8 spacing-250: 10 spacing-300: 12 spacing-350: 14 spacing-400: 16 spacing-450: 18 spacing-500: 20 spacing-550: 22 spacing-600: 24 spacing-650: 26 spacing-700: 28 spacing-750: 30 spacing-800: 32 spacing-900: 36 spacing-1000: 40 ``` 스케일은 작은 크기 구간(1/2/4/5/6px)에서 촘촘해 타이트한 컴포넌트 패딩을 다루고, 그 위로는 4px 케이던스로 정착한다 [src:6][src:4]. 컨테이너 패딩은 대부분 12 / 16 / 18px, 스택 간격은 대부분 8 / 12px이며, 화면 단위 간격은 `{spacing.spacing-400}` 이상을 기준으로 삼는 구성이 시스템 의도에 맞는다 [src:6][src:5]. ## Rounded 코너 반경은 넉넉하게 둥근 토큰 램프이며, spacing과 동일한 `n ÷ 25 = px` 규칙을 따른다 — `radius-{n}` 토큰이 `tw-rounded-radius-{n}`로 적용된다 [src:4]. 부분 적용(`tw-rounded-t-radius-{n}` 상단, `tw-rounded-s/e-radius-{n}` start/end)도 지원한다 [src:6]. ```yaml # radius-{n} : px radius-100: 4 radius-150: 6 radius-200: 8 radius-250: 10 radius-300: 12 radius-350: 14 radius-400: 16 radius-500: 20 radius-600: 24 radius-circle: 9999 # full pill / circle ``` 관찰된 사용처는 명확하며, 시스템은 작은 집합으로만 커밋한다 — 2px/3px 같은 미세 라운딩은 없다 [src:5]. 버튼은 크기에 따라 8–14px(xSmall 8px → large 14px), 카드와 스켈레톤 카드는 16px(`{rounded.radius-400}`), 바텀시트 상단 코너는 24px(`{rounded.radius-600}`)를 쓴다 [src:6][src:14]. 칩은 완전한 pill(고정 50px), 입력 필드·SelectionBox 카드는 14px(`{rounded.radius-350}`), 탭 인디케이터 바·TimePicker 세그먼트는 8–10px(`{rounded.radius-200}`/`{rounded.radius-250}`)다 [src:6][src:4]. 전반적으로 기하적이되 모서리는 일관되게 부드럽다 [src:4][src:6]. ## Elevation & Depth SOCAR Frame 2.0의 깊이 언어는 절제되어 있다 — 표면 분리는 드롭섀도가 아니라 1px 디바이더(`{colors.divider-regular}`)와 `{colors.background-regular}` 배경 워시가 담당하며, 흰 카드가 밝은 회색 필드 위에 간격과 헤어라인으로 구분된다 [src:1][src:4][src:screenshot:home.jpg]. 그림자는 사실상 두 레시피로 희소하다 — 카드는 그림자 대신 디바이더를 받는다 [src:1][src:5]. ```yaml shadow-sm: 0 1px 2px oklch(0.211 0.026 261 / 0.04) shadow-tip: 0 2px 4px oklch(0.000 0.000 0 / 0.12) shadow-sheet: 0 0 20px oklch(0.000 0.000 0 / 0.25) ``` 그림자 토큰은 존재하지만 모두 미세하다 [src:1][src:4]. `shadow-sm`은 스켈레톤 카드 변형이라는 유일한 카드 예외에, `shadow-tip`은 툴팁 버블(AccentTip·InfoTip)에, `shadow-sheet`는 부양된 바텀시트에 쓰는 강도다 [src:1][src:5]. inner shadow도, elevation 토큰 시스템도 없다 [src:1]. **모든 그림자 토큰은 라이트 모드 값이다** — 다크 모드 대응 elevation은 공개되지 않았으므로, 다크 표면이 필요하면 별도 근거 위에서 정의해야 한다 [src:1][src:4]. ## Shapes 형태 언어는 정돈된 기하 구조 위에 넉넉한 반경을 얹는 방식이다 [src:4][src:6]. 칩은 완전한 pill, 카드와 시트는 12–24px 반경을 일관되게 써서 접근하기 쉽되 질서 있는 인상을 만든다 — 유기적이라기보다 기하적이다 [src:4][src:6]. 그라데이션은 없고 모든 표면은 플랫 필이며, 차량·위치 썸네일 이미지는 항상 radius-300/400 카드 안에 마스킹되어 앱 크롬 안에서 full-bleed로 깔리지 않는다 [src:1][src:5]. 시각적 절제는 표면 처리에서도 드러난다 — 곡선은 모서리 반경으로만 표현되고, 표면 구분은 곡면이나 그림자가 아니라 1px 헤어라인과 배경 워시로 처리된다 [src:1]. 시그니처 인터랙션은 press feedback이다 — 인터랙티브 표면이 `:active`에서 92%로 축소되고 `::after` 리플 오버레이가 함께 뜬다(`active:tw-scale-[92%]` + `active:after:tw-bg-pressed-dark-regular`, 리플 radius는 컴포넌트 radius에 클리핑) [src:1]. 텍스트 인접 행(chip / checkbox / radio)은 94–96%로 더 약하게 축소한다 [src:1]. 모션은 짧고 표준적이다 — `duration-100`(100ms), `duration-150`(150ms), `ease-standard`(`cubic-bezier(0.42, 0, 0.58, 1)`)이며, spring/bounce나 화면 전환 페이드는 없다 [src:1]. hover 상태는 사실상 존재하지 않고 press가 모든 피드백을 담당한다 [src:1]. ## Components SOCAR Frame 2.0은 React 18 + Tailwind v3(커스텀 `tw-` 프리픽스) + framer-motion 라이브러리이며, `@socar-inc/socar-frame-components`로 배포되고 `@socar-inc/socar-frame-foundation`을 peer dependency로 둔다 [src:5]. 코퍼스는 24개 컴포넌트(비시각 Haptic 포함 25번째)를 문서화하며, 각 컴포넌트는 base 클래스 + size 축 + variant 축 + state로 분해된다 [src:5]. 아래는 시스템의 시그니처 패턴이다. ### action-button-fill-primary ActionButton의 1차 fill/primary variant다 — 페이지의 주 행동을 담당하며 배경은 `{colors.primary-regular}`, 텍스트는 흰색이다 [src:1][src:14]. 4개 크기(large 56px → xSmall 32px height)를 지원하고, radius는 크기에 따라 8–14px(xSmall 8 → small 10 → medium 12 → large 14)로 스케일하며 타이포는 caption2→title2로 함께 오른다 [src:1][src:14]. `hapticConfig` prop으로 웹뷰 햅틱을 연결할 수 있다 [src:1][src:14]. ```tsx 예약하기 ``` ### action-button-fill-secondary fill/secondary variant는 1차 행동보다 낮은 우선순위의 확정 행동에 쓴다 [src:1][src:14]. 배경은 `{colors.blue-100}`(연한 파랑), 텍스트는 `{colors.primary-strong}`로, `{component.action-button-fill-primary}`와 구조를 공유하되 색 위계를 낮춘다 [src:1][src:14]. ```tsx 다음에 ``` ### action-button-fill-tertiary fill/tertiary variant는 가장 낮은 위계의 보조 행동용이다 [src:1][src:14]. 배경은 `{colors.gray-100}`(= `{colors.background-regular}` 톤), 텍스트는 `{colors.text-primary}`를 써서 중립 표면처럼 읽히게 한다 [src:1][src:14]. ```tsx 취소 ``` ### action-button-outlined styleType outlined는 흰 배경 + 1px `{colors.divider-regular}` 보더로 구성되며 높이가 fill보다 2px 크다 [src:14]. variant는 primary(`{colors.primary-regular}` 텍스트)·secondary(`{colors.text-primary}` 텍스트)만 지원하고, tertiary 요청 시 primary로 폴백한다 [src:14]. ```tsx 자세히 보기 ``` ### action-button-pressed ActionButton의 눌림 상태는 별도 시각 상태로 다룬다 — 시그니처 press feedback에 따라 표면이 `:active`에서 92%로 축소되고, 진한 fill 위에서는 `{colors.pressed-dark-regular}` 리플 오버레이가 크기별 radius에 클리핑되어 함께 뜬다 [src:1][src:14]. loading은 `{colors.gray-100}` 필 + Lottie 로더로 전환하며 클릭을 막고, disabled는 불투명도 변화 없이 `{colors.gray-100}` 배경 / `{colors.text-disabled}` 텍스트로 재색칠한다 [src:14]. ```tsx ``` ### icon-button 완전 원형(`{rounded.radius-circle}`) 정사각 비율의 아이콘 전용 버튼이며, xSmall→xLarge 5개 크기를 지원한다(측정 표본 large 약 46px, xSmall 약 28px) [src:1][src:15]. 배경·보더 색은 자유 커스텀이고, 모빌리티 아이콘 세트(`icon-car`, `icon-charging`, `icon-bolt` 등)를 `-fill`/`-line` 스타일로 담으며, press 리플은 원형으로 클리핑된다 [src:7][src:15]. ```tsx } aria-label="차량" /> ``` ### text-button 배경 없는 텍스트 버튼으로 반경은 4px(`{rounded.radius-100}`) 고정, padding 4/2px 고정이며, 색은 variant로 정해진다 — primary `{colors.primary-regular}`, secondary `{colors.text-primary}`, tertiary `{colors.text-secondary}` [src:1][src:16]. 4개 크기는 타이포·높이만 바꾸고(22→28px), 옵션으로 underline을 가진다 [src:16]. ```tsx 전체 보기 ``` ### accordion 펼침/접힘 패널 컨테이너다 — `useAccordion` 훅으로 `single`/`multiple`/`manual` 모드를 제어하며(`openValues`/`onOpenChange`), 컨테이너는 `{rounded.radius-150}`(6px)에 1px `{colors.gray-100}` 보더와 `gap-2`를 두고, 각 항목은 질문 + 셰브론의 trigger 행과 답변 panel로 구성된다 [src:17][src:screenshot:accordion.png]. ```tsx 예약 확정 시점에 결제됩니다. ``` ### badge `content`(숫자/텍스트 pill)와 `dot` 두 variant를 가지며, 기본 배경은 `{colors.notification-red}`, 옵션으로 1px 흰 보더(`hasBorder`)를 둔다 [src:1][src:4]. content는 높이 20px·min-width 20px·radius 17px pill에 `{typography.caption1}` 흰 텍스트, dot은 6×6px이며, 대상 위 우상단에 absolute로 오프셋된다 [src:4]. 색은 `backgroundColor`/`textColor`/`borderColor` prop으로 커스텀한다 [src:4]. ```tsx 9+ ``` ### chip 선택 가능한 pill이며 반경은 50px 고정, padding 8/12px·gap 6px다 [src:1][src:19]. 크기는 medium/small/xSmall(높이 36–40px, 타이포 body2/3/4)이며, 선택 상태는 `{colors.blue-50}` 배경 + 1px `{colors.primary-regular}` 보더 + `{colors.primary-regular}` 텍스트, 비선택은 흰 배경 + 1px `{colors.border-regular}` + `{colors.text-secondary}` 텍스트로 표시한다 [src:19]. press 시 `scale(0.95)` + `{colors.pressed-regular}` 리플, focus-visible 시 2px `{colors.primary-regular}` 링이 뜬다 [src:19]. 홈 화면의 필터 행("전체 · 경/소형 · 중형 · SUV · 전기 · 수입")이 이 컴포넌트다 [src:screenshot:home.jpg]. ```tsx SUV ``` ### checkbox 복수 선택 행 + 그룹이다 — 행 `