# AppBar
URL: /lynx/components/app-bar
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/app-bar.mdx
화면 상단에서 현재 화면의 제목과 탐색 액션을 보여주는 내비게이션 바 컴포넌트입니다.
Lynx Engine 최소 버전: 3.6
사용 가능 버전: @seed-design/lynx-react@0.2.0, @seed-design/lynx-css@0.2.0
## Preview
```tsx
import "./styles";
import IconBellLine from "@karrotmarket/lynx-monochrome-icon/IconBellLine";
import IconChevronLeftLine from "@karrotmarket/lynx-monochrome-icon/IconChevronLeftLine";
import { root } from "@lynx-js/react";
import { AppBar, useSeedClassName } from "@seed-design/lynx-react";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
} />
동네생활
} />
화면 콘텐츠
);
}
root.render();
```
## Installation
- npm: npx @seed-design/cli add ui:app-bar
- pnpm: pnpm dlx @seed-design/cli add ui:app-bar
- yarn: yarn dlx @seed-design/cli add ui:app-bar
- bun: bun x @seed-design/cli add ui:app-bar
## Props
### `AppBar`
### `AppBarLeft`
### `AppBarMain`
### `AppBarRight`
### `AppBarSlot`
### `AppBarIconButton`
### `AppBarBackButton`
### `AppBarCloseButton`
## Usage
설치한 snippet은 Root와 주요 슬롯을 `AppBar`, `AppBarLeft`, `AppBarMain`, `AppBarRight`로 export 합니다. `AppBarBackButton`, `AppBarCloseButton`은 기본 아이콘만 제공하며, 실제 이동 로직은 `bindtap`으로 직접 전달합니다.
```tsx
import {
AppBar,
AppBarBackButton,
AppBarLeft,
AppBarMain,
AppBarRight,
} from "@/components/ui/app-bar";
export function Header({ goBack }: { goBack: () => void }) {
return (
);
}
```
### Title / Subtitle
`AppBarMain`에 `title`, `subtitle`을 전달하면 내부에서 `AppBar.Title`, `AppBar.Subtitle`을 조립합니다. `subtitle`이 있으면 `layout="withSubtitle"`가 자동으로 적용됩니다.
```tsx
import "./styles";
import { root } from "@lynx-js/react";
import { AppBar, useSeedClassName } from "@seed-design/lynx-react";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
관심 목록
3개의 새 소식
제목과 부제목을 함께 표시한 AppBar
);
}
root.render();
```
직접 슬롯을 조립하고 싶다면 `AppBarMain`의 children으로 compound 컴포넌트를 전달합니다.
```tsx
import { AppBar, AppBarMain } from "@/components/ui/app-bar";
import { AppBar as SeedAppBar } from "@seed-design/lynx-react";
export function Header() {
return (
제목
부제목
);
}
```
### Left / Right Action
왼쪽과 오른쪽에는 icon button 또는 custom slot을 배치할 수 있습니다. Cupertino theme에서는 좌우 슬롯 폭을 읽어 가운데 title이 치우치지 않도록 padding을 보정합니다.
```tsx
import "./styles";
import IconChevronLeftLine from "@karrotmarket/lynx-monochrome-icon/IconChevronLeftLine";
import IconXmarkLine from "@karrotmarket/lynx-monochrome-icon/IconXmarkLine";
import { root, useState } from "@lynx-js/react";
import { AppBar, useSeedClassName } from "@seed-design/lynx-react";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
const [lastAction, setLastAction] = useState("없음");
function handleBack() {
"background only";
setLastAction("뒤로");
}
function handleClose() {
"background only";
setLastAction("닫기");
}
return (
}
bindtap={handleBack}
/>
작성하기
완료
}
bindtap={handleClose}
/>
마지막 액션: {lastAction}
);
}
root.render();
```
### Accessibility
Lynx에서는 HTML ARIA 속성 대신 Lynx native 접근성 속성을 사용합니다. `AppBarIconButton`은 기본적으로 `accessibility-element={true}`와 `accessibility-traits="button"`을 적용하며, 아이콘만으로 의미를 알 수 없는 버튼에는 `accessibility-label`을 전달해야 합니다.
```tsx
import IconBellLine from "@karrotmarket/lynx-monochrome-icon/IconBellLine";
} />
```
`AppBarBackButton`, `AppBarCloseButton`은 각각 `"뒤로"`, `"닫기"` 라벨을 기본값으로 제공합니다.
### Theme
`theme`은 `"cupertino"` 또는 `"android"`를 사용할 수 있습니다. 명시하지 않으면 AppBar 내부에서 `SystemInfo.platform`을 읽어 Android에서는 `"android"`, 그 외 플랫폼이나 값이 없을 때는 `"cupertino"`를 사용합니다.
```tsx
```
수동으로 지정한 `theme`은 platform 기본값보다 우선합니다.
```tsx
import "./styles";
import IconChevronLeftLine from "@karrotmarket/lynx-monochrome-icon/IconChevronLeftLine";
import IconXmarkLine from "@karrotmarket/lynx-monochrome-icon/IconXmarkLine";
import { root } from "@lynx-js/react";
import { AppBar, useSeedClassName } from "@seed-design/lynx-react";
function Root() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
Cupertino
} />
화면 제목
보조 제목
} />
Android
} />
화면 제목
보조 제목
} />
);
}
root.render();
```
## Web Version Differences
Lynx `AppBar`는 React `AppBar`와 같은 Rootage 기반 variant를 사용하지만, Stackflow와 화면 전환 로직은 포함하지 않습니다.
- **이벤트 핸들링**: `onClick` 대신 Lynx 이벤트인 `bindtap`을 전달합니다.
- **렌더링 요소**: HTML 요소 대신 네이티브 `` / `` 요소를 렌더링합니다.
- **접근성 라벨링**: `aria-label` 대신 Lynx native `accessibility-label`을 사용합니다.
- **platform theme**: 웹처럼 `data-*` selector에 의존하지 않고, recipe variant className으로 `"cupertino"` / `"android"` 디자인을 적용합니다.
- **navigation 책임**: `AppBarBackButton`과 `AppBarCloseButton`은 이동을 자동 실행하지 않습니다. Stackflow `pop()` 같은 동작은 호출부에서 연결합니다.
## Unsupported Lynx Features
현재 Lynx AppBar는 순수 UI 컴포넌트로 제공되며 다음 기능은 포함하지 않습니다.
| 기능 | 웹 대응 | 대체 방법 |
| --------------------------- | -------------------------------------------- | ------------------------------------------------- |
| Stackflow activity 연동 | `useActivity`, `useActions` 기반 back/close 처리 | `bindtap`에서 앱의 navigation 함수를 직접 호출 |
| swipe-back 전환 애니메이션 | Stackflow screen transition | 화면 전환을 소유한 navigation 계층에서 처리 |
| `data-*` selector 기반 상태 스타일 | 웹 recipe selector | `theme`, `tone` variant className 사용 |
| HTML button 속성 | `type`, DOM click event | Lynx `` 기반 `AppBarIconButton`과 `bindtap` 사용 |
| HTML ARIA 라벨 | `aria-label` | Lynx native `accessibility-label` 사용 |