@zq-silk/yui 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/dist/cli/commandCatalog.js +294 -286
  2. package/dist/cli/commandDiscovery.js +69 -0
  3. package/dist/cli/completion.js +22 -227
  4. package/dist/cli/dynamicCompletion.js +12 -6
  5. package/dist/cli/invocationAuthority.js +2 -2
  6. package/dist/cli/invocationRouter.js +18 -7
  7. package/dist/cli.js +71 -23
  8. package/dist/commands/capabilityCommands.js +5 -5
  9. package/dist/commands/globalRoleCommands.js +2 -1
  10. package/dist/commands/taskCommands.js +11 -0
  11. package/dist/context/taskContext.js +6 -2
  12. package/dist/kernel/accessAssessment.js +1 -0
  13. package/dist/kernel/builtinCapabilities.js +28 -1
  14. package/dist/kernel/capabilityRegistry.js +64 -19
  15. package/dist/nativeAgent/agent.js +173 -0
  16. package/dist/nativeAgent/contracts.js +1 -0
  17. package/dist/nativeAgent/demo.js +29 -0
  18. package/dist/nativeAgent/index.js +3 -0
  19. package/dist/nativeAgent/mockProvider.js +43 -0
  20. package/dist/nativeAgent/textTools.js +156 -0
  21. package/dist/nativeAgent/validation.js +95 -0
  22. package/dist/plugins/pluginService.js +98 -8
  23. package/dist/resources/projectResourceService.js +23 -1
  24. package/dist/runtime/managedIdentity.js +6 -0
  25. package/dist/surface/surfaceContributions.js +3 -0
  26. package/dist/task/taskAuthority.js +5 -10
  27. package/dist/web/assets/assetManifest.js +38 -22
  28. package/dist/web/assets/client/api.js +115 -0
  29. package/dist/web/assets/client/app.js +555 -863
  30. package/dist/web/assets/client/components.js +323 -897
  31. package/dist/web/assets/client/detail.js +333 -0
  32. package/dist/web/assets/client/dock.js +225 -0
  33. package/dist/web/assets/client/dom.js +55 -3
  34. package/dist/web/assets/client/evidence.js +172 -0
  35. package/dist/web/assets/client/format.js +25 -14
  36. package/dist/web/assets/client/forms.js +230 -0
  37. package/dist/web/assets/client/i18n.js +1020 -791
  38. package/dist/web/assets/client/overview.js +115 -0
  39. package/dist/web/assets/client/records.js +63 -0
  40. package/dist/web/assets/client/sections.js +313 -0
  41. package/dist/web/assets/client/sidebar.js +117 -0
  42. package/dist/web/assets/client/theme.js +61 -22
  43. package/dist/web/assets/icons.js +39 -0
  44. package/dist/web/assets/shell.js +124 -118
  45. package/dist/web/assets/styles/base.js +41 -0
  46. package/dist/web/assets/styles/components.js +167 -0
  47. package/dist/web/assets/styles/layout.js +49 -77
  48. package/dist/web/assets/styles/markdown.js +16 -24
  49. package/dist/web/assets/styles/responsive.js +33 -44
  50. package/dist/web/assets/styles/tokens.js +65 -89
  51. package/dist/web/assets/styles/views.js +289 -0
  52. package/dist/web/webServer.js +2 -1
  53. package/docs/release-workflow.md +23 -0
  54. package/docs/release-workflow.zh-CN.md +16 -0
  55. package/package.json +1 -1
  56. package/skills/yui-runtime/SKILL.md +26 -0
  57. package/dist/web/assets/client/taskSummary.js +0 -350
  58. package/dist/web/assets/client/taskSurface.js +0 -616
  59. package/dist/web/assets/client/view.js +0 -608
  60. package/dist/web/assets/styles/cards.js +0 -247
  61. package/dist/web/assets/styles/widgets.js +0 -168
@@ -1,247 +0,0 @@
1
- /*
2
- * CARDS — content-bearing surfaces.
3
- * Overview blocks, detail head / conclusion band, sections, record cards,
4
- * input cards, AgentRun cards, criteria lists. Widgets (pills, chips, metrics)
5
- * live in widgets.ts; markdown typography lives in markdown.ts.
6
- */
7
- export const CARD_STYLES = `
8
- .surface-json { white-space: pre-wrap; overflow-wrap: anywhere; max-height: 36rem; overflow: auto; }
9
- .task-surface .section-body { display:grid; gap:12px; min-width:0; }
10
- .task-surface { grid-template-columns:minmax(0,1fr); }
11
- .task-surface .detail-section,.task-surface .record-card,.task-surface .execute-card { min-width:0; max-width:100%; }
12
- .task-surface .record-meta { min-width:0; overflow-wrap:anywhere; }
13
- @media(max-width:620px){
14
- .task-surface .record-head{flex-wrap:wrap}
15
- .task-surface .record-title-row{flex-basis:100%}
16
- }
17
- .task-surface .section-body > .pill { width:max-content; }
18
- .task-surface form,.task-surface label { display:grid; gap:10px; min-width:0; }
19
- .task-surface label { font-size:13px; font-weight:500; }
20
- .task-surface input,.task-surface textarea { box-sizing:border-box; width:100%; min-width:0; padding:12px; border:1px solid var(--border-strong); border-radius:var(--radius); background:var(--bg-1); color:var(--text); font:inherit; }
21
- .task-surface textarea { min-height:96px; resize:vertical; }
22
- .task-surface input:focus-visible,.task-surface textarea:focus-visible,.task-surface summary:focus-visible { outline:2px solid var(--accent); outline-offset:3px; }
23
- .task-surface button { min-height:40px; }
24
- .task-surface summary { cursor:pointer; padding:8px 0; font-weight:600; }
25
- .task-surface [role=status] { overflow-wrap:anywhere; }
26
- .summary-block h3 { margin:0 0 12px; font-size:16px; }
27
- .summary-block h4 { margin:12px 0 4px; }
28
- .summary-block p { overflow-wrap:anywhere; }
29
- .task-summary-grid { display:grid; gap:12px; min-width:0; align-items:start; }
30
- .task-summary-grid .summary-block { display:block; }
31
- .task-summary-grid .summary-block p { margin:8px 0; }
32
- .task-surface .record-pills { flex-wrap:wrap; max-width:100%; }
33
- @media (min-width:1100px) {
34
- .task-summary-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }
35
- }
36
- .session-counts { display:flex; flex-wrap:wrap; gap:8px; }
37
- .session-count { padding:6px 10px; background:var(--bg-3); border:1px solid var(--border); border-radius:var(--radius); }
38
- .session-row { padding:12px 0; border-top:1px solid var(--border); overflow-wrap:anywhere; }
39
- .artifact-choice { text-align:left; white-space:normal; overflow-wrap:anywhere; }
40
- .task-surface .artifact-text { max-height:32rem; padding:16px; border:1px solid var(--border); background:var(--bg-1); }
41
- .task-surface .mono { overflow-wrap:anywhere; }
42
- .task-surface .muted { overflow-wrap:anywhere; min-width:0; }
43
- .task-surface .observability-metrics { grid-template-columns:repeat(auto-fit,minmax(min(100%,12rem),1fr)); }
44
- .task-surface .observability-metrics .metric { flex-direction:column; align-items:flex-start; min-width:0; }
45
- .task-surface .observability-metrics .metric-value { overflow-wrap:anywhere; max-width:100%; }
46
- .task-surface button { min-height:44px; }
47
- /* Overview scaffolding */
48
- .overview{display:grid;gap:14px;padding-top:2px}
49
- .overview-duo{display:grid;grid-template-columns:1fr 1fr;gap:14px;align-items:start}
50
- .overview-block{display:grid;gap:8px}
51
- .section-head{display:flex;align-items:center;gap:10px;min-height:22px}
52
- .section-head h3{margin:0;font-family:var(--font-display);font-weight:700;font-size:14px;letter-spacing:-.01em;color:var(--text)}
53
- .section-count{display:inline-grid;place-items:center;min-width:20px;height:20px;padding:0 6px;border-radius:var(--radius-pill);background:var(--bg-3);border:1px solid var(--border);color:var(--muted);font-family:var(--font-mono);font-size:10.5px;font-weight:500}
54
- .section-label{color:var(--muted);font-family:var(--font-mono);font-size:9.5px;text-transform:uppercase;letter-spacing:.12em;margin-left:auto}
55
- .section-kicker{color:var(--faint);font-family:var(--font-body);font-size:11.5px;margin-left:4px;align-self:baseline}
56
- .overview-list{display:grid;gap:7px}
57
- .overview-row{display:grid;grid-template-columns:8px minmax(0,1fr) auto;gap:10px;align-items:center;text-align:left;padding:7px 11px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-2);color:var(--text);box-shadow:var(--shadow-card);transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}
58
- .overview-row:hover{border-color:var(--border-strong);box-shadow:0 1px 2px rgba(0,0,0,.32),0 6px 16px rgba(0,0,0,.22)}
59
- .overview-row .status-dot{margin-top:0}
60
- .overview-row-title{min-width:0;font-family:var(--font-body);font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
61
- .overview-row-time{font-family:var(--font-mono);font-size:10px;color:var(--muted);letter-spacing:.02em;white-space:nowrap}
62
- .overview-row.has-inputs .status-dot{background:var(--warning);box-shadow:0 0 8px var(--warning)}
63
- .inbox-empty{display:flex;align-items:center;gap:10px;padding:13px 16px;border:1px dashed var(--border);border-radius:var(--radius);color:var(--muted);font-family:var(--font-body);font-size:12px}
64
- .inbox-empty .dot{width:8px;height:8px;flex:none;border-radius:50%;background:var(--success);box-shadow:0 0 8px var(--success)}
65
- .inbox-list{display:grid;gap:7px}
66
- .inbox-row{display:grid;grid-template-columns:minmax(0,1fr) auto;grid-template-rows:auto auto;gap:3px 14px;width:100%;text-align:left;align-items:center;padding:8px 12px;border:1px solid var(--border);border-left:3px solid var(--warning);background:var(--warning-soft);border-radius:var(--radius);color:var(--text);cursor:pointer;transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}
67
- .inbox-row:hover{border-color:var(--border-strong);box-shadow:var(--shadow-card)}
68
- .inbox-lead{display:flex;align-items:center;gap:9px;min-width:0;grid-column:1}
69
- .inbox-dot{width:8px;height:8px;flex:none;border-radius:50%;background:var(--warning);box-shadow:0 0 8px var(--warning)}
70
- .inbox-head{display:flex;align-items:center;gap:9px;min-width:0}
71
- .inbox-task{font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
72
- .inbox-question{grid-column:1;grid-row:2;font-family:var(--font-body);font-size:13px;font-weight:600;line-height:1.4;color:var(--text);min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
73
- .inbox-foot{grid-column:2;grid-row:1 / span 2;display:flex;flex-direction:column;align-items:flex-end;justify-content:center;gap:4px;flex:none}
74
- .inbox-foot time{color:var(--muted);font-size:10.5px;font-family:var(--font-mono);letter-spacing:.03em}
75
- .inbox-go{color:var(--warning);font-size:11.5px;font-weight:600;font-family:var(--font-body)}
76
- /* Detail head */
77
- .detail-scaffold{display:grid;gap:0;max-width:1100px;margin:0 auto}
78
- .detail-head{display:grid;gap:8px;padding:8px 0 12px;border-bottom:1px solid var(--border)}
79
- .detail-kicker{display:inline-flex;width:fit-content;color:var(--accent);font-family:var(--font-mono);font-size:10px;letter-spacing:.12em;background:var(--accent-soft);border:1px solid var(--accent-line);padding:3px 11px;border-radius:var(--radius-pill)}
80
- .detail-title{margin:0;font-family:var(--font-display);font-weight:600;font-size:clamp(14px,1.1vw,16px);letter-spacing:-.01em;line-height:1.3;color:var(--text)}
81
- .detail-description{font-family:var(--font-body);color:var(--muted);line-height:1.6;margin:0;max-width:76ch;font-size:14px}
82
- .detail-meta{display:flex;align-items:center;gap:8px 18px;flex-wrap:wrap;padding-top:3px}
83
- .detail-meta-item{display:inline-flex;align-items:center;gap:6px;min-width:0}
84
- .detail-meta-item small{color:var(--muted);font-family:var(--font-mono);font-size:9.5px;text-transform:uppercase;letter-spacing:.1em;flex:none}
85
- .detail-meta-item>span{color:var(--text);font-size:12px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
86
- .detail-meta-item>.meta-path{font-family:var(--font-mono);font-size:11px;color:var(--muted);max-width:420px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
87
- .detail-meta-item>.pill{align-self:center}
88
- /* Bands */
89
- .conclusion{padding:13px 16px;border:1px solid var(--success);background:var(--success-soft);border-radius:var(--radius-lg);margin:16px 0;display:grid;gap:7px}
90
- .conclusion h3{margin:0;color:var(--success);letter-spacing:.14em;font-family:var(--font-mono);font-size:10px;text-transform:uppercase;display:flex;align-items:center;gap:10px}
91
- .conclusion h3:before{content:"✓ ";display:grid;place-items:center;width:18px;height:18px;border-radius:50%;background:var(--success);color:var(--on-accent);font-size:11px}
92
- .conclusion p{font-size:14px;margin:0;color:var(--text);font-family:var(--font-body);line-height:1.6}
93
- .conclusion.retired{border-color:var(--warning);background:var(--warning-soft)}
94
- .conclusion.retired h3{color:var(--warning)}
95
- .conclusion.retired h3:before{content:"× ";background:var(--warning);color:var(--on-accent)}
96
- .conclusion.archived{border-color:var(--border-strong);background:var(--bg-2)}
97
- .conclusion.archived h3{color:var(--muted)}
98
- .conclusion.archived h3:before{content:"→ ";background:var(--border-strong);color:var(--text)}
99
- .conclusion-meta{display:flex;gap:14px;flex-wrap:wrap;color:var(--muted);font-size:10.5px;font-family:var(--font-mono);letter-spacing:.02em}
100
- /* Sections */
101
- .detail-section{display:grid;gap:8px;padding:11px 0;border-bottom:1px solid var(--border)}
102
- .detail-section:last-child{border-bottom:0}
103
- .section-body{display:grid;gap:7px}
104
- .row-list{display:grid;gap:7px}
105
- .row{display:flex;justify-content:space-between;align-items:baseline;gap:10px;background:var(--bg-2);border:1px solid var(--border);padding:9px 12px;border-radius:var(--radius);color:var(--muted);font-family:var(--font-body);font-size:12px}
106
- .row.is-empty{justify-content:center;border-style:dashed;color:var(--faint)}
107
- /* Cards */
108
- .record-card{background:var(--bg-2);border:1px solid var(--border);padding:9px 11px;border-radius:var(--radius);box-shadow:var(--shadow-card);transition:border-color var(--motion-fast);display:grid;gap:7px}
109
- .record-card:hover{border-color:var(--border-strong)}
110
- .record-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;min-width:0}
111
- .record-title{font-family:var(--font-body);font-weight:700;font-size:14px;line-height:1.3;color:var(--text);min-width:0}
112
- .record-title-row{display:flex;align-items:center;gap:9px;min-width:0}
113
- .record-title-row .status-dot{margin-top:0}
114
- .record-pills{display:flex;gap:6px;flex-wrap:wrap;flex:none}
115
- .record-meta{display:flex;gap:10px 16px;flex-wrap:wrap;color:var(--muted);font-family:var(--font-mono);font-size:10.5px;letter-spacing:.02em}
116
- .record-meta .meta-name{font-family:var(--font-body);font-size:11px;font-weight:600;color:var(--text)}
117
- .record-meta .mono{color:var(--faint)}
118
- .record-meta time{color:var(--muted)}
119
- .record-cols{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:10px;align-items:start;grid-auto-flow:dense}
120
- .record-cols .is-wide{grid-column:1 / -1}
121
- .work-item-chips{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;align-items:start}
122
- .record-block{display:grid;gap:5px;align-content:start}
123
- .record-block>small{display:block;color:var(--text);font-family:var(--font-body);font-size:13px;font-weight:600;letter-spacing:-.005em;margin-bottom:1px}
124
- .record-block p{margin:0;font-family:var(--font-body);font-size:12px;line-height:1.6;color:var(--text)}
125
- .record-block p.muted,.record-block .muted{color:var(--muted)}
126
- .outcome-callout{border-left:2px solid var(--success);background:var(--success-soft);padding:9px 12px;border-radius:0 var(--radius) var(--radius) 0}
127
- .outcome-callout>small{color:var(--success)}
128
- .record-open{flex:none;display:inline-flex;align-items:center;gap:6px;padding:7px 13px;color:var(--text);background:var(--bg-3);border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font-body);font-size:12px;font-weight:600;transition:border-color var(--motion-fast),color var(--motion-fast),background var(--motion-fast)}
129
- .record-open:hover{border-color:var(--accent-line);color:var(--accent);background:var(--accent-soft)}
130
- .record-open .arrow{font-weight:400;color:var(--faint);transition:transform var(--motion-fast)}
131
- .record-open:hover .arrow{transform:translateX(2px);color:var(--accent)}
132
- /* Collapsible work items (closed records fold into a summary row) */
133
- details.work-item-card>summary.record-head{list-style:none;cursor:pointer}
134
- details.work-item-card>summary.record-head::-webkit-details-marker{display:none}
135
- details.work-item-card>summary.record-head:before{content:"▸";flex:none;color:var(--faint);font-size:11px;margin-top:2px;transition:color var(--motion-fast)}
136
- details.work-item-card[open]>summary.record-head:before{content:"▾";color:var(--muted)}
137
- details.work-item-card>summary.record-head:hover:before{color:var(--accent)}
138
- details.work-item-card>summary.record-head~*{margin-top:0}
139
- /* Input attention cards */
140
- .input-card{border:1px solid var(--warning);background:var(--warning-soft);padding:11px 13px;border-radius:var(--radius);color:var(--text);display:grid;gap:8px}
141
- .input-card-top{display:grid;gap:5px}
142
- .input-card-top small{display:block;color:var(--warning);font-family:var(--font-body);font-size:13px;font-weight:600;letter-spacing:-.005em}
143
- .input-question{font-family:var(--font-body);font-size:14px;font-weight:600;color:var(--text);line-height:1.35}
144
- .input-context{display:flex;align-items:center;gap:10px;flex-wrap:wrap;color:var(--muted);font-family:var(--font-mono);font-size:10.5px;letter-spacing:.02em}
145
- .input-blocked{display:block;padding:8px 12px;border:1px dashed var(--warning);border-radius:var(--radius);color:var(--muted);font-family:var(--font-mono);font-size:10.5px;letter-spacing:.04em}
146
- .input-actions{display:flex;gap:8px;flex-wrap:wrap}
147
- .input-answer{padding:7px 13px;color:var(--text);background:var(--bg-2);border:1px solid var(--border-strong);border-radius:var(--radius);font-family:var(--font-body);font-size:12px;font-weight:600;transition:border-color var(--motion-fast),color var(--motion-fast),background var(--motion-fast)}
148
- .input-answer:hover{border-color:var(--accent-line);color:var(--accent);background:var(--accent-soft)}
149
- .input-form{display:flex;gap:8px;flex:1}
150
- .input-form input{min-width:0;flex:1;padding:8px 12px;color:var(--text);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font-body);font-size:12.5px}
151
- /* Execution AgentRuns */
152
- .run-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(320px,100%),1fr));gap:9px}
153
- .run-filter{margin-bottom:3px}
154
- .execute-card{background:var(--bg-2);border:1px solid var(--border);border-left:2px solid var(--border);border-radius:var(--radius);padding:9px 12px;display:grid;gap:6px;box-shadow:var(--shadow-card);transition:border-color var(--motion-fast)}
155
- .execute-card:hover{border-left-color:var(--border-strong)}
156
- .execute-card[data-status=active]{border-left-color:var(--accent)}
157
- .execute-card[data-status=completed]{border-left-color:var(--success)}
158
- .execute-card[data-status=failed]{border-left-color:var(--danger)}
159
- .execute-id{display:flex;align-items:center;gap:8px;flex-wrap:wrap;color:var(--muted);font-family:var(--font-mono);font-size:10.5px;letter-spacing:.02em}
160
- .execute-id .status-dot{margin-top:0}
161
- .execute-id .role{font-family:var(--font-body);font-weight:700;font-size:14px;color:var(--text)}
162
- .execute-io{display:grid;gap:5px}
163
- .execute-io>small{color:var(--text);font-family:var(--font-body);font-size:13px;font-weight:600;letter-spacing:-.005em}
164
- .execute-io p{margin:0;font-family:var(--font-body);font-size:12px;line-height:1.6;color:var(--text)}
165
- .execute-io.outcome{border-left:2px solid var(--success);background:var(--success-soft);padding:9px 0 9px 12px;border-radius:0 var(--radius) var(--radius) 0}
166
- .execute-io.outcome>small{color:var(--success)}
167
- .execute-foot{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;padding-top:4px}
168
- .execute-tags{display:flex;align-items:center;gap:6px;flex-wrap:wrap;color:var(--muted);font-family:var(--font-mono);font-size:10px;letter-spacing:.05em}
169
- /* Acceptance criteria — dash markers, not checkboxes (they are read-only) */
170
- .criteria-list{margin:0;padding:0;list-style:none;display:grid;gap:6px}
171
- .criteria-list li{position:relative;padding-left:16px;font-family:var(--font-body);font-size:12px;line-height:1.5;color:var(--text)}
172
- .criteria-list li:before{content:"";position:absolute;left:0;top:8px;width:9px;height:2px;border:0;border-radius:2px;background:var(--border-strong)}
173
- .criteria-block.is-collapsed .criteria-list li:nth-child(n+7){display:none}
174
- /* Task-first execution status band */
175
- .exec-band{display:grid;gap:8px;padding:11px 14px;border:1px solid var(--border);border-left:3px solid var(--accent);border-radius:var(--radius-lg);background:var(--bg-2);box-shadow:var(--shadow-card)}
176
- .exec-band.is-danger{border-left-color:var(--danger)}
177
- .exec-band.is-warning{border-left-color:var(--warning)}
178
- .exec-band.is-active{border-left-color:var(--active)}
179
- .exec-band.is-accent{border-left-color:var(--accent)}
180
- .exec-band.is-muted{border-left-color:var(--faint)}
181
- .exec-band-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
182
- .exec-band-owner{color:var(--muted);font-family:var(--font-body);font-size:12px;font-weight:600}
183
- .exec-band-executors{color:var(--active);font-family:var(--font-mono);font-size:10px;letter-spacing:.04em}
184
- .exec-band-stopped{color:var(--faint);font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase}
185
- .exec-band-failclosed{color:var(--danger);font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;border:1px solid var(--danger);padding:2px 8px;border-radius:var(--radius-pill)}
186
- .exec-band-summary{margin:0;font-family:var(--font-body);font-size:13px;line-height:1.55;color:var(--text)}
187
- .exec-signal-list{display:grid;gap:5px}
188
- .exec-signal{display:flex;gap:9px;align-items:baseline;padding:6px 10px;border-radius:var(--radius);font-size:11.5px;line-height:1.45}
189
- .exec-signal.is-attention{background:var(--warning-soft);border:1px solid color-mix(in srgb,var(--warning) 30%,transparent)}
190
- .exec-signal.is-blocker{background:var(--danger-soft);border:1px solid color-mix(in srgb,var(--danger) 30%,transparent)}
191
- .exec-signal-kind{flex:none;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
192
- .exec-signal-text{min-width:0;color:var(--text)}
193
- /* WorkItem execution and recovery */
194
- .exec-group{gap:8px}
195
- .lane-list{display:grid;gap:4px}
196
- .lane-row{display:flex;align-items:center;gap:9px;padding:5px 9px;border-radius:var(--radius);background:var(--bg-3);border:1px solid var(--border);font-size:11.5px}
197
- .lane-row .status-dot{margin-top:0}
198
- .lane-role{font-family:var(--font-body);font-weight:700;font-size:12px;color:var(--text)}
199
- .lane-status{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
200
- .lane-summary{flex:1;min-width:0;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
201
- .execution-resource-meta,.work-item-observability{gap:10px;flex-wrap:wrap}
202
- .execution-resource-meta .chip{margin-left:auto}
203
- .observability-metrics{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:8px;margin-top:12px}
204
- .observability-metrics .metric{min-height:52px;padding:8px 10px}
205
- .observability-metrics .metric-value{font-size:18px}
206
- .observability-context-meta{gap:10px;flex-wrap:wrap;margin-top:7px}
207
- .dag-graph{display:grid;gap:8px}
208
- .dag-node{display:grid;gap:6px;padding:9px 11px;background:var(--bg-2);border:1px solid var(--border);border-left:3px solid var(--faint);border-radius:var(--radius);box-shadow:var(--shadow-card)}
209
- .dag-node.is-ready{border-left-color:var(--accent)}
210
- .dag-node.is-running{border-left-color:var(--active)}
211
- .dag-node.is-blocked,.dag-node.is-failed,.dag-node.is-awaiting_acceptance{border-left-color:var(--danger)}
212
- .dag-node.is-completed{border-left-color:var(--success)}
213
- .dag-node.is-retired{border-left-color:var(--faint)}
214
- .dag-node-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
215
- .dag-node-head .status-dot{margin-top:0}
216
- .dag-node-title{flex:1;min-width:0;font-size:12px;color:var(--text)}
217
- .dag-node-deps{display:flex;align-items:center;gap:6px;flex-wrap:wrap;color:var(--muted);font-family:var(--font-mono);font-size:9.5px}
218
- .dag-node-deps small{margin-right:2px;text-transform:uppercase;letter-spacing:.08em}
219
- .dag-root-cause{color:var(--warning);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.03em}
220
- .chip.is-satisfied{color:var(--success);background:var(--success-soft);border-color:transparent}
221
- .chip.is-active{color:var(--accent);background:var(--accent-soft);border-color:var(--accent-line)}
222
- .chip.is-failed-open,.chip.is-dead{color:var(--danger);background:var(--danger-soft);border-color:transparent}
223
- .exec-resolution{display:flex;gap:9px;align-items:baseline;flex-wrap:wrap;padding:7px 10px;border-radius:var(--radius);background:var(--accent-soft);border:1px solid var(--accent-line)}
224
- .exec-resolution-decision{font-family:var(--font-mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--accent)}
225
- .exec-resolution-summary{flex:1;min-width:0;font-size:12px;color:var(--text)}
226
- .exec-resolution time{color:var(--muted);font-size:10.5px}
227
- /* Candidates */
228
- .candidate-list{display:grid;gap:4px}
229
- .candidate-row{display:flex;align-items:baseline;gap:9px;padding:5px 9px;border-radius:var(--radius);background:var(--bg-3);border:1px solid var(--border);font-size:11.5px}
230
- .candidate-seq{flex:none;font-family:var(--font-mono);font-size:10px;color:var(--faint)}
231
- .candidate-summary{flex:1;min-width:0;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
232
- .candidate-source{flex:none;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}
233
- .candidate-row time{flex:none;color:var(--muted);font-size:10.5px}
234
- /* Sidebar derived execution status */
235
- .task-exec{grid-row:1;grid-column:3;align-self:center;flex:none;font-family:var(--font-mono);font-size:8.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--faint);white-space:nowrap;max-width:90px;overflow:hidden;text-overflow:ellipsis}
236
- .task-exec.is-blocked,.task-exec.is-attention{color:var(--danger)}
237
- .task-exec.is-recovering,.task-exec.is-progressing-with-attention{color:var(--warning)}
238
- .task-exec.is-working,.task-exec.is-waiting-on-agents{color:var(--active)}
239
- .task-exec.is-needs-leader-action{color:var(--accent)}
240
- /* Overview row derived status label */
241
- .overview-row-label{font-family:var(--font-mono);font-size:9.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--warning);white-space:nowrap}
242
- /* Disposition block */
243
- .disposition-block{border-left:2px solid var(--warning);padding-left:10px}
244
- .disposition-block>small{color:var(--warning)}
245
- /* Input requester */
246
- .input-requester{color:var(--muted);font-family:var(--font-mono);font-size:10px;letter-spacing:.02em}
247
- `;
@@ -1,168 +0,0 @@
1
- /*
2
- * WIDGETS — small reusable chrome.
3
- * Base element treatment, sidebar controls, topbar controls, pills / dots /
4
- * chips, filter chips, metric rail, loading / toast. Cards live in cards.ts.
5
- */
6
- export const WIDGET_STYLES = `
7
- html{background:var(--bg);color:var(--text)}
8
- body{background:var(--ambient),var(--bg);background-attachment:fixed;color:var(--text);-webkit-font-smoothing:antialiased;transition:background-color var(--motion-fast),color var(--motion-fast)}
9
- ::selection{background:var(--accent);color:var(--on-accent)}
10
- *{scrollbar-width:thin;scrollbar-color:var(--border-strong) transparent}
11
- ::-webkit-scrollbar{width:10px;height:10px}
12
- ::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:var(--radius-pill);border:2px solid transparent;background-clip:content-box}
13
- ::-webkit-scrollbar-track{background:transparent}
14
- .skip-link{position:fixed;left:14px;top:-56px;background:var(--accent);color:var(--on-accent);padding:10px 15px;border-radius:var(--radius);z-index:80;text-decoration:none;font-size:12px;transition:top var(--motion-fast)}
15
- .skip-link:focus{top:14px}
16
- button{font:inherit;cursor:pointer}
17
- input:focus-visible,select:focus-visible,button:focus-visible,.task:focus-visible,.tab:focus-visible,.overview-row:focus-visible{outline:none;box-shadow:0 0 0 2px var(--bg),0 0 0 4px var(--accent)}
18
- .global-input-dialog{width:min(34rem,calc(100vw - 2rem));max-height:85vh;overflow:auto;color:var(--text);background:var(--bg-1);border:1px solid var(--border-strong);border-radius:var(--radius-lg);padding:var(--page-space)}
19
- .global-input-dialog::backdrop{background:color-mix(in srgb,var(--bg) 75%,transparent)}
20
- .global-input-dialog form,.global-input-dialog label{display:grid;gap:8px}
21
- .global-input-dialog form{gap:14px}
22
- .global-input-dialog p{overflow-wrap:anywhere}
23
- .global-input-dialog form,.global-input-dialog label{min-width:0}
24
- .global-input-dialog input,.global-input-dialog select,.global-input-dialog textarea{width:100%;box-sizing:border-box;padding:10px;color:var(--text);background:var(--bg);border:1px solid var(--border-strong);border-radius:var(--radius)}
25
- .global-input-dialog textarea{min-height:100px}
26
- .global-input-dialog .record-actions{display:flex;flex-wrap:wrap;gap:8px}
27
- .global-input-dialog button{min-height:44px}
28
- .global-input-state{white-space:pre-wrap;overflow-wrap:anywhere;font:12px var(--font-mono)}
29
- .global-input-dialog [hidden]{display:none}
30
- /* Sidebar */
31
- .sidebar{border-right:1px solid var(--border);background:color-mix(in srgb,var(--bg-1) 84%,transparent);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px)}
32
- .brand-mark{width:40px;height:40px;flex:none;display:grid;place-items:center;font-family:var(--font-display);font-size:21px;font-weight:600;color:var(--on-accent);border-radius:11px;background:linear-gradient(140deg,var(--accent),var(--accent-2));box-shadow:var(--glow)}
33
- .sidebar-brand strong{display:block;font-family:var(--font-display);font-size:17px;font-weight:700;letter-spacing:-.01em;line-height:1.1;color:var(--text)}
34
- .sidebar-brand .brand-text span{display:block;color:var(--muted);font-size:10px;letter-spacing:.02em;line-height:1.2}
35
- .sidebar-brand .live{flex:none;width:9px;height:9px;padding:0;border:0;background:transparent}
36
- .sidebar-brand .live i{width:9px;height:9px}
37
- .live{display:flex;align-items:center;justify-content:center;gap:8px;padding:7px 12px;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-2)}
38
- .live i{width:7px;height:7px;flex:none;background:var(--success);border-radius:50%;box-shadow:0 0 10px var(--success);animation:pulse 2.4s ease-in-out infinite}
39
- @keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}
40
- .live span{color:var(--muted);font-size:9px;text-transform:uppercase;letter-spacing:.1em}
41
- .select-control{display:grid;gap:5px;min-width:0;position:relative}
42
- .select-control select{width:100%;min-height:34px;padding:6px 28px 6px 11px;font-size:11px;color:var(--text);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);appearance:none;cursor:pointer;transition:border-color var(--motion-fast)}
43
- .select-control:after{content:"";position:absolute;right:11px;top:50%;width:7px;height:7px;border-right:1.5px solid var(--muted);border-bottom:1.5px solid var(--muted);transform:translateY(-70%) rotate(45deg);pointer-events:none}
44
- .select-control select:hover{border-color:var(--border-strong)}
45
- .eyebrow{color:var(--accent);letter-spacing:.22em;text-transform:uppercase;font-size:9.5px;font-weight:600}
46
- .task-group-head{color:var(--muted);font-family:var(--font-mono);font-size:9.5px;text-transform:uppercase;letter-spacing:.14em}
47
- .task-group-head .count{margin-left:auto;color:var(--muted);font-weight:600}
48
- .search{position:relative;display:flex;align-items:center}
49
- .search:before{content:"◜ ";position:absolute;left:13px;color:var(--faint);font-size:15px;pointer-events:none}
50
- .search input{width:100%;padding:7px 36px 7px 34px;font-family:var(--font-body);font-size:12px;color:var(--text);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-pill);transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}
51
- .search input::placeholder{color:var(--faint)}
52
- .search input:focus{border-color:var(--accent-line);box-shadow:0 0 0 3px var(--accent-soft);outline:none}
53
- .search kbd{position:absolute;right:11px;top:50%;transform:translateY(-50%);pointer-events:none}
54
- kbd{background:var(--bg-3);border:1px solid var(--border);border-bottom-width:2px;border-radius:5px;padding:1px 6px;font-size:11px;color:var(--muted);font-family:var(--font-mono)}
55
- /* Filter chips (sidebar filters + runs filter) */
56
- .filter-row{display:flex;gap:6px;overflow-x:auto;scrollbar-width:none;padding-bottom:2px}
57
- .filter-row::-webkit-scrollbar{display:none}
58
- .filter-chip{flex:none;display:inline-flex;align-items:center;gap:6px;padding:5px 10px;font-family:var(--font-body);font-size:12px;line-height:1.3;color:var(--muted);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius-pill);cursor:pointer;white-space:nowrap;transition:color var(--motion-fast),border-color var(--motion-fast),background var(--motion-fast)}
59
- .filter-chip:hover{color:var(--text);border-color:var(--border-strong)}
60
- .filter-chip.is-active{color:var(--accent);background:var(--accent-soft);border-color:var(--accent-line)}
61
- .filter-count{font-family:var(--font-mono);font-size:10px;color:var(--faint);min-width:14px;text-align:center}
62
- .filter-chip.is-active .filter-count{color:var(--accent)}
63
- .filter-dot{width:7px;height:7px;flex:none;border-radius:50%;background:var(--faint)}
64
- .filter-dot.active{background:var(--active);box-shadow:0 0 6px var(--active)}
65
- .filter-dot.draft{background:var(--warning);box-shadow:0 0 6px var(--warning)}
66
- .filter-dot.completed{background:var(--success);box-shadow:0 0 6px var(--success)}
67
- .filter-dot.failed{background:var(--danger);box-shadow:0 0 6px var(--danger)}
68
- .filter-dot.retired{background:var(--faint)}
69
- .filter-dot.archived{background:var(--muted)}
70
- .filter-chip[data-status=active].is-active{color:var(--active);background:var(--active-soft);border-color:color-mix(in srgb,var(--active) 45%,transparent)}
71
- .filter-chip[data-status=active].is-active .filter-count{color:var(--active)}
72
- .filter-chip[data-status=draft].is-active{color:var(--warning);background:var(--warning-soft);border-color:color-mix(in srgb,var(--warning) 45%,transparent)}
73
- .filter-chip[data-status=draft].is-active .filter-count{color:var(--warning)}
74
- .filter-chip[data-status=completed].is-active{color:var(--success);background:var(--success-soft);border-color:color-mix(in srgb,var(--success) 45%,transparent)}
75
- .filter-chip[data-status=completed].is-active .filter-count{color:var(--success)}
76
- .filter-chip[data-status=archived].is-active{color:var(--muted);background:var(--bg-3);border-color:var(--border-strong)}
77
- .filter-chip[data-status=archived].is-active .filter-count{color:var(--muted)}
78
- /* Sidebar task cards */
79
- .task{display:grid;grid-template-columns:8px minmax(0,1fr) auto;gap:2px 9px;align-items:center;width:100%;text-align:left;padding:5px 9px;border:1px solid transparent;border-radius:var(--radius);background:transparent;color:var(--text);transition:background var(--motion-fast),border-color var(--motion-fast)}
80
- .task:hover{background:var(--bg-2);border-color:var(--border)}
81
- .task[aria-current=true]{background:var(--bg-3);border-color:var(--accent-line);box-shadow:inset 2px 0 var(--accent)}
82
- .task .status-dot{grid-row:1;align-self:center;margin-top:0}
83
- .task-main{grid-row:1;grid-column:2;min-width:0;display:flex;align-items:baseline;gap:8px}
84
- .task-title{flex:1;min-width:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-family:var(--font-body);font-size:12.5px;font-weight:600;line-height:1.3;color:var(--text)}
85
- .task-meta{flex:none;color:var(--muted);font-size:10px;letter-spacing:.01em;line-height:1.2;white-space:nowrap}
86
- .task-signal{grid-row:1;grid-column:3;align-self:center;flex:none;display:inline-grid;place-items:center;min-width:18px;height:18px;padding:0 5px;border-radius:var(--radius-pill);font-family:var(--font-mono);font-size:10px;font-weight:600}
87
- .task-signal.is-input{color:var(--warning);background:var(--warning-soft);border:1px solid var(--warning)}
88
- .task-signal.is-running{color:var(--active);background:var(--active-soft);border:1px solid transparent}
89
- /* Topbar */
90
- .detail-back{width:38px;height:38px;flex:none;display:grid;place-items:center;font-size:18px;line-height:1;color:var(--muted);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);transition:border-color var(--motion-fast),color var(--motion-fast),background var(--motion-fast)}
91
- .detail-back:hover{border-color:var(--accent-line);color:var(--accent);background:var(--accent-soft)}
92
- .crumb{color:var(--muted);font-family:var(--font-mono);font-size:9.5px;text-transform:uppercase;letter-spacing:.14em;white-space:nowrap}
93
- .crumb-sep{color:var(--faint)}
94
- .clock span{color:var(--muted);font-family:var(--font-mono);font-size:9.5px;text-transform:uppercase;letter-spacing:.14em}
95
- .clock time{color:var(--text);font-size:12px;font-variant-numeric:tabular-nums;letter-spacing:.04em}
96
- .refresh{display:inline-flex;align-items:center;gap:8px;padding:9px 14px;color:var(--text);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font-body);font-size:12px;font-weight:600;transition:border-color var(--motion-fast),color var(--motion-fast),background var(--motion-fast)}
97
- .refresh:hover,.refresh:focus-visible{border-color:var(--accent-line);color:var(--accent);background:var(--accent-soft)}
98
- .refresh:disabled{opacity:.5;cursor:wait}
99
- /* Operator session control (top bar, right side).
100
- Kept visually consistent with the refresh button so the topbar actions read
101
- as one family: same background, border, radius, padding, and hover treatment. */
102
- .operator-open{display:inline-flex;align-items:center;gap:8px;flex:none;padding:9px 14px;color:var(--text);background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font-body);font-size:12px;font-weight:600;cursor:pointer;transition:border-color var(--motion-fast),color var(--motion-fast),background var(--motion-fast)}
103
- .operator-open:hover,.operator-open:focus-visible{border-color:var(--accent-line);color:var(--accent);background:var(--accent-soft)}
104
- .operator-title{flex:none;white-space:nowrap}
105
- .operator-shortcuts{display:flex;gap:4px;flex:none}
106
- /* Pills + dots + chips */
107
- .pill{display:inline-flex;align-items:center;font-family:var(--font-mono);font-size:9px;text-transform:uppercase;letter-spacing:.07em;padding:3px 10px;border-radius:var(--radius-pill);white-space:nowrap;color:var(--accent);background:var(--accent-soft);border:1px solid var(--accent-line)}
108
- .pill[data-status=failed],.pill[data-status=urgent],.pill[data-status=required]{color:var(--danger);background:var(--danger-soft);border-color:transparent}
109
- .pill[data-status=active],.pill[data-status=running],
110
- .pill[data-status=user],.pill[data-status=operator]{color:var(--active);background:var(--active-soft);border-color:transparent}
111
- .pill[data-status=completed],.pill[data-status=integrated],.pill[data-status=role-result]{color:var(--success);background:var(--success-soft);border-color:transparent}
112
- .pill[data-status=pending],.pill[data-status=draft],.pill[data-status=recommended],
113
- .pill[data-status=detached]{color:var(--warning);background:var(--warning-soft);border-color:transparent}
114
- .pill[data-status=archived],.pill[data-status=retired],.pill[data-status=superseded],.pill[data-status=abandoned],
115
- .pill[data-status=exited],.pill[data-status=system]{color:var(--muted);background:var(--bg-3);border-color:transparent}
116
- .status-dot{width:8px;height:8px;flex:none;border-radius:50%;background:var(--faint);margin-top:4px}
117
- .status-dot.active{background:var(--active);box-shadow:0 0 8px var(--active)}
118
- .status-dot.completed{background:var(--success);box-shadow:0 0 8px var(--success)}
119
- .status-dot.running{background:var(--active);box-shadow:0 0 8px var(--active)}
120
- .status-dot.succeeded{background:var(--success);box-shadow:0 0 8px var(--success)}
121
- .status-dot.needs-attention{background:var(--warning);box-shadow:0 0 8px var(--warning)}
122
- .status-dot.failed{background:var(--danger);box-shadow:0 0 8px var(--danger)}
123
- .status-dot.draft{background:var(--warning);box-shadow:0 0 8px var(--warning)}
124
- .status-dot.retired{background:var(--faint)}
125
- .status-dot.archived{background:var(--faint)}
126
- .chip{display:inline-flex;align-items:center;font-family:var(--font-mono);font-size:9.5px;letter-spacing:.02em;color:var(--muted);background:var(--bg-3);border:1px solid var(--border);padding:2px 9px;border-radius:var(--radius-pill);white-space:nowrap}
127
- .chip.is-adapter{color:var(--text);font-weight:700}
128
- .chip.is-active{color:var(--accent);background:var(--accent-soft);border-color:var(--accent-line)}
129
- .chip-row{display:flex;gap:6px;flex-wrap:wrap}
130
- .agent-badge{display:inline-flex;gap:5px;flex-wrap:wrap;align-items:center}
131
- /* Command rail = 4 metric tiles */
132
- .command-rail{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin-bottom:18px}
133
- .metric{background:var(--bg-2);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow-card);padding:10px 12px;display:flex;align-items:center;justify-content:space-between;gap:12px;position:relative;overflow:hidden;transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}
134
- .metric:hover{border-color:var(--border-strong);box-shadow:0 1px 2px rgba(0,0,0,.32),0 6px 16px rgba(0,0,0,.22)}
135
- .metric-label{color:var(--muted);font-family:var(--font-mono);font-size:10px;text-transform:uppercase;letter-spacing:.12em;line-height:1.2}
136
- .metric-value{font-family:var(--font-display);font-weight:700;font-size:24px;line-height:1;letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--text);flex:none}
137
- .metric.is-hot{border-color:var(--accent-line)}
138
- .metric.is-hot:before{content:"";position:absolute;inset:0;background:radial-gradient(170px 90px at 100% 0,var(--accent-soft),transparent 70%);pointer-events:none}
139
- .metric.is-hot .metric-value{color:var(--accent)}
140
- .metric.is-warning{border-color:var(--warning)}
141
- .metric.is-warning:before{content:"";position:absolute;inset:0;background:radial-gradient(170px 90px at 100% 0,var(--warning-soft),transparent 70%);pointer-events:none}
142
- .metric.is-warning .metric-value{color:var(--warning)}
143
- /* Terminal panel */
144
- .terminal-panel{color:#e8eef6;background:#080b11;border-left:1px solid #263244;box-shadow:var(--shadow-pop)}
145
- .conversation-panel{color:var(--text);background:var(--bg-1);border-left:1px solid var(--border);box-shadow:var(--shadow-card)}
146
- .conversation-head{border-bottom:1px solid var(--border);background:var(--bg-2)}
147
- .conversation-eyebrow{color:var(--muted)}
148
- .pane-action{display:grid;place-items:center;width:34px;height:34px;padding:0;border:1px solid var(--border);border-radius:var(--radius);background:var(--bg-1);color:var(--text);font:inherit;font-size:20px;cursor:pointer}
149
- .pane-action:hover,.pane-action:focus-visible{border-color:var(--accent);color:var(--accent)}
150
- .terminal-head{background:#0c111a;border-bottom:1px solid #263244}
151
- .terminal-head h2{font-family:var(--font-display);font-size:15px;color:#e8eef6}
152
- .terminal-close{display:grid!important;color:#8b99ad;background:#111826;border-color:#263244}
153
- .terminal-host .xterm{height:100%}
154
- .terminal-host .xterm-viewport{scrollbar-width:none}
155
- .terminal-host .xterm-viewport::-webkit-scrollbar{display:none}
156
- .terminal-hint p{margin:0;color:#8b99ad;font-family:var(--font-body)}
157
- .terminal-hint-cli a{display:inline-block;margin-top:6px;padding:6px 14px;font-family:var(--font-mono);font-size:13.5px;color:var(--accent);background:var(--accent-soft);border:1px solid var(--accent-line);border-radius:var(--radius);text-decoration:none}
158
- .terminal-hint-cli a:hover{color:var(--on-accent);background:var(--accent)}
159
- .terminal-hint-note{font-size:11px;color:var(--faint)}
160
- /* Loading / empty / toast */
161
- .loading,.empty,.error{padding:46px 16px;color:var(--muted);text-align:center;font-size:12px;letter-spacing:.04em;font-family:var(--font-body)}
162
- .error{color:var(--danger)}
163
- .loading:before{content:"";display:block;width:20px;height:20px;margin:0 auto 14px;border:2px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite}
164
- @keyframes spin{to{transform:rotate(360deg)}}
165
- .toast{position:fixed;right:22px;bottom:22px;z-index:90;max-width:340px;background:var(--danger);color:#fff;padding:13px 17px;border-radius:var(--radius);box-shadow:var(--shadow-pop);transform:translateY(130px);opacity:0;transition:transform var(--motion-slow),opacity var(--motion-slow)}
166
- .toast.show{transform:none;opacity:1}
167
- .sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
168
- `;