WebberUI

Pill Nav

作用中項目滑動高亮的極簡藥丸導航。

作用中項目切換時,高亮藥丸以彈簧動態在項目之間平滑滑動,支援圖示、受控/非受控用法與鍵盤操作。

載入預覽⋯

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

380
32
<PillNav />

安裝

npx shadcn@latest add https://webberui.com/r/pill-nav.json

或在 components.json 設定 registries 後,改用 @webberui/pill-nav 安裝。

安裝依賴後,從 registry JSON(/r/pill-nav.jsonfiles[0].content)複製 pill-nav.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion lucide-react clsx tailwind-merge

使用

import { Compass, Home, Settings, User } from "lucide-react";
import { PillNav } from "@/components/ui/pill-nav";

<PillNav
  defaultValue="Discover"
  items={[
    { label: "Home", icon: Home },
    { label: "Discover", icon: Compass },
    { label: "Profile", icon: User },
    { label: "Settings", icon: Settings },
  ]}
/>;

作為連結列時,為每個項目加上 href,元件會渲染成 <a>

<PillNav
  items={[
    { label: "Docs", href: "/docs" },
    { label: "Blog", href: "/blog" },
  ]}
/>

受控用法

valueonValueChange 接管作用中狀態:

const [tab, setTab] = React.useState("Home");

<PillNav
  value={tab}
  onValueChange={setTab}
  items={[{ label: "Home" }, { label: "Discover" }]}
/>;

Props

Prop型別預設值說明
itemsPillNavItem[]導航項目清單
defaultValuestring第一項非受控初始作用中項目(label
valuestring受控作用中項目(label
onValueChange(value: string) => void作用中項目改變時觸發
stiffnessnumber380滑動高亮的彈簧剛性
dampingnumber32滑動高亮的彈簧阻尼

其中 PillNavItem 形狀為 { label: string; href?: string; icon?: LucideIcon }label 同時作為唯一識別值。

可及性

  • 作用中項目帶 aria-current="page",輔助科技可辨識目前位置
  • 每個項目都是原生 <button><a>,可用 Tab 聚焦、Enter 觸發,並帶 focus-visible 焦點環
  • 使用者系統開啟「減少動態效果」時,高亮改為瞬間切換、不做滑動動畫

客製

高亮與焦點環顏色以 --wb-* CSS 變數暴露,可用 className 覆寫:

  • --wb-pill-active-bg:作用中藥丸背景
  • --wb-pill-active-fg:作用中文字顏色
  • --wb-pill-ringfocus-visible 焦點環顏色

On this page