Groo Design

Toggle

단추 하나가 한 상태를 그 자리에서 켜고 끄는 아이콘 단추 — 관심 등록 · 메모 고정 · 비밀값 보기. 이름은 그대로 두고 켬은 aria-pressed 가 알린다. 금액 가리기 눈은 설정으로 가는 버튼이라 Toggle 이 아니다(아래). 여럿 가운데 고르거나 거르는 것은 Chip, 누르는 순간 적용되는 설정 줄은 Switch, 저장해야 적용되는 켜고 끄기는 Checkbox 다.

SEED 에는 이 단추의 디자인 문서가 없다 — 글이 있는 알약 Toggle Button(32 · 36, aria-pressed)이 코드에만 있고, 아이콘 켜고 끄기는 Iconography 의 규칙("OFF, ON 개념이 있는 버튼의 상태 전환을 표현할 때는 Default(Line), On(Fill), Off(Line+Slash)을 사용합니다")과 하트 단추(Reaction Button · Image Frame Reaction Button)뿐이다(당근 SEED, Apache-2.0). groo 는 켜고 끄는 단추를 아이콘 단추 하나로 두고(2026-10-09 사용자 결정) 켬 · 끔을 아이콘의 모양 · 굵기 · 색으로만 가른다 — 바탕은 칠하지 않는다. 글 토글(옛 Toggle 의 default · outline 28 · 32 · 40)과 Toggle Group 은 걷었다. 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다.

수치 원본은 toggle.yaml이다. 수치 표 자리([표: …])와 그림 자리([그림: …])는 사이트가 그 파일로 그린다 — GitHub 에서는 그 파일 · 그림 코드로 가는 링크로 보인다.

9:41
삼성전자
삼성전자 · 00593071,500원+850원(1.2%)
9:41
메모
장보기 목록
우유 · 계란 · 두부 · 대파
제주 여행 준비
숙소 예약 · 렌터카 · 우산
부모님 선물
안마기 · 꽃바구니
9:41
증권 연결
가나증권
App Key ••••••••••••••••
다라투자증권
App Key PSq7·Kx2m·9WdA·tL4e
9:41
삼성전자
삼성전자 · 00593071,500원+850원(1.2%)
9:41
메모
장보기 목록
우유 · 계란 · 두부 · 대파
제주 여행 준비
숙소 예약 · 렌터카 · 우산
부모님 선물
안마기 · 꽃바구니
9:41
증권 연결
가나증권
App Key ••••••••••••••••
다라투자증권
App Key PSq7·Kx2m·9WdA·tL4e
종목 머리의 관심 등록 · 메모 카드의 고정 · 증권 연결의 App Key 보기 — 라이트 · 다크

직접 골라 보기

단추(관심 등록 · 메모 고정 · App Key 보기) · 켬 · 끔 · 막힘을 고르면 스펙대로 그린 단추와 그 코드가 바뀐다. 실제로 눌러 보면 아이콘과 보조 기술이 읽는 말("관심 등록, 눌림")이 함께 바뀐다.

삼성전자
71,500원 · +1.2%

화면 읽기관심 등록, 토글 버튼, 안 눌림

단추
켬 pressed
막힘 disabled
모드
브랜드
import { Star } from "lucide-react"
import { Toggle } from "@/components/ui/toggle"

const [watched, setWatched] = useState(false)

<Toggle aria-label="관심 등록" pressed={watched} onPressedChange={setWatched} icon={<Star />} />

Anatomy

끔 · 호버(웹)관심 등록, 토글 버튼, 안 눌림
켬 · 키보드 포커스관심 등록, 토글 버튼, 눌림
ⓐ Container — 보이는 40 · 누르는 44(분홍), 바탕은 누름 · 호버에만ⓑ Icon — 20, 끔 선 2 · 켬 선 2.5ⓒ Focus ring — 2px · 띄움 2px
3배로 그렸다
단추는 보이는 상자 40 · 누르는 영역 44 · 아이콘 20 으로 이뤄진다 — 바탕은 누를 때만
부위설명
ⓐ Container단추 — 보이는 40 · 누르는 44. 바탕은 켬 · 끔에 따라 바뀌지 않고 누를 때 · 마우스를 올릴 때만 칠한다.
ⓑ Icon아이콘 20 — 지금 상태를 그린다. 켬은 진한 색 + 선 2.5, 끔은 흐린 색 + 선 2.
ⓒ Focus ring키보드 포커스에만 2px 링 · 2px 띄움. 브랜드 채움 위(inverted)는 흰 링 — 브랜드 링이 채움에 묻힌다.

부위

부위설명
root단추 — 보이는 40 · 누르는 44. 바탕은 켬 · 끔에 따라 바뀌지 않는다(누름 · 호버에만 칠한다)
icon아이콘 20 — 지금 상태를 그린다(키 보기는 가렸으면 eye-off, 모으기 단추는 같은 아이콘)
focusRing키보드 포커스 링

Properties

켬 · 끔 — 아이콘만 바뀐다

켬 · 끔은 아이콘이 말한다 — 켬은 진한 색(fg-neutral) + 선 2.5, 끔은 흐린 색(fg-neutral-muted) + 선 2 다(기초 Iconography v106 — lucide 에 채움 모양이 없어 SEED 의 "켬 = 채움" 을 굵기와 색으로 대신한다). 바탕은 켬 · 끔 모두 투명하다 — 상단 바 · 카드 위에서 조용하고, 켬이 "고른 칸" 처럼 무거워지지 않는다(사용자 결정 5A — 켜면 옅은 바탕 · 반전은 고르지 않았다). 상단 바 안에서만 끔도 진한 색이다(아래 Size).

끔켬
관심 등록
메모 고정
App Key 보기
라이트끔 fg-neutral-muted · 선 2 — 켬 fg-neutral · 선 2.5. 바탕은 둘 다 투명하다
끔켬
관심 등록
메모 고정
App Key 보기
다크끔 fg-neutral-muted · 선 2 — 켬 fg-neutral · 선 2.5. 바탕은 둘 다 투명하다
켬 · 끔 — 관심 등록 · 메모 고정 · App Key 보기, 라이트 · 다크

끔 · 켬

toggledicon 색icon 선 굵기설명
off (기본)color-fg-neutral-muted #535866 · 다크 #B7BDCC — 흰 표면 위 7.11 · 다크 7.70 — 끔도 흐리게(불투명도) 두지 않는다. 모으기 단추(관심 · 고정)는 사선 없는 같은 아이콘, 기능 단추(눈 · 종)는 지금 상태의 아이콘(-off 짝). 상단 바 안에서는 끔도 fg-neutral(19B)2px — lucide 기본끔 — aria-pressed="false". 흐린 색 + 선 2(기본)
oncolor-fg-neutral #1A1F2E · 다크 #F5F6FA — 흰 표면 위 16.41 · 다크 13.42 — 끔(7.11 · 7.70)보다 짙다. 브랜드 색으로 칠하지 않는다2.5px — v106 — 켜짐 · 선택은 선 2.5. 앱은 lucide 굵기 글꼴 Lucide500 짝으로 낸다(코드로 선 굵기를 걸 수 없다 — 2026-10-15 구현 세션 질문 Q-010-3 정리, 2.5 는 2026-10-09 사용자 결정)켬 — aria-pressed="true". 진한 색 + 선 2.5

아이콘 — 지금 상태를 그린다

아이콘은 누르면 할 일이 아니라 지금 상태를 그린다(사용자 결정 7A). 단추는 둘로 나뉜다.

  • 기능 단추 — 무언가를 보이거나 숨기고, 켜거나 끈다(눈 · 종). 아이콘은 lucide 의 짝이고 지금 상태 쪽을 보인다 — 키가 가려져 있으면 eye-off, 보이면 eye. 꺼진 기능은 사선(-off)이다.
  • 모으기 단추 — 항목을 모아 둔다(관심 · 고정). 끔에도 사선을 두지 않는다 — 같은 아이콘이 흐린 선 2 · 진한 선 2.5 로만 갈린다(사용자 결정 6B — SEED 하트처럼). 관심에 넣지 않은 종목마다 사선 별이 깔리지 않는다. 채우지 않는다 — 앱의 lucide 글꼴은 채울 수 없다.
단추이름(고정)눌림의 뜻끔켬
관심 등록"관심 등록"관심에 넣었다star 흐린 선 2star 진한 선 2.5
메모 고정"{메모 제목} 고정"고정했다pin 흐린 선 2pin 진한 선 2.5
App Key 보기"App Key 보기"키를 보였다eye-off(가림)eye(보임)
삼성전자 · 00593071,500원+850원(1.2%)
제주 여행 준비
숙소 예약 · 렌터카 · 우산
가나증권
App Key ••••••••••••
이렇게 — 모으기 단추(관심 · 고정)의 끔은 같은 아이콘이 흐린 선 2 — 관심에 넣지 않은 종목마다 사선 별이 깔리지 않는다. 눈은 지금 상태(키가 가려져 있으면 eye-off)
삼성전자 · 00593071,500원+850원(1.2%)
제주 여행 준비
숙소 예약 · 렌터카 · 우산
가나증권
App Key ••••••••••••
이렇게 하지 않는다 — 모으기 단추의 끔을 사선(star-off · pin-off)으로 — 목록의 칸마다 사선이 깔려 '꺼진 기능' 처럼 읽힌다
기능 단추는 -off 짝 · 모으기 단추는 사선 없이 — 종목 머리 · 메모 카드

Size

크기는 하나다 — 보이는 40 · 누르는 44 · 아이콘 20 · 모서리 8(Button medium 의 아이콘만 있는 단추와 같은 상자). 상자 · 아이콘은 px 라 글자 크기를 키워도 커지지 않는다(2026-10-23 사용자 결정 — 홈 Q1-A, DESIGN.md "상자 · 아이콘 · 원은 px"). 상단 바 안에 켜고 끄는 단추를 둘 때는 Top Navigation 의 아이콘 버튼(상자 44 · 아이콘 24)을 쓴다. 이름 고정 · aria-pressed · 지금 상태의 아이콘 · 굵기(끔 2 · 켬 2.5)는 같고 색만 다르다 — 끔도 이웃 버튼과 같은 진한 색(fg-neutral)이다. 아이콘 줄에서 하나만 흐리면 막힌 단추처럼 보이기 때문이다(사용자 결정 2026-10-09 19B — 상단 바에서도 흐린 끔은 고르지 않았다). 지금 상단 바에 켜고 끄는 단추를 두는 화면은 없다 — 상단 바에 있던 금액 가리기 눈은 2026-10-16 머리에서 뺐다(Top Navigation).

카드 · 시트 위 Toggle보이는 40 · 누르는 44 · 아이콘 20 · 모서리 8
상단 바 안이라면 — Top Navigation 아이콘 버튼상자 44 · 아이콘 24 — 끔 선 2 · 켬 선 2.5, 둘 다 fg-neutral
상단 바에서는 이웃 버튼과 같은 진한 색 — 아이콘 줄에서 하나만 흐리면 막힌 단추처럼 보인다(19B). 켬 · 끔은 굵기와 아이콘으로만 가른다. 지금 상단 바에 켜고 끄는 단추를 두는 화면은 없다
보이는 40 · 누르는 44 · 아이콘 20 · 상단 바 안이라면 44 · 24

공통

부위속성값비고
root크기40pxButton medium · iconOnly 의 보이는 상자와 같다(기초 Iconography — 아이콘 버튼은 보이는 40)
root모서리radius-r2 8px누름 · 호버 바탕에만 보인다(Button medium 과 같다)
root배경transparent켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)
root터치 영역44 × 44보이는 40 둘레로 2 씩 넓힌다(v106). AA ✓ · AAA ✓
root커서pointer
root이름고정aria-label 은 상태마다 바꾸지 않는다("관심 등록" · "App Key 보기") — 켬은 aria-pressed 가 알린다(APG). 이름과 아이콘의 뜻이 반대로 읽히지 않게 아이콘은 지금 상태를 그린다. 설정으로 가는 금액 가리기 눈은 aria-pressed 없이 "금액 가리기 설정"
root전환 대상background-color
root전환 시간motion-duration-color-transition 150ms
root전환 곡선motion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)
icon아이콘20pxlucide 선 아이콘 — v106 가운데 단계

Tone

흰 표면 · 카드 · 시트 위가 기본(default)이다. 브랜드 채움 위(inverted)에서는 아이콘이 켬 · 끔 모두 흰색이고 모양과 굵기(2 · 2.5)로만 갈린다. 브랜드 채움에는 누름 색 짝이 없어 누르면 축소만 한다(Card 의 순자산 카드와 같다). 단추 둘레에 원 · 바탕을 두지 않는다 — 흰 아이콘만이다(사용자 결정 2026-10-09 21A — 늘 흰 12% 원은 고르지 않았다). 지금 브랜드 채움 위의 단추는 순자산 카드의 금액 가리기 눈 하나이고, 그 눈은 Toggle 이 아니라 이 상자 · 색만 빌린 설정으로 가는 버튼이다(아래 "금액 가리기 눈은 Toggle 이 아니다").

순자산 · 2026년 10월
42,898,100원
총 자산 52,320,000원 · 총 부채 9,421,900원
순자산 · 2026년 10월
••••••원
총 자산 •••••• · 총 부채 ••••••
라이트금액 가리기 눈 — Toggle 이 아니다(aria-pressed 없음 · 이름 "금액 가리기 설정"). 보임 eye · 가림 eye-off(선 2 그대로) · 흰 아이콘만, 원 · 바탕 없음. 가림 카드는 키보드 포커스 — 링도 흰색(2px · 띄움 2)
순자산 · 2026년 10월
42,898,100원
총 자산 52,320,000원 · 총 부채 9,421,900원
순자산 · 2026년 10월
••••••원
총 자산 •••••• · 총 부채 ••••••
다크금액 가리기 눈 — Toggle 이 아니다(aria-pressed 없음 · 이름 "금액 가리기 설정"). 보임 eye · 가림 eye-off(선 2 그대로) · 흰 아이콘만, 원 · 바탕 없음. 가림 카드는 키보드 포커스 — 링도 흰색(2px · 띄움 2)
순자산 카드 위 금액 가리기 눈 — 보임 · 가림, 라이트 · 다크

표면

toneicon 색설명
default (기본)—흰 표면 · 카드 · 시트 위(기본)
invertedcolor-static-white #FFFFFF — 켬 · 끔 모두 흰색 — 순자산 카드 그라디언트 위 Desk 8.38 ~ 14.78 · 다크 8.36 ~ 11.25(장식 빛 위 가장 낮은 자리 4.88). 켬 · 끔은 아이콘 모양과 굵기(2.5 · 2)로 가른다. 금액 가리기 눈(설정으로 가는 버튼)은 aria-pressed 가 없어 선 2 그대로 — eye · eye-off 모양만 바뀐다브랜드 채움 위 — 아이콘은 켬 · 끔 모두 흰색이고 모양 · 굵기로 가른다. 순자산 카드의 금액 가리기 눈(설정으로 가는 버튼 — Toggle 이 아니다)이 이 상자 · 색을 빌린다

State

상태모습
enabled바탕 없음 · 아이콘만 켬 · 끔
hovered웹 — 누름과 같은 바탕 bg-layer-default-pressed(축소 없음, v106)
focused키보드 포커스에만 링 2px · 띄움 2px
pressed누름 바탕 + 단추 전체 2px 거리 축소(v104). 켬 · 끔은 손을 뗄 때 바뀐다
disabled아이콘 fg-disabled — 켬은 선 2.5 를 그대로 둬 켜져 있던 것이 보인다. 흐리게 하지 않는다(v106). Tab 순서에서 빠진다
끔켬
기본
호버(웹)
포커스(키보드)
누름
막힘
라이트호버 = 누름 바탕(축소 없음) · 누름은 단추 2px 축소 · 막힘은 아이콘만 fg-disabled(켬은 선 굵기 그대로)
끔켬
기본
호버(웹)
포커스(키보드)
누름
막힘
다크호버 = 누름 바탕(축소 없음) · 누름은 단추 2px 축소 · 막힘은 아이콘만 fg-disabled(켬은 선 굵기 그대로)
상태 — 기본 · 호버 · 포커스 · 누름 · 막힘 × 끔 · 켬

상태 — 끔

상태배경배율커서축소 시간축소 곡선icon 색링 두께링 간격링 색
enabled 기본transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—pointer——color-fg-neutral-muted #535866 · 다크 #B7BDCC — 흰 표면 위 7.11 · 다크 7.70 — 끔도 흐리게(불투명도) 두지 않는다. 모으기 단추(관심 · 고정)는 사선 없는 같은 아이콘, 기능 단추(눈 · 종)는 지금 상태의 아이콘(-off 짝). 상단 바 안에서는 끔도 fg-neutral(19B)———
hovered 웹 — 누름과 같은 바탕(v106), 축소는 없다color-bg-layer-default-pressed #F7F8FD · 다크 #353B4D—pointer——color-fg-neutral-muted #535866 · 다크 #B7BDCC — 흰 표면 위 7.11 · 다크 7.70 — 끔도 흐리게(불투명도) 두지 않는다. 모으기 단추(관심 · 고정)는 사선 없는 같은 아이콘, 기능 단추(눈 · 종)는 지금 상태의 아이콘(-off 짝). 상단 바 안에서는 끔도 fg-neutral(19B)———
focused 키보드 포커스에만 링transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—pointer——color-fg-neutral-muted #535866 · 다크 #B7BDCC — 흰 표면 위 7.11 · 다크 7.70 — 끔도 흐리게(불투명도) 두지 않는다. 모으기 단추(관심 · 고정)는 사선 없는 같은 아이콘, 기능 단추(눈 · 종)는 지금 상태의 아이콘(-off 짝). 상단 바 안에서는 끔도 fg-neutral(19B)2px2px — 보이는 40 바깥 — 키보드 포커스에만color-stroke-focus-ring #1A1F2E · 다크 #F5F6FA
pressed 누름 바탕 + 단추 전체 2px 거리 축소(v104) — 켬 · 끔은 손을 뗄 때 바뀐다color-bg-layer-default-pressed #F7F8FD · 다크 #353B4D — SEED bg.transparent-pressed 의 불투명 짝 — 켬 · 끔 같은 색단추 전체 2px 거리 축소 — 기준 40 — Feedback 의 눌림 피드백(v104). 모션 줄이기면 하지 않는다pointermotion-duration-pressed-scale 150msmotion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1)color-fg-neutral-muted #535866 · 다크 #B7BDCC — 흰 표면 위 7.11 · 다크 7.70 — 끔도 흐리게(불투명도) 두지 않는다. 모으기 단추(관심 · 고정)는 사선 없는 같은 아이콘, 기능 단추(눈 · 종)는 지금 상태의 아이콘(-off 짝). 상단 바 안에서는 끔도 fg-neutral(19B)———
disabled 전용 색(v106) — 아이콘만 fg-disabled, Tab 순서에서 빠진다transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—not-allowed — 누름 바탕 · 축소 없음——color-fg-disabled #8A91A0 · 다크 #838997 — 켬 · 끔 모두 — 켬은 선 2.5 를 그대로 둬 무엇이 켜져 있었는지 보인다———

상태 — 켬

상태배경배율커서축소 시간축소 곡선icon 색icon 선 굵기링 두께링 간격링 색
enabled 기본transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—pointer——color-fg-neutral #1A1F2E · 다크 #F5F6FA — 흰 표면 위 16.41 · 다크 13.42 — 끔(7.11 · 7.70)보다 짙다. 브랜드 색으로 칠하지 않는다2.5px — v106 — 켜짐 · 선택은 선 2.5. 앱은 lucide 굵기 글꼴 Lucide500 짝으로 낸다(코드로 선 굵기를 걸 수 없다 — 2026-10-15 구현 세션 질문 Q-010-3 정리, 2.5 는 2026-10-09 사용자 결정)———
hovered 웹 — 누름과 같은 바탕(v106), 축소는 없다color-bg-layer-default-pressed #F7F8FD · 다크 #353B4D—pointer——color-fg-neutral #1A1F2E · 다크 #F5F6FA — 흰 표면 위 16.41 · 다크 13.42 — 끔(7.11 · 7.70)보다 짙다. 브랜드 색으로 칠하지 않는다2.5px — v106 — 켜짐 · 선택은 선 2.5. 앱은 lucide 굵기 글꼴 Lucide500 짝으로 낸다(코드로 선 굵기를 걸 수 없다 — 2026-10-15 구현 세션 질문 Q-010-3 정리, 2.5 는 2026-10-09 사용자 결정)———
focused 키보드 포커스에만 링transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—pointer——color-fg-neutral #1A1F2E · 다크 #F5F6FA — 흰 표면 위 16.41 · 다크 13.42 — 끔(7.11 · 7.70)보다 짙다. 브랜드 색으로 칠하지 않는다2.5px — v106 — 켜짐 · 선택은 선 2.5. 앱은 lucide 굵기 글꼴 Lucide500 짝으로 낸다(코드로 선 굵기를 걸 수 없다 — 2026-10-15 구현 세션 질문 Q-010-3 정리, 2.5 는 2026-10-09 사용자 결정)2px2px — 보이는 40 바깥 — 키보드 포커스에만color-stroke-focus-ring #1A1F2E · 다크 #F5F6FA
pressed 누름 바탕 + 단추 전체 2px 거리 축소(v104) — 켬 · 끔은 손을 뗄 때 바뀐다color-bg-layer-default-pressed #F7F8FD · 다크 #353B4D — SEED bg.transparent-pressed 의 불투명 짝 — 켬 · 끔 같은 색단추 전체 2px 거리 축소 — 기준 40 — Feedback 의 눌림 피드백(v104). 모션 줄이기면 하지 않는다pointermotion-duration-pressed-scale 150msmotion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1)color-fg-neutral #1A1F2E · 다크 #F5F6FA — 흰 표면 위 16.41 · 다크 13.42 — 끔(7.11 · 7.70)보다 짙다. 브랜드 색으로 칠하지 않는다2.5px — v106 — 켜짐 · 선택은 선 2.5. 앱은 lucide 굵기 글꼴 Lucide500 짝으로 낸다(코드로 선 굵기를 걸 수 없다 — 2026-10-15 구현 세션 질문 Q-010-3 정리, 2.5 는 2026-10-09 사용자 결정)———
disabled 전용 색(v106) — 아이콘만 fg-disabled, Tab 순서에서 빠진다transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—not-allowed — 누름 바탕 · 축소 없음——color-fg-disabled #8A91A0 · 다크 #838997 — 켬 · 끔 모두 — 켬은 선 2.5 를 그대로 둬 무엇이 켜져 있었는지 보인다2.5px — v106 — 켜짐 · 선택은 선 2.5. 앱은 lucide 굵기 글꼴 Lucide500 짝으로 낸다(코드로 선 굵기를 걸 수 없다 — 2026-10-15 구현 세션 질문 Q-010-3 정리, 2.5 는 2026-10-09 사용자 결정)———

상태 — 브랜드 채움 위

상태배경배율커서축소 시간축소 곡선icon 색링 두께링 간격링 색
enabled 기본transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—pointer——color-static-white #FFFFFF — 켬 · 끔 모두 흰색 — 순자산 카드 그라디언트 위 Desk 8.38 ~ 14.78 · 다크 8.36 ~ 11.25(장식 빛 위 가장 낮은 자리 4.88). 켬 · 끔은 아이콘 모양과 굵기(2.5 · 2)로 가른다. 금액 가리기 눈(설정으로 가는 버튼)은 aria-pressed 가 없어 선 2 그대로 — eye · eye-off 모양만 바뀐다———
hovered 웹 — 누름과 같은 바탕(v106), 축소는 없다transparent — 브랜드 채움에는 누름 색 짝이 없다 — 축소만(Card 의 순자산 카드와 같다)—pointer——color-static-white #FFFFFF — 켬 · 끔 모두 흰색 — 순자산 카드 그라디언트 위 Desk 8.38 ~ 14.78 · 다크 8.36 ~ 11.25(장식 빛 위 가장 낮은 자리 4.88). 켬 · 끔은 아이콘 모양과 굵기(2.5 · 2)로 가른다. 금액 가리기 눈(설정으로 가는 버튼)은 aria-pressed 가 없어 선 2 그대로 — eye · eye-off 모양만 바뀐다———
focused 키보드 포커스에만 링transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—pointer——color-static-white #FFFFFF — 켬 · 끔 모두 흰색 — 순자산 카드 그라디언트 위 Desk 8.38 ~ 14.78 · 다크 8.36 ~ 11.25(장식 빛 위 가장 낮은 자리 4.88). 켬 · 끔은 아이콘 모양과 굵기(2.5 · 2)로 가른다. 금액 가리기 눈(설정으로 가는 버튼)은 aria-pressed 가 없어 선 2 그대로 — eye · eye-off 모양만 바뀐다2px2px — 보이는 40 바깥 — 키보드 포커스에만color-static-white #FFFFFF — 브랜드 채움 위 — stroke-focus-ring(#0147AD)은 채움(#0147AD → brand-900)에 묻힌다(라이트 1.00). 흰 링은 아이콘과 같은 8.38 ~ 14.78
pressed 누름 바탕 + 단추 전체 2px 거리 축소(v104) — 켬 · 끔은 손을 뗄 때 바뀐다transparent — 축소만 — 바탕은 칠하지 않는다단추 전체 2px 거리 축소 — 기준 40 — Feedback 의 눌림 피드백(v104). 모션 줄이기면 하지 않는다pointermotion-duration-pressed-scale 150msmotion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1)color-static-white #FFFFFF — 켬 · 끔 모두 흰색 — 순자산 카드 그라디언트 위 Desk 8.38 ~ 14.78 · 다크 8.36 ~ 11.25(장식 빛 위 가장 낮은 자리 4.88). 켬 · 끔은 아이콘 모양과 굵기(2.5 · 2)로 가른다. 금액 가리기 눈(설정으로 가는 버튼)은 aria-pressed 가 없어 선 2 그대로 — eye · eye-off 모양만 바뀐다———
disabled 전용 색(v106) — 아이콘만 fg-disabled, Tab 순서에서 빠진다transparent — 켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)—not-allowed — 누름 바탕 · 축소 없음——color-fg-disabled #8A91A0 · 다크 #838997 — 켬 · 끔 모두 — 켬은 선 2.5 를 그대로 둬 무엇이 켜져 있었는지 보인다———

모션

전환시간곡선대상비고
누름 · 호버 — 바탕motion-duration-color-transition 150msmotion-ease-easing cubic-bezier(0.35, 0, 0.35, 1)background-color
누름 — 단추motion-duration-pressed-scale 150msmotion-ease-pressed-scale cubic-bezier(0, 0, 0.15, 1)scale단추 전체 2px 거리 축소 — 모션 줄이기면 하지 않는다
켬 ↔ 끔 — 아이콘0ms—icon, stroke-width, color아이콘 · 굵기 · 색은 바로 바뀐다 — 손을 뗄 때(요청을 기다리지 않는다)

Guidelines

이름은 고정, 켬은 aria-pressed

이름은 단추가 켜고 끄는 것 하나로 두고 상태마다 바꾸지 않는다 — "관심 등록" 이 켜지면 "관심 등록, 눌림" 이다("관심 해제" 로 바꾸면 "관심 해제, 눌림" 처럼 이름과 상태가 겹쳐 읽힌다 — APG Button). 지금 상태를 이름에 넣지 않는다. 이름은 짧은 명사 · 동사구("관심 등록" · "App Key 보기")이고, 같은 줄에 단추가 여럿이면 줄 이름을 앞에 붙인다("장보기 목록 고정").

삼성전자 · 00593071,500원+850원(1.2%)

화면 읽기관심 등록, 토글 버튼, 눌림

이렇게 — 이름 '관심 등록' 은 그대로 — 켜지면 '눌림' 이 붙는다(APG)
삼성전자 · 00593071,500원+850원(1.2%)

화면 읽기관심 해제, 토글 버튼, 눌림

이렇게 하지 않는다 — 켜면 이름을 '관심 해제' 로 — '관심 해제, 눌림' 처럼 이름과 상태가 겹쳐 읽힌다
읽기 — "관심 등록, 눌림" · 이름이 바뀌는 "관심 해제, 눌림"

눈은 지금 상태

눈 아이콘은 늘 지금 상태다 — 가려져 있으면 eye-off, 보이면 eye. 누르면 할 일(가렸으면 eye · "금액 표시")을 그리지 않는다(사용자 결정 7A — 같은 화면에서 두 단추가 반대 아이콘을 보이던 것을 걷는다). App Key 보기는 키가 가려져 있으면 끔 · eye-off 다.

금액 가리기 눈은 Toggle 이 아니다

홈 · 자산 순자산 카드의 눈은 켜고 끄지 않는다 — 누르면 금액 가리기 설정의 그 화면 묶음(홈 · 자산)으로 간다. 2026-08-06 부터 가리기는 화면 · 카드 단위라 단추 하나로는 무엇을 가릴지 정할 수 없다. 그래서 aria-pressed 를 달지 않고 이름은 "금액 가리기 설정" 이다 — 낭독은 "금액 가리기 설정, 버튼" 이고 누르면 설정 화면이 열린다. 모양은 Toggle 의 상자(보이는 40 · 누르는 44 · 아이콘 20)와 표면 색(toggleVariants 의 tone)을 빌리고, 아이콘은 그 카드가 가려졌는지를 그린다(가렸으면 eye-off — 7A, 선은 2 그대로). 순자산 카드 위는 흰 아이콘만이다(21A). 폰 탭 첫 화면 · 데스크톱 머리에는 두지 않는다(2026-10-16 사용자 결정 — 구현 세션 질문 Q-017-2b A · Q-017-3c = Q-018-3 B).

순자산 · 2026년 10월
••••••원
홈 순자산 카드 — 가림
순자산 · 자산
42,898,100원
자산 순자산 카드 — 보임
이렇게 — 아이콘은 그 카드의 지금 상태 — 가렸으면 eye-off, 보이면 eye. 누르면 금액 가리기 설정(이름 '금액 가리기 설정' · aria-pressed 없음)
순자산 · 2026년 10월
••••••원
홈 순자산 카드 — 가림
순자산 · 자산
42,898,100원
자산 순자산 카드 — 보임
이렇게 하지 않는다 — 누르면 할 일을 그린다 — 가린 카드에 eye, 보이는 카드에 eye-off. 같은 화면에서 두 눈이 반대로 읽힌다(7A)
눈 — 홈 · 자산 순자산 카드, 아이콘은 그 카드의 지금 상태 · 누르면 설정

글 토글은 두지 않는다

글이 있는 켜고 끄기 단추(SEED Toggle Button · 옛 groo Toggle)는 두지 않는다(사용자 결정 8A). 켜고 끄기는 뜻에 따라 셋으로 나뉜다.

이런 자리쓰는 것
단추 하나가 한 상태를 그 자리에서 켜고 끈다(관심 · 고정 · 키 보기)Toggle(aria-pressed)
지금 상태를 그리되 누르면 다른 화면으로(순자산 카드의 금액 가리기 눈 → 설정)Toggle 의 상자를 빌린 버튼 — aria-pressed 없음
여럿 가운데 거르거나 고른다(계좌 거르기 · 알림 시각)Chip — 체크박스 · 라디오 의미
누르는 순간 적용되는 설정 줄Switch · List 의 스위치 줄
저장해야 적용되는 켜고 끄기 · 할 일 완료Checkbox
같은 내용을 2 ~ 4가지로 바로 다르게 본다Segmented Control
삼성전자 · 00593071,500원+850원(1.2%)
이렇게 — 단추 하나가 한 상태를 그 자리에서 켜고 끈다 — 관심 등록 · 고정 · 키 보기는 Toggle
국민 주계좌토스뱅크현대카드 M
이렇게 — 여럿 가운데 거르거나 고른다 — 계좌 거르기는 Chip(체크박스 · 라디오 의미)
예산 알림
카드 결제 알림
이렇게 — 누르는 순간 적용되는 설정 줄 — Switch
이렇게 하지 않는다 — 글이 있는 켜고 끄기 단추(옛 Toggle · SEED Toggle Button)로 거르기 — 고른 것인지 켠 것인지 헷갈린다
단추 하나는 아이콘 토글 · 거르기는 칩 · 설정은 스위치

요청 중에도 막지 않는다

누르면 아이콘이 바로 바뀌고 요청은 뒤에서 나간다 — 응답을 기다리며 단추를 막지 않는다(막으면 키보드 초점이 본문으로 빠진다). 실패하면 되돌리고 Snackbar critical 로 알린다 — "고정하지 못했어요. 다시 시도해주세요." + 액션 "다시 시도"(같은 요청을 다시 보낸다 · 액션이 있어 6초). 단추는 이미 옛 모습으로 돌아가 있어 카드에 오류 줄을 붙이지 않는다(사용자 결정 2026-10-09 20A — 카드 안 빨간 줄은 고르지 않았다). 빠르게 여러 번 누르면 마지막 상태만 남긴다.

바탕을 칠하지 않는다

켜졌다고 옅은 바탕 · 반전 상자를 깔지 않는다 — 흰 표면 위 옅은 바탕(1.08)은 보이지 않고, 반전은 상단 바에 짙은 네모를 만든다. 켬은 아이콘이 말한다.

코드

레시피 recipes/shadcn/components/ui/toggle.tsx 를 쓴다(<button type="button" aria-pressed> — Radix Toggle 로 짜도 된다). 아래 미리보기는 스펙 값으로 그린 모습이다.

  • Toggle — aria-label(필수 — 고정 이름) · pressed · defaultPressed · onPressedChange(pressed) · icon(끔일 때의 아이콘 — 필수) · pressedIcon(켬일 때의 아이콘 — 없으면 icon 그대로: 모으기 단추) · tone("default" 기본 · "inverted" — 브랜드 채움 위) · disabled, 나머지 <button> 속성(className · id …)은 단추에 간다. 아이콘의 크기(20) · 선 굵기(끔 2 · 켬 2.5) · 색은 단추가 건다 — 넘기는 아이콘에 size · strokeWidth 를 주지 않는다. onPressedChange 는 바로 부른다 — 요청을 기다리지 않는다. 감싼 쪽이 준 onClick(Tooltip · Help Bubble 의 asChild)을 먼저 부르고, 거기서 preventDefault() 하면 켜고 끄지 않는다 — ref 와 나머지 속성은 단추에 간다.

관심 등록 — 모으기 단추

삼성전자
71,500원 · +1.2%

화면 읽기관심 등록, 토글 버튼, 안 눌림

import { Star } from "lucide-react"
import { Toggle } from "@/components/ui/toggle"

<Toggle aria-label="관심 등록" pressed={watched} onPressedChange={setWatched} icon={<Star />} />

App Key 보기 — 기능 단추

가나증권 연결
App Key ••••••••••••••••

화면 읽기App Key 보기, 토글 버튼, 안 눌림

import { Eye, EyeOff } from "lucide-react"
import { Toggle } from "@/components/ui/toggle"

<Toggle aria-label="App Key 보기" pressed={shown} onPressedChange={setShown} icon={<EyeOff />} pressedIcon={<Eye />} />

메모 고정 — 바로 바꾸고 보낸다

메모
장보기 목록
우유 · 계란 · 두부 · 대파
제주 여행 준비
숙소 예약 · 렌터카 · 우산
부모님 선물
안마기 · 꽃바구니
다음 요청

고정을 누르면 아이콘이 바로 바뀌고 요청이 뒤에서 나가요 — 요청 중에도 단추를 막지 않아요.

import { Pin } from "lucide-react"
import { Toggle } from "@/components/ui/toggle"

<Toggle
  aria-label={`${memo.title} 고정`}
  pressed={memo.pinned}
  onPressedChange={(pinned) => setPinned(memo.id, pinned)} // 화면을 바로 바꾸고 보낸다 — 실패하면 되돌리고 스낵바
  icon={<Pin />}
/>

순자산 카드의 눈 — Toggle 이 아니다

순자산 · 2026년 10월
42,898,100원
총 자산 52,320,000원 · 총 부채 9,421,900원

화면 읽기금액 가리기 설정, 버튼

import { Eye, EyeOff } from "lucide-react"
import { toggleVariants } from "@/components/ui/toggle"

{/* 켜고 끄지 않는다 — 금액 가리기 설정의 이 화면 묶음으로 간다. aria-pressed 없음, 아이콘은 이 카드가 가려졌는지 */}
<button type="button" aria-label="금액 가리기 설정" className={toggleVariants({ tone: "inverted" })} onClick={() => openHideAmountsSettings("home")}>
  {hidden ? <EyeOff aria-hidden /> : <Eye aria-hidden />}
</button>

Behavior

인터랙션동작
Click / Tap켬 ↔ 끔 — 손을 뗄 때 아이콘이 바로 바뀌고 onPressedChange 를 부른다
Keyboard Space · Enter누르기와 같다
Keyboard Tab다음 포커스로
마우스 호버누름과 같은 바탕(축소 없음)
요청 중막지 않는다 — 다시 누를 수 있다. 실패하면 되돌리고 알린다
Disabled누르기 · 키보드 불가, Tab 순서에서 빠진다. 켬 · 끔 모양은 그대로(색만 fg-disabled)

Accessibility

기준검증
WCAG 1.4.11 Non-text contrast(≥ 3:1)끔 아이콘 fg-neutral-muted 흰 표면 7.11 · 다크 7.70(시트 6.67), 켬 fg-neutral 16.41 · 13.42, 누름 바탕 위 끔 6.70 · 5.93 · 켬 15.48 · 10.32 ✓. 순자산 카드 위 흰 아이콘 Desk 8.38 ~ 14.78 · 다크 8.36 ~ 11.25(장식 빛 위 4.88) ✓. 키보드 포커스 링 Desk 8.38 · 6.10 · HR 8.17 · 6.07 ✓
WCAG 1.4.1 Use of color켬 · 끔은 색과 함께 선 굵기(2 · 2.5)와 — 기능 단추는 — 아이콘 모양(사선)으로 갈린다. 보조 기술에는 aria-pressed 가 알린다 ✓
WCAG 4.1.2 Name, Role, Value<button> + 고정 이름 + aria-pressed ✓ — 이름을 상태마다 바꾸지 않는다
WCAG 2.4.7 Focus visible키보드 포커스에 링 2px · 띄움 2px
WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24)보이는 40 ✓
WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44)누르는 영역 44 × 44 ✓ — 보이는 40 둘레로 넓힌다
ARIA<button type="button" aria-pressed="true · false"> + aria-label(고정). 아이콘은 aria-hidden. 앱은 Semantics(button: true, toggled: …, label: …) — 라벨에 상태를 넣지 않는다
Reduced motion누름 축소를 뺀다 — 아이콘은 원래 바로 바뀐다

Do / Don't

✅ Do

  • 단추 하나가 한 상태를 그 자리에서 켜고 끌 때 쓴다 — 관심 · 고정 · 키 보기.
  • 이름은 고정하고 켬은 aria-pressed 로.
  • 아이콘은 지금 상태를 그린다 — 가렸으면 eye-off.
  • 다른 화면으로 가는 눈(금액 가리기 설정)은 aria-pressed 없는 버튼으로.
  • 모으기 단추(관심 · 고정)의 끔은 사선 없이, 기능 단추(눈 · 종)의 끔은 -off.
  • 누르면 바로 바꾸고, 실패하면 되돌려 알린다.

❌ Don't

  • 켬에 옅은 바탕 · 반전 상자를 깔기.
  • 상태마다 이름 바꾸기("관심 등록 ↔ 관심 해제") · 누르면 할 일을 아이콘으로 그리기.
  • 관심 · 고정의 끔을 사선(star-off · pin-off)으로 · 별을 채우기.
  • 글이 있는 켜고 끄기 단추 · 거르기에 Toggle 쓰기(Chip).
  • 요청 중에 단추를 막기.
  • 설정으로 가는 버튼에 Toggle · aria-pressed 쓰기 — "눌림" 이라 읽히고 화면이 바뀐다.
  • 보이는 크기를 40 보다 작게(지금 18 · 21 · 26 · 28 · 32 · 36).

Specification

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

Base

부위상태속성값
rootenabled크기size40pxButton medium · iconOnly 의 보이는 상자와 같다(기초 Iconography — 아이콘 버튼은 보이는 40)
모서리radiusradius-r28px누름 · 호버 바탕에만 보인다(Button medium 과 같다)
배경backgroundtransparent켬 · 끔에 따라 바뀌지 않는다 — 켜면 옅은 바탕(5B) · 반전(5C)은 고르지 않았다(사용자 결정 2026-10-09)
커서cursorpointer
터치 영역touchTarget44 × 44보이는 40 둘레로 2 씩 넓힌다(v106). AA ✓ · AAA ✓
전환 대상transitionPropertybackground-color
전환 시간transitionDurationmotion-duration-color-transition150ms
전환 곡선transitionEasingmotion-ease-easingcubic-bezier(0.35, 0, 0.35, 1)
이름name고정aria-label 은 상태마다 바꾸지 않는다("관심 등록" · "App Key 보기") — 켬은 aria-pressed 가 알린다(APG). 이름과 아이콘의 뜻이 반대로 읽히지 않게 아이콘은 지금 상태를 그린다. 설정으로 가는 금액 가리기 눈은 aria-pressed 없이 "금액 가리기 설정"
iconenabled아이콘size20pxlucide 선 아이콘 — v106 가운데 단계
roothovered배경backgroundbg-layer-default-pressed#F7F8FD다크 #353B4D
focusRingfocused링 두께width2px
링 색colorstroke-focus-ringDesk#0147AD다크 #7AA9F6HR#075B3C다크 #2ABE84
링 간격offset2px보이는 40 바깥 — 키보드 포커스에만
rootpressed배경backgroundbg-layer-default-pressed#F7F8FD다크 #353B4DSEED bg.transparent-pressed 의 불투명 짝 — 켬 · 끔 같은 색
배율scale단추 전체 2px 거리 축소기준 40 — Feedback 의 눌림 피드백(v104). 모션 줄이기면 하지 않는다
축소 시간scaleDurationmotion-duration-pressed-scale150ms
축소 곡선scaleEasingmotion-ease-pressed-scalecubic-bezier(0, 0, 0.15, 1)
rootdisabled커서cursornot-allowed누름 바탕 · 축소 없음
icondisabled색colorfg-disabled#8A91A0다크 #838997켬 · 끔 모두 — 켬은 선 2.5 를 그대로 둬 무엇이 켜져 있었는지 보인다

toggled=off

부위상태속성값
iconenabled색colorfg-neutral-muted#535866다크 #B7BDCC흰 표면 위 7.11 · 다크 7.70 — 끔도 흐리게(불투명도) 두지 않는다. 모으기 단추(관심 · 고정)는 사선 없는 같은 아이콘, 기능 단추(눈 · 종)는 지금 상태의 아이콘(-off 짝). 상단 바 안에서는 끔도 fg-neutral(19B)
선 굵기strokeWidth2pxlucide 기본

toggled=on

부위상태속성값
iconenabled색colorfg-neutral#1A1F2E다크 #F5F6FA흰 표면 위 16.41 · 다크 13.42 — 끔(7.11 · 7.70)보다 짙다. 브랜드 색으로 칠하지 않는다
선 굵기strokeWidth2.5pxv106 — 켜짐 · 선택은 선 2.5. 앱은 lucide 굵기 글꼴 Lucide500 짝으로 낸다(코드로 선 굵기를 걸 수 없다 — 2026-10-15 구현 세션 질문 Q-010-3 정리, 2.5 는 2026-10-09 사용자 결정)

tone=inverted

부위상태속성값
iconenabled색colorstatic-white#FFFFFF켬 · 끔 모두 흰색 — 순자산 카드 그라디언트 위 Desk 8.38 ~ 14.78 · 다크 8.36 ~ 11.25(장식 빛 위 가장 낮은 자리 4.88). 켬 · 끔은 아이콘 모양과 굵기(2.5 · 2)로 가른다. 금액 가리기 눈(설정으로 가는 버튼)은 aria-pressed 가 없어 선 2 그대로 — eye · eye-off 모양만 바뀐다
roothovered배경backgroundtransparent브랜드 채움에는 누름 색 짝이 없다 — 축소만(Card 의 순자산 카드와 같다)
focusRingfocused링 색colorstatic-white#FFFFFF브랜드 채움 위 — stroke-focus-ring(#0147AD)은 채움(#0147AD → brand-900)에 묻힌다(라이트 1.00). 흰 링은 아이콘과 같은 8.38 ~ 14.78
rootpressed배경backgroundtransparent축소만 — 바탕은 칠하지 않는다

SEED 와 다른 점

  • 아이콘만 있는 단추다 — SEED Toggle Button 은 글이 있는 알약(xsmall 32 · small 36 · 14 / 700)이고 디자인 문서가 없다(코드만). groo 는 글 토글을 두지 않는다 — 거르기는 Chip, 설정은 Switch 다.
  • 켬을 바탕으로 칠하지 않는다 — SEED brandSolid 는 끔이 주황 채움 · 켬이 회색 알약이고 neutralWeak 는 켬 · 끔 색이 같다(라벨 · 아이콘만 바뀐다). SEED Iconography 의 켬 = 채움(Fill)은 lucide 에 채움 모양이 없어 진한 색 + 선 2.5 로 대신한다(v106).
  • 모으기 단추의 끔은 사선 없이 — SEED Iconography 는 끔을 Line + Slash 로 적었지만 하트 단추(Reaction · Image Frame Reaction Button)는 끔을 사선 없는 선으로 둔다. groo 는 모으기(관심 · 고정)는 사선 없이, 기능(눈 · 종)은 -off 로 나눴다.
  • 이름은 고정 — SEED 예제는 켜면 라벨도 바꾼다("미선택" ↔ "선택됨"). groo 는 APG 대로 이름을 두고 aria-pressed 만 바꾼다.
  • 누르는 영역 44 — SEED 32 · 36 · 하트 40.
  • 막힘은 진짜 disabled(Tab 에서 빠진다 — Button 과 같다). SEED 는 aria-disabled(포커스가 남는다)다. 불러오는 중(loading)은 두지 않는다 — 누르면 바로 바뀐다.

Migration notes

2026-10-16 — 금액 가리기 눈은 Toggle 이 아니다

금액 가리기 눈은 2026-08-06 부터 실제 제품에서 켜고 끄지 않고 금액 가리기 설정으로 간다(가리기는 화면 · 카드 단위). 이 스펙은 그 눈을 켜고 끄는 단추로 적어 왔다 — 사용자가 구현 질문 Q-017 · Q-018 비교 페이지에서 데스크톱 머리의 눈을 빼고(Q-017-3c = Q-018-3 B) 폰은 순자산 카드의 눈 그대로(Q-017-2b A)로 정해, 눈을 Toggle 목록에서 빼고 "금액 가리기 눈은 Toggle 이 아니다" 를 더했다. 모양 결정(7A 지금 상태 · 21A 흰 아이콘만)은 그대로 산다. 19B(상단 바에서는 끔도 진한 색)는 상단 바에 켜고 끄는 단추를 둘 때의 규칙으로 남는다.

  • Desk 웹 · 앱 — 순자산 카드 눈(웹 DashboardPage.tsx:1185 · 2186 · AssetPage.tsx:1678 · 1972, 앱 dashboard_screen.dart:561 · asset_screen.dart:648)의 이름을 "금액 가리기 설정" 으로, aria-pressed · 앱 toggled 는 달지 않는다. 데스크톱 머리의 눈(GrooTopBar.tsx:44-52)은 걷는다.

2026-10-09 — 켜고 끄는 아이콘 단추로 다시 쓴다

사용자가 입력 비교 페이지에서 정했다 — 아이콘만 바뀐다(5A — 바탕 그대로, 켬 = 진한 색 + 선 2.5, 보이는 40 · 누르는 44 · 이름 고정 + aria-pressed), 모으기 단추(관심 · 고정)의 끔은 사선 없이(6B — 기초 Iconography 에 한 줄을 더했다), 눈은 지금 상태(7A — 가렸으면 eye-off, 이름 "금액 가리기" 고정), 글 토글은 두지 않는다(8A — Toggle 스펙은 아이콘 토글 단추가 되고 default · outline 28 · 32 · 40 은 걷는다). 그리고 "따라오는 것" — 할 일 완료 원은 Checkbox, 앱 PToggle 3곳은 칩 · Select 로, HR 테마 단추 이름 한국어, 요청 중에도 막지 않는다. 켜면 옅은 바탕(5B) · 반전(5C) · 모으기 단추도 사선(6A) · 누르면 할 일을 그리는 눈(7B) · SEED Toggle Button(8B) · 지금 groo Toggle(8C)은 고르지 않았다. 스펙을 쓰다 나온 것(같은 비교 페이지 19 ~ 22) — 상단 바에서는 끔도 진한 색(19B — 굵기 · 아이콘으로만 가른다), 실패는 되돌린 뒤 스낵바 + "다시 시도"(20A), 순자산 카드 위는 흰 아이콘만(21A), 일정 알림 다섯은 여럿 고르는 Select(22A). Toggle 규칙 그대로의 흐린 끔(19A) · 카드 안 빨간 줄(20B) · 늘 흰 12% 원(21B) · 칩 다섯(22B)은 고르지 않았다. 옛 스펙은 toggle.history/v-pre-seed-input.* 에 남겼다.

옛 Toggle새 Toggle
글 · 아이콘 단추 — default · outline × 28 · 32 · 40, 12 / 600 · 모서리 8아이콘만 — 보이는 40 · 누르는 44 · 아이콘 20
켬 = surface-input 바탕 + text-primary(끔 + 호버와 같은 모양, 흰 위 1.08) · outline 은 border-strong바탕은 그대로 — 켬 = 아이콘 fg-neutral + 선 2.5, 끔 = fg-neutral-muted + 선 2
막힘 불투명도 0.5아이콘 fg-disabled
쓰임 — 툴바 · 필터 칩 · 보기단추 하나 켜고 끄기(관심 · 고정 · 가리기 · 보기) — 거르기는 Chip, 설정은 Switch, 보기는 Segmented Control

제품은 앱 적용 단계에서 옮긴다(2026-10-09 조사 — Desk 웹은 크로미움에 띄워 쟀고, Desk 앱은 위젯 테스트 · 코드로 봤다). 켜고 끄는 단추가 웹 10여 곳 · 앱 5곳에 저마다 다른 크기 · 이름 규칙으로 있다.

  • 관심 별 — 웹 종목 머리 38(features/stock/ui/stock-row.tsx:307-345)은 이름이 "관심 등록 ↔ 관심 해제" 로 바뀌면서 aria-pressed 도 달아 "관심 해제, 눌림" 으로 겹쳐 읽히고(D12), 켜면 노랑 바탕 + 채운 별이다. 앱(features/stocks/presentation/toss_stocks_view.dart:1413-1436)은 InkWell 이라 이름 · 상태가 없다(D14). "관심 등록" 고정 + aria-pressed · star 선 2 · 2.5 로.
  • 금액 가리기 눈 — 웹 상단 바 36(widgets/layout/ui/GrooTopBar.tsx:44-52 — 동작 이름) · 홈 히어로 28 · 모바일 26(pages/dashboard/ui/DashboardPage.tsx:1167-1186 · 2168-2187 — title 만) · 자산 18(pages/asset/ui/AssetPage.tsx:1666-1679 · 1971-1974) · 자산 상세 바닥(widgets/asset-full/ui/AssetDetailDialog.tsx:2352-2361 — 글 "보기 · 숨기기", 동작 아이콘) · 설정(pages/settings/ui/SettingsPage.tsx:1007-1016) — 상태 알림이 0이고 아이콘 뜻이 둘이다(상단 · 홈 · 자산은 상태, 자산 상세 · 비밀값은 동작 — D12). 앱은 홈 26 + 동작 이름 툴팁 · 자산 18 이름 0(features/dashboard/presentation/dashboard_screen.dart:544-567 · features/asset/presentation/asset_screen.dart:643-656, D14). 모두 "금액 가리기" + aria-pressed + 지금 상태 아이콘으로, 크기는 40(상단 바 44 · 24, 순자산 카드 tone="inverted").
  • 비밀값 보기 — 웹 32 "App Key 보기" 고정 + aria-pressed 는 모범이지만 아이콘이 누르면 할 일이다(features/subscription/ui/SecretField.tsx:47-66). 앱 32 는 켬 상태가 없다(features/subscription/presentation/broker_connect_card.dart:341-357). 40 · 지금 상태 아이콘으로.
  • 메모 고정 해제 — 웹 고정 메모 카드에만 아이콘 13 + 여백 4 ≈ 21(pages/memo/ui/MemoPage.tsx:473-503)이고 고정은 편집기 스위치 · 스와이프로만 한다. 카드의 고정 토글 40 으로 — 고정 · 해제를 같은 단추로(Card 의 고정 버튼).
  • 할 일 완료 원 — 웹 22 · 이름 "완료 ↔ 완료 취소" + aria-pressed · 요청 중 막힘(pages/todo/ui/TodoPage.tsx:388-397 · TodoMobileLedger.tsx:558-566, D12)은 켜고 끄는 단추가 아니라 할 일의 값이다 — Checkbox(이름에 할 일 제목)로.
  • 글 토글 — 웹 Toggle 1곳은 가계부 계좌 거르기 3상태(고름 → 빼고 → 해제, features/expense/ui/FilterDialog.tsx:326-355)이고 "빼고" 가 aria-pressed=false 라 해제와 같게 읽힌다 · outline 켬 테두리 클래스(toggle-variants.ts:23 의 border-border-default-strong)는 정의되지 않아 그려지지 않는다(D10). 앱 PToggle 3곳 — 일정 반복 5 · 알림 5(features/calendar/presentation/calendar_event_dialog.dart:580-616)와 계좌 거르기(features/expense/presentation/filter_dialog.dart:518-560 — "빼고" 는 GestureDetector)는 라벨을 두 번 읽고 단추가 아니라 켬 · 끔 컨트롤로 읽힌다(shared/widgets/p_toggle.dart:60-64, D13). 계좌 거르기는 Chip(고른 것만 · 고른 것 빼고 — 2026-10-02), 반복은 Select(10-01), 알림 다섯은 여럿 고르는 Select(Chip 은 2 ~ 4)로.
  • 할 일 미리보기 ↔ 편집 — 앱 GestureDetector(아이콘 12 + 글 ≈ 26, features/todo/presentation/todo_edit_dialog.dart:257-282)는 이름 · 상태가 없다(D14) — 같은 내용을 두 가지로 보는 자리라 Segmented Control("편집 · 미리보기")로.
  • HR 테마 단추 — "Toggle theme"(영어) · 상태 0(shared/ui/mode-toggle/ModeToggle.tsx:25-42, D21). 머리는 걷고 테마는 설정으로 간다(2026-10-04 화면 틀) — 남는 동안 이름을 한국어로.
  • aria-pressed 를 다른 뜻으로 쓰는 곳 — 웹 검색 목록 줄(shared/ui/searchable-list.tsx:140 — 고르기는 option · aria-selected, Searchable List)과 Chip(shared/ui/chip.tsx:73 — 칩은 라디오 · 체크박스, Chip)은 그 스펙대로 걷는다.

2026-10-09 — Toggle Group 을 걷는다

사용자가 같은 비교 페이지에서 정했다(9A) — 하나 고르기는 Segmented Control(같은 내용을 2 ~ 4가지로 바로 다르게 보기) · Chip(2 ~ 4개 짧은 폼 값), 여럿 고르기는 Chip, 5개 이상은 Select 다. 아이콘 묶음 전용으로 남기기(9B)는 고르지 않았다. 서식 툴바(굵게 · 기울임)는 네 제품 어디에도 없어 Toggle Group 이 맡을 자리가 남지 않았다. 옛 스펙은 toggle-group.history/v-pre-seed-input.* 에 남겼다.

지금 묶음은 Desk 웹 ToggleGroup 9곳 · 앱 PToggle 나열 1곳 · HR 붙은 단추 1곳이다(2026-10-09 조사). 웹 묶음은 끔 칸의 경계가 없고(1.0) 켬이 흰 위 1.08 · 다크 1.3 이며, 묶음 이름이 0/9 이고, 라디오로 읽히는데 화살표가 고르지 않는다(shared/ui/toggle-variants.ts:20-21, D11).

자리지금가는 곳
카테고리 예산 금액 제안(widgets/budget-manage/ui/BudgetEditDialog.tsx:234-247) · 월 예산 150 · 200 · 250 · 300만원(:313-326)하나 고르기 알약 — 프리셋과 다른 값이면 아무것도 안 골라진다Chip 제안 — 누르면 금액을 넣는 버튼, 고른 표시 없음
일정 반복(widgets/calendar/ui/EventForm.tsx:592-610)하나 고르기 — 반복 없음 · 매일 · 매주 · 매월 · 매년Select — 5개(2026-10-01)
일정 알림(EventForm.tsx:623-641)여럿 고르기 — 5분 전 · 15분 전 · 30분 전 · 1시간 전 · 1일 전, 고르면 체크 12여럿 고르는 Select — 5개(Chip 은 2 ~ 4). 칸에는 "15분 전, 1일 전", 넘치면 "15분 전 외 2개"(사용자 결정 2026-10-09 22A — 칩 다섯은 고르지 않았다)
구독 결제 주기(features/subscription/ui/SubscriptionDialog.tsx:255-268)월 · 연 segmented 28Segmented Control — 같은 가격을 다르게 본다
반복 거래 요일(features/recurring-transaction/ui/RecurringAddDialog.tsx:656-670 · RecurringFromTxDialog.tsx:185-199)하나 고르기 7열 알약Select — 7개(2026-10-01)
은행 · 증권사 고르기(widgets/asset-full/ui/AssetEditDialog.tsx:1159-1196 · 1206-1239)기관 색으로 채우는 알약Searchable List — 분류 머리 + Logo Tile 줄(2026-10-08)
앱 일정 반복 · 알림(features/calendar/presentation/calendar_event_dialog.dart:580-616)PToggle 을 늘어놓았다 — 묶음 의미 0, 라벨을 두 번 읽는다웹과 같다 — Select · 여럿 고르는 Select
HR 캘린더 보기(features/calendar/ui/header/calendar-header.tsx:36-87)일 · 주 · 월 · 년 · 일정 다섯이 붙은 아이콘 단추 — 이름 "View by day …" 영어 · 고른 상태 0(D21)HR 적용 때 넷으로 줄여 Segmented Control, 다섯이면 Select — 이름은 한국어. 보기를 메뉴로 두지 않는다(Menu 는 실행만)
앱 PToggleGroupSingle · PToggleGroupMultiple(shared/widgets/p_toggle.dart:130-260)쓰는 곳 0(D28)걷는다

이전 기록

  • 2026-05 — preview 에 맞춤. shadcn toggle.tsx 의 text-sm · h-9 px-3 · 호버 muted 를 preview .tg(12 / 600 · 토큰 여백 · surface-input 켬 · outline 켬 border-strong)에 맞췄다. 이번에 글 토글째 걷었다.

이 페이지