codehere 1.0.1 → 1.0.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.
Files changed (163) hide show
  1. package/README.md +35 -193
  2. package/dist/application/use-cases/check-claimed-tests.js +81 -0
  3. package/dist/application/use-cases/detect-test-weakening.js +237 -0
  4. package/dist/application/use-cases/rerun-tests.js +110 -7
  5. package/dist/index.js +38 -1212
  6. package/dist/infrastructure/orchestration/artifacts-extractor.js +2 -323
  7. package/dist/presentation/cli/commands/check-command.js +178 -23
  8. package/dist/presentation/cli/commands/help-command.js +21 -285
  9. package/dist/ui.js +5 -236
  10. package/dist/utils/version.js +0 -6
  11. package/package.json +9 -38
  12. package/dist/application/services/verdict-service.js +0 -154
  13. package/dist/application/use-cases/assess-cross-vendor.js +0 -126
  14. package/dist/application/use-cases/build-cross-vendor-verdict.js +0 -118
  15. package/dist/application/use-cases/domain-trust.js +0 -110
  16. package/dist/application/use-cases/export-aat.js +0 -107
  17. package/dist/application/use-cases/generate-acceptance-criteria.js +0 -223
  18. package/dist/application/use-cases/generate-final-report.js +0 -259
  19. package/dist/application/use-cases/generate-narration.js +0 -130
  20. package/dist/application/use-cases/generate-thread-title.js +0 -181
  21. package/dist/application/use-cases/narrator-prompt-template.js +0 -158
  22. package/dist/application/use-cases/plan-auto-review.js +0 -57
  23. package/dist/application/use-cases/reconcile-audit.js +0 -100
  24. package/dist/application/use-cases/search-sessions.js +0 -70
  25. package/dist/application/use-cases/should-auto-review.js +0 -71
  26. package/dist/application/use-cases/thread-export.js +0 -245
  27. package/dist/application/use-cases/verify-claim.js +0 -456
  28. package/dist/application/use-cases/write-pass.js +0 -277
  29. package/dist/domain/audit.js +0 -11
  30. package/dist/domain/services/codebase-detector.js +0 -85
  31. package/dist/domain/task.js +0 -91
  32. package/dist/error-handler.js +0 -139
  33. package/dist/infrastructure/completion/bash-completion.js +0 -29
  34. package/dist/infrastructure/completion/fish-completion.js +0 -17
  35. package/dist/infrastructure/completion/zsh-completion.js +0 -25
  36. package/dist/infrastructure/config/config-manager.js +0 -174
  37. package/dist/infrastructure/config/product-context.js +0 -49
  38. package/dist/infrastructure/context/adapters/drawio-source.js +0 -157
  39. package/dist/infrastructure/context/adapters/figma-source.js +0 -198
  40. package/dist/infrastructure/context/adapters/github-issue-source.js +0 -160
  41. package/dist/infrastructure/context/adapters/linear-source.js +0 -190
  42. package/dist/infrastructure/context/context-resolver.js +0 -144
  43. package/dist/infrastructure/context/context-source.js +0 -114
  44. package/dist/infrastructure/context/github-api.js +0 -110
  45. package/dist/infrastructure/context/github-device-flow.js +0 -65
  46. package/dist/infrastructure/context/oauth-flow.js +0 -207
  47. package/dist/infrastructure/context/oauth-store.js +0 -122
  48. package/dist/infrastructure/context/registry-bootstrap.js +0 -95
  49. package/dist/infrastructure/context/write-pass-resolver.js +0 -106
  50. package/dist/infrastructure/cost/budget-config.js +0 -114
  51. package/dist/infrastructure/cost/cost-router.js +0 -97
  52. package/dist/infrastructure/cost/spend-aggregator.js +0 -222
  53. package/dist/infrastructure/cost/team-ledger.js +0 -355
  54. package/dist/infrastructure/discovery/discovery-log.js +0 -85
  55. package/dist/infrastructure/hooks/audit-tip-signature.js +0 -336
  56. package/dist/infrastructure/hooks/claude-sdk-hook.js +0 -1018
  57. package/dist/infrastructure/hooks/hook-mode.js +0 -87
  58. package/dist/infrastructure/hooks/mirror-tool-call-to-audit.js +0 -49
  59. package/dist/infrastructure/hooks/pre-prompt-scan.js +0 -122
  60. package/dist/infrastructure/hooks/session-analyzer.js +0 -177
  61. package/dist/infrastructure/observability/execution-tracer.js +0 -227
  62. package/dist/infrastructure/orchestration/agent-adapter.js +0 -13
  63. package/dist/infrastructure/orchestration/agent-installer.js +0 -101
  64. package/dist/infrastructure/orchestration/agents-config-seed.js +0 -68
  65. package/dist/infrastructure/orchestration/aider-adapter.js +0 -611
  66. package/dist/infrastructure/orchestration/cassette-recorder.js +0 -120
  67. package/dist/infrastructure/orchestration/claude-code-adapter.js +0 -592
  68. package/dist/infrastructure/orchestration/codex-adapter.js +0 -574
  69. package/dist/infrastructure/orchestration/conductor-adapter.js +0 -416
  70. package/dist/infrastructure/orchestration/context-handoff.js +0 -162
  71. package/dist/infrastructure/orchestration/control/codex-control-surface.js +0 -99
  72. package/dist/infrastructure/orchestration/control/control-surface.js +0 -15
  73. package/dist/infrastructure/orchestration/detect-ollama.js +0 -75
  74. package/dist/infrastructure/orchestration/failover-classifier.js +0 -151
  75. package/dist/infrastructure/orchestration/failover-config.js +0 -67
  76. package/dist/infrastructure/orchestration/failover-policy.js +0 -106
  77. package/dist/infrastructure/orchestration/gemini-adapter.js +0 -663
  78. package/dist/infrastructure/orchestration/generic-cli-adapter.js +0 -689
  79. package/dist/infrastructure/orchestration/graphify-context.js +0 -209
  80. package/dist/infrastructure/orchestration/memory-injector.js +0 -380
  81. package/dist/infrastructure/orchestration/mocks/mock-agent-repl.js +0 -388
  82. package/dist/infrastructure/orchestration/mocks/mock-codex-app-server.js +0 -73
  83. package/dist/infrastructure/orchestration/mocks/mock-synthesis.js +0 -83
  84. package/dist/infrastructure/orchestration/mocks/resolve-agent-spawn.js +0 -37
  85. package/dist/infrastructure/orchestration/opencode-adapter.js +0 -580
  86. package/dist/infrastructure/orchestration/progress-aggregator.js +0 -906
  87. package/dist/infrastructure/orchestration/readiness.js +0 -103
  88. package/dist/infrastructure/orchestration/session-manager.js +0 -1590
  89. package/dist/infrastructure/orchestration/session-persistence.js +0 -394
  90. package/dist/infrastructure/orchestration/thread-key-store.js +0 -127
  91. package/dist/infrastructure/orchestration/write-pass-store.js +0 -38
  92. package/dist/infrastructure/protocols/cloud-sync.js +0 -207
  93. package/dist/infrastructure/protocols/mcp-helpers.js +0 -25
  94. package/dist/infrastructure/protocols/mcp-server-impl.js +0 -3935
  95. package/dist/infrastructure/protocols/mcp-tools.js +0 -401
  96. package/dist/infrastructure/protocols/probe-port.js +0 -36
  97. package/dist/infrastructure/protocols/thread-phase.js +0 -105
  98. package/dist/infrastructure/protocols/ui/app-script-artifacts.js +0 -121
  99. package/dist/infrastructure/protocols/ui/app-script-audit-footer.js +0 -44
  100. package/dist/infrastructure/protocols/ui/app-script-audit-verify.js +0 -56
  101. package/dist/infrastructure/protocols/ui/app-script-composer-cost.js +0 -588
  102. package/dist/infrastructure/protocols/ui/app-script-context-sources.js +0 -168
  103. package/dist/infrastructure/protocols/ui/app-script-conversation.js +0 -67
  104. package/dist/infrastructure/protocols/ui/app-script-drawer.js +0 -115
  105. package/dist/infrastructure/protocols/ui/app-script-failover.js +0 -133
  106. package/dist/infrastructure/protocols/ui/app-script-github.js +0 -113
  107. package/dist/infrastructure/protocols/ui/app-script-observer.js +0 -104
  108. package/dist/infrastructure/protocols/ui/app-script-onboarding.js +0 -80
  109. package/dist/infrastructure/protocols/ui/app-script-overlay.js +0 -203
  110. package/dist/infrastructure/protocols/ui/app-script-recovery.js +0 -136
  111. package/dist/infrastructure/protocols/ui/app-script-render.js +0 -166
  112. package/dist/infrastructure/protocols/ui/app-script-share.js +0 -78
  113. package/dist/infrastructure/protocols/ui/app-script-sidebar.js +0 -194
  114. package/dist/infrastructure/protocols/ui/app-script-tour.js +0 -78
  115. package/dist/infrastructure/protocols/ui/app-script-wpass.js +0 -312
  116. package/dist/infrastructure/protocols/ui/app-script.js +0 -2998
  117. package/dist/infrastructure/protocols/ui/font-faces.js +0 -7
  118. package/dist/infrastructure/protocols/ui/styles.js +0 -2147
  119. package/dist/infrastructure/protocols/ui/tokens.js +0 -96
  120. package/dist/infrastructure/protocols/ui-page-v2.js +0 -320
  121. package/dist/infrastructure/protocols/verify-page.js +0 -1677
  122. package/dist/infrastructure/security/file-collection.js +0 -118
  123. package/dist/infrastructure/security/fix-code.js +0 -144
  124. package/dist/infrastructure/security/fix-secret.js +0 -89
  125. package/dist/infrastructure/security/permissions-config.js +0 -235
  126. package/dist/infrastructure/security/scan-types.js +0 -10
  127. package/dist/infrastructure/security/ship-scan.js +0 -195
  128. package/dist/infrastructure/security/trust-scorer.js +0 -724
  129. package/dist/infrastructure/security/vibe-checks.js +0 -99
  130. package/dist/infrastructure/storage/atomic-write.js +0 -86
  131. package/dist/infrastructure/storage/cross-tool-agents.js +0 -268
  132. package/dist/infrastructure/storage/project-thread-migration.js +0 -237
  133. package/dist/infrastructure/storage/project-thread-mirror.js +0 -671
  134. package/dist/infrastructure/storage/project-thread-reader.js +0 -409
  135. package/dist/infrastructure/storage/project-thread-title-backfill.js +0 -214
  136. package/dist/monitoring.js +0 -212
  137. package/dist/presentation/cli/commands/audit-command.js +0 -201
  138. package/dist/presentation/cli/commands/budget-command.js +0 -79
  139. package/dist/presentation/cli/commands/config-command.js +0 -125
  140. package/dist/presentation/cli/commands/context-source-command.js +0 -217
  141. package/dist/presentation/cli/commands/hook-command.js +0 -265
  142. package/dist/presentation/cli/commands/init-command.js +0 -590
  143. package/dist/presentation/cli/commands/memory-command.js +0 -1031
  144. package/dist/presentation/cli/commands/narrator-command.js +0 -101
  145. package/dist/presentation/cli/commands/permission-command.js +0 -105
  146. package/dist/presentation/cli/commands/protocols-builder.js +0 -254
  147. package/dist/presentation/cli/commands/protocols-command.js +0 -84
  148. package/dist/presentation/cli/commands/repo-map-builder.js +0 -247
  149. package/dist/presentation/cli/commands/report-command.js +0 -403
  150. package/dist/presentation/cli/commands/scan-command.js +0 -52
  151. package/dist/presentation/cli/commands/scan-tool-command.js +0 -110
  152. package/dist/presentation/cli/commands/search-command.js +0 -51
  153. package/dist/presentation/cli/commands/setup-command.js +0 -330
  154. package/dist/presentation/cli/commands/status-command.js +0 -614
  155. package/dist/presentation/cli/commands/team-command.js +0 -256
  156. package/dist/presentation/cli/commands/thread-command.js +0 -370
  157. package/dist/presentation/cli/commands/trust-command.js +0 -328
  158. package/dist/presentation/cli/commands/verify-command.js +0 -298
  159. package/dist/presentation/cli/error-display.js +0 -328
  160. package/dist/presentation/cli/repl.js +0 -805
  161. package/dist/presentation/cli/task-deliverable.js +0 -153
  162. package/dist/testing/cassette.js +0 -125
  163. package/dist/testing/replay-adapter.js +0 -147
@@ -1,2147 +0,0 @@
1
- import { DESIGN_TOKENS } from './tokens.js';
2
- export const SHARED_STYLES = `${DESIGN_TOKENS}
3
- /* ════ S12 design tokens · ONE system shared with the landing ════
4
- * Two hues over neutral glass: orange = primary (brand, primary action,
5
- * focus) · blue = secondary (links, info). Semantic state colors are for
6
- * STATE ONLY, never decoration: green appears ONLY where something was
7
- * verified / allowed · amber = caught / partial · red = danger / stop.
8
- * The per-agent rainbow is dead: agent identity = monochrome initials
9
- * chip + the agent's NAME, never a hue.
10
- *
11
- * ════ S19 glyph language (BINDING · web + CLI) ════
12
- * NEVER emoji-as-icon. Status/meaning is carried by the sanctioned
13
- * geometric set + mono text labels + the semantic colors above:
14
- * done/ok ✓ · failed ✕ · running ● · queued ○ · list • · sep · —
15
- * killed/blocked ⊘ · affordance/flow › · warn ⚠ (only beside words)
16
- * Plus exactly two arrows: ↑ ONLY on the send button, ← ONLY for back.
17
- * Keyboard hints (⌘ / ⏎ inside .kbd spans or btn key chips) are keyboard
18
- * symbols, not icons. A single-stroke inline SVG (currentColor, one
19
- * stroke width) is allowed ONLY where an icon is genuinely irreplaceable.
20
- * The ban is emoji-AS-ICON (chrome), never emoji a user typed: containers
21
- * that render user/run CONTENT (prompts, say/think text, reports, step
22
- * labels/outputs, goal/room titles from folder names or AI thread titles,
23
- * cwd paths, write-pass intent fields: title/reason/target/payload) carry
24
- * data-user-content and are excluded from the scan. ANY new container that
25
- * renders user- or agent-derived values MUST carry data-user-content.
26
- * Any emoji/pictograph codepoint reaching the rendered CHROME is a
27
- * regression — /verify's H15 glyph-discipline invariant FAILS the board. */
28
- /* ════ S22 voice standard (BINDING · web + CLI) ════
29
- * Every user-facing string obeys from birth:
30
- * - Say the thing, never that you're saying it honestly. NO self-narration
31
- * of the product's own honesty/design ("and that's honest", "no demo
32
- * rows", "an honest disable, not a dead button"). Honesty reads from
33
- * BEHAVIOR, not commentary.
34
- * - Status = word + number ("12 passed", "Stopped"), not a sentence.
35
- * - Explanation = one concrete sentence. Teach/empty copy ≤ 2 short
36
- * sentences. Tooltip ≤ 1 sentence.
37
- * - Separator is · (the house middot), never an em dash. Em dash survives
38
- * ONLY as a typographic empty-value placeholder ("—" for no value), the
39
- * two left in this file. New copy with an em dash is a regression. */
40
- /* Tokens live in ./tokens.ts and are prepended above — one :root for every
41
- page the daemon serves, so /verify cannot drift its own palette again. */
42
- * { box-sizing: border-box; margin: 0; }
43
- /* AX (R7/R8) · visible keyboard focus on every interactive element. :focus-visible
44
- fires on keyboard nav, never on mouse click, so it adds zero mouse-UI noise.
45
- Text inputs keep their border-color focus treatment (no double ring). */
46
- :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
47
- input:focus-visible, textarea:focus-visible, [contenteditable]:focus-visible { outline: none; }
48
- /* AX · honor reduced-motion everywhere (R8): kill reveals/seal/shimmer/transitions. */
49
- @media (prefers-reduced-motion: reduce) {
50
- *, *::before, *::after {
51
- animation-duration: .001ms !important; animation-iteration-count: 1 !important;
52
- transition-duration: .001ms !important; scroll-behavior: auto !important;
53
- }
54
- }
55
- body {
56
- margin: 0; background: var(--bg); color: var(--fg);
57
- font-family: var(--sans); font-size: 13px; line-height: 1.55;
58
- -webkit-font-smoothing: antialiased; height: 100vh; overflow: hidden;
59
- position: relative;
60
- }
61
- /* Ambient dot-grid backdrop · matches demo v12 + landing globals.css.
62
- * Very faint blue dots on 24px grid · adds depth without distraction so
63
- * the cards above visibly "lift" off a textured surface. Fixed position
64
- * so it stays put while content scrolls. */
65
- body::before {
66
- content: ''; position: fixed; inset: 0;
67
- background-image: radial-gradient(circle, var(--glass-3) 1px, transparent 1px);
68
- background-size: 24px 24px;
69
- pointer-events: none; z-index: 0; opacity: 0.7;
70
- }
71
- .app { height: 100vh; display: flex; flex-direction: column; position: relative; z-index: 1; }
72
-
73
- /* Header · glass · matches demo v12 + landing globals · darker tint
74
- * with backdrop blur + saturate so the header sits visibly above the
75
- * scroll content beneath it. */
76
- .header {
77
- display: flex; align-items: center; gap: 14px;
78
- padding: 10px 20px; border-bottom: 1px solid var(--border-soft);
79
- /* warm glass — the neutral rgba(0,0,0,.55) tint made the header a
80
- colorless strip over the warm body (the "weird colours" seam). */
81
- background: rgba(20, 18, 16, 0.62);
82
- background: color-mix(in srgb, var(--bg) 62%, transparent);
83
- backdrop-filter: blur(16px) saturate(140%);
84
- -webkit-backdrop-filter: blur(16px) saturate(140%);
85
- flex-shrink: 0;
86
- }
87
- /* Brand wordmark · matches the landing's rendered nav wordmark
88
- * (codehere-landing components/ui/floating-nav.tsx, class gradient-text):
89
- * lowercase 'codehere' in the 135° orange->blue gradient, NO dot — the
90
- * landing carries none, so neither do we (S16 brand-sync; also keeps S13's
91
- * orange budget intact). First thing every user sees on every screen. */
92
- .logo { font-size: 14.5px; font-weight: 700; display: inline-flex; align-items: center; gap: 7px; letter-spacing: -0.01em; }
93
- .logo .prerelease { font-size: 10.5px; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: #e5c07b; background: rgba(229,192,123,0.12); border: 1px solid rgba(229,192,123,0.32); border-radius: 4px; padding: 1px 5px; position: relative; top: -1px; cursor: default; }
94
- .logo .name {
95
- background: linear-gradient(135deg, #ff9a76 0%, #4a90e2 100%);
96
- -webkit-background-clip: text; background-clip: text;
97
- -webkit-text-fill-color: transparent; color: transparent;
98
- letter-spacing: -0.01em;
99
- }
100
-
101
- /* A-04 · local-first status pill · pinned next to the logo so the privacy
102
- * promise is the SECOND thing every user sees · zero telemetry, all data
103
- * on this machine. The pulsing dot says "still alive" without occupying
104
- * focus. */
105
- .local-pill {
106
- display: inline-flex; align-items: center; gap: 6px;
107
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-50);
108
- padding: 3px 8px; border: 1px solid var(--border); border-radius: 999px;
109
- background: rgba(132,181,148,0.04);
110
- }
111
- .local-pill .dot {
112
- width: 6px; height: 6px; border-radius: 50%;
113
- background: var(--fg-70); animation: pulse 2.4s ease infinite;
114
- }
115
- .local-pill:hover { color: var(--fg-70); border-color: var(--fg-30); }
116
-
117
-
118
- /* Header budget chip · matches demo v12 spec · bordered chip with padding
119
- * so the cost signal looks like a deliberate object, not a stray number. */
120
- .budget {
121
- margin-left: auto; font-family: var(--mono); font-size: 12px;
122
- color: var(--fg-70); padding: 3px 9px;
123
- border: 1px solid var(--border); border-radius: 4px;
124
- letter-spacing: 0.02em;
125
- }
126
- .budget.safe { color: var(--fg-70); border-color: var(--border); }
127
- .budget.warn { color: var(--warn); border-color: rgba(217,164,65,0.4); background: rgba(217,164,65,0.04); }
128
- .budget.block { color: var(--caught); border-color: rgba(207,139,126,0.4); background: rgba(207,139,126,0.05); font-weight: 600; }
129
-
130
- /* D-01 · file tree with trust grades · in the task detail · render each
131
- * file as a chip with +N/-M diff counts and a trust grade pill. */
132
- .file-chip {
133
- display: inline-flex; align-items: center; gap: 8px;
134
- padding: 5px 10px; margin: 4px 6px 4px 0;
135
- border: 1px solid var(--border-soft); border-radius: 6px;
136
- background: rgba(255,255,255,0.02);
137
- font-family: var(--mono); font-size: 12px;
138
- }
139
- .file-chip .path { color: var(--fg-90); }
140
- .file-chip .added { color: var(--verified); font-size: 10.5px; }
141
- .file-chip .removed { color: var(--caught); font-size: 10.5px; }
142
- .file-chip .trust { font-size: 10.5px; padding: 1px 5px; border-radius: 3px; font-weight: 600; }
143
- .file-chip .trust.A { color: var(--verified); background: rgba(132,181,148,0.10); }
144
- .file-chip .trust.B { color: var(--verified); background: rgba(132,181,148,0.06); }
145
- .file-chip .trust.C { color: var(--warn); background: rgba(217,164,65,0.10); }
146
- .file-chip .trust.F { color: var(--caught); background: rgba(207,139,126,0.10); }
147
- /* S14 · files as quiet mono chips ("path +adds −dels" + trust grade) ·
148
- * the container keeps the .file-tree class + filetree data-verify contract */
149
- .file-tree.fileschips { display: flex; gap: 8px; flex-wrap: wrap; font-family: var(--mono); font-size: 12px; margin: 4px 0 10px; }
150
- .fchip { color: var(--fg-50); border: 1px solid var(--border); border-radius: 6px; padding: 4px 10px; display: inline-flex; gap: 6px; align-items: baseline; }
151
- .fchip b { color: var(--fg-80); font-weight: 500; }
152
- .fchip .added { color: var(--verified); font-size: 10.5px; }
153
- .fchip .removed { color: var(--caught); font-size: 10.5px; }
154
- .fchip .trust { font-size: 10.5px; padding: 1px 5px; border-radius: 3px; font-weight: 600; }
155
- .fchip .trust.A { color: var(--verified); background: rgba(132,181,148,0.10); }
156
- .fchip .trust.B { color: var(--verified); background: rgba(132,181,148,0.06); }
157
- .fchip .trust.C { color: var(--warn); background: rgba(217,164,65,0.10); }
158
- .fchip .trust.F { color: var(--caught); background: rgba(207,139,126,0.10); }
159
-
160
- /* Inline code-card · matches demo v12 (lines 441-454) · renders when an
161
- * artifact file carries a .snippet. Dark VS-Code-ish surface with mono
162
- * font, line numbers, lightweight syntax tinting via .kw/.fn/.str/.num/.cm.
163
- * Lives directly under the file-chip strip so the reviewer can SEE what
164
- * the agent wrote, not just "+118 lines". */
165
- .code-card {
166
- background: hsl(0 0% 12%); border: 1px solid var(--border);
167
- border-radius: 6px; overflow: hidden; margin: 6px 0 10px;
168
- }
169
- .code-card .head {
170
- padding: 7px 12px; background: rgba(255,255,255,0.03);
171
- border-bottom: 1px solid var(--border-soft);
172
- display: flex; align-items: center; gap: 8px;
173
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-50);
174
- }
175
- .code-card .head .lang { color: var(--fg-30); }
176
- .code-card .head .path { color: var(--fg-70); }
177
- .code-card .head .meta { margin-left: auto; color: var(--fg-30); font-size: 10.5px; }
178
- .code-card pre {
179
- margin: 0; padding: 11px 14px;
180
- font-family: var(--mono); font-size: 12px; line-height: 1.6;
181
- color: var(--fg-70); overflow-x: auto; white-space: pre;
182
- }
183
- .code-card .ln {
184
- display: inline-block; width: 26px; text-align: right; margin-right: 12px;
185
- color: var(--fg-20); user-select: none;
186
- }
187
- .code-card .kw { color: #c586c0; }
188
- .code-card .fn { color: #dcdcaa; }
189
- .code-card .str { color: #ce9178; }
190
- .code-card .num { color: #b5cea8; }
191
- .code-card .cm { color: #6a9955; font-style: italic; }
192
- .code-card .tp { color: #4ec9b0; }
193
-
194
- /* Report markdown · agent prose rendered with real code blocks, inline code,
195
- bold and lists (was raw-escaped text leaking literal fence + backtick marks). */
196
- .report-md .rep-p { margin: 8px 0; color: var(--fg-90); font-size: 13px; line-height: 1.6; }
197
- .report-md .rep-p:first-child { margin-top: 0; }
198
- .report-md .rep-list { margin: 8px 0; padding-left: 20px; color: var(--fg-90); font-size: 13px; line-height: 1.6; }
199
- .report-md .rep-list li { margin: 3px 0; }
200
- .report-md .rep-h { margin: 14px 0 6px; color: var(--fg); font-weight: 600; line-height: 1.35; }
201
- .report-md .rep-h:first-child { margin-top: 0; }
202
- .report-md h3.rep-h { font-size: 14.5px; }
203
- .report-md h4.rep-h, .report-md h5.rep-h, .report-md h6.rep-h { font-size: 13px; }
204
- .report-md .rep-table { border-collapse: collapse; margin: 10px 0; max-width: 100%; font-size: 12px; line-height: 1.5; }
205
- .report-md .rep-table th, .report-md .rep-table td { border: 1px solid var(--border); padding: 5px 9px; text-align: left; vertical-align: top; color: var(--fg-90); word-break: break-word; overflow-wrap: anywhere; }
206
- .report-md .rep-table th { background: rgba(255,255,255,.04); font-weight: 600; color: var(--fg); }
207
- .report-md .ic, .tl-say-text .ic {
208
- font-family: var(--mono); font-size: 12px;
209
- background: var(--bg-raise, rgba(255,255,255,.06)); color: var(--fg);
210
- padding: 1px 5px; border-radius: 4px; border: 1px solid var(--border-soft);
211
- }
212
- .report-md .code-card { margin: 10px 0; }
213
-
214
- /* Live running action — the agent's current move, pulsing, updated as the
215
- timeline streams. Replaces the useless "0 of N steps done" counter. */
216
- .run-now { display: flex; align-items: center; gap: 9px; margin: 2px 0 7px; font-size: 14.5px; color: var(--fg); font-weight: 500; }
217
- .run-pulse { width: 8px; height: 8px; border-radius: 50%; background: var(--accent, #ff9a76); flex: none; animation: runPulse 1.15s ease-in-out infinite; }
218
- @keyframes runPulse { 0% { box-shadow: 0 0 0 0 rgba(255,154,118,.5); } 70% { box-shadow: 0 0 0 7px rgba(255,154,118,0); } 100% { box-shadow: 0 0 0 0 rgba(255,154,118,0); } }
219
- .run-now-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
220
- .run-sub { color: var(--fg-50); font-size: 12px; font-family: var(--mono); margin-top: 2px; }
221
-
222
- /* D-04 test-chip retired (S14) — test counts live in the evidence table's
223
- * CHECKED row, with provenance (re-run vs as-reported) in the verdict meta. */
224
-
225
-
226
- /* C-01 · first-run indexing banner · shows once per first-task, then fades */
227
- .indexing-banner {
228
- display: none;
229
- padding: 6px 14px; margin-bottom: 10px;
230
- background: var(--glass-3); border: 1px solid var(--glass-3);
231
- border-radius: 6px;
232
- font-family: var(--mono); font-size: 12px; color: var(--fg-70);
233
- }
234
- .indexing-banner .what { color: var(--fg-70); font-weight: 600; margin-right: 6px; }
235
-
236
-
237
- /* E-03 · hook BLOCK affordance · override-with-reason · red-bordered card
238
- * with 3 action buttons. */
239
- .hook-block-card {
240
- border: 1px solid rgba(207,139,126,0.35); border-radius: 8px;
241
- padding: 12px 14px; margin: 10px 0;
242
- background: rgba(207,139,126,0.04);
243
- }
244
- .hook-block-title { font-family: var(--mono); font-size: 10.5px; color: var(--caught); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px; }
245
- .hook-block-msg { color: var(--fg-90); font-size: 13px; margin-bottom: 10px; }
246
- .hook-block-actions { display: flex; gap: 8px; }
247
- .hook-block-actions button {
248
- font-family: var(--mono); font-size: 12px;
249
- padding: 5px 12px; border-radius: 5px; cursor: pointer;
250
- border: 1px solid var(--border); background: transparent; color: var(--fg-70);
251
- }
252
- .hook-block-actions button:hover { color: var(--fg); border-color: var(--fg-30); }
253
-
254
- /* E-07 · push gate · same hook-block pattern but warn-tinted for git push */
255
- .push-gate-card {
256
- border: 1px solid rgba(217,164,65,0.35); border-radius: 8px;
257
- padding: 12px 14px; margin: 10px 0;
258
- background: rgba(217,164,65,0.04);
259
- }
260
- .push-gate-title { font-family: var(--mono); font-size: 10.5px; color: var(--warn); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 6px; }
261
-
262
- /* P3 · Recovery affordance · session-level failure with explanatory copy
263
- + user options (retry · diagnose · mark resolved). Demo v12 U10 spec.
264
- Distinct from hook-block (agent BLOCKED by safety) — recovery covers
265
- agent CRASHED / errored without a deliberate block. */
266
- /* S14 · "Your call" dress — accent = needs-your-decision (rule 2: orange
267
- * means exactly one thing), quiet left rule instead of the red alarm box. */
268
- .recovery-card {
269
- border-left: 2px solid var(--accent); border-radius: 0;
270
- padding: 4px 0 4px 18px; margin: 14px 0;
271
- background: transparent;
272
- }
273
- .recovery-title { font-size: 14.5px; font-weight: 600; color: var(--fg); margin-bottom: 6px; display: flex; align-items: center; gap: 8px; }
274
- .recovery-title .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); }
275
- .recovery-cause { color: var(--fg-90); font-size: 13px; line-height: 1.5; margin-bottom: 6px; }
276
- .recovery-cause b { color: var(--fg); font-weight: 600; }
277
- .git-note .git-note-body { color: var(--fg-70); font-size: 12px; line-height: 1.55; }
278
- .git-note .git-note-body code { font-family: var(--mono); font-size: 12px; background: var(--bg-2); padding: 1px 5px; border-radius: 3px; }
279
- .recovery-resolve { color: var(--fg-70); font-size: 12px; line-height: 1.55; margin: 6px 0 10px; padding: 8px 11px; background: rgba(255,255,255,0.025); border-radius: 5px; border-left: 2px solid var(--fg-30); }
280
- .recovery-resolve b { color: var(--fg); font-weight: 500; }
281
- .recovery-actions { display: flex; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
282
- .recovery-actions button {
283
- font-family: var(--sans); font-size: 12px; padding: 7px 14px; border-radius: 5px; cursor: pointer;
284
- border: 1px solid var(--border); background: transparent; color: var(--fg-70); transition: all 160ms ease;
285
- }
286
- .recovery-actions button:hover { color: var(--fg); border-color: var(--fg-30); }
287
- .recovery-actions button.primary { background: var(--accent); color: #000; border-color: var(--accent); font-weight: 600; }
288
- .recovery-actions button.primary:hover { box-shadow: 0 0 0 3px rgba(255,154,118,0.20); }
289
- .recovery-actions button[disabled] { opacity: .4; cursor: not-allowed; border-style: dashed; }
290
- .recovery-actions button[disabled]:hover { color: var(--fg-70); border-color: var(--border); box-shadow: none; }
291
- .recovery-actions button.linkbtn { background: none; border: none; color: var(--fg-50); padding: 4px 2px; text-decoration: underline; text-underline-offset: 2px; }
292
- .recovery-actions button.linkbtn:hover { color: var(--fg); }
293
- .recovery-actions button.linkbtn[disabled] { text-decoration: none; }
294
- .recovery-reason { font-size: 12px; color: var(--fg-40); margin-top: 8px; font-style: italic; }
295
- .recovery-ack { font-size: 12px; color: var(--verified); margin-top: 10px; }
296
-
297
- /* G-U10 · crash recovery surface · shown when session was orphaned · "the
298
- * daemon was killed mid-task · you can resume or discard" */
299
- .crash-recovery {
300
- border: 1px solid var(--border); border-radius: 8px;
301
- padding: 10px 14px; margin: 10px 0;
302
- background: rgba(255,255,255,0.02);
303
- }
304
- .crash-recovery-title { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 4px; }
305
-
306
- /* v0.8 S3 · Reshape view · ported from demo v12 lines 73-132 + 2486-2534.
307
- * Demo v12's W-W4 differentiator · user describes the view they want,
308
- * agent "composes" it from shared primitives. Backed by body.shape-*
309
- * classes + a custom-view banner. Three preset shapes (ship-only,
310
- * velocity, security) plus a free-text input that naive-classifies to
311
- * the closest preset. */
312
-
313
- /* v0.8 S4 · share-thread button + popover · per demo v12 W-W2 */
314
- .share-modal { position: fixed; inset: 0; background: rgba(0,0,0,0.7); backdrop-filter: blur(6px); display: none; align-items: center; justify-content: center; z-index: 310; padding: 24px; }
315
- .share-modal.open { display: flex; animation: rs-fade 240ms ease; }
316
- .share-modal.open .share-card { animation: wp-card-in var(--dur-max) var(--ease); }
317
- /* S17 · share card joins the calm token system: glass-neutral border (the
318
- * old orange->blue gradient ring was decorative orange), one radius family,
319
- * motion inside the 200/300ms budget. Copy link stays the ONE filled
320
- * button in this dialog. */
321
- .share-card { width: 100%; max-width: 540px; background: var(--bg-1); border: 1px solid var(--border); border-radius: var(--radius); padding: 20px 22px; position: relative; overflow: hidden; }
322
- .share-card .head { display: flex; align-items: center; gap: 8px; color: var(--fg); font-weight: 600; font-size: 13px; }
323
- .share-card .head .tag { color: var(--fg-40); font-weight: 400; font-size: 12px; font-family: var(--mono); }
324
- .share-card .blurb { color: var(--fg-70); font-size: 12px; margin: 10px 0; line-height: 1.55; }
325
- /* Signed-payload link · brand-tinted so the value reads as "this is the
326
- * codehere artifact you're about to share" · not a generic URL. The
327
- * canonical brand var is --accent in product, --brand in demo — same
328
- * #ff9a76. The original css here referenced --brand (undefined in
329
- * product) and silently fell back to default fg-light. */
330
- .share-link-box { background: hsl(0 0% 9%); border: 1px solid var(--border); border-radius: 6px; padding: 9px 12px; font-family: var(--mono); font-size: 12px; color: var(--fg-70); margin: 10px 0; word-break: break-all; max-height: 96px; overflow: auto; }
331
- .share-actions { display: flex; gap: 8px; margin-top: 12px; flex-wrap: wrap; }
332
- .share-actions button { font-family: var(--sans); font-size: 12px; padding: 7px 14px; border-radius: 5px; cursor: pointer; }
333
- .share-btn-primary { background: var(--accent); color: #000; border: 0; font-weight: 600; }
334
- .share-btn-primary:hover { filter: brightness(1.08); }
335
- .share-btn-secondary { background: transparent; color: var(--fg-50); border: 1px solid var(--border); }
336
- .share-btn-secondary:hover { color: var(--fg); border-color: var(--fg-30); }
337
- .share-foot { color: var(--fg-40); font-size: 12px; margin-top: 12px; font-family: var(--mono); line-height: 1.5; }
338
- .share-toast { position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%); background: var(--bg-1); border: 1px solid var(--border); color: var(--fg); padding: 10px 18px; border-radius: 6px; font-size: 12px; box-shadow: 0 6px 24px rgba(0,0,0,0.4); z-index: 320; opacity: 0; pointer-events: none; transition: opacity 240ms ease; }
339
- .share-toast.show { opacity: 1; }
340
-
341
- /* v0.9 S6 · W-PASS approval modal · demo v12 lines 2030-2050 */
342
- .wp-modal { position: fixed; inset: 0; background: rgba(0,0,0,0.75); backdrop-filter: blur(8px); display: none; align-items: center; justify-content: center; z-index: 330; padding: 24px; }
343
- .wp-modal.open { display: flex; animation: rs-fade 280ms ease; }
344
- .wp-modal.open .wp-card { animation: wp-card-in var(--dur-max) var(--ease); }
345
- @keyframes wp-card-in {
346
- from { opacity: 0; transform: translateY(12px) scale(0.985); }
347
- to { opacity: 1; transform: translateY(0) scale(1); }
348
- }
349
- /* W-PASS keeps its orange dress on purpose: an agent write awaiting YOUR
350
- * approval IS the needs-your-decision state the hue is reserved for. */
351
- .wp-card { width: 100%; max-width: 620px; background: var(--bg-1); border: 1px solid rgba(255,154,118,0.40); border-radius: var(--radius); padding: 22px 24px; position: relative; box-shadow: 0 12px 48px rgba(0,0,0,0.5), inset 0 0 0 1px rgba(255,154,118,0.06); }
352
- .wp-banner { display: flex; align-items: center; gap: 8px; font-family: var(--mono); font-size: 10.5px; color: var(--accent); letter-spacing: 0.06em; text-transform: uppercase; margin-bottom: 4px; }
353
- .wp-banner .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); box-shadow: 0 0 0 3px rgba(255,154,118,0.18); animation: wp-pulse 1.6s ease-in-out infinite; }
354
- @keyframes wp-pulse { 0%,100% { box-shadow: 0 0 0 3px rgba(255,154,118,0.18); } 50% { box-shadow: 0 0 0 7px rgba(255,154,118,0.04); } }
355
- .wp-title { font-size: 14.5px; font-weight: 600; color: var(--fg); margin: 4px 0 6px; letter-spacing: -0.01em; }
356
- .wp-reason { font-size: 12px; color: var(--fg-70); line-height: 1.5; margin: 0 0 14px; padding: 8px 11px; background: rgba(255,255,255,0.025); border-left: 2px solid var(--accent); border-radius: 0 4px 4px 0; }
357
- .wp-meta { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); margin: 8px 0; line-height: 1.6; }
358
- .wp-meta b { color: var(--fg-90); }
359
- .wp-payload-wrap { background: var(--bg-2); border: 1px solid var(--border); border-radius: 6px; margin: 12px 0; max-height: 240px; overflow: auto; }
360
- .wp-payload-head { display: flex; align-items: center; gap: 8px; padding: 6px 11px; background: rgba(255,255,255,0.025); border-bottom: 1px solid var(--border); font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); text-transform: uppercase; letter-spacing: 0.04em; }
361
- .wp-payload-head .method { color: var(--accent); font-weight: 600; }
362
- .wp-payload { padding: 10px 12px; font-family: var(--mono); font-size: 12px; color: var(--fg-90); white-space: pre-wrap; word-break: break-word; line-height: 1.5; }
363
- .wp-payload-edit { width: 100%; min-height: 140px; background: var(--bg-2); border: 1px solid var(--accent); border-radius: 6px; padding: 10px 12px; font-family: var(--mono); font-size: 12px; color: var(--fg-90); resize: vertical; outline: none; }
364
- .wp-actions { display: flex; gap: 8px; margin-top: 14px; flex-wrap: wrap; }
365
- .wp-actions button { font-family: var(--sans); font-size: 12px; padding: 8px 16px; border-radius: 5px; cursor: pointer; font-weight: 500; transition: all 160ms ease; }
366
- .wp-btn-approve { background: var(--accent); color: #000; border: 0; }
367
- .wp-btn-approve:hover { box-shadow: 0 0 0 3px rgba(255,154,118,0.20); }
368
- .wp-btn-approve:disabled, .wp-btn-edit:disabled { opacity: 0.45; cursor: not-allowed; box-shadow: none; }
369
- .wp-btn-edit { background: transparent; color: var(--fg); border: 1px solid var(--border); }
370
- .wp-btn-edit:hover { border-color: var(--accent); color: var(--accent); }
371
- .wp-btn-cancel { background: transparent; color: var(--fg-50); border: 1px solid var(--border); }
372
- .wp-btn-cancel:hover { color: var(--caught); border-color: var(--caught); }
373
- .wp-btn-save { background: var(--accent); color: #000; border: 0; }
374
- .wp-foot { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); margin-top: 12px; line-height: 1.55; }
375
- .wp-result { margin-top: 12px; padding: 8px 11px; border-radius: 4px; font-size: 12px; line-height: 1.5; }
376
- .wp-result.ok { background: rgba(132,181,148,0.08); border: 1px solid rgba(132,181,148,0.30); color: var(--verified); }
377
- .wp-result.fail { background: rgba(254,80,80,0.08); border: 1px solid rgba(254,80,80,0.30); color: var(--caught); }
378
- .wp-result.cancelled { background: rgba(255,255,255,0.04); border: 1px solid var(--border); color: var(--fg-50); }
379
- .wp-pending-badge { position: fixed; top: 14px; right: 220px; background: var(--accent); color: #000; padding: 4px 10px; border-radius: 5px; font-family: var(--mono); font-size: 10.5px; font-weight: 600; cursor: pointer; display: none; z-index: 305; box-shadow: 0 4px 16px rgba(255,154,118,0.30); animation: wp-pulse 1.6s ease-in-out infinite; letter-spacing: 0.03em; }
380
-
381
- /* Per-domain mediated-write trust grade chip · v0.9 must-ship */
382
- .wp-trust-grade { display: inline-block; padding: 2px 7px; border-radius: 3px; font-family: var(--mono); font-size: 10.5px; font-weight: 700; letter-spacing: 0.03em; margin: 0 4px; }
383
- .wp-trust-grade.A { color: var(--verified); background: rgba(132,181,148,0.12); }
384
- .wp-trust-grade.B { color: var(--verified); background: rgba(132,181,148,0.08); }
385
- .wp-trust-grade.C { color: var(--warn); background: rgba(217,164,65,0.10); }
386
- .wp-trust-grade.D { color: var(--warn); background: rgba(217,164,65,0.15); }
387
- .wp-trust-grade.F { color: var(--caught); background: rgba(207,139,126,0.12); }
388
- .wp-trust-prompt { margin-top: 10px; padding: 9px 11px; background: rgba(207,139,126,0.06); border: 1px solid rgba(207,139,126,0.30); border-radius: 5px; font-size: 12px; color: var(--fg-90); }
389
- .wp-trust-prompt input { margin-right: 6px; }
390
- .wp-pending-badge.show { display: inline-block; }
391
-
392
- /* v0.9 S7 · overlay-renderer · inspect-and-act for ctx-source URLs */
393
- .or-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.72); backdrop-filter: blur(8px); display: none; align-items: center; justify-content: center; z-index: 295; padding: 24px; }
394
- .or-overlay.open { display: flex; animation: rs-fade 280ms ease; }
395
- .or-overlay.open .or-card { animation: wp-card-in var(--dur-max) var(--ease); }
396
- /* S17 · glass-neutral card (gradient ring retired with the rest of the
397
- * decorative orange), one radius family. */
398
- .or-card { width: 100%; max-width: 720px; max-height: calc(100vh - 48px); background: var(--bg-1); border: 1px solid var(--border); border-radius: var(--radius); display: flex; flex-direction: column; overflow: hidden; position: relative; }
399
- .or-head { display: flex; align-items: center; gap: 10px; padding: 11px 15px; border-bottom: 1px solid var(--border); font-family: var(--mono); font-size: 12px; color: var(--fg-70); flex-shrink: 0; }
400
- .or-head .src { color: var(--fg-70); font-weight: 600; }
401
- .or-head .meta { color: var(--fg-50); }
402
- .or-head .audit { margin-left: auto; padding: 2px 8px; background: rgba(132,181,148,0.06); border: 1px solid rgba(132,181,148,0.25); border-radius: 3px; font-size: 10.5px; color: var(--fg-50); }
403
- .or-head .audit b { color: var(--verified); }
404
- .or-head .or-close { background: transparent; border: 0; color: var(--fg-50); cursor: pointer; padding: 2px 8px; border-radius: 4px; font-size: 14.5px; line-height: 1; }
405
- .or-head .or-close:hover { color: var(--fg); background: var(--bg-2); }
406
- .or-body { padding: 16px 20px; overflow-y: auto; flex: 1; }
407
- .or-body h3 { font-size: 20px; font-weight: 600; color: var(--fg); letter-spacing: -0.01em; margin: 0 0 4px; }
408
- .or-body .url-row { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); margin-bottom: 12px; word-break: break-all; }
409
- .or-body .meta-row { display: flex; gap: 6px; flex-wrap: wrap; margin: 6px 0 14px; font-family: var(--mono); font-size: 10.5px; }
410
- .or-body .meta-row .pill { padding: 2px 7px; border: 1px solid var(--border); border-radius: 3px; color: var(--fg-70); background: var(--bg-2); }
411
- .or-body .meta-row .pill.state-open { color: var(--verified); border-color: rgba(132,181,148,0.30); background: rgba(132,181,148,0.06); }
412
- .or-body .meta-row .pill.state-closed { color: var(--caught); border-color: rgba(254,80,80,0.30); background: rgba(254,80,80,0.06); }
413
- .or-body .preview-text { padding: 12px 14px; background: rgba(255,255,255,0.025); border: 1px solid var(--border); border-radius: 6px; font-family: var(--mono); font-size: 12px; color: var(--fg-90); line-height: 1.55; white-space: pre-wrap; word-break: break-word; max-height: 360px; overflow-y: auto; }
414
- .or-body .preview-error { padding: 14px 16px; background: rgba(254,80,80,0.06); border: 1px solid rgba(254,80,80,0.30); border-radius: 6px; color: var(--caught); font-size: 12px; line-height: 1.5; }
415
- .or-body .preview-error .hint { color: var(--fg-50); font-family: var(--mono); font-size: 10.5px; margin-top: 6px; }
416
- .or-body .preview-loading { display: flex; align-items: center; gap: 8px; padding: 16px; color: var(--fg-50); font-family: var(--mono); font-size: 12px; }
417
- .or-body .preview-loading::before { content: ''; width: 10px; height: 10px; border: 2px solid var(--fg-30); border-top-color: var(--accent); border-radius: 50%; animation: or-spin 700ms linear infinite; }
418
- @keyframes or-spin { to { transform: rotate(360deg); } }
419
- .or-composer { padding: 12px 14px; background: var(--bg-2); border-top: 1px solid var(--border); display: flex; flex-direction: column; gap: 8px; flex-shrink: 0; }
420
- .or-composer .hint { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); letter-spacing: 0.06em; }
421
- .or-composer .row { display: flex; gap: 8px; align-items: center; }
422
- .or-composer input { flex: 1; background: var(--bg-1); border: 1px solid var(--border); border-radius: 6px; padding: 8px 11px; color: var(--fg); font-family: var(--sans); font-size: 13px; outline: none; transition: border-color 160ms ease; }
423
- .or-composer input:focus { border-color: var(--accent); }
424
- .or-composer button { background: var(--accent); color: #000; border: 0; border-radius: 6px; padding: 8px 14px; font-family: var(--sans); font-size: 12px; font-weight: 600; cursor: pointer; }
425
- .or-composer button:hover { box-shadow: 0 0 0 3px rgba(255,154,118,0.18); }
426
- .or-composer button:disabled { opacity: 0.40; cursor: default; box-shadow: none; }
427
-
428
- /* Linear inline render · per demo v12 lines 569-600. Authentic Linear
429
- ticket card displayed inside the overlay when previewing linear://. */
430
- .linear-render { background: #1c1c1e; color: #ebeaef; padding: 24px 28px; border-radius: 6px; font-family: 'Inter', -apple-system, sans-serif; }
431
- .linear-id { font-family: var(--mono); font-size: 12px; color: #8a8a8e; letter-spacing: 0.04em; margin-bottom: 8px; }
432
- .linear-title { font-size: 20px; font-weight: 600; color: #ebeaef; line-height: 1.35; margin-bottom: 14px; letter-spacing: -0.01em; }
433
- .linear-props { display: flex; flex-wrap: wrap; gap: 7px; margin-bottom: 16px; }
434
- .linear-pill { display: inline-flex; align-items: center; gap: 5px; padding: 3px 9px; border-radius: 4px; font-size: 12px; background: rgba(255,255,255,0.04); color: #b8b7bc; }
435
- .linear-pri-urgent { color: #f87171; }
436
- .linear-pri-bars { display: inline-flex; align-items: flex-end; gap: 1.5px; width: 12px; height: 12px; }
437
- .linear-pri-bars div { width: 2px; background: currentColor; border-radius: 0.5px; }
438
- .linear-pri-bars div:nth-child(1) { height: 4px; }
439
- .linear-pri-bars div:nth-child(2) { height: 7px; }
440
- .linear-pri-bars div:nth-child(3) { height: 10px; }
441
- .linear-status-progress { color: #fbbf24; }
442
- .linear-status-circle { width: 12px; height: 12px; border-radius: 50%; border: 1.5px solid currentColor; position: relative; box-sizing: border-box; }
443
- .linear-status-circle::after { content: ''; position: absolute; inset: 0; background: currentColor; border-radius: 50%; clip-path: polygon(0 0, 50% 0, 50% 100%, 0% 100%); }
444
- .linear-assignee { background: rgba(255,255,255,0.06); }
445
- .linear-assignee .av { width: 16px; height: 16px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 10.5px; font-weight: 700; color: #fff; font-family: var(--mono); }
446
- .linear-desc { font-size: 13px; color: #b8b7bc; line-height: 1.65; padding: 14px 16px; background: rgba(255,255,255,0.025); border-radius: 6px; margin-bottom: 18px; }
447
- .linear-desc code { background: rgba(255,255,255,0.07); padding: 1px 5px; border-radius: 3px; font-family: var(--mono); font-size: 12px; color: #ebeaef; }
448
- .linear-sep { display: flex; align-items: center; gap: 10px; margin: 14px 0 12px; }
449
- .linear-sep .line { flex: 1; height: 1px; background: rgba(255,255,255,0.08); }
450
- .linear-sep .lbl { font-family: var(--mono); font-size: 10.5px; color: #6f6e74; letter-spacing: 0.1em; text-transform: uppercase; }
451
- .linear-comment { display: flex; gap: 11px; padding: 10px 0; }
452
- .linear-comment .av { width: 24px; height: 24px; border-radius: 50%; display: inline-flex; align-items: center; justify-content: center; font-size: 10.5px; font-weight: 600; color: #fff; font-family: var(--mono); flex-shrink: 0; background: #5e6ad2; }
453
- .linear-comment .col { flex: 1; min-width: 0; }
454
- .linear-comment .who { display: flex; align-items: baseline; gap: 7px; font-size: 12px; font-weight: 600; color: #ebeaef; margin-bottom: 2px; }
455
- .linear-comment .ts { color: #6f6e74; font-size: 12px; font-weight: 400; }
456
- .linear-comment .body { font-size: 13px; color: #b8b7bc; line-height: 1.55; }
457
-
458
- /* Figma inline render · structured frame card (text-only by design · no
459
- thumbnails · agents read structure, not pixels). */
460
- .figma-render { background: #1c1c1e; color: #ebeaef; padding: 22px 26px; border-radius: 6px; font-family: 'Inter', -apple-system, sans-serif; }
461
- .figma-head { display: flex; align-items: center; gap: 9px; margin-bottom: 8px; }
462
- .figma-badge { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: #fff; background: #a259ff; padding: 2px 8px; border-radius: 4px; }
463
- .figma-name { font-size: 20px; font-weight: 600; color: #ebeaef; letter-spacing: -0.01em; }
464
- .figma-meta { font-family: var(--mono); font-size: 12px; color: #8a8a8e; margin: 4px 0 6px; }
465
- .figma-note { font-size: 12px; color: #8a8a8e; padding: 8px 0; }
466
- .figma-sep { display: flex; align-items: center; gap: 10px; margin: 16px 0 10px; }
467
- .figma-sep .line { flex: 1; height: 1px; background: rgba(255,255,255,0.08); }
468
- .figma-sep .lbl { font-family: var(--mono); font-size: 10.5px; color: #6f6e74; letter-spacing: 0.1em; text-transform: uppercase; }
469
- .figma-frame { padding: 9px 12px; background: rgba(255,255,255,0.025); border-radius: 6px; margin-bottom: 7px; }
470
- .figma-frame-name { font-size: 13px; font-weight: 600; color: #ebeaef; }
471
- .figma-frame-dim { font-family: var(--mono); font-size: 12px; color: #8a8a8e; margin-left: 9px; }
472
- .figma-frame-text { font-size: 12px; color: #b8b7bc; line-height: 1.5; margin-top: 4px; }
473
- .figma-tree { font-family: var(--mono); font-size: 12px; color: #b8b7bc; line-height: 1.55; background: rgba(255,255,255,0.025); padding: 12px 14px; border-radius: 6px; white-space: pre-wrap; word-break: break-word; max-height: 320px; overflow: auto; margin: 0; }
474
-
475
- /* draw.io inline render · structure + XML excerpt (no rendered diagram image ·
476
- the adapter ships XML text, not pixels · no mxGraph dependency). */
477
- .drawio-render { background: #1c1c1e; color: #ebeaef; padding: 22px 26px; border-radius: 6px; font-family: 'Inter', -apple-system, sans-serif; }
478
- .drawio-head { display: flex; align-items: center; gap: 9px; margin-bottom: 8px; }
479
- .drawio-badge { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: #fff; background: #f08705; padding: 2px 8px; border-radius: 4px; }
480
- .drawio-name { font-size: 14.5px; font-weight: 600; color: #ebeaef; word-break: break-all; }
481
- .drawio-stats { display: flex; gap: 10px; margin: 14px 0 4px; flex-wrap: wrap; }
482
- .drawio-stat { display: flex; flex-direction: column; align-items: center; min-width: 60px; padding: 10px 14px; background: rgba(255,255,255,0.03); border-radius: 6px; }
483
- .drawio-stat .n { font-size: 20px; font-weight: 700; color: #ebeaef; font-family: var(--mono); }
484
- .drawio-stat .l { font-size: 10.5px; color: #8a8a8e; letter-spacing: 0.06em; text-transform: uppercase; margin-top: 3px; }
485
- .drawio-sep { display: flex; align-items: center; gap: 10px; margin: 16px 0 10px; }
486
- .drawio-sep .line { flex: 1; height: 1px; background: rgba(255,255,255,0.08); }
487
- .drawio-sep .lbl { font-family: var(--mono); font-size: 10.5px; color: #6f6e74; letter-spacing: 0.1em; text-transform: uppercase; }
488
- .drawio-xml { font-family: var(--mono); font-size: 12px; color: #b8b7bc; line-height: 1.5; background: rgba(255,255,255,0.025); padding: 12px 14px; border-radius: 6px; white-space: pre-wrap; word-break: break-word; max-height: 320px; overflow: auto; margin: 0; }
489
-
490
- /* Make ctx-source URL chips throughout the UI clickable + discoverable.
491
- Matches demo v12 lines 690-694. */
492
- .ctx-url-chip { cursor: pointer; transition: all 180ms ease; padding: 2px 7px 2px 22px; border-radius: 4px; background: var(--glass-3); border: 1px solid var(--glass-3); color: var(--fg-70); position: relative; font-family: var(--mono); font-size: 10.5px; display: inline-block; }
493
- .ctx-url-chip::before { content: '\\25CF'; position: absolute; left: 6px; top: 50%; transform: translateY(-50%); font-size: 10.5px; opacity: 0.85; }
494
- .ctx-url-chip:hover { background: var(--glass-3); border-color: var(--glass-3); }
495
-
496
- .reshape-modal { position: fixed; inset: 0; background: rgba(0,0,0,0.7); backdrop-filter: blur(6px); display: none; align-items: center; justify-content: center; z-index: 300; padding: 24px; }
497
- .reshape-modal.open { display: flex; animation: rs-fade 280ms ease; }
498
- .reshape-modal.open .reshape-card { animation: wp-card-in var(--dur-max) var(--ease); }
499
- @keyframes rs-fade { from { opacity: 0; } to { opacity: 1; } }
500
- /* S17 · reshape card joins the calm token system: glass-neutral border
501
- * (the gradient ring was decorative orange), one radius family. Compose
502
- * stays the ONE filled button in this dialog. */
503
- .reshape-card { width: 100%; max-width: 580px; background: var(--bg-1); border: 1px solid var(--border); border-radius: var(--radius); padding: 22px 24px; position: relative; overflow: hidden; }
504
- /* Primitives note · blue info box at the modal bottom explaining what
505
- * "primitives" the agent composes from · demo v12 lines 134-137. */
506
- .primitives-note {
507
- margin-top: 14px; padding: 8px 12px;
508
- background: var(--glass-3); border: 1px solid var(--glass-3);
509
- border-radius: 5px;
510
- font-size: 12px; color: var(--fg-70); line-height: 1.55;
511
- }
512
- .primitives-note b { color: var(--fg-70); font-weight: 500; }
513
- .primitives-note .prims { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); margin-top: 5px; }
514
- .primitives-note .prims .p {
515
- display: inline-block; padding: 1px 6px; margin: 2px 3px 0 0;
516
- background: hsl(0 0% 9%); border: 1px solid var(--border);
517
- border-radius: 3px; color: var(--fg-70);
518
- }
519
- .reshape-card .k { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); letter-spacing: 0.14em; text-transform: uppercase; }
520
- .reshape-card h2 { font-size: 20px; font-weight: 600; margin: 4px 0 6px; color: var(--fg); letter-spacing: -0.01em; }
521
- .reshape-card p.sub { color: var(--fg-50); font-size: 12px; margin: 0 0 14px; line-height: 1.55; }
522
- .reshape-input { display: flex; gap: 8px; margin: 8px 0 16px; }
523
- .reshape-input input { flex: 1; background: var(--bg-2); border: 1px solid var(--border); border-radius: 6px; padding: 9px 12px; color: var(--fg); font-size: 13px; outline: none; }
524
- .reshape-input input:focus { border-color: var(--accent); }
525
- .reshape-input button { background: var(--accent); color: #000; border: 0; border-radius: 6px; padding: 0 16px; font-size: 13px; font-weight: 600; cursor: pointer; }
526
- .reshape-input button:hover { filter: brightness(1.08); }
527
- .reshape-suggestions { display: flex; flex-direction: column; gap: 5px; margin: 6px 0 14px; }
528
- .reshape-suggestions .lbl { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); letter-spacing: 0.1em; text-transform: uppercase; margin-bottom: 3px; }
529
- .reshape-suggestions .pill { padding: 6px 11px; background: rgba(255,255,255,0.025); border: 1px solid var(--border); border-radius: 5px; font-size: 12px; color: var(--fg-90); cursor: pointer; text-align: left; }
530
- .reshape-suggestions .pill:hover { border-color: var(--fg-30); background: var(--glass-2); }
531
- .reshape-suggestions .pill .what { color: var(--fg-50); margin-left: 8px; font-size: 12px; }
532
- .reshape-card .close-x { position: absolute; top: 14px; right: 14px; background: transparent; border: 0; color: var(--fg-50); cursor: pointer; font-size: 20px; padding: 4px 6px; border-radius: 4px; }
533
- .reshape-card .close-x:hover { color: var(--fg); background: var(--bg-2); }
534
- /* Connect-from-GitHub · clone modal + the "+ from GitHub" affordances */
535
- .clone-modal { position: fixed; inset: 0; background: rgba(0,0,0,0.7); backdrop-filter: blur(6px); display: none; align-items: center; justify-content: center; z-index: 300; padding: 24px; }
536
- .clone-modal.open { display: flex; animation: rs-fade 220ms ease; }
537
- .clone-card { width: 100%; max-width: 520px; background: var(--bg-1); border: 1px solid var(--border); border-radius: var(--radius); padding: 22px 24px; position: relative; }
538
- .clone-card .close-x { position: absolute; top: 14px; right: 14px; background: transparent; border: 0; color: var(--fg-50); cursor: pointer; font-size: 20px; padding: 4px 6px; border-radius: 4px; }
539
- .clone-card .close-x:hover { color: var(--fg); background: var(--bg-2); }
540
- .clone-card .head { font-size: 14.5px; font-weight: 600; color: var(--fg); margin-bottom: 6px; }
541
- .clone-card .blurb { font-size: 12px; color: var(--fg-60); line-height: 1.5; margin: 0 0 14px; }
542
- .clone-card .blurb code { font-family: var(--mono); background: var(--bg-2); padding: 1px 5px; border-radius: 3px; font-size: 12px; }
543
- .clone-input { display: flex; gap: 8px; }
544
- .clone-input input { flex: 1; background: var(--bg-2); border: 1px solid var(--border); border-radius: 6px; padding: 9px 12px; color: var(--fg); font-size: 13px; font-family: var(--mono); outline: none; }
545
- .clone-input input:focus { border-color: var(--accent); }
546
- .clone-input button { background: var(--accent); color: #000; border: 0; border-radius: 6px; padding: 0 18px; font-size: 13px; font-weight: 600; cursor: pointer; }
547
- .clone-input button:hover { filter: brightness(1.08); }
548
- .clone-input button:disabled { opacity: 0.5; cursor: default; }
549
- .clone-status { margin-top: 12px; font-size: 12px; color: var(--fg-70); line-height: 1.45; }
550
- .clone-status.ok { color: var(--accent); }
551
- .clone-status.warn { color: #e0a; color: var(--fg-80); border-left: 2px solid var(--accent); padding-left: 9px; }
552
- .section-label-row { display: flex; align-items: center; justify-content: space-between; }
553
- .add-gh { background: transparent; border: 1px solid var(--border); border-radius: 6px; color: var(--fg-70); font-size: 12px; padding: 3px 10px; cursor: pointer; font-family: inherit; }
554
- .add-gh:hover { border-color: var(--accent); color: var(--fg); }
555
- .ex-gh { margin-top: 14px; font-size: 12px; color: var(--fg-50); }
556
- .ex-gh .add-gh { margin-left: 6px; }
557
- .agent-compose { display: none; padding: 12px 14px; background: var(--bg-2); border: 1px solid var(--border); border-radius: 5px; font-family: var(--mono); font-size: 12px; color: var(--fg-70); margin-top: 12px; }
558
- .agent-compose.show { display: block; animation: rs-fade 200ms ease; }
559
- .agent-compose .agent-line { display: flex; align-items: center; gap: 8px; padding: 3px 0; }
560
- .agent-compose .line { opacity: 0; animation: rs-slide 240ms ease forwards; }
561
- @keyframes rs-slide { from { opacity: 0; transform: translateX(-10px); } to { opacity: 1; transform: translateX(0); } }
562
- .agent-compose .line:nth-child(1) { animation-delay: 200ms; }
563
- .agent-compose .line:nth-child(2) { animation-delay: 600ms; }
564
- .agent-compose .line:nth-child(3) { animation-delay: 1000ms; }
565
- .agent-compose .line:nth-child(4) { animation-delay: 1400ms; }
566
- .agent-compose .line:nth-child(5) { animation-delay: 1800ms; }
567
- .agent-compose .ok { color: var(--verified); }
568
- .agent-compose .info { color: var(--fg-70); }
569
- .agent-compose .kw { color: var(--fg-70); }
570
-
571
- /* Custom-view banner · appears when reshape is active */
572
- .custom-view-banner {
573
- display: none;
574
- padding: 8px 20px;
575
- background: linear-gradient(90deg, rgba(255,154,118,0.06), var(--glass-3));
576
- border-bottom: 1px solid rgba(255,154,118,0.2);
577
- font-family: var(--mono); font-size: 12px; color: var(--fg-70);
578
- display: none;
579
- }
580
- body.custom-view .custom-view-banner { display: flex; align-items: center; gap: 10px; }
581
- .custom-view-banner .lbl { color: var(--accent); font-weight: 600; letter-spacing: 0.04em; text-transform: uppercase; font-size: 10.5px; }
582
- .custom-view-banner .prompt { color: var(--fg-90); font-style: italic; }
583
- .custom-view-banner .reset { margin-left: auto; color: var(--fg-50); cursor: pointer; padding: 2px 8px; border: 1px solid var(--border); border-radius: 3px; font-size: 10.5px; }
584
- .custom-view-banner .reset:hover { color: var(--fg); border-color: var(--fg-30); }
585
-
586
- /* Failover banner · ported from v1 ui-page.ts on 2026-05-23 as part of /v1 kill.
587
- Polls /api/failover-offers · when a rate-limited agent has a viable fallback,
588
- amber strip appears between header and task list with "Switch / Dismiss". */
589
- .failover-banner {
590
- margin: 12px 24px 0; padding: 12px 18px;
591
- border: 1px solid rgba(217,164,65,0.30);
592
- background: rgba(217,164,65,0.06);
593
- border-radius: 8px;
594
- font-size: 13px; line-height: 1.5;
595
- display: none; align-items: center; gap: 12px; flex-wrap: wrap;
596
- }
597
- .failover-banner.show { display: flex; }
598
- .failover-banner .fb-msg { flex: 1; color: var(--fg-70); min-width: 200px; }
599
- .failover-banner .fb-msg b { color: var(--fg); font-weight: 600; }
600
- .failover-banner .fb-actions { display: flex; gap: 8px; flex-shrink: 0; }
601
- .failover-banner .fb-actions button {
602
- font-family: var(--mono); font-size: 12px;
603
- padding: 5px 12px; border-radius: 5px; cursor: pointer;
604
- border: 1px solid var(--border); background: transparent;
605
- color: var(--fg-70); transition: color 0.15s, border-color 0.15s;
606
- }
607
- .failover-banner .fb-actions button:hover { color: var(--fg); border-color: var(--fg-30); }
608
- .failover-banner .fb-actions button.fb-accept {
609
- background: rgba(217,164,65,0.12); border-color: rgba(217,164,65,0.40);
610
- color: var(--warn); font-weight: 600;
611
- }
612
- .failover-banner .fb-actions button.fb-accept:hover { background: rgba(217,164,65,0.20); }
613
-
614
- /* SHAPE: ship-only · hide tool-call cards, steps blob, hook blocks, etc. */
615
- body.shape-ship-only details.collapsible,
616
- body.shape-ship-only .hook-block-card,
617
- body.shape-ship-only .push-gate-card { display: none !important; }
618
-
619
- /* REPL primitives · thinking dots + streaming caret + repl-beat narrative.
620
- * Match demo v12 lines 299-309 + 455-457. The thinking pill appears
621
- * while the agent is mid-reasoning; the streaming caret appends to text
622
- * being streamed in; the repl-beat is an italic narrative paragraph
623
- * between tool calls (italic = "agent's voice", not output). All three
624
- * use the same brand-color blink so live state reads consistently. */
625
- .thinking {
626
- display: inline-flex; align-items: center; gap: 5px;
627
- padding: 5px 10px; margin: 4px 0;
628
- background: hsl(0 0% 9%); border: 1px solid var(--border);
629
- border-radius: 12px;
630
- font-family: var(--mono); font-size: 12px; color: var(--fg-50);
631
- }
632
- .thinking .dots { display: inline-flex; gap: 3px; }
633
- .thinking .dots span {
634
- width: 4px; height: 4px; border-radius: 50%; background: var(--fg-40);
635
- animation: cb-blink 1.4s ease infinite;
636
- }
637
- .thinking .dots span:nth-child(2) { animation-delay: 0.2s; }
638
- .thinking .dots span:nth-child(3) { animation-delay: 0.4s; }
639
- @keyframes cb-blink { 0%, 80%, 100% { opacity: 0.3; } 40% { opacity: 1; } }
640
- .streaming { display: inline; }
641
- .streaming::after {
642
- content: '\\258D'; color: var(--accent); margin-left: 2px;
643
- animation: cb-cursor 1s steps(2) infinite;
644
- }
645
- @keyframes cb-cursor { 50% { opacity: 0; } }
646
- .repl-beat {
647
- padding: 7px 11px; margin: 8px 0;
648
- background: rgba(0,0,0,0.18);
649
- border-left: 2px solid var(--border); border-radius: 0 4px 4px 0;
650
- font-style: italic; color: var(--fg-70); font-size: 12px;
651
- line-height: 1.55;
652
- }
653
- .repl-beat .cursor {
654
- display: inline-block; width: 7px; height: 12px;
655
- background: var(--accent); margin-left: 3px; vertical-align: text-bottom;
656
- animation: cb-cursor 1s steps(2) infinite;
657
- }
658
-
659
- /* Audit-line · narrative beat between tool cards · matches demo v12
660
- * lines 405-407. Dim mono row with a #NNNN seq prefix. When the chain
661
- * records a notable event (pre-prompt scan, override, budget warning,
662
- * W-PASS approval) the audit chain becomes VISIBLE in the timeline ·
663
- * not buried in the footer. The line is the proof; the footer is the
664
- * summary. */
665
- .audit-line {
666
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-40);
667
- padding: 6px 12px; margin: 8px 0;
668
- background: rgba(0,0,0,0.2);
669
- border-left: 2px solid var(--border); border-radius: 3px;
670
- line-height: 1.55;
671
- }
672
- .audit-line .seq { color: var(--fg-30); margin-right: 8px; }
673
- .audit-line.warn {
674
- color: var(--warn); border-left-color: var(--warn);
675
- background: rgba(217,164,65,0.03);
676
- }
677
- .audit-line.allow { border-left-color: rgba(132,181,148,0.4); }
678
- .audit-line b { color: var(--fg-90); font-weight: 600; }
679
- .audit-line code { background: hsl(0 0% 9%); padding: 1px 5px; border-radius: 3px; color: var(--fg-70); }
680
-
681
- /* project-memory nudge · same quiet family as .audit-line (trust present-
682
- but-quiet); .on = the post-click confirmation state */
683
- .mem-nudge {
684
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-40);
685
- padding: 6px 12px; margin: 8px 0;
686
- background: rgba(0,0,0,0.2);
687
- border-left: 2px solid var(--border); border-radius: 3px;
688
- line-height: 1.55;
689
- }
690
- .mem-nudge .mem-btn {
691
- background: none; border: 1px solid var(--border); border-radius: 4px;
692
- color: var(--fg-70); font-family: var(--mono); font-size: 10.5px;
693
- padding: 2px 8px; cursor: pointer; margin-left: 4px;
694
- }
695
- .mem-nudge .mem-btn:hover { border-color: var(--fg-30); color: var(--fg); }
696
- .mem-nudge.on { border-left-color: rgba(132,181,148,0.4); color: var(--fg-70); }
697
-
698
- /* Review lens (S20 · moved from the auditor persona rules): audit lines
699
- amplified, trust grades bold — the trust job reads proof first. */
700
- body[data-lens="review"] .audit-line { background: var(--glass-3); border-left-color: var(--fg-30); color: var(--fg-70); font-size: 12px; padding: 8px 14px; }
701
- body[data-lens="review"] .fchip .trust { font-weight: 700; padding: 2px 7px; }
702
-
703
- /* SHAPE: velocity · hide tool-call cards, summary prose, tokens, verifier · keep outcome + files */
704
- body.shape-velocity .token-table,
705
- body.shape-velocity details.collapsible { display: none !important; }
706
-
707
- /* SHAPE: security · amplify verifier + hook blocks; hide summary prose */
708
- body.shape-security .panel:has(.token-table),
709
- body.shape-security details.collapsible { display: none !important; }
710
- body.shape-security .hook-block-card { box-shadow: 0 0 0 2px rgba(207,139,126,0.3); }
711
-
712
- /* Reshape shapes recompose the goal room too (slice 4): "just what shipped"
713
- * / velocity hide per-turn meta; the audit/security shape amplifies the
714
- * room's audit line. Reuses the existing body.shape-* + .meta-eng/.audit-line. */
715
- body.shape-ship-only #task-list .card-row2 .meta-eng,
716
- body.shape-velocity #task-list .card-row2 .meta-eng { display: none !important; }
717
- body.shape-security #task-list .audit-line { background: var(--glass-3); border-left-color: var(--fg-30); font-size: 12px; padding: 8px 14px; }
718
-
719
- /* v0.8 S2.5 · Settings drawer · ported from demo v12 lines 178-192 + A-09
720
- * in the backlog. Right-side off-canvas panel · holds Context Sources +
721
- * future section-visibility toggles. */
722
- .drawer { position: fixed; top: 0; right: 0; width: 360px; height: 100vh; background: var(--bg-1); border-left: 1px solid var(--border); transform: translateX(100%); transition: transform var(--dur-max) var(--ease); z-index: 200; padding: 20px 18px; overflow-y: auto; }
723
- .drawer.open { transform: translateX(0); }
724
- .drawer-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.5); opacity: 0; pointer-events: none; transition: opacity var(--dur-max) var(--ease); z-index: 199; }
725
- .drawer-overlay.open { opacity: 1; pointer-events: auto; }
726
- .drawer h3 { font-family: var(--mono); font-size: 12px; color: var(--fg-50); letter-spacing: 0.12em; text-transform: uppercase; margin: 16px 0 8px; }
727
- .drawer h3:first-child { margin-top: 0; }
728
- .drawer p.sub { font-size: 12px; color: var(--fg-50); margin: 2px 0 12px; }
729
- .drawer-close { position: absolute; top: 14px; right: 14px; background: transparent; border: 0; color: var(--fg-50); cursor: pointer; font-size: 20px; line-height: 1; padding: 4px 6px; border-radius: 4px; }
730
- .drawer-close:hover { color: var(--fg); background: var(--bg-2); }
731
- .drawer-title { font-size: 14.5px; font-weight: 600; color: var(--fg); margin-bottom: 12px; padding-right: 30px; }
732
-
733
- /* Settings-button (cog) in the header · opens the drawer */
734
-
735
- /* Context-source rows inside the drawer */
736
- .cs-row { display: flex; align-items: flex-start; gap: 10px; padding: 10px 0; font-size: 12px; border-bottom: 1px solid var(--border-soft); }
737
- .cs-row .cs-icon { margin-top: 1px; }
738
- .cs-row:last-child { border-bottom: none; }
739
- .cs-row .cs-icon { width: 24px; height: 24px; border-radius: 5px; display: inline-flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 600; font-family: var(--mono); }
740
- .cs-row .cs-icon.linear { background: #5e6ad2; color: #fff; }
741
- .cs-row .cs-icon.figma { background: #1e1e1e; color: #fff; border: 1px solid rgba(255,255,255,0.2); }
742
- .cs-row .cs-label { font-weight: 500; color: var(--fg-90); }
743
- .cs-row .cs-meta { font-size: 10.5px; color: var(--fg-50); font-family: var(--mono); }
744
- .cs-row .cs-status { font-family: var(--mono); font-size: 10.5px; padding: 2px 6px; border-radius: 3px; text-transform: uppercase; letter-spacing: 0.04em; }
745
- .cs-row .cs-status.connected { color: var(--fg-70); background: var(--glass-3); }
746
- .cs-row .cs-status.expired { color: var(--warn); background: rgba(217,164,65,0.10); }
747
- .cs-row .cs-status.manual { color: var(--fg-50); background: rgba(255,255,255,0.04); }
748
- .cs-row .cs-status.disconnected { color: var(--fg-40); background: rgba(255,255,255,0.02); }
749
- .cs-row .cs-status.available { color: var(--fg-70); background: var(--glass-3); }
750
- .cs-row .cs-actions { margin-left: auto; display: flex; gap: 6px; }
751
- .cs-btn { font-family: var(--mono); font-size: 12px; padding: 3px 9px; border-radius: 4px; cursor: pointer; background: transparent; color: var(--fg-70); border: 1px solid var(--border); }
752
- .cs-btn:hover { color: var(--fg); border-color: var(--fg-30); }
753
- .cs-btn.primary { color: var(--fg-70); border-color: var(--glass-3); }
754
- .cs-btn.primary:hover { background: var(--glass-3); }
755
- .cs-btn.danger:hover { color: var(--caught); border-color: var(--caught); }
756
- .cs-btn:disabled { opacity: 0.35; cursor: not-allowed; }
757
- .cs-empty-hint { font-size: 12px; color: var(--fg-50); padding: 8px 10px; background: rgba(255,255,255,0.02); border-radius: 4px; margin-top: 4px; }
758
- .cs-empty-hint a { color: var(--fg-70); text-decoration: none; border-bottom: 1px solid var(--border); }
759
- .cs-empty-hint a:hover { color: var(--fg); border-color: var(--fg-30); }
760
- .cs-test-result { font-family: var(--mono); font-size: 10.5px; padding: 4px 8px; margin-top: 4px; border-radius: 3px; }
761
- .cs-test-result.ok { color: var(--verified); background: rgba(132,181,148,0.06); }
762
- .cs-test-result.fail { color: var(--caught); background: rgba(207,139,126,0.06); }
763
-
764
- /* Demo v12 line 322 + 518-521 · context-source rendering on tool-call cards */
765
-
766
- /* P10 · per-step hook badges in the trace details (same styles, different parent). */
767
- .tc .hook-badge { font-family: var(--mono); font-size: 10.5px; padding: 2px 6px; border-radius: 3px; text-transform: uppercase; letter-spacing: 0.04em; font-weight: 600; margin-right: 6px; vertical-align: middle; }
768
- .tc .hook-badge.allow { color: var(--verified); background: rgba(132,181,148,0.10); }
769
- .tc .hook-badge.block { color: var(--caught); background: rgba(207,139,126,0.10); }
770
- .tc .hook-badge.override { color: var(--warn); background: rgba(217,164,65,0.10); }
771
- .tc .hook-badge.ctx { color: var(--fg-70); background: var(--glass-3); border: 1px solid var(--glass-3); }
772
-
773
- /* F-06 · interactive audit chain panel · dashboard footer · click "Verify"
774
- * to call /api/audit/verify and render the verdict in plain English. The
775
- * chain is the source of truth, NOT codehere itself · the button proves
776
- * the daemon isn't lying to you. */
777
- /* RADICAL bottom-chrome collapse (2026-05-24 · Ega flagged "audit
778
- * section consuming space"). Pre-fix: audit-chain panel ate ~90px ·
779
- * OSS footer ate ~25px · total bottom chrome ~115px on every screen.
780
- * Post-fix: panel collapsed to inline + co-lives with OSS footer in
781
- * the same 28px status-bar line. Audit info stays load-bearing
782
- * (dots + stats + Verify button preserved · only the SHA-256
783
- * subtitle and the panel-card chrome removed). Net ~85px reclaimed.
784
- * No info-loss · just spatial economy. */
785
- .audit-chain-panel {
786
- display: inline-flex; align-items: center; gap: 12px;
787
- padding: 0; margin: 0; background: none; border: none;
788
- }
789
- .audit-chain-title { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); text-transform: uppercase; letter-spacing: 0.06em; }
790
- /* audit-chain stats line + activity dots · denser footer per demo v12 */
791
- .audit-chain-dots .dot { width: 6px; height: 6px; border-radius: 50%; display: inline-block; }
792
- .audit-chain-dots .dot.allow { background: var(--fg-70); }
793
- .audit-chain-dots .dot.block { background: var(--caught); }
794
- .audit-chain-dots .dot.override { background: var(--warn); }
795
- .audit-chain-dots .dot.muted { background: var(--fg-30); }
796
- .audit-chain-btn {
797
- font-family: var(--mono); font-size: 12px;
798
- padding: 4px 12px; border-radius: 5px; cursor: pointer;
799
- background: rgba(255,154,118,0.08); color: var(--accent);
800
- border: 1px solid rgba(255,154,118,0.40); font-weight: 600;
801
- transition: all 160ms ease;
802
- }
803
- .audit-chain-btn:hover { background: rgba(255,154,118,0.20); box-shadow: 0 0 0 3px rgba(255,154,118,0.10); }
804
- .audit-chain-btn.verified { color: var(--verified); border-color: rgba(132,181,148,0.3); }
805
- .audit-chain-btn.broken { color: var(--caught); border-color: rgba(207,139,126,0.3); }
806
- /* audit-chain-result starts collapsed (the subtitle "SHA-256
807
- * hash-chain · run verify…" ate 25px on every screen). Only renders
808
- * when verifyAuditChain() runs and writes a verdict · gets shown
809
- * inline temporarily after click then fades back. */
810
- .audit-chain-result { display: none; margin-top: 0; font-family: var(--mono); font-size: 12px; }
811
- .audit-chain-result.show { display: inline-block; margin-left: 12px; }
812
- .audit-chain-result .ok { color: var(--verified); }
813
- .audit-chain-result .fail { color: var(--caught); }
814
- .audit-chain-counts { color: var(--fg-50); margin-top: 4px; }
815
- .audit-chain-error { color: var(--caught); margin-top: 4px; padding-left: 12px; }
816
-
817
- /* F-04 · time-gap separator · slides between two consecutive items in the
818
- * task list when their times differ by more than 2 hours. Says "Nh later"
819
- * with an optional "· daemon restart" tail when there's a known restart in
820
- * the gap. Helps the reviewer parse 17h+ histories without scrolling
821
- * forever. */
822
- .time-gap {
823
- display: flex; align-items: center; gap: 16px;
824
- padding: 14px 0; margin: 16px 0;
825
- font-family: var(--mono); font-size: 12px;
826
- color: var(--accent); text-transform: uppercase; letter-spacing: 0.18em;
827
- }
828
- .time-gap .line {
829
- flex: 1; height: 1px;
830
- background: linear-gradient(90deg, transparent, var(--accent), transparent);
831
- opacity: 0.45;
832
- }
833
- .time-gap .label {
834
- padding: 7px 16px; border: 1px solid rgba(255,154,118,0.3);
835
- border-radius: 100px; background: rgba(255,154,118,0.04);
836
- text-align: center; line-height: 1.3;
837
- }
838
- .time-gap .label b { color: var(--fg); font-weight: 600; }
839
- .time-gap .label .sub { display: block; margin-top: 3px; font-size: 10.5px; color: var(--fg-50); letter-spacing: 0.12em; }
840
-
841
- /* F-08 · token table · per-agent breakdown of inputs/outputs/cache/cost in
842
- * task detail · only renders when artifacts.usage has tokens. Mono numbers
843
- * column-aligned, total row bold-line-above. */
844
- .token-table { width: 100%; border-collapse: collapse; font-family: var(--mono); font-size: 12px; }
845
- .token-table th { text-align: right; color: var(--fg-40); font-size: 10.5px; text-transform: uppercase; padding: 4px 8px; font-weight: 500; }
846
- .token-table th:first-child { text-align: left; }
847
- .token-table td { padding: 4px 8px; text-align: right; color: var(--fg-90); }
848
- .token-table td:first-child { text-align: left; color: var(--fg-70); }
849
- .token-table tr.total td { border-top: 1px solid var(--border); color: var(--fg); font-weight: 600; padding-top: 6px; }
850
- .token-table td.dim { color: var(--fg-40); }
851
-
852
- /* F-02 · cross-worktree alert · pulsing dot + label in the squad-row when
853
- * any session in a different cwd has been running > 5 minutes. Click to
854
- * jump to that detail. */
855
- .worktree-alert {
856
- display: none;
857
- font-family: var(--mono); font-size: 10.5px; color: var(--warn);
858
- background: rgba(217,164,65,0.06); border: 1px solid rgba(217,164,65,0.18);
859
- padding: 2px 8px; border-radius: 4px; cursor: pointer;
860
- margin-left: 8px;
861
- }
862
- .worktree-alert:hover { background: rgba(217,164,65,0.12); }
863
- .worktree-alert .pulse-dot {
864
- display: inline-block; width: 6px; height: 6px; border-radius: 50%;
865
- background: var(--warn); margin-right: 6px; animation: pulse 1.6s ease infinite;
866
- }
867
-
868
- /* F-01 · budget threshold warning · drops down under the header when daily
869
- * spend crosses 80% of the cap. Color tracks safe/warn/block. The audit-
870
- * line copy is intentionally plain English: who, how much, what to do. */
871
- .budget-banner {
872
- display: none;
873
- padding: 8px 20px; border-bottom: 1px solid var(--border-soft);
874
- font-family: var(--mono); font-size: 12px;
875
- background: rgba(217,164,65,0.04); color: var(--warn);
876
- }
877
- .budget-banner.block {
878
- background: rgba(207,139,126,0.06); color: var(--caught);
879
- }
880
- .budget-banner .what { color: var(--fg-90); margin-right: 8px; font-weight: 600; }
881
- .budget-banner .hint { color: var(--fg-50); margin-left: 8px; }
882
-
883
- /* A-10 · OSS · MIT footer · proof-of-real strip at the very bottom of the
884
- * dashboard. The marketing line is "codehere is OSS, audit it yourself" ·
885
- * if the running daemon doesn't say so somewhere visible, the line is
886
- * empty marketing. Test count + version come from the server. */
887
- /* OSS footer · proof-of-real strip · matches demo .proof-footer (lines
888
- * 497-505). Darker bg so it reads as ground floor. Codehere wordmark gets
889
- * the brand tint · the only colored item · everything else dim. Hover on
890
- * any link goes to full fg, not 70 · the click target deserves full
891
- * contrast when the cursor's actually there. */
892
- .oss-footer {
893
- flex-shrink: 0; padding: 9px 20px;
894
- border-top: 1px solid var(--border-soft);
895
- background: rgba(0,0,0,0.35);
896
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-40);
897
- display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
898
- }
899
- .oss-footer .brand { color: var(--accent); }
900
- .oss-footer .right { margin-left: auto; }
901
- .oss-footer a { color: var(--fg-50); text-decoration: none; transition: color 180ms cubic-bezier(0.16,1,0.3,1); }
902
- .oss-footer a:hover { color: var(--fg); }
903
- .oss-footer .sep { color: var(--fg-30); }
904
-
905
-
906
- .content { flex: 1; overflow-y: auto; }
907
- .content-inner { padding: 16px 20px; max-width: 900px; margin: 0 auto; }
908
- /* Cockpit shell (Phase-1 S1) · persistent Projects sidebar + main pane. */
909
- .shell { flex: 1; display: flex; min-height: 0; }
910
- .sidebar { flex: 0 0 264px; width: 264px; overflow-y: auto; border-right: 1px solid var(--border-soft); background: var(--bg-1); padding: 12px 8px; }
911
- .sidebar .sb-head { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fg-40); padding: 4px 8px 10px; display: flex; align-items: center; justify-content: space-between; }
912
- /* DESIGN.md §4.1 "your team" roster — the presence dot carries the ONLY hue,
913
- rows stay monochrome; the working agent's dot pulses, an unavailable one
914
- dims (opacity set inline from readiness). This is the memorable thing made literal. */
915
- .sidebar .sb-team { margin-bottom: 14px; }
916
- .sidebar .sb-mate { display: flex; align-items: center; gap: 9px; padding: 5px 8px; border-radius: 6px; font-size: 12px; color: var(--fg-70); cursor: default; }
917
- .sidebar .sb-mate:hover { background: var(--bg-2); color: var(--fg); }
918
- .sidebar .sb-dot-wrap { width: 8px; display: inline-flex; flex: none; }
919
- .sidebar .sb-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
920
- .sidebar .sb-dot.working { animation: runPulse 1.6s ease-in-out infinite; }
921
- .sidebar .sb-mate-nm { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
922
- .sidebar .sb-mate-st { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); flex: none; }
923
- .sb-add { background: none; border: 0; color: var(--fg-40); font-size: 14.5px; line-height: 1; cursor: pointer; padding: 0 4px; border-radius: 4px; transition: color 140ms ease, background 140ms ease; }
924
- .sb-add:hover { color: var(--accent); background: var(--bg-2); }
925
- /* The home pane no longer duplicates the sidebar's project list on desktop. */
926
- @media (min-width: 761px) { .home-projects { display: none; } }
927
- .sb-proj-head { display: flex; align-items: center; gap: 4px; padding: 6px 8px 6px 4px; border-radius: 6px; font-size: 13px; font-weight: 500; color: var(--fg-90); cursor: pointer; }
928
- .sb-proj-head:hover { background: var(--bg-1); }
929
- .sb-proj-head:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
930
- /* Active = a quiet neutral fill. The earlier accent-wash + orange inset bar
931
- on BOTH the group and its leaf at once read as template styling (Ega,
932
- 2026-07-02) — the sidebar stays monochrome; accent is for actions. */
933
- .sb-proj-head.active { background: var(--bg-2); }
934
- .sb-car { background: none; border: 0; padding: 3px; cursor: pointer; color: var(--fg-40); display: inline-flex; flex: none; border-radius: 4px; }
935
- .sb-car:hover { color: var(--fg); background: var(--bg-2); }
936
- .sb-car svg { width: 11px; height: 11px; transition: transform 200ms cubic-bezier(.4,0,.2,1); }
937
- .sb-proj.expanded > .sb-proj-head .sb-car svg { transform: rotate(90deg); }
938
- .sb-pname { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; }
939
- .sb-proj-head .ct { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); flex: none; }
940
- /* Animated expand/collapse — max-height + opacity transition; morphNode toggles
941
- the .expanded class in place, so the transition fires on real user toggles. */
942
- .sb-leaves { max-height: 0; opacity: 0; overflow: hidden; transition: max-height 260ms cubic-bezier(.4,0,.2,1), opacity 200ms ease; }
943
- .sb-proj.expanded > .sb-leaves { max-height: 60vh; opacity: 1; overflow-y: auto; }
944
- .sb-search { padding: 2px 8px 6px 22px; }
945
- .sb-q { width: 100%; box-sizing: border-box; background: var(--bg-1); border: 1px solid var(--border); border-radius: 6px; padding: 5px 8px; font-size: 12px; color: var(--fg-90); font-family: inherit; }
946
- .sb-q:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-wash); }
947
- .sb-q::placeholder { color: var(--fg-40); }
948
- .sb-loading { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); padding: 4px 8px 6px 24px; }
949
- .sb-empty { font-family: var(--mono); font-size: 12px; color: var(--fg-40); padding: 10px 8px; line-height: 1.5; }
950
- .sb-task { display: flex; align-items: center; gap: 7px; padding: 5px 8px 5px 24px; border-radius: 6px; cursor: pointer; font-size: 12px; color: var(--fg-70); }
951
- .sb-task:hover { background: var(--bg-1); }
952
- .sb-task.active { background: var(--bg-2); color: var(--fg-90); }
953
- .sb-task .ab { width: 14px; height: 14px; font-size: 10.5px; flex: none; }
954
- /* Sidebar chips go monochrome — the per-agent candy colors belong in the
955
- room, not stacked down a nav list (DESIGN.md 4.1: identity hues are
956
- presence dots, never nav decoration). The ab.stk.AGENT rules carry 0-3-0
957
- specificity, so the override must match it (sb-task .ab.stk) plus
958
- !important to beat the per-agent backgrounds whichever agent class is on.
959
- First fix was 0-2-0 and silently lost to Aider mauve in the drilled-in
960
- leaves; caught by the regression probe. */
961
- .sb-task .ab.stk { background: var(--bg-2) !important; color: var(--fg-50) !important; border: 1px solid var(--border); }
962
- .sb-task .tt { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; }
963
- .sb-more { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); padding: 4px 8px 8px 24px; cursor: pointer; }
964
- .sb-more:hover { color: var(--fg-70); }
965
- @media (max-width: 760px) { .sidebar { display: none; } }
966
- .section-label {
967
- font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.12em;
968
- color: var(--fg-40); text-transform: uppercase; margin: 16px 0 8px;
969
- display: flex; align-items: center; gap: 8px;
970
- }
971
- .section-label:first-child { margin-top: 0; }
972
- /* Featured section gets the brand tint · pinned demo + recent-work
973
- * sections deserve the visual signal that says "this is what to look
974
- * at first". Sub-dot precedes the label so the eye lands there before
975
- * reading the text. */
976
- .section-label.featured { color: var(--accent); }
977
- .section-label.featured::before {
978
- content: ''; display: inline-block;
979
- width: 5px; height: 5px; border-radius: 50%;
980
- background: var(--accent);
981
- box-shadow: 0 0 0 3px rgba(255,154,118,0.18);
982
- }
983
-
984
- /* Goal-first home · each project (goal) is a group; its tasks live inside.
985
- * The home is organized by what you're working toward, not by status. */
986
- .goal-group { margin: 0 0 22px; }
987
- .goal-head {
988
- display: flex; align-items: baseline; gap: 10px;
989
- padding: 0 0 8px; margin: 20px 0 10px;
990
- border-bottom: 1px solid var(--border);
991
- }
992
- .goal-group:first-child .goal-head { margin-top: 0; }
993
- .goal-title { font-size: 14.5px; font-weight: 600; color: var(--fg); letter-spacing: -0.01em; }
994
- .goal-meta { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); margin-left: auto; }
995
- .goal-head { cursor: pointer; }
996
- .goal-head:hover .goal-title { color: var(--accent); }
997
- .goal-head:hover .goal-meta { color: var(--fg-70); }
998
-
999
- /* The goal room · a single goal opened to its multi-agent turns, in order. */
1000
- .room-head { margin: 4px 0 14px; }
1001
- /* .room-back died for the rail's Today row (nav option B, 2026-07-07). */
1002
- .sb-nav { margin: 0 0 14px; }
1003
- .sb-nav-row { padding: 6px 8px; border-radius: 7px; font-size: 13px; color: var(--fg-70); cursor: pointer; user-select: none; }
1004
- .sb-nav-row:hover { background: var(--bg-2); color: var(--fg); }
1005
- .sb-nav-row.here { background: var(--bg-2); color: var(--fg); }
1006
- .room-title { font-size: 20px; font-weight: 600; color: var(--fg); letter-spacing: -0.01em; }
1007
- .room-title-row { display: flex; align-items: center; gap: 8px; }
1008
- .room-rename { background: transparent; border: 0; color: var(--fg-30); cursor: pointer; padding: 4px; border-radius: 6px; display: inline-flex; opacity: 0; transition: opacity 140ms ease, color 140ms ease; }
1009
- .room-title-row:hover .room-rename { opacity: 1; }
1010
- .room-rename:hover { color: var(--accent); background: var(--bg-2); }
1011
- .room-rename:focus-visible { opacity: 1; }
1012
- .room-rename svg { width: 15px; height: 15px; }
1013
- .room-title-edit { font-size: 20px; font-weight: 600; color: var(--fg); letter-spacing: -0.01em; background: var(--bg-2); border: 1px solid var(--accent); border-radius: 7px; padding: 2px 8px; font-family: var(--sans); outline: none; min-width: 280px; }
1014
- .room-sub { font-family: var(--mono); font-size: 12px; color: var(--fg-40); margin-top: 5px; }
1015
- .turns-label { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.12em; color: var(--fg-40); text-transform: uppercase; margin: 18px 0 12px; }
1016
- /* Conversation (room) — reads like a chat: the request, then the agent's reply */
1017
- .live-strip { display: flex; flex-wrap: wrap; gap: 16px; align-items: center; background: var(--bg-1); border: 1px solid var(--border); border-radius: 10px; padding: 11px 16px; margin: 12px 0 6px; }
1018
- .live-a { display: inline-flex; align-items: center; gap: 7px; font-family: var(--mono); font-size: 12px; color: var(--fg-70); font-variant-numeric: tabular-nums; }
1019
- .live-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); animation: pulse 2.4s ease infinite; }
1020
- .live-task { color: var(--fg-50); }
1021
- .folded-runs { margin: 6px 0; }
1022
- .folded-runs > summary { list-style: none; cursor: pointer; font-family: var(--mono); font-size: 12px; color: var(--fg-40); padding: 10px 4px; border-top: 1px dashed var(--border-soft); }
1023
- .folded-runs > summary::-webkit-details-marker { display: none; }
1024
- .folded-runs > summary::after { content: ' \\00b7 show \\203a'; color: var(--fg-30); }
1025
- .folded-runs[open] > summary { color: var(--fg-50); }
1026
- .folded-runs[open] > summary::after { content: ' \\00b7 hide'; }
1027
- /* Reveals animate open instead of snapping. Native <details> hides non-summary
1028
- content on close, so .reveal-body stays rendered (display:block) and the
1029
- max-height + opacity transition does the open/close motion. */
1030
- .folded-runs > .reveal-wrap { display: grid; grid-template-rows: 0fr; opacity: 0; transition: grid-template-rows 280ms cubic-bezier(.4,0,.2,1), opacity 220ms ease; }
1031
- .folded-runs:not([open]) > .reveal-wrap { display: grid; }
1032
- .folded-runs[open] > .reveal-wrap { grid-template-rows: 1fr; opacity: 1; }
1033
- .reveal-body { overflow: hidden; min-height: 0; }
1034
- /* The agent menu eases in (fade + rise) instead of popping. */
1035
- @keyframes ap-menu-in { from { opacity: 0; transform: translateY(6px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } }
1036
- .agentpick-menu { animation: ap-menu-in 150ms cubic-bezier(.4,0,.2,1); transform-origin: bottom right; }
1037
- /* The task detail view fades up on open instead of snapping in. */
1038
- @keyframes view-in { from { opacity: 0; transform: translateY(7px); } to { opacity: 1; transform: translateY(0); } }
1039
- #task-detail-view { animation: view-in 200ms cubic-bezier(.4,0,.2,1); }
1040
- @media (prefers-reduced-motion: reduce) { .folded-runs > .reveal-wrap, .agentpick-menu, #task-detail-view, .sb-leaves, .sb-car svg { transition: none !important; animation: none !important; } .folded-runs[open] > .reveal-wrap { grid-template-rows: 1fr; } }
1041
- /* reviewer-as-a-turn · a cross-vendor review reads as the reviewer speaking */
1042
-
1043
- /* It-4 V1-MULTITASK · project rollup header · ONE row above a batch's
1044
- * children. Counts are derived live in batchH() every render. */
1045
- .project-rollup { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
1046
- background: var(--glass-1); border: 1px solid var(--border);
1047
- border-radius: 8px; padding: 9px 12px; margin: 6px 0 10px; }
1048
- .project-rollup .rollup-icon { color: var(--fg-50); font-size: 13px; }
1049
- .project-rollup .rollup-count { font-weight: 600; color: var(--fg); font-size: 13px; }
1050
- .project-rollup .rollup-sep { color: var(--fg-40); }
1051
- .project-rollup .rollup-stat { font-family: var(--mono); font-size: 12px; color: var(--fg-50); }
1052
- .project-rollup .rollup-note { margin-left: auto; font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); letter-spacing: 0.04em; }
1053
- /* It-4 V1-FANOUT-ALL · @all fanout grid · one real column per ready adapter,
1054
- * side by side. Each column reuses the room turn card (cardH). */
1055
- .fanout-all { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
1056
- gap: 10px; margin: 0 0 14px; }
1057
- .fanout-col { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
1058
- .fanout-col-head { display: flex; align-items: center; gap: 5px; font-family: var(--mono);
1059
- font-size: 10.5px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--fg-50); }
1060
- .fanout-col .task-card { margin: 0; }
1061
-
1062
- /* S21 · thread grouping — head card + nested older runs of the same task */
1063
- .task-thread { border: 1px solid rgba(255,255,255,0.06); border-radius: 8px; overflow: hidden; margin-bottom: 8px; }
1064
- .task-thread .task-card { margin: 0; border: 0; border-left: 0; border-radius: 0; background: transparent; }
1065
- .task-runs { border-top: 1px solid rgba(255,255,255,0.06); background: rgba(255,255,255,0.015); }
1066
- .tr-more { font-family: var(--mono); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--fg-40); padding: 8px 15px 2px; }
1067
- .task-run { display: flex; align-items: center; gap: 12px; padding: 7px 15px 7px 22px; cursor: pointer; border-top: 1px solid rgba(255,255,255,0.03); }
1068
- .task-run:hover { background: rgba(255,255,255,0.02); }
1069
- .task-run .tr-who { font-family: var(--mono); font-size: 12px; color: var(--fg-40); width: 100px; }
1070
- .task-run .tr-st { flex: 1; font-family: var(--mono); font-size: 12px; color: var(--fg-50); }
1071
- .task-run .tr-st.st-verified, .task-run .tr-st.st-running { color: var(--verified); }
1072
- .task-run .tr-st.st-caught { color: var(--caught); }
1073
- .task-run .tr-c { font-family: var(--mono); font-size: 12px; color: var(--fg-40); }
1074
-
1075
- /* DEEP-4 · runs-timeline — sibling runs of one task, selectable in the detail */
1076
- .runs-strip { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 10px 0 2px; }
1077
- .runs-strip-lbl { font-family: var(--mono); font-size: 12px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--fg-40); margin-right: 2px; }
1078
- .runs-pill { display: inline-flex; align-items: center; gap: 7px; font-family: var(--mono); font-size: 12px; background: rgba(255,255,255,0.03); border: 1px solid var(--border); border-radius: 999px; padding: 4px 11px; color: var(--fg-50); cursor: pointer; }
1079
- .runs-pill:hover { border-color: var(--fg-30); color: var(--fg-70); }
1080
- .runs-pill.cur { border-color: var(--accent); color: var(--fg); background: rgba(232,149,111,0.08); cursor: default; }
1081
- .runs-pill .rp-who { color: var(--fg-40); }
1082
- .runs-pill.cur .rp-who { color: var(--fg-70); }
1083
- .runs-pill .rp-c { color: var(--fg-30); }
1084
- .runs-pill.st-verified .rp-st, .runs-pill.st-running .rp-st { color: var(--verified); }
1085
- .runs-pill.st-caught .rp-st { color: var(--caught); }
1086
-
1087
- /* Task card · glass surface · matches demo v12 .glass-card pattern.
1088
- * Faint white-on-dark fill + 1px low-contrast border · sits on top of
1089
- * the ambient dot-grid. Hover lifts 2px with a bigger shadow + inner
1090
- * ring · the card visibly comes forward when the cursor's on it. */
1091
- .task-card {
1092
- background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);
1093
- border-left: 2px solid rgba(255,255,255,0.06);
1094
- border-radius: 8px; padding: 13px 15px; margin-bottom: 8px;
1095
- cursor: pointer;
1096
- transition:
1097
- transform 300ms cubic-bezier(0.16, 1, 0.3, 1),
1098
- border-color 300ms cubic-bezier(0.16, 1, 0.3, 1),
1099
- background 300ms cubic-bezier(0.16, 1, 0.3, 1),
1100
- box-shadow 300ms cubic-bezier(0.16, 1, 0.3, 1);
1101
- }
1102
- .task-card:hover {
1103
- border-color: rgba(255,255,255,0.12); background: rgba(255,255,255,0.05);
1104
- transform: translateY(-2px);
1105
- box-shadow: 0 12px 40px rgba(0,0,0,0.4), 0 0 0 1px rgba(255,255,255,0.05);
1106
- }
1107
- .task-card.tc-pinned { border-left-color: var(--accent); background: linear-gradient(90deg, rgba(255,154,118,0.04), rgba(255,255,255,0.02) 30%); }
1108
- /* S12 · card left-borders no longer encode agent hue (the agent-* class
1109
- * stays on the element for targeting; the rainbow CSS is dead). One
1110
- * neutral border for all; identity lives in the monochrome chip + name. */
1111
- /* Outcome chip on the right of card-row2 · ✓ / ⚠ / re-run */
1112
- .card-outcome { margin-left: auto; font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.04em; padding: 2px 8px; border-radius: 3px; }
1113
- .card-stop { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.04em; padding: 2px 8px; margin-left: 6px; border-radius: 3px; border: 1px solid rgba(207,139,126,0.45); background: rgba(207,139,126,0.08); color: var(--caught); cursor: pointer; }
1114
- .card-stop:hover { background: rgba(207,139,126,0.18); }
1115
- .card-stop:disabled { opacity: 0.6; cursor: default; }
1116
- .stop-fail { font-family: var(--mono); font-size: 10.5px; padding: 2px 8px; margin-left: 6px; border-radius: 3px; color: var(--caught); background: rgba(207,139,126,0.06); }
1117
- .send-fail { font-size: 12px; color: var(--caught); background: rgba(207,139,126,0.07); border-left: 2px solid rgba(207,139,126,0.5); border-radius: 0 4px 4px 0; padding: 7px 10px; margin-top: 8px; line-height: 1.5; }
1118
- .stop-hero { font-family: var(--mono); font-size: 12px; letter-spacing: 0.04em; padding: 4px 12px; margin-left: 10px; border-radius: 4px; border: 1px solid rgba(207,139,126,0.5); background: rgba(207,139,126,0.1); color: var(--caught); cursor: pointer; }
1119
- .stop-hero:hover { background: rgba(207,139,126,0.2); }
1120
- .card-outcome.ok { color: var(--verified); background: rgba(132,181,148,0.10); }
1121
- .card-outcome.warn { color: var(--warn); background: rgba(217,164,65,0.10); }
1122
- .card-outcome.fail { color: var(--caught); background: rgba(207,139,126,0.10); }
1123
- .card-outcome.queued { color: var(--fg-50); background: rgba(255,255,255,0.03); }
1124
- .card-stalled { margin-top: 6px; font-size: 12px; line-height: 1.4; color: var(--caught); background: rgba(207,139,126,0.07); border-left: 2px solid var(--caught); padding: 5px 8px; border-radius: 3px; }
1125
- .card-row1 { display: flex; align-items: center; gap: 8px; }
1126
- .status-icon { width: 8px; height: 8px; border-radius: 50%; flex-shrink: 0; }
1127
- .status-icon.running { background: var(--accent); animation: pulse 1.5s ease infinite; }
1128
- .status-icon.paused { background: var(--warn); }
1129
- .status-icon.done { background: var(--fg-70); }
1130
- .status-icon.failed { background: var(--caught); }
1131
- .status-icon.crashed { background: var(--caught); }
1132
- .status-icon.killed { background: var(--fg-30); }
1133
- .status-icon.queued { background: var(--fg-30); }
1134
- .status-icon.blocked { background: var(--warn); }
1135
- @keyframes pulse { 0%,100% { opacity: 1; } 50% { opacity: 0.4; } }
1136
- /* The home task CARD (v2 mockup parity): avatar · title+vendor · stat-pill · cost · arrow */
1137
- .tcard { display: flex; align-items: center; gap: 16px; padding: 14px 18px; background: var(--bg-1); border: 1px solid var(--border); border-left: 1px solid var(--border); border-radius: 12px; }
1138
- .tcard:hover { transform: translateY(-2px); border-color: var(--fg-30); background: var(--bg-2); }
1139
- .tcard:hover .tc-arrow { opacity: 1; transform: translateX(0); }
1140
- .tcard .tc-av { flex: none; display: inline-flex; }
1141
- .tcard .tc-av .ab { width: 34px; height: 34px; border-radius: 10px; font-size: 12px; }
1142
- .tcard.active .tc-av .ab { color: var(--accent); border-color: rgba(255,154,118,0.35); }
1143
- .tc-body { flex: 1; min-width: 0; }
1144
- .tc-title { font-size: 14.5px; font-weight: 560; letter-spacing: -0.01em; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; color: var(--fg-90); }
1145
- .tc-meta { font-size: 12px; color: var(--fg-40); margin-top: 3px; }
1146
- .tc-meta .tc-vendor { color: var(--fg-70); }
1147
- .tc-glyphs { display: flex; align-items: center; gap: 14px; flex: none; }
1148
- .tc-stat { display: flex; align-items: center; gap: 6px; font-size: 13px; font-weight: 560; color: var(--fg-70); }
1149
- .tc-stat .tc-ico { width: 18px; height: 18px; display: grid; place-items: center; border-radius: 6px; font-size: 12px; }
1150
- .tc-stat.ok { color: var(--verified); }
1151
- .tc-stat.fail { color: var(--caught); }
1152
- .tc-stat.neutral { color: var(--fg-50); }
1153
- .tc-stat.run { color: var(--warn); }
1154
- .tc-pulse { width: 7px; height: 7px; border-radius: 50%; background: var(--warn); animation: pulse 2.4s ease infinite; }
1155
- .tc-cost { font-size: 13px; color: var(--fg-50); font-weight: 560; font-variant-numeric: tabular-nums; }
1156
- .tc-arrow { color: var(--fg-30); opacity: 0; transform: translateX(-4px); transition: 0.15s ease; font-size: 20px; }
1157
-
1158
- .card-title { font-weight: 600; color: var(--fg); font-size: 13px; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1159
- .card-agent { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); background: rgba(255,255,255,0.04); padding: 2px 6px; border-radius: 4px; display: inline-flex; align-items: center; gap: 5px; }
1160
- /* Shared-proof row (Phase 2.5 team visibility) · provenance + audit attestation on an imported session */
1161
- .shared-proof { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 10px; font-size: 12px; font-family: var(--mono); }
1162
- .prov-from { color: var(--fg-70); background: rgba(255,255,255,0.04); padding: 3px 8px; border-radius: 5px; }
1163
- .prov-note { color: var(--fg-40); font-size: 10.5px; }
1164
- .proof-badge { padding: 3px 8px; border-radius: 5px; font-size: 10.5px; font-weight: 600; }
1165
- .proof-ok { color: var(--verified); background: rgba(132,181,148,0.12); border: 1px solid rgba(132,181,148,0.3); }
1166
- .proof-bad { color: #f08a8a; background: rgba(240,138,138,0.12); border: 1px solid rgba(240,138,138,0.35); }
1167
- .proof-neutral { color: var(--fg-50); background: rgba(255,255,255,0.04); }
1168
- /* Recovery badge — a failover REPLACEMENT took over a stalled/failed agent.
1169
- Amber = codehere saved the task; makes cross-vendor resilience visible. */
1170
- .recovered-badge { color: var(--warn); background: rgba(217,164,65,0.12); border: 1px solid rgba(217,164,65,0.32); padding: 3px 8px; border-radius: 5px; font-size: 10.5px; font-weight: 600; }
1171
- /* Agent identity badge (squircle with initials) — used in cards, squad row,
1172
- * detail header. S12: ONE monochrome style — the initials + the agent NAME
1173
- * carry identity, never a hue (the per-agent rainbow was the main
1174
- * "too many colours" source). */
1175
- .ab { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px; border-radius: 5px; font-family: var(--mono); font-size: 10.5px; font-weight: 700; flex-shrink: 0; letter-spacing: -0.04em; background: var(--bg-3); color: var(--fg-70); border: 1px solid var(--border); }
1176
- .ab.user { background: var(--accent); color: #241a14; border: none; }
1177
- /* Phase 3 · who's-involved · overlapping avatar stack */
1178
- .pstack { display: inline-flex; align-items: center; vertical-align: middle; }
1179
- .pstack { gap: 3px; } /* light spacing, not crowded overlap — 2-char codes stay legible */
1180
- .pstack .ab:first-child { margin-left: 0; }
1181
- .pstack .ab.more { background: var(--raised); color: var(--fg-50); }
1182
- /* Stacked rollup badges · single letter, per-vendor color, legible at a glance. */
1183
- .ab.stk { color: #14110f; font-weight: 700; }
1184
- /* Room message + participant avatars carry the agent identity hue (DESIGN.md
1185
- §4.3 — the avatar IS the teammate). The sidebar NAV stays monochrome via the
1186
- .sb-task .ab.stk !important override; these hue the conversation, not the nav.
1187
- Dark text for legibility on the light hue. */
1188
- .ab.claude, .ab.stk.claude { background: var(--bg-3); color: var(--fg-80); }
1189
- .ab.codex, .ab.stk.codex { background: var(--bg-3); color: var(--fg-80); }
1190
- .ab.gemini, .ab.stk.gemini { background: var(--bg-3); color: var(--fg-80); }
1191
- .ab.aider, .ab.stk.aider { background: var(--bg-3); color: var(--fg-80); }
1192
- .ab.opencode, .ab.stk.opencode { background: var(--bg-3); color: var(--fg-80); }
1193
- .ab.conductor, .ab.stk.conductor { background: var(--bg-3); color: var(--fg-80); }
1194
- .ab.cursor, .ab.stk.cursor { background: var(--bg-3); color: var(--fg-80); }
1195
- .ab.stk.auto { background: var(--bg-3); color: var(--fg-70); }
1196
- .pstack .ab.stk.more { background: var(--raised); color: var(--fg-50); font-weight: 600; }
1197
- .ab.lg { width: 22px; height: 22px; font-size: 10.5px; border-radius: 6px; }
1198
- .ab.sm { width: 14px; height: 14px; font-size: 10.5px; border-radius: 3px; }
1199
- /* Cost signal pill — primitive #2 */
1200
- .cost-signal { display: inline-flex; align-items: center; gap: 4px; font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); padding: 1px 6px; border: 1px solid var(--border); border-radius: 3px; }
1201
- /* S12 green audit · "free" is cost information, not a verified state */
1202
- .cost-signal.free { color: var(--fg-70); border-color: var(--glass-3); background: var(--glass-2); }
1203
- .cost-signal.paid { color: var(--fg-50); }
1204
- .card-row2 { display: flex; align-items: center; gap: 10px; margin-top: 6px; font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); }
1205
- .card-row3 { margin-top: 6px; display: flex; gap: 6px; }
1206
- .card-btn {
1207
- font-family: var(--mono); font-size: 10.5px; padding: 3px 8px;
1208
- border: 1px solid var(--border); border-radius: 4px; cursor: pointer;
1209
- background: transparent; color: var(--fg-50);
1210
- }
1211
- .card-btn:hover { color: var(--fg); border-color: var(--fg-30); }
1212
- .card-btn.kill:hover { color: var(--caught); border-color: var(--caught); }
1213
- .card-btn.verify:hover { color: var(--verified); border-color: var(--verified); }
1214
- .card-btn.restart:hover { color: var(--accent); border-color: var(--accent); }
1215
- .verify-badge { font-family: var(--mono); font-size: 10.5px; padding: 1px 5px; border-radius: 4px; }
1216
- .verify-badge.verified { color: var(--verified); background: rgba(132,181,148,0.10); }
1217
- .verify-badge.unverified { color: var(--fg-30); background: rgba(255,255,255,0.04); }
1218
- .verify-badge.failed { color: var(--caught); background: rgba(207,139,126,0.10); }
1219
-
1220
- .empty-state { text-align: center; padding: 60px 20px; color: var(--fg-40); }
1221
- /* S17 · first-run has exactly ONE primary CTA: the composer. The example
1222
- * prompts are quiet ghost text — no button chrome, no fill, no border —
1223
- * still clickable (they fill the composer), never competing with it. */
1224
- .empty-examples { display: flex; flex-direction: column; align-items: center; gap: 6px; margin-top: 20px; }
1225
- .ex-hint { font-size: 12px; color: var(--fg-50); margin-bottom: 4px; }
1226
- .ex-prompt { font-family: var(--mono); font-size: 12px; color: var(--fg-40); background: transparent; border: 0; padding: 2px 4px; cursor: pointer; transition: color var(--dur) var(--ease); }
1227
- .ex-prompt:hover { color: var(--fg-70); text-decoration: underline; text-underline-offset: 3px; }
1228
- .empty-state h2 { color: var(--fg-70); margin-bottom: 8px; font-weight: 500; font-size: 14.5px; }
1229
- /* First-run onboarding (lives in the empty-state). */
1230
- .onboarding { max-width: 560px; margin: 0 auto; text-align: left; padding: 40px 20px 20px; }
1231
- .onboarding h2 { font-size: 20px; font-weight: 600; color: var(--fg); margin-bottom: 6px; }
1232
- .ob-lede { color: var(--fg-60); font-size: 14.5px; line-height: 1.6; margin: 0 0 20px; }
1233
- .ob-step { display: flex; gap: 12px; padding: 16px 0; border-top: 1px solid var(--border-soft); }
1234
- .ob-num { flex: none; width: 22px; height: 22px; border-radius: 50%; background: var(--bg-2); border: 1px solid var(--border); color: var(--fg-60); font-family: var(--mono); font-size: 12px; display: flex; align-items: center; justify-content: center; }
1235
- .ob-b { flex: 1; min-width: 0; }
1236
- .ob-h { font-size: 13px; font-weight: 600; color: var(--fg-90); margin-bottom: 12px; }
1237
- .ob-agents { display: flex; flex-direction: column; gap: 7px; }
1238
- .ob-agent { display: flex; align-items: center; gap: 9px; font-size: 13px; }
1239
- .ob-agent .ab { width: 18px; height: 18px; font-size: 10.5px; flex: none; }
1240
- .ob-an { flex: 1; color: var(--fg-80); }
1241
- .ob-ast { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); display: inline-flex; align-items: center; gap: 5px; text-transform: uppercase; letter-spacing: 0.06em; }
1242
- .ob-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
1243
- .ob-dot.ready { background: var(--fg-70); }
1244
- .ob-dot.setup { background: var(--warn, #d8b06a); }
1245
- .ob-dot.busy { background: var(--accent); }
1246
- .ob-dot.off { background: var(--fg-30); }
1247
- .ob-hint { font-size: 12px; color: var(--fg-50); margin-top: 12px; line-height: 1.5; }
1248
- .ob-ex { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
1249
- .ob-cta { margin: 2px 0 18px; }
1250
- .ob-tourbtn { background: var(--accent); color: #14110f; border: 0; border-radius: 8px; font-size: 13px; font-weight: 600; padding: 9px 16px; cursor: pointer; transition: filter 140ms ease; }
1251
- .ob-tourbtn:hover { filter: brightness(1.06); }
1252
- /* Interactive walkthrough — spotlight coachmarks over the real UI (non-blocking). */
1253
- .ob-tour { position: fixed; inset: 0; z-index: 9000; pointer-events: none; }
1254
- .ob-spot { position: fixed; border-radius: 9px; box-shadow: 0 0 0 9999px rgba(8,8,10,0.62); outline: 2px solid var(--accent); pointer-events: none; transition: left 280ms cubic-bezier(.4,0,.2,1), top 280ms cubic-bezier(.4,0,.2,1), width 280ms cubic-bezier(.4,0,.2,1), height 280ms cubic-bezier(.4,0,.2,1); }
1255
- .ob-pop { position: fixed; width: 300px; background: var(--bg-1); border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 16px 50px rgba(0,0,0,0.6); padding: 16px; pointer-events: auto; transition: left 220ms ease, top 220ms ease; }
1256
- .ob-pt { font-size: 14.5px; font-weight: 600; color: var(--fg); margin-bottom: 6px; }
1257
- .ob-pb { font-size: 13px; color: var(--fg-60); line-height: 1.55; }
1258
- .ob-pf { display: flex; align-items: center; justify-content: space-between; margin-top: 16px; }
1259
- .ob-pdots { display: inline-flex; gap: 5px; }
1260
- .ob-pdot { width: 6px; height: 6px; border-radius: 50%; background: var(--fg-30); transition: background 160ms ease; }
1261
- .ob-pdot.on { background: var(--accent); }
1262
- .ob-pbtns { display: inline-flex; gap: 6px; align-items: center; }
1263
- .ob-skip { background: none; border: 0; color: var(--fg-50); font-size: 12px; cursor: pointer; padding: 6px 8px; }
1264
- .ob-skip:hover { color: var(--fg); }
1265
- .ob-next { background: var(--fg); color: #0a0a0a; border: 0; border-radius: 7px; font-size: 12px; font-weight: 600; cursor: pointer; padding: 6px 14px; }
1266
- .ob-next:hover { filter: brightness(1.08); }
1267
- @media (prefers-reduced-motion: reduce) { .ob-spot, .ob-pop { transition: none; } }
1268
- /* First-run welcome splash + first-time setup. */
1269
- .ob-welcome { position: fixed; inset: 0; z-index: 9500; background: rgba(8,8,10,0.92); backdrop-filter: blur(8px); display: flex; align-items: center; justify-content: center; padding: 24px; }
1270
- .ob-welcome[hidden] { display: none; } /* the .ob-welcome display:flex would otherwise defeat the hidden attribute and dim the whole app */
1271
- .obw-card { width: 480px; max-width: 100%; background: var(--bg-1); border: 1px solid var(--border); border-radius: 16px; box-shadow: 0 24px 80px rgba(0,0,0,0.6); padding: 36px 32px; animation: view-in 260ms cubic-bezier(.4,0,.2,1); }
1272
- .obw-splash { text-align: center; }
1273
- .obw-mark { font-size: 20px; font-weight: 700; background: linear-gradient(135deg,#ff9a76 0%,#4a90e2 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; margin-bottom: 24px; }
1274
- .obw-h1 { font-size: 20px; font-weight: 600; color: var(--fg); line-height: 1.2; margin-bottom: 12px; }
1275
- .obw-sub { font-size: 14.5px; color: var(--fg-60); line-height: 1.6; max-width: 380px; margin: 0 auto 28px; }
1276
- .obw-actions { display: flex; gap: 10px; justify-content: center; align-items: center; }
1277
- .obw-cta { background: var(--accent); color: #14110f; border: 0; border-radius: 9px; font-size: 14.5px; font-weight: 600; padding: 11px 22px; cursor: pointer; transition: filter 140ms ease; }
1278
- .obw-cta:hover { filter: brightness(1.06); }
1279
- .obw-back { background: none; border: 0; color: var(--fg-50); font-size: 13px; cursor: pointer; padding: 11px 8px; }
1280
- .obw-back:hover { color: var(--fg); }
1281
- .obw-skip { background: none; border: 0; color: var(--fg-40); font-size: 12px; cursor: pointer; margin-top: 18px; display: block; margin-left: auto; margin-right: auto; }
1282
- .obw-skip:hover { color: var(--fg-60); }
1283
- .obw-setup { text-align: left; }
1284
- .obw-steplbl { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--accent); margin-bottom: 16px; }
1285
- .obw-h2 { font-size: 14.5px; font-weight: 600; color: var(--fg-90); margin: 22px 0 4px; }
1286
- .obw-setup .obw-h2:first-of-type { margin-top: 0; }
1287
- .obw-note { font-size: 12px; color: var(--fg-50); line-height: 1.5; margin-bottom: 12px; }
1288
- .obw-budget { display: flex; gap: 8px; }
1289
- .obw-amt { flex: 1; background: var(--bg-2); border: 1px solid var(--border); color: var(--fg-70); border-radius: 8px; padding: 9px 0; font-size: 13px; font-weight: 500; cursor: pointer; transition: border-color 140ms ease, background 140ms ease, color 140ms ease; }
1290
- .obw-amt:hover { border-color: var(--fg-30); }
1291
- .obw-amt.on { background: var(--accent-wash); border-color: var(--accent); color: var(--fg); }
1292
- .obw-setup .obw-actions { justify-content: flex-end; margin-top: 26px; }
1293
-
1294
- /* S12 · first-load skeleton reserves REAL card heights (a .task-card is
1295
- * ~66px: two rows + 13px padding) so content arriving causes zero layout
1296
- * shift. Card-shaped: border + ghost title/meta bars under one shimmer.
1297
- * Never shown on poll refreshes — fetchAll removes it after first data. */
1298
- .skeleton { padding: 16px 20px; max-width: 900px; margin: 0 auto; }
1299
- .skeleton-card {
1300
- height: 66px; border-radius: var(--radius); margin-bottom: 8px;
1301
- border: 1px solid var(--border-soft); background: var(--glass-2);
1302
- position: relative; overflow: hidden; padding: 13px 15px;
1303
- }
1304
- .skeleton-card::before, .skeleton-card::after {
1305
- content: ''; display: block; border-radius: 4px; background: var(--glass-3);
1306
- }
1307
- .skeleton-card::before { height: 13px; width: 55%; margin-bottom: 10px; }
1308
- .skeleton-card::after { height: 10px; width: 32%; }
1309
- .skeleton-card .sk-sweep {
1310
- position: absolute; inset: 0;
1311
- background: linear-gradient(100deg, transparent 35%, rgba(255,255,255,0.05) 50%, transparent 65%);
1312
- background-size: 200% 100%; animation: shimmer 1.2s linear infinite;
1313
- }
1314
- @keyframes shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
1315
-
1316
- /* Detail header · matches demo v12 .phase-head pattern · uppercase brand
1317
- * kicker label · 22px shimmering gradient title · meta line beneath.
1318
- * The shimmer is the same 6-stop gradient as demo h1, scaled down for
1319
- * inside-a-page use (vs full-phase headline). */
1320
- .detail-header {
1321
- display: flex; align-items: flex-start; gap: 12px; margin-bottom: 6px;
1322
- }
1323
- .back-btn {
1324
- font-family: var(--mono); font-size: 12px; color: var(--fg-70);
1325
- cursor: pointer; padding: 4px 8px; border-radius: 4px;
1326
- border: 1px solid var(--border);
1327
- flex-shrink: 0; margin-top: 14px;
1328
- }
1329
- .back-btn:hover { background: rgba(255,255,255,0.06); color: var(--fg-90); }
1330
- .detail-title-wrap { flex: 1; min-width: 0; }
1331
- .detail-kicker {
1332
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-50);
1333
- letter-spacing: 0.18em; text-transform: uppercase; line-height: 1;
1334
- margin-bottom: 4px;
1335
- }
1336
- .detail-title {
1337
- font-family: var(--display);
1338
- font-weight: 700; font-size: 20px; line-height: 1.3;
1339
- letter-spacing: -0.015em;
1340
- color: var(--fg);
1341
- }
1342
- .detail-meta { font-family: var(--mono); font-size: 12px; color: var(--fg-50); margin-bottom: 16px; }
1343
- /* REQUEST_METHOD §2 — the acceptance contract block. Mono label (evidence),
1344
- voice criteria; glyph carries the verdict (green=met, red=unmet, muted=pending). */
1345
- .contract { background: var(--bg-1); border: 1px solid var(--border-soft); border-radius: 10px; padding: 12px 14px; margin: 0 0 16px; }
1346
- .contract .ac-head { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--fg-40); display: flex; align-items: center; margin-bottom: 8px; }
1347
- .contract .ac-count { margin-left: auto; font-size: 10.5px; color: var(--fg-50); }
1348
- .contract .ac-row { display: flex; align-items: baseline; gap: 9px; padding: 3px 0; font-size: 13px; color: var(--fg-90); line-height: 1.5; }
1349
- .contract .ac-g { font-size: 12px; flex: none; width: 12px; text-align: center; color: var(--fg-40); }
1350
- .contract .ac-row.met .ac-g { color: var(--verified); }
1351
- .contract .ac-row.unmet .ac-g { color: var(--caught); }
1352
- .contract .ac-t { flex: 1; min-width: 0; }
1353
- /* Artifacts drawer (task #51) · header trigger + slide-in side panel */
1354
- .art-trig { color: var(--fg-70); cursor: pointer; }
1355
- .art-trig:hover { text-decoration: underline; }
1356
- .art-scrim { position: fixed; inset: 0; background: rgba(0,0,0,.62); opacity: 0; pointer-events: none; transition: opacity .18s; z-index: 90; }
1357
- .art-scrim.open { opacity: 1; pointer-events: auto; }
1358
- /* Centered preview popup · scales up on large screens so diagrams/tables get
1359
- room (vs a cramped right drawer). */
1360
- .art-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%,-48%) scale(.98); opacity: 0; pointer-events: none;
1361
- width: min(880px, 92vw); max-height: 86vh; background: var(--bg-1); border: 1px solid var(--border); border-radius: var(--radius);
1362
- box-shadow: 0 24px 80px rgba(0,0,0,.6); transition: opacity .18s ease, transform .18s ease; z-index: 100; display: flex; flex-direction: column; }
1363
- .art-modal.open { opacity: 1; pointer-events: auto; transform: translate(-50%,-50%) scale(1); }
1364
- .art-modal-h { padding: 14px 18px; border-bottom: 1px solid var(--border); display: flex; align-items: center; font-family: var(--mono); font-size: 12px; font-weight: 600; color: var(--fg-80); }
1365
- .art-modal-h .x { margin-left: auto; cursor: pointer; color: var(--fg-50); font-size: 14.5px; }
1366
- .art-modal-h .x:hover { color: var(--fg-80); }
1367
- .art-modal-body { overflow: auto; padding: 16px 18px; }
1368
- .art-modal-body .panel { border: none; padding: 0; margin: 0; background: transparent; }
1369
- .art-modal-body .panel-title { display: none; }
1370
- /* Legible canvas: each artifact lifts onto an elevated surface so it's not
1371
- lost on near-black, and diagram/chart strokes + table text get contrast. */
1372
- .art-modal .artifact-card, .art-modal .art-mock, .art-modal .art-pick { background: #1c1e26; border: 1px solid #2c2f3a; border-radius: 10px; padding: 14px; margin-bottom: 14px; }
1373
- .art-modal .art-pick { border-left: 3px solid var(--fg-30); }
1374
- .art-modal .artifact-h { color: var(--fg-70); font-size: 12px; margin-bottom: 10px; }
1375
- .art-modal .art-seq { background: #21242e; border: 1px solid #333744; border-radius: 8px; padding: 12px; }
1376
- .art-modal .art-cmp .hd { background: #2a2d38; color: var(--fg-80); }
1377
- .art-modal .art-cmp .rl { background: #23262f; color: var(--fg-70); }
1378
- .art-modal .art-cmp .cell { background: #1a1c23; color: #d2d4de; }
1379
- .art-modal .art-mock-body { color: #cdd0da; }
1380
- /* brighter diagram strokes/text so the graph actually reads */
1381
- .art-modal .seq-svg .ll { stroke: #4a4d5a; }
1382
- .art-modal .seq-svg .box { fill: #2a2e3a; stroke: #444858; }
1383
- .art-modal .seq-svg .msg { stroke: #c2c4d0; }
1384
- .art-modal .seq-svg .msg.ret { stroke: #8a8d9c; }
1385
- .art-modal .seq-svg .mt { fill: #d2d4de; }
1386
- .art-modal .seq-svg .ah { fill: #c2c4d0; }
1387
- .art-modal .seq-svg .ah-ret { fill: #8a8d9c; }
1388
- @media (max-width: 560px){ .art-modal { width: 94vw; max-height: 90vh; } }
1389
- /* Chapter divider · phase transition in the thread narrative (demo v12) */
1390
- .chapter-divider { display: flex; align-items: center; gap: 10px; margin: 14px 0 10px; font-family: var(--mono); font-size: 10.5px; }
1391
- .chapter-divider .ch-prev { color: var(--verified); white-space: nowrap; }
1392
- .chapter-divider .ch-prev:empty { display: none; }
1393
- .chapter-divider .ch-line { flex: 1; height: 1px; background: var(--border); }
1394
- .chapter-divider .ch-next { color: var(--fg-50); white-space: nowrap; text-transform: uppercase; letter-spacing: 0.4px; }
1395
- .chapter-divider .ch-next b { color: var(--fg-70); }
1396
- /* Compact density · tightens the thread for daily-driver scanning (demo W8) */
1397
- body.density-compact .panel { padding: 8px 11px; margin-bottom: 8px; }
1398
- body.density-compact .conv-turn { padding: 6px 0; }
1399
- body.density-compact .artifact-card { margin-bottom: 7px; }
1400
- /* User-override result line (E-03 real flow) */
1401
- .override-result { margin-top: 8px; font-size: 12px; color: var(--fg-60); }
1402
- .override-result .ok { color: var(--verified); margin-right: 4px; }
1403
- .override-result code { background: var(--bg-2,#1a1a1f); padding: 1px 5px; border-radius: 3px; color: var(--accent); font-size: 10.5px; }
1404
- /* Structured artifacts · comparison / mock / pick (demo v12 parity) */
1405
- .artifact-card { margin-bottom: 12px; }
1406
- .artifact-h { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); margin-bottom: 6px; }
1407
- .art-cmp { display: grid; gap: 1px; background: var(--border); border: 1px solid var(--border); border-radius: 6px; overflow: hidden; font-size: 12px; }
1408
- .art-cmp .hd { background: var(--bg-2,#1a1a1f); color: var(--fg-60); font-family: var(--mono); font-size: 10.5px; padding: 6px 8px; font-weight: 600; }
1409
- .art-cmp .rl { background: var(--bg-1,#141418); color: var(--fg-50); font-family: var(--mono); font-size: 10.5px; padding: 6px 8px; }
1410
- .art-cmp .cell { background: var(--bg,#0f0f12); color: var(--fg-70); padding: 6px 8px; }
1411
- .art-cmp .cell .pick { color: var(--verified); }
1412
- .art-cmp .cell .meh { color: var(--warn,#e0b341); }
1413
- .art-mock { border: 1px solid var(--border); border-radius: 6px; overflow: hidden; margin-bottom: 12px; }
1414
- .art-mock-head { display: flex; align-items: center; background: var(--bg-2,#1a1a1f); padding: 6px 10px; font-family: var(--mono); font-size: 10.5px; }
1415
- .art-mock-head .status { color: var(--warn,#e0b341); }
1416
- .art-mock-head .ct { margin-left: auto; color: var(--fg-40); font-size: 10.5px; }
1417
- .art-mock-body { padding: 10px 12px; font-family: var(--mono); font-size: 12px; color: var(--fg-70); white-space: pre; overflow-x: auto; }
1418
- .art-mock-body .jk { color: var(--fg-50); }
1419
- .art-mock-body .js { color: var(--verified); }
1420
- .art-mock-body .jn { color: var(--warn,#e0b341); }
1421
- .art-pick { border-left: 2px solid var(--fg-30); background: transparent; border-radius: 0 6px 6px 0; padding: 10px 12px; margin-bottom: 12px; }
1422
- .art-pick .k { color: var(--fg-70); font-family: var(--mono); font-size: 12px; font-weight: 600; margin-bottom: 5px; }
1423
- .art-pick .what { color: var(--fg-80); font-size: 12px; line-height: 1.5; margin-bottom: 5px; }
1424
- .art-pick .why { color: var(--fg-50); font-size: 12px; line-height: 1.5; }
1425
- /* Benchmark chart · horizontal bars (demo v12 .bench) */
1426
- .art-bench { display: flex; align-items: center; gap: 10px; margin-bottom: 5px; font-size: 12px; }
1427
- .art-bench .bl { font-family: var(--mono); color: var(--fg-50); min-width: 96px; font-size: 10.5px; }
1428
- .art-bench .bb { flex: 1; height: 8px; background: var(--bg-2,#1a1a1f); border-radius: 4px; overflow: hidden; }
1429
- .art-bench .bf { display: block; height: 100%; background: var(--fg-70); border-radius: 4px; }
1430
- .art-bench .bf.allow { background: var(--verified); }
1431
- .art-bench .bf.warn { background: var(--warn,#e0b341); }
1432
- .art-bench .bv { font-family: var(--mono); color: var(--fg-70); min-width: 56px; text-align: right; font-size: 10.5px; }
1433
- /* Verifier severity checklist · ✓/⚠ per check */
1434
- .art-checklist { display: flex; flex-direction: column; gap: 1px; }
1435
- .art-check { display: flex; align-items: baseline; gap: 9px; padding: 5px 0; border-top: 1px solid rgba(42,42,50,.5); font-size: 12px; }
1436
- .art-check:first-child { border-top: none; }
1437
- .art-check .ci { color: var(--verified); flex-shrink: 0; font-size: 12px; }
1438
- .art-check.warn .ci { color: var(--warn,#e0b341); }
1439
- .art-check .cl { color: var(--fg-80); }
1440
- .art-check .cn { color: var(--fg-40); font-family: var(--mono); font-size: 10.5px; margin-left: auto; text-align: right; }
1441
- /* Sequence diagram · inline SVG · var() resolves in CSS rules, never in SVG
1442
- presentation attributes — so every fill/stroke is classed, not inlined. */
1443
- .art-seq { overflow-x: auto; padding: 2px 0; }
1444
- .seq-svg { display: block; max-width: 100%; }
1445
- .seq-svg .ll { stroke: var(--border); stroke-dasharray: 3 3; }
1446
- .seq-svg .box { fill: var(--bg-2,#1a1a1f); stroke: var(--border); }
1447
- .seq-svg .at { fill: var(--fg-80); }
1448
- .seq-svg .msg { stroke: var(--fg-50); fill: none; }
1449
- .seq-svg .msg.ret { stroke: var(--fg-40); stroke-dasharray: 4 3; }
1450
- .seq-svg .msg.allow { stroke: var(--verified); }
1451
- .seq-svg .msg.warn { stroke: var(--warn,#e0b341); }
1452
- .seq-svg .mt { fill: var(--fg-60); }
1453
- .seq-svg .mt.allow { fill: var(--verified); }
1454
- .seq-svg .mt.warn { fill: var(--warn,#e0b341); }
1455
- .seq-svg .ah { fill: var(--fg-50); }
1456
- .seq-svg .ah-allow { fill: var(--verified); }
1457
- .seq-svg .ah-warn { fill: var(--warn,#e0b341); }
1458
- .seq-svg .ah-ret { fill: var(--fg-40); }
1459
- /* Multi-speaker conversation · me + team + agents (demo v12 .turn/.speaker) */
1460
- .conv-turn { padding: 9px 0; border-top: 1px solid rgba(42,42,50,.5); }
1461
- .conv-turn:first-child { border-top: none; }
1462
- /* S17 · @agent route mentions are wayfinding, not a decision — secondary blue */
1463
-
1464
- /* v2 mockup · chat-bubble turns (avatar beside a named bubble) */
1465
- .conv-turn.turn { display: flex; gap: 12px; align-items: flex-start; padding: 0; border-top: none; margin-bottom: 16px; background: none; }
1466
- .conv-turn.turn .ab { width: 30px; height: 30px; border-radius: 9px; font-size: 12px; flex: none; margin-top: 2px; }
1467
- .turn-body { flex: 1; min-width: 0; }
1468
- .turn-name { display: flex; align-items: center; gap: 8px; font-size: 12px; color: var(--fg-50); margin-bottom: 5px; }
1469
- .turn-name b { color: var(--fg-90); font-weight: 560; }
1470
- .turn-name .turn-tier { font-family: var(--mono); font-size: 10.5px; letter-spacing: .06em; text-transform: uppercase; color: var(--fg-40); }
1471
- .turn-name .time { margin-left: auto; font-family: var(--mono); font-size: 10.5px; color: var(--fg-30); }
1472
- /* Day Log (Direction A, Ega-picked 2026-07-06) — the room feed as one
1473
- scannable line per task: rail hue = agent, title + glance, receipt right. */
1474
- .dlog { display: flex; align-items: baseline; gap: 10px; padding: 7px 0 7px 14px; border-left: 2px solid var(--rail, var(--border)); margin: 0 0 2px; cursor: pointer; border-radius: 0 6px 6px 0; }
1475
- .dlog:hover { background: var(--glass-2); }
1476
- .dlog-t { font-weight: 600; font-size: 13px; color: var(--fg); white-space: nowrap; max-width: 38%; overflow: hidden; text-overflow: ellipsis; flex: none; }
1477
- .dlog-x { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); background: var(--glass-3); border-radius: 3px; padding: 1px 6px; flex: none; }
1478
- .dlog-g { font-size: 13px; color: var(--fg-50); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; min-width: 0; }
1479
- .dlog-r { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); white-space: nowrap; margin-left: auto; flex: none; }
1480
- .dlog-v { font-family: var(--mono); font-size: 10.5px; color: var(--verified); flex: none; }
1481
- .dlog-b { font-family: var(--mono); font-size: 10.5px; color: var(--caught); flex: none; }
1482
- .dlog-l { font-family: var(--mono); font-size: 10.5px; color: var(--warn); flex: none; }
1483
- /* Direction A "The Record" (Ega-picked 2026-07-05) — the conversation as a
1484
- clean shared record: one consistent treatment, a hue rail + dot marks the
1485
- speaker, voice text full-width, no bubbles. --rail set inline per speaker. */
1486
- .rec-row { display: flex; gap: 0; margin: 0 0 2px; }
1487
- .rec-rail { width: 2px; flex: none; border-radius: 2px; background: var(--rail, var(--border)); }
1488
- .rec-body { flex: 1; min-width: 0; padding: 8px 0 8px 16px; }
1489
- .rec-meta { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
1490
- .rec-dot { width: 8px; height: 8px; border-radius: 50%; flex: none; background: var(--rail, var(--fg-40)); }
1491
- .rec-who { font-weight: 600; font-size: 13px; color: var(--fg); }
1492
- .rec-role { font-family: var(--mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.06em; color: var(--fg-35, var(--fg-40)); }
1493
- .rec-time { margin-left: auto; font-family: var(--mono); font-size: 10.5px; color: var(--fg-35, var(--fg-40)); }
1494
- .rec-text { font-size: 13px; line-height: 1.55; color: var(--fg-90); }
1495
- .rec-row .rec-text .at-route { color: var(--fg-70); font-family: var(--mono); font-size: 12px; }
1496
- .route-div { display: flex; align-items: center; gap: 12px; margin: 14px 0; font-size: 12px; color: var(--fg-40); }
1497
- .route-div .rl-line { flex: 1; height: 1px; background: var(--border); }
1498
- .route-div .rl-txt .at-route { color: var(--fg-70); font-family: var(--mono); }
1499
- /* v2 mockup · the proof SEAL on the brand gradient (proven by a different vendor) */
1500
- .seal-wrap { margin: 18px 0; }
1501
- .seal { border-radius: 14px; padding: 1.5px; background: linear-gradient(135deg, #ff9a76, #4a90e2); }
1502
- .seal-inner { display: flex; align-items: center; gap: 14px; background: var(--bg-1); border-radius: 12.5px; padding: 15px 18px; }
1503
- .seal-check { width: 34px; height: 34px; border-radius: 10px; display: grid; place-items: center; flex: none; background: linear-gradient(135deg, #ff9a76, #4a90e2); color: #fff; font-size: 14.5px; font-weight: 700; }
1504
- .seal-txt { flex: 1; min-width: 0; }
1505
- .seal-l1 { font-size: 13px; color: var(--fg-90); }
1506
- .seal-l1 b { font-weight: 600; }
1507
- .seal-l2 { font-size: 12px; color: var(--fg-50); margin-top: 3px; line-height: 1.45; }
1508
- .tl-div { display: flex; align-items: center; gap: 9px; margin: 15px 0 8px; }
1509
- .tl-verb { font-family: var(--mono); font-size: 10.5px; letter-spacing: .03em; color: var(--fg-70); background: rgba(255,255,255,.03); border: 1px solid var(--border); border-radius: 999px; padding: 2px 10px; white-space: nowrap; }
1510
- .tl-ln { flex: 1; height: 1px; background: var(--border); }
1511
- .tl-acts { padding-left: 25px; display: flex; flex-direction: column; gap: 4px; margin-bottom: 6px; }
1512
- .tl-evt { font-family: var(--mono); font-size: 12px; }
1513
- .tl-evt > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 7px; padding: 4px 9px; border: 1px solid var(--border); border-radius: 6px; color: var(--fg-50); }
1514
- .tl-evt > summary::-webkit-details-marker { display: none; }
1515
- .tl-evt > summary:hover { color: var(--fg-70); border-color: var(--fg-30); }
1516
- .tl-evt .tl-caret { color: var(--fg-30); transition: transform .12s; font-size: 10.5px; }
1517
- .tl-evt[open] .tl-caret { transform: rotate(90deg); }
1518
- .tl-evt .tl-lbl { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1519
- .tl-evt .tl-dur { color: var(--fg-30); }
1520
- .tl-evt .tl-badge { font-size: 10.5px; padding: 1px 6px; border-radius: 4px; margin-left: auto; }
1521
- .tl-evt .tl-lbl + .tl-badge { margin-left: auto; }
1522
- .tl-evt .tl-outcome { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--fg-40); }
1523
- .tl-evt .tl-outcome::before { content: "\\00b7\\00a0"; color: var(--fg-30); }
1524
- .tl-evt.tl-flat > summary { cursor: default; }
1525
- .tl-evt.tl-flat .tl-caret { visibility: hidden; }
1526
- /* DESIGN.md §4.3 room→receipts — the step wall collapses into one calm mono
1527
- row; evidence one click away. Mono = evidence per the voice/evidence split. */
1528
- .tl-receipt { margin: 8px 0 4px; }
1529
- .tl-receipt > summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 8px; padding: 8px 12px; background: var(--bg-1); border: 1px solid var(--border-soft); border-radius: 8px; font-family: var(--mono); font-size: 12px; color: var(--fg-50); }
1530
- .tl-receipt > summary::-webkit-details-marker { display: none; }
1531
- .tl-receipt > summary:hover { color: var(--fg-70); border-color: var(--border); }
1532
- .tl-receipt .tl-caret { color: var(--fg-30); transition: transform .12s; }
1533
- .tl-receipt[open] > summary .tl-caret { transform: rotate(90deg); }
1534
- .tl-receipt .rcpt-view { margin-left: auto; color: var(--fg-35, var(--fg-40)); }
1535
- .tl-receipt[open] > summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; color: var(--fg-70); }
1536
- .tl-receipt .rcpt-body { border: 1px solid var(--border-soft); border-top: none; border-radius: 0 0 8px 8px; padding: 10px 12px 4px; }
1537
- .tl-evt .tl-badge.allow { color: var(--verified); background: rgba(52,208,88,.12); }
1538
- .tl-evt .tl-badge.block { color: var(--caught); background: rgba(207,139,126,.14); }
1539
- .tl-evt .tl-badge.clean { color: var(--fg-70); background: rgba(255,255,255,.06); }
1540
- .tl-evt.block > summary { border-color: rgba(207,139,126,.35); }
1541
- .tl-out { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); white-space: pre-wrap; padding: 7px 10px 2px 20px; }
1542
- /* Expandable full tool output (ANSI-colored; was clipped to 400 chars) */
1543
- .tl-out-x { margin: 2px 0 2px 20px; }
1544
- .tl-out-x > summary { list-style: none; cursor: pointer; display: flex; align-items: baseline; gap: 6px; }
1545
- .tl-out-x > summary::-webkit-details-marker { display: none; }
1546
- .tl-out-x .tl-out-prev { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); white-space: pre-wrap; flex: 1; min-width: 0; max-height: 40px; overflow: hidden; }
1547
- .tl-out-x .tl-out-more { font-size: 10.5px; color: var(--fg-70); white-space: nowrap; }
1548
- .tl-out-x[open] .tl-out-more::after { content: ' (collapse)'; }
1549
- .tl-out-full { font-family: var(--mono); font-size: 12px; color: var(--fg-70); white-space: pre-wrap; word-break: break-word; background: var(--bg-2); border-radius: 5px; padding: 8px 11px; margin: 5px 0 2px 16px; max-height: 360px; overflow: auto; }
1550
- /* Agent thinking (kind:'think') · interleaved reasoning, muted */
1551
- .tl-think { margin: 7px 0 7px 33px; padding-left: 10px; border-left: 2px solid var(--border); }
1552
- .tl-think-tag { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); letter-spacing: 0.04em; text-transform: uppercase; }
1553
- .tl-think-text { color: var(--fg-50); font-size: 12px; line-height: 1.5; font-style: italic; margin-top: 2px; }
1554
- .tl-think-text .ic { font-style: normal; }
1555
- /* Agent question card (kind:'ask') · the agent is asking the user */
1556
- .tl-ask { margin: 12px 0; border: 1px solid var(--accent); border-radius: 9px; background: rgba(255,154,118,.05); padding: 12px 14px; }
1557
- .tl-ask-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
1558
- .tl-ask-title { font-weight: 600; font-size: 13px; color: var(--accent); }
1559
- .ask-q { margin: 8px 0; }
1560
- .ask-q-head { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 3px; }
1561
- .ask-q-text { font-size: 14.5px; color: var(--fg); font-weight: 500; margin-bottom: 8px; }
1562
- .ask-opts { display: flex; flex-direction: column; gap: 6px; }
1563
- .ask-opt { display: flex; flex-direction: column; gap: 1px; padding: 8px 11px; border: 1px solid var(--border); border-radius: 7px; cursor: pointer; transition: border-color .12s, background .12s; }
1564
- .ask-opt:hover { border-color: var(--accent); background: rgba(255,154,118,.08); }
1565
- .ask-opt.picked { border-color: var(--accent); background: rgba(255,154,118,.14); }
1566
- .ask-opt-label { font-size: 13px; color: var(--fg); font-weight: 500; }
1567
- .ask-opt-desc { font-size: 12px; color: var(--fg-50); line-height: 1.4; }
1568
- .ask-hint { font-size: 12px; color: var(--fg-40); margin-top: 8px; }
1569
- .ask-foot { margin-top: 9px; }
1570
- .ask-send { background: var(--accent); color: #1a1a1f; border: none; border-radius: 7px; font-size: 12px; font-weight: 600; padding: 7px 14px; cursor: pointer; }
1571
- .ask-send:disabled { opacity: .5; cursor: default; }
1572
- .ask-answered { margin-top: 9px; font-size: 12px; color: var(--verified); font-weight: 500; }
1573
- .tl-ask.answered { border-color: var(--border); background: rgba(255,255,255,.02); }
1574
- .tl-ask.answered .ask-opt { cursor: default; }
1575
- /* Agent's own words (kind:'say') · the "watch it work" reasoning, in the agent's voice */
1576
- .tl-say { display: flex; gap: 12px; align-items: flex-start; margin: 14px 0; }
1577
- .tl-say .ab { margin-top: 2px; width: 30px; height: 30px; border-radius: 9px; font-size: 12px; }
1578
- .tl-say-text { flex: 1; min-width: 0; font-size: 13px; color: var(--fg-80); line-height: 1.5; background: var(--bg-1); border: 1px solid var(--border); border-radius: 12px; border-top-left-radius: 3px; padding: 11px 14px; }
1579
- .summary-turn .tl-say-body { flex: 1; min-width: 0; }
1580
- .summary-turn .card-agent { display: inline-block; margin-bottom: 7px; }
1581
- /* Layered turn — the glance leads, the record rests collapsed behind it. */
1582
- .glance-turn .gl-line { font-size: 14.5px; line-height: 1.5; color: var(--fg-90); letter-spacing: -0.005em; }
1583
- .glance-turn .gl-receipt { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin-top: 8px;
1584
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); }
1585
- .glance-turn .vline { margin: 10px 0 0; }
1586
- .glance-turn .vline-meta { margin-top: 2px; }
1587
- .glance-turn .gl-more { margin-top: 10px; }
1588
- .glance-turn .gl-more > summary { list-style: none; cursor: pointer; font-family: var(--mono); font-size: 10.5px;
1589
- text-transform: uppercase; letter-spacing: 0.06em; color: var(--fg-40); user-select: none; }
1590
- .glance-turn .gl-more > summary::-webkit-details-marker { display: none; }
1591
- .glance-turn .gl-more > summary:hover { color: var(--fg-70); }
1592
- .glance-turn .gl-more[open] > summary { margin-bottom: 8px; }
1593
- .glance-turn .gl-more .tl-say-text { border-top-left-radius: 12px; }
1594
-
1595
- .panel {
1596
- background: var(--bg-1); border: 1px solid var(--border); border-radius: 12px;
1597
- padding: 13px 16px; margin-bottom: 12px;
1598
- }
1599
- .panel-title { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.06em; color: var(--fg-40); text-transform: uppercase; margin-bottom: 9px; }
1600
- /* Observed (host) sessions — the coding agents codehere watches in your own
1601
- terminal · distinct from spawned tasks below. Proves the INWARD axis:
1602
- every agent, even the one you're talking to right now, is a member. */
1603
- .obs-head { display: flex; align-items: center; gap: 7px; font-size: 12px; color: var(--fg-60); margin-bottom: 2px; }
1604
- /* S19 · the eye emoji died; a state-colored glyph anchors the head (● live, ○ idle) */
1605
- .obs-head .obs-glyph { font-family: var(--mono); color: var(--fg-40); }
1606
- .obs-head .obs-glyph.live { color: var(--fg); }
1607
- .obs-head b { color: var(--fg-80); font-weight: 600; }
1608
- .obs-sub { font-size: 10.5px; color: var(--fg-40); margin-bottom: 9px; }
1609
- /* Thariq loop-2 · the observer as a PROMINENT rail (was a thin strip). */
1610
- #observer-rail { margin: 0 0 22px; }
1611
- .observer-rail { background: linear-gradient(180deg, var(--accent-wash, rgba(255,154,118,.10)), transparent); border: 1px solid rgba(255,154,118,0.22); border-radius: 9px; padding: 15px 18px; }
1612
- .observer-rail .obs-head { font-size: 13px; color: var(--fg-80); margin-bottom: 3px; }
1613
- .observer-rail .obs-head b { color: var(--fg); }
1614
- .observer-rail .obs-head .obs-live-n { color: var(--fg); font-weight: 600; }
1615
- .observer-rail .obs-sub { font-size: 12px; color: var(--fg-50); margin-bottom: 12px; }
1616
- .observer-rail .obs-row { padding: 8px 10px; margin: 0; font-size: 12px; border-top-color: var(--border-soft); }
1617
- .observer-rail.empty { border-style: dashed; }
1618
- .observer-rail .obs-teach { font-size: 12px; color: var(--fg-50); line-height: 1.6; margin-top: 4px; }
1619
- .observer-rail .obs-teach code { background: var(--bg-2); padding: 1px 6px; border-radius: 4px; font-family: var(--mono); color: var(--accent); }
1620
- .obs-row { display: flex; align-items: center; gap: 10px; padding: 6px 8px; margin: 0 -8px; border-top: 1px solid var(--border); font-size: 12px; cursor: pointer; border-radius: 5px; transition: background 0.12s; }
1621
- .obs-row:first-of-type { border-top: none; }
1622
- .obs-row:hover { background: rgba(255,154,118,0.06); }
1623
- .obs-id { font-family: var(--mono); color: var(--accent); font-size: 12px; min-width: 66px; }
1624
- .obs-mix { color: var(--fg-50); flex: 1; font-family: var(--mono); font-size: 10.5px; }
1625
- .obs-dur { color: var(--fg-40); font-size: 10.5px; }
1626
- .obs-live { width: 7px; height: 7px; border-radius: 50%; flex-shrink: 0; }
1627
- .obs-live.live { background: var(--fg); animation: cb-blink 1.4s ease infinite; }
1628
- .obs-live.recent { background: var(--warn,#e0b341); }
1629
- .obs-live.idle { background: var(--fg-30); }
1630
- .obs-badge { font-size: 10.5px; text-transform: uppercase; font-family: var(--mono); padding: 1px 6px; border-radius: 4px; letter-spacing: 0.3px; }
1631
- .obs-badge.low { color: var(--verified); border: 1px solid color-mix(in srgb, var(--verified) 40%, transparent); }
1632
- .obs-badge.medium { color: var(--warn, #e0b341); border: 1px solid color-mix(in srgb, var(--warn, #e0b341) 40%, transparent); }
1633
- .obs-badge.high { color: var(--caught); border: 1px solid color-mix(in srgb, var(--caught) 40%, transparent); }
1634
- .obs-blocked { color: var(--caught); font-size: 10.5px; font-family: var(--mono); }
1635
- /* Host-session thread · tool-call timeline */
1636
- .obs-timeline { display: flex; flex-direction: column; }
1637
- .obs-call { display: flex; align-items: baseline; gap: 10px; padding: 5px 0; border-top: 1px solid var(--border); font-size: 12px; }
1638
- .obs-call:first-child { border-top: none; }
1639
- .obs-call.is-block { background: color-mix(in srgb, var(--caught) 8%, transparent); margin: 0 -8px; padding: 5px 8px; border-radius: 4px; border-top-color: transparent; }
1640
- .obs-call-time { font-family: var(--mono); color: var(--fg-30); font-size: 10.5px; min-width: 64px; flex-shrink: 0; }
1641
- .obs-call-tool { font-family: var(--mono); color: var(--accent); font-size: 10.5px; min-width: 56px; flex-shrink: 0; }
1642
- .obs-call-prev { color: var(--fg-60); font-family: var(--mono); font-size: 10.5px; flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1643
- .obs-call-tag { font-family: var(--mono); font-size: 10.5px; text-transform: uppercase; letter-spacing: 0.3px; padding: 1px 5px; border-radius: 3px; flex-shrink: 0; }
1644
- .obs-call-tag.ok { color: var(--fg-40); }
1645
- .obs-call-tag.warn { color: var(--warn, #e0b341); }
1646
- .obs-call-tag.block { color: var(--caught); border: 1px solid color-mix(in srgb, var(--caught) 40%, transparent); }
1647
- .obs-call-tag.crit { color: #fff; background: var(--caught); }
1648
- /* Chain-flow · audit chain as connected nodes (demo v12 .chain-flow) */
1649
- .chain-flow-wrap { padding: 4px 0 14px; }
1650
- .chain-flow { display: flex; align-items: center; gap: 0; overflow-x: auto; padding: 4px 2px 8px; }
1651
- .cf-node { display: inline-flex; flex-direction: column; align-items: center; justify-content: center; min-width: 34px; height: 34px; border-radius: 7px; border: 1px solid var(--border); background: var(--bg-2,#1a1a1f); flex-shrink: 0; cursor: default; }
1652
- .cf-node .cf-seq { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); line-height: 1; }
1653
- .cf-node .cf-tool { font-family: var(--mono); font-size: 12px; font-weight: 700; color: var(--fg-70); line-height: 1.2; }
1654
- .cf-node.ok { border-color: color-mix(in srgb, var(--verified) 35%, var(--border)); }
1655
- .cf-node.ok .cf-tool { color: var(--verified); }
1656
- .cf-node.block { border-color: var(--caught); background: color-mix(in srgb, var(--caught) 12%, var(--bg-2,#1a1a1f)); }
1657
- .cf-node.block .cf-tool { color: var(--caught); }
1658
- .cf-node.crit { border-color: var(--caught); background: var(--caught); }
1659
- .cf-node.crit .cf-tool, .cf-node.crit .cf-seq { color: #fff; }
1660
- .cf-link { width: 14px; height: 2px; background: linear-gradient(90deg, var(--verified), color-mix(in srgb, var(--verified) 30%, transparent)); flex-shrink: 0; opacity: 0.6; }
1661
- .cf-gap { font-family: var(--mono); font-size: 12px; color: var(--fg-30); padding: 0 8px; flex-shrink: 0; letter-spacing: 1px; }
1662
- .cf-legend { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); }
1663
- /* Observed session · honest read-only affordance (no fake composer) */
1664
- .obs-readonly-note { margin-top: 14px; padding: 12px 14px; border: 1px dashed var(--border); border-radius: 8px; background: rgba(255,255,255,0.015); }
1665
- .obs-readonly-note .t { font-size: 12px; color: var(--fg-50); line-height: 1.5; margin-bottom: 10px; }
1666
- .obs-fork-btn { background: var(--accent); color: #1a1a1f; border: none; border-radius: 6px; font-size: 12px; font-weight: 600; padding: 7px 12px; cursor: pointer; }
1667
- .obs-fork-btn:hover { filter: brightness(1.08); }
1668
- .obs-fork-btn:disabled { opacity: 0.6; cursor: default; }
1669
- /* Remote-control panel · drive a managed agent (inject into running turn) */
1670
- #control-panel:empty { display: none; }
1671
- .ctl-head { font-size: 12px; color: var(--fg-50); font-family: var(--mono); margin-bottom: 8px; }
1672
- .ctl-head .ag { color: var(--fg); font-weight: 600; }
1673
- .ctl-head code { background: var(--bg-2,#1a1a1f); padding: 1px 5px; border-radius: 3px; color: var(--fg-70); }
1674
- .ctl-feed { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; max-height: 240px; overflow-y: auto; }
1675
- .ctl-evt { font-size: 12px; color: var(--fg-80); padding: 5px 9px; background: var(--bg-2,#1a1a1f); border-radius: 6px; border-left: 2px solid var(--border); }
1676
- .ctl-evt.dim { color: var(--fg-40); border-left-color: var(--border); font-style: italic; }
1677
- .ctl-composer { display: flex; gap: 7px; }
1678
- .ctl-composer input { flex: 1; background: var(--bg-2,#1a1a1f); border: 1px solid var(--border); border-radius: 6px; color: var(--fg); padding: 7px 10px; font-size: 12px; }
1679
- .ctl-composer input:focus { outline: none; border-color: var(--accent); }
1680
- .ctl-composer button { background: var(--accent); color: #1a1a1f; border: none; border-radius: 6px; font-size: 12px; font-weight: 600; padding: 7px 12px; cursor: pointer; }
1681
- /* Remote Control · honest live badge + steer chips + channel line. The badge
1682
- renders ONLY inside the real-channel branch (controlManagedAgent success) —
1683
- no live channel, no badge. Anti-screen-lie (the F-AGENT-SWITCHER class). */
1684
- .ctl-badge { display: inline-flex; align-items: center; gap: 7px; background: rgba(132,181,148,0.08); border: 1px solid rgba(132,181,148,0.35); border-radius: 999px; padding: 5px 12px; font-size: 12px; color: var(--verified); font-weight: 600; margin-bottom: 10px; }
1685
- .ctl-badge .lv { width: 8px; height: 8px; border-radius: 50%; background: var(--verified); box-shadow: 0 0 7px var(--verified); animation: pulse 1.6s infinite; }
1686
- .ctl-steer { display: flex; gap: 7px; flex-wrap: wrap; margin-bottom: 9px; }
1687
- .ctl-steer .chip { font-size: 12px; color: var(--fg-70); border: 1px solid var(--border); border-radius: 999px; padding: 4px 11px; cursor: pointer; }
1688
- .ctl-steer .chip:hover { border-color: var(--accent); color: var(--fg); }
1689
- .ctl-steer .chip.stop { border-color: rgba(207,139,126,0.4); color: var(--caught); }
1690
- .ctl-channel { display: flex; align-items: center; gap: 7px; font-size: 12px; color: var(--fg-40); margin-top: 8px; }
1691
- .ctl-channel .lv { width: 7px; height: 7px; border-radius: 50%; background: var(--verified); box-shadow: 0 0 7px var(--verified); }
1692
- .ctl-channel b { color: var(--verified); }
1693
- .outcome-item { display: flex; align-items: center; gap: 6px; font-size: 12px; color: var(--fg-70); margin-bottom: 4px; }
1694
- .outcome-item .check { color: var(--verified); }
1695
- .outcome-item .cross { color: var(--caught); }
1696
- .outcome-item .pending { color: var(--fg-40); }
1697
-
1698
- /* .verdict / .verdict.verified / .unverified / .failed removed 2026-08-07:
1699
- zero emitters anywhere in the product. Found by the §1 gate, which flagged
1700
- a verdict painting itself green with no evidence behind it — the rule was
1701
- right, the code was just already dead. */
1702
-
1703
-
1704
- /* W-PASS payload diff coloring · old values red strike-through, new values green */
1705
- .wp-payload .key { color: var(--fg-50); }
1706
- .wp-payload .val { color: var(--verified); }
1707
- .wp-payload .from { color: var(--caught); text-decoration: line-through; }
1708
- .wp-payload .arrow { color: var(--fg-40); margin: 0 4px; }
1709
- .wp-payload .added { color: var(--verified); }
1710
-
1711
- /* W-PASS inline write-pass card · matches demo v12 lines 691-704 · blue
1712
- * accent (not orange) because writes to third-party systems are the rare
1713
- * moment when codehere mediates instead of just observes. Lives inline in
1714
- * the step timeline · primary button opens the modal for actual approval. */
1715
- .write-pass {
1716
- padding: 12px 14px; margin: 10px 0;
1717
- background: var(--glass-3);
1718
- border: 1px solid var(--glass-3);
1719
- border-left: 3px solid var(--fg-30);
1720
- border-radius: 6px;
1721
- }
1722
- .write-pass .head {
1723
- display: flex; align-items: baseline; gap: 8px;
1724
- margin-bottom: 6px;
1725
- font-family: var(--mono); font-size: 10.5px;
1726
- color: var(--fg-70); letter-spacing: 0.12em; text-transform: uppercase;
1727
- }
1728
- .write-pass h4 {
1729
- font-size: 13px; font-weight: 600; color: var(--fg);
1730
- margin: 2px 0 6px;
1731
- }
1732
- .write-pass .target { font-family: var(--mono); font-size: 12px; color: var(--fg-70); margin-bottom: 6px; }
1733
- .write-pass .target b { color: var(--fg); }
1734
- .write-pass .payload {
1735
- padding: 8px 11px; margin: 6px 0;
1736
- background: hsl(0 0% 9%); border: 1px solid var(--border);
1737
- border-radius: 4px;
1738
- font-family: var(--mono); font-size: 12px;
1739
- color: var(--fg-70); white-space: pre-wrap; line-height: 1.55;
1740
- }
1741
- .write-pass .payload .key { color: var(--fg-50); }
1742
- .write-pass .payload .val { color: var(--verified); font-weight: 600; }
1743
- .write-pass .payload .from { color: var(--caught); text-decoration: line-through; }
1744
- .write-pass .payload .arrow { color: var(--fg-40); margin: 0 4px; }
1745
- .write-pass .actions {
1746
- display: flex; gap: 6px; margin-top: 8px; flex-wrap: wrap;
1747
- }
1748
- .write-pass button {
1749
- font-family: var(--mono); font-size: 12px; padding: 5px 11px;
1750
- border-radius: 4px; cursor: pointer;
1751
- border: 1px solid var(--border); background: transparent; color: var(--fg-70);
1752
- transition: filter 150ms, border-color 150ms, color 150ms;
1753
- }
1754
- .write-pass button.primary {
1755
- background: var(--accent); color: #241a14; border-color: var(--accent); font-weight: 600;
1756
- }
1757
- .write-pass button.primary:hover { filter: brightness(1.08); }
1758
-
1759
-
1760
- /* Verified celebration · matches demo v12 .verified-block (lines 429-438).
1761
- * Centered card with gradient green bg, 38px ✓ badge, uppercase VERIFIED
1762
- * kicker, larger headline, mono stats line. Arrival animation slides up
1763
- * + shimmer sweep so the moment lands. The single most important moment
1764
- * in the detail view — the agent's claim survived verification. */
1765
- .verified-block {
1766
- padding: 18px 22px; text-align: center;
1767
- background: linear-gradient(135deg, rgba(132,181,148,0.08), rgba(132,181,148,0.02));
1768
- border: 1px solid rgba(132,181,148,0.35);
1769
- border-left: 3px solid var(--verified); border-radius: 8px;
1770
- margin: 8px 0; position: relative; overflow: hidden;
1771
- opacity: 0; transform: translateY(12px);
1772
- animation: verifiedIn 600ms cubic-bezier(0.16,1,0.3,1) 300ms forwards,
1773
- verifiedShimmer 1.2s ease 900ms;
1774
- }
1775
- @keyframes verifiedIn { to { opacity: 1; transform: translateY(0); } }
1776
- @keyframes verifiedShimmer {
1777
- 0% { background-image: linear-gradient(110deg, transparent 30%, rgba(132,181,148,0.18) 50%, transparent 70%); background-size: 250% 100%; background-position: -50% 0; background-repeat: no-repeat; }
1778
- 100% { background-image: linear-gradient(110deg, transparent 30%, rgba(132,181,148,0.18) 50%, transparent 70%); background-size: 250% 100%; background-position: 150% 0; background-repeat: no-repeat; }
1779
- }
1780
- .verified-block .badge {
1781
- display: inline-flex; align-items: center; justify-content: center;
1782
- width: 38px; height: 38px; border-radius: 50%;
1783
- background: var(--verified); color: #000;
1784
- font-size: 20px; font-weight: 700;
1785
- margin-bottom: 8px; box-shadow: 0 0 0 4px rgba(132,181,148,0.15);
1786
- }
1787
- .verified-block .k {
1788
- font-family: var(--mono); font-size: 10.5px; color: var(--verified);
1789
- letter-spacing: 0.18em; text-transform: uppercase; margin-bottom: 5px;
1790
- }
1791
- .verified-block .what {
1792
- font-size: 20px; font-weight: 600; color: var(--fg);
1793
- margin-bottom: 6px; letter-spacing: -0.01em; line-height: 1.35;
1794
- }
1795
-
1796
- details.collapsible { margin-bottom: 12px; }
1797
- details.collapsible summary {
1798
- font-family: var(--mono); font-size: 12px; color: var(--fg-50);
1799
- cursor: pointer; padding: 8px 0; user-select: none;
1800
- }
1801
- details.collapsible summary:hover { color: var(--fg); }
1802
- .turn { padding: 6px 0; border-bottom: 1px solid var(--border-soft); font-size: 12px; }
1803
- .turn.user { color: var(--fg-90); }
1804
- .turn.assistant { color: var(--fg-70); }
1805
- .tc { font-size: 12px; padding: 8px 0; border-bottom: 1px solid var(--border-soft); }
1806
- .tc-label { color: var(--fg); font-weight: 500; }
1807
- .tc-output { margin: 4px 0 0; padding: 6px 10px; background: var(--bg-2); border-radius: 4px; font-family: var(--mono); font-size: 12px; color: var(--fg-50); white-space: pre-wrap; word-break: break-all; max-height: 100px; overflow: auto; }
1808
- .tc-dur { font-size: 10.5px; color: var(--fg-30); margin-left: 8px; }
1809
-
1810
- .input-area {
1811
- border-top: 1px solid var(--border-soft); padding: 12px 20px;
1812
- background: var(--bg-1); flex-shrink: 0;
1813
- }
1814
- /* GitHub import row (initGhImport): connect button or repo + issue picker. */
1815
- .gh-import { display: flex; align-items: center; gap: 6px; margin: 0 auto 6px; max-width: 900px; font-size: 12px; color: var(--fg-50); flex-wrap: wrap; }
1816
- .gh-import:empty { display: none; }
1817
- .gh-import .ghi-in { flex: 0 0 180px; background: rgba(255,255,255,.06); border: 1px solid rgba(255,255,255,.12); border-radius: 6px; color: inherit; font: inherit; font-size: 12px; padding: 3px 8px; }
1818
- .gh-import .ghi-sel { background: var(--bg-2); border: 1px solid rgba(255,255,255,.12); border-radius: 6px; color: var(--fg); font: inherit; font-size: 12px; padding: 3px 8px; max-width: 360px; }
1819
- .gh-import .ghi-btn { background: none; border: 1px solid rgba(255,255,255,.18); border-radius: 6px; color: var(--fg-70); font: inherit; font-size: 12px; padding: 3px 10px; cursor: pointer; }
1820
- .gh-import .ghi-btn:hover { border-color: var(--accent); color: var(--fg); }
1821
- .gh-import .ghi-hint, .gh-import .ghi-msg { color: var(--fg-40); }
1822
- .input-bar {
1823
- display: flex; align-items: center; gap: 10px;
1824
- background: var(--bg-2); border: 1px solid var(--border);
1825
- border-radius: 12px; padding: 10px 14px; max-width: 900px; margin: 0 auto;
1826
- transition: border-color 140ms ease, box-shadow 140ms ease;
1827
- }
1828
- /* Composer · typing affordance · matches demo v12 .composer-bar.typing
1829
- * (line 329). The border goes brand-orange the moment the user starts
1830
- * typing · the input visibly "wakes up." :focus-within handles the
1831
- * focus state, .typing handles the value-has-chars state. */
1832
- .input-bar:focus-within { border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-wash); }
1833
- .input-bar.typing { border-color: var(--accent); }
1834
- .input-bar.warn { border-color: var(--warn); }
1835
- .input-bar.block { border-color: var(--caught); }
1836
- /* R10 · one canonical composer at a time. When detail-view is open the
1837
- * detail follow-up composer ("Ask a follow-up about this task...") is
1838
- * the only input that should accept text · hide the global main
1839
- * composer + kbd-hint. Pre-fix bug: BOTH composers stacked, both with
1840
- * "-> Auto · ~$0.02" chips, user couldn't tell which one typed to which.
1841
- * Surfaced 2026-05-24 by Ega. */
1842
- body.detail-open > .app > .input-area { display: none; }
1843
- /* Keyboard hint · matches demo v12 lines 418-419. Subtle row of mono
1844
- * shortcuts under the composer · enter send · shift+enter newline · ⌘K focus.
1845
- * Discoverable without being noise. */
1846
- .kbd-hint {
1847
- font-family: var(--mono); font-size: 10.5px; color: var(--fg-30);
1848
- padding: 4px 0 0; max-width: 900px; margin: 0 auto;
1849
- display: flex; gap: 14px; align-items: center; flex-wrap: wrap;
1850
- }
1851
- .kbd-hint .item { display: inline-flex; gap: 5px; align-items: center; }
1852
- .kbd {
1853
- padding: 1px 5px; background: hsl(0 0% 12%);
1854
- border: 1px solid var(--border); border-radius: 3px;
1855
- color: var(--fg-50); font-size: 10.5px; line-height: 1.4;
1856
- }
1857
- .input-ta {
1858
- flex: 1; background: transparent; border: none;
1859
- color: var(--fg); font-family: var(--sans); font-size: 13px;
1860
- resize: none; outline: none; height: 22px; line-height: 22px;
1861
- }
1862
- .input-ta::placeholder { color: var(--fg-40); }
1863
- .input-ta:disabled { color: var(--fg-30); }
1864
- .input-meta { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); white-space: nowrap; display: inline-flex; gap: 8px; align-items: center; }
1865
- .input-meta .pick-agent { color: var(--fg-70); cursor: pointer; padding: 2px 6px; border-radius: 3px; transition: background 0.15s; background: transparent; border: none; font: inherit; -webkit-appearance: none; appearance: none; }
1866
- .input-meta .pick-agent:hover { background: rgba(255,255,255,0.05); color: var(--fg); }
1867
- /* S12 green audit · the cost estimate is information, not a verified/allow
1868
- * state — green here was decoration. Secondary hue instead. */
1869
- .input-meta .cost-est { color: var(--fg-70); padding: 2px 6px; border-radius: var(--radius-chip); background: var(--glass-2); }
1870
- /* Crafted agent picker (composer) — vendor badges + real readiness dots. */
1871
- .agentpick-wrap { position: relative; display: inline-flex; }
1872
- .agentpick { display: inline-flex; align-items: center; gap: 5px; background: transparent; border: 1px solid var(--border); color: var(--fg-70); cursor: pointer; padding: 3px 6px 3px 7px; border-radius: 7px; font: inherit; font-size: 12px; transition: border-color 140ms ease, background 140ms ease, color 140ms ease; }
1873
- .agentpick:hover { border-color: var(--fg-30); background: var(--bg-2); color: var(--fg); }
1874
- .agentpick .agentpick-cur { display: inline-flex; align-items: center; gap: 5px; }
1875
- .agentpick .ap-name { font-weight: 500; }
1876
- .agentpick .ap-spark { width: 12px; height: 12px; color: var(--accent); }
1877
- .agentpick .ab { width: 15px; height: 15px; font-size: 10.5px; }
1878
- .agentpick-car { width: 12px; height: 12px; color: var(--fg-40); }
1879
- .agentpick-menu { position: absolute; bottom: calc(100% + 8px); right: 0; min-width: 236px; background: var(--bg-1); border: 1px solid var(--border); border-radius: 11px; box-shadow: 0 14px 44px rgba(0,0,0,0.5); padding: 6px; z-index: 60; }
1880
- .ap-item { display: flex; align-items: center; gap: 9px; padding: 8px 9px; border-radius: 7px; cursor: pointer; }
1881
- .ap-item:hover, .ap-item:focus-visible { background: var(--bg-2); outline: none; }
1882
- .ap-item.sel { background: var(--accent-wash); }
1883
- .ap-item .ab { width: 18px; height: 18px; font-size: 10.5px; flex: none; }
1884
- .ap-item .ap-spark { width: 16px; height: 16px; color: var(--accent); flex: none; }
1885
- .ap-il { display: flex; flex-direction: column; flex: 1; min-width: 0; gap: 1px; }
1886
- .ap-in { font-size: 12px; color: var(--fg-90); font-weight: 500; }
1887
- .ap-isub { font-size: 10.5px; color: var(--fg-40); }
1888
- .ap-st { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); text-transform: uppercase; letter-spacing: 0.08em; flex: none; }
1889
- .ap-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; }
1890
- .ap-dot.ready { background: var(--fg-70); }
1891
- .ap-dot.setup { background: var(--warn); }
1892
- .ap-dot.offline { background: var(--fg-30); }
1893
- .ap-dot.busy { background: var(--fg); }
1894
- .ap-chk { color: var(--accent); font-size: 12px; flex: none; }
1895
- .send-btn {
1896
- background: var(--accent); color: #241a14; border: none; border-radius: 8px;
1897
- width: 30px; height: 30px; display: flex; align-items: center;
1898
- justify-content: center; cursor: pointer; flex-shrink: 0;
1899
- transition: filter 140ms ease, transform 0.15s ease, opacity 140ms ease;
1900
- }
1901
- .send-btn:hover { filter: brightness(1.08); }
1902
- .send-btn:active { transform: scale(0.94); }
1903
- .send-btn:disabled { opacity: 0.35; cursor: default; }
1904
- .offline-banner {
1905
- text-align: center; padding: 4px; font-size: 10.5px; font-family: var(--mono);
1906
- color: var(--warn); background: rgba(217,164,65,0.06);
1907
- border-bottom: 1px solid rgba(217,164,65,0.15);
1908
- }
1909
- ::-webkit-scrollbar { width: 6px; }
1910
- ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
1911
-
1912
- /* ════ S12 · A-home — the story of your day ════ */
1913
- /* The product home is never a landing page — upHero() only ever writes the
1914
- compact .day-line. The marketing block that used to live here (hh-kick, an
1915
- h1 at reading size, hh-grad, hh-teach, hh-agents) was dead: zero references
1916
- in JS or markup. Removed 2026-08-07, which also freed --fs-reading to mean
1917
- what DESIGN.md §0 says it means, and retired one of the wordmark-gradient
1918
- sites without touching the brand. */
1919
- .home-hero { max-width: 880px; margin: 0 auto; padding: 40px 24px 18px; text-align: center; }
1920
-
1921
-
1922
-
1923
- /* Story-arc line on a card · ONE line from REAL data only */
1924
- .card-arc { margin: 6px 0 2px; font-size: 12px; color: var(--fg-70); line-height: 1.55; }
1925
- .card-arc .ok { color: var(--verified); }
1926
- .card-arc .wr { color: var(--warn); }
1927
-
1928
- /* "show earlier work" expander · progressive disclosure, scroll preserved */
1929
- .show-earlier { display: block; width: 100%; margin: 8px 0; padding: 10px; background: transparent; border: 1px dashed var(--border); border-radius: var(--radius); color: var(--fg-50); font-family: var(--mono); font-size: 12px; cursor: pointer; transition: color var(--dur) var(--ease), border-color var(--dur) var(--ease); }
1930
- .show-earlier:hover { color: var(--fg); border-color: var(--fg-30); }
1931
-
1932
- /* ════ S14 · calm detail (direction E) — the verdict LINE ════
1933
- * Dot + ONE word + one quiet sentence. Green ONLY for verdict=verified on a
1934
- * non-failed, non-mock, git-tracked run — the only green on the page (H1/H9
1935
- * read the same data-verify contract off .vline the old hero carried). */
1936
- .vline { display: flex; align-items: baseline; gap: 10px; margin: 16px 0 2px; }
1937
- .vline .vl-d { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 8px; align-self: center; background: var(--fg-40); }
1938
- .vline .vl-w { font-size: 14.5px; font-weight: 600; color: var(--fg-90); }
1939
- .vline .vl-s { font-size: 13px; color: var(--fg-50); }
1940
- /* DESIGN.md §1 · green is reachable ONLY from measured evidence. Scoping it to
1941
- [data-evidence="measured"] makes that structural rather than a convention:
1942
- a verdict whose evidence is anything else renders in ink, so a future code
1943
- path that produced a green from a model's opinion would have to defeat CSS
1944
- specificity to show it. The fallback below is not decoration — it is what a
1945
- non-measured verdict is SUPPOSED to look like. */
1946
- .vline.v-ok[data-evidence='measured'] .vl-d { background: var(--verified); }
1947
- .vline.v-ok[data-evidence='measured'] .vl-w { color: var(--verified); }
1948
- .vline.v-ok:not([data-evidence='measured']) .vl-d { background: var(--fg-40); }
1949
- .vline.v-ok:not([data-evidence='measured']) .vl-w { color: var(--fg-90); }
1950
- .vline.v-wr .vl-d { background: var(--warn); }
1951
- .vline.v-wr .vl-w { color: var(--warn); }
1952
- .vline.v-bad .vl-d { background: var(--caught); }
1953
- .vline.v-bad .vl-w { color: var(--caught); }
1954
- .vline-meta { font-family: var(--mono); font-size: 12px; color: var(--fg-40); margin: 4px 0 12px; }
1955
-
1956
- /* The evidence table · CLAIM / CHECKED / RESULT · real recorded values only */
1957
- .evi { border: 1px solid var(--border); border-radius: 9px; margin: 12px 0 14px; overflow: hidden; }
1958
- .evi .erow2 { display: flex; gap: 16px; padding: 12px 16px; align-items: baseline; }
1959
- .evi .erow2 + .erow2 { border-top: 1px solid rgba(255,255,255,0.05); }
1960
- .evi .elbl { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--fg-30); flex: 0 0 74px; }
1961
- .evi .erow2.checked .elbl { color: var(--fg-50); }
1962
- .evi .etxt { font-size: 12px; color: var(--fg-70); line-height: 1.55; min-width: 0; }
1963
- .evi .erow2.result .etxt { font-family: var(--mono); font-size: 12px; }
1964
- .evi .erow2.result.good .etxt { color: var(--verified); }
1965
- .evi .erow2.result.bad .etxt { color: var(--warn); }
1966
- .evi .erow2.note .etxt { font-family: var(--mono); font-size: 12px; color: var(--fg-50); }
1967
-
1968
- /* The conversation rests as one quiet row · expands the unified timeline */
1969
- details.conv-wrap > summary.convrow { font-family: var(--mono); font-size: 12px; color: var(--fg-40); cursor: pointer; padding: 10px 2px; margin-top: 8px; list-style: none; }
1970
- details.conv-wrap > summary.convrow::-webkit-details-marker { display: none; }
1971
- details.conv-wrap > summary.convrow:hover, details.conv-wrap[open] > summary.convrow { color: var(--fg-70); }
1972
-
1973
- /* Timeline phase dividers · numbered chapters, S14-quiet (mono, hairline) */
1974
- .tl-div .tl-chap-n { font-family: var(--mono); font-size: 12px; font-weight: 500; color: var(--fg-30); line-height: 1; letter-spacing: 0.06em; }
1975
- .tl-div .tl-verb { letter-spacing: 0.14em; text-transform: uppercase; color: var(--fg-50); background: transparent; border-color: transparent; }
1976
-
1977
- /* ════ S12 · AX floor ════ */
1978
- :focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; border-radius: 4px; }
1979
- .task-card:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
1980
-
1981
- /* ════ S13 · One question at rest (direction E) ════
1982
- * ~95% grayscale at rest: orange belongs to the decision queue (+ focus
1983
- * ring) ONLY; green belongs to Verified only.
1984
- * S16 exception: the header wordmark KEEPS the gradient name (base rule
1985
- * above) — the landing (codehere.uk, repo codehere-landing) is the brand
1986
- * source of truth and its nav wordmark is lowercase 'codehere' in
1987
- * linear-gradient(135deg, #ff9a76 -> #4a90e2), with NO dot; the product
1988
- * header matches it exactly (the old pulsing accent dot was dropped —
1989
- * the landing never had one, and it spent orange this rule reserves for
1990
- * the decision queue). Same treatment on /verify's header. */
1991
- .header { gap: 12px; }
1992
- /* the rest of the at-rest chrome sheds its orange too: the composer send is
1993
- THE one filled button (white fill, like the queue primary), the footer
1994
- audit line + observer + first-run hero go calm gray. No orange — that's
1995
- reserved for the decision queue. (Send fill lives on the base .send-btn now.) */
1996
- .oss-footer .brand { color: var(--fg-50); }
1997
- .audit-chain-btn { background: var(--bg-2, rgba(255,255,255,0.05)); color: var(--fg-70); border-color: var(--border); }
1998
- .audit-chain-btn:hover { background: var(--bg-2, rgba(255,255,255,0.05)); box-shadow: none; border-color: var(--fg-30); }
1999
- .observer-rail { background: rgba(255,255,255,0.02); border-color: var(--border); }
2000
- .observer-rail.collapsed { background: transparent; border: 0; padding: 0; }
2001
- .observer-rail .obs-teach code { color: var(--fg-70); }
2002
- .local-pill { margin-left: auto; }
2003
- .local-pill .budget { margin-left: 8px; padding: 0 0 0 8px; border: 0; border-left: 1px solid var(--border); border-radius: 0; font-size: 10.5px; }
2004
- .local-pill .budget:empty { display: none; }
2005
- .cmdk-hint { background: transparent; border: 1px solid var(--border); border-radius: 7px; color: var(--fg-50); font-family: var(--mono); font-size: 10.5px; padding: 5px 10px; cursor: pointer; display: inline-flex; align-items: center; gap: 7px; }
2006
- .cmdk-hint:hover { color: var(--fg); border-color: var(--fg-30); }
2007
- .cmdk-hint .kbd { font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); border: 1px solid var(--border); border-bottom-width: 2px; border-radius: 4px; padding: 1px 5px; }
2008
- /* Narrow viewports · keep the header on one reachable row (drop the host
2009
- * string, let it wrap as a fallback) and give the drawer the full width so it
2010
- * never renders as a sliver over the page. */
2011
- @media (max-width: 560px){
2012
- .header { flex-wrap: wrap; gap: 8px; padding: 8px 12px; }
2013
- .local-pill #local-host { display: none; }
2014
- .cmdk-hint { padding: 5px 8px; }
2015
- .drawer { width: 100vw; max-width: 100vw; }
2016
- }
2017
-
2018
- /* column order · decisions first; first-run flips the hero to the top */
2019
- #task-list-view { display: flex; flex-direction: column; }
2020
- #decision-queue { order: 1; } .worktree-alert { order: 2; align-self: flex-start; }
2021
- #observer-rail { order: 3; } #home-hero { order: 4; } #filter-token { order: 5; } #task-list { order: 6; }
2022
- body.first-run #home-hero { order: 1; }
2023
- body.first-run #observer-rail { order: 2; }
2024
-
2025
- /* the decision queue · THE only orange */
2026
- .dq-kicker { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.18em; text-transform: uppercase; color: var(--accent); padding: 4px 0 8px; }
2027
- .dq-kicker .cnt { color: var(--fg-30); letter-spacing: 0; }
2028
- .dq-row { display: flex; align-items: center; gap: 14px; border-left: 2px solid var(--accent); padding: 8px 0 8px 16px; margin-bottom: 10px; border-radius: 0 6px 6px 0; }
2029
- .dq-row:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
2030
- .dq-what { min-width: 0; flex: 1; }
2031
- .dq-t { font-size: 14.5px; font-weight: 600; color: var(--fg); letter-spacing: -0.01em; }
2032
- .dq-t .dq-id { font-family: var(--mono); font-size: 12px; font-weight: 400; color: var(--accent); margin-right: 9px; }
2033
- .dq-why { font-family: var(--mono); font-size: 12px; color: var(--fg-50); margin-top: 4px; line-height: 1.5; }
2034
- .dq-result { font-family: var(--mono); font-size: 12px; color: var(--fg-70); margin-top: 5px; }
2035
- .dq-acts { display: flex; gap: 8px; flex: 0 0 auto; align-items: center; }
2036
- .dq-btn { font-size: 12px; color: var(--accent); background: transparent; border: 1px solid rgba(255,154,118,0.35); border-radius: 6px; padding: 4px 11px; cursor: pointer; display: inline-flex; align-items: center; gap: 7px; font-family: inherit; }
2037
- .dq-btn:hover { background: rgba(255,154,118,0.1); }
2038
- .dq-btn .kbd { font-family: var(--mono); font-size: 10.5px; border: 1px solid rgba(255,154,118,0.35); border-radius: 4px; padding: 0 4px; }
2039
- .dq-btn.quiet { color: var(--fg-50); border-color: var(--border); }
2040
- .dq-btn.quiet .kbd { border-color: var(--border); }
2041
- .dq-btn.quiet:hover { background: var(--bg-2); color: var(--fg-70); }
2042
- .dq-btn.fill { background: var(--fg); color: #0a0a0a; border-color: var(--fg); font-weight: 600; }
2043
- .dq-btn.fill .kbd { color: rgba(0,0,0,0.6); border-color: rgba(0,0,0,0.3); }
2044
- .dq-btn.fill:hover { filter: brightness(0.88); background: var(--fg); }
2045
-
2046
- /* the TODAY day-line · mono caps, carries the H13 stamps */
2047
- .home-hero.day-line-mode { padding: 4px 0 6px; }
2048
- .day-line { font-family: var(--mono); font-size: 12px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--fg-40); display: flex; gap: 9px; align-items: baseline; flex-wrap: wrap; }
2049
- .day-line b { color: var(--fg-70); font-weight: 600; }
2050
- .day-line .dl-today { font-family: var(--display); color: var(--fg); font-size: 20px; font-weight: 700; letter-spacing: -0.01em; }
2051
- .day-line .dl-quiet { color: var(--fg-40); text-transform: none; letter-spacing: 0; }
2052
-
2053
- /* one-line task rows · status dot+word · title · agent · checks · cost */
2054
- .trow { display: flex; align-items: center; gap: 12px; padding: 9px 4px; cursor: pointer; border-radius: 6px; }
2055
- .trow + .trow { border-top: 1px solid rgba(255,255,255,0.04); }
2056
- .trow:hover { background: var(--bg-1, rgba(255,255,255,0.025)); }
2057
- .trow .row-status { flex: 0 0 96px; display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 12px; color: var(--fg-50); }
2058
- .trow .row-status .rdot { width: 6px; height: 6px; border-radius: 50%; background: var(--fg-50); display: inline-block; flex: 0 0 6px; }
2059
- .trow .row-status.verified { color: var(--verified); }
2060
- .trow .row-status.verified .rdot { background: var(--verified); }
2061
- .trow .row-status.caught, .trow .row-status.stalled { color: var(--warn); }
2062
- .trow .row-status.caught .rdot, .trow .row-status.stalled .rdot { background: var(--warn); }
2063
- .trow .row-status.running .rdot { background: var(--fg-70); animation: pulse 2.2s ease infinite; }
2064
- .trow .row-title { font-size: 13px; color: var(--fg-90, var(--fg)); min-width: 0; flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2065
- .trow:hover .row-title { color: var(--fg); }
2066
- .trow .row-agent { font-family: var(--mono); font-size: 10.5px; color: var(--fg-40); flex: 0 0 auto; }
2067
- .trow .row-meta { font-family: var(--mono); font-size: 12px; color: var(--fg-40); flex: 0 0 auto; text-align: right; }
2068
- .trow .card-stop { flex: 0 0 auto; }
2069
-
2070
- /* S20 lenses · Review rows lead with the claims-state word; Status rows
2071
- carry one outcome sentence. Real recomposition (template branches in
2072
- rowH/cardH/renderD) — these rules only dress the recomposed elements. */
2073
- .row-claims { font-family: var(--mono); font-size: 12px; color: var(--fg-50); flex: 0 0 110px; white-space: nowrap; }
2074
- .row-claims.verified { color: var(--verified); }
2075
- .row-claims.caught { color: var(--warn); }
2076
- .row-claims.stopped { color: var(--caught); }
2077
- .card-row1 .row-claims { flex: 0 0 auto; margin-right: 4px; }
2078
- .trow.srow .row-title { flex: 0 1 auto; max-width: 46%; }
2079
- .trow .row-outcome { font-size: 12px; color: var(--fg-50); min-width: 0; flex: 1; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2080
-
2081
- /* history row · earlier + demos collapse behind ONE quiet row */
2082
- .hist-row { display: block; width: 100%; margin: 14px 0 4px; padding: 9px 4px; background: transparent; border: 0; border-top: 1px solid rgba(255,255,255,0.04); color: var(--fg-40); font-family: var(--mono); font-size: 12px; cursor: pointer; text-align: left; }
2083
- .hist-row:hover { color: var(--fg-70); }
2084
- /* S18 · the practice group is visually quiet — practice never competes
2085
- with real work for attention. */
2086
- .prac-row { opacity: 0.8; }
2087
- .practice-rows { opacity: 0.72; }
2088
-
2089
- /* observer collapsed to one calm line · per-session dots keep H8 honest */
2090
- .obs-line { display: flex; align-items: center; gap: 10px; padding: 9px 4px; font-family: var(--mono); font-size: 12px; color: var(--fg-50); cursor: pointer; border-radius: 6px; }
2091
- .obs-line:hover { color: var(--fg-70); background: var(--bg-1, rgba(255,255,255,0.025)); }
2092
- .obs-line .obs-mini { width: 6px; height: 6px; border-radius: 50%; background: var(--fg-30); flex: 0 0 6px; display: inline-block; }
2093
- .obs-line .obs-mini.live { background: var(--fg-70); animation: pulse 2.2s ease infinite; }
2094
- .obs-line .obs-mini.recent { background: var(--fg-50); }
2095
-
2096
- /* active-filter token · removable, never a tab bar */
2097
- .ftoken { display: inline-flex; align-items: center; gap: 8px; font-family: var(--mono); font-size: 12px; color: var(--fg-50); border: 1px solid var(--border); border-radius: 999px; padding: 3px 10px; margin: 6px 0; }
2098
- .ftoken .x { cursor: pointer; color: var(--fg-40); padding: 0 2px; }
2099
- .ftoken .x:hover { color: var(--fg); }
2100
-
2101
- /* ⌘K palette */
2102
- .palette-scrim { position: fixed; inset: 0; z-index: 320; background: rgba(0,0,0,0.55); backdrop-filter: blur(3px); -webkit-backdrop-filter: blur(3px); display: none; justify-content: center; align-items: flex-start; padding-top: 90px; }
2103
- .palette-scrim.open { display: flex; }
2104
- .palette { width: 560px; max-width: 92vw; max-height: 560px; background: hsl(0 0% 7%); border: 1px solid var(--border); border-radius: 12px; box-shadow: 0 30px 90px rgba(0,0,0,0.7); display: flex; flex-direction: column; overflow: hidden; }
2105
- .palette .pin { display: flex; align-items: center; padding: 4px 6px; border-bottom: 1px solid var(--border-soft); }
2106
- .palette .pin input { flex: 1; background: transparent; border: 0; outline: none; color: var(--fg); font-size: 13px; padding: 10px 10px; font-family: inherit; }
2107
- .palette .pin input::placeholder { color: var(--fg-40); }
2108
- .palette .plist { overflow-y: auto; padding: 6px; }
2109
- .pgroup { font-family: var(--mono); font-size: 10.5px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--fg-30); padding: 10px 11px 4px; }
2110
- .prow { display: flex; align-items: baseline; gap: 10px; padding: 8px 11px; border-radius: 7px; cursor: pointer; }
2111
- .prow .picon { color: var(--fg-40); flex: none; align-self: center; display: inline-flex; }
2112
- .prow.sel .picon, .prow:hover .picon { color: var(--accent); }
2113
- .prow:hover { background: var(--bg-2, rgba(255,255,255,0.05)); }
2114
- .prow.sel { background: var(--accent-wash); box-shadow: inset 2px 0 0 var(--accent); }
2115
- .prow .n { font-size: 12px; color: var(--fg); font-weight: 500; flex: 0 0 auto; }
2116
- .prow .c { font-size: 12px; color: var(--fg-40); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
2117
- .prow .pk { margin-left: auto; flex: 0 0 auto; font-family: var(--mono); font-size: 10.5px; color: var(--fg-50); border: 1px solid var(--border); border-bottom-width: 2px; border-radius: 4px; padding: 1px 5px; }
2118
- .palette .pempty { padding: 18px 14px; font-family: var(--mono); font-size: 12px; color: var(--fg-40); }
2119
- .palette .pfoot { display: flex; gap: 16px; padding: 9px 14px; border-top: 1px solid var(--border-soft); font-family: var(--mono); font-size: 10.5px; color: var(--fg-30); letter-spacing: 0.06em; }
2120
-
2121
- /* prefers-reduced-motion · ALL motion collapses, information stays */
2122
- @media (prefers-reduced-motion: reduce) {
2123
- *, *::before, *::after {
2124
- animation-duration: 0.01ms !important;
2125
- animation-iteration-count: 1 !important;
2126
- transition-duration: 0.01ms !important;
2127
- scroll-behavior: auto !important;
2128
- }
2129
- }
2130
-
2131
- /* Wide screens: a 900px column next to the 264px sidebar leaves ~280px of dead
2132
- space on each side at 1680. Let the working column breathe — one tier, and
2133
- every column-capped surface (content, skeleton, composer, hints, hero) moves
2134
- together so the composer stays under the content it belongs to. Lives at the
2135
- END of the sheet: the base rules share specificity, so source order decides. */
2136
- @media (min-width: 1440px) {
2137
- .content-inner, .skeleton, .gh-import, .input-bar, .kbd-hint { max-width: 1100px; }
2138
- .home-hero { max-width: 1080px; }
2139
- }
2140
- /* The composer footer spans the WINDOW while the content centers in the pane
2141
- right of the 264px sidebar — so the composer sat ~150px left of the column
2142
- it feeds. Pad the footer by the sidebar width whenever the sidebar shows. */
2143
- @media (min-width: 761px) {
2144
- .input-area { padding-left: calc(264px + 20px); }
2145
- }
2146
- `;
2147
- //# sourceMappingURL=styles.js.map