# Page Banner URL: /lynx/components/page-banner Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/page-banner.mdx 페이지 상단에서 전체 상태나 중요한 메시지를 전달하는 상위 레벨 메시지 컴포넌트입니다. Lynx Engine 최소 버전: 3.6 사용 가능 버전: @seed-design/lynx-react@0.6.0, @seed-design/lynx-css@0.10.0 ## Preview ```tsx import "./styles"; import { useState } from "@lynx-js/react"; import { ActionablePageBanner, DismissiblePageBanner, PageBanner, } from "@/components/ui/page-banner"; export default function Example() { const [open, setOpen] = useState(true); function handleTap() { "background only"; } function handleDismiss() { "background only"; setOpen(false); } return ( ); } ``` ## Installation - npm: npx @seed-design/cli@latest add ui:page-banner - pnpm: pnpm dlx @seed-design/cli@latest add ui:page-banner - yarn: yarn dlx @seed-design/cli@latest add ui:page-banner - bun: bun x @seed-design/cli@latest add ui:page-banner ## Props ### `PageBanner` ### `PageBannerButton` 고유 prop이 없습니다. `className`, `style`, `children`, `bindtap`, `main-thread:bindtap`을 받습니다. ### `ActionablePageBanner` ### `DismissiblePageBanner` ## Usage ```tsx import { PageBanner } from "@/components/ui/page-banner"; export function App() { return ; } ``` ## Examples ### With Button `PageBanner`의 `suffix`에 `PageBannerButton`을 전달하면 메시지 옆에 버튼을 배치할 수 있습니다. ```tsx import "./styles"; import { PageBanner, PageBannerButton } from "@/components/ui/page-banner"; export default function Example() { function handleTap() { "background only"; } return ( 자세히 보기} /> ); } ``` ### Tones and Variants `tone`은 `neutral`, `positive`, `informative`, `warning`, `critical`, `magic`을 지원합니다. `variant`는 `weak`과 `solid`를 지원합니다. 기본 조합은 `neutral`과 `weak`입니다. #### Neutral ```tsx import "./styles"; import IconExclamationmarkCircleFill from "@karrotmarket/lynx-monochrome-icon/IconExclamationmarkCircleFill"; import { ActionablePageBanner, DismissiblePageBanner, PageBanner, PageBannerButton, } from "@/components/ui/page-banner"; export default function Example() { function handleTap() { "background only"; } return ( } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> ); } ``` #### Positive ```tsx import "./styles"; import IconExclamationmarkCircleFill from "@karrotmarket/lynx-monochrome-icon/IconExclamationmarkCircleFill"; import { ActionablePageBanner, DismissiblePageBanner, PageBanner, PageBannerButton, } from "@/components/ui/page-banner"; export default function Example() { function handleTap() { "background only"; } return ( } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> ); } ``` #### Informative ```tsx import "./styles"; import IconExclamationmarkCircleFill from "@karrotmarket/lynx-monochrome-icon/IconExclamationmarkCircleFill"; import { ActionablePageBanner, DismissiblePageBanner, PageBanner, PageBannerButton, } from "@/components/ui/page-banner"; export default function Example() { function handleTap() { "background only"; } return ( } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> ); } ``` #### Warning ```tsx import "./styles"; import IconExclamationmarkCircleFill from "@karrotmarket/lynx-monochrome-icon/IconExclamationmarkCircleFill"; import { ActionablePageBanner, DismissiblePageBanner, PageBanner, PageBannerButton, } from "@/components/ui/page-banner"; export default function Example() { function handleTap() { "background only"; } return ( } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> ); } ``` #### Critical ```tsx import "./styles"; import IconExclamationmarkCircleFill from "@karrotmarket/lynx-monochrome-icon/IconExclamationmarkCircleFill"; import { ActionablePageBanner, DismissiblePageBanner, PageBanner, PageBannerButton, } from "@/components/ui/page-banner"; export default function Example() { function handleTap() { "background only"; } return ( } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." suffix={등록하기} /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." bindtap={handleTap} accessibility-label="미노출, 사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> } title="미노출" description="사업자 정보를 등록해주세요." /> ); } ``` #### Magic `tone="magic"`은 `variant="weak"`과만 함께 사용할 수 있습니다. ```tsx import "./styles"; import IconSparkle2 from "@karrotmarket/lynx-multicolor-icon/IconSparkle2"; import { ActionablePageBanner, DismissiblePageBanner, PageBanner, PageBannerButton, } from "@/components/ui/page-banner"; export default function Example() { function handleTap() { "background only"; } return ( } title="새로운 기능" description="마법 같은 소식이 도착했어요!" suffix={둘러보기} /> } title="새로운 기능" description="마법 같은 소식이 도착했어요!" bindtap={handleTap} accessibility-label="새로운 기능, 마법 같은 소식이 도착했어요!" /> } title="새로운 기능" description="마법 같은 소식이 도착했어요!" /> ); } ``` ## Action and Dismiss 전체 배너를 액션으로 사용하려면 `ActionablePageBanner`에 `bindtap`과 `accessibility-label`을 전달하세요. 닫기 상태를 직접 관리하려면 `DismissiblePageBanner`의 `open`과 `onDismiss`를 사용합니다. ## Web Version Differences - 탭 이벤트는 `onClick` 대신 `bindtap` 또는 `main-thread:bindtap`으로 받습니다. - 접근성은 HTML 의미 요소와 ARIA 대신 Lynx의 `accessibility-*` 속성을 사용합니다. - CloseButton은 Root의 직접 자식이나 Fragment 안에 두세요. 다른 컴포넌트로 감싸면 배너 본문과 함께 눌림 피드백이 적용됩니다. ## Unsupported Lynx Features - `asChild`를 지원하지 않습니다. - 웹의 focus ring과 HTML 속성은 지원하지 않습니다. 대응하는 Lynx native 속성을 사용하세요.