@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,216 +1,216 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CodeBlock —— 代码块族(只读面 + 编辑面 + 语言角标 + 复制位)。
|
|
3
|
-
*
|
|
4
|
-
* 一个**族根** `.mh-code-block` 承载两形态共用的部分(底 / 圆角 / 等宽字族 / 字号 / 行高 / 定位上下文),
|
|
5
|
-
* 形态差异只在**槽位**上:只读面是 `__view`(`<pre>`,横向滚动、缺省不折行),
|
|
6
|
-
* 编辑面是 `__editor`(`<textarea>`,软换行)。两形态共用同一个根 ⇒ 互切时块体不跳,
|
|
7
|
-
* 且"同源"是**一处定义**(`code-block.tokens.css`),不是两处巧合。
|
|
8
|
-
*
|
|
9
|
-
* 观感基准:**无边框浅底块 + 方圆角 + 右上角语言角标 + 悬浮/聚焦让位后出现的方形图标复制按钮**。
|
|
10
|
-
*
|
|
11
|
-
* ## 三件结构决定(改前先读)
|
|
12
|
-
*
|
|
13
|
-
* - **复制按钮的面仍归按钮族**(`.mh-button--icon`),本族只补「浮在代码面上需要自己的底与定位」;
|
|
14
|
-
* 故标记是 `class="mh-button mh-button--icon mh-code-block__copy"`。
|
|
15
|
-
* - **复制按钮与语言角标都不能放进代码面里**:只读面是 `overflow-x: auto` 的滚动容器,会裁掉
|
|
16
|
-
* 外挂的绝对定位件 —— 故两者都挂在**族根**上(族根只做 `position: relative`)。
|
|
17
|
-
* - **隐藏用 `opacity` + `pointer-events`**(不是 `visibility` / `display`):键盘仍能 Tab 到它,
|
|
18
|
-
* `:focus-within` 会把它显出来,且隐藏时不残留一块看不见的可点区。
|
|
19
|
-
* - **编辑面画框的是根**(圆角归根、面自身透明无框):原生 `textarea` 的框模型(内距 / 滚动条 /
|
|
20
|
-
* 聚焦轮廓)会把框画歪,收归根才能与只读面对齐(旧实现同此口径)。
|
|
21
|
-
*
|
|
22
|
-
* ## 本族与按钮族的层序
|
|
23
|
-
*
|
|
24
|
-
* `styles/index.css` 里 `code-block.css` 在 `button.css` **之前**导入,故 `background` / `color` /
|
|
25
|
-
* `box-shadow` 这些**同特异性的声明会被按钮族的档位规则压掉**(历史 bug:复制位的白底被
|
|
26
|
-
* `.mh-button--text { background: transparent }` 压成透明,看起来像一段悬空文字)。
|
|
27
|
-
* 修法不是调层序,而是让本族的声明**升一档特异性**(`.mh-code-block > .mh-code-block__copy`,
|
|
28
|
-
* 悬停 / 成功态再各叠一层)—— 按钮族日后换皮肤也压不掉它。
|
|
29
|
-
*
|
|
30
|
-
* 零 JS 可表达:全部皮肤 + 角标让位 + 复制位的显隐。**真正的复制动作归组件层**(要 `navigator.clipboard`)。
|
|
31
|
-
*/
|
|
32
|
-
|
|
33
|
-
/* ===== 族根:两形态共用的底 / 圆角 / 字族,以及角标与复制位的定位上下文 ===== */
|
|
34
|
-
.mh-code-block {
|
|
35
|
-
position: relative;
|
|
36
|
-
min-width: 0; /* flex / grid 里能被压到容器宽(否则长行的 min-content 会把轨道撑宽、页面横向溢出) */
|
|
37
|
-
border-radius: var(--ui-code-block-radius);
|
|
38
|
-
background: var(--ui-code-block-bg);
|
|
39
|
-
font-family: var(--ui-font-mono);
|
|
40
|
-
font-size: var(--ui-code-block-font-size);
|
|
41
|
-
line-height: var(--ui-code-block-line-height);
|
|
42
|
-
color: var(--ui-base-content);
|
|
43
|
-
}
|
|
44
|
-
/* 聚焦环:与输入框族同一句(主色弱底当环,不新造阴影令牌)。**只在编辑档**给 ——
|
|
45
|
-
只读面本身不可聚焦,给它加环会在「键盘聚焦复制位」时冒出一圈(只读块从前没有这一圈,保持原样)。 */
|
|
46
|
-
.mh-code-block--editable {
|
|
47
|
-
transition: box-shadow 0.15s ease, background-color 0.15s ease, color 0.15s ease;
|
|
48
|
-
}
|
|
49
|
-
.mh-code-block--editable:focus-within {
|
|
50
|
-
box-shadow: 0 0 0 2px var(--ui-primary-weak);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
/* ===== 只读面(`__view`):`<pre>` —— 缺省横向滚动(缩进与列对齐不被破坏),`--wrap` 档才软换行 ===== */
|
|
54
|
-
.mh-code-block__view {
|
|
55
|
-
display: block;
|
|
56
|
-
margin: var(--ui-space-2) 0 0;
|
|
57
|
-
padding: var(--ui-code-block-padding);
|
|
58
|
-
border: 0;
|
|
59
|
-
border-radius: inherit;
|
|
60
|
-
font: inherit;
|
|
61
|
-
color: inherit;
|
|
62
|
-
overflow-x: auto;
|
|
63
|
-
white-space: pre;
|
|
64
|
-
overflow-wrap: normal;
|
|
65
|
-
}
|
|
66
|
-
.mh-code-block--wrap > .mh-code-block__view {
|
|
67
|
-
white-space: pre-wrap;
|
|
68
|
-
overflow-wrap: anywhere;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/* ===== 编辑面(`__editor`):`<textarea>` 透明底 + 无框 + 无 outline(框与聚焦环都画在族根上) ===== */
|
|
72
|
-
.mh-code-block__editor {
|
|
73
|
-
display: block;
|
|
74
|
-
width: 100%;
|
|
75
|
-
margin: 0;
|
|
76
|
-
padding: var(--ui-code-block-editor-padding-y) var(--ui-code-block-editor-padding-x);
|
|
77
|
-
border: 0;
|
|
78
|
-
border-radius: inherit;
|
|
79
|
-
background: transparent;
|
|
80
|
-
font: inherit;
|
|
81
|
-
line-height: inherit;
|
|
82
|
-
color: inherit;
|
|
83
|
-
outline: none;
|
|
84
|
-
resize: none; /* 高度由 autoSize / maxHeight 决定,不留拖拽把手(同只读面:不被用户拖变形) */
|
|
85
|
-
overflow: auto;
|
|
86
|
-
tab-size: 2;
|
|
87
|
-
}
|
|
88
|
-
.mh-code-block__editor::placeholder {
|
|
89
|
-
color: var(--ui-base-content-subtle);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/* 只读档(原生 `readonly`:仍可选中、可滚动、可复制,只是不可改)——**不弱化字色**,
|
|
93
|
-
代码是拿来读的;只是光标不再是文本输入那一支(与只读面观感一致) */
|
|
94
|
-
.mh-code-block--editable:has(> .mh-code-block__editor[readonly]) {
|
|
95
|
-
cursor: default;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
/* 禁用档:底与字色弱化 + 内描边(本族没有外描边,靠内描边表达"锁住") */
|
|
99
|
-
.mh-code-block--editable:has(> .mh-code-block__editor:disabled) {
|
|
100
|
-
background: var(--ui-base-100);
|
|
101
|
-
color: var(--ui-base-content-subtle);
|
|
102
|
-
box-shadow: inset 0 0 0 1px var(--ui-base-300);
|
|
103
|
-
}
|
|
104
|
-
.mh-code-block--editable:has(> .mh-code-block__editor:disabled) > .mh-code-block__editor {
|
|
105
|
-
cursor: not-allowed;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/* ===== 语言角标(可选):两形态的槽位**有意不同** =====
|
|
109
|
-
* 共用部分(绝对定位 + 等宽小字 + 不吃指针)写在基类;
|
|
110
|
-
* 只读面与复制位**同槽位**(等高 32),悬停 / 聚焦时淡出让位(零 JS 互斥);
|
|
111
|
-
* 编辑面**不叠在文字上**(内容会折行,压住就看不见了),而是让首行右端**预留**出它的宽度。 */
|
|
112
|
-
.mh-code-block__lang {
|
|
113
|
-
position: absolute;
|
|
114
|
-
display: flex;
|
|
115
|
-
align-items: center;
|
|
116
|
-
font-family: var(--ui-font-mono);
|
|
117
|
-
font-size: var(--ui-code-block-font-size);
|
|
118
|
-
line-height: 1;
|
|
119
|
-
color: var(--ui-base-content-subtle);
|
|
120
|
-
user-select: none;
|
|
121
|
-
pointer-events: none; /* 装饰位不吃指针事件,否则会挡住复制位的悬停热区 */
|
|
122
|
-
}
|
|
123
|
-
/* 只读档:与复制位同槽位(让位互换时基线不跳) */
|
|
124
|
-
.mh-code-block:not(.mh-code-block--editable) > .mh-code-block__lang {
|
|
125
|
-
top: var(--ui-code-block-copy-inset);
|
|
126
|
-
right: var(--ui-code-block-copy-inset);
|
|
127
|
-
height: var(--ui-code-block-copy-size);
|
|
128
|
-
transition: opacity 0.15s ease;
|
|
129
|
-
}
|
|
130
|
-
.mh-code-block:not(.mh-code-block--editable):hover > .mh-code-block__lang,
|
|
131
|
-
.mh-code-block:not(.mh-code-block--editable):focus-within > .mh-code-block__lang,
|
|
132
|
-
.mh-code-block.is-hover > .mh-code-block__lang {
|
|
133
|
-
opacity: 0;
|
|
134
|
-
}
|
|
135
|
-
/* 编辑档:贴编辑面的右上角,并给编辑面首行右端预留出它的宽度 */
|
|
136
|
-
.mh-code-block--editable > .mh-code-block__lang {
|
|
137
|
-
top: var(--ui-code-block-editor-padding-y);
|
|
138
|
-
right: var(--ui-code-block-editor-padding-x);
|
|
139
|
-
height: var(--ui-code-block-line-height);
|
|
140
|
-
}
|
|
141
|
-
.mh-code-block--editable:has(> .mh-code-block__lang) > .mh-code-block__editor {
|
|
142
|
-
padding-right: calc(var(--ui-code-block-editor-padding-x) + var(--ui-code-block-lang-reserve));
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/* ===== 行内 chip(`--inline`,挂在 `<code>` 上即自身为根;`--plain` 是它的中性档) ===== */
|
|
146
|
-
.mh-code-block--inline {
|
|
147
|
-
display: inline-flex;
|
|
148
|
-
align-items: center;
|
|
149
|
-
padding: 1px var(--ui-space-3);
|
|
150
|
-
border-radius: var(--ui-radius-full);
|
|
151
|
-
background: var(--ui-code-block-chip-bg);
|
|
152
|
-
color: var(--ui-primary);
|
|
153
|
-
/* 行内 chip 回到「继承外部行高」(改动前它不声明行高,族根那枚等宽行高是给代码面的)——
|
|
154
|
-
同一元素上两条规则,后者胜出,故这里写 inherit 即等价于旧行为 */
|
|
155
|
-
line-height: inherit;
|
|
156
|
-
}
|
|
157
|
-
/* 中性档(规范 `.chip--plain`:规则 ID 这类不强调的短标识) */
|
|
158
|
-
.mh-code-block--plain {
|
|
159
|
-
background: var(--ui-code-block-bg);
|
|
160
|
-
color: var(--ui-base-content);
|
|
161
|
-
border-radius: var(--ui-code-block-radius);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/* ===== 复制位(面归按钮族,本族只给定位、浮底、方形几何、显隐) =====
|
|
165
|
-
* 选择器**刻意升一档**(`.mh-code-block >`):同特异性下按钮族的档位规则会压掉这几条(见文件头) */
|
|
166
|
-
.mh-code-block > .mh-code-block__copy {
|
|
167
|
-
position: absolute;
|
|
168
|
-
top: var(--ui-code-block-copy-inset);
|
|
169
|
-
right: var(--ui-code-block-copy-inset);
|
|
170
|
-
width: var(--ui-code-block-copy-size);
|
|
171
|
-
height: var(--ui-code-block-copy-size);
|
|
172
|
-
padding: 0;
|
|
173
|
-
border: 1px solid var(--ui-code-block-line);
|
|
174
|
-
border-radius: var(--ui-radius-sm);
|
|
175
|
-
background: var(--ui-base-100);
|
|
176
|
-
color: var(--ui-base-content);
|
|
177
|
-
box-shadow: none; /* 压掉图标按钮 hover 档的卡片光晕(本件浮在块上,再加影会脏) */
|
|
178
|
-
opacity: 0;
|
|
179
|
-
pointer-events: none;
|
|
180
|
-
transition: opacity 0.15s ease, border-color 0.15s ease, color 0.15s ease;
|
|
181
|
-
}
|
|
182
|
-
/* 显形:族根悬停 / 键盘聚焦进入(`.is-hover` 是**静态档**,供静态页与读图对状态,与全库同款三源等价) */
|
|
183
|
-
.mh-code-block:hover > .mh-code-block__copy,
|
|
184
|
-
.mh-code-block:focus-within > .mh-code-block__copy,
|
|
185
|
-
.mh-code-block.is-hover > .mh-code-block__copy {
|
|
186
|
-
opacity: 1;
|
|
187
|
-
pointer-events: auto;
|
|
188
|
-
}
|
|
189
|
-
/* 悬停 / 键盘聚焦的加深档(再叠一层,压过 `.mh-button--icon:hover` 的字色与光晕) */
|
|
190
|
-
.mh-code-block > .mh-code-block__copy:hover,
|
|
191
|
-
.mh-code-block > .mh-code-block__copy:focus-visible,
|
|
192
|
-
.mh-code-block.is-hover > .mh-code-block__copy {
|
|
193
|
-
border-color: var(--ui-base-content-subtle);
|
|
194
|
-
color: var(--ui-primary);
|
|
195
|
-
box-shadow: none;
|
|
196
|
-
}
|
|
197
|
-
/* 复制成功态(组件下发 `data-state`;原生无此态,静态档 `.is-copied` 供读图) */
|
|
198
|
-
.mh-code-block > .mh-code-block__copy.is-copied,
|
|
199
|
-
.mh-code-block > .mh-code-block__copy[data-state='copied'] {
|
|
200
|
-
border-color: var(--ui-success);
|
|
201
|
-
color: var(--ui-success);
|
|
202
|
-
opacity: 1;
|
|
203
|
-
pointer-events: auto;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/* 无悬停能力的设备(触屏):复制位常显;角标让位(`display: none` 而非透明 —— 它只是装饰,
|
|
207
|
-
不占焦点序列,隐藏掉才不会与常显的复制位叠在一起) */
|
|
208
|
-
@media (hover: none) {
|
|
209
|
-
.mh-code-block > .mh-code-block__copy {
|
|
210
|
-
opacity: 1;
|
|
211
|
-
pointer-events: auto;
|
|
212
|
-
}
|
|
213
|
-
.mh-code-block:not(.mh-code-block--editable) > .mh-code-block__lang {
|
|
214
|
-
display: none;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* CodeBlock —— 代码块族(只读面 + 编辑面 + 语言角标 + 复制位)。
|
|
3
|
+
*
|
|
4
|
+
* 一个**族根** `.mh-code-block` 承载两形态共用的部分(底 / 圆角 / 等宽字族 / 字号 / 行高 / 定位上下文),
|
|
5
|
+
* 形态差异只在**槽位**上:只读面是 `__view`(`<pre>`,横向滚动、缺省不折行),
|
|
6
|
+
* 编辑面是 `__editor`(`<textarea>`,软换行)。两形态共用同一个根 ⇒ 互切时块体不跳,
|
|
7
|
+
* 且"同源"是**一处定义**(`code-block.tokens.css`),不是两处巧合。
|
|
8
|
+
*
|
|
9
|
+
* 观感基准:**无边框浅底块 + 方圆角 + 右上角语言角标 + 悬浮/聚焦让位后出现的方形图标复制按钮**。
|
|
10
|
+
*
|
|
11
|
+
* ## 三件结构决定(改前先读)
|
|
12
|
+
*
|
|
13
|
+
* - **复制按钮的面仍归按钮族**(`.mh-button--icon`),本族只补「浮在代码面上需要自己的底与定位」;
|
|
14
|
+
* 故标记是 `class="mh-button mh-button--icon mh-code-block__copy"`。
|
|
15
|
+
* - **复制按钮与语言角标都不能放进代码面里**:只读面是 `overflow-x: auto` 的滚动容器,会裁掉
|
|
16
|
+
* 外挂的绝对定位件 —— 故两者都挂在**族根**上(族根只做 `position: relative`)。
|
|
17
|
+
* - **隐藏用 `opacity` + `pointer-events`**(不是 `visibility` / `display`):键盘仍能 Tab 到它,
|
|
18
|
+
* `:focus-within` 会把它显出来,且隐藏时不残留一块看不见的可点区。
|
|
19
|
+
* - **编辑面画框的是根**(圆角归根、面自身透明无框):原生 `textarea` 的框模型(内距 / 滚动条 /
|
|
20
|
+
* 聚焦轮廓)会把框画歪,收归根才能与只读面对齐(旧实现同此口径)。
|
|
21
|
+
*
|
|
22
|
+
* ## 本族与按钮族的层序
|
|
23
|
+
*
|
|
24
|
+
* `styles/index.css` 里 `code-block.css` 在 `button.css` **之前**导入,故 `background` / `color` /
|
|
25
|
+
* `box-shadow` 这些**同特异性的声明会被按钮族的档位规则压掉**(历史 bug:复制位的白底被
|
|
26
|
+
* `.mh-button--text { background: transparent }` 压成透明,看起来像一段悬空文字)。
|
|
27
|
+
* 修法不是调层序,而是让本族的声明**升一档特异性**(`.mh-code-block > .mh-code-block__copy`,
|
|
28
|
+
* 悬停 / 成功态再各叠一层)—— 按钮族日后换皮肤也压不掉它。
|
|
29
|
+
*
|
|
30
|
+
* 零 JS 可表达:全部皮肤 + 角标让位 + 复制位的显隐。**真正的复制动作归组件层**(要 `navigator.clipboard`)。
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/* ===== 族根:两形态共用的底 / 圆角 / 字族,以及角标与复制位的定位上下文 ===== */
|
|
34
|
+
.mh-code-block {
|
|
35
|
+
position: relative;
|
|
36
|
+
min-width: 0; /* flex / grid 里能被压到容器宽(否则长行的 min-content 会把轨道撑宽、页面横向溢出) */
|
|
37
|
+
border-radius: var(--ui-code-block-radius);
|
|
38
|
+
background: var(--ui-code-block-bg);
|
|
39
|
+
font-family: var(--ui-font-mono);
|
|
40
|
+
font-size: var(--ui-code-block-font-size);
|
|
41
|
+
line-height: var(--ui-code-block-line-height);
|
|
42
|
+
color: var(--ui-base-content);
|
|
43
|
+
}
|
|
44
|
+
/* 聚焦环:与输入框族同一句(主色弱底当环,不新造阴影令牌)。**只在编辑档**给 ——
|
|
45
|
+
只读面本身不可聚焦,给它加环会在「键盘聚焦复制位」时冒出一圈(只读块从前没有这一圈,保持原样)。 */
|
|
46
|
+
.mh-code-block--editable {
|
|
47
|
+
transition: box-shadow 0.15s ease, background-color 0.15s ease, color 0.15s ease;
|
|
48
|
+
}
|
|
49
|
+
.mh-code-block--editable:focus-within {
|
|
50
|
+
box-shadow: 0 0 0 2px var(--ui-primary-weak);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/* ===== 只读面(`__view`):`<pre>` —— 缺省横向滚动(缩进与列对齐不被破坏),`--wrap` 档才软换行 ===== */
|
|
54
|
+
.mh-code-block__view {
|
|
55
|
+
display: block;
|
|
56
|
+
margin: var(--ui-space-2) 0 0;
|
|
57
|
+
padding: var(--ui-code-block-padding);
|
|
58
|
+
border: 0;
|
|
59
|
+
border-radius: inherit;
|
|
60
|
+
font: inherit;
|
|
61
|
+
color: inherit;
|
|
62
|
+
overflow-x: auto;
|
|
63
|
+
white-space: pre;
|
|
64
|
+
overflow-wrap: normal;
|
|
65
|
+
}
|
|
66
|
+
.mh-code-block--wrap > .mh-code-block__view {
|
|
67
|
+
white-space: pre-wrap;
|
|
68
|
+
overflow-wrap: anywhere;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* ===== 编辑面(`__editor`):`<textarea>` 透明底 + 无框 + 无 outline(框与聚焦环都画在族根上) ===== */
|
|
72
|
+
.mh-code-block__editor {
|
|
73
|
+
display: block;
|
|
74
|
+
width: 100%;
|
|
75
|
+
margin: 0;
|
|
76
|
+
padding: var(--ui-code-block-editor-padding-y) var(--ui-code-block-editor-padding-x);
|
|
77
|
+
border: 0;
|
|
78
|
+
border-radius: inherit;
|
|
79
|
+
background: transparent;
|
|
80
|
+
font: inherit;
|
|
81
|
+
line-height: inherit;
|
|
82
|
+
color: inherit;
|
|
83
|
+
outline: none;
|
|
84
|
+
resize: none; /* 高度由 autoSize / maxHeight 决定,不留拖拽把手(同只读面:不被用户拖变形) */
|
|
85
|
+
overflow: auto;
|
|
86
|
+
tab-size: 2;
|
|
87
|
+
}
|
|
88
|
+
.mh-code-block__editor::placeholder {
|
|
89
|
+
color: var(--ui-base-content-subtle);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* 只读档(原生 `readonly`:仍可选中、可滚动、可复制,只是不可改)——**不弱化字色**,
|
|
93
|
+
代码是拿来读的;只是光标不再是文本输入那一支(与只读面观感一致) */
|
|
94
|
+
.mh-code-block--editable:has(> .mh-code-block__editor[readonly]) {
|
|
95
|
+
cursor: default;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/* 禁用档:底与字色弱化 + 内描边(本族没有外描边,靠内描边表达"锁住") */
|
|
99
|
+
.mh-code-block--editable:has(> .mh-code-block__editor:disabled) {
|
|
100
|
+
background: var(--ui-base-100);
|
|
101
|
+
color: var(--ui-base-content-subtle);
|
|
102
|
+
box-shadow: inset 0 0 0 1px var(--ui-base-300);
|
|
103
|
+
}
|
|
104
|
+
.mh-code-block--editable:has(> .mh-code-block__editor:disabled) > .mh-code-block__editor {
|
|
105
|
+
cursor: not-allowed;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/* ===== 语言角标(可选):两形态的槽位**有意不同** =====
|
|
109
|
+
* 共用部分(绝对定位 + 等宽小字 + 不吃指针)写在基类;
|
|
110
|
+
* 只读面与复制位**同槽位**(等高 32),悬停 / 聚焦时淡出让位(零 JS 互斥);
|
|
111
|
+
* 编辑面**不叠在文字上**(内容会折行,压住就看不见了),而是让首行右端**预留**出它的宽度。 */
|
|
112
|
+
.mh-code-block__lang {
|
|
113
|
+
position: absolute;
|
|
114
|
+
display: flex;
|
|
115
|
+
align-items: center;
|
|
116
|
+
font-family: var(--ui-font-mono);
|
|
117
|
+
font-size: var(--ui-code-block-font-size);
|
|
118
|
+
line-height: 1;
|
|
119
|
+
color: var(--ui-base-content-subtle);
|
|
120
|
+
user-select: none;
|
|
121
|
+
pointer-events: none; /* 装饰位不吃指针事件,否则会挡住复制位的悬停热区 */
|
|
122
|
+
}
|
|
123
|
+
/* 只读档:与复制位同槽位(让位互换时基线不跳) */
|
|
124
|
+
.mh-code-block:not(.mh-code-block--editable) > .mh-code-block__lang {
|
|
125
|
+
top: var(--ui-code-block-copy-inset);
|
|
126
|
+
right: var(--ui-code-block-copy-inset);
|
|
127
|
+
height: var(--ui-code-block-copy-size);
|
|
128
|
+
transition: opacity 0.15s ease;
|
|
129
|
+
}
|
|
130
|
+
.mh-code-block:not(.mh-code-block--editable):hover > .mh-code-block__lang,
|
|
131
|
+
.mh-code-block:not(.mh-code-block--editable):focus-within > .mh-code-block__lang,
|
|
132
|
+
.mh-code-block.is-hover > .mh-code-block__lang {
|
|
133
|
+
opacity: 0;
|
|
134
|
+
}
|
|
135
|
+
/* 编辑档:贴编辑面的右上角,并给编辑面首行右端预留出它的宽度 */
|
|
136
|
+
.mh-code-block--editable > .mh-code-block__lang {
|
|
137
|
+
top: var(--ui-code-block-editor-padding-y);
|
|
138
|
+
right: var(--ui-code-block-editor-padding-x);
|
|
139
|
+
height: var(--ui-code-block-line-height);
|
|
140
|
+
}
|
|
141
|
+
.mh-code-block--editable:has(> .mh-code-block__lang) > .mh-code-block__editor {
|
|
142
|
+
padding-right: calc(var(--ui-code-block-editor-padding-x) + var(--ui-code-block-lang-reserve));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/* ===== 行内 chip(`--inline`,挂在 `<code>` 上即自身为根;`--plain` 是它的中性档) ===== */
|
|
146
|
+
.mh-code-block--inline {
|
|
147
|
+
display: inline-flex;
|
|
148
|
+
align-items: center;
|
|
149
|
+
padding: 1px var(--ui-space-3);
|
|
150
|
+
border-radius: var(--ui-radius-full);
|
|
151
|
+
background: var(--ui-code-block-chip-bg);
|
|
152
|
+
color: var(--ui-primary);
|
|
153
|
+
/* 行内 chip 回到「继承外部行高」(改动前它不声明行高,族根那枚等宽行高是给代码面的)——
|
|
154
|
+
同一元素上两条规则,后者胜出,故这里写 inherit 即等价于旧行为 */
|
|
155
|
+
line-height: inherit;
|
|
156
|
+
}
|
|
157
|
+
/* 中性档(规范 `.chip--plain`:规则 ID 这类不强调的短标识) */
|
|
158
|
+
.mh-code-block--plain {
|
|
159
|
+
background: var(--ui-code-block-bg);
|
|
160
|
+
color: var(--ui-base-content);
|
|
161
|
+
border-radius: var(--ui-code-block-radius);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* ===== 复制位(面归按钮族,本族只给定位、浮底、方形几何、显隐) =====
|
|
165
|
+
* 选择器**刻意升一档**(`.mh-code-block >`):同特异性下按钮族的档位规则会压掉这几条(见文件头) */
|
|
166
|
+
.mh-code-block > .mh-code-block__copy {
|
|
167
|
+
position: absolute;
|
|
168
|
+
top: var(--ui-code-block-copy-inset);
|
|
169
|
+
right: var(--ui-code-block-copy-inset);
|
|
170
|
+
width: var(--ui-code-block-copy-size);
|
|
171
|
+
height: var(--ui-code-block-copy-size);
|
|
172
|
+
padding: 0;
|
|
173
|
+
border: 1px solid var(--ui-code-block-line);
|
|
174
|
+
border-radius: var(--ui-radius-sm);
|
|
175
|
+
background: var(--ui-base-100);
|
|
176
|
+
color: var(--ui-base-content);
|
|
177
|
+
box-shadow: none; /* 压掉图标按钮 hover 档的卡片光晕(本件浮在块上,再加影会脏) */
|
|
178
|
+
opacity: 0;
|
|
179
|
+
pointer-events: none;
|
|
180
|
+
transition: opacity 0.15s ease, border-color 0.15s ease, color 0.15s ease;
|
|
181
|
+
}
|
|
182
|
+
/* 显形:族根悬停 / 键盘聚焦进入(`.is-hover` 是**静态档**,供静态页与读图对状态,与全库同款三源等价) */
|
|
183
|
+
.mh-code-block:hover > .mh-code-block__copy,
|
|
184
|
+
.mh-code-block:focus-within > .mh-code-block__copy,
|
|
185
|
+
.mh-code-block.is-hover > .mh-code-block__copy {
|
|
186
|
+
opacity: 1;
|
|
187
|
+
pointer-events: auto;
|
|
188
|
+
}
|
|
189
|
+
/* 悬停 / 键盘聚焦的加深档(再叠一层,压过 `.mh-button--icon:hover` 的字色与光晕) */
|
|
190
|
+
.mh-code-block > .mh-code-block__copy:hover,
|
|
191
|
+
.mh-code-block > .mh-code-block__copy:focus-visible,
|
|
192
|
+
.mh-code-block.is-hover > .mh-code-block__copy {
|
|
193
|
+
border-color: var(--ui-base-content-subtle);
|
|
194
|
+
color: var(--ui-primary);
|
|
195
|
+
box-shadow: none;
|
|
196
|
+
}
|
|
197
|
+
/* 复制成功态(组件下发 `data-state`;原生无此态,静态档 `.is-copied` 供读图) */
|
|
198
|
+
.mh-code-block > .mh-code-block__copy.is-copied,
|
|
199
|
+
.mh-code-block > .mh-code-block__copy[data-state='copied'] {
|
|
200
|
+
border-color: var(--ui-success);
|
|
201
|
+
color: var(--ui-success);
|
|
202
|
+
opacity: 1;
|
|
203
|
+
pointer-events: auto;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/* 无悬停能力的设备(触屏):复制位常显;角标让位(`display: none` 而非透明 —— 它只是装饰,
|
|
207
|
+
不占焦点序列,隐藏掉才不会与常显的复制位叠在一起) */
|
|
208
|
+
@media (hover: none) {
|
|
209
|
+
.mh-code-block > .mh-code-block__copy {
|
|
210
|
+
opacity: 1;
|
|
211
|
+
pointer-events: auto;
|
|
212
|
+
}
|
|
213
|
+
.mh-code-block:not(.mh-code-block--editable) > .mh-code-block__lang {
|
|
214
|
+
display: none;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* code-block —— 单件令牌(**基础值**)。
|
|
3
|
-
*
|
|
4
|
-
* 本族自己的几何 / 尺寸 / 色彩槽位;只服务本族,故不随主题进 `@manohub/theme`。
|
|
5
|
-
*
|
|
6
|
-
* ## 两形态共用同一份令牌
|
|
7
|
-
*
|
|
8
|
-
* 只读面(`__view`)与编辑面(`__editor`)**共用**底 / 圆角 / 字族 / 字号 / 行高这几枚 ——
|
|
9
|
-
* 这正是「视觉同源、互切不跳」的落点:一处定义,两形态一起变。
|
|
10
|
-
* 从前是两套单件令牌各写一份同值(`--ui-code-*` 与 `--ui-code-editor-*`),
|
|
11
|
-
* 靠注释互相提醒"要一致";0.9.0 收成一族(见 `docs/guide/migration-0-9.md`)。
|
|
12
|
-
*
|
|
13
|
-
* 两形态**有意不同**的只有内距:只读面上下 12(与左右齐)、编辑面上下 8
|
|
14
|
-
* (`textarea` 的行高自带行距,上下再给 12 会显得空)—— 它们各自保留一枚令牌。
|
|
15
|
-
*
|
|
16
|
-
* ## 抽出说明
|
|
17
|
-
*
|
|
18
|
-
* 这些是**基础值**,锚在 `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,
|
|
19
|
-
* 因此**任何落在容器里的分件都取得到值**(历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
20
|
-
*
|
|
21
|
-
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
22
|
-
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
23
|
-
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
24
|
-
*/
|
|
25
|
-
[data-manohub-ui] {
|
|
26
|
-
/* 单件令牌(挂在容器上:族根 / 只读面 / 编辑面 / 复制位都在其下) */
|
|
27
|
-
--ui-code-block-bg: var(--ui-base-200); /* 代码面底(只读块与编辑框同底 —— 互切的"不跳"靠它) */
|
|
28
|
-
--ui-code-block-chip-bg: var(--ui-primary-weak); /* 行内 chip 底(规范 Au02) */
|
|
29
|
-
--ui-code-block-line: var(--ui-base-300); /* 描边色:面自身无边框,本令牌现服务复制位按钮 */
|
|
30
|
-
--ui-code-block-radius: var(--ui-radius-control);
|
|
31
|
-
--ui-code-block-font-size: var(--ui-font-caption); /* 规范等宽字号档对位 */
|
|
32
|
-
--ui-code-block-line-height: var(--ui-line-caption); /* 等宽行高:角标与复制位也吃它 */
|
|
33
|
-
--ui-code-block-padding: var(--ui-space-3); /* 12:只读面四边内距 */
|
|
34
|
-
--ui-code-block-editor-padding-x: var(--ui-space-3); /* 12:编辑面左右内距 */
|
|
35
|
-
--ui-code-block-editor-padding-y: var(--ui-space-2); /* 8:编辑面上下内距(比只读面小,见文件头) */
|
|
36
|
-
--ui-code-block-lang-reserve: 56px; /* 编辑面:首行右端给角标预留的宽度(只影响折行位置) */
|
|
37
|
-
--ui-code-block-copy-size: var(--ui-control-height-md); /* 32:复制位方形热区(与按钮族标准档同高) */
|
|
38
|
-
/* 复制位是 `Button`(`mh-button__icon`):字形尺寸归按钮族的图标槽(常规图标档),本族不另设令牌 */
|
|
39
|
-
--ui-code-block-copy-inset: var(--ui-space-2); /* 8:复制位 / 角标距块边 */
|
|
40
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* code-block —— 单件令牌(**基础值**)。
|
|
3
|
+
*
|
|
4
|
+
* 本族自己的几何 / 尺寸 / 色彩槽位;只服务本族,故不随主题进 `@manohub/theme`。
|
|
5
|
+
*
|
|
6
|
+
* ## 两形态共用同一份令牌
|
|
7
|
+
*
|
|
8
|
+
* 只读面(`__view`)与编辑面(`__editor`)**共用**底 / 圆角 / 字族 / 字号 / 行高这几枚 ——
|
|
9
|
+
* 这正是「视觉同源、互切不跳」的落点:一处定义,两形态一起变。
|
|
10
|
+
* 从前是两套单件令牌各写一份同值(`--ui-code-*` 与 `--ui-code-editor-*`),
|
|
11
|
+
* 靠注释互相提醒"要一致";0.9.0 收成一族(见 `docs/guide/migration-0-9.md`)。
|
|
12
|
+
*
|
|
13
|
+
* 两形态**有意不同**的只有内距:只读面上下 12(与左右齐)、编辑面上下 8
|
|
14
|
+
* (`textarea` 的行高自带行距,上下再给 12 会显得空)—— 它们各自保留一枚令牌。
|
|
15
|
+
*
|
|
16
|
+
* ## 抽出说明
|
|
17
|
+
*
|
|
18
|
+
* 这些是**基础值**,锚在 `[data-manohub-ui]` —— 跨包唯一作用域锚,由入口层无条件写在应用容器上,
|
|
19
|
+
* 因此**任何落在容器里的分件都取得到值**(历史症状:跨件消费的 `--ui-*-group-*` 取不到值,组内间距变 0)。
|
|
20
|
+
*
|
|
21
|
+
* ⚠️ `.mh-<件>--<档>` 这类**档位改写**留在面文件的修饰符块里 —— 它们靠「同一元素上两个
|
|
22
|
+
* 选择器改写同一个令牌」生效,搬到本文件会让档位失效。
|
|
23
|
+
* ⚠️ 新增组件要登记两处:本文件 + `src/styles/index.css`(见其文件头「五处齐备」)。
|
|
24
|
+
*/
|
|
25
|
+
[data-manohub-ui] {
|
|
26
|
+
/* 单件令牌(挂在容器上:族根 / 只读面 / 编辑面 / 复制位都在其下) */
|
|
27
|
+
--ui-code-block-bg: var(--ui-base-200); /* 代码面底(只读块与编辑框同底 —— 互切的"不跳"靠它) */
|
|
28
|
+
--ui-code-block-chip-bg: var(--ui-primary-weak); /* 行内 chip 底(规范 Au02) */
|
|
29
|
+
--ui-code-block-line: var(--ui-base-300); /* 描边色:面自身无边框,本令牌现服务复制位按钮 */
|
|
30
|
+
--ui-code-block-radius: var(--ui-radius-control);
|
|
31
|
+
--ui-code-block-font-size: var(--ui-font-caption); /* 规范等宽字号档对位 */
|
|
32
|
+
--ui-code-block-line-height: var(--ui-line-caption); /* 等宽行高:角标与复制位也吃它 */
|
|
33
|
+
--ui-code-block-padding: var(--ui-space-3); /* 12:只读面四边内距 */
|
|
34
|
+
--ui-code-block-editor-padding-x: var(--ui-space-3); /* 12:编辑面左右内距 */
|
|
35
|
+
--ui-code-block-editor-padding-y: var(--ui-space-2); /* 8:编辑面上下内距(比只读面小,见文件头) */
|
|
36
|
+
--ui-code-block-lang-reserve: 56px; /* 编辑面:首行右端给角标预留的宽度(只影响折行位置) */
|
|
37
|
+
--ui-code-block-copy-size: var(--ui-control-height-md); /* 32:复制位方形热区(与按钮族标准档同高) */
|
|
38
|
+
/* 复制位是 `Button`(`mh-button__icon`):字形尺寸归按钮族的图标槽(常规图标档),本族不另设令牌 */
|
|
39
|
+
--ui-code-block-copy-inset: var(--ui-space-2); /* 8:复制位 / 角标距块边 */
|
|
40
|
+
}
|
|
@@ -1,62 +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
|
-
}
|
|
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
|
+
}
|