@xihan-ui/styles 2.1.0 → 3.1.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/CHANGELOG.md +1261 -0
- package/README.md +6 -1
- package/component-tokens.d.ts +533 -96
- package/components.tokens.json +35461 -26045
- package/css/accordion.css +34 -8
- package/css/alert.css +59 -1
- package/css/anchor.css +46 -8
- package/css/approval.css +116 -76
- package/css/avatar-group.css +1 -1
- package/css/avatar.css +13 -5
- package/css/back-top.css +61 -42
- package/css/badge.css +62 -12
- package/css/bar-code.css +1 -1
- package/css/breadcrumb.css +62 -3
- package/css/button-group.css +4 -4
- package/css/button.css +67 -19
- package/css/calendar-picker.css +19 -0
- package/css/calendar-range-picker.css +39 -2
- package/css/card.css +115 -1
- package/css/carousel.css +148 -43
- package/css/cartesian-chart.css +830 -0
- package/css/cascader.css +181 -65
- package/css/checkbox-group.css +59 -89
- package/css/checkbox.css +16 -49
- package/css/citation.css +470 -0
- package/css/clipboard.css +20 -63
- package/css/code-view.css +101 -6
- package/css/collapsible.css +34 -8
- package/css/color-field.css +18 -0
- package/css/color-picker.css +128 -50
- package/css/color-slider.css +22 -15
- package/css/color-swatch-picker.css +3 -1
- package/css/combobox.css +80 -33
- package/css/command.css +45 -43
- package/css/context-menu.css +39 -22
- package/css/date-field.css +56 -0
- package/css/date-picker.css +132 -26
- package/css/date-range-picker.css +337 -14
- package/css/description.css +17 -1
- package/css/descriptions.css +42 -0
- package/css/dialog.css +94 -36
- package/css/diff-view.css +97 -12
- package/css/download-trigger.css +44 -78
- package/css/drawer.css +160 -119
- package/css/editable.css +19 -0
- package/css/empty-state.css +7 -6
- package/css/field-array.css +36 -0
- package/css/field.css +20 -18
- package/css/file-upload.css +125 -135
- package/css/flex.css +324 -8
- package/css/float-button.css +263 -38
- package/css/floating-panel.css +53 -19
- package/css/form.css +31 -17
- package/css/funnel-chart.css +106 -0
- package/css/graph-chart.css +205 -0
- package/css/grid-list.css +235 -0
- package/css/grid.css +252 -1
- package/css/heatmap.css +119 -36
- package/css/hierarchy-chart.css +298 -0
- package/css/hover-card.css +31 -14
- package/css/icon.css +100 -0
- package/css/image-cropper.css +33 -7
- package/css/image-viewer.css +167 -22
- package/css/image.css +23 -4
- package/css/input-group.css +11 -13
- package/css/json-viewer.css +50 -2
- package/css/layout.css +68 -18
- package/css/liquid.css +106 -0
- package/css/list.css +1 -1
- package/css/listbox.css +46 -6
- package/css/loading-bar.css +27 -13
- package/css/log.css +129 -33
- package/css/markdown-stream.css +1 -1
- package/css/marquee.css +163 -7
- package/css/matrix-code.css +1 -1
- package/css/mention.css +35 -19
- package/css/menu.css +35 -21
- package/css/menubar.css +36 -20
- package/css/message-feed.css +172 -51
- package/css/navigation-menu.css +172 -11
- package/css/notification.css +435 -108
- package/css/number-field.css +22 -0
- package/css/page-header.css +3 -1
- package/css/pagination.css +126 -24
- package/css/password-input.css +40 -8
- package/css/pie-chart.css +247 -0
- package/css/popconfirm.css +44 -50
- package/css/popover.css +50 -14
- package/css/progress.css +308 -10
- package/css/prompt-input.css +36 -0
- package/css/question-flow.css +97 -57
- package/css/radar-chart.css +233 -0
- package/css/radio-group.css +363 -5
- package/css/rating.css +21 -23
- package/css/reasoning.css +61 -54
- package/css/resizable.css +6 -1
- package/css/sankey-chart.css +174 -0
- package/css/scroll-area.css +32 -0
- package/css/scrollbar.css +1 -1
- package/css/select.css +74 -55
- package/css/side-nav.css +173 -24
- package/css/signature-pad.css +16 -1
- package/css/skeleton.css +13 -14
- package/css/slider.css +35 -13
- package/css/sortable.css +37 -7
- package/css/sparkline.css +164 -0
- package/css/spinner.css +50 -22
- package/css/splitter.css +7 -1
- package/css/statistic.css +10 -0
- package/css/steps.css +248 -29
- package/css/switch.css +23 -48
- package/css/table.css +175 -118
- package/css/tabs.css +231 -19
- package/css/tag-group.css +27 -3
- package/css/tag.css +53 -12
- package/css/tags-input.css +40 -3
- package/css/text-field.css +19 -0
- package/css/time-field.css +20 -1
- package/css/time-picker.css +103 -17
- package/css/time-range-picker.css +45 -16
- package/css/timeline.css +1 -1
- package/css/toggle-group.css +4 -4
- package/css/toggle.css +4 -3
- package/css/tool-call.css +59 -51
- package/css/toolbar.css +101 -3
- package/css/tooltip.css +15 -2
- package/css/tour.css +42 -12
- package/css/transfer.css +98 -75
- package/css/tree-select.css +232 -53
- package/css/tree.css +271 -55
- package/css/truncate.css +55 -12
- package/css/typography.css +93 -0
- package/css/virtualizer.css +56 -0
- package/css/watermark.css +23 -0
- package/family/action-control.css +14 -5
- package/family/chart.css +480 -0
- package/family/check-mark.css +94 -0
- package/family/choice-card.css +97 -0
- package/family/collection-item.css +9 -15
- package/family/field-chrome.css +1 -12
- package/family/loading-ring.css +95 -0
- package/family/material.css +72 -0
- package/family/menu-choice.css +56 -0
- package/family/motion.css +207 -10
- package/family/tag-list.css +59 -0
- package/index.css +13824 -4030
- package/index.unlayered.css +13403 -3605
- package/package.json +20 -8
- package/css/gradient-text.css +0 -91
- package/css/icon-wrapper.css +0 -81
- package/css/segmented.css +0 -280
- package/css/toast.css +0 -499
package/css/cascader.css
CHANGED
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
@import '../family/field-chrome.css';
|
|
8
8
|
@import '../family/action-control.css';
|
|
9
9
|
@import '../family/collection-item.css';
|
|
10
|
+
@import '../family/loading-ring.css';
|
|
10
11
|
|
|
11
12
|
/* 共享关键帧由 family/motion.css 提供,本皮肤 @import 它,单独引入仍成立。 */
|
|
12
13
|
@import '../family/motion.css';
|
|
14
|
+
@import '../family/material.css';
|
|
15
|
+
@import '../family/tag-list.css';
|
|
13
16
|
|
|
14
17
|
@layer xihan.components {
|
|
15
18
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -208,6 +211,18 @@
|
|
|
208
211
|
color: var(--xh-fg-disabled);
|
|
209
212
|
}
|
|
210
213
|
|
|
214
|
+
/* 标签行:触发器里收着可见标签与 +N 那一枚的一行,行里每一枚都是 tag(data-scope="tag"),样子归 tag.css;
|
|
215
|
+
行怎么排、标签怎么进出归标签行家族配方(family/tag-list.css),这里只把使用者的间距槽接进去 */
|
|
216
|
+
[data-scope='cascader'][data-part='tag-list'] {
|
|
217
|
+
--xh-tag-list-gap: var(--xh-cascader-tag-list-gap, var(--xh-space-1));
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/* 标签行露面时 value-text 让位:两者是触发器里的同一格,占位文字与标签不同屏。
|
|
221
|
+
value-text 留在 DOM 里,trigger 的可及名仍从它取到完整的选中路径文本 */
|
|
222
|
+
[data-scope='cascader'][data-part='trigger']:has([data-part='tag-list']:not([hidden])) [data-part='value-text'] {
|
|
223
|
+
display: none;
|
|
224
|
+
}
|
|
225
|
+
|
|
211
226
|
/* 有值时清空钮顶上来,箭头让位:两个图标并排堆着,用户分不清点哪个。
|
|
212
227
|
判据查的是盒里此刻真有一颗没收起的清空钮,不是「有没有值」——
|
|
213
228
|
作者没摆清空钮时箭头照常留着,不然让了位没人接,指示符整个消失 */
|
|
@@ -221,7 +236,7 @@
|
|
|
221
236
|
align-items: center;
|
|
222
237
|
justify-content: center;
|
|
223
238
|
color: var(--xh-cascader-indicator-fg, var(--xh-fg-muted));
|
|
224
|
-
transition: rotate var(--xh-motion-duration-
|
|
239
|
+
transition: rotate var(--xh-motion-duration-nudge) var(--xh-motion-ease-enter-strong);
|
|
225
240
|
}
|
|
226
241
|
|
|
227
242
|
[data-scope='cascader'][data-part='indicator'][hidden] {
|
|
@@ -279,22 +294,24 @@
|
|
|
279
294
|
}
|
|
280
295
|
|
|
281
296
|
/* 级联的骨架就在这一条上:列沿书写方向并排,一层一列。
|
|
282
|
-
|
|
297
|
+
面板型浮层:每一列按条目的自然宽度,不随字段盒拉伸,面板随列数伸展。
|
|
298
|
+
面板含多列,材质取 floating:实体底 + border-default 描边 + 浮起投影,不透景 */
|
|
283
299
|
[data-scope='cascader'][data-part='content'] {
|
|
284
300
|
position: relative;
|
|
285
301
|
display: flex;
|
|
286
302
|
flex-direction: row;
|
|
287
303
|
align-items: stretch;
|
|
288
|
-
/*
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
304
|
+
/* 面板的下界:搜索视图与两个占位没有列托底,靠这一条不缩成一小块;可用区比它还窄时让位。
|
|
305
|
+
可用宽写在定位层上、沿继承流下来 */
|
|
306
|
+
min-inline-size: min(var(--xh-cascader-content-min-w, var(--xh-overlay-menu-min-w)), var(--xh-_cascader-available-w));
|
|
307
|
+
/* 列多起来时外框宽过可用区就收成可用宽度,溢出的列交给下面那条 overflow-x;
|
|
308
|
+
缺省不封顶,作者要封顶写 --xh-cascader-content-max-w */
|
|
309
|
+
max-inline-size: min(var(--xh-cascader-content-max-w, var(--xh-_cascader-available-w)), var(--xh-_cascader-available-w));
|
|
310
|
+
border: var(--xh-stroke-thin) solid var(--xh-cascader-content-border, var(--xh-border-default));
|
|
292
311
|
border-radius: var(--xh-cascader-content-radius, var(--xh-shape-overlay));
|
|
293
|
-
background: var(--xh-cascader-content-bg, var(--xh-
|
|
294
|
-
color: var(--xh-cascader-content-fg, var(--xh-
|
|
295
|
-
box-shadow: var(--xh-cascader-content-shadow, var(--xh-
|
|
296
|
-
-webkit-backdrop-filter: var(--xh-cascader-content-backdrop, var(--xh-material-frosted-backdrop));
|
|
297
|
-
backdrop-filter: var(--xh-cascader-content-backdrop, var(--xh-material-frosted-backdrop));
|
|
312
|
+
background: var(--xh-cascader-content-bg, var(--xh-bg-surface));
|
|
313
|
+
color: var(--xh-cascader-content-fg, var(--xh-fg-default));
|
|
314
|
+
box-shadow: var(--xh-cascader-content-shadow, var(--xh-elevation-floating));
|
|
298
315
|
/* 列多到放不下时整体横向滚动;纵向溢出归每一列自己 */
|
|
299
316
|
overflow-x: auto;
|
|
300
317
|
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
@@ -305,18 +322,6 @@
|
|
|
305
322
|
--xh-scrollbar-track-bg: transparent;
|
|
306
323
|
}
|
|
307
324
|
|
|
308
|
-
/* 唯一外壳的内侧顶光;列和状态部件不另画材质面。 */
|
|
309
|
-
[data-scope='cascader'][data-part='content']::before {
|
|
310
|
-
content: '';
|
|
311
|
-
position: absolute;
|
|
312
|
-
inset-block-start: 0;
|
|
313
|
-
inset-inline: 0;
|
|
314
|
-
block-size: var(--xh-stroke-thin);
|
|
315
|
-
border-radius: inherit;
|
|
316
|
-
background: var(--xh-cascader-content-highlight, var(--xh-material-frosted-highlight));
|
|
317
|
-
pointer-events: none;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
325
|
/* 这里刻意没有 [data-part='content'][hidden] { display: none },与 dialog 一致:
|
|
321
326
|
收起态连接层会给 content 打 hidden,而上面那条 display 正是要盖掉 UA 的
|
|
322
327
|
[hidden]{display:none}——退场动画得先能播。presence 读的是 content 的 animationName,
|
|
@@ -328,7 +333,8 @@
|
|
|
328
333
|
outline: none;
|
|
329
334
|
}
|
|
330
335
|
|
|
331
|
-
|
|
336
|
+
/* 挂载时就开着的那一段(data-instant)属于首帧,直接呈现 */
|
|
337
|
+
[data-scope='cascader'][data-part='content'][data-state='open']:not([data-instant]) {
|
|
332
338
|
animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
|
|
333
339
|
}
|
|
334
340
|
|
|
@@ -345,13 +351,21 @@
|
|
|
345
351
|
flex: none;
|
|
346
352
|
flex-direction: column;
|
|
347
353
|
gap: var(--xh-cascader-column-gap, var(--xh-list-option-gap));
|
|
348
|
-
|
|
354
|
+
/* 每一列按条目的自然宽度,受菜单的下界托底;长选项撑到条目的上限为止,余下的在条目里截断 */
|
|
355
|
+
min-inline-size: var(--xh-cascader-column-min-w, var(--xh-overlay-menu-min-w));
|
|
349
356
|
block-size: var(--xh-cascader-column-h, var(--xh-viewport-h-sm));
|
|
350
357
|
padding-block: var(--xh-cascader-column-py, var(--xh-space-1));
|
|
351
358
|
padding-inline: var(--xh-cascader-column-px, var(--xh-space-1));
|
|
352
359
|
overflow-y: auto;
|
|
353
360
|
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
354
361
|
overscroll-behavior: contain;
|
|
362
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/* 刷新:已有候选时后台在取,保留上一帧,列与候选列表按 micro 淡下,数据到了再淡回;在途占位此时让位。
|
|
366
|
+
淡的是列不是面:content 是整块浮起面,整块淡下去面就透了 */
|
|
367
|
+
[data-scope='cascader'][data-part='content'][aria-busy='true'] > [data-scope='cascader']:is([data-part='column'], [data-part='search-list']) {
|
|
368
|
+
opacity: var(--xh-state-disabled-opacity);
|
|
355
369
|
}
|
|
356
370
|
|
|
357
371
|
/* 展开路径砍短了这一列就收起来。display 盖掉了 UA 的 [hidden]{display:none},
|
|
@@ -364,7 +378,7 @@
|
|
|
364
378
|
用逻辑属性,rtl 下自动跑到另一侧。每列后面紧跟着它自己的竖条节点,相邻选择器接不到下一列,
|
|
365
379
|
按「前面有过列」取后续的列 */
|
|
366
380
|
[data-scope='cascader'][data-part='column'] ~ [data-scope='cascader'][data-part='column'] {
|
|
367
|
-
border-inline-start: var(--xh-stroke-thin) solid var(--xh-cascader-column-divider, var(--xh-material-
|
|
381
|
+
border-inline-start: var(--xh-stroke-thin) solid var(--xh-cascader-column-divider, var(--xh-material-solid-separator));
|
|
368
382
|
}
|
|
369
383
|
|
|
370
384
|
[data-scope='cascader'][data-part='column']:not([tabindex='0']):focus-visible {
|
|
@@ -393,7 +407,7 @@
|
|
|
393
407
|
display: block;
|
|
394
408
|
padding-block: var(--xh-cascader-group-label-py, var(--xh-space-1));
|
|
395
409
|
padding-inline: var(--xh-cascader-group-label-px, var(--xh-_cascader-row-px));
|
|
396
|
-
color: var(--xh-cascader-group-label-fg, var(--xh-
|
|
410
|
+
color: var(--xh-cascader-group-label-fg, var(--xh-fg-muted));
|
|
397
411
|
font-size: var(--xh-cascader-group-label-font-size, var(--xh-text-caption-size));
|
|
398
412
|
font-weight: var(--xh-cascader-group-label-font-weight, var(--xh-font-weight-medium));
|
|
399
413
|
line-height: var(--xh-leading-none);
|
|
@@ -417,7 +431,7 @@
|
|
|
417
431
|
--xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
|
|
418
432
|
--xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
|
|
419
433
|
--xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
420
|
-
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-
|
|
434
|
+
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
|
|
421
435
|
--xh-collection-glyph-size: var(--xh-cascader-icon-size, var(--xh-_collection-glyph-size));
|
|
422
436
|
--xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
423
437
|
--xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
@@ -463,9 +477,33 @@
|
|
|
463
477
|
display: none;
|
|
464
478
|
}
|
|
465
479
|
|
|
466
|
-
/*
|
|
467
|
-
|
|
468
|
-
[data-scope='cascader'][data-part='
|
|
480
|
+
/* 懒分支取数失败不预设错误面:失败由那一列里的提示与重试钮说明,父条目仍是一条可激活的普通条目,
|
|
481
|
+
与树选择同一口径。家族按 data-error 给的告警面(危险色字压在危险色淡底上,对比不到 4.5:1)在这里映射回常态 */
|
|
482
|
+
[data-scope='cascader'][data-part='item'][data-error] {
|
|
483
|
+
--xh-collection-bg-error: transparent;
|
|
484
|
+
--xh-collection-fg-error: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
485
|
+
--xh-collection-description-fg-error: var(--xh-material-frosted-fg-muted);
|
|
486
|
+
--xh-collection-indicator-fg-error: var(--xh-_cascader-accent);
|
|
487
|
+
--xh-collection-outline-error: transparent;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/* 取数失败的条目仍可激活(点行或 Enter 重试),而家族的悬停、高亮、展开路径与按下几段都排除了 [data-error]:
|
|
491
|
+
在家族解算点上把同一阶梯接回——悬停、键盘高亮与展开路径 100 档,按下 200 档并走按下时长 */
|
|
492
|
+
[data-scope='cascader'][data-part='item'][data-error]:not([data-disabled]):is(:hover, [data-highlighted], [data-in-path]) {
|
|
493
|
+
--xh-_collection-bg: var(--xh-cascader-item-bg-hover, var(--xh-bg-subtle));
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
[data-scope='cascader'][data-part='item'][data-error]:not([data-disabled]):is(:active, [data-pressed]) {
|
|
497
|
+
--xh-_collection-bg: var(--xh-cascader-item-bg-pressed, var(--xh-bg-subtle-hover));
|
|
498
|
+
|
|
499
|
+
transition-duration: var(--xh-motion-duration-press);
|
|
500
|
+
transition-timing-function: var(--xh-motion-ease-press);
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/* 一列开幕:条目自上而下逐条淡入。只在列头一次出现时播(浮层展开、此前收着的子列铺出来);
|
|
504
|
+
列此前就在、展开路径换到同列另一个父项时(悬停扫过),连接层给露面的条目标 data-instant,
|
|
505
|
+
换内容不重播。backwards 让每条在自己那份延迟里保持起始帧 */
|
|
506
|
+
[data-scope='cascader'][data-part='column'] [data-part='item']:not([data-instant]) {
|
|
469
507
|
animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter) backwards;
|
|
470
508
|
}
|
|
471
509
|
|
|
@@ -553,7 +591,9 @@
|
|
|
553
591
|
}
|
|
554
592
|
|
|
555
593
|
/* 没写内容就由皮肤画勾;作者往部件里塞了自己的图形,这条规则即不命中。
|
|
556
|
-
尺寸读标记盒自己改接过的 --xh-icon-size
|
|
594
|
+
尺寸读标记盒自己改接过的 --xh-icon-size:与盒同边长,随指示符档换档(见上面标记盒那块)。
|
|
595
|
+
勾与半选杠叠成两层遮罩,按状态只换两层的尺寸:离开半选淡出的那一段里横杠留着,
|
|
596
|
+
淡出播完才换回勾——不在淡出途中闪出一枚勾 */
|
|
557
597
|
[data-scope='cascader'][data-part='item-indicator']:empty::before {
|
|
558
598
|
content: '';
|
|
559
599
|
display: inline-block;
|
|
@@ -561,25 +601,27 @@
|
|
|
561
601
|
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
562
602
|
vertical-align: var(--xh-glyph-baseline-shift);
|
|
563
603
|
background-color: currentColor;
|
|
564
|
-
-webkit-mask: var(--xh-glyph-mark-check) center /
|
|
565
|
-
mask: var(--xh-glyph-mark-check) center /
|
|
604
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
605
|
+
mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
606
|
+
transition:
|
|
607
|
+
-webkit-mask-size 0s var(--xh-motion-duration-micro),
|
|
608
|
+
mask-size 0s var(--xh-motion-duration-micro);
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
[data-scope='cascader'][data-part='item-indicator'][data-state='checked']:empty::before {
|
|
612
|
+
transition-delay: 0s;
|
|
566
613
|
}
|
|
567
614
|
|
|
568
615
|
/* 级联勾选的半选态只在皮肤自绘(:empty)时露面画横杠:
|
|
569
616
|
作者塞了自己的选中图形时,半选放出来会顶着一个语义相反的勾,表达交还作者 */
|
|
570
617
|
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty {
|
|
571
|
-
|
|
618
|
+
opacity: 1;
|
|
572
619
|
}
|
|
573
620
|
|
|
574
621
|
[data-scope='cascader'][data-part='item-indicator'][data-state='indeterminate']:empty::before {
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
579
|
-
vertical-align: var(--xh-glyph-baseline-shift);
|
|
580
|
-
background-color: currentColor;
|
|
581
|
-
-webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
582
|
-
mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
622
|
+
-webkit-mask-size: 0 0, 100% 100%;
|
|
623
|
+
mask-size: 0 0, 100% 100%;
|
|
624
|
+
transition-delay: 0s;
|
|
583
625
|
}
|
|
584
626
|
|
|
585
627
|
/* 家族按行的禁用降级标记色;半选横线也一并跟着 */
|
|
@@ -592,13 +634,24 @@
|
|
|
592
634
|
flex-wrap: wrap;
|
|
593
635
|
}
|
|
594
636
|
|
|
637
|
+
/* 面板内嵌的搜索框:通栏一行,控件高与字号随尺寸档,只画一道面内分隔的下划线(取面材质的分隔令牌);
|
|
638
|
+
重置与占位前景由字段家族按 data-xh-field-input 给,占位与值文本的占位同一支组件槽 */
|
|
595
639
|
[data-scope='cascader'][data-part='input'] {
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
640
|
+
--xh-field-placeholder-fg: var(--xh-cascader-placeholder-fg, var(--xh-fg-subtle));
|
|
641
|
+
|
|
642
|
+
/* 搜索框不参与定宽,面板宽度只由列(搜索视图里是候选列表)撑出:换行的 flex 容器按内容定宽时
|
|
643
|
+
把各项的固有宽度相加,原生输入框自带约 20 个字符的固有宽,内衬也算在里面。
|
|
644
|
+
内容宽取 0,落位后由 min-inline-size 铺满整行;内衬由等量的负外边距在宽度贡献里抵掉,
|
|
645
|
+
盒子本身仍铺满整行,下一项照样折到下一行 */
|
|
646
|
+
flex: none;
|
|
647
|
+
inline-size: 0;
|
|
648
|
+
min-inline-size: 100%;
|
|
649
|
+
margin-inline-end: calc(-2 * var(--xh-cascader-input-px, var(--xh-_cascader-px)));
|
|
650
|
+
block-size: var(--xh-cascader-input-h, var(--xh-_cascader-h));
|
|
651
|
+
padding-block: 0;
|
|
652
|
+
padding-inline: var(--xh-cascader-input-px, var(--xh-_cascader-px));
|
|
600
653
|
border: none;
|
|
601
|
-
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-material-
|
|
654
|
+
border-block-end: var(--xh-stroke-thin) solid var(--xh-cascader-search-divider, var(--xh-material-solid-separator));
|
|
602
655
|
border-start-start-radius: inherit;
|
|
603
656
|
border-start-end-radius: inherit;
|
|
604
657
|
background: none;
|
|
@@ -608,6 +661,11 @@
|
|
|
608
661
|
line-height: var(--xh-leading-normal);
|
|
609
662
|
}
|
|
610
663
|
|
|
664
|
+
/* 聚焦不画环:插入符就是焦点指示。框没有外壳,全局那圈键盘焦点环只会压在通栏一行上 */
|
|
665
|
+
[data-scope='cascader'][data-part='input']:focus-visible {
|
|
666
|
+
outline: none;
|
|
667
|
+
}
|
|
668
|
+
|
|
611
669
|
[data-scope='cascader'][data-part='input'][hidden] {
|
|
612
670
|
display: none;
|
|
613
671
|
}
|
|
@@ -639,6 +697,7 @@
|
|
|
639
697
|
overflow-y: auto;
|
|
640
698
|
/* 浮层滚动面:滚到头不把页面一起带走 */
|
|
641
699
|
overscroll-behavior: contain;
|
|
700
|
+
transition: opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
|
|
642
701
|
}
|
|
643
702
|
|
|
644
703
|
[data-scope='cascader'][data-part='search-list'][hidden] {
|
|
@@ -663,7 +722,7 @@
|
|
|
663
722
|
--xh-collection-inline-padding: var(--xh-cascader-item-px, var(--xh-_cascader-row-px));
|
|
664
723
|
--xh-collection-gap: var(--xh-cascader-item-gap, var(--xh-_cascader-gap));
|
|
665
724
|
--xh-collection-font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
666
|
-
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-
|
|
725
|
+
--xh-collection-radius: var(--xh-cascader-item-radius, var(--xh-shape-inset));
|
|
667
726
|
--xh-collection-fg-rest: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
668
727
|
--xh-collection-fg-hover: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
669
728
|
--xh-collection-fg-keyboard-highlight: var(--xh-cascader-item-fg, var(--xh-material-frosted-fg));
|
|
@@ -718,19 +777,26 @@
|
|
|
718
777
|
block-size: var(--xh-cascader-item-indicator-size, var(--xh-control-indicator-size));
|
|
719
778
|
translate: 0 -50%;
|
|
720
779
|
background-color: var(--xh-cascader-item-indicator-fg, var(--xh-_cascader-accent));
|
|
721
|
-
|
|
722
|
-
-webkit-mask: var(--xh-glyph-mark-check) center /
|
|
723
|
-
mask: var(--xh-glyph-mark-check) center /
|
|
780
|
+
opacity: 0;
|
|
781
|
+
-webkit-mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
782
|
+
mask: var(--xh-glyph-mark-check) center / 100% 100% no-repeat, var(--xh-glyph-mark-minus) center / 0 0 no-repeat;
|
|
783
|
+
/* 与列里的对号同一条淡变;离开半选时横杠留到淡出播完再换回勾 */
|
|
784
|
+
transition:
|
|
785
|
+
opacity var(--xh-motion-duration-micro) var(--xh-motion-ease-enter),
|
|
786
|
+
-webkit-mask-size 0s var(--xh-motion-duration-micro),
|
|
787
|
+
mask-size 0s var(--xh-motion-duration-micro);
|
|
724
788
|
}
|
|
725
789
|
|
|
726
790
|
[data-scope='cascader'][data-part='search-item'][data-state='checked']::after {
|
|
727
|
-
|
|
791
|
+
opacity: 1;
|
|
792
|
+
transition-delay: 0s;
|
|
728
793
|
}
|
|
729
794
|
|
|
730
795
|
[data-scope='cascader'][data-part='search-item'][data-state='indeterminate']::after {
|
|
731
|
-
|
|
732
|
-
-webkit-mask-
|
|
733
|
-
mask-
|
|
796
|
+
opacity: 1;
|
|
797
|
+
-webkit-mask-size: 0 0, 100% 100%;
|
|
798
|
+
mask-size: 0 0, 100% 100%;
|
|
799
|
+
transition-delay: 0s;
|
|
734
800
|
}
|
|
735
801
|
|
|
736
802
|
[data-scope='cascader'][data-part='search-item'][data-disabled]::after {
|
|
@@ -752,10 +818,8 @@
|
|
|
752
818
|
flex: 1 1 100%;
|
|
753
819
|
align-items: center;
|
|
754
820
|
justify-content: center;
|
|
755
|
-
min-inline-size: var(--xh-cascader-column-min-w, 7rem);
|
|
756
|
-
min-block-size: var(--xh-cascader-empty-min-h, 5rem);
|
|
757
821
|
padding: var(--xh-cascader-empty-p, var(--xh-space-3));
|
|
758
|
-
color: var(--xh-cascader-empty-fg, var(--xh-
|
|
822
|
+
color: var(--xh-cascader-empty-fg, var(--xh-fg-muted));
|
|
759
823
|
font-size: var(--xh-cascader-item-font-size, var(--xh-_cascader-font-size));
|
|
760
824
|
}
|
|
761
825
|
|
|
@@ -769,10 +833,9 @@
|
|
|
769
833
|
flex: 0 0 100%;
|
|
770
834
|
align-items: center;
|
|
771
835
|
justify-content: center;
|
|
772
|
-
|
|
773
|
-
min-block-size: var(--xh-cascader-loading-min-h, 5rem);
|
|
836
|
+
gap: var(--xh-_cascader-gap);
|
|
774
837
|
padding: var(--xh-cascader-loading-p, var(--xh-space-3));
|
|
775
|
-
color: var(--xh-cascader-loading-fg, var(--xh-
|
|
838
|
+
color: var(--xh-cascader-loading-fg, var(--xh-fg-muted));
|
|
776
839
|
font-size: var(--xh-cascader-loading-font-size, var(--xh-_cascader-font-size));
|
|
777
840
|
}
|
|
778
841
|
|
|
@@ -780,6 +843,41 @@
|
|
|
780
843
|
display: none;
|
|
781
844
|
}
|
|
782
845
|
|
|
846
|
+
/* 懒分支那一列:条目还没取回时列里只有一句次要文字(在途或失败),失败时下面跟一颗重试钮;
|
|
847
|
+
三块同一时刻至多露一种,露哪一块归连接层。文字的观感与整浮层的在途占位同一档 */
|
|
848
|
+
[data-scope='cascader'][data-part='branch-loading'],
|
|
849
|
+
[data-scope='cascader'][data-part='branch-error'] {
|
|
850
|
+
display: flex;
|
|
851
|
+
flex: none;
|
|
852
|
+
align-items: center;
|
|
853
|
+
justify-content: center;
|
|
854
|
+
padding-block: var(--xh-cascader-branch-status-py, var(--xh-space-3));
|
|
855
|
+
padding-inline: var(--xh-cascader-branch-status-px, var(--xh-_cascader-row-px));
|
|
856
|
+
color: var(--xh-cascader-branch-status-fg, var(--xh-material-frosted-fg-muted));
|
|
857
|
+
font-size: var(--xh-cascader-branch-status-font-size, var(--xh-_cascader-font-size));
|
|
858
|
+
text-align: center;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/* 重试钮是 Action Control 家族的 text ghost 档,盒与按压都归家族;这里只让它在列里居中 */
|
|
862
|
+
[data-scope='cascader'][data-part='branch-retry-trigger'] {
|
|
863
|
+
align-self: center;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
[data-scope='cascader'][data-part='branch-loading'][hidden],
|
|
867
|
+
[data-scope='cascader'][data-part='branch-error'][hidden],
|
|
868
|
+
[data-scope='cascader'][data-part='branch-retry-trigger'][hidden] {
|
|
869
|
+
display: none;
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
/* 首次加载:文案前一枚加载环,由加载环配方画(连接层投影 data-xh-loading-ring 与 data-loading),
|
|
873
|
+
直径取所在尺寸档的图标档 */
|
|
874
|
+
[data-scope='cascader'][data-part='loading']::before {
|
|
875
|
+
content: '';
|
|
876
|
+
flex: none;
|
|
877
|
+
inline-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
878
|
+
block-size: var(--xh-icon-size, var(--xh-glyph-size-md));
|
|
879
|
+
}
|
|
880
|
+
|
|
783
881
|
/* 底栏在场时浮层壳允许换行:列照旧并排在第一行,底栏占满一整行落在列下面。
|
|
784
882
|
没写底栏的浮层不命中这条,列多到放不下时仍是整体横向滚动 */
|
|
785
883
|
[data-scope='cascader'][data-part='content']:has(> [data-part='footer']) {
|
|
@@ -818,17 +916,35 @@
|
|
|
818
916
|
}
|
|
819
917
|
|
|
820
918
|
@media (forced-colors: active) {
|
|
821
|
-
/* 蒙版底色会被系统改成 Canvas 而消失;明确用系统前景保住箭头、对号与半选横线。
|
|
919
|
+
/* 蒙版底色会被系统改成 Canvas 而消失;明确用系统前景保住箭头、对号与半选横线。
|
|
920
|
+
按下与没被高亮时的悬停,家族把条目涂成 Highlight,字形跟着换 HighlightText。
|
|
921
|
+
触发器里的下拉箭头落在字段面上取 CanvasText,字段禁用时取 GrayText;
|
|
922
|
+
清除钮是按钮面,取 ButtonText,悬停与按下换 HighlightText,禁用取 GrayText */
|
|
822
923
|
[data-scope='cascader'][data-part='item'][data-branch]::after,
|
|
823
924
|
[data-scope='cascader'][data-part='item-indicator']:empty::before,
|
|
824
|
-
[data-scope='cascader'][data-part='search-item']::after
|
|
925
|
+
[data-scope='cascader'][data-part='search-item']::after,
|
|
926
|
+
[data-scope='cascader'][data-part='indicator']:empty::before {
|
|
825
927
|
forced-color-adjust: none;
|
|
826
928
|
background-color: CanvasText;
|
|
827
929
|
}
|
|
828
930
|
|
|
931
|
+
[data-scope='cascader'][data-part='clear-trigger']:empty::before {
|
|
932
|
+
forced-color-adjust: none;
|
|
933
|
+
background-color: ButtonText;
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
[data-scope='cascader'][data-part='item'][data-branch]:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after,
|
|
937
|
+
[data-scope='cascader'][data-part='item']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted])) [data-scope='cascader'][data-part='item-indicator']:empty::before,
|
|
938
|
+
[data-scope='cascader'][data-part='search-item']:not([aria-disabled='true'], [data-disabled], [aria-busy='true'], [data-error]):is(:active, [data-pressed], :hover:not(:focus-visible, [data-highlighted]))::after,
|
|
939
|
+
[data-scope='cascader'][data-part='clear-trigger']:not([data-disabled]):not([data-loading]):is(:hover, :active, [data-pressed]):empty::before {
|
|
940
|
+
background-color: HighlightText;
|
|
941
|
+
}
|
|
942
|
+
|
|
829
943
|
[data-scope='cascader'][data-part='item'][data-branch][data-disabled]::after,
|
|
830
944
|
[data-scope='cascader'][data-part='item-indicator'][data-disabled]:empty::before,
|
|
831
|
-
[data-scope='cascader'][data-part='search-item'][data-disabled]::after
|
|
945
|
+
[data-scope='cascader'][data-part='search-item'][data-disabled]::after,
|
|
946
|
+
[data-scope='cascader'][data-part='control'][data-disabled] [data-scope='cascader'][data-part='indicator']:empty::before,
|
|
947
|
+
[data-scope='cascader'][data-part='clear-trigger'][data-disabled]:empty::before {
|
|
832
948
|
background-color: GrayText;
|
|
833
949
|
}
|
|
834
950
|
}
|
package/css/checkbox-group.css
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
/* 定义 checkbox group 样式。 */
|
|
7
7
|
|
|
8
8
|
@import '../family/action-control.css';
|
|
9
|
+
@import '../family/check-mark.css';
|
|
10
|
+
@import '../family/choice-card.css';
|
|
9
11
|
|
|
10
12
|
@layer xihan.components {
|
|
11
13
|
/* 皮肤在场的标记:开发模式下按 scope 探一次,取不到就说明这份皮肤没被引入。 */
|
|
@@ -26,8 +28,9 @@
|
|
|
26
28
|
/* 作者塞进指示符槽的图标和皮肤画的兜底字形共用盒比例(与 checkbox 同一把尺);显式 icon-size 仍可覆盖 */
|
|
27
29
|
--xh-icon-size: var(--xh-checkbox-group-icon-size, var(--xh-_checkbox-group-glyph));
|
|
28
30
|
|
|
29
|
-
/*
|
|
30
|
-
|
|
31
|
+
/* 勾中的填色随语气走,与独立 Checkbox 同一支:选中态是小面积控件边界,取保证 3:1 的语气 control 色;
|
|
32
|
+
没写 data-tone 时退回品牌色 */
|
|
33
|
+
--xh-_checkbox-group-accent: var(--xh-_tone-border-control, var(--xh-bg-brand));
|
|
31
34
|
--xh-_checkbox-group-on-accent: var(--xh-_tone-on, var(--xh-fg-on-brand));
|
|
32
35
|
/* 方框是字段家族的控制盒(字段静息形态):透明底 + --xh-border-control 描边 + 无影,不消费海拔与顶光 */
|
|
33
36
|
--xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg, transparent);
|
|
@@ -71,6 +74,17 @@
|
|
|
71
74
|
align-items: center;
|
|
72
75
|
}
|
|
73
76
|
|
|
77
|
+
/* card 形态:卡片撑满竖排的一列;横排时各卡等分一行、按内容等高,窄到放不下两张就折到下一行 */
|
|
78
|
+
[data-scope='checkbox-group'][data-part='root'][data-variant='card'] {
|
|
79
|
+
align-items: stretch;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
[data-scope='checkbox-group'][data-part='root'][data-variant='card'][data-orientation='horizontal']
|
|
83
|
+
> [data-scope='checkbox-group'][data-part='item'] {
|
|
84
|
+
flex: 1 1 0;
|
|
85
|
+
min-inline-size: min(var(--xh-control-min-w), 100%);
|
|
86
|
+
}
|
|
87
|
+
|
|
74
88
|
/* 集合标题:14 / 500 / fg-muted,字号不随 size 档 */
|
|
75
89
|
[data-scope='checkbox-group'][data-part='label'] {
|
|
76
90
|
color: var(--xh-checkbox-group-label-fg, var(--xh-fg-muted));
|
|
@@ -122,7 +136,7 @@
|
|
|
122
136
|
家族的 :hover / 按压块不排 readonly,只能从槽上收回;排掉禁用项是因为这条选择器权重高过家族的禁用块,
|
|
123
137
|
不排就会把 not-allowed 覆盖回 default */
|
|
124
138
|
[data-scope='checkbox-group'][data-part='root'][data-readonly]
|
|
125
|
-
[data-scope='checkbox-group'][data-part='item']:not([data-disabled]) {
|
|
139
|
+
[data-scope='checkbox-group'][data-part='item']:not([data-disabled]):not([data-xh-choice-card]) {
|
|
126
140
|
--xh-action-bg-hover: transparent;
|
|
127
141
|
--xh-action-bg-pressed: transparent;
|
|
128
142
|
--xh-action-cursor-rest: default;
|
|
@@ -203,67 +217,9 @@
|
|
|
203
217
|
--xh-_checkbox-group-bg: var(--xh-checkbox-group-indicator-bg-checked-pressed, var(--xh-_tone-active, var(--xh-bg-brand-active)));
|
|
204
218
|
}
|
|
205
219
|
|
|
206
|
-
/*
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
display: inline-block;
|
|
210
|
-
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
211
|
-
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
212
|
-
vertical-align: var(--xh-glyph-baseline-shift);
|
|
213
|
-
background-color: currentColor;
|
|
214
|
-
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
215
|
-
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/* 全选格的三态:checked 打勾、indeterminate 打横杠、unchecked 留空。
|
|
219
|
-
indeterminate 就是读屏听到的 aria-checked=mixed,两者同源,样式只认 data-state。
|
|
220
|
-
|
|
221
|
-
字形走 ::after 而不是画方框的那颗 ::before:mask 会把所在元素的描边与底色一并裁成
|
|
222
|
-
字形的轮廓,写在 ::before 上就等于把方框本身裁没了,只剩一枚白勾。条目那一侧是
|
|
223
|
-
真实节点当方框、它的 ::before 当字形的两层结构,这里 anatomy 到 trigger 为止、
|
|
224
|
-
没有第二个节点,只能用第二个伪元素补上那一层。
|
|
225
|
-
方框是行首那颗 ::before、宽度即指示符尺寸,所以字形按「盒与字形的宽度差之半」
|
|
226
|
-
内推即落在圆心;纵向靠 inset-block: 0 + margin-block: auto 居中。
|
|
227
|
-
font-size 与 ::before 同值,--xh-icon-size 的 1em 兜底才和条目那侧量得一样大 */
|
|
228
|
-
[data-scope='checkbox-group'][data-part='select-all-trigger'][data-state='checked']::after {
|
|
229
|
-
content: '';
|
|
230
|
-
position: absolute;
|
|
231
|
-
inset-block: 0;
|
|
232
|
-
inset-inline-start: 0;
|
|
233
|
-
margin-block: auto;
|
|
234
|
-
margin-inline-start: calc(
|
|
235
|
-
(
|
|
236
|
-
var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box)) -
|
|
237
|
-
var(--xh-icon-size, var(--xh-glyph-size-text))
|
|
238
|
-
) / 2
|
|
239
|
-
);
|
|
240
|
-
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
241
|
-
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
242
|
-
background-color: var(--xh-checkbox-group-indicator-fg, var(--xh-_checkbox-group-on-accent));
|
|
243
|
-
font-size: var(--xh-checkbox-group-indicator-font-size, var(--xh-_checkbox-group-glyph));
|
|
244
|
-
-webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
245
|
-
mask: var(--xh-glyph-mark-check) center / contain no-repeat;
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
[data-scope='checkbox-group'][data-part='select-all-trigger'][data-state='indeterminate']::after {
|
|
249
|
-
content: '';
|
|
250
|
-
position: absolute;
|
|
251
|
-
inset-block: 0;
|
|
252
|
-
inset-inline-start: 0;
|
|
253
|
-
margin-block: auto;
|
|
254
|
-
margin-inline-start: calc(
|
|
255
|
-
(
|
|
256
|
-
var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box)) -
|
|
257
|
-
var(--xh-icon-size, var(--xh-glyph-size-text))
|
|
258
|
-
) / 2
|
|
259
|
-
);
|
|
260
|
-
inline-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
261
|
-
block-size: var(--xh-icon-size, var(--xh-glyph-size-text));
|
|
262
|
-
background-color: var(--xh-checkbox-group-indicator-fg, var(--xh-_checkbox-group-on-accent));
|
|
263
|
-
font-size: var(--xh-checkbox-group-indicator-font-size, var(--xh-_checkbox-group-glyph));
|
|
264
|
-
-webkit-mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
265
|
-
mask: var(--xh-glyph-mark-minus) center / contain no-repeat;
|
|
266
|
-
}
|
|
220
|
+
/* 方框里的勾与全选格的三态标记(checked 打勾、indeterminate 打横杠、unchecked 留空)由勾选标记配方画:
|
|
221
|
+
常驻、按状态淡变并轻缩放。条目的方框是真实节点,标记是它的 ::before;全选格的 anatomy 到 trigger
|
|
222
|
+
为止,方框只能是行首那颗 ::before,标记是 ::after、叠在方框正中——两支桥接槽写在 trigger 上 */
|
|
267
223
|
|
|
268
224
|
/* 校验失败标在每个方框上:root 上的 data-invalid 是唯一出处,条目自己不带这个属性 */
|
|
269
225
|
[data-scope='checkbox-group'][data-part='root'][data-invalid]
|
|
@@ -283,11 +239,43 @@
|
|
|
283
239
|
color: var(--xh-checkbox-group-indicator-fg-disabled, var(--xh-fg-disabled));
|
|
284
240
|
}
|
|
285
241
|
|
|
242
|
+
/* 全选格的标记画在 ::after 上,禁用色经桥接槽给,与条目方框里置灰的勾同色 */
|
|
243
|
+
[data-scope='checkbox-group'][data-part='select-all-trigger'][data-disabled] {
|
|
244
|
+
--xh-check-mark-fg: var(--xh-checkbox-group-indicator-fg-disabled, var(--xh-fg-disabled));
|
|
245
|
+
}
|
|
246
|
+
|
|
286
247
|
[data-scope='checkbox-group'][data-part='item-text'] {
|
|
287
248
|
color: inherit;
|
|
288
249
|
user-select: none;
|
|
289
250
|
}
|
|
290
251
|
|
|
252
|
+
/* 卡片的文案是卡的标题:取标签字重,与说明拉开层级 */
|
|
253
|
+
[data-scope='checkbox-group'][data-part='item'][data-xh-choice-card] > [data-scope='checkbox-group'][data-part='item-text'] {
|
|
254
|
+
font-weight: var(--xh-checkbox-group-card-title-font-weight, var(--xh-text-label-weight));
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/* 说明是次级文字:13 / fg-muted / 正文行高,不随选中与语气换色;落在文案下方同一列。
|
|
258
|
+
列表形态的条目带了说明时同样排成两行,行首的方框对齐第一行 */
|
|
259
|
+
[data-scope='checkbox-group'][data-part='item-description'] {
|
|
260
|
+
grid-column: 2;
|
|
261
|
+
color: var(--xh-checkbox-group-item-description-fg, var(--xh-fg-muted));
|
|
262
|
+
font-size: var(--xh-checkbox-group-item-description-font-size, var(--xh-text-secondary-size));
|
|
263
|
+
font-weight: var(--xh-font-weight-regular);
|
|
264
|
+
line-height: var(--xh-leading-normal);
|
|
265
|
+
user-select: none;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
[data-scope='checkbox-group'][data-part='item']:not([data-xh-choice-card]):has(> [data-scope='checkbox-group'][data-part='item-description']) {
|
|
269
|
+
display: grid;
|
|
270
|
+
grid-template-columns: auto minmax(0, 1fr);
|
|
271
|
+
align-items: center;
|
|
272
|
+
row-gap: var(--xh-checkbox-group-item-row-gap, var(--xh-space-1));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
[data-scope='checkbox-group'][data-part='item'][data-disabled] > [data-scope='checkbox-group'][data-part='item-description'] {
|
|
276
|
+
color: var(--xh-checkbox-group-item-description-fg-disabled, var(--xh-fg-disabled));
|
|
277
|
+
}
|
|
278
|
+
|
|
291
279
|
/* 全选格与条目同形(接 Action Control row 档 ghost、xs 命中地板、按下只换面不缩放,方框读宿主 host 槽),
|
|
292
280
|
但字重加一档,读起来才不像又一个普通选项。它是普通元素而非原生控件(三态只有非原生控件表达得出),
|
|
293
281
|
家族的禁用块同样只读 data-disabled。position 是给叠在方框上的那颗字形 ::after 当定位基准 */
|
|
@@ -308,6 +296,9 @@
|
|
|
308
296
|
/* 行自己的面已由上面两支钉住,host 槽只对方框(::before)生效:200 → 300 */
|
|
309
297
|
--xh-action-host-bg-hover: var(--xh-_checkbox-group-host-bg-hover);
|
|
310
298
|
--xh-action-host-bg-pressed: var(--xh-_checkbox-group-host-bg-pressed);
|
|
299
|
+
/* 勾选标记叠在行首方框正中:方框边长与标记色交给配方 */
|
|
300
|
+
--xh-check-mark-box-size: var(--xh-checkbox-group-indicator-size, var(--xh-_checkbox-group-box));
|
|
301
|
+
--xh-check-mark-fg: var(--xh-checkbox-group-indicator-fg, var(--xh-_checkbox-group-on-accent));
|
|
311
302
|
|
|
312
303
|
position: relative;
|
|
313
304
|
inline-size: auto;
|
|
@@ -327,18 +318,12 @@
|
|
|
327
318
|
}
|
|
328
319
|
|
|
329
320
|
/* 家族 row 档在粗指针下用 ::after 把热区扩到 44px 高:条目按 24px 行 + 8px 间距密排,热区会压进相邻条目 2px、
|
|
330
|
-
指针落错行,A 档 24px 由 xs 地板保住(两者都不在 coarse-target 的 B
|
|
331
|
-
|
|
321
|
+
指针落错行,A 档 24px 由 xs 地板保住(两者都不在 coarse-target 的 B 档名单);全选格的 ::after 是叠在方框上的
|
|
322
|
+
勾选标记,热区由勾选标记配方逐项钉回 */
|
|
332
323
|
@media (pointer: coarse) {
|
|
333
|
-
[data-scope='checkbox-group'][data-part='item']::after
|
|
334
|
-
[data-scope='checkbox-group'][data-part='select-all-trigger']::after {
|
|
324
|
+
[data-scope='checkbox-group'][data-part='item']::after {
|
|
335
325
|
min-block-size: 0;
|
|
336
326
|
}
|
|
337
|
-
|
|
338
|
-
[data-scope='checkbox-group'][data-part='select-all-trigger']:is([data-state='checked'], [data-state='indeterminate'])::after {
|
|
339
|
-
min-block-size: 0;
|
|
340
|
-
translate: none;
|
|
341
|
-
}
|
|
342
327
|
}
|
|
343
328
|
|
|
344
329
|
/* 表单出口:连接层已经把整套视觉隐藏写进内联 style(absolute + 1px + clip-path),
|
|
@@ -357,22 +342,7 @@
|
|
|
357
342
|
display: none;
|
|
358
343
|
}
|
|
359
344
|
|
|
360
|
-
|
|
361
|
-
/* 真实描边保留方框,系统前景重绘状态字形。 */
|
|
362
|
-
[data-scope='checkbox-group'][data-part='indicator'][data-state='checked']:empty::before,
|
|
363
|
-
[data-scope='checkbox-group'][data-part='select-all-trigger']:is([data-state='checked'], [data-state='indeterminate'])::after {
|
|
364
|
-
background-color: CanvasText;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
[data-scope='checkbox-group'][data-part='item'][data-disabled]
|
|
368
|
-
[data-scope='checkbox-group'][data-part='indicator'][data-state='checked']:empty::before,
|
|
369
|
-
[data-scope='checkbox-group'][data-part='select-all-trigger'][data-disabled]:is(
|
|
370
|
-
[data-state='checked'],
|
|
371
|
-
[data-state='indeterminate']
|
|
372
|
-
)::after {
|
|
373
|
-
background-color: GrayText;
|
|
374
|
-
}
|
|
375
|
-
}
|
|
345
|
+
/* 强制色:真实描边保留方框,状态字形的系统前景由勾选标记配方给 */
|
|
376
346
|
|
|
377
347
|
@media print {
|
|
378
348
|
[data-scope='checkbox-group'][data-part='indicator'][data-state='checked'],
|