@manohub/ui 0.6.0

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.
Files changed (169) hide show
  1. package/README.md +141 -0
  2. package/dist/components/avatar/index.d.ts +283 -0
  3. package/dist/components/avatar/index.js +167 -0
  4. package/dist/components/badge/index.d.ts +132 -0
  5. package/dist/components/badge/index.js +99 -0
  6. package/dist/components/button/index.d.ts +578 -0
  7. package/dist/components/button/index.js +191 -0
  8. package/dist/components/capsule/index.d.ts +161 -0
  9. package/dist/components/capsule/index.js +101 -0
  10. package/dist/components/card/index.d.ts +456 -0
  11. package/dist/components/card/index.js +231 -0
  12. package/dist/components/checkbox/index.d.ts +331 -0
  13. package/dist/components/checkbox/index.js +165 -0
  14. package/dist/components/code/index.d.ts +134 -0
  15. package/dist/components/code/index.js +117 -0
  16. package/dist/components/code-editor/index.d.ts +163 -0
  17. package/dist/components/code-editor/index.js +98 -0
  18. package/dist/components/collapse/index.d.ts +125 -0
  19. package/dist/components/collapse/index.js +95 -0
  20. package/dist/components/control-size.d.ts +8 -0
  21. package/dist/components/dialog/index.d.ts +224 -0
  22. package/dist/components/dialog/index.js +194 -0
  23. package/dist/components/divider/index.d.ts +64 -0
  24. package/dist/components/divider/index.js +62 -0
  25. package/dist/components/drawer/index.d.ts +226 -0
  26. package/dist/components/drawer/index.js +190 -0
  27. package/dist/components/filter/index.d.ts +391 -0
  28. package/dist/components/filter/index.js +203 -0
  29. package/dist/components/form/index.d.ts +704 -0
  30. package/dist/components/form/index.js +329 -0
  31. package/dist/components/input/index.d.ts +980 -0
  32. package/dist/components/input/index.js +334 -0
  33. package/dist/components/layout/index.d.ts +162 -0
  34. package/dist/components/layout/index.js +100 -0
  35. package/dist/components/list-view/index.d.ts +563 -0
  36. package/dist/components/list-view/index.js +221 -0
  37. package/dist/components/loading/index.d.ts +77 -0
  38. package/dist/components/loading/index.js +40 -0
  39. package/dist/components/nav/index.d.ts +293 -0
  40. package/dist/components/nav/index.js +164 -0
  41. package/dist/components/notice/index.d.ts +137 -0
  42. package/dist/components/notice/index.js +101 -0
  43. package/dist/components/notification/index.d.ts +118 -0
  44. package/dist/components/notification/index.js +99 -0
  45. package/dist/components/page/index.d.ts +276 -0
  46. package/dist/components/page/index.js +351 -0
  47. package/dist/components/page/split-resize.d.ts +42 -0
  48. package/dist/components/page/split-resize.js +36 -0
  49. package/dist/components/pagination/index.d.ts +171 -0
  50. package/dist/components/pagination/index.js +226 -0
  51. package/dist/components/panel/index.d.ts +401 -0
  52. package/dist/components/panel/index.js +193 -0
  53. package/dist/components/part-padding.d.ts +27 -0
  54. package/dist/components/part-padding.js +23 -0
  55. package/dist/components/query-state/index.d.ts +207 -0
  56. package/dist/components/query-state/index.js +181 -0
  57. package/dist/components/radio/index.d.ts +473 -0
  58. package/dist/components/radio/index.js +250 -0
  59. package/dist/components/search/index.d.ts +167 -0
  60. package/dist/components/search/index.js +105 -0
  61. package/dist/components/select/index.d.ts +252 -0
  62. package/dist/components/select/index.js +281 -0
  63. package/dist/components/skeleton/index.d.ts +88 -0
  64. package/dist/components/skeleton/index.js +56 -0
  65. package/dist/components/steps/index.d.ts +199 -0
  66. package/dist/components/steps/index.js +117 -0
  67. package/dist/components/switch/index.d.ts +150 -0
  68. package/dist/components/switch/index.js +103 -0
  69. package/dist/components/table/index.d.ts +351 -0
  70. package/dist/components/table/index.js +286 -0
  71. package/dist/components/tabs/index.d.ts +179 -0
  72. package/dist/components/tabs/index.js +153 -0
  73. package/dist/components/tabset/index.d.ts +105 -0
  74. package/dist/components/tabset/index.js +68 -0
  75. package/dist/components/tag/index.d.ts +203 -0
  76. package/dist/components/tag/index.js +144 -0
  77. package/dist/components/toast/index.d.ts +271 -0
  78. package/dist/components/toast/index.js +116 -0
  79. package/dist/components/tooltip/index.d.ts +126 -0
  80. package/dist/components/tooltip/index.js +97 -0
  81. package/dist/components/tree/index.d.ts +317 -0
  82. package/dist/components/tree/index.js +251 -0
  83. package/dist/components/upload/index.d.ts +384 -0
  84. package/dist/components/upload/index.js +172 -0
  85. package/dist/index.d.ts +63 -0
  86. package/dist/index.js +102 -0
  87. package/dist/services/base.d.ts +21 -0
  88. package/dist/services/base.js +42 -0
  89. package/dist/services/dialog.d.ts +41 -0
  90. package/dist/services/dialog.js +83 -0
  91. package/dist/services/index.d.ts +12 -0
  92. package/dist/services/loading.d.ts +21 -0
  93. package/dist/services/loading.js +41 -0
  94. package/dist/services/toast.d.ts +40 -0
  95. package/dist/services/toast.js +74 -0
  96. package/dist/styles/components/avatar.css +128 -0
  97. package/dist/styles/components/avatar.tokens.css +24 -0
  98. package/dist/styles/components/badge.css +237 -0
  99. package/dist/styles/components/button.css +454 -0
  100. package/dist/styles/components/button.tokens.css +56 -0
  101. package/dist/styles/components/capsule.css +120 -0
  102. package/dist/styles/components/capsule.tokens.css +27 -0
  103. package/dist/styles/components/card.css +192 -0
  104. package/dist/styles/components/checkbox.css +145 -0
  105. package/dist/styles/components/checkbox.tokens.css +26 -0
  106. package/dist/styles/components/code-editor.css +91 -0
  107. package/dist/styles/components/code-editor.tokens.css +24 -0
  108. package/dist/styles/components/code.css +153 -0
  109. package/dist/styles/components/code.tokens.css +29 -0
  110. package/dist/styles/components/collapse.css +62 -0
  111. package/dist/styles/components/collapse.tokens.css +20 -0
  112. package/dist/styles/components/dialog.css +106 -0
  113. package/dist/styles/components/dialog.tokens.css +24 -0
  114. package/dist/styles/components/divider.css +71 -0
  115. package/dist/styles/components/divider.tokens.css +21 -0
  116. package/dist/styles/components/drawer.css +143 -0
  117. package/dist/styles/components/drawer.tokens.css +22 -0
  118. package/dist/styles/components/filter.css +41 -0
  119. package/dist/styles/components/filter.tokens.css +14 -0
  120. package/dist/styles/components/form.css +220 -0
  121. package/dist/styles/components/form.tokens.css +15 -0
  122. package/dist/styles/components/input.css +445 -0
  123. package/dist/styles/components/input.tokens.css +41 -0
  124. package/dist/styles/components/layout.css +198 -0
  125. package/dist/styles/components/list-view.css +244 -0
  126. package/dist/styles/components/loading.css +76 -0
  127. package/dist/styles/components/loading.tokens.css +23 -0
  128. package/dist/styles/components/nav.css +48 -0
  129. package/dist/styles/components/notice.css +153 -0
  130. package/dist/styles/components/notice.tokens.css +17 -0
  131. package/dist/styles/components/notification.css +159 -0
  132. package/dist/styles/components/notification.tokens.css +37 -0
  133. package/dist/styles/components/page.css +473 -0
  134. package/dist/styles/components/pagination.css +297 -0
  135. package/dist/styles/components/pagination.tokens.css +32 -0
  136. package/dist/styles/components/panel.css +77 -0
  137. package/dist/styles/components/query-state.css +88 -0
  138. package/dist/styles/components/radio.css +271 -0
  139. package/dist/styles/components/radio.tokens.css +26 -0
  140. package/dist/styles/components/search.css +30 -0
  141. package/dist/styles/components/select.css +242 -0
  142. package/dist/styles/components/select.tokens.css +33 -0
  143. package/dist/styles/components/skeleton.css +60 -0
  144. package/dist/styles/components/skeleton.tokens.css +27 -0
  145. package/dist/styles/components/steps.css +157 -0
  146. package/dist/styles/components/steps.tokens.css +42 -0
  147. package/dist/styles/components/switch.css +165 -0
  148. package/dist/styles/components/switch.tokens.css +26 -0
  149. package/dist/styles/components/table.css +439 -0
  150. package/dist/styles/components/table.tokens.css +41 -0
  151. package/dist/styles/components/tabs.css +234 -0
  152. package/dist/styles/components/tabs.tokens.css +30 -0
  153. package/dist/styles/components/tag.css +200 -0
  154. package/dist/styles/components/tag.tokens.css +30 -0
  155. package/dist/styles/components/toast.css +150 -0
  156. package/dist/styles/components/toast.tokens.css +26 -0
  157. package/dist/styles/components/tooltip.css +89 -0
  158. package/dist/styles/components/tooltip.tokens.css +25 -0
  159. package/dist/styles/components/tree.css +139 -0
  160. package/dist/styles/components/tree.tokens.css +20 -0
  161. package/dist/styles/components/upload.css +150 -0
  162. package/dist/styles/components/upload.tokens.css +27 -0
  163. package/dist/styles/index.css +149 -0
  164. package/dist/styles/operations/collapse.css +84 -0
  165. package/dist/styles/operations/popup.css +189 -0
  166. package/dist/styles/operations/tabset.css +57 -0
  167. package/dist/utils/state-illustration.d.ts +31 -0
  168. package/dist/utils/state-illustration.js +156 -0
  169. package/package.json +62 -0
@@ -0,0 +1,439 @@
1
+ /**
2
+ * Table —— 表格(表头/行/单元格类型 + 行态四档 + 固定表头与列 + 批量栏与合计行)。
3
+ *
4
+ * 出处(**两套来源在关键几何上一致**,故此处没有取舍余地):
5
+ * - `@aihub/theme` 的 `src/components/table.css`:表头 **34** / 行 **30** / 字号 13 / 勾选列 40 /
6
+ * 省略号 150 / 拖拽线 3×40 / 合计行 40;
7
+ * - 设计稿《MH后台-0911》:表头 **34**(`0:3962` 1160×34)/ 行 **30**(`0:3956`–`0:3961` 919×30,
8
+ * 节距 31 = 30 + 1px 线)/ 表头底 `#f1f2f5`(= `--ui-base-200`)/ 行线 `#e6e6e6`
9
+ * (每行 `DROP_SHADOW(0,1,b0,#e6e6e6)`)/ 外框 `#e6e6e6 @1` / 选中行底 `#dbe9ff`
10
+ * (= `--ui-primary-subtle`)。
11
+ *
12
+ * ⚠️ 改前这里写的是 44 / 46 —— 与上面两套来源**都不符**,是历史遗留值(文件头注释一直写着 34/30,
13
+ * 是代码没跟上),本轮已归位。
14
+ *
15
+ * **单元格左右内距保持 16(`--ui-space-4`)**:设计稿里可量的只有「勾选框距表左 20」这一处,
16
+ * 而它量的是**内容盒**、不是单元格盒(勾选列 40 宽 + 居中时内容盒落在 13 处),无法唯一反推内距,
17
+ * 故不作推测性改动。勾选列宽 `40` 也不动,理由同此。
18
+ *
19
+ * 行态:表头底 `--ui-base-200` + 字 `--ui-base-content-muted` + 中粗 / 外框 1px `--ui-base-300` /
20
+ * 斑马与禁用 `--ui-base-200` / 滑过 `--ui-primary-weak` / 选中 `--ui-primary-subtle`(**只底色**)。
21
+ *
22
+ * 四条必须照做的**结构**决定(做错就与规范不是一回事):
23
+ *
24
+ * 1. **边框模型**:默认是**外框**(画在 `.mh-table` 上)+ 表头下分割线 + 每行底线(末行去线),
25
+ * 故 `border-collapse: separate` + `border-spacing: 0` —— 圆角只有在 separate 下才渲染得出来;
26
+ * `--borderless` 才切回 `collapse` 并去掉外框。
27
+ * **三条线之外的边一律显式清零**(`border: 0` 写在 `th` / `td` / `tr` 上,不是冗余):特异性只在
28
+ * **同一个属性**上分胜负,宿主给单元格或行下的整圈边框(典型是 markdown 正文的
29
+ * `.vp-doc th, .vp-doc td { border: 1px solid }`、`.vp-doc tr { border-top: ... }`)不会被本件
30
+ * "没写的边"顶掉,结果就是与表外框叠成 2px、行交界处叠成 2px、还多出列分隔线。
31
+ * 2. **斑马纹是显式类**(`.is-striped`)而非 `:nth-child(even)`:表里可以插分组行,`nth-child` 会整表错位
32
+ * —— 这是规范里唯一允许"用类代替结构选择器"的豁免。
33
+ * 3. **行选中由行内的选择控件驱动**(`tr:has(input:checked)`):这样零 JS 也能选中;
34
+ * 组件态给 `[data-state='selected']`,静态档给 `.is-selected` —— 三源等价。
35
+ * 勾选列复用 `Checkbox` **组件**(不在表格里手写原生 input):该件内部才是真实 `<input type="checkbox">`,
36
+ * 故 `:has(input:checked)` 这条路径照旧成立;`Checkbox` 的框体带 `data-state`(checked / indeterminate),
37
+ * 半选与选中都走它自己的样式数据,表格这边不再画方块。
38
+ * 4. **固定列必须自带底**(`background: var(--ui-base-100)`):它是 sticky 的,不遮挡就会被滚过的单元格透出。
39
+ *
40
+ * **不做**:排序与列宽拖拽的**算法**(规范只给了 `↕` 字形与 3×40 拖拽线这两处视觉),也不做空态/加载态
41
+ * (规范表格里没有这两个样张 —— 三态归 `QueryState`)。
42
+ */
43
+ .mh-table-wrapper {
44
+ overflow: auto;
45
+ }
46
+ /* `--fill` 档把外框从表移交给包裹层(表自己不再画框,改由包裹层画满高框) */
47
+ .mh-table-wrapper:has(> .mh-table--fill) {
48
+ border: 1px solid var(--ui-table-border);
49
+ border-radius: var(--ui-table-radius);
50
+ }
51
+ .mh-table-scroll {
52
+ max-height: var(--ui-table-scroll-height); /* 规范样张 132(实际用按需覆盖) */
53
+ overflow: auto;
54
+ }
55
+
56
+ /* 几何只挂在 `<table>` 上:令牌在同名 `.tokens.css`(锚 `[data-manohub-ui]`),几何若跟着挂会给包裹层加边框与圆角 */
57
+ .mh-table {
58
+ width: 100%;
59
+ border: 1px solid var(--ui-table-border);
60
+ border-collapse: separate; /* 圆角需要 separate(见文件头第 1 条) */
61
+ border-spacing: 0;
62
+ border-radius: var(--ui-table-radius);
63
+ font-size: var(--ui-table-font-size);
64
+ color: var(--ui-table-text);
65
+ background: var(--ui-base-100);
66
+ }
67
+ /* 无框档:去外框并切回 collapse(不再需要圆角) */
68
+ .mh-table--borderless {
69
+ border: none;
70
+ border-collapse: collapse;
71
+ border-radius: 0;
72
+ }
73
+ /* 满高档:外框交包裹层,去掉自己的圆角(否则内外两层圆角会露缝) */
74
+ .mh-table--fill {
75
+ border: none;
76
+ border-radius: 0;
77
+ }
78
+ /* 紧凑档 */
79
+ .mh-table--xs {
80
+ --ui-table-head-height: 36px;
81
+ --ui-table-row-height: 38px;
82
+ }
83
+ /* 窄屏下的最小宽(触发横向滚动,而不是把列压扁) */
84
+ .mh-table--wide {
85
+ min-width: 620px;
86
+ }
87
+
88
+ /* ===== 表头 =====
89
+ * `border: 0` **不是冗余**:本件只画「表外框 + 表头分割线 + 每行底线」三条,其余边必须显式清零。
90
+ * 特异性和平局只发生在**同一个属性**上 —— 本件只声明 `border-bottom` 时,宿主给单元格下的整圈边框
91
+ * (典型:markdown 正文的 `.vp-doc th, .vp-doc td { border: 1px solid }`)不会被任何组件声明顶掉,
92
+ * 于是单元格四边各来一条:与表外框叠成 2px、每行交界处上一行底线 + 本行顶线叠成 2px,还凭空多出列分隔线。
93
+ * 这三条不是「装饰」而是边框模型的一部分,故与 `border-bottom` 写在同一规则里(0-1-2 压过 `.vp-doc th` 0-1-1)。 */
94
+ .mh-table thead th {
95
+ height: var(--ui-table-head-height);
96
+ padding: 0 var(--ui-table-padding-x);
97
+ border: 0;
98
+ border-bottom: 1px solid var(--ui-table-border);
99
+ background: var(--ui-table-head-bg);
100
+ color: var(--ui-table-head-text);
101
+ font-weight: var(--ui-weight-medium);
102
+ text-align: left;
103
+ white-space: nowrap;
104
+ }
105
+ .mh-table thead th:hover,
106
+ .mh-table thead th.is-hover {
107
+ background: var(--ui-table-head-bg-hover);
108
+ }
109
+ /* 多级表头的组头:下边线不加(组头跨列,加线会切断视觉分组) */
110
+ .mh-table thead th.mh-table__th-group {
111
+ border-bottom: 1px solid var(--ui-table-head-divider);
112
+ text-align: center;
113
+ }
114
+
115
+ /* ===== 行 =====
116
+ * 行自身不画线(行线在单元格底边上):同样显式清零,挡住宿主给 `tr` 加的顶线(会与本件行底线叠成双线)。 */
117
+ .mh-table thead tr,
118
+ .mh-table tbody tr {
119
+ border: 0;
120
+ }
121
+ /* 单元格的边框模型:**全清零 + 只留底线**(理由同表头处:宿主给 `th` / `td` 下的整圈边框只靠
122
+ * 特异性挡不住未声明的三边,会让行线与表外框全部叠成双线)。 */
123
+ .mh-table tbody td {
124
+ height: var(--ui-table-row-height);
125
+ padding: var(--ui-space-1) var(--ui-table-padding-x);
126
+ border: 0;
127
+ border-bottom: 1px solid var(--ui-table-border);
128
+ line-height: var(--ui-table-line-height);
129
+ vertical-align: middle;
130
+ }
131
+ .mh-table tbody tr:last-child td {
132
+ border-bottom: none;
133
+ }
134
+ /* 行态顺序即优先级:斑马 → 滑过 → 选中 → 禁用(禁用压住一切,故放最后) */
135
+ .mh-table tbody tr.is-striped td {
136
+ background: var(--ui-table-row-alt);
137
+ }
138
+ .mh-table tbody tr:hover td,
139
+ .mh-table tbody tr.is-hover td {
140
+ background: var(--ui-table-row-hover);
141
+ }
142
+ /* 选中态**只有底色**:规范样张里那条 2px 主色下沿(Au01)已去掉 ——
143
+ 行线只由单元格底边提供,选中行不再额外压一条线(`box-shadow: inset 0 -2px` 会盖住底边线,
144
+ 看起来像"两行线叠在一起")。要恢复下沿就加回 inset 阴影 + 对应令牌。 */
145
+ .mh-table tbody tr.is-selected td,
146
+ .mh-table tbody tr[data-state='selected'] td,
147
+ .mh-table tbody tr:has(input:checked) td {
148
+ background: var(--ui-table-row-selected);
149
+ }
150
+ .mh-table tbody tr.is-disabled td,
151
+ .mh-table tbody tr[aria-disabled='true'] td {
152
+ background: var(--ui-table-row-disabled);
153
+ color: var(--ui-base-content-subtle);
154
+ }
155
+
156
+ /* 分组行:整行一条、不可选、字重中粗 */
157
+ .mh-table tbody tr.mh-table__group-row td {
158
+ height: var(--ui-table-row-height);
159
+ background: var(--ui-table-head-bg);
160
+ color: var(--ui-table-head-text);
161
+ font-weight: var(--ui-weight-medium);
162
+ }
163
+
164
+ /* 树行:子行首列缩进(与树的缩进同一口径) */
165
+ .mh-table tbody tr.mh-table__row--child td:first-child {
166
+ padding-left: var(--ui-table-tree-indent);
167
+ }
168
+ .mh-table__tree-caret {
169
+ display: inline-flex;
170
+ width: var(--ui-font-icon); /* 常规图标档(改前无声明、掉到 `<svg>` 默认 16) */
171
+ height: var(--ui-font-icon);
172
+ margin-right: var(--ui-space-1);
173
+ color: var(--ui-base-content-subtle);
174
+ transition: transform 0.15s ease;
175
+ }
176
+ .mh-table__tree-caret--open {
177
+ transform: rotate(-90deg);
178
+ }
179
+
180
+ /* ===== 列 ===== */
181
+ /* 勾选列:只负责「多宽 + 居中」——`Checkbox` 组件是 inline-flex,靠格子的 text-align 居中;
182
+ 方块尺寸 / 圆角 / 三态配色全归 `checkbox.css`(表格不再给这一列任何选中态样式) */
183
+ .mh-table__col-check {
184
+ width: var(--ui-table-col-check);
185
+ text-align: center;
186
+ }
187
+ .mh-table__col-actions {
188
+ text-align: right;
189
+ }
190
+ /* `--sticky-col`:首列钉住(必须自带底,见文件头第 4 条) */
191
+ .mh-table--sticky-col thead th:first-child,
192
+ .mh-table--sticky-col tbody td:first-child {
193
+ position: sticky;
194
+ left: 0;
195
+ z-index: 1;
196
+ background: var(--ui-base-100);
197
+ }
198
+ .mh-table--sticky-col thead th:first-child {
199
+ z-index: 2; /* 表头既钉顶又钉左,压住表头其余列 */
200
+ background: var(--ui-table-head-bg);
201
+ }
202
+ /* `--sticky-head`:表头钉顶 */
203
+ .mh-table--sticky-head thead th {
204
+ position: sticky;
205
+ top: 0;
206
+ z-index: 1;
207
+ }
208
+
209
+ /* ===== 单元格类型 ===== */
210
+ .mh-table__cell-center {
211
+ text-align: center;
212
+ }
213
+ .mh-table__cell-amount {
214
+ text-align: right;
215
+ font-variant-numeric: tabular-nums; /* 金额对齐靠等宽数字,不靠右对齐就够 */
216
+ }
217
+ .mh-table__cell-link {
218
+ color: var(--ui-table-link);
219
+ text-decoration: none;
220
+ cursor: pointer;
221
+ }
222
+ .mh-table__cell-link:hover {
223
+ text-decoration: underline;
224
+ }
225
+ .mh-table__cell-ellipsis {
226
+ max-width: var(--ui-table-ellipsis);
227
+ overflow: hidden;
228
+ text-overflow: ellipsis;
229
+ white-space: nowrap;
230
+ }
231
+ .mh-table__cell-icon {
232
+ display: inline-flex;
233
+ align-items: center;
234
+ margin-right: var(--ui-space-1);
235
+ color: var(--ui-base-content-muted);
236
+ }
237
+ .mh-table__cell-main {
238
+ display: block;
239
+ }
240
+ .mh-table__cell-sub {
241
+ display: block;
242
+ color: var(--ui-base-content-muted);
243
+ }
244
+ /* 必填列的表头加星号(只在表头,不在单元格) */
245
+ .mh-table th.mh-table__cell-required::before {
246
+ content: '*';
247
+ margin-right: var(--ui-space-1);
248
+ color: var(--ui-error);
249
+ }
250
+
251
+ /* 状态点(语义四档) */
252
+ .mh-table__status-dot {
253
+ display: inline-block;
254
+ width: var(--ui-table-status-dot);
255
+ height: var(--ui-table-status-dot);
256
+ margin-right: var(--ui-space-1);
257
+ border-radius: var(--ui-radius-full);
258
+ background: var(--ui-base-400);
259
+ vertical-align: middle;
260
+ }
261
+ .mh-table__status-dot--info {
262
+ background: var(--ui-info);
263
+ }
264
+ .mh-table__status-dot--success {
265
+ background: var(--ui-success);
266
+ }
267
+ .mh-table__status-dot--warning {
268
+ background: var(--ui-warning);
269
+ }
270
+ .mh-table__status-dot--error {
271
+ background: var(--ui-error);
272
+ }
273
+
274
+ /* ===== 表头操作:排序按钮与列宽拖拽线 ===== */
275
+ .mh-table__sort {
276
+ display: inline-flex;
277
+ align-items: center;
278
+ gap: 2px;
279
+ margin-left: var(--ui-space-1);
280
+ padding: 0;
281
+ border: none;
282
+ background: transparent;
283
+ color: var(--ui-base-content-subtle);
284
+ cursor: pointer;
285
+ }
286
+ .mh-table__sort--active {
287
+ color: var(--ui-primary);
288
+ }
289
+ /* 槽位尺寸:常规图标一律取全局图标档(**不写 `.mh-table__sort-icon`** —— 那是只作朝向锚点的结构类,
290
+ 面上为排序指示写规则会被契约拦下,见下方注释) */
291
+ .mh-table__sort > svg {
292
+ width: var(--ui-font-icon);
293
+ height: var(--ui-font-icon);
294
+ }
295
+ /* 排序朝向:**方位在字形里**(升序 `chevron-up` / 降序与未排序 `chevron-down`,未排走浅色、已排随
296
+ `.mh-table__sort--active` 主色)—— 本层零 `transform`,不走"把别的图标旋转 90° 冒充上下"的老路
297
+ (包内硬约束)。`mh-table__sort-icon` 与 `--asc` / `--desc` 只作**状态锚点**(消费方与用例按它们定位
298
+ 当前朝向),面上无声明,登记在测试契约的结构锚点台账里。 */
299
+ .mh-table__drag-line {
300
+ position: absolute;
301
+ top: 50%;
302
+ right: 0;
303
+ width: var(--ui-table-drag-line-width);
304
+ height: var(--ui-table-drag-line-height);
305
+ background: var(--ui-table-drag-line);
306
+ transform: translateY(-50%);
307
+ cursor: col-resize;
308
+ }
309
+ /* 拖拽线要定在表头单元格右缘,故表头格需要定位上下文 */
310
+ .mh-table thead th {
311
+ position: relative;
312
+ }
313
+
314
+ /* ===== 批量栏(选中若干行后出现在表格上方) ===== */
315
+ .mh-table__batch {
316
+ display: flex;
317
+ align-items: center;
318
+ gap: var(--ui-space-2);
319
+ height: var(--ui-table-batch-height);
320
+ padding: 0 var(--ui-table-padding-x);
321
+ background: var(--ui-table-head-bg);
322
+ color: var(--ui-table-head-text);
323
+ }
324
+ .mh-table__batch-count {
325
+ margin-left: auto;
326
+ color: var(--ui-primary);
327
+ }
328
+
329
+ /* ===== 合计行(当页合计) ===== */
330
+ .mh-table__summary {
331
+ display: flex;
332
+ align-items: center;
333
+ gap: var(--ui-space-4);
334
+ height: var(--ui-table-summary-height);
335
+ padding: 0 var(--ui-table-padding-x);
336
+ border-radius: var(--ui-table-radius);
337
+ background: var(--ui-warning-weak); /* 规范 Au07 暖底渐变,本仓取警示弱底 */
338
+ }
339
+ .mh-table__summary-label {
340
+ color: var(--ui-table-head-text);
341
+ }
342
+ .mh-table__summary-value {
343
+ font-size: var(--ui-font-body);
344
+ font-weight: var(--ui-weight-medium);
345
+ color: var(--ui-warning); /* 规范 #ff6c29 */
346
+ }
347
+
348
+ /* ===== 尺寸档:大号(详情页 / 展示型表格) ===== */
349
+ .mh-table--lg {
350
+ --ui-table-head-height: 52px;
351
+ --ui-table-row-height: 56px;
352
+ --ui-table-padding-x: var(--ui-space-6);
353
+ }
354
+
355
+ /* ===== 加载态 =====
356
+ * 盖一层浅罩而不是换骨架行:行高不塌,表格不会在加载前后跳动(跳动比没骨架更刺眼)。 */
357
+ .mh-table-wrapper {
358
+ position: relative;
359
+ }
360
+ .mh-table__loading {
361
+ position: absolute;
362
+ inset: 0;
363
+ display: flex;
364
+ align-items: flex-start;
365
+ justify-content: center;
366
+ padding-top: 80px;
367
+ background: var(--ui-mask-light);
368
+ }
369
+ .mh-table__spinner {
370
+ width: 24px;
371
+ height: 24px;
372
+ border: 2px solid var(--ui-primary);
373
+ border-top-color: transparent;
374
+ border-radius: var(--ui-radius-full);
375
+ animation: mh-table-spin 0.8s linear infinite;
376
+ }
377
+ @keyframes mh-table-spin {
378
+ to {
379
+ transform: rotate(360deg);
380
+ }
381
+ }
382
+
383
+ /* ===== 空态(表格内的空数据行;要插画与操作按钮就用 empty 插槽) ===== */
384
+ .mh-table__empty {
385
+ height: 120px;
386
+ text-align: center;
387
+ color: var(--ui-base-content-muted);
388
+ }
389
+ .mh-table__empty-row:hover td {
390
+ background: transparent;
391
+ }
392
+
393
+ /* ===== 可点行(onRow 给了 onClick 才挂) ===== */
394
+ .mh-table tbody tr.is-clickable {
395
+ cursor: pointer;
396
+ }
397
+
398
+ /* ===== 展开行 ===== */
399
+ .mh-table__col-expand {
400
+ width: 40px;
401
+ text-align: center;
402
+ }
403
+ .mh-table__expand {
404
+ display: inline-flex;
405
+ align-items: center;
406
+ justify-content: center;
407
+ width: 20px;
408
+ height: 20px;
409
+ padding: 0;
410
+ border: none;
411
+ border-radius: var(--ui-radius-sm);
412
+ background: transparent;
413
+ color: var(--ui-base-content-muted);
414
+ cursor: pointer;
415
+ }
416
+ .mh-table__expand:hover {
417
+ background: var(--ui-base-200);
418
+ color: var(--ui-base-content);
419
+ }
420
+ /* 展开时箭头转 180 度:同一个下箭头字形,不另画一个上箭头 */
421
+ .mh-table__expand-icon {
422
+ width: var(--ui-font-icon); /* 常规图标档 */
423
+ height: var(--ui-font-icon);
424
+ transition: transform 0.15s ease;
425
+ }
426
+ .mh-table__expand[aria-expanded='true'] .mh-table__expand-icon {
427
+ transform: rotate(180deg);
428
+ }
429
+ .mh-table__expand-row > td {
430
+ padding: var(--ui-space-4) var(--ui-table-padding-x);
431
+ background: var(--ui-base-200);
432
+ }
433
+
434
+ /* ===== 分页条(贴在表格下方、右对齐;分页件自身的面归 pagination.css) ===== */
435
+ .mh-table__pagination {
436
+ display: flex;
437
+ justify-content: flex-end;
438
+ padding: var(--ui-space-4) 0 0;
439
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * 批量栏 `.mh-table__batch` 是包裹层的子元素(与 `<table>` 同级)—— 令牌锚在容器上,
3
+ * 批量栏的高度 / 内距 / 底色照样取得到
4
+ *
5
+ * ## 抽出说明
6
+ * 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
7
+ * 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
8
+ * 「声明在某个组件根类上」这条脆弱假设。
9
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
10
+ */
11
+ [data-manohub-ui] {
12
+ /* 单件令牌 */
13
+ --ui-table-font-size: var(--ui-font-caption);
14
+ --ui-table-head-height: 34px; /* 设计 1160×34 */
15
+ --ui-table-row-height: 30px; /* 设计 919×30,节距 31 */
16
+ --ui-table-line-height: var(--ui-line-caption); /* 单元格行高 = 正文档的 13px 配对(default 20 / farris 18) */
17
+ --ui-table-head-bg: var(--ui-base-200); /* 设计 #f1f2f5 */
18
+ --ui-table-head-text: var(--ui-base-content-muted);
19
+ --ui-table-head-bg-hover: var(--ui-primary-weak);
20
+ --ui-table-head-divider: var(--ui-base-300);
21
+ --ui-table-head-divider-width: 0 1px 0 0; /* 多级表头里列与列的分隔 */
22
+ --ui-table-text: var(--ui-base-content);
23
+ --ui-table-border: var(--ui-base-300);
24
+ --ui-table-radius: var(--ui-radius-md); /* 容器档:设计为 7(两档之间),按「表格是容器」取 md 并登记偏差 */
25
+ --ui-table-row-alt: var(--ui-base-200);
26
+ --ui-table-row-hover: var(--ui-primary-weak);
27
+ --ui-table-row-selected: var(--ui-primary-subtle); /* 设计 #dbe9ff;与滑过档分家(改前两者同值 ⇒ 滑过与选中不可辨) */
28
+ --ui-table-row-disabled: var(--ui-base-200);
29
+ --ui-table-link: var(--ui-primary);
30
+ --ui-table-padding-x: var(--ui-space-4); /* 单元格左右内距 16 */
31
+ --ui-table-col-check: 40px;
32
+ --ui-table-ellipsis: 150px;
33
+ --ui-table-drag-line: var(--ui-primary);
34
+ --ui-table-drag-line-width: 3px;
35
+ --ui-table-drag-line-height: 40px;
36
+ --ui-table-status-dot: 6px;
37
+ --ui-table-summary-height: 40px;
38
+ --ui-table-batch-height: 34px;
39
+ --ui-table-tree-indent: 38px;
40
+ --ui-table-scroll-height: 132px; /* 规范样张值 */
41
+ }