Groo Design

Scroll Fog

스크롤되는 영역의 끝을 흐려 뒤에 더 있다는 것을 알린다 — 가로로 넘기는 칩 줄, 시트 · 대화상자의 긴 본문, 바닥 고정 버튼이 있는 긴 화면. 색을 덮는 막이 아니라 투명도 마스크라 어느 바탕에서도 맞고, 스크롤 위치와 상관없이 늘 켜져 있다.

구조는 당근 SEED Scroll Fog(Apache-2.0)를 따른다 — 스크롤 상자에 거는 마스크(gradient-fade-mask 16단계, v104), 기본 깊이 20, 흐린 쪽에 그 깊이만큼 여백, 늘 켜짐. 값은 groo 토큰이고, SEED 와 다른 자리는 맨 아래 "SEED 와 다른 점" 에 적었다(2026-10-03 사용자 결정). groo 에 처음 두는 부품이다 — 시트 · 대화상자의 "본문이 넘칠 때만 아래 48 흐림"(2026-10-02)을 이 규칙이 대신한다.

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

9:41
가계부
전체식비교통쇼핑카페구독의료여행
  • 점심 식사식비 · 현대카드 M−12,000원
  • 스타벅스카페 · 현대카드 M−5,600원
  • 지하철교통 · 국민 체크카드−1,450원
  • 월급수입 · 토스뱅크 통장+3,200,000원
  • 편의점식비 · 현금−4,300원
9:41
가계부
  • 점심 식사식비 · 현대카드 M−12,000원
  • 스타벅스카페 · 현대카드 M−5,600원
  • 지하철교통 · 국민 체크카드−1,450원
  • 월급수입 · 토스뱅크 통장+3,200,000원
  • 편의점식비 · 현금−4,300원
  • 영화문화 · 국민 체크카드−15,000원
카테고리 고르기
  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
9:41
가계부
전체식비교통쇼핑카페구독의료여행
  • 점심 식사식비 · 현대카드 M−12,000원
  • 스타벅스카페 · 현대카드 M−5,600원
  • 지하철교통 · 국민 체크카드−1,450원
  • 월급수입 · 토스뱅크 통장+3,200,000원
  • 편의점식비 · 현금−4,300원
9:41
가계부
  • 점심 식사식비 · 현대카드 M−12,000원
  • 스타벅스카페 · 현대카드 M−5,600원
  • 지하철교통 · 국민 체크카드−1,450원
  • 월급수입 · 토스뱅크 통장+3,200,000원
  • 편의점식비 · 현금−4,300원
  • 영화문화 · 국민 체크카드−15,000원
카테고리 고르기
  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
칩 필터 줄 · 카테고리 고르기 시트 — 라이트 · 다크

직접 골라 보기

자리(가로 줄 · 시트 본문 · 바닥 버튼 화면 · 상자) · 바탕 색을 고르고 스크롤하면 스펙대로 그린 흐림과 그 코드가 바뀐다. 처음 · 가운데 · 끝 어디서나 흐림이 그대로인 것을 볼 수 있다.

좌우 20 · 여백 24 — 지금 처음, 흐림은 그대로(빈 여백 위)
자리 use
바탕
모드

흐림은 색을 덮지 않는 마스크라 바탕이 바뀌어도 그대로다. 스크롤해 보면 처음 · 가운데 · 끝 어디서나 흐림이 켜져 있고, 처음 · 끝에서는 깊이만큼의 빈 여백 위에 놓인다.

import { Chip, ChipGroup } from "@/components/ui/chip"

{/* 칩 줄은 따로 켜지 않는다 — layout="scroll" 이면 늘 좌우 흐림 */}
<ChipGroup layout="scroll" aria-label="카테고리">
  {categories.map((c) => <Chip key={c}>{c}</Chip>)}
</ChipGroup>

Anatomy

  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
처음위 여백 20 — 흐림 20 은 빈 여백 위
  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
끝까지 스크롤아래 여백 80 — 흐림 80 은 빈 여백 위
ⓐ Scroll Area — 마스크를 거는 스크롤 상자ⓑ Fog — 가장자리에서 깊이만큼 투명 → 불투명ⓒ Padding — 흐린 쪽에 깊이 이상
스크롤 상자 · 흐림(깊이) · 여백 — 처음 · 끝에서는 흐림이 빈 여백 위에 놓인다
부위설명
ⓐ Scroll Area스크롤 상자 — 넘친 내용이 이 안에서 스크롤된다. 마스크를 이 상자에 건다. 스크롤바 · 초점 · 이름 규칙은 Scroll Area.
ⓑ Fog흐림 — 정한 쪽 가장자리에서 깊이만큼 투명에서 불투명으로.
ⓒ Padding여백 — 흐린 쪽에 깊이 이상.

부위

부위설명
root스크롤 상자 — 넘친 내용이 이 안에서 스크롤된다. 마스크를 이 상자에 건다
fog흐림 — 정한 쪽 가장자리에서 깊이만큼 투명 → 불투명
content안쪽 — 흐린 쪽에 깊이 이상의 여백

Properties

마스크 — 색이 아니다

gradient-fade-mask(알파 0 → 1, 16단계)를 스크롤 상자에 mask-image 로 건다 — 흐린 쪽마다 상자 전체 크기의 층 하나에 방향을 붙이고(단계는 그 쪽 깊이에 맞춰 깊이 안에서 불투명에 닿는다) 겹친 층을 곱한다(mask-composite: intersect, SEED 와 같다). 상자가 두 깊이의 합보다 낮아도 양 끝이 함께 흐리다. 바탕색을 덧칠하지 않으므로 흰 면 · 회색 바탕 · 다크 어디서나 같은 값이다. 내용이 흐려질 뿐 그 위에 무엇을 얹지 않아, 흐린 자리의 칩 · 줄도 그대로 눌린다.

전체식비교통쇼핑카페구독의료여행
흰 면
전체식비교통쇼핑카페구독의료여행
회색 바탕
전체식비교통쇼핑카페구독의료여행
다크
이렇게 — 마스크 — 내용의 투명도만 바꾼다. 바탕색을 덧칠하지 않아 어느 바탕에서도 같은 값이고, 흐린 자리의 칩도 그대로 눌린다
전체식비교통쇼핑카페구독의료여행
흰 면
전체식비교통쇼핑카페구독의료여행
회색 바탕
전체식비교통쇼핑카페구독의료여행
다크
이렇게 하지 않는다 — 색 막 — 흰색 그라디언트를 덮어 흐린다. 바탕이 바뀌면(회색 바탕 · 다크) 흰 띠가 보이고, 막이 칩을 덮어 누르기를 가로챈다
같은 흐림이 흰 면 · 회색 바탕 · 다크에서 — 색 막(바탕색 그라디언트)은 바탕이 바뀌면 띠가 보인다

공통

속성값비고
마스크gradient-fade-mask색을 덮지 않는 마스크(mask-image) — 흐린 쪽마다 방향을 붙여 하나씩 겹친다(mask-composite: intersect). 바탕색과 상관없이 맞고 라이트 · 다크 같다. 누르기를 막지 않는다
크기20px기본 깊이 — SEED 의 최소 20

Use — 자리마다 방향 · 깊이

자리use방향깊이 · 여백
칩 필터 바 · 제안 칩 줄 · Chip Tabs · 가로 카드 줄row좌 · 우흐림 20 · 여백은 화면 여백 24
시트 · 대화상자 · 팝오버 · Side Panel 의 넘칠 수 있는 본문overlayBody위 · 아래위 20 · 아래 80
바닥 고정 버튼이 있는 화면 전체 스크롤page위 · 아래위 20 · 아래 80 — 바닥 버튼 위에서 끝난다
카드 · 상자 안의 높이를 정한 스크롤box (기본)넘치는 방향의 양 끝20

SEED 의 권장 그대로다 — 가로 스크롤은 좌우 20(정보가 촘촘해 깊게 흐리지 않는다), 세로 스크롤은 위 20 · 아래 80(아래가 깊어야 더 있다는 것이 잘 보인다), 그 밖은 최소 20.

전체식비교통쇼핑카페구독의료여행
row가로 줄 — 칩 필터 바 · 제안 칩 줄 · Chip Tabs · 가로 카드 줄. 좌 · 우
카테고리 고르기
  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
overlayBody시트 · 대화상자 · 팝오버의 넘칠 수 있는 본문(목록 · 긴 폼 · 데이터에 따라 길어지는 내용). 위 · 아래
약관 동의

가계부는 입력한 거래를 기기와 서버에 함께 저장해요. 서버에 저장한 거래는 같은 계정으로 들어온 기기에서 볼 수 있어요.

카드 · 계좌를 연결하면 거래를 하루에 한 번 불러와요. 불러온 거래는 직접 고치거나 지울 수 있어요.

이용을 해지하면 계정은 남고 거래 기록은 30일 뒤 지워요. 그 사이에 다시 들어오면 그대로 쓸 수 있어요.

알림은 설정에서 종류마다 끌 수 있어요. 예산 알림은 정한 기준에 닿을 때 한 번만 보내요.

내보내기는 CSV 로 받을 수 있어요. 받은 파일에는 메모와 태그도 함께 들어가요.

page바닥 고정 버튼이 있는 화면 전체 스크롤(긴 폼 · 약관 · 가져오기 결과). 위 · 아래 — 바닥 버튼 위에서 끝난다

가계부는 입력한 거래를 기기와 서버에 함께 저장해요. 서버에 저장한 거래는 같은 계정으로 들어온 기기에서 볼 수 있어요.

카드 · 계좌를 연결하면 거래를 하루에 한 번 불러와요. 불러온 거래는 직접 고치거나 지울 수 있어요.

이용을 해지하면 계정은 남고 거래 기록은 30일 뒤 지워요. 그 사이에 다시 들어오면 그대로 쓸 수 있어요.

알림은 설정에서 종류마다 끌 수 있어요. 예산 알림은 정한 기준에 닿을 때 한 번만 보내요.

내보내기는 CSV 로 받을 수 있어요. 받은 파일에는 메모와 태그도 함께 들어가요.

box(기본)기본 — 카드 · 상자 안의 높이 · 폭을 정한 스크롤(긴 설명 · 카드 안 목록). 넘치는 방향의 양 끝
자리마다 — 칩 줄 좌우 20 · 시트 본문 위 20 아래 80 · 바닥 버튼 화면 · 상자 20

자리

use세로 넘침넘칠 때fog 크기fog 흐리는 쪽content 여백content 좌우 여백content 위 여백content 아래 여백content 스크롤 여유설명
box (기본)auto — 가로로 넘치면 overflowX — 흐림도 그 방향——넘치는 방향의 양 끝 — 세로 스크롤은 위 · 아래, 가로 스크롤은 좌 · 우20px — 흐린 쪽 — 깊이와 같게. 다른 쪽은 놓인 자리의 여백 그대로———20px — 흐린 쪽 — 키보드로 옮긴 요소가 흐림 아래 멈추지 않게기본 — 카드 · 상자 안의 높이 · 폭을 정한 스크롤(긴 설명 · 카드 안 목록). 넘치는 방향의 양 끝
row—auto — 한 줄 가로 스크롤 — 스크롤바는 숨긴다20px — 좌우 20(SEED Chip Tabs 와 같다)좌 · 우—spacing-global-gutter 24px — 화면 여백 24 — 흐림 20 보다 넓어 처음 · 끝의 칩은 흐리지 않는다(Chip 의 가로 스크롤 줄 · Chip Tabs 목록과 같은 값). 바깥에 포커스 링을 그리는 내용(칩)이면 위아래에도 링 자리를 둔다 — ChipGroup 은 위아래 6 여백 · 바깥 −6. 두지 않으면 스크롤 상자가 링을 자른다——spacing-global-gutter 24px — 키보드로 칩을 옮겨도 여백 안에 멈춘다가로 줄 — 칩 필터 바 · 제안 칩 줄 · Chip Tabs · 가로 카드 줄. 좌 · 우
overlayBodyauto—위 20px · 아래 80px — SEED Bottom Sheet 의 권장 — 아래가 깊어 더 있다는 것이 잘 보인다위 · 아래——20px — 머리 아래 — 머리 아래 여백(16)은 그대로 두고 본문 안에 더한다80px — 끝까지 내려도 마지막 줄이 흐림 아래 남지 않는다 — 바닥 버튼 위위 20px · 아래 80px — 키보드로 옮긴 칸이 흐림 아래 멈추지 않게시트 · 대화상자 · 팝오버의 넘칠 수 있는 본문(목록 · 긴 폼 · 데이터에 따라 길어지는 내용). 위 · 아래
pageauto—위 20px · 아래 80px — SEED 의 화면 전체 세로 스크롤 권장 — 위는 머리(상단 바) 아래, 아래는 바닥 고정 버튼 위에서 끝난다위 · 아래——20px — 머리 아래 — 화면 머리 ↔ 제목 여백(spacing-nav-to-title 20)과 같다80px — 바닥 고정 버튼 위 — 화면 아래 여백(spacing-screen-bottom 56) 대신 80위 20px · 아래 80px — 키보드로 옮긴 칸이 흐림 아래 멈추지 않게바닥 고정 버튼이 있는 화면 전체 스크롤(긴 폼 · 약관 · 가져오기 결과). 위 · 아래 — 바닥 버튼 위에서 끝난다

State

상태모습
enabled늘 켜짐 — 스크롤 위치 · 넘침과 상관없이

Guidelines

늘 켜 둔다

스크롤을 시작하고 멈출 때마다 흐림이 나타났다 사라지면 화면이 깜빡인다(SEED). 그래서 흐림은 스크롤 위치 · 넘침을 재지 않고 늘 켜 둔다 — 처음 · 끝에 닿아도 그대로다. 넘친 쪽만 흐리는 방식은 두지 않는다(사용자 결정).

전체식비교통쇼핑카페구독의료여행
처음
전체식비교통쇼핑카페구독의료여행
가운데
전체식비교통쇼핑카페구독의료여행
끝
이렇게 — 처음 · 가운데 · 끝 어디서나 그대로 — 처음 · 끝에서는 흐림이 빈 여백(24) 위에 놓여 칩이 흐려지지 않는다
전체식비교통쇼핑카페구독의료여행
처음 — 오른쪽만
전체식비교통쇼핑카페구독의료여행
가운데 — 양쪽
전체식비교통쇼핑카페구독의료여행
끝 — 왼쪽만
이렇게 하지 않는다 — 넘친 쪽만 흐린다 — 스크롤을 시작하고 멈출 때마다 흐림이 나타났다 사라져 화면이 깜빡인다
처음 · 가운데 · 끝 — 흐림은 그대로, 끝에서는 빈 여백 위

깊이만큼 여백

흐린 쪽에는 깊이 이상의 여백을 둔다 — 끝까지 스크롤했을 때 마지막 줄 · 칩이 흐림 아래 남지 않고, 흐림은 빈 여백 위에 놓인다. 깊이를 정하면 그것이 그쪽의 최소 여백이다(SEED). 키보드로 옮긴 요소도 흐림 아래 멈추지 않게 스크롤 여유를 같은 만큼 둔다.

카테고리 고르기
  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
이렇게 — 끝까지 내리면 아래 흐림 80 은 빈 여백(80) 위 — 마지막 줄 "주거" 가 다 보인다
카테고리 고르기
  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
이렇게 하지 않는다 — 여백 없이 흐린다 — 끝까지 내려도 마지막 줄이 흐림 아래 남아 옅게 보이고, 키보드로 옮긴 줄도 흐림 아래 멈춘다
아래 여백 80 · 여백 없이 흐림에 덮인 마지막 줄

어디에 거나

넘칠 수 있는 영역에 건다 — 가로로 넘기는 줄, 목록 · 긴 폼처럼 길이가 데이터에 따라 늘어나는 시트 · 대화상자 본문, 바닥 고정 버튼 위로 스크롤되는 긴 화면. 걸 자리인지는 내용의 종류로 미리 정한다 — 넘쳤는지 재서 켜고 끄지 않는다.

  • 칸 두셋처럼 늘 들어맞는 시트 · 대화상자 본문에는 걸지 않는다 — 스크롤이 생기지 않으니 아래 80 이 빈자리만 늘린다.
  • 탭 바 위의 목록 화면 · 일반 페이지 스크롤에는 걸지 않는다 — 화면 끝이 곧 영역의 끝이고, 탭 바 위 80 이 늘 흐려진다. 탭 바 위 목록은 아래 여백으로 마지막 줄을 바 위에 올린다(Bottom Navigation 의 "본문 아래 여백").
  • 부품이 제 안개를 가진 자리 — Wheel Picker 의 위아래(min(40%, 3칸)) · Date Picker 이어지는 달의 아래 96 · Side Navigation 내용의 아래 24 — 는 그 스펙을 따른다. 겹쳐 걸지 않는다.
  • 흐림은 힌트일 뿐이다 — 스크롤 · 키보드 스크롤 · 초점 이동은 그대로 둔다. 가로 줄만 스크롤바를 숨긴다 — 세로 스크롤바는 전역 한 벌 그대로다(Scroll Area, 2026-10-10).
전체식비교통쇼핑카페구독의료여행
카테고리 고르기
  • 식비
  • 교통
  • 쇼핑
  • 카페
  • 구독
  • 의료
  • 여행
  • 주거
이렇게 — 넘칠 수 있는 영역 — 가로로 넘기는 칩 줄, 데이터에 따라 길어지는 시트 본문(목록)
메모 이름 바꾸기
이름장보기 목록
이렇게 하지 않는다 — 칸 두셋뿐인 시트 본문 — 스크롤이 생기지 않는데 아래 80 이 빈자리만 늘린다
9:41
가계부
  • 점심 식사식비 · 현대카드 M−12,000원
  • 스타벅스카페 · 현대카드 M−5,600원
  • 지하철교통 · 국민 체크카드−1,450원
  • 월급수입 · 토스뱅크 통장+3,200,000원
  • 편의점식비 · 현금−4,300원
  • 영화문화 · 국민 체크카드−15,000원
이렇게 하지 않는다 — 탭 바 위의 목록 화면 — 화면 끝이 곧 영역의 끝이라 탭 바 위 80 이 늘 흐려진다
거는 자리 · 걸지 않는 자리 — 칩 줄 · 긴 시트 본문 · 짧은 폼 · 탭 바 위 목록

코드

레시피 recipes/shadcn/components/ui/scroll-fog.tsx 를 쓴다. 아래 미리보기는 스펙 값으로 그린 모습이다.

  • ScrollFog — use("box" 기본 · "row" · "overlayBody" · "page")가 방향 · 깊이 · 안쪽 여백 · 스크롤 여유를 정한다. 이 상자가 곧 스크롤 상자다 — 높이 · 폭은 부르는 쪽이 정하고, 그 밖은 div 속성. 안쪽 여백은 안쪽 감싸개에 둔다(흐림 아래에 여백이 깔리게).
  • 시트 · 대화상자 · 팝오버의 본문은 scrollFog 를 주어 켠다 — DialogBody · BottomSheetBody · ResponsiveDialogBody · PopoverBody, use="overlayBody" 와 같다.
  • 칩 줄(ChipGroup layout="scroll")과 ChipTabsList 는 늘 row 흐림이다 — 따로 켜지 않는다.

시트 · 대화상자 본문 — 긴 목록

거래 추가
import { ResponsiveDialogBody } from "@/components/ui/dialog"
import { ListRadioGroup, ListRadioItem } from "@/components/ui/list"

{/* 길이가 데이터에 따라 늘어나는 목록 — 위 20 · 아래 80 흐림과 같은 여백 */}
<ResponsiveDialogBody scrollFog className="px-0">
  <ListRadioGroup value={categoryId} onValueChange={setCategoryId} aria-label="카테고리">
    {categories.map((c) => <ListRadioItem key={c.id} value={c.id} title={c.name} />)}
  </ListRadioGroup>
</ResponsiveDialogBody>

칩 줄 · 상자

가계부는 입력한 거래를 기기와 서버에 함께 저장해요. 서버에 저장한 거래는 같은 계정으로 들어온 기기에서 볼 수 있어요.

카드 · 계좌를 연결하면 거래를 하루에 한 번 불러와요. 불러온 거래는 직접 고치거나 지울 수 있어요.

이용을 해지하면 계정은 남고 거래 기록은 30일 뒤 지워요. 그 사이에 다시 들어오면 그대로 쓸 수 있어요.

알림은 설정에서 종류마다 끌 수 있어요. 예산 알림은 정한 기준에 닿을 때 한 번만 보내요.

내보내기는 CSV 로 받을 수 있어요. 받은 파일에는 메모와 태그도 함께 들어가요.

import { ScrollFog } from "@/components/ui/scroll-fog"

{/* 칩 줄은 따로 켜지 않는다 — layout="scroll" 이면 늘 좌우 20 */}
<ChipGroup layout="scroll" aria-label="필터">…</ChipGroup>

{/* 카드 안 높이를 정한 스크롤 — 넘치는 방향 양 끝 20 */}
<ScrollFog className="max-h-60" tabIndex={0} role="region" aria-label="이용 약관">
  <p>{terms}</p>
</ScrollFog>

Behavior

인터랙션동작
스크롤흐림은 그대로 — 내용만 지나간다
처음 · 끝흐림이 빈 여백 위에 놓인다 — 사라지지 않는다
누르기흐린 자리의 내용도 눌린다 — 마스크는 누르기를 막지 않는다
키보드Tab 으로 옮긴 요소가 흐림 밖에 보이게 스크롤한다(스크롤 여유 — 가로 줄 24 · 본문 위 20 · 아래 80)
모션 줄이기움직임이 없다 — 그대로

Accessibility

기준검증
WCAG 1.4.3 Color contrast(글자 ≥ 4.5:1)흐림 안의 글은 옅어진다 — 깊이만큼 여백이 있어 어떤 글도 흐림 안에 머물지 않는다(스크롤하면 흐림 밖으로 온다) ✓
WCAG 2.4.11 Focus Not Obscured — Minimum(AA)스크롤 여유를 깊이만큼 둬 키보드 초점이 흐림 아래 멈추지 않는다 ✓
WCAG 2.1.1 Keyboard스크롤 상자는 키보드로 스크롤된다 — 안에 초점 가는 요소가 없으면 상자에 tabindex="0" · role="region" 과 이름을 준다(Scroll Area — 역할 없는 div 에는 이름을 달 수 없다) ✓
WCAG 2.5.8 Target Size — Minimum(AA ≥ 24×24)흐림 자체는 누르는 것이 아니다 — 해당 없음(흐린 자리의 칩 · 줄은 그대로 눌린다)
WCAG 2.5.5 Target Size — Enhanced(AAA ≥ 44×44)해당 없음
ARIA흐림은 장식 — 역할 · 이름이 없다

Do / Don't

✅ Do

  • 가로 칩 줄 · 넘칠 수 있는 시트 본문 · 바닥 버튼 위 긴 화면에.
  • 늘 켜 두고, 흐린 쪽에 깊이만큼 여백.
  • 마스크로 — 바탕색이 바뀌어도 그대로.

❌ Don't

  • 스크롤 위치에 따라 흐림을 켜고 끄기 · 넘친 쪽만 흐리기.
  • 바탕색 그라디언트를 덮어 흐리기(색 막) — 바탕이 바뀌면 띠가 보인다.
  • 여백 없이 흐려 마지막 줄을 흐림 아래 남기기.
  • 칸 두셋뿐인 본문 · 탭 바 위 목록 화면에.
  • 부품이 제 안개를 가진 자리(Wheel Picker · Date Picker 이어지는 달)에 겹쳐 걸기.

Specification

scroll-fog.yaml 의 규칙을 하나도 빼지 않고 조건마다 그린다 — 웹 · 앱이 Scroll Fog 를 만들 때 이 값을 그대로 쓴다. 조건이 없는 Base 가 모든 조합에 걸리고, 뒤의 규칙이 앞의 같은 값을 덮는다.

Base

부위상태속성값
fogenabled크기size20px기본 깊이 — SEED 의 최소 20
마스크maskgradient-fade-masklinear-gradient(#00000000 0%, #00000003 8%, #00000005 16%, #0000000d 22%, #00000014 29%, #00000021 35%, #0000002e 41%, #00000040 47%, #00000052 53%, #00000066 59%, #0000007a 65%, #00000094 71%, #000000ab 78%, #000000c7 84%, #000000e3 92%, #000000ff 100%)색을 덮지 않는 마스크(mask-image) — 흐린 쪽마다 방향을 붙여 하나씩 겹친다(mask-composite: intersect). 바탕색과 상관없이 맞고 라이트 · 다크 같다. 누르기를 막지 않는다

use=box

부위상태속성값
rootenabled세로 넘침overflowYauto가로로 넘치면 overflowX — 흐림도 그 방향
fogenabled흐리는 쪽placement넘치는 방향의 양 끝세로 스크롤은 위 · 아래, 가로 스크롤은 좌 · 우
contentenabled여백padding20px흐린 쪽 — 깊이와 같게. 다른 쪽은 놓인 자리의 여백 그대로
스크롤 여유scrollPadding20px흐린 쪽 — 키보드로 옮긴 요소가 흐림 아래 멈추지 않게

use=row

부위상태속성값
rootenabled넘칠 때overflowXauto한 줄 가로 스크롤 — 스크롤바는 숨긴다
fogenabled크기size20px좌우 20(SEED Chip Tabs 와 같다)
흐리는 쪽placement좌 · 우
contentenabled좌우 여백paddingXspacing-global-gutter24px화면 여백 24 — 흐림 20 보다 넓어 처음 · 끝의 칩은 흐리지 않는다(Chip 의 가로 스크롤 줄 · Chip Tabs 목록과 같은 값). 바깥에 포커스 링을 그리는 내용(칩)이면 위아래에도 링 자리를 둔다 — ChipGroup 은 위아래 6 여백 · 바깥 −6. 두지 않으면 스크롤 상자가 링을 자른다
스크롤 여유scrollPaddingspacing-global-gutter24px키보드로 칩을 옮겨도 여백 안에 멈춘다

use=overlayBody

부위상태속성값
rootenabled세로 넘침overflowYauto
fogenabled크기size위 20px · 아래 80pxSEED Bottom Sheet 의 권장 — 아래가 깊어 더 있다는 것이 잘 보인다
흐리는 쪽placement위 · 아래
contentenabled위 여백paddingTop20px머리 아래 — 머리 아래 여백(16)은 그대로 두고 본문 안에 더한다
아래 여백paddingBottom80px끝까지 내려도 마지막 줄이 흐림 아래 남지 않는다 — 바닥 버튼 위
스크롤 여유scrollPadding위 20px · 아래 80px키보드로 옮긴 칸이 흐림 아래 멈추지 않게

use=page

부위상태속성값
rootenabled세로 넘침overflowYauto
fogenabled크기size위 20px · 아래 80pxSEED 의 화면 전체 세로 스크롤 권장 — 위는 머리(상단 바) 아래, 아래는 바닥 고정 버튼 위에서 끝난다
흐리는 쪽placement위 · 아래
contentenabled위 여백paddingTop20px머리 아래 — 화면 머리 ↔ 제목 여백(spacing-nav-to-title 20)과 같다
아래 여백paddingBottom80px바닥 고정 버튼 위 — 화면 아래 여백(spacing-screen-bottom 56) 대신 80
스크롤 여유scrollPadding위 20px · 아래 80px키보드로 옮긴 칸이 흐림 아래 멈추지 않게

SEED 와 다른 점

  • 자리마다 방향 · 깊이를 정해 둔다(use) — SEED 는 숫자 권장(기본 20 · 세로 위 20 · 아래 80 · 가로 20 · 또는 영역의 15 ~ 20%)만 두고 쓰는 쪽이 고른다. groo 는 비율로 정하는 안을 두지 않는다 — 자리마다 정한 깊이가 웹 · 앱을 같은 값으로 묶고, 비율로 정하면 같은 자리도 상자 높이에 따라 깊이가 달라진다(남은 규칙 R5 — 그대로, 2026-10-22 https://claude.ai/artifact/Mag1tEv51MdQHdy1o8hY3L).
  • 가로 줄의 여백은 화면 여백 24 — 흐림 20 보다 넓어 처음 · 끝 칩은 흐리지 않는다(SEED Chip Tabs 예제는 20).
  • 키보드 초점이 흐림 아래 가려지지 않게 스크롤 여유를 깊이만큼 둔다 — SEED 는 정하지 않았다.
  • 시트 · 대화상자 본문의 흐림도 이 규칙이다 — SEED Dialog 의 안의 흐림(넘칠 때만 아래 48)은 따르지 않는다.

Migration notes

2026-10-08 — 마스크를 쪽마다 한 층 + intersect 로(레시피)

YAML 은 "흐린 쪽마다 하나씩 겹친다(mask-composite: intersect)" 인데 레시피는 처음 흐림 · 가운데 불투명 · 끝 흐림 세 층을 겹치지 않게 이어 붙였다(mask-composite 기본 add). 상자가 두 깊이의 합(overlayBody 는 100)보다 낮으면 가운데 층이 0 이 되고 두 흐림이 겹친 자리에서 더해져 덜 흐렸다. 레시피 · 예제 · 미리보기를 YAML · SEED 대로 바꿨다 — 흐린 쪽마다 상자 전체 크기의 층 하나(단계는 그 쪽 깊이의 몫), 두 층을 곱한다(-webkit-mask-composite 는 옛 이름 source-in). 그보다 큰 상자의 모습은 그대로다. 사용자 결정 — 비교 페이지 6.

2026-10-03 — 새로 둔다(SEED Scroll Fog)

사용자가 비교 페이지에서 정했다 — SEED 의 늘 켜진 마스크(gradient-fade-mask, v104), 가로 좌우 20 · 세로 위 20 · 아래 80(기본 20), 그 깊이만큼 여백. 넘친 쪽만 흐리는 안(가로 20 · 세로 48)은 고르지 않았다. 그래서 2026-10-02 의 대화상자 · 팝오버 규칙 "본문이 넘칠 때만 아래 48 흐림"(Dialog · Popover)을 이 규칙으로 바꿨고, Chip · Chip Tabs 의 "끝 흐림은 Scroll Fog 차례에" 는 row 흐림이 됐다.

제품은 앱 적용 단계에서 옮긴다(2026-10-03 조사). 세 제품 모두 끝 흐림이 없다 — 칩 필터 줄 · 2차 탭은 잘린 채 끝나고, 시트 · 대화상자의 긴 본문은 넘쳐도 알리지 않는다.

  • 앱 적용 때 화면마다 정할 자리 — 넘칠 수 있는 시트 · 대화상자 본문(거래 상세 · 카테고리 고르기 · 반복 거래 목록), 바닥 고정 버튼이 있는 긴 화면(가져오기 · 약관).

이 페이지