Lynx

Text Field Textarea

여러 줄의 긴 텍스트를 입력받고 자동으로 높이를 조절하는 컴포넌트입니다.

Engine ≥ 3.6<textarea>
사용 가능 버전@seed-design/[email protected], @seed-design/[email protected]
Lynx 예제를 불러오는 중입니다.

React의 autoFocus에 대응하는 prop은 지원하지 않습니다. 처음부터 포커스해야 한다면 화면이 렌더링된 뒤 TextFieldTextarea ref에서 native focus UI method를 호출합니다.

Installation

npx @seed-design/cli add ui:text-field

Props

TextField

Prop

Type

children?React.ReactNode
label?React.ReactNode
labelWeight?"medium" | "bold" | undefined
indicator?React.ReactNode
prefixIcon?React.ReactElement<LynxIconElementProps, string | React.JSXElementConstructor<any>> | undefined
prefix?React.ReactNode
suffixIcon?React.ReactElement<LynxIconElementProps, string | React.JSXElementConstructor<any>> | undefined
suffix?React.ReactNode
description?React.ReactNode
errorMessage?React.ReactNode
hideCharacterCount?boolean | undefined
maxGraphemeCount?number | undefined
showRequiredIndicator?boolean | undefined
fieldRef?React.Ref<NodesRef> | undefined
onValueChange?((values: { value: string; graphemes: string[]; slicedValue: string; slicedGraphemes: string[]; }) => void) | undefined
value?string | undefined

TextFieldTextarea

Prop

Type

Examples

State

Enabled

Lynx 예제를 불러오는 중입니다.

Disabled

Lynx 예제를 불러오는 중입니다.

Read Only

Lynx 예제를 불러오는 중입니다.

Size

size로 TextField의 크기를 정합니다. (default: large)

Lynx에서는 large와 medium을 지원합니다. CSS viewport breakpoint가 없어 responsive는 지원하지 않습니다.

Lynx 예제를 불러오는 중입니다.

Sizing

<TextFieldTextarea>에 height 관련 스타일을 직접 지정하여 높이를 고정하거나 최소·최대 높이를 설정할 수 있습니다.

Fixed Height

고정 높이를 사용할 때는 autoresize={false}와 명시적인 height를 함께 지정합니다.

Lynx 예제를 불러오는 중입니다.

Auto Height with Constraints

Lynx 예제를 불러오는 중입니다.

Customizable Parts

Indicator

indicator 또는 showRequiredIndicator prop을 사용할 수 있습니다.

Lynx 예제를 불러오는 중입니다.

Grapheme Count

Lynx 예제를 불러오는 중입니다.

value를 사용자 인식 문자(grapheme cluster) 단위로 나눈 결과를 onValueChange 콜백의 graphemes와 slicedGraphemes로 제공합니다.

Lynx 예제를 불러오는 중입니다.

Use Cases

Controlled State

Lynx는 HTML Form을 지원하지 않습니다. value와 onValueChange를 사용해 입력값을 React state로 관리할 수 있습니다.

Lynx 예제를 불러오는 중입니다.

Formatting

Lynx 예제를 불러오는 중입니다.

Slicing

Lynx 예제를 불러오는 중입니다.

Lynx Usage

Autoresizing

TextFieldTextarea는 기본적으로 내용에 맞춰 높이가 늘어납니다. 높이가 바뀌면 KeyboardAvoidingScrollView가 활성 입력의 위치를 다시 계산합니다.

Android에서는 SEED typography의 줄 높이를 맞추기 위해 line-spacing="3.2px"를 기본 적용합니다. fontSize나 lineHeight를 바꾼다면 이에 맞는 line-spacing도 지정하세요. 기본 보정은 line-spacing={0}으로 해제할 수 있습니다.

Keyboard Avoidance

KeyboardAvoidingScrollView.Content 안에 배치하면 TextFieldTextarea가 focus될 때 자동으로 등록됩니다. autoresize로 레이아웃이 바뀌면 활성 입력 위치를 다시 계산합니다.

import { KeyboardAvoidingScrollView } from "@seed-design/lynx-react";
import { TextField, TextFieldTextarea } from "@/components/ui/text-field";

export function KeyboardAwareFields() {
  return (
    <KeyboardAvoidingScrollView.Root className="screen-body">
      <KeyboardAvoidingScrollView.Content>
        <TextField label="내용">
          <TextFieldTextarea accessibility-label="내용" />
        </TextField>
      </KeyboardAvoidingScrollView.Content>
    </KeyboardAvoidingScrollView.Root>
  );
}

Web Version Differences

  • 편집 가능한 상태에서는 HTML <textarea> 대신 Lynx native <textarea>를 렌더링합니다.
  • readOnly 상태에서는 focus, selection, 잘라내기 메뉴가 없는 <text>를 렌더링합니다. 이때 ref는 <text>를 가리키므로 textarea 전용 UI method와 이벤트를 사용할 수 없습니다.
  • onChange 대신 TextField의 onValueChange를 사용합니다. native bindinput은 TextFieldTextarea에 직접 전달할 수 있습니다.
  • DOM id로 label을 연결하지 않으므로 입력에 accessibility-label을 직접 지정하세요.
  • autoresize는 DOM scrollHeight가 아니라 native 측정값을 사용합니다.
  • show-soft-input-on-focus의 기본값은 true입니다. 커스텀 키보드를 사용한다면 false로 지정하세요.
  • Android의 fullscreen extract input은 기본적으로 비활성화됩니다. 필요한 경우 android-fullscreen-mode={true}를 지정하세요.
  • android-set-soft-input-mode는 기본값이 "unspecified"이며 host window 전체에 영향을 줍니다. 같은 window의 입력에는 같은 값을 사용하고, KeyboardAvoidingScrollView가 키보드 회피를 맡는 화면에서는 "nothing"을 사용하세요.

Unsupported Lynx Features

  • HTML form submit, browser validation, React Hook Form, aria-describedby id 연결은 지원하지 않습니다.
  • 큰 textarea에서 현재 caret 위치만 기준으로 키보드를 회피하는 기능은 지원하지 않습니다. 현재는 Field·TextField·native 입력 영역 중 안전 영역에 맞는 가장 큰 영역을 선택합니다.

Last updated on

목차