雜誌編輯版面

品牌色票板

品牌書式的色票板 React 元件:色塊由上而下依序填滿,自動換算 RGB/CMYK/WCAG 對比度,色面文字依對比自動選白或黑;滑過抬起、點擊複製色碼並浮出「已複製」。

品牌書裡那一頁色票,做成可以直接用的元件。傳入一組 { name, hex },元件會自動換算 RGB、CMYK 與對白/對黑的 WCAG 對比度,並標上 AA/AAA/不足;色面上的文字依對比度自動選白或黑,確保至少 4.5:1。進入視窗時每塊色面由上而下依序填滿,文字在填完後淡入;滑過時色塊抬起,點擊(或聚焦後按 Enter/空白鍵)以目前格式複製色碼,色面中央浮出「已複製」。主色可設 primary 橫跨兩欄,頂部可選擇顯示 HEX/RGB/CMYK/全部的格式切換。

把這個效果裝進你的專案

在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。

npx webberui@latest add brand-swatch-board

還沒有專案,或安裝遇到問題?看快速開始 →

Playground

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

3
80
編輯中的呼叫預設屬性
<BrandSwatchBoard/>

完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。

安裝

npx webberui@latest add https://webberui.com/r/brand-swatch-board.json

或在 components.json 設定 registries 後,改用 @webberui/brand-swatch-board 安裝。

使用

import { BrandSwatchBoard } from "@/components/ui/brand-swatch-board";

<BrandSwatchBoard
  columns={3}
  showFormatToggle
  swatches={[
    { name: "山嵐墨", hex: "#1E2A2F", note: "主色", primary: true },
    { name: "烘焙棕", hex: "#7A4E2D" },
    { name: "燕麥奶", hex: "#EFE6D8" },
    { name: "柿子橘", hex: "#E07A3F" },
  ]}
  onCopy={(swatch, value) => console.log(`已複製 ${swatch.name} ${value}`)}
/>

Props

Prop型別預設值說明
swatchesBrandSwatch[]—色票清單;改變 hex 會即時更新色面(色面背景走 CSS 變數)
columnsnumber3寬螢幕的欄數(1–6);窄螢幕最多兩欄
format"hex" | "rgb" | "cmyk" | "all"—受控的顯示格式;未提供時由元件內部管理(非受控)
defaultFormat"hex" | "rgb" | "cmyk" | "all""all"非受控模式的初始顯示格式
onFormatChange(format: BrandSwatchFormat) => void—顯示格式變動時回呼(透過頂部切換)
showFormatTogglebooleanfalse是否在頂部顯示格式切換
staggernumber80每塊色面進場的間隔(毫秒);未提供時沿用 --wb-bsb-stagger
onCopy(swatch: BrandSwatch, value: string) => void—複製成功後回呼,參數為色票與實際複製的字串
classNamestring—透傳到最外層容器

BrandSwatch

欄位型別預設值說明
namestring—色名,例如「深林綠」
hexstring—色碼,支援 #rgb 與 #rrggbb(# 可省略)
notestring—用途說明,顯示於色名下方
primarybooleanfalse主色:色面橫跨兩欄(欄數 ≥ 2 時)

另外具名匯出純函式 hexToRgb、rgbToHex、rgbToCmyk、relativeLuminance、contrastRatio、contrastLevel,可在色票板以外重複使用同一套換算。

細節

  • 換算:hexToRgb 支援三位與六位色碼;rgbToCmyk 是不經色彩描述檔的簡易換算,四捨五入為整數百分比,印刷前仍以印廠的描述檔為準;對比度依 WCAG 相對亮度公式計算,一般文字 ≥ 4.5 為 AA、≥ 7 為 AAA。
  • 複製內容依目前格式:HEX 為 #1E2A2F、RGB 為 rgb(30, 42, 47)、CMYK 為 cmyk(36%, 11%, 0%, 82%);格式為「全部」時複製 HEX。剪貼簿不可用或被拒時,色面顯示「無法複製」。
  • 色面背景是 bg-[var(--wb-bsb-color)],色碼透過行內 CSS 變數傳入,改 swatches 就會即時重繪。
  • 節奏變數:--wb-bsb-stagger(80ms)、--wb-bsb-fill-duration(600ms)、--wb-bsb-ease(cubic-bezier(0.23,1,0.32,1))可在全域覆寫;傳入 stagger prop 時以 prop 為準。滑過抬起沿用 --wb-duration-fast 與 --wb-ease-out。
  • 進場以 IntersectionObserver 偵測,只播一次。

可及性

  • 每塊色票是原生 <button>,aria-label 完整描述色名與目前格式的色碼(例如「複製 山嵐墨 #1E2A2F」),可用 Tab 聚焦、Enter 或空白鍵複製
  • 複製結果寫入 role="status"、aria-live="polite" 的隱藏區域,由螢幕閱讀器朗讀;色面上的裝飾文字與「已複製」chip 對輔助科技隱藏,避免重複
  • 格式切換是 role="radiogroup",方向鍵、Home、End 可移動選取,並有 focus-visible 外框
  • 色面上的文字依對白/對黑的對比度自動選擇較高者,確保至少 4.5:1
  • 使用者系統開啟「減少動態效果」時,不播放填滿與抬起動畫,色票直接顯示;複製 chip 只淡入淡出