@qijenchen/design-system 0.1.0-beta.74 → 0.1.0-beta.76
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +1 -1
- package/dist/components/AppShell/app-shell.d.ts +2 -2
- package/dist/components/AppShell/app-shell.js.map +1 -1
- package/dist/components/Avatar/avatar.js.map +1 -1
- package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
- package/dist/components/BulkActionBar/bulk-action-bar.js +1 -1
- package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
- package/dist/components/Button/button.d.ts.map +1 -1
- package/dist/components/Button/button.js.map +1 -1
- package/dist/components/Chart/chart.d.ts +1 -1
- package/dist/components/Chart/chart.js.map +1 -1
- package/dist/components/Checkbox/checkbox.d.ts +1 -1
- package/dist/components/Checkbox/checkbox.js +1 -1
- package/dist/components/Checkbox/checkbox.js.map +1 -1
- package/dist/components/Combobox/combobox.d.ts +1 -1
- package/dist/components/Combobox/combobox.d.ts.map +1 -1
- package/dist/components/Combobox/combobox.js +13 -10
- package/dist/components/Combobox/combobox.js.map +1 -1
- package/dist/components/Command/command.d.ts +1 -1
- package/dist/components/Command/command.js +3 -3
- package/dist/components/Command/command.js.map +1 -1
- package/dist/components/DataTable/cell-registry.d.ts.map +1 -1
- package/dist/components/DataTable/cell-registry.js +2 -2
- package/dist/components/DataTable/cell-registry.js.map +1 -1
- package/dist/components/DataTable/data-table.d.ts +27 -6
- package/dist/components/DataTable/data-table.d.ts.map +1 -1
- package/dist/components/DataTable/data-table.js +57 -34
- package/dist/components/DataTable/data-table.js.map +1 -1
- package/dist/components/DatePicker/date-picker.d.ts.map +1 -1
- package/dist/components/DatePicker/date-picker.js +2 -2
- package/dist/components/DatePicker/date-picker.js.map +1 -1
- package/dist/components/DescriptionList/description-list.d.ts +1 -1
- package/dist/components/DescriptionList/description-list.js +2 -2
- package/dist/components/DescriptionList/description-list.js.map +1 -1
- package/dist/components/Empty/empty.d.ts +2 -0
- package/dist/components/Empty/empty.d.ts.map +1 -1
- package/dist/components/Empty/empty.js.map +1 -1
- package/dist/components/Field/field-wrapper.js +4 -4
- package/dist/components/Field/field-wrapper.js.map +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.d.ts +1 -1
- package/dist/components/OverflowIndicator/overflow-indicator.js +2 -2
- package/dist/components/OverflowIndicator/overflow-indicator.js.map +1 -1
- package/dist/components/PeoplePicker/people-picker.js +2 -2
- package/dist/components/PeoplePicker/people-picker.js.map +1 -1
- package/dist/components/ProfileCard/profile-card.d.ts +1 -1
- package/dist/components/ProfileCard/profile-card.js +2 -1
- package/dist/components/ProfileCard/profile-card.js.map +1 -1
- package/dist/components/Rating/rating.js.map +1 -1
- package/dist/components/Select/select.js +4 -4
- package/dist/components/Select/select.js.map +1 -1
- package/dist/components/Textarea/textarea.d.ts +1 -1
- package/dist/components/Textarea/textarea.js +2 -2
- package/dist/components/Textarea/textarea.js.map +1 -1
- package/dist/components/TimePicker/time-picker.d.ts.map +1 -1
- package/dist/components/TimePicker/time-picker.js +14 -23
- package/dist/components/TimePicker/time-picker.js.map +1 -1
- package/dist/components/TreeView/tree-view.d.ts +1 -1
- package/dist/components/TreeView/tree-view.js +1 -1
- package/dist/components/TreeView/tree-view.js.map +1 -1
- package/ds-canonical/fork/governance.lock +1 -1
- package/ds-canonical/fork/preamble.md +2 -2
- package/ds-canonical/hooks/check_field_controls_contracts.sh +30 -3
- package/ds-canonical/hooks/check_story_invariants.sh +26 -0
- package/ds-canonical/hooks/tests/test_check_story_invariants.sh +30 -0
- package/ds-canonical/references/props-naming.md +15 -1
- package/ds-canonical/rules/ui-development.md +2 -2
- package/llms-full.txt +7 -2
- package/llms.txt +3 -3
- package/package.json +1 -1
- package/src/components/Accordion/accordion.principles.stories.tsx +3 -3
- package/src/components/Alert/alert.anatomy.stories.tsx +4 -4
- package/src/components/Alert/alert.principles.stories.tsx +5 -5
- package/src/components/AppShell/app-shell.principles.stories.tsx +6 -6
- package/src/components/AppShell/app-shell.spec.md +4 -4
- package/src/components/AppShell/app-shell.tsx +2 -2
- package/src/components/AspectRatio/aspect-ratio.principles.stories.tsx +1 -1
- package/src/components/Avatar/avatar.principles.stories.tsx +3 -3
- package/src/components/Avatar/avatar.tsx +1 -1
- package/src/components/Badge/badge.principles.stories.tsx +3 -3
- package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +3 -3
- package/src/components/Breadcrumb/breadcrumb.spec.md +11 -1
- package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +1 -1
- package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +3 -3
- package/src/components/BulkActionBar/bulk-action-bar.spec.md +4 -2
- package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +2 -2
- package/src/components/BulkActionBar/bulk-action-bar.tsx +3 -2
- package/src/components/Button/button.principles.stories.tsx +3 -3
- package/src/components/Button/button.tsx +0 -10
- package/src/components/Calendar/calendar.anatomy.stories.tsx +1 -1
- package/src/components/Calendar/calendar.principles.stories.tsx +3 -3
- package/src/components/Carousel/carousel.principles.stories.tsx +2 -2
- package/src/components/Chart/chart.principles.stories.tsx +4 -4
- package/src/components/Chart/chart.tsx +1 -1
- package/src/components/Checkbox/checkbox.principles.stories.tsx +2 -2
- package/src/components/Checkbox/checkbox.tsx +1 -1
- package/src/components/Chip/chip.principles.stories.tsx +3 -3
- package/src/components/Coachmark/coachmark.anatomy.stories.tsx +1 -1
- package/src/components/Coachmark/coachmark.principles.stories.tsx +3 -3
- package/src/components/Coachmark/coachmark.spec.md +2 -2
- package/src/components/Combobox/combobox.anatomy.stories.tsx +14 -14
- package/src/components/Combobox/combobox.principles.stories.tsx +6 -6
- package/src/components/Combobox/combobox.spec.md +1 -1
- package/src/components/Combobox/combobox.tsx +25 -14
- package/src/components/Command/command.anatomy.stories.tsx +2 -0
- package/src/components/Command/command.principles.stories.tsx +7 -7
- package/src/components/Command/command.tsx +2 -2
- package/src/components/DataTable/cell-registry.tsx +6 -2
- package/src/components/DataTable/data-table-filter-panel.tsx +3 -3
- package/src/components/DataTable/data-table.anatomy.stories.tsx +1 -1
- package/src/components/DataTable/data-table.css +1 -1
- package/src/components/DataTable/data-table.principles.stories.tsx +3 -3
- package/src/components/DataTable/data-table.spec.md +25 -17
- package/src/components/DataTable/data-table.stories.tsx +29 -25
- package/src/components/DataTable/data-table.tsx +92 -44
- package/src/components/DateGrid/date-grid.anatomy.stories.tsx +1 -1
- package/src/components/DateGrid/date-grid.principles.stories.tsx +4 -4
- package/src/components/DateGrid/date-grid.spec.md +1 -1
- package/src/components/DatePicker/date-picker.anatomy.stories.tsx +15 -11
- package/src/components/DatePicker/date-picker.principles.stories.tsx +5 -5
- package/src/components/DatePicker/date-picker.spec.md +1 -1
- package/src/components/DatePicker/date-picker.tsx +9 -6
- package/src/components/DescriptionList/description-list.principles.stories.tsx +5 -5
- package/src/components/DescriptionList/description-list.tsx +1 -1
- package/src/components/Dialog/dialog.anatomy.stories.tsx +1 -1
- package/src/components/Dialog/dialog.principles.stories.tsx +4 -4
- package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
- package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +5 -5
- package/src/components/DropdownMenu/dropdown-menu.spec.md +1 -1
- package/src/components/Empty/empty.principles.stories.tsx +2 -2
- package/src/components/Empty/empty.tsx +2 -0
- package/src/components/Field/field-controls.spec.md +9 -6
- package/src/components/Field/field-wrapper.tsx +4 -4
- package/src/components/Field/field.principles.stories.tsx +4 -4
- package/src/components/FileItem/file-item.principles.stories.tsx +6 -5
- package/src/components/FileUpload/file-upload.principles.stories.tsx +6 -6
- package/src/components/FileUpload/file-upload.spec.md +1 -1
- package/src/components/FileViewer/file-viewer.principles.stories.tsx +5 -5
- package/src/components/HoverCard/hover-card.principles.stories.tsx +6 -6
- package/src/components/Input/input.anatomy.stories.tsx +3 -3
- package/src/components/Input/input.principles.stories.tsx +4 -4
- package/src/components/LinkInput/link-input.anatomy.stories.tsx +3 -3
- package/src/components/LinkInput/link-input.principles.stories.tsx +5 -5
- package/src/components/Menu/menu-item.principles.stories.tsx +7 -7
- package/src/components/Notice/notice.anatomy.stories.tsx +1 -1
- package/src/components/Notice/notice.principles.stories.tsx +7 -7
- package/src/components/NumberInput/number-input.anatomy.stories.tsx +8 -7
- package/src/components/NumberInput/number-input.principles.stories.tsx +4 -4
- package/src/components/NumberInput/number-input.spec.md +1 -1
- package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +5 -5
- package/src/components/OverflowIndicator/overflow-indicator.tsx +1 -1
- package/src/components/PeoplePicker/people-picker.principles.stories.tsx +3 -3
- package/src/components/PeoplePicker/people-picker.spec.md +3 -3
- package/src/components/PeoplePicker/people-picker.tsx +6 -6
- package/src/components/Popover/popover.principles.stories.tsx +5 -5
- package/src/components/ProfileCard/profile-card.anatomy.stories.tsx +1 -1
- package/src/components/ProfileCard/profile-card.principles.stories.tsx +1 -1
- package/src/components/ProfileCard/profile-card.tsx +1 -1
- package/src/components/ProgressBar/progress-bar.principles.stories.tsx +2 -2
- package/src/components/ProgressBar/progress-bar.spec.md +1 -1
- package/src/components/RadioGroup/radio-group.principles.stories.tsx +2 -2
- package/src/components/Rating/rating.anatomy.stories.tsx +2 -2
- package/src/components/Rating/rating.principles.stories.tsx +3 -3
- package/src/components/Rating/rating.spec.md +1 -1
- package/src/components/Rating/rating.tsx +1 -1
- package/src/components/ScrollArea/scroll-area.principles.stories.tsx +4 -4
- package/src/components/Select/select.anatomy.stories.tsx +18 -18
- package/src/components/Select/select.principles.stories.tsx +5 -5
- package/src/components/Select/select.spec.md +1 -1
- package/src/components/Select/select.tsx +7 -7
- package/src/components/SelectMenu/select-menu.anatomy.stories.tsx +1 -1
- package/src/components/SelectMenu/select-menu.principles.stories.tsx +8 -8
- package/src/components/SelectionControl/selection-item.principles.stories.tsx +7 -7
- package/src/components/Separator/separator.principles.stories.tsx +4 -4
- package/src/components/Sheet/sheet.principles.stories.tsx +2 -2
- package/src/components/Sidebar/sidebar.principles.stories.tsx +4 -4
- package/src/components/Sidebar/sidebar.spec.md +2 -2
- package/src/components/Skeleton/skeleton.principles.stories.tsx +5 -5
- package/src/components/Slider/slider.anatomy.stories.tsx +1 -1
- package/src/components/Slider/slider.principles.stories.tsx +3 -3
- package/src/components/Steps/steps.principles.stories.tsx +4 -4
- package/src/components/Steps/steps.spec.md +2 -2
- package/src/components/Switch/switch.principles.stories.tsx +1 -1
- package/src/components/Tabs/tabs.principles.stories.tsx +3 -3
- package/src/components/Tabs/tabs.spec.md +1 -1
- package/src/components/Tag/tag.principles.stories.tsx +3 -3
- package/src/components/Textarea/textarea.principles.stories.tsx +2 -2
- package/src/components/Textarea/textarea.tsx +3 -3
- package/src/components/TimePicker/time-picker.principles.stories.tsx +5 -5
- package/src/components/TimePicker/time-picker.spec.md +1 -1
- package/src/components/TimePicker/time-picker.tsx +11 -12
- package/src/components/Toast/toast.principles.stories.tsx +2 -2
- package/src/components/Tooltip/tooltip.principles.stories.tsx +3 -3
- package/src/components/TreeView/tree-view.principles.stories.tsx +5 -5
- package/src/components/TreeView/tree-view.stories.tsx +1 -1
- package/src/components/TreeView/tree-view.tsx +1 -1
- package/src/patterns/element-anatomy/item-anatomy.spec.md +1 -1
- package/src/patterns/element-anatomy/item-anatomy.stories.tsx +1 -1
- package/src/patterns/overlay-surface/overlay-surface.spec.md +1 -0
- package/src/patterns/resize-handle/resize-handle.spec.md +1 -1
- package/src/tokens/color/color.spec.md +2 -0
- package/src/tokens/color/semantic.css +1 -1
- package/src/tokens/uiSize/uiSize.css +5 -0
- package/src/tokens/uiSize/uiSize.spec.md +17 -3
|
@@ -42,10 +42,10 @@ export const UsageGuidance: Story = {
|
|
|
42
42
|
<p>適合 Toast 的真實業務場景(點擊跳轉「展示」頁範例):</p>
|
|
43
43
|
<ul className="space-y-1">
|
|
44
44
|
<li>
|
|
45
|
-
<LinkTo kind="Design System/Components/Toast/展示" name="有標題與描述"><span className="text-primary hover:
|
|
45
|
+
<LinkTo kind="Design System/Components/Toast/展示" name="有標題與描述"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">有 Title + Description</span></LinkTo>
|
|
46
46
|
</li>
|
|
47
47
|
<li>
|
|
48
|
-
<LinkTo kind="Design System/Components/Toast/展示" name="互動測試"><span className="text-primary hover:
|
|
48
|
+
<LinkTo kind="Design System/Components/Toast/展示" name="互動測試"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">互動測試</span></LinkTo>
|
|
49
49
|
</li>
|
|
50
50
|
</ul>
|
|
51
51
|
<p className="text-fg-muted mt-3">判斷不確定時:先看下方「何時用 / 何時不用」的對照;若訊息重要到使用者必須看到、或需要使用者確認,就不該用 Toast,改用 Alert(持久顯示)或 Dialog(阻斷確認)。</p>
|
|
@@ -49,13 +49,13 @@ export const UsageGuidance: Story = {
|
|
|
49
49
|
<p>適合 Tooltip 的真實業務場景(點擊跳轉「展示」頁範例):</p>
|
|
50
50
|
<ul className="space-y-1">
|
|
51
51
|
<li>
|
|
52
|
-
<LinkTo kind="Design System/Components/Tooltip/展示" name="非 Button 元素"><span className="text-primary hover:
|
|
52
|
+
<LinkTo kind="Design System/Components/Tooltip/展示" name="非 Button 元素"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">非 Button 元素</span></LinkTo>
|
|
53
53
|
</li>
|
|
54
54
|
<li>
|
|
55
|
-
<LinkTo kind="Design System/Components/Tooltip/展示" name="方向"><span className="text-primary hover:
|
|
55
|
+
<LinkTo kind="Design System/Components/Tooltip/展示" name="方向"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">方向</span></LinkTo>
|
|
56
56
|
</li>
|
|
57
57
|
<li>
|
|
58
|
-
<LinkTo kind="Design System/Components/Tooltip/展示" name="長文字"><span className="text-primary hover:
|
|
58
|
+
<LinkTo kind="Design System/Components/Tooltip/展示" name="長文字"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">長文字</span></LinkTo>
|
|
59
59
|
</li>
|
|
60
60
|
</ul>
|
|
61
61
|
<p className="text-fg-muted mt-3">判斷不確定時:回到「畫面上的資訊是否已足夠」這個核心問題;若提示需要被點擊或停留互動,改用近親元件(見下方「vs 近親」)。</p>
|
|
@@ -45,11 +45,11 @@ export const UsageGuidance: Story = {
|
|
|
45
45
|
<div className="prose prose-sm max-w-prose mb-8">
|
|
46
46
|
<p>適合 TreeView 的真實業務場景(點擊跳轉「展示」頁範例):</p>
|
|
47
47
|
<ul className="space-y-1">
|
|
48
|
-
<li><LinkTo kind="Design System/Components/TreeView/展示" name="檔案瀏覽"><span className="text-primary hover:
|
|
49
|
-
<li><LinkTo kind="Design System/Components/TreeView/展示" name="步驟引導"><span className="text-primary hover:
|
|
50
|
-
<li><LinkTo kind="Design System/Components/TreeView/展示" name="多選"><span className="text-primary hover:
|
|
51
|
-
<li><LinkTo kind="Design System/Components/TreeView/展示" name="長標籤"><span className="text-primary hover:
|
|
52
|
-
<li><LinkTo kind="Design System/Components/TreeView/展示" name="拖曳重排"><span className="text-primary hover:
|
|
48
|
+
<li><LinkTo kind="Design System/Components/TreeView/展示" name="檔案瀏覽"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">檔案瀏覽</span></LinkTo></li>
|
|
49
|
+
<li><LinkTo kind="Design System/Components/TreeView/展示" name="步驟引導"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">步驟引導</span></LinkTo></li>
|
|
50
|
+
<li><LinkTo kind="Design System/Components/TreeView/展示" name="多選"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">多選</span></LinkTo></li>
|
|
51
|
+
<li><LinkTo kind="Design System/Components/TreeView/展示" name="長標籤"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">長標籤</span></LinkTo></li>
|
|
52
|
+
<li><LinkTo kind="Design System/Components/TreeView/展示" name="拖曳重排"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">拖曳重排</span></LinkTo></li>
|
|
53
53
|
</ul>
|
|
54
54
|
<p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見下方 vs 近親 段)。</p>
|
|
55
55
|
</div>
|
|
@@ -245,7 +245,7 @@ export const DragAndDrop: Story = {
|
|
|
245
245
|
{renderNodes(tree)}
|
|
246
246
|
</TreeView>
|
|
247
247
|
</div>
|
|
248
|
-
<button type="button" onClick={() => setTree(INITIAL_TREE)} className="text-caption text-primary hover:
|
|
248
|
+
<button type="button" onClick={() => setTree(INITIAL_TREE)} className="text-caption text-primary hover:text-primary-hover cursor-pointer self-start">
|
|
249
249
|
重設
|
|
250
250
|
</button>
|
|
251
251
|
</div>
|
|
@@ -1057,7 +1057,7 @@ export const treeViewMeta = {
|
|
|
1057
1057
|
},
|
|
1058
1058
|
states: ['default', 'hover', 'active', 'focus-visible', 'disabled'],
|
|
1059
1059
|
tokens: {
|
|
1060
|
-
bg: ['bg-neutral-hover', 'bg-
|
|
1060
|
+
bg: ['bg-neutral-hover', 'bg-neutral-selected', 'bg-surface'],
|
|
1061
1061
|
fg: ['text-fg-disabled', 'text-fg-muted', 'text-fg-secondary', 'text-foreground'],
|
|
1062
1062
|
ring: ['ring-ring'],
|
|
1063
1063
|
},
|
|
@@ -474,7 +474,7 @@ MenuItem 承載 Switch 時,**整列 row 的 click = toggle 這個 control**(不
|
|
|
474
474
|
| 內容物高度 | 對齊容器 | 對齊目標 |
|
|
475
475
|
|---|---|---|
|
|
476
476
|
| ≤ 24px | `h-[1lh]` | 第一行 label 的垂直中心 |
|
|
477
|
-
| > 24px(+ 有 description) | `h-[calc(1lh +
|
|
477
|
+
| > 24px(+ 有 description) | `h-[calc(1lh + var(--item-gap-label-desc-<mode>[-lg]) + desc-font-size*1.3)]` | label + gap + description 文字塊的垂直中心 |
|
|
478
478
|
| > 24px(無 description) | `h-[1lh]` | 強制 inline(沒有文字塊可對齊) |
|
|
479
479
|
|
|
480
480
|
### 為什麼 prefix 和 suffix 各自獨立(不互相同步)
|
|
@@ -161,7 +161,7 @@ const SCANNING_SPECS: Record<SizeKey, TypoSpec> = {
|
|
|
161
161
|
const READING_SPECS: Record<SizeKey, TypoSpec> = {
|
|
162
162
|
sm: { labelFont: 'text-body', labelSize: '14px', labelLh: '1.5', descFont: 'text-body', descSize: '14px', descLh: '1.5', iconPx: 16 },
|
|
163
163
|
md: { labelFont: 'text-body', labelSize: '14px', labelLh: '1.5', descFont: 'text-body', descSize: '14px', descLh: '1.5', iconPx: 16 },
|
|
164
|
-
lg: { labelFont: 'text-body-lg', labelSize: '16px', labelLh: '1.5', descFont: 'text-body
|
|
164
|
+
lg: { labelFont: 'text-body-lg', labelSize: '16px', labelLh: '1.5', descFont: 'text-body', descSize: '14px', descLh: '1.5', iconPx: 20 },
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
/* ═══════════════════════════════════════════════════════════════════════════
|
|
@@ -177,6 +177,7 @@ list 不再是 body 唯一 region → **不該撤 body chrome padding**(撤了
|
|
|
177
177
|
- `border-t border-divider`
|
|
178
178
|
- `px-[var(--layout-space-loose)] py-[var(--layout-space-tight)]`
|
|
179
179
|
- `flex items-center justify-end gap-2 shrink-0`(右對齊按鈕列,不被壓縮)
|
|
180
|
+
- **Footer px = body 內容內縮原則**:預設 `layout-space-loose` 讓 footer 按鈕左緣對齊 SurfaceHeader title / SurfaceBody 內容左緣(整面板內容垂直對齊一條線,同 Body alignment rationale)。**例外**:body 為 full-bleed(滿欄 column selector / 無 chrome padding 的 unbounded list)、無內容左緣可對齊時,可經 `className` override 較緊 px(eg. TimePicker footer override `px-[var(--layout-space-tight)]` 對齊滿欄置中 columns、保窄面板平衡)。**注**:`--field-px` 是 form-field gutter 概念(uiSize),**不**用於 overlay footer——footer 屬 overlay chrome,padding 走 layoutSpace 家族。
|
|
180
181
|
|
|
181
182
|
---
|
|
182
183
|
|
|
@@ -59,7 +59,7 @@ benchmark:
|
|
|
59
59
|
取值依據:7px 命中區 / 1px line 非自創——來自下方「世界級對照細節」5 家共識(hit zone 7-8px fingertip-friendly / 1px line non-intrusive)+ DataTable v11 已 ship 的既有 canonical(本 primitive 抽取自它,M17)。
|
|
60
60
|
|
|
61
61
|
- **命中區**:7px 寬(horizontal)/ 高(vertical),`-3px` outward offset 跨 boundary 抓得到
|
|
62
|
-
- **Visual line**:1px,
|
|
62
|
+
- **Visual line**:1px,line offset 3px from the position edge(inline style `right: 3` / `bottom: 3`,非 Tailwind class — 見 tsx JIT-quirk note),default full-extent
|
|
63
63
|
- **idle**:`bg-divider`
|
|
64
64
|
- **disabled**:`bg-divider`(無 hover affordance)
|
|
65
65
|
- **hover**:`bg-[var(--border-hover)]`(via `group/resize` selector)
|
|
@@ -195,6 +195,8 @@ Icon 色彩 canonical 的 SSOT 住 `patterns/element-anatomy/item-anatomy.spec.m
|
|
|
195
195
|
<a className="text-primary hover:text-primary-hover">查看詳情</a>
|
|
196
196
|
```
|
|
197
197
|
|
|
198
|
+
**連結 hover = 換色(`text-primary-hover`),不用底線** —— `text-primary hover:underline` 偏離 canonical。真元件 Breadcrumb / Button / RadioGroup 已遵循。**例外:`LinkInput` 是「外部連結值」顯示,刻意保留 hover 底線作為「可點開連結」affordance(見 `link-input.spec.md`),非 violator**。story 導覽連結由 `check_story_invariants.sh` R10 機械防 drift(P1 warn,豁免 `// @link-style-allow:`)。
|
|
199
|
+
|
|
198
200
|
### Status
|
|
199
201
|
|
|
200
202
|
狀態色表達系統回饋,代表「系統在告訴你什麼」,不用於互動操作。
|
|
@@ -197,7 +197,7 @@
|
|
|
197
197
|
|
|
198
198
|
/* Brand / Action — 品牌主操作色
|
|
199
199
|
--primary-text 為 SOP 規定的 5 件套之一,目前無消費者
|
|
200
|
-
(Button 直接用 text-
|
|
200
|
+
(Button 直接用 text-on-emphasis, Tag 用 primitive --color-blue-7) */
|
|
201
201
|
--primary: var(--color-blue-6);
|
|
202
202
|
--primary-hover: var(--color-blue-5);
|
|
203
203
|
--primary-active: var(--color-blue-7);
|
|
@@ -24,6 +24,11 @@
|
|
|
24
24
|
--field-height-md: 2rem; /* 32px */
|
|
25
25
|
--field-height-lg: 2.25rem; /* 36px */
|
|
26
26
|
|
|
27
|
+
/* Field horizontal padding — 固定 12px(不隨 size/density);form-context field 左右內距 SSOT。
|
|
28
|
+
跟 --table-cell-px(cell-context)同 -px 慣例;Input/Select/Combobox/DatePicker/TimePicker/Textarea
|
|
29
|
+
+ tag 模式右緣 re-assert 全消費此 token(取代散落的 px-3 / inline 0.75rem,M17 SSOT 可傳播)。 */
|
|
30
|
+
--field-px: 0.75rem; /* 12px */
|
|
31
|
+
|
|
27
32
|
/* Table Row Height — DataTable */
|
|
28
33
|
--table-row-sm: 2rem; /* 32px */
|
|
29
34
|
--table-row-md: 2.5rem; /* 40px */
|
|
@@ -94,6 +94,20 @@ Consumer 寫 Form 或 Toolbar 時並排多個 field-height 元件:
|
|
|
94
94
|
|
|
95
95
|
本專案曾發生 SegmentedControl 的 code defaults 是 `md`、spec + docblock 寫 `sm ★default` 的三方不一致(2026-04-18 修正)。避免方式:改 cva `defaultVariants` 前先讀本表,確認新值仍符合 family 約束。
|
|
96
96
|
|
|
97
|
+
## Field Horizontal Padding
|
|
98
|
+
|
|
99
|
+
Form-context field 控件的左右水平內距。**固定 12px,不隨 size / density 變化**——縱向才是 density 節奏;橫向是內容溝槽常數,對齊 field-height family 全控件。
|
|
100
|
+
|
|
101
|
+
| Token | 值 | 說明 |
|
|
102
|
+
|-------|-----|------|
|
|
103
|
+
| `--field-px` | 0.75rem (12px) | form-context field 左右內距 SSOT;固定不隨 size / density |
|
|
104
|
+
|
|
105
|
+
**消費者**:`Input` / `NumberInput` / `Select` / `Combobox` / `DatePicker` / `TimePicker` / `LinkInput` / `Textarea`(經 `fieldWrapperStyles` cva `px-[var(--field-px)]`)+ `PeoplePicker`(form-context inject `!px-[var(--field-px)]`)+ tag 模式右緣 re-assert(`paddingRight: var(--field-px)`,Select / Combobox readonly + edit)。
|
|
106
|
+
|
|
107
|
+
**與 `--table-cell-px` 的關係**:同 `-px` 命名慣例。`--table-cell-px`(DataTable-scoped)預設 `var(--field-px)`(form / cell 同 12px content gutter SSOT),但仍是獨立 named token、可被 DataTable 單獨 override(per `components/Field/field-controls.spec.md` contract (c) scoped 決策)。
|
|
108
|
+
|
|
109
|
+
**Why 固定不隨 density**:density 本質是縱向密度(一屏幾列);橫向管可讀性(字離格線距離),目的不同不綁。對齊 Ant Table(橫向 padding 不隨 density 變、縱橫分離)+ 全 DS field 控件 12px 常數。M17「SSOT 必可傳播」:散落的 `px-3` / inline `0.75rem` 全收斂進此 token。
|
|
110
|
+
|
|
97
111
|
## Table Row
|
|
98
112
|
|
|
99
113
|
DataTable 行高。density 切換統一 +0.5rem (+8px)。
|
|
@@ -152,9 +166,9 @@ DataTable 行高。density 切換統一 +0.5rem (+8px)。
|
|
|
152
166
|
| Avatar 內 icon | `components/Avatar/avatar.spec.md:165` | `round_even(size × 0.6)` formula | Material / Apple HIG |
|
|
153
167
|
| Empty illustration | `components/Empty/empty.tsx:48` | Avatar 48 wrap → icon 28(Avatar formula derived)| Empty-state canonical |
|
|
154
168
|
| FileViewer thumb | `components/FileViewer/file-viewer.tsx:621` | thumb 64 → icon 20(file-type indicator hardcode 無公式)| Thumbnail UI 慣例 |
|
|
155
|
-
| CircularProgress | `components/CircularProgress/circular-progress.tsx:
|
|
156
|
-
| Steps indicator icon | `components/Steps/steps.tsx:
|
|
157
|
-
| Checkbox/Switch check | `components/Checkbox/checkbox.tsx:
|
|
169
|
+
| CircularProgress | `components/CircularProgress/circular-progress.tsx:86` | `strokeWidth = max(2, round(size/10))` stroke ring 厚度非 icon | Geometric scaling |
|
|
170
|
+
| Steps indicator icon | `components/Steps/steps.tsx:25` | `INDICATOR_ICON_SIZE {sm:0, md:16, lg:20}`(sm 因圓圈 8px 太小)| Indicator-internal |
|
|
171
|
+
| Checkbox/Switch check | `components/Checkbox/checkbox.tsx:52` + `components/Switch/switch.tsx:83` | `{sm:12, md:12, lg:16}` form-control internal + stroke 下限 12 | iOS HIG / Material 3 / Polaris | <!-- @benchmark-unverified -->
|
|
158
172
|
|
|
159
173
|
**程式化 SSOT**:`patterns/element-anatomy/item-anatomy.tsx:66` `ICON_SIZE = {sm:16, md:16, lg:20}` 是本 tier 的 type-safe const。**Form control 透過 `tokens/uiSize/icon-size.ts` re-export entry import**(避 components→patterns 反向 dependency)。
|
|
160
174
|
|