WebberUI

Trophy Case

成就獎盃牆:玻璃櫃網格陳列成就,解鎖時獎盃升起、掃過高光並噴發輕量紙屑,hover 可 3D 端詳並查看取得條件與進度。

載入預覽⋯

Playground

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

3
12
0.12
<TrophyCase />

安裝

npx shadcn@latest add https://webberui.com/r/trophy-case.json

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

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

npm install motion clsx tailwind-merge lucide-react

使用

import { TrophyCase, TrophyCabinet } from "@/components/ui/trophy-case";

<TrophyCase columns={3}>
  <TrophyCabinet title="首戰告捷" requirement="完成第一場對戰" unlocked />
  <TrophyCabinet
    title="連勝十場"
    requirement="連續獲勝 10 場"
    progress={7}
    target={10}
  />
  <TrophyCabinet title="百戰老將" requirement="累積出賽 100 場" unlocked />
</TrophyCase>

unlocked 已解鎖的櫃會播放「獎盃升起 → 掃過高光 → 噴發紙屑」的揭示序列;未解鎖的櫃呈暗色剪影,並可透過 progress / target 顯示達成進度。把 unlockedfalse 切成 true(受控)即可重播該櫃的解鎖慶祝。

Props

TrophyCase

Prop型別預設值說明
childrenReact.ReactNode直接放入 TrophyCabinet 子元件
columnsnumber3欄數(每列陳列幾座玻璃櫃)
staggernumber0.12各櫃進場/解鎖的間隔(秒),依序錯開
gapnumber12玻璃櫃間距(px)
classNamestring附加到網格容器的 class

TrophyCabinet

Prop型別預設值說明
titlestring成就名稱
requirementstring取得條件說明(hover/focus 時顯示)
unlockedbooleanfalse是否已解鎖:true 播放升起+高光+紙屑,false 為暗色剪影
progressnumber0目前進度值(未解鎖時搭配 target 顯示進度條)
targetnumber0完成所需的目標值
iconReact.ReactNode<Trophy />自訂獎盃圖示
classNamestring附加到玻璃櫃的 class

細節

  • TrophyCabinet 需放在 TrophyCase 內,索引由父層自動注入以計算逐櫃錯開的延遲;單獨使用時仍可運作,但不會有錯開效果。
  • 解鎖狀態的獎盃以暖色(amber)呈現並帶暖色光暈;未解鎖為降低透明度的中性剪影,右上角以鎖頭/打勾徽章標示狀態。
  • 進度條在進入視口時由 0 動畫增長至對應百分比;已解鎖固定顯示為 100%。

可及性

  • 使用者系統開啟「減少動態效果」時,直接以最終狀態渲染(獎盃就位、無升起/高光/紙屑),傾斜與資訊面板滑入亦停用動畫。
  • 每座櫃為可聚焦的 role="group",並帶完整 aria-label(名稱、解鎖狀態、進度與取得條件),資訊面板於 hover 與鍵盤 focus 時皆會揭示。
  • 高光、紙屑、光暈與底座等純裝飾元素均標記 aria-hidden,不干擾輔助科技朗讀。

On this page