@symerian/symi 3.5.29 → 3.5.31

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.
@@ -853,47 +853,189 @@ body {
853
853
  the now-removed reasoning panel up into the header row, where it
854
854
  still pulses on agent activity (app.js:840-845 untouched, single id
855
855
  continues to bind that semantic). */
856
- /* Stage C.4 (3.5.25): switched the symframe from flex to grid. The
857
- flex-based layout (flex: 1 1 0 + min-height: 0 + child grid
858
- overflow: hidden) intermittently failed to bound the substrate's
859
- intrinsic content size observed on real hardware where the
860
- substrate's reasoning entries still pushed the AWAITING footer
861
- past the viewport.
862
-
863
- Grid handles the "auto-row + 1fr-row + auto-row" pattern natively:
864
- the 1fr row is constrained to whatever space remains after the
865
- two auto rows resolve. There's no flex-basis-vs-content-size
866
- negotiation to get wrong. The grid track shrinks to fit and the
867
- substrate's overflow-y reliably engages. */
856
+ /* Stage C.4 (3.5.25) + Stage D.3 (3.5.30) revision: the symframe is
857
+ a grid container (rows: header / stack / footer) sized to fill its
858
+ metrics-col flex parent. The two key sizing primitives:
859
+ - flex: 1 1 0 + min-height: 0 on the symframe itself ensures the
860
+ grid container has a *definite* height inside the flex column
861
+ parent. Without this, `height: 100%` was unreliable across
862
+ browsers + modes (modes 2-4 overflow report from 3.5.29).
863
+ - minmax(0, 1fr) on the flex middle row (instead of plain 1fr)
864
+ explicitly allows the row to shrink below its content size,
865
+ which lets the substrate / cards container's overflow-y: auto
866
+ reliably engage instead of pushing the parent.
867
+ Combined: every mode reliably bounds to the column. */
868
+ /* ── Symframe Design Tokens (Option 1 — 3.5.31) ─────────────────────────
869
+ Exhaustive token set extracted from existing symframe CSS — every literal
870
+ value used in the symframe surface has been replaced with a var(--sf-*)
871
+ reference. Visual identity preserved exactly. Token names are numeric
872
+ (--sf-cyan-12) rather than semantic (--sf-cyan-border); semantic naming +
873
+ tier consolidation happens in Option 3 (visual harmonization).
874
+
875
+ Defined at :root so the tokens are inherited by every selector in the
876
+ symframe surface without scoping concerns. Future selectors elsewhere
877
+ in the codebase will see the tokens but won't accidentally use them.
878
+ */
879
+ :root {
880
+ /* ── Cyan accent opacities (15 distinct tiers from existing usage) ── */
881
+ --sf-cyan-04: rgba(0, 212, 255, 0.04);
882
+ --sf-cyan-05: rgba(0, 212, 255, 0.05);
883
+ --sf-cyan-06: rgba(0, 212, 255, 0.06);
884
+ --sf-cyan-08: rgba(0, 212, 255, 0.08);
885
+ --sf-cyan-10: rgba(0, 212, 255, 0.1);
886
+ --sf-cyan-12: rgba(0, 212, 255, 0.12);
887
+ --sf-cyan-14: rgba(0, 212, 255, 0.14);
888
+ --sf-cyan-15: rgba(0, 212, 255, 0.15);
889
+ --sf-cyan-18: rgba(0, 212, 255, 0.18);
890
+ --sf-cyan-20: rgba(0, 212, 255, 0.2);
891
+ --sf-cyan-25: rgba(0, 212, 255, 0.25);
892
+ --sf-cyan-32: rgba(0, 212, 255, 0.32);
893
+ --sf-cyan-35: rgba(0, 212, 255, 0.35);
894
+ --sf-cyan-45: rgba(0, 212, 255, 0.45);
895
+ --sf-cyan-50: rgba(0, 212, 255, 0.5);
896
+ --sf-cyan-55: rgba(0, 212, 255, 0.55);
897
+ --sf-cyan-60: rgba(0, 212, 255, 0.6);
898
+ --sf-cyan-65: rgba(0, 212, 255, 0.65);
899
+
900
+ /* ── White opacity tiers ── */
901
+ --sf-white-02: rgba(255, 255, 255, 0.02);
902
+ --sf-white-03: rgba(255, 255, 255, 0.03);
903
+ --sf-white-04: rgba(255, 255, 255, 0.04);
904
+ --sf-white-05: rgba(255, 255, 255, 0.05);
905
+ --sf-white-06: rgba(255, 255, 255, 0.06);
906
+ --sf-white-08: rgba(255, 255, 255, 0.08);
907
+ --sf-white-09: rgba(255, 255, 255, 0.09);
908
+ --sf-white-10: rgba(255, 255, 255, 0.1);
909
+ --sf-white-12: rgba(255, 255, 255, 0.12);
910
+
911
+ /* ── Black opacity tiers (shadows + dark fills) ── */
912
+ --sf-black-15: rgba(0, 0, 0, 0.15);
913
+ --sf-black-20: rgba(0, 0, 0, 0.2);
914
+ --sf-black-25: rgba(0, 0, 0, 0.25);
915
+ --sf-black-30: rgba(0, 0, 0, 0.3);
916
+ --sf-black-35: rgba(0, 0, 0, 0.35);
917
+ --sf-black-40: rgba(0, 0, 0, 0.4);
918
+ --sf-black-55: rgba(0, 0, 0, 0.55);
919
+
920
+ /* ── Surface fills (dark blue-tinted glass) ── */
921
+ --sf-surface-card: rgba(10, 16, 26, 0.62);
922
+ --sf-surface-menu: rgba(10, 16, 26, 0.95);
923
+
924
+ /* ── Intent palette (Stage D.1 — used by intent stripes, considering
925
+ button, AWAITING flag, producing pulse, and the substrate badges
926
+ that mirror these colors) ── */
927
+ /* amber — weighing intent + considering button */
928
+ --sf-amber-12: rgba(245, 183, 58, 0.12);
929
+ --sf-amber-32: rgba(245, 183, 58, 0.32);
930
+ /* pink — awaiting flag + considering-empty + panel-ref-miss pulse */
931
+ --sf-pink-10: rgba(244, 114, 182, 0.1);
932
+ --sf-pink-22: rgba(244, 114, 182, 0.22);
933
+ --sf-pink-55: rgba(244, 114, 182, 0.55);
934
+ --sf-pink-60: rgba(244, 114, 182, 0.6);
935
+ --sf-pink-85: rgba(244, 114, 182, 0.85);
936
+ /* green — producing intent + result reasoning badge */
937
+ --sf-green-10: rgba(52, 211, 153, 0.1);
938
+ --sf-green-18: rgba(52, 211, 153, 0.18);
939
+ --sf-green-20: rgba(52, 211, 153, 0.2);
940
+ --sf-green-55: rgba(52, 211, 153, 0.55);
941
+ --sf-green-75: rgba(52, 211, 153, 0.75);
942
+ --sf-green-100: rgba(52, 211, 153, 1);
943
+ /* violet — drafted intent + tool reasoning badge */
944
+ --sf-violet-12: rgba(139, 92, 246, 0.12);
945
+ --sf-violet-20: rgba(139, 92, 246, 0.2);
946
+ --sf-violet-22: rgba(139, 92, 246, 0.22);
947
+ --sf-violet-25: rgba(139, 92, 246, 0.25);
948
+ --sf-violet-32: rgba(139, 92, 246, 0.32);
949
+ --sf-violet-55: rgba(139, 92, 246, 0.55);
950
+
951
+ /* ── Padding / gap / margin values (px) ── */
952
+ --sf-pad-2: 2px;
953
+ --sf-pad-4: 4px;
954
+ --sf-pad-5: 5px;
955
+ --sf-pad-6: 6px;
956
+ --sf-pad-8: 8px;
957
+ --sf-pad-10: 10px;
958
+ --sf-pad-12: 12px;
959
+
960
+ /* ── Font sizes (px) ── */
961
+ --sf-text-8: 8px;
962
+ --sf-text-9: 9px;
963
+ --sf-text-10: 10px;
964
+ --sf-text-11: 11px;
965
+ --sf-text-12: 12px;
966
+ --sf-text-13: 13px;
967
+ --sf-text-16: 16px;
968
+
969
+ /* ── Border-radius (px / %) ── */
970
+ --sf-radius-2: 2px;
971
+ --sf-radius-3: 3px;
972
+ --sf-radius-4: 4px;
973
+ --sf-radius-5: 5px;
974
+ --sf-radius-6: 6px;
975
+ --sf-radius-8: 8px;
976
+ --sf-radius-10: 10px;
977
+ --sf-radius-pill: 50%;
978
+
979
+ /* ── Content bounds (height limits) ── */
980
+ --sf-bound-row: 38px;
981
+ --sf-bound-tool: 100px;
982
+ --sf-bound-detail: 120px;
983
+ --sf-bound-list: 200px;
984
+ --sf-bound-media: 280px;
985
+ --sf-bound-body: 320px;
986
+
987
+ /* ── Motion durations ── */
988
+ --sf-time-fast: 0.15s;
989
+ --sf-time-quick: 0.2s;
990
+ --sf-time-200ms: 200ms;
991
+ --sf-time-slow: 0.3s;
992
+ --sf-time-normal: 0.4s;
993
+ --sf-time-medium: 0.5s;
994
+ --sf-time-soft: 0.6s;
995
+ --sf-time-600ms: 600ms;
996
+ --sf-time-easy: 0.8s;
997
+ --sf-time-800ms: 800ms;
998
+ --sf-time-1s: 1s;
999
+ --sf-time-pulse: 1.2s;
1000
+ --sf-time-pulse-prod: 2.6s;
1001
+ --sf-time-pulse-quiet: 3.2s;
1002
+ }
1003
+
868
1004
  .symframe {
869
1005
  display: grid;
870
- grid-template-rows: auto 1fr auto;
871
- gap: 8px;
872
- height: 100%;
1006
+ grid-template-rows: auto minmax(0, 1fr) auto;
1007
+ gap: var(--sf-pad-8);
1008
+
1009
+ flex: 1 1 0;
1010
+ min-height: 0;
873
1011
  overflow: hidden;
874
1012
  }
875
1013
  .symframe-header {
876
- padding: 8px 10px 10px;
877
- border-bottom: 1px solid rgba(0, 212, 255, 0.12);
878
- margin-bottom: 4px;
1014
+ padding: var(--sf-pad-8) var(--sf-pad-10) var(--sf-pad-10);
1015
+
1016
+ border-bottom: 1px solid var(--sf-cyan-12);
1017
+ margin-bottom: var(--sf-pad-4);
1018
+
879
1019
  min-height: 0;
880
1020
  }
881
1021
  .symframe-header-row {
882
1022
  display: flex;
883
1023
  align-items: baseline;
884
1024
  justify-content: space-between;
885
- gap: 10px;
1025
+ gap: var(--sf-pad-10);
886
1026
  }
887
1027
  .symframe-title {
888
1028
  font-family: var(--font-mono);
889
- font-size: 12px;
1029
+ font-size: var(--sf-text-12);
1030
+
890
1031
  font-weight: 600;
891
1032
  letter-spacing: 0.14em;
892
1033
  color: var(--accent-cyan);
893
1034
  }
894
1035
  .symframe-count {
895
1036
  font-family: var(--font-mono);
896
- font-size: 9px;
1037
+ font-size: var(--sf-text-9);
1038
+
897
1039
  letter-spacing: 0.06em;
898
1040
  color: var(--text-dim);
899
1041
  opacity: 0.7;
@@ -901,11 +1043,13 @@ body {
901
1043
  }
902
1044
  .symframe-sub {
903
1045
  font-family: var(--font-mono);
904
- font-size: 9px;
1046
+ font-size: var(--sf-text-9);
1047
+
905
1048
  letter-spacing: 0.04em;
906
1049
  color: var(--text-dim);
907
1050
  opacity: 0.55;
908
- margin-top: 4px;
1051
+ margin-top: var(--sf-pad-4);
1052
+
909
1053
  line-height: 1.4;
910
1054
  }
911
1055
 
@@ -913,14 +1057,16 @@ body {
913
1057
  .symframe-modes {
914
1058
  display: flex;
915
1059
  align-items: center;
916
- gap: 6px;
917
- margin-top: 6px;
1060
+ gap: var(--sf-pad-6);
1061
+
1062
+ margin-top: var(--sf-pad-6);
918
1063
  }
919
1064
  .mode-chip {
920
1065
  width: 10px;
921
1066
  height: 10px;
922
- border-radius: 50%;
923
- border: 1px solid rgba(0, 212, 255, 0.32);
1067
+ border-radius: var(--sf-radius-pill);
1068
+
1069
+ border: 1px solid var(--sf-cyan-32);
924
1070
  background: transparent;
925
1071
  padding: 0;
926
1072
  cursor: pointer;
@@ -932,32 +1078,35 @@ body {
932
1078
  }
933
1079
  .mode-chip:hover {
934
1080
  border-color: var(--accent-cyan);
935
- background: rgba(0, 212, 255, 0.15);
1081
+ background: var(--sf-cyan-15);
936
1082
  transform: scale(1.15);
937
1083
  }
938
1084
  .mode-chip.active {
939
1085
  background: var(--accent-cyan);
940
1086
  border-color: var(--accent-cyan);
941
- box-shadow: 0 0 6px rgba(0, 212, 255, 0.5);
1087
+ box-shadow: 0 0 6px var(--sf-cyan-50);
942
1088
  }
943
1089
  .mode-auto {
944
1090
  margin-left: auto;
945
- padding: 2px 8px;
1091
+ padding: var(--sf-pad-2) var(--sf-pad-8);
1092
+
946
1093
  font-family: var(--font-mono);
947
- font-size: 8px;
1094
+ font-size: var(--sf-text-8);
1095
+
948
1096
  font-weight: 700;
949
1097
  letter-spacing: 0.12em;
950
1098
  color: var(--accent-cyan);
951
- background: rgba(0, 212, 255, 0.08);
952
- border: 1px solid rgba(0, 212, 255, 0.32);
953
- border-radius: 8px;
1099
+ background: var(--sf-cyan-08);
1100
+ border: 1px solid var(--sf-cyan-32);
1101
+ border-radius: var(--sf-radius-8);
1102
+
954
1103
  cursor: pointer;
955
1104
  transition:
956
1105
  background 0.15s ease,
957
1106
  color 0.15s ease;
958
1107
  }
959
1108
  .mode-auto:hover {
960
- background: rgba(0, 212, 255, 0.2);
1109
+ background: var(--sf-cyan-20);
961
1110
  color: var(--text);
962
1111
  }
963
1112
 
@@ -966,15 +1115,19 @@ body {
966
1115
  AND adds .considering-weighing to #symframe (CSS below) which dims
967
1116
  non-weighing cards for the duration. */
968
1117
  .considering-btn {
969
- margin-left: 4px;
970
- padding: 2px 7px;
971
- font-size: 11px;
1118
+ margin-left: var(--sf-pad-4);
1119
+
1120
+ padding: var(--sf-pad-2) 7px;
1121
+
1122
+ font-size: var(--sf-text-11);
1123
+
972
1124
  line-height: 1;
973
1125
  font-family: var(--font-mono);
974
1126
  color: #f5b73a; /* amber — same hue as weighing intent */
975
1127
  background: transparent;
976
- border: 1px solid rgba(245, 183, 58, 0.32);
977
- border-radius: 8px;
1128
+ border: 1px solid var(--sf-amber-32);
1129
+ border-radius: var(--sf-radius-8);
1130
+
978
1131
  cursor: pointer;
979
1132
  transition:
980
1133
  background 0.15s ease,
@@ -982,7 +1135,7 @@ body {
982
1135
  transform 0.15s ease;
983
1136
  }
984
1137
  .considering-btn:hover {
985
- background: rgba(245, 183, 58, 0.12);
1138
+ background: var(--sf-amber-12);
986
1139
  border-color: #f5b73a;
987
1140
  }
988
1141
  .considering-btn:active {
@@ -991,16 +1144,16 @@ body {
991
1144
  /* Brief red flash when clicked while no weighing cards exist —
992
1145
  tells the user "I have nothing to surface here." */
993
1146
  .considering-btn.considering-empty {
994
- animation: considering-empty-pulse 0.8s ease-out;
1147
+ animation: considering-empty-pulse var(--sf-time-easy) ease-out;
995
1148
  }
996
1149
  @keyframes considering-empty-pulse {
997
1150
  0%,
998
1151
  100% {
999
- border-color: rgba(245, 183, 58, 0.32);
1152
+ border-color: var(--sf-amber-32);
1000
1153
  }
1001
1154
  50% {
1002
- border-color: rgba(244, 114, 182, 0.6);
1003
- background: rgba(244, 114, 182, 0.1);
1155
+ border-color: var(--sf-pink-60);
1156
+ background: var(--sf-pink-10);
1004
1157
  }
1005
1158
  }
1006
1159
  /* While considering-weighing is active, dim non-weighing cards so the
@@ -1014,14 +1167,15 @@ body {
1014
1167
  }
1015
1168
  .symframe.considering-weighing .symframe-substrate {
1016
1169
  opacity: 0.45;
1017
- transition: opacity 0.4s ease;
1170
+ transition: opacity var(--sf-time-normal) ease;
1018
1171
  }
1019
1172
  @media (prefers-reduced-motion: reduce) {
1020
1173
  .considering-btn.considering-empty {
1021
1174
  animation: none;
1022
1175
  }
1023
1176
  .symframe.considering-weighing .symframe-card-dynamic:not([data-intent="weighing"]) {
1024
- transition: opacity 0.2s ease;
1177
+ transition: opacity var(--sf-time-quick) ease;
1178
+
1025
1179
  filter: none;
1026
1180
  }
1027
1181
  }
@@ -1037,8 +1191,10 @@ body {
1037
1191
  border-bottom: 1px dashed currentColor;
1038
1192
  cursor: pointer;
1039
1193
  font-weight: 500;
1040
- padding: 0 2px;
1041
- border-radius: 3px;
1194
+ padding: 0 var(--sf-pad-2);
1195
+
1196
+ border-radius: var(--sf-radius-3);
1197
+
1042
1198
  transition:
1043
1199
  background 0.15s ease,
1044
1200
  border-bottom-style 0.15s ease;
@@ -1049,7 +1205,7 @@ body {
1049
1205
  opacity: 0.7;
1050
1206
  }
1051
1207
  .panel-ref:hover {
1052
- background: rgba(0, 212, 255, 0.12);
1208
+ background: var(--sf-cyan-12);
1053
1209
  border-bottom-style: solid;
1054
1210
  }
1055
1211
  /* Orphan reference — the card is no longer in the panel. Subdued so
@@ -1064,15 +1220,15 @@ body {
1064
1220
  /* Click-miss flash: a brief pink tint signals "I tried to dwell but
1065
1221
  that card isn't currently registered." */
1066
1222
  .panel-ref.panel-ref-miss {
1067
- animation: panel-ref-miss-pulse 1s ease-out;
1223
+ animation: panel-ref-miss-pulse var(--sf-time-1s) ease-out;
1068
1224
  }
1069
1225
  @keyframes panel-ref-miss-pulse {
1070
1226
  0%,
1071
1227
  100% {
1072
- background: rgba(0, 212, 255, 0.12);
1228
+ background: var(--sf-cyan-12);
1073
1229
  }
1074
1230
  50% {
1075
- background: rgba(244, 114, 182, 0.22);
1231
+ background: var(--sf-pink-22);
1076
1232
  }
1077
1233
  }
1078
1234
 
@@ -1084,7 +1240,10 @@ body {
1084
1240
  foreground card takes the visual stage. If a focusedId is set, the
1085
1241
  matching card gets a cyan halo + others fade out. */
1086
1242
  .symframe[data-mode="focus"] {
1087
- grid-template-rows: auto 1fr 0;
1243
+ /* Stage D.3: minmax(0, 1fr) so the middle row can shrink below
1244
+ content size and the cards container's overflow-y: auto engages
1245
+ instead of expanding the row. */
1246
+ grid-template-rows: auto minmax(0, 1fr) 0;
1088
1247
  }
1089
1248
  .symframe[data-mode="focus"] .symframe-awaiting {
1090
1249
  display: none;
@@ -1100,7 +1259,7 @@ body {
1100
1259
  /* When focusedId is set, dim non-matching cards. */
1101
1260
  .symframe[data-mode="focus"][data-focus-id] .symframe-card-dynamic {
1102
1261
  opacity: 0.25;
1103
- transition: opacity 0.4s ease;
1262
+ transition: opacity var(--sf-time-normal) ease;
1104
1263
  }
1105
1264
  .symframe[data-mode="focus"][data-focus-id] .symframe-card-dynamic:hover {
1106
1265
  opacity: 0.6;
@@ -1117,9 +1276,9 @@ body {
1117
1276
  plenty of focus signal on their own. */
1118
1277
  opacity: 1 !important;
1119
1278
  box-shadow:
1120
- 0 0 24px rgba(0, 212, 255, 0.35),
1121
- inset 0 1px 0 rgba(255, 255, 255, 0.06),
1122
- 0 4px 12px rgba(0, 0, 0, 0.25);
1279
+ 0 0 24px var(--sf-cyan-35),
1280
+ inset 0 1px 0 var(--sf-white-06),
1281
+ 0 4px 12px var(--sf-black-25);
1123
1282
  border-color: var(--accent-cyan) !important;
1124
1283
  transition:
1125
1284
  box-shadow 0.4s ease,
@@ -1144,13 +1303,19 @@ body {
1144
1303
  scrolls internally when its content exceeds the now-larger footer.
1145
1304
  */
1146
1305
  .symframe[data-mode="awaiting"] {
1147
- grid-template-rows: auto minmax(60px, 1fr) auto;
1306
+ /* Stage D.3: minmax(0, 1fr) on substrate so it can shrink (and
1307
+ scroll internally) when awaiting takes most of the column.
1308
+ `auto` on the footer row + max-height: 80% on .symframe-awaiting
1309
+ bounds it; `overflow: hidden` on the footer clips any overflow
1310
+ from its inner list (which has its own overflow-y: auto). */
1311
+ grid-template-rows: auto minmax(0, 1fr) auto;
1148
1312
  }
1149
1313
  .symframe[data-mode="awaiting"] .symframe-substrate {
1150
1314
  opacity: 0.35;
1151
1315
  }
1152
1316
  .symframe[data-mode="awaiting"] .symframe-card-dynamic {
1153
- max-height: 38px;
1317
+ max-height: var(--sf-bound-row);
1318
+
1154
1319
  overflow: hidden;
1155
1320
  transition:
1156
1321
  max-height 0.4s ease,
@@ -1165,9 +1330,10 @@ body {
1165
1330
  "dominant" without exceeding the column. The `overflow: hidden`
1166
1331
  from C.4 still clips any overflow from misbehaving children. */
1167
1332
  max-height: 80%;
1168
- background: rgba(0, 212, 255, 0.04);
1169
- border-radius: 10px;
1170
- margin-top: 8px;
1333
+ background: var(--sf-cyan-04);
1334
+ border-radius: var(--sf-radius-10);
1335
+
1336
+ margin-top: var(--sf-pad-8);
1171
1337
  }
1172
1338
  .symframe[data-mode="awaiting"] .awaiting-list {
1173
1339
  /* The footer is now sized larger than baseline. Let the list flex
@@ -1178,9 +1344,11 @@ body {
1178
1344
  }
1179
1345
 
1180
1346
  /* Quiet mode: only the substrate breathes. Cards + AWAITING hidden.
1181
- This is the "deep think" or "nothing to surface" posture. */
1347
+ This is the "deep think" or "nothing to surface" posture.
1348
+ Stage D.3: minmax(0, 1fr) so the substrate can shrink below
1349
+ content size and scroll internally. */
1182
1350
  .symframe[data-mode="quiet"] {
1183
- grid-template-rows: auto 1fr;
1351
+ grid-template-rows: auto minmax(0, 1fr);
1184
1352
  }
1185
1353
  .symframe[data-mode="quiet"] .symframe-cards,
1186
1354
  .symframe[data-mode="quiet"] .symframe-awaiting {
@@ -1231,10 +1399,11 @@ body {
1231
1399
  min-height: 0;
1232
1400
  display: flex;
1233
1401
  flex-direction: column;
1234
- gap: 10px;
1402
+ gap: var(--sf-pad-10);
1403
+
1235
1404
  overflow-y: auto;
1236
1405
  scrollbar-width: thin;
1237
- scrollbar-color: rgba(0, 212, 255, 0.12) transparent;
1406
+ scrollbar-color: var(--sf-cyan-12) transparent;
1238
1407
  /* Let scroll/click events fall through the empty space between cards
1239
1408
  down to the substrate, so the user can scroll reasoning even when
1240
1409
  foreground cards are foregrounded. Cards themselves re-enable
@@ -1248,8 +1417,8 @@ body {
1248
1417
  width: 3px;
1249
1418
  }
1250
1419
  .symframe-cards::-webkit-scrollbar-thumb {
1251
- background: rgba(0, 212, 255, 0.12);
1252
- border-radius: 2px;
1420
+ background: var(--sf-cyan-12);
1421
+ border-radius: var(--sf-radius-2);
1253
1422
  }
1254
1423
 
1255
1424
  /* ── Substrate (ambient reasoning layer, Stage B) ──────────────────── */
@@ -1264,17 +1433,19 @@ body {
1264
1433
  overflow-y: auto;
1265
1434
  display: flex;
1266
1435
  flex-direction: column;
1267
- gap: 6px;
1268
- padding: 2px 4px 4px;
1436
+ gap: var(--sf-pad-6);
1437
+
1438
+ padding: var(--sf-pad-2) var(--sf-pad-4) var(--sf-pad-4);
1439
+
1269
1440
  scrollbar-width: thin;
1270
- scrollbar-color: rgba(0, 212, 255, 0.18) transparent;
1441
+ scrollbar-color: var(--sf-cyan-18) transparent;
1271
1442
  }
1272
1443
  .symframe-substrate::-webkit-scrollbar {
1273
1444
  width: 3px;
1274
1445
  }
1275
1446
  .symframe-substrate::-webkit-scrollbar-thumb {
1276
- background: rgba(0, 212, 255, 0.18);
1277
- border-radius: 2px;
1447
+ background: var(--sf-cyan-18);
1448
+ border-radius: var(--sf-radius-2);
1278
1449
  }
1279
1450
 
1280
1451
  /* Substrate entry — decay-driven visual. Custom properties are written
@@ -1297,17 +1468,20 @@ body {
1297
1468
  opacity: 1;
1298
1469
  filter: none;
1299
1470
  transform: none;
1300
- border-color: rgba(0, 212, 255, 0.32);
1301
- box-shadow: 0 0 12px rgba(0, 212, 255, 0.08);
1471
+ border-color: var(--sf-cyan-32);
1472
+ box-shadow: 0 0 12px var(--sf-cyan-08);
1302
1473
  }
1303
1474
  .substrate-live-dot {
1304
1475
  display: inline-block;
1305
1476
  width: 6px;
1306
1477
  height: 6px;
1307
- border-radius: 50%;
1478
+ border-radius: var(--sf-radius-pill);
1479
+
1308
1480
  background: var(--accent-cyan);
1309
- margin-right: 6px;
1310
- animation: pulse 1.2s ease-in-out infinite;
1481
+ margin-right: var(--sf-pad-6);
1482
+
1483
+ animation: pulse var(--sf-time-pulse) ease-in-out infinite;
1484
+
1311
1485
  flex-shrink: 0;
1312
1486
  }
1313
1487
 
@@ -1318,13 +1492,15 @@ body {
1318
1492
  max-height: 2px;
1319
1493
  padding: 0;
1320
1494
  border-width: 0;
1321
- border-top: 1px solid rgba(0, 212, 255, 0.06);
1495
+ border-top: 1px solid var(--sf-cyan-06);
1322
1496
  overflow: hidden;
1323
1497
  }
1324
1498
  .substrate-entry.substrate-texture:hover {
1325
- max-height: 200px;
1326
- padding: 6px 8px;
1327
- border: 1px solid rgba(0, 212, 255, 0.18);
1499
+ max-height: var(--sf-bound-list);
1500
+
1501
+ padding: var(--sf-pad-6) var(--sf-pad-8);
1502
+
1503
+ border: 1px solid var(--sf-cyan-18);
1328
1504
  opacity: 0.7;
1329
1505
  filter: none;
1330
1506
  }
@@ -1345,7 +1521,8 @@ body {
1345
1521
  flex-direction: column;
1346
1522
  align-items: center;
1347
1523
  justify-content: center;
1348
- gap: 10px;
1524
+ gap: var(--sf-pad-10);
1525
+
1349
1526
  padding: 40px 0;
1350
1527
  margin: auto;
1351
1528
  opacity: 0.85;
@@ -1353,17 +1530,15 @@ body {
1353
1530
  .substrate-quiet-dot {
1354
1531
  width: 14px;
1355
1532
  height: 14px;
1356
- border-radius: 50%;
1357
- background: radial-gradient(
1358
- circle at center,
1359
- rgba(0, 212, 255, 0.45) 0%,
1360
- rgba(0, 212, 255, 0) 70%
1361
- );
1362
- animation: quiet-pulse 3.2s ease-in-out infinite;
1533
+ border-radius: var(--sf-radius-pill);
1534
+
1535
+ background: radial-gradient(circle at center, var(--sf-cyan-45) 0%, rgba(0, 212, 255, 0) 70%);
1536
+ animation: quiet-pulse var(--sf-time-pulse-quiet) ease-in-out infinite;
1363
1537
  }
1364
1538
  .substrate-quiet-label {
1365
1539
  font-family: var(--font-mono);
1366
- font-size: 9px;
1540
+ font-size: var(--sf-text-9);
1541
+
1367
1542
  letter-spacing: 0.18em;
1368
1543
  text-transform: uppercase;
1369
1544
  color: var(--text-dim);
@@ -1386,7 +1561,8 @@ body {
1386
1561
  informative; the panel stays still. */
1387
1562
  @media (prefers-reduced-motion: reduce) {
1388
1563
  .substrate-entry {
1389
- transition: opacity 0.2s ease;
1564
+ transition: opacity var(--sf-time-quick) ease;
1565
+
1390
1566
  filter: none !important;
1391
1567
  transform: none !important;
1392
1568
  }
@@ -1406,22 +1582,24 @@ body {
1406
1582
  the substrate breathe through. The backdrop-filter blurs whatever
1407
1583
  substrate texture is behind, so even at moderate transparency the
1408
1584
  card body stays crisp. */
1409
- background: rgba(10, 16, 26, 0.62);
1585
+ background: var(--sf-surface-card);
1410
1586
  backdrop-filter: blur(10px) saturate(140%);
1411
1587
  -webkit-backdrop-filter: blur(10px) saturate(140%);
1412
- border: 1px solid rgba(0, 212, 255, 0.12);
1413
- border-radius: 10px;
1414
- padding: 10px 12px;
1588
+ border: 1px solid var(--sf-cyan-12);
1589
+ border-radius: var(--sf-radius-10);
1590
+
1591
+ padding: var(--sf-pad-10) var(--sf-pad-12);
1592
+
1415
1593
  box-shadow:
1416
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1417
- 0 4px 12px rgba(0, 0, 0, 0.25);
1594
+ inset 0 1px 0 var(--sf-white-04),
1595
+ 0 4px 12px var(--sf-black-25);
1418
1596
  }
1419
1597
  .symframe .symframe-card::before,
1420
1598
  .symframe .symframe-card::after {
1421
1599
  display: none;
1422
1600
  }
1423
1601
  .symframe .symframe-card:hover {
1424
- border-color: rgba(0, 212, 255, 0.18);
1602
+ border-color: var(--sf-cyan-18);
1425
1603
  }
1426
1604
 
1427
1605
  /* Phase 2: dynamic-card sub-elements (only present on cards added via
@@ -1430,17 +1608,19 @@ body {
1430
1608
  display: flex;
1431
1609
  align-items: center;
1432
1610
  justify-content: space-between;
1433
- gap: 8px;
1611
+ gap: var(--sf-pad-8);
1434
1612
  }
1435
1613
  .symframe-card-dismiss {
1436
1614
  background: transparent;
1437
1615
  border: none;
1438
1616
  color: var(--text-dim);
1439
- font-size: 16px;
1617
+ font-size: var(--sf-text-16);
1618
+
1440
1619
  line-height: 1;
1441
1620
  width: 18px;
1442
1621
  height: 18px;
1443
- border-radius: 4px;
1622
+ border-radius: var(--sf-radius-4);
1623
+
1444
1624
  cursor: pointer;
1445
1625
  opacity: 0.6;
1446
1626
  transition:
@@ -1455,7 +1635,7 @@ body {
1455
1635
  .symframe-card-dismiss:hover {
1456
1636
  opacity: 1;
1457
1637
  color: var(--accent-cyan);
1458
- background: rgba(0, 212, 255, 0.08);
1638
+ background: var(--sf-cyan-08);
1459
1639
  }
1460
1640
 
1461
1641
  /* Stage C: pin glyph — replaces dismiss button on pinned cards. Click
@@ -1466,11 +1646,13 @@ body {
1466
1646
  background: transparent;
1467
1647
  border: none;
1468
1648
  color: var(--accent-cyan);
1469
- font-size: 13px;
1649
+ font-size: var(--sf-text-13);
1650
+
1470
1651
  line-height: 1;
1471
1652
  width: 18px;
1472
1653
  height: 18px;
1473
- border-radius: 4px;
1654
+ border-radius: var(--sf-radius-4);
1655
+
1474
1656
  cursor: pointer;
1475
1657
  opacity: 0.8;
1476
1658
  padding: 0;
@@ -1483,33 +1665,33 @@ body {
1483
1665
  }
1484
1666
  .symframe-card-pin:hover {
1485
1667
  opacity: 1;
1486
- background: rgba(0, 212, 255, 0.08);
1668
+ background: var(--sf-cyan-08);
1487
1669
  }
1488
1670
 
1489
1671
  /* Stage C: dwell pulse — 600ms cyan border + glow then return. */
1490
1672
  .symframe-card.symframe-dwelling {
1491
- animation: symframe-dwell 600ms ease-out;
1673
+ animation: symframe-dwell var(--sf-time-600ms) ease-out;
1492
1674
  }
1493
1675
  @keyframes symframe-dwell {
1494
1676
  0% {
1495
1677
  border-color: var(--accent-cyan);
1496
1678
  box-shadow:
1497
- 0 0 0 0 rgba(0, 212, 255, 0.55),
1498
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1499
- 0 4px 12px rgba(0, 0, 0, 0.25);
1679
+ 0 0 0 0 var(--sf-cyan-55),
1680
+ inset 0 1px 0 var(--sf-white-04),
1681
+ 0 4px 12px var(--sf-black-25);
1500
1682
  }
1501
1683
  60% {
1502
- border-color: rgba(0, 212, 255, 0.6);
1684
+ border-color: var(--sf-cyan-60);
1503
1685
  box-shadow:
1504
1686
  0 0 0 6px rgba(0, 212, 255, 0),
1505
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1506
- 0 4px 12px rgba(0, 0, 0, 0.25);
1687
+ inset 0 1px 0 var(--sf-white-04),
1688
+ 0 4px 12px var(--sf-black-25);
1507
1689
  }
1508
1690
  100% {
1509
- border-color: rgba(0, 212, 255, 0.12);
1691
+ border-color: var(--sf-cyan-12);
1510
1692
  box-shadow:
1511
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1512
- 0 4px 12px rgba(0, 0, 0, 0.25);
1693
+ inset 0 1px 0 var(--sf-white-04),
1694
+ 0 4px 12px var(--sf-black-25);
1513
1695
  }
1514
1696
  }
1515
1697
 
@@ -1518,10 +1700,10 @@ body {
1518
1700
  on transitionend or after a 900ms fail-safe timeout. */
1519
1701
  .symframe-card.symframe-releasing {
1520
1702
  transition:
1521
- opacity 800ms cubic-bezier(0.4, 0, 0.6, 1),
1522
- transform 800ms cubic-bezier(0.4, 0, 0.6, 1),
1523
- max-height 800ms cubic-bezier(0.4, 0, 0.6, 1),
1524
- margin 800ms ease;
1703
+ opacity var(--sf-time-800ms) cubic-bezier(0.4, 0, 0.6, 1),
1704
+ transform var(--sf-time-800ms) cubic-bezier(0.4, 0, 0.6, 1),
1705
+ max-height var(--sf-time-800ms) cubic-bezier(0.4, 0, 0.6, 1),
1706
+ margin var(--sf-time-800ms) ease;
1525
1707
  opacity: 0;
1526
1708
  transform: scale(0.92);
1527
1709
  max-height: 0;
@@ -1538,7 +1720,7 @@ body {
1538
1720
  border-color: var(--accent-cyan);
1539
1721
  }
1540
1722
  .symframe-card.symframe-releasing {
1541
- transition: opacity 200ms ease;
1723
+ transition: opacity var(--sf-time-200ms) ease;
1542
1724
  transform: none;
1543
1725
  max-height: none;
1544
1726
  }
@@ -1553,12 +1735,15 @@ body {
1553
1735
  Click [+ Add] → menu with "Spawn subagent" / "Add scheduled task". */
1554
1736
  .symframe-awaiting {
1555
1737
  position: relative;
1556
- border-top: 1px solid rgba(0, 212, 255, 0.12);
1557
- margin-top: 8px;
1558
- padding: 8px 6px 4px;
1738
+ border-top: 1px solid var(--sf-cyan-12);
1739
+ margin-top: var(--sf-pad-8);
1740
+
1741
+ padding: var(--sf-pad-8) var(--sf-pad-6) var(--sf-pad-4);
1742
+
1559
1743
  display: flex;
1560
1744
  flex-direction: column;
1561
- gap: 4px;
1745
+ gap: var(--sf-pad-4);
1746
+
1562
1747
  /* Stage C.4: cap the AWAITING footer so it can't claim more than ~40%
1563
1748
  of the column height even if the user has many cron jobs. The
1564
1749
  list inside still scrolls (max-height: 200px on .awaiting-list)
@@ -1573,19 +1758,22 @@ body {
1573
1758
  .awaiting-header {
1574
1759
  display: flex;
1575
1760
  align-items: baseline;
1576
- gap: 8px;
1577
- padding: 0 4px 4px;
1761
+ gap: var(--sf-pad-8);
1762
+
1763
+ padding: 0 var(--sf-pad-4) var(--sf-pad-4);
1578
1764
  }
1579
1765
  .awaiting-title {
1580
1766
  font-family: var(--font-mono);
1581
- font-size: 10px;
1767
+ font-size: var(--sf-text-10);
1768
+
1582
1769
  font-weight: 600;
1583
1770
  letter-spacing: 0.14em;
1584
1771
  color: var(--accent-cyan);
1585
1772
  }
1586
1773
  .awaiting-count {
1587
1774
  font-family: var(--font-mono);
1588
- font-size: 9px;
1775
+ font-size: var(--sf-text-9);
1776
+
1589
1777
  letter-spacing: 0.04em;
1590
1778
  color: var(--text-dim);
1591
1779
  opacity: 0.6;
@@ -1594,38 +1782,44 @@ body {
1594
1782
  .awaiting-list {
1595
1783
  display: flex;
1596
1784
  flex-direction: column;
1597
- gap: 2px;
1598
- max-height: 200px;
1785
+ gap: var(--sf-pad-2);
1786
+
1787
+ max-height: var(--sf-bound-list);
1788
+
1599
1789
  overflow-y: auto;
1600
1790
  scrollbar-width: thin;
1601
- scrollbar-color: rgba(0, 212, 255, 0.18) transparent;
1791
+ scrollbar-color: var(--sf-cyan-18) transparent;
1602
1792
  }
1603
1793
  .awaiting-list::-webkit-scrollbar {
1604
1794
  width: 3px;
1605
1795
  }
1606
1796
  .awaiting-list::-webkit-scrollbar-thumb {
1607
- background: rgba(0, 212, 255, 0.18);
1608
- border-radius: 2px;
1797
+ background: var(--sf-cyan-18);
1798
+ border-radius: var(--sf-radius-2);
1609
1799
  }
1610
1800
  .awaiting-item {
1611
1801
  display: grid;
1612
1802
  grid-template-columns: 18px 1fr auto;
1613
1803
  align-items: center;
1614
- gap: 6px;
1615
- padding: 5px 8px;
1616
- border-radius: 6px;
1617
- background: rgba(255, 255, 255, 0.02);
1804
+ gap: var(--sf-pad-6);
1805
+
1806
+ padding: var(--sf-pad-5) var(--sf-pad-8);
1807
+
1808
+ border-radius: var(--sf-radius-6);
1809
+
1810
+ background: var(--sf-white-02);
1618
1811
  border: 1px solid transparent;
1619
1812
  font-family: var(--font-mono);
1620
- font-size: 10px;
1813
+ font-size: var(--sf-text-10);
1814
+
1621
1815
  cursor: pointer;
1622
1816
  transition:
1623
1817
  background 0.15s ease,
1624
1818
  border-color 0.15s ease;
1625
1819
  }
1626
1820
  .awaiting-item:hover {
1627
- background: rgba(0, 212, 255, 0.06);
1628
- border-color: rgba(0, 212, 255, 0.15);
1821
+ background: var(--sf-cyan-06);
1822
+ border-color: var(--sf-cyan-15);
1629
1823
  }
1630
1824
  .awaiting-item-disabled {
1631
1825
  opacity: 0.45;
@@ -1636,7 +1830,8 @@ body {
1636
1830
  display: inline-flex;
1637
1831
  align-items: center;
1638
1832
  justify-content: center;
1639
- font-size: 11px;
1833
+ font-size: var(--sf-text-11);
1834
+
1640
1835
  line-height: 1;
1641
1836
  }
1642
1837
  .awaiting-glyph-subagent {
@@ -1658,7 +1853,8 @@ body {
1658
1853
  .awaiting-meta {
1659
1854
  color: var(--text-dim);
1660
1855
  opacity: 0.75;
1661
- font-size: 9px;
1856
+ font-size: var(--sf-text-9);
1857
+
1662
1858
  letter-spacing: 0.04em;
1663
1859
  text-transform: lowercase;
1664
1860
  white-space: nowrap;
@@ -1667,10 +1863,12 @@ body {
1667
1863
  /* Empty-state placeholder when no subagents and no schedules exist. */
1668
1864
  .awaiting-empty {
1669
1865
  font-family: var(--font-mono);
1670
- font-size: 10px;
1866
+ font-size: var(--sf-text-10);
1867
+
1671
1868
  color: var(--text-dim);
1672
1869
  opacity: 0.55;
1673
- padding: 8px 10px;
1870
+ padding: var(--sf-pad-8) var(--sf-pad-10);
1871
+
1674
1872
  text-align: center;
1675
1873
  font-style: italic;
1676
1874
  }
@@ -1679,16 +1877,21 @@ body {
1679
1877
  .awaiting-add-btn {
1680
1878
  display: inline-flex;
1681
1879
  align-items: center;
1682
- gap: 6px;
1683
- margin-top: 4px;
1880
+ gap: var(--sf-pad-6);
1881
+
1882
+ margin-top: var(--sf-pad-4);
1883
+
1684
1884
  align-self: flex-start;
1685
- padding: 4px 10px;
1885
+ padding: var(--sf-pad-4) var(--sf-pad-10);
1886
+
1686
1887
  background: transparent;
1687
- border: 1px dashed rgba(0, 212, 255, 0.25);
1688
- border-radius: 6px;
1888
+ border: 1px dashed var(--sf-cyan-25);
1889
+ border-radius: var(--sf-radius-6);
1890
+
1689
1891
  color: var(--text-dim);
1690
1892
  font-family: var(--font-mono);
1691
- font-size: 10px;
1893
+ font-size: var(--sf-text-10);
1894
+
1692
1895
  letter-spacing: 0.04em;
1693
1896
  cursor: pointer;
1694
1897
  transition:
@@ -1699,7 +1902,7 @@ body {
1699
1902
  .awaiting-add-btn:hover {
1700
1903
  color: var(--accent-cyan);
1701
1904
  border-color: var(--accent-cyan);
1702
- background: rgba(0, 212, 255, 0.04);
1905
+ background: var(--sf-cyan-04);
1703
1906
  }
1704
1907
  .awaiting-add-btn svg {
1705
1908
  width: 12px;
@@ -1709,36 +1912,44 @@ body {
1709
1912
  position: absolute;
1710
1913
  left: 10px;
1711
1914
  bottom: 100%;
1712
- margin-bottom: 6px;
1713
- background: rgba(10, 16, 26, 0.95);
1915
+ margin-bottom: var(--sf-pad-6);
1916
+
1917
+ background: var(--sf-surface-menu);
1714
1918
  backdrop-filter: blur(12px) saturate(140%);
1715
1919
  -webkit-backdrop-filter: blur(12px) saturate(140%);
1716
- border: 1px solid rgba(0, 212, 255, 0.2);
1717
- border-radius: 8px;
1718
- padding: 4px;
1920
+ border: 1px solid var(--sf-cyan-20);
1921
+ border-radius: var(--sf-radius-8);
1922
+
1923
+ padding: var(--sf-pad-4);
1924
+
1719
1925
  display: flex;
1720
1926
  flex-direction: column;
1721
- gap: 2px;
1927
+ gap: var(--sf-pad-2);
1928
+
1722
1929
  min-width: 180px;
1723
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1930
+ box-shadow: 0 8px 24px var(--sf-black-40);
1724
1931
  z-index: 20;
1725
1932
  }
1726
1933
  .awaiting-add-item {
1727
1934
  display: flex;
1728
1935
  align-items: center;
1729
- gap: 8px;
1730
- padding: 6px 10px;
1936
+ gap: var(--sf-pad-8);
1937
+
1938
+ padding: var(--sf-pad-6) var(--sf-pad-10);
1939
+
1731
1940
  background: transparent;
1732
1941
  border: none;
1733
- border-radius: 5px;
1942
+ border-radius: var(--sf-radius-5);
1943
+
1734
1944
  color: var(--text);
1735
1945
  font-family: var(--font-mono);
1736
- font-size: 11px;
1946
+ font-size: var(--sf-text-11);
1947
+
1737
1948
  cursor: pointer;
1738
1949
  text-align: left;
1739
1950
  }
1740
1951
  .awaiting-add-item:hover {
1741
- background: rgba(0, 212, 255, 0.08);
1952
+ background: var(--sf-cyan-08);
1742
1953
  color: var(--accent-cyan);
1743
1954
  }
1744
1955
  .awaiting-add-glyph {
@@ -1749,49 +1960,58 @@ body {
1749
1960
 
1750
1961
  .symframe-card-body {
1751
1962
  font-family: var(--font-mono);
1752
- font-size: 11px;
1963
+ font-size: var(--sf-text-11);
1964
+
1753
1965
  line-height: 1.5;
1754
1966
  color: var(--text);
1755
- margin-top: 8px;
1967
+ margin-top: var(--sf-pad-8);
1968
+
1756
1969
  white-space: pre-wrap;
1757
1970
  word-break: break-word;
1758
- max-height: 320px;
1971
+ max-height: var(--sf-bound-body);
1972
+
1759
1973
  overflow-y: auto;
1760
1974
  }
1761
1975
  .symframe-card-actions {
1762
1976
  display: flex;
1763
- gap: 6px;
1764
- margin-top: 10px;
1765
- padding-top: 8px;
1766
- border-top: 1px solid rgba(255, 255, 255, 0.05);
1977
+ gap: var(--sf-pad-6);
1978
+
1979
+ margin-top: var(--sf-pad-10);
1980
+
1981
+ padding-top: var(--sf-pad-8);
1982
+
1983
+ border-top: 1px solid var(--sf-white-05);
1767
1984
  flex-wrap: wrap;
1768
1985
  }
1769
1986
  .symframe-card-action {
1770
1987
  flex: 1 1 auto;
1771
1988
  min-width: 60px;
1772
- padding: 6px 10px;
1989
+ padding: var(--sf-pad-6) var(--sf-pad-10);
1990
+
1773
1991
  border: 1px solid var(--glass-border);
1774
- border-radius: 5px;
1775
- background: rgba(255, 255, 255, 0.03);
1992
+ border-radius: var(--sf-radius-5);
1993
+
1994
+ background: var(--sf-white-03);
1776
1995
  color: var(--text-dim);
1777
1996
  font-family: var(--font-mono);
1778
- font-size: 10px;
1997
+ font-size: var(--sf-text-10);
1998
+
1779
1999
  letter-spacing: 0.04em;
1780
2000
  cursor: pointer;
1781
- transition: all 0.15s ease;
2001
+ transition: all var(--sf-time-fast) ease;
1782
2002
  }
1783
2003
  .symframe-card-action:hover {
1784
2004
  border-color: var(--accent-cyan);
1785
2005
  color: var(--text);
1786
2006
  }
1787
2007
  .symframe-card-action-primary {
1788
- background: rgba(0, 212, 255, 0.08);
2008
+ background: var(--sf-cyan-08);
1789
2009
  border-color: var(--accent-cyan);
1790
2010
  color: var(--accent-cyan);
1791
2011
  }
1792
2012
  .symframe-card-action-primary:hover {
1793
- background: rgba(0, 212, 255, 0.14);
1794
- box-shadow: 0 0 8px rgba(0, 212, 255, 0.18);
2013
+ background: var(--sf-cyan-14);
2014
+ box-shadow: 0 0 8px var(--sf-cyan-18);
1795
2015
  }
1796
2016
 
1797
2017
  /* ── Stage D.1 (3.5.27): intent-aware visual treatment ──────────── */
@@ -1815,14 +2035,17 @@ body {
1815
2035
  position: absolute;
1816
2036
  top: 0;
1817
2037
  left: 0;
1818
- padding: 2px 8px 2px 6px;
2038
+ padding: var(--sf-pad-2) var(--sf-pad-8) var(--sf-pad-2) var(--sf-pad-6);
2039
+
1819
2040
  font-family: var(--font-mono);
1820
- font-size: 8px;
2041
+ font-size: var(--sf-text-8);
2042
+
1821
2043
  font-weight: 700;
1822
2044
  letter-spacing: 0.14em;
1823
2045
  text-transform: uppercase;
1824
- background: rgba(0, 0, 0, 0.55);
1825
- border-radius: 10px 0 6px 0;
2046
+ background: var(--sf-black-55);
2047
+ border-radius: var(--sf-radius-10) 0 var(--sf-radius-6) 0;
2048
+
1826
2049
  border-right: 1px solid currentColor;
1827
2050
  border-bottom: 1px solid currentColor;
1828
2051
  pointer-events: none;
@@ -1838,9 +2061,9 @@ body {
1838
2061
  /* holding — cyan; working memory */
1839
2062
  .symframe-card-dynamic[data-intent="holding"] {
1840
2063
  box-shadow:
1841
- inset 3px 0 0 0 rgba(0, 212, 255, 0.65),
1842
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1843
- 0 4px 12px rgba(0, 0, 0, 0.25);
2064
+ inset 3px 0 0 0 var(--sf-cyan-65),
2065
+ inset 0 1px 0 var(--sf-white-04),
2066
+ 0 4px 12px var(--sf-black-25);
1844
2067
  }
1845
2068
  .symframe-card-dynamic[data-intent="holding"]::before {
1846
2069
  color: var(--accent-cyan);
@@ -1850,8 +2073,8 @@ body {
1850
2073
  .symframe-card-dynamic[data-intent="weighing"] {
1851
2074
  box-shadow:
1852
2075
  inset 3px 0 0 0 #f5b73a,
1853
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1854
- 0 4px 12px rgba(0, 0, 0, 0.25);
2076
+ inset 0 1px 0 var(--sf-white-04),
2077
+ 0 4px 12px var(--sf-black-25);
1855
2078
  }
1856
2079
  .symframe-card-dynamic[data-intent="weighing"]::before {
1857
2080
  color: #f5b73a;
@@ -1859,22 +2082,22 @@ body {
1859
2082
 
1860
2083
  /* producing — green; actively drafting, slow pulse on the stripe */
1861
2084
  .symframe-card-dynamic[data-intent="producing"] {
1862
- animation: intent-producing-pulse 2.6s ease-in-out infinite;
2085
+ animation: intent-producing-pulse var(--sf-time-pulse-prod) ease-in-out infinite;
1863
2086
  }
1864
2087
  @keyframes intent-producing-pulse {
1865
2088
  0%,
1866
2089
  100% {
1867
2090
  box-shadow:
1868
- inset 3px 0 0 0 rgba(52, 211, 153, 0.55),
1869
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1870
- 0 4px 12px rgba(0, 0, 0, 0.25);
2091
+ inset 3px 0 0 0 var(--sf-green-55),
2092
+ inset 0 1px 0 var(--sf-white-04),
2093
+ 0 4px 12px var(--sf-black-25);
1871
2094
  }
1872
2095
  50% {
1873
2096
  box-shadow:
1874
- inset 3px 0 0 0 rgba(52, 211, 153, 1),
1875
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1876
- 0 4px 12px rgba(0, 0, 0, 0.25),
1877
- 0 0 14px rgba(52, 211, 153, 0.2);
2097
+ inset 3px 0 0 0 var(--sf-green-100),
2098
+ inset 0 1px 0 var(--sf-white-04),
2099
+ 0 4px 12px var(--sf-black-25),
2100
+ 0 0 14px var(--sf-green-20);
1878
2101
  }
1879
2102
  }
1880
2103
  .symframe-card-dynamic[data-intent="producing"]::before {
@@ -1886,8 +2109,8 @@ body {
1886
2109
  .symframe-card-dynamic[data-intent="drafted"] {
1887
2110
  box-shadow:
1888
2111
  inset 3px 0 0 0 #8b5cf6,
1889
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1890
- 0 4px 12px rgba(0, 0, 0, 0.25);
2112
+ inset 0 1px 0 var(--sf-white-04),
2113
+ 0 4px 12px var(--sf-black-25);
1891
2114
  }
1892
2115
  .symframe-card-dynamic[data-intent="drafted"]::before {
1893
2116
  color: #8b5cf6;
@@ -1895,30 +2118,30 @@ body {
1895
2118
  /* Emphasize action buttons on drafted cards — these cards exist to
1896
2119
  be acted on (Send / Copy / Open). Make the buttons more clickable. */
1897
2120
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action {
1898
- border-color: rgba(139, 92, 246, 0.55);
2121
+ border-color: var(--sf-violet-55);
1899
2122
  color: var(--text);
1900
2123
  font-weight: 600;
1901
2124
  }
1902
2125
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action:hover {
1903
- background: rgba(139, 92, 246, 0.12);
2126
+ background: var(--sf-violet-12);
1904
2127
  border-color: #8b5cf6;
1905
2128
  }
1906
2129
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action-primary {
1907
- background: rgba(139, 92, 246, 0.22);
2130
+ background: var(--sf-violet-22);
1908
2131
  border-color: #8b5cf6;
1909
2132
  color: var(--text);
1910
2133
  }
1911
2134
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action-primary:hover {
1912
- background: rgba(139, 92, 246, 0.32);
1913
- box-shadow: 0 0 10px rgba(139, 92, 246, 0.25);
2135
+ background: var(--sf-violet-32);
2136
+ box-shadow: 0 0 10px var(--sf-violet-25);
1914
2137
  }
1915
2138
 
1916
2139
  /* reference — muted gray; passive read-only context */
1917
2140
  .symframe-card-dynamic[data-intent="reference"] {
1918
2141
  box-shadow:
1919
2142
  inset 3px 0 0 0 rgba(255, 255, 255, 0.22),
1920
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1921
- 0 4px 12px rgba(0, 0, 0, 0.25);
2143
+ inset 0 1px 0 var(--sf-white-04),
2144
+ 0 4px 12px var(--sf-black-25);
1922
2145
  opacity: 0.88;
1923
2146
  filter: saturate(0.75);
1924
2147
  }
@@ -1932,13 +2155,13 @@ body {
1932
2155
  miscategorization. */
1933
2156
  .symframe-card-dynamic[data-intent="awaiting"] {
1934
2157
  box-shadow:
1935
- inset 3px 0 0 0 rgba(244, 114, 182, 0.55),
1936
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1937
- 0 4px 12px rgba(0, 0, 0, 0.25);
2158
+ inset 3px 0 0 0 var(--sf-pink-55),
2159
+ inset 0 1px 0 var(--sf-white-04),
2160
+ 0 4px 12px var(--sf-black-25);
1938
2161
  }
1939
2162
  .symframe-card-dynamic[data-intent="awaiting"]::before {
1940
2163
  content: "awaiting → footer";
1941
- color: rgba(244, 114, 182, 0.85);
2164
+ color: var(--sf-pink-85);
1942
2165
  }
1943
2166
 
1944
2167
  /* Reduced-motion: skip the producing pulse but keep the static
@@ -1947,9 +2170,9 @@ body {
1947
2170
  .symframe-card-dynamic[data-intent="producing"] {
1948
2171
  animation: none;
1949
2172
  box-shadow:
1950
- inset 3px 0 0 0 rgba(52, 211, 153, 0.75),
1951
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1952
- 0 4px 12px rgba(0, 0, 0, 0.25);
2173
+ inset 3px 0 0 0 var(--sf-green-75),
2174
+ inset 0 1px 0 var(--sf-white-04),
2175
+ 0 4px 12px var(--sf-black-25);
1953
2176
  }
1954
2177
  }
1955
2178
 
@@ -1962,54 +2185,64 @@ body {
1962
2185
  .symframe-body-markdown h2,
1963
2186
  .symframe-body-markdown h3,
1964
2187
  .symframe-body-markdown h4 {
1965
- font-size: 12px;
2188
+ font-size: var(--sf-text-12);
2189
+
1966
2190
  font-weight: 600;
1967
- margin: 8px 0 4px;
2191
+ margin: var(--sf-pad-8) 0 var(--sf-pad-4);
2192
+
1968
2193
  color: var(--text);
1969
2194
  }
1970
2195
  .symframe-body-markdown p {
1971
- margin: 4px 0;
2196
+ margin: var(--sf-pad-4) 0;
1972
2197
  }
1973
2198
  .symframe-body-markdown ul,
1974
2199
  .symframe-body-markdown ol {
1975
2200
  padding-left: 18px;
1976
- margin: 4px 0;
2201
+ margin: var(--sf-pad-4) 0;
1977
2202
  }
1978
2203
  .symframe-body-markdown code {
1979
2204
  font-family: var(--font-mono);
1980
- font-size: 10px;
1981
- padding: 1px 4px;
1982
- background: rgba(255, 255, 255, 0.04);
1983
- border-radius: 3px;
2205
+ font-size: var(--sf-text-10);
2206
+
2207
+ padding: 1px var(--sf-pad-4);
2208
+
2209
+ background: var(--sf-white-04);
2210
+ border-radius: var(--sf-radius-3);
1984
2211
  }
1985
2212
  .symframe-body-markdown pre {
1986
- background: rgba(0, 0, 0, 0.25);
1987
- border: 1px solid rgba(255, 255, 255, 0.05);
1988
- border-radius: 5px;
1989
- padding: 8px;
2213
+ background: var(--sf-black-25);
2214
+ border: 1px solid var(--sf-white-05);
2215
+ border-radius: var(--sf-radius-5);
2216
+
2217
+ padding: var(--sf-pad-8);
2218
+
1990
2219
  overflow-x: auto;
1991
- margin: 6px 0;
2220
+ margin: var(--sf-pad-6) 0;
1992
2221
  }
1993
2222
  .symframe-body-markdown pre code {
1994
2223
  background: transparent;
1995
2224
  padding: 0;
1996
- font-size: 10px;
2225
+ font-size: var(--sf-text-10);
1997
2226
  }
1998
2227
 
1999
2228
  /* Code body — pre/code wrapper with hljs theme-friendly chrome. */
2000
2229
  .symframe-body-code {
2001
- background: rgba(0, 0, 0, 0.3);
2002
- border: 1px solid rgba(255, 255, 255, 0.06);
2003
- border-radius: 5px;
2004
- padding: 8px 10px;
2230
+ background: var(--sf-black-30);
2231
+ border: 1px solid var(--sf-white-06);
2232
+ border-radius: var(--sf-radius-5);
2233
+
2234
+ padding: var(--sf-pad-8) var(--sf-pad-10);
2235
+
2005
2236
  margin: 0;
2006
2237
  overflow-x: auto;
2007
- max-height: 320px;
2238
+ max-height: var(--sf-bound-body);
2239
+
2008
2240
  overflow-y: auto;
2009
2241
  }
2010
2242
  .symframe-body-code code {
2011
2243
  font-family: var(--font-mono);
2012
- font-size: 10px;
2244
+ font-size: var(--sf-text-10);
2245
+
2013
2246
  line-height: 1.45;
2014
2247
  color: var(--text);
2015
2248
  background: transparent;
@@ -2019,28 +2252,33 @@ body {
2019
2252
  .symframe-body-email {
2020
2253
  display: flex;
2021
2254
  flex-direction: column;
2022
- gap: 4px;
2255
+ gap: var(--sf-pad-4);
2023
2256
  }
2024
2257
  .symframe-email-row {
2025
2258
  display: flex;
2026
- gap: 6px;
2259
+ gap: var(--sf-pad-6);
2260
+
2027
2261
  font-family: var(--font-mono);
2028
- font-size: 10px;
2262
+ font-size: var(--sf-text-10);
2263
+
2029
2264
  letter-spacing: 0.02em;
2030
- padding: 2px 0;
2031
- border-bottom: 1px dashed rgba(255, 255, 255, 0.05);
2265
+ padding: var(--sf-pad-2) 0;
2266
+
2267
+ border-bottom: 1px dashed var(--sf-white-05);
2032
2268
  }
2033
2269
  .symframe-email-row:last-of-type {
2034
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
2035
- margin-bottom: 4px;
2036
- padding-bottom: 4px;
2270
+ border-bottom: 1px solid var(--sf-white-08);
2271
+ margin-bottom: var(--sf-pad-4);
2272
+
2273
+ padding-bottom: var(--sf-pad-4);
2037
2274
  }
2038
2275
  .symframe-email-label {
2039
2276
  flex: 0 0 auto;
2040
2277
  color: var(--text-dim);
2041
2278
  text-transform: uppercase;
2042
2279
  letter-spacing: 0.06em;
2043
- font-size: 9px;
2280
+ font-size: var(--sf-text-9);
2281
+
2044
2282
  min-width: 48px;
2045
2283
  opacity: 0.7;
2046
2284
  }
@@ -2050,26 +2288,29 @@ body {
2050
2288
  }
2051
2289
  .symframe-email-body {
2052
2290
  font-family: var(--font-mono);
2053
- font-size: 11px;
2291
+ font-size: var(--sf-text-11);
2292
+
2054
2293
  line-height: 1.5;
2055
2294
  color: var(--text);
2056
2295
  white-space: pre-wrap;
2057
2296
  word-break: break-word;
2058
- margin-top: 4px;
2297
+ margin-top: var(--sf-pad-4);
2059
2298
  }
2060
2299
 
2061
2300
  /* PDF embed */
2062
2301
  .symframe-body-pdf {
2063
2302
  display: flex;
2064
2303
  flex-direction: column;
2065
- gap: 6px;
2304
+ gap: var(--sf-pad-6);
2066
2305
  }
2067
2306
  .symframe-pdf-iframe {
2068
2307
  width: 100%;
2069
- height: 280px;
2070
- border: 1px solid rgba(255, 255, 255, 0.08);
2071
- border-radius: 5px;
2072
- background: rgba(0, 0, 0, 0.2);
2308
+ height: var(--sf-bound-media);
2309
+
2310
+ border: 1px solid var(--sf-white-08);
2311
+ border-radius: var(--sf-radius-5);
2312
+
2313
+ background: var(--sf-black-20);
2073
2314
  }
2074
2315
 
2075
2316
  /* Audio + video shared chrome */
@@ -2077,23 +2318,26 @@ body {
2077
2318
  .symframe-body-video {
2078
2319
  display: flex;
2079
2320
  flex-direction: column;
2080
- gap: 6px;
2321
+ gap: var(--sf-pad-6);
2081
2322
  }
2082
2323
  .symframe-audio,
2083
2324
  .symframe-video {
2084
2325
  width: 100%;
2085
- border-radius: 5px;
2086
- background: rgba(0, 0, 0, 0.2);
2326
+ border-radius: var(--sf-radius-5);
2327
+
2328
+ background: var(--sf-black-20);
2087
2329
  }
2088
2330
  .symframe-video {
2089
- max-height: 280px;
2331
+ max-height: var(--sf-bound-media);
2332
+
2090
2333
  object-fit: contain;
2091
2334
  }
2092
2335
 
2093
2336
  /* Empty-media placeholder when url is missing */
2094
2337
  .symframe-body-empty {
2095
2338
  font-family: var(--font-mono);
2096
- font-size: 10px;
2339
+ font-size: var(--sf-text-10);
2340
+
2097
2341
  color: var(--text-dim);
2098
2342
  opacity: 0.6;
2099
2343
  font-style: italic;
@@ -2102,15 +2346,19 @@ body {
2102
2346
  /* Download link — used by pdf/audio/video renderers */
2103
2347
  .symframe-download {
2104
2348
  display: inline-block;
2105
- padding: 4px 8px;
2349
+ padding: var(--sf-pad-4) var(--sf-pad-8);
2350
+
2106
2351
  border: 1px solid var(--glass-border);
2107
- border-radius: 4px;
2352
+ border-radius: var(--sf-radius-4);
2353
+
2108
2354
  font-family: var(--font-mono);
2109
- font-size: 10px;
2355
+ font-size: var(--sf-text-10);
2356
+
2110
2357
  letter-spacing: 0.04em;
2111
2358
  color: var(--text-dim);
2112
2359
  text-decoration: none;
2113
- transition: all 0.15s ease;
2360
+ transition: all var(--sf-time-fast) ease;
2361
+
2114
2362
  align-self: flex-start;
2115
2363
  }
2116
2364
  .symframe-download:hover {
@@ -6692,17 +6940,20 @@ body {
6692
6940
  display: inline-block;
6693
6941
  width: 6px;
6694
6942
  height: 6px;
6695
- border-radius: 50%;
6943
+ border-radius: var(--sf-radius-pill);
6944
+
6696
6945
  background: var(--accent-cyan);
6697
- margin-left: 6px;
6946
+ margin-left: var(--sf-pad-6);
6947
+
6698
6948
  vertical-align: middle;
6699
6949
  opacity: 0;
6700
- transition: opacity 0.3s ease;
6950
+ transition: opacity var(--sf-time-slow) ease;
6951
+
6701
6952
  flex-shrink: 0;
6702
6953
  }
6703
6954
  .reasoning-live-dot.active {
6704
6955
  opacity: 1;
6705
- animation: pulse 1.2s ease-in-out infinite;
6956
+ animation: pulse var(--sf-time-pulse) ease-in-out infinite;
6706
6957
  }
6707
6958
 
6708
6959
  /* The .reasoning-panel / .reasoning-feed / .reasoning-empty* rules were
@@ -6715,18 +6966,20 @@ body {
6715
6966
  .reasoning-run-sep {
6716
6967
  display: flex;
6717
6968
  align-items: center;
6718
- gap: 8px;
6719
- margin: 4px 0 2px;
6969
+ gap: var(--sf-pad-8);
6970
+
6971
+ margin: var(--sf-pad-4) 0 var(--sf-pad-2);
6720
6972
  }
6721
6973
  .reasoning-run-sep::before,
6722
6974
  .reasoning-run-sep::after {
6723
6975
  content: "";
6724
6976
  flex: 1;
6725
6977
  height: 1px;
6726
- background: rgba(255, 255, 255, 0.06);
6978
+ background: var(--sf-white-06);
6727
6979
  }
6728
6980
  .reasoning-run-sep-label {
6729
- font-size: 9px;
6981
+ font-size: var(--sf-text-9);
6982
+
6730
6983
  font-family: var(--font-mono);
6731
6984
  font-weight: 600;
6732
6985
  letter-spacing: 0.1em;
@@ -6738,59 +6991,66 @@ body {
6738
6991
  .reasoning-entry {
6739
6992
  display: flex;
6740
6993
  flex-direction: column;
6741
- gap: 4px;
6742
- padding: 6px 8px;
6743
- background: rgba(255, 255, 255, 0.02);
6744
- border: 1px solid rgba(255, 255, 255, 0.05);
6745
- border-radius: 8px;
6746
- transition: border-color 0.2s;
6994
+ gap: var(--sf-pad-4);
6995
+
6996
+ padding: var(--sf-pad-6) var(--sf-pad-8);
6997
+
6998
+ background: var(--sf-white-02);
6999
+ border: 1px solid var(--sf-white-05);
7000
+ border-radius: var(--sf-radius-8);
7001
+
7002
+ transition: border-color var(--sf-time-quick);
6747
7003
  }
6748
7004
  .reasoning-entry:hover {
6749
- border-color: rgba(255, 255, 255, 0.09);
7005
+ border-color: var(--sf-white-09);
6750
7006
  }
6751
7007
 
6752
7008
  /* Entry header row: badge + label */
6753
7009
  .reasoning-entry-header {
6754
7010
  display: flex;
6755
7011
  align-items: center;
6756
- gap: 6px;
7012
+ gap: var(--sf-pad-6);
6757
7013
  }
6758
7014
  .reasoning-entry-badge {
6759
- font-size: 9px;
7015
+ font-size: var(--sf-text-9);
7016
+
6760
7017
  font-family: var(--font-mono);
6761
7018
  font-weight: 700;
6762
7019
  letter-spacing: 0.1em;
6763
- padding: 1px 5px;
6764
- border-radius: 4px;
7020
+ padding: 1px var(--sf-pad-5);
7021
+
7022
+ border-radius: var(--sf-radius-4);
7023
+
6765
7024
  flex-shrink: 0;
6766
7025
  }
6767
7026
  /* Thinking badge — cyan tint */
6768
7027
  .reasoning-entry-badge.badge-think {
6769
- background: rgba(0, 212, 255, 0.1);
7028
+ background: var(--sf-cyan-10);
6770
7029
  color: var(--accent-cyan);
6771
- border: 1px solid rgba(0, 212, 255, 0.18);
7030
+ border: 1px solid var(--sf-cyan-18);
6772
7031
  }
6773
7032
  /* Tool call badge — purple tint */
6774
7033
  .reasoning-entry-badge.badge-tool {
6775
- background: rgba(139, 92, 246, 0.12);
7034
+ background: var(--sf-violet-12);
6776
7035
  color: var(--accent-purple);
6777
- border: 1px solid rgba(139, 92, 246, 0.2);
7036
+ border: 1px solid var(--sf-violet-20);
6778
7037
  }
6779
7038
  /* Tool result badge — green tint */
6780
7039
  .reasoning-entry-badge.badge-result {
6781
- background: rgba(52, 211, 153, 0.1);
7040
+ background: var(--sf-green-10);
6782
7041
  color: var(--accent-green);
6783
- border: 1px solid rgba(52, 211, 153, 0.18);
7042
+ border: 1px solid var(--sf-green-18);
6784
7043
  }
6785
7044
  /* Narration badge — dim white tint */
6786
7045
  .reasoning-entry-badge.badge-narration {
6787
- background: rgba(255, 255, 255, 0.06);
7046
+ background: var(--sf-white-06);
6788
7047
  color: var(--text-muted);
6789
- border: 1px solid rgba(255, 255, 255, 0.1);
7048
+ border: 1px solid var(--sf-white-10);
6790
7049
  }
6791
7050
 
6792
7051
  .reasoning-entry-name {
6793
- font-size: 11px;
7052
+ font-size: var(--sf-text-11);
7053
+
6794
7054
  font-family: var(--font-mono);
6795
7055
  color: var(--text-muted);
6796
7056
  white-space: nowrap;
@@ -6801,48 +7061,55 @@ body {
6801
7061
 
6802
7062
  /* Thinking body */
6803
7063
  .reasoning-think-body {
6804
- font-size: 10px;
7064
+ font-size: var(--sf-text-10);
7065
+
6805
7066
  font-family: var(--font-mono);
6806
7067
  color: var(--text-muted);
6807
7068
  line-height: 1.55;
6808
7069
  white-space: pre-wrap;
6809
7070
  word-break: break-word;
6810
- max-height: 120px;
7071
+ max-height: var(--sf-bound-detail);
7072
+
6811
7073
  overflow-y: auto;
6812
- padding: 4px 2px 0;
7074
+ padding: var(--sf-pad-4) var(--sf-pad-2) 0;
7075
+
6813
7076
  opacity: 0.75;
6814
7077
  scrollbar-width: thin;
6815
- scrollbar-color: rgba(0, 212, 255, 0.15) transparent;
7078
+ scrollbar-color: var(--sf-cyan-15) transparent;
6816
7079
  }
6817
7080
  .reasoning-think-body::-webkit-scrollbar {
6818
7081
  width: 2px;
6819
7082
  }
6820
7083
  .reasoning-think-body::-webkit-scrollbar-thumb {
6821
- background: rgba(0, 212, 255, 0.15);
6822
- border-radius: 2px;
7084
+ background: var(--sf-cyan-15);
7085
+ border-radius: var(--sf-radius-2);
6823
7086
  }
6824
7087
 
6825
7088
  /* Tool detail — compact JSON preview, collapsible */
6826
7089
  .reasoning-tool-preview {
6827
- font-size: 10px;
7090
+ font-size: var(--sf-text-10);
7091
+
6828
7092
  font-family: var(--font-mono);
6829
7093
  color: var(--text-muted);
6830
7094
  opacity: 0.65;
6831
7095
  white-space: nowrap;
6832
7096
  overflow: hidden;
6833
7097
  text-overflow: ellipsis;
6834
- padding: 2px 0 0;
7098
+ padding: var(--sf-pad-2) 0 0;
6835
7099
  }
6836
7100
  .reasoning-tool-detail {
6837
7101
  display: none;
6838
- font-size: 10px;
7102
+ font-size: var(--sf-text-10);
7103
+
6839
7104
  font-family: var(--font-mono);
6840
7105
  color: var(--text-muted);
6841
7106
  white-space: pre-wrap;
6842
7107
  word-break: break-all;
6843
- padding: 4px 2px 0;
7108
+ padding: var(--sf-pad-4) var(--sf-pad-2) 0;
7109
+
6844
7110
  opacity: 0.65;
6845
- max-height: 100px;
7111
+ max-height: var(--sf-bound-tool);
7112
+
6846
7113
  overflow-y: auto;
6847
7114
  }
6848
7115
  .reasoning-entry.expanded .reasoning-tool-detail {
@@ -6854,10 +7121,10 @@ body {
6854
7121
 
6855
7122
  /* Result row */
6856
7123
  .reasoning-result-meta {
6857
- font-size: 10px;
7124
+ font-size: var(--sf-text-10);
6858
7125
  font-family: var(--font-mono);
6859
7126
  color: var(--text-dim);
6860
- padding: 2px 0 0;
7127
+ padding: var(--sf-pad-2) 0 0;
6861
7128
  }
6862
7129
 
6863
7130
  /* ── Lazy-load sentinel ──────────────────────────────────────────── */