Playground로 바로 이동
Components

Number Input

정확한 숫자를 직접 입력하거나 증감 버튼으로 조절하는 컴포넌트입니다. 범위와 증감 단위가 있는 수량, 순서와 비율 입력에 사용합니다.

명세 문서 보기

🚩 Playground

Style, Size, Layout, 숫자 범위와 증감 동작을 조합하여 확인합니다.

Appearance

Style

Size

Control size

Layout

Width behavior
Text alignment

State

Preview state

Content

Behavior

Show controls
Controls position
Allow negative

Anatomy

Number Input을 구성하는 실제 요소와 문서에서 사용하는 명칭입니다.

  1. 1.Container
  2. 2.Prefix(Optional)
  3. 3.Input field
  4. 4.Suffix(Optional)
  5. 5.Decrease button(Optional)
  6. 6.Increase button(Optional)

Properties · Style

Input과 동일한 Outline과 회색조 Filled 두 스타일을 사용합니다.

Outline

Filled

Properties · Size

Input과 Button이 공유하는 공통 Control Height를 그대로 사용합니다.

Small · 32px

Regular · 36px · Default

Large · 40px

XLarge · 48px

Properties · Layout

Fill은 부모 너비를 채우고, Fixed는 지정한 너비를 유지하되 부모보다 넓어지지 않습니다.

Fill · Default

Fixed · 200px

Properties · Text alignment

숫자를 왼쪽 또는 오른쪽에 정렬합니다. 기본값은 Left이며 Split controls에서는 Center가 우선합니다.

Left · Default

Right

Properties · Prefix / Suffix

숫자의 앞이나 뒤에 통화 기호, 단위처럼 값의 의미를 보완하는 요소를 표시할 수 있습니다.

Prefix

숫자 앞에 표시하며 Secondary 또는 Tertiary 위계를 선택할 수 있습니다.

Secondary

Tertiary

Suffix

숫자 뒤에 표시하며 Secondary 또는 Tertiary 위계를 선택할 수 있습니다.

Secondary

%

Tertiary

%

Properties · Behavior

숫자 범위, 증감 단위와 버튼 표시 여부를 제어합니다.

Min / Max

입력하고 조절할 수 있는 최소값과 최대값을 설정할 수 있습니다.

Step

증감 버튼을 누를 때 변경되는 단위를 설정할 수 있습니다. 기본값은 1입니다.

Trailing controls

증감 버튼을 숫자 오른쪽에 함께 배치할 수 있습니다.

Split controls

감소 버튼과 증가 버튼을 숫자 양쪽에 나누어 배치할 수 있습니다.

Controls hidden

증감 버튼을 숨기고 숫자를 직접 입력하는 방식으로 사용할 수 있습니다.

Negative allowed

최소값이 0보다 작을 때 음수 입력을 허용할 수 있습니다.

Properties · State

값은 고정하지만 입력, 증감 버튼의 Focus와 Pressed 피드백은 실제로 확인할 수 있습니다.

Default

Focus

Invalid

Disabled

Read only

Examples

확인된 Number Input 동작을 실제 입력 목적에 맞게 조합한 예시입니다.

Quantity

최소 1개부터 최대 99개까지 한 개 단위로 조절합니다.

Percentage

0%부터 100%까지 5% 단위로 조절합니다.

%

Direct input

증감 동작이 필요하지 않은 정확한 숫자를 직접 입력합니다.

Guidelines

컴포넌트를 고르고 값을 정할 때의 기준입니다.

증감 버튼 위치를 한 페이지에서 섞지 않기

수량

인원

수량

인원

Do

한 페이지의 Number Input은 같은 증감 버튼 배치를 사용하세요.

Don’t

한 화면에서 Trailing과 Split을 섞지 마세요.

  • controlsPositiontrailingsplit 중 하나를 페이지 전체에서 일관되게 사용합니다.
  • 같은 화면에 두 배치가 함께 있으면 어느 버튼이 어느 값을 조절하는지 눈으로 좇기 어려워집니다.

음수는 필요한 자리에서만 허용하기

Min 0 · Default

Allow negative · Min -100

  • allowNegative의 기본값이 false이므로 유효한 최소값은 0입니다.
  • 이 컴포넌트가 담당하는 수량과 순서와 비율에는 음수가 필요하지 않습니다. 증감이나 온도차처럼 음수가 값의 일부인 자리에서만 켭니다.

증감 단위를 값의 성격에 맞추기

Step 1 · Default

Step 5

%
  • step의 기본값은 1이며, 값이 실제로 움직이는 단위가 다르면 페이지마다 조정합니다.
  • 수량은 1, 비율은 5나 10, 금액은 1000처럼 한 번 누를 때 의미가 있는 크기를 사용합니다.

숫자의 의미는 Prefix와 Suffix로 보완하기

Prefix · ₩

Suffix · %

%
  • 숫자 앞뒤에 값의 의미를 보완하는 짧은 요소를 둘 수 있습니다. 통화 기호는 앞에 오므로 prefix, 백분율과 단위는 뒤에 오므로 suffix에 둡니다.
  • 한 줄 Control의 높이를 바꾸지 않는 짧은 요소만 둡니다. 증감 버튼이 Leading과 Trailing 자리를 사용하므로 Number Input은 그 두 요소를 제공하지 않습니다.

Input과 Number Input을 나눠 쓰기

Input

Number Input

Do

자리 구분이 필요한 금액은 Input으로 표기를 만드세요.

Don’t

자리 구분이 필요한 값에 Number Input을 쓰지 마세요.

  • 수량, 순서, 비율처럼 더하고 빼고 비교하는 값은 Number Input이 담당합니다.
  • 숫자로 보이지만 계산하지 않는 전화번호와 사업자번호, 그리고 금액처럼 자리 구분이 필요한 값은 Input이 담당합니다.
  • Number Input은 값에 구분자를 담을 수 없어 자릿수를 눈으로 세야 합니다. 담게 만들면 키보드 화살표 증감과 범위 검증과 폼 제출값을 함께 잃습니다.

Property map

현재 구현에서 확인되는 Property와 허용 값을 정리합니다.

PropertyValuesDefaultStatus
variantoutline | filledoutlineConfirmed
controlSizesmall | regular | large | xlargeregularConfirmed
layoutfill | fixedfillConfirmed
textAlignleft | rightleftSplit controls use center
valuenumber | undefinedundefinedConfirmed
min / maxnumberundefinedConfirmed
stepnumber1Confirmed
prefix / suffixReactNodeundefinedConfirmed
prefixTone / suffixTonesecondary | tertiarysecondaryConfirmed
hideControlsbooleanfalseConfirmed
controlsPositiontrailing | splittrailingConfirmed
allowNegativebooleanfalseConfirmed
statedefault | focus | invalid | disabled | readOnlydefaultNative attributes and focus

명세 문서

docs/system/components/number-input.md

Number Input

packages/ui/src/number-input.tsx

정확한 숫자를 직접 입력하거나 증감 버튼으로 조절하는 공용 컴포넌트다. Input의 구조와 oe semantic token을 사용한다.

Anatomy

  1. Container: Input과 동일한 외곽, Style, Size와 상태를 소유한다.
  2. Prefix: 선택 요소다. 숫자 앞에 짧은 기호나 단위를 표시한다.
  3. Input field: 숫자를 직접 입력하는 필수 요소다.
  4. Suffix: 선택 요소다. 숫자 뒤에 짧은 기호나 단위를 표시한다.
  5. Decrease button: 선택 요소다. 현재 값에서 step만큼 감소한다.
  6. Increase button: 선택 요소다. 현재 값에서 step만큼 증가한다.

증감 버튼은 Remix Icon의 Subtract/Add Line을 사용하며 공용 Small 16px 아이콘 토큰을 참조한다.

증감 버튼은 Hover와 keyboard Focus에서 Bottom center 툴팁을 표시한다. 국문 툴팁은 짧은 의미명 감소 / 증가, 접근 가능한 이름은 동작 대상을 포함한 값 줄이기 / 값 늘리기를 사용한다.

Properties

  • variant (Style): outline | filled, 기본값 outline
  • controlSize (Size): small | regular | large | xlarge, 기본값 regular
  • layout: fill | fixed, 기본값 fill
  • textAlign (Text alignment): left | right, 기본값 left. Split controls에서는 중앙 정렬이 우선
  • value, defaultValue: number | undefined
  • min, max: 허용 범위
  • step: 기본값 1
  • prefix, suffix: 숫자 앞뒤에 표시하는 선택 요소, 기본값 undefined
  • prefixTone, suffixTone: 각각 secondary | tertiary, 기본값 secondary
  • hideControls: 기본값 false
  • controlsPosition: trailing | split, 기본값 trailing
  • allowNegative: 기본값 false
  • decreaseLabel, increaseLabel: 증감 버튼의 접근 가능한 이름
  • decreaseTooltip, increaseTooltip: 증감 버튼의 tooltip 문구
  • onValueChange: 값이 바뀔 때 호출한다
  • onLimitReached: 범위 경계에 도달할 때 min | max를 전달한다
  • State: Default, Focus, Invalid, Disabled, Read only

Style, Size, Layout, Focus, Invalid와 Disabled 외곽은 별도 시각 구현을 만들지 않고 공용 Input을 재사용한다. Filled는 Neutral secondary background를 사용하고 Focus에서는 Input과 동일하게 기본 surface로 전환한다.

Number Input의 숫자는 항상 tabular-nums를 사용한다. 증감 Controls가 필요 없는 숫자 입력도 별도 Input의 numeric Property를 만들지 않고 hideControls=true인 Number Input으로 표현한다.

Disabled는 foreground와 background 위계를 낮추고 상호작용을 제한하되, Outline 스타일에서는 기본 Neutral border를 유지한다. Filled 스타일은 기존의 투명 border 구조를 유지한다.

allowNegative가 기본값 false이므로 유효한 최소값은 min0 중 큰 값이다. 음수가 필요한 자리에서만 allowNegative를 켠다. 직접 입력과 증감 버튼 모두 이 최소값과 max 범위 안으로 제한한다. 증감 시도값이 범위를 넘으면 경계값을 유지하고 onLimitReachedmin | max를 전달한다.

prefixsuffix는 공용 Input의 동일한 Slot을 재사용하며 숫자의 앞뒤에 통화 기호, 비율, 단위처럼 값의 의미를 보완하는 짧은 요소를 표시한다. prefixTonesuffixTone은 서로 독립적으로 Secondary 또는 Tertiary foreground 위계를 선택하며 기본값은 Secondary다. Percentage 예시는 % Suffix를 사용한다.

controlsPosition=trailing은 Decrease와 Increase button을 숫자 오른쪽에 함께 배치한다. split은 Decrease button을 왼쪽, Increase button을 오른쪽에 배치하고 숫자를 중앙 정렬한다. hideControls=true이면 두 버튼을 모두 표시하지 않고 숫자 직접 입력만 제공한다. 현재 값이 유효한 Min에 도달하면 Decrease button, Max에 도달하면 Increase button을 비활성화한다. Number Input 전체가 Disabled 또는 Read only이면 두 버튼을 함께 비활성화한다.

Small, Regular와 Large에서 버튼 터치 영역은 24px이다. XLarge에서는 외곽 높이에 맞춰 각 버튼을 32px로 키우고, 두 버튼을 오른쪽에 함께 표시할 때 버튼 사이 간격을 4px로 확대한다. 아이콘 자체는 공용 Small 16px을 유지한다.

Guidelines

증감 버튼 위치를 한 페이지에서 섞지 않기

controlsPositiontrailingsplit 중 하나를 페이지 전체에서 일관되게 사용한다. 같은 화면에 두 배치가 함께 있으면 어느 버튼이 어느 값을 조절하는지 눈으로 좇기 어려워진다.

음수는 필요한 자리에서만 허용하기

allowNegative의 기본값은 false이므로 유효한 최소값은 0이다. 이 컴포넌트가 담당하는 수량과 순서와 비율에는 음수가 필요하지 않기 때문이다. 증감과 온도차처럼 음수가 값의 일부인 자리에서만 켠다.

증감 단위를 값의 성격에 맞추기

step의 기본값은 1이다. 값이 실제로 움직이는 단위가 다르면 페이지마다 조정한다. 수량은 1, 비율은 5나 10, 금액은 1000처럼 한 번 누를 때 의미가 있는 크기를 사용한다.

숫자의 의미는 Prefix와 Suffix로 보완하기

prefixsuffix는 공용 Input의 동일한 Slot을 재사용하며 숫자의 앞뒤에 통화 기호, 비율, 단위처럼 값의 의미를 보완하는 짧은 요소를 표시한다. 통화 기호는 숫자 앞에 오므로 Prefix에 두고, 백분율과 단위는 숫자 뒤에 오므로 Suffix에 둔다.

한 줄 Control의 높이를 바꾸지 않는 짧은 요소만 둔다. Leading element와 Trailing element는 증감 버튼이 사용하므로 Number Input에서는 제공하지 않는다.

Input과 Number Input을 나눠 쓰기

계산에 쓰이는 숫자는 Number Input을 사용한다. 수량, 순서, 비율처럼 더하고 빼고 비교하는 값이다. 숫자로 보이지만 계산하지 않는 식별자는 Input을 사용한다. 전화번호, 사업자번호, 카드번호가 여기에 해당한다.

자리 구분이 필요한 값도 Input을 사용한다. Number Input은 type="number"라 값에 구분자를 담을 수 없어 자릿수를 눈으로 세야 하고, 이를 바꾸면 키보드 화살표 증감과 native 범위 검증과 폼 제출값을 함께 잃는다. 금액처럼 구분자를 보여야 하는 값은 Input에서 표기를 만든다.

확인된 예시

  • Quantity: 1–99 범위, Step 1
  • Percentage: 0–100 범위, Step 5
  • Direct input: Controls 숨김
  • Negative allowed: 음수 범위와 감소 동작 허용