컴포넌트

Input

한 줄의 텍스트를 입력합니다.

설치

pnpm dlx ply-ui add input field icon

공통 설치 설정을 먼저 적용합니다.

사용법

입력 이름은 label 또는 Field.Label로 연결합니다. variant는 표면, controlSize는 높이입니다. 기본값은 standardlg입니다.

Standard

variant="standard" — 투명한 배경과 테두리를 사용합니다. 기본값입니다.

Contrast

variant="contrast" — 배경 대비를 높인 입력 영역입니다.

Utility

variant="utility" — 배경과 테두리가 없는 입력 영역입니다.

크기

controlSize로 높이를 지정합니다. 기본값은 lg입니다. HTML의 size는 글자 수에 따른 너비이므로 구분해서 사용합니다.

비활성

disabled는 입력과 포커스 이동을 막습니다.

읽기 전용

readOnly는 값을 수정하지 못하게 합니다. 값 선택과 복사는 가능합니다.

오류

Field.Rootinvalid로 오류 상태를 지정합니다. 같은 Root 안의 Input과 Field.Error는 오류 상태와 설명을 공유합니다.

앞쪽 아이콘

leading에 아이콘이나 내용을 넣습니다. 입력과 아이콘을 감싸는 요소는 Input이 구성합니다.

뒤쪽 아이콘

trailing에 아이콘이나 내용을 넣습니다. 입력과 아이콘을 감싸는 요소는 Input이 구성합니다.

속성

이 프로젝트에서 추가하거나 제한한 속성입니다.

Input

속성

타입

구현 코드

components/ui/input.tsx
input.tsx
"use client";
import type { ComponentProps, ReactNode } from "react";
import { Input as Primitive } from "@base-ui/react/input";
import { withClassName } from "../../lib/cx";
import "./input.css";

export type InputProps = ComponentProps<typeof Primitive> & {
  /** native size(글자 수)와 달리 컨트롤 높이를 정합니다. @defaultValue "lg" */
  controlSize?: "xs" | "sm" | "md" | "lg";
  /** 입력 영역의 배경과 테두리 표현입니다. @defaultValue "standard" */
  variant?: "standard" | "contrast" | "utility";
  /** 입력 영역 앞에 표시할 아이콘이나 내용입니다. */
  leading?: ReactNode;
  /** 입력 영역 뒤에 표시할 아이콘이나 내용입니다. */
  trailing?: ReactNode;
};
/** Base UI는 입력/Field 연동, 외부 래퍼는 아이콘과 테두리만 담당합니다. ref는 input에 전달됩니다. */
export function Input({
  controlSize = "lg",
  variant = "standard",
  leading,
  trailing,
  className,
  ...props
}: InputProps) {
  const input = (
    <Primitive
      {...props}
      data-size={controlSize}
      data-variant={variant}
      className={withClassName("rbx-input", className)}
    />
  );
  if (!leading && !trailing) return input;
  return (
    <div
      className="rbx-input-group"
      data-size={controlSize}
      data-variant={variant}
      data-disabled={props.disabled || undefined}
      data-invalid={props["aria-invalid"] === true || undefined}
    >
      {leading && <span className="rbx-input-adornment">{leading}</span>}
      {input}
      {trailing && <span className="rbx-input-adornment">{trailing}</span>}
    </div>
  );
}
components/ui/input.css
input.css
/* Input: 공통 구조는 theme.css, 컴포넌트 전용 조정은 아래에 작성합니다. */

목차