@manohub/ui 0.10.5 → 1.0.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 (70) hide show
  1. package/README.md +155 -155
  2. package/dist/components/form/index.js +8 -1
  3. package/dist/styles/components/avatar.css +131 -131
  4. package/dist/styles/components/avatar.tokens.css +24 -24
  5. package/dist/styles/components/badge.css +266 -266
  6. package/dist/styles/components/badge.tokens.css +24 -24
  7. package/dist/styles/components/button.css +460 -460
  8. package/dist/styles/components/capsule.css +128 -128
  9. package/dist/styles/components/capsule.tokens.css +27 -27
  10. package/dist/styles/components/card.css +198 -198
  11. package/dist/styles/components/checkbox.css +145 -145
  12. package/dist/styles/components/checkbox.tokens.css +26 -26
  13. package/dist/styles/components/code-block.css +216 -216
  14. package/dist/styles/components/code-block.tokens.css +40 -40
  15. package/dist/styles/components/collapse.css +62 -62
  16. package/dist/styles/components/collapse.tokens.css +20 -20
  17. package/dist/styles/components/dialog.css +158 -158
  18. package/dist/styles/components/dialog.tokens.css +24 -24
  19. package/dist/styles/components/divider.css +75 -75
  20. package/dist/styles/components/divider.tokens.css +22 -22
  21. package/dist/styles/components/drawer.css +143 -143
  22. package/dist/styles/components/drawer.tokens.css +22 -22
  23. package/dist/styles/components/filter.css +29 -29
  24. package/dist/styles/components/form.css +442 -425
  25. package/dist/styles/components/form.tokens.css +15 -15
  26. package/dist/styles/components/input.css +538 -538
  27. package/dist/styles/components/input.tokens.css +43 -43
  28. package/dist/styles/components/layout.css +200 -200
  29. package/dist/styles/components/list-view.css +244 -244
  30. package/dist/styles/components/loading.css +76 -76
  31. package/dist/styles/components/loading.tokens.css +23 -23
  32. package/dist/styles/components/nav.css +48 -48
  33. package/dist/styles/components/notice.css +153 -153
  34. package/dist/styles/components/notice.tokens.css +17 -17
  35. package/dist/styles/components/notification.css +159 -159
  36. package/dist/styles/components/notification.tokens.css +37 -37
  37. package/dist/styles/components/page.css +473 -473
  38. package/dist/styles/components/pagination.css +303 -303
  39. package/dist/styles/components/pagination.tokens.css +32 -32
  40. package/dist/styles/components/panel.css +77 -77
  41. package/dist/styles/components/query-state.css +88 -88
  42. package/dist/styles/components/radio.css +271 -271
  43. package/dist/styles/components/radio.tokens.css +26 -26
  44. package/dist/styles/components/search.css +34 -34
  45. package/dist/styles/components/select.css +326 -326
  46. package/dist/styles/components/select.tokens.css +44 -44
  47. package/dist/styles/components/skeleton.css +60 -60
  48. package/dist/styles/components/skeleton.tokens.css +27 -27
  49. package/dist/styles/components/steps.css +205 -205
  50. package/dist/styles/components/steps.tokens.css +44 -44
  51. package/dist/styles/components/switch.css +165 -165
  52. package/dist/styles/components/switch.tokens.css +26 -26
  53. package/dist/styles/components/tabbar.css +235 -235
  54. package/dist/styles/components/tabbar.tokens.css +30 -30
  55. package/dist/styles/components/table.css +504 -504
  56. package/dist/styles/components/table.tokens.css +44 -44
  57. package/dist/styles/components/tag.css +127 -127
  58. package/dist/styles/components/tag.tokens.css +24 -24
  59. package/dist/styles/components/toast.css +185 -185
  60. package/dist/styles/components/toast.tokens.css +26 -26
  61. package/dist/styles/components/tooltip.css +89 -89
  62. package/dist/styles/components/tooltip.tokens.css +25 -25
  63. package/dist/styles/components/tree.css +173 -173
  64. package/dist/styles/components/upload.css +151 -151
  65. package/dist/styles/components/upload.tokens.css +27 -27
  66. package/dist/styles/index.css +153 -153
  67. package/dist/styles/operations/collapse.css +84 -84
  68. package/dist/styles/operations/popup.css +193 -193
  69. package/dist/styles/operations/tabs.css +82 -82
  70. package/package.json +62 -62
@@ -1,43 +1,43 @@
1
- /**
2
- * 单件令牌。
3
- *
4
- * **本件有一批令牌是「跨分件消费」的**:表壳 `.mh-input__wrap` 是 `.mh-input` 的**父容器**
5
- * (`.mh-input__wrap > .mh-input` 就是证据),`.mh-input__menu` / `.mh-input__help-tip`
6
- * 是 popover 面板(不在控件子树里)—— 自定义属性只向下继承,声明在 `.mh-input` 上会让
7
- * 计数位 / 前后缀 / 标签 / 菜单项取不到值(声明作废,且不报错)。
8
- *
9
- * 改前靠「把令牌同时声明在 4 个外层类上」的 workaround 兜;锚到容器后容器是每个分件的祖先,
10
- * workaround 整块撤掉 —— 这正是本文件从面文件里抽出来的直接原因。
11
- *
12
- * ## 抽出说明
13
- * 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
14
- * 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
15
- * 「声明在某个组件根类上」这条脆弱假设。
16
- * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
17
- */
18
- [data-manohub-ui] {
19
- /* 展示态是**独立 `<span>`**(不带 `.mh-input`)—— 令牌锚在容器上,它照样取得到 */
20
- /* 单件令牌 */
21
- --ui-input-height: var(--ui-control-height-md); /* 标准档 32 */
22
- --ui-input-height-sm: var(--ui-control-height-sm); /* 小号 24 */
23
- --ui-input-height-lg: var(--ui-control-height-lg); /* 大号 40 */
24
- --ui-input-padding-x: var(--ui-space-3); /* 12:标准档左右内距 */
25
- --ui-input-padding-x-sm: var(--ui-space-2); /* 8 */
26
- --ui-input-padding-x-lg: 14px;
27
- --ui-input-radius: var(--ui-radius-control); /* 6:控件档(原注释写 8,是旧稿残留) */
28
- --ui-input-font-size: var(--ui-font-body); /* 14:控件内容走正文档 */
29
- --ui-input-font-size-sm: var(--ui-font-caption); /* 13 */
30
- --ui-input-font-size-lg: var(--ui-font-heading); /* 16 */
31
- /* 描边取 base-300 —— 这**不是本件自选**,是库级口径:`base-300` 是全库唯一的「线 / 框」色
32
- (输入框、按钮、表格、分页项、卡片、面板、分隔线一律取它),`base-400` 只服务勾选类小控件框体。
33
- 权威出处是 `@manohub/theme` 的 `default/colors.css` 头「三条口径」第 2 条(改值前先读那三条)。
34
- 括注的 `#e6e6e6` 是 **default** 套该槽位的值;**farris** 套同槽位取 Ne08(`#e8ebf2`)——
35
- 两套值不同、槽位语义相同,别按规范原文给输入框的 Ne04 来反推(那正是本件改前的 base-400)。 */
36
- --ui-input-line: var(--ui-base-300);
37
- --ui-input-line-hover: var(--ui-primary-hover); /* 滑过 / 聚焦转主色(规范 Th08) */
38
- --ui-input-textarea-min-height: 56px; /* 多行最小高(两行正文 + 上下内距) */
39
- --ui-input-counter-size: var(--ui-font-caption);
40
- --ui-input-icon-size: 14px; /* 清除圆点 */
41
- --ui-input-affix-gap: var(--ui-space-2); /* 壳内各附加位的间隔 */
42
- --ui-input-affix-size: var(--ui-font-icon); /* 前缀 / 后缀 / 眼睛的图标槽(常规图标档) */
43
- }
1
+ /**
2
+ * 单件令牌。
3
+ *
4
+ * **本件有一批令牌是「跨分件消费」的**:表壳 `.mh-input__wrap` 是 `.mh-input` 的**父容器**
5
+ * (`.mh-input__wrap > .mh-input` 就是证据),`.mh-input__menu` / `.mh-input__help-tip`
6
+ * 是 popover 面板(不在控件子树里)—— 自定义属性只向下继承,声明在 `.mh-input` 上会让
7
+ * 计数位 / 前后缀 / 标签 / 菜单项取不到值(声明作废,且不报错)。
8
+ *
9
+ * 改前靠「把令牌同时声明在 4 个外层类上」的 workaround 兜;锚到容器后容器是每个分件的祖先,
10
+ * workaround 整块撤掉 —— 这正是本文件从面文件里抽出来的直接原因。
11
+ *
12
+ * ## 抽出说明
13
+ * 本文件从面文件里抽出:这些是**基础值**,锚在 `[data-manohub-ui]`(跨包唯一作用域锚,
14
+ * 由入口层无条件写在应用容器上)—— 任何落在容器里的分件都取得到值,不再依赖
15
+ * 「声明在某个组件根类上」这条脆弱假设。
16
+ * ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里(拆开会让档位失效)。
17
+ */
18
+ [data-manohub-ui] {
19
+ /* 展示态是**独立 `<span>`**(不带 `.mh-input`)—— 令牌锚在容器上,它照样取得到 */
20
+ /* 单件令牌 */
21
+ --ui-input-height: var(--ui-control-height-md); /* 标准档 32 */
22
+ --ui-input-height-sm: var(--ui-control-height-sm); /* 小号 24 */
23
+ --ui-input-height-lg: var(--ui-control-height-lg); /* 大号 40 */
24
+ --ui-input-padding-x: var(--ui-space-3); /* 12:标准档左右内距 */
25
+ --ui-input-padding-x-sm: var(--ui-space-2); /* 8 */
26
+ --ui-input-padding-x-lg: 14px;
27
+ --ui-input-radius: var(--ui-radius-control); /* 6:控件档(原注释写 8,是旧稿残留) */
28
+ --ui-input-font-size: var(--ui-font-body); /* 14:控件内容走正文档 */
29
+ --ui-input-font-size-sm: var(--ui-font-caption); /* 13 */
30
+ --ui-input-font-size-lg: var(--ui-font-heading); /* 16 */
31
+ /* 描边取 base-300 —— 这**不是本件自选**,是库级口径:`base-300` 是全库唯一的「线 / 框」色
32
+ (输入框、按钮、表格、分页项、卡片、面板、分隔线一律取它),`base-400` 只服务勾选类小控件框体。
33
+ 权威出处是 `@manohub/theme` 的 `default/colors.css` 头「三条口径」第 2 条(改值前先读那三条)。
34
+ 括注的 `#e6e6e6` 是 **default** 套该槽位的值;**farris** 套同槽位取 Ne08(`#e8ebf2`)——
35
+ 两套值不同、槽位语义相同,别按规范原文给输入框的 Ne04 来反推(那正是本件改前的 base-400)。 */
36
+ --ui-input-line: var(--ui-base-300);
37
+ --ui-input-line-hover: var(--ui-primary-hover); /* 滑过 / 聚焦转主色(规范 Th08) */
38
+ --ui-input-textarea-min-height: 56px; /* 多行最小高(两行正文 + 上下内距) */
39
+ --ui-input-counter-size: var(--ui-font-caption);
40
+ --ui-input-icon-size: 14px; /* 清除圆点 */
41
+ --ui-input-affix-gap: var(--ui-space-2); /* 壳内各附加位的间隔 */
42
+ --ui-input-affix-size: var(--ui-font-icon); /* 前缀 / 后缀 / 眼睛的图标槽(常规图标档) */
43
+ }
@@ -1,200 +1,200 @@
1
- /**
2
- * Layout —— 布局原子件族(`Layout.Row` 排「行」/ `Layout.Column` 排「列」)。
3
- *
4
- * 出处:应用侧反复抄写 `display:flex; align-items:center; gap:8px` 的收敛 ——「应用侧只写布局」
5
- * 不等于「布局可以各页各写一套」:抄十遍之后间距档与居中口径必然分叉。
6
- * 两件只做三件事:**轴向**、**间距档**(令牌档位)、**对齐**。
7
- *
8
- * ## 方向口径(与 CSS 属性名相反,是刻意的)
9
- *
10
- * 行与行是上下关系 ⇒ `Row` 是**竖排容器**(`.mh-layout-row` = `flex-direction: column`);
11
- * 列与列是左右关系 ⇒ `Column` 是**水平容器**(`.mh-layout-column` = `row`)。
12
- * 判据是「读表格」:`<tr>` 一行行往下堆、一行里的格子左右并排。改这条 = 改口径。
13
- *
14
- * ## 栅格公式(`Row` 传了 `columns` 时)
15
- *
16
- * 显式 N 条轨道,track 下限取 `min(最小列宽, 均分)`、上限 `1fr`:
17
- *
18
- * - 容器够宽 → 每列 = 最小列宽(或更大,被 `1fr` 均分撑满);
19
- * - 容器不够宽 → 下限退到「均分」,列**等分收窄**(不会压成窄缝、不会横向溢出)。
20
- *
21
- * 公式里的 `%` 解析的是**栅格容器自己的内联尺寸**(不是视口),故放进弹窗 / 分栏同样成立
22
- * —— 这也是不用媒体查询断点的原因(页面都在弹窗与分栏里,视口宽度代表不了容器)。
23
- *
24
- * ⚠️ **别改回 `auto-fit`**:轨道数由「能塞下几条最小列宽」决定,恰好塞不下 N 列时会退化成
25
- * 「1 条显式 + 1 条隐式」轨道,跨格项把隐式轨道按内容宽度压成窄缝。
26
- * 浏览器实测(容器 526 / 最小 260 / `columns=2`):
27
- * `auto-fit` 版 → 476px + 41px(不等宽);显式 N 版 → 259px + 259px(等宽)。
28
- *
29
- * ## 令牌
30
- *
31
- * `--mh-layout-row-*` / `--mh-layout-column-*` 都声明在各自的根类上(可被行内样式覆盖 ——
32
- * `Layout.Row` 的 `minColumnWidth` 就是这么下发 `--mh-layout-row-min` 的);
33
- * 间距值取主题令牌 `--ui-space-1..4`,本文件**不新造色值 / 尺寸字面量**。
34
- */
35
- .mh-layout-row {
36
- --mh-layout-row-gap: var(--ui-space-2);
37
- --mh-layout-row-min: var(--ui-grid-column-min);
38
- --mh-layout-row-columns: 2;
39
- display: flex;
40
- flex-direction: column;
41
- gap: var(--mh-layout-row-gap);
42
- /* 内距不在本件声明:由 `padding` prop 直接下发实体 `padding`(值来自 prop) */
43
- /* 交叉轴(水平)不声明 = CSS 默认的 stretch(子项齐宽);要居中写 align="center" */
44
- /* 放开 min-width:行常被塞进窄格子(表格单元格、限宽控件列)——
45
- 不放开的 flex 容器压不进窄格,会把外层撑破 */
46
- min-width: 0;
47
- }
48
-
49
- /* 一行分 n 列:栅格轨道横向铺,这一行的子项并排(`columns-1` 就是一行一列) */
50
- .mh-layout-row--grid {
51
- display: grid;
52
- /* 交叉轴默认回到 stretch(单元等高);显式 align 的规则排在本条之后,能压过它 */
53
- align-items: stretch;
54
- /* 列数**恒为 N**(显式轨道,不用 auto-fit:auto-fit 在「N 列刚好放不下」时会退化成
55
- 1 条显式轨道 + 隐式轨道,跨格项把隐式轨道压成几十像素的窄缝 —— 实测过)。
56
- track 下限取 min(最小列宽, 均分):容器够宽时它就是最小列宽,
57
- 容器窄时退到均分 —— 于是列始终等宽,既不会被压成窄缝,也不会横向溢出。 */
58
- grid-template-columns: repeat(
59
- var(--mh-layout-row-columns),
60
- minmax(
61
- min(
62
- var(--mh-layout-row-min),
63
- calc(
64
- (100% - (var(--mh-layout-row-columns) - 1) * var(--mh-layout-row-gap)) /
65
- var(--mh-layout-row-columns)
66
- )
67
- ),
68
- 1fr
69
- )
70
- );
71
- }
72
-
73
- /* 列数上限 → 变量(供上面的栅格公式取用) */
74
- .mh-layout-row--columns-1 {
75
- --mh-layout-row-columns: 1;
76
- }
77
- .mh-layout-row--columns-2 {
78
- --mh-layout-row-columns: 2;
79
- }
80
- .mh-layout-row--columns-3 {
81
- --mh-layout-row-columns: 3;
82
- }
83
- .mh-layout-row--columns-4 {
84
- --mh-layout-row-columns: 4;
85
- }
86
-
87
- /* 间距档 → 变量(落到变量上:行那份栅格公式里要用同一个间距值算轨道下限)。
88
- sm/md/lg/xl = --ui-space-1/2/3/4 = 4/8/12/16;none = 0 */
89
- .mh-layout-row--gap-none {
90
- --mh-layout-row-gap: 0;
91
- }
92
- .mh-layout-row--gap-sm {
93
- --mh-layout-row-gap: var(--ui-space-1);
94
- }
95
- .mh-layout-row--gap-md {
96
- --mh-layout-row-gap: var(--ui-space-2);
97
- }
98
- .mh-layout-row--gap-lg {
99
- --mh-layout-row-gap: var(--ui-space-3);
100
- }
101
- .mh-layout-row--gap-xl {
102
- --mh-layout-row-gap: var(--ui-space-4);
103
- }
104
-
105
- /* --- 列:水平容器(一行里的一格;同时是栅格单元) --- */
106
- .mh-layout-column {
107
- --mh-layout-column-gap: var(--ui-space-2);
108
- display: flex;
109
- flex-direction: row;
110
- /* 默认**垂直居中**:列里多是「徽标 + 文本」「标签 + 值」「控件 + 按钮」这类内容要齐中线;
111
- 要贴顶写 align="start"、要齐宽写 align="stretch" */
112
- align-items: center;
113
- gap: var(--mh-layout-column-gap);
114
- /* 内距不在本件声明:同 `.mh-layout-row`,由 `padding` prop 直接下发 */
115
- min-width: 0;
116
- }
117
-
118
- .mh-layout-column--gap-none {
119
- --mh-layout-column-gap: 0;
120
- }
121
- .mh-layout-column--gap-sm {
122
- --mh-layout-column-gap: var(--ui-space-1);
123
- }
124
- .mh-layout-column--gap-md {
125
- --mh-layout-column-gap: var(--ui-space-2);
126
- }
127
- .mh-layout-column--gap-lg {
128
- --mh-layout-column-gap: var(--ui-space-3);
129
- }
130
- .mh-layout-column--gap-xl {
131
- --mh-layout-column-gap: var(--ui-space-4);
132
- }
133
-
134
- /* 折行属于**水平容器**(列里的内容太宽要折行);竖排容器没有「折行」这回事,
135
- 栅格形态的「折行」由自动减列承担 */
136
- .mh-layout-column--wrap {
137
- flex-wrap: wrap;
138
- }
139
-
140
- /* 栅格单元跨格(span 不要超过所在行的 columns,超了 auto-fit 会为它多开轨道) */
141
- .mh-layout-column--span-2 {
142
- grid-column: span 2;
143
- }
144
- .mh-layout-column--span-3 {
145
- grid-column: span 3;
146
- }
147
- .mh-layout-column--span-4 {
148
- grid-column: span 4;
149
- }
150
-
151
- /* 对齐(排在 `.mh-layout-row--grid` 的 stretch 之后:显式 align 要能压过它) */
152
- .mh-layout-row--align-start {
153
- align-items: flex-start;
154
- }
155
- .mh-layout-column--align-start {
156
- align-items: flex-start;
157
- }
158
- .mh-layout-row--align-center {
159
- align-items: center;
160
- }
161
- .mh-layout-column--align-center {
162
- align-items: center;
163
- }
164
- .mh-layout-row--align-end {
165
- align-items: flex-end;
166
- }
167
- .mh-layout-column--align-end {
168
- align-items: flex-end;
169
- }
170
- .mh-layout-row--align-baseline {
171
- align-items: baseline;
172
- }
173
- .mh-layout-column--align-baseline {
174
- align-items: baseline;
175
- }
176
- .mh-layout-row--align-stretch {
177
- align-items: stretch;
178
- }
179
- .mh-layout-column--align-stretch {
180
- align-items: stretch;
181
- }
182
-
183
- .mh-layout-row--justify-center {
184
- justify-content: center;
185
- }
186
- .mh-layout-column--justify-center {
187
- justify-content: center;
188
- }
189
- .mh-layout-row--justify-end {
190
- justify-content: flex-end;
191
- }
192
- .mh-layout-column--justify-end {
193
- justify-content: flex-end;
194
- }
195
- .mh-layout-row--justify-between {
196
- justify-content: space-between;
197
- }
198
- .mh-layout-column--justify-between {
199
- justify-content: space-between;
200
- }
1
+ /**
2
+ * Layout —— 布局原子件族(`Layout.Row` 排「行」/ `Layout.Column` 排「列」)。
3
+ *
4
+ * 出处:应用侧反复抄写 `display:flex; align-items:center; gap:8px` 的收敛 ——「应用侧只写布局」
5
+ * 不等于「布局可以各页各写一套」:抄十遍之后间距档与居中口径必然分叉。
6
+ * 两件只做三件事:**轴向**、**间距档**(令牌档位)、**对齐**。
7
+ *
8
+ * ## 方向口径(与 CSS 属性名相反,是刻意的)
9
+ *
10
+ * 行与行是上下关系 ⇒ `Row` 是**竖排容器**(`.mh-layout-row` = `flex-direction: column`);
11
+ * 列与列是左右关系 ⇒ `Column` 是**水平容器**(`.mh-layout-column` = `row`)。
12
+ * 判据是「读表格」:`<tr>` 一行行往下堆、一行里的格子左右并排。改这条 = 改口径。
13
+ *
14
+ * ## 栅格公式(`Row` 传了 `columns` 时)
15
+ *
16
+ * 显式 N 条轨道,track 下限取 `min(最小列宽, 均分)`、上限 `1fr`:
17
+ *
18
+ * - 容器够宽 → 每列 = 最小列宽(或更大,被 `1fr` 均分撑满);
19
+ * - 容器不够宽 → 下限退到「均分」,列**等分收窄**(不会压成窄缝、不会横向溢出)。
20
+ *
21
+ * 公式里的 `%` 解析的是**栅格容器自己的内联尺寸**(不是视口),故放进弹窗 / 分栏同样成立
22
+ * —— 这也是不用媒体查询断点的原因(页面都在弹窗与分栏里,视口宽度代表不了容器)。
23
+ *
24
+ * ⚠️ **别改回 `auto-fit`**:轨道数由「能塞下几条最小列宽」决定,恰好塞不下 N 列时会退化成
25
+ * 「1 条显式 + 1 条隐式」轨道,跨格项把隐式轨道按内容宽度压成窄缝。
26
+ * 浏览器实测(容器 526 / 最小 260 / `columns=2`):
27
+ * `auto-fit` 版 → 476px + 41px(不等宽);显式 N 版 → 259px + 259px(等宽)。
28
+ *
29
+ * ## 令牌
30
+ *
31
+ * `--mh-layout-row-*` / `--mh-layout-column-*` 都声明在各自的根类上(可被行内样式覆盖 ——
32
+ * `Layout.Row` 的 `minColumnWidth` 就是这么下发 `--mh-layout-row-min` 的);
33
+ * 间距值取主题令牌 `--ui-space-1..4`,本文件**不新造色值 / 尺寸字面量**。
34
+ */
35
+ .mh-layout-row {
36
+ --mh-layout-row-gap: var(--ui-space-2);
37
+ --mh-layout-row-min: var(--ui-grid-column-min);
38
+ --mh-layout-row-columns: 2;
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: var(--mh-layout-row-gap);
42
+ /* 内距不在本件声明:由 `padding` prop 直接下发实体 `padding`(值来自 prop) */
43
+ /* 交叉轴(水平)不声明 = CSS 默认的 stretch(子项齐宽);要居中写 align="center" */
44
+ /* 放开 min-width:行常被塞进窄格子(表格单元格、限宽控件列)——
45
+ 不放开的 flex 容器压不进窄格,会把外层撑破 */
46
+ min-width: 0;
47
+ }
48
+
49
+ /* 一行分 n 列:栅格轨道横向铺,这一行的子项并排(`columns-1` 就是一行一列) */
50
+ .mh-layout-row--grid {
51
+ display: grid;
52
+ /* 交叉轴默认回到 stretch(单元等高);显式 align 的规则排在本条之后,能压过它 */
53
+ align-items: stretch;
54
+ /* 列数**恒为 N**(显式轨道,不用 auto-fit:auto-fit 在「N 列刚好放不下」时会退化成
55
+ 1 条显式轨道 + 隐式轨道,跨格项把隐式轨道压成几十像素的窄缝 —— 实测过)。
56
+ track 下限取 min(最小列宽, 均分):容器够宽时它就是最小列宽,
57
+ 容器窄时退到均分 —— 于是列始终等宽,既不会被压成窄缝,也不会横向溢出。 */
58
+ grid-template-columns: repeat(
59
+ var(--mh-layout-row-columns),
60
+ minmax(
61
+ min(
62
+ var(--mh-layout-row-min),
63
+ calc(
64
+ (100% - (var(--mh-layout-row-columns) - 1) * var(--mh-layout-row-gap)) /
65
+ var(--mh-layout-row-columns)
66
+ )
67
+ ),
68
+ 1fr
69
+ )
70
+ );
71
+ }
72
+
73
+ /* 列数上限 → 变量(供上面的栅格公式取用) */
74
+ .mh-layout-row--columns-1 {
75
+ --mh-layout-row-columns: 1;
76
+ }
77
+ .mh-layout-row--columns-2 {
78
+ --mh-layout-row-columns: 2;
79
+ }
80
+ .mh-layout-row--columns-3 {
81
+ --mh-layout-row-columns: 3;
82
+ }
83
+ .mh-layout-row--columns-4 {
84
+ --mh-layout-row-columns: 4;
85
+ }
86
+
87
+ /* 间距档 → 变量(落到变量上:行那份栅格公式里要用同一个间距值算轨道下限)。
88
+ sm/md/lg/xl = --ui-space-1/2/3/4 = 4/8/12/16;none = 0 */
89
+ .mh-layout-row--gap-none {
90
+ --mh-layout-row-gap: 0;
91
+ }
92
+ .mh-layout-row--gap-sm {
93
+ --mh-layout-row-gap: var(--ui-space-1);
94
+ }
95
+ .mh-layout-row--gap-md {
96
+ --mh-layout-row-gap: var(--ui-space-2);
97
+ }
98
+ .mh-layout-row--gap-lg {
99
+ --mh-layout-row-gap: var(--ui-space-3);
100
+ }
101
+ .mh-layout-row--gap-xl {
102
+ --mh-layout-row-gap: var(--ui-space-4);
103
+ }
104
+
105
+ /* --- 列:水平容器(一行里的一格;同时是栅格单元) --- */
106
+ .mh-layout-column {
107
+ --mh-layout-column-gap: var(--ui-space-2);
108
+ display: flex;
109
+ flex-direction: row;
110
+ /* 默认**垂直居中**:列里多是「徽标 + 文本」「标签 + 值」「控件 + 按钮」这类内容要齐中线;
111
+ 要贴顶写 align="start"、要齐宽写 align="stretch" */
112
+ align-items: center;
113
+ gap: var(--mh-layout-column-gap);
114
+ /* 内距不在本件声明:同 `.mh-layout-row`,由 `padding` prop 直接下发 */
115
+ min-width: 0;
116
+ }
117
+
118
+ .mh-layout-column--gap-none {
119
+ --mh-layout-column-gap: 0;
120
+ }
121
+ .mh-layout-column--gap-sm {
122
+ --mh-layout-column-gap: var(--ui-space-1);
123
+ }
124
+ .mh-layout-column--gap-md {
125
+ --mh-layout-column-gap: var(--ui-space-2);
126
+ }
127
+ .mh-layout-column--gap-lg {
128
+ --mh-layout-column-gap: var(--ui-space-3);
129
+ }
130
+ .mh-layout-column--gap-xl {
131
+ --mh-layout-column-gap: var(--ui-space-4);
132
+ }
133
+
134
+ /* 折行属于**水平容器**(列里的内容太宽要折行);竖排容器没有「折行」这回事,
135
+ 栅格形态的「折行」由自动减列承担 */
136
+ .mh-layout-column--wrap {
137
+ flex-wrap: wrap;
138
+ }
139
+
140
+ /* 栅格单元跨格(span 不要超过所在行的 columns,超了 auto-fit 会为它多开轨道) */
141
+ .mh-layout-column--span-2 {
142
+ grid-column: span 2;
143
+ }
144
+ .mh-layout-column--span-3 {
145
+ grid-column: span 3;
146
+ }
147
+ .mh-layout-column--span-4 {
148
+ grid-column: span 4;
149
+ }
150
+
151
+ /* 对齐(排在 `.mh-layout-row--grid` 的 stretch 之后:显式 align 要能压过它) */
152
+ .mh-layout-row--align-start {
153
+ align-items: flex-start;
154
+ }
155
+ .mh-layout-column--align-start {
156
+ align-items: flex-start;
157
+ }
158
+ .mh-layout-row--align-center {
159
+ align-items: center;
160
+ }
161
+ .mh-layout-column--align-center {
162
+ align-items: center;
163
+ }
164
+ .mh-layout-row--align-end {
165
+ align-items: flex-end;
166
+ }
167
+ .mh-layout-column--align-end {
168
+ align-items: flex-end;
169
+ }
170
+ .mh-layout-row--align-baseline {
171
+ align-items: baseline;
172
+ }
173
+ .mh-layout-column--align-baseline {
174
+ align-items: baseline;
175
+ }
176
+ .mh-layout-row--align-stretch {
177
+ align-items: stretch;
178
+ }
179
+ .mh-layout-column--align-stretch {
180
+ align-items: stretch;
181
+ }
182
+
183
+ .mh-layout-row--justify-center {
184
+ justify-content: center;
185
+ }
186
+ .mh-layout-column--justify-center {
187
+ justify-content: center;
188
+ }
189
+ .mh-layout-row--justify-end {
190
+ justify-content: flex-end;
191
+ }
192
+ .mh-layout-column--justify-end {
193
+ justify-content: flex-end;
194
+ }
195
+ .mh-layout-row--justify-between {
196
+ justify-content: space-between;
197
+ }
198
+ .mh-layout-column--justify-between {
199
+ justify-content: space-between;
200
+ }