@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.
- package/README.md +155 -155
- package/dist/components/form/index.js +8 -1
- package/dist/components/tabs/index.d.ts +9 -6
- package/dist/components/tabs/index.js +6 -1
- package/dist/styles/components/avatar.css +131 -131
- package/dist/styles/components/avatar.tokens.css +24 -24
- package/dist/styles/components/badge.css +266 -266
- package/dist/styles/components/badge.tokens.css +24 -24
- package/dist/styles/components/button.css +460 -460
- package/dist/styles/components/capsule.css +128 -128
- package/dist/styles/components/capsule.tokens.css +27 -27
- package/dist/styles/components/card.css +198 -198
- package/dist/styles/components/checkbox.css +145 -145
- package/dist/styles/components/checkbox.tokens.css +26 -26
- package/dist/styles/components/code-block.css +216 -216
- package/dist/styles/components/code-block.tokens.css +40 -40
- package/dist/styles/components/collapse.css +62 -62
- package/dist/styles/components/collapse.tokens.css +20 -20
- package/dist/styles/components/dialog.css +158 -158
- package/dist/styles/components/dialog.tokens.css +24 -24
- package/dist/styles/components/divider.css +75 -75
- package/dist/styles/components/divider.tokens.css +22 -22
- package/dist/styles/components/drawer.css +143 -143
- package/dist/styles/components/drawer.tokens.css +22 -22
- package/dist/styles/components/filter.css +29 -29
- package/dist/styles/components/form.css +442 -430
- package/dist/styles/components/form.tokens.css +15 -15
- package/dist/styles/components/input.css +538 -533
- package/dist/styles/components/input.tokens.css +43 -43
- package/dist/styles/components/layout.css +200 -200
- package/dist/styles/components/list-view.css +244 -244
- package/dist/styles/components/loading.css +76 -76
- package/dist/styles/components/loading.tokens.css +23 -23
- package/dist/styles/components/nav.css +48 -48
- package/dist/styles/components/notice.css +153 -153
- package/dist/styles/components/notice.tokens.css +17 -17
- package/dist/styles/components/notification.css +159 -159
- package/dist/styles/components/notification.tokens.css +37 -37
- package/dist/styles/components/page.css +473 -473
- package/dist/styles/components/pagination.css +303 -303
- package/dist/styles/components/pagination.tokens.css +32 -32
- package/dist/styles/components/panel.css +77 -77
- package/dist/styles/components/query-state.css +88 -88
- package/dist/styles/components/radio.css +271 -271
- package/dist/styles/components/radio.tokens.css +26 -26
- package/dist/styles/components/search.css +34 -34
- package/dist/styles/components/select.css +326 -326
- package/dist/styles/components/select.tokens.css +44 -44
- package/dist/styles/components/skeleton.css +60 -60
- package/dist/styles/components/skeleton.tokens.css +27 -27
- package/dist/styles/components/steps.css +205 -205
- package/dist/styles/components/steps.tokens.css +44 -44
- package/dist/styles/components/switch.css +165 -165
- package/dist/styles/components/switch.tokens.css +26 -26
- package/dist/styles/components/tabbar.css +235 -235
- package/dist/styles/components/tabbar.tokens.css +30 -30
- package/dist/styles/components/table.css +504 -504
- package/dist/styles/components/table.tokens.css +44 -44
- package/dist/styles/components/tag.css +127 -127
- package/dist/styles/components/tag.tokens.css +24 -24
- package/dist/styles/components/toast.css +185 -185
- package/dist/styles/components/toast.tokens.css +26 -26
- package/dist/styles/components/tooltip.css +89 -89
- package/dist/styles/components/tooltip.tokens.css +25 -25
- package/dist/styles/components/tree.css +173 -173
- package/dist/styles/components/upload.css +151 -151
- package/dist/styles/components/upload.tokens.css +27 -27
- package/dist/styles/index.css +153 -153
- package/dist/styles/operations/collapse.css +84 -84
- package/dist/styles/operations/popup.css +193 -193
- package/dist/styles/operations/tabs.css +82 -73
- package/package.json +62 -62
|
@@ -1,173 +1,173 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tree(自建树:节点行 + 缩进 + 展开箭头 + 计数徽标位)。
|
|
3
|
-
*
|
|
4
|
-
* 几何取自 `@aihub/theme` 的 `components/tree.css` 与设计稿《MH后台-0911》的 `0:3921` 组织树,
|
|
5
|
-
* 见下方令牌块与形态注释。
|
|
6
|
-
*/
|
|
7
|
-
|
|
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
|
-
/* 树是**行挨行**的列容器(不加行距,节距 = 行高 34):
|
|
33
|
-
行底满宽、只有内容缩进,行态(滑过 / 按下 / 选中)的底因此是连着的 ——
|
|
34
|
-
与选择器面板里的选项行同一节距(见文件头「行距原为 6」那条)。 */
|
|
35
|
-
.mh-tree {
|
|
36
|
-
display: flex;
|
|
37
|
-
flex-direction: column;
|
|
38
|
-
width: 100%;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
.mh-tree__row {
|
|
42
|
-
display: flex;
|
|
43
|
-
align-items: center;
|
|
44
|
-
gap: var(--ui-space-1);
|
|
45
|
-
height: var(--ui-tree-row-height);
|
|
46
|
-
padding: 0 var(--ui-space-2);
|
|
47
|
-
/* 缩进:基础内距 + level × 步进(level 由组件下发) */
|
|
48
|
-
padding-left: calc(var(--ui-tree-indent-base) + var(--mh-tree-level, 0) * var(--ui-tree-indent-step));
|
|
49
|
-
border-radius: var(--ui-radius-control);
|
|
50
|
-
font-size: var(--ui-font-caption);
|
|
51
|
-
color: var(--ui-base-content);
|
|
52
|
-
cursor: pointer;
|
|
53
|
-
white-space: nowrap;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
/* 紧凑档(S):节点行 28px */
|
|
57
|
-
|
|
58
|
-
.mh-tree--compact .mh-tree__row {
|
|
59
|
-
height: var(--ui-tree-row-height-compact);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
.mh-tree__row:hover {
|
|
63
|
-
background: var(--ui-primary-weak);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
.mh-tree__row:active {
|
|
67
|
-
background: var(--ui-primary-subtle);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
.mh-tree__row[data-selected='true'] {
|
|
71
|
-
background: var(--ui-primary-subtle);
|
|
72
|
-
color: var(--ui-primary);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/* 展开箭头:字形由 `@manohub/icon` 的 `<Icon name="chevron-down" />` 提供(本面不画字形);
|
|
76
|
-
展开态即字形的本向(朝下),**收起态由本层转 −90°(指向右)** —— 与 `operations/collapse.css`
|
|
77
|
-
的 `.mh-collapse-caret` 同款配方(参考实现 `@aihub/theme` 的树也是「base 字形 + 收起态转竖向」)。 */
|
|
78
|
-
|
|
79
|
-
.mh-tree__caret {
|
|
80
|
-
display: inline-flex;
|
|
81
|
-
align-items: center;
|
|
82
|
-
justify-content: center;
|
|
83
|
-
flex-shrink: 0;
|
|
84
|
-
/* 槽位与字形同档:常规图标一律 `--ui-font-icon`,本件不再自定箭头尺寸 */
|
|
85
|
-
width: var(--ui-font-icon);
|
|
86
|
-
height: var(--ui-font-icon);
|
|
87
|
-
color: var(--ui-base-content-subtle);
|
|
88
|
-
cursor: pointer;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
/* 常规图标尺寸统一取全局图标档(`<Icon>` 的 width/height 是属性,优先级低于本规则) */
|
|
92
|
-
.mh-tree__caret-icon {
|
|
93
|
-
width: var(--ui-font-icon);
|
|
94
|
-
height: var(--ui-font-icon);
|
|
95
|
-
transition: transform 0.15s ease;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/* 自定义箭头(`renderCaret`):消费方给的字形落在槽里即取同一档,不必自己写 size
|
|
99
|
-
—— 上面那条只认缺省字形的类名,故这里按**槽内的字形**给尺寸(`<Icon>` 的 width/height
|
|
100
|
-
是属性,优先级低于类规则)。朝向不在这里转:自定义箭头由消费方按展开态自选字形。 */
|
|
101
|
-
.mh-tree__caret svg {
|
|
102
|
-
width: var(--ui-font-icon);
|
|
103
|
-
height: var(--ui-font-icon);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
.mh-tree__caret[data-expanded='false'] .mh-tree__caret-icon {
|
|
107
|
-
transform: rotate(-90deg);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/* 叶子节点:占位不显示图形,但保留槽位让同层文字对齐(槽位由 `.mh-tree__caret` 的宽高承担) */
|
|
111
|
-
|
|
112
|
-
.mh-tree__caret--empty {
|
|
113
|
-
cursor: default;
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/* 节点图标槽(`renderIcon`):标签**前**的一位图标(文件夹 / 文件)。父 / 叶共用一位,
|
|
117
|
-
叶子行上面那句箭头占位仍在,故图标列跨层级对齐。
|
|
118
|
-
**颜色不写死**:跟随行色 —— 选中行(面上已把行色换成主色 `--ui-primary`)与滑过态自动同步。 */
|
|
119
|
-
|
|
120
|
-
.mh-tree__icon {
|
|
121
|
-
display: inline-flex;
|
|
122
|
-
align-items: center;
|
|
123
|
-
justify-content: center;
|
|
124
|
-
flex-shrink: 0;
|
|
125
|
-
width: var(--ui-font-icon);
|
|
126
|
-
height: var(--ui-font-icon);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/* 槽内的字形同取全局图标档(同自定义箭头那条的理由) */
|
|
130
|
-
.mh-tree__icon svg {
|
|
131
|
-
width: var(--ui-font-icon);
|
|
132
|
-
height: var(--ui-font-icon);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
.mh-tree__label {
|
|
136
|
-
flex: 1;
|
|
137
|
-
min-width: 0;
|
|
138
|
-
overflow: hidden;
|
|
139
|
-
text-overflow: ellipsis;
|
|
140
|
-
white-space: nowrap;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
.mh-tree__extra {
|
|
144
|
-
display: inline-flex;
|
|
145
|
-
align-items: center;
|
|
146
|
-
flex-shrink: 0;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/* 行尾操作区:默认隐藏,行悬浮(或行内获得焦点)时显形 —— 键盘 Tab 进来同样可见。
|
|
150
|
-
触屏没有 hover 能力,故 hover 缺失时恒显形,避免操作不可达。口径同 .mh-list-view__card-actions。 */
|
|
151
|
-
|
|
152
|
-
.mh-tree__actions {
|
|
153
|
-
display: inline-flex;
|
|
154
|
-
align-items: center;
|
|
155
|
-
gap: var(--ui-space-1);
|
|
156
|
-
flex-shrink: 0;
|
|
157
|
-
opacity: 0;
|
|
158
|
-
transition: opacity 0.15s ease;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
.mh-tree__row:hover .mh-tree__actions {
|
|
162
|
-
opacity: 1;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
.mh-tree__row:focus-within .mh-tree__actions {
|
|
166
|
-
opacity: 1;
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
@media (hover: none) {
|
|
170
|
-
.mh-tree__actions {
|
|
171
|
-
opacity: 1;
|
|
172
|
-
}
|
|
173
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Tree(自建树:节点行 + 缩进 + 展开箭头 + 计数徽标位)。
|
|
3
|
+
*
|
|
4
|
+
* 几何取自 `@aihub/theme` 的 `components/tree.css` 与设计稿《MH后台-0911》的 `0:3921` 组织树,
|
|
5
|
+
* 见下方令牌块与形态注释。
|
|
6
|
+
*/
|
|
7
|
+
|
|
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
|
+
/* 树是**行挨行**的列容器(不加行距,节距 = 行高 34):
|
|
33
|
+
行底满宽、只有内容缩进,行态(滑过 / 按下 / 选中)的底因此是连着的 ——
|
|
34
|
+
与选择器面板里的选项行同一节距(见文件头「行距原为 6」那条)。 */
|
|
35
|
+
.mh-tree {
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
width: 100%;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.mh-tree__row {
|
|
42
|
+
display: flex;
|
|
43
|
+
align-items: center;
|
|
44
|
+
gap: var(--ui-space-1);
|
|
45
|
+
height: var(--ui-tree-row-height);
|
|
46
|
+
padding: 0 var(--ui-space-2);
|
|
47
|
+
/* 缩进:基础内距 + level × 步进(level 由组件下发) */
|
|
48
|
+
padding-left: calc(var(--ui-tree-indent-base) + var(--mh-tree-level, 0) * var(--ui-tree-indent-step));
|
|
49
|
+
border-radius: var(--ui-radius-control);
|
|
50
|
+
font-size: var(--ui-font-caption);
|
|
51
|
+
color: var(--ui-base-content);
|
|
52
|
+
cursor: pointer;
|
|
53
|
+
white-space: nowrap;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* 紧凑档(S):节点行 28px */
|
|
57
|
+
|
|
58
|
+
.mh-tree--compact .mh-tree__row {
|
|
59
|
+
height: var(--ui-tree-row-height-compact);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.mh-tree__row:hover {
|
|
63
|
+
background: var(--ui-primary-weak);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.mh-tree__row:active {
|
|
67
|
+
background: var(--ui-primary-subtle);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.mh-tree__row[data-selected='true'] {
|
|
71
|
+
background: var(--ui-primary-subtle);
|
|
72
|
+
color: var(--ui-primary);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* 展开箭头:字形由 `@manohub/icon` 的 `<Icon name="chevron-down" />` 提供(本面不画字形);
|
|
76
|
+
展开态即字形的本向(朝下),**收起态由本层转 −90°(指向右)** —— 与 `operations/collapse.css`
|
|
77
|
+
的 `.mh-collapse-caret` 同款配方(参考实现 `@aihub/theme` 的树也是「base 字形 + 收起态转竖向」)。 */
|
|
78
|
+
|
|
79
|
+
.mh-tree__caret {
|
|
80
|
+
display: inline-flex;
|
|
81
|
+
align-items: center;
|
|
82
|
+
justify-content: center;
|
|
83
|
+
flex-shrink: 0;
|
|
84
|
+
/* 槽位与字形同档:常规图标一律 `--ui-font-icon`,本件不再自定箭头尺寸 */
|
|
85
|
+
width: var(--ui-font-icon);
|
|
86
|
+
height: var(--ui-font-icon);
|
|
87
|
+
color: var(--ui-base-content-subtle);
|
|
88
|
+
cursor: pointer;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/* 常规图标尺寸统一取全局图标档(`<Icon>` 的 width/height 是属性,优先级低于本规则) */
|
|
92
|
+
.mh-tree__caret-icon {
|
|
93
|
+
width: var(--ui-font-icon);
|
|
94
|
+
height: var(--ui-font-icon);
|
|
95
|
+
transition: transform 0.15s ease;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* 自定义箭头(`renderCaret`):消费方给的字形落在槽里即取同一档,不必自己写 size
|
|
99
|
+
—— 上面那条只认缺省字形的类名,故这里按**槽内的字形**给尺寸(`<Icon>` 的 width/height
|
|
100
|
+
是属性,优先级低于类规则)。朝向不在这里转:自定义箭头由消费方按展开态自选字形。 */
|
|
101
|
+
.mh-tree__caret svg {
|
|
102
|
+
width: var(--ui-font-icon);
|
|
103
|
+
height: var(--ui-font-icon);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.mh-tree__caret[data-expanded='false'] .mh-tree__caret-icon {
|
|
107
|
+
transform: rotate(-90deg);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* 叶子节点:占位不显示图形,但保留槽位让同层文字对齐(槽位由 `.mh-tree__caret` 的宽高承担) */
|
|
111
|
+
|
|
112
|
+
.mh-tree__caret--empty {
|
|
113
|
+
cursor: default;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/* 节点图标槽(`renderIcon`):标签**前**的一位图标(文件夹 / 文件)。父 / 叶共用一位,
|
|
117
|
+
叶子行上面那句箭头占位仍在,故图标列跨层级对齐。
|
|
118
|
+
**颜色不写死**:跟随行色 —— 选中行(面上已把行色换成主色 `--ui-primary`)与滑过态自动同步。 */
|
|
119
|
+
|
|
120
|
+
.mh-tree__icon {
|
|
121
|
+
display: inline-flex;
|
|
122
|
+
align-items: center;
|
|
123
|
+
justify-content: center;
|
|
124
|
+
flex-shrink: 0;
|
|
125
|
+
width: var(--ui-font-icon);
|
|
126
|
+
height: var(--ui-font-icon);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* 槽内的字形同取全局图标档(同自定义箭头那条的理由) */
|
|
130
|
+
.mh-tree__icon svg {
|
|
131
|
+
width: var(--ui-font-icon);
|
|
132
|
+
height: var(--ui-font-icon);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.mh-tree__label {
|
|
136
|
+
flex: 1;
|
|
137
|
+
min-width: 0;
|
|
138
|
+
overflow: hidden;
|
|
139
|
+
text-overflow: ellipsis;
|
|
140
|
+
white-space: nowrap;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.mh-tree__extra {
|
|
144
|
+
display: inline-flex;
|
|
145
|
+
align-items: center;
|
|
146
|
+
flex-shrink: 0;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* 行尾操作区:默认隐藏,行悬浮(或行内获得焦点)时显形 —— 键盘 Tab 进来同样可见。
|
|
150
|
+
触屏没有 hover 能力,故 hover 缺失时恒显形,避免操作不可达。口径同 .mh-list-view__card-actions。 */
|
|
151
|
+
|
|
152
|
+
.mh-tree__actions {
|
|
153
|
+
display: inline-flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
gap: var(--ui-space-1);
|
|
156
|
+
flex-shrink: 0;
|
|
157
|
+
opacity: 0;
|
|
158
|
+
transition: opacity 0.15s ease;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.mh-tree__row:hover .mh-tree__actions {
|
|
162
|
+
opacity: 1;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.mh-tree__row:focus-within .mh-tree__actions {
|
|
166
|
+
opacity: 1;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@media (hover: none) {
|
|
170
|
+
.mh-tree__actions {
|
|
171
|
+
opacity: 1;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -1,151 +1,151 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Upload —— 上传(拖拽 / 点击上传区 + 已传文件列表 + 图片缩略图 + 上传链接)。
|
|
3
|
-
*
|
|
4
|
-
* 出处:`@aihub/theme` 的 `playground/components/upload.css` 与 `src/components/upload.css`
|
|
5
|
-
* (拖拽区 500 宽 / 内距 32 / 1px 虚线 Ne05 / 圆角 6;列表行 = 名称 13px + 大小 12px + 删除文本钮,
|
|
6
|
-
* 行高 8/12 内距、末行不画分隔线;缩略图 100×100 外框、内图 84×84;主提示 Te05 + 副提示 Te07)。
|
|
7
|
-
*
|
|
8
|
-
* **零 JS 的那一半**:`<label>` 擎着 `<input type="file">`(input 隐形但保持可聚焦),
|
|
9
|
-
* 点整块即唤起系统文件选择 —— 这是原生行为,本族不写一行脚本。
|
|
10
|
-
*
|
|
11
|
-
* **"点击上传"是 span,不是 button**(与规范的一处有意差异):`<label>` 的激活行为在
|
|
12
|
-
* 「事件目标是交互式内容」时会被浏览器跳过,若把链接做成 `<button>`,点它就只会按按钮而**不唤起**
|
|
13
|
-
* 文件选择。做成 span 后整块(含这行字)都能唤起,皮还是链接样。
|
|
14
|
-
*
|
|
15
|
-
* **拖拽态需要 JS**(`dragenter/dragover/drop` 原生给不了 CSS 状态),故走组件下发的
|
|
16
|
-
* `[data-state='dragover']`;静态档 `.is-dragover` 供读图。
|
|
17
|
-
*
|
|
18
|
-
* **本件不自行发起请求**:文件列表由消费方受控(`files`),选择 / 删除 / 拖拽都只回调。
|
|
19
|
-
*/
|
|
20
|
-
.mh-upload {
|
|
21
|
-
/* 组件根:上传区与文件列表纵向排(间距 12) */
|
|
22
|
-
display: flex;
|
|
23
|
-
flex-direction: column;
|
|
24
|
-
gap: var(--ui-space-3);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
/* ===== 拖拽 / 点击上传区(整块即触发器) ===== */
|
|
28
|
-
.mh-upload__zone {
|
|
29
|
-
position: relative;
|
|
30
|
-
display: flex;
|
|
31
|
-
flex-direction: column;
|
|
32
|
-
align-items: center;
|
|
33
|
-
justify-content: center;
|
|
34
|
-
gap: var(--ui-space-1);
|
|
35
|
-
width: 100%;
|
|
36
|
-
max-width: var(--ui-upload-zone-max-width);
|
|
37
|
-
padding: var(--ui-upload-padding);
|
|
38
|
-
border: 1px dashed var(--ui-upload-line);
|
|
39
|
-
border-radius: var(--ui-upload-radius);
|
|
40
|
-
background: var(--ui-base-100);
|
|
41
|
-
text-align: center;
|
|
42
|
-
cursor: pointer;
|
|
43
|
-
}
|
|
44
|
-
/* 隐身开关:1px 盒 + clip-path,Tab 仍可达(与 checkbox / radio / capsule 同配方) */
|
|
45
|
-
.mh-upload__input {
|
|
46
|
-
position: absolute;
|
|
47
|
-
width: 1px;
|
|
48
|
-
height: 1px;
|
|
49
|
-
margin: -1px;
|
|
50
|
-
padding: 0;
|
|
51
|
-
border: 0;
|
|
52
|
-
overflow: hidden;
|
|
53
|
-
white-space: nowrap;
|
|
54
|
-
clip-path: inset(50%);
|
|
55
|
-
appearance: none;
|
|
56
|
-
pointer-events: none;
|
|
57
|
-
}
|
|
58
|
-
/* 焦点环画在可见的区上(隐身开关没有可见焦点) */
|
|
59
|
-
.mh-upload__zone:has(> .mh-upload__input:focus-visible) {
|
|
60
|
-
outline: 2px solid var(--ui-primary);
|
|
61
|
-
outline-offset: -2px;
|
|
62
|
-
}
|
|
63
|
-
/* 拖拽态(组件下发;原生无此态) */
|
|
64
|
-
.mh-upload__zone[data-state='dragover'],
|
|
65
|
-
.mh-upload__zone.is-dragover {
|
|
66
|
-
border-color: var(--ui-primary);
|
|
67
|
-
background: var(--ui-primary-weak);
|
|
68
|
-
}
|
|
69
|
-
/* 禁用:不可点(原生 disabled 与静态档同款) */
|
|
70
|
-
.mh-upload__zone.is-disabled,
|
|
71
|
-
.mh-upload__zone:has(> .mh-upload__input:disabled) {
|
|
72
|
-
border-color: var(--ui-base-300);
|
|
73
|
-
background: var(--ui-base-200);
|
|
74
|
-
cursor: not-allowed;
|
|
75
|
-
}
|
|
76
|
-
.mh-upload__zone-main {
|
|
77
|
-
font-size: var(--ui-font-caption);
|
|
78
|
-
color: var(--ui-upload-text);
|
|
79
|
-
}
|
|
80
|
-
.mh-upload__link {
|
|
81
|
-
color: var(--ui-primary);
|
|
82
|
-
}
|
|
83
|
-
.mh-upload__zone-hint {
|
|
84
|
-
font-size: var(--ui-upload-meta-size);
|
|
85
|
-
color: var(--ui-upload-hint);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/* ===== 已传文件列表(名称 + 大小 + 删除;末行不画线) ===== */
|
|
89
|
-
.mh-upload__list {
|
|
90
|
-
width: 100%;
|
|
91
|
-
max-width: var(--ui-upload-zone-max-width);
|
|
92
|
-
border: 1px solid var(--ui-base-300);
|
|
93
|
-
border-radius: var(--ui-upload-radius);
|
|
94
|
-
overflow: hidden;
|
|
95
|
-
}
|
|
96
|
-
.mh-upload__item {
|
|
97
|
-
display: flex;
|
|
98
|
-
align-items: center;
|
|
99
|
-
gap: var(--ui-space-3);
|
|
100
|
-
padding: var(--ui-space-2) var(--ui-space-3);
|
|
101
|
-
border-bottom: 1px solid var(--ui-base-300);
|
|
102
|
-
}
|
|
103
|
-
.mh-upload__item:last-child {
|
|
104
|
-
border-bottom: none;
|
|
105
|
-
}
|
|
106
|
-
.mh-upload__item-name {
|
|
107
|
-
font-size: var(--ui-font-caption);
|
|
108
|
-
color: var(--ui-base-content);
|
|
109
|
-
overflow: hidden;
|
|
110
|
-
text-overflow: ellipsis;
|
|
111
|
-
white-space: nowrap;
|
|
112
|
-
}
|
|
113
|
-
.mh-upload__item-size {
|
|
114
|
-
flex: none;
|
|
115
|
-
font-size: var(--ui-upload-meta-size);
|
|
116
|
-
color: var(--ui-base-content-subtle);
|
|
117
|
-
}
|
|
118
|
-
/* 删除位推到最右(面归按钮族的文本档,这里只给定位) */
|
|
119
|
-
.mh-upload__item-remove {
|
|
120
|
-
margin-left: auto;
|
|
121
|
-
flex: none;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
/* ===== 图片缩略图(单张 / 列表) ===== */
|
|
125
|
-
.mh-upload__thumb {
|
|
126
|
-
display: inline-flex;
|
|
127
|
-
align-items: center;
|
|
128
|
-
justify-content: center;
|
|
129
|
-
flex: none;
|
|
130
|
-
width: var(--ui-upload-thumb-size);
|
|
131
|
-
height: var(--ui-upload-thumb-size);
|
|
132
|
-
padding: var(--ui-space-2);
|
|
133
|
-
border: 1px solid var(--ui-base-300);
|
|
134
|
-
border-radius: var(--ui-upload-radius);
|
|
135
|
-
background: var(--ui-base-200);
|
|
136
|
-
font-size: var(--ui-upload-meta-size);
|
|
137
|
-
color: var(--ui-base-content-subtle);
|
|
138
|
-
overflow: hidden;
|
|
139
|
-
}
|
|
140
|
-
.mh-upload__thumb-img {
|
|
141
|
-
display: block; /* 元素级基线不再把 `img` 转块级(那条会压消费方的 `h-*` / `hidden`),本件自己写 */
|
|
142
|
-
width: var(--ui-upload-thumb-inner);
|
|
143
|
-
height: var(--ui-upload-thumb-inner);
|
|
144
|
-
object-fit: cover;
|
|
145
|
-
border-radius: var(--ui-radius-sm);
|
|
146
|
-
}
|
|
147
|
-
.mh-upload__thumbs {
|
|
148
|
-
display: flex;
|
|
149
|
-
flex-wrap: wrap;
|
|
150
|
-
gap: var(--ui-space-4);
|
|
151
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Upload —— 上传(拖拽 / 点击上传区 + 已传文件列表 + 图片缩略图 + 上传链接)。
|
|
3
|
+
*
|
|
4
|
+
* 出处:`@aihub/theme` 的 `playground/components/upload.css` 与 `src/components/upload.css`
|
|
5
|
+
* (拖拽区 500 宽 / 内距 32 / 1px 虚线 Ne05 / 圆角 6;列表行 = 名称 13px + 大小 12px + 删除文本钮,
|
|
6
|
+
* 行高 8/12 内距、末行不画分隔线;缩略图 100×100 外框、内图 84×84;主提示 Te05 + 副提示 Te07)。
|
|
7
|
+
*
|
|
8
|
+
* **零 JS 的那一半**:`<label>` 擎着 `<input type="file">`(input 隐形但保持可聚焦),
|
|
9
|
+
* 点整块即唤起系统文件选择 —— 这是原生行为,本族不写一行脚本。
|
|
10
|
+
*
|
|
11
|
+
* **"点击上传"是 span,不是 button**(与规范的一处有意差异):`<label>` 的激活行为在
|
|
12
|
+
* 「事件目标是交互式内容」时会被浏览器跳过,若把链接做成 `<button>`,点它就只会按按钮而**不唤起**
|
|
13
|
+
* 文件选择。做成 span 后整块(含这行字)都能唤起,皮还是链接样。
|
|
14
|
+
*
|
|
15
|
+
* **拖拽态需要 JS**(`dragenter/dragover/drop` 原生给不了 CSS 状态),故走组件下发的
|
|
16
|
+
* `[data-state='dragover']`;静态档 `.is-dragover` 供读图。
|
|
17
|
+
*
|
|
18
|
+
* **本件不自行发起请求**:文件列表由消费方受控(`files`),选择 / 删除 / 拖拽都只回调。
|
|
19
|
+
*/
|
|
20
|
+
.mh-upload {
|
|
21
|
+
/* 组件根:上传区与文件列表纵向排(间距 12) */
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
gap: var(--ui-space-3);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/* ===== 拖拽 / 点击上传区(整块即触发器) ===== */
|
|
28
|
+
.mh-upload__zone {
|
|
29
|
+
position: relative;
|
|
30
|
+
display: flex;
|
|
31
|
+
flex-direction: column;
|
|
32
|
+
align-items: center;
|
|
33
|
+
justify-content: center;
|
|
34
|
+
gap: var(--ui-space-1);
|
|
35
|
+
width: 100%;
|
|
36
|
+
max-width: var(--ui-upload-zone-max-width);
|
|
37
|
+
padding: var(--ui-upload-padding);
|
|
38
|
+
border: 1px dashed var(--ui-upload-line);
|
|
39
|
+
border-radius: var(--ui-upload-radius);
|
|
40
|
+
background: var(--ui-base-100);
|
|
41
|
+
text-align: center;
|
|
42
|
+
cursor: pointer;
|
|
43
|
+
}
|
|
44
|
+
/* 隐身开关:1px 盒 + clip-path,Tab 仍可达(与 checkbox / radio / capsule 同配方) */
|
|
45
|
+
.mh-upload__input {
|
|
46
|
+
position: absolute;
|
|
47
|
+
width: 1px;
|
|
48
|
+
height: 1px;
|
|
49
|
+
margin: -1px;
|
|
50
|
+
padding: 0;
|
|
51
|
+
border: 0;
|
|
52
|
+
overflow: hidden;
|
|
53
|
+
white-space: nowrap;
|
|
54
|
+
clip-path: inset(50%);
|
|
55
|
+
appearance: none;
|
|
56
|
+
pointer-events: none;
|
|
57
|
+
}
|
|
58
|
+
/* 焦点环画在可见的区上(隐身开关没有可见焦点) */
|
|
59
|
+
.mh-upload__zone:has(> .mh-upload__input:focus-visible) {
|
|
60
|
+
outline: 2px solid var(--ui-primary);
|
|
61
|
+
outline-offset: -2px;
|
|
62
|
+
}
|
|
63
|
+
/* 拖拽态(组件下发;原生无此态) */
|
|
64
|
+
.mh-upload__zone[data-state='dragover'],
|
|
65
|
+
.mh-upload__zone.is-dragover {
|
|
66
|
+
border-color: var(--ui-primary);
|
|
67
|
+
background: var(--ui-primary-weak);
|
|
68
|
+
}
|
|
69
|
+
/* 禁用:不可点(原生 disabled 与静态档同款) */
|
|
70
|
+
.mh-upload__zone.is-disabled,
|
|
71
|
+
.mh-upload__zone:has(> .mh-upload__input:disabled) {
|
|
72
|
+
border-color: var(--ui-base-300);
|
|
73
|
+
background: var(--ui-base-200);
|
|
74
|
+
cursor: not-allowed;
|
|
75
|
+
}
|
|
76
|
+
.mh-upload__zone-main {
|
|
77
|
+
font-size: var(--ui-font-caption);
|
|
78
|
+
color: var(--ui-upload-text);
|
|
79
|
+
}
|
|
80
|
+
.mh-upload__link {
|
|
81
|
+
color: var(--ui-primary);
|
|
82
|
+
}
|
|
83
|
+
.mh-upload__zone-hint {
|
|
84
|
+
font-size: var(--ui-upload-meta-size);
|
|
85
|
+
color: var(--ui-upload-hint);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* ===== 已传文件列表(名称 + 大小 + 删除;末行不画线) ===== */
|
|
89
|
+
.mh-upload__list {
|
|
90
|
+
width: 100%;
|
|
91
|
+
max-width: var(--ui-upload-zone-max-width);
|
|
92
|
+
border: 1px solid var(--ui-base-300);
|
|
93
|
+
border-radius: var(--ui-upload-radius);
|
|
94
|
+
overflow: hidden;
|
|
95
|
+
}
|
|
96
|
+
.mh-upload__item {
|
|
97
|
+
display: flex;
|
|
98
|
+
align-items: center;
|
|
99
|
+
gap: var(--ui-space-3);
|
|
100
|
+
padding: var(--ui-space-2) var(--ui-space-3);
|
|
101
|
+
border-bottom: 1px solid var(--ui-base-300);
|
|
102
|
+
}
|
|
103
|
+
.mh-upload__item:last-child {
|
|
104
|
+
border-bottom: none;
|
|
105
|
+
}
|
|
106
|
+
.mh-upload__item-name {
|
|
107
|
+
font-size: var(--ui-font-caption);
|
|
108
|
+
color: var(--ui-base-content);
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
text-overflow: ellipsis;
|
|
111
|
+
white-space: nowrap;
|
|
112
|
+
}
|
|
113
|
+
.mh-upload__item-size {
|
|
114
|
+
flex: none;
|
|
115
|
+
font-size: var(--ui-upload-meta-size);
|
|
116
|
+
color: var(--ui-base-content-subtle);
|
|
117
|
+
}
|
|
118
|
+
/* 删除位推到最右(面归按钮族的文本档,这里只给定位) */
|
|
119
|
+
.mh-upload__item-remove {
|
|
120
|
+
margin-left: auto;
|
|
121
|
+
flex: none;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* ===== 图片缩略图(单张 / 列表) ===== */
|
|
125
|
+
.mh-upload__thumb {
|
|
126
|
+
display: inline-flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
justify-content: center;
|
|
129
|
+
flex: none;
|
|
130
|
+
width: var(--ui-upload-thumb-size);
|
|
131
|
+
height: var(--ui-upload-thumb-size);
|
|
132
|
+
padding: var(--ui-space-2);
|
|
133
|
+
border: 1px solid var(--ui-base-300);
|
|
134
|
+
border-radius: var(--ui-upload-radius);
|
|
135
|
+
background: var(--ui-base-200);
|
|
136
|
+
font-size: var(--ui-upload-meta-size);
|
|
137
|
+
color: var(--ui-base-content-subtle);
|
|
138
|
+
overflow: hidden;
|
|
139
|
+
}
|
|
140
|
+
.mh-upload__thumb-img {
|
|
141
|
+
display: block; /* 元素级基线不再把 `img` 转块级(那条会压消费方的 `h-*` / `hidden`),本件自己写 */
|
|
142
|
+
width: var(--ui-upload-thumb-inner);
|
|
143
|
+
height: var(--ui-upload-thumb-inner);
|
|
144
|
+
object-fit: cover;
|
|
145
|
+
border-radius: var(--ui-radius-sm);
|
|
146
|
+
}
|
|
147
|
+
.mh-upload__thumbs {
|
|
148
|
+
display: flex;
|
|
149
|
+
flex-wrap: wrap;
|
|
150
|
+
gap: var(--ui-space-4);
|
|
151
|
+
}
|