@manohub/ui 1.0.4 → 1.0.6

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 (140) hide show
  1. package/README.md +8 -2
  2. package/dist/components/badge/index.d.ts +24 -46
  3. package/dist/components/badge/index.js +7 -11
  4. package/dist/components/button/index.d.ts +11 -31
  5. package/dist/components/capsule/index.d.ts +13 -27
  6. package/dist/components/card/index.d.ts +28 -62
  7. package/dist/components/checkbox/index.d.ts +1 -9
  8. package/dist/components/code-block/index.d.ts +28 -55
  9. package/dist/components/collapse/index.d.ts +2 -0
  10. package/dist/components/dialog/index.d.ts +9 -18
  11. package/dist/components/dialog/index.js +3 -2
  12. package/dist/components/divider/index.d.ts +1 -12
  13. package/dist/components/drawer/index.d.ts +7 -15
  14. package/dist/components/filter/index.d.ts +27 -69
  15. package/dist/components/filter/index.js +3 -8
  16. package/dist/components/form/index.d.ts +86 -218
  17. package/dist/components/form/index.js +5 -12
  18. package/dist/components/input/bordered.d.ts +4 -6
  19. package/dist/components/input/index.d.ts +36 -83
  20. package/dist/components/input/index.js +6 -11
  21. package/dist/components/input/number-input.d.ts +11 -23
  22. package/dist/components/layout/index.d.ts +21 -28
  23. package/dist/components/layout/index.js +5 -8
  24. package/dist/components/list-view/index.d.ts +10 -43
  25. package/dist/components/loading/index.d.ts +8 -19
  26. package/dist/components/nav/index.d.ts +14 -35
  27. package/dist/components/nav/index.js +1 -3
  28. package/dist/components/notice/index.d.ts +13 -33
  29. package/dist/components/notice/index.js +3 -5
  30. package/dist/components/notification/index.d.ts +0 -9
  31. package/dist/components/page/index.d.ts +29 -71
  32. package/dist/components/page/split-resize.d.ts +9 -18
  33. package/dist/components/pagination/index.d.ts +1 -5
  34. package/dist/components/panel/index.d.ts +33 -70
  35. package/dist/components/panel/index.js +1 -4
  36. package/dist/components/part-padding.d.ts +5 -13
  37. package/dist/components/query-state/index.d.ts +8 -32
  38. package/dist/components/radio/index.d.ts +13 -17
  39. package/dist/components/search/index.d.ts +12 -32
  40. package/dist/components/select/index.d.ts +30 -49
  41. package/dist/components/select/index.js +3 -3
  42. package/dist/components/select/select-panel.d.ts +23 -35
  43. package/dist/components/select/select-panel.js +5 -10
  44. package/dist/components/select/select-shared.d.ts +18 -44
  45. package/dist/components/select/select-tree.d.ts +11 -16
  46. package/dist/components/select/select-trigger.d.ts +6 -16
  47. package/dist/components/select/select-trigger.js +5 -11
  48. package/dist/components/skeleton/index.d.ts +1 -5
  49. package/dist/components/steps/index.d.ts +55 -111
  50. package/dist/components/steps/index.js +8 -16
  51. package/dist/components/switch/index.d.ts +17 -33
  52. package/dist/components/switch/index.js +2 -4
  53. package/dist/components/tabbar/index.d.ts +1 -6
  54. package/dist/components/table/index.d.ts +20 -72
  55. package/dist/components/table/index.js +4 -8
  56. package/dist/components/tabs/index.d.ts +22 -44
  57. package/dist/components/text/index.d.ts +10 -21
  58. package/dist/components/toast/index.d.ts +4 -13
  59. package/dist/components/tooltip/index.d.ts +1 -12
  60. package/dist/components/tree/index.d.ts +51 -101
  61. package/dist/components/tree/index.js +17 -33
  62. package/dist/components/upload/index.d.ts +1 -4
  63. package/dist/index.d.ts +2 -2
  64. package/dist/services/base.d.ts +32 -8
  65. package/dist/services/dialog.d.ts +13 -23
  66. package/dist/services/dialog.js +2 -0
  67. package/dist/services/index.d.ts +2 -2
  68. package/dist/services/loading.d.ts +9 -12
  69. package/dist/services/loading.js +8 -1
  70. package/dist/services/toast.d.ts +4 -14
  71. package/dist/styles/components/avatar.css +5 -7
  72. package/dist/styles/components/avatar.tokens.css +4 -9
  73. package/dist/styles/components/badge.css +3 -6
  74. package/dist/styles/components/badge.tokens.css +5 -17
  75. package/dist/styles/components/button.css +35 -57
  76. package/dist/styles/components/button.tokens.css +5 -14
  77. package/dist/styles/components/capsule.css +13 -20
  78. package/dist/styles/components/capsule.tokens.css +4 -9
  79. package/dist/styles/components/card.css +13 -24
  80. package/dist/styles/components/checkbox.css +11 -15
  81. package/dist/styles/components/checkbox.tokens.css +4 -9
  82. package/dist/styles/components/code-block.css +30 -40
  83. package/dist/styles/components/code-block.tokens.css +7 -20
  84. package/dist/styles/components/collapse.css +6 -10
  85. package/dist/styles/components/collapse.tokens.css +4 -9
  86. package/dist/styles/components/dialog.css +19 -27
  87. package/dist/styles/components/dialog.tokens.css +9 -9
  88. package/dist/styles/components/divider.css +9 -14
  89. package/dist/styles/components/divider.tokens.css +4 -9
  90. package/dist/styles/components/drawer.css +12 -16
  91. package/dist/styles/components/drawer.tokens.css +7 -9
  92. package/dist/styles/components/filter.css +13 -24
  93. package/dist/styles/components/form.css +77 -149
  94. package/dist/styles/components/form.tokens.css +9 -6
  95. package/dist/styles/components/input.css +73 -177
  96. package/dist/styles/components/input.tokens.css +5 -13
  97. package/dist/styles/components/layout.css +13 -29
  98. package/dist/styles/components/loading.css +6 -10
  99. package/dist/styles/components/loading.tokens.css +4 -9
  100. package/dist/styles/components/notice.css +3 -1
  101. package/dist/styles/components/notice.tokens.css +8 -6
  102. package/dist/styles/components/notification.css +9 -12
  103. package/dist/styles/components/notification.tokens.css +4 -12
  104. package/dist/styles/components/page.css +32 -48
  105. package/dist/styles/components/pagination.css +14 -15
  106. package/dist/styles/components/pagination.tokens.css +4 -9
  107. package/dist/styles/components/query-state.css +1 -1
  108. package/dist/styles/components/query-state.tokens.css +6 -0
  109. package/dist/styles/components/radio.css +12 -25
  110. package/dist/styles/components/radio.tokens.css +4 -9
  111. package/dist/styles/components/search.css +8 -18
  112. package/dist/styles/components/select.css +63 -109
  113. package/dist/styles/components/select.tokens.css +4 -12
  114. package/dist/styles/components/skeleton.css +4 -7
  115. package/dist/styles/components/skeleton.tokens.css +4 -9
  116. package/dist/styles/components/steps.css +9 -12
  117. package/dist/styles/components/steps.tokens.css +4 -12
  118. package/dist/styles/components/switch.css +7 -8
  119. package/dist/styles/components/switch.tokens.css +4 -9
  120. package/dist/styles/components/tabbar.css +12 -11
  121. package/dist/styles/components/tabbar.tokens.css +4 -9
  122. package/dist/styles/components/table.css +52 -93
  123. package/dist/styles/components/table.tokens.css +5 -6
  124. package/dist/styles/components/tag.css +13 -23
  125. package/dist/styles/components/tag.tokens.css +5 -11
  126. package/dist/styles/components/text.css +11 -23
  127. package/dist/styles/components/toast.css +11 -18
  128. package/dist/styles/components/toast.tokens.css +6 -9
  129. package/dist/styles/components/tooltip.css +9 -11
  130. package/dist/styles/components/tooltip.tokens.css +5 -9
  131. package/dist/styles/components/tree.css +14 -27
  132. package/dist/styles/components/tree.tokens.css +5 -6
  133. package/dist/styles/components/upload.css +10 -13
  134. package/dist/styles/components/upload.tokens.css +4 -9
  135. package/dist/styles/index.css +27 -50
  136. package/dist/styles/operations/collapse.css +12 -25
  137. package/dist/styles/operations/popup.css +41 -79
  138. package/dist/styles/operations/tabs.css +14 -32
  139. package/dist/styles/reset.css +0 -61
  140. package/package.json +2 -2
@@ -1,48 +1,31 @@
1
1
  /**
2
2
  * Table —— 表格(表头/行/单元格类型 + 行态四档 + 固定表头与列 + 批量栏与合计行)。
3
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`(**只底色**)。
4
+ * 出处(两套来源在关键几何上一致,故没有取舍余地):设计稿《MH后台-0911》表头 **34**(`0:3962`)/ 行 **30**
5
+ * (`0:3956`–`0:3961`,节距 31 = 30 + 1px 线)/ 表头底 `#f1f2f5`(= `--ui-base-200`)/ 行线 `#e6e6e6` /
6
+ * 外框 `#e6e6e6 @1` / 选中行底 `#dbe9ff`(= `--ui-primary-subtle`);规范侧同值(勾选列 40 / 拖拽线 3×40 /
7
+ * 合计行 40)。
8
+ * 行态:表头底 `--ui-base-200` + 字 `--ui-base-content-muted` + 中粗 / 外框 1px `--ui-base-300` / 斑马与禁用
9
+ * `--ui-base-200` / 滑过 `--ui-primary-weak` / 选中 `--ui-primary-subtle`(**只底色**)。
10
+ * ⚠️ **单元格左右内距保持 16(`--ui-space-4`)**:设计稿可量的只有「勾选框距表左 20」,而它量的是**内容盒**
11
+ * (勾选列 40 宽 + 居中时内容盒落在 13 处),无法唯一反推内距,故不作推测性改动。
21
12
  *
22
13
  * 四条必须照做的**结构**决定(做错就与规范不是一回事):
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(.mh-table__col-check input:checked)`):这样零 JS 也能选中;
34
- * 组件态给 `[data-state='selected']`,静态档给 `.is-selected` —— 三源等价。
35
- * 勾选列复用 `Checkbox` **组件**(不在表格里手写原生 input):该件内部才是真实 `<input type="checkbox">`,
36
- * 故 `:has(...)` 这条路径照旧成立;`Checkbox` 的框体带 `data-state`(checked / indeterminate),
37
- * 半选与选中都走它自己的样式数据,表格这边不再画方块。
38
- * **选择器必须限定在勾选列内**(`.mh-table__col-check`,勾选列单元格自带的类):不限列时,
39
- * 功能列里任何「内部本来就是 checkbox」的件都会命中 —— `Switch` 的内部正是 `<input type="checkbox">`,
40
- * 于是「启用」这类**功能值**会把整行点亮。功能值与行选择语义不同,视觉必须分开(否则一张表里
41
- * 开关一开就整行变色,且用户无从判断那到底表示什么)。
14
+ * 1. **边框模型**:默认是外框 + 表头下分割线 + 每行底线(末行去线)⇒ `border-collapse: separate` +
15
+ * `border-spacing: 0`(圆角只在 separate 下渲染得出来);`--borderless` 才切回 `collapse` 并去外框。
16
+ * **三条线之外的边一律显式清零**(`border: 0` 写在 `th` / `td` / `tr` 上,不是冗余):特异性只在**同一
17
+ * 属性**上分胜负,宿主给单元格 / 行下的整圈边框(典型 markdown 正文的 `.vp-doc th { border }`)不会被
18
+ * 「没写的边」顶掉,否则与表外框、行交界处各叠成 2px,还凭空多出列分隔线。
19
+ * 2. **斑马纹是显式类**(`.is-striped`)而非 `:nth-child(even)`:表里可以插分组行,`nth-child` 会整表错位。
20
+ * 3. **行选中由行内的选择控件驱动**(`tr:has(.mh-table__col-check input:checked)`):零 JS 也能选中;组件态给
21
+ * `[data-state='selected']`、静态档给 `.is-selected` —— 三源等价。勾选列复用 `Checkbox` **组件**(它内部才是
22
+ * 真实 `<input type="checkbox">`,故 `:has()` 成立;框体与半选状态归它自己的样式)。⚠️ **选择器必须限定在
23
+ * 勾选列内**:不限列时功能列里任何「内部本来就是 checkbox」的件都会命中 —— `Switch` 内部正是
24
+ * `<input type="checkbox">`,于是「启用」这类**功能值**会把整行点亮。
42
25
  * 4. **固定列必须自带底**(`background: var(--ui-base-100)`):它是 sticky 的,不遮挡就会被滚过的单元格透出。
43
26
  *
44
- * **不做**:排序与列宽拖拽的**算法**(规范只给了 `↕` 字形与 3×40 拖拽线这两处视觉),也不做空态/加载态
45
- * (规范表格里没有这两个样张 —— 三态归 `QueryState`)。
27
+ * **不做**:排序与列宽拖拽的**算法**(规范只给 `↕` 字形与 3×40 拖拽线两处视觉),也不做空态 / 加载态
28
+ * (三态归 `QueryState`)。
46
29
  */
47
30
  .mh-table-wrapper {
48
31
  overflow: auto;
@@ -90,29 +73,22 @@
90
73
  }
91
74
 
92
75
  /* ===== 固定布局档(`layout="fixed"`)=====
93
- * 列宽由 `<colgroup>` 下发(与档位无关),本档只把布局算法换成 `fixed`:
94
- * 列宽从此**受声明约束、不再被内容撑破** ⇒ 长文本不会把表格撑得比容器还宽,
95
- * 于是「百分比 / 数字权重」可以「吃满容器 + 严格按比例」。
96
- *
97
- * 调用方要知道的:表体**默认不换行**(nowrap + 省略号,见下条);要换行的列显式标 `wrap: true`。 */
76
+ * 列宽由 `<colgroup>` 下发,本档只把布局算法换成 `fixed`:列宽从此**受声明约束、不再被内容撑破** ⇒ 长文本不会把表格撑得比容器还宽,
77
+ * 「百分比 / 数字权重」可以吃满容器 + 严格按比例。调用方要知道的:表体**默认不换行**(见下条),要换行的列显式标 `wrap: true`。 */
98
78
  .mh-table--fixed {
99
79
  table-layout: fixed;
100
80
  }
101
- /* `fixed` 档表体默认**不换行**(nowrap + 省略号)。两条依据:
102
- * ① 列宽已被 `<colgroup>` 钉死,换行救不回内容,只会把行高顶高(`td` 的 `height` 只是**下限**);
103
- * ② 换行必然伴随**从字符间断字** —— 实测序号列窄到装不下两位数时,旧的 `overflow-wrap: anywhere`
104
- * 把 `10` 拆成 `1` / `0` 两行,行高 30 → **49**。
105
- * 于是「换行」改成**列级主动选择**:`TableColumn.wrap: true`(见 `.mh-table__cell-wrap`)。
106
- * ⚠️ **只在本档翻默认**:`auto` 档的列宽由内容计算,td 默认 nowrap 会让长文本列不再靠换行收敛、
107
- * 表格更容易撑破容器 —— 与本档「表头裁切只加在 fixed」同一条判据(见上一条注释)。 */
81
+ /* `fixed` 档表体默认**不换行**。两条依据:① 列宽已被 `<colgroup>` 钉死,换行救不回内容、只会顶高行高(`td` 的
82
+ * `height` 只是下限);② 换行必然伴随**从字符间断字** —— 实测序号列窄到装不下两位数时,`overflow-wrap: anywhere`
83
+ * 把 `10` 拆成 `1` / `0` 两行,行高 30 → **49**。于是「换行」改成**列级主动选择**(`TableColumn.wrap`)。
84
+ * ⚠️ **只在本档翻默认**:`auto` 档的列宽由内容计算,td 默认 nowrap 会让长文本列不再靠换行收敛。 */
108
85
  .mh-table--fixed tbody td {
109
86
  overflow: hidden;
110
87
  text-overflow: ellipsis;
111
88
  white-space: nowrap;
112
89
  }
113
- /* 前导列(勾选 / 展开)在 auto 下靠内容把 40px 的「建议宽」撑出去;fixed 下是硬宽,
114
- 而 `thead th` / `tbody td` 的标准左右内距各 16px ⇒ 可用内容只有 40 − 32 = 8px,
115
- 装不下 16px 的勾选框(实测该列溢出 19px,还会被上面的 `overflow: hidden` 裁掉)。
90
+ /* 前导列(勾选 / 展开)在 auto 下靠内容把 40px 的「建议宽」撑出去;fixed 下是硬宽,而标准左右内距
91
+ 各 16px ⇒ 可用内容只有 40 − 32 = 8px,装不下 16px 的勾选框(实测该列溢出 19px、还会被裁掉)。
116
92
  故本档把前导列的内距清零,靠既有的 `text-align: center` 居中。 */
117
93
  .mh-table--fixed .mh-table__col-check,
118
94
  .mh-table--fixed .mh-table__col-expand {
@@ -120,11 +96,8 @@
120
96
  }
121
97
 
122
98
  /* ===== 表头 =====
123
- * `border: 0` **不是冗余**:本件只画「表外框 + 表头分割线 + 每行底线」三条,其余边必须显式清零。
124
- * 特异性和平局只发生在**同一个属性**上 —— 本件只声明 `border-bottom` 时,宿主给单元格下的整圈边框
125
- * (典型:markdown 正文的 `.vp-doc th, .vp-doc td { border: 1px solid }`)不会被任何组件声明顶掉,
126
- * 于是单元格四边各来一条:与表外框叠成 2px、每行交界处上一行底线 + 本行顶线叠成 2px,还凭空多出列分隔线。
127
- * 这三条不是「装饰」而是边框模型的一部分,故与 `border-bottom` 写在同一规则里(0-1-2 压过 `.vp-doc th` 0-1-1)。 */
99
+ * `border: 0` **不是冗余**:本件只画「表外框 + 表头分割线 + 每行底线」三条,其余边必须显式清零
100
+ * (理由见文件头第 1 条)。与 `border-bottom` 写在同一规则里:0-1-2 压过 `.vp-doc th` 的 0-1-1。 */
128
101
  .mh-table thead th {
129
102
  height: var(--ui-table-head-height);
130
103
  padding: 0 var(--ui-table-padding-x);
@@ -140,8 +113,7 @@
140
113
  .mh-table thead th.is-hover {
141
114
  background: var(--ui-table-head-bg-hover);
142
115
  }
143
- /* 固定档下表头也要裁切:列宽已被 colgroup 钉死,长表头文字会**溢出到相邻列**
144
- (实测溢出 97px),必须靠这两条收住。`white-space: nowrap` 上面已有。
116
+ /* 固定档下表头也要裁切:列宽已被 colgroup 钉死,长表头文字会**溢出到相邻列**(实测溢出 97px)。
145
117
  ⚠️ 只在本档加 —— auto 档下表头参与列宽计算,加裁切会改动老页面的列宽分配。 */
146
118
  .mh-table--fixed thead th {
147
119
  overflow: hidden;
@@ -159,8 +131,7 @@
159
131
  .mh-table tbody tr {
160
132
  border: 0;
161
133
  }
162
- /* 单元格的边框模型:**全清零 + 只留底线**(理由同表头处:宿主给 `th` / `td` 下的整圈边框只靠
163
- * 特异性挡不住未声明的三边,会让行线与表外框全部叠成双线)。 */
134
+ /* 单元格的边框模型:**全清零 + 只留底线**(理由同表头处) */
164
135
  .mh-table tbody td {
165
136
  height: var(--ui-table-row-height);
166
137
  padding: var(--ui-space-1) var(--ui-table-padding-x);
@@ -180,9 +151,8 @@
180
151
  .mh-table tbody tr.is-hover td {
181
152
  background: var(--ui-table-row-hover);
182
153
  }
183
- /* 选中态**只有底色**:规范样张里那条 2px 主色下沿(Au01)已去掉 ——
184
- 行线只由单元格底边提供,选中行不再额外压一条线(`box-shadow: inset 0 -2px` 会盖住底边线,
185
- 看起来像"两行线叠在一起")。要恢复下沿就加回 inset 阴影 + 对应令牌。
154
+ /* 选中态**只有底色**:规范样张那条 2px 主色下沿(Au01)不取 —— 行线只由单元格底边提供,
155
+ 额外压一条 `box-shadow: inset 0 -2px` 会盖住底边线,看起来像「两行线叠在一起」。
186
156
  第三条路径限定在勾选列内(见文件头第 3 条):不限列会被功能列的 Switch 命中。 */
187
157
  .mh-table tbody tr.is-selected td,
188
158
  .mh-table tbody tr[data-state='selected'] td,
@@ -209,7 +179,7 @@
209
179
  }
210
180
  .mh-table__tree-caret {
211
181
  display: inline-flex;
212
- width: var(--ui-font-icon); /* 常规图标档(改前无声明、掉到 `<svg>` 默认 16) */
182
+ width: var(--ui-font-icon); /* 常规图标档 */
213
183
  height: var(--ui-font-icon);
214
184
  margin-right: var(--ui-space-1);
215
185
  color: var(--ui-base-content-subtle);
@@ -220,8 +190,7 @@
220
190
  }
221
191
 
222
192
  /* ===== 列 ===== */
223
- /* 勾选列:只负责「多宽 + 居中」——`Checkbox` 组件是 inline-flex,靠格子的 text-align 居中;
224
- 方块尺寸 / 圆角 / 三态配色全归 `checkbox.css`(表格不再给这一列任何选中态样式) */
193
+ /* 勾选列:只负责「多宽 + 居中」——尺寸 / 圆角 / 三态配色全归 `checkbox.css` */
225
194
  .mh-table__col-check {
226
195
  width: var(--ui-table-col-check);
227
196
  text-align: center;
@@ -230,12 +199,10 @@
230
199
  text-align: right;
231
200
  }
232
201
 
233
- /* ⚠️ **表头要把对齐重声明一遍**:上面这几条与 `.mh-table__cell-center` / `.mh-table__cell-amount`
234
- * 都只有 **0-1-0**,而 `.mh-table thead th { text-align: left }` 是 **0-1-1** ⇒ 表头被强拉成左对齐、
235
- * 与表体不齐:勾选框应居中却贴左(实测表头左留白 0 / 右留白 26,与表体错位 13px)、
236
- * 右对齐列的标题应靠右却被拉到左边。
237
- * 只用补 `text-align` —— `thead th` 没声明过其它会被这些类覆盖的属性(宽度/内距不冲突)。
238
- * 写法沿用 `th.mh-table__th-group`(组头居中)那条既有先例。 */
202
+ /* ⚠️ **表头要把对齐重声明一遍**:下面几条与 `--cell-center` / `--cell-amount` 都只有 **0-1-0**,而
203
+ * `.mh-table thead th { text-align: left }` 是 **0-1-1** ⇒ 表头被强拉成左对齐、与表体不齐(实测勾选列表头
204
+ * 左留白 0 / 右留白 26,错位 13px;右对齐列的标题也被拉到左边)。只补 `text-align`(`thead th` 没声明过其它会被
205
+ * 这些类覆盖的属性),写法沿用 `th.mh-table__th-group`。 */
239
206
  .mh-table thead th.mh-table__col-check,
240
207
  .mh-table thead th.mh-table__cell-center {
241
208
  text-align: center;
@@ -255,11 +222,9 @@
255
222
  z-index: 2; /* 表头既钉顶又钉左,压住表头其余列 */
256
223
  background: var(--ui-table-head-bg);
257
224
  }
258
- /* `--sticky-head`:表头钉顶。
259
- * ⚠️ 选择器必须带 `tr`(0-1-3):文件后段「拖拽线的定位上下文」那条
260
- * `.mh-table thead th { position: relative }` 是 **0-1-2**,与不写 `tr` 的写法**同特异性且在后**
261
- * ⇒ 会把 `position: sticky` 覆盖掉,`stickyHead` 静默失效(0.6.0 起就存在,0.9.0 复核仍在)。
262
- * `sticky` 同样是定位元素,照样给表头里的拖拽线当包含块,故加 `tr` 不损失原能力。 */
225
+ /* `--sticky-head`:表头钉顶。⚠️ 选择器必须带 `tr`(0-1-3):文件后段「拖拽线的定位上下文」那条
226
+ * `.mh-table thead th` 是 **0-1-2**,与不写 `tr` 的写法同特异性且在后 ⇒ 会覆盖 `position: sticky`,
227
+ * `stickyHead` 静默失效。`sticky` 同样是定位元素,照样给表头里的拖拽线当包含块,故加 `tr` 不损失原能力。 */
263
228
  .mh-table--sticky-head thead tr th {
264
229
  position: sticky;
265
230
  top: 0;
@@ -283,10 +248,8 @@
283
248
  text-decoration: underline;
284
249
  }
285
250
  /* 列级**放开换行**(列定义里 `wrap: true` 时下发,只作用于表体 `td`;表头始终 nowrap)。
286
- * 缺省不换行在面文件的 `.mh-table--fixed tbody td` 里 —— 本档才翻默认,故这里同时把
287
- * 「换行三件套」与 `overflow-wrap` 兜底一并给回:换来的是「长文本列自己决定换行」。
288
- * ⚠️ 选择器必须带 `td`(0-1-3):`.mh-table--fixed tbody td` 是 **0-1-2**,
289
- * 单个类(0-1-0)压不过它(同 §表头对齐那条的先例)。 */
251
+ * 缺省不换行在 `.mh-table--fixed tbody td` 里 —— 本档才翻默认,故这里把「换行三件套」与兜底一并给回。
252
+ * ⚠️ 选择器必须带 `td`(0-1-3):`.mh-table--fixed tbody td` 是 **0-1-2**,单个类压不过它。 */
290
253
  .mh-table tbody td.mh-table__cell-wrap {
291
254
  white-space: normal;
292
255
  overflow: visible;
@@ -313,11 +276,9 @@
313
276
  color: var(--ui-error);
314
277
  }
315
278
 
316
- /* 单元格里的编辑控件:**表格面不为它写规则**。
317
- * 编辑格由调用方在 `#cell` 插槽里自己摆(`Input` / `Select` / `NumberInput`,外层可套 `Form.Item`),
318
- * 框、内距、错误档、只读档全部沿用 form / input 两族既有口径 —— 表格侧再写一份就是开第二套会漂的规格。
319
- * 唯一要提醒的是**列宽**:`table-layout: auto` 下「输入框的最小内容宽」会把窄列顶开,
320
- * 列宽要守得住就开 `layout="fixed"`(列宽由 `<colgroup>` 决定,不再被内容撑破)。 */
279
+ /* 单元格里的编辑控件:**表格面不为它写规则** —— 编辑格由调用方在 `#cell` 插槽里自己摆(`Input` / `Select` /
280
+ * `NumberInput`,外层可套 `Form.Item`),框 / 内距 / 错误档全沿用 form / input 两族既有口径。唯一要提醒的是
281
+ * **列宽**:`table-layout: auto` 下输入框的最小内容宽会把窄列顶开,列宽要守得住就开 `layout="fixed"`。 */
321
282
 
322
283
  /* 状态点(语义四档) */
323
284
  .mh-table__status-dot {
@@ -357,16 +318,14 @@
357
318
  .mh-table__sort--active {
358
319
  color: var(--ui-primary);
359
320
  }
360
- /* 槽位尺寸:常规图标一律取全局图标档(**不写 `.mh-table__sort-icon`** —— 那是只作朝向锚点的结构类,
361
- 面上为排序指示写规则会被契约拦下,见下方注释) */
321
+ /* 槽位尺寸:常规图标一律取全局图标档(**不写 `.mh-table__sort-icon`** —— 那是只作朝向锚点的结构类) */
362
322
  .mh-table__sort > svg {
363
323
  width: var(--ui-font-icon);
364
324
  height: var(--ui-font-icon);
365
325
  }
366
326
  /* 排序朝向:**方位在字形里**(升序 `chevron-up` / 降序与未排序 `chevron-down`,未排走浅色、已排随
367
- `.mh-table__sort--active` 主色)—— 本层零 `transform`,不走"把别的图标旋转 90° 冒充上下"的老路
368
- (包内硬约束)。`mh-table__sort-icon` 与 `--asc` / `--desc` 只作**状态锚点**(消费方与用例按它们定位
369
- 当前朝向),面上无声明,登记在测试契约的结构锚点台账里。 */
327
+ `.mh-table__sort--active` 主色)—— 本层零 `transform`,不走"把别的图标旋转 90° 冒充上下"的老路。
328
+ `mh-table__sort-icon` 与 `--asc` / `--desc` 只作**状态锚点**,面上无声明。 */
370
329
  .mh-table__drag-line {
371
330
  position: absolute;
372
331
  top: 50%;
@@ -2,12 +2,11 @@
2
2
  * 批量栏 `.mh-table__batch` 是包裹层的子元素(与 `<table>` 同级)—— 令牌锚在容器上,
3
3
  * 批量栏的高度 / 内距 / 底色照样取得到
4
4
  *
5
- * ## 抽出说明
6
- * 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
7
- * 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
8
- * 「声明在某个组件根类上」这条脆弱假设。
9
- * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
10
- */
5
+ *
6
+ * 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
7
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效);
8
+ * 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
9
+ */
11
10
  [data-manohub-ui] {
12
11
  /* 单件令牌 */
13
12
  --ui-table-font-size: var(--ui-font-caption);
@@ -1,31 +1,21 @@
1
1
  /**
2
2
  * Tag —— **`Badge` 的交互封装**(可关闭 / 可新增)。
3
3
  *
4
- * ## 本件不画框(与 `select.css` 同一条纪律)
4
+ * **本件不画框**(与 `select.css` 同一条纪律):底 / 边 / 圆角 / 高度 / 字号 / 内距 / 档位**全归 `badge` 面**
5
+ * —— 徽标是「只读标记」的唯一样式源,本件只往它上面加交互位。本文件只有四样东西:
6
+ * ① `.mh-tag` 内容与操作位之间的间距(比 `Badge` 的通用 gap 紧一档);② `.mh-tag__close` /
7
+ * `__confirm` 两个操作位(14 圆底 + 悬停蒙层;图标 12 属有意保留的专属尺寸);③ `.mh-tag--add`
8
+ * 新增入口(虚线框 + 中性字,滑过转主色);④ `.mh-tag--editing` / `__input` 编辑态(框归 input 面,
9
+ * 这里只给**窄**宽度,与确认位沿用 `.mh-tag` 的间距)。
5
10
  *
6
- * 底 / 边 / 圆角 / 高度 / 字号 / 内距 / 档位**全归 `badge` 面** —— 徽标是「只读标记」的唯一样式源,
7
- * 本件只往它上面加两个交互位。2026-09-30 之前这里有一整套与 `badge` 重复的几何
8
- * (`--ui-tag-bg` / `-height` / `-font-size` / `-radius` …):同一个高度上两件各走一个圆角档、
9
- * 同一个「浅主色标签底」两件给了两个色 —— 那批规则已整体撤除,本文件只剩三样东西:
11
+ * **特异性:两位本件类,不靠导入顺序**。`--add` 那组写成 `.mh-tag.mh-tag--add`(0-2-0),压过 badge 面的
12
+ * 单类规则(0-1-0)—— 两条备选都被否掉:引 `.mh-badge`(面文件的类名必须与文件词根同根)、靠导入顺序
13
+ * (顺序会被人无意调整,两位类权重不会)。`--add` 转发给 `Badge` 的档是 `plain`(底透明、字取中性),
14
+ * 需要覆盖的只剩 `border-color` 与字色。
10
15
  *
11
- * 1. `.mh-tag`:内容与操作位之间的间距(比 `Badge` 的通用 gap 紧一档);
12
- * 2. `.mh-tag__close` / `.mh-tag__confirm`:两个操作位(14 圆底 + 悬停蒙层;图标 12 属有意保留的专属尺寸);
13
- * 3. `.mh-tag--add`:新增入口形态(虚线框 + 中性字,滑过转主色);
14
- * 4. `.mh-tag--editing` / `.mh-tag__input`:新增档点开后的编辑态(输入框的框归 input 面,
15
- * 这里只给**窄**宽度;输入框 ↔ 确认位沿用 `.mh-tag` 的间距)。
16
- *
17
- * ## 特异性:两位本件类,不靠导入顺序
18
- *
19
- * `--add` 那组写成 **`.mh-tag.mh-tag--add`(0-2-0)**,压过 badge 面的单类规则(0-1-0)。
20
- * 两条备选都被否掉:
21
- * ① 引用 `.mh-badge`(面文件的类名必须与文件词根同根,跨族引用要进豁免台账);
22
- * ② 靠 `styles/index.css` 的导入顺序(badge 面在前、本面在后)—— 顺序会被人无意调整,
23
- * 两位类权重不会。`--add` 转发给 `Badge` 的档是 `plain`(底透明、字取中性),
24
- * 需要覆盖的只剩 `border-color` 与字色。
25
- *
26
- * ⚠️ 新增档的根是**真实 `<button>`**(走 `Badge` 的 `as="button"`):按钮自带外观的三样
27
- * (`border` / `background` / `padding`)由 badge 面提供(`contract-reset.spec.ts` 按标签审计),
28
- * `font-family: inherit` 也在那边补 —— 本件只管虚线框与悬停色。
16
+ * ⚠️ 新增档的根是**真实 `<button>`**(走 `Badge` 的 `as="button"`):按钮自带外观的三样(`border` /
17
+ * `background` / `padding`)与 `font-family: inherit` 都由 badge 面提供(`contract-reset.spec.ts` 按标签
18
+ * 审计),本件只管虚线框与悬停色。
29
19
  */
30
20
 
31
21
  /* ===== 内容 ↔ 关闭位:比 Badge 的通用 gap(6,给前置点的)紧一档 ===== */
@@ -1,17 +1,11 @@
1
1
  /**
2
2
  * tag —— 单件令牌(**基础值**)。
3
3
  *
4
- * 本件是 **`Badge` 的交互封装**(可关闭 / 可新增):底 / 边 / 圆角 / 高度 / 字号 / 内距 / 档位
5
- * 全归 `badge` 面,故这里只剩**交互位自己**的两个值 —— 文件这么短是**有意**的:
6
- * 2026-09-30 之前它带着一整套与 `badge` 重复的几何(`--ui-tag-bg` / `-height` / `-font-size` …),
7
- * 同一高度上还各走一个圆角档,那批令牌已随收口撤除。
8
- *
9
- * ## 抽出说明
10
- * 这些是**基础值**,锚在 `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,
11
- * 因此**任何落在容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设。
12
- *
13
- * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效)。
14
- * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
4
+ * 本件是 **`Badge` 的交互封装**(可关闭 / 可新增):底 / 边 / 圆角 / 高度 / 字号 / 内距 / 档位全归
5
+ * `badge` 面,故这里只剩**交互位自己**的两个值 —— 文件这么短是**有意**的(从前它带着一整套与 `badge`
6
+ * 重复的几何、同一高度还各走一个圆角档,那批令牌已随收口撤除)。
7
+ * 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
8
+ * ⚠️ 档位改写留在面文件的修饰符块里(搬走会让档位失效);新增组件登记两处:本文件 + `src/styles/index.css`。
15
9
  */
16
10
  [data-manohub-ui] {
17
11
  /* 内容 ↔ 操作位:4(`Badge` 的通用 gap 是 6,那是给前置点的;操作位紧一档更像「贴在字尾」) */
@@ -1,37 +1,25 @@
1
1
  /**
2
2
  * Text —— 文本排版(字号 / 行高 / 字重 / 语义色 / 等宽 / 截断)。
3
3
  *
4
- * 本文件是 `@manohub/theme` 那套 `--ui-font-*` / `--ui-line-*` / `--ui-weight-*` 档位令牌的
5
- * **第一个消费者**:在此之前它们只有定义、没有件,于是「卡片里的文字层级」在应用侧无合规落点
6
- * (契约 L1-5 禁 `font-*` / `color`),每个应用都要留一条定版例外登记。
4
+ * 本文件是那套 `--ui-font-*` / `--ui-line-*` / `--ui-weight-*` 档位令牌的**第一个消费者**:在此之前它们
5
+ * 只有定义、没有件,于是「卡片里的文字层级」在应用侧无合规落点(L1-5 禁 `font-*` / `color`)。
7
6
  *
8
- * ## 取色口径
9
- *
10
- * 与 `Notice` / `Dialog` 的语义档同一张表:`success` / `warning` 取 `-strong` 档
7
+ * 取色口径:与 `Notice` / `Dialog` 的语义档同一张表 —— `success` / `warning` 取 `-strong` 档
11
8
  * (直接用 500 档主色在浅底上对比度不足,属可读性缺陷)。
12
- *
13
- * ## 为什么 tone 走内部变量
14
- *
15
- * `--mh-text-tone-color` 是**内部状态变量**(`--mh-` 命名空间),由修饰符类赋值、由根类消费 ——
16
- * 这样「一条规则管颜色」而不是七条各写一次 `color`。默认值取 `inherit`,
17
- * 故**不传 tone 的文字也不会被强行染色**(`tone` 缺省档是 `default`,与正文色一致)。
18
- *
19
- * ## 截断
20
- *
21
- * `--truncate`(单行)与 `--clamp`(N 行)都要 `min-width: 0` 才能在被 flex 拉伸的子项里生效
22
- * (flex 子项的 `min-width` 默认是 `auto`,不给就会把容器撑开而不是省略)。
23
- * N 行的行数经 `--mh-text-lines` 下发(`-webkit-line-clamp` 只吃值,不能由类名表达行数)。
9
+ * **tone 走内部变量**:`--mh-text-tone-color` 由修饰符类赋值、由根类消费 ⇒「一条规则管颜色」而不是七条
10
+ * 各写一次 `color`;默认值 `inherit`,故**不传 tone 的文字也不会被强行染色**。
11
+ * **截断**:`--truncate`(单行)与 `--clamp`(N 行)都要 `min-width: 0` 才能在 flex 拉伸的子项里生效
12
+ * (flex 子项的 `min-width` 默认是 `auto`,不给就会把容器撑开而不是省略);行数经 `--mh-text-lines` 下发
13
+ * (`-webkit-line-clamp` 只吃值,不能由类名表达行数)。
24
14
  */
25
15
 
26
16
  .mh-text {
27
17
  color: var(--mh-text-tone-color, inherit);
28
18
  }
29
19
 
30
- /* 浏览器给 `h1`-`h6` 的那套字阶(`1.5em` + 粗体)只该是**语义**,视觉由 `size` / `weight` 定:
31
- 归零搬到了本件(元素级基线不再代管 —— 那条在 Tailwind 的层外,会压住消费方的 `text-*` 工具类)。
32
- 只点名标题标签:`strong` / `b` 的加粗是它们唯一的表达,不能被归零。
33
- 档位类在本文件里更靠后、且同特异性,故 `--heading` / `--semibold` 一类照样覆盖它
34
- (静态页里手写 `<h2 class="mh-text">` 且不给档位时,也仍是「正文字号 + 继承字重」)。 */
20
+ /* 浏览器给 `h1`-`h6` 的字阶(`1.5em` + 粗体)只该是**语义**,视觉由 `size` / `weight` 定 —— 归零搬到本件
21
+ (元素级基线不再代管:那条在 Tailwind 的层外,会压住消费方的 `text-*` 工具类)。只点名标题标签,
22
+ `strong` / `b` 的加粗是它们唯一的表达、不能被归零。档位类在本文件里更靠后且同特异性,故照样覆盖它。 */
35
23
  .mh-text:where(h1, h2, h3, h4, h5, h6) {
36
24
  font-size: inherit;
37
25
  font-weight: inherit;
@@ -1,25 +1,18 @@
1
1
  /**
2
2
  * Toast —— 消息提示(一行提示 + 语义图标 + 可选动作;可堆叠)。
3
3
  *
4
- * 出处:`@aihub/theme` 的 `playground/components/toast.css` 与 `src/components/toast.css`
5
- * (宽 240 / 最大 560 / 最小高 52 / r8 / 1px 描边 / 内距 10 16 10 24 / 图标 18 圆 / 图标与文字间距 12 /
6
- * 投影 `0 2 12` 黑 10% / 正文 15;loading 样张 240x93 且图标顶对齐;带动作样张宽 360)。
4
+ * 出处:规范(宽 240 / 最大 560 / 最小高 52 / r8 / 1px 描边 / 内距 10 16 10 24 / 图标 18 圆 /
5
+ * 图标与文字间距 12 / 投影 `0 2 12` 黑 10% / 正文 15;loading 样张 240x93 且图标顶对齐;带动作样张宽 360)。
6
+ * ⚠️ **与规范的一处有意偏差**:loading 那张是「多行加载文案」的尺寸,照搬成最小高会让单行提示撑出一张
7
+ * 上挤下空的空卡 —— 故本档高度回归常态(52 起、内容多时自然撑高),只保留图标差异(透明底 + 主色转圈)。
7
8
  *
8
- * **与规范的一处有意偏差**:loading 那张 240x93 的样张是「多行加载文案」的尺寸,照搬成最小高后,
9
- * 单行提示会撑出一张上挤下空的空卡 —— 故本档高度回归常态(与其它档同为 52 起,内容多时自然撑高),
10
- * 只保留图标差异(透明底 + 主色转圈)。
9
+ * 三件事必须与规范一致(容易做错):① **图标是「圆形色底 + 白色字形」**,不是一个字形图标
10
+ * (只有 loading 例外:透明底 + 2px 主色描边、**上边留缺口**造成转圈感);② **动作按钮靠
11
+ * `margin-left: auto` 顶到最右**,不是跟在文字后面;③ **转圈动画的键名归本族**(`mh-toast-spin`)——
12
+ * 动画名是全局标识,加 `mh-` 前缀以免与页面上别的库撞名。
11
13
  *
12
- * 三件事必须与规范一致(容易做错):
13
- *
14
- * 1. **图标是「圆形色底 + 白色字形」**,不是一个字形图标 —— 只有 loading 例外(透明底 + 2px 主色描边,
15
- * **上边留缺口**造成转圈感);
16
- * 2. **动作按钮靠 `margin-left: auto` 顶到最右**,不是跟在文字后面;
17
- * 3. **转圈动画的键名归本族**(`mh-toast-spin`):动画名是全局标识,加 `mh-` 前缀避免与页面上别的库撞名。
18
- *
19
- * 零 JS 能表达的:全部静态形态 + 转圈。**必须 JS**:自动消失计时、多条的出队、以及把 loading 换成结果态
20
- * (那三件都在组件层,本面不预设)。
21
- *
22
- * 堆叠容器(`.mh-toast-stack`)是随本族给的一层薄皮:定在视口顶部居中、纵向 8 间距 —— 位置与堆叠是
14
+ * 零 JS 能表达全部静态形态 + 转圈;**必须 JS**:自动消失计时、多条出队、loading 换结果态(都在组件层)。
15
+ * 堆叠容器(`.mh-toast-stack`)是随本族给的薄皮:定在视口顶部居中、纵向 8 间距 —— 位置与堆叠是
23
16
  * 「一族怎么摆」的事,做成类比让每个应用各写一份靠谱。
24
17
  */
25
18
  .mh-toast {
@@ -34,7 +27,7 @@
34
27
  min-width: var(--ui-toast-width);
35
28
  max-width: var(--ui-toast-width-max);
36
29
  min-height: var(--ui-toast-min-height);
37
- padding: var(--ui-space-3) var(--ui-space-4) var(--ui-space-3) var(--ui-space-6);
30
+ padding: var(--ui-toast-padding);
38
31
  border: 1px solid var(--ui-toast-border);
39
32
  border-radius: var(--ui-toast-radius);
40
33
  background: var(--ui-base-100);
@@ -3,16 +3,11 @@
3
3
  *
4
4
  * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
5
  *
6
- * ## 抽出说明
7
- * 本文件从面文件里抽出(原先混写在 `toast.css` 顶部):这些是**基础值**,锚在
8
- * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
- * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
- * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
6
  *
12
- * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
- * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
- * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
- */
7
+ * 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
8
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效);
9
+ * 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
10
+ */
16
11
  [data-manohub-ui] {
17
12
  /* 单件令牌 */
18
13
  --ui-toast-width: 240px;
@@ -21,6 +16,8 @@
21
16
  --ui-toast-radius: var(--ui-radius-md); /* 规范 r8 */
22
17
  --ui-toast-border: var(--ui-base-300); /* 规范 #d8dce6 */
23
18
  --ui-toast-gap: var(--ui-space-3); /* 图标与文字间距 12 */
19
+ /* 四边内距(规范 10 / 16 / 10 / 24:左宽一档是给图标位留的)—— 一枚令牌即整个简写 */
20
+ --ui-toast-padding: var(--ui-space-3) var(--ui-space-4) var(--ui-space-3) var(--ui-space-6);
24
21
  --ui-toast-icon-size: 18px;
25
22
  --ui-toast-text-size: 15px; /* 规范实测(本仓字阶无 15,按实测值给) */
26
23
  }
@@ -1,19 +1,17 @@
1
1
  /**
2
2
  * Tooltip —— 提示气泡皮肤(与操作层并列组合)。
3
3
  *
4
- * 出处:`@aihub/theme` 的 `playground/components/tooltip.css` 与 `src/components/tooltip.css`
5
- * (内距 8 / 14、圆角 10、深底反白字、`0 2 8` 黑 15% 投影;引导档另有一套面:蓝渐变底 + 12/14 内距 +
6
- * `0 2 14` 投影;标题 medium;动作是白色文本按钮;显隐纯淡入、不位移不缩放)。
4
+ * 出处:规范(内距 8 / 14、圆角 10、深底反白字、`0 2 8` 黑 15% 投影;引导档另有一套面:蓝渐变底 +
5
+ * 12/14 内距 + `0 2 14` 投影;标题 medium;动作是白色文本按钮;显隐纯淡入、不位移不缩放)。
7
6
  *
8
- * **类名与面文件名同根**:族名 `tooltip` → 类名 `.mh-tooltip*`(与令牌 `--ui-tooltip-*` 同根),
9
- * 一律 `mh-` 前缀 —— 本包独立发布,不迁就任何下游的既有类名(有用例盯着这条口径)。
10
- *
11
- * 显隐与定位全归操作层:宿主态(`.mh-popup-host:hover` / `:focus-within`)切 display、`data-side` / `data-align`
12
- * 给定位、`.mh-popup-anchor` / `--anchored` 给锚。本件只给面 + 淡入(进出对称)。
7
+ * 类名与面文件名同根(`.mh-tooltip*`,与令牌 `--ui-tooltip-*` 同根)—— 本包独立发布,不迁就任何下游的
8
+ * 既有类名(有用例盯着这条口径)。
9
+ * 显隐与定位全归操作层:宿主态(`:hover` / `:focus-within`)切 display、`data-side` / `data-align` 给定位、
10
+ * `.mh-popup-anchor` / `--anchored` 给锚;本件只给面 + 淡入(进出对称)。
13
11
  */
14
12
  .mh-tooltip {
15
13
  display: inline-block;
16
- padding: var(--ui-space-2) var(--ui-tooltip-padding-x);
14
+ padding: var(--ui-tooltip-padding-y) var(--ui-tooltip-padding-x);
17
15
  border-radius: var(--ui-tooltip-radius);
18
16
  background: var(--ui-tooltip-bg);
19
17
  color: var(--ui-tooltip-text);
@@ -22,9 +20,9 @@
22
20
  box-shadow: var(--ui-tooltip-shadow);
23
21
  }
24
22
 
25
- /* 引导档(自己的面:更亮的内距 + 蓝渐变 + 更大投影) */
23
+ /* 引导档(自己的面:内距上下一档 + 蓝渐变 + 更大投影) */
26
24
  .mh-tooltip--guide {
27
- padding: var(--ui-space-3) var(--ui-tooltip-padding-x);
25
+ --ui-tooltip-padding-y: var(--ui-space-3);
28
26
  background: var(--ui-tooltip-guide-bg);
29
27
  box-shadow: var(--ui-tooltip-guide-shadow);
30
28
  }
@@ -3,20 +3,16 @@
3
3
  *
4
4
  * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
5
  *
6
- * ## 抽出说明
7
- * 本文件从面文件里抽出(原先混写在 `tooltip.css` 顶部):这些是**基础值**,锚在
8
- * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
- * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
- * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
6
  *
12
- * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
- * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
- * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
- */
7
+ * 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
8
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效);
9
+ * 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
10
+ */
16
11
  [data-manohub-ui] {
17
12
  /* 单件令牌 */
18
13
  --ui-tooltip-radius: 10px; /* 规范 r10(本仓圆角刻度最大 8) */
19
14
  --ui-tooltip-padding-x: 14px; /* 规范间距档 5 = 14 */
15
+ --ui-tooltip-padding-y: var(--ui-space-2); /* 8:引导档在它的修饰符块里改写为 12 */
20
16
  --ui-tooltip-bg: var(--ui-base-content); /* 深底:规范用深色蒙层色,本仓无深色面令牌,取正文档(与输入说明气泡同一映射) */
21
17
  --ui-tooltip-text: var(--ui-base-100); /* 反白字 */
22
18
  --ui-tooltip-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); /* 规范实测值(本仓阴影令牌几何不同族,故按出处给) */
@@ -1,34 +1,21 @@
1
1
  /**
2
- * Tree(自建树:节点行 + 缩进 + 展开箭头 + 计数徽标位)。
2
+ * Tree(自建树:节点行 + 缩进 + 展开箭头 + 计数徽标位)。几何取自规范 `components/tree.css` 与设计稿
3
+ * 《MH后台-0911》`0:3921` 组织树实测:
4
+ * - 行高 34(紧凑档 28)、**行挨行(不加行距,节距 = 行高)**、圆角 6、字号 13;行内 padding 承载缩进
5
+ * (**行底满宽、只有内容缩进**)。⚠️ 行距原为 6,2026-09-30 按使用方拍板去掉 —— 树行与选择器面板里的
6
+ * 选项行是**同一套行**(行高 / 圆角 / 内距 / 字号 / 行态逐项同源),那边是行挨行的平铺列表。
7
+ * - 缩进 = 基础内距 8 + level × 步进 10,**无上限**(level 由组件在行上下发)。
8
+ * - 三态:滑过 `--ui-primary-weak`、点击瞬态与选中 `--ui-primary-subtle`(选中另加主色字;
9
+ * 设计:选中行 = 主色底 10% + 蓝字)。**取色口径与 Table / ListView 统一**,不再出现「树用中性底、
10
+ * 表格用主色底」的分叉;`:active` 改吃 `--ui-primary-subtle`(改前是硬编码 `#f4f5f9` —— 既是色值
11
+ * 字面量,换主题也不跟随)。
12
+ * - 箭头 = 常规图标档(收起态转 −90°),叶子节点用占位保持层级对齐;行内图标位只有两处(箭头、
13
+ * 标签前的节点图标槽),都取全局图标档、颜色跟随行色。
3
14
  *
4
- * 几何取自 `@aihub/theme` 的 `components/tree.css` 与设计稿《MH后台-0911》的 `0:3921` 组织树,
5
- * 见下方令牌块与形态注释。
15
+ * 缩进走 CSS 变量而不是行内 `padding-left`:主题包用 typed `attr(data-level type(<number>))` 一步算出;
16
+ * 为兼容尚无该能力的引擎,这里由组件同时下发 `--mh-tree-level`,公式仍在 CSS 内(不散落字面量)。
6
17
  */
7
18
 
8
- /* ===== Tree(自建树:节点行 + 缩进 + 展开箭头 + 计数徽标位)=====
9
- 几何与各态对齐 `@aihub/theme` 的 `components/tree.css` 与设计稿 `0:3921` 组织树实测:
10
- - 行高 34(紧凑档 28)、**行挨行(不加间距,节距 = 行高)**、圆角 6、字号 13、
11
- 行内 padding 承载缩进(**行底满宽、只有内容缩进**)
12
- ⚠️ 行距原为 6(节距 40,取自设计稿行文本 y 差):2026-09-30 按使用方拍板去掉 ——
13
- 树行与选择器面板里的选项行是**同一套行**(行高 / 圆角 / 内距 / 字号 / 行态逐项同源),
14
- 那边是行挨行的平铺列表,两处当然该同一节距(去掉行距后 select 面板里的树与列表也一致了)。
15
- - 缩进 = 基础内距 8 + level × 步进 10,**无上限**;level 由组件在行上下发
16
- - 三态:滑过 `--ui-primary-weak`、点击瞬态 `--ui-primary-subtle`、
17
- 选中 `--ui-primary-subtle` 底 + 主色字(设计:选中行 = `#2660ff` 底 10% + 蓝字)
18
- - 箭头 = 常规图标档(`--ui-font-icon`,收起态转 −90°);叶子节点用占位保持层级对齐
19
- - 行内图标位只有两处:箭头(`.mh-tree__caret`,可被 `renderCaret` 替换)与标签前的
20
- 节点图标槽(`.mh-tree__icon`,`renderIcon` 才会出现)。两者都取全局图标档、颜色跟随行色
21
-
22
- **行态的取色口径与 Table / ListView 统一**:行类表面的「滑过」用 `--ui-primary-weak`(浅主色)、
23
- 「选中」用 `--ui-primary-subtle`(深一档主色)—— 三者同一套规则,不再出现「树用中性底、
24
- 表格用主色底」的分叉。
25
- 点击瞬态(`:active`)改吃 `--ui-primary-subtle`:改前是本件硬编码的 `#f4f5f9`,
26
- 既是色值字面量(违反「组件 CSS 不得新增色值字面量」),换主题时也不跟随。
27
-
28
- 缩进为什么走 CSS 变量而不是行内 paddingLeft:主题包用 typed `attr(data-level type(<number>))`
29
- 一步算出(`padding-left: calc(8px + attr(...) * 10px)`);为兼容尚无该能力的引擎,这里由组件
30
- 同时下发 `--mh-tree-level`,公式仍在 CSS 内(数值只取令牌,不散落字面量)。 */
31
-
32
19
  /* 树是**行挨行**的列容器(不加行距,节距 = 行高 34):
33
20
  行底满宽、只有内容缩进,行态(滑过 / 按下 / 选中)的底因此是连着的 ——
34
21
  与选择器面板里的选项行同一节距(见文件头「行距原为 6」那条)。 */
@@ -6,12 +6,11 @@
6
6
  * 现在同一套行(行高 / 圆角 / 内距 / 字号 / 行态逐项同源),那边是行挨行的平铺列表,
7
7
  * 节距就该一样(设计稿的节距 40 因此让位)。**无消费者不预置令牌**,别再把它加回来。
8
8
  *
9
- * ## 抽出说明
10
- * 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
11
- * 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
12
- * 「声明在某个组件根类上」这条脆弱假设。
13
- * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
14
- */
9
+ *
10
+ * 令牌锚 `[data-manohub-ui]`(容器是每个分件的祖先 ⇒ 落在容器里的分件都取得到值)。
11
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(搬走会让档位失效);
12
+ * 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
13
+ */
15
14
  [data-manohub-ui] {
16
15
  --ui-tree-row-height: 34px;
17
16
  --ui-tree-row-height-compact: 28px;