WebberUI

流體頁籤

指示條如液體般拉伸跟隨的頁籤,內容方向感切換。

底部指示條以「前緣快、後緣慢」的雙彈簧追蹤選中頁籤,移動途中像液體般先拉長再收縮;內容面板依切換方向滑入滑出,帶出清楚的空間方向感,支援受控與非受控兩種模式。

載入預覽⋯

Playground

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

<FluidTabs />

安裝

npx shadcn@latest add https://webberui.com/r/fluid-tabs.json

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

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

npm install motion clsx tailwind-merge

使用

import { FluidTabs } from "@/components/ui/fluid-tabs";

const tabs = [
  { value: "overview", label: "總覽", content: <p>總覽內容</p> },
  { value: "analytics", label: "分析", content: <p>分析內容</p> },
  { value: "settings", label: "設定", content: <p>設定內容</p> },
];

<FluidTabs tabs={tabs} defaultValue="overview" />

Props

Prop型別預設值說明
tabsFluidTabItem[]頁籤清單,每項含 valuelabel 與可選的 content;全部未提供 content 時僅作導覽列
valuestring受控模式的當前頁籤值,需搭配 onChange
defaultValuestring第一個頁籤非受控模式的初始頁籤值
onChange(value: string) => void頁籤切換時的回呼,帶入新的 value
indicatorClassNamestring自訂底部指示條的樣式(顏色、高度等)
classNamestring透傳到最外層容器

可及性

  • 完整實作 role="tablist" / role="tab" / role="tabpanel",並以 aria-selectedaria-controlsaria-labelledby 建立關聯
  • 支援鍵盤操作:左右方向鍵循環切換並自動啟用、Home / End 跳至首尾頁籤,焦點以 roving tabindex 管理
  • 使用者系統開啟「減少動態效果」時,指示條直接定位、內容面板僅淡入淡出,不做位移與模糊動畫
  • 指示條為純裝飾元素,以 aria-hidden 對輔助科技隱藏

On this page