@symerian/symi 3.5.30 → 3.5.32

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.
@@ -865,36 +865,143 @@ body {
865
865
  which lets the substrate / cards container's overflow-y: auto
866
866
  reliably engage instead of pushing the parent.
867
867
  Combined: every mode reliably bounds to the column. */
868
+ /* ── Symframe Design Tokens (Option 3 — 3.5.32) ─────────────────────────
869
+ Semantic token system. Option 1 (3.5.31) extracted every literal as a
870
+ numeric token; Option 3 collapses close tiers, renames to semantic names,
871
+ and tunes the panel as one coherent system.
872
+
873
+ Tiers per primitive:
874
+ cyan: hairline · veil · edge · pulse · flash (5)
875
+ veil: faint · soft · strong (3) white-on-dark
876
+ shadow: soft · mid · deep (3) black drop shadows
877
+ ink: badge (1) near-opaque black
878
+ intent palette per hue: tint · edge · strong (· peak/text/mid)
879
+ pad: xs(2) · sm(4) · md(6) · lg(8) · xl(10) · 2xl(12)
880
+ text: xs(9) · sm(10) · md(11) · lg(13) · xl(16)
881
+ radius: xs(2) · sm(4) · md(6) · lg(8) · xl(10) · pill
882
+ bound: row · tool · detail · list · media · body
883
+ time: fast(.15) · quick(.2) · normal(.4) · medium(.6) · easy(.8)
884
+ · slow(1) · pulse(1.2) · breathe(3.2)
885
+ */
886
+ :root {
887
+ /* ── Cyan accent (primary accent — 5 tiers) ── */
888
+ --sf-cyan-hairline: rgba(0, 212, 255, 0.06);
889
+ --sf-cyan-veil: rgba(0, 212, 255, 0.12);
890
+ --sf-cyan-edge: rgba(0, 212, 255, 0.2);
891
+ --sf-cyan-pulse: rgba(0, 212, 255, 0.35);
892
+ --sf-cyan-flash: rgba(0, 212, 255, 0.6);
893
+
894
+ /* ── Veil (white-on-dark surface depth — 3 tiers) ── */
895
+ --sf-veil-faint: rgba(255, 255, 255, 0.04);
896
+ --sf-veil-soft: rgba(255, 255, 255, 0.06);
897
+ --sf-veil-strong: rgba(255, 255, 255, 0.1);
898
+
899
+ /* ── Shadow + ink (4 tiers) ── */
900
+ --sf-shadow-soft: rgba(0, 0, 0, 0.2);
901
+ --sf-shadow-mid: rgba(0, 0, 0, 0.25);
902
+ --sf-shadow-deep: rgba(0, 0, 0, 0.4);
903
+ --sf-ink-badge: rgba(0, 0, 0, 0.55);
904
+
905
+ /* ── Surface fills (dark blue-tinted glass) ── */
906
+ --sf-surface-card: rgba(10, 16, 26, 0.62);
907
+ --sf-surface-menu: rgba(10, 16, 26, 0.95);
908
+
909
+ /* ── Intent palette (4 hues — Stage D.1 semantic) ── */
910
+ --sf-amber-tint: rgba(245, 183, 58, 0.12); /* weighing bg */
911
+ --sf-amber-edge: rgba(245, 183, 58, 0.32); /* weighing stripe */
912
+
913
+ --sf-pink-tint: rgba(244, 114, 182, 0.1); /* awaiting bg */
914
+ --sf-pink-edge: rgba(244, 114, 182, 0.22); /* awaiting border */
915
+ --sf-pink-strong: rgba(244, 114, 182, 0.6); /* hover edge */
916
+ --sf-pink-text: rgba(244, 114, 182, 0.85); /* awaiting text */
917
+
918
+ --sf-green-tint: rgba(52, 211, 153, 0.1); /* producing bg */
919
+ --sf-green-edge: rgba(52, 211, 153, 0.2); /* producing border */
920
+ --sf-green-strong: rgba(52, 211, 153, 0.75); /* producing pulse */
921
+ --sf-green-peak: rgba(52, 211, 153, 1); /* producing peak */
922
+
923
+ --sf-violet-tint: rgba(139, 92, 246, 0.12); /* drafted bg */
924
+ --sf-violet-edge: rgba(139, 92, 246, 0.22); /* drafted border */
925
+ --sf-violet-mid: rgba(139, 92, 246, 0.32); /* drafted stripe */
926
+ --sf-violet-strong: rgba(139, 92, 246, 0.55); /* drafted highlight */
927
+
928
+ /* ── Spacing (4px grid) ── */
929
+ --sf-pad-xs: 2px;
930
+ --sf-pad-sm: 4px;
931
+ --sf-pad-md: 6px;
932
+ --sf-pad-lg: 8px;
933
+ --sf-pad-xl: 10px;
934
+ --sf-pad-2xl: 12px;
935
+
936
+ /* ── Type scale ── */
937
+ --sf-text-xs: 9px;
938
+ --sf-text-sm: 10px;
939
+ --sf-text-md: 11px;
940
+ --sf-text-lg: 13px;
941
+ --sf-text-xl: 16px;
942
+
943
+ /* ── Corner radii ── */
944
+ --sf-radius-xs: 2px;
945
+ --sf-radius-sm: 4px;
946
+ --sf-radius-md: 6px;
947
+ --sf-radius-lg: 8px;
948
+ --sf-radius-xl: 10px;
949
+ --sf-radius-pill: 50%;
950
+
951
+ /* ── Content bounds (semantic, unchanged) ── */
952
+ --sf-bound-row: 38px;
953
+ --sf-bound-tool: 100px;
954
+ --sf-bound-detail: 120px;
955
+ --sf-bound-list: 200px;
956
+ --sf-bound-media: 280px;
957
+ --sf-bound-body: 320px;
958
+
959
+ /* ── Motion durations ── */
960
+ --sf-time-fast: 0.15s;
961
+ --sf-time-quick: 0.2s;
962
+ --sf-time-normal: 0.4s;
963
+ --sf-time-medium: 0.6s;
964
+ --sf-time-easy: 0.8s;
965
+ --sf-time-slow: 1s;
966
+ --sf-time-pulse: 1.2s;
967
+ --sf-time-breathe: 3.2s;
968
+ }
969
+
868
970
  .symframe {
869
971
  display: grid;
870
972
  grid-template-rows: auto minmax(0, 1fr) auto;
871
- gap: 8px;
973
+ gap: var(--sf-pad-lg);
974
+
872
975
  flex: 1 1 0;
873
976
  min-height: 0;
874
977
  overflow: hidden;
875
978
  }
876
979
  .symframe-header {
877
- padding: 8px 10px 10px;
878
- border-bottom: 1px solid rgba(0, 212, 255, 0.12);
879
- margin-bottom: 4px;
980
+ padding: var(--sf-pad-lg) var(--sf-pad-xl) var(--sf-pad-xl);
981
+
982
+ border-bottom: 1px solid var(--sf-cyan-veil);
983
+ margin-bottom: var(--sf-pad-sm);
984
+
880
985
  min-height: 0;
881
986
  }
882
987
  .symframe-header-row {
883
988
  display: flex;
884
989
  align-items: baseline;
885
990
  justify-content: space-between;
886
- gap: 10px;
991
+ gap: var(--sf-pad-xl);
887
992
  }
888
993
  .symframe-title {
889
994
  font-family: var(--font-mono);
890
- font-size: 12px;
995
+ font-size: var(--sf-text-lg);
996
+
891
997
  font-weight: 600;
892
998
  letter-spacing: 0.14em;
893
999
  color: var(--accent-cyan);
894
1000
  }
895
1001
  .symframe-count {
896
1002
  font-family: var(--font-mono);
897
- font-size: 9px;
1003
+ font-size: var(--sf-text-xs);
1004
+
898
1005
  letter-spacing: 0.06em;
899
1006
  color: var(--text-dim);
900
1007
  opacity: 0.7;
@@ -902,11 +1009,13 @@ body {
902
1009
  }
903
1010
  .symframe-sub {
904
1011
  font-family: var(--font-mono);
905
- font-size: 9px;
1012
+ font-size: var(--sf-text-xs);
1013
+
906
1014
  letter-spacing: 0.04em;
907
1015
  color: var(--text-dim);
908
1016
  opacity: 0.55;
909
- margin-top: 4px;
1017
+ margin-top: var(--sf-pad-sm);
1018
+
910
1019
  line-height: 1.4;
911
1020
  }
912
1021
 
@@ -914,14 +1023,16 @@ body {
914
1023
  .symframe-modes {
915
1024
  display: flex;
916
1025
  align-items: center;
917
- gap: 6px;
918
- margin-top: 6px;
1026
+ gap: var(--sf-pad-md);
1027
+
1028
+ margin-top: var(--sf-pad-md);
919
1029
  }
920
1030
  .mode-chip {
921
1031
  width: 10px;
922
1032
  height: 10px;
923
- border-radius: 50%;
924
- border: 1px solid rgba(0, 212, 255, 0.32);
1033
+ border-radius: var(--sf-radius-pill);
1034
+
1035
+ border: 1px solid var(--sf-cyan-pulse);
925
1036
  background: transparent;
926
1037
  padding: 0;
927
1038
  cursor: pointer;
@@ -933,32 +1044,35 @@ body {
933
1044
  }
934
1045
  .mode-chip:hover {
935
1046
  border-color: var(--accent-cyan);
936
- background: rgba(0, 212, 255, 0.15);
1047
+ background: var(--sf-cyan-edge);
937
1048
  transform: scale(1.15);
938
1049
  }
939
1050
  .mode-chip.active {
940
1051
  background: var(--accent-cyan);
941
1052
  border-color: var(--accent-cyan);
942
- box-shadow: 0 0 6px rgba(0, 212, 255, 0.5);
1053
+ box-shadow: 0 0 6px var(--sf-cyan-flash);
943
1054
  }
944
1055
  .mode-auto {
945
1056
  margin-left: auto;
946
- padding: 2px 8px;
1057
+ padding: var(--sf-pad-xs) var(--sf-pad-lg);
1058
+
947
1059
  font-family: var(--font-mono);
948
- font-size: 8px;
1060
+ font-size: var(--sf-text-xs);
1061
+
949
1062
  font-weight: 700;
950
1063
  letter-spacing: 0.12em;
951
1064
  color: var(--accent-cyan);
952
- background: rgba(0, 212, 255, 0.08);
953
- border: 1px solid rgba(0, 212, 255, 0.32);
954
- border-radius: 8px;
1065
+ background: var(--sf-cyan-veil);
1066
+ border: 1px solid var(--sf-cyan-pulse);
1067
+ border-radius: var(--sf-radius-lg);
1068
+
955
1069
  cursor: pointer;
956
1070
  transition:
957
1071
  background 0.15s ease,
958
1072
  color 0.15s ease;
959
1073
  }
960
1074
  .mode-auto:hover {
961
- background: rgba(0, 212, 255, 0.2);
1075
+ background: var(--sf-cyan-edge);
962
1076
  color: var(--text);
963
1077
  }
964
1078
 
@@ -967,15 +1081,19 @@ body {
967
1081
  AND adds .considering-weighing to #symframe (CSS below) which dims
968
1082
  non-weighing cards for the duration. */
969
1083
  .considering-btn {
970
- margin-left: 4px;
971
- padding: 2px 7px;
972
- font-size: 11px;
1084
+ margin-left: var(--sf-pad-sm);
1085
+
1086
+ padding: var(--sf-pad-xs) 7px;
1087
+
1088
+ font-size: var(--sf-text-md);
1089
+
973
1090
  line-height: 1;
974
1091
  font-family: var(--font-mono);
975
1092
  color: #f5b73a; /* amber — same hue as weighing intent */
976
1093
  background: transparent;
977
- border: 1px solid rgba(245, 183, 58, 0.32);
978
- border-radius: 8px;
1094
+ border: 1px solid var(--sf-amber-edge);
1095
+ border-radius: var(--sf-radius-lg);
1096
+
979
1097
  cursor: pointer;
980
1098
  transition:
981
1099
  background 0.15s ease,
@@ -983,7 +1101,7 @@ body {
983
1101
  transform 0.15s ease;
984
1102
  }
985
1103
  .considering-btn:hover {
986
- background: rgba(245, 183, 58, 0.12);
1104
+ background: var(--sf-amber-tint);
987
1105
  border-color: #f5b73a;
988
1106
  }
989
1107
  .considering-btn:active {
@@ -992,16 +1110,16 @@ body {
992
1110
  /* Brief red flash when clicked while no weighing cards exist —
993
1111
  tells the user "I have nothing to surface here." */
994
1112
  .considering-btn.considering-empty {
995
- animation: considering-empty-pulse 0.8s ease-out;
1113
+ animation: considering-empty-pulse var(--sf-time-easy) ease-out;
996
1114
  }
997
1115
  @keyframes considering-empty-pulse {
998
1116
  0%,
999
1117
  100% {
1000
- border-color: rgba(245, 183, 58, 0.32);
1118
+ border-color: var(--sf-amber-edge);
1001
1119
  }
1002
1120
  50% {
1003
- border-color: rgba(244, 114, 182, 0.6);
1004
- background: rgba(244, 114, 182, 0.1);
1121
+ border-color: var(--sf-pink-strong);
1122
+ background: var(--sf-pink-tint);
1005
1123
  }
1006
1124
  }
1007
1125
  /* While considering-weighing is active, dim non-weighing cards so the
@@ -1015,14 +1133,15 @@ body {
1015
1133
  }
1016
1134
  .symframe.considering-weighing .symframe-substrate {
1017
1135
  opacity: 0.45;
1018
- transition: opacity 0.4s ease;
1136
+ transition: opacity var(--sf-time-normal) ease;
1019
1137
  }
1020
1138
  @media (prefers-reduced-motion: reduce) {
1021
1139
  .considering-btn.considering-empty {
1022
1140
  animation: none;
1023
1141
  }
1024
1142
  .symframe.considering-weighing .symframe-card-dynamic:not([data-intent="weighing"]) {
1025
- transition: opacity 0.2s ease;
1143
+ transition: opacity var(--sf-time-quick) ease;
1144
+
1026
1145
  filter: none;
1027
1146
  }
1028
1147
  }
@@ -1038,8 +1157,10 @@ body {
1038
1157
  border-bottom: 1px dashed currentColor;
1039
1158
  cursor: pointer;
1040
1159
  font-weight: 500;
1041
- padding: 0 2px;
1042
- border-radius: 3px;
1160
+ padding: 0 var(--sf-pad-xs);
1161
+
1162
+ border-radius: var(--sf-radius-xs);
1163
+
1043
1164
  transition:
1044
1165
  background 0.15s ease,
1045
1166
  border-bottom-style 0.15s ease;
@@ -1050,7 +1171,7 @@ body {
1050
1171
  opacity: 0.7;
1051
1172
  }
1052
1173
  .panel-ref:hover {
1053
- background: rgba(0, 212, 255, 0.12);
1174
+ background: var(--sf-cyan-veil);
1054
1175
  border-bottom-style: solid;
1055
1176
  }
1056
1177
  /* Orphan reference — the card is no longer in the panel. Subdued so
@@ -1065,15 +1186,15 @@ body {
1065
1186
  /* Click-miss flash: a brief pink tint signals "I tried to dwell but
1066
1187
  that card isn't currently registered." */
1067
1188
  .panel-ref.panel-ref-miss {
1068
- animation: panel-ref-miss-pulse 1s ease-out;
1189
+ animation: panel-ref-miss-pulse var(--sf-time-slow) ease-out;
1069
1190
  }
1070
1191
  @keyframes panel-ref-miss-pulse {
1071
1192
  0%,
1072
1193
  100% {
1073
- background: rgba(0, 212, 255, 0.12);
1194
+ background: var(--sf-cyan-veil);
1074
1195
  }
1075
1196
  50% {
1076
- background: rgba(244, 114, 182, 0.22);
1197
+ background: var(--sf-pink-edge);
1077
1198
  }
1078
1199
  }
1079
1200
 
@@ -1104,7 +1225,7 @@ body {
1104
1225
  /* When focusedId is set, dim non-matching cards. */
1105
1226
  .symframe[data-mode="focus"][data-focus-id] .symframe-card-dynamic {
1106
1227
  opacity: 0.25;
1107
- transition: opacity 0.4s ease;
1228
+ transition: opacity var(--sf-time-normal) ease;
1108
1229
  }
1109
1230
  .symframe[data-mode="focus"][data-focus-id] .symframe-card-dynamic:hover {
1110
1231
  opacity: 0.6;
@@ -1121,9 +1242,9 @@ body {
1121
1242
  plenty of focus signal on their own. */
1122
1243
  opacity: 1 !important;
1123
1244
  box-shadow:
1124
- 0 0 24px rgba(0, 212, 255, 0.35),
1125
- inset 0 1px 0 rgba(255, 255, 255, 0.06),
1126
- 0 4px 12px rgba(0, 0, 0, 0.25);
1245
+ 0 0 24px var(--sf-cyan-pulse),
1246
+ inset 0 1px 0 var(--sf-veil-soft),
1247
+ 0 4px 12px var(--sf-shadow-mid);
1127
1248
  border-color: var(--accent-cyan) !important;
1128
1249
  transition:
1129
1250
  box-shadow 0.4s ease,
@@ -1159,7 +1280,8 @@ body {
1159
1280
  opacity: 0.35;
1160
1281
  }
1161
1282
  .symframe[data-mode="awaiting"] .symframe-card-dynamic {
1162
- max-height: 38px;
1283
+ max-height: var(--sf-bound-row);
1284
+
1163
1285
  overflow: hidden;
1164
1286
  transition:
1165
1287
  max-height 0.4s ease,
@@ -1174,9 +1296,10 @@ body {
1174
1296
  "dominant" without exceeding the column. The `overflow: hidden`
1175
1297
  from C.4 still clips any overflow from misbehaving children. */
1176
1298
  max-height: 80%;
1177
- background: rgba(0, 212, 255, 0.04);
1178
- border-radius: 10px;
1179
- margin-top: 8px;
1299
+ background: var(--sf-cyan-hairline);
1300
+ border-radius: var(--sf-radius-xl);
1301
+
1302
+ margin-top: var(--sf-pad-lg);
1180
1303
  }
1181
1304
  .symframe[data-mode="awaiting"] .awaiting-list {
1182
1305
  /* The footer is now sized larger than baseline. Let the list flex
@@ -1242,10 +1365,11 @@ body {
1242
1365
  min-height: 0;
1243
1366
  display: flex;
1244
1367
  flex-direction: column;
1245
- gap: 10px;
1368
+ gap: var(--sf-pad-xl);
1369
+
1246
1370
  overflow-y: auto;
1247
1371
  scrollbar-width: thin;
1248
- scrollbar-color: rgba(0, 212, 255, 0.12) transparent;
1372
+ scrollbar-color: var(--sf-cyan-veil) transparent;
1249
1373
  /* Let scroll/click events fall through the empty space between cards
1250
1374
  down to the substrate, so the user can scroll reasoning even when
1251
1375
  foreground cards are foregrounded. Cards themselves re-enable
@@ -1259,8 +1383,8 @@ body {
1259
1383
  width: 3px;
1260
1384
  }
1261
1385
  .symframe-cards::-webkit-scrollbar-thumb {
1262
- background: rgba(0, 212, 255, 0.12);
1263
- border-radius: 2px;
1386
+ background: var(--sf-cyan-veil);
1387
+ border-radius: var(--sf-radius-xs);
1264
1388
  }
1265
1389
 
1266
1390
  /* ── Substrate (ambient reasoning layer, Stage B) ──────────────────── */
@@ -1275,17 +1399,19 @@ body {
1275
1399
  overflow-y: auto;
1276
1400
  display: flex;
1277
1401
  flex-direction: column;
1278
- gap: 6px;
1279
- padding: 2px 4px 4px;
1402
+ gap: var(--sf-pad-md);
1403
+
1404
+ padding: var(--sf-pad-xs) var(--sf-pad-sm) var(--sf-pad-sm);
1405
+
1280
1406
  scrollbar-width: thin;
1281
- scrollbar-color: rgba(0, 212, 255, 0.18) transparent;
1407
+ scrollbar-color: var(--sf-cyan-edge) transparent;
1282
1408
  }
1283
1409
  .symframe-substrate::-webkit-scrollbar {
1284
1410
  width: 3px;
1285
1411
  }
1286
1412
  .symframe-substrate::-webkit-scrollbar-thumb {
1287
- background: rgba(0, 212, 255, 0.18);
1288
- border-radius: 2px;
1413
+ background: var(--sf-cyan-edge);
1414
+ border-radius: var(--sf-radius-xs);
1289
1415
  }
1290
1416
 
1291
1417
  /* Substrate entry — decay-driven visual. Custom properties are written
@@ -1308,17 +1434,20 @@ body {
1308
1434
  opacity: 1;
1309
1435
  filter: none;
1310
1436
  transform: none;
1311
- border-color: rgba(0, 212, 255, 0.32);
1312
- box-shadow: 0 0 12px rgba(0, 212, 255, 0.08);
1437
+ border-color: var(--sf-cyan-pulse);
1438
+ box-shadow: 0 0 12px var(--sf-cyan-veil);
1313
1439
  }
1314
1440
  .substrate-live-dot {
1315
1441
  display: inline-block;
1316
1442
  width: 6px;
1317
1443
  height: 6px;
1318
- border-radius: 50%;
1444
+ border-radius: var(--sf-radius-pill);
1445
+
1319
1446
  background: var(--accent-cyan);
1320
- margin-right: 6px;
1321
- animation: pulse 1.2s ease-in-out infinite;
1447
+ margin-right: var(--sf-pad-md);
1448
+
1449
+ animation: pulse var(--sf-time-pulse) ease-in-out infinite;
1450
+
1322
1451
  flex-shrink: 0;
1323
1452
  }
1324
1453
 
@@ -1329,13 +1458,15 @@ body {
1329
1458
  max-height: 2px;
1330
1459
  padding: 0;
1331
1460
  border-width: 0;
1332
- border-top: 1px solid rgba(0, 212, 255, 0.06);
1461
+ border-top: 1px solid var(--sf-cyan-hairline);
1333
1462
  overflow: hidden;
1334
1463
  }
1335
1464
  .substrate-entry.substrate-texture:hover {
1336
- max-height: 200px;
1337
- padding: 6px 8px;
1338
- border: 1px solid rgba(0, 212, 255, 0.18);
1465
+ max-height: var(--sf-bound-list);
1466
+
1467
+ padding: var(--sf-pad-md) var(--sf-pad-lg);
1468
+
1469
+ border: 1px solid var(--sf-cyan-edge);
1339
1470
  opacity: 0.7;
1340
1471
  filter: none;
1341
1472
  }
@@ -1356,7 +1487,8 @@ body {
1356
1487
  flex-direction: column;
1357
1488
  align-items: center;
1358
1489
  justify-content: center;
1359
- gap: 10px;
1490
+ gap: var(--sf-pad-xl);
1491
+
1360
1492
  padding: 40px 0;
1361
1493
  margin: auto;
1362
1494
  opacity: 0.85;
@@ -1364,17 +1496,15 @@ body {
1364
1496
  .substrate-quiet-dot {
1365
1497
  width: 14px;
1366
1498
  height: 14px;
1367
- border-radius: 50%;
1368
- background: radial-gradient(
1369
- circle at center,
1370
- rgba(0, 212, 255, 0.45) 0%,
1371
- rgba(0, 212, 255, 0) 70%
1372
- );
1373
- animation: quiet-pulse 3.2s ease-in-out infinite;
1499
+ border-radius: var(--sf-radius-pill);
1500
+
1501
+ background: radial-gradient(circle at center, var(--sf-cyan-pulse) 0%, rgba(0, 212, 255, 0) 70%);
1502
+ animation: quiet-pulse var(--sf-time-breathe) ease-in-out infinite;
1374
1503
  }
1375
1504
  .substrate-quiet-label {
1376
1505
  font-family: var(--font-mono);
1377
- font-size: 9px;
1506
+ font-size: var(--sf-text-xs);
1507
+
1378
1508
  letter-spacing: 0.18em;
1379
1509
  text-transform: uppercase;
1380
1510
  color: var(--text-dim);
@@ -1397,7 +1527,8 @@ body {
1397
1527
  informative; the panel stays still. */
1398
1528
  @media (prefers-reduced-motion: reduce) {
1399
1529
  .substrate-entry {
1400
- transition: opacity 0.2s ease;
1530
+ transition: opacity var(--sf-time-quick) ease;
1531
+
1401
1532
  filter: none !important;
1402
1533
  transform: none !important;
1403
1534
  }
@@ -1417,22 +1548,24 @@ body {
1417
1548
  the substrate breathe through. The backdrop-filter blurs whatever
1418
1549
  substrate texture is behind, so even at moderate transparency the
1419
1550
  card body stays crisp. */
1420
- background: rgba(10, 16, 26, 0.62);
1551
+ background: var(--sf-surface-card);
1421
1552
  backdrop-filter: blur(10px) saturate(140%);
1422
1553
  -webkit-backdrop-filter: blur(10px) saturate(140%);
1423
- border: 1px solid rgba(0, 212, 255, 0.12);
1424
- border-radius: 10px;
1425
- padding: 10px 12px;
1554
+ border: 1px solid var(--sf-cyan-veil);
1555
+ border-radius: var(--sf-radius-xl);
1556
+
1557
+ padding: var(--sf-pad-xl) var(--sf-pad-2xl);
1558
+
1426
1559
  box-shadow:
1427
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1428
- 0 4px 12px rgba(0, 0, 0, 0.25);
1560
+ inset 0 1px 0 var(--sf-veil-faint),
1561
+ 0 4px 12px var(--sf-shadow-mid);
1429
1562
  }
1430
1563
  .symframe .symframe-card::before,
1431
1564
  .symframe .symframe-card::after {
1432
1565
  display: none;
1433
1566
  }
1434
1567
  .symframe .symframe-card:hover {
1435
- border-color: rgba(0, 212, 255, 0.18);
1568
+ border-color: var(--sf-cyan-edge);
1436
1569
  }
1437
1570
 
1438
1571
  /* Phase 2: dynamic-card sub-elements (only present on cards added via
@@ -1441,17 +1574,19 @@ body {
1441
1574
  display: flex;
1442
1575
  align-items: center;
1443
1576
  justify-content: space-between;
1444
- gap: 8px;
1577
+ gap: var(--sf-pad-lg);
1445
1578
  }
1446
1579
  .symframe-card-dismiss {
1447
1580
  background: transparent;
1448
1581
  border: none;
1449
1582
  color: var(--text-dim);
1450
- font-size: 16px;
1583
+ font-size: var(--sf-text-xl);
1584
+
1451
1585
  line-height: 1;
1452
1586
  width: 18px;
1453
1587
  height: 18px;
1454
- border-radius: 4px;
1588
+ border-radius: var(--sf-radius-sm);
1589
+
1455
1590
  cursor: pointer;
1456
1591
  opacity: 0.6;
1457
1592
  transition:
@@ -1466,7 +1601,7 @@ body {
1466
1601
  .symframe-card-dismiss:hover {
1467
1602
  opacity: 1;
1468
1603
  color: var(--accent-cyan);
1469
- background: rgba(0, 212, 255, 0.08);
1604
+ background: var(--sf-cyan-veil);
1470
1605
  }
1471
1606
 
1472
1607
  /* Stage C: pin glyph — replaces dismiss button on pinned cards. Click
@@ -1477,11 +1612,13 @@ body {
1477
1612
  background: transparent;
1478
1613
  border: none;
1479
1614
  color: var(--accent-cyan);
1480
- font-size: 13px;
1615
+ font-size: var(--sf-text-lg);
1616
+
1481
1617
  line-height: 1;
1482
1618
  width: 18px;
1483
1619
  height: 18px;
1484
- border-radius: 4px;
1620
+ border-radius: var(--sf-radius-sm);
1621
+
1485
1622
  cursor: pointer;
1486
1623
  opacity: 0.8;
1487
1624
  padding: 0;
@@ -1494,33 +1631,33 @@ body {
1494
1631
  }
1495
1632
  .symframe-card-pin:hover {
1496
1633
  opacity: 1;
1497
- background: rgba(0, 212, 255, 0.08);
1634
+ background: var(--sf-cyan-veil);
1498
1635
  }
1499
1636
 
1500
1637
  /* Stage C: dwell pulse — 600ms cyan border + glow then return. */
1501
1638
  .symframe-card.symframe-dwelling {
1502
- animation: symframe-dwell 600ms ease-out;
1639
+ animation: symframe-dwell var(--sf-time-medium) ease-out;
1503
1640
  }
1504
1641
  @keyframes symframe-dwell {
1505
1642
  0% {
1506
1643
  border-color: var(--accent-cyan);
1507
1644
  box-shadow:
1508
- 0 0 0 0 rgba(0, 212, 255, 0.55),
1509
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1510
- 0 4px 12px rgba(0, 0, 0, 0.25);
1645
+ 0 0 0 0 var(--sf-cyan-flash),
1646
+ inset 0 1px 0 var(--sf-veil-faint),
1647
+ 0 4px 12px var(--sf-shadow-mid);
1511
1648
  }
1512
1649
  60% {
1513
- border-color: rgba(0, 212, 255, 0.6);
1650
+ border-color: var(--sf-cyan-flash);
1514
1651
  box-shadow:
1515
1652
  0 0 0 6px rgba(0, 212, 255, 0),
1516
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1517
- 0 4px 12px rgba(0, 0, 0, 0.25);
1653
+ inset 0 1px 0 var(--sf-veil-faint),
1654
+ 0 4px 12px var(--sf-shadow-mid);
1518
1655
  }
1519
1656
  100% {
1520
- border-color: rgba(0, 212, 255, 0.12);
1657
+ border-color: var(--sf-cyan-veil);
1521
1658
  box-shadow:
1522
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1523
- 0 4px 12px rgba(0, 0, 0, 0.25);
1659
+ inset 0 1px 0 var(--sf-veil-faint),
1660
+ 0 4px 12px var(--sf-shadow-mid);
1524
1661
  }
1525
1662
  }
1526
1663
 
@@ -1529,10 +1666,10 @@ body {
1529
1666
  on transitionend or after a 900ms fail-safe timeout. */
1530
1667
  .symframe-card.symframe-releasing {
1531
1668
  transition:
1532
- opacity 800ms cubic-bezier(0.4, 0, 0.6, 1),
1533
- transform 800ms cubic-bezier(0.4, 0, 0.6, 1),
1534
- max-height 800ms cubic-bezier(0.4, 0, 0.6, 1),
1535
- margin 800ms ease;
1669
+ opacity var(--sf-time-easy) cubic-bezier(0.4, 0, 0.6, 1),
1670
+ transform var(--sf-time-easy) cubic-bezier(0.4, 0, 0.6, 1),
1671
+ max-height var(--sf-time-easy) cubic-bezier(0.4, 0, 0.6, 1),
1672
+ margin var(--sf-time-easy) ease;
1536
1673
  opacity: 0;
1537
1674
  transform: scale(0.92);
1538
1675
  max-height: 0;
@@ -1549,7 +1686,7 @@ body {
1549
1686
  border-color: var(--accent-cyan);
1550
1687
  }
1551
1688
  .symframe-card.symframe-releasing {
1552
- transition: opacity 200ms ease;
1689
+ transition: opacity var(--sf-time-quick) ease;
1553
1690
  transform: none;
1554
1691
  max-height: none;
1555
1692
  }
@@ -1564,12 +1701,15 @@ body {
1564
1701
  Click [+ Add] → menu with "Spawn subagent" / "Add scheduled task". */
1565
1702
  .symframe-awaiting {
1566
1703
  position: relative;
1567
- border-top: 1px solid rgba(0, 212, 255, 0.12);
1568
- margin-top: 8px;
1569
- padding: 8px 6px 4px;
1704
+ border-top: 1px solid var(--sf-cyan-veil);
1705
+ margin-top: var(--sf-pad-lg);
1706
+
1707
+ padding: var(--sf-pad-lg) var(--sf-pad-md) var(--sf-pad-sm);
1708
+
1570
1709
  display: flex;
1571
1710
  flex-direction: column;
1572
- gap: 4px;
1711
+ gap: var(--sf-pad-sm);
1712
+
1573
1713
  /* Stage C.4: cap the AWAITING footer so it can't claim more than ~40%
1574
1714
  of the column height even if the user has many cron jobs. The
1575
1715
  list inside still scrolls (max-height: 200px on .awaiting-list)
@@ -1584,19 +1724,22 @@ body {
1584
1724
  .awaiting-header {
1585
1725
  display: flex;
1586
1726
  align-items: baseline;
1587
- gap: 8px;
1588
- padding: 0 4px 4px;
1727
+ gap: var(--sf-pad-lg);
1728
+
1729
+ padding: 0 var(--sf-pad-sm) var(--sf-pad-sm);
1589
1730
  }
1590
1731
  .awaiting-title {
1591
1732
  font-family: var(--font-mono);
1592
- font-size: 10px;
1733
+ font-size: var(--sf-text-sm);
1734
+
1593
1735
  font-weight: 600;
1594
1736
  letter-spacing: 0.14em;
1595
1737
  color: var(--accent-cyan);
1596
1738
  }
1597
1739
  .awaiting-count {
1598
1740
  font-family: var(--font-mono);
1599
- font-size: 9px;
1741
+ font-size: var(--sf-text-xs);
1742
+
1600
1743
  letter-spacing: 0.04em;
1601
1744
  color: var(--text-dim);
1602
1745
  opacity: 0.6;
@@ -1605,38 +1748,44 @@ body {
1605
1748
  .awaiting-list {
1606
1749
  display: flex;
1607
1750
  flex-direction: column;
1608
- gap: 2px;
1609
- max-height: 200px;
1751
+ gap: var(--sf-pad-xs);
1752
+
1753
+ max-height: var(--sf-bound-list);
1754
+
1610
1755
  overflow-y: auto;
1611
1756
  scrollbar-width: thin;
1612
- scrollbar-color: rgba(0, 212, 255, 0.18) transparent;
1757
+ scrollbar-color: var(--sf-cyan-edge) transparent;
1613
1758
  }
1614
1759
  .awaiting-list::-webkit-scrollbar {
1615
1760
  width: 3px;
1616
1761
  }
1617
1762
  .awaiting-list::-webkit-scrollbar-thumb {
1618
- background: rgba(0, 212, 255, 0.18);
1619
- border-radius: 2px;
1763
+ background: var(--sf-cyan-edge);
1764
+ border-radius: var(--sf-radius-xs);
1620
1765
  }
1621
1766
  .awaiting-item {
1622
1767
  display: grid;
1623
1768
  grid-template-columns: 18px 1fr auto;
1624
1769
  align-items: center;
1625
- gap: 6px;
1626
- padding: 5px 8px;
1627
- border-radius: 6px;
1628
- background: rgba(255, 255, 255, 0.02);
1770
+ gap: var(--sf-pad-md);
1771
+
1772
+ padding: var(--sf-pad-sm) var(--sf-pad-lg);
1773
+
1774
+ border-radius: var(--sf-radius-md);
1775
+
1776
+ background: var(--sf-veil-faint);
1629
1777
  border: 1px solid transparent;
1630
1778
  font-family: var(--font-mono);
1631
- font-size: 10px;
1779
+ font-size: var(--sf-text-sm);
1780
+
1632
1781
  cursor: pointer;
1633
1782
  transition:
1634
1783
  background 0.15s ease,
1635
1784
  border-color 0.15s ease;
1636
1785
  }
1637
1786
  .awaiting-item:hover {
1638
- background: rgba(0, 212, 255, 0.06);
1639
- border-color: rgba(0, 212, 255, 0.15);
1787
+ background: var(--sf-cyan-hairline);
1788
+ border-color: var(--sf-cyan-edge);
1640
1789
  }
1641
1790
  .awaiting-item-disabled {
1642
1791
  opacity: 0.45;
@@ -1647,7 +1796,8 @@ body {
1647
1796
  display: inline-flex;
1648
1797
  align-items: center;
1649
1798
  justify-content: center;
1650
- font-size: 11px;
1799
+ font-size: var(--sf-text-md);
1800
+
1651
1801
  line-height: 1;
1652
1802
  }
1653
1803
  .awaiting-glyph-subagent {
@@ -1669,7 +1819,8 @@ body {
1669
1819
  .awaiting-meta {
1670
1820
  color: var(--text-dim);
1671
1821
  opacity: 0.75;
1672
- font-size: 9px;
1822
+ font-size: var(--sf-text-xs);
1823
+
1673
1824
  letter-spacing: 0.04em;
1674
1825
  text-transform: lowercase;
1675
1826
  white-space: nowrap;
@@ -1678,10 +1829,12 @@ body {
1678
1829
  /* Empty-state placeholder when no subagents and no schedules exist. */
1679
1830
  .awaiting-empty {
1680
1831
  font-family: var(--font-mono);
1681
- font-size: 10px;
1832
+ font-size: var(--sf-text-sm);
1833
+
1682
1834
  color: var(--text-dim);
1683
1835
  opacity: 0.55;
1684
- padding: 8px 10px;
1836
+ padding: var(--sf-pad-lg) var(--sf-pad-xl);
1837
+
1685
1838
  text-align: center;
1686
1839
  font-style: italic;
1687
1840
  }
@@ -1690,16 +1843,21 @@ body {
1690
1843
  .awaiting-add-btn {
1691
1844
  display: inline-flex;
1692
1845
  align-items: center;
1693
- gap: 6px;
1694
- margin-top: 4px;
1846
+ gap: var(--sf-pad-md);
1847
+
1848
+ margin-top: var(--sf-pad-sm);
1849
+
1695
1850
  align-self: flex-start;
1696
- padding: 4px 10px;
1851
+ padding: var(--sf-pad-sm) var(--sf-pad-xl);
1852
+
1697
1853
  background: transparent;
1698
- border: 1px dashed rgba(0, 212, 255, 0.25);
1699
- border-radius: 6px;
1854
+ border: 1px dashed var(--sf-cyan-edge);
1855
+ border-radius: var(--sf-radius-md);
1856
+
1700
1857
  color: var(--text-dim);
1701
1858
  font-family: var(--font-mono);
1702
- font-size: 10px;
1859
+ font-size: var(--sf-text-sm);
1860
+
1703
1861
  letter-spacing: 0.04em;
1704
1862
  cursor: pointer;
1705
1863
  transition:
@@ -1710,7 +1868,7 @@ body {
1710
1868
  .awaiting-add-btn:hover {
1711
1869
  color: var(--accent-cyan);
1712
1870
  border-color: var(--accent-cyan);
1713
- background: rgba(0, 212, 255, 0.04);
1871
+ background: var(--sf-cyan-hairline);
1714
1872
  }
1715
1873
  .awaiting-add-btn svg {
1716
1874
  width: 12px;
@@ -1720,36 +1878,44 @@ body {
1720
1878
  position: absolute;
1721
1879
  left: 10px;
1722
1880
  bottom: 100%;
1723
- margin-bottom: 6px;
1724
- background: rgba(10, 16, 26, 0.95);
1881
+ margin-bottom: var(--sf-pad-md);
1882
+
1883
+ background: var(--sf-surface-menu);
1725
1884
  backdrop-filter: blur(12px) saturate(140%);
1726
1885
  -webkit-backdrop-filter: blur(12px) saturate(140%);
1727
- border: 1px solid rgba(0, 212, 255, 0.2);
1728
- border-radius: 8px;
1729
- padding: 4px;
1886
+ border: 1px solid var(--sf-cyan-edge);
1887
+ border-radius: var(--sf-radius-lg);
1888
+
1889
+ padding: var(--sf-pad-sm);
1890
+
1730
1891
  display: flex;
1731
1892
  flex-direction: column;
1732
- gap: 2px;
1893
+ gap: var(--sf-pad-xs);
1894
+
1733
1895
  min-width: 180px;
1734
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1896
+ box-shadow: 0 8px 24px var(--sf-shadow-deep);
1735
1897
  z-index: 20;
1736
1898
  }
1737
1899
  .awaiting-add-item {
1738
1900
  display: flex;
1739
1901
  align-items: center;
1740
- gap: 8px;
1741
- padding: 6px 10px;
1902
+ gap: var(--sf-pad-lg);
1903
+
1904
+ padding: var(--sf-pad-md) var(--sf-pad-xl);
1905
+
1742
1906
  background: transparent;
1743
1907
  border: none;
1744
- border-radius: 5px;
1908
+ border-radius: var(--sf-radius-sm);
1909
+
1745
1910
  color: var(--text);
1746
1911
  font-family: var(--font-mono);
1747
- font-size: 11px;
1912
+ font-size: var(--sf-text-md);
1913
+
1748
1914
  cursor: pointer;
1749
1915
  text-align: left;
1750
1916
  }
1751
1917
  .awaiting-add-item:hover {
1752
- background: rgba(0, 212, 255, 0.08);
1918
+ background: var(--sf-cyan-veil);
1753
1919
  color: var(--accent-cyan);
1754
1920
  }
1755
1921
  .awaiting-add-glyph {
@@ -1760,49 +1926,58 @@ body {
1760
1926
 
1761
1927
  .symframe-card-body {
1762
1928
  font-family: var(--font-mono);
1763
- font-size: 11px;
1929
+ font-size: var(--sf-text-md);
1930
+
1764
1931
  line-height: 1.5;
1765
1932
  color: var(--text);
1766
- margin-top: 8px;
1933
+ margin-top: var(--sf-pad-lg);
1934
+
1767
1935
  white-space: pre-wrap;
1768
1936
  word-break: break-word;
1769
- max-height: 320px;
1937
+ max-height: var(--sf-bound-body);
1938
+
1770
1939
  overflow-y: auto;
1771
1940
  }
1772
1941
  .symframe-card-actions {
1773
1942
  display: flex;
1774
- gap: 6px;
1775
- margin-top: 10px;
1776
- padding-top: 8px;
1777
- border-top: 1px solid rgba(255, 255, 255, 0.05);
1943
+ gap: var(--sf-pad-md);
1944
+
1945
+ margin-top: var(--sf-pad-xl);
1946
+
1947
+ padding-top: var(--sf-pad-lg);
1948
+
1949
+ border-top: 1px solid var(--sf-veil-soft);
1778
1950
  flex-wrap: wrap;
1779
1951
  }
1780
1952
  .symframe-card-action {
1781
1953
  flex: 1 1 auto;
1782
1954
  min-width: 60px;
1783
- padding: 6px 10px;
1955
+ padding: var(--sf-pad-md) var(--sf-pad-xl);
1956
+
1784
1957
  border: 1px solid var(--glass-border);
1785
- border-radius: 5px;
1786
- background: rgba(255, 255, 255, 0.03);
1958
+ border-radius: var(--sf-radius-sm);
1959
+
1960
+ background: var(--sf-veil-faint);
1787
1961
  color: var(--text-dim);
1788
1962
  font-family: var(--font-mono);
1789
- font-size: 10px;
1963
+ font-size: var(--sf-text-sm);
1964
+
1790
1965
  letter-spacing: 0.04em;
1791
1966
  cursor: pointer;
1792
- transition: all 0.15s ease;
1967
+ transition: all var(--sf-time-fast) ease;
1793
1968
  }
1794
1969
  .symframe-card-action:hover {
1795
1970
  border-color: var(--accent-cyan);
1796
1971
  color: var(--text);
1797
1972
  }
1798
1973
  .symframe-card-action-primary {
1799
- background: rgba(0, 212, 255, 0.08);
1974
+ background: var(--sf-cyan-veil);
1800
1975
  border-color: var(--accent-cyan);
1801
1976
  color: var(--accent-cyan);
1802
1977
  }
1803
1978
  .symframe-card-action-primary:hover {
1804
- background: rgba(0, 212, 255, 0.14);
1805
- box-shadow: 0 0 8px rgba(0, 212, 255, 0.18);
1979
+ background: var(--sf-cyan-veil);
1980
+ box-shadow: 0 0 8px var(--sf-cyan-edge);
1806
1981
  }
1807
1982
 
1808
1983
  /* ── Stage D.1 (3.5.27): intent-aware visual treatment ──────────── */
@@ -1826,14 +2001,17 @@ body {
1826
2001
  position: absolute;
1827
2002
  top: 0;
1828
2003
  left: 0;
1829
- padding: 2px 8px 2px 6px;
2004
+ padding: var(--sf-pad-xs) var(--sf-pad-lg) var(--sf-pad-xs) var(--sf-pad-md);
2005
+
1830
2006
  font-family: var(--font-mono);
1831
- font-size: 8px;
2007
+ font-size: var(--sf-text-xs);
2008
+
1832
2009
  font-weight: 700;
1833
2010
  letter-spacing: 0.14em;
1834
2011
  text-transform: uppercase;
1835
- background: rgba(0, 0, 0, 0.55);
1836
- border-radius: 10px 0 6px 0;
2012
+ background: var(--sf-ink-badge);
2013
+ border-radius: var(--sf-radius-xl) 0 var(--sf-radius-md) 0;
2014
+
1837
2015
  border-right: 1px solid currentColor;
1838
2016
  border-bottom: 1px solid currentColor;
1839
2017
  pointer-events: none;
@@ -1849,9 +2027,9 @@ body {
1849
2027
  /* holding — cyan; working memory */
1850
2028
  .symframe-card-dynamic[data-intent="holding"] {
1851
2029
  box-shadow:
1852
- inset 3px 0 0 0 rgba(0, 212, 255, 0.65),
1853
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1854
- 0 4px 12px rgba(0, 0, 0, 0.25);
2030
+ inset 3px 0 0 0 var(--sf-cyan-flash),
2031
+ inset 0 1px 0 var(--sf-veil-faint),
2032
+ 0 4px 12px var(--sf-shadow-mid);
1855
2033
  }
1856
2034
  .symframe-card-dynamic[data-intent="holding"]::before {
1857
2035
  color: var(--accent-cyan);
@@ -1861,8 +2039,8 @@ body {
1861
2039
  .symframe-card-dynamic[data-intent="weighing"] {
1862
2040
  box-shadow:
1863
2041
  inset 3px 0 0 0 #f5b73a,
1864
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1865
- 0 4px 12px rgba(0, 0, 0, 0.25);
2042
+ inset 0 1px 0 var(--sf-veil-faint),
2043
+ 0 4px 12px var(--sf-shadow-mid);
1866
2044
  }
1867
2045
  .symframe-card-dynamic[data-intent="weighing"]::before {
1868
2046
  color: #f5b73a;
@@ -1870,22 +2048,22 @@ body {
1870
2048
 
1871
2049
  /* producing — green; actively drafting, slow pulse on the stripe */
1872
2050
  .symframe-card-dynamic[data-intent="producing"] {
1873
- animation: intent-producing-pulse 2.6s ease-in-out infinite;
2051
+ animation: intent-producing-pulse var(--sf-time-breathe) ease-in-out infinite;
1874
2052
  }
1875
2053
  @keyframes intent-producing-pulse {
1876
2054
  0%,
1877
2055
  100% {
1878
2056
  box-shadow:
1879
- inset 3px 0 0 0 rgba(52, 211, 153, 0.55),
1880
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1881
- 0 4px 12px rgba(0, 0, 0, 0.25);
2057
+ inset 3px 0 0 0 var(--sf-green-strong),
2058
+ inset 0 1px 0 var(--sf-veil-faint),
2059
+ 0 4px 12px var(--sf-shadow-mid);
1882
2060
  }
1883
2061
  50% {
1884
2062
  box-shadow:
1885
- inset 3px 0 0 0 rgba(52, 211, 153, 1),
1886
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1887
- 0 4px 12px rgba(0, 0, 0, 0.25),
1888
- 0 0 14px rgba(52, 211, 153, 0.2);
2063
+ inset 3px 0 0 0 var(--sf-green-peak),
2064
+ inset 0 1px 0 var(--sf-veil-faint),
2065
+ 0 4px 12px var(--sf-shadow-mid),
2066
+ 0 0 14px var(--sf-green-edge);
1889
2067
  }
1890
2068
  }
1891
2069
  .symframe-card-dynamic[data-intent="producing"]::before {
@@ -1897,8 +2075,8 @@ body {
1897
2075
  .symframe-card-dynamic[data-intent="drafted"] {
1898
2076
  box-shadow:
1899
2077
  inset 3px 0 0 0 #8b5cf6,
1900
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1901
- 0 4px 12px rgba(0, 0, 0, 0.25);
2078
+ inset 0 1px 0 var(--sf-veil-faint),
2079
+ 0 4px 12px var(--sf-shadow-mid);
1902
2080
  }
1903
2081
  .symframe-card-dynamic[data-intent="drafted"]::before {
1904
2082
  color: #8b5cf6;
@@ -1906,30 +2084,30 @@ body {
1906
2084
  /* Emphasize action buttons on drafted cards — these cards exist to
1907
2085
  be acted on (Send / Copy / Open). Make the buttons more clickable. */
1908
2086
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action {
1909
- border-color: rgba(139, 92, 246, 0.55);
2087
+ border-color: var(--sf-violet-strong);
1910
2088
  color: var(--text);
1911
2089
  font-weight: 600;
1912
2090
  }
1913
2091
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action:hover {
1914
- background: rgba(139, 92, 246, 0.12);
2092
+ background: var(--sf-violet-tint);
1915
2093
  border-color: #8b5cf6;
1916
2094
  }
1917
2095
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action-primary {
1918
- background: rgba(139, 92, 246, 0.22);
2096
+ background: var(--sf-violet-edge);
1919
2097
  border-color: #8b5cf6;
1920
2098
  color: var(--text);
1921
2099
  }
1922
2100
  .symframe-card-dynamic[data-intent="drafted"] .symframe-card-action-primary:hover {
1923
- background: rgba(139, 92, 246, 0.32);
1924
- box-shadow: 0 0 10px rgba(139, 92, 246, 0.25);
2101
+ background: var(--sf-violet-mid);
2102
+ box-shadow: 0 0 10px var(--sf-violet-edge);
1925
2103
  }
1926
2104
 
1927
2105
  /* reference — muted gray; passive read-only context */
1928
2106
  .symframe-card-dynamic[data-intent="reference"] {
1929
2107
  box-shadow:
1930
2108
  inset 3px 0 0 0 rgba(255, 255, 255, 0.22),
1931
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1932
- 0 4px 12px rgba(0, 0, 0, 0.25);
2109
+ inset 0 1px 0 var(--sf-veil-faint),
2110
+ 0 4px 12px var(--sf-shadow-mid);
1933
2111
  opacity: 0.88;
1934
2112
  filter: saturate(0.75);
1935
2113
  }
@@ -1943,13 +2121,13 @@ body {
1943
2121
  miscategorization. */
1944
2122
  .symframe-card-dynamic[data-intent="awaiting"] {
1945
2123
  box-shadow:
1946
- inset 3px 0 0 0 rgba(244, 114, 182, 0.55),
1947
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1948
- 0 4px 12px rgba(0, 0, 0, 0.25);
2124
+ inset 3px 0 0 0 var(--sf-pink-strong),
2125
+ inset 0 1px 0 var(--sf-veil-faint),
2126
+ 0 4px 12px var(--sf-shadow-mid);
1949
2127
  }
1950
2128
  .symframe-card-dynamic[data-intent="awaiting"]::before {
1951
2129
  content: "awaiting → footer";
1952
- color: rgba(244, 114, 182, 0.85);
2130
+ color: var(--sf-pink-text);
1953
2131
  }
1954
2132
 
1955
2133
  /* Reduced-motion: skip the producing pulse but keep the static
@@ -1958,9 +2136,9 @@ body {
1958
2136
  .symframe-card-dynamic[data-intent="producing"] {
1959
2137
  animation: none;
1960
2138
  box-shadow:
1961
- inset 3px 0 0 0 rgba(52, 211, 153, 0.75),
1962
- inset 0 1px 0 rgba(255, 255, 255, 0.04),
1963
- 0 4px 12px rgba(0, 0, 0, 0.25);
2139
+ inset 3px 0 0 0 var(--sf-green-strong),
2140
+ inset 0 1px 0 var(--sf-veil-faint),
2141
+ 0 4px 12px var(--sf-shadow-mid);
1964
2142
  }
1965
2143
  }
1966
2144
 
@@ -1973,54 +2151,64 @@ body {
1973
2151
  .symframe-body-markdown h2,
1974
2152
  .symframe-body-markdown h3,
1975
2153
  .symframe-body-markdown h4 {
1976
- font-size: 12px;
2154
+ font-size: var(--sf-text-lg);
2155
+
1977
2156
  font-weight: 600;
1978
- margin: 8px 0 4px;
2157
+ margin: var(--sf-pad-lg) 0 var(--sf-pad-sm);
2158
+
1979
2159
  color: var(--text);
1980
2160
  }
1981
2161
  .symframe-body-markdown p {
1982
- margin: 4px 0;
2162
+ margin: var(--sf-pad-sm) 0;
1983
2163
  }
1984
2164
  .symframe-body-markdown ul,
1985
2165
  .symframe-body-markdown ol {
1986
2166
  padding-left: 18px;
1987
- margin: 4px 0;
2167
+ margin: var(--sf-pad-sm) 0;
1988
2168
  }
1989
2169
  .symframe-body-markdown code {
1990
2170
  font-family: var(--font-mono);
1991
- font-size: 10px;
1992
- padding: 1px 4px;
1993
- background: rgba(255, 255, 255, 0.04);
1994
- border-radius: 3px;
2171
+ font-size: var(--sf-text-sm);
2172
+
2173
+ padding: 1px var(--sf-pad-sm);
2174
+
2175
+ background: var(--sf-veil-faint);
2176
+ border-radius: var(--sf-radius-xs);
1995
2177
  }
1996
2178
  .symframe-body-markdown pre {
1997
- background: rgba(0, 0, 0, 0.25);
1998
- border: 1px solid rgba(255, 255, 255, 0.05);
1999
- border-radius: 5px;
2000
- padding: 8px;
2179
+ background: var(--sf-shadow-mid);
2180
+ border: 1px solid var(--sf-veil-soft);
2181
+ border-radius: var(--sf-radius-sm);
2182
+
2183
+ padding: var(--sf-pad-lg);
2184
+
2001
2185
  overflow-x: auto;
2002
- margin: 6px 0;
2186
+ margin: var(--sf-pad-md) 0;
2003
2187
  }
2004
2188
  .symframe-body-markdown pre code {
2005
2189
  background: transparent;
2006
2190
  padding: 0;
2007
- font-size: 10px;
2191
+ font-size: var(--sf-text-sm);
2008
2192
  }
2009
2193
 
2010
2194
  /* Code body — pre/code wrapper with hljs theme-friendly chrome. */
2011
2195
  .symframe-body-code {
2012
- background: rgba(0, 0, 0, 0.3);
2013
- border: 1px solid rgba(255, 255, 255, 0.06);
2014
- border-radius: 5px;
2015
- padding: 8px 10px;
2196
+ background: var(--sf-shadow-mid);
2197
+ border: 1px solid var(--sf-veil-soft);
2198
+ border-radius: var(--sf-radius-sm);
2199
+
2200
+ padding: var(--sf-pad-lg) var(--sf-pad-xl);
2201
+
2016
2202
  margin: 0;
2017
2203
  overflow-x: auto;
2018
- max-height: 320px;
2204
+ max-height: var(--sf-bound-body);
2205
+
2019
2206
  overflow-y: auto;
2020
2207
  }
2021
2208
  .symframe-body-code code {
2022
2209
  font-family: var(--font-mono);
2023
- font-size: 10px;
2210
+ font-size: var(--sf-text-sm);
2211
+
2024
2212
  line-height: 1.45;
2025
2213
  color: var(--text);
2026
2214
  background: transparent;
@@ -2030,28 +2218,33 @@ body {
2030
2218
  .symframe-body-email {
2031
2219
  display: flex;
2032
2220
  flex-direction: column;
2033
- gap: 4px;
2221
+ gap: var(--sf-pad-sm);
2034
2222
  }
2035
2223
  .symframe-email-row {
2036
2224
  display: flex;
2037
- gap: 6px;
2225
+ gap: var(--sf-pad-md);
2226
+
2038
2227
  font-family: var(--font-mono);
2039
- font-size: 10px;
2228
+ font-size: var(--sf-text-sm);
2229
+
2040
2230
  letter-spacing: 0.02em;
2041
- padding: 2px 0;
2042
- border-bottom: 1px dashed rgba(255, 255, 255, 0.05);
2231
+ padding: var(--sf-pad-xs) 0;
2232
+
2233
+ border-bottom: 1px dashed var(--sf-veil-soft);
2043
2234
  }
2044
2235
  .symframe-email-row:last-of-type {
2045
- border-bottom: 1px solid rgba(255, 255, 255, 0.08);
2046
- margin-bottom: 4px;
2047
- padding-bottom: 4px;
2236
+ border-bottom: 1px solid var(--sf-veil-soft);
2237
+ margin-bottom: var(--sf-pad-sm);
2238
+
2239
+ padding-bottom: var(--sf-pad-sm);
2048
2240
  }
2049
2241
  .symframe-email-label {
2050
2242
  flex: 0 0 auto;
2051
2243
  color: var(--text-dim);
2052
2244
  text-transform: uppercase;
2053
2245
  letter-spacing: 0.06em;
2054
- font-size: 9px;
2246
+ font-size: var(--sf-text-xs);
2247
+
2055
2248
  min-width: 48px;
2056
2249
  opacity: 0.7;
2057
2250
  }
@@ -2061,26 +2254,29 @@ body {
2061
2254
  }
2062
2255
  .symframe-email-body {
2063
2256
  font-family: var(--font-mono);
2064
- font-size: 11px;
2257
+ font-size: var(--sf-text-md);
2258
+
2065
2259
  line-height: 1.5;
2066
2260
  color: var(--text);
2067
2261
  white-space: pre-wrap;
2068
2262
  word-break: break-word;
2069
- margin-top: 4px;
2263
+ margin-top: var(--sf-pad-sm);
2070
2264
  }
2071
2265
 
2072
2266
  /* PDF embed */
2073
2267
  .symframe-body-pdf {
2074
2268
  display: flex;
2075
2269
  flex-direction: column;
2076
- gap: 6px;
2270
+ gap: var(--sf-pad-md);
2077
2271
  }
2078
2272
  .symframe-pdf-iframe {
2079
2273
  width: 100%;
2080
- height: 280px;
2081
- border: 1px solid rgba(255, 255, 255, 0.08);
2082
- border-radius: 5px;
2083
- background: rgba(0, 0, 0, 0.2);
2274
+ height: var(--sf-bound-media);
2275
+
2276
+ border: 1px solid var(--sf-veil-soft);
2277
+ border-radius: var(--sf-radius-sm);
2278
+
2279
+ background: var(--sf-shadow-soft);
2084
2280
  }
2085
2281
 
2086
2282
  /* Audio + video shared chrome */
@@ -2088,23 +2284,26 @@ body {
2088
2284
  .symframe-body-video {
2089
2285
  display: flex;
2090
2286
  flex-direction: column;
2091
- gap: 6px;
2287
+ gap: var(--sf-pad-md);
2092
2288
  }
2093
2289
  .symframe-audio,
2094
2290
  .symframe-video {
2095
2291
  width: 100%;
2096
- border-radius: 5px;
2097
- background: rgba(0, 0, 0, 0.2);
2292
+ border-radius: var(--sf-radius-sm);
2293
+
2294
+ background: var(--sf-shadow-soft);
2098
2295
  }
2099
2296
  .symframe-video {
2100
- max-height: 280px;
2297
+ max-height: var(--sf-bound-media);
2298
+
2101
2299
  object-fit: contain;
2102
2300
  }
2103
2301
 
2104
2302
  /* Empty-media placeholder when url is missing */
2105
2303
  .symframe-body-empty {
2106
2304
  font-family: var(--font-mono);
2107
- font-size: 10px;
2305
+ font-size: var(--sf-text-sm);
2306
+
2108
2307
  color: var(--text-dim);
2109
2308
  opacity: 0.6;
2110
2309
  font-style: italic;
@@ -2113,15 +2312,19 @@ body {
2113
2312
  /* Download link — used by pdf/audio/video renderers */
2114
2313
  .symframe-download {
2115
2314
  display: inline-block;
2116
- padding: 4px 8px;
2315
+ padding: var(--sf-pad-sm) var(--sf-pad-lg);
2316
+
2117
2317
  border: 1px solid var(--glass-border);
2118
- border-radius: 4px;
2318
+ border-radius: var(--sf-radius-sm);
2319
+
2119
2320
  font-family: var(--font-mono);
2120
- font-size: 10px;
2321
+ font-size: var(--sf-text-sm);
2322
+
2121
2323
  letter-spacing: 0.04em;
2122
2324
  color: var(--text-dim);
2123
2325
  text-decoration: none;
2124
- transition: all 0.15s ease;
2326
+ transition: all var(--sf-time-fast) ease;
2327
+
2125
2328
  align-self: flex-start;
2126
2329
  }
2127
2330
  .symframe-download:hover {
@@ -6703,17 +6906,20 @@ body {
6703
6906
  display: inline-block;
6704
6907
  width: 6px;
6705
6908
  height: 6px;
6706
- border-radius: 50%;
6909
+ border-radius: var(--sf-radius-pill);
6910
+
6707
6911
  background: var(--accent-cyan);
6708
- margin-left: 6px;
6912
+ margin-left: var(--sf-pad-md);
6913
+
6709
6914
  vertical-align: middle;
6710
6915
  opacity: 0;
6711
- transition: opacity 0.3s ease;
6916
+ transition: opacity var(--sf-time-normal) ease;
6917
+
6712
6918
  flex-shrink: 0;
6713
6919
  }
6714
6920
  .reasoning-live-dot.active {
6715
6921
  opacity: 1;
6716
- animation: pulse 1.2s ease-in-out infinite;
6922
+ animation: pulse var(--sf-time-pulse) ease-in-out infinite;
6717
6923
  }
6718
6924
 
6719
6925
  /* The .reasoning-panel / .reasoning-feed / .reasoning-empty* rules were
@@ -6726,18 +6932,20 @@ body {
6726
6932
  .reasoning-run-sep {
6727
6933
  display: flex;
6728
6934
  align-items: center;
6729
- gap: 8px;
6730
- margin: 4px 0 2px;
6935
+ gap: var(--sf-pad-lg);
6936
+
6937
+ margin: var(--sf-pad-sm) 0 var(--sf-pad-xs);
6731
6938
  }
6732
6939
  .reasoning-run-sep::before,
6733
6940
  .reasoning-run-sep::after {
6734
6941
  content: "";
6735
6942
  flex: 1;
6736
6943
  height: 1px;
6737
- background: rgba(255, 255, 255, 0.06);
6944
+ background: var(--sf-veil-soft);
6738
6945
  }
6739
6946
  .reasoning-run-sep-label {
6740
- font-size: 9px;
6947
+ font-size: var(--sf-text-xs);
6948
+
6741
6949
  font-family: var(--font-mono);
6742
6950
  font-weight: 600;
6743
6951
  letter-spacing: 0.1em;
@@ -6749,59 +6957,66 @@ body {
6749
6957
  .reasoning-entry {
6750
6958
  display: flex;
6751
6959
  flex-direction: column;
6752
- gap: 4px;
6753
- padding: 6px 8px;
6754
- background: rgba(255, 255, 255, 0.02);
6755
- border: 1px solid rgba(255, 255, 255, 0.05);
6756
- border-radius: 8px;
6757
- transition: border-color 0.2s;
6960
+ gap: var(--sf-pad-sm);
6961
+
6962
+ padding: var(--sf-pad-md) var(--sf-pad-lg);
6963
+
6964
+ background: var(--sf-veil-faint);
6965
+ border: 1px solid var(--sf-veil-soft);
6966
+ border-radius: var(--sf-radius-lg);
6967
+
6968
+ transition: border-color var(--sf-time-quick);
6758
6969
  }
6759
6970
  .reasoning-entry:hover {
6760
- border-color: rgba(255, 255, 255, 0.09);
6971
+ border-color: var(--sf-veil-soft);
6761
6972
  }
6762
6973
 
6763
6974
  /* Entry header row: badge + label */
6764
6975
  .reasoning-entry-header {
6765
6976
  display: flex;
6766
6977
  align-items: center;
6767
- gap: 6px;
6978
+ gap: var(--sf-pad-md);
6768
6979
  }
6769
6980
  .reasoning-entry-badge {
6770
- font-size: 9px;
6981
+ font-size: var(--sf-text-xs);
6982
+
6771
6983
  font-family: var(--font-mono);
6772
6984
  font-weight: 700;
6773
6985
  letter-spacing: 0.1em;
6774
- padding: 1px 5px;
6775
- border-radius: 4px;
6986
+ padding: 1px var(--sf-pad-sm);
6987
+
6988
+ border-radius: var(--sf-radius-sm);
6989
+
6776
6990
  flex-shrink: 0;
6777
6991
  }
6778
6992
  /* Thinking badge — cyan tint */
6779
6993
  .reasoning-entry-badge.badge-think {
6780
- background: rgba(0, 212, 255, 0.1);
6994
+ background: var(--sf-cyan-veil);
6781
6995
  color: var(--accent-cyan);
6782
- border: 1px solid rgba(0, 212, 255, 0.18);
6996
+ border: 1px solid var(--sf-cyan-edge);
6783
6997
  }
6784
6998
  /* Tool call badge — purple tint */
6785
6999
  .reasoning-entry-badge.badge-tool {
6786
- background: rgba(139, 92, 246, 0.12);
7000
+ background: var(--sf-violet-tint);
6787
7001
  color: var(--accent-purple);
6788
- border: 1px solid rgba(139, 92, 246, 0.2);
7002
+ border: 1px solid var(--sf-violet-edge);
6789
7003
  }
6790
7004
  /* Tool result badge — green tint */
6791
7005
  .reasoning-entry-badge.badge-result {
6792
- background: rgba(52, 211, 153, 0.1);
7006
+ background: var(--sf-green-tint);
6793
7007
  color: var(--accent-green);
6794
- border: 1px solid rgba(52, 211, 153, 0.18);
7008
+ border: 1px solid var(--sf-green-edge);
6795
7009
  }
6796
7010
  /* Narration badge — dim white tint */
6797
7011
  .reasoning-entry-badge.badge-narration {
6798
- background: rgba(255, 255, 255, 0.06);
7012
+ background: var(--sf-veil-soft);
6799
7013
  color: var(--text-muted);
6800
- border: 1px solid rgba(255, 255, 255, 0.1);
7014
+ border: 1px solid var(--sf-veil-strong);
6801
7015
  }
6802
7016
 
6803
7017
  .reasoning-entry-name {
6804
- font-size: 11px;
7018
+ font-size: var(--sf-text-md);
7019
+
6805
7020
  font-family: var(--font-mono);
6806
7021
  color: var(--text-muted);
6807
7022
  white-space: nowrap;
@@ -6812,48 +7027,55 @@ body {
6812
7027
 
6813
7028
  /* Thinking body */
6814
7029
  .reasoning-think-body {
6815
- font-size: 10px;
7030
+ font-size: var(--sf-text-sm);
7031
+
6816
7032
  font-family: var(--font-mono);
6817
7033
  color: var(--text-muted);
6818
7034
  line-height: 1.55;
6819
7035
  white-space: pre-wrap;
6820
7036
  word-break: break-word;
6821
- max-height: 120px;
7037
+ max-height: var(--sf-bound-detail);
7038
+
6822
7039
  overflow-y: auto;
6823
- padding: 4px 2px 0;
7040
+ padding: var(--sf-pad-sm) var(--sf-pad-xs) 0;
7041
+
6824
7042
  opacity: 0.75;
6825
7043
  scrollbar-width: thin;
6826
- scrollbar-color: rgba(0, 212, 255, 0.15) transparent;
7044
+ scrollbar-color: var(--sf-cyan-edge) transparent;
6827
7045
  }
6828
7046
  .reasoning-think-body::-webkit-scrollbar {
6829
7047
  width: 2px;
6830
7048
  }
6831
7049
  .reasoning-think-body::-webkit-scrollbar-thumb {
6832
- background: rgba(0, 212, 255, 0.15);
6833
- border-radius: 2px;
7050
+ background: var(--sf-cyan-edge);
7051
+ border-radius: var(--sf-radius-xs);
6834
7052
  }
6835
7053
 
6836
7054
  /* Tool detail — compact JSON preview, collapsible */
6837
7055
  .reasoning-tool-preview {
6838
- font-size: 10px;
7056
+ font-size: var(--sf-text-sm);
7057
+
6839
7058
  font-family: var(--font-mono);
6840
7059
  color: var(--text-muted);
6841
7060
  opacity: 0.65;
6842
7061
  white-space: nowrap;
6843
7062
  overflow: hidden;
6844
7063
  text-overflow: ellipsis;
6845
- padding: 2px 0 0;
7064
+ padding: var(--sf-pad-xs) 0 0;
6846
7065
  }
6847
7066
  .reasoning-tool-detail {
6848
7067
  display: none;
6849
- font-size: 10px;
7068
+ font-size: var(--sf-text-sm);
7069
+
6850
7070
  font-family: var(--font-mono);
6851
7071
  color: var(--text-muted);
6852
7072
  white-space: pre-wrap;
6853
7073
  word-break: break-all;
6854
- padding: 4px 2px 0;
7074
+ padding: var(--sf-pad-sm) var(--sf-pad-xs) 0;
7075
+
6855
7076
  opacity: 0.65;
6856
- max-height: 100px;
7077
+ max-height: var(--sf-bound-tool);
7078
+
6857
7079
  overflow-y: auto;
6858
7080
  }
6859
7081
  .reasoning-entry.expanded .reasoning-tool-detail {
@@ -6865,10 +7087,10 @@ body {
6865
7087
 
6866
7088
  /* Result row */
6867
7089
  .reasoning-result-meta {
6868
- font-size: 10px;
7090
+ font-size: var(--sf-text-sm);
6869
7091
  font-family: var(--font-mono);
6870
7092
  color: var(--text-dim);
6871
- padding: 2px 0 0;
7093
+ padding: var(--sf-pad-xs) 0 0;
6872
7094
  }
6873
7095
 
6874
7096
  /* ── Lazy-load sentinel ──────────────────────────────────────────── */