@q1travel/design-system 0.3.2 → 0.5.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.
@@ -111,9 +111,9 @@
111
111
  --q1-color-brand-preview-dark-fg: #ededed;
112
112
  --q1-color-mask-visible: #ffffff;
113
113
  --q1-color-mask-opaque: #000000;
114
- /* 阴影基色恒黑(对标 Geist):不随主题翻转,暗色下阴影不再泛白晕。 */
114
+ /* 阴影基色恒黑(对标外部参考):不随主题翻转,暗色下阴影不再泛白晕。 */
115
115
  --q1-color-shadow: #000000;
116
- /* 浮层边框(对标 Geist):亮色=普通边框;暗色=白 14% 发丝 ring——黑影在黑底不可见,浮层清晰度由它承担。 */
116
+ /* 浮层边框(对标外部参考):亮色=普通边框;暗色=白 14% 发丝 ring——黑影在黑底不可见,浮层清晰度由它承担。 */
117
117
  --q1-color-border-overlay: var(--q1-color-gray-400);
118
118
  --q1-color-bg-canvas: var(--q1-color-background-100);
119
119
  --q1-color-bg-subtle: var(--q1-color-background-200);
@@ -202,10 +202,14 @@
202
202
  --q1-radius-3: 8px;
203
203
  --q1-radius-4: 12px;
204
204
  --q1-shadow-focus: 0 0 0 3px color-mix(in srgb, var(--q1-color-primary-700) 22%, transparent);
205
+ /* 浮层阴影两档:popover=菜单/悬浮卡/小浮层,modal=模态级大浮层。方向性面板(drawer/sheet)例外,
206
+ 在组件内自持。恒黑 shadow token 混色,暗色靠 --q1-color-border-overlay 发丝边保证清晰度。 */
207
+ --q1-shadow-popover: 0 8px 28px color-mix(in srgb, var(--q1-color-shadow) 16%, transparent);
208
+ --q1-shadow-modal: 0 16px 48px color-mix(in srgb, var(--q1-color-shadow) 32%, transparent);
205
209
  }
206
210
 
207
211
  :root[data-theme='dark'] {
208
- /* 画布抬灰(对标 Geist 暗色 #0a0a0a):表面自带浮起感,纯黑仅留给 background-200 底壳。 */
212
+ /* 画布抬灰(对标外部参考暗色 #0a0a0a):表面自带浮起感,纯黑仅留给 background-200 底壳。 */
209
213
  --q1-color-background-100: #0a0a0a;
210
214
  --q1-color-background-200: #000000;
211
215
  --q1-color-gray-100: #1a1a1a;
@@ -312,7 +316,7 @@
312
316
  --q1-color-bg-subtle: var(--q1-color-gray-100);
313
317
  --q1-color-bg-panel: var(--q1-color-background-100);
314
318
  --q1-color-border: var(--q1-color-gray-200);
315
- /* 降档(对标 Geist 暗色最亮边框 rgb46):控件描边不再泛白。 */
319
+ /* 降档(对标外部参考暗色最亮边框 rgb46):控件描边不再泛白。 */
316
320
  --q1-color-border-strong: var(--q1-color-gray-400);
317
321
  --q1-color-border-overlay: color-mix(in srgb, #ffffff 14%, transparent);
318
322
  --q1-color-text-primary: var(--q1-color-gray-1000);
@@ -367,7 +371,7 @@
367
371
  text-decoration: none;
368
372
  }
369
373
 
370
- .button:hover {
374
+ .button:not(:disabled):not([aria-disabled='true']):hover {
371
375
  border-color: var(--q1-color-text-secondary);
372
376
  background: var(--q1-color-bg-subtle);
373
377
  }
@@ -383,12 +387,12 @@
383
387
  color: var(--q1-color-action-on-primary);
384
388
  }
385
389
 
386
- .button--primary:hover {
390
+ .button--primary:not(:disabled):not([aria-disabled='true']):hover {
387
391
  border-color: transparent;
388
392
  background: var(--q1-color-action-primary-hover);
389
393
  }
390
394
 
391
- .button--primary:active {
395
+ .button--primary:not(:disabled):not([aria-disabled='true']):active {
392
396
  background: var(--q1-color-action-primary-press);
393
397
  }
394
398
 
@@ -420,6 +424,12 @@
420
424
  animation: button-spin 0.7s linear infinite;
421
425
  }
422
426
 
427
+ .button__affix {
428
+ display: inline-flex;
429
+ flex: none;
430
+ align-items: center;
431
+ }
432
+
423
433
  .button--sm {
424
434
  min-height: 32px;
425
435
  padding: 0 var(--q1-space-3);
@@ -453,7 +463,7 @@
453
463
  border-radius: 50%;
454
464
  }
455
465
 
456
- /* Rounded(对标 Geist Rounded,营销页/落地页强调用):药丸形 + 柔和抬起阴影(恒黑 shadow token,暗色不泛白)。 */
466
+ /* Rounded(对标外部参考 Rounded,营销页/落地页强调用):药丸形 + 柔和抬起阴影(恒黑 shadow token,暗色不泛白)。 */
457
467
  .button--rounded {
458
468
  border-radius: 9999px;
459
469
  box-shadow:
@@ -481,7 +491,7 @@
481
491
  line-height: 1;
482
492
  }
483
493
 
484
- /* —— 统一着色配方 tone-surface(对标 Geist:oklch 按 hue 参数化,浅底/边框/深文,暗色反相)——
494
+ /* —— 统一着色配方 tone-surface(对标外部参考:oklch 按 hue 参数化,浅底/边框/深文,暗色反相)——
485
495
  Banner/Note/ProjectBanner/状态块共享同一套,消除各自 color-mix 配方漂移;主题自适应,消费方无需 dark 块。 */
486
496
  :root {
487
497
  --q1-tone-bg-info: oklch(from var(--q1-color-status-info) 0.96 0.03 h);
@@ -542,10 +552,10 @@
542
552
  color: var(--q1-color-status-danger);
543
553
  }
544
554
 
545
- /* 带前后缀的输入外框(对标 Geist 实测结构):flex 让前后缀占真实布局空间,任意宽度的
555
+ /* 带前后缀的输入外框(对标外部参考实测结构):flex 让前后缀占真实布局空间,任意宽度的
546
556
  字符串/图标几何上都不可能压到输入文字;边框/圆角/焦点环/校验/禁用整体上移到外框,
547
557
  内部 input 去皮拉伸填满。绝对定位 + 固定内边距的旧几何只装得下 16px 图标,已废弃。
548
- overflow 裁掉病态窄容器下前后缀(flex:none 不收缩)顶出圆角的溢出,Geist 外框同款;
558
+ overflow 裁掉病态窄容器下前后缀(flex:none 不收缩)顶出圆角的溢出,外部参考外框同款;
549
559
  焦点环/错误晕是 box-shadow,不受 overflow 裁剪。 */
550
560
  .input-control {
551
561
  display: flex;
@@ -618,7 +628,7 @@
618
628
  background: transparent;
619
629
  }
620
630
 
621
- /* 前后缀默认带灰块底色 + 朝向 input 一侧的 1px 分隔线(Geist 默认极性,实测块 0/12px 内边距、
631
+ /* 前后缀默认带灰块底色 + 朝向 input 一侧的 1px 分隔线(外部参考默认极性,实测块 0/12px 内边距、
622
632
  拉满外框高度);禁用态下外框同为 bg-subtle,块与外框同色成扁平、仅剩分隔线,属本品牌层取舍。 */
623
633
  .input-control__prefix {
624
634
  flex: none;
@@ -665,7 +675,7 @@
665
675
  padding-right: 8px;
666
676
  }
667
677
 
668
- /* 药丸形(对标 Geist rounded,实测 9999px 级 pill 半径);双类压过 :has 尺寸档的圆角设定。 */
678
+ /* 药丸形(对标外部参考 rounded,实测 9999px 级 pill 半径);双类压过 :has 尺寸档的圆角设定。 */
669
679
  .input-control.input-control--rounded {
670
680
  border-radius: 9999px;
671
681
  }
@@ -696,7 +706,7 @@
696
706
  padding-right: 36px;
697
707
  }
698
708
 
699
- /* 字段尺寸档(对标 Geist:xs24/sm32/md40/lg48;md=基础 40 不设类)。 */
709
+ /* 字段尺寸档(对标外部参考:xs24/sm32/md40/lg48;md=基础 40 不设类)。 */
700
710
  .form-control--xs {
701
711
  min-height: 24px;
702
712
  border-radius: var(--q1-radius-1);
@@ -720,7 +730,7 @@
720
730
  }
721
731
 
722
732
  /* Textarea 是多行控件,通用尺寸档的单行 min-height/padding 不适用,这里单独覆盖
723
- (Geist 官方 xSmall/small/mediumSmall/large 未给出具体像素值,数值按本库既有体系自定)。 */
733
+ (外部参考官方 xSmall/small/mediumSmall/large 未给出具体像素值,数值按本库既有体系自定)。 */
724
734
  .form-control--textarea.form-control--xs {
725
735
  min-height: 64px;
726
736
  padding: 6px 8px;
@@ -736,6 +746,74 @@
736
746
  padding: 12px 14px;
737
747
  }
738
748
 
749
+ /* Textarea 字符计数外框(#22 决策 5,仿 input-control affix 先例):maxLength 存在时才渲染,
750
+ 外框承载边框/焦点环/校验/禁用皮肤,内部 textarea 去皮,计数器占真实布局空间、右下角对齐。 */
751
+ .textarea-control {
752
+ display: flex;
753
+ flex-direction: column;
754
+ overflow: hidden;
755
+ border: 1px solid var(--q1-color-border-strong);
756
+ border-radius: var(--q1-radius-2);
757
+ background: var(--q1-color-bg-panel);
758
+ }
759
+
760
+ .textarea-control:hover:not(:has(.form-control:disabled)) {
761
+ border-color: var(--q1-color-text-secondary);
762
+ }
763
+
764
+ .textarea-control:focus-within {
765
+ border-color: var(--q1-color-action-primary);
766
+ box-shadow: var(--q1-shadow-focus);
767
+ }
768
+
769
+ .form-field--error .textarea-control,
770
+ .textarea-control:has(.form-control[aria-invalid='true']) {
771
+ border-color: var(--q1-color-status-danger);
772
+ box-shadow: 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
773
+ }
774
+
775
+ .textarea-control:has(.form-control:disabled) {
776
+ background: var(--q1-color-bg-subtle);
777
+ }
778
+
779
+ /* 尺寸档圆角随内部控件对齐(同 input-control 的 :has 尺寸档规则)。 */
780
+ .textarea-control:has(.form-control--xs) {
781
+ border-radius: var(--q1-radius-1);
782
+ }
783
+
784
+ .textarea-control:has(.form-control--lg) {
785
+ border-radius: var(--q1-radius-3);
786
+ }
787
+
788
+ .textarea-control .form-control {
789
+ border: none;
790
+ border-radius: inherit;
791
+ background: transparent;
792
+ }
793
+
794
+ .textarea-control .form-control:focus,
795
+ .textarea-control .form-control:focus-visible,
796
+ .form-field--error .textarea-control .form-control,
797
+ .textarea-control .form-control[aria-invalid='true'] {
798
+ box-shadow: none;
799
+ }
800
+
801
+ .textarea-control .form-control:disabled {
802
+ background: transparent;
803
+ }
804
+
805
+ .textarea-control__count {
806
+ align-self: flex-end;
807
+ padding: 0 12px 8px;
808
+ color: var(--q1-color-text-secondary);
809
+ font-size: 12px;
810
+ line-height: 16px;
811
+ }
812
+
813
+ .textarea-control:has(.form-control:disabled) .textarea-control__count {
814
+ color: var(--q1-color-text-muted);
815
+ }
816
+
739
817
  .form-control::placeholder {
740
818
  color: var(--q1-color-text-muted);
741
819
  }
@@ -750,14 +828,14 @@
750
828
  box-shadow: var(--q1-shadow-focus);
751
829
  }
752
830
 
753
- /* 错误态(对标 Geist):纯红 1px 环 + 红 16% 的 4px 外晕,字段家族共享。 */
831
+ /* 错误态(对标外部参考):纯红 1px 环 + 红 16% 的 4px 外晕,字段家族共享。 */
754
832
  .form-field--error .form-control,
755
833
  .form-control[aria-invalid='true'] {
756
834
  border-color: var(--q1-color-status-danger);
757
835
  box-shadow: 0 0 0 4px color-mix(in srgb, var(--q1-color-status-danger) 16%, transparent);
758
836
  }
759
837
 
760
- /* 禁用态(对标 Geist):底色抬灰而非降透明度;opacity:1 归零 Chrome UA 对禁用控件的默认 0.7。 */
838
+ /* 禁用态(对标外部参考):底色抬灰而非降透明度;opacity:1 归零 Chrome UA 对禁用控件的默认 0.7。 */
761
839
  .form-control:disabled {
762
840
  background: var(--q1-color-bg-subtle);
763
841
  color: var(--q1-color-text-muted);
@@ -769,7 +847,7 @@
769
847
  .control-option {
770
848
  position: relative;
771
849
  display: grid;
772
- /* 盒 16px 统一(Checkbox 复核拍板:与 Radio 家族一致 + 对齐 Geist 实测 16×16)。 */
850
+ /* 盒 16px 统一(Checkbox 复核拍板:与 Radio 家族一致 + 对齐外部参考实测 16×16)。 */
773
851
  grid-template-columns: 16px minmax(0, 1fr);
774
852
  align-items: start;
775
853
  gap: var(--q1-space-3);
@@ -784,6 +862,16 @@
784
862
  opacity: 0;
785
863
  }
786
864
 
865
+ /* 裸形态(#22 §1.3 / #45):去文本 body 列、仅剩 16px 视觉盒;外层是 span 非 label
866
+ (业务 <label> 包裹时 label 套 label 非法),保留 .control-option 类复用全部状态选择器
867
+ (checked/indeterminate/disabled/focus-visible 均以其为父作用域)。inline-grid 便于
868
+ 表格选择列/工具栏内联对齐。 */
869
+ .control-option--bare {
870
+ display: inline-grid;
871
+ grid-template-columns: 16px;
872
+ vertical-align: middle;
873
+ }
874
+
787
875
  .control-option__visual {
788
876
  position: relative;
789
877
  display: block;
@@ -793,7 +881,7 @@
793
881
  border-radius: var(--q1-radius-1);
794
882
  background: var(--q1-color-bg-panel);
795
883
  transform: translateY(1px);
796
- /* 状态切换过渡(Geist 实测 0.2s cubic-bezier(0.4,0,0.2,1));颜色过渡非运动类,不需 reduced-motion 门控。 */
884
+ /* 状态切换过渡(外部参考实测 0.2s cubic-bezier(0.4,0,0.2,1));颜色过渡非运动类,不需 reduced-motion 门控。 */
797
885
  transition:
798
886
  border-color 0.2s cubic-bezier(0.4, 0, 0.2, 1),
799
887
  background 0.2s cubic-bezier(0.4, 0, 0.2, 1);
@@ -801,7 +889,7 @@
801
889
 
802
890
  .control-option__visual--radio {
803
891
  border-radius: 999px;
804
- /* Radio 对标 Geist:16px 控件、未选中环用更亮的 muted 灰(Geist 143 档);环色 0.2s 过渡(实测配方)。 */
892
+ /* Radio 对标外部参考:16px 控件、未选中环用更亮的 muted 灰(外部参考 143 档);环色 0.2s 过渡(实测配方)。 */
805
893
  width: 16px;
806
894
  height: 16px;
807
895
  border-color: var(--q1-color-text-muted);
@@ -810,7 +898,7 @@
810
898
  background 0.2s cubic-bezier(0.4, 0, 1, 1);
811
899
  }
812
900
 
813
- /* 圆点常驻、scale 0→1 切换(对标 Geist 实测:0.15s 同 bezier),点击/切换时有生长动效。 */
901
+ /* 圆点常驻、scale 0→1 切换(对标外部参考实测:0.15s 同 bezier),点击/切换时有生长动效。 */
814
902
  .control-option__visual--radio::after {
815
903
  content: '';
816
904
  position: absolute;
@@ -829,7 +917,7 @@
829
917
  }
830
918
  }
831
919
 
832
- /* Checkbox 选中改前景单色(拍板与 Radio 家族统一,对齐 Geist 实测):text-primary 填充 + 面板色反色勾,
920
+ /* Checkbox 选中改前景单色(拍板与 Radio 家族统一,对齐外部参考实测):text-primary 填充 + 面板色反色勾,
833
921
  两主题自适应;「选中」是状态非动作,不占用 indigo 动作色。 */
834
922
  .control-option input:checked + .control-option__visual {
835
923
  border-color: var(--q1-color-text-primary);
@@ -850,7 +938,7 @@
850
938
  transform: rotate(45deg);
851
939
  }
852
940
 
853
- /* 半选(indeterminate):视觉态非第三值,由父级逻辑驱动;填充同选中,标记为居中横杠(Geist 同形)。 */
941
+ /* 半选(indeterminate):视觉态非第三值,由父级逻辑驱动;填充同选中,标记为居中横杠(外部参考同形)。 */
854
942
  .control-option input[type='checkbox']:indeterminate + .control-option__visual {
855
943
  border-color: var(--q1-color-text-primary);
856
944
  background: var(--q1-color-text-primary);
@@ -867,7 +955,7 @@
867
955
  content: '';
868
956
  }
869
957
 
870
- /* Radio 选中改前景 outline 风(对标 Geist:text-primary 环 + 8px 点、无填充——它未用品牌色,
958
+ /* Radio 选中改前景 outline 风(对标外部参考:text-primary 环 + 8px 点、无填充——它未用品牌色,
871
959
  两主题自适应;Checkbox 待其复核实测后再统一)。 */
872
960
  .control-option input[type='radio']:checked + .control-option__visual {
873
961
  border-color: var(--q1-color-text-primary);
@@ -878,7 +966,7 @@
878
966
  transform: scale(1);
879
967
  }
880
968
 
881
- /* Radio 禁用改色彩降级(对标 Geist:全灰、不降透明度)。 */
969
+ /* Radio 禁用改色彩降级(对标外部参考:全灰、不降透明度)。 */
882
970
  .control-option input[type='radio']:disabled + .control-option__visual {
883
971
  opacity: 1;
884
972
  border-color: var(--q1-color-gray-500);
@@ -905,7 +993,7 @@
905
993
  box-shadow: var(--q1-shadow-focus);
906
994
  }
907
995
 
908
- /* Checkbox 禁用改色彩降级(与 Radio 定稿结论一致、对齐 Geist 实测:全灰锚定、不降透明度——
996
+ /* Checkbox 禁用改色彩降级(与 Radio 定稿结论一致、对齐外部参考实测:全灰锚定、不降透明度——
909
997
  之前的 opacity 0.56 衰减是 Breadcrumbs/Radio 复核时已定性的违规模式,这里补齐家族最后一块。 */
910
998
  .control-option input:disabled + .control-option__visual,
911
999
  .control-option input:disabled ~ .control-option__body {
@@ -939,7 +1027,7 @@
939
1027
  }
940
1028
 
941
1029
  .control-option__label {
942
- /* 排版跟 Geist 实测(13/400);标题与描述的层级由颜色区分。 */
1030
+ /* 排版跟外部参考实测(13/400);标题与描述的层级由颜色区分。 */
943
1031
  font-size: var(--q1-font-size-label-13);
944
1032
  font-weight: var(--q1-font-weight-regular);
945
1033
  line-height: var(--q1-line-height-label-13);
@@ -997,7 +1085,7 @@
997
1085
  .menu__trigger:hover {
998
1086
  background: color-mix(in srgb, var(--q1-color-text-primary) 4%, transparent);
999
1087
  }
1000
- /* 图标-only 触发器(对标 Geist Custom trigger:可访问名称经 aria-label 暴露)。 */
1088
+ /* 图标-only 触发器(对标外部参考 Custom trigger:可访问名称经 aria-label 暴露)。 */
1001
1089
  .menu__trigger--icon {
1002
1090
  width: 32px;
1003
1091
  height: 32px;
@@ -1008,7 +1096,7 @@
1008
1096
  outline: none;
1009
1097
  box-shadow: var(--q1-shadow-focus);
1010
1098
  }
1011
- /* 实测 Geist:容器 padding 8px(space-2)/radius 12px(radius-4);item 固定 40px 高(靠固定高+
1099
+ /* 实测外部参考:容器 padding 8px(space-2)/radius 12px(radius-4);item 固定 40px 高(靠固定高+
1012
1100
  flex 居中,不是 padding 自然撑开),radius-2(6px) 已一致;禁用项只换色不降 opacity(对标
1013
1101
  Radio/Note/Modal 已建立的「禁用色彩降级、opacity 恒 1」家族规则)。 */
1014
1102
  .menu__popup {
@@ -1020,7 +1108,7 @@
1020
1108
  border: 1px solid var(--q1-color-border-overlay);
1021
1109
  border-radius: var(--q1-radius-4);
1022
1110
  background: var(--q1-color-bg-panel);
1023
- box-shadow: 0 8px 28px color-mix(in srgb, var(--q1-color-shadow) 16%, transparent);
1111
+ box-shadow: var(--q1-shadow-popover);
1024
1112
  }
1025
1113
  .menu__popup--start {
1026
1114
  left: 0;
@@ -1124,7 +1212,7 @@
1124
1212
  }
1125
1213
  }
1126
1214
 
1127
- /* 头像:直径由 --q1-avatar-size 驱动(自由数值,对齐 Geist size={n} 模型),字号=直径一半。
1215
+ /* 头像:直径由 --q1-avatar-size 驱动(自由数值,对齐外部参考 size={n} 模型),字号=直径一半。
1128
1216
  不设 overflow:hidden——右下角标要越出圆周;需要裁剪的形态各自处理。 */
1129
1217
  .avatar {
1130
1218
  position: relative;
@@ -1155,7 +1243,7 @@
1155
1243
  }
1156
1244
 
1157
1245
  /* 字母/图标回退:实心中性灰盘 + 恒白字。gray-900(亮 4d4d4d/暗 a0a0a0)正好落在
1158
- Geist 实测值(亮 444/暗 999)上;白字用 oklch 字面量(身份盘前景恒白,同 Geist)。
1246
+ 外部参考实测值(亮 444/暗 999)上;白字用 oklch 字面量(身份盘前景恒白,同外部参考)。
1159
1247
  overflow 裁剪兜超长 letter 输入(合法输入 ≤2 字符不受影响)。 */
1160
1248
  .avatar--letter,
1161
1249
  .avatar--glyph {
@@ -1165,7 +1253,7 @@
1165
1253
  overflow: hidden;
1166
1254
  }
1167
1255
 
1168
- /* 占位骨架:微光渐变(Geist 同款三段式,无边框),尊重 prefers-reduced-motion。 */
1256
+ /* 占位骨架:微光渐变(外部参考同款三段式,无边框),尊重 prefers-reduced-motion。 */
1169
1257
  .avatar--placeholder {
1170
1258
  overflow: hidden;
1171
1259
  background: var(--q1-color-bg-subtle);
@@ -1200,7 +1288,7 @@
1200
1288
  }
1201
1289
  }
1202
1290
 
1203
- /* 右下角标(对标 Geist With custom icon):直径=头像一半,外环用面板色与主体分离。 */
1291
+ /* 右下角标(对标外部参考 With custom icon):直径=头像一半,外环用面板色与主体分离。 */
1204
1292
  .avatar__badge {
1205
1293
  position: absolute;
1206
1294
  right: calc(var(--q1-avatar-size, 32px) * -0.06);
@@ -1241,7 +1329,7 @@
1241
1329
  box-shadow: 0 0 0 1px var(--q1-color-bg-panel);
1242
1330
  }
1243
1331
 
1244
- /* +N 收纳芯片:恒定深色、不随主题翻转(Geist 双主题实测同值;同族先例:遮罩恒黑)。 */
1332
+ /* +N 收纳芯片:恒定深色、不随主题翻转(外部参考双主题实测同值;同族先例:遮罩恒黑)。 */
1245
1333
  .avatar--overflow {
1246
1334
  background: oklch(0.2 0 0);
1247
1335
  color: oklch(0.94 0 0);
@@ -1250,7 +1338,7 @@
1250
1338
  font-weight: var(--q1-font-weight-semibold);
1251
1339
  }
1252
1340
 
1253
- /* 实测 Geist:胶囊三档 h20/24/32、字号 11/12/14、字重 500、tabular-nums;图标随档 12/14/16,lg gap 6px。 */
1341
+ /* 实测外部参考:胶囊三档 h20/24/32、字号 11/12/14、字重 500、tabular-nums;图标随档 12/14/16,lg gap 6px。 */
1254
1342
  .badge {
1255
1343
  display: inline-flex;
1256
1344
  align-items: center;
@@ -1374,13 +1462,24 @@
1374
1462
  color: oklch(from var(--q1-color-status-danger) 0.74 0.16 h);
1375
1463
  }
1376
1464
 
1377
- /* 反转款:深浅互换的强调 badge(实测 Geist inverted:gray-1000 底 / gray-100 字,token 双主题自翻)。 */
1465
+ /* quiet 档:低强调元数据形态(SKU/条码/待绑定包裹等),视觉≈neutral-subtle——淡染底、无描边,但不带 tone 语义色。 */
1466
+ .badge--quiet {
1467
+ background: oklch(from var(--q1-color-gray-700) 0.95 0 0);
1468
+ color: oklch(from var(--q1-color-gray-700) 0.42 0 0);
1469
+ }
1470
+
1471
+ :root[data-theme='dark'] .badge--quiet {
1472
+ background: oklch(from var(--q1-color-gray-700) 0.26 0 0);
1473
+ color: oklch(from var(--q1-color-gray-700) 0.84 0 0);
1474
+ }
1475
+
1476
+ /* 反转款:深浅互换的强调 badge(实测外部参考 inverted:gray-1000 底 / gray-100 字,token 双主题自翻)。 */
1378
1477
  .badge--inverted {
1379
1478
  background: var(--q1-color-gray-1000);
1380
1479
  color: var(--q1-color-gray-100);
1381
1480
  }
1382
1481
 
1383
- /* Pill:基于 Badge 样式的特殊链接(实测 Geist:background-200 底 + 1px 内嵌 hairline 环,悬停提亮到 gray-200)。 */
1482
+ /* Pill:基于 Badge 样式的特殊链接(实测外部参考:background-200 底 + 1px 内嵌 hairline 环,悬停提亮到 gray-200)。 */
1384
1483
  .badge--pill {
1385
1484
  background: var(--q1-color-background-200);
1386
1485
  color: var(--q1-color-text-primary);
@@ -1468,7 +1567,7 @@
1468
1567
  border-color: var(--q1-color-border-strong);
1469
1568
  }
1470
1569
 
1471
- /* 页顶公告形态(对齐 Geist demo 实测):透明底无边框、内容居中、16px 文案;
1570
+ /* 页顶公告形态(对齐外部参考 demo 实测):透明底无边框、内容居中、16px 文案;
1472
1571
  与页内卡条(tone 变体)分工,两种定位见页面使用原则。 */
1473
1572
  .banner--announcement {
1474
1573
  justify-content: center;
@@ -1484,7 +1583,7 @@
1484
1583
  line-height: var(--q1-line-height-copy-16);
1485
1584
  }
1486
1585
 
1487
- /* 公告主操作:恒深药丸,双主题同值(Geist 亮暗实测同为深底浅字;同族先例:Avatar +N 芯片、遮罩恒黑)。 */
1586
+ /* 公告主操作:恒深药丸,双主题同值(外部参考亮暗实测同为深底浅字;同族先例:Avatar +N 芯片、遮罩恒黑)。 */
1488
1587
  .banner__cta {
1489
1588
  flex-shrink: 0;
1490
1589
  display: inline-flex;
@@ -1651,7 +1750,7 @@ a.breadcrumb__link:hover {
1651
1750
  font-weight: var(--q1-font-weight-medium);
1652
1751
  }
1653
1752
 
1654
- /* 禁用态:固定 gray-700(双主题同一色值,Geist 实测),不用透明度衰减——
1753
+ /* 禁用态:固定 gray-700(双主题同一色值,外部参考实测),不用透明度衰减——
1655
1754
  与 text-muted 在暗色主题会漂到 gray-800 不同,这里刻意锚定 gray-700 原值。 */
1656
1755
  .breadcrumb__link--disabled {
1657
1756
  color: var(--q1-color-gray-700);
@@ -1699,7 +1798,7 @@ a.breadcrumb__link:hover {
1699
1798
  display: none;
1700
1799
  }
1701
1800
 
1702
- /* menu 形态(对标 Geist type="menu" 实测):独立描边药丸,无分隔符;
1801
+ /* menu 形态(对标外部参考 type="menu" 实测):独立描边药丸,无分隔符;
1703
1802
  尺寸/描边/圆角逐字节对齐(22px 高、2px/6px 内距、1px border-overlay、4px 圆角、12px 字)。 */
1704
1803
  .breadcrumb--menu .breadcrumb__list {
1705
1804
  gap: 6px;
@@ -1749,7 +1848,7 @@ a.breadcrumb__link:hover {
1749
1848
  overflow: hidden;
1750
1849
  border-radius: var(--q1-radius-4);
1751
1850
  background: var(--browser-surface);
1752
- /* material-small:1px 顶部亮环 + 柔和投影 + 1px 暗边环(对标 Geist 三层叠加)。 */
1851
+ /* material-small:1px 顶部亮环 + 柔和投影 + 1px 暗边环(对标外部参考三层叠加)。 */
1753
1852
  box-shadow:
1754
1853
  inset 0 0 0 1px color-mix(in srgb, white 14%, transparent),
1755
1854
  0 1px 2px color-mix(in srgb, black 40%, transparent),
@@ -1839,7 +1938,7 @@ a.breadcrumb__link:hover {
1839
1938
  border-radius: 9999px;
1840
1939
  }
1841
1940
 
1842
- /* 字面量 macOS 交通灯配色(Geist 实测,双主题同值,与像素级验证过的转换值对齐):
1941
+ /* 字面量 macOS 交通灯配色(外部参考实测,双主题同值,与像素级验证过的转换值对齐):
1843
1942
  这是操作系统窗口控件的写实模拟,不是语义状态传达,故意不用 --q1-color-status-* token。 */
1844
1943
  .browser__dot--close {
1845
1944
  background: oklch(0.6921 0.1953 26.36);
@@ -1983,7 +2082,7 @@ a.breadcrumb__link:hover {
1983
2082
  object-fit: cover;
1984
2083
  }
1985
2084
 
1986
- /* 窄屏:隐藏导航图标(对标 Geist max-md:hidden)。起始区常驻自适应宽度、
2085
+ /* 窄屏:隐藏导航图标(对标外部参考 max-md:hidden)。起始区常驻自适应宽度、
1987
2086
  地址区常驻吃满剩余空间(见 .browser__zone--start/--center),本断点无需再单独处理。 */
1988
2087
  @media (max-width: 640px) {
1989
2088
  .browser__controls {
@@ -1991,7 +2090,7 @@ a.breadcrumb__link:hover {
1991
2090
  }
1992
2091
  }
1993
2092
 
1994
- /* 书籍封面(2026-07-09 双轮实测 Geist):静止=平面封面(49/60、圆角 6/4/4/6、暗色微光、
2093
+ /* 书籍封面(2026-07-09 双轮实测外部参考):静止=平面封面(49/60、圆角 6/4/4/6、暗色微光、
1995
2094
  双层外阴影随宽度缩放、左缘 8.2% 书脊沟线、排版=宽度线性缩放 0.0836/0.061);
1996
2095
  悬停=绕 Y 轴翻开(rotateY -20° + scale 1.066 + translateX -16px,0.25s ease-out——
1997
2096
  从冻结的 CSSTransition 关键帧取证;hidden 标签页首测误判"无动效",用户人眼纠正)。 */
@@ -2098,7 +2197,7 @@ a.breadcrumb__link:hover {
2098
2197
  background: var(--q1-book-sheen);
2099
2198
  }
2100
2199
 
2101
- /* 顶部色带(stripe 变体,Geist 默认形态):占封面高度 47.8%。 */
2200
+ /* 顶部色带(stripe 变体,外部参考默认形态):占封面高度 47.8%。 */
2102
2201
  .book__band {
2103
2202
  position: relative;
2104
2203
  display: flex;
@@ -2134,7 +2233,7 @@ a.breadcrumb__link:hover {
2134
2233
  color: var(--book-text);
2135
2234
  }
2136
2235
 
2137
- /* 书脊沟线:左缘 8.2% 宽度内一条白 25% 高光渐变(两主题同值,Geist 实测)。 */
2236
+ /* 书脊沟线:左缘 8.2% 宽度内一条白 25% 高光渐变(两主题同值,外部参考实测)。 */
2138
2237
  .book__gutter {
2139
2238
  position: absolute;
2140
2239
  inset: 0 auto 0 0;
@@ -2164,7 +2263,7 @@ a.breadcrumb__link:hover {
2164
2263
  object-fit: cover;
2165
2264
  }
2166
2265
 
2167
- /* 纹理(自有配方,Geist 多款纹理样式记 non-goal):细密交叉底纹叠在封面色上,不糊标题。 */
2266
+ /* 纹理(自有配方,外部参考多款纹理样式记 non-goal):细密交叉底纹叠在封面色上,不糊标题。 */
2168
2267
  .book--textured .book__cover {
2169
2268
  background-image:
2170
2269
  repeating-linear-gradient(
@@ -2235,7 +2334,7 @@ a.breadcrumb__link:hover {
2235
2334
  padding: var(--q1-space-6);
2236
2335
  }
2237
2336
 
2238
- /* 分段控件 Switch(对标 Geist Switch):一组互斥选项,选中段抬起;底层 q1-sr-only 单选组,方向键原生可用。 */
2337
+ /* 分段控件 Switch(对标外部参考 Switch):一组互斥选项,选中段抬起;底层 q1-sr-only 单选组,方向键原生可用。 */
2239
2338
  .switch-control {
2240
2339
  display: inline-flex;
2241
2340
  align-items: center;
@@ -2311,7 +2410,7 @@ a.breadcrumb__link:hover {
2311
2410
  gap: var(--q1-space-4);
2312
2411
  }
2313
2412
 
2314
- /* 下划线式 Tabs(对标 Geist):tablist 一条底边基线,选中标签用 2px 前景色底边下划线、透明底、字重 400。 */
2413
+ /* 下划线式 Tabs(对标外部参考):tablist 一条底边基线,选中标签用 2px 前景色底边下划线、透明底、字重 400。 */
2315
2414
  .tabs-control {
2316
2415
  display: flex;
2317
2416
  align-items: center;
@@ -2370,7 +2469,7 @@ a.breadcrumb__link:hover {
2370
2469
  align-items: center;
2371
2470
  }
2372
2471
 
2373
- /* 次级(secondary)变体(对标 Geist Secondary Tabs):药丸组容器,选中态用前景色填充、无下划线。 */
2472
+ /* 次级(secondary)变体(对标外部参考 Secondary Tabs):药丸组容器,选中态用前景色填充、无下划线。 */
2374
2473
  .tabs-control--secondary {
2375
2474
  gap: var(--q1-space-1);
2376
2475
  border: 1px solid var(--q1-color-border-strong);
@@ -2505,10 +2604,10 @@ a.breadcrumb__link:hover {
2505
2604
  display: flex;
2506
2605
  gap: var(--q1-space-6);
2507
2606
  padding: var(--q1-space-4);
2508
- border: 1px solid var(--q1-color-border);
2607
+ border: 1px solid var(--q1-color-border-overlay);
2509
2608
  border-radius: var(--q1-radius-3);
2510
2609
  background: var(--q1-color-bg-panel);
2511
- box-shadow: 0 8px 24px color-mix(in srgb, var(--q1-color-mask-opaque) 14%, transparent);
2610
+ box-shadow: var(--q1-shadow-popover);
2512
2611
  }
2513
2612
 
2514
2613
  .cal-popover--vertical {
@@ -2601,7 +2700,7 @@ a.breadcrumb__link:hover {
2601
2700
  cursor: pointer;
2602
2701
  }
2603
2702
 
2604
- /* 固定时区:只读文本,去掉可点击暗示(Geist pinnedTimezone——只读文本非 select)。 */
2703
+ /* 固定时区:只读文本,去掉可点击暗示(外部参考 pinnedTimezone——只读文本非 select)。 */
2605
2704
  .cal-inputs__tz--pinned {
2606
2705
  cursor: default;
2607
2706
  }
@@ -2784,10 +2883,10 @@ a.breadcrumb__link:hover {
2784
2883
  z-index: 20;
2785
2884
  display: flex;
2786
2885
  min-width: 380px;
2787
- border: 1px solid var(--q1-color-border);
2886
+ border: 1px solid var(--q1-color-border-overlay);
2788
2887
  border-radius: var(--q1-radius-3);
2789
2888
  background: var(--q1-color-bg-panel);
2790
- box-shadow: 0 8px 24px color-mix(in srgb, var(--q1-color-mask-opaque) 14%, transparent);
2889
+ box-shadow: var(--q1-shadow-popover);
2791
2890
  overflow: hidden;
2792
2891
  }
2793
2892
 
@@ -2874,7 +2973,7 @@ a.breadcrumb__link:hover {
2874
2973
  height: 1px;
2875
2974
  }
2876
2975
 
2877
- /* 竖向随容器拉伸(对标 Geist h-full);min-height 防非弹性父容器下塌陷成一点。 */
2976
+ /* 竖向随容器拉伸(对标外部参考 h-full);min-height 防非弹性父容器下塌陷成一点。 */
2878
2977
  .separator--vertical {
2879
2978
  width: 1px;
2880
2979
  height: auto;
@@ -2959,7 +3058,7 @@ a.breadcrumb__link:hover {
2959
3058
  .spinner--success { color: var(--q1-color-status-success); }
2960
3059
  .spinner--info { color: var(--q1-color-status-info); }
2961
3060
 
2962
- /* 辐条角度与动画延迟由组件按辐条数内联计算(辐条数随尺寸增减,对标 Geist)。 */
3061
+ /* 辐条角度与动画延迟由组件按辐条数内联计算(辐条数随尺寸增减,对标外部参考)。 */
2963
3062
  .spinner__bar {
2964
3063
  position: absolute;
2965
3064
  top: 0;
@@ -3121,7 +3220,7 @@ a.breadcrumb__link:hover {
3121
3220
  color: var(--q1-color-text-primary);
3122
3221
  }
3123
3222
 
3124
- /* 复制按钮 absolute 挂右侧(对标 Geist):单行高度由文本决定(10px 竖向 padding + 20px 行高 ≈ 42),
3223
+ /* 复制按钮 absolute 挂右侧(对标外部参考):单行高度由文本决定(10px 竖向 padding + 20px 行高 ≈ 42),
3125
3224
  不被按钮撑高;文本区 padding-right 预留按钮位。 */
3126
3225
  .snippet {
3127
3226
  position: relative;
@@ -3134,7 +3233,7 @@ a.breadcrumb__link:hover {
3134
3233
  background: var(--q1-color-bg-subtle);
3135
3234
  }
3136
3235
 
3137
- /* 反色:纯反色一层(对标 Geist Inverted),两主题自适应,无内衬块。 */
3236
+ /* 反色:纯反色一层(对标外部参考 Inverted),两主题自适应,无内衬块。 */
3138
3237
  .snippet--inverted {
3139
3238
  border-color: var(--q1-color-text-primary);
3140
3239
  background: var(--q1-color-text-primary);
@@ -3276,7 +3375,7 @@ a.breadcrumb__link:hover {
3276
3375
  100% { transform: rotate(360deg); }
3277
3376
  }
3278
3377
 
3279
- /* 实测 Geist:条高 10px、圆角 radius-2、轨道 gray-200;填充默认中性前景,
3378
+ /* 实测外部参考:条高 10px、圆角 radius-2、轨道 gray-200;填充默认中性前景,
3280
3379
  过渡 width/background-color 0.1s ease-in(换色也平滑)。停靠点悬停有气泡,
3281
3380
  故裁剪收进 __track 内层,停靠点留在外层不被 overflow 剪掉。 */
3282
3381
  .progress {
@@ -3377,7 +3476,7 @@ a.breadcrumb__link:hover {
3377
3476
  transform: translate(-50%, 0);
3378
3477
  }
3379
3478
 
3380
- /* 实测 Geist:非填充态背景恒透明,靠边框+图标+正文同色传达类型(不是只图标上色,正文保持中性);
3479
+ /* 实测外部参考:非填充态背景恒透明,靠边框+图标+正文同色传达类型(不是只图标上色,正文保持中性);
3381
3480
  filled 只加浅色底,图标/正文颜色不变——两态共享同一套 tone-fg/tone-border,复用 Banner 已建立的
3382
3481
  tone-surface 配方(不新开一层浅色阶)。 */
3383
3482
  .note {
@@ -3410,7 +3509,7 @@ a.breadcrumb__link:hover {
3410
3509
  font-weight: var(--q1-font-weight-medium);
3411
3510
  }
3412
3511
 
3413
- /* 行动按钮(实测 Geist:32px 高、radius-2、实心反色 CTA,不是我们原来的浅边框按钮)。 */
3512
+ /* 行动按钮(实测外部参考:32px 高、radius-2、实心反色 CTA,不是我们原来的浅边框按钮)。 */
3414
3513
  .note__action {
3415
3514
  flex-shrink: 0;
3416
3515
  display: inline-flex;
@@ -3473,7 +3572,7 @@ a.breadcrumb__link:hover {
3473
3572
  /* secondary 是中性语义,不像其余四档有专属 tone token,填充态用中性 subtle 底。 */
3474
3573
  .note--filled.note--secondary { background: var(--q1-color-bg-subtle); }
3475
3574
 
3476
- /* 禁用态(实测 Geist Disabled 章节:整体降灰,不因类型保留颜色;对标 Radio 的色彩降级配方,
3575
+ /* 禁用态(实测外部参考 Disabled 章节:整体降灰,不因类型保留颜色;对标 Radio 的色彩降级配方,
3477
3576
  opacity 恒 1,只换色,源码顺序放在类型规则之后确保覆盖)。
3478
3577
  .note--filled.note--info 等是两类选择器(优先级 0,2,0),比 .note--disabled 单类(0,1,0)更高,
3479
3578
  源码顺序赢不了优先级差——填充+禁用组合必须用同为两类的选择器才能真正盖掉填充色。 */
@@ -3492,7 +3591,7 @@ a.breadcrumb__link:hover {
3492
3591
  }
3493
3592
 
3494
3593
  /* 修正:gray-500 实底 + bg-canvas 深色字在暗色主题几乎不可读(bg-canvas 暗色下是近黑,
3495
- 叠在中灰底上对比度太低)。实测 Geist 的真实禁用配方是「底色几乎不变、只把字调淡」
3594
+ 叠在中灰底上对比度太低)。实测外部参考的真实禁用配方是「底色几乎不变、只把字调淡」
3496
3595
  (light 主题测得 bg 几乎同色,字从纯白调淡到中灰),改为对底色加 55% 透明度混合。 */
3497
3596
  .note--disabled .note__action {
3498
3597
  background: var(--q1-color-gray-1000);
@@ -3687,7 +3786,7 @@ a.breadcrumb__link:hover {
3687
3786
  color: var(--q1-color-text-secondary);
3688
3787
  }
3689
3788
 
3690
- /* 语言切换按钮组(对标 Geist Language switcher with tabs):占 header 左侧文件名位。 */
3789
+ /* 语言切换按钮组(对标外部参考 Language switcher with tabs):占 header 左侧文件名位。 */
3691
3790
  .codeblock__tabs {
3692
3791
  display: inline-flex;
3693
3792
  gap: var(--q1-space-1);
@@ -3992,10 +4091,10 @@ a.breadcrumb__link:hover {
3992
4091
  flex-direction: column;
3993
4092
  gap: var(--q1-space-1);
3994
4093
  padding: var(--q1-space-3) var(--q1-space-4);
3995
- border: 1px solid var(--q1-color-border);
4094
+ border: 1px solid var(--q1-color-border-overlay);
3996
4095
  border-radius: var(--q1-radius-2);
3997
4096
  background: var(--q1-color-bg-panel);
3998
- box-shadow: 0 8px 24px color-mix(in srgb, var(--q1-color-mask-opaque) 14%, transparent);
4097
+ box-shadow: var(--q1-shadow-popover);
3999
4098
  opacity: 0;
4000
4099
  visibility: hidden;
4001
4100
  transition: opacity 0.12s ease, visibility 0.12s ease;
@@ -4014,7 +4113,7 @@ a.breadcrumb__link:hover {
4014
4113
  .context-card-wrap--left .context-card { right: calc(100% + 8px); top: 0; }
4015
4114
  .context-card-wrap--right .context-card { left: calc(100% + 8px); top: 0; }
4016
4115
 
4017
- /* 轴向对齐(对标 Geist Alignment):默认 start 贴起始边;center 沿轴居中;end 贴结束边。
4116
+ /* 轴向对齐(对标外部参考 Alignment):默认 start 贴起始边;center 沿轴居中;end 贴结束边。
4018
4117
  top/bottom 的轴是水平(left/translateX),left/right 的轴是垂直(top/translateY)。 */
4019
4118
  .context-card-wrap--top.context-card-wrap--align-center .context-card,
4020
4119
  .context-card-wrap--bottom.context-card-wrap--align-center .context-card {
@@ -4108,7 +4207,7 @@ a.breadcrumb__link:hover {
4108
4207
  .rtc-trigger {
4109
4208
  border-bottom: 1px dashed var(--q1-color-border-strong);
4110
4209
  color: var(--q1-color-text-primary);
4111
- /* 光标铁律:跟 Geist 实测(其 RTC 触发器为 pointer)。 */
4210
+ /* 光标铁律:跟外部参考实测(其 RTC 触发器为 pointer)。 */
4112
4211
  cursor: pointer;
4113
4212
  }
4114
4213
 
@@ -4133,19 +4232,19 @@ a.breadcrumb__link:hover {
4133
4232
  border: 1px solid var(--q1-color-border-overlay);
4134
4233
  border-radius: var(--q1-radius-2);
4135
4234
  background: var(--q1-color-bg-panel);
4136
- box-shadow: 0 8px 24px color-mix(in srgb, var(--q1-color-shadow) 14%, transparent);
4235
+ box-shadow: var(--q1-shadow-popover);
4137
4236
  opacity: 0;
4138
4237
  visibility: hidden;
4139
4238
  transition: opacity 0.12s ease, visibility 0.12s ease;
4140
4239
  }
4141
4240
 
4142
- /* 长格式相对时间标题行(对标 Geist)。 */
4241
+ /* 长格式相对时间标题行(对标外部参考)。 */
4143
4242
  .rtc-card__relative {
4144
4243
  font-size: 12px;
4145
4244
  color: var(--q1-color-text-primary);
4146
4245
  }
4147
4246
 
4148
- /* 时区徽章(UTC / GMT+8 小 chip,对标 Geist)。 */
4247
+ /* 时区徽章(UTC / GMT+8 小 chip,对标外部参考)。 */
4149
4248
  .rtc-card__zone {
4150
4249
  flex: none;
4151
4250
  padding: 1px var(--q1-space-1);
@@ -4174,8 +4273,8 @@ a.breadcrumb__link:hover {
4174
4273
  color: var(--q1-color-text-secondary);
4175
4274
  }
4176
4275
 
4177
- /* 项目横幅(对标 Geist 实测):radius 0 贴边通栏条;图标随文字色;CTA 亮一档 + medium。
4178
- flex-wrap 为窄屏防溢出兜底(有理由偏离:Geist 无,正常宽度不可见)。 */
4276
+ /* 项目横幅(对标外部参考实测):radius 0 贴边通栏条;图标随文字色;CTA 亮一档 + medium。
4277
+ flex-wrap 为窄屏防溢出兜底(有理由偏离:外部参考无,正常宽度不可见)。 */
4179
4278
  .project-banner {
4180
4279
  display: flex;
4181
4280
  flex-wrap: wrap;
@@ -4261,14 +4360,14 @@ a.breadcrumb__link:hover {
4261
4360
  background: var(--q1-color-bg-subtle);
4262
4361
  }
4263
4362
 
4264
- /* 分段卡片给容器 16px 内边距(对齐 Geist p-4):section 随之内缩,分隔线不贯满卡片边、左端对齐文字。
4363
+ /* 分段卡片给容器 16px 内边距(对齐外部参考 p-4):section 随之内缩,分隔线不贯满卡片边、左端对齐文字。
4265
4364
  这是分隔线"内缩"的来源——不是给线加 inset,而是容器留边、section 无水平 padding,线随 section 内缩。 */
4266
4365
  .q1-card--divided {
4267
4366
  padding: var(--q1-space-4);
4268
4367
  }
4269
4368
 
4270
4369
  .q1-card--divided .q1-card__section {
4271
- /* 竖排段:只留垂直 padding(对齐 Geist py-2),水平交给容器内边距,分隔线因此内缩对齐文字。 */
4370
+ /* 竖排段:只留垂直 padding(对齐外部参考 py-2),水平交给容器内边距,分隔线因此内缩对齐文字。 */
4272
4371
  padding: var(--q1-space-2) 0;
4273
4372
  font-size: 14px;
4274
4373
  color: var(--q1-color-text-primary);
@@ -4282,7 +4381,7 @@ a.breadcrumb__link:hover {
4282
4381
  特异性用 .q1-card.q1-card--row(0,2,0) 压过可点卡片的 a.q1-card(0,1,1),否则 <a> 卡片的 display:block 会把 flex 打回竖排。 */
4283
4382
  .q1-card.q1-card--row {
4284
4383
  display: flex;
4285
- /* 横排指标块并列需要空间,解除默认 400px 限宽,充满容器(对齐 Geist 横排充满 demo 框)。 */
4384
+ /* 横排指标块并列需要空间,解除默认 400px 限宽,充满容器(对齐外部参考横排充满 demo 框)。 */
4286
4385
  max-width: none;
4287
4386
  }
4288
4387
 
@@ -4291,7 +4390,7 @@ a.breadcrumb__link:hover {
4291
4390
  }
4292
4391
 
4293
4392
  .q1-card--divided.q1-card--row .q1-card__section {
4294
- /* 横排段:垂直 padding 归 0(内缩交给容器)、水平 8px 给文字到竖线的间距(对齐 Geist row section 0 8px)。 */
4393
+ /* 横排段:垂直 padding 归 0(内缩交给容器)、水平 8px 给文字到竖线的间距(对齐外部参考 row section 0 8px)。 */
4295
4394
  padding: 0 var(--q1-space-2);
4296
4395
  }
4297
4396
 
@@ -4319,14 +4418,14 @@ a.breadcrumb__link:hover {
4319
4418
  color: var(--q1-color-text-secondary);
4320
4419
  }
4321
4420
 
4322
- /* 常驻柔和投影(对齐 Geist shadow):贴地薄影 + 扩散软影两层,让卡片浮于背景。 */
4421
+ /* 常驻柔和投影(对齐外部参考 shadow):贴地薄影 + 扩散软影两层,让卡片浮于背景。 */
4323
4422
  .q1-card--shadow {
4324
4423
  box-shadow:
4325
4424
  0 1px 2px color-mix(in srgb, var(--q1-color-shadow) 6%, transparent),
4326
4425
  0 8px 24px color-mix(in srgb, var(--q1-color-shadow) 8%, transparent);
4327
4426
  }
4328
4427
 
4329
- /* 无框卡片(bordered={false}):去边框,靠底色/投影表达边界(对齐 Geist border 可选)。 */
4428
+ /* 无框卡片(bordered={false}):去边框,靠底色/投影表达边界(对齐外部参考 border 可选)。 */
4330
4429
  .q1-card--borderless {
4331
4430
  border-color: transparent;
4332
4431
  }
@@ -4496,7 +4595,7 @@ a.q1-card:focus-visible {
4496
4595
  100% { transform: rotate(360deg); }
4497
4596
  }
4498
4597
 
4499
- /* Esc 键帽清除(对标 Geist):清除入口本身就是快捷键教学;点击或按 Esc 清空。 */
4598
+ /* Esc 键帽清除(对标外部参考):清除入口本身就是快捷键教学;点击或按 Esc 清空。 */
4500
4599
  .search-input__esc {
4501
4600
  position: absolute;
4502
4601
  top: 50%;
@@ -4571,7 +4670,7 @@ a.q1-card:focus-visible {
4571
4670
  background: var(--q1-color-bg-subtle);
4572
4671
  }
4573
4672
 
4574
- /* tone="danger"|"warning" 是整卡状态(对标 Geist Error/Warning Type):边框着色表达整组处于错误/警告态,
4673
+ /* tone="danger"|"warning" 是整卡状态(对标外部参考 Error/Warning Type):边框着色表达整组处于错误/警告态,
4575
4674
  页脚派生轻染底延续状态可读性——不是只染页脚(原 .fieldset__footer--* 语义提升为整卡 .fieldset--*)。 */
4576
4675
  .fieldset--danger {
4577
4676
  border-color: var(--q1-color-status-danger);
@@ -4657,7 +4756,7 @@ a.q1-card:focus-visible {
4657
4756
  justify-content: center;
4658
4757
  }
4659
4758
 
4660
- /* 药丸触发器(对标 Geist):h32 / font 14/500 / 全圆角;颜色走家族 panel+border。 */
4759
+ /* 药丸触发器(对标外部参考):h32 / font 14/500 / 全圆角;颜色走家族 panel+border。 */
4661
4760
  .show-more__trigger {
4662
4761
  display: inline-flex;
4663
4762
  align-items: center;
@@ -4725,7 +4824,7 @@ a.q1-card:focus-visible {
4725
4824
  transform: rotate(90deg);
4726
4825
  }
4727
4826
  /* 收起时面板保留在 DOM(grid 0fr),便于页面内查找命中;visibility 把收起内容移出
4728
- 焦点序与读屏树(对齐 Geist closed 用 hidden/visibility)——关闭时随高度动画结束才隐藏,
4827
+ 焦点序与读屏树(对齐外部参考 closed 用 hidden/visibility)——关闭时随高度动画结束才隐藏,
4729
4828
  打开时立即可见(visibility 的过渡语义天然如此)。 */
4730
4829
  .collapse__panel {
4731
4830
  display: grid;
@@ -5055,7 +5154,7 @@ a.q1-card:focus-visible {
5055
5154
  .choicebox--checkbox:has(.choicebox__input:disabled:checked) .choicebox__indicator {
5056
5155
  background: var(--q1-color-gray-500);
5057
5156
  }
5058
- /* 实测 Geist:裸轨(无外框/无背景/无 padding),图标抽离文字块、绝对定位在 28px 凹槽外;
5157
+ /* 实测外部参考:裸轨(无外框/无背景/无 padding),图标抽离文字块、绝对定位在 28px 凹槽外;
5059
5158
  悬停只把文字/图标从 text-secondary 加深到 text-primary,无背景浸染、无品牌色——
5060
5159
  这是页面间的纯导航链(chrome),不是行动号召,indigo 只守「动作」。 */
5061
5160
  .pagination {
@@ -5093,7 +5192,7 @@ a.q1-card:focus-visible {
5093
5192
  .pagination__link:hover .pagination__label {
5094
5193
  color: var(--q1-color-text-primary);
5095
5194
  }
5096
- /* 定位上下文钉在标题文字块(实测 Geist:图标是标题块的子节点,随文字宽度走,
5195
+ /* 定位上下文钉在标题文字块(实测外部参考:图标是标题块的子节点,随文字宽度走,
5097
5196
  而不是钉在整条链接上)——否则图标会漂出链接可点/可聚焦的框外。 */
5098
5197
  .pagination__title-frame {
5099
5198
  position: relative;
@@ -5176,7 +5275,7 @@ a.q1-card:focus-visible {
5176
5275
  z-index: 10;
5177
5276
  width: 336px;
5178
5277
  border-color: var(--q1-color-border-overlay);
5179
- box-shadow: 0 8px 24px color-mix(in srgb, var(--q1-color-shadow) 16%, transparent);
5278
+ box-shadow: var(--q1-shadow-popover);
5180
5279
  }
5181
5280
  .feedback__head {
5182
5281
  display: flex;
@@ -5329,7 +5428,7 @@ a.q1-card:focus-visible {
5329
5428
  align-items: center;
5330
5429
  gap: var(--q1-space-2);
5331
5430
  }
5332
- /* 纵向带按钮(对标 Geist Vertical with buttons):上/滚动区/下 纵向堆叠。 */
5431
+ /* 纵向带按钮(对标外部参考 Vertical with buttons):上/滚动区/下 纵向堆叠。 */
5333
5432
  .scroller-buttons--vertical {
5334
5433
  flex-direction: column;
5335
5434
  align-items: stretch;
@@ -5403,7 +5502,7 @@ a.q1-card:focus-visible {
5403
5502
  .theme-switcher:disabled .theme-switcher__option {
5404
5503
  cursor: default;
5405
5504
  }
5406
- /* 实测 Geist(320 框):壳与岛恒黑、键恒灰——拟真设备不随主题翻转;无投影,黑壳对比度即高度感。
5505
+ /* 实测外部参考(320 框):壳与岛恒黑、键恒灰——拟真设备不随主题翻转;无投影,黑壳对比度即高度感。
5407
5506
  键位为 675 框高的实测百分比换算:静音 15%、音量 23.4%/32.4%、电源(右)28.2%。 */
5408
5507
  .phone {
5409
5508
  position: relative;
@@ -5457,7 +5556,7 @@ a.q1-card:focus-visible {
5457
5556
  overflow: hidden;
5458
5557
  background: var(--q1-color-bg-canvas);
5459
5558
  }
5460
- /* iOS home 条:设备铬,叠在屏内容底部;我们的屏底色随主题翻转,故取前景色保持可见(Geist 灰占位屏上为恒白)。 */
5559
+ /* iOS home 条:设备铬,叠在屏内容底部;我们的屏底色随主题翻转,故取前景色保持可见(外部参考灰占位屏上为恒白)。 */
5461
5560
  .phone__home {
5462
5561
  position: absolute;
5463
5562
  bottom: 1.8%;
@@ -5662,7 +5761,7 @@ a.q1-card:focus-visible {
5662
5761
  transform: translateY(var(--y, 0px)) scale(1);
5663
5762
  opacity: 1;
5664
5763
  }
5665
- /* 状态 q1-toast:实心 tone 底色 + 浅色文字(对标 Geist 的 success/warning/error) */
5764
+ /* 状态 q1-toast:实心 tone 底色 + 浅色文字(对标外部参考的 success/warning/error) */
5666
5765
  .q1-toast--success,
5667
5766
  .q1-toast--warning,
5668
5767
  .q1-toast--error {
@@ -5793,7 +5892,7 @@ a.q1-card:focus-visible {
5793
5892
  border-radius: 999px;
5794
5893
  background: var(--q1-color-bg-subtle);
5795
5894
  }
5796
- /* 竖条拇指(对标 Geist):6×14 白色小竖条 + 定义环;action-on-primary 两主题恒白(拇指骑在 primary 填充上)。 */
5895
+ /* 竖条拇指(对标外部参考):6×14 白色小竖条 + 定义环;action-on-primary 两主题恒白(拇指骑在 primary 填充上)。 */
5797
5896
  .slider-input::-webkit-slider-thumb {
5798
5897
  -webkit-appearance: none;
5799
5898
  width: 6px;
@@ -5854,7 +5953,7 @@ a.q1-card:focus-visible {
5854
5953
  font-size: 14px;
5855
5954
  font-variant-numeric: tabular-nums;
5856
5955
  text-align: center;
5857
- /* 隐藏原生步进箭头(对标 Geist):键盘 ↑↓ 步进不受影响,粗调交给滑块。 */
5956
+ /* 隐藏原生步进箭头(对标外部参考):键盘 ↑↓ 步进不受影响,粗调交给滑块。 */
5858
5957
  -moz-appearance: textfield;
5859
5958
  appearance: textfield;
5860
5959
  }
@@ -5932,7 +6031,7 @@ a.q1-card:focus-visible {
5932
6031
  color: var(--q1-color-text-secondary);
5933
6032
  font-size: 14px;
5934
6033
  text-align: center;
5935
- /* 光标铁律:Geist 右键触发区无 cursor 声明(auto),照抄不自建。 */
6034
+ /* 光标铁律:外部参考右键触发区无 cursor 声明(auto),照抄不自建。 */
5936
6035
  user-select: none;
5937
6036
  }
5938
6037
  .context-menu__area:focus-visible {
@@ -6031,7 +6130,7 @@ a.q1-card:focus-visible {
6031
6130
  .split-button--secondary .split-button__toggle {
6032
6131
  background: var(--q1-color-bg-panel);
6033
6132
  }
6034
- /* 尺寸(与 Button 家族共享 Geist 刻度:高 32/40/48、radius 6/6/8、字号 14/14/16) */
6133
+ /* 尺寸(与 Button 家族共享外部参考刻度:高 32/40/48、radius 6/6/8、字号 14/14/16) */
6035
6134
  .split-button--sm .split-button__primary {
6036
6135
  min-height: 32px;
6037
6136
  padding: 0 var(--q1-space-3);
@@ -6107,6 +6206,10 @@ a.q1-card:focus-visible {
6107
6206
  .combobox--disabled .combobox__control {
6108
6207
  opacity: 0.55;
6109
6208
  }
6209
+ .combobox--readonly .combobox__input {
6210
+ caret-color: transparent;
6211
+ cursor: default;
6212
+ }
6110
6213
  .combobox__leading {
6111
6214
  flex: none;
6112
6215
  color: var(--q1-color-text-secondary);
@@ -6143,7 +6246,7 @@ a.q1-card:focus-visible {
6143
6246
  outline: none;
6144
6247
  box-shadow: var(--q1-shadow-focus);
6145
6248
  }
6146
- .combobox__listbox {
6249
+ .combobox__popup {
6147
6250
  position: absolute;
6148
6251
  top: calc(100% + var(--q1-space-1));
6149
6252
  left: 0;
@@ -6157,7 +6260,12 @@ a.q1-card:focus-visible {
6157
6260
  border: 1px solid var(--q1-color-border-overlay);
6158
6261
  border-radius: var(--q1-radius-3);
6159
6262
  background: var(--q1-color-bg-panel);
6160
- box-shadow: 0 8px 28px color-mix(in srgb, var(--q1-color-shadow) 16%, transparent);
6263
+ box-shadow: var(--q1-shadow-popover);
6264
+ }
6265
+ .combobox__listbox {
6266
+ margin: 0;
6267
+ padding: 0;
6268
+ list-style: none;
6161
6269
  }
6162
6270
  .combobox__option {
6163
6271
  display: flex;
@@ -6170,7 +6278,7 @@ a.q1-card:focus-visible {
6170
6278
  cursor: pointer;
6171
6279
  }
6172
6280
 
6173
- /* 选项前后图标(对标 Geist With Prefix/Suffix Icons):前缀随文本、后缀推到行尾。 */
6281
+ /* 选项前后图标(对标外部参考 With Prefix/Suffix Icons):前缀随文本、后缀推到行尾。 */
6174
6282
  .combobox__option-prefix,
6175
6283
  .combobox__option-suffix {
6176
6284
  display: inline-flex;
@@ -6186,15 +6294,31 @@ a.q1-card:focus-visible {
6186
6294
  .combobox__option--active {
6187
6295
  background: color-mix(in srgb, var(--q1-color-text-primary) 6%, transparent);
6188
6296
  }
6297
+ .combobox__option--disabled {
6298
+ color: var(--q1-color-text-secondary);
6299
+ opacity: 0.55;
6300
+ cursor: not-allowed;
6301
+ }
6189
6302
  .combobox__option[aria-selected='true'] {
6190
6303
  color: var(--q1-color-action-primary);
6191
6304
  font-weight: 500;
6192
6305
  }
6306
+ /* 选中项对勾(对标外部参考选中标记):推到行尾,随选中色。 */
6307
+ .combobox__option-check {
6308
+ flex: none;
6309
+ margin-left: auto;
6310
+ color: var(--q1-color-action-primary);
6311
+ }
6193
6312
  .combobox__empty {
6194
6313
  padding: var(--q1-space-3);
6195
6314
  font-size: 13px;
6196
6315
  color: var(--q1-color-text-secondary);
6197
6316
  }
6317
+ .combobox__empty :focus-visible {
6318
+ outline: none;
6319
+ border-radius: var(--q1-radius-1);
6320
+ box-shadow: var(--q1-shadow-focus);
6321
+ }
6198
6322
  .combobox__error-text {
6199
6323
  margin: var(--q1-space-2) 0 0;
6200
6324
  font-size: 13px;
@@ -6231,7 +6355,7 @@ a.q1-card:focus-visible {
6231
6355
  color: var(--q1-color-text-secondary);
6232
6356
  font-weight: 400;
6233
6357
  }
6234
- /* 实测 Geist:菜单 radius-4(12px)、padding space-2(8px)、行高 32px。 */
6358
+ /* 实测外部参考:菜单 radius-4(12px)、padding space-2(8px)、行高 32px。 */
6235
6359
  .multi-select__menu {
6236
6360
  position: absolute;
6237
6361
  top: calc(100% + var(--q1-space-1));
@@ -6242,7 +6366,7 @@ a.q1-card:focus-visible {
6242
6366
  border: 1px solid var(--q1-color-border-overlay);
6243
6367
  border-radius: var(--q1-radius-4);
6244
6368
  background: var(--q1-color-bg-panel);
6245
- box-shadow: 0 8px 28px color-mix(in srgb, var(--q1-color-shadow) 16%, transparent);
6369
+ box-shadow: var(--q1-shadow-popover);
6246
6370
  }
6247
6371
  .multi-select__bulk {
6248
6372
  display: flex;
@@ -6312,13 +6436,13 @@ a.q1-card:focus-visible {
6312
6436
  border-radius: var(--q1-radius-1);
6313
6437
  color: var(--q1-color-bg-canvas);
6314
6438
  }
6315
- /* 实测 Geist:选中态是中性 gray-1000 黑底,不是品牌蓝——与 Radio/Note 行动按钮已定的
6439
+ /* 实测外部参考:选中态是中性 gray-1000 黑底,不是品牌蓝——与 Radio/Note 行动按钮已定的
6316
6440
  「选择控件中性,品牌色只归主动作」规则一致。 */
6317
6441
  .multi-select__check--on {
6318
6442
  background: var(--q1-color-gray-1000);
6319
6443
  border-color: var(--q1-color-gray-1000);
6320
6444
  }
6321
- /* 边界:Geist 遇长名靠菜单变宽保持单行;我们改为单行截断更保守——真实业务数据(权限范围名)
6445
+ /* 边界:外部参考遇长名靠菜单变宽保持单行;我们改为单行截断更保守——真实业务数据(权限范围名)
6322
6446
  长度不可控,任由菜单跟着最长一项无限变宽风险更高;32px 定高行也扛不住换行溢出。 */
6323
6447
  .multi-select__option-label {
6324
6448
  overflow: hidden;
@@ -6407,7 +6531,7 @@ a.q1-card:focus-visible {
6407
6531
  border: 1px solid var(--q1-color-border-overlay);
6408
6532
  border-radius: var(--q1-radius-4);
6409
6533
  background: var(--q1-color-bg-panel);
6410
- box-shadow: 0 16px 48px color-mix(in srgb, var(--q1-color-shadow) 32%, transparent);
6534
+ box-shadow: var(--q1-shadow-modal);
6411
6535
  overflow: hidden;
6412
6536
  }
6413
6537
  .command-palette__search {
@@ -6489,7 +6613,7 @@ a.q1-card:focus-visible {
6489
6613
  font-size: 11px;
6490
6614
  }
6491
6615
 
6492
- /* 项通用后缀(对标 Geist With Suffix):元信息文本/状态图标,右对齐、次要色。 */
6616
+ /* 项通用后缀(对标外部参考 With Suffix):元信息文本/状态图标,右对齐、次要色。 */
6493
6617
  .command-palette__suffix {
6494
6618
  display: inline-flex;
6495
6619
  align-items: center;
@@ -6551,7 +6675,7 @@ a.q1-card:focus-visible {
6551
6675
  .modal-btn--primary:hover {
6552
6676
  background: var(--q1-color-action-primary-hover, var(--q1-color-action-primary));
6553
6677
  }
6554
- /* 禁用主按钮(实测 Geist Disabled actions:色彩降级、opacity 恒 1)。这是实心 CTA 按钮,
6678
+ /* 禁用主按钮(实测外部参考 Disabled actions:色彩降级、opacity 恒 1)。这是实心 CTA 按钮,
6555
6679
  对标 Input/Select 已建立的「底色抬灰」表单控件禁用配方,而非 Radio 的描边控件配方——
6556
6680
  gray-500 实底配 bg-canvas 字在暗色主题对比度不足,bg-subtle + text-muted 双主题都可读。 */
6557
6681
  .modal-btn--primary:disabled {
@@ -6563,10 +6687,9 @@ a.q1-card:focus-visible {
6563
6687
  .modal-btn--primary:disabled:hover {
6564
6688
  background: var(--q1-color-bg-subtle);
6565
6689
  }
6566
- /* fullWidth(对标 Geist Single button):单按钮场景下让主操作铺满整行,而不是退回右对齐。 */
6567
- .modal-btn--full-width {
6690
+ /* 单按钮场景铺满整行(对标外部参考 Single button):布局属于模态框上下文,不进 Button 本体。 */
6691
+ .modal__action--full {
6568
6692
  width: 100%;
6569
- text-align: center;
6570
6693
  }
6571
6694
  .modal {
6572
6695
  position: fixed;
@@ -6584,7 +6707,7 @@ a.q1-card:focus-visible {
6584
6707
  background: color-mix(in srgb, var(--q1-color-shadow) 45%, transparent);
6585
6708
  cursor: default;
6586
6709
  }
6587
- /* 实测 Geist:540px 宽(我们原 480)。 */
6710
+ /* 实测外部参考:540px 宽(我们原 480)。 */
6588
6711
  .modal__dialog {
6589
6712
  position: relative;
6590
6713
  width: 100%;
@@ -6592,7 +6715,7 @@ a.q1-card:focus-visible {
6592
6715
  border: 1px solid var(--q1-color-border-overlay);
6593
6716
  border-radius: var(--q1-radius-4);
6594
6717
  background: var(--q1-color-bg-panel);
6595
- box-shadow: 0 16px 48px color-mix(in srgb, var(--q1-color-shadow) 32%, transparent);
6718
+ box-shadow: var(--q1-shadow-modal);
6596
6719
  }
6597
6720
  .modal__header {
6598
6721
  display: flex;
@@ -6636,7 +6759,7 @@ a.q1-card:focus-visible {
6636
6759
  .modal__body p {
6637
6760
  margin: 0;
6638
6761
  }
6639
- /* 实测 Geist:取消靠左、主操作靠右(space-between),不是两个按钮一起挤右侧;
6762
+ /* 实测外部参考:取消靠左、主操作靠右(space-between),不是两个按钮一起挤右侧;
6640
6763
  仅单个按钮(如确认型 Modal 的「完成」)时退回右对齐,避免孤零零挂在左边。 */
6641
6764
  .modal__footer {
6642
6765
  display: flex;
@@ -6713,7 +6836,7 @@ a.q1-card:focus-visible {
6713
6836
  font-size: 13px;
6714
6837
  color: var(--q1-color-red-700);
6715
6838
  }
6716
- /* loading 态主按钮的加载指示(对标 Geist Loading 章):连续旋转,尊重 reduced-motion。 */
6839
+ /* loading 态主按钮的加载指示(对标外部参考 Loading 章):连续旋转,尊重 reduced-motion。 */
6717
6840
  .destructive-modal__spinner {
6718
6841
  margin-right: var(--q1-space-2);
6719
6842
  vertical-align: -2px;
@@ -6830,7 +6953,7 @@ a.q1-card:focus-visible {
6830
6953
  padding: var(--q1-space-4) var(--q1-space-6);
6831
6954
  border-top: 1px solid var(--q1-color-border);
6832
6955
  }
6833
- /* 遮罩(对标 Geist):黑 80% 压暗底层页面,拦截外部点击但点击不关闭;恒黑 token 两主题一致。 */
6956
+ /* 遮罩(对标外部参考):黑 80% 压暗底层页面,拦截外部点击但点击不关闭;恒黑 token 两主题一致。 */
6834
6957
  .sheet__backdrop {
6835
6958
  position: fixed;
6836
6959
  inset: 0;
@@ -6850,7 +6973,7 @@ a.q1-card:focus-visible {
6850
6973
  }
6851
6974
  }
6852
6975
 
6853
- /* 悬浮圆角面板(对标 Geist 形态):四边不贴屏,inset 12 + 圆角 + 全边框。 */
6976
+ /* 悬浮圆角面板(对标外部参考形态):四边不贴屏,inset 12 + 圆角 + 全边框。 */
6854
6977
  .sheet__panel {
6855
6978
  position: fixed;
6856
6979
  z-index: 70;
@@ -6920,7 +7043,7 @@ a.q1-card:focus-visible {
6920
7043
  transform: translateY(calc(100% + var(--q1-space-3)));
6921
7044
  }
6922
7045
  }
6923
- /* 头/尾无分隔线(对标 Geist):层级靠 24px 留白,不画线。 */
7046
+ /* 头/尾无分隔线(对标外部参考):层级靠 24px 留白,不画线。 */
6924
7047
  .sheet__header {
6925
7048
  display: flex;
6926
7049
  align-items: center;