@xihan-ui/styles 2.0.0 → 2.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.
Files changed (101) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/component-tokens.d.ts +0 -15
  3. package/components.tokens.json +65 -396
  4. package/css/accordion.css +6 -6
  5. package/css/alert.css +2 -2
  6. package/css/anchor.css +3 -3
  7. package/css/approval.css +8 -8
  8. package/css/back-top.css +2 -2
  9. package/css/badge.css +1 -1
  10. package/css/breadcrumb.css +1 -1
  11. package/css/button-group.css +1 -1
  12. package/css/button.css +2 -2
  13. package/css/calendar-picker.css +8 -8
  14. package/css/calendar-range-picker.css +9 -9
  15. package/css/card.css +1 -1
  16. package/css/carousel.css +6 -6
  17. package/css/cascader.css +3 -5
  18. package/css/checkbox-group.css +10 -10
  19. package/css/checkbox.css +5 -5
  20. package/css/clipboard.css +4 -4
  21. package/css/code-view.css +2 -2
  22. package/css/collapsible.css +4 -4
  23. package/css/color-picker.css +2 -4
  24. package/css/color-slider.css +4 -4
  25. package/css/color-swatch-picker.css +5 -5
  26. package/css/combobox.css +2 -4
  27. package/css/command.css +3 -5
  28. package/css/context-menu.css +4 -6
  29. package/css/date-picker.css +0 -2
  30. package/css/date-range-picker.css +0 -2
  31. package/css/descriptions.css +1 -1
  32. package/css/dialog.css +5 -7
  33. package/css/diff-view.css +4 -4
  34. package/css/download-trigger.css +3 -3
  35. package/css/drawer.css +9 -15
  36. package/css/empty-state.css +1 -1
  37. package/css/field.css +1 -1
  38. package/css/fieldset.css +1 -1
  39. package/css/file-upload.css +1 -1
  40. package/css/float-button.css +3 -3
  41. package/css/floating-panel.css +6 -8
  42. package/css/form.css +3 -3
  43. package/css/heatmap.css +1 -1
  44. package/css/hover-card.css +2 -4
  45. package/css/image-cropper.css +2 -2
  46. package/css/image-viewer.css +2 -4
  47. package/css/infinite-scroll.css +2 -2
  48. package/css/input-group.css +2 -2
  49. package/css/json-viewer.css +5 -5
  50. package/css/kbd.css +1 -1
  51. package/css/layout.css +3 -3
  52. package/css/list.css +1 -1
  53. package/css/listbox.css +26 -17
  54. package/css/log.css +2 -2
  55. package/css/mention.css +0 -2
  56. package/css/menu.css +5 -7
  57. package/css/menubar.css +6 -8
  58. package/css/message-feed.css +2 -2
  59. package/css/navigation-menu.css +5 -7
  60. package/css/notification.css +3 -3
  61. package/css/page-header.css +1 -1
  62. package/css/pagination.css +5 -7
  63. package/css/popconfirm.css +6 -8
  64. package/css/popover.css +5 -7
  65. package/css/prompt-input.css +1 -1
  66. package/css/question-flow.css +7 -7
  67. package/css/radio-group.css +9 -9
  68. package/css/rating.css +4 -4
  69. package/css/reasoning.css +5 -5
  70. package/css/reset.css +1 -1
  71. package/css/segmented.css +7 -7
  72. package/css/select.css +2 -4
  73. package/css/side-nav.css +4 -6
  74. package/css/signature-pad.css +7 -7
  75. package/css/slider.css +5 -5
  76. package/css/sortable.css +1 -1
  77. package/css/splitter.css +1 -1
  78. package/css/steps.css +10 -10
  79. package/css/switch.css +8 -8
  80. package/css/table.css +11 -11
  81. package/css/tabs.css +12 -12
  82. package/css/tag-group.css +39 -35
  83. package/css/tag.css +2 -2
  84. package/css/time-picker.css +0 -2
  85. package/css/time-range-picker.css +0 -2
  86. package/css/toast.css +3 -3
  87. package/css/toggle-group.css +4 -4
  88. package/css/toggle.css +2 -2
  89. package/css/tool-call.css +5 -5
  90. package/css/toolbar.css +4 -4
  91. package/css/tooltip.css +4 -6
  92. package/css/tour.css +7 -9
  93. package/css/transfer.css +6 -6
  94. package/css/tree-select.css +3 -5
  95. package/css/tree.css +46 -99
  96. package/css/virtualizer.css +1 -1
  97. package/family/collection-item.css +61 -12
  98. package/family/motion.css +1 -1
  99. package/index.css +506 -553
  100. package/index.unlayered.css +506 -553
  101. package/package.json +2 -2
@@ -21,7 +21,7 @@
21
21
  皮肤只管层级、配色、圆角、阴影、把手的摆放与状态表现。 */
22
22
 
23
23
  [data-scope='floating-panel'][data-part='root'] {
24
- /* 作者塞进面板里的图标按控件档取(§6.5);标题栏上的按钮另由家族配方按各自的档下发字形尺 */
24
+ /* 作者塞进面板里的图标按控件档取;标题栏上的按钮另由家族配方按各自的档下发字形尺 */
25
25
  --xh-icon-size: var(--xh-floating-panel-icon-size, var(--xh-glyph-size-md));
26
26
 
27
27
  /* 面板本身是 fixed 定位,root 只是作者那棵树里的容器,不参与排布 */
@@ -39,7 +39,7 @@
39
39
  }
40
40
 
41
41
  /*
42
- * 开合触发器是页面上的独立文字按钮(§9.1):盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
42
+ * 开合触发器是页面上的独立文字按钮:盒型、md 档几何、outline 四态面、0.97 按压并换底与粗指针命中区
43
43
  * 由家族配方按连接层投影的 data-xh-action-variant / -size 给出(此前只缩放不换底)。这里只把公开槽桥接到
44
44
  * 矩阵之前(使用者槽 → 形态矩阵 → 家族缺省)与几何槽映射。
45
45
  */
@@ -84,9 +84,7 @@
84
84
  面板整棵子树都在 positioner 底下,它一收就不生成盒子,退场动画一帧都播不出来。
85
85
  真正的收起由宿主在退场结束后落成内联 display:none。 */
86
86
 
87
- /* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
88
87
  [data-scope='floating-panel'][data-part='positioner'][data-state='open'] {
89
- will-change: opacity, scale;
90
88
  animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
91
89
  }
92
90
 
@@ -159,7 +157,7 @@
159
157
  display: none;
160
158
  }
161
159
 
162
- /* 浮层内标题(§6.4):14 / 600 */
160
+ /* 浮层内标题:14 / 600 */
163
161
  [data-scope='floating-panel'][data-part='title'] {
164
162
  margin: 0;
165
163
  flex: 1 1 auto;
@@ -276,7 +274,7 @@
276
274
 
277
275
  /*
278
276
  * —— 标题栏上的按钮 ——
279
- * 形态钮与关闭钮是标题栏上的单图标钮(§9.1):正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针
277
+ * 形态钮与关闭钮是标题栏上的单图标钮:正方盒、sm 档几何、ghost 四态面、0.97 按压并换底与粗指针
280
278
  * 命中区由家族配方给出——磨砂白面上走画布承载阶梯悬停 --xh-bg-subtle(100)→ 按下 --xh-bg-subtle-hover(200),
281
279
  * 焦点面透明吃库环。这里只把公开槽桥接到矩阵之前(使用者槽 → 形态矩阵 → 家族缺省);
282
280
  * 静息前景取磨砂面的 muted 字色,悬停 / 按下回到 fg-default。
@@ -309,7 +307,7 @@
309
307
  display: none;
310
308
  }
311
309
 
312
- /* 当前形态的那颗钮是按下的开关(aria-pressed),无滑块开关的 on 态取品牌淡底(§7.3):
310
+ /* 当前形态的那颗钮是按下的开关(aria-pressed),无滑块开关的 on 态取品牌淡底:
313
311
  rest 12% → hover 20% → pressed 28%,前景一律 --xh-fg-on-brand-subtle(对比度由该令牌承担);
314
312
  淡底不是实心面,焦点吃库环 */
315
313
  [data-scope='floating-panel'][data-part='window-state-trigger'][data-state='on'] {
@@ -330,7 +328,7 @@
330
328
  }
331
329
  }
332
330
 
333
- /* 正文是浮在页面之上的 Overlay 滚动面(§6.6):原生细条由 reset 层统一给,滚到头不把页面一起带走;
331
+ /* 正文是浮在页面之上的 Overlay 滚动面:原生细条由 reset 层统一给,滚到头不把页面一起带走;
334
332
  内容高度不动态变化,不写 scrollbar-gutter */
335
333
  [data-scope='floating-panel'][data-part='body'] {
336
334
  flex: 1 1 auto;
package/css/form.css CHANGED
@@ -187,7 +187,7 @@
187
187
  color: var(--xh-form-summary-fg, var(--xh-fg-danger));
188
188
  font-size: var(--xh-form-summary-font-size, var(--xh-text-body-size));
189
189
  line-height: var(--xh-leading-normal);
190
- /* 静态反馈面:边界由描边承担,不带落影(§8 solid 无影) */
190
+ /* 静态反馈面:边界由描边承担,不带落影(solid 无影) */
191
191
  box-shadow: var(--xh-form-summary-shadow, none);
192
192
  }
193
193
 
@@ -207,7 +207,7 @@
207
207
  animation: xh-form-summary-enter var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
208
208
  }
209
209
 
210
- /* 摘要里的每一条是一个真链接,指向对应字段容器。铺满一行的集合行(§9.2):悬停 / 按下只换面不缩放,
210
+ /* 摘要里的每一条是一个真链接,指向对应字段容器。铺满一行的集合行:悬停 / 按下只换面不缩放,
211
211
  底面坐在摘要的 surface 白底上,走白底承载阶梯 100 → 200;换面走按压时间线,释放回 release 档 */
212
212
  [data-scope='form'][data-part='error-summary-item'] {
213
213
  display: block;
@@ -303,7 +303,7 @@
303
303
 
304
304
  /* 两颗按钮是离散动作控件:盒几何、悬停 / 按下与 0.97 按压、焦点环、禁用面全由 Action Control 的 text 档给,
305
305
  组件只映射既有使用者槽。提交走 solid 档:表单提交是这一组里的主要动作,与 Button 缺省同为品牌实心;
306
- 重置走 outline 档:非 Button 的触发器缺省中性描边(§7.2.2)。两颗共用的几何与字号写在一起 */
306
+ 重置走 outline 档:非 Button 的触发器缺省中性描边。两颗共用的几何与字号写在一起 */
307
307
  [data-scope='form'][data-part='submit-trigger'],
308
308
  [data-scope='form'][data-part='reset-trigger'] {
309
309
  --xh-action-visual-size: var(--xh-form-trigger-h, var(--xh-_action-profile-visual-size));
package/css/heatmap.css CHANGED
@@ -323,7 +323,7 @@
323
323
  padding-block: var(--xh-heatmap-tooltip-py, var(--xh-space-1));
324
324
  padding-inline: var(--xh-heatmap-tooltip-px, var(--xh-space-2));
325
325
  border-radius: var(--xh-heatmap-tooltip-radius, var(--xh-shape-control));
326
- /* 与 Tooltip 同一副反白气泡:任何浮层都得有一圈非透明描边(§8.4),描边从字色里兑两成,
326
+ /* 与 Tooltip 同一副反白气泡:任何浮层都得有一圈非透明描边,描边从字色里兑两成,
327
327
  深浅主题与语气换色时跟着字色走;影走 frosted 紧凑档,与 Tooltip 的 content 同深 */
328
328
  border: var(--xh-stroke-thin) solid var(--xh-heatmap-tooltip-border, color-mix(in oklab, var(--xh-heatmap-tooltip-fg, var(--xh-bg-surface)) 20%, transparent));
329
329
  background: var(--xh-heatmap-tooltip-bg, var(--xh-fg-default));
@@ -110,7 +110,7 @@
110
110
  /* 内容由作者给,长度不可预知:不限高就整块伸出视口且滚不到 */
111
111
  max-block-size: min(var(--xh-hover-card-max-h, var(--xh-overlay-max-h)), var(--xh-_hover-card-available-h));
112
112
  overflow-y: auto;
113
- /* 浮在页面之上的 Overlay 滚动面(§6.6):滚到头不把页面一起带走 */
113
+ /* 浮在页面之上的 Overlay 滚动面:滚到头不把页面一起带走 */
114
114
  overscroll-behavior: contain;
115
115
  padding-block: var(--xh-hover-card-py, var(--xh-_hover-card-pad));
116
116
  padding-inline: var(--xh-hover-card-px, var(--xh-_hover-card-pad));
@@ -146,8 +146,6 @@
146
146
 
147
147
  [data-scope='hover-card'][data-part='content'][data-state='open'] {
148
148
  animation: xh-overlay-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
149
- /* 只在开着的这一档挂:合成层随 data-state 一起收走,收起后不再占着 */
150
- will-change: opacity, scale, translate;
151
149
  }
152
150
 
153
151
  /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
@@ -175,7 +173,7 @@
175
173
  color: var(--xh-hover-card-title-fg, var(--xh-fg-default));
176
174
  }
177
175
 
178
- /* 说明文字走说明档(§6.4):13px + fg-muted */
176
+ /* 说明文字走说明档:13px + fg-muted */
179
177
  [data-scope='hover-card'][data-part='description'] {
180
178
  margin: 0;
181
179
  font-size: var(--xh-hover-card-description-font-size, var(--xh-text-secondary-size));
@@ -61,7 +61,7 @@
61
61
  }
62
62
 
63
63
  /* 圆形裁切取 circle 档(50%):shape 的固定长度档画出来是胶囊不是椭圆,
64
- 裁切框的宽高由数据决定、两边通常不等长,只有百分比才随框变成椭圆;圆角只能来自语义形状令牌(§6.3) */
64
+ 裁切框的宽高由数据决定、两边通常不等长,只有百分比才随框变成椭圆;圆角只能来自语义形状令牌 */
65
65
  [data-scope='image-cropper'][data-part='crop-area'][data-shape='round'] {
66
66
  --xh-_image-cropper-corner-radius: var(--xh-shape-circle);
67
67
 
@@ -145,7 +145,7 @@
145
145
  content: '';
146
146
  }
147
147
 
148
- /* 把手静息是白面(bg-surface),悬停从同一语义面派生一档(§7.2 第 8 条),不切到品牌淡底;拖动中才是品牌实心 */
148
+ /* 把手静息是白面(bg-surface),悬停从同一语义面派生一档,不切到品牌淡底;拖动中才是品牌实心 */
149
149
  [data-scope='image-cropper'][data-part='crop-handle']:hover:not([data-disabled], [data-readonly]) {
150
150
  --xh-_image-cropper-handle-color: var(--xh-image-cropper-handle-bg-hover, var(--xh-bg-subtle));
151
151
  }
@@ -75,9 +75,7 @@
75
75
  color: var(--xh-image-viewer-fg, var(--xh-color-neutral-0));
76
76
  }
77
77
 
78
- /* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
79
78
  [data-scope='image-viewer'][data-part='content'][data-state='open'] {
80
- will-change: opacity;
81
79
  animation: xh-fade-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter);
82
80
  }
83
81
 
@@ -135,7 +133,7 @@
135
133
  四件都钉在铺满视口的那一层的边上,贴边一律与安全区取大的一头:刘海、圆角与
136
134
  底部横条压住的那一段由系统给出,贴边比它窄时钮会被切掉一角;桌面上 env() 恒为 0。
137
135
  安全区只有物理方向的四个名字,行内轴上两侧同取较宽的那一段,RTL 下不会翻错边。
138
- 工具条是容器、计数是一行字的气泡,各按身份取圆角(surface / control,§6.3),
136
+ 工具条是容器、计数是一行字的气泡,各按身份取圆角(surface / control),
139
137
  --xh-image-viewer-overlay-radius 仍是两者共用的使用者入口;翻页钮的面走下面的桥接槽 */
140
138
  [data-scope='image-viewer'][data-part='toolbar'],
141
139
  [data-scope='image-viewer'][data-part='counter'] {
@@ -190,7 +188,7 @@
190
188
  font-size: var(--xh-text-secondary-size);
191
189
  }
192
190
 
193
- /* 两颗翻页钮:浮在图上的单图标圆钮,接 Action Control floating 档 md(48px,正方盒取 circle,§6.3)。
191
+ /* 两颗翻页钮:浮在图上的单图标圆钮,接 Action Control floating 档 md(48px,正方盒取 circle)。
194
192
  面桥接到自家深色 chrome:跟的是图上那层半透明深底不是页面底色,所以不取 frosted 缺省面,
195
193
  也不取语义档的 --xh-bg-subtle-*;到头时是原生 disabled,压不动的东西不给回应 */
196
194
  [data-scope='image-viewer'][data-part='prev-trigger'],
@@ -38,11 +38,11 @@
38
38
 
39
39
  /*
40
40
  * 取下一页的按钮:与哨兵同一条通路的键盘入口,摆在列表末尾自成一行——铺满一行的独立动作条目,
41
- * 接 Action Control 的 row 档、outline 形态(§9.2):宽度由容器给、高度随内容、按下只换面不缩放;
41
+ * 接 Action Control 的 row 档、outline 形态:宽度由容器给、高度随内容、按下只换面不缩放;
42
42
  * 盒几何、中性描边与透明底、悬停 / 按下 / 禁用面、焦点环与粗指针热区全由家族给,
43
43
  * 白底承载 hover 100 → pressed 200。这里只把使用者槽映射到桥接槽,并把文案居中:
44
44
  * 它是一行里唯一的东西,靠起始缘会像一条没对齐的列表项。
45
- * 行高不吃家族的单行档:row 档允许换行、高度随内容,折行的文案走正文行高(§6.4)
45
+ * 行高不吃家族的单行档:row 档允许换行、高度随内容,折行的文案走正文行高
46
46
  */
47
47
  [data-scope='infinite-scroll'][data-part='load-more-trigger'] {
48
48
  --xh-action-gap: var(--xh-infinite-scroll-load-more-gap, var(--xh-_action-profile-gap));
@@ -23,7 +23,7 @@
23
23
  --xh-_input-group-font-size: var(--xh-control-font-md);
24
24
  --xh-_input-group-bg: transparent;
25
25
  --xh-_input-group-bg-hover: color-mix(in oklab, var(--xh-bg-subtle) 45%, transparent);
26
- /* 组壳按字段外壳画 outline 描边(§8.3):静息 --xh-border-control、悬停升 -hover、聚焦换 -focus,无影 */
26
+ /* 组壳按字段外壳画 outline 描边:静息 --xh-border-control、悬停升 -hover、聚焦换 -focus,无影 */
27
27
  --xh-_input-group-border: var(--xh-border-control);
28
28
  --xh-_input-group-border-hover: var(--xh-border-control-hover);
29
29
  --xh-_input-group-border-focus: var(--xh-border-control-focus);
@@ -56,7 +56,7 @@
56
56
  transition: border-color var(--xh-motion-duration-micro) var(--xh-motion-ease-enter);
57
57
  }
58
58
 
59
- /* subtle:淡底顶替描边表达边界,描边只退成透明而不去掉;悬停浮出 --xh-border-control(§8.3) */
59
+ /* subtle:淡底顶替描边表达边界,描边只退成透明而不去掉;悬停浮出 --xh-border-control */
60
60
  [data-scope='input-group'][data-part='root'][data-variant='subtle'] {
61
61
  --xh-_input-group-bg: var(--xh-bg-subtle);
62
62
  --xh-_input-group-bg-hover: var(--xh-bg-subtle-hover);
@@ -14,7 +14,7 @@
14
14
  /* 缺省态(md 档)。等宽字体让层级缩进与值的长度对得齐。
15
15
  逐类型配色走 --xh-syntax-* 语法令牌,与代码块的记号色同源、随主题明暗切换。 */
16
16
  [data-scope='json-viewer'][data-part='root'] {
17
- /* 作者放进空态格里的图标按档取尺,缺省 md,随 data-size 换档(§6.5)。
17
+ /* 作者放进空态格里的图标按档取尺,缺省 md,随 data-size 换档。
18
18
  查看器自绘的状态字形(分支行首的展开方向 chevron)不读这支:它是指示符,与所在的把手盒同走
19
19
  --xh-control-indicator-* 一族——branch-trigger 在自己身上把 --xh-icon-size 改接到盒的尺 */
20
20
  --xh-icon-size: var(--xh-json-viewer-icon-size, var(--xh-glyph-size-md));
@@ -35,7 +35,7 @@
35
35
  display: none;
36
36
  }
37
37
 
38
- /* 面画在两档容器与空态格上,root 只是壳。三档按 §8.3 边界三选一:outline 即基础规则
38
+ /* 面画在两档容器与空态格上,root 只是壳。三档按边界三选一:outline 即基础规则
39
39
  (--xh-border-default 描边 + surface 底 + 无影);淡底档描边透明、底换 subtle;
40
40
  无框档边框留着但透明——去掉外框不会让行的位置跳一格 */
41
41
  [data-scope='json-viewer'][data-part='root'][data-variant='subtle']
@@ -66,7 +66,7 @@
66
66
  }
67
67
 
68
68
  /* 常驻容器不是浮层:两轴都可能溢出——深层缩进往行首方向推、长字符串往行尾伸;
69
- 页内结构容器走 reset 层的原生细条(§6.6),不写 overscroll */
69
+ 页内结构容器走 reset 层的原生细条,不写 overscroll */
70
70
  [data-scope='json-viewer'][data-part='tree'] {
71
71
  display: flex;
72
72
  flex-direction: column;
@@ -154,7 +154,7 @@
154
154
  user-select: none;
155
155
  }
156
156
 
157
- /* 按下只换面不缩放:白底承载 hover 100 → pressed 200(§7.2 / §9.2 集合行不允许零反馈);
157
+ /* 按下只换面不缩放:白底承载 hover 100 → pressed 200(集合行不允许零反馈);
158
158
  指针按住由 :active 表出,Space / Enter 与触屏按住由 Headless 投影 data-pressed,三种输入同一副面 */
159
159
  [data-scope='json-viewer'][data-part='branch-control']:not([data-disabled]):is(:active, [data-pressed]) {
160
160
  background: var(--xh-json-viewer-row-bg-active, var(--xh-bg-subtle-hover));
@@ -214,7 +214,7 @@
214
214
  }
215
215
 
216
216
  /* 展开箭头与勾选标记同宽,两种行的文字起点才对得齐。
217
- 盒里的 chevron 是指示符(§6.5):与盒同边长,--xh-icon-size 在自己身上改接到盒的尺——
217
+ 盒里的 chevron 是指示符:与盒同边长,--xh-icon-size 在自己身上改接到盒的尺——
218
218
  root 那支只管作者图标的 --xh-json-viewer-icon-size 不流进来,按图标档取的 20px 会比 16px 的盒还大;
219
219
  branch-indicator 由适配器固定渲染在这颗把手里,继承即可 */
220
220
  [data-scope='json-viewer'][data-part='branch-trigger'] {
package/css/kbd.css CHANGED
@@ -25,7 +25,7 @@
25
25
  background: var(--xh-kbd-bg, var(--xh-bg-subtle));
26
26
  color: var(--xh-kbd-fg, var(--xh-fg-muted));
27
27
  font-family: var(--xh-kbd-font, inherit);
28
- /* 快捷键是次级标注,字号取 caption 档(§6.4) */
28
+ /* 快捷键是次级标注,字号取 caption 档 */
29
29
  font-size: var(--xh-kbd-font-size, var(--xh-text-caption-size));
30
30
  font-weight: var(--xh-kbd-font-weight, var(--xh-font-weight-medium));
31
31
  line-height: var(--xh-leading-none);
package/css/layout.css CHANGED
@@ -92,7 +92,7 @@
92
92
  }
93
93
 
94
94
  /* 宽度过渡在这里声明一次,展开与折叠两档、以及 props 直接写进内联的宽度,走的都是这一条。
95
- 占位档的侧栏是淡底承载面:把手摆进来时由它下发 hover 200 → pressed 300(§7.2);
95
+ 占位档的侧栏是淡底承载面:把手摆进来时由它下发 hover 200 → pressed 300;
96
96
  覆盖档换成 elevated 白底,那一档的规则把阶梯写回 100 → 200 */
97
97
  [data-scope='layout'][data-part='sider'] {
98
98
  --xh-action-host-bg-hover: var(--xh-bg-subtle-hover);
@@ -219,7 +219,7 @@
219
219
  写成槽位而不是写死 ±100%:贴边用的是逻辑 inset,RTL 下行首落在物理右边,
220
220
  位移若写死物理方向就会出现「贴在右边、却从左边滑进来」 */
221
221
  --xh-_layout-sheet-shift: -100%;
222
- /* 这一档的底是 elevated 白底:交互阶梯按承载面走(§7.2),把上面占位档下发的 200 → 300 写回
222
+ /* 这一档的底是 elevated 白底:交互阶梯按承载面走,把上面占位档下发的 200 → 300 写回
223
223
  白底的 hover 100 → pressed 200 */
224
224
  --xh-action-host-bg-hover: var(--xh-bg-subtle);
225
225
  --xh-action-host-bg-pressed: var(--xh-bg-subtle-hover);
@@ -245,7 +245,7 @@
245
245
  env(safe-area-inset-left),
246
246
  env(safe-area-inset-right)
247
247
  );
248
- /* 盖在内容之上、带遮罩的一面走 sheet 三件套(§8.4:--xh-material-elevated-bg / -border / -shadow),
248
+ /* 盖在内容之上、带遮罩的一面走 sheet 三件套(--xh-material-elevated-bg / -border / -shadow),
249
249
  贴着内容那一侧描一条边;占位档的侧栏不画投影 */
250
250
  border-inline-end: var(--xh-stroke-thin) solid var(--xh-layout-border, var(--xh-material-elevated-border));
251
251
  background: var(--xh-layout-sider-bg, var(--xh-material-elevated-bg));
package/css/list.css CHANGED
@@ -19,7 +19,7 @@
19
19
  --xh-_list-item-gap: var(--xh-space-3);
20
20
  --xh-_list-title-size: var(--xh-control-font-md);
21
21
  --xh-_list-description-size: var(--xh-control-caption-md);
22
- /* 条目悬停换到的面:坐在白底上是 100,淡底档的根把它抬到 200(§7.2 按承载面的阶梯) */
22
+ /* 条目悬停换到的面:坐在白底上是 100,淡底档的根把它抬到 200(按承载面的阶梯) */
23
23
  --xh-_list-item-bg-hover: var(--xh-bg-subtle);
24
24
 
25
25
  display: flex;
package/css/listbox.css CHANGED
@@ -16,10 +16,10 @@
16
16
 
17
17
  [data-scope='listbox'][data-part='root'] {
18
18
  /* 条目外的字形(空态 / 在途占位里作者塞的图标)按档取尺,缺省 md;条目内的字形由家族随
19
- data-xh-collection-size 下发(§6.5)。列表框自绘的状态字形(前导对号所在的标记盒与盒里的勾)不读这支:
19
+ data-xh-collection-size 下发。列表框自绘的状态字形(行尾对号所在的标记盒与盒里的勾)不读这支:
20
20
  它们是指示符,走 --xh-control-indicator-* 一族——标记盒在自己身上把 --xh-icon-size 改接到盒的尺 */
21
21
  --xh-icon-size: var(--xh-listbox-icon-size, var(--xh-glyph-size-md));
22
- /* 定高小列表的自绘条挂在根上(§6.6):根是条子的定位盒,轨道底色关掉才不会在列表右缘糊出一条灰带 */
22
+ /* 定高小列表的自绘条挂在根上:根是条子的定位盒,轨道底色关掉才不会在列表右缘糊出一条灰带 */
23
23
  --xh-scrollbar-track-bg: transparent;
24
24
 
25
25
  /* 尺寸档只换这四个私有槽,条目、分组标题与空态占位都从 root 继承它们,
@@ -216,7 +216,7 @@
216
216
  }
217
217
 
218
218
  /* 取下一页的按钮:铺满一行摆在列表尾——铺满一行的独立动作条目,接 Action Control 的 row 档、
219
- ghost 形态(§9.2):宽度由容器给、高度随内容、按下只换面不缩放;盒几何、悬停 / 按下 / 禁用面、
219
+ ghost 形态:宽度由容器给、高度随内容、按下只换面不缩放;盒几何、悬停 / 按下 / 禁用面、
220
220
  焦点环与粗指针热区全由家族给,白底承载 hover 100 → pressed 200。
221
221
  这里只把使用者槽映射到桥接槽并把文案居中:它是一行里唯一的东西,靠起始缘会像一条没对齐的条目 */
222
222
  [data-scope='listbox'][data-part='load-more-trigger'] {
@@ -232,7 +232,7 @@
232
232
 
233
233
  justify-content: center;
234
234
  text-align: center;
235
- /* row 档允许换行、高度随内容,折行的文案走正文行高(§6.4) */
235
+ /* row 档允许换行、高度随内容,折行的文案走正文行高 */
236
236
  line-height: var(--xh-leading-normal);
237
237
  }
238
238
 
@@ -240,11 +240,11 @@
240
240
  display: none;
241
241
  }
242
242
 
243
- /* 条目走 Collection Item 的 page 语境(页内持久集合,§7.3):网格、尺寸档、悬停 / 高亮 / 按下面
244
- (白底承载 hover 100 → pressed 200)与选中面(品牌淡底 + 淡底前景 + 前导对号,selected+hover 20% /
245
- +pressed 28%)都由家族按 aria-selected / aria-disabled 给出;禁用面(字色降级、not-allowed、不换面)
246
- 也归家族。这里只把公开槽映射到桥接槽,不复制任何状态选择器。
247
- page 集合坐在 surface 白底上,前景走 fg-default 而不是浮层的 frosted 前景 */
243
+ /* 条目走 Collection Item 的 overlay 语境,与树选择同一种选中读法:网格、尺寸档、悬停 / 高亮 / 按下面
244
+ (白底承载 hover 100 → pressed 200)由家族给,选中不换面、不换字色,只在行尾亮对号,
245
+ 选中叠悬停 / 按下沿用同一条阶梯;禁用面(字色降级、not-allowed、不换面)也归家族。
246
+ 这里只把公开槽映射到桥接槽,不复制任何状态选择器。
247
+ 列表框坐在 surface 白底上,前景走 fg-default 而不是浮层的 frosted 前景 */
248
248
  [data-scope='listbox'][data-part='item'] {
249
249
  --xh-collection-block-padding: var(--xh-listbox-item-py, var(--xh-_listbox-item-py));
250
250
  --xh-collection-inline-padding: var(--xh-listbox-item-px, var(--xh-_listbox-item-px));
@@ -257,10 +257,10 @@
257
257
  --xh-collection-fg-hover: var(--xh-listbox-item-fg, var(--xh-fg-default));
258
258
  --xh-collection-fg-keyboard-highlight: var(--xh-listbox-item-fg, var(--xh-fg-default));
259
259
  --xh-collection-fg-pressed: var(--xh-listbox-item-fg, var(--xh-fg-default));
260
- --xh-collection-fg-selected: var(--xh-listbox-item-fg-selected, var(--xh-fg-on-brand-subtle));
261
- --xh-collection-fg-selected-hover: var(--xh-listbox-item-fg-selected, var(--xh-fg-on-brand-subtle));
262
- --xh-collection-fg-selected-highlight: var(--xh-listbox-item-fg-selected, var(--xh-fg-on-brand-subtle));
263
- --xh-collection-fg-selected-pressed: var(--xh-listbox-item-fg-selected, var(--xh-fg-on-brand-subtle));
260
+ --xh-collection-fg-selected: var(--xh-listbox-item-fg-selected, var(--xh-listbox-item-fg, var(--xh-fg-default)));
261
+ --xh-collection-fg-selected-hover: var(--xh-listbox-item-fg-selected, var(--xh-listbox-item-fg, var(--xh-fg-default)));
262
+ --xh-collection-fg-selected-highlight: var(--xh-listbox-item-fg-selected, var(--xh-listbox-item-fg, var(--xh-fg-default)));
263
+ --xh-collection-fg-selected-pressed: var(--xh-listbox-item-fg-selected, var(--xh-listbox-item-fg, var(--xh-fg-default)));
264
264
  --xh-collection-font-weight-selected: var(--xh-listbox-item-font-weight-selected, var(--xh-font-weight-regular));
265
265
  --xh-collection-font-weight-selected-hover: var(--xh-listbox-item-font-weight-selected, var(--xh-font-weight-regular));
266
266
  --xh-collection-font-weight-selected-highlight: var(--xh-listbox-item-font-weight-selected, var(--xh-font-weight-regular));
@@ -268,7 +268,9 @@
268
268
  --xh-collection-bg-hover: var(--xh-listbox-item-bg-hover, var(--xh-bg-subtle));
269
269
  --xh-collection-bg-keyboard-highlight: var(--xh-listbox-item-bg-hover, var(--xh-bg-subtle));
270
270
  --xh-collection-bg-pressed: var(--xh-listbox-item-bg-pressed, var(--xh-bg-subtle-hover));
271
- --xh-collection-bg-selected: var(--xh-listbox-item-bg-selected, var(--xh-bg-brand-subtle));
271
+ --xh-collection-bg-selected-hover: var(--xh-listbox-item-bg-hover, var(--xh-bg-subtle));
272
+ --xh-collection-bg-selected-highlight: var(--xh-listbox-item-bg-hover, var(--xh-bg-subtle));
273
+ --xh-collection-bg-selected-pressed: var(--xh-listbox-item-bg-pressed, var(--xh-bg-subtle-hover));
272
274
  /* data-highlighted 跟的是连接层记的焦点条目(指针点选也会落焦):只换面,焦点环在 :focus-visible 下再接回 */
273
275
  --xh-collection-outline-keyboard-highlight: transparent;
274
276
  --xh-collection-outline-selected-highlight: transparent;
@@ -307,10 +309,10 @@
307
309
  text-overflow: ellipsis;
308
310
  }
309
311
 
310
- /* 勾选标记落在家族网格的 indicator 列(page 语境下前置为前导对号);显隐与颜色由家族按选中态给,
312
+ /* 勾选标记落在家族网格行尾的 indicator 列(page 与 overlay 同位);显隐与颜色由家族按选中态给,
311
313
  未选中时占位不塌,切换选中不引起行宽抖动。
312
- 盒与盒里的勾是指示符(§6.5):盒按指示符档取尺,并在自己身上把 --xh-icon-size 改接到盒的尺,皮肤画的
313
- 兜底勾与作者塞进盒里的 XhIcon 读同一把尺、与盒同边长(前导对号不是勾选格,不取 × 0.75,与 Menu 族同口径);
314
+ 盒与盒里的勾是指示符:盒按指示符档取尺,并在自己身上把 --xh-icon-size 改接到盒的尺,皮肤画的
315
+ 兜底勾与作者塞进盒里的 XhIcon 读同一把尺、与盒同边长(对号不是勾选格,不取 × 0.75,与 Menu 族同口径);
314
316
  不读家族按档下发到行的 --xh-icon-size——那支只管作者放进条目里的图标,按图标档取的 20px 比 16 / 14 的指示符档大一圈 */
315
317
  [data-scope='listbox'][data-part='item-indicator'] {
316
318
  --xh-icon-size: var(--xh-listbox-item-indicator-size, var(--xh-control-indicator-size));
@@ -338,4 +340,11 @@
338
340
  -webkit-mask: var(--xh-glyph-mark-check) center / contain no-repeat;
339
341
  mask: var(--xh-glyph-mark-check) center / contain no-repeat;
340
342
  }
343
+
344
+ @media print {
345
+ /* 打印默认丢底色,而对号是遮罩出来的一块底色:行本就不换面,丢了它选中在纸上就没了踪影 */
346
+ [data-scope='listbox'][data-part='item-indicator'] {
347
+ print-color-adjust: exact;
348
+ }
349
+ }
341
350
  }
package/css/log.css CHANGED
@@ -42,7 +42,7 @@
42
42
  --xh-_log-font-size: var(--xh-text-secondary-size);
43
43
  --xh-_log-content-px: var(--xh-space-3);
44
44
 
45
- /* 一张静态内容面:--xh-border-default 描边 + surface 底 + 无影(§5.3 描边与淡底互斥),
45
+ /* 一张静态内容面:--xh-border-default 描边 + surface 底 + 无影(描边与淡底互斥),
46
46
  与 code-view / diff-view / json-viewer 同走 solid */
47
47
  position: relative;
48
48
  display: flex;
@@ -123,7 +123,7 @@
123
123
 
124
124
  /* 回到底部:浮在视口右下角,收起时不卸载只隐藏。盒型、悬停 / 按下面与缩放由 Action Control 的
125
125
  floating 档给(circle 正方盒、ghost 形态:白底承载 hover 100 → pressed 200);材质随角落浮钮族走
126
- frosted 四件套(底 + 边 + 影 + 磨砂,§8),这里只把使用者槽映射到桥接槽:
126
+ frosted 四件套(底 + 边 + 影 + 磨砂),这里只把使用者槽映射到桥接槽:
127
127
  字形按 xs 档取 --xh-_action-profile-glyph-size(16px),与 back-top 同一把尺 */
128
128
  [data-scope='log'][data-part='scroll-to-end-trigger'] {
129
129
  --xh-_log-scroll-to-end-trigger-shadow: var(--xh-log-scroll-to-end-trigger-shadow, var(--xh-material-frosted-shadow));
package/css/mention.css CHANGED
@@ -240,8 +240,6 @@
240
240
 
241
241
  [data-scope='mention'][data-part='content'][data-state='open'] {
242
242
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
243
- /* 只在开着的这一档挂:合成层随 data-state 一起收走,收起后不再占着 */
244
- will-change: opacity, translate;
245
243
  }
246
244
 
247
245
  /* 退场:收起那一帧 hidden 由退场闸门押后,这里才播得出来。forwards 把末态钉住,
package/css/menu.css CHANGED
@@ -61,14 +61,14 @@
61
61
  }
62
62
 
63
63
  /* 触发器的长相归作者,皮肤只表达展开态:展开着的那一张是打开路径,落与家族 hover 同档的中性面——
64
- 打开中不是选中,不用品牌色、不接语气(§7.3);哪一张开着由浮层本身说明。不加粗:加粗会推挤相邻内容 */
64
+ 打开中不是选中,不用品牌色、不接语气;哪一张开着由浮层本身说明。不加粗:加粗会推挤相邻内容 */
65
65
  [data-scope='menu'][data-part='trigger']:not([data-disabled])[data-state='open'] {
66
66
  background: var(--xh-menu-trigger-bg-active, var(--xh-bg-subtle));
67
67
  }
68
68
 
69
69
  [data-scope='menu'][data-part='content'] {
70
70
  /* 条目外的字形(分组标题等)按档取尺,缺省 md,随 data-size 换档;条目里作者放的图标由家族随
71
- data-xh-collection-size 下发(§6.5)。菜单自绘的状态字形(标记位的盒、子菜单的展开 chevron)不读这支:
71
+ data-xh-collection-size 下发。菜单自绘的状态字形(标记位的盒、子菜单的展开 chevron)不读这支:
72
72
  它们是指示符,走 --xh-control-indicator-* 一族——标记位在自己身上把 --xh-icon-size 改接到盒的尺,
73
73
  子菜单箭头走 --xh-menu-submenu-indicator-size */
74
74
  --xh-icon-size: var(--xh-menu-icon-size, var(--xh-glyph-size-md));
@@ -100,7 +100,7 @@
100
100
  -webkit-backdrop-filter: var(--xh-menu-backdrop, var(--xh-material-frosted-backdrop));
101
101
  backdrop-filter: var(--xh-menu-backdrop, var(--xh-material-frosted-backdrop));
102
102
  /* 条目超过上限就在菜单内部滚。条目的焦点环是内收的,滚动容器裁在内边距缘上,环切不着。
103
- 浮层滚动面:到底后不把滚动链穿透给页面(§6.6) */
103
+ 浮层滚动面:到底后不把滚动链穿透给页面 */
104
104
  overflow-y: auto;
105
105
  overscroll-behavior: contain;
106
106
  pointer-events: auto;
@@ -129,9 +129,7 @@
129
129
  outline: none;
130
130
  }
131
131
 
132
- /* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
133
132
  [data-scope='menu'][data-part='content'][data-state='open'] {
134
- will-change: opacity, translate;
135
133
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
136
134
  }
137
135
 
@@ -211,7 +209,7 @@
211
209
  display: none;
212
210
  }
213
211
 
214
- /* 标记位(勾选符号 / 图标):定宽占位,切换内容不引起行宽抖动。盒是指示符(§6.5):按指示符档取尺,
212
+ /* 标记位(勾选符号 / 图标):定宽占位,切换内容不引起行宽抖动。盒是指示符:按指示符档取尺,
215
213
  与 Cascader / Select 的标记位同走 --xh-control-indicator-size,不读家族按档下发的 --xh-icon-size——
216
214
  按图标档取的 20px 会比同一行 16px 的指示符档大一圈。盒在自己身上把 --xh-icon-size 改接到盒的尺,
217
215
  作者塞进标记位的 XhIcon 与盒同尺;条目上那支只管作者直接放进条目里的图标 */
@@ -261,7 +259,7 @@
261
259
  }
262
260
 
263
261
  /* 带子菜单的条目行尾画右向小箭头:不点开也看得出还有下一级。
264
- 箭头与作者内容同排,用自动外距推到行尾。箭头是指示符(§6.5):与标记位的盒同走
262
+ 箭头与作者内容同排,用自动外距推到行尾。箭头是指示符:与标记位的盒同走
265
263
  --xh-control-indicator-size,不读 --xh-icon-size——按图标档取的 20px 会比 16px 的标记位盒大一圈 */
266
264
  [data-scope='menu'][data-part='item'][aria-haspopup='menu']::after {
267
265
  content: '';
package/css/menubar.css CHANGED
@@ -51,8 +51,8 @@
51
51
 
52
52
  /* 入口归 Collection Item 展开路径 / 打开中(nav 语境):几何、字号与面全经家族桥接槽。静息字色取 default
53
53
  (菜单名不是次要文字,不取 nav 缺省的 muted),悬停走白底承载 hover 100,展开着的那一张由连接层投影
54
- data-in-path,家族给与悬停同档的中性面——打开中不是选中,不用品牌色、不接语气、不加粗(§7.3);
55
- 按下 pressed 200 只换面不缩放(§9.2);禁用走 aria-disabled,家族给禁用字色与 not-allowed。
54
+ data-in-path,家族给与悬停同档的中性面——打开中不是选中,不用品牌色、不接语气、不加粗;
55
+ 按下 pressed 200 只换面不缩放;禁用走 aria-disabled,家族给禁用字色与 not-allowed。
56
56
  本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 background / color / cursor */
57
57
  [data-scope='menubar'][data-part='trigger'] {
58
58
  --xh-collection-block-padding: var(--xh-menubar-trigger-py, var(--xh-_menubar-trigger-py));
@@ -132,7 +132,7 @@
132
132
  缺省档写在第一条:trigger 与条目的行内内缩都走 control-px 档(随密度轴)、纵向走 space 档,换档各挪一级 */
133
133
  [data-scope='menubar']:is([data-part='root'], [data-part='positioner']) {
134
134
  /* 条目外的字形(分组标题、入口)按档取尺,缺省 md,随 data-size 换档;同样声明在 positioner 上,被搬走的
135
- 浮层才拿得到;条目里作者放的图标由家族随 data-xh-collection-size 下发(§6.5)。菜单栏自绘的状态字形(标记位的盒、
135
+ 浮层才拿得到;条目里作者放的图标由家族随 data-xh-collection-size 下发。菜单栏自绘的状态字形(标记位的盒、
136
136
  盒里兜底的勾、子菜单的展开 chevron)不读这支:它们是指示符,走 --xh-control-indicator-* 一族——标记位在
137
137
  自己身上把 --xh-icon-size 改接到盒的尺,子菜单箭头走 --xh-menubar-submenu-indicator-size */
138
138
  --xh-icon-size: var(--xh-menubar-icon-size, var(--xh-glyph-size-md));
@@ -186,7 +186,7 @@
186
186
  -webkit-backdrop-filter: var(--xh-menubar-backdrop, var(--xh-material-frosted-backdrop));
187
187
  backdrop-filter: var(--xh-menubar-backdrop, var(--xh-material-frosted-backdrop));
188
188
  /* 条目超过上限就在菜单内部滚。条目的焦点环是内收的,滚动容器裁在内边距缘上,环切不着。
189
- 浮层滚动面:到底后不把滚动链穿透给页面(§6.6) */
189
+ 浮层滚动面:到底后不把滚动链穿透给页面 */
190
190
  overflow-y: auto;
191
191
  overscroll-behavior: contain;
192
192
  pointer-events: auto;
@@ -217,8 +217,6 @@
217
217
 
218
218
  /* 首开从锚点一侧淡入短移,不缩放整张菜单面。 */
219
219
  [data-scope='menubar'][data-part='content'][data-state='open'] {
220
- /* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
221
- will-change: opacity, translate;
222
220
  animation: xh-overlay-slide-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
223
221
  }
224
222
 
@@ -305,7 +303,7 @@
305
303
 
306
304
  /* 带子菜单的条目行尾画右向小箭头:不点开也看得出还有下一级。
307
305
  description 按 order 独占下一行,箭头仍留在主行末端。
308
- 箭头是指示符(§6.5):与标记位的盒同走 --xh-control-indicator-size,不读 --xh-icon-size——
306
+ 箭头是指示符:与标记位的盒同走 --xh-control-indicator-size,不读 --xh-icon-size——
309
307
  按图标档取的 20px 会比 16px 的标记位盒大一圈 */
310
308
  [data-scope='menubar'][data-part='item'][aria-haspopup='menu']::after {
311
309
  content: '';
@@ -337,7 +335,7 @@
337
335
  display: none;
338
336
  }
339
337
 
340
- /* 标记位(勾选符号 / 图标)按作者写入的位置留在主行,不为没写的条目强制占列。盒是指示符(§6.5):按指示符档
338
+ /* 标记位(勾选符号 / 图标)按作者写入的位置留在主行,不为没写的条目强制占列。盒是指示符:按指示符档
341
339
  取尺,与 Menu / ContextMenu 的标记位同走 --xh-control-indicator-size,不读家族按档下发的 --xh-icon-size——
342
340
  按图标档取的 20px 会比同一行 16px 的指示符档大一圈。盒在自己身上把 --xh-icon-size 改接到盒的尺,
343
341
  皮肤画的兜底勾与作者塞进标记位的 XhIcon 读同一把尺、与盒同边长(行尾标记不是勾选格,不取 × 0.75);
@@ -68,7 +68,7 @@
68
68
  overscroll-behavior: contain;
69
69
  }
70
70
 
71
- /* 流式视口的内容高度一直在变,还在用原生滚动条的视口留一条空道,滚动条出现与消失时不推动文字(§6.6)。
71
+ /* 流式视口的内容高度一直在变,还在用原生滚动条的视口留一条空道,滚动条出现与消失时不推动文字。
72
72
  带 data-xh-scrollbar 的容器已经把原生条藏成零宽,这条空道对它没有布局作用,排除掉 */
73
73
  [data-scope='message-feed'][data-part='viewport']:not([data-xh-scrollbar]) {
74
74
  scrollbar-gutter: stable;
@@ -112,7 +112,7 @@
112
112
 
113
113
  /* 回到底部:浮在滚动区右下角,收起时不卸载只隐藏。盒型、悬停 / 按下面与缩放由 Action Control 的
114
114
  floating 档给(circle 正方盒、ghost 形态:白底承载 hover 100 → pressed 200);材质随角落浮钮族走
115
- frosted 四件套(底 + 边 + 影 + 磨砂,§8),这里只把使用者槽映射到桥接槽:
115
+ frosted 四件套(底 + 边 + 影 + 磨砂),这里只把使用者槽映射到桥接槽:
116
116
  字形按 xs 档取 --xh-_action-profile-glyph-size(16px),与 log / back-top 同一把尺 */
117
117
  [data-scope='message-feed'][data-part='scroll-to-end-trigger'] {
118
118
  --xh-_message-feed-scroll-to-end-trigger-shadow: var(--xh-message-feed-scroll-to-end-trigger-shadow, var(--xh-material-frosted-shadow));
@@ -23,7 +23,7 @@
23
23
  换档不必给每个部件各写一条选择器。面板与共享外壳都是 root 的后代,一并继承。
24
24
  trigger 的字号经家族桥接槽接回 root 这一档,不另立私有槽 */
25
25
  /* 入口里的方向标记按档取尺,缺省 md,随 data-size 换档;面板里链接内的字形由家族随
26
- data-xh-collection-size 下发(§6.5) */
26
+ data-xh-collection-size 下发 */
27
27
  --xh-icon-size: var(--xh-navigation-menu-icon-size, var(--xh-glyph-size-md));
28
28
 
29
29
  --xh-_navigation-menu-font-size: var(--xh-control-font-md);
@@ -34,7 +34,7 @@
34
34
  --xh-_navigation-menu-link-px: var(--xh-control-px-md);
35
35
  --xh-_navigation-menu-link-font-size: var(--xh-control-font-md);
36
36
 
37
- /* 悬停、键盘锚点与展开着的入口同走中性灰轻档、不接语气槽:打开中不是选中,不用品牌色(§7.3) */
37
+ /* 悬停、键盘锚点与展开着的入口同走中性灰轻档、不接语气槽:打开中不是选中,不用品牌色 */
38
38
  --xh-_navigation-menu-highlight-bg: var(--xh-bg-subtle);
39
39
 
40
40
  /* 语气只落在指示条上;没写 data-tone 时 --xh-_tone 没被声明,退回品牌色。
@@ -111,7 +111,7 @@
111
111
  /* 入口归 Collection Item 展开路径 / 打开中(nav 语境):几何、字号、面与字重全经家族桥接槽。静息 muted /
112
112
  regular,悬停走白底承载 hover 100 + default 字;展开着的那一张由连接层投影 data-in-path,家族给与悬停同档的
113
113
  中性面——打开中不是选中,不用品牌色、不加粗(横排的栏加粗会推挤相邻触发器),哪一张开着由指示条与转向的
114
- 箭头说明;按下 pressed 200 只换面不缩放(§9.2);禁用走 aria-disabled,家族给禁用字色与 not-allowed。
114
+ 箭头说明;按下 pressed 200 只换面不缩放;禁用走 aria-disabled,家族给禁用字色与 not-allowed。
115
115
  高度由 block-size 定,块向内边距归零。本条 (0,2,0) 压过家族基础块 (0,1,0),不能再写 background / color /
116
116
  font-weight / cursor;也不写 font: inherit(reset.css 已抹平按钮 UA 字体,再写会把家族给的字号字重一并盖掉) */
117
117
  [data-scope='navigation-menu'][data-part='trigger'] {
@@ -172,9 +172,7 @@
172
172
  inset-inline-start: calc(100% + var(--xh-navigation-menu-content-offset, var(--xh-space-1)));
173
173
  }
174
174
 
175
- /* 在场那一档才提前备好合成层:属性随 data-state 一起消失,收起后不长期占着 */
176
175
  [data-scope='navigation-menu'][data-part='content'][data-state='open'] {
177
- will-change: opacity, scale;
178
176
  animation: xh-pop-in var(--xh-motion-duration-enter) var(--xh-motion-ease-enter-strong);
179
177
  }
180
178
 
@@ -195,7 +193,7 @@
195
193
 
196
194
  /* 面板里的链接归 Collection Item 导航当前(nav 语境):悬停 / 键盘高亮(白底承载 100)与按下(200)面由家族
197
195
  按 :hover / :focus-visible / :active 给出,指向当前页面的那一条(data-current)取 strong 档品牌字色 +
198
- medium 字重(§7.3),字色不随语气、不加下划线(下划线是"可点"的信号,它已经在这儿了);这里只把公开槽
196
+ medium 字重,字色不随语气、不加下划线(下划线是"可点"的信号,它已经在这儿了);这里只把公开槽
199
197
  映射到桥接槽。面板是实色 floating 面,常态字色取 --xh-fg-default 而非 nav 缺省的 muted。
200
198
  布局保持 flex:链接是一行文字,不用家族网格。position: relative 是当前链接静态线的定位参照 */
201
199
  [data-scope='navigation-menu'][data-part='link'] {
@@ -257,7 +255,7 @@
257
255
  color: var(--xh-fg-disabled);
258
256
  }
259
257
 
260
- /* 指向当前页面的链接自画一条静态指示线(§7.3 导航当前页):与 Tabs line / Anchor 同一取法,作者不必为了
258
+ /* 指向当前页面的链接自画一条静态指示线(导航当前页):与 Tabs line / Anchor 同一取法,作者不必为了
261
259
  这条线多放一个部件。下面的 indicator 部件表达的是「哪张面板开着」而不是当前页,所以这条线不随部件收起,
262
260
  两者各说各的:部件亮着时开着的入口下有一条、当前页链接上另有一条。
263
261
  线画在当前链接的 ::after 上,以链接盒为定位参照(上面已给 position: relative),