Groo Design

Collapsible

내용 하나를 접고 펴는 자리 — 거래 상세의 분할 내역, 분할 합계가 어긋날 때의 "빠르게 맞추기", HR 업무 보고의 상세 검색 조건. 트리거는 Accordion 항목 하나의 모양이다. 같은 모양의 항목이 여럿이면 Accordion 이다.

SEED 에는 Collapsible 컴포넌트가 없다 — SEED Accordion 가이드의 한 줄 "단일 콘텐츠를 접고 펼치는 용도는 해당 아이템에 Collapsible 동작을 활용할 수 있어요" 뿐이다(Apache-2.0). groo 는 그 문장대로 트리거를 Accordion 항목 하나의 모양으로 둔다 — 줄 전체가 트리거, 머리 글이 곧 이름, 54 · 74, 꺾쇠 20(2026-10-10 사용자 결정 9A). 이름은 상태마다 바꾸지 않고 펼침은 aria-expanded 가 알린다(APG Disclosure), 펼친 뒤 초점은 트리거에 그대로다. 옛 Collapsible 스펙("스타일 0 · 동작만 — 시각은 사용처" · Button 으로 감싼 트리거 · "더 보기" 쓰임)을 대신한다.

수치 원본은 collapsible.yaml이다 — 트리거 · 상태 · 모션 값은 accordion.yaml과 같고, 놓인 면(surface)만 더 있다. 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.

9:41
거래 상세
주거 · 계좌이체
−123,456,789원
(주)한빛공인중개사사무소 · 한빛이사 · 깨끗한청소
날짜10월 8일 (목) 오전 10:00
결제 수단급여통장
전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
휴대폰 · 인터넷 · TV통신−456,789원
배달 · 포장 · 테이크아웃 주문식비−1,000,000원
택시교통−5,000,000원
사료 · 간식반려동물−5,000,000원
9:41
거래 상세
주거 · 계좌이체
−123,456,789원
(주)한빛공인중개사사무소 · 한빛이사 · 깨끗한청소
날짜10월 8일 (목) 오전 10:00
결제 수단급여통장
내역 나누기
분할 합계가 3,456,789원 모자라요.거래 123,456,789원 · 분할 합계 120,000,000원
첫 내역에 모자란 금액 더하기모자란 금액을 새 내역으로남은 금액을 내역마다 똑같이 나누기
전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
휴대폰 · 인터넷 · TV통신−456,789원
hr.groo.app
그루 이음
근무
관리
업무 보고
기간2026. 10. 1. ~ 2026. 10. 31.
작성자김민수 · 이서연
프로젝트전체
상태전체
10월 2주차 클라우드 인프라 점검 보고김민수 · 10월 9일
데이터 플랫폼 배치 지연 원인 분석이서연 · 10월 8일
프로젝트 3팀 주간 진행 보고박지훈 · 10월 7일
9:41
거래 상세
주거 · 계좌이체
−123,456,789원
(주)한빛공인중개사사무소 · 한빛이사 · 깨끗한청소
날짜10월 8일 (목) 오전 10:00
결제 수단급여통장
전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
휴대폰 · 인터넷 · TV통신−456,789원
배달 · 포장 · 테이크아웃 주문식비−1,000,000원
택시교통−5,000,000원
사료 · 간식반려동물−5,000,000원
9:41
거래 상세
주거 · 계좌이체
−123,456,789원
(주)한빛공인중개사사무소 · 한빛이사 · 깨끗한청소
날짜10월 8일 (목) 오전 10:00
결제 수단급여통장
내역 나누기
분할 합계가 3,456,789원 모자라요.거래 123,456,789원 · 분할 합계 120,000,000원
첫 내역에 모자란 금액 더하기모자란 금액을 새 내역으로남은 금액을 내역마다 똑같이 나누기
전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
휴대폰 · 인터넷 · TV통신−456,789원
hr.groo.app
그루 이음
근무
관리
업무 보고
기간2026. 10. 1. ~ 2026. 10. 31.
작성자김민수 · 이서연
프로젝트전체
상태전체
10월 2주차 클라우드 인프라 점검 보고김민수 · 10월 9일
데이터 플랫폼 배치 지연 원인 분석이서연 · 10월 8일
프로젝트 3팀 주간 진행 보고박지훈 · 10월 7일
거래 상세 분할 내역(흰 면) · 빠르게 맞추기(경고 상자) · HR 상세 검색 조건(카드) — 라이트 · 다크

직접 골라 보기

놓인 면(흰 면 · 카드 · 경고 상자) · 설명 · 막힘 · 모션 줄이기를 고르면 스펙대로 그린 Collapsible 과 그 코드가 바뀐다. 트리거를 눌러 펼치고 초점을 두고 Enter · Space 를 눌러 볼 수 있다 — 옆 글이 읽기(이름 · 펼침)를 따라간다.

화면 읽기내역 분할 6개, 합계 −123,456,789원, 머리말 3, 단추, 접힘

놓인 면 surface
설명 description
막힘 disabled
모션
모드
브랜드
import { useState } from "react"
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"

const [open, setOpen] = useState(false)

<Collapsible open={open} onOpenChange={setOpen}>
  <CollapsibleTrigger title="내역 분할 6개" description="합계 −123,456,789원" />
  <CollapsibleContent layout="rows">{splits.map(renderSplitRow)}</CollapsibleContent>
</Collapsible>

Anatomy

전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
휴대폰 · 인터넷 · TV통신−456,789원
ⓐ Trigger — 위아래 16 · 좌우 24 · 54(설명 있으면 74) · 줄 전체가 누르는 자리ⓑ Title — 16 / 22 · 500 · 고정 이름ⓒ Description — 13 / 18 · 500 · 이름 아래 2ⓓ Chevron — 20 · 본문 뒤 12 · 펼치면 180°ⓔ Panel — 좌우 24 · 아래 16(줄 목록이면 8)
트리거(이름 · 설명 · 꺾쇠) — 줄 전체가 누르는 자리, 펼치면 아래에 내용
부위설명
ⓐ Trigger트리거 — 줄 전체가 누르는 자리. 머리말(h3) 안의 단추다.
ⓑ Title이름 — 16 / 22 · 500. 무엇을 여닫는지 — 상태마다 바꾸지 않는다.
ⓒ Description설명 — 13 / 18 · 500 · 옅은 색. 합계 · 적용한 필터 수처럼 접혀 있어도 알아야 할 것, 있을 때만.
ⓓ Chevron꺾쇠 — 20. 접혀 있으면 아래, 펼치면 위.
ⓔ Panel펼친 내용 — 트리거와 같은 좌우, 아래 16. 안에서 스크롤하지 않는다.

부위

부위설명
root접는 자리 하나 — 트리거 + 펼친 내용. surface card 면 Card 면
heading머리말 — 트리거를 감싼다(heading > button). 모양은 없다
trigger트리거 — 줄 전체가 누르는 자리(button). Accordion 항목과 같은 모양
background트리거 바탕 층 — 누름 · 호버 바탕. 줄지 않는다
content트리거 콘텐츠 층 — 본문 · 꺾쇠. 누르면 이 층만 준다
body본문 — 이름 + 설명
title이름 — 무엇을 여닫는지. 상태마다 바꾸지 않는다
description설명 — 있을 때만(합계 · 적용한 필터 수)
chevron꺾쇠 — 오른쪽 끝. 펼치면 위를 가리킨다
panel펼친 내용 — 높이로 펼치고 접는다. 안에서 스크롤하지 않는다
divider트리거 위 선 — 경고 상자 아래 줄일 때만
box경고 상자 — surface warning 일 때 Collapsible 을 품는 상자(분할 합계 경고). 위에 경고 글, 아래 줄이 트리거
focusRing키보드 포커스 링(웹) — 트리거 안쪽

Properties

트리거 — Accordion 항목 하나

트리거는 Accordion 항목과 같다 — 위아래 16 · 좌우 24, 이름 16 / 22 · 500 fg-neutral, 설명 13 / 18 · 500 fg-neutral-subtle(이름 아래 2), 꺾쇠 20 fg-neutral-subtle, 본문 ↔ 꺾쇠 12. 이름만이면 54, 설명이 있으면 74 다. 줄 전체가 누르는 자리라 글 단추 18 · 16.5 같은 작은 트리거가 생기지 않는다. 지금의 머리 + 오른쪽 글 단추 배치를 지키고 단추만 44 로 키우는 안(9B — 자리마다 단추 모양이 남는다)과 지금 그대로(9C)는 고르지 않았다.

이름만 54(위아래 16 + 이름 22) · 설명이 있으면 74(+ 2 + 설명 18) — Accordion 항목과 같은 트리거라 줄 전체가 누르는 자리다(지금의 글 단추 18 · 16.5 를 걷는다). 돈은 원까지, 빼기는 U+2212
이름만 54 · 이름 + 설명 74 — "내역 분할 6개 · 합계 −123,456,789원"

설명 있음 · 없음

descriptiontrigger 최소 높이설명
none (기본)—이름만 — 트리거 54(기본)
shown74px — 위아래 16 + 이름 22 + 2 + 설명 18이름 + 설명 — 트리거 74

트리거

속성값비고
최소 높이54px위아래 16 + 이름 22 — Accordion 항목과 같다. 이름이 줄을 바꾸면 늘어난다
상하 여백spacing-x4 16px
좌우 여백spacing-global-gutter 24px화면 가장자리 규칙 24
글 맞춤left
커서pointer
터치 영역트리거 전체줄 폭 × 54 이상 — 글 단추 · 꺾쇠만 누르게 하지 않는다(사용자 결정 9A). AA ✓ · AAA ✓

이름

속성값비고
글자text-t5 16px / 22px
굵기500
글자·아이콘color-fg-neutral #1A1F2E · 다크 #F5F6FA
줄 수none늘 줄을 바꾼다(10A)

설명

속성값비고
글자text-t3 13px / 18px
굵기500SEED accordion-item description medium — 머리 제목 500 과 한 벌. 글자 역할 R9 의 "여닫는 머리 설명"(2026-10-17 사용자 결정 01T-005 — 줄 설명 400 에 맞추지 않는다)
글자·아이콘color-fg-neutral-subtle #62697A · 다크 #A2A8B7
줄 수none

꺾쇠

속성값비고
크기20pxlucide chevron-down — 접혀 있으면 아래
색color-fg-neutral-subtle #62697A · 다크 #A2A8B7
회전0deg
전환 대상rotate
전환 시간motion-duration-d6 300ms
전환 곡선motion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)

펼친 내용

속성값비고
보이기숨김접혀 있으면 내용을 그리지 않는다 — 보조 기술도 읽지 않는다(앱도)
위 여백0px
좌우 여백spacing-global-gutter 24px트리거와 같은 좌우 — 내용(줄 · 칸 · 글)은 이 안에서 시작한다
아래 여백spacing-x4 16px트리거 위아래와 같은 16
최대 높이none패널 안에서 스크롤하지 않는다 — 길면 놓인 화면 · 시트가 스크롤한다

펼친 내용은 트리거와 같은 좌우 안에 두고 아래 16 으로 끝난다. 내용이 줄 목록이면(분할 내역 — 줄마다 위아래 12) 아래는 8 이다(layout="rows") — 마지막 줄의 글 아래로 20 이 된다.

펼친 내용 — 글 · 줄 목록

layoutpanel 아래 여백설명
text (기본)—글 · 카드 · 칸 — 펼친 내용 아래 16(기본)
rowsspacing-x2 8px — 8 — 줄마다 위아래 12 를 가져 마지막 줄의 글 아래로 20(비교 페이지 9A 의 분할 내역). 줄의 좌우는 0 — 패널의 좌우가 들인다줄 목록 — 줄이 제 위아래 여백을 가져 펼친 내용 아래 8(거래 상세의 분할 내역)

Surface

놓인 면에 따라 여백 · 선 · 누름 색이 셋으로 나뉜다. 트리거의 글 · 꺾쇠 · 높이는 같다.

  • default — 흰 면 · 시트 · 대화상자의 줄. 줄 폭 전체이고 좌우 24 — 거래 상세의 분할 내역.
  • card — Collapsible 자체가 Card 면(1px stroke-neutral-weak · 모서리 16)이고 트리거가 그 머리다. 펼친 내용은 카드 안 여백 24 로 끝난다 — HR 업무 보고의 상세 검색 조건(툴바 단추가 아니라 조건 카드의 머리가 된다).
  • warning — 경고 상자 안의 아래 줄. 상자(bg-warning-weak · 1px stroke-warning-weak · 모서리 12 · 경고 글 위 14 · 좌우 16 · 아래 12)의 안쪽 여백에 맞춰 좌우 16, 위에 1px stroke-warning-weak 선, 누름 · 호버는 경고 바탕의 누름 짝 bg-warning-weak-pressed — 분할 합계가 어긋날 때의 "빠르게 맞추기".
default — 흰 면줄 폭 전체 · 좌우 24 · 누름 bg-layer-default-pressed
card — 카드 면테두리 1 · 모서리 16 · 펼친 내용 아래 24
분할 합계가 3,456,789원 모자라요.거래 123,456,789원 · 분할 합계 120,000,000원
warning — 경고 상자 아래 줄좌우 16 · 위 선 1px · 누름 bg-warning-weak-pressed · 상자 모서리 12
같은 트리거 — 글 · 꺾쇠 · 높이는 같고 여백 · 선 · 누름 색만 다르다. 경고 상자는 바탕 · 1px 테두리 · 모서리 12 · 경고 글 위 14 · 좌우 16 · 아래 12 — 상자의 넘침 숨김이 아래 줄의 누름 바탕을 모서리에서 자른다
흰 면 · 카드 · 경고 상자 — 같은 트리거, 여백 · 선 · 누름 색만 다르다

놓인 면

surface모서리배경테두리테두리 두께넘침trigger 좌우 여백panel 좌우 여백panel 아래 여백divider 높이divider 배경divider 보이기설명
default (기본)———————————흰 면 · 시트 · 대화상자의 줄 — 줄 폭 전체, 좌우 24(기본)
cardradius-r4 16px — Card 16 — 트리거가 카드 머리다. 안의 누름 바탕은 16 − 6 = 10 으로 동심color-bg-layer-default #FFFFFF · 다크 #242938 — Card 면 — 바닥(bg-layer-basement) 위color-stroke-neutral-weak #E5E8EF · 다크 #4047571pxhidden——spacing-x6 24px — 카드 안 여백 24(Card) — 칸 묶음 아래———카드 면 — Collapsible 자체가 Card 면이고 트리거가 그 머리다(HR 상세 검색 조건)
warning—————spacing-x4 16px — 경고 상자의 안쪽 여백 16 — 상자 글과 같은 자리에 선다spacing-x4 16px—1pxcolor-stroke-warning-weak #F5C7B6 · 다크 #833615 — 트리거 위 — 상자 안 경고 글과 트리거 줄을 가른다트리거 위 — 상자 폭 끝까지경고 상자 안의 아래 줄 — 좌우 16 · 위 선 · 누름은 경고 바탕의 누름 색(분할 "빠르게 맞추기")

경고 상자

surfacebox 좌우 여백box 위 여백box 아래 여백box 모서리box 배경box 테두리box 테두리 두께box 넘침설명
default (기본)————————흰 면 · 시트 · 대화상자의 줄 — 줄 폭 전체, 좌우 24(기본)
card————————카드 면 — Collapsible 자체가 Card 면이고 트리거가 그 머리다(HR 상세 검색 조건)
warningspacing-x4 16px — 경고 글 좌우 16 — 트리거 좌우와 같다spacing-x3_5 14px — 경고 글 위 14spacing-x3 12px — 경고 글 ↔ 아래 줄의 선 12radius-r3 12px — 12 — 지금 분할 경고 상자의 모서리color-bg-warning-weak #FFEFE8 · 다크 #4B2B1F — 놓인 면 — 경고 글(제목 · 설명)과 아래 줄의 트리거를 함께 담는다color-stroke-warning-weak #F5C7B6 · 다크 #8336151pxhidden — 아래 줄의 누름 바탕 · 펼친 내용을 모서리에서 자른다경고 상자 안의 아래 줄 — 좌우 16 · 위 선 · 누름은 경고 바탕의 누름 색(분할 "빠르게 맞추기")

놓인 면 — 상태

surfacehovered 웹 — 누름과 같은 바탕(v106), 축소 없음focused 웹 — 키보드 포커스에만 트리거 안쪽 링pressed 바탕 + 콘텐츠만 2px 거리 축소(v104)
default———
card—focusRing 모서리 radius-r3_5 14px — 카드 모서리 16 − 링 들임 2 = 14 — 트리거가 카드 맨 위라 모서리를 따른다—
warningbackground 배경 color-bg-warning-weak-pressed #FAE0D5 · 다크 #65321D — 놓인 면(bg-warning-weak)의 누름 짝 — 꺾쇠 4.37 · 4.35 · 이름 13.04 · 9.59focusRing 모서리 radius-r2_5 10px — 상자 모서리 12 − 링 들임 2 = 10 — 트리거가 상자 맨 아래라 모서리를 따른다background 배경 color-bg-warning-weak-pressed #FAE0D5 · 다크 #65321D

State

상태모습
enabled바탕 없음 · 꺾쇠 아래(펼침이면 위)
hovered웹 — 누름과 같은 바탕(v106) — 좌우 6 들어온 bg-layer-default-pressed(경고 상자는 bg-warning-weak-pressed), 모서리 10
focused웹 — 키보드 포커스에만 트리거 안쪽 링 2px. 카드 · 경고 상자는 그 모서리를 따른다
pressed호버와 같은 바탕 + 콘텐츠 층만 2px 거리 축소(v104)
disabled이름 · 설명 · 꺾쇠가 fg-disabled — 흐리게 하지 않는다(v106)
흰 면카드경고 상자
기본
합계가 모자라요.
호버(웹)
합계가 모자라요.
포커스(키보드)
합계가 모자라요.
누름
합계가 모자라요.
막힘
합계가 모자라요.
라이트호버 = 누름 바탕(좌우 6 들임 · 모서리 10 — 경고 상자는 bg-warning-weak-pressed) · 누름은 콘텐츠만 2px 거리 축소 · 포커스 링 2px 안쪽(카드 모서리 14 · 경고 상자 10) · 막힘은 fg-disabled
흰 면카드경고 상자
기본
합계가 모자라요.
호버(웹)
합계가 모자라요.
포커스(키보드)
합계가 모자라요.
누름
합계가 모자라요.
막힘
합계가 모자라요.
다크호버 = 누름 바탕(좌우 6 들임 · 모서리 10 — 경고 상자는 bg-warning-weak-pressed) · 누름은 콘텐츠만 2px 거리 축소 · 포커스 링 2px 안쪽(카드 모서리 14 · 경고 상자 10) · 막힘은 fg-disabled
상태 — 기본 · 호버 · 포커스 · 누름 · 막힘

상태

상태background 바탕 들임background 모서리background 배경content 배율title 글자·아이콘description 글자·아이콘chevron 색링 두께링 간격링 색focusRing 모서리
enabled 기본0px0pxtransparent—color-fg-neutral #1A1F2E · 다크 #F5F6FAcolor-fg-neutral-subtle #62697A · 다크 #A2A8B7color-fg-neutral-subtle #62697A · 다크 #A2A8B7————
hovered 웹 — 누름과 같은 바탕(v106), 축소 없음spacing-x1_5 6pxradius-r2_5 10pxcolor-bg-layer-default-pressed #F7F8FD · 다크 #353B4D — Accordion 과 같다 — 시트 · 대화상자 위에서도 같은 값—color-fg-neutral #1A1F2E · 다크 #F5F6FAcolor-fg-neutral-subtle #62697A · 다크 #A2A8B7color-fg-neutral-subtle #62697A · 다크 #A2A8B7————
focused 웹 — 키보드 포커스에만 트리거 안쪽 링0px0pxtransparent—color-fg-neutral #1A1F2E · 다크 #F5F6FAcolor-fg-neutral-subtle #62697A · 다크 #A2A8B7color-fg-neutral-subtle #62697A · 다크 #A2A8B72px-2px — 트리거 안쪽 — 카드 · 상자 · 시트가 바깥 링을 자르지 않게color-stroke-focus-ring #1A1F2E · 다크 #F5F6FA0px — 흰 면의 줄 — 각진 링
pressed 바탕 + 콘텐츠만 2px 거리 축소(v104)spacing-x1_5 6pxradius-r2_5 10pxcolor-bg-layer-default-pressed #F7F8FD · 다크 #353B4D2px 거리 축소 — 콘텐츠 층만 — 기준 길이 max(높이, 폭 ÷ 4, 24) 에서 2px(v104)color-fg-neutral #1A1F2E · 다크 #F5F6FAcolor-fg-neutral-subtle #62697A · 다크 #A2A8B7color-fg-neutral-subtle #62697A · 다크 #A2A8B7————
disabled 전용 색(v106) — 불투명도로 흐리게 하지 않는다0px0pxtransparent—color-fg-disabled #8A91A0 · 다크 #838997color-fg-disabled #8A91A0 · 다크 #838997color-fg-disabled #8A91A0 · 다크 #838997————

펼침

openchevron 회전panel 보이기설명
collapsed (기본)——접힘 — 처음 상태는 쓰는 쪽이 정한다(기본)
expanded180deg — 위로보임 — 초점은 트리거에 그대로 · 저절로 스크롤하지 않는다(따라오는 것)펼침 — 꺾쇠가 위, 내용이 보인다

모션

전환시간곡선대상비고
펼침 · 접힘 — 높이motion-duration-d6 300msmotion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)heightAccordion 과 같다(사용자 결정 3A) — 펼쳐도 초점 · 스크롤은 그대로
꺾쇠 — 회전motion-duration-d6 300msmotion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)rotate0 → 180° — 모션 줄이기면 바로 뒤집힌다
모션 줄이기 — 펼침 · 접힘motion-duration-d3 150msmotion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)opacity높이를 움직이지 않고 150ms 서서히(v104)
누름 · 호버 — 바탕motion-duration-color-transition 150msmotion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)background-color, inset, border-radius
누름 — 콘텐츠motion-duration-pressed-scale 150msmotion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1)scale모션 줄이기면 하지 않는다

펼침 · 꺾쇠는 Accordion 과 같은 300ms motion-ease-easing 이고(사용자 결정 3A), 모션 줄이기면 높이 움직임 없이 150ms 서서히 나타나고 사라진다.

Guidelines

언제 쓰나

이런 자리쓰는 것
상세 하나를 접고 편다(분할 내역 · 빠르게 맞추기 · 상세 검색 조건)Collapsible
같은 모양의 상세가 여럿(혜택 · 유의사항)Accordion
줄 자체가 다른 일(편집)을 하고 하위 줄만 접는다(카테고리)List 하위 줄 — 줄 앞 꺾쇠 단추 44
잘린 글을 펼친다쓰지 않는다 — 글을 자르지 않는다(아래)
전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
이렇게 — 상세 하나를 접고 편다 — 분할 내역은 Collapsible
혜택 · 12건
대중교통버스 · 지하철 10% 청구할인
이렇게 — 같은 모양의 상세가 여럿 — 혜택은 Accordion(모두 펼치기)
이렇게 — 줄 자체가 편집을 열고 하위 줄만 접는다 — 카테고리는 List 하위 줄(줄 앞 꺾쇠 단추 44)
이렇게 하지 않는다 — 같은 모양의 Collapsible 을 여럿 쌓기 — 모두 펼치기가 없고 묶음으로 읽히지 않는다. Accordion 을 쓴다
상세 하나는 Collapsible · 여럿은 Accordion · 줄이 편집이면 List 하위 줄

이름은 고정 — 펼침은 상태가 알린다

이름은 무엇을 여닫는지 그대로 쓰고 상태마다 바꾸지 않는다 — "내역 분할 6개" 이지 "합계 123,456,789원" · "펼치기 / 접기" 가 아니다. 펼침은 aria-expanded 가 알린다(APG Disclosure). 설명(합계 · 필터 수)은 이름 뒤에 함께 읽힌다 — 숫자를 이름에 붙여 "필터2" 처럼 읽히게 하지 않는다. 펼쳐도 초점은 트리거에 그대로 두고 화면을 저절로 스크롤하지 않는다.

전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
내역 분할 6개, 합계 −123,456,789원, 머리말 3, 단추, 펼쳐짐
이렇게 — 줄 전체가 트리거 · 이름은 무엇을 여닫는지 그대로 — 펼침은 aria-expanded 가 알린다(APG Disclosure)
내역 분할 6개합계 123,456,789원 ⌄
합계 123,456,789원, 단추
이렇게 하지 않는다 — 지금 — 오른쪽 글 단추 128.9 × 18 이 합계만 말하고 무엇을 여닫는지 · 펼침 · 빼기 부호가 없다
읽기 — "내역 분할 6개, 합계 −123,456,789원, 머리말 3, 단추, 펼쳐짐" · 지금 "합계 123,456,789원, 단추"

잘린 글을 펼치지 않는다 — 자르지 않는다

읽어야 하는 글은 자르지 않고 줄을 바꿔 다 보인다 — HR 사내 규정 카드의 본문, 카드 유의사항의 제목, 부서 이름(사용자 결정 10A). 4줄에서 잘라 "더 보기" 로 펼치거나(10B) 눌러서 상세를 여는 것(10C)은 두지 않는다 — 그러니 Collapsible 로 잘린 글을 펼칠 일이 없다. 규정 카드는 한 줄의 카드 높이를 그 줄에서 가장 긴 카드에 맞춘다.

휴가 일수휴가는 1년에 총 15일이 주어지고, 1시간 단위로 나눠서 자유롭게 쓸 수 있어요.
지급 시기분기마다 나눠서 주어지고 쌓이지만, 그해 안에 모두 써야 해요. 다음 해로 넘어가지 않으니 연말 전에 남은 휴가를 확인해주세요.
경조 휴가결혼 · 출산처럼 기쁠 때나 가족을 잃는 슬플 때 경조 휴가가 주어져요. 날수는 관계와 일에 따라 달라요.
기타 휴가건강검진 · 예비군 · 민방위 대상자는 그날 유급 휴가예요. 신청할 때 통지서를 함께 올려주세요.
Annual leaveYou get 15 days a year and can use them freely in one-hour units.
When it is grantedLeave is granted every quarter and accumulates, but it must all be used within the same year. It does not carry over, so check what is left before the year ends.
Family eventsSpecial leave is given for happy occasions such as a wedding or birth, and for sad ones such as a loss in the family. The number of days depends on the event.
Other leaveHealth checkups and reserve forces or civil defense training are paid leave. Attach the notice when you apply.
이렇게 — 본문을 자르지 않고 줄을 바꿔 다 보인다 — 한 줄의 카드 높이는 그 줄에서 가장 긴 카드에 맞춘다(한국어 · 영어 모두, 데스크톱 4열)
휴가 일수휴가는 1년에 총 15일이 주어지고, 1시간 단위로 나눠서 자유롭게 쓸 수 있어요.더 보기
지급 시기분기마다 나눠서 주어지고 쌓이지만, 그해 안에 모두 써야 해요. 다음 해로 넘어가지 않으니 연말 전에 남은 휴가를 확인해주세요.더 보기
경조 휴가결혼 · 출산처럼 기쁠 때나 가족을 잃는 슬플 때 경조 휴가가 주어져요. 날수는 관계와 일에 따라 달라요.더 보기
기타 휴가건강검진 · 예비군 · 민방위 대상자는 그날 유급 휴가예요. 신청할 때 통지서를 함께 올려주세요.더 보기
Annual leaveYou get 15 days a year and can use them freely in one-hour units.더 보기
When it is grantedLeave is granted every quarter and accumulates, but it must all be used within the same year. It does not carry over, so check what is left before the year ends.더 보기
Family eventsSpecial leave is given for happy occasions such as a wedding or birth, and for sad ones such as a loss in the family. The number of days depends on the event.더 보기
Other leaveHealth checkups and reserve forces or civil defense training are paid leave. Attach the notice when you apply.더 보기
이렇게 하지 않는다 — 4줄에서 잘라 '더 보기' 로 펼치기 — 잘린 글을 읽으려고 한 번 더 누르고, 영어는 더 많이 잘린다
HR 규정 카드 16 — 한국어 · 영어 모두 자르지 않는다, 줄마다 가장 긴 카드 높이

원장 머리 — 소비 요약과 월 달력은 하나만

폰 가계부 원장 머리(웹 · 앱)의 "소비 요약" 카드와 "월 달력" 은 하나만 펼친다 — 하나를 열면 다른 하나가 닫힌다(사용자 결정 11A, 지금 앱과 같다). 둘 다 열리면 거래 목록이 화면 아래로 밀려 거의 보이지 않는다. 두 단추는 원장 머리의 제 모양 그대로이고(이번에 정하지 않았다) 이 스펙의 이름 · 상태 규칙만 따른다 — 이름은 "소비 요약" · "월 달력" 으로 고정하고 aria-expanded 로 펼침을 알린다. 할 일 원장의 월 달력 단추도 같은 이름이다. 머리가 스크롤에 따라 숨는 것은 Scroll Auto Hide 다.

9:41
가계부
가계부자산통계예산
10월
−124,224,589원지난달보다 1억 2,345만 원 더 쓰는 중
10월 소비 요약주거92%식비4%쇼핑3%
일월화수목금토
496천534천6121천797천8123,473천910
10월 8일 (목) · 오늘−123,472,839원
(주)한빛공인중개사사무소 · 한빛이사 · 깨끗한청소주거 · 계좌이체 · 10:00−123,456,789원
김밥천국 강남점식비 · 삼성카드 taptap O · 16:00−9,500원
파리바게뜨카페 · 간식 · 토스 체크카드 · 13:07−4,900원
티머니교통 · 토스 체크카드 · 10:14−1,650원
10월 7일 (수)−96,600원
무신사쇼핑 · 삼성카드 taptap O · 19:21−59,200원
골목커피 역삼점카페 · 간식 · 현대카드 M · 16:28−6,700원
GS25 역삼점식비 · 토스 체크카드 · 13:35−3,200원
쿠팡쇼핑 · 현대카드 M · 10:42−27,500원
10월 6일 (화)−120,500원
배달의민족식비 · 삼성카드 taptap O · 19:49−24,100원
카카오T 택시교통 · 현대카드 M · 16:56−13,100원
올리브영 강남역점쇼핑 · 토스 체크카드 · 13:03−19,100원
이마트 역삼점식비 · 현대카드 M · 10:10−64,200원
소비 요약을 열면 월 달력이 닫힌다—
9:41
가계부
가계부자산통계예산
10월
−124,224,589원지난달보다 1억 2,345만 원 더 쓰는 중
일월화수목금토
197천234천3120천496천534천6121천797천8123,473천910111213141516171819202122232425262728293031
10월 8일 (목) · 오늘−123,472,839원
(주)한빛공인중개사사무소 · 한빛이사 · 깨끗한청소주거 · 계좌이체 · 10:00−123,456,789원
김밥천국 강남점식비 · 삼성카드 taptap O · 16:00−9,500원
파리바게뜨카페 · 간식 · 토스 체크카드 · 13:07−4,900원
티머니교통 · 토스 체크카드 · 10:14−1,650원
10월 7일 (수)−96,600원
무신사쇼핑 · 삼성카드 taptap O · 19:21−59,200원
골목커피 역삼점카페 · 간식 · 현대카드 M · 16:28−6,700원
GS25 역삼점식비 · 토스 체크카드 · 13:35−3,200원
쿠팡쇼핑 · 현대카드 M · 10:42−27,500원
10월 6일 (화)−120,500원
배달의민족식비 · 삼성카드 taptap O · 19:49−24,100원
카카오T 택시교통 · 현대카드 M · 16:56−13,100원
올리브영 강남역점쇼핑 · 토스 체크카드 · 13:03−19,100원
이마트 역삼점식비 · 현대카드 M · 10:10−64,200원
월 달력을 열면 소비 요약이 닫힌다—
9:41
가계부
가계부자산통계예산
10월
−124,224,589원지난달보다 1억 2,345만 원 더 쓰는 중
10월 소비 요약주거92%식비4%쇼핑3%
일월화수목금토
197천234천3120천496천534천6121천797천8123,473천910111213141516171819202122232425262728293031
10월 8일 (목) · 오늘−123,472,839원
(주)한빛공인중개사사무소 · 한빛이사 · 깨끗한청소주거 · 계좌이체 · 10:00−123,456,789원
김밥천국 강남점식비 · 삼성카드 taptap O · 16:00−9,500원
파리바게뜨카페 · 간식 · 토스 체크카드 · 13:07−4,900원
티머니교통 · 토스 체크카드 · 10:14−1,650원
10월 7일 (수)−96,600원
무신사쇼핑 · 삼성카드 taptap O · 19:21−59,200원
골목커피 역삼점카페 · 간식 · 현대카드 M · 16:28−6,700원
GS25 역삼점식비 · 토스 체크카드 · 13:35−3,200원
쿠팡쇼핑 · 현대카드 M · 10:42−27,500원
10월 6일 (화)−120,500원
배달의민족식비 · 삼성카드 taptap O · 19:49−24,100원
카카오T 택시교통 · 현대카드 M · 16:56−13,100원
올리브영 강남역점쇼핑 · 토스 체크카드 · 13:03−19,100원
이마트 역삼점식비 · 현대카드 M · 10:10−64,200원
—
이렇게 하지 않는다 — 둘 다 열리면 거래 목록이 화면 아래로 밀려 거의 보이지 않는다 — 웹 가계부도 앱처럼 하나만
가계부 10월 — 소비 요약을 열면 월 달력이 닫힌다, 목록이 보이는 높이

글

이름은 접힌 내용이 무엇인지 명사구로("내역 분할 6개" · "빠르게 맞추기" · "상세 검색 조건"), 설명은 접혀 있어도 알아야 할 값으로("합계 −123,456,789원" · "2개 필터 적용 중") 쓴다. 돈은 원까지, 빼기는 U+2212 다.

코드

레시피 recipes/shadcn/components/ui/collapsible.tsx 를 쓴다(Radix Collapsible 위에 짜도 된다). 아래 미리보기는 스펙 값으로 그린 모습이다.

  • Collapsible — 접는 자리. open · defaultOpen · onOpenChange(open) · disabled · surface("default" 기본 · "card" · "warning"), 나머지는 div 속성. "card" 는 Collapsible 이 Card 면을 그린다. "warning" 은 경고 상자의 맨 아래 줄이다 — 상자(box — 바탕 · 테두리 · 모서리 12 · 경고 글 여백)는 화면이 그리고, 상자의 overflow: hidden 이 아래 줄의 누름 바탕을 모서리에서 자른다.
  • CollapsibleTrigger — title(필수 — 고정 이름) · description · headingLevel(2 ~ 6, 기본 3). 머리말 안의 단추(aria-expanded · aria-controls)와 꺾쇠 20 을 그린다 — Accordion 트리거와 같은 모양이다.
  • CollapsibleContent — 펼친 내용. layout("text" 기본 · "rows" — 줄 목록이면 아래 8), 나머지는 div 속성. 좌우는 트리거와 같고 아래 16(card 24). 접혀 있으면 그리지 않는다. 높이 300ms · 모션 줄이기면 150ms 서서히.

원장 머리의 "소비 요약" · "월 달력" 은 이 부품이 아니라 원장 머리의 단추다 — aria-expanded · aria-controls 를 달고, 하나를 열면 다른 하나를 닫는 것은 화면이 쥔다.

거래 상세 — 분할 내역

전세 보증금 잔금(계약금 · 중도금 제외)주거 · 월세−100,000,000원
관리비주거 · 관리비−12,000,000원
휴대폰 · 인터넷 · TV통신−456,789원
배달 · 포장 · 테이크아웃 주문식비−1,000,000원
택시교통−5,000,000원
사료 · 간식반려동물−5,000,000원
1억 넘는 거래를 6건으로 나눈 내역 — 처음 펼침
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"

<Collapsible defaultOpen>
  <CollapsibleTrigger title={`내역 분할 ${splits.length}개`} description={`합계 ${formatWon(total)}`} />
  <CollapsibleContent layout="rows">{splits.map(renderSplitRow)}</CollapsibleContent>
</Collapsible>

분할 — 빠르게 맞추기(경고 상자 안)

분할 합계가 3,456,789원 모자라요.거래 123,456,789원 · 분할 합계 120,000,000원

분할 합계가 3,456,789원 모자랄 때 — 경고 상자 아래 줄의 빠르게 맞추기
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"

{/* 경고 상자(box)는 화면이 그린다 — 경고 글 아래 맨 끝 줄이 Collapsible(좌우 16 · 위 선 · 누름은 경고 바탕의 누름 색) */}
<div className="overflow-hidden rounded-r3 border border-stroke-warning-weak bg-bg-warning-weak">
  <div className="px-x4 pb-x3 pt-x3_5">{shortfallMessage}</div>
  <Collapsible surface="warning">
    <CollapsibleTrigger title="빠르게 맞추기" />
    <CollapsibleContent>{quickFixes}</CollapsibleContent>
  </Collapsible>
</div>

HR 업무 보고 — 상세 검색 조건(카드)

업무 보고 1280 — 상세 검색 조건 카드, 2개 필터 적용 중
import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible"

<Collapsible surface="card" open={filtersOpen} onOpenChange={setFiltersOpen}>
  <CollapsibleTrigger
    title="상세 검색 조건"
    description={appliedCount > 0 ? `${appliedCount}개 필터 적용 중` : undefined}
  />
  <CollapsibleContent>{filterFields}</CollapsibleContent>
</Collapsible>

Behavior

인터랙션동작
트리거 누르기 · Enter · Space펼치고 접는다 — 초점은 트리거에 그대로, 저절로 스크롤하지 않는다
Tab트리거 → 펼친 내용 안의 초점 가는 것 → 다음
Disabled누르기 · 키보드 불가. 펼친 채 막히면 내용은 그대로 보인다
모션 줄이기높이 움직임 없이 150ms 서서히 · 꺾쇠는 바로 · 누름 축소 없음

Accessibility

기준검증
WCAG 1.4.3 Color contrast(글자 ≥ 4.5:1)이름 fg-neutral 16.41 · 다크 13.42(경고 상자 누름 바탕 위 13.04 · 9.59), 설명 fg-neutral-subtle 5.50 · 6.09(경고 상자 4.91 · 5.30) ✓
WCAG 1.4.11 Non-text contrast(≥ 3:1)꺾쇠 fg-neutral-subtle 5.50 · 6.09 · 경고 상자 누름 바탕 위 4.37 · 4.35 ✓. 키보드 포커스 링 Desk 8.38 · 6.10 · HR 8.17 · 6.07 ✓
WCAG 1.4.1 Use of color펼침은 꺾쇠 방향과 보이는 내용으로 알린다 ✓
WCAG 2.1.1 KeyboardTab · Enter · Space ✓
WCAG 2.4.3 Focus order펼쳐도 초점은 트리거에 — 펼친 내용은 트리거 바로 뒤 차례 ✓
WCAG 2.4.7 Focus visible트리거 안쪽 링 2px — 카드 · 상자에 잘리지 않는다 ✓
WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24)트리거 줄 전체 54 이상 ✓ — 지금의 18 · 16.5 글 단추를 걷는다
WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44)트리거 54 이상 ✓
WCAG 4.1.2 Name, Role, Valueheading > button — 이름은 고정 이름 + 설명, aria-expanded · aria-controls(펼친 내용의 id) ✓
ARIAAPG Disclosure — 펼친 내용에 role="region" 을 두지 않는다. 앱은 Semantics(button: true, expanded: …) 로, 접힌 내용은 의미 트리에서 뺀다
Reduced motion높이 움직임 없이 150ms 서서히(v104) · 꺾쇠는 바로 · 누름 축소 없음

Do / Don't

✅ Do

  • 상세 하나를 Accordion 항목 모양의 줄 전체 트리거로 접고 편다.
  • 이름은 무엇을 여닫는지 고정하고, 접혀 있어도 알아야 할 값은 설명으로.
  • 펼쳐도 초점 · 스크롤을 그대로 둔다.
  • 원장 머리의 소비 요약과 월 달력은 하나만 펼친다.

❌ Don't

  • 글 단추 · 꺾쇠만으로 트리거 만들기(누르는 영역 18 · 16.5).
  • 상태마다 이름 바꾸기("펼치기 / 접기" · "목록 / 달력") · 숫자를 이름에 붙이기("필터2").
  • 잘린 글을 "더 보기" 로 펼치기 — 읽어야 하는 글은 자르지 않는다.
  • 같은 모양의 Collapsible 여럿을 쌓기 — Accordion 을 쓴다.
  • 패널 안 스크롤 상자 · 움직임 없이 갑자기 펼치기 · 불투명도 막힘.

Specification

collapsible.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹 · 앱이 Collapsible 을 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다. 상태는 enabled 에서 바뀌는 값만 적었다.

Base

부위상태속성값
headingenabled머리말 단계levelh3놓인 자리의 머리말 차례에 맞춘다(Accordion 과 같다) — 대화상자 · 시트 · 카드 제목(h2) 아래면 h3
triggerenabled최소 높이minHeight54px위아래 16 + 이름 22 — Accordion 항목과 같다. 이름이 줄을 바꾸면 늘어난다
상하 여백paddingYspacing-x416px
좌우 여백paddingXspacing-global-gutter24px화면 가장자리 규칙 24
커서cursorpointer
터치 영역touchTarget트리거 전체줄 폭 × 54 이상 — 글 단추 · 꺾쇠만 누르게 하지 않는다(사용자 결정 9A). AA ✓ · AAA ✓
글 맞춤textAlignleft
backgroundenabled바탕 들임insetX0px
모서리radius0px
배경backgroundtransparent
전환 대상transitionPropertybackground-color, inset, border-radiusAccordion 과 같다
전환 시간transitionDurationmotion-duration-color-transition150ms
전환 곡선transitionEasingmotion-ease-easingcubic-bezier(0.35, 0, 0.35, 1)
contentenabled간격gapspacing-x312px본문 ↔ 꺾쇠 12
세로 맞춤alignItemscenter
전환 대상transitionPropertyscale
전환 시간transitionDurationmotion-duration-pressed-scale150ms
전환 곡선transitionEasingmotion-ease-pressed-scalecubic-bezier(0, 0, 0.15, 1)
bodyenabled간격gapspacing-x0_52px이름 ↔ 설명 2
titleenabled글자·아이콘foregroundfg-neutral#1A1F2E다크 #F5F6FA
글자typographytext-t516px / 22px
굵기fontWeight500
줄 수lineClampnone늘 줄을 바꾼다(10A)
descriptionenabled글자·아이콘foregroundfg-neutral-subtle#62697A다크 #A2A8B7
글자typographytext-t313px / 18px
굵기fontWeight500SEED accordion-item description medium — 머리 제목 500 과 한 벌. 글자 역할 R9 의 "여닫는 머리 설명"(2026-10-17 사용자 결정 01T-005 — 줄 설명 400 에 맞추지 않는다)
줄 수lineClampnone
chevronenabled크기size20pxlucide chevron-down — 접혀 있으면 아래
색colorfg-neutral-subtle#62697A다크 #A2A8B7
회전rotate0deg
전환 대상transitionPropertyrotate
전환 시간transitionDurationmotion-duration-d6300ms
전환 곡선transitionEasingmotion-ease-easingcubic-bezier(0.35, 0, 0.35, 1)
panelenabled최대 높이maxHeightnone패널 안에서 스크롤하지 않는다 — 길면 놓인 화면 · 시트가 스크롤한다
좌우 여백paddingXspacing-global-gutter24px트리거와 같은 좌우 — 내용(줄 · 칸 · 글)은 이 안에서 시작한다
위 여백paddingTop0px
아래 여백paddingBottomspacing-x416px트리거 위아래와 같은 16
보이기display숨김접혀 있으면 내용을 그리지 않는다 — 보조 기술도 읽지 않는다(앱도)
backgroundhovered바탕 들임insetXspacing-x1_56px
모서리radiusradius-r2_510px
배경backgroundbg-layer-default-pressed#F7F8FD다크 #353B4DAccordion 과 같다 — 시트 · 대화상자 위에서도 같은 값
focusRingfocused링 두께width2px
모서리radius0px흰 면의 줄 — 각진 링
링 색colorstroke-focus-ringDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84
링 간격offset-2px트리거 안쪽 — 카드 · 상자 · 시트가 바깥 링을 자르지 않게
backgroundpressed바탕 들임insetXspacing-x1_56px
모서리radiusradius-r2_510px
배경backgroundbg-layer-default-pressed#F7F8FD다크 #353B4D
contentpressed배율scale2px 거리 축소콘텐츠 층만 — 기준 길이 max(높이, 폭 ÷ 4, 24) 에서 2px(v104)
triggerdisabled커서cursornot-allowed
titledisabled글자·아이콘foregroundfg-disabled#8A91A0다크 #838997
descriptiondisabled글자·아이콘foregroundfg-disabled#8A91A0다크 #838997
chevrondisabled색colorfg-disabled#8A91A0다크 #838997

open=expanded

부위상태속성값
chevronenabled회전rotate180deg위로
panelenabled보이기display보임초점은 트리거에 그대로 · 저절로 스크롤하지 않는다(따라오는 것)

description=shown

부위상태속성값
triggerenabled최소 높이minHeight74px위아래 16 + 이름 22 + 2 + 설명 18

layout=rows

부위상태속성값
panelenabled아래 여백paddingBottomspacing-x28px8 — 줄마다 위아래 12 를 가져 마지막 줄의 글 아래로 20(비교 페이지 9A 의 분할 내역). 줄의 좌우는 0 — 패널의 좌우가 들인다

surface=card

부위상태속성값
rootenabled모서리radiusradius-r416pxCard 16 — 트리거가 카드 머리다. 안의 누름 바탕은 16 − 6 = 10 으로 동심
배경backgroundbg-layer-default#FFFFFF다크 #242938Card 면 — 바닥(bg-layer-basement) 위
테두리borderColorstroke-neutral-weak#E5E8EF다크 #404757
테두리 두께borderWidth1px
넘침overflowhidden
panelenabled아래 여백paddingBottomspacing-x624px카드 안 여백 24(Card) — 칸 묶음 아래
focusRingfocused모서리radiusradius-r3_514px카드 모서리 16 − 링 들임 2 = 14 — 트리거가 카드 맨 위라 모서리를 따른다

surface=warning

부위상태속성값
triggerenabled좌우 여백paddingXspacing-x416px경고 상자의 안쪽 여백 16 — 상자 글과 같은 자리에 선다
panelenabled좌우 여백paddingXspacing-x416px
dividerenabled높이height1px
배경backgroundstroke-warning-weak#F5C7B6다크 #833615트리거 위 — 상자 안 경고 글과 트리거 줄을 가른다
보이기display트리거 위상자 폭 끝까지
boxenabled좌우 여백paddingXspacing-x416px경고 글 좌우 16 — 트리거 좌우와 같다
위 여백paddingTopspacing-x3_514px경고 글 위 14
아래 여백paddingBottomspacing-x312px경고 글 ↔ 아래 줄의 선 12
모서리radiusradius-r312px12 — 지금 분할 경고 상자의 모서리
배경backgroundbg-warning-weak#FFEFE8다크 #4B2B1F놓인 면 — 경고 글(제목 · 설명)과 아래 줄의 트리거를 함께 담는다
테두리borderColorstroke-warning-weak#F5C7B6다크 #833615
테두리 두께borderWidth1px
넘침overflowhidden아래 줄의 누름 바탕 · 펼친 내용을 모서리에서 자른다
backgroundhovered배경backgroundbg-warning-weak-pressed#FAE0D5다크 #65321D놓인 면(bg-warning-weak)의 누름 짝 — 꺾쇠 4.37 · 4.35 · 이름 13.04 · 9.59
focusRingfocused모서리radiusradius-r2_510px상자 모서리 12 − 링 들임 2 = 10 — 트리거가 상자 맨 아래라 모서리를 따른다
backgroundpressed배경backgroundbg-warning-weak-pressed#FAE0D5다크 #65321D

SEED 와 다른 점

  • SEED 에는 Collapsible 이 없다 — Accordion 가이드의 한 줄대로 항목 하나의 모양을 쓴다. 값은 Accordion 의 groo 값(좌우 24 · 불투명한 누름 바탕 · 안쪽 포커스 링)이다.
  • 놓인 면(surface) — 카드 면 · 경고 상자 안에 둘 때의 여백 · 선 · 누름 색은 groo 가 정했다.
  • 잘린 글을 펼치지 않는다 · 원장 머리는 하나만 펼친다 — SEED 에 규칙이 없다.

Migration notes

2026-10-10 — 트리거를 Accordion 항목 하나로

사용자가 펼치고 접기 · 나누기 비교 페이지에서 정했다 — 하나만 접는 자리의 트리거는 Accordion 항목 하나의 모양(9A — 줄 전체 · 머리 글 = 이름 · 54 / 74), 잘린 글은 자르지 않는다(10A — HR 규정 카드 · 유의사항 제목 · 부서 이름), 폰 가계부 요약 ↔ 달력은 하나만(11A). 펼침은 Accordion 과 같은 300ms(3A). 그리고 "따라오는 것" — 이름은 고정 + aria-expanded(APG Disclosure) · 펼친 뒤 초점은 트리거에 그대로. 글 단추 + 꺾쇠(9B) · 지금 그대로(9C) · "더 보기"(10B) · 눌러서 상세(10C) · 요약과 달력 둘 다(11B)는 고르지 않았다. 옛 스펙은 collapsible.history/v-pre-seed-collapse.md 에 남겼다.

옛 Collapsible새 Collapsible
스타일 0 — 트리거 · 내용의 모양은 사용처트리거는 Accordion 항목 모양(54 · 74 · 꺾쇠 20) · 놓인 면 셋
트리거는 asChild 로 Button 을 감싼다줄 전체가 트리거 — 머리말 안의 단추
"더 보기" · 고급 옵션 · 설정 상세 쓰임잘린 글은 펼치지 않고 자르지 않는다 — 상세 하나를 접는 자리만
꺾쇠 회전은 사용처에서 · animate-accordion-* 재사용꺾쇠 180° · 높이 300ms ease-easing · 모션 줄이기면 150ms 서서히
막힘 불투명도 0.5전용 색 fg-disabled

제품은 앱 적용 단계에서 옮긴다(2026-10-09 조사).

  • 웹 거래 상세 분할 내역 — 머리 "내역 분할 6개"(h4) 오른쪽 글 단추 "합계 123,456,789원 + 꺾쇠 16" 이 128.9 × 18 이고 이름에 무엇을 여닫는지 · 빼기 부호가 없으며, aria-expanded 0 · 움직임 0 이다(widgets/expense-detail/ui/TxDetailDialog.tsx:646-700 · 상태 :113, D4 · D13). 앱은 같은 자리가 높이 18 · 이름 · 상태 0 이다(features/expense/presentation/tx_detail_dialog.dart:828-880). default 트리거 "내역 분할 6개 · 합계 −123,456,789원" 으로.
  • 웹 분할 빠르게 맞추기 — "✦ 빠르게 맞추기 ⌄" 가 103 × 16.5 · 11 / 700 브랜드 · aria-controls 0 · 움직임 0 이다(features/expense-split/ui/SplitTxDialog.tsx:590-640, D13). 앱은 높이 22 · 이름 · 상태 0(features/expense_split/presentation/split_tx_dialog.dart:513-545). warning 트리거로.
  • HR 업무 보고 필터 — outline 단추 152 × 36 "필터 2" 가 "필터2" 로 붙어 읽히고 aria-expanded 0 · 내용 움직임 0 이다(features/work-report/ui/ReportHeader.tsx:43-63 → ReportFilter.tsx:58-231, D19). 조건 카드의 머리 card 트리거 "상세 검색 조건 · 2개 필터 적용 중" 으로.
  • 원장 머리 — 웹 가계부는 소비 요약 카드(txmDrop 180ms)와 월 달력이 함께 열리고, 앱은 하나를 열면 다른 하나를 닫는다(pages/expense/ui/ExpensePage.tsx:1972-2020 → shared/ui/groo/ledger.tsx:202-250 · 앱 features/expense/presentation/expense_screen.dart:505-507 · 617-619, D24) — 웹도 하나만. 월 달력 단추의 이름이 가계부는 "목록 / 달력" 으로 잘못 바뀌고 할 일은 "월 전체 보기 / 접기" 이며 aria-expanded 0, 앱은 이름 0 이다(ExpensePage.tsx:2112-2116 · TodoMobileLedger.tsx:472-476 → ledger.tsx:394-416 · 앱 expense_screen.dart:1253-1266, D10) — "월 달력" + aria-expanded 로. 누르는 영역도 소비 요약 39.5 · 월 달력 32 다(D13).
  • 잘린 글 — HR 규정 카드 16곳이 line-clamp-4 로 데스크톱 4열에서 한국어 3/16 · 영어 6/16 이 잘리고 펼칠 길이 없으며, "지급 시기" 는 같은 문장이 두 번 찍힌다(features/culture-regulation/ui/RuleVacation.tsx:17 · 27-37 외 Rule*.tsx, D6). 자르지 않고 줄마다 가장 긴 카드에 높이를 맞춘다. 웹 유의사항 제목의 말줄임(D11)은 Accordion, HR 부서 이름의 말줄임(D12)은 Tree View 에서 걷는다.
  • 쓰지 않는 것 — SSO collapsible.tsx 는 쓰는 곳이 0 이다(D21).

이전 기록

  • 2026-05 — Radix primitive 그대로. 스타일 없이 동작만 내보내고 시각은 사용처에 맡겼다. 이번에 트리거 모양을 정했다.

이 페이지