@qijenchen/design-system 0.1.0-beta.3
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/package.json +93 -0
- package/src/README.md +32 -0
- package/src/components/Accordion/accordion.tsx +104 -0
- package/src/components/Alert/alert.tsx +188 -0
- package/src/components/AppShell/_demo-helpers.tsx +198 -0
- package/src/components/AppShell/app-shell.tsx +364 -0
- package/src/components/AspectRatio/aspect-ratio.tsx +58 -0
- package/src/components/Avatar/avatar.tsx +368 -0
- package/src/components/Badge/badge.tsx +104 -0
- package/src/components/Breadcrumb/breadcrumb.tsx +609 -0
- package/src/components/BulkActionBar/bulk-action-bar.tsx +156 -0
- package/src/components/Button/button-group.tsx +96 -0
- package/src/components/Button/button.tsx +539 -0
- package/src/components/Calendar/calendar.tsx +411 -0
- package/src/components/Carousel/carousel.tsx +371 -0
- package/src/components/Chart/chart.tsx +376 -0
- package/src/components/Checkbox/checkbox-group.tsx +94 -0
- package/src/components/Checkbox/checkbox.tsx +237 -0
- package/src/components/Chip/chip.tsx +359 -0
- package/src/components/CircularProgress/circular-progress.tsx +204 -0
- package/src/components/Coachmark/coachmark.tsx +255 -0
- package/src/components/Combobox/combobox.tsx +826 -0
- package/src/components/Command/command.tsx +187 -0
- package/src/components/DataTable/active-editor-controller.ts +72 -0
- package/src/components/DataTable/cell-registry.tsx +520 -0
- package/src/components/DataTable/column-types.ts +180 -0
- package/src/components/DataTable/data-table-column-visibility-panel.tsx +261 -0
- package/src/components/DataTable/data-table-filter-panel.tsx +813 -0
- package/src/components/DataTable/data-table-interaction-layer.tsx +483 -0
- package/src/components/DataTable/data-table-sort-manager.tsx +210 -0
- package/src/components/DataTable/data-table.css +165 -0
- package/src/components/DataTable/data-table.tsx +2924 -0
- package/src/components/DataTable/filter-operators.ts +225 -0
- package/src/components/DataTable/filter-tree.ts +313 -0
- package/src/components/DataTable/lib/column-meta.ts +79 -0
- package/src/components/DateGrid/date-grid.tsx +209 -0
- package/src/components/DatePicker/date-picker.tsx +1114 -0
- package/src/components/DescriptionList/description-list.tsx +141 -0
- package/src/components/Dialog/dialog.tsx +267 -0
- package/src/components/DropdownMenu/dropdown-menu.tsx +475 -0
- package/src/components/Empty/empty.tsx +108 -0
- package/src/components/Field/field-context.ts +136 -0
- package/src/components/Field/field-types.ts +52 -0
- package/src/components/Field/field-wrapper.tsx +348 -0
- package/src/components/Field/field.tsx +535 -0
- package/src/components/FieldControlGroup/field-control-group.tsx +136 -0
- package/src/components/FileItem/file-item.tsx +322 -0
- package/src/components/FileUpload/file-upload.tsx +326 -0
- package/src/components/FileViewer/file-viewer-types.ts +76 -0
- package/src/components/FileViewer/file-viewer.tsx +1065 -0
- package/src/components/FileViewer/image-renderer.tsx +256 -0
- package/src/components/HoverCard/hover-card.tsx +79 -0
- package/src/components/Input/input.tsx +233 -0
- package/src/components/LinkInput/link-input.tsx +304 -0
- package/src/components/Menu/menu-item.tsx +334 -0
- package/src/components/NameCard/name-card.tsx +319 -0
- package/src/components/Notice/notice.tsx +196 -0
- package/src/components/NumberInput/number-input.tsx +203 -0
- package/src/components/OverflowIndicator/overflow-indicator.tsx +156 -0
- package/src/components/PeoplePicker/avatar-stack-overflow.ts +100 -0
- package/src/components/PeoplePicker/people-picker-helpers.ts +76 -0
- package/src/components/PeoplePicker/people-picker.tsx +455 -0
- package/src/components/PeoplePicker/person-display.tsx +358 -0
- package/src/components/Popover/popover.tsx +183 -0
- package/src/components/ProgressBar/progress-bar.tsx +157 -0
- package/src/components/README.md +58 -0
- package/src/components/RadioGroup/radio-group.tsx +261 -0
- package/src/components/Rating/rating.tsx +295 -0
- package/src/components/ScrollArea/scroll-area.tsx +110 -0
- package/src/components/SegmentedControl/segmented-control.tsx +304 -0
- package/src/components/Select/select.tsx +658 -0
- package/src/components/SelectMenu/select-menu.tsx +430 -0
- package/src/components/SelectionControl/selection-item.tsx +261 -0
- package/src/components/Separator/separator.tsx +48 -0
- package/src/components/Sheet/sheet.tsx +240 -0
- package/src/components/Sidebar/sidebar.tsx +1280 -0
- package/src/components/Skeleton/skeleton.tsx +35 -0
- package/src/components/Slider/slider.tsx +158 -0
- package/src/components/Steps/steps.tsx +850 -0
- package/src/components/Switch/switch.tsx +285 -0
- package/src/components/Tabs/tabs.tsx +515 -0
- package/src/components/Tag/tag.tsx +246 -0
- package/src/components/Textarea/textarea.tsx +280 -0
- package/src/components/TimePicker/time-columns.tsx +260 -0
- package/src/components/TimePicker/time-picker.tsx +419 -0
- package/src/components/Toast/toast.tsx +129 -0
- package/src/components/Tooltip/tooltip.tsx +68 -0
- package/src/components/TreeView/tree-view.tsx +1031 -0
- package/src/hooks/use-controllable.ts +40 -0
- package/src/hooks/use-is-narrow-viewport.ts +19 -0
- package/src/hooks/use-is-touch-device.ts +21 -0
- package/src/hooks/use-overflow-items.ts +256 -0
- package/src/index.ts +85 -0
- package/src/lib/README.md +82 -0
- package/src/lib/drag-visual.ts +272 -0
- package/src/lib/i18n/README.md +60 -0
- package/src/lib/i18n/i18n-context.tsx +129 -0
- package/src/lib/multi-select-ordering.ts +61 -0
- package/src/lib/utils.ts +93 -0
- package/src/patterns/README.md +67 -0
- package/src/patterns/element-anatomy/item-anatomy.tsx +744 -0
- package/src/patterns/header-canonical/chrome-header.tsx +175 -0
- package/src/patterns/header-canonical/header-canonical.css +27 -0
- package/src/patterns/horizontal-overflow/horizontal-overflow.tsx +217 -0
- package/src/patterns/overlay-surface/overlay-surface.tsx +191 -0
- package/src/patterns/resize-handle/resize-handle.tsx +188 -0
- package/src/stories-helpers/anatomy/anatomy-utils.tsx +64 -0
- package/src/tokens/README.md +53 -0
- package/src/tokens/color/primitives.css +429 -0
- package/src/tokens/color/semantic.css +539 -0
- package/src/tokens/elevation/overlay-geometry.ts +13 -0
- package/src/tokens/layoutSpace/layoutSpace.css +36 -0
- package/src/tokens/motion/motion.css +30 -0
- package/src/tokens/motion/motion.ts +17 -0
- package/src/tokens/opacity/opacity.css +23 -0
- package/src/tokens/radius/radius.css +19 -0
- package/src/tokens/typography/typography.css +118 -0
- package/src/tokens/uiSize/icon-size.ts +52 -0
- package/src/tokens/uiSize/uiSize.css +125 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/* DataTable Cell Padding
|
|
2
|
+
─────────────────────────────────────────────────────────
|
|
3
|
+
py = (table-row-height - 1lh) / 2 — 單行時行高 = table-row token
|
|
4
|
+
px = 12px(固定,不隨 density 變;Phase C 2026-05-05 從 magic 0.75rem
|
|
5
|
+
提升為 token --table-cell-px,SSOT 給 cellPadding consumer)
|
|
6
|
+
1lh 在使用時解析,跟隨元素的 computed line-height
|
|
7
|
+
───────────────────────────────────────────────────────── */
|
|
8
|
+
|
|
9
|
+
:root {
|
|
10
|
+
--table-cell-px: 0.75rem;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
[data-table-size="sm"] {
|
|
14
|
+
--table-cell-py: calc((var(--table-row-sm) - 1lh) / 2);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
:root,
|
|
18
|
+
[data-table-size="md"] {
|
|
19
|
+
--table-cell-py: calc((var(--table-row-md) - 1lh) / 2);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
[data-table-size="lg"] {
|
|
23
|
+
--table-cell-py: calc((var(--table-row-lg) - 1lh) / 2);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* ────────────────────────────────────────────────────────────
|
|
27
|
+
DataTable scrollbar canonical(2026-05-07 v15.13 Bug H interim CSS parity)
|
|
28
|
+
────────────────────────────────────────────────────────────
|
|
29
|
+
**Problem**:Windows 原生 V scrollbar (~17px) + 圓角 outer wrapper (`rounded-md
|
|
30
|
+
overflow-hidden`)→ scrollbar 一半被圓角 mask 裁切;corner(V/H 交叉處)用
|
|
31
|
+
browser default 灰色,跟 table surface 不一致 → user 看到「scrollbar 溢出 table」。
|
|
32
|
+
macOS overlay scrollbar(0px)沒這問題。
|
|
33
|
+
|
|
34
|
+
**Interim fix**(non-ScrollArea 路徑;ScrollArea migration 是獨立 RFC,本案不上):
|
|
35
|
+
- V scrollbar 也 customize(width 10px 對稱 H)
|
|
36
|
+
- `::-webkit-scrollbar-corner` themed(跟 track 同色,消除 cross-OS 視覺差)
|
|
37
|
+
- Firefox `scrollbar-width: thin` + `scrollbar-color`(已 set,line 55-56)
|
|
38
|
+
|
|
39
|
+
**對齊**:AG Grid theme-level scrollbar customization / MUI DataGrid scrollbar override
|
|
40
|
+
/ Polaris IndexTable native+CSS pattern(world-class 派 native+CSS,非 ScrollArea)。
|
|
41
|
+
|
|
42
|
+
── 關鍵 fix(2026-04-30):scope 只給 :horizontal ──
|
|
43
|
+
原本 `::-webkit-scrollbar { display:block }` 套到雙軸 → V 軸也被強制顯
|
|
44
|
+
(即使無 overflow),使 content 小時仍見 V 捲軸 + 觸發 ~2px scrollHeight
|
|
45
|
+
discrepancy 讓 hasVScroll=true。修正:`:horizontal` only,V 軸跟隨
|
|
46
|
+
browser default(只在 overflow 顯)。
|
|
47
|
+
*/
|
|
48
|
+
[data-datatable-hscroll]::-webkit-scrollbar:horizontal {
|
|
49
|
+
height: 10px;
|
|
50
|
+
/* 移 display:block — 讓 browser overflow 時自動顯,不顯示空 bar */
|
|
51
|
+
}
|
|
52
|
+
[data-datatable-hscroll]::-webkit-scrollbar:vertical {
|
|
53
|
+
width: 10px;
|
|
54
|
+
/* 對稱 H,Windows native ~17px → 10px,跟 table 圓角 outer 兼容 */
|
|
55
|
+
}
|
|
56
|
+
[data-datatable-hscroll]::-webkit-scrollbar-track {
|
|
57
|
+
background: var(--scrollbar-track);
|
|
58
|
+
}
|
|
59
|
+
[data-datatable-hscroll]::-webkit-scrollbar-thumb {
|
|
60
|
+
background: var(--scrollbar-thumb);
|
|
61
|
+
border-radius: 5px;
|
|
62
|
+
}
|
|
63
|
+
[data-datatable-hscroll]::-webkit-scrollbar-thumb:hover {
|
|
64
|
+
background: var(--scrollbar-thumb-hover);
|
|
65
|
+
}
|
|
66
|
+
[data-datatable-hscroll]::-webkit-scrollbar-corner {
|
|
67
|
+
background: var(--scrollbar-track);
|
|
68
|
+
/* V/H 交叉 corner 跟 track 同色,消除 Windows default 灰格 */
|
|
69
|
+
}
|
|
70
|
+
/* Firefox fallback:standard scrollbar properties only(no `::-webkit-scrollbar` support)。
|
|
71
|
+
Static thumb color;Firefox 沒 hover pseudo,本來就只能 static。 */
|
|
72
|
+
[data-datatable-hscroll] {
|
|
73
|
+
scrollbar-width: thin;
|
|
74
|
+
scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/* Chromium / Safari fix(2026-05-10 user-reported scrollbar-thumb hover 顏色失效)。
|
|
78
|
+
Root cause(codex Q3.10 deep-dive):Chrome 121+ 支援標準 `scrollbar-color` 後,
|
|
79
|
+
標準屬性 override `::-webkit-scrollbar-thumb:hover` 的 background → hover rule 失效。
|
|
80
|
+
Cite: MDN ::-webkit-scrollbar / developer.chrome.com/docs/css-ui/scrollbar-styling
|
|
81
|
+
Fix: `@supports selector(::-webkit-scrollbar)` 偵測 webkit 引擎 → unset 標準屬性 →
|
|
82
|
+
webkit pseudo path 接管 → `:hover` rule 重新生效。 */
|
|
83
|
+
@supports selector(::-webkit-scrollbar) {
|
|
84
|
+
[data-datatable-hscroll] {
|
|
85
|
+
scrollbar-width: auto;
|
|
86
|
+
scrollbar-color: auto;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* ────────────────────────────────────────────────────────────
|
|
91
|
+
Cell grid geometry(Phase 9 Issue 8 fix,2026-05-10)
|
|
92
|
+
────────────────────────────────────────────────────────────
|
|
93
|
+
Per codex Layer B 重比稿 verdict + user 「保全 field border 在 cell 內也能完美 SSOT」
|
|
94
|
+
approval keyword「就接受」:
|
|
95
|
+
|
|
96
|
+
**Architecture**:
|
|
97
|
+
- DataTable owns 4-edge cell grid lines(本 class)
|
|
98
|
+
- Field naked edit owns its own border(per `field-controls.spec.md` + Field state machine SSOT)
|
|
99
|
+
- DataTable layer owns hover / selection / range overlay paint(measured rect,4-edge consistent)
|
|
100
|
+
|
|
101
|
+
**Implementation**:`box-shadow: inset` 4 邊 1px divider,**不佔 layout space**,**不影響
|
|
102
|
+
content 起始位置**(per user verbatim「在 cell 內容起始位置不變的前提下」原則):
|
|
103
|
+
- 之前 cell 用 `border-r border-divider` 只右邊 → hover overlay outline:-1px 只右邊壓
|
|
104
|
+
cell border,上左下 sub-pixel 不一致(user 抓到「右 1px / 上左下 2px」bug)
|
|
105
|
+
- 改用 inset box-shadow 4 邊 → cell 4 邊都有 grid divider line → overlay outline -1px
|
|
106
|
+
在 4 邊都剛好壓 cell border line in-place → 4 邊 SSOT 視覺一致
|
|
107
|
+
|
|
108
|
+
Cell wrapper 加此 class 取代 `border-r border-divider`(inline edit + spreadsheet mode)。
|
|
109
|
+
|
|
110
|
+
World-class cite:AG Grid javascript-data-grid/cell-editing-start-stop / MUI X Data Grid
|
|
111
|
+
editing — separation of grid interaction model from editor component。
|
|
112
|
+
──────────────────────────────────────────────────────────── */
|
|
113
|
+
.dtCellGrid {
|
|
114
|
+
/* 2026-05-10 fix v2:只保 right shadow(`inset -1px 0`),bottom 由 row.border-b 接管。
|
|
115
|
+
2026-05-12 fix v3(user 抓「pinned 分隔線還是 2px,不是說整個 table 格線 1px 嗎?」):
|
|
116
|
+
每個 panel(left/center/right)最右 cell 不該 paint shadow,因為:
|
|
117
|
+
- Left panel 最右 cell 旁:panel `border-r border-divider`(data-table.tsx:2169/2213)
|
|
118
|
+
- Center panel 最右 cell 旁:outer container border(rounded-md)
|
|
119
|
+
- Right panel 最右 cell 旁:outer container border
|
|
120
|
+
若 cell shadow 跟 panel/outer border 重疊 = 2px 視覺。
|
|
121
|
+
Fix v3:`:not(:last-child)` 排除每 panel 最右 cell,讓 panel/outer border 唯一 own
|
|
122
|
+
panel-boundary 視覺。對齊 spec.md L462 grid line 1px SSOT canonical。 */
|
|
123
|
+
box-shadow: inset -1px 0 0 var(--divider);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.dtCellGrid:last-child {
|
|
127
|
+
/* 每 panel 最右 cell:panel border-r 或 outer rounded border 接管。
|
|
128
|
+
cell shadow set 為 none 避免 2px 重疊。 */
|
|
129
|
+
box-shadow: none;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* Phase 9 Issue 1 fix(2026-05-10):range cells bg fill — cell 自身 bg layer
|
|
133
|
+
(在 cell content 之下),non-overlay。Per codex Q1 verdict 對齊 row selected idiom
|
|
134
|
+
`--primary-subtle`(`data-table.spec.md` L170-174)。
|
|
135
|
+
Layer 不再畫 RangeFill div(避免 layer fixed positioned bg 蓋 cell content)。 */
|
|
136
|
+
/* 2026-05-13 V1.6 fix(codex caught medium severity):disabled cell bg dominance — disabled cell
|
|
137
|
+
included in spreadsheet range 不該被 range fill 蓋過,disabled state visual 必勝。 */
|
|
138
|
+
[data-range-cell]:not([data-cell-disabled="true"]) {
|
|
139
|
+
background: var(--primary-subtle);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/* First-row / first-column variants:turn transparent top/left into real divider 若 outer container
|
|
143
|
+
沒有自己 border 提供。當前 DataTable outer 有 rounded border 包整 table → first row top + first col
|
|
144
|
+
left 視覺由 outer border 接,所以本 class 4 邊全 divider OK 不重複。 */
|
|
145
|
+
|
|
146
|
+
/* ────────────────────────────────────────────────────────────
|
|
147
|
+
`__select__` ad-hoc cell-shadow rule retire(2026-05-12 Round 5,user Q5 拍板)+
|
|
148
|
+
Panel boundary divider canonical(Round 5.2 re-apply per user「你們都同意就做」):
|
|
149
|
+
────────────────────────────────────────────────────────────
|
|
150
|
+
原 `[data-column-id="__select__"]:not(:last-child)` retire — 走 inlineEdit canonical。
|
|
151
|
+
|
|
152
|
+
Panel boundary mechanism 用 `box-shadow: inset` 畫 divider 在 panel 內側 1px,**不用**
|
|
153
|
+
`border-r/l border-divider` outer edge。為何:Windows V scrollbar paint 蓋 outer-edge
|
|
154
|
+
border(Roadmap demo right panel border invisible per 2026-05-12 user 抓)。inset shadow
|
|
155
|
+
paint-only 不入 box model,跟 `.dtCellGrid` SSOT pattern 一致。對齊 MUI X column pinning
|
|
156
|
+
border+shadow option / AG Grid issue #1220。Codex M31 Layer C evaluated YES。
|
|
157
|
+
──────────────────────────────────────────────────────────── */
|
|
158
|
+
.dtPanelBoundaryRight {
|
|
159
|
+
box-shadow: inset -1px 0 0 var(--divider);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.dtPanelBoundaryLeft {
|
|
163
|
+
box-shadow: inset 1px 0 0 var(--divider);
|
|
164
|
+
}
|
|
165
|
+
|