元件
registry 11 個 · 型錄 32 節元件層兩層並存:React + Tailwind v4(shadcn registry)與已凍結的 vanilla CSS class(components.css/components.js)。取用前先確認要哪一層。
ds-select(live demo)
直接 import registry/hhg/select.jsx 渲染,Tailwind utility 由 tokens.json 生成的 @theme inline 供應。
HHG Select(@hhg/ds-select):HHG Design System 的 Select(trigger + 白底 menu)。形態乙:React + Tailwind v4 utility,從 components.css 的 .ds-select 族與 components.js 的 DS.initSelect 遷移,逐屬性等值驗收通過。v1.18.0 新增選單向上展開(自動翻轉 + forceDirection 覆寫,行為契約 SEL-O8–O13)與 groupLabel prop。⚠️ 本檔同時是 ds-combobox 的樣式與 hook 來源(cx/ROOT/TRIGGER/OPTION/useFlipDirection/useDismiss 皆由它匯出)。
null(尚未變動)DS_VERSION v1.18.0ds-button(live demo)
.ds-btn 五個變體 + .ds-btn-icon + .ds-btn-sm+ .ds-dashed-btn + 忙碌態 + 深色外框,共 30 條規則。本族沒有行為層(components.js 無對應的 DS.init*)。
HHG Button(@hhg/ds-button):HHG Design System 的按鈕族(Button/IconButton/DashedButton)。形態乙:React + Tailwind v4 utility,從 components.css 的 .ds-btn 系+.ds-btn-icon+.ds-btn-sm+.ds-dashed-btn 遷移,281,792 次 computed 屬性逐一比對、白名單外零差異。按鈕族無行為層(components.js 沒有對應的 init)。⚠️ 填色三變體(primary/danger/cta)的 hover/active 在 React 版統一成一條 OKLCH 明度式,與 vanilla 刻意不同。
oklch(from <底色> calc(l + (1 - l) * 0.18) c h)。 係數 0.18 是以 --ink → --ink-hi 校準。components.css 不動。0(尚未點擊)DS_VERSION v1.18.0import Button, { IconButton, DashedButton } from '@/components/hhg/button';
<Button variant="primary">主要動作</Button>
<Button variant="secondary" size="sm">退回</Button> {/* dense 階,與 .ds-input-sm 同列 */}
<Button variant="danger" loading={sending}>刪除</Button>
<IconButton tone="on-dark" aria-label="編輯">✎</IconButton> {/* 深色外框下 */}
<DashedButton>+ 新增一列</DashedButton>
<Button as="a" variant="secondary" external href="…" target="_blank" rel="noopener noreferrer">
開啟外部系統
</Button>ds-input(live demo)
Input(三個尺寸階)/Textarea/Field(label 在上)/FieldInline(label 在左)/Search。表單用 Field、工具列用 FieldInline,不要互換(GUIDELINE v1.4.0)。
HHG Input(@hhg/ds-input):HHG Design System 的 input 族(Input/Textarea/Field/FieldInline/RangeSep/Search)。涵蓋 components.css 的 input 族 26 條規則,365,568 次 computed 屬性比對、白名單 3 筆全部 platform。input 族無行為層。⚠️ 照搬 .ds-input:focus{outline:none}=本族沒有可見的焦點環(庫層待拍板項,不在元件層修)。
error 寫出來,不能只靠 invalid 的紅框。 ⚠️ Textarea 不接受 size;Search 沒有寬度政策, 寬度給在外層容器上。(空)search="" · range=2026-08-01~2026-08-31 · note=0 字DS_VERSION v1.18.0試著打一個「12,000 元」看紅框與訊息一起出現。
ds-badge(live demo)
Badge 五個 tone + StatChip:非互動的顯示型標籤,零狀態規則、零行為。
HHG Badge(@hhg/ds-badge):HHG Design System 的狀態標籤族(Badge/StatChip)。涵蓋 7 條規則,68,544 次 computed 屬性比對、白名單 1 筆。本族無行為層。⚠️ 五個 tone 的靜止態文字對比只有 slate 達 WCAG 4.5:1(庫層待拍板項,照搬不修)。
--ds-badge-h、觸控下不放大);StatChip=這份清單的統計(無語意色、吃 --h-seg, 觸控下 33→40)。pending / tone=amber共 8 筆 · 顯示第 1-7 筆DS_VERSION v1.18.0tone="amber"等待/處理中tone="green"完成/通過tone="red"退回/失敗tone="slate"中性/已結案tone="default"無語意的計數或分類- 待補發票
- 已入庫
ds-tabs(live demo)
Tabs 軌道 + Tab。
HHG Tabs(@hhg/ds-tabs):HHG Design System 的頁籤族(Tabs/Tab)。涵蓋 6 條規則,159,936 次 computed 屬性比對、白名單 3 筆(含恆等式 --h-tab + 2×--ds-tabs-pad = --h-btn 的兩個 viewport 實測)。⚠️ value/defaultValue/onChange 是 React 版新增的便利層,不是遷移過來的行為(vanilla 的頁籤切換一直由採用端自己做)。
value/defaultValue/onChange 是新增的便利層。⚠️ 鍵盤刻意不做方向鍵切換與 roving tabindex (與 .ds-seg/.ds-pill 同立場)——改用 Radix Tabs 是行為差異, 不是等值替換。mine(尚未切換)DS_VERSION v1.18.07 筆等我簽核;其中 2 筆已超過建議回覆時間。
ds-segmented / ds-pill(live demo)
Segmented/Seg(單選)與 Pills/Pill(多選),發出 ds-change。
HHG Segmented(@hhg/ds-segmented):HHG Design System 的分段控制族(Segmented/Seg/Pills/Pill)。涵蓋 14 條規則,144,704 次 computed 屬性比對、白名單 3 筆,另有 docs/behavior/segmented-pills.md 的 26 步行為契約逐步等值(52/52 通過)。⚠️ 守門(onGuardRequest)預設吃 globalThis.DS.guard;要用守門又沒載 components.js 的專案必須自己傳 onGuardRequest。
guard 只有 Segmented 有。⚠️ 容器不要掛 data-ds-segmented(components.js 的自動掛載選擇器)—— 同頁再跑 DS.init() 會每次點擊發兩次事件。30(尚未變動) · pills=["shopee","oms"]DS_VERSION v1.18.0目前檢視:list。取消時**沒有回呼**(SEG-G5,庫的已知矛盾 ③,照搬不補)。
ds-combobox / ds-multicombo(live demo)
Combobox(單選)與 Multicombo(多選)。兩者共用 select.jsx 的 ROOT/TRIGGER/MENU/useDismiss ⇒ 三族的外點關閉與全域互斥是同一份程式碼。
HHG Combobox(@hhg/ds-combobox):HHG Design System 的 combobox 族(Combobox/Multicombo)。涵蓋 combobox 區 21 條 + select 族沿用 23 條,1,148,112 次 computed 屬性比對、白名單 2 筆,另有 docs/behavior/combobox.md 的 82 條行為契約逐步核對(81/83 列通過)。⚠️ 樣式與 dismiss/翻轉 hook 共用 ds-select,不複製一份 —— 兩族在舊世界共用同一組 document listener。
COMBO_VISIBLE_MAX = 50 是模組層常數、不是 prop,超過 50 筆就截。(空)(尚未變動) · multi=["v-1002","v-1005"]DS_VERSION v1.18.0ds-table(live demo)
TableCard/ScrollX/Table/Thead/Tbody/Tr/Th/Td/Pagination/PageBtn。結構子元件只發 data 屬性與 min-width, 視覺規則都在 <Table> 根節點 ⇒ 寫裸的 <thead>/<tr>/<th>/<td> 也一樣正確。
HHG Table(@hhg/ds-table):HHG Design System 的表格族(Table/TableCard/ScrollX/Thead/Tbody/Tr/Th/Td/CheckCell/Pagination/PageBtn/useStickyColShadow)。涵蓋 components.css 表格族 35 條規則(前綴計數的 19 條低估 84%),另有 docs/behavior/sticky-col.md 的 14 步行為契約逐步等值(14/14 兩側量測值逐字相同)。⚠️ 後代規則一律寫成掛在 <table> 根節點的 arbitrary variant,而 arbitrary variant 不吃 @media (hover: hover) ⇒ 列的 hover 已用 [@media(hover:hover)]: 補那層 media,不要改成內建 hover: 去組(specificity 會翻掉勾選列的階梯)。
.ds-pagination 只有版面,items 簡寫不掛 onClick,切頁邏輯自己寫。🔴 黏右操作欄的左緣陰影靠 useStickyColShadow(<ScrollX> 內建): 「有橫向溢出且尚未捲到最右」才顯示,純 CSS 做不到。1 / 3(尚未點列)DS_VERSION v1.18.0| 單號 | 申請人 | 品項 | 金額 | 狀態 | 建立 | 操作 |
|---|---|---|---|---|---|---|
PO-26-0814 | 林品瑄 | 倉儲棧板 ×120 | 128,000 | 等待審核 | 08/14 | |
PO-26-0812 | 陳彥廷 | 出貨紙箱 60×40 ×2000 | 74,500 | 審核通過 | 08/12 | |
PO-26-0809 | 何思妤 | 標籤印刷(三色) | 21,800 | 已退回 | 08/09 |
| 單號 | 申請人 | 金額 | ||
|---|---|---|---|---|
| PO-26-0814 | 林品瑄 | 128,000 | › | |
| PO-26-0812 | 陳彥廷 | 74,500 | › | |
| PO-26-0809 | 何思妤 | 21,800 | › |
| 欄位 | 值 |
|---|---|
| 本季採購單數 | 24 |
| 平均簽核天數 | 2.4 |
ds-dialog(live demo)
confirm/guard(確認型)、dialog(作業型)、view(作業型的 dismiss-only)。推薦 <DialogProvider> + useDialogs();portal 到 document.body ⇒不吃父層的 overflow/transform/z-index,仍拿得到 app 樹 context。
HHG Dialog(@hhg/ds-dialog):HHG Design System 的對話框族(Overlay/ConfirmDialog/TaskDialog/ViewDialog/DialogProvider/useDialogs/dialogs 模組層橋接/Drawer 六件套)。913,920 次 computed 屬性比對、白名單 8 筆全部 platform,另有 docs/behavior/dialog.md 的 46 步行為契約逐步等值(通過 45/不適用 1/未通過 0)+邊界情境 6 條全過。⚠️ 照搬 vanilla 的立場:沒有 focus trap、沒有 scroll lock、沒有背景 inert。要升級無障礙性請另開拍板,不要換成 Radix Dialog。
role=alertdialog、焦點在取消鈕、 不含輸入欄位;作業型 role=dialog、body 可捲、焦點在第一個可填欄位。 🔴 動作先跑、成功才關:onConfirm 回 false ⇒ 對話框留著可重試。 ⚠️ 模組層的 dialogs.confirm(...) 吃不到 app 樹 context,新程式碼不要用。(尚未開啟)表單送出的數量:—DS_VERSION v1.18.0ds-appshell(整頁框架)
AppShell/Side/Main/SideBrand/SideNav/NavItem/Acct/SideToggle/useSideDrawer()。整頁 grid + position:fixed 側欄, ≤ SIDE_BREAKPOINT(820px)轉抽屜態並鎖 body 捲動。
HHG App Shell(@hhg/ds-appshell):HHG Design System 的整頁框架族(AppShell/Side/Main/SideBrand/SideNav/NavItem/Acct/SideOverlay/SideToggle/useSideDrawer 等 23 個匯出)。涵蓋 components.css appshell 家族 61 條規則,另有 docs/behavior/appshell.md 的 26 步抽屜契約逐步等值(52/52 通過)。✅ v1.18.0 修掉 components.css 兩個 specificity bug:data-shell="plain" 的抽屜原本打不開、prefers-reduced-motion 對 plain 原本失效 —— 兩層已同步修好。⚠️ 刻意不渲染 .ds-side class,讓 React 抽屜與 components.js 的 DS.sideOpen 可以並存不互踩。
怎麼接進你的專案
在 components.json 加來源,用 shadcn CLI 取用與更新。 ⚠️ token 跟 Yu Anting 拿——token 無效回的 404 與「元件不存在」完全一樣。
// components.json
{
"registries": {
"@hhg": {
"url": "https://raw.githubusercontent.com/MIXXINtw/hhg-design-system/main/r/{name}.json",
"headers": { "Authorization": "Bearer ${HHG_REGISTRY_TOKEN}" }
}
}
}# token 放 .env.local(跟 Yu Anting 拿) npx shadcn add @hhg/ds-select # 安裝 npx shadcn add @hhg/ds-button # 按鈕族 npx shadcn add @hhg/ds-select --diff # 看庫改了什麼(本地客製會被標出) npx shadcn add @hhg/ds-select --overwrite # 套用(--yes 不問)
import Select from '@/components/hhg/select';
<Select
options={[{ value: 'shopee', label: '蝦皮', badge: '3' }]}
value={value}
onChange={e => setValue(e.value)}
placeholder="請選擇來源通道"
inField // 欄位情境:吃 --h-input / --r-input 幾何
invalid // 錯誤態:邊框換 --red
/>- 🔴 版本標記寫成程式碼(
export const DS_VERSION),不寫檔頭註解——shadcn add會刪掉第一個註解區塊。 - ⚠️ 不要用
git tag抓 registry;消費方式是npx shadcn add讀main的 raw URL。 - ⚠️ 採用 Tailwind 前先稽核全域 CSS reset:一條 unlayered 的
* {margin:0;padding:0}會吃掉全部 Tailwind 間距 utility, 且 build 零錯誤。
HTML 元件型錄 showcase.html
components.css/components.js 已凍結、逐族退役中——新專案不要從這裡起手。下面嵌的是 repo 的 showcase.html 原檔,看到的是現值。
.ds-select* 那幾條在 ds-combobox/ds-multicombo 遷完前不能刪——那兩族根節點 同樣掛 .ds-select。用同一版元件組出的完整清單頁,資料全部虛構;檔頭註解附缺口清單,已進 roadmap。
.ds-appshell深色外框側欄+≤820 抽屜.ds-page-head頁頭(h1 + 說明鈕 + 副標).ds-kpis / .ds-kpiKPI 卡列,含一張 -dark.ds-toolbar篩選工具列(同列同高).ds-search / .ds-input-mdtoolbar 階搜尋與日期區間.ds-select-mdtoolbar 階篩選下拉.ds-table / .ds-col-*資料表、欄寬政策、黏右操作欄.ds-btn-sm列內操作鈕.ds-badge / .ds-tag狀態 badge 與中性分類 tag.ds-pagination分頁.ds-detail-cols / -aux兩欄版面(container query).ds-timeline審批進度時間軸.ds-notif / .ds-menu-panel側欄通知面板DS.dialog / DS.view新增採購單表單/唯讀審批歷程版面較寬的章節請用「新分頁開啟」。