@manohub/ui 0.10.4 → 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 (72) hide show
  1. package/README.md +155 -155
  2. package/dist/components/form/index.js +8 -1
  3. package/dist/components/tabs/index.d.ts +9 -6
  4. package/dist/components/tabs/index.js +6 -1
  5. package/dist/styles/components/avatar.css +131 -131
  6. package/dist/styles/components/avatar.tokens.css +24 -24
  7. package/dist/styles/components/badge.css +266 -266
  8. package/dist/styles/components/badge.tokens.css +24 -24
  9. package/dist/styles/components/button.css +460 -460
  10. package/dist/styles/components/capsule.css +128 -128
  11. package/dist/styles/components/capsule.tokens.css +27 -27
  12. package/dist/styles/components/card.css +198 -198
  13. package/dist/styles/components/checkbox.css +145 -145
  14. package/dist/styles/components/checkbox.tokens.css +26 -26
  15. package/dist/styles/components/code-block.css +216 -216
  16. package/dist/styles/components/code-block.tokens.css +40 -40
  17. package/dist/styles/components/collapse.css +62 -62
  18. package/dist/styles/components/collapse.tokens.css +20 -20
  19. package/dist/styles/components/dialog.css +158 -158
  20. package/dist/styles/components/dialog.tokens.css +24 -24
  21. package/dist/styles/components/divider.css +75 -75
  22. package/dist/styles/components/divider.tokens.css +22 -22
  23. package/dist/styles/components/drawer.css +143 -143
  24. package/dist/styles/components/drawer.tokens.css +22 -22
  25. package/dist/styles/components/filter.css +29 -29
  26. package/dist/styles/components/form.css +442 -430
  27. package/dist/styles/components/form.tokens.css +15 -15
  28. package/dist/styles/components/input.css +538 -533
  29. package/dist/styles/components/input.tokens.css +43 -43
  30. package/dist/styles/components/layout.css +200 -200
  31. package/dist/styles/components/list-view.css +244 -244
  32. package/dist/styles/components/loading.css +76 -76
  33. package/dist/styles/components/loading.tokens.css +23 -23
  34. package/dist/styles/components/nav.css +48 -48
  35. package/dist/styles/components/notice.css +153 -153
  36. package/dist/styles/components/notice.tokens.css +17 -17
  37. package/dist/styles/components/notification.css +159 -159
  38. package/dist/styles/components/notification.tokens.css +37 -37
  39. package/dist/styles/components/page.css +473 -473
  40. package/dist/styles/components/pagination.css +303 -303
  41. package/dist/styles/components/pagination.tokens.css +32 -32
  42. package/dist/styles/components/panel.css +77 -77
  43. package/dist/styles/components/query-state.css +88 -88
  44. package/dist/styles/components/radio.css +271 -271
  45. package/dist/styles/components/radio.tokens.css +26 -26
  46. package/dist/styles/components/search.css +34 -34
  47. package/dist/styles/components/select.css +326 -326
  48. package/dist/styles/components/select.tokens.css +44 -44
  49. package/dist/styles/components/skeleton.css +60 -60
  50. package/dist/styles/components/skeleton.tokens.css +27 -27
  51. package/dist/styles/components/steps.css +205 -205
  52. package/dist/styles/components/steps.tokens.css +44 -44
  53. package/dist/styles/components/switch.css +165 -165
  54. package/dist/styles/components/switch.tokens.css +26 -26
  55. package/dist/styles/components/tabbar.css +235 -235
  56. package/dist/styles/components/tabbar.tokens.css +30 -30
  57. package/dist/styles/components/table.css +504 -504
  58. package/dist/styles/components/table.tokens.css +44 -44
  59. package/dist/styles/components/tag.css +127 -127
  60. package/dist/styles/components/tag.tokens.css +24 -24
  61. package/dist/styles/components/toast.css +185 -185
  62. package/dist/styles/components/toast.tokens.css +26 -26
  63. package/dist/styles/components/tooltip.css +89 -89
  64. package/dist/styles/components/tooltip.tokens.css +25 -25
  65. package/dist/styles/components/tree.css +173 -173
  66. package/dist/styles/components/upload.css +151 -151
  67. package/dist/styles/components/upload.tokens.css +27 -27
  68. package/dist/styles/index.css +153 -153
  69. package/dist/styles/operations/collapse.css +84 -84
  70. package/dist/styles/operations/popup.css +193 -193
  71. package/dist/styles/operations/tabs.css +82 -73
  72. package/package.json +62 -62
@@ -1,198 +1,198 @@
1
- /**
2
- * Card(卡片容器:底 / 弱描边 / 圆角 / 内距 / 悬浮与选中反馈)—— **卡片外观的唯一实现**。
3
- *
4
- * 依据:@aihub/theme 的 components/card.css(圆角 8 · 内距 20 · 弱描边)+ portal 技能市场卡片实测,见下方原注释。
5
- */
6
-
7
- /* ===== Card(卡片容器:底 / 弱描边 / 圆角 / 内距 / 悬浮与选中反馈)=====
8
- 几何来源:portal 技能市场卡片实测(apps/portal/src/views/skills/index.tsx 的 SkillCard),
9
- 逐项落令牌:圆角 8(原型 rounded-lg)、内距 20(原型 p-5)、
10
- 底 Ne12/base-100、弱描边 base-300(原型 border-border)、
11
- 悬浮主色描边 + 主色 12% 阴影(原型 hover:border-primary + hover:shadow-[0_4px_10px_…])。
12
- 卡片外观在本仓**只有这一处定义**:消费方(含 ListView.CardItem)不得自绘这四类属性。 */
13
-
14
- .mh-card {
15
- /* 组件变量先铺一层,形态类只决定用哪几个(同 .mh-badge 手法) */
16
- --mh-card-bg: var(--ui-base-100);
17
- --mh-card-border: var(--ui-base-300);
18
- --mh-card-radius: var(--ui-radius-md);
19
- /* 卡片内距:**吃在各段上**(根件不出内距),故用同一个变量下发给分件与内建头 / 操作行 ——
20
- 整卡统一改它即可,单段微调传该段的 `padding` */
21
- --mh-card-padding: var(--ui-space-5);
22
- box-sizing: border-box;
23
- display: flex;
24
- flex-direction: column;
25
- border: 1px solid var(--mh-card-border);
26
- border-radius: var(--mh-card-radius);
27
- background: var(--mh-card-bg);
28
- transition: border-color 0.2s ease, box-shadow 0.2s ease;
29
- }
30
-
31
- /* ===== 内距归属(改这几条规则前务必先读)=====
32
- *
33
- * 1. **根件不出内距**:根件只出面(底 / 描边 / 圆角),也不出段间距 ——
34
- * 根件若也吃内距,就会与段的内距叠成两层留白(故面无「根件让出内距」的修饰类)。
35
- * 2. **段的纵向只吃上边**(`padding-block-start`):一段只负责**与自己上方之间的距离**,
36
- * 下一段的上内距就是「段间距」。于是头部 + body、body + footer 相邻时**不会**叠成两份
37
- * (各吃四边就会变成 20 + 20 = 40,这正是要避免的)。
38
- * 3. **卡片下沿由最后一段补**(下方那条 `:last-child` 规则):段不吃下边,底边得有人兜。
39
- * 段的位置由组件保证(裸内容自动成段、封面不吃内距也不是段),故 `:last-child` 必定落在段上。
40
- * 4. 横向每段恒吃 `--mh-card-padding`(`padding-inline`)。
41
- *
42
- * ⚠️ 以上 2 / 3 / 4 是**不给 `padding` 时的缺省口径**。分件一旦显式传了 `padding`,
43
- * 组件就落行内样式(`{ y, x }` 两维都给时是 `padding: y x` 简写),**整段四边由消费方定价** ——
44
- * 行内样式盖过这里的类规则,`:last-child` 那条下沿兜底也随之失效(这是有意的:消费方显式给了就说得清)。
45
- * 要保留兜底就不要给那一段传 `padding`。
46
- *
47
- * 直接写的内容(没包 `Card.Body` 的裸子节点)由组件自动补一层 Body,所以
48
- * 「不给分件」(`<Card>正文</Card>`)与显式分段得到的是同一套几何。 */
49
-
50
- /* 头部:**分件 `Card.Header` 与 `Card` 上的内建头共用这一类**(四件:图标 / 标题 / 副标题 + 右端 extra)。
51
- 行 + 两端对齐:左「左侧区域」、右「extra」;四个位一个都不给时退化为纯自排容器。 */
52
-
53
- .mh-card__header {
54
- display: flex;
55
- flex: none;
56
- align-items: center;
57
- justify-content: space-between;
58
- gap: var(--ui-space-2);
59
- min-width: 0;
60
- padding-block-start: var(--mh-card-padding);
61
- padding-inline: var(--mh-card-padding);
62
- }
63
-
64
- /* 左侧区域:图标 + 文字块(标题 / 副标题)+ 自排内容 */
65
-
66
- .mh-card__header-main {
67
- display: flex;
68
- flex: 1;
69
- align-items: center;
70
- gap: var(--ui-space-3);
71
- min-width: 0;
72
- }
73
-
74
- /* 图标位 36×36(与 ListView.CardItem 同一档),圆角取控件档 6;图片按方框自裁 */
75
-
76
- .mh-card__header-icon {
77
- flex: none;
78
- display: inline-flex;
79
- align-items: center;
80
- justify-content: center;
81
- width: 36px;
82
- height: 36px;
83
- overflow: hidden;
84
- border-radius: var(--ui-radius-control);
85
- }
86
-
87
- .mh-card__header-icon-img {
88
- display: block;
89
- width: 100%;
90
- height: 100%;
91
- object-fit: cover;
92
- }
93
-
94
- /* 文字块:标题在上、副标题在下(两行都单行省略) */
95
-
96
- .mh-card__header-text {
97
- display: flex;
98
- flex-direction: column;
99
- gap: var(--ui-space-1);
100
- min-width: 0;
101
- }
102
-
103
- .mh-card__header-title {
104
- min-width: 0;
105
- overflow: hidden;
106
- text-overflow: ellipsis;
107
- white-space: nowrap;
108
- font-size: var(--ui-font-heading);
109
- line-height: var(--ui-line-heading);
110
- font-weight: var(--ui-weight-medium);
111
- color: var(--ui-base-content);
112
- }
113
-
114
- .mh-card__header-subtitle {
115
- overflow: hidden;
116
- text-overflow: ellipsis;
117
- white-space: nowrap;
118
- font-size: var(--ui-font-caption);
119
- line-height: var(--ui-line-caption);
120
- color: var(--ui-base-content-muted);
121
- }
122
-
123
- /* 右端:状态胶囊 / 行内按钮 / 统计(不抢左侧宽度) */
124
-
125
- .mh-card__header-extra {
126
- flex: none;
127
- font-size: var(--ui-font-caption);
128
- color: var(--ui-base-content-muted);
129
- }
130
-
131
- .mh-card__body {
132
- display: flex;
133
- flex: 1;
134
- flex-direction: column;
135
- /* 卡内纵向间距 16(原型 gap-4):内容段落的节奏原来由根件的 gap 给,内距下放到段后归这里 */
136
- gap: var(--ui-space-4);
137
- min-width: 0;
138
- min-height: 0;
139
- padding-block-start: var(--mh-card-padding);
140
- padding-inline: var(--mh-card-padding);
141
- }
142
-
143
- /* 尾部贴卡片底部:卡片被拉伸(网格等高 / min-height)时尾部不悬空 */
144
-
145
- .mh-card__footer {
146
- display: flex;
147
- flex: none;
148
- flex-direction: column;
149
- gap: var(--ui-space-2);
150
- min-width: 0;
151
- margin-top: auto;
152
- padding-block-start: var(--mh-card-padding);
153
- padding-inline: var(--mh-card-padding);
154
- }
155
-
156
- /* 卡片下沿:不给 `padding` 时纵向只吃上边(见上),底边由**最后一段**补,否则内容贴卡片边。
157
- (传了 `padding` 的段由行内样式接管,这里的兜底对那一段不再生效。) */
158
-
159
- .mh-card > .mh-card__header:last-child,
160
- .mh-card > .mh-card__body:last-child,
161
- .mh-card > .mh-card__footer:last-child,
162
- .mh-card > .mh-card__actions:last-child {
163
- padding-block-end: var(--mh-card-padding);
164
- }
165
-
166
- .mh-card--plain {
167
- border-color: transparent;
168
- }
169
-
170
- .mh-card--interactive {
171
- cursor: pointer;
172
- }
173
-
174
- .mh-card--interactive:hover {
175
- border-color: var(--ui-primary);
176
- box-shadow: var(--ui-shadow-card-hover);
177
- }
178
-
179
- .mh-card--selected {
180
- border-color: var(--ui-primary);
181
- background: var(--ui-primary-subtle);
182
- }
183
-
184
- .mh-card--disabled {
185
- cursor: not-allowed;
186
- opacity: 0.5;
187
- }
188
-
189
- /* ===== 底部操作行(与段同族,头部那一类的规则见上)=====
190
- * 内距与段同口径:各吃一份段内距,`margin-top: auto` 贴卡片底部。 */
191
- .mh-card__actions {
192
- display: flex;
193
- align-items: center;
194
- gap: var(--ui-space-2);
195
- margin-top: auto;
196
- padding-block-start: var(--mh-card-padding);
197
- padding-inline: var(--mh-card-padding);
198
- }
1
+ /**
2
+ * Card(卡片容器:底 / 弱描边 / 圆角 / 内距 / 悬浮与选中反馈)—— **卡片外观的唯一实现**。
3
+ *
4
+ * 依据:@aihub/theme 的 components/card.css(圆角 8 · 内距 20 · 弱描边)+ portal 技能市场卡片实测,见下方原注释。
5
+ */
6
+
7
+ /* ===== Card(卡片容器:底 / 弱描边 / 圆角 / 内距 / 悬浮与选中反馈)=====
8
+ 几何来源:portal 技能市场卡片实测(apps/portal/src/views/skills/index.tsx 的 SkillCard),
9
+ 逐项落令牌:圆角 8(原型 rounded-lg)、内距 20(原型 p-5)、
10
+ 底 Ne12/base-100、弱描边 base-300(原型 border-border)、
11
+ 悬浮主色描边 + 主色 12% 阴影(原型 hover:border-primary + hover:shadow-[0_4px_10px_…])。
12
+ 卡片外观在本仓**只有这一处定义**:消费方(含 ListView.CardItem)不得自绘这四类属性。 */
13
+
14
+ .mh-card {
15
+ /* 组件变量先铺一层,形态类只决定用哪几个(同 .mh-badge 手法) */
16
+ --mh-card-bg: var(--ui-base-100);
17
+ --mh-card-border: var(--ui-base-300);
18
+ --mh-card-radius: var(--ui-radius-md);
19
+ /* 卡片内距:**吃在各段上**(根件不出内距),故用同一个变量下发给分件与内建头 / 操作行 ——
20
+ 整卡统一改它即可,单段微调传该段的 `padding` */
21
+ --mh-card-padding: var(--ui-space-5);
22
+ box-sizing: border-box;
23
+ display: flex;
24
+ flex-direction: column;
25
+ border: 1px solid var(--mh-card-border);
26
+ border-radius: var(--mh-card-radius);
27
+ background: var(--mh-card-bg);
28
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
29
+ }
30
+
31
+ /* ===== 内距归属(改这几条规则前务必先读)=====
32
+ *
33
+ * 1. **根件不出内距**:根件只出面(底 / 描边 / 圆角),也不出段间距 ——
34
+ * 根件若也吃内距,就会与段的内距叠成两层留白(故面无「根件让出内距」的修饰类)。
35
+ * 2. **段的纵向只吃上边**(`padding-block-start`):一段只负责**与自己上方之间的距离**,
36
+ * 下一段的上内距就是「段间距」。于是头部 + body、body + footer 相邻时**不会**叠成两份
37
+ * (各吃四边就会变成 20 + 20 = 40,这正是要避免的)。
38
+ * 3. **卡片下沿由最后一段补**(下方那条 `:last-child` 规则):段不吃下边,底边得有人兜。
39
+ * 段的位置由组件保证(裸内容自动成段、封面不吃内距也不是段),故 `:last-child` 必定落在段上。
40
+ * 4. 横向每段恒吃 `--mh-card-padding`(`padding-inline`)。
41
+ *
42
+ * ⚠️ 以上 2 / 3 / 4 是**不给 `padding` 时的缺省口径**。分件一旦显式传了 `padding`,
43
+ * 组件就落行内样式(`{ y, x }` 两维都给时是 `padding: y x` 简写),**整段四边由消费方定价** ——
44
+ * 行内样式盖过这里的类规则,`:last-child` 那条下沿兜底也随之失效(这是有意的:消费方显式给了就说得清)。
45
+ * 要保留兜底就不要给那一段传 `padding`。
46
+ *
47
+ * 直接写的内容(没包 `Card.Body` 的裸子节点)由组件自动补一层 Body,所以
48
+ * 「不给分件」(`<Card>正文</Card>`)与显式分段得到的是同一套几何。 */
49
+
50
+ /* 头部:**分件 `Card.Header` 与 `Card` 上的内建头共用这一类**(四件:图标 / 标题 / 副标题 + 右端 extra)。
51
+ 行 + 两端对齐:左「左侧区域」、右「extra」;四个位一个都不给时退化为纯自排容器。 */
52
+
53
+ .mh-card__header {
54
+ display: flex;
55
+ flex: none;
56
+ align-items: center;
57
+ justify-content: space-between;
58
+ gap: var(--ui-space-2);
59
+ min-width: 0;
60
+ padding-block-start: var(--mh-card-padding);
61
+ padding-inline: var(--mh-card-padding);
62
+ }
63
+
64
+ /* 左侧区域:图标 + 文字块(标题 / 副标题)+ 自排内容 */
65
+
66
+ .mh-card__header-main {
67
+ display: flex;
68
+ flex: 1;
69
+ align-items: center;
70
+ gap: var(--ui-space-3);
71
+ min-width: 0;
72
+ }
73
+
74
+ /* 图标位 36×36(与 ListView.CardItem 同一档),圆角取控件档 6;图片按方框自裁 */
75
+
76
+ .mh-card__header-icon {
77
+ flex: none;
78
+ display: inline-flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ width: 36px;
82
+ height: 36px;
83
+ overflow: hidden;
84
+ border-radius: var(--ui-radius-control);
85
+ }
86
+
87
+ .mh-card__header-icon-img {
88
+ display: block;
89
+ width: 100%;
90
+ height: 100%;
91
+ object-fit: cover;
92
+ }
93
+
94
+ /* 文字块:标题在上、副标题在下(两行都单行省略) */
95
+
96
+ .mh-card__header-text {
97
+ display: flex;
98
+ flex-direction: column;
99
+ gap: var(--ui-space-1);
100
+ min-width: 0;
101
+ }
102
+
103
+ .mh-card__header-title {
104
+ min-width: 0;
105
+ overflow: hidden;
106
+ text-overflow: ellipsis;
107
+ white-space: nowrap;
108
+ font-size: var(--ui-font-heading);
109
+ line-height: var(--ui-line-heading);
110
+ font-weight: var(--ui-weight-medium);
111
+ color: var(--ui-base-content);
112
+ }
113
+
114
+ .mh-card__header-subtitle {
115
+ overflow: hidden;
116
+ text-overflow: ellipsis;
117
+ white-space: nowrap;
118
+ font-size: var(--ui-font-caption);
119
+ line-height: var(--ui-line-caption);
120
+ color: var(--ui-base-content-muted);
121
+ }
122
+
123
+ /* 右端:状态胶囊 / 行内按钮 / 统计(不抢左侧宽度) */
124
+
125
+ .mh-card__header-extra {
126
+ flex: none;
127
+ font-size: var(--ui-font-caption);
128
+ color: var(--ui-base-content-muted);
129
+ }
130
+
131
+ .mh-card__body {
132
+ display: flex;
133
+ flex: 1;
134
+ flex-direction: column;
135
+ /* 卡内纵向间距 16(原型 gap-4):内容段落的节奏原来由根件的 gap 给,内距下放到段后归这里 */
136
+ gap: var(--ui-space-4);
137
+ min-width: 0;
138
+ min-height: 0;
139
+ padding-block-start: var(--mh-card-padding);
140
+ padding-inline: var(--mh-card-padding);
141
+ }
142
+
143
+ /* 尾部贴卡片底部:卡片被拉伸(网格等高 / min-height)时尾部不悬空 */
144
+
145
+ .mh-card__footer {
146
+ display: flex;
147
+ flex: none;
148
+ flex-direction: column;
149
+ gap: var(--ui-space-2);
150
+ min-width: 0;
151
+ margin-top: auto;
152
+ padding-block-start: var(--mh-card-padding);
153
+ padding-inline: var(--mh-card-padding);
154
+ }
155
+
156
+ /* 卡片下沿:不给 `padding` 时纵向只吃上边(见上),底边由**最后一段**补,否则内容贴卡片边。
157
+ (传了 `padding` 的段由行内样式接管,这里的兜底对那一段不再生效。) */
158
+
159
+ .mh-card > .mh-card__header:last-child,
160
+ .mh-card > .mh-card__body:last-child,
161
+ .mh-card > .mh-card__footer:last-child,
162
+ .mh-card > .mh-card__actions:last-child {
163
+ padding-block-end: var(--mh-card-padding);
164
+ }
165
+
166
+ .mh-card--plain {
167
+ border-color: transparent;
168
+ }
169
+
170
+ .mh-card--interactive {
171
+ cursor: pointer;
172
+ }
173
+
174
+ .mh-card--interactive:hover {
175
+ border-color: var(--ui-primary);
176
+ box-shadow: var(--ui-shadow-card-hover);
177
+ }
178
+
179
+ .mh-card--selected {
180
+ border-color: var(--ui-primary);
181
+ background: var(--ui-primary-subtle);
182
+ }
183
+
184
+ .mh-card--disabled {
185
+ cursor: not-allowed;
186
+ opacity: 0.5;
187
+ }
188
+
189
+ /* ===== 底部操作行(与段同族,头部那一类的规则见上)=====
190
+ * 内距与段同口径:各吃一份段内距,`margin-top: auto` 贴卡片底部。 */
191
+ .mh-card__actions {
192
+ display: flex;
193
+ align-items: center;
194
+ gap: var(--ui-space-2);
195
+ margin-top: auto;
196
+ padding-block-start: var(--mh-card-padding);
197
+ padding-inline: var(--mh-card-padding);
198
+ }