# KeyboardAvoidingScrollView
URL: /lynx/components/keyboard-avoiding-scroll-view
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/keyboard-avoiding-scroll-view.mdx
소프트 키보드가 활성 입력을 가리지 않도록 세로 스크롤 위치와 하단 여백을 조정하는 컴포넌트입니다.
Lynx Engine 최소 버전: 3.6
사용 가능 버전: @seed-design/lynx-react@0.4.0
## Installation
- npm: npm install @seed-design/lynx-react
- pnpm: pnpm add @seed-design/lynx-react
- yarn: yarn add @seed-design/lynx-react
- bun: bun add @seed-design/lynx-react
아래 예제에서 사용하는 Text Field 레지스트리 스니펫도 추가합니다.
- npm: npx @seed-design/cli add ui:text-field
- pnpm: pnpm dlx @seed-design/cli add ui:text-field
- yarn: yarn dlx @seed-design/cli add ui:text-field
- bun: bun x @seed-design/cli add ui:text-field
## Props
## Usage
세로로 스크롤되는 입력 화면의 가장 바깥 영역에 배치합니다. `keyboardGap`은 키보드와 활성 입력 영역 사이의 간격입니다. `scrollBehavior`는 회피 위치로 이동하는 방식을 정합니다.
Text Field Input과 Text Field Textarea의 레지스트리 스니펫이 제공하는 `TextField` 안에 입력 요소를 배치합니다. 이 `TextField`가 내부에 만드는 Field 경계를 기준으로 입력 영역과 하단을 추적합니다. 입력 요소가 focus·blur·layout 변경을 자동으로 전달하므로 별도 등록 prop은 필요하지 않습니다.
Android에서 이 컴포넌트가 키보드 회피를 전담한다면 입력 요소에 `android-set-soft-input-mode="nothing"`을 지정합니다. host window의 별도 pan이나 resize와 회피 동작이 겹치지 않게 합니다.
## Examples
### 한 줄 입력
화면 아래쪽의 `TextField.Input`에 focus하면 입력 영역과 키보드 사이에 24px 간격이 생기도록 자동 스크롤합니다.
```tsx
import "./styles";
import { root } from "@lynx-js/react";
import { KeyboardAvoidingScrollView, useSeedClassName } from "@seed-design/lynx-react";
import { TextField, TextFieldInput } from "@/components/ui/text-field";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
한 줄 입력
아래 입력 영역을 탭하면 키보드 위로 자동 스크롤됩니다.
입력 영역이 화면 아래에 오도록 확보한 공간
);
}
root.render();
```
이 예제는 네이티브 키보드 동작을 사용합니다. QR 코드 탭에서 Lynx Explorer로 실행한 뒤 화면 아래의 주소 입력 영역을 탭해 확인해 주세요.
### 자동 높이 조절 textarea
`TextField.Textarea`에 여러 줄을 입력해 높이가 달라지면 활성 입력 영역의 위치를 다시 계산합니다.
```tsx
import "./styles";
import { root } from "@lynx-js/react";
import { KeyboardAvoidingScrollView, useSeedClassName } from "@seed-design/lynx-react";
import { TextField, TextFieldTextarea } from "@/components/ui/text-field";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
여러 줄 입력
줄을 추가해 입력 영역이 커져도 키보드 위의 안전한 위치를 다시 계산합니다.
입력 영역이 화면 아래에 오도록 확보한 공간
);
}
root.render();
```
이 예제는 네이티브 입력 요소의 자동 높이 조절과 키보드 회피 동작을 사용합니다. QR 코드 탭에서 Lynx Explorer로 실행한 뒤 여러 줄을 입력해 확인해 주세요.
## 웹 버전과의 차이
- 브라우저의 `visualViewport`나 CSS viewport unit 대신 Lynx keyboard global event와 native node 측정을 사용합니다.
- 키보드가 열릴 때 필요한 하단 spacer만 추가하고, 사용자 스크롤 중에는 자동 이동을 잠시 중단합니다.
- 브라우저의 form 제출과 자동 focus 이동은 제공하지 않습니다.
## Lynx 미지원 기능
- 가로·중첩 scroll view는 지원하지 않습니다.
- 키보드 toolbar 높이와 큰 textarea의 caret 단위 회피는 아직 반영하지 않습니다.