@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,62 @@
1
+ /**
2
+ * Collapse 的头行皮肤(**操作层 `../operations/collapse.css` 只给行为,这里给折叠头的面**)。
3
+ *
4
+ * 分工(两层各自单一职责):
5
+ * · 操作层 → 开合派生、触发器钩子、键盘焦点环、箭头转向(不写任何底/边/内距/字号/gap);
6
+ * · 本文件 → 「头行怎么排」:标题排版、标题位与尾部(箭头/操作)的分布、箭头尺寸与色。
7
+ * 之所以不并进操作层:操作层要能伺候任意皮肤(卡片头 / 分组头 / 面板头),而本件是**自带头的折叠**。
8
+ *
9
+ * 类名沿用操作层的「词根-角色」写法(`mh-collapse-header` 一类,与 `@aihub/theme` 的
10
+ * `collapse-header` 同名,便于回规范对照);本仓既有组件的 `__` 写法不适用于操作层挂点 ——
11
+ * 那些元素互不为父子(触发器 ↔ 浮层、锚点 ↔ 浮层)。
12
+ *
13
+ * 出处:`@aihub/theme` 的 `playground/components/collapse.html` 与 `components/card.css`
14
+ * (头行「标题 + 箭头」、标题与箭头间距 8px、标题 14/600 同二级标题档)。
15
+ */
16
+
17
+ /* 头行(触发器本体):标题位 ←→ 尾部(箭头 + 额外位),整行可点 */
18
+ .mh-collapse-header {
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: space-between;
22
+ gap: var(--ui-collapse-header-gap);
23
+ min-height: var(--ui-collapse-header-min-height);
24
+ font-size: var(--ui-font-body);
25
+ font-weight: var(--ui-weight-semibold);
26
+ color: var(--ui-base-content);
27
+ }
28
+
29
+ /* 标题位:单行截断(长标题不把尾部挤出可视区) */
30
+ .mh-collapse-title {
31
+ min-width: 0;
32
+ overflow: hidden;
33
+ white-space: nowrap;
34
+ text-overflow: ellipsis;
35
+ }
36
+
37
+ /* 尾部:额外位(计数 / 行内操作)+ 箭头,与标题同行 */
38
+ .mh-collapse-extra {
39
+ display: flex;
40
+ flex: none;
41
+ align-items: center;
42
+ gap: var(--ui-space-2);
43
+ color: var(--ui-base-content-muted);
44
+ }
45
+
46
+ /* 箭头:字形由 `@manohub/icon` 的 `<Icon name="chevron-down">` 提供,这里只定色与尺寸(转向在操作层)。
47
+ 尺寸取全局图标档 —— 常规图标一律 `--ui-font-icon`,本件不再自定(与树箭头同档)。 */
48
+ .mh-collapse-caret {
49
+ flex: none;
50
+ width: var(--ui-font-icon);
51
+ height: var(--ui-font-icon);
52
+ color: var(--ui-base-content-muted);
53
+ }
54
+
55
+ /* ===== 禁用档:头行不可点(开合已在组件里 `preventDefault` 挡住) ===== */
56
+ .mh-collapse[data-disabled='true'] > .mh-collapse-header {
57
+ cursor: not-allowed;
58
+ opacity: 0.5;
59
+ }
60
+ .mh-collapse[data-disabled='true'] > .mh-collapse-header .mh-collapse-caret {
61
+ display: none; /* 不能开合就别留一个会转的箭头 */
62
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * collapse —— 单件令牌(**基础值**)。
3
+ *
4
+ * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
+ *
6
+ * ## 抽出说明
7
+ * 本文件从面文件里抽出(原先混写在 `collapse.css` 顶部):这些是**基础值**,锚在
8
+ * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
+ * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
+ * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
+ *
12
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
+ * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
+ * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
+ */
16
+ [data-manohub-ui] {
17
+ /* 单件几何(只服务本件,故写在这里;跨件令牌才进 theme/) */
18
+ --ui-collapse-header-gap: var(--ui-space-2); /* 标题位与尾部间距 8px(规范实测) */
19
+ --ui-collapse-header-min-height: var(--ui-row-height); /* 头行最小高 = 行高档,保证可点区高度 */
20
+ }
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Dialog —— 对话框皮肤(与操作层并列组合:`class="mh-popup mh-dialog"`)。
3
+ *
4
+ * 出处:`@aihub/theme` 的 `playground/components/dialog.css` 与 `src/components/dialog.css`
5
+ * (面板 520 / 大档 760 / 圆角 16 / 软投影;页头 16 上内距 + 24 行高、内容内距 24、底栏 0/24/16;
6
+ * **三段之间无分割线**(规范 2026-09-17 按反馈撤除了页头 border-bottom 与底栏 border-top);
7
+ * 关闭件 20×20;真实遮罩按 Mask01 黑 45% —— 用户裁定,浅灰 25% + 模糊只留给静态样张)。
8
+ *
9
+ * 行为全在原生与操作层:`<dialog>` 由浏览器给模态语义、Esc 关闭、焦点陷阱与 `::backdrop`;
10
+ * 开合与定位归 `styles/operations/popup.css`(它认 `[open]`)。本件只给面。
11
+ *
12
+ * **类名与面文件名同根**:`.mh-dialog*`(元素走 `__`),一律 `mh-` 前缀。
13
+
14
+ *
15
+ * 边界(有意不做):规范的 `.popconfirm`(气泡确认)不在本件 —— 它是「浮层 + 按钮族」的组合用法
16
+ * (`class="mh-popup mh-card"` + 按钮),不需要新的面;尺寸 220/r10 那组值也不值得为它单开一族。
17
+ */
18
+ .mh-dialog {
19
+ width: var(--ui-dialog-width);
20
+ max-width: var(--ui-dialog-width);
21
+ padding: 0; /* UA 给 <dialog> 的内距一律归零:内距由页头 / 内容 / 底栏各自拥有 */
22
+ border: none; /* 专页面板无描边(撤除卡片自带的 1px 边) */
23
+ border-radius: var(--ui-dialog-radius);
24
+ background: var(--ui-base-100);
25
+ /* 规范 0 0 40px rgba(0,0,0,.04) → 本仓「卡片环境光」令牌(同族几何、色取本仓基准,不新造字面量) */
26
+ box-shadow: var(--ui-shadow-card);
27
+ color: var(--ui-base-content);
28
+ }
29
+ .mh-dialog--lg {
30
+ width: var(--ui-dialog-width-lg);
31
+ max-width: var(--ui-dialog-width-lg);
32
+ }
33
+
34
+ /* 真浮层遮罩:`<dialog>` 进 top layer 时才生成 ::backdrop(静态档不生成,对本面无影响) */
35
+ .mh-dialog::backdrop {
36
+ background: var(--ui-dialog-mask);
37
+ }
38
+
39
+ /* 页头:标题左、关闭位右(标题行框 24 —— 16 + 24 + 内容上距 24 = 规范页面正文起点 64) */
40
+ .mh-dialog__header {
41
+ display: flex;
42
+ align-items: center;
43
+ justify-content: space-between;
44
+ gap: var(--ui-space-2);
45
+ padding: var(--ui-space-4) var(--ui-space-6) 0;
46
+ font-size: var(--ui-font-heading); /* 规范 16px */
47
+ line-height: var(--ui-line-heading);
48
+ font-weight: var(--ui-weight-medium);
49
+ color: var(--ui-base-content);
50
+ }
51
+ /* 标题位(插槽版也走这个类,两路渲染同一份排版) */
52
+ .mh-dialog__title {
53
+ min-width: 0;
54
+ overflow: hidden;
55
+ text-overflow: ellipsis;
56
+ white-space: nowrap;
57
+ }
58
+
59
+ .mh-dialog__close {
60
+ display: inline-flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ flex: none;
64
+ width: var(--ui-dialog-close-size);
65
+ height: var(--ui-dialog-close-size);
66
+ margin: calc(-1 * var(--ui-space-1)); /* 热区比字形大,但视觉上仍与标题同基线 */
67
+ padding: 0;
68
+ border: none;
69
+ border-radius: var(--ui-radius-sm);
70
+ background: transparent;
71
+ color: var(--ui-base-content-muted);
72
+ cursor: pointer;
73
+ transition: background-color 0.15s ease, color 0.15s ease;
74
+ }
75
+ .mh-dialog__close:hover,
76
+ .mh-dialog__close.is-hover {
77
+ background: var(--ui-base-200);
78
+ color: var(--ui-base-content);
79
+ }
80
+ .mh-dialog__close:focus-visible {
81
+ outline: 2px solid var(--ui-primary);
82
+ outline-offset: 2px;
83
+ }
84
+
85
+ /* 内容区(内距 24;三段之间无分割线,交界间距只由三段内距单一拥有) */
86
+ .mh-dialog__body {
87
+ padding: var(--ui-space-6);
88
+ font-size: var(--ui-font-body);
89
+ line-height: var(--ui-line-body);
90
+ color: var(--ui-base-content);
91
+ }
92
+ /* 首尾孩子不吃外边距:正文里的 <p> 自带 UA margin,会与内容内距叠成一块大空档 */
93
+ .mh-dialog__body > :first-child {
94
+ margin-top: 0;
95
+ }
96
+ .mh-dialog__body > :last-child {
97
+ margin-bottom: 0;
98
+ }
99
+
100
+ /* 底栏:按钮右对齐(按钮的面归按钮族)、间距 8、下内距 16 */
101
+ .mh-dialog__footer {
102
+ display: flex;
103
+ justify-content: flex-end;
104
+ gap: var(--ui-space-2);
105
+ padding: 0 var(--ui-space-6) var(--ui-space-4);
106
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * dialog —— 单件令牌(**基础值**)。
3
+ *
4
+ * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
+ *
6
+ * ## 抽出说明
7
+ * 本文件从面文件里抽出(原先混写在 `dialog.css` 顶部):这些是**基础值**,锚在
8
+ * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
+ * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
+ * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
+ *
12
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
+ * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
+ * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
+ */
16
+ [data-manohub-ui] {
17
+ /* 单件令牌 */
18
+ --ui-dialog-width: 520px; /* 规范标准宽 */
19
+ --ui-dialog-width-lg: 760px;
20
+ --ui-dialog-radius: 16px; /* 规范 r16(本仓圆角刻度最大 8,故按实测给) */
21
+ --ui-dialog-close-size: 28px; /* 关闭件的点击热区(字形 14 居中) */
22
+ /* 规范 Mask01 黑 45%(用户 2026-09-15 裁定:真实遮罩用黑透明;浅灰 25% + blur 是专页样张特征) */
23
+ --ui-dialog-mask: rgba(0, 0, 0, 0.45);
24
+ }
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Divider —— 分隔线(水平 / 垂直 × 实线 / 虚线 × 可带中段文字)。
3
+ *
4
+ * 出处:设计稿《MH后台-0911》内容区**用了 44 处** 1px 分隔线,取值统一:
5
+ * - 水平:`0:2128 > 标题区 > 直线 2` = 1200×1(筛选区与页头带之间);
6
+ * - 垂直:`0:3920 > 直线 2备份` = 1×708(树栏与主栏之间);
7
+ * - 色:`#e6e6e6` = `--ui-base-300`(与页头下边线、表格线、卡片描边同源 —— 本包只有这一条「线」色)。
8
+ *
9
+ * **为什么单独成件**:这条线在业务里被自绘了 44 次(`border-bottom: 1px solid #e6e6e6` 一类),
10
+ * 于是「线色改一处漏一处」必然发生。收进一件后,改线色/改粗细只需要动本文件。
11
+ *
12
+ * 与 `Panel` / `Card` / `Table` 的关系:那三件的框线**是它们自己的边界**(写在各件的面里),
13
+ * 不由本件承担;本件服务的是**内容之间**的分隔。
14
+ *
15
+ * 垂直档的高度:`align-self: stretch` 走父容器的拉伸(父级是 flex 行时即整行高),
16
+ * 父级没有确定高度时退到 `min-height: 1em`。**不写 `height: 100%`** —— 那要求父级先有高度,
17
+ * 在 auto 高度的行内会塌成 0。
18
+ */
19
+ .mh-divider {
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ /* ===== 水平档(分隔上下内容)===== */
24
+ .mh-divider--horizontal {
25
+ width: 100%;
26
+ border-top: 1px solid var(--ui-divider-line);
27
+ }
28
+ .mh-divider--horizontal.mh-divider--dashed {
29
+ border-top-style: dashed;
30
+ }
31
+
32
+ /* 带中段文字:整条改成 flex 行,线由两根 `.mh-divider__line` 承担(左固定 24px、右吃剩余) */
33
+ .mh-divider--horizontal.mh-divider--with-label {
34
+ display: flex;
35
+ align-items: center;
36
+ gap: var(--ui-divider-label-gap);
37
+ border-top: 0;
38
+ font-size: var(--ui-font-caption);
39
+ line-height: var(--ui-line-caption);
40
+ color: var(--ui-divider-label-color);
41
+ }
42
+ .mh-divider__line {
43
+ flex: 1 1 auto;
44
+ height: 1px;
45
+ background: var(--ui-divider-line);
46
+ }
47
+ /* 左段固定宽(24):文字靠近左侧时观感更稳,也让长文字不会把左段挤没 */
48
+ .mh-divider__line--start {
49
+ flex: 0 0 auto;
50
+ width: var(--ui-space-6);
51
+ }
52
+ .mh-divider--dashed .mh-divider__line {
53
+ height: 0;
54
+ border-top: 1px dashed var(--ui-divider-line);
55
+ }
56
+ .mh-divider__label {
57
+ flex: 0 0 auto;
58
+ }
59
+
60
+ /* ===== 垂直档(分隔左右内容)===== */
61
+ .mh-divider--vertical {
62
+ display: inline-block;
63
+ width: 1px;
64
+ min-height: 1em;
65
+ align-self: stretch;
66
+ border-left: 1px solid var(--ui-divider-line);
67
+ vertical-align: middle;
68
+ }
69
+ .mh-divider--vertical.mh-divider--dashed {
70
+ border-left-style: dashed;
71
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * divider —— 单件令牌(**基础值**)。
3
+ *
4
+ * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
+ *
6
+ * ## 抽出说明
7
+ * 本文件从面文件里抽出(原先混写在 `divider.css` 顶部):这些是**基础值**,锚在
8
+ * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
+ * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
+ * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
+ *
12
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
+ * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
+ * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
+ */
16
+ [data-manohub-ui] {
17
+ /* 单件令牌 */
18
+ --ui-divider-line: var(--ui-base-300);
19
+ --ui-divider-label-gap: var(--ui-space-3); /* 中段文字与两侧线的距离 12 */
20
+ --ui-divider-label-color: var(--ui-base-content-subtle);
21
+ }
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Drawer —— 抽屉皮肤(与操作层并列组合:`class="mh-popup mh-drawer"`)。
3
+ *
4
+ * 与 `Dialog` 同一套行为、只换落位:模态语义 / Esc / 焦点陷阱 / `::backdrop` 遮罩 / top layer
5
+ * 渲染全由原生 `<dialog>` 给(见 `dialog.css` 与组件头注释);本件**不新建任何浮层机制**,
6
+ * 只把居中的面板改成贴屏幕某一侧、整屏高。
7
+ *
8
+ * 三条几何决策:
9
+ * - **`margin: 0` 必须写**:UA 给 `<dialog>` 的 `margin: auto` 正是「居中」的来源,
10
+ * 不归零则 `inset-inline` 与它对冲,面板会回到中线(实测)。
11
+ * - **整屏高不切圆角**(`--ui-drawer-radius: 0`):面板上下贴视口边缘,切角会在边缘露出遮罩缺口。
12
+ * 保留成令牌是为了让主题能改(如浮起式抽屉),不是为了默认切角。
13
+ * - **宽度由组件用行内 style 下发**:`width` 既接受像素数也接受任意合法宽度串
14
+ * (`min(520px, 90vw)` 这类响应式写法),比在面里堆尺寸档更省事,也让「一屏窄了要收窄」可控。
15
+ *
16
+ * 进出场用 **animation**(不用 transition):位移只碰独立的 `translate` 属性,不碰 `transform`
17
+ * —— 与全库动画令牌的口径一致,且不会覆盖定位。`prefers-reduced-motion` 下整体关闭。
18
+ *
19
+ * **类名与面文件名同根**:`.mh-drawer*`(元素走 `__`),一律 `mh-` 前缀。
20
+ */
21
+ .mh-drawer {
22
+ position: fixed;
23
+ inset-block: 0;
24
+ inset-inline: auto 0; /* 缺省贴右侧(左档在下面覆盖) */
25
+ margin: 0; /* UA 的 margin:auto 会把面板拉回中线,必须归零 */
26
+ height: 100%;
27
+ max-height: 100%;
28
+ max-width: 100%;
29
+ display: flex;
30
+ flex-direction: column;
31
+ padding: 0;
32
+ border: none;
33
+ border-radius: var(--ui-drawer-radius);
34
+ background: var(--ui-base-100);
35
+ box-shadow: var(--ui-shadow-card);
36
+ color: var(--ui-base-content);
37
+ overflow: hidden;
38
+ }
39
+ .mh-drawer--left {
40
+ inset-inline: 0 auto; /* 贴左侧 */
41
+ }
42
+
43
+ /* 真浮层遮罩:`<dialog>` 进 top layer 时才生成 ::backdrop(静态档不生成,对本面无影响) */
44
+ .mh-drawer::backdrop {
45
+ background: var(--ui-drawer-mask);
46
+ }
47
+
48
+ /* 进场:从所贴那一侧推入(`translate` 是独立属性,不动 `transform` 与定位) */
49
+ .mh-drawer[open] {
50
+ animation: mh-drawer-in-right 0.2s ease-out;
51
+ }
52
+ .mh-drawer--left[open] {
53
+ animation-name: mh-drawer-in-left;
54
+ }
55
+ @keyframes mh-drawer-in-right {
56
+ from {
57
+ translate: 100% 0;
58
+ }
59
+ }
60
+ @keyframes mh-drawer-in-left {
61
+ from {
62
+ translate: -100% 0;
63
+ }
64
+ }
65
+ @media (prefers-reduced-motion: reduce) {
66
+ .mh-drawer[open] {
67
+ animation: none;
68
+ }
69
+ }
70
+
71
+ /* 页头:标题左、关闭位右(三段之间无分割线,与 Dialog 同一份口径) */
72
+ .mh-drawer__header {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: space-between;
76
+ gap: var(--ui-space-2);
77
+ flex: none;
78
+ padding: var(--ui-space-4) var(--ui-space-6) 0;
79
+ font-size: var(--ui-font-heading);
80
+ line-height: var(--ui-line-heading);
81
+ font-weight: var(--ui-weight-medium);
82
+ color: var(--ui-base-content);
83
+ }
84
+ /* 标题位(插槽版也走这个类,两路渲染同一份排版) */
85
+ .mh-drawer__title {
86
+ min-width: 0;
87
+ overflow: hidden;
88
+ text-overflow: ellipsis;
89
+ white-space: nowrap;
90
+ }
91
+
92
+ .mh-drawer__close {
93
+ display: inline-flex;
94
+ align-items: center;
95
+ justify-content: center;
96
+ flex: none;
97
+ width: var(--ui-drawer-close-size);
98
+ height: var(--ui-drawer-close-size);
99
+ margin: calc(-1 * var(--ui-space-1)); /* 热区比字形大,但视觉上仍与标题同基线 */
100
+ padding: 0;
101
+ border: none;
102
+ border-radius: var(--ui-radius-sm);
103
+ background: transparent;
104
+ color: var(--ui-base-content-muted);
105
+ cursor: pointer;
106
+ transition: background-color 0.15s ease, color 0.15s ease;
107
+ }
108
+ .mh-drawer__close:hover,
109
+ .mh-drawer__close.is-hover {
110
+ background: var(--ui-base-200);
111
+ color: var(--ui-base-content);
112
+ }
113
+ .mh-drawer__close:focus-visible {
114
+ outline: 2px solid var(--ui-primary);
115
+ outline-offset: 2px;
116
+ }
117
+
118
+ /* 内容区:**三段里唯一可滚的那段**(页头与底栏固定,抽屉才像抽屉) */
119
+ .mh-drawer__body {
120
+ flex: 1 1 auto;
121
+ min-height: 0;
122
+ overflow-y: auto;
123
+ padding: var(--ui-space-6);
124
+ font-size: var(--ui-font-body);
125
+ line-height: var(--ui-line-body);
126
+ color: var(--ui-base-content);
127
+ }
128
+ /* 首尾孩子不吃外边距:正文里的 <p> 自带 UA margin,会与内容内距叠成一块大空档 */
129
+ .mh-drawer__body > :first-child {
130
+ margin-top: 0;
131
+ }
132
+ .mh-drawer__body > :last-child {
133
+ margin-bottom: 0;
134
+ }
135
+
136
+ /* 底栏:按钮右对齐(按钮的面归按钮族)、间距 8、下内距 16 */
137
+ .mh-drawer__footer {
138
+ display: flex;
139
+ justify-content: flex-end;
140
+ gap: var(--ui-space-2);
141
+ flex: none;
142
+ padding: 0 var(--ui-space-6) var(--ui-space-4);
143
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * drawer —— 单件令牌(**基础值**)。
3
+ *
4
+ * 本件自己的几何 / 尺寸 / 色彩槽位;只服务本件,故不随主题进 `@manohub/theme`。
5
+ *
6
+ * ## 抽出说明
7
+ * 本文件从面文件里抽出(原先混写在 `drawer.css` 顶部):这些是**基础值**,锚在
8
+ * `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,因此**任何落在
9
+ * 容器里的分件都取得到值**,不再依赖「声明在某个组件根类上」这条脆弱假设
10
+ * (历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
11
+ *
12
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
13
+ * 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
14
+ * ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
15
+ */
16
+ [data-manohub-ui] {
17
+ /* 单件令牌 */
18
+ --ui-drawer-radius: 0; /* 整屏高面板不切角;改它才会出现内缘圆角 */
19
+ --ui-drawer-close-size: 28px; /* 关闭件的点击热区(字形 14 居中) */
20
+ /* 与 Dialog 同一份遮罩取值(规范 Mask01 黑 45%):两件并列出现时不该有两种遮罩深度 */
21
+ --ui-drawer-mask: rgba(0, 0, 0, 0.45);
22
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Filter 筛选条(`Form` 的一层壳:`Form` + `Form.Header` + 字段区)。
3
+ *
4
+ * ## 一份面只补两件事
5
+ *
6
+ * 字段行、label 列、控件列、上行与两颗按钮全部复用 `form.css`(`Form` / `Form.Header` /
7
+ * `Form.Item`)——本面**不重画**输入框、label、按钮,只补:
8
+ * 1. 字段区的排布(4 字段一行自动换行,列距 24 / 行距 16);字段宽自适应
9
+ * (label 列宽与「上行 ↔ 字段区」的行距由 `Filter` 传给 `Form` 的 `labelWidth` / `gap`,
10
+ * 它们不是 CSS 面的事 —— 见 `components/filter/index.tsx` 的两个常量)。
11
+ *
12
+ * 出处:Figma「MH后台 0911」node 0:3355(页面「01.1 技能权限分配」的筛选区),几何 1:1:
13
+ * 上行高 32(右侧两颗按钮)、下行字段「标签 + 10±2px + 控件(高 32 / 圆角 6 / 边 --ui-base-300)」。
14
+ *
15
+ * 两处**有意不照抄**(理由写在这里,免得后人当成漏项补上):
16
+ * 1. 稿里「预制筛选方案」矩形上挂了一条**绿色**投影 `DROP_SHADOW(10, #4ec87a@30%)` ——
17
+ * 与主色无关,判定为设计稿误留;本件不画(那颗按钮也不内建);
18
+ * 2. 稿里底部那条 1px 线**宽 1200**(整页宽),而筛选内容只有 1160 —— 它是**页面级分隔**,
19
+ * 由页面承担;本件画了就会与页面的线叠成双线。
20
+ *
21
+ * 同理**不带左右内距**:左右 20 由页面筛选位(`.mh-page__filter` 的 `14px 20px 0`)给,
22
+ * 组件里再给一次会变成 40。label 列宽由 `Filter` 传 `Form` 的 `labelWidth`(缺省 56),
23
+ * 因此本文件**不覆盖主题的 `--ui-form-label-width`**(面上定义 `--ui-*` 必须以本文件名作命名空间)。
24
+ */
25
+
26
+ /* 字段区:列距 24 / 行距 16,窄了整体换行(不压缩控件高度、不截断标签)。
27
+ 字段区是 `Form` 的直接子节点(`Form.Header` 归位在最前),以下均为 `Form.Item` 自身。 */
28
+ .mh-filter__fields {
29
+ display: flex;
30
+ flex-wrap: wrap;
31
+ align-items: center;
32
+ column-gap: var(--ui-space-6);
33
+ row-gap: var(--ui-space-4);
34
+ }
35
+
36
+ /* 字段(`Filter.Item` = 挂了这个类的 `Form.Item`):宽度自适应
37
+ —— 够宽均分铺满,不够则换行;label 列宽与控件列取用全部来自 form.css。 */
38
+ .mh-filter__item {
39
+ flex: 1 1 var(--ui-filter-item-min);
40
+ min-width: 0;
41
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * 单件令牌(只服务本件,故不随主题进 `@manohub/theme`):
3
+ * 字段最小宽 240 —— 与稿里 270 的字段宽同档,但允许容器够宽时均分铺满、不够时整体换行
4
+ * (1160 内容宽下一行正好排 4 个:4×240 + 3×24 = 1032 ≤ 1160)。
5
+ *
6
+ * ## 抽出说明
7
+ * 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
8
+ * 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
9
+ * 「声明在某个组件根类上」这条脆弱假设。
10
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
11
+ */
12
+ [data-manohub-ui] {
13
+ --ui-filter-item-min: 240px;
14
+ }