SEED 컴포넌트는 눌렸을 때 요소가 살짝 줄어드는 Scale Feedback을 기본으로 제공합니다. 작은 아이콘 버튼과 뷰포트 좌우를 채우는 버튼의 눌린 느낌이 같도록 만들기 위해, 축소 배율을 요소마다 다르게 계산합니다. 직접 만든 컴포넌트에도 같은 효과를 적용할 수 있습니다.
@theme이 아니라 @utility에 등록하세요. @theme 항목은 :root에서 값이
확정되므로 요소가 자기 크기에서 계산한 배율이 도달하지 못합니다. 클래스는
생성되는데 축소만 일어나지 않습니다.
트랜지션은 같은 방식으로 묶을 수 없습니다. transition-* 유틸리티는 Tailwind 자신의 duration과 timing function을 함께 적용해서 --seed-feedback-scale-transition에 담긴 값을 덮어버립니다. 위처럼 arbitrary property 문법을 그대로 사용하세요.
theme.extend.scale이 아니라 addUtilities에 등록하세요. Tailwind CSS 3의
scale-* 유틸리티는 개별 scale 속성이 아니라
transform에 scaleX(), scaleY()를 얹는 방식이므로, 같은 요소의 다른
transform과 충돌합니다.
트랜지션은 같은 방식으로 묶을 수 없습니다. transition-* 유틸리티는 Tailwind 자신의 duration과 timing function을 함께 적용해서 --seed-feedback-scale-transition에 담긴 값을 덮어버립니다. 위처럼 arbitrary property 문법을 그대로 사용하세요.
myButton.css.ts
import { style } from "@vanilla-extract/css";import { feedbackScale, feedbackScaleTransition,} from "@seed-design/css/scale-feedback";import { vars } from "@seed-design/css/vars";export const myButton = style({ backgroundColor: vars.$color.bg.brandSolid, transition: `background-color 0.2s, ${feedbackScaleTransition}`, selectors: { "&:active": { scale: feedbackScale, }, },});
SEED 컴포넌트는 상호작용 가능한 요소에 호버할 때 색상을 변경하고, 마우스 왼쪽 버튼을 누르고 있는 동안 Scale Feedback을 적용합니다. 일관성을 위해 커스텀 컴포넌트에서도 이 기준을 유지하는 것을 권장합니다. 자세한 내용은 Interaction States 문서를 참고하세요.
:active는 비활성 상태의 요소에도 적용됩니다. 비활성 상태를 다루는 컴포넌트라면 선택자에서 제외하세요. SEED 컴포넌트는 :disabled, [disabled], [data-disabled]를 제외하고 있습니다.
SEED 컴포넌트는 축소를 transform: scale()이 아니라 개별 transform 속성인 scale로 적용합니다. 커스텀 컴포넌트에서도 scale을 사용하세요.
transform은 shorthand라서 한 요소에 하나의 값만 가집니다. 축소를 여기에 적으면 그 요소의 이동이나 회전을 같은 값에 함께 써야 하고 변형을 추가할 때마다 축소 값을 다시 챙겨야 합니다. 개별 scale은 translate, rotate와 독립적으로 동작해서 이런 부담이 없고 ScaleFeedback이 이미 scale을 사용하므로 축소가 한 속성에 모입니다.
개별 scale 속성은 Chrome 104, Safari 14.1, Firefox 72부터 지원됩니다. 이보다
낮은 버전에서는 축소만 나타나지 않고 나머지 스타일은 그대로 동작합니다.
두 단계를 모두 적용하면 아래와 같이 동작합니다. 크기가 다른 두 요소를 눌러 비교해 보세요.
scale 값이 있는 요소는 stacking context이자 position: fixed 자손의 containing block이 되므로, 이 요소 안에 position: fixed 요소가 있다면 뷰포트가 아니라 이 요소를 기준으로 배치됩니다.
ScaleFeedback이 적용된 요소는 눌리지 않은 상태에서도 scale: 1을 유지하므로, 누르는 동안 자손이 따라 움직이지는 않습니다. 다만 배치 기준 자체가 뷰포트와 달라지므로 scale을 적용한 요소 하위에 position: fixed 자손이 있다면 의도한 위치에 표시되는지 확인하세요.