@q1travel/design-system 0.26.0 → 0.27.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.
@@ -174,6 +174,27 @@
174
174
  --q1-color-status-info-text: #0064b8;
175
175
  --q1-color-status-info-surface: var(--q1-color-blue-100);
176
176
  --q1-color-status-info-border: #abcff0;
177
+ /* 域色板 · auth:账户入口专用的冷蓝灰色板(所有者 2026-10-13 批准)。只在账户入口域内成组使用,
178
+ 不与中性链 token 混用;值独立于中性链,明暗各一套。 */
179
+ --q1-color-auth-text-primary: #061b31;
180
+ --q1-color-auth-text-secondary: #273951;
181
+ --q1-color-auth-text-muted: #64748d;
182
+ --q1-color-auth-border-strong: #d6dde6;
183
+ --q1-color-auth-surface-card: #ffffff;
184
+ --q1-color-auth-surface-subtle: #f8fafc;
185
+ --q1-color-auth-surface-disabled: #f6f9fc;
186
+ --q1-color-auth-surface-media: #04050a;
187
+ --q1-color-auth-action-disabled-bg: #c7c9cc;
188
+ --q1-color-auth-action-disabled-border: #c7c9cc;
189
+ --q1-color-auth-action-disabled-text: #ffffff;
190
+ --q1-color-auth-focus-ring: rgba(83, 58, 253, 0.42);
191
+ --q1-color-auth-danger-border: #d92d20;
192
+ --q1-color-auth-danger-surface: #fff8f7;
193
+ --q1-color-auth-field-error-text: #d32f2f;
194
+ --q1-color-auth-media-overlay: rgba(4, 5, 10, 0.46);
195
+ --q1-color-auth-media-overlay-hover: rgba(4, 5, 10, 0.66);
196
+ --q1-color-auth-on-media-border: rgba(255, 255, 255, 0.22);
197
+ --q1-color-auth-on-media-border-hover: rgba(255, 255, 255, 0.34);
177
198
  --q1-font-sans: "Noto Sans SC", "PingFang SC", "Microsoft YaHei UI", sans-serif;
178
199
  --q1-font-mono: "Geist Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace;
179
200
  --q1-font-weight-regular: 400;
@@ -483,6 +504,27 @@
483
504
  --q1-color-status-info-text: var(--q1-color-blue-900);
484
505
  --q1-color-status-info-surface: var(--q1-color-blue-100);
485
506
  --q1-color-status-info-border: #194f81;
507
+ /* 域色板 · auth:账户入口专用的冷蓝灰色板(所有者 2026-10-13 批准)。只在账户入口域内成组使用,
508
+ 不与中性链 token 混用;值独立于中性链,明暗各一套。 */
509
+ --q1-color-auth-text-primary: #f3f4f6;
510
+ --q1-color-auth-text-secondary: #d1d5db;
511
+ --q1-color-auth-text-muted: #9ca3af;
512
+ --q1-color-auth-border-strong: #343943;
513
+ --q1-color-auth-surface-card: #17191d;
514
+ --q1-color-auth-surface-subtle: #101216;
515
+ --q1-color-auth-surface-disabled: #202329;
516
+ --q1-color-auth-surface-media: #04050a;
517
+ --q1-color-auth-action-disabled-bg: #3b404a;
518
+ --q1-color-auth-action-disabled-border: #3b404a;
519
+ --q1-color-auth-action-disabled-text: #a6acb8;
520
+ --q1-color-auth-focus-ring: rgba(126, 108, 255, 0.52);
521
+ --q1-color-auth-danger-border: #d92d20;
522
+ --q1-color-auth-danger-surface: #241719;
523
+ --q1-color-auth-field-error-text: #d32f2f;
524
+ --q1-color-auth-media-overlay: rgba(4, 5, 10, 0.46);
525
+ --q1-color-auth-media-overlay-hover: rgba(4, 5, 10, 0.66);
526
+ --q1-color-auth-on-media-border: rgba(255, 255, 255, 0.22);
527
+ --q1-color-auth-on-media-border-hover: rgba(255, 255, 255, 0.34);
486
528
  /* Override only the press state: the dark Primary ramp runs left-dark to
487
529
  right-light, so Primary-900 is a light tint. Point action-press at a darker
488
530
  step so default -> hover -> press keeps getting darker (hover still
@@ -841,7 +883,7 @@
841
883
  }
842
884
 
843
885
  /* 快捷键徽章(shortcut):内联 <kbd>,currentColor + opacity 让它继承按钮前景色、
844
- 自动适配各 variant 与明暗,无需 dark 块。移植自 q1travel-web .ui2-button__shortcut。 */
886
+ 自动适配各 variant 与明暗,无需 dark 块。移植自主应用既有的按钮快捷键样式。 */
845
887
  /* 快捷键徽标(自有扩展):不用生硬边框方框,改 currentColor 半透明填充的柔和键帽——
846
888
  继承按钮前景色,在 primary(白前景) 上是白 16% 键帽、在浅底按钮上自动变深色填充,各 variant 自适应。 */
847
889
  .button__shortcut {
@@ -916,8 +958,8 @@
916
958
  .form-field__description,
917
959
  .form-field__message {
918
960
  color: var(--q1-color-text-secondary);
919
- font-size: 13px;
920
- line-height: 20px;
961
+ font-size: var(--q1-font-size-label-13);
962
+ line-height: var(--q1-line-height-label-13);
921
963
  }
922
964
 
923
965
  .form-field__message {
@@ -944,7 +986,7 @@
944
986
  align-items: center;
945
987
  min-height: 40px;
946
988
  overflow: hidden;
947
- border: 1px solid var(--q1-input-border, var(--q1-color-border));
989
+ border: 1px solid var(--q1-input-border, var(--q1-color-border-control));
948
990
  border-radius: var(--q1-radius-2);
949
991
  background: var(--q1-input-bg, var(--q1-color-bg-sunken));
950
992
  font-size: var(--q1-font-size-label-14);
@@ -1024,10 +1066,33 @@
1024
1066
  .input-control__action {
1025
1067
  display: inline-flex;
1026
1068
  flex: none;
1027
- align-items: center;
1069
+ align-items: stretch;
1070
+ align-self: stretch;
1071
+ /* 槽位上下各越过 1px 边框:按钮高度取外框整高,不再把外框撑出比同档 Input 多 2px。 */
1072
+ margin-block: -1px;
1028
1073
  padding-inline-end: var(--q1-space-1);
1029
1074
  }
1030
1075
 
1076
+ /* 按钮高度跟随外框,不再用自身尺寸档的最小高度(xs 输入框里的 sm 按钮会撑高外框)。 */
1077
+ .input-control__action .button {
1078
+ min-height: 0;
1079
+ }
1080
+
1081
+ /* 外框 overflow 会裁掉按钮向外扩的焦点环。参照 Geist Input 后缀按钮:外框保留裁切并照常画
1082
+ 聚焦光晕(焦点仍在控件内),按钮自己的环改为向内收的 outline,整圈落在按钮可见区内,
1083
+ 从输入框 Tab 到按钮时焦点位置可辨;outline 在强制颜色模式下同样可见。 */
1084
+ .input-control:has(.input-control__action .button:focus-visible) {
1085
+ border-color: var(--q1-input-border-focus, var(--q1-color-border));
1086
+ box-shadow: var(--q1-input-focus-ring, var(--q1-shadow-focus-input));
1087
+ }
1088
+
1089
+ .input-control__action .button--ghost.button--icon:focus-visible {
1090
+ outline: 2px solid var(--q1-color-focus);
1091
+ outline-offset: calc(-1 * var(--q1-space-1));
1092
+ box-shadow: none;
1093
+ color: var(--q1-color-text-primary);
1094
+ }
1095
+
1031
1096
  .input-control__reveal-icons {
1032
1097
  display: inline-grid;
1033
1098
  }
@@ -1135,15 +1200,15 @@
1135
1200
 
1136
1201
  /* 组件 token 层(token-naming 契约 · Component Tokens)。
1137
1202
  消费方常有自己的表单外壳,只想换边框色或焦点环,却因为这里直写 token 而不得不整条
1138
- `border` 重写——顺带把宽度与样式也一起接管。实测 q1travel-web 有 151 处这样的覆写,
1139
- 48 种属性组合,前三名全是配色与焦点环。给出这五个变量后,改一个变量能达成的事,
1203
+ `border` 重写——顺带把宽度与样式也一起接管。实测下游主应用有约 150 处这样的覆写,
1204
+ 约 50 种属性组合,前三名全是配色与焦点环。给出这五个变量后,改一个变量能达成的事,
1140
1205
  就不会再长成九个属性的覆写。
1141
1206
  缺省值仍是语义 token,不传即维持现状。 */
1142
1207
  .form-control {
1143
1208
  box-sizing: border-box;
1144
1209
  width: 100%;
1145
1210
  min-height: 40px;
1146
- border: 1px solid var(--q1-input-border, var(--q1-color-border));
1211
+ border: 1px solid var(--q1-input-border, var(--q1-color-border-control));
1147
1212
  border-radius: var(--q1-radius-2);
1148
1213
  background: var(--q1-input-bg, var(--q1-color-bg-sunken));
1149
1214
  color: var(--q1-input-fg, var(--q1-color-text-primary));
@@ -1155,7 +1220,7 @@
1155
1220
  }
1156
1221
 
1157
1222
  /* 数字输入:隐去浏览器原生步进三角。
1158
- 它不是本库的图标,是浏览器自绘的控件,于是同一组字段里「汇率 CNY/CNY」这种无 suffix 的
1223
+ 它不是本库的图标,是浏览器自绘的控件,于是同一组字段里「费率 %」这种无 suffix 的
1159
1224
  会多出一对三角,而带 CNY/% suffix 的不会——同一行字段看起来是两种控件。
1160
1225
 
1161
1226
  两个引擎各管各的:Chromium/WebKit 的三角是 ::-webkit-*-spin-button 伪元素,
@@ -1235,7 +1300,7 @@
1235
1300
  display: flex;
1236
1301
  flex-direction: column;
1237
1302
  overflow: hidden;
1238
- border: 1px solid var(--q1-color-border);
1303
+ border: 1px solid var(--q1-color-border-control);
1239
1304
  border-radius: var(--q1-radius-2);
1240
1305
  background: var(--q1-color-bg-sunken);
1241
1306
  }
@@ -1279,7 +1344,8 @@
1279
1344
 
1280
1345
  .textarea-control__count {
1281
1346
  align-self: flex-end;
1282
- padding: 0 12px 8px;
1347
+ /* 右侧多留一个拖拽手柄的宽度:计数不再正好叠在右下角手柄下方。 */
1348
+ padding: 0 var(--q1-space-6) var(--q1-space-2) var(--q1-space-3);
1283
1349
  color: var(--q1-color-text-secondary);
1284
1350
  font-size: 12px;
1285
1351
  line-height: 16px;
@@ -1590,9 +1656,12 @@
1590
1656
  line-height: var(--q1-line-height-label-13);
1591
1657
  }
1592
1658
 
1593
- /* 修复选择器手误:描述曾与 __message 同列被涂成 danger 红。 */
1659
+ /* 修复选择器手误:描述曾与 __message 同列被涂成 danger 红。
1660
+ 说明不得大于标签(曾继承 16px 致层级倒置):与标签同为 13 档,靠次级色区分。 */
1594
1661
  .control-option__description {
1595
1662
  color: var(--q1-color-text-secondary);
1663
+ font-size: var(--q1-font-size-label-13);
1664
+ line-height: var(--q1-line-height-label-13);
1596
1665
  }
1597
1666
 
1598
1667
  .control-option__message {
@@ -1648,6 +1717,12 @@
1648
1717
  .menu__trigger:hover:not(:disabled) {
1649
1718
  background: color-mix(in srgb, var(--q1-color-text-primary) 4%, transparent);
1650
1719
  }
1720
+ /* 文字触发器的前置图标:装饰性,与 Button 的 affix 同样不参与可访问名称。 */
1721
+ .menu__trigger-prefix {
1722
+ display: inline-flex;
1723
+ flex: none;
1724
+ align-items: center;
1725
+ }
1651
1726
  /* 图标-only 触发器。 */
1652
1727
  .menu__trigger--icon {
1653
1728
  width: 32px;
@@ -1784,6 +1859,11 @@
1784
1859
  flex: none;
1785
1860
  color: var(--q1-color-text-secondary);
1786
1861
  }
1862
+ /* 组内有图标时,无图标项的占位槽:与 16px 图标同宽,保证文字起点一致。 */
1863
+ .menu__item-icon-placeholder {
1864
+ flex: none;
1865
+ width: var(--q1-space-4);
1866
+ }
1787
1867
  .menu__item--danger .menu__item-icon {
1788
1868
  color: var(--q1-color-red-700);
1789
1869
  }
@@ -1923,6 +2003,12 @@
1923
2003
  margin-inline-start: calc(-1 * (var(--q1-space-4) + 1px));
1924
2004
  }
1925
2005
 
2006
+ /* 勾选列只占勾选框所需宽度,多余宽度留给内容列,避免勾选框与名称列之间出现大段空白。 */
2007
+ .table th.table__cell--select,
2008
+ .table td.table__cell--select {
2009
+ width: var(--q1-space-10);
2010
+ }
2011
+
1926
2012
  .table th.table__cell--align-center,
1927
2013
  .table td.table__cell--align-center {
1928
2014
  text-align: center;
@@ -2261,6 +2347,11 @@
2261
2347
  box-shadow: 0 0 0 1px var(--q1-color-bg-panel);
2262
2348
  }
2263
2349
 
2350
+ /* 组内字母头像右侧被后一个头像压住 30%:字号降一档(直径 3/8),两个字母仍完整落在露出的区域内。 */
2351
+ .avatar-group .avatar--letter {
2352
+ font-size: calc(var(--q1-avatar-size, 32px) * 0.375);
2353
+ }
2354
+
2264
2355
  /* +N 收纳芯片:恒定深色、不随主题翻转(同族先例:遮罩恒黑)。 */
2265
2356
  .avatar--overflow {
2266
2357
  /* q1-lint-disable Q1-DS-501 恒定深色不随主题翻转,同族先例:遮罩恒黑 */
@@ -2776,6 +2867,18 @@
2776
2867
  .banner > .banner__actions {
2777
2868
  justify-self: start;
2778
2869
  }
2870
+
2871
+ /* 关闭钮脱离网格固定在右上角,只让主操作折到下一行;44px 命中区让 × 与首行标题同中线。 */
2872
+ .banner:has(.banner__close):not(.banner--announcement, .banner--progress) {
2873
+ position: relative;
2874
+ padding-right: calc(var(--q1-space-10) + var(--q1-space-1));
2875
+ }
2876
+
2877
+ .banner:not(.banner--announcement, .banner--progress) .banner__close {
2878
+ position: absolute;
2879
+ top: 0;
2880
+ right: 0;
2881
+ }
2779
2882
  }
2780
2883
 
2781
2884
  @media (max-width: 48rem), (pointer: coarse), (any-pointer: coarse) {
@@ -3236,7 +3339,8 @@ a.breadcrumb__link:hover {
3236
3339
  }
3237
3340
 
3238
3341
  .browser__url-head {
3239
- flex: 1 1 0;
3342
+ /* 按内容收缩而不是吃满剩余宽度:域名与路径紧挨着居中,不在中间留大段空白。 */
3343
+ flex: 0 1 auto;
3240
3344
  min-width: 0;
3241
3345
  overflow: hidden;
3242
3346
  text-overflow: ellipsis;
@@ -3244,7 +3348,7 @@ a.breadcrumb__link:hover {
3244
3348
  }
3245
3349
 
3246
3350
  .browser__url-tail {
3247
- flex: 0 1 auto;
3351
+ flex: 0 0 auto;
3248
3352
  max-width: 50%;
3249
3353
  min-width: 0;
3250
3354
  overflow: hidden;
@@ -3854,6 +3958,8 @@ a[href]:has(> .book):focus-visible {
3854
3958
  .tabs-control__help {
3855
3959
  display: grid;
3856
3960
  gap: var(--q1-space-1);
3961
+ /* 说明与标签文字同一起点(标签按钮左右各留 space-1) */
3962
+ padding-inline: var(--q1-space-1);
3857
3963
  color: var(--q1-color-text-secondary);
3858
3964
  font-size: var(--q1-font-size-label-13);
3859
3965
  line-height: var(--q1-line-height-label-13);
@@ -3887,13 +3993,33 @@ a[href]:has(> .book):focus-visible {
3887
3993
  color: var(--q1-color-text-primary);
3888
3994
  }
3889
3995
 
3996
+ /* 线型(line)变体:无外框、无卡片底色与内边距,只保留 tablist 的 1px 基线,贴在页面标题下方;
3997
+ 对照 Geist:标签上下 14px、文字 14/20 常规字重,选中项 2px 前景色指示线与基线重合,无位移动画。 */
3998
+ .tabs-root--line {
3999
+ border: 0;
4000
+ border-radius: 0;
4001
+ background: transparent;
4002
+ padding: 0;
4003
+ }
4004
+
4005
+ .tabs-control--line .tabs-control__tab {
4006
+ min-height: 0;
4007
+ padding: var(--q1-space-3-5) var(--q1-space-1);
4008
+ }
4009
+
4010
+ .tabs-control--line .tabs-control__tab:disabled {
4011
+ color: var(--q1-color-text-disabled);
4012
+ border-bottom-color: transparent;
4013
+ }
4014
+
3890
4015
  .tabs-control__panel {
3891
4016
  min-height: 96px;
3892
4017
  border-radius: var(--q1-radius-3);
3893
4018
  color: var(--q1-color-text-secondary);
3894
4019
  font-size: 14px;
3895
4020
  line-height: 1.7;
3896
- padding: var(--q1-space-4);
4021
+ /* 正文左缘与标签文字左缘对齐 */
4022
+ padding: var(--q1-space-4) var(--q1-space-1);
3897
4023
  }
3898
4024
 
3899
4025
  .tabs-control__panel[hidden] {
@@ -3929,6 +4055,51 @@ a[href]:has(> .book):focus-visible {
3929
4055
  line-height: var(--q1-line-height-label-13);
3930
4056
  }
3931
4057
 
4058
+ .tabs-line-demo {
4059
+ display: grid;
4060
+ gap: var(--q1-space-4);
4061
+ }
4062
+
4063
+ .tabs-line-demo__header {
4064
+ display: grid;
4065
+ gap: var(--q1-space-1);
4066
+ }
4067
+
4068
+ .tabs-line-demo__title {
4069
+ margin: 0;
4070
+ color: var(--q1-color-text-primary);
4071
+ font-size: var(--q1-font-size-heading-20);
4072
+ font-weight: var(--q1-font-weight-heading-20);
4073
+ line-height: var(--q1-line-height-heading-20);
4074
+ }
4075
+
4076
+ .tabs-line-demo__description,
4077
+ .tabs-line-demo__section-body {
4078
+ margin: 0;
4079
+ color: var(--q1-color-text-secondary);
4080
+ font-size: var(--q1-font-size-label-14);
4081
+ line-height: var(--q1-line-height-label-14);
4082
+ }
4083
+
4084
+ .tabs-line-demo__sections {
4085
+ display: grid;
4086
+ gap: var(--q1-space-6);
4087
+ }
4088
+
4089
+ .tabs-line-demo__section {
4090
+ display: grid;
4091
+ gap: var(--q1-space-1);
4092
+ scroll-margin-top: var(--q1-space-6);
4093
+ }
4094
+
4095
+ .tabs-line-demo__section-title {
4096
+ margin: 0;
4097
+ color: var(--q1-color-text-primary);
4098
+ font-size: var(--q1-font-size-heading-16);
4099
+ font-weight: var(--q1-font-weight-heading-16);
4100
+ line-height: var(--q1-line-height-heading-16);
4101
+ }
4102
+
3932
4103
  @media (prefers-reduced-motion: reduce) {
3933
4104
  .tabs-control__tab::before {
3934
4105
  transition: opacity var(--q1-duration-press) var(--q1-ease-state);
@@ -3962,18 +4133,32 @@ a[href]:has(> .book):focus-visible {
3962
4133
  .tabs-control--secondary .tabs-control__tab {
3963
4134
  min-height: 44px;
3964
4135
  }
4136
+
4137
+ /* 线型保持标签自然宽度(与 Geist 一致),不拉伸等分;高度已超过 44px 触控目标。 */
4138
+ .tabs-control--line .tabs-control__tab {
4139
+ width: auto;
4140
+ min-height: 0;
4141
+ padding-inline: var(--q1-space-1);
4142
+ }
4143
+
4144
+ .tabs-control--line .tabs-control__tab-wrapper {
4145
+ flex: none;
4146
+ }
3965
4147
  }
3966
4148
 
3967
4149
  /* —— 触发器 + 弹层 —— */
3968
4150
  .cal-field {
3969
4151
  position: relative;
3970
- display: inline-block;
4152
+ display: block;
4153
+ min-width: 0;
3971
4154
  }
3972
4155
 
3973
4156
  .cal-field__control {
3974
4157
  --cal-field-height: var(--q1-control-height-default);
4158
+ box-sizing: border-box;
4159
+ width: 100%;
3975
4160
  height: var(--cal-field-height);
3976
- display: inline-flex;
4161
+ display: flex;
3977
4162
  align-items: center;
3978
4163
  box-shadow: inset 0 0 0 calc(var(--q1-space-1) / 4) var(--q1-color-border);
3979
4164
  border-radius: var(--q1-radius-2);
@@ -3996,10 +4181,6 @@ a[href]:has(> .book):focus-visible {
3996
4181
  box-shadow: inset 0 0 0 calc(var(--q1-space-1) / 4) var(--q1-color-border-strong);
3997
4182
  }
3998
4183
 
3999
- .cal-field__control--default {
4000
- min-width: 220px;
4001
- }
4002
-
4003
4184
  .cal-field__control--compact .cal-field__label {
4004
4185
  max-width: 96px;
4005
4186
  overflow: hidden;
@@ -4051,10 +4232,10 @@ a[href]:has(> .book):focus-visible {
4051
4232
  }
4052
4233
 
4053
4234
  .cal-popover {
4054
- position: absolute;
4055
- top: calc(100% + var(--q1-space-2));
4235
+ position: fixed;
4236
+ top: 0;
4056
4237
  left: 0;
4057
- z-index: 20;
4238
+ width: max-content;
4058
4239
  display: flex;
4059
4240
  gap: var(--q1-space-6);
4060
4241
  padding: var(--q1-space-4);
@@ -4952,19 +5133,23 @@ a[href]:has(> .book):focus-visible {
4952
5133
  background: var(--q1-color-bg-canvas);
4953
5134
  }
4954
5135
 
5136
+ /* 阶段标签与刻度对齐:全部叠在同一网格单元,水平位置与宽度由组件按刻度百分比写入(以刻度为中心)。 */
4955
5137
  .progress__stage-list {
4956
5138
  display: grid;
4957
- grid-template-columns: repeat(auto-fit, minmax(min(100%, 120px), 1fr));
4958
- gap: var(--q1-space-2) var(--q1-space-4);
4959
5139
  margin: var(--q1-space-2) 0 0;
4960
5140
  padding: 0;
4961
5141
  list-style: none;
4962
5142
  }
4963
5143
 
4964
5144
  .progress__stage {
5145
+ grid-area: 1 / 1;
4965
5146
  display: flex;
5147
+ flex-wrap: wrap;
5148
+ justify-content: center;
4966
5149
  align-items: baseline;
4967
- gap: var(--q1-space-2);
5150
+ column-gap: var(--q1-space-1);
5151
+ min-width: 0;
5152
+ text-align: center;
4968
5153
  font-size: 13px;
4969
5154
  line-height: 1.5;
4970
5155
  color: var(--q1-color-text-secondary);
@@ -5205,12 +5390,14 @@ a[href]:has(> .book):focus-visible {
5205
5390
  display: block;
5206
5391
  min-width: 0;
5207
5392
  max-width: 100%;
5393
+ /* 截断省略号用拉丁字形(见 fonts.css 'Q1 Latin Ellipsis',只覆盖 U+2026),去掉全角「…」两侧空白。 */
5394
+ font-family: 'Q1 Latin Ellipsis', var(--q1-font-sans);
5208
5395
  font-size: 14px;
5209
5396
  color: var(--q1-color-text-primary);
5210
5397
  }
5211
5398
 
5212
5399
  .middle-truncate--mono {
5213
- font-family: var(--q1-font-mono);
5400
+ font-family: 'Q1 Latin Ellipsis', var(--q1-font-mono);
5214
5401
  font-size: 13px;
5215
5402
  }
5216
5403
 
@@ -5332,6 +5519,21 @@ a[href]:has(> .book):focus-visible {
5332
5519
  align-self: flex-start;
5333
5520
  max-width: 100%;
5334
5521
  }
5522
+
5523
+ /* 有前导头像/图标时折到下一行的右栏与标题文字左缘对齐(缩进 = 前导宽度 + space-3),不退回卡片左缘。 */
5524
+ .entity:has(> .entity__main > .entity__leading) {
5525
+ display: grid;
5526
+ grid-template-columns: auto minmax(0, 1fr);
5527
+ column-gap: var(--q1-space-3);
5528
+ }
5529
+
5530
+ .entity:has(> .entity__main > .entity__leading) > .entity__main {
5531
+ display: contents;
5532
+ }
5533
+
5534
+ .entity:has(> .entity__main > .entity__leading) > .entity__trailing {
5535
+ grid-column: 2;
5536
+ }
5335
5537
  }
5336
5538
 
5337
5539
  .error-msg {
@@ -5369,6 +5571,13 @@ a[href]:has(> .book):focus-visible {
5369
5571
  margin-left: var(--q1-space-2);
5370
5572
  }
5371
5573
 
5574
+ /* 按钮型恢复操作(32px)独占一行,不与 20px 文字行顶对齐、折行后也不带行内缩进;文字链接仍随文内联。 */
5575
+ .error-msg__action:has(> .button) {
5576
+ display: flex;
5577
+ margin-top: var(--q1-space-2);
5578
+ margin-left: 0;
5579
+ }
5580
+
5372
5581
  .error-card {
5373
5582
  display: flex;
5374
5583
  flex-direction: column;
@@ -6266,16 +6475,25 @@ a.q1-card:focus-visible {
6266
6475
  overflow: hidden;
6267
6476
  }
6268
6477
 
6478
+ /* 原生 legend 默认骑在 fieldset 顶边框上、把边框切出缺口;浮动整宽让它回到内容流,
6479
+ 后继元素 clear 落到其下方。语义仍是原生 legend(读屏组名不变)。 */
6269
6480
  .fieldset__title {
6481
+ float: left;
6482
+ width: 100%;
6270
6483
  padding: var(--q1-space-4) var(--q1-space-6) 0;
6271
6484
  font-size: 16px;
6272
6485
  font-weight: var(--q1-font-weight-medium);
6273
6486
  color: var(--q1-color-text-primary);
6274
6487
  }
6275
6488
 
6489
+ .fieldset__title + * {
6490
+ clear: both;
6491
+ }
6492
+
6493
+ /* 上间距放进 padding:clear 后的 margin-top 会被 clearance 吞掉。 */
6276
6494
  .fieldset__subtitle {
6277
- margin: var(--q1-space-1) 0 0;
6278
- padding: 0 var(--q1-space-6) var(--q1-space-4);
6495
+ margin: 0;
6496
+ padding: var(--q1-space-1) var(--q1-space-6) var(--q1-space-4);
6279
6497
  font-size: 14px;
6280
6498
  color: var(--q1-color-text-secondary);
6281
6499
  }
@@ -6321,6 +6539,15 @@ a.q1-card:focus-visible {
6321
6539
  color: var(--q1-color-status-danger);
6322
6540
  }
6323
6541
 
6542
+ /* 窄屏:页脚纵排,说明文字整行在上、操作在下,避免日期与按钮文案被并排挤成两行。 */
6543
+ @media (max-width: 48rem) {
6544
+ .fieldset__footer {
6545
+ flex-direction: column;
6546
+ align-items: flex-start;
6547
+ gap: var(--q1-space-2);
6548
+ }
6549
+ }
6550
+
6324
6551
  .show-more__list {
6325
6552
  margin: 0;
6326
6553
  padding: 0;
@@ -6868,6 +7095,7 @@ a.q1-card:focus-visible {
6868
7095
  gap: var(--q1-space-1);
6869
7096
  max-width: 100%;
6870
7097
  }
7098
+ /* 页码宽度随内容自适应(最小 32px 方形),不按总页数位数预留固定宽度。 */
6871
7099
  .pagination__button {
6872
7100
  display: inline-flex;
6873
7101
  align-items: center;
@@ -6918,20 +7146,13 @@ a.q1-card:focus-visible {
6918
7146
  color: var(--q1-color-text-muted);
6919
7147
  text-align: center;
6920
7148
  }
6921
- .pagination__button--page,
6922
- .pagination__ellipsis {
6923
- box-sizing: border-box;
6924
- width: max(32px, calc(var(--pagination-page-digits) * 0.5rem + var(--q1-space-4)));
6925
- }
6926
7149
  @media (pointer: coarse) {
6927
7150
  .pagination__button {
6928
7151
  min-width: 44px;
6929
7152
  min-height: 44px;
6930
7153
  }
6931
7154
 
6932
- .pagination__button--page,
6933
7155
  .pagination__ellipsis {
6934
- width: max(44px, calc(var(--pagination-page-digits) * 0.5rem + var(--q1-space-4)));
6935
7156
  min-width: 44px;
6936
7157
  min-height: 44px;
6937
7158
  }
@@ -7338,21 +7559,10 @@ a.q1-card:focus-visible {
7338
7559
  position: relative;
7339
7560
  display: inline-flex;
7340
7561
  }
7562
+ /* 默认触发器外观来自 Button secondary sm,这里只保留提示触发器不可点击的指针语义。 */
7341
7563
  .q1-tooltip__trigger {
7342
- min-width: 56px;
7343
- padding: var(--q1-space-2) var(--q1-space-4);
7344
- border: 1px solid var(--q1-color-border-strong);
7345
- border-radius: var(--q1-radius-2);
7346
- background: var(--q1-color-bg-panel);
7347
- color: var(--q1-color-text-primary);
7348
- font: inherit;
7349
- font-size: 14px;
7350
7564
  cursor: default;
7351
7565
  }
7352
- .q1-tooltip__trigger:focus-visible {
7353
- outline: none;
7354
- box-shadow: var(--q1-shadow-focus);
7355
- }
7356
7566
  .q1-tooltip__bubble {
7357
7567
  position: fixed;
7358
7568
  z-index: var(--q1-z-popover);
@@ -7776,7 +7986,7 @@ a.q1-card:focus-visible {
7776
7986
  width: 64px;
7777
7987
  min-height: 44px;
7778
7988
  padding: var(--q1-space-2) var(--q1-space-3);
7779
- border: 1px solid var(--q1-color-border);
7989
+ border: 1px solid var(--q1-color-border-control);
7780
7990
  border-radius: var(--q1-radius-2);
7781
7991
  background: var(--q1-color-bg-panel);
7782
7992
  color: var(--q1-color-text-primary);
@@ -7811,6 +8021,18 @@ a.q1-card:focus-visible {
7811
8021
  touch-action: pan-y;
7812
8022
  user-select: none;
7813
8023
  }
8024
+ /* 窄屏:滑轨独占整行,上下限数字框移到滑轨下方左右两端,滑轨不再被两侧数字框挤窄。 */
8025
+ @media (max-width: 48rem) {
8026
+ .range-slider__controls {
8027
+ flex-wrap: wrap;
8028
+ justify-content: space-between;
8029
+ row-gap: var(--q1-space-2);
8030
+ }
8031
+ .range-slider__track-area {
8032
+ order: -1;
8033
+ flex-basis: 100%;
8034
+ }
8035
+ }
7814
8036
  .range-slider__rail {
7815
8037
  position: absolute;
7816
8038
  top: 50%;
@@ -8331,16 +8553,18 @@ a.q1-card:focus-visible {
8331
8553
  background: var(--q1-color-bg-overlay);
8332
8554
  box-shadow: var(--q1-shadow-popover);
8333
8555
  }
8556
+ /* 表头与选项行同高(space-8 = 32px);左内边距 = 选项左内边距 + 勾选框(16px = space-4) + gap,
8557
+ 让「全选」文字与选项标签列对齐。 */
8334
8558
  .multi-select__bulk {
8335
8559
  display: flex;
8336
8560
  align-items: center;
8337
8561
  justify-content: space-between;
8338
- padding: var(--q1-space-1) var(--q1-space-3);
8562
+ height: var(--q1-space-8);
8563
+ padding: 0 var(--q1-space-3) 0 calc(var(--q1-space-3) * 2 + var(--q1-space-4));
8339
8564
  margin-bottom: var(--q1-space-1);
8340
8565
  }
8341
8566
  .multi-select__bulk-button {
8342
- min-height: var(--q1-space-6);
8343
- padding: var(--q1-space-1) var(--q1-space-2);
8567
+ padding: 0;
8344
8568
  border: 0;
8345
8569
  border-radius: var(--q1-radius-1);
8346
8570
  background: transparent;
@@ -8451,8 +8675,9 @@ a.q1-card:focus-visible {
8451
8675
  .multi-select__option:hover {
8452
8676
  background: color-mix(in srgb, var(--q1-color-text-primary) 5%, transparent);
8453
8677
  }
8678
+ /* 去内边距后底色会贴字,悬停改为文字升到主色。 */
8454
8679
  .multi-select__bulk-button:hover {
8455
- background: var(--q1-color-bg-subtle);
8680
+ color: var(--q1-color-text-primary);
8456
8681
  }
8457
8682
  }
8458
8683
  @media (pointer: coarse), (any-pointer: coarse) {
@@ -8461,7 +8686,8 @@ a.q1-card:focus-visible {
8461
8686
  .multi-select__option {
8462
8687
  min-height: 44px;
8463
8688
  }
8464
- .multi-select__option {
8689
+ .multi-select__option,
8690
+ .multi-select__bulk {
8465
8691
  height: auto;
8466
8692
  }
8467
8693
  }
@@ -9725,6 +9951,17 @@ a.q1-navigation__item[aria-disabled='true'] {
9725
9951
  white-space: nowrap;
9726
9952
  }
9727
9953
 
9954
+ /* 同一分区内只要有一项带图标(条目或分组触发器),无图标的直属条目预留 16px 图标槽,
9955
+ 文字起点与带图标项对齐;横向导航不受影响。 */
9956
+ .q1-navigation:not(.q1-navigation--horizontal) .q1-navigation__section-content:has(
9957
+ > .q1-navigation__item-row > .q1-navigation__item > .q1-navigation__item-icon,
9958
+ > .q1-navigation__group > .q1-navigation__group-trigger > .q1-navigation__group-icon
9959
+ ) > .q1-navigation__item-row > .q1-navigation__item:not(:has(> .q1-navigation__item-icon))::before {
9960
+ flex: none;
9961
+ width: var(--q1-space-4);
9962
+ content: '';
9963
+ }
9964
+
9728
9965
  /* 独立 translate 与展开时的 transform: rotate 叠加,互不覆盖。 */
9729
9966
  .q1-navigation__group-chevron {
9730
9967
  flex: none;
@@ -10762,6 +10999,21 @@ a.q1-navigation__item[aria-disabled='true'] {
10762
10999
  transform: translateX(-100%);
10763
11000
  }
10764
11001
 
11002
+ /* 窄屏只留首尾轴标签:中间标签隐藏,首尾各让出到一半宽度(min-width 压过行内 max-width),末端文字右对齐贴住终点。 */
11003
+ @media (max-width: 48rem) {
11004
+ .q1-chart__axis-label--middle {
11005
+ display: none;
11006
+ }
11007
+
11008
+ .q1-chart__axis:has(> .q1-chart__axis-label--middle) > :is(.q1-chart__axis-label--start, .q1-chart__axis-label--end) {
11009
+ min-width: 50%;
11010
+ }
11011
+
11012
+ .q1-chart__axis-label--end {
11013
+ text-align: end;
11014
+ }
11015
+ }
11016
+
10765
11017
  /* ==========================================================================
10766
11018
  Link(正文链接)
10767
11019
  ==========================================================================
@@ -10832,6 +11084,7 @@ a.q1-navigation__item[aria-disabled='true'] {
10832
11084
 
10833
11085
  .form-control:focus,
10834
11086
  .input-control:has(.form-control:focus),
11087
+ .input-control:has(.input-control__action .button:focus-visible),
10835
11088
  .textarea-control:has(.form-control:focus),
10836
11089
  .combobox__control:has(.combobox__input:focus),
10837
11090
  .multi-select__trigger:focus,
@@ -11068,10 +11321,15 @@ a.q1-navigation__item[aria-disabled='true'] {
11068
11321
  .cal-popover {
11069
11322
  box-sizing: border-box;
11070
11323
  max-width: calc(100vw - var(--q1-space-2));
11071
- left: var(--cal-popover-offset-x, 0);
11324
+ max-height: calc(100vh - var(--q1-space-2));
11325
+ overflow-y: auto;
11072
11326
  transform-origin: var(--cal-popover-origin-x, left) top;
11073
11327
  }
11074
11328
 
11329
+ .cal-popover[data-side='top'] {
11330
+ transform-origin: var(--cal-popover-origin-x, left) bottom;
11331
+ }
11332
+
11075
11333
  @media (prefers-reduced-motion: no-preference) {
11076
11334
  .cal-popover[data-motion-input='pointer'] {
11077
11335
  animation: q1-calendar-popover-enter var(--q1-duration-fast) var(--q1-ease-out) both;
@@ -11153,22 +11411,39 @@ a.q1-navigation__item[aria-disabled='true'] {
11153
11411
  }
11154
11412
  }
11155
11413
 
11414
+ /* 时间输入复用 Input 的 .form-control 皮肤与 sm 高度档;宽度按 HH:mm 五个等宽字符加左右内边距。 */
11156
11415
  .cal-time-input {
11157
- min-width: 0;
11158
- max-width: 100%;
11159
- padding: var(--q1-space-1) var(--q1-space-2);
11160
- border: thin solid var(--q1-color-border);
11161
- border-radius: var(--q1-radius-2);
11162
- background: var(--q1-color-bg-raised);
11163
- color: var(--q1-color-text-primary);
11164
- font: inherit;
11416
+ flex: none;
11417
+ width: calc(6ch + 2 * var(--q1-space-3));
11165
11418
  font-variant-numeric: tabular-nums;
11166
11419
  }
11167
- .cal-time-input:focus-visible { outline: none; box-shadow: var(--q1-shadow-focus); }
11168
11420
  @media (pointer: coarse), (any-pointer: coarse) {
11169
11421
  .cal-time-input { min-height: var(--q1-touch-target-min); font-size: var(--q1-font-size-copy-16); }
11170
11422
  }
11171
11423
 
11424
+ /* Calendar 触发器:与 Select 一样铺满所在列,长值截断;禁用态对齐 Select(浅灰底、弱边界、弱化文字)。 */
11425
+ .cal-field__trigger {
11426
+ min-width: 0;
11427
+ }
11428
+
11429
+ .cal-field__label {
11430
+ min-width: 0;
11431
+ overflow: hidden;
11432
+ text-overflow: ellipsis;
11433
+ white-space: nowrap;
11434
+ }
11435
+
11436
+ .cal-field .cal-field__control:has(.cal-field__trigger:disabled) {
11437
+ background: var(--q1-color-gray-100);
11438
+ box-shadow: inset 0 0 0 calc(var(--q1-space-1) / 4) var(--q1-color-border);
11439
+ }
11440
+
11441
+ .cal-field .cal-field__trigger:disabled,
11442
+ .cal-field .cal-field__caret:disabled {
11443
+ color: var(--q1-color-text-muted);
11444
+ cursor: not-allowed;
11445
+ }
11446
+
11172
11447
  @media (max-width: 40rem) {
11173
11448
  .sheet__panel.sheet__panel--mobile-fullscreen {
11174
11449
  inset: 0;
@@ -11718,6 +11993,217 @@ a.q1-navigation__item[aria-disabled='true'] {
11718
11993
  white-space: normal;
11719
11994
  }
11720
11995
 
11996
+ /* ContextSwitcher 组织形态:居中可编辑头部、行尾附注、flush 层级与右侧子菜单。随包样式发布。 */
11997
+ .q1-context-switcher__stacked-header--centered {
11998
+ flex-direction: column;
11999
+ align-items: center;
12000
+ gap: var(--q1-space-2);
12001
+ padding-block: var(--q1-space-4) var(--q1-space-3);
12002
+ text-align: center;
12003
+ }
12004
+
12005
+ .q1-context-switcher__stacked-header--centered:has(.q1-context-switcher__description) {
12006
+ align-items: center;
12007
+ }
12008
+
12009
+ .q1-context-switcher__stacked-header--centered .q1-context-switcher__avatar-action-menu {
12010
+ display: flex;
12011
+ }
12012
+
12013
+ .q1-context-switcher__stacked-header--centered .q1-context-switcher__current {
12014
+ justify-items: center;
12015
+ row-gap: var(--q1-space-1);
12016
+ }
12017
+
12018
+ .q1-context-switcher__stacked-header--centered > .q1-context-switcher__avatar {
12019
+ translate: none;
12020
+ }
12021
+
12022
+ .q1-context-switcher__stacked-header--centered .q1-context-switcher__current-label {
12023
+ font-size: var(--q1-font-size-label-14);
12024
+ font-weight: var(--q1-font-weight-semibold);
12025
+ line-height: var(--q1-line-height-label-14);
12026
+ }
12027
+
12028
+ .q1-context-switcher__avatar-action .q1-avatar-button__tile > svg {
12029
+ width: var(--q1-space-4);
12030
+ height: var(--q1-space-4);
12031
+ }
12032
+
12033
+ /* 行尾附注:纯文字计数,与勾、处理中占同一尾槽(同宽、同中心),只显示一个。 */
12034
+ .q1-context-switcher__meta {
12035
+ display: inline-flex;
12036
+ flex: none;
12037
+ min-width: var(--q1-space-4);
12038
+ justify-content: center;
12039
+ color: var(--q1-color-text-secondary);
12040
+ font-size: var(--q1-font-size-label-12);
12041
+ font-variant-numeric: tabular-nums;
12042
+ line-height: var(--q1-line-height-label-12);
12043
+ }
12044
+
12045
+ .q1-context-switcher__submenu-chevron {
12046
+ flex: none;
12047
+ margin-inline-start: auto;
12048
+ color: var(--q1-color-text-muted);
12049
+ }
12050
+
12051
+ /* flush:子项与父项图块左对齐,层级只靠分组、计数与 aria-describedby 表达。 */
12052
+ .q1-context-switcher__popup--stacked[data-nesting='flush'] .q1-context-switcher__item--nested {
12053
+ padding-inline-start: var(--q1-space-2);
12054
+ }
12055
+
12056
+ .q1-context-switcher__item[aria-expanded='true'],
12057
+ .q1-context-switcher__action[aria-expanded='true'] {
12058
+ background: var(--q1-color-bg-subtle);
12059
+ }
12060
+
12061
+ .q1-context-switcher__popup--stacked .q1-context-switcher__item[aria-expanded='true']::before,
12062
+ .q1-context-switcher__popup--stacked .q1-context-switcher__action[aria-expanded='true']::before {
12063
+ opacity: 1;
12064
+ }
12065
+
12066
+ .q1-context-switcher__submenu {
12067
+ position: fixed;
12068
+ z-index: 1;
12069
+ display: grid;
12070
+ width: max-content;
12071
+ min-width: calc(var(--q1-space-24) * 2);
12072
+ max-width: calc(100vw - var(--q1-space-4));
12073
+ border-radius: var(--q1-radius-3);
12074
+ background: var(--q1-color-bg-overlay);
12075
+ padding: var(--q1-space-1);
12076
+ box-shadow: var(--q1-shadow-popover);
12077
+ }
12078
+
12079
+ /* 右弹子菜单在弹层之外绘制:打开期间放开弹层裁切(列表滚动由内部分组容器承担)。 */
12080
+ .q1-context-switcher__popup:has(.q1-context-switcher__submenu:is([data-side='right'], [data-side='left'])) {
12081
+ overflow: visible;
12082
+ }
12083
+
12084
+ .q1-context-switcher__submenu .q1-context-switcher__submenu-item {
12085
+ min-height: var(--q1-space-10);
12086
+ }
12087
+
12088
+ /* 组织形态与子菜单的高亮只有一层:1px 描边 + 行浅底(::before),不叠双层焦点光晕。 */
12089
+ .q1-context-switcher__popup--stacked[data-nesting='flush'] :is(.q1-context-switcher__item, .q1-context-switcher__action):focus-visible,
12090
+ .q1-context-switcher__submenu .q1-context-switcher__submenu-item:focus {
12091
+ outline: 1px solid var(--q1-color-border-strong);
12092
+ outline-offset: -1px;
12093
+ box-shadow: none;
12094
+ }
12095
+
12096
+ .q1-context-switcher__submenu .q1-context-switcher__submenu-item:focus::before {
12097
+ opacity: 1;
12098
+ }
12099
+
12100
+ /* 窄屏就地展开:子项作为列表流中的缩进行,没有卡片底色与阴影,缩进一个图标块宽度。 */
12101
+ @media (max-width: 48rem) {
12102
+ .q1-context-switcher__submenu {
12103
+ position: static;
12104
+ width: auto;
12105
+ min-width: 0;
12106
+ max-width: none;
12107
+ border-radius: 0;
12108
+ background: transparent;
12109
+ padding: 0 0 0 var(--q1-space-6);
12110
+ box-shadow: none;
12111
+ }
12112
+
12113
+ .q1-context-switcher__submenu .q1-context-switcher__submenu-item:focus {
12114
+ outline: none;
12115
+ }
12116
+ }
12117
+
12118
+ /* AvatarButton:可编辑头像图块。徽标只在悬停 / 键盘焦点时出现,且不拦截指针。 */
12119
+ .q1-avatar-button {
12120
+ --q1-avatar-button-size: var(--q1-space-8);
12121
+ position: relative;
12122
+ display: inline-flex;
12123
+ flex: none;
12124
+ width: var(--q1-avatar-button-size);
12125
+ height: var(--q1-avatar-button-size);
12126
+ border: 0;
12127
+ border-radius: var(--q1-radius-2);
12128
+ background: transparent;
12129
+ padding: 0;
12130
+ color: var(--q1-color-text-secondary);
12131
+ font: inherit;
12132
+ text-decoration: none;
12133
+ cursor: pointer;
12134
+ transition: box-shadow var(--q1-duration-press) var(--q1-ease-out);
12135
+ }
12136
+
12137
+ .q1-avatar-button__tile {
12138
+ display: inline-flex;
12139
+ width: 100%;
12140
+ height: 100%;
12141
+ overflow: hidden;
12142
+ align-items: center;
12143
+ justify-content: center;
12144
+ border-radius: inherit;
12145
+ background: var(--q1-color-bg-subtle);
12146
+ font-size: var(--q1-font-size-label-13);
12147
+ font-weight: var(--q1-font-weight-semibold);
12148
+ }
12149
+
12150
+ .q1-avatar-button__img {
12151
+ width: 100%;
12152
+ height: 100%;
12153
+ object-fit: cover;
12154
+ }
12155
+
12156
+ /* 悬停 / 焦点只加一圈柔和外环(取 focus 色的外层光晕),不叠内圈描边。 */
12157
+ .q1-avatar-button {
12158
+ --q1-avatar-button-ring: 0 0 0 var(--q1-space-1) color-mix(in srgb, var(--q1-color-focus) 16%, transparent);
12159
+ }
12160
+
12161
+ /* 方块徽标向外凸出半个 space-1,压在图块右下角。 */
12162
+ .q1-avatar-button__badge {
12163
+ position: absolute;
12164
+ right: calc(var(--q1-space-1) / -2);
12165
+ bottom: calc(var(--q1-space-1) / -2);
12166
+ display: inline-flex;
12167
+ width: var(--q1-space-3);
12168
+ height: var(--q1-space-3);
12169
+ align-items: center;
12170
+ justify-content: center;
12171
+ border-radius: var(--q1-radius-1);
12172
+ background: var(--q1-color-bg-overlay);
12173
+ color: var(--q1-color-text-secondary);
12174
+ opacity: 0;
12175
+ pointer-events: none;
12176
+ transition: opacity var(--q1-duration-press) var(--q1-ease-out);
12177
+ }
12178
+
12179
+ .q1-avatar-button:focus-visible {
12180
+ outline: none;
12181
+ box-shadow: var(--q1-avatar-button-ring);
12182
+ }
12183
+
12184
+ /* 键盘焦点立即显示徽标;指针悬停才走淡入。 */
12185
+ .q1-avatar-button:focus-visible .q1-avatar-button__badge {
12186
+ opacity: 1;
12187
+ transition: none;
12188
+ }
12189
+
12190
+ @media (hover: hover) and (pointer: fine) {
12191
+ .q1-avatar-button:hover {
12192
+ box-shadow: var(--q1-avatar-button-ring);
12193
+ }
12194
+
12195
+ .q1-avatar-button:hover .q1-avatar-button__badge {
12196
+ opacity: 1;
12197
+ }
12198
+ }
12199
+
12200
+ @media (prefers-reduced-motion: reduce) {
12201
+ .q1-avatar-button,
12202
+ .q1-avatar-button__badge {
12203
+ transition: none;
12204
+ }
12205
+ }
12206
+
11721
12207
  .copy-button {
11722
12208
  display: grid;
11723
12209
  place-items: center;
@@ -12266,6 +12752,100 @@ a.q1-navigation__item[aria-disabled='true'] {
12266
12752
  }
12267
12753
  }
12268
12754
 
12755
+ /* Label + InfoTip:标签与说明微图标同行;常驻面板换行铺满整行。 */
12756
+ .label-row,
12757
+ .form-field__label-row {
12758
+ display: flex;
12759
+ flex-wrap: wrap;
12760
+ align-items: center;
12761
+ gap: var(--q1-space-1);
12762
+ min-width: 0;
12763
+ }
12764
+
12765
+ .info-tip {
12766
+ display: contents;
12767
+ }
12768
+
12769
+ /* 16px 线性图标、静止 text-muted、悬停/聚焦转 text-primary,无底块。
12770
+ 命中盒 24×24(WCAG 2.5.8),负 margin 吃回多出的 4px,不抬高 20px 标签行、视觉间距仍是 space-1;
12771
+ 触屏下 TouchTarget 再扩到 --q1-touch-target-min。 */
12772
+ .info-tip__trigger,
12773
+ .info-tip__close {
12774
+ position: relative;
12775
+ display: inline-grid;
12776
+ place-items: center;
12777
+ flex: 0 0 auto;
12778
+ width: var(--q1-space-6);
12779
+ height: var(--q1-space-6);
12780
+ margin: calc(var(--q1-space-1) / -2) calc(var(--q1-space-1) * -1);
12781
+ padding: 0;
12782
+ border: none;
12783
+ border-radius: var(--q1-radius-1);
12784
+ background: transparent;
12785
+ color: var(--q1-color-text-muted);
12786
+ cursor: help;
12787
+ transition:
12788
+ color var(--q1-duration-press) var(--q1-ease-out),
12789
+ transform var(--q1-duration-press) var(--q1-ease-out);
12790
+ touch-action: manipulation;
12791
+ --touch-target-border-width: 0px;
12792
+ }
12793
+
12794
+ .info-tip__close {
12795
+ cursor: pointer;
12796
+ }
12797
+
12798
+ .info-tip__trigger:hover,
12799
+ .info-tip__trigger:focus-visible,
12800
+ .info-tip__trigger[aria-expanded='true'],
12801
+ .info-tip__close:hover,
12802
+ .info-tip__close:focus-visible {
12803
+ color: var(--q1-color-text-primary);
12804
+ }
12805
+
12806
+ .info-tip__trigger:focus-visible,
12807
+ .info-tip__close:focus-visible {
12808
+ outline: none;
12809
+ box-shadow: var(--q1-shadow-focus);
12810
+ }
12811
+
12812
+ .info-tip__trigger[data-motion-input='pointer']:active {
12813
+ transform: scale(0.97);
12814
+ }
12815
+
12816
+ .info-tip__panel {
12817
+ flex: 1 0 100%;
12818
+ display: flex;
12819
+ align-items: flex-start;
12820
+ justify-content: flex-start;
12821
+ gap: var(--q1-space-2);
12822
+ color: var(--q1-color-text-secondary);
12823
+ font-size: var(--q1-font-size-label-13);
12824
+ font-weight: var(--q1-font-weight-regular);
12825
+ line-height: var(--q1-line-height-label-13);
12826
+ text-align: start;
12827
+ }
12828
+
12829
+ .info-tip__panel[hidden] {
12830
+ display: none;
12831
+ }
12832
+
12833
+ .info-tip__content {
12834
+ min-width: 0;
12835
+ overflow-wrap: anywhere;
12836
+ }
12837
+
12838
+ @media (prefers-reduced-motion: reduce) {
12839
+ .info-tip__trigger,
12840
+ .info-tip__close {
12841
+ transition: none;
12842
+ }
12843
+
12844
+ .info-tip__trigger[data-motion-input='pointer']:active {
12845
+ transform: none;
12846
+ }
12847
+ }
12848
+
12269
12849
  /* Destructive Action Modal 的短屏结构与指针开关动效;全局 Modal 家族保持原行为。 */
12270
12850
  .destructive-modal {
12271
12851
  padding-block:
@@ -12732,6 +13312,9 @@ a.q1-navigation__item[aria-disabled='true'] {
12732
13312
  .filter-chip--sm { height: var(--q1-space-8); }
12733
13313
  .filter-chip--md { height: var(--q1-control-height-default); }
12734
13314
  .filter-chip--lg { height: calc(var(--q1-control-height-default) + var(--q1-space-2)); }
13315
+ /* lg 高 48:短文案时横向内边距随档放宽,避免胶囊被压成近正圆。 */
13316
+ .filter-chip--lg .filter-chip__picker { padding-inline: var(--q1-space-3); }
13317
+ .filter-chip--lg .filter-chip__clear + .filter-chip__picker { padding-inline-start: var(--q1-space-1); }
12735
13318
 
12736
13319
  .popover-trigger { display: inline-flex; }
12737
13320
  .popover-panel {
@@ -12860,12 +13443,16 @@ a.q1-navigation__item[aria-disabled='true'] {
12860
13443
  .timeline::before { content: ''; position: absolute; left: calc(var(--q1-space-3) - var(--q1-space-1) / 8); top: var(--q1-space-2); bottom: var(--q1-space-2); width: 1px; background: var(--q1-color-border-strong); }
12861
13444
  .timeline__item { position: relative; display: grid; grid-template-columns: var(--q1-space-6) minmax(0, 1fr); gap: var(--q1-space-3); padding-block: var(--q1-space-1-5); }
12862
13445
  .timeline__indicator { display: grid; place-items: center; height: var(--q1-space-6); z-index: 1; background: var(--q1-color-bg-panel); }
12863
- .timeline__dot { width: var(--q1-space-2); height: var(--q1-space-2); border-radius: var(--q1-radius-full); background: var(--q1-color-border-strong); }
13446
+ .timeline__dot { width: var(--q1-space-2); height: var(--q1-space-2); border-radius: var(--q1-radius-full); background: var(--q1-color-text-muted); }
12864
13447
  .timeline__dot--success { background: var(--q1-color-status-success); }
12865
13448
  .timeline__dot--danger { background: var(--q1-color-status-danger); }
12866
13449
  .timeline__dot--warning { background: var(--q1-color-status-warning); }
12867
13450
  .timeline__content { min-width: 0; }
12868
- .timeline__disclosure { border: 0; padding: var(--q1-space-1) 0; background: transparent; color: var(--q1-color-text-muted); font: inherit; font-size: var(--q1-font-size-label-13); cursor: pointer; }
13451
+ .timeline__disclosure { display: inline-flex; align-items: center; gap: var(--q1-space-1); max-width: 100%; border: 0; padding: var(--q1-space-1) 0; background: transparent; color: var(--q1-color-text-muted); font: inherit; font-size: var(--q1-font-size-label-13); text-align: start; cursor: pointer; }
13452
+ /* 摘要可折行,chevron 固定在行尾不单独掉行、与首行同中线;展开时转向下方,与全站 chevron 披露一致。 */
13453
+ .timeline__disclosure-label { min-width: 0; }
13454
+ .timeline__disclosure-icon { flex: none; align-self: flex-start; height: 1lh; }
13455
+ .timeline__disclosure[aria-expanded='true'] .timeline__disclosure-icon { rotate: 90deg; }
12869
13456
  .timeline__disclosure:focus-visible { outline: none; box-shadow: var(--q1-shadow-focus); border-radius: var(--q1-radius-1); }
12870
13457
  @media (pointer: coarse), (any-pointer: coarse) { .timeline__disclosure { min-height: var(--q1-touch-target-min); } }
12871
13458
 
@@ -12942,10 +13529,15 @@ a.q1-navigation__item[aria-disabled='true'] {
12942
13529
 
12943
13530
  .attachment { display: inline-flex; align-items: center; gap: var(--q1-space-2); padding: var(--q1-space-1-5) var(--q1-space-2-5); border: 1px solid var(--q1-color-border); border-radius: var(--q1-radius-2); max-width: 100%; min-width: 0; }
12944
13531
  .attachment__icon { display: grid; place-items: center; width: var(--q1-space-7); height: var(--q1-space-7); background: var(--q1-color-bg-subtle); border-radius: var(--q1-radius-1); flex-shrink: 0; }
12945
- .attachment__details { min-width: 0; }
13532
+ .attachment__details { display: grid; min-width: var(--q1-space-24); }
13533
+ .attachment__details > .progress,
13534
+ .attachment__error { margin-top: var(--q1-space-1); }
12946
13535
  .attachment__name { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--q1-font-size-label-13); }
12947
13536
  .attachment__size { color: var(--q1-color-text-muted); font-size: var(--q1-font-size-label-13); }
12948
- .attachment__error { display: block; color: var(--q1-color-status-danger-text); }
13537
+ .attachment__error { display: flex; align-items: center; gap: var(--q1-space-2); color: var(--q1-color-status-danger-text); font-size: var(--q1-font-size-label-13); line-height: var(--q1-line-height-label-13); }
13538
+ .attachment__retry { position: relative; --touch-target-border-width: 0px; border: 0; padding: 0; background: transparent; color: var(--q1-color-text-primary); font: inherit; font-weight: var(--q1-font-weight-medium); border-radius: var(--q1-radius-1); cursor: pointer; }
13539
+ .attachment__retry:hover { text-decoration: underline; }
13540
+ .attachment__retry:focus-visible { outline: none; box-shadow: var(--q1-shadow-focus); }
12949
13541
  .attachment__remove { position: relative; --touch-target-border-width: 0px; border: 0; background: transparent; color: var(--q1-color-text-muted); display: grid; place-items: center; width: var(--q1-space-6); height: var(--q1-space-6); border-radius: var(--q1-radius-1); flex-shrink: 0; }
12950
13542
  .attachment__remove:hover { background: var(--q1-color-bg-hover); }
12951
13543
  .attachment__remove:focus-visible { outline: none; box-shadow: var(--q1-shadow-focus); }
@@ -13064,11 +13656,10 @@ a.q1-navigation__item[aria-disabled='true'] {
13064
13656
  display: block;
13065
13657
  }
13066
13658
 
13067
- .feedback__select,
13068
13659
  .feedback__textarea {
13069
13660
  width: 100%;
13070
13661
  padding: var(--q1-space-2) var(--q1-space-3);
13071
- border: 1px solid var(--q1-color-border);
13662
+ border: 1px solid var(--q1-color-border-control);
13072
13663
  border-radius: var(--q1-radius-2);
13073
13664
  background: var(--q1-color-bg-panel);
13074
13665
  color: var(--q1-color-text-primary);
@@ -13228,11 +13819,6 @@ a.q1-navigation__item[aria-disabled='true'] {
13228
13819
  line-height: var(--field-error-line-height);
13229
13820
  }
13230
13821
 
13231
- /* FormField 的描述原为 20px 行盒,错误切换保持相同几何;文字仍为 13px。 */
13232
- .form-field__message {
13233
- --field-error-line-height: var(--q1-line-height-label-14);
13234
- }
13235
-
13236
13822
  /* 图标对齐第一行,独立 ErrorMessage 保留既有各尺寸行高。 */
13237
13823
  .error-msg {
13238
13824
  --field-error-line-height: var(--q1-line-height-label-13);
@@ -13427,7 +14013,8 @@ a.q1-navigation__item[aria-disabled='true'] {
13427
14013
  line-height: var(--q1-line-height-label-13);
13428
14014
  }
13429
14015
 
13430
- /* Form boundaries and brand graphics: owner-approved dark/mobile audit roles. */
14016
+ /* Form boundaries and brand graphics: owner-approved dark/mobile audit roles.
14017
+ Checkbox Circle keeps its own tone stroke (status-* / text-muted), so it is excluded here. */
13431
14018
  :root[data-theme='dark'] :is(
13432
14019
  .form-control:not(.input-control .form-control):not(.textarea-control .form-control):not(:disabled):not([aria-invalid='true']):not(.form-field--error .form-control),
13433
14020
  .input-control:not(:has(:disabled, [aria-invalid='true'])):not(.form-field--error .input-control),
@@ -13453,11 +14040,25 @@ a.q1-navigation__item[aria-disabled='true'] {
13453
14040
  .q1-verification-code:not(:has(:disabled, [aria-invalid='true'])) .q1-verification-code__slot,
13454
14041
  .choicebox:not(:has(:checked, :disabled)),
13455
14042
  .choicebox:not(:has(:checked, :disabled)) .choicebox__indicator,
13456
- .control-option:has(input:not(:checked):not(:indeterminate):not(:disabled)) .control-option__visual
14043
+ .control-option:not(.checkbox-circle):has(input:not(:checked):not(:indeterminate):not(:disabled)) .control-option__visual
13457
14044
  ) {
13458
14045
  border-color: var(--q1-color-border-control);
13459
14046
  }
13460
14047
 
14048
+ /* 控件基础边框统一走 --q1-color-border-control;禁用态保持原来的弱边界 --q1-color-border,
14049
+ 不随控件边界角色加深(暗色下 border-control 比 border 更亮)。 */
14050
+ .input-control:has(.form-control:disabled):not(:has([aria-invalid='true'])):not(.form-field--error .input-control),
14051
+ .form-control:disabled:not(.input-control .form-control):not(.textarea-control .form-control):not([aria-invalid='true']):not(.form-field--error .form-control) {
14052
+ border-color: var(--q1-input-border, var(--q1-color-border));
14053
+ }
14054
+
14055
+ .textarea-control:has(.form-control:disabled):not(:has([aria-invalid='true'])):not(.form-field--error .textarea-control),
14056
+ .feedback__select:disabled,
14057
+ .feedback__textarea:disabled,
14058
+ .range-slider__number:disabled {
14059
+ border-color: var(--q1-color-border);
14060
+ }
14061
+
13461
14062
  :root[data-theme='dark'] .cal-field__control {
13462
14063
  box-shadow: inset 0 0 0 calc(var(--q1-space-1) / 4) var(--q1-color-border-control);
13463
14064
  }
@@ -13473,7 +14074,7 @@ a.q1-navigation__item[aria-disabled='true'] {
13473
14074
  border-color: var(--q1-color-gray-700);
13474
14075
  }
13475
14076
 
13476
- :root[data-theme='dark'] .control-option:has(input:not(:checked):not(:indeterminate):not(:disabled)):hover .control-option__visual {
14077
+ :root[data-theme='dark'] .control-option:not(.checkbox-circle):has(input:not(:checked):not(:indeterminate):not(:disabled)):hover .control-option__visual {
13477
14078
  border-color: var(--q1-color-text-secondary);
13478
14079
  }
13479
14080
  }
@@ -13490,19 +14091,19 @@ a.q1-navigation__item[aria-disabled='true'] {
13490
14091
 
13491
14092
  :root[data-theme='dark'] .slider-input:not(.range-slider__thumb):not(:disabled)::-webkit-slider-runnable-track,
13492
14093
  :root[data-theme='dark'] .range-slider:not(.range-slider--disabled) .range-slider__rail {
13493
- background: var(--q1-color-gray-500);
14094
+ background: var(--q1-color-border-control);
13494
14095
  }
13495
14096
 
13496
14097
  :root[data-theme='dark'] .slider-input:not(.range-slider__thumb):not(:disabled)::-moz-range-track {
13497
- background: var(--q1-color-gray-500);
14098
+ background: var(--q1-color-border-control);
13498
14099
  }
13499
14100
 
13500
14101
  :root[data-theme='dark'] .slider-input--filled:not(.range-slider__thumb):not(:disabled)::-webkit-slider-runnable-track {
13501
- background: linear-gradient(to right, var(--q1-color-accent-graphic) var(--slider-pct), var(--q1-color-gray-500) var(--slider-pct));
14102
+ background: linear-gradient(to right, var(--q1-color-accent-graphic) var(--slider-pct), var(--q1-color-border-control) var(--slider-pct));
13502
14103
  }
13503
14104
 
13504
14105
  :root[data-theme='dark'] .slider-input--filled:not(.range-slider__thumb):not(:disabled)::-moz-range-track {
13505
- background: linear-gradient(to right, var(--q1-color-accent-graphic) var(--slider-pct), var(--q1-color-gray-500) var(--slider-pct));
14106
+ background: linear-gradient(to right, var(--q1-color-accent-graphic) var(--slider-pct), var(--q1-color-border-control) var(--slider-pct));
13506
14107
  }
13507
14108
 
13508
14109
  .range-slider:not(.range-slider--disabled) .range-slider__fill,
@@ -13513,3 +14114,49 @@ a.q1-navigation__item[aria-disabled='true'] {
13513
14114
  .q1-chart__line {
13514
14115
  stroke: var(--q1-color-accent-graphic);
13515
14116
  }
14117
+
14118
+ /* 暗色表面抬升:亮色下靠恒深底色或投影成立的轮廓,暗色下与底色同色而消失。
14119
+ 只在 :root[data-theme='dark'] 分支改,亮色外观不变;统一走面板底色 + 1px hairline。 */
14120
+
14121
+ /* 无框卡片:亮色靠投影浮起;暗色投影不可见,补 hairline 保住卡片边界。 */
14122
+ :root[data-theme='dark'] .q1-card--borderless {
14123
+ border-color: var(--q1-color-border);
14124
+ }
14125
+
14126
+ /* +N 收纳芯片与页顶公告药丸:恒深底色在暗色画布上与底同色,改面板底 + hairline + 主文字色。 */
14127
+ :root[data-theme='dark'] .avatar--overflow,
14128
+ :root[data-theme='dark'] .banner__cta {
14129
+ border: 1px solid var(--q1-color-border);
14130
+ background: var(--q1-color-bg-panel);
14131
+ color: var(--q1-color-text-primary);
14132
+ }
14133
+
14134
+ @media (hover: hover) and (pointer: fine) {
14135
+ /* 悬停与同族 .banner__action 一致:底色换 bg-subtle。 */
14136
+ :root[data-theme='dark'] .banner__cta:hover {
14137
+ background: var(--q1-color-bg-subtle);
14138
+ }
14139
+ }
14140
+
14141
+ /* Badge Pill:亮色 background-200 是近白浅底,暗色同一 token 翻成纯黑,在面板上成黑块;改面板底色;
14142
+ :where 把特异性压回基础规则,悬停/按下态照常覆盖。 */
14143
+ :where(:root[data-theme='dark']) .badge__pill-visual {
14144
+ background: var(--q1-color-bg-panel);
14145
+ }
14146
+
14147
+ /* Filter Chip:暗色 bg-canvas 比示例面板更深,成黑块;改面板底色(同上用 :where 保留悬停态)。 */
14148
+ :where(:root[data-theme='dark']) .filter-chip {
14149
+ background: var(--q1-color-bg-panel);
14150
+ }
14151
+
14152
+ /* 虚线占位(Filter Chip 未设值、Context Menu 触发区):暗色 border-strong 与面板仅约 1.4:1,
14153
+ 先用 text-muted 拉到 ≥ 3:1;border-strong 取值定案后再统一回归。 */
14154
+ :root[data-theme='dark'] .filter-chip:not(.filter-chip--set):not([data-disabled]),
14155
+ :root[data-theme='dark'] .context-menu__area {
14156
+ border-color: var(--q1-color-text-muted);
14157
+ }
14158
+
14159
+ /* Multi Select 未选中勾选框:暗色 border-strong 落在浮层底上约 1.1:1;改控件边界角色 border-control。 */
14160
+ :root[data-theme='dark'] .multi-select__check:not(.multi-select__check--on) {
14161
+ border-color: var(--q1-color-border-control);
14162
+ }