@nelsonlongxiang/dsh-open-a2a-net 0.6.25 → 0.6.27

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.
@@ -14,8 +14,6 @@
14
14
  --n-canvas:#22d3ee; --n-line:var(--n-border);
15
15
  --n-raised:#131b2e; --n-federal:#6366f1; --n-card-line:#5c6680;
16
16
  --n-error-ink:#fecaca; --n-error-panel:#2a0d10f2; --n-shadow:rgba(0,0,0,.35);
17
- --n-role-user:#7dd3fc; --n-role-user-bg:rgba(56,189,248,.16);
18
- --n-role-assistant:#6ee7b7; --n-role-assistant-bg:rgba(52,211,153,.14);
19
17
  }
20
18
  @media (prefers-color-scheme: light){
21
19
  :root{ --n-bg:#eef2fa; --n-ink:#1a2438; --n-ink-muted:#5a6580; --n-panel:#ffffff;
@@ -23,9 +21,7 @@
23
21
  --n-danger:#b91c1c; --n-accent:#6d28d9;
24
22
  --n-cold:#636c81; --n-canvas:#0e7490;
25
23
  --n-raised:#ffffff; --n-federal:#4f46e5; --n-card-line:#8a95ae;
26
- --n-error-ink:#b91c1c; --n-error-panel:#fef2f2f2; --n-shadow:rgba(26,36,56,.16);
27
- --n-role-user:#075985; --n-role-user-bg:rgba(14,116,144,.12);
28
- --n-role-assistant:#065f46; --n-role-assistant-bg:rgba(5,150,105,.12); }
24
+ --n-error-ink:#b91c1c; --n-error-panel:#fef2f2f2; --n-shadow:rgba(26,36,56,.16); }
29
25
  }
30
26
  @media (min-width:1440px){ :root{ --n-rail-w:340px } }
31
27
  html,body,#app{height:100%;margin:0}
@@ -56,28 +52,15 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
56
52
  .wb-body{position:relative;display:grid;grid-template-columns:minmax(0,var(--n-rail-w)) minmax(0,1fr);flex:1;min-height:0}
57
53
 
58
54
  /* ── Rail (directory + operational panels in canvas mode) ── */
59
- .wb-rail{border-right:1px solid var(--n-border);overflow-y:auto;min-width:0;background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}
60
- .wb-sec{border-bottom:1px solid color-mix(in srgb,var(--n-border) 60%,transparent)}
61
- .wb-sec-head{display:flex;justify-content:space-between;align-items:center;gap:8px;width:100%;
62
- background:none;border:none;color:var(--n-ink);font:inherit;font-weight:600;font-size:12.5px;
63
- padding:8px 12px;cursor:pointer;text-transform:uppercase;letter-spacing:.05em}
64
- .wb-sec-head:hover{color:var(--n-accent)}
65
- .wb-sec-count{font-weight:400;font-size:11px;color:var(--n-ink-muted)}
66
- .wb-sec.is-collapsed .wb-sec-body{display:none}
67
- .wb-sec-body{padding:2px 10px 10px}
68
- /* Data mode: the three panels move to the stage — their rail seats hide. */
69
- .wb[data-mode="data"] .wb-sec[data-sec="ledger"],
70
- .wb[data-mode="data"] .wb-sec[data-sec="activity"],
71
- .wb[data-mode="data"] .wb-sec[data-sec="plan"]{display:none}
55
+ .wb-rail{border-right:1px solid var(--n-border);min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;
56
+ background:color-mix(in srgb,var(--n-panel) 60%,var(--n-bg))}
72
57
 
73
58
  .wb-side-head{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:10px 2px 4px}
74
59
  .wb-item{display:flex;gap:7px;align-items:center;width:100%;text-align:left;background:none;border:none;
75
60
  color:var(--n-ink);font:inherit;padding:3px 6px;border-radius:6px;cursor:pointer}
76
61
  .wb-item:hover{background:color-mix(in srgb,var(--n-accent) 14%,transparent)}
77
62
  .wb-dot{font-size:10px}
78
- .wb-dot-live{color:var(--n-live)} .wb-dot-cold{color:var(--n-cold)} .wb-dot-canvas{color:var(--n-canvas)}
79
- .wb-dot-peer{color:var(--n-accent)} .wb-dot-remote{color:var(--n-act)}
80
- .wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
63
+ .wb-dot-live{color:var(--n-live)} .wb-dot-cold{color:var(--n-cold)} .wb-dot-canvas{color:var(--n-canvas)} .wb-dot-remote{color:var(--n-act)}
81
64
 
82
65
  /* ── Directory toolbar: unified search + category filters (0.6.6) ── */
83
66
  .wb-dir-tools{display:flex;flex-direction:column;gap:6px;padding:8px 6px 4px}
@@ -94,7 +77,7 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
94
77
  border-radius:99px;padding:0 6px;line-height:17px;white-space:nowrap}
95
78
  /* 0.6.10: .wb-item-open (the ↗ jump affordance) removed by ruling —
96
79
  禁止任何跳转,全部使用响应式布局. */
97
- .wb-item-label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:46%}
80
+ .wb-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
98
81
 
99
82
  /* ── Canvas member management (inspector, 0.6.6) ── */
100
83
  .wb-member-row{display:flex;align-items:center;gap:8px;padding:3px 2px;border-radius:6px}
@@ -123,16 +106,6 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
123
106
  .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent)}
124
107
  .wb-dispatch-note{font-size:11px;color:var(--n-ink-muted);line-height:1.4;min-height:0}
125
108
  /* 0.6.11 inline transcript: read-only tail of a local session's own log. */
126
- .wb-transcript{display:flex;flex-direction:column;gap:6px}
127
- .wb-transcript-title{font-size:12px;color:var(--n-ink-muted)}
128
- .wb-transcript-body.is-folded{display:none}
129
- .wb-transcript-refresh{margin-left:auto;font-size:11px;padding:1px 8px;border-radius:999px;border:1px solid var(--n-line);background:transparent;color:var(--n-ink-muted);cursor:pointer}
130
- .wb-transcript-body{display:flex;flex-direction:column;gap:4px;max-height:220px;overflow-y:auto}
131
- .wb-transcript-row{display:flex;gap:6px;align-items:flex-start;font-size:12px;line-height:1.45}
132
- .wb-transcript-role{flex:0 0 auto;font-size:10px;padding:0 5px;border-radius:999px;margin-top:2px}
133
- .wb-transcript-user .wb-transcript-role{background:var(--n-role-user-bg);color:var(--n-role-user)}
134
- .wb-transcript-assistant .wb-transcript-role{background:var(--n-role-assistant-bg);color:var(--n-role-assistant)}
135
- .wb-transcript-text{flex:1 1 auto;min-width:0;color:var(--n-ink);word-break:break-word}
136
109
 
137
110
  /* ── Stage: board (canvas mode) or the data stack (data mode) ── */
138
111
  .wb-stage{position:relative;min-width:0;min-height:0;display:flex;flex-direction:column}
@@ -144,28 +117,10 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
144
117
  .wb-pane-head{font-size:12px;color:var(--n-ink-muted);margin:4px 0 8px}
145
118
  .wb-pane-subhead{font-size:11px;text-transform:uppercase;letter-spacing:.06em;color:var(--n-ink-muted);margin:12px 0 6px}
146
119
  .wb-table,.wb-row{display:flex;gap:10px;align-items:baseline}
147
- .wb-table{flex-direction:column;gap:2px}
148
120
  .wb-row{font-family:ui-monospace,Consolas,monospace;font-size:12px;background:color-mix(in srgb,var(--n-panel) 55%,transparent);
149
121
  border:1px solid var(--n-border);border-radius:6px;padding:3px 8px;flex-wrap:wrap}
150
- .wb-row-id{min-width:130px}
151
122
  .wb-row-team{color:var(--n-accent);min-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
152
123
  .wb-row-meta{color:var(--n-ink-muted)}
153
- /* Owner signal (2026-10-21): the ledger is a RESULTS face — brief-first
154
- rows, exception-driven color, quiet normals. */
155
- .wb-row-result{flex-direction:column;align-items:stretch;gap:2px;flex-wrap:nowrap}
156
- .wb-row-head{color:var(--n-ink);font-size:12.5px;font-family:Avenir Next,Segoe UI Variable,Segoe UI,sans-serif;
157
- overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
158
- .wb-row-meta-line{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:11px;
159
- overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
160
- .wb-row-result:not(.wb-row-alert) .wb-row-head{color:var(--n-ink-muted)}
161
- .wb-row-alert{border-color:var(--n-danger)}
162
- .wb-row-alert .wb-row-head{color:var(--n-danger)}
163
- /* The dispatch brief is the row's only human-readable payload — give it the
164
- remaining width and clip rather than wrapping the table into unreadability
165
- (full text stays in the title tooltip). */
166
- .wb-row-brief{flex:1 1 160px;min-width:0;color:var(--n-ink);overflow:hidden;
167
- text-overflow:ellipsis;white-space:nowrap}
168
- .wb-row-brief:empty{flex:0 0 0;display:none}
169
124
  .wb-row-badges{color:var(--n-live)}
170
125
  .wb-row-dir{min-width:16px}
171
126
  .wb-row-dir.is-fail{color:var(--n-danger)}
@@ -198,42 +153,82 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
198
153
  .wb-kv-v{word-break:break-all}
199
154
  .wb-muted{color:var(--n-ink-muted)}
200
155
 
201
- /* ── Node chat drawer (0.6.13): right-side conversation face. ── */
202
- .wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:360px;max-width:calc(100% - 16px);
156
+ /* ── Node chat drawer (wb-chat, rewritten 2026-10-23): head · info · thread · composer.
157
+ The thread is the conversation (shown by default); the composer is pinned
158
+ to the bottom; sends from this page track their receipts in the thread. ── */
159
+ .wb-chat{position:absolute;top:8px;right:8px;bottom:8px;width:400px;max-width:calc(100% - 16px);
203
160
  display:flex;flex-direction:column;background:var(--n-panel);border:1px solid var(--n-border);
204
- border-radius:10px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);
161
+ border-radius:12px;z-index:22;box-shadow:0 8px 24px var(--n-shadow);overflow:hidden;
205
162
  transform:translateX(calc(100% + 12px));transition:transform .18s ease;pointer-events:none}
206
163
  .wb-chat.is-open{transform:translateX(0);pointer-events:auto}
207
- .wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 8px;border-bottom:1px solid var(--n-border)}
208
- .wb-chat-dot{flex:none;font-size:11px}
209
- .wb-chat-dot.is-live{color:var(--n-accent)}
210
- .wb-chat-dot.is-cold{color:var(--n-ink-muted)}
211
- .wb-chat-dot.is-peer{color:var(--n-act)}
212
- .wb-chat-title{font-weight:600;font-size:13px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
213
- .wb-chat-sub{flex:1 1 auto;min-width:0;font-size:11px;color:var(--n-ink-muted);
164
+ .wb-chat-head{display:flex;align-items:center;gap:8px;padding:10px 10px 10px 12px;border-bottom:1px solid var(--n-border);flex:none}
165
+ .wb-chat-dot{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
166
+ .wb-chat-dot.is-live{background:var(--n-live)}
167
+ .wb-chat-dot.is-cold{background:transparent;border:1.5px solid var(--n-ink-muted)}
168
+ .wb-chat-dot.is-peer{background:var(--n-federal)}
169
+ .wb-chat-titles{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.3}
170
+ .wb-chat-title{font-weight:600;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
171
+ .wb-chat-sub{font:11px/1.4 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
214
172
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
215
- .wb-chat .wb-icon-btn{display:inline-flex;width:24px;height:24px;font-size:12px;flex:none}
216
- .wb-chat-body{flex:1 1 auto;overflow-y:auto;padding:10px;display:flex;flex-direction:column;gap:10px}
217
- .wb-chat-note{font-size:12px;color:var(--n-ink-muted);border:1px dashed var(--n-border);
218
- border-radius:8px;padding:8px 10px}
219
-
220
- /* ── Ledger density: stat strip, age histogram, load rows ── */
221
- .wb-stats{display:flex;gap:8px;flex-wrap:wrap;margin:2px 0 10px}
222
- .wb-stat{display:inline-flex;align-items:baseline;gap:6px;padding:4px 10px;border-radius:8px;
223
- border:1px solid var(--n-border);background:color-mix(in srgb,var(--n-panel) 70%,transparent);cursor:help}
224
- .wb-stat-k{font-size:11px;color:var(--n-ink-muted)}
225
- .wb-stat-v{font-family:ui-monospace,Consolas,monospace;font-size:14px;font-weight:600}
226
- .wb-stat-warn{border-color:var(--n-act)}
227
- .wb-stat-warn .wb-stat-v{color:var(--n-act)}
228
- .wb-stat-danger{border-color:var(--n-danger)}
229
- .wb-stat-danger .wb-stat-v{color:var(--n-danger)}
230
- .wb-hist{display:flex;flex-direction:column;gap:3px;margin:2px 0 8px;max-width:420px}
231
- .wb-bar-row{display:flex;align-items:center;gap:8px;font-size:11px}
232
- .wb-bar-k{color:var(--n-ink-muted);min-width:52px;flex:none;text-align:right}
233
- .wb-bar-track{flex:1;height:9px;border-radius:4px;overflow:hidden;
234
- background:color-mix(in srgb,var(--n-border) 55%,transparent)}
235
- .wb-bar-fill{display:block;height:100%;border-radius:4px;background:var(--n-accent)}
236
- .wb-bar-v{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted);min-width:28px}
173
+ .wb-chat .wb-icon-btn{display:inline-flex;width:28px;height:28px;font-size:13px;flex:none;border-color:transparent}
174
+ .wb-chat .wb-icon-btn:hover{border-color:var(--n-border)}
175
+ .wb-chat .wb-icon-btn:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
176
+ .wb-chat .wb-chat-back[hidden]{display:none}
177
+ .wb-chat-info-btn[aria-expanded="true"]{border-color:var(--n-accent);color:var(--n-accent)}
178
+ .wb-chat-info{flex:none;display:flex;flex-direction:column;gap:4px;padding:8px 12px;font-size:12px;
179
+ border-bottom:1px solid var(--n-border);background:color-mix(in srgb,var(--n-bg) 55%,var(--n-panel))}
180
+ .wb-chat-info[hidden]{display:none}
181
+ .wb-chat-info .wb-kv-v{font-family:ui-monospace,Consolas,monospace;font-size:11.5px}
182
+ .wb-chat-thread{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;
183
+ display:flex;flex-direction:column;gap:10px;padding:12px}
184
+ .wb-chat-thread:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
185
+ .wb-chat-log,.wb-chat-sent{display:flex;flex-direction:column;gap:10px}
186
+ .wb-chat-notice{align-self:center;max-width:92%;text-align:center;font-size:11.5px;line-height:1.5;
187
+ color:var(--n-ink-muted);border:1px dashed var(--n-border);border-radius:8px;padding:6px 10px}
188
+ .wb-chat-notice[hidden]{display:none}
189
+ .wb-chat-empty{align-self:center;padding:24px 8px;font-size:12px;color:var(--n-ink-muted);text-align:center}
190
+ .wb-chat-empty.is-error{color:var(--n-danger)}
191
+ .wb-msg{display:flex;flex-direction:column;gap:4px;max-width:86%;padding:8px 11px;border-radius:12px;
192
+ font-size:13px;line-height:1.55}
193
+ .wb-msg-assistant{align-self:flex-start;background:var(--n-raised);border:1px solid var(--n-border);border-bottom-left-radius:4px}
194
+ .wb-msg-user{align-self:flex-end;background:color-mix(in srgb,var(--n-accent) 16%,var(--n-panel));
195
+ border:1px solid color-mix(in srgb,var(--n-accent) 35%,transparent);border-bottom-right-radius:4px}
196
+ /* Role label for screen readers; side and tint carry it visually. */
197
+ .wb-msg-ledger{align-self:center;max-width:92%;background:transparent;border:1px dashed var(--n-border);font-size:12px}
198
+ .wb-msg-ledger .wb-msg-text{color:var(--n-ink-muted)}
199
+ .wb-msg-ledger .wb-msg-meta{justify-content:center}
200
+ .wb-msg-in .wb-msg-meta{justify-content:flex-start}
201
+ .wb-msg-who{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap}
202
+ .wb-msg-text{color:var(--n-ink);white-space:pre-wrap;word-break:break-word;overflow-wrap:anywhere}
203
+ .wb-msg-meta{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;font-size:11px}
204
+ .wb-msg-task{font-family:ui-monospace,Consolas,monospace;color:var(--n-ink-muted)}
205
+ .wb-msg-status{border:1px solid currentColor;border-radius:99px;padding:0 7px;line-height:18px;white-space:nowrap}
206
+ .wb-msg-status.is-wait,.wb-msg-status.is-muted{color:var(--n-ink-muted)}
207
+ .wb-msg-status.is-ok{color:var(--n-live)}
208
+ .wb-msg-status.is-warn{color:var(--n-act)}
209
+ .wb-msg-status.is-danger{color:var(--n-danger)}
210
+ .wb-chat-divider{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--n-ink-muted);margin-top:4px}
211
+ .wb-chat-divider::before,.wb-chat-divider::after{content:'';flex:1;border-top:1px solid var(--n-border)}
212
+ .wb-chat-sessions{display:flex;flex-direction:column;gap:6px}
213
+ .wb-chat-session{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;
214
+ background:var(--n-raised);border:1px solid var(--n-border);border-radius:8px;padding:7px 10px;
215
+ color:var(--n-ink);font:inherit;cursor:pointer}
216
+ .wb-chat-session:hover{border-color:var(--n-accent)}
217
+ .wb-chat-session:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
218
+ .wb-chat-session-id{font:12px ui-monospace,Consolas,monospace}
219
+ .wb-chat-session-meta{font-size:11px;color:var(--n-ink-muted)}
220
+ .wb-chat-foot{flex:none;border-top:1px solid var(--n-border);padding:8px 10px 10px;background:var(--n-panel)}
221
+ .wb-chat-composer{display:flex;flex-direction:column;gap:4px}
222
+ .wb-chat-composer-row{display:flex;align-items:flex-end;gap:8px}
223
+ .wb-chat-composer .wb-dispatch-text{flex:1 1 auto;min-height:38px;max-height:160px;resize:none;
224
+ border-radius:10px;padding:8px 10px;font-size:13px;line-height:1.5}
225
+ .wb-chat-composer .wb-dispatch-submit{align-self:auto;height:38px;padding:0 16px;border-radius:10px;
226
+ background:var(--n-accent);border-color:var(--n-accent);color:var(--n-bg);font-size:13px;font-weight:600}
227
+ .wb-chat-composer .wb-dispatch-submit:hover:not(:disabled){border-color:var(--n-accent);filter:brightness(1.08)}
228
+ .wb-chat-composer .wb-dispatch-submit:disabled{opacity:.45;cursor:default}
229
+ .wb-chat-composer .wb-dispatch-note{font-size:11px;padding-left:2px}
230
+ .wb-chat-composer .wb-dispatch-note.is-error{color:var(--n-danger)}
231
+ .wb-chat-readonly{font-size:12px;color:var(--n-ink-muted);text-align:center;padding:4px 0}
237
232
 
238
233
  /* The one fault badge (planning.css carried a second, conflicting copy —
239
234
  the cascade mixed the two). Honesty surface: always above the board. */
@@ -251,12 +246,12 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
251
246
  transform:translateX(-102%);transition:transform .18s ease;box-shadow:8px 0 24px var(--n-shadow)}
252
247
  .wb.is-rail-open .wb-rail{transform:translateX(0)}
253
248
  .wb-inspector{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:45%}
254
- .wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;max-height:70%;
249
+ .wb-chat{left:8px;right:8px;width:auto;top:auto;bottom:8px;height:85%;max-height:85%;
255
250
  transform:translateY(102%)}
256
251
  .wb-chat.is-open{transform:translateY(0)}
257
252
  }
258
253
  @media (pointer:coarse){
259
- .wb-filter,.wb-item,.wb-sec-head{min-height:36px}
254
+ .wb-filter,.wb-item,.wb-tab{min-height:36px}
260
255
  .wb-icon-btn,.wb-inspector .wb-icon-btn,.wb-chat .wb-icon-btn{width:36px;height:36px}
261
256
  }
262
257
  @media (max-width:680px){
@@ -265,3 +260,114 @@ body{background:var(--n-bg);color:var(--n-ink);font:13px/1.45 system-ui,"Segoe U
265
260
  .wb-row-team{min-width:0;flex:1 1 auto}
266
261
  .wb-data{padding:8px}
267
262
  }
263
+
264
+ /* gh#20 W-C: host rail rows — lamp + label + link badge + version + url. */
265
+ .wb-host-row{display:flex;align-items:center;gap:7px;padding:4px 6px;border:1px solid var(--n-border);
266
+ border-radius:7px;margin-bottom:4px;cursor:pointer;font-size:12px}
267
+ .wb-host-row:hover{border-color:var(--n-accent);background:color-mix(in srgb,var(--n-accent) 8%,transparent)}
268
+ .wb-host-row:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
269
+ .wb-host-lamp{flex:none;width:8px;height:8px;border-radius:50%;background:var(--n-ink-muted)}
270
+ .wb-host-lamp.is-live{background:var(--n-live)}
271
+ .wb-host-lamp.is-warm{background:var(--n-act)}
272
+ .wb-host-lamp.is-cold{background:var(--n-ink-muted)}
273
+ .wb-host-lamp.is-fail{background:var(--n-danger)}
274
+ .wb-host-lamp.is-unknown{background:transparent;border:1px solid var(--n-ink-muted)}
275
+ .wb-host-name{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink)}
276
+ .wb-host-badge{flex:none;font-size:10.5px;border-radius:99px;padding:0 7px;line-height:17px;border:1px solid var(--n-border)}
277
+ .wb-host-badge.is-linked{color:var(--n-live);border-color:var(--n-live)}
278
+ .wb-host-badge.is-stranger{color:var(--n-ink-muted);border-color:var(--n-border)}
279
+ .wb-host-ver{flex:none;font-size:10px;color:var(--n-ink-muted);border:1px solid var(--n-border);border-radius:4px;padding:0 4px}
280
+ .wb-host-url{flex:none;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--n-ink-muted);font-size:10.5px}
281
+
282
+ /* ── Rail tabs (wb-rail, 2026-10-23): 目录 · 主机 · 台账 · 活动 · 规划, each panel
283
+ with its own scroll. Badges count; color only when something needs a hand. ── */
284
+ .wb-tabs{flex:none;display:flex;gap:2px;padding:6px 6px 0;border-bottom:1px solid var(--n-border);overflow-x:auto;scrollbar-width:none}
285
+ .wb-tab{flex:1 1 auto;display:inline-flex;align-items:center;justify-content:center;gap:5px;min-width:0;
286
+ background:none;border:none;border-bottom:2px solid transparent;color:var(--n-ink-muted);font:inherit;font-size:12.5px;
287
+ padding:6px 6px 7px;cursor:pointer;white-space:nowrap}
288
+ .wb-tab:hover{color:var(--n-ink)}
289
+ .wb-tab.is-active{color:var(--n-ink);border-bottom-color:var(--n-accent);font-weight:600}
290
+ .wb-tab:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px;border-radius:6px 6px 0 0}
291
+ .wb-tab[hidden]{display:none}
292
+ .wb-tab-badge{font:10.5px/16px ui-monospace,Consolas,monospace;color:var(--n-ink-muted);font-weight:400}
293
+ .wb-tab-badge:empty{display:none}
294
+ .wb-tab-badge.is-danger,.wb-tab-badge.is-warn,.wb-tab-badge.is-accent{padding:0 6px;border-radius:99px;border:1px solid currentColor}
295
+ .wb-tab-badge.is-danger{color:var(--n-danger)}
296
+ .wb-tab-badge.is-warn{color:var(--n-act)}
297
+ .wb-tab-badge.is-accent{color:var(--n-accent)}
298
+ .wb-tabpanels{flex:1 1 auto;min-height:0;display:flex;flex-direction:column}
299
+ .wb-tabpanel{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:8px 10px 16px}
300
+ .wb-tabpanel[hidden]{display:none}
301
+ .wb-tabpanel:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
302
+ .wb-tabpanel .wb-pane{display:flex;flex-direction:column;gap:8px}
303
+
304
+ /* ── 目录 (wb-directory) ── */
305
+ .wb-tabpanel .wb-dir-tools{padding:0 0 6px}
306
+ .wb-dir-group{display:flex;flex-direction:column;gap:1px;margin-top:10px}
307
+ .wb-dir-group:first-child{margin-top:2px}
308
+ .wb-dir-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:0 6px 4px;
309
+ font-size:11px;letter-spacing:.04em;color:var(--n-ink-muted)}
310
+ .wb-dir-head-label{font-weight:600;color:var(--n-ink)}
311
+ .wb-dir-head-note{font-size:10.5px}
312
+ .wb-dir-day{padding:6px 6px 2px;font-size:10.5px;color:var(--n-ink-muted)}
313
+ .wb-dir-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
314
+ .wb-directory .wb-item{gap:9px;padding:5px 6px;border-radius:8px}
315
+ .wb-directory .wb-item:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px}
316
+ .wb-item-text{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;line-height:1.35}
317
+ .wb-item-sub{font:11px/1.35 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);
318
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
319
+ .wb-item.is-untitled .wb-item-label{color:var(--n-ink-muted);font-family:ui-monospace,Consolas,monospace;font-size:12px}
320
+ .wb-dot-log{color:var(--n-ink-muted)}
321
+
322
+ /* ── 台账 (wb-ledger) ── */
323
+ .wb-led-tiles{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:6px}
324
+ .wb-led-tile{display:flex;flex-direction:column;align-items:flex-start;gap:1px;padding:7px 8px;border-radius:8px;
325
+ border:1px solid var(--n-border);background:var(--n-raised);cursor:help;min-width:0}
326
+ .wb-led-tile-v{font:600 17px/1.15 ui-monospace,Consolas,monospace;color:var(--n-ink)}
327
+ .wb-led-tile-k{font-size:11px;color:var(--n-ink-muted)}
328
+ .wb-led-tile.is-warn{border-color:var(--n-act)}
329
+ .wb-led-tile.is-warn .wb-led-tile-v{color:var(--n-act)}
330
+ .wb-led-tile.is-danger{border-color:var(--n-danger)}
331
+ .wb-led-tile.is-danger .wb-led-tile-v{color:var(--n-danger)}
332
+ .wb-led-split{display:flex;flex-direction:column;gap:4px}
333
+ .wb-led-split-bar{display:flex;height:6px;border-radius:99px;overflow:hidden;background:var(--n-border)}
334
+ .wb-led-seg{display:block;height:100%}
335
+ .wb-led-split-legend{display:flex;flex-wrap:wrap;gap:4px 10px;font-size:11px;color:var(--n-ink-muted)}
336
+ .wb-led-split-item{display:inline-flex;align-items:center;gap:4px}
337
+ .wb-led-swatch{display:inline-block;width:8px;height:8px;border-radius:2px}
338
+ .wb-led-seg.is-completed,.wb-led-swatch.is-completed{background:var(--n-live)}
339
+ .wb-led-seg.is-rejected,.wb-led-swatch.is-rejected{background:var(--n-act)}
340
+ .wb-led-seg.is-failed,.wb-led-swatch.is-failed{background:var(--n-danger)}
341
+ .wb-led-seg.is-abandoned,.wb-led-swatch.is-abandoned{background:var(--n-ink-muted)}
342
+ .wb-led-seg.is-unclassified,.wb-led-swatch.is-unclassified,.wb-led-seg.is-other,.wb-led-swatch.is-other{background:color-mix(in srgb,var(--n-ink-muted) 45%,var(--n-border))}
343
+ .wb-led-group{display:flex;flex-direction:column;gap:6px;margin-top:4px}
344
+ .wb-led-group-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;font-size:11.5px;font-weight:600;color:var(--n-ink)}
345
+ .wb-led-group-hint{font-size:10.5px;font-weight:400;color:var(--n-ink-muted)}
346
+ .wb-led-group.is-danger .wb-led-group-head{color:var(--n-danger)}
347
+ .wb-led-group.is-warn .wb-led-group-head{color:var(--n-act)}
348
+ .wb-led-card{position:relative;display:flex;flex-direction:column;gap:3px;padding:7px 9px;border-radius:8px;
349
+ border:1px solid var(--n-border);background:var(--n-raised);min-width:0}
350
+ .wb-led-card.is-danger{border-color:var(--n-danger)}
351
+ .wb-led-card.is-warn{border-left:3px solid var(--n-act)}
352
+ .wb-led-card.is-muted,.wb-led-card.is-quiet{background:transparent}
353
+ .wb-led-card.is-link{cursor:pointer}
354
+ .wb-led-card.is-link:hover{border-color:var(--n-accent)}
355
+ .wb-led-card.is-link:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
356
+ .wb-led-card-head{display:flex;align-items:flex-start;gap:6px;min-width:0}
357
+ .wb-led-dir{flex:none;font-size:12px;color:var(--n-ink-muted);line-height:1.45}
358
+ .wb-led-dir.is-in{color:var(--n-federal)}
359
+ .wb-led-brief{flex:1 1 auto;min-width:0;font-size:12.5px;line-height:1.45;color:var(--n-ink);
360
+ display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
361
+ .wb-led-card.is-muted .wb-led-brief,.wb-led-card.is-quiet .wb-led-brief{color:var(--n-ink-muted)}
362
+ .wb-led-card.is-danger .wb-led-brief{color:var(--n-danger)}
363
+ .wb-led-brief.is-missing{font-style:italic}
364
+ .wb-led-meta{display:flex;flex-wrap:wrap;gap:2px 8px;font:11px/1.45 ui-monospace,Consolas,monospace;color:var(--n-ink-muted);min-width:0}
365
+ .wb-led-meta > span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}
366
+ .wb-led-chip{border:1px solid var(--n-border);border-radius:99px;padding:0 6px;font-family:inherit}
367
+ .wb-led-abandon{position:absolute;top:6px;right:6px;margin-left:0;padding:1px 9px;font-size:11.5px}
368
+ .wb-led-card:has(.wb-led-abandon) .wb-led-card-head{padding-right:52px}
369
+ .wb-led-empty{padding:24px 8px;text-align:center;font-size:12px;color:var(--n-ink-muted)}
370
+ .wb-led-forensics{font-size:11px;color:var(--n-ink-muted);border-top:1px dashed var(--n-border);padding-top:6px;margin-top:4px}
371
+ .wb-led-forensics summary{cursor:pointer}
372
+ .wb-led-forensics summary:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
373
+ .wb-led-forensics-body{display:flex;flex-direction:column;gap:2px;padding:4px 0 0 12px;font-family:ui-monospace,Consolas,monospace}