@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.
- package/README.md +155 -155
- package/dist/components/form/index.js +8 -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 -425
- package/dist/styles/components/form.tokens.css +15 -15
- package/dist/styles/components/input.css +538 -538
- 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 -82
- package/package.json +62 -62
|
@@ -1,303 +1,303 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Pagination —— 分页条(总数文案 + 每页条数 + 页码窗口 + 翻页箭头 + 空态 + 简单档)。
|
|
3
|
-
*
|
|
4
|
-
* 出处:设计稿《MH后台-0911》的分页器(`0:4047` 466×28:页码项 **28×28 / r6 / 白底 / 边 `#e6e6e6`**、
|
|
5
|
-
* 选中页码底 `#eff5ff`、条数选择器 `0:4092` 28×28 r6)与 `@aihub/theme` 的 `src/components/pagination.css`
|
|
6
|
-
* (圆角控件档 / 字号 13 / 组间 12 / 页码间 4 / 省略号 subtle)。
|
|
7
|
-
* ⚠️ 设计给 **28**、规范给 **26**、改前本件取 32 —— 三者都不同;本轮按设计取 28(规范值登记为偏差)。
|
|
8
|
-
*
|
|
9
|
-
* **顺序是一维右对齐流**:`共 N 条,` → `每页 N 条 ▾` → `‹ 1 … 10 11 12 … 50 ›`。别把总数额外搬到左侧。
|
|
10
|
-
*
|
|
11
|
-
* **不做跳页输入框**:规范里没有「跳至第 N 页」的样张(重写者若需要须自行定位置),本仓按"不做规范没演示的"
|
|
12
|
-
* 处理 —— 要保持族谱齐全的判据就该守在规范有标记示例的范围内,而不是替规范发明控件。
|
|
13
|
-
*
|
|
14
|
-
* **页码项三源等价**(本仓通例):原生 `:has(> input:checked)` / 组件下发 `[data-state='selected']` /
|
|
15
|
-
* 静态档 `.is-selected` 指向同一份声明 —— 原生态给零 JS 用法(原生 radio 互斥 + ← → 换页),组件态给 v-model。
|
|
16
|
-
*
|
|
17
|
-
* 翻页箭头用**两个字形**(上一页 `chevron-left` / 下一页 `chevron-right`),本层不转向:方位由字形自表达
|
|
18
|
-
* (包内硬约束:不得靠 `transform: rotate()` 把别的图标转成方位,`back` 只作"返回"语义)。条数选择器的
|
|
19
|
-
* 折叠指示走操作层 `.mh-popup-caret`(展开时翻向),与本层同样零自画折线。
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
/* 几何只挂在页码条上:令牌在同名 `.tokens.css`(锚 `[data-manohub-ui]`),几何若跟着挂会把空态也排成右对齐的行 */
|
|
23
|
-
.mh-pagination {
|
|
24
|
-
display: flex;
|
|
25
|
-
align-items: center;
|
|
26
|
-
justify-content: flex-end;
|
|
27
|
-
gap: var(--ui-pagination-gap);
|
|
28
|
-
font-size: var(--ui-pagination-font-size);
|
|
29
|
-
color: var(--ui-pagination-text);
|
|
30
|
-
}
|
|
31
|
-
/* 外框档:规范只给了「1px 描边 + 控件圆角」,内距本仓定为横 12、竖不额外加(项高即条高) */
|
|
32
|
-
.mh-pagination--boxed {
|
|
33
|
-
padding: 0 var(--ui-space-4);
|
|
34
|
-
border: 1px solid var(--ui-base-300);
|
|
35
|
-
border-radius: var(--ui-pagination-item-radius);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/* ===== 总数文案 / 空态 / 简单档 ===== */
|
|
39
|
-
.mh-pagination__total {
|
|
40
|
-
white-space: nowrap;
|
|
41
|
-
}
|
|
42
|
-
.mh-pagination__empty {
|
|
43
|
-
color: var(--ui-pagination-ellipsis);
|
|
44
|
-
}
|
|
45
|
-
.mh-pagination__plain {
|
|
46
|
-
white-space: nowrap;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/* ===== 每页条数选择器(触发器:文字 + 转向箭头) =====
|
|
50
|
-
面板是「操作层 + 本件皮肤」的组合写法:`class="mh-popup mh-pagination__panel"` ——
|
|
51
|
-
开合 / Esc / 点外部关闭 / 顶层渲染 / 定位档归 `styles/operations/popup.css`,面(底 / 圆角 / 内距 / 阴影)归本件。 */
|
|
52
|
-
.mh-pagination__size {
|
|
53
|
-
display: inline-flex;
|
|
54
|
-
align-items: center;
|
|
55
|
-
gap: var(--ui-space-1);
|
|
56
|
-
padding: 0;
|
|
57
|
-
border: none;
|
|
58
|
-
background: transparent;
|
|
59
|
-
font-family: inherit;
|
|
60
|
-
font-size: inherit;
|
|
61
|
-
color: inherit;
|
|
62
|
-
cursor: pointer;
|
|
63
|
-
}
|
|
64
|
-
.mh-pagination__size:hover,
|
|
65
|
-
.mh-pagination__size[data-state='hover'] {
|
|
66
|
-
color: var(--ui-pagination-border-hover);
|
|
67
|
-
}
|
|
68
|
-
.mh-pagination__size[data-state='active'] {
|
|
69
|
-
color: var(--ui-pagination-text-active);
|
|
70
|
-
}
|
|
71
|
-
.mh-pagination__size:disabled {
|
|
72
|
-
color: var(--ui-base-content-subtle);
|
|
73
|
-
cursor: not-allowed;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/* 面板皮肤:**组件自渲染的菜单必须自带面** —— 操作层把 popover 的 UA 装饰(含 `background`)归零成
|
|
77
|
-
`transparent`,只挂 `.mh-popup` 的面板会整个透出底下的表格(实测踩坑,就是这条缺失造成的)。
|
|
78
|
-
只给面,不碰开合与定位(那些归操作层)。 */
|
|
79
|
-
.mh-pagination__panel {
|
|
80
|
-
padding: var(--ui-space-1) 0;
|
|
81
|
-
border-radius: var(--ui-radius-control); /* 控件圆角档(与选择器面板同档) */
|
|
82
|
-
background: var(--ui-base-100);
|
|
83
|
-
box-shadow: var(--ui-shadow-popover); /* 条数选择器是锚定浮层,不是居中浮层 */
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/* 菜单里的单选项:本件是**单选组**(原生 radio,箭头键可选),与选择器的 listbox 面板不是一回事,故不复用其皮肤 */
|
|
87
|
-
.mh-pagination__size-option {
|
|
88
|
-
display: flex;
|
|
89
|
-
align-items: center;
|
|
90
|
-
gap: var(--ui-space-2);
|
|
91
|
-
padding: var(--ui-space-1) var(--ui-space-3);
|
|
92
|
-
border-radius: var(--ui-radius-sm);
|
|
93
|
-
font-size: var(--ui-pagination-font-size);
|
|
94
|
-
color: var(--ui-pagination-text);
|
|
95
|
-
cursor: pointer;
|
|
96
|
-
white-space: nowrap;
|
|
97
|
-
}
|
|
98
|
-
.mh-pagination__size-option:hover {
|
|
99
|
-
background: var(--ui-pagination-bg-selected);
|
|
100
|
-
}
|
|
101
|
-
.mh-pagination__size-option input {
|
|
102
|
-
position: absolute;
|
|
103
|
-
width: 1px;
|
|
104
|
-
height: 1px;
|
|
105
|
-
margin: -1px;
|
|
106
|
-
border: 0;
|
|
107
|
-
overflow: hidden;
|
|
108
|
-
white-space: nowrap;
|
|
109
|
-
clip-path: inset(50%);
|
|
110
|
-
appearance: none;
|
|
111
|
-
pointer-events: none;
|
|
112
|
-
}
|
|
113
|
-
.mh-pagination__size-option:has(input:focus-visible) {
|
|
114
|
-
outline: 2px solid var(--ui-primary);
|
|
115
|
-
outline-offset: -2px;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
/* ===== 页码行 ===== */
|
|
119
|
-
.mh-pagination__pages {
|
|
120
|
-
display: flex;
|
|
121
|
-
align-items: center;
|
|
122
|
-
gap: var(--ui-pagination-page-gap);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.mh-pagination__btn {
|
|
126
|
-
display: inline-flex;
|
|
127
|
-
align-items: center;
|
|
128
|
-
justify-content: center;
|
|
129
|
-
box-sizing: border-box;
|
|
130
|
-
min-width: var(--ui-pagination-item-size);
|
|
131
|
-
height: var(--ui-pagination-item-size);
|
|
132
|
-
padding: 0 var(--ui-space-1);
|
|
133
|
-
border: 1px solid transparent;
|
|
134
|
-
border-radius: var(--ui-pagination-item-radius);
|
|
135
|
-
background: transparent;
|
|
136
|
-
font-family: inherit;
|
|
137
|
-
font-size: var(--ui-pagination-font-size);
|
|
138
|
-
color: var(--ui-pagination-text);
|
|
139
|
-
cursor: pointer;
|
|
140
|
-
transition-property: background-color, border-color, color;
|
|
141
|
-
transition-duration: 0.15s;
|
|
142
|
-
transition-timing-function: ease;
|
|
143
|
-
}
|
|
144
|
-
/* 滑过 / 按下:只描边转色(底仍透明,规范如此) */
|
|
145
|
-
.mh-pagination__btn:hover,
|
|
146
|
-
.mh-pagination__btn.is-hover {
|
|
147
|
-
border-color: var(--ui-pagination-border-hover);
|
|
148
|
-
}
|
|
149
|
-
.mh-pagination__btn:active,
|
|
150
|
-
.mh-pagination__btn.is-active {
|
|
151
|
-
border-color: var(--ui-pagination-border-active);
|
|
152
|
-
}
|
|
153
|
-
/* 选中:淡底 + 主色描边 + 主色字 + 中粗(三源等价) */
|
|
154
|
-
.mh-pagination__btn.is-selected,
|
|
155
|
-
.mh-pagination__btn[data-state='selected'],
|
|
156
|
-
.mh-pagination__btn:has(> input:checked) {
|
|
157
|
-
border-color: var(--ui-pagination-border-active);
|
|
158
|
-
background: var(--ui-pagination-bg-selected);
|
|
159
|
-
color: var(--ui-pagination-text-active);
|
|
160
|
-
font-weight: var(--ui-weight-medium);
|
|
161
|
-
}
|
|
162
|
-
.mh-pagination__btn:disabled {
|
|
163
|
-
color: var(--ui-base-content-subtle);
|
|
164
|
-
cursor: not-allowed;
|
|
165
|
-
}
|
|
166
|
-
.mh-pagination__btn:disabled:hover {
|
|
167
|
-
border-color: transparent;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/* 省略号:不可点、字距拉开(规范 2px) */
|
|
171
|
-
.mh-pagination__btn--ellipsis {
|
|
172
|
-
color: var(--ui-pagination-ellipsis);
|
|
173
|
-
letter-spacing: 2px;
|
|
174
|
-
cursor: default;
|
|
175
|
-
}
|
|
176
|
-
.mh-pagination__btn--ellipsis:hover {
|
|
177
|
-
border-color: transparent;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/* 翻页箭头:**朝向在字形里**(上一页 `chevron-left` / 下一页 `chevron-right`),本层只给颜色 ——
|
|
181
|
-
整段零 `transform`,不走"把别的图标转成方位"的老路(包内硬约束)。
|
|
182
|
-
`--prev` / `--next` 保留为**状态钩子**(消费方与测试按它们定位两端的箭头按钮),不再承载转向。 */
|
|
183
|
-
.mh-pagination__btn--arrow {
|
|
184
|
-
color: var(--ui-pagination-arrow);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
/* 槽位尺寸:**常规图标一律取全局图标档**(`--ui-font-icon`)—— 翻页箭头与条数选择器的折叠箭头
|
|
188
|
-
改前无声明、掉到 `<svg>` 的默认 16,本层不另定数值(字形由 `@manohub/icon` 给)。 */
|
|
189
|
-
.mh-pagination__btn--arrow > svg,
|
|
190
|
-
.mh-pagination__size > svg {
|
|
191
|
-
width: var(--ui-font-icon);
|
|
192
|
-
height: var(--ui-font-icon);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
/* ===== 外框档内的三态:不描边、不落底,只靠**文字变色** =====
|
|
196
|
-
判据:boxed 档自己已经画了一圈外框,框内再来一圈描边(滑过/按下/选中)或一块淡底(选中)就是双重勾线,
|
|
197
|
-
故框内的态一律收敛成「文字色」这一种手段 —— 滑过转浅主色(复用描边档的滑过色 `#529dff`)、按下与选中
|
|
198
|
-
转主色。中粗**不在此重复声明**:基类选中规则已给 `--ui-weight-medium`,这里只覆盖 border/底/字色三件,
|
|
199
|
-
旧口径(主色字 + 中粗)完整保留。
|
|
200
|
-
两处排除都是必须的:`--ellipsis`(省略号与按钮共用基类,但它不可点、只该保持浅色)与 `:disabled`
|
|
201
|
-
(不可点的箭头不该被悬停染成主色);排除项包在 `:where()` 里,使其**不抬特异性** —— 这样三条覆盖同为
|
|
202
|
-
0-3-0,靠源序让「选中」压住「悬停」(悬停已选中的项仍显示选中色,与非 boxed 档一致)。
|
|
203
|
-
三源等价(原生 `:has(> input:checked)` / 组件 `[data-state='selected']` / 静态 `.is-selected`)一并覆盖。 */
|
|
204
|
-
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)):hover,
|
|
205
|
-
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)).is-hover {
|
|
206
|
-
border-color: transparent;
|
|
207
|
-
color: var(--ui-pagination-border-hover);
|
|
208
|
-
}
|
|
209
|
-
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)):active,
|
|
210
|
-
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)).is-active {
|
|
211
|
-
border-color: transparent;
|
|
212
|
-
color: var(--ui-pagination-border-active);
|
|
213
|
-
}
|
|
214
|
-
.mh-pagination--boxed .mh-pagination__btn.is-selected,
|
|
215
|
-
.mh-pagination--boxed .mh-pagination__btn[data-state='selected'],
|
|
216
|
-
.mh-pagination--boxed .mh-pagination__btn:has(> input:checked) {
|
|
217
|
-
border-color: transparent;
|
|
218
|
-
background: transparent;
|
|
219
|
-
color: var(--ui-pagination-text-active);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
/* 原生态的开关(同名 radio)隐身但可聚焦:零 JS 用法下选中态由 `:has(> input:checked)` 驱动 */
|
|
223
|
-
.mh-pagination__btn > input {
|
|
224
|
-
position: absolute;
|
|
225
|
-
width: 1px;
|
|
226
|
-
height: 1px;
|
|
227
|
-
margin: -1px;
|
|
228
|
-
padding: 0;
|
|
229
|
-
border: 0;
|
|
230
|
-
overflow: hidden;
|
|
231
|
-
white-space: nowrap;
|
|
232
|
-
clip-path: inset(50%);
|
|
233
|
-
appearance: none;
|
|
234
|
-
pointer-events: none;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/* 键盘焦点环画在可见项上(原生态的开关是隐身的) */
|
|
238
|
-
.mh-pagination__btn:focus-visible,
|
|
239
|
-
.mh-pagination__btn:has(> input:focus-visible) {
|
|
240
|
-
outline: 2px solid var(--ui-primary);
|
|
241
|
-
outline-offset: -2px;
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
/* ===== 尺寸档(只覆盖令牌)=====
|
|
245
|
-
标准档 28 拿的是设计实测值,故两档以它为中心各让 4px(24 / 32),而不是继续引用控件三档
|
|
246
|
-
(24 / 32 / 40 —— 那样标准档就落不到 28 上)。 */
|
|
247
|
-
.mh-pagination--sm {
|
|
248
|
-
--ui-pagination-item-size: 24px;
|
|
249
|
-
--ui-pagination-font-size: var(--ui-font-caption);
|
|
250
|
-
}
|
|
251
|
-
.mh-pagination--lg {
|
|
252
|
-
--ui-pagination-item-size: 32px;
|
|
253
|
-
--ui-pagination-font-size: var(--ui-font-body);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/* ===== 跳页(showQuickJumper) =====
|
|
257
|
-
*
|
|
258
|
-
* 跳页框是**输入框**,画线取 `--ui-base-300` —— 与 `Input` 同一条口径(`base-300` 是全库唯一的
|
|
259
|
-
* 「线 / 框」色,出处 `@manohub/theme` 的 `default/colors.css` 头「三条口径」第 2 条;
|
|
260
|
-
* `base-400` 只服务勾选类小控件框体)。**改前取的是 `base-400`**:同一个「输入框」在库里因此
|
|
261
|
-
* 有过两种线色,属跨件口径漏改(2026-09-30 收敛)。
|
|
262
|
-
* 禁用档与 `Input` 同构:底转 `base-200`、线仍 `base-300` —— 即**靠底色区分禁用**,不再靠线深。 */
|
|
263
|
-
.mh-pagination__jump {
|
|
264
|
-
display: inline-flex;
|
|
265
|
-
align-items: center;
|
|
266
|
-
gap: var(--ui-space-2);
|
|
267
|
-
font-size: var(--ui-pagination-font-size);
|
|
268
|
-
color: var(--ui-pagination-text);
|
|
269
|
-
}
|
|
270
|
-
.mh-pagination__jump-input {
|
|
271
|
-
width: 56px;
|
|
272
|
-
height: var(--ui-pagination-item-size);
|
|
273
|
-
padding: 0 var(--ui-space-2);
|
|
274
|
-
border: 1px solid var(--ui-base-300);
|
|
275
|
-
border-radius: var(--ui-pagination-item-radius);
|
|
276
|
-
background: var(--ui-base-100);
|
|
277
|
-
font-family: inherit;
|
|
278
|
-
font-size: var(--ui-pagination-font-size);
|
|
279
|
-
color: var(--ui-base-content);
|
|
280
|
-
text-align: center;
|
|
281
|
-
outline: none;
|
|
282
|
-
/* 数字输入的上下箭头在 56px 宽里会挤掉数字,直接收掉 */
|
|
283
|
-
appearance: textfield;
|
|
284
|
-
-moz-appearance: textfield;
|
|
285
|
-
}
|
|
286
|
-
.mh-pagination__jump-input::-webkit-outer-spin-button,
|
|
287
|
-
.mh-pagination__jump-input::-webkit-inner-spin-button {
|
|
288
|
-
appearance: none;
|
|
289
|
-
margin: 0;
|
|
290
|
-
}
|
|
291
|
-
.mh-pagination__jump-input:hover {
|
|
292
|
-
border-color: var(--ui-pagination-border-hover);
|
|
293
|
-
}
|
|
294
|
-
.mh-pagination__jump-input:focus {
|
|
295
|
-
border-color: var(--ui-pagination-border-active);
|
|
296
|
-
box-shadow: 0 0 0 2px var(--ui-primary-weak);
|
|
297
|
-
}
|
|
298
|
-
.mh-pagination__jump-input:disabled {
|
|
299
|
-
background: var(--ui-base-200);
|
|
300
|
-
border-color: var(--ui-base-300);
|
|
301
|
-
color: var(--ui-base-content-subtle);
|
|
302
|
-
cursor: not-allowed;
|
|
303
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Pagination —— 分页条(总数文案 + 每页条数 + 页码窗口 + 翻页箭头 + 空态 + 简单档)。
|
|
3
|
+
*
|
|
4
|
+
* 出处:设计稿《MH后台-0911》的分页器(`0:4047` 466×28:页码项 **28×28 / r6 / 白底 / 边 `#e6e6e6`**、
|
|
5
|
+
* 选中页码底 `#eff5ff`、条数选择器 `0:4092` 28×28 r6)与 `@aihub/theme` 的 `src/components/pagination.css`
|
|
6
|
+
* (圆角控件档 / 字号 13 / 组间 12 / 页码间 4 / 省略号 subtle)。
|
|
7
|
+
* ⚠️ 设计给 **28**、规范给 **26**、改前本件取 32 —— 三者都不同;本轮按设计取 28(规范值登记为偏差)。
|
|
8
|
+
*
|
|
9
|
+
* **顺序是一维右对齐流**:`共 N 条,` → `每页 N 条 ▾` → `‹ 1 … 10 11 12 … 50 ›`。别把总数额外搬到左侧。
|
|
10
|
+
*
|
|
11
|
+
* **不做跳页输入框**:规范里没有「跳至第 N 页」的样张(重写者若需要须自行定位置),本仓按"不做规范没演示的"
|
|
12
|
+
* 处理 —— 要保持族谱齐全的判据就该守在规范有标记示例的范围内,而不是替规范发明控件。
|
|
13
|
+
*
|
|
14
|
+
* **页码项三源等价**(本仓通例):原生 `:has(> input:checked)` / 组件下发 `[data-state='selected']` /
|
|
15
|
+
* 静态档 `.is-selected` 指向同一份声明 —— 原生态给零 JS 用法(原生 radio 互斥 + ← → 换页),组件态给 v-model。
|
|
16
|
+
*
|
|
17
|
+
* 翻页箭头用**两个字形**(上一页 `chevron-left` / 下一页 `chevron-right`),本层不转向:方位由字形自表达
|
|
18
|
+
* (包内硬约束:不得靠 `transform: rotate()` 把别的图标转成方位,`back` 只作"返回"语义)。条数选择器的
|
|
19
|
+
* 折叠指示走操作层 `.mh-popup-caret`(展开时翻向),与本层同样零自画折线。
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/* 几何只挂在页码条上:令牌在同名 `.tokens.css`(锚 `[data-manohub-ui]`),几何若跟着挂会把空态也排成右对齐的行 */
|
|
23
|
+
.mh-pagination {
|
|
24
|
+
display: flex;
|
|
25
|
+
align-items: center;
|
|
26
|
+
justify-content: flex-end;
|
|
27
|
+
gap: var(--ui-pagination-gap);
|
|
28
|
+
font-size: var(--ui-pagination-font-size);
|
|
29
|
+
color: var(--ui-pagination-text);
|
|
30
|
+
}
|
|
31
|
+
/* 外框档:规范只给了「1px 描边 + 控件圆角」,内距本仓定为横 12、竖不额外加(项高即条高) */
|
|
32
|
+
.mh-pagination--boxed {
|
|
33
|
+
padding: 0 var(--ui-space-4);
|
|
34
|
+
border: 1px solid var(--ui-base-300);
|
|
35
|
+
border-radius: var(--ui-pagination-item-radius);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/* ===== 总数文案 / 空态 / 简单档 ===== */
|
|
39
|
+
.mh-pagination__total {
|
|
40
|
+
white-space: nowrap;
|
|
41
|
+
}
|
|
42
|
+
.mh-pagination__empty {
|
|
43
|
+
color: var(--ui-pagination-ellipsis);
|
|
44
|
+
}
|
|
45
|
+
.mh-pagination__plain {
|
|
46
|
+
white-space: nowrap;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* ===== 每页条数选择器(触发器:文字 + 转向箭头) =====
|
|
50
|
+
面板是「操作层 + 本件皮肤」的组合写法:`class="mh-popup mh-pagination__panel"` ——
|
|
51
|
+
开合 / Esc / 点外部关闭 / 顶层渲染 / 定位档归 `styles/operations/popup.css`,面(底 / 圆角 / 内距 / 阴影)归本件。 */
|
|
52
|
+
.mh-pagination__size {
|
|
53
|
+
display: inline-flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
gap: var(--ui-space-1);
|
|
56
|
+
padding: 0;
|
|
57
|
+
border: none;
|
|
58
|
+
background: transparent;
|
|
59
|
+
font-family: inherit;
|
|
60
|
+
font-size: inherit;
|
|
61
|
+
color: inherit;
|
|
62
|
+
cursor: pointer;
|
|
63
|
+
}
|
|
64
|
+
.mh-pagination__size:hover,
|
|
65
|
+
.mh-pagination__size[data-state='hover'] {
|
|
66
|
+
color: var(--ui-pagination-border-hover);
|
|
67
|
+
}
|
|
68
|
+
.mh-pagination__size[data-state='active'] {
|
|
69
|
+
color: var(--ui-pagination-text-active);
|
|
70
|
+
}
|
|
71
|
+
.mh-pagination__size:disabled {
|
|
72
|
+
color: var(--ui-base-content-subtle);
|
|
73
|
+
cursor: not-allowed;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* 面板皮肤:**组件自渲染的菜单必须自带面** —— 操作层把 popover 的 UA 装饰(含 `background`)归零成
|
|
77
|
+
`transparent`,只挂 `.mh-popup` 的面板会整个透出底下的表格(实测踩坑,就是这条缺失造成的)。
|
|
78
|
+
只给面,不碰开合与定位(那些归操作层)。 */
|
|
79
|
+
.mh-pagination__panel {
|
|
80
|
+
padding: var(--ui-space-1) 0;
|
|
81
|
+
border-radius: var(--ui-radius-control); /* 控件圆角档(与选择器面板同档) */
|
|
82
|
+
background: var(--ui-base-100);
|
|
83
|
+
box-shadow: var(--ui-shadow-popover); /* 条数选择器是锚定浮层,不是居中浮层 */
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/* 菜单里的单选项:本件是**单选组**(原生 radio,箭头键可选),与选择器的 listbox 面板不是一回事,故不复用其皮肤 */
|
|
87
|
+
.mh-pagination__size-option {
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
gap: var(--ui-space-2);
|
|
91
|
+
padding: var(--ui-space-1) var(--ui-space-3);
|
|
92
|
+
border-radius: var(--ui-radius-sm);
|
|
93
|
+
font-size: var(--ui-pagination-font-size);
|
|
94
|
+
color: var(--ui-pagination-text);
|
|
95
|
+
cursor: pointer;
|
|
96
|
+
white-space: nowrap;
|
|
97
|
+
}
|
|
98
|
+
.mh-pagination__size-option:hover {
|
|
99
|
+
background: var(--ui-pagination-bg-selected);
|
|
100
|
+
}
|
|
101
|
+
.mh-pagination__size-option input {
|
|
102
|
+
position: absolute;
|
|
103
|
+
width: 1px;
|
|
104
|
+
height: 1px;
|
|
105
|
+
margin: -1px;
|
|
106
|
+
border: 0;
|
|
107
|
+
overflow: hidden;
|
|
108
|
+
white-space: nowrap;
|
|
109
|
+
clip-path: inset(50%);
|
|
110
|
+
appearance: none;
|
|
111
|
+
pointer-events: none;
|
|
112
|
+
}
|
|
113
|
+
.mh-pagination__size-option:has(input:focus-visible) {
|
|
114
|
+
outline: 2px solid var(--ui-primary);
|
|
115
|
+
outline-offset: -2px;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* ===== 页码行 ===== */
|
|
119
|
+
.mh-pagination__pages {
|
|
120
|
+
display: flex;
|
|
121
|
+
align-items: center;
|
|
122
|
+
gap: var(--ui-pagination-page-gap);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.mh-pagination__btn {
|
|
126
|
+
display: inline-flex;
|
|
127
|
+
align-items: center;
|
|
128
|
+
justify-content: center;
|
|
129
|
+
box-sizing: border-box;
|
|
130
|
+
min-width: var(--ui-pagination-item-size);
|
|
131
|
+
height: var(--ui-pagination-item-size);
|
|
132
|
+
padding: 0 var(--ui-space-1);
|
|
133
|
+
border: 1px solid transparent;
|
|
134
|
+
border-radius: var(--ui-pagination-item-radius);
|
|
135
|
+
background: transparent;
|
|
136
|
+
font-family: inherit;
|
|
137
|
+
font-size: var(--ui-pagination-font-size);
|
|
138
|
+
color: var(--ui-pagination-text);
|
|
139
|
+
cursor: pointer;
|
|
140
|
+
transition-property: background-color, border-color, color;
|
|
141
|
+
transition-duration: 0.15s;
|
|
142
|
+
transition-timing-function: ease;
|
|
143
|
+
}
|
|
144
|
+
/* 滑过 / 按下:只描边转色(底仍透明,规范如此) */
|
|
145
|
+
.mh-pagination__btn:hover,
|
|
146
|
+
.mh-pagination__btn.is-hover {
|
|
147
|
+
border-color: var(--ui-pagination-border-hover);
|
|
148
|
+
}
|
|
149
|
+
.mh-pagination__btn:active,
|
|
150
|
+
.mh-pagination__btn.is-active {
|
|
151
|
+
border-color: var(--ui-pagination-border-active);
|
|
152
|
+
}
|
|
153
|
+
/* 选中:淡底 + 主色描边 + 主色字 + 中粗(三源等价) */
|
|
154
|
+
.mh-pagination__btn.is-selected,
|
|
155
|
+
.mh-pagination__btn[data-state='selected'],
|
|
156
|
+
.mh-pagination__btn:has(> input:checked) {
|
|
157
|
+
border-color: var(--ui-pagination-border-active);
|
|
158
|
+
background: var(--ui-pagination-bg-selected);
|
|
159
|
+
color: var(--ui-pagination-text-active);
|
|
160
|
+
font-weight: var(--ui-weight-medium);
|
|
161
|
+
}
|
|
162
|
+
.mh-pagination__btn:disabled {
|
|
163
|
+
color: var(--ui-base-content-subtle);
|
|
164
|
+
cursor: not-allowed;
|
|
165
|
+
}
|
|
166
|
+
.mh-pagination__btn:disabled:hover {
|
|
167
|
+
border-color: transparent;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/* 省略号:不可点、字距拉开(规范 2px) */
|
|
171
|
+
.mh-pagination__btn--ellipsis {
|
|
172
|
+
color: var(--ui-pagination-ellipsis);
|
|
173
|
+
letter-spacing: 2px;
|
|
174
|
+
cursor: default;
|
|
175
|
+
}
|
|
176
|
+
.mh-pagination__btn--ellipsis:hover {
|
|
177
|
+
border-color: transparent;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* 翻页箭头:**朝向在字形里**(上一页 `chevron-left` / 下一页 `chevron-right`),本层只给颜色 ——
|
|
181
|
+
整段零 `transform`,不走"把别的图标转成方位"的老路(包内硬约束)。
|
|
182
|
+
`--prev` / `--next` 保留为**状态钩子**(消费方与测试按它们定位两端的箭头按钮),不再承载转向。 */
|
|
183
|
+
.mh-pagination__btn--arrow {
|
|
184
|
+
color: var(--ui-pagination-arrow);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* 槽位尺寸:**常规图标一律取全局图标档**(`--ui-font-icon`)—— 翻页箭头与条数选择器的折叠箭头
|
|
188
|
+
改前无声明、掉到 `<svg>` 的默认 16,本层不另定数值(字形由 `@manohub/icon` 给)。 */
|
|
189
|
+
.mh-pagination__btn--arrow > svg,
|
|
190
|
+
.mh-pagination__size > svg {
|
|
191
|
+
width: var(--ui-font-icon);
|
|
192
|
+
height: var(--ui-font-icon);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/* ===== 外框档内的三态:不描边、不落底,只靠**文字变色** =====
|
|
196
|
+
判据:boxed 档自己已经画了一圈外框,框内再来一圈描边(滑过/按下/选中)或一块淡底(选中)就是双重勾线,
|
|
197
|
+
故框内的态一律收敛成「文字色」这一种手段 —— 滑过转浅主色(复用描边档的滑过色 `#529dff`)、按下与选中
|
|
198
|
+
转主色。中粗**不在此重复声明**:基类选中规则已给 `--ui-weight-medium`,这里只覆盖 border/底/字色三件,
|
|
199
|
+
旧口径(主色字 + 中粗)完整保留。
|
|
200
|
+
两处排除都是必须的:`--ellipsis`(省略号与按钮共用基类,但它不可点、只该保持浅色)与 `:disabled`
|
|
201
|
+
(不可点的箭头不该被悬停染成主色);排除项包在 `:where()` 里,使其**不抬特异性** —— 这样三条覆盖同为
|
|
202
|
+
0-3-0,靠源序让「选中」压住「悬停」(悬停已选中的项仍显示选中色,与非 boxed 档一致)。
|
|
203
|
+
三源等价(原生 `:has(> input:checked)` / 组件 `[data-state='selected']` / 静态 `.is-selected`)一并覆盖。 */
|
|
204
|
+
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)):hover,
|
|
205
|
+
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)).is-hover {
|
|
206
|
+
border-color: transparent;
|
|
207
|
+
color: var(--ui-pagination-border-hover);
|
|
208
|
+
}
|
|
209
|
+
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)):active,
|
|
210
|
+
.mh-pagination--boxed .mh-pagination__btn:not(:where(.mh-pagination__btn--ellipsis, :disabled)).is-active {
|
|
211
|
+
border-color: transparent;
|
|
212
|
+
color: var(--ui-pagination-border-active);
|
|
213
|
+
}
|
|
214
|
+
.mh-pagination--boxed .mh-pagination__btn.is-selected,
|
|
215
|
+
.mh-pagination--boxed .mh-pagination__btn[data-state='selected'],
|
|
216
|
+
.mh-pagination--boxed .mh-pagination__btn:has(> input:checked) {
|
|
217
|
+
border-color: transparent;
|
|
218
|
+
background: transparent;
|
|
219
|
+
color: var(--ui-pagination-text-active);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* 原生态的开关(同名 radio)隐身但可聚焦:零 JS 用法下选中态由 `:has(> input:checked)` 驱动 */
|
|
223
|
+
.mh-pagination__btn > input {
|
|
224
|
+
position: absolute;
|
|
225
|
+
width: 1px;
|
|
226
|
+
height: 1px;
|
|
227
|
+
margin: -1px;
|
|
228
|
+
padding: 0;
|
|
229
|
+
border: 0;
|
|
230
|
+
overflow: hidden;
|
|
231
|
+
white-space: nowrap;
|
|
232
|
+
clip-path: inset(50%);
|
|
233
|
+
appearance: none;
|
|
234
|
+
pointer-events: none;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/* 键盘焦点环画在可见项上(原生态的开关是隐身的) */
|
|
238
|
+
.mh-pagination__btn:focus-visible,
|
|
239
|
+
.mh-pagination__btn:has(> input:focus-visible) {
|
|
240
|
+
outline: 2px solid var(--ui-primary);
|
|
241
|
+
outline-offset: -2px;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* ===== 尺寸档(只覆盖令牌)=====
|
|
245
|
+
标准档 28 拿的是设计实测值,故两档以它为中心各让 4px(24 / 32),而不是继续引用控件三档
|
|
246
|
+
(24 / 32 / 40 —— 那样标准档就落不到 28 上)。 */
|
|
247
|
+
.mh-pagination--sm {
|
|
248
|
+
--ui-pagination-item-size: 24px;
|
|
249
|
+
--ui-pagination-font-size: var(--ui-font-caption);
|
|
250
|
+
}
|
|
251
|
+
.mh-pagination--lg {
|
|
252
|
+
--ui-pagination-item-size: 32px;
|
|
253
|
+
--ui-pagination-font-size: var(--ui-font-body);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/* ===== 跳页(showQuickJumper) =====
|
|
257
|
+
*
|
|
258
|
+
* 跳页框是**输入框**,画线取 `--ui-base-300` —— 与 `Input` 同一条口径(`base-300` 是全库唯一的
|
|
259
|
+
* 「线 / 框」色,出处 `@manohub/theme` 的 `default/colors.css` 头「三条口径」第 2 条;
|
|
260
|
+
* `base-400` 只服务勾选类小控件框体)。**改前取的是 `base-400`**:同一个「输入框」在库里因此
|
|
261
|
+
* 有过两种线色,属跨件口径漏改(2026-09-30 收敛)。
|
|
262
|
+
* 禁用档与 `Input` 同构:底转 `base-200`、线仍 `base-300` —— 即**靠底色区分禁用**,不再靠线深。 */
|
|
263
|
+
.mh-pagination__jump {
|
|
264
|
+
display: inline-flex;
|
|
265
|
+
align-items: center;
|
|
266
|
+
gap: var(--ui-space-2);
|
|
267
|
+
font-size: var(--ui-pagination-font-size);
|
|
268
|
+
color: var(--ui-pagination-text);
|
|
269
|
+
}
|
|
270
|
+
.mh-pagination__jump-input {
|
|
271
|
+
width: 56px;
|
|
272
|
+
height: var(--ui-pagination-item-size);
|
|
273
|
+
padding: 0 var(--ui-space-2);
|
|
274
|
+
border: 1px solid var(--ui-base-300);
|
|
275
|
+
border-radius: var(--ui-pagination-item-radius);
|
|
276
|
+
background: var(--ui-base-100);
|
|
277
|
+
font-family: inherit;
|
|
278
|
+
font-size: var(--ui-pagination-font-size);
|
|
279
|
+
color: var(--ui-base-content);
|
|
280
|
+
text-align: center;
|
|
281
|
+
outline: none;
|
|
282
|
+
/* 数字输入的上下箭头在 56px 宽里会挤掉数字,直接收掉 */
|
|
283
|
+
appearance: textfield;
|
|
284
|
+
-moz-appearance: textfield;
|
|
285
|
+
}
|
|
286
|
+
.mh-pagination__jump-input::-webkit-outer-spin-button,
|
|
287
|
+
.mh-pagination__jump-input::-webkit-inner-spin-button {
|
|
288
|
+
appearance: none;
|
|
289
|
+
margin: 0;
|
|
290
|
+
}
|
|
291
|
+
.mh-pagination__jump-input:hover {
|
|
292
|
+
border-color: var(--ui-pagination-border-hover);
|
|
293
|
+
}
|
|
294
|
+
.mh-pagination__jump-input:focus {
|
|
295
|
+
border-color: var(--ui-pagination-border-active);
|
|
296
|
+
box-shadow: 0 0 0 2px var(--ui-primary-weak);
|
|
297
|
+
}
|
|
298
|
+
.mh-pagination__jump-input:disabled {
|
|
299
|
+
background: var(--ui-base-200);
|
|
300
|
+
border-color: var(--ui-base-300);
|
|
301
|
+
color: var(--ui-base-content-subtle);
|
|
302
|
+
cursor: not-allowed;
|
|
303
|
+
}
|