@falling-ts/dsh-force-compact 0.2.1 → 0.2.3

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.
package/README.cn.md CHANGED
@@ -214,6 +214,18 @@ falling-ts-force-compact:
214
214
 
215
215
  ---
216
216
 
217
+ ## 截图
218
+
219
+ ![设置面板 —「强制压缩」分区,五个旋钮全部支持在线编辑](assets/settings-panel.png)
220
+
221
+ *设置面板 — `设置 > 强制压缩`。上面九个字段都可以实时编辑,无需重启。*
222
+
223
+ ![会话页 — 红色 `[强制压缩中>>>]` 徽章挂在正在进行的回合旁边](assets/live-conversation.png)
224
+
225
+ *会话页 — live-UI 信令有三种状态(🟥 压缩中 / 🟢 已完成 / 🔵 工作中),绿色横幅约 3 s 后淡出回到随机「工作中」文案。*
226
+
227
+ ---
228
+
217
229
  ## License
218
230
 
219
231
  MIT(见 LICENSE)。
package/README.md CHANGED
@@ -196,6 +196,19 @@ falling-ts-force-compact:
196
196
  When the `settings` service is absent, the plugin falls back to the same defaults and still
197
197
  compacts — the namespace is optional, never a hard dependency.
198
198
 
199
+ ---
200
+
201
+ ## Screenshots
202
+
203
+ ![Settings panel — "Force Compaction / 强制压缩" section with all five knobs live-editable](assets/settings-panel.png)
204
+
205
+ *Settings panel — `设置 > 强制压缩`. All nine fields above can be edited live without restart.*
206
+
207
+ ![Live conversation — red "[forced compacting>>>]" badge pinned beside an in-flight turn](assets/live-conversation.png)
208
+
209
+ *Conversation page — the live-UI signal paints three states (🟥 compressing / 🟢 done / 🔵 working);
210
+ the green banner fades after ~3 s back to a random "working" line.*
211
+
199
212
  ### Tuning for low-context llama.cpp
200
213
 
201
214
  Serve `Qwen3.8‑27B` with a comfortable-but-modest context and let the plugin decide the
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@falling-ts/dsh-force-compact",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "DSH Cordis plugin: hooks the core model-request seam (agent/pre-step + agent/request) to force-compact a session's context and disable thinking per the \"强制压缩配置\" settings namespace (disableThinking, autoThresholdTokens, retainLatestTokens, turnEndForceCompactionEnabled). When the threshold fires (or /force-compact queues while busy), the latest `retainLatestTokens` of the conversation's surface tokens are KEPT VERBATIM and everything before that cutoff is COMPACTED INTO A SINGLE SUMMARY NODE in one LLM call (original span entries become shadowed/skipped). Also compacts at each turn/end and at each session/flush durability checkpoint. Host half is a pure listener; a web client half registers a settings.section (强制压缩 / Force Compact) that reads and writes the same settings namespace.",
5
5
  "type": "module",
6
6
  "main": "./index.js",
@@ -13,6 +13,7 @@
13
13
  "index.js",
14
14
  "src/",
15
15
  "web/",
16
+ "assets/",
16
17
  "cordis.patch.yml"
17
18
  ],
18
19
  "license": "MIT",
package/web/client.js CHANGED
@@ -642,12 +642,15 @@ window.__ModuleLoader__.load({
642
642
  // 每条对应 web/swish.css 里的 .falling-ts-swish-NN(@keyframes falling-ts-swish-NN),
643
643
  // 色值单一事实源在 src/core/ui-signal.js 的 WORKING_COLORS(20 项)与
644
644
  // PINNED_COLORS(2 项),此处仅做"hex → 编号"映射,不做任何样式计算。
645
+ // 2026 深色化第二轮:与 src/core/ui-signal.js 的 WORKING_COLORS(20 项)
646
+ // + PINNED_COLORS(2 项:compressing 暗红 / done 暗绿)逐字对应,
647
+ // 索引 0..19 = 工作态,20 = compressing,21 = done。
645
648
  const SWISH_HEXES = [
646
- "#4f9cf9","#5b8def","#6a5bff","#8b5cf6","#a855f7",
647
- "#c45bf9","#db6bd4","#e86bb0","#f06b8b","#f76b5b",
648
- "#fb8c5b","#fca95b","#fdc35b","#d8e05b","#aede5b",
649
- "#7ee083","#5be0a0","#5becd8","#5bcdf9","#7ba8f9",
650
- "#ff4d4f","#52c41a",
649
+ "#1e40af","#1e3a8a","#312e81","#4c1d95","#581c87",
650
+ "#8318a3","#86198f","#9d174d","#9f1239","#991b1b",
651
+ "#9a3412","#92400e","#854d0e","#4d7c0f","#3f6212",
652
+ "#166534","#065f46","#0e7490","#155e75","#172554",
653
+ "#9b1c2b","#2f6f52",
651
654
  ];
652
655
  const SWISH_CLASS_PREFIX = "falling-ts-swish-";
653
656
  function swishClassForColor(hex) {
@@ -713,7 +716,7 @@ window.__ModuleLoader__.load({
713
716
  * 该属性仅在有相位色时存在(paintTurnStatus 同步贴/撤),属性消失时选择器失配、
714
717
  * 官方 caption 灰自然恢复。详见 web/swish.css 头注释与「文本颜色强调」节。
715
718
  */
716
- const SWISH_CSS = "@keyframes falling-ts-swish-00{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-00{animation-name:falling-ts-swish-00!important;background-image:linear-gradient(90deg,#4f9cf9 0%,#4f9cf9 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#4f9cf9 60%,#4f9cf9 100%)!important}@keyframes falling-ts-swish-01{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-01{animation-name:falling-ts-swish-01!important;background-image:linear-gradient(90deg,#5b8def 0%,#5b8def 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#5b8def 60%,#5b8def 100%)!important}@keyframes falling-ts-swish-02{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-02{animation-name:falling-ts-swish-02!important;background-image:linear-gradient(90deg,#6a5bff 0%,#6a5bff 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#6a5bff 60%,#6a5bff 100%)!important}@keyframes falling-ts-swish-03{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-03{animation-name:falling-ts-swish-03!important;background-image:linear-gradient(90deg,#8b5cf6 0%,#8b5cf6 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#8b5cf6 60%,#8b5cf6 100%)!important}@keyframes falling-ts-swish-04{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-04{animation-name:falling-ts-swish-04!important;background-image:linear-gradient(90deg,#a855f7 0%,#a855f7 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#a855f7 60%,#a855f7 100%)!important}@keyframes falling-ts-swish-05{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-05{animation-name:falling-ts-swish-05!important;background-image:linear-gradient(90deg,#c45bf9 0%,#c45bf9 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#c45bf9 60%,#c45bf9 100%)!important}@keyframes falling-ts-swish-06{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-06{animation-name:falling-ts-swish-06!important;background-image:linear-gradient(90deg,#db6bd4 0%,#db6bd4 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#db6bd4 60%,#db6bd4 100%)!important}@keyframes falling-ts-swish-07{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-07{animation-name:falling-ts-swish-07!important;background-image:linear-gradient(90deg,#e86bb0 0%,#e86bb0 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#e86bb0 60%,#e86bb0 100%)!important}@keyframes falling-ts-swish-08{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-08{animation-name:falling-ts-swish-08!important;background-image:linear-gradient(90deg,#f06b8b 0%,#f06b8b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#f06b8b 60%,#f06b8b 100%)!important}@keyframes falling-ts-swish-09{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-09{animation-name:falling-ts-swish-09!important;background-image:linear-gradient(90deg,#f76b5b 0%,#f76b5b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#f76b5b 60%,#f76b5b 100%)!important}@keyframes falling-ts-swish-10{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-10{animation-name:falling-ts-swish-10!important;background-image:linear-gradient(90deg,#fb8c5b 0%,#fb8c5b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#fb8c5b 60%,#fb8c5b 100%)!important}@keyframes falling-ts-swish-11{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-11{animation-name:falling-ts-swish-11!important;background-image:linear-gradient(90deg,#fca95b 0%,#fca95b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#fca95b 60%,#fca95b 100%)!important}@keyframes falling-ts-swish-12{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-12{animation-name:falling-ts-swish-12!important;background-image:linear-gradient(90deg,#fdc35b 0%,#fdc35b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#fdc35b 60%,#fdc35b 100%)!important}@keyframes falling-ts-swish-13{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-13{animation-name:falling-ts-swish-13!important;background-image:linear-gradient(90deg,#d8e05b 0%,#d8e05b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#d8e05b 60%,#d8e05b 100%)!important}@keyframes falling-ts-swish-14{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-14{animation-name:falling-ts-swish-14!important;background-image:linear-gradient(90deg,#aede5b 0%,#aede5b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#aede5b 60%,#aede5b 100%)!important}@keyframes falling-ts-swish-15{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-15{animation-name:falling-ts-swish-15!important;background-image:linear-gradient(90deg,#7ee083 0%,#7ee083 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#7ee083 60%,#7ee083 100%)!important}@keyframes falling-ts-swish-16{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-16{animation-name:falling-ts-swish-16!important;background-image:linear-gradient(90deg,#5be0a0 0%,#5be0a0 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#5be0a0 60%,#5be0a0 100%)!important}@keyframes falling-ts-swish-17{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-17{animation-name:falling-ts-swish-17!important;background-image:linear-gradient(90deg,#5becd8 0%,#5becd8 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#5becd8 60%,#5becd8 100%)!important}@keyframes falling-ts-swish-18{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-18{animation-name:falling-ts-swish-18!important;background-image:linear-gradient(90deg,#5bcdf9 0%,#5bcdf9 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#5bcdf9 60%,#5bcdf9 100%)!important}@keyframes falling-ts-swish-19{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-19{animation-name:falling-ts-swish-19!important;background-image:linear-gradient(90deg,#7ba8f9 0%,#7ba8f9 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#7ba8f9 60%,#7ba8f9 100%)!important}@keyframes falling-ts-swish-20{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-20{animation-name:falling-ts-swish-20!important;background-image:linear-gradient(90deg,#ff4d4f 0%,#ff4d4f 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#ff4d4f 60%,#ff4d4f 100%)!important}@keyframes falling-ts-swish-21{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-21{animation-name:falling-ts-swish-21!important;background-image:linear-gradient(90deg,#52c41a 0%,#52c41a 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#52c41a 60%,#52c41a 100%)!important}.turnStatus[data-fc-bg] .turnStatusClock,[data-fc-bg] span:last-of-type{color:attr(data-fc-bg)!important;-webkit-text-fill-color:attr(data-fc-bg)!important}";
719
+ const SWISH_CSS = "@keyframes falling-ts-swish-00{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-00{animation-name:falling-ts-swish-00!important;background-image:linear-gradient(90deg,#1e40af 0%,#1e40af 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#1e40af 60%,#1e40af 100%)!important}@keyframes falling-ts-swish-01{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-01{animation-name:falling-ts-swish-01!important;background-image:linear-gradient(90deg,#1e3a8a 0%,#1e3a8a 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#1e3a8a 60%,#1e3a8a 100%)!important}@keyframes falling-ts-swish-02{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-02{animation-name:falling-ts-swish-02!important;background-image:linear-gradient(90deg,#312e81 0%,#312e81 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#312e81 60%,#312e81 100%)!important}@keyframes falling-ts-swish-03{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-03{animation-name:falling-ts-swish-03!important;background-image:linear-gradient(90deg,#4c1d95 0%,#4c1d95 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#4c1d95 60%,#4c1d95 100%)!important}@keyframes falling-ts-swish-04{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-04{animation-name:falling-ts-swish-04!important;background-image:linear-gradient(90deg,#581c87 0%,#581c87 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#581c87 60%,#581c87 100%)!important}@keyframes falling-ts-swish-05{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-05{animation-name:falling-ts-swish-05!important;background-image:linear-gradient(90deg,#8318a3 0%,#8318a3 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#8318a3 60%,#8318a3 100%)!important}@keyframes falling-ts-swish-06{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-06{animation-name:falling-ts-swish-06!important;background-image:linear-gradient(90deg,#86198f 0%,#86198f 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#86198f 60%,#86198f 100%)!important}@keyframes falling-ts-swish-07{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-07{animation-name:falling-ts-swish-07!important;background-image:linear-gradient(90deg,#9d174d 0%,#9d174d 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#9d174d 60%,#9d174d 100%)!important}@keyframes falling-ts-swish-08{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-08{animation-name:falling-ts-swish-08!important;background-image:linear-gradient(90deg,#9f1239 0%,#9f1239 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#9f1239 60%,#9f1239 100%)!important}@keyframes falling-ts-swish-09{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-09{animation-name:falling-ts-swish-09!important;background-image:linear-gradient(90deg,#991b1b 0%,#991b1b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#991b1b 60%,#991b1b 100%)!important}@keyframes falling-ts-swish-10{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-10{animation-name:falling-ts-swish-10!important;background-image:linear-gradient(90deg,#9a3412 0%,#9a3412 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#9a3412 60%,#9a3412 100%)!important}@keyframes falling-ts-swish-11{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-11{animation-name:falling-ts-swish-11!important;background-image:linear-gradient(90deg,#92400e 0%,#92400e 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#92400e 60%,#92400e 100%)!important}@keyframes falling-ts-swish-12{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-12{animation-name:falling-ts-swish-12!important;background-image:linear-gradient(90deg,#854d0e 0%,#854d0e 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#854d0e 60%,#854d0e 100%)!important}@keyframes falling-ts-swish-13{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-13{animation-name:falling-ts-swish-13!important;background-image:linear-gradient(90deg,#4d7c0f 0%,#4d7c0f 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#4d7c0f 60%,#4d7c0f 100%)!important}@keyframes falling-ts-swish-14{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-14{animation-name:falling-ts-swish-14!important;background-image:linear-gradient(90deg,#3f6212 0%,#3f6212 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#3f6212 60%,#3f6212 100%)!important}@keyframes falling-ts-swish-15{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-15{animation-name:falling-ts-swish-15!important;background-image:linear-gradient(90deg,#166534 0%,#166534 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#166534 60%,#166534 100%)!important}@keyframes falling-ts-swish-16{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-16{animation-name:falling-ts-swish-16!important;background-image:linear-gradient(90deg,#065f46 0%,#065f46 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#065f46 60%,#065f46 100%)!important}@keyframes falling-ts-swish-17{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-17{animation-name:falling-ts-swish-17!important;background-image:linear-gradient(90deg,#0e7490 0%,#0e7490 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#0e7490 60%,#0e7490 100%)!important}@keyframes falling-ts-swish-18{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-18{animation-name:falling-ts-swish-18!important;background-image:linear-gradient(90deg,#155e75 0%,#155e75 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#155e75 60%,#155e75 100%)!important}@keyframes falling-ts-swish-19{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-19{animation-name:falling-ts-swish-19!important;background-image:linear-gradient(90deg,#172554 0%,#172554 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#172554 60%,#172554 100%)!important}@keyframes falling-ts-swish-20{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-20{animation-name:falling-ts-swish-20!important;background-image:linear-gradient(90deg,#9b1c2b 0%,#9b1c2b 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#9b1c2b 60%,#9b1c2b 100%)!important}@keyframes falling-ts-swish-21{from{background-position:100% 0}to{background-position:0 0}}.falling-ts-swish-21{animation-name:falling-ts-swish-21!important;background-image:linear-gradient(90deg,#2f6f52 0%,#2f6f52 40%,var(--dsw-fc-swish-band,#ffffff) 50%,#2f6f52 60%,#2f6f52 100%)!important}.turnStatus[data-fc-bg] .turnStatusClock,[data-fc-bg] span:last-of-type{color:attr(data-fc-bg)!important;-webkit-text-fill-color:attr(data-fc-bg)!important}";
717
720
 
718
721
  /**
719
722
  * 确保 <style id="falling-ts-swish-inline"> 已挂在 <head>(幂等,至多一次)。
package/web/swish.css CHANGED
@@ -21,163 +21,165 @@
21
21
  *
22
22
  * Color index ↔ phase mapping (single source of truth lives in
23
23
  * `src/core/ui-signal.js` — keep in sync manually if either side grows):
24
- * 00..19 = WORKING_COLORS[0..19] (random working states)
25
- * 20 = PINNED_COLORS.compressing (#ff4d4f red)
26
- * 21 = PINNED_COLORS.done (#52c41a green)
24
+ * 00..19 = WORKING_COLORS[0..19] (random working states, extra-dark)
25
+ * 20 = PINNED_COLORS.compressing (#9b1c2b deep burgundy-red)
26
+ * 21 = PINNED_COLORS.done (#2f6f52 muted pine-green)
27
+ *
28
+ * 2026 深色化第二轮:所有色值加深一档(与 ui-signal.js 同步),扫光带仍为白色。
27
29
  */
28
30
 
29
- /* ---------- 00 · working · #4f9cf9 (calm blue) ---------- */
31
+ /* ---------- 00 · working · #1e40af (royal blue) ---------- */
30
32
  @keyframes falling-ts-swish-00 { from { background-position: 100% 0; } to { background-position: 0 0; } }
31
33
  .falling-ts-swish-00 {
32
34
  animation-name: falling-ts-swish-00 !important;
33
- background-image: linear-gradient(90deg, #4f9cf9 0%, #4f9cf9 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #4f9cf9 60%, #4f9cf9 100%) !important;
35
+ background-image: linear-gradient(90deg, #1e40af 0%, #1e40af 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #1e40af 60%, #1e40af 100%) !important;
34
36
  }
35
37
 
36
- /* ---------- 01 · working · #5b8def (indigo) ---------- */
38
+ /* ---------- 01 · working · #1e3a8a (deep blue) ---------- */
37
39
  @keyframes falling-ts-swish-01 { from { background-position: 100% 0; } to { background-position: 0 0; } }
38
40
  .falling-ts-swish-01 {
39
41
  animation-name: falling-ts-swish-01 !important;
40
- background-image: linear-gradient(90deg, #5b8def 0%, #5b8def 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #5b8def 60%, #5b8def 100%) !important;
42
+ background-image: linear-gradient(90deg, #1e3a8a 0%, #1e3a8a 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #1e3a8a 60%, #1e3a8a 100%) !important;
41
43
  }
42
44
 
43
- /* ---------- 02 · working · #6a5bff (violet) ---------- */
45
+ /* ---------- 02 · working · #312e81 (indigo) ---------- */
44
46
  @keyframes falling-ts-swish-02 { from { background-position: 100% 0; } to { background-position: 0 0; } }
45
47
  .falling-ts-swish-02 {
46
48
  animation-name: falling-ts-swish-02 !important;
47
- background-image: linear-gradient(90deg, #6a5bff 0%, #6a5bff 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #6a5bff 60%, #6a5bff 100%) !important;
49
+ background-image: linear-gradient(90deg, #312e81 0%, #312e81 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #312e81 60%, #312e81 100%) !important;
48
50
  }
49
51
 
50
- /* ---------- 03 · working · #8b5cf6 (purple) ---------- */
52
+ /* ---------- 03 · working · #4c1d95 (violet) ---------- */
51
53
  @keyframes falling-ts-swish-03 { from { background-position: 100% 0; } to { background-position: 0 0; } }
52
54
  .falling-ts-swish-03 {
53
55
  animation-name: falling-ts-swish-03 !important;
54
- background-image: linear-gradient(90deg, #8b5cf6 0%, #8b5cf6 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #8b5cf6 60%, #8b5cf6 100%) !important;
56
+ background-image: linear-gradient(90deg, #4c1d95 0%, #4c1d95 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #4c1d95 60%, #4c1d95 100%) !important;
55
57
  }
56
58
 
57
- /* ---------- 04 · working · #a855f7 (bright violet) ---------- */
59
+ /* ---------- 04 · working · #581c87 (purple) ---------- */
58
60
  @keyframes falling-ts-swish-04 { from { background-position: 100% 0; } to { background-position: 0 0; } }
59
61
  .falling-ts-swish-04 {
60
62
  animation-name: falling-ts-swish-04 !important;
61
- background-image: linear-gradient(90deg, #a855f7 0%, #a855f7 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #a855f7 60%, #a855f7 100%) !important;
63
+ background-image: linear-gradient(90deg, #581c87 0%, #581c87 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #581c87 60%, #581c87 100%) !important;
62
64
  }
63
65
 
64
- /* ---------- 05 · working · #c45bf9 (magenta) ---------- */
66
+ /* ---------- 05 · working · #8318a3 (plum) ---------- */
65
67
  @keyframes falling-ts-swish-05 { from { background-position: 100% 0; } to { background-position: 0 0; } }
66
68
  .falling-ts-swish-05 {
67
69
  animation-name: falling-ts-swish-05 !important;
68
- background-image: linear-gradient(90deg, #c45bf9 0%, #c45bf9 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #c45bf9 60%, #c45bf9 100%) !important;
70
+ background-image: linear-gradient(90deg, #8318a3 0%, #8318a3 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #8318a3 60%, #8318a3 100%) !important;
69
71
  }
70
72
 
71
- /* ---------- 06 · working · #db6bd4 (pink-magenta) ---------- */
73
+ /* ---------- 06 · working · #86198f (orchid) ---------- */
72
74
  @keyframes falling-ts-swish-06 { from { background-position: 100% 0; } to { background-position: 0 0; } }
73
75
  .falling-ts-swish-06 {
74
76
  animation-name: falling-ts-swish-06 !important;
75
- background-image: linear-gradient(90deg, #db6bd4 0%, #db6bd4 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #db6bd4 60%, #db6bd4 100%) !important;
77
+ background-image: linear-gradient(90deg, #86198f 0%, #86198f 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #86198f 60%, #86198f 100%) !important;
76
78
  }
77
79
 
78
- /* ---------- 07 · working · #e86bb0 (rose pink) ---------- */
80
+ /* ---------- 07 · working · #9d174d (magenta) ---------- */
79
81
  @keyframes falling-ts-swish-07 { from { background-position: 100% 0; } to { background-position: 0 0; } }
80
82
  .falling-ts-swish-07 {
81
83
  animation-name: falling-ts-swish-07 !important;
82
- background-image: linear-gradient(90deg, #e86bb0 0%, #e86bb0 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #e86bb0 60%, #e86bb0 100%) !important;
84
+ background-image: linear-gradient(90deg, #9d174d 0%, #9d174d 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #9d174d 60%, #9d174d 100%) !important;
83
85
  }
84
86
 
85
- /* ---------- 08 · working · #f06b8b (salmon rose) ---------- */
87
+ /* ---------- 08 · working · #9f1239 (pink) ---------- */
86
88
  @keyframes falling-ts-swish-08 { from { background-position: 100% 0; } to { background-position: 0 0; } }
87
89
  .falling-ts-swish-08 {
88
90
  animation-name: falling-ts-swish-08 !important;
89
- background-image: linear-gradient(90deg, #f06b8b 0%, #f06b8b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #f06b8b 60%, #f06b8b 100%) !important;
91
+ background-image: linear-gradient(90deg, #9f1239 0%, #9f1239 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #9f1239 60%, #9f1239 100%) !important;
90
92
  }
91
93
 
92
- /* ---------- 09 · working · #f76b5b (warm coral) ---------- */
94
+ /* ---------- 09 · working · #991b1b (rose) ---------- */
93
95
  @keyframes falling-ts-swish-09 { from { background-position: 100% 0; } to { background-position: 0 0; } }
94
96
  .falling-ts-swish-09 {
95
97
  animation-name: falling-ts-swish-09 !important;
96
- background-image: linear-gradient(90deg, #f76b5b 0%, #f76b5b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #f76b5b 60%, #f76b5b 100%) !important;
98
+ background-image: linear-gradient(90deg, #991b1b 0%, #991b1b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #991b1b 60%, #991b1b 100%) !important;
97
99
  }
98
100
 
99
- /* ---------- 10 · working · #fb8c5b (orange) ---------- */
101
+ /* ---------- 10 · working · #9a3412 (crimson) ---------- */
100
102
  @keyframes falling-ts-swish-10 { from { background-position: 100% 0; } to { background-position: 0 0; } }
101
103
  .falling-ts-swish-10 {
102
104
  animation-name: falling-ts-swish-10 !important;
103
- background-image: linear-gradient(90deg, #fb8c5b 0%, #fb8c5b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #fb8c5b 60%, #fb8c5b 100%) !important;
105
+ background-image: linear-gradient(90deg, #9a3412 0%, #9a3412 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #9a3412 60%, #9a3412 100%) !important;
104
106
  }
105
107
 
106
- /* ---------- 11 · working · #fca95b (amber orange) ---------- */
108
+ /* ---------- 11 · working · #92400e (scarlet) ---------- */
107
109
  @keyframes falling-ts-swish-11 { from { background-position: 100% 0; } to { background-position: 0 0; } }
108
110
  .falling-ts-swish-11 {
109
111
  animation-name: falling-ts-swish-11 !important;
110
- background-image: linear-gradient(90deg, #fca95b 0%, #fca95b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #fca95b 60%, #fca95b 100%) !important;
112
+ background-image: linear-gradient(90deg, #92400e 0%, #92400e 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #92400e 60%, #92400e 100%) !important;
111
113
  }
112
114
 
113
- /* ---------- 12 · working · #fdc35b (golden yellow) ---------- */
115
+ /* ---------- 12 · working · #854d0e (rust) ---------- */
114
116
  @keyframes falling-ts-swish-12 { from { background-position: 100% 0; } to { background-position: 0 0; } }
115
117
  .falling-ts-swish-12 {
116
118
  animation-name: falling-ts-swish-12 !important;
117
- background-image: linear-gradient(90deg, #fdc35b 0%, #fdc35b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #fdc35b 60%, #fdc35b 100%) !important;
119
+ background-image: linear-gradient(90deg, #854d0e 0%, #854d0e 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #854d0e 60%, #854d0e 100%) !important;
118
120
  }
119
121
 
120
- /* ---------- 13 · working · #d8e05b (lime chartreuse) ---------- */
122
+ /* ---------- 13 · working · #4d7c0f (ochre-gold) ---------- */
121
123
  @keyframes falling-ts-swish-13 { from { background-position: 100% 0; } to { background-position: 0 0; } }
122
124
  .falling-ts-swish-13 {
123
125
  animation-name: falling-ts-swish-13 !important;
124
- background-image: linear-gradient(90deg, #d8e05b 0%, #d8e05b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #d8e05b 60%, #d8e05b 100%) !important;
126
+ background-image: linear-gradient(90deg, #4d7c0f 0%, #4d7c0f 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #4d7c0f 60%, #4d7c0f 100%) !important;
125
127
  }
126
128
 
127
- /* ---------- 14 · working · #aede5b (spring green-yellow) ---------- */
129
+ /* ---------- 14 · working · #3f6212 (olive) ---------- */
128
130
  @keyframes falling-ts-swish-14 { from { background-position: 100% 0; } to { background-position: 0 0; } }
129
131
  .falling-ts-swish-14 {
130
132
  animation-name: falling-ts-swish-14 !important;
131
- background-image: linear-gradient(90deg, #aede5b 0%, #aede5b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #aede5b 60%, #aede5b 100%) !important;
133
+ background-image: linear-gradient(90deg, #3f6212 0%, #3f6212 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #3f6212 60%, #3f6212 100%) !important;
132
134
  }
133
135
 
134
- /* ---------- 15 · working · #7ee083 (fresh green) ---------- */
136
+ /* ---------- 15 · working · #166534 (moss) ---------- */
135
137
  @keyframes falling-ts-swish-15 { from { background-position: 100% 0; } to { background-position: 0 0; } }
136
138
  .falling-ts-swish-15 {
137
139
  animation-name: falling-ts-swish-15 !important;
138
- background-image: linear-gradient(90deg, #7ee083 0%, #7ee083 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #7ee083 60%, #7ee083 100%) !important;
140
+ background-image: linear-gradient(90deg, #166534 0%, #166534 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #166534 60%, #166534 100%) !important;
139
141
  }
140
142
 
141
- /* ---------- 16 · working · #5be0a0 (mint teal-green) ---------- */
143
+ /* ---------- 16 · working · #065f46 (pine) ---------- */
142
144
  @keyframes falling-ts-swish-16 { from { background-position: 100% 0; } to { background-position: 0 0; } }
143
145
  .falling-ts-swish-16 {
144
146
  animation-name: falling-ts-swish-16 !important;
145
- background-image: linear-gradient(90deg, #5be0a0 0%, #5be0a0 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #5be0a0 60%, #5be0a0 100%) !important;
147
+ background-image: linear-gradient(90deg, #065f46 0%, #065f46 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #065f46 60%, #065f46 100%) !important;
146
148
  }
147
149
 
148
- /* ---------- 17 · working · #5becd8 (cyan teal) ---------- */
150
+ /* ---------- 17 · working · #0e7490 (teal) ---------- */
149
151
  @keyframes falling-ts-swish-17 { from { background-position: 100% 0; } to { background-position: 0 0; } }
150
152
  .falling-ts-swish-17 {
151
153
  animation-name: falling-ts-swish-17 !important;
152
- background-image: linear-gradient(90deg, #5becd8 0%, #5becd8 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #5becd8 60%, #5becd8 100%) !important;
154
+ background-image: linear-gradient(90deg, #0e7490 0%, #0e7490 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #0e7490 60%, #0e7490 100%) !important;
153
155
  }
154
156
 
155
- /* ---------- 18 · working · #5bcdf9 (sky cyan) ---------- */
157
+ /* ---------- 18 · working · #155e75 (cyan) ---------- */
156
158
  @keyframes falling-ts-swish-18 { from { background-position: 100% 0; } to { background-position: 0 0; } }
157
159
  .falling-ts-swish-18 {
158
160
  animation-name: falling-ts-swish-18 !important;
159
- background-image: linear-gradient(90deg, #5bcdf9 0%, #5bcdf9 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #5bcdf9 60%, #5bcdf9 100%) !important;
161
+ background-image: linear-gradient(90deg, #155e75 0%, #155e75 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #155e75 60%, #155e75 100%) !important;
160
162
  }
161
163
 
162
- /* ---------- 19 · working · #7ba8f9 (periwinkle blue) ---------- */
164
+ /* ---------- 19 · working · #172554 (navy) ---------- */
163
165
  @keyframes falling-ts-swish-19 { from { background-position: 100% 0; } to { background-position: 0 0; } }
164
166
  .falling-ts-swish-19 {
165
167
  animation-name: falling-ts-swish-19 !important;
166
- background-image: linear-gradient(90deg, #7ba8f9 0%, #7ba8f9 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #7ba8f9 60%, #7ba8f9 100%) !important;
168
+ background-image: linear-gradient(90deg, #172554 0%, #172554 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #172554 60%, #172554 100%) !important;
167
169
  }
168
170
 
169
- /* ---------- 20 · compressing · #ff4d4f (alert red, pinned) ---------- */
171
+ /* ---------- 20 · compressing · #9b1c2b (deep burgundy-red, pinned) ---------- */
170
172
  @keyframes falling-ts-swish-20 { from { background-position: 100% 0; } to { background-position: 0 0; } }
171
173
  .falling-ts-swish-20 {
172
174
  animation-name: falling-ts-swish-20 !important;
173
- background-image: linear-gradient(90deg, #ff4d4f 0%, #ff4d4f 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #ff4d4f 60%, #ff4d4f 100%) !important;
175
+ background-image: linear-gradient(90deg, #9b1c2b 0%, #9b1c2b 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #9b1c2b 60%, #9b1c2b 100%) !important;
174
176
  }
175
177
 
176
- /* ---------- 21 · done · #52c41a (success green, pinned) ---------- */
178
+ /* ---------- 21 · done · #2f6f52 (muted pine-green, pinned) ---------- */
177
179
  @keyframes falling-ts-swish-21 { from { background-position: 100% 0; } to { background-position: 0 0; } }
178
180
  .falling-ts-swish-21 {
179
181
  animation-name: falling-ts-swish-21 !important;
180
- background-image: linear-gradient(90deg, #52c41a 0%, #52c41a 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #52c41a 60%, #52c41a 100%) !important;
182
+ background-image: linear-gradient(90deg, #2f6f52 0%, #2f6f52 40%, var(--dsw-fc-swish-band, #ffffff) 50%, #2f6f52 60%, #2f6f52 100%) !important;
181
183
  }
182
184
 
183
185
  /* No independent clock recolor rule here. The TurnStatus text fill is painted