Lynx

Field Button

입력 필드 형태의 버튼으로, 선택창이나 피커를 열 때 사용합니다. 선택이 완료되면 버튼 라벨에 선택된 값이 표시됩니다.

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

Installation

npx @seed-design/cli@latest add ui:field-button

Props

FieldButton

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
required?boolean | undefined
showRequiredIndicator?boolean | undefined
showClearButton?boolean | undefined
buttonProps?SeedFieldButton.ButtonProps | undefined
clearButtonProps?FieldButtonClearButtonProps | undefined
fieldRef?React.Ref<NodesRef> | undefined
controlRef?React.Ref<NodesRef> | undefined

FieldButtonValue

고유 prop이 없습니다. className, style, children을 받습니다.

FieldButtonPlaceholder

고유 prop이 없습니다. className, style, children을 받습니다.

Examples

Basic Usage

FieldButton은 값을 직접 편집하지 않고 선택창이나 피커를 여는 버튼입니다. buttonProps.bindtap에 열기 동작을 전달하고, 선택 여부에 따라 FieldButtonValue 또는 FieldButtonPlaceholder를 자식으로 사용합니다.

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

Clear Button

showClearButton을 true로 설정하면 Clear Button이 표시됩니다. 선택 값은 소비처가 values로 소유하고, Clear Button을 누르면 clearButtonProps.bindtap 다음에 onValuesChange([])가 호출됩니다. onValuesChange에서 소비처 state를 비우세요. Field Button은 값을 직접 바꾸지 않습니다.

FieldButton이 disabled 또는 readOnly 상태이면 Clear Button은 표시되지 않습니다.

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

FieldButtonValue & FieldButtonPlaceholder

FieldButtonValue는 선택된 값을, FieldButtonPlaceholder는 값이 없을 때의 안내를 표시합니다. 두 요소의 텍스트는 스크린 리더가 중복해 읽지 않도록 접근성 트리에서 숨겨집니다.

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

Accessibility

Field Button 내부 버튼의 accessibility-label에 열리는 선택 화면과 현재 선택된 값을 함께 설명하세요.

<FieldButton
  label="사용자 이름"
  description="본명을 사용하지 않아도 괜찮습니다."
  buttonProps={{
    "accessibility-label": `사용자 이름 선택 화면 열기. 현재 선택된 이름: ${username || "없음"}`,
    bindtap: openUsernamePicker,
  }}
>
  {username ? (
    <FieldButtonValue>{username}</FieldButtonValue>
  ) : (
    <FieldButtonPlaceholder>김하늘</FieldButtonPlaceholder>
  )}
</FieldButton>

Use Cases

Controlled State

Lynx는 HTML Form을 지원하지 않습니다. 선택 값은 React state로 관리해 values로 전달하고, buttonProps.bindtap에서 피커를 연 뒤 값을 갱신합니다. Clear Button이 요청하는 빈 배열은 onValuesChange에서 같은 state에 반영합니다.

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

Bottom Sheet or Picker

buttonProps.bindtap에서 Bottom Sheet나 피커를 열고, 선택 결과를 FieldButtonValue로 렌더링하세요. Field Button은 어떤 선택 UI를 열지 정하지 않습니다.

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

State

Enabled

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

Disabled

disabled 상태에서는 버튼 tap handler가 실행되지 않고 Clear Button도 렌더링되지 않습니다.

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

Read Only

readOnly 상태에서는 현재 값을 표시하지만 버튼 tap handler가 실행되지 않고 Clear Button도 렌더링되지 않습니다.

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

Size

size로 Field Button의 크기를 정합니다. 기본값은 large입니다.

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

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

Customizable Parts

Prefix

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

Suffix

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

Both Affixes

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

Indicator

indicator 또는 showRequiredIndicator를 사용할 수 있습니다. 필수 항목에는 required도 함께 지정합니다.

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

Web Version Differences

  • HTML <button> 대신 Lynx <view>에 tap handler와 accessibility-* 속성을 적용합니다.
  • onClick 대신 buttonProps.bindtap을 사용합니다. main thread handler가 필요하면 buttonProps["main-thread:bindtap"]을 사용할 수 있습니다.
  • aria-label 대신 buttonProps["accessibility-label"]을 사용합니다.

Unsupported Lynx Features

  • HTML form submit과 hidden input(HiddenInput·name), browser validation, React Hook Form 연동은 지원하지 않습니다. Lynx에는 native form 제출 모델이 없습니다.
  • DOM id 기반 aria-describedby 연결과 aria-haspopup은 지원하지 않습니다.

Last updated on

목차