입력

다양한 형태의 텍스트 입력을 위한 컴포넌트입니다.

기본 사용법

input은 다양한 타입의 텍스트 입력을 받을 수 있습니다.

HTML
<input type="text" placeholder="텍스트를 입력하세요" />
<input type="email" placeholder="이메일을 입력하세요" />
<input type="password" placeholder="비밀번호를 입력하세요" />
<input type="number" placeholder="숫자를 입력하세요" />
실제 예제:

입력 타입

input은 다양한 타입을 지원합니다.

HTML
<input type="text" placeholder="텍스트 입력" />
<input type="email" placeholder="이메일 주소" />
<input type="password" placeholder="비밀번호" />
<input type="number" placeholder="숫자" />
<input type="tel" placeholder="전화번호" />
<input type="url" placeholder="웹사이트 주소" />
<input type="search" placeholder="검색어 입력" />
<input type="date" />
<input type="time" />
<input type="month" />
<input type="week" />
<input type="datetime-local" />
실제 예제:

상태

input은 기본, 성공, 위험, 비활성화, 읽기 전용 상태를 지원합니다.

HTML
<!-- 기본 상태 -->
<input type="text" placeholder="기본 상태" />

<!-- 성공 -->
<input type="text" class="success" value="valid@email.com" />

<!-- 위험 -->
<input type="text" class="danger" value="invalid-email" />

<!-- 비활성화 -->
<input type="text" placeholder="비활성화" disabled />

<!-- 읽기 전용 -->
<input type="text" value="읽기 전용 값" readonly />
실제 예제:
SCSS
// Success 상태 (border: 1px solid color('success'))
input.success {
  border-color: color('success');

  &:focus-visible:not(:disabled) {
    outline: 4px solid color('success-outline');
  }
}

// Danger 상태 (border: 1px solid color('danger'))
input.danger {
  border-color: color('danger');

  &:focus-visible:not(:disabled) {
    outline: 4px solid color('danger-outline');
  }
}

// Disabled 상태
input:disabled {
  background: color('bg-disabled');
  cursor: not-allowed;
}

// Read-only 상태
input:read-only {
  border: none;
  cursor: default;
}

변형

input은 다양한 스타일 변형을 제공합니다.

HTML
<!-- 기본 (테두리) -->
<input type="text" placeholder="기본 (테두리)" />

<!-- 채움 (배경 색상) -->
<input type="text" class="fill" placeholder="채움 (배경 색상)" />

<!-- 텍스트 (테두리 없음) -->
<input type="text" class="text" placeholder="텍스트 (테두리 없음)" />

<!-- 밑줄 (하단 테두리만) -->
<input type="text" class="underline" placeholder="밑줄 (하단 테두리만)" />
실제 예제:
SCSS
// Fill 변형 (background-color: color('default-fill'))
input.fill {
  background-color: color('default-fill');
}

// Text 변형 (border: none)
input.text {
  border: none;
}

// Underline 변형 (border-bottom only, border-radius: 0)
input.underline {
  border: none;
  border-bottom: 1px solid color('border-disabled');
  border-radius: 0;

  &:focus-visible:not(:disabled) {
    border-bottom-color: color('primary-base');
  }
}

크기

input은 다양한 크기를 지원합니다.

HTML
<!-- 기본 크기 (padding: s(3) s(4), border-radius: r(3)) -->
<input type="text" placeholder="기본 크기" />

<!-- 중간 크기 (padding: s(4) s(4), border-radius: r(5)) -->
<input type="text" class="md" placeholder="중간 크기" />

<!-- 큰 크기 (padding: s(5) s(4), border-radius: r(6)) -->
<input type="text" class="lg" placeholder="큰 크기" />
실제 예제:
SCSS
// 기본 크기
input {
  padding: s(3) s(4);
  border-radius: r(3);
}

// 중간 크기
input.md {
  padding: s(4) s(4);
  border-radius: r(5);
}

// 큰 크기
input.lg {
  padding: s(5) s(4);
  border-radius: r(6);
}

아이콘

input에 아이콘을 추가할 수 있습니다.

HTML
<!-- 왼쪽 아이콘 (input padding-left: s(8), 아이콘 left: s(3)) -->
<div class="with-icon">
  <i class="icon-search"></i>
  <input type="text" placeholder="검색..." />
</div>

<!-- 오른쪽 아이콘 (input padding-right: s(7), 아이콘 right: s(3)) -->
<div class="with-right-icon">
  <input type="email" placeholder="이메일" />
  <i class="icon-mail"></i>
</div>
실제 예제:
SCSS
// 왼쪽 아이콘
.with-icon {
  position: relative;

  > i {
    position: absolute;
    left: s(3);
    top: 50%;
    transform: translateY(-50%);
  }

  > input {
    padding-left: s(8);  // 아이콘 공간 확보
  }
}

// 오른쪽 아이콘
.with-right-icon {
  position: relative;

  > i {
    position: absolute;
    right: s(3);
    top: 50%;
    transform: translateY(-50%);
  }

  > input {
    padding-right: s(7);  // 아이콘 공간 확보
  }
}

SCSS 스타일

podo-ui의 믹스인을 사용하여 input 스타일을 적용할 수 있습니다.

component.module.scss
@use 'podo-ui/mixin' as *;

// 기본 input 스타일
input[type='text'],
input[type='email'],
input[type='password'] {
  @include p3;
  padding: s(3) s(4);
  background-color: color('bg-block');
  border-radius: r(3);
  border: 1px solid color('border-disabled');

  &:focus-visible:not(:disabled) {
    border-color: color('primary-base');
    outline: 4px solid color('primary-outline');
  }

  &::placeholder {
    color: color('placeholder');
  }
}

// Success/Danger 상태
input.success {
  border: 1px solid color('success');

  &:focus-visible:not(:disabled) {
    outline: 4px solid color('success-outline');
  }
}

input.danger {
  border: 1px solid color('danger');

  &:focus-visible:not(:disabled) {
    outline: 4px solid color('danger-outline');
  }
}

// 크기 변형
input.md {
  padding: s(4) s(4);
  border-radius: r(5);
}

input.lg {
  padding: s(5) s(4);
  border-radius: r(6);
}