# Contextual Floating Button
URL: /lynx/components/contextual-floating-button
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/contextual-floating-button.mdx
화면 위에 떠 있으며 특정 상황에서만 나타나는 보조적인 동작을 위한 버튼입니다.
Lynx Engine 최소 버전: 3.9
사용 가능 버전: @seed-design/lynx-react@0.8.0, @seed-design/lynx-css@0.12.0
## Installation
- npm: npm install @seed-design/lynx-react @seed-design/lynx-css
- pnpm: pnpm add @seed-design/lynx-react @seed-design/lynx-css
- yarn: yarn add @seed-design/lynx-react @seed-design/lynx-css
- bun: bun add @seed-design/lynx-react @seed-design/lynx-css
Lynx `ContextualFloatingButton`은 별도 `ui:contextual-floating-button` snippet 없이 `@seed-design/lynx-react` 패키지에서 직접 제공합니다.
## Usage
## Preview
```tsx
import IconBellFill from "@karrotmarket/lynx-monochrome-icon/IconBellFill";
import { ContextualFloatingButton, PrefixIcon } from "@seed-design/lynx-react";
export default function Example() {
return (
} />
알림 설정
);
}
```
웹 미리보기에서는 아이콘 색상이 적용되지 않습니다. 실제 아이콘 색상은 QR 코드 탭에서 Lynx Explorer로 확인하세요.
## Props
## Examples
### Float Composition
Lynx에는 `Float` 컴포넌트가 없으므로 기준 frame의 `position="relative"`와 외부 `Box`의 native absolute bottom-center 배치로 같은 결과를 만듭니다.
```tsx
import IconBellFill from "@karrotmarket/lynx-monochrome-icon/IconBellFill";
import { Box, ContextualFloatingButton, PrefixIcon } from "@seed-design/lynx-react";
export default function Example() {
return (
} />
알림 설정
);
}
```
### Solid Variant
```tsx
import IconPlusLine from "@karrotmarket/lynx-monochrome-icon/IconPlusLine";
import { ContextualFloatingButton, PrefixIcon } from "@seed-design/lynx-react";
export default function Example() {
return (
} />
Solid Variant
);
}
```
### Layer Variant
```tsx
import IconPlusLine from "@karrotmarket/lynx-monochrome-icon/IconPlusLine";
import { ContextualFloatingButton, PrefixIcon } from "@seed-design/lynx-react";
export default function Example() {
return (
} />
Layer Variant
);
}
```
### Icon Only
`layout="iconOnly"`에는 스크린 리더가 읽을 `accessibility-label`을 함께 지정하세요.
```tsx
import IconPlusFill from "@karrotmarket/lynx-monochrome-icon/IconPlusFill";
import { ContextualFloatingButton, Icon } from "@seed-design/lynx-react";
export default function Example() {
return (
} />
);
}
```
### Loading
탭하면 loading 상태가 즉시 시작되고 2초 뒤에 원래 상태로 돌아옵니다. Loading 중에는 탭할 수 없습니다.
```tsx
import IconPlusLine from "@karrotmarket/lynx-monochrome-icon/IconPlusLine";
import { useState } from "@lynx-js/react";
import { ContextualFloatingButton, PrefixIcon } from "@seed-design/lynx-react";
export default function Example() {
const [loading, setLoading] = useState(false);
function handleTap() {
"background only";
setLoading(true);
setTimeout(() => setLoading(false), 2000);
}
return (
} />
시간이 걸리는 액션
);
}
```
## 웹 버전과의 차이
- **이벤트 핸들링**: `onClick` 대신 `bindtap` 또는 `main-thread:bindtap`을 사용합니다.
- **렌더링 요소**: HTML `