tuneloop 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,698 @@
1
+ :root {
2
+ --bg: #f5f3ee; --paper: #fffdf9; --ink: #1b1a17; --muted: #79746b;
3
+ --line: #e6e1d6; --track: #ece7dc; --emerald: #0f7a55;
4
+ --amber: #b8860b; --red: #b4452f; --gray: #9a958b;
5
+ }
6
+ * { box-sizing: border-box; }
7
+ body {
8
+ margin: 0; background: var(--bg); color: var(--ink);
9
+ font: 15px/1.5 ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
10
+ }
11
+ .mono { font-family: ui-monospace, "SF Mono", Menlo, monospace; }
12
+ h1, h2, h3 { font-family: Georgia, "Times New Roman", serif; font-weight: 600; }
13
+ a { color: var(--emerald); }
14
+ .top { background: var(--paper); color: var(--ink); border-bottom: 1px solid var(--line); }
15
+ .top .inner {
16
+ max-width: 1180px; margin: 0 auto; padding: 19px 28px;
17
+ display: flex; align-items: center; gap: 12px;
18
+ }
19
+ .top .logo { flex: none; display: block; }
20
+ .top .brand { font-family: Georgia, "Times New Roman", serif; font-size: 23px; font-weight: 600; letter-spacing: -.01em; color: var(--ink); }
21
+ .top .masthead-tag {
22
+ padding: 3px 0 3px 13px; border-left: 1px solid var(--line);
23
+ color: var(--muted); font-size: 14px;
24
+ }
25
+ .top .meta {
26
+ margin-left: auto; display: flex; flex-direction: column; align-items: flex-end; gap: 2px;
27
+ color: var(--muted); font-size: 12px;
28
+ }
29
+ .top .meta .meta-top { display: flex; align-items: center; gap: 6px; }
30
+ .top .meta .meta-path { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: 11px; color: var(--gray); }
31
+ /* Info popover: the per-directory scan history next to the range + store path. */
32
+ .meta-info-wrap { position: relative; display: inline-flex; }
33
+ .meta-info-btn { border: 0; background: transparent; color: var(--gray); cursor: pointer; font-size: 13px; line-height: 1; padding: 0; }
34
+ .meta-info-btn:hover { color: var(--ink); }
35
+ .meta-info-pop {
36
+ display: none; position: absolute; top: calc(100% + 6px); right: 0; z-index: 40; text-align: left;
37
+ min-width: 240px; max-width: 440px; padding: 10px 12px;
38
+ background: var(--paper); border: 1px solid var(--line); border-radius: 6px; box-shadow: 0 6px 20px rgba(0,0,0,.12);
39
+ }
40
+ .meta-info-pop.on { display: block; }
41
+ .meta-info-pop .mi-head { font-size: 11px; color: var(--muted); margin-bottom: 8px; }
42
+ .meta-info-pop .mi-title { font-size: 10px; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); margin-bottom: 6px; }
43
+ .meta-info-pop .mi-row { display: flex; justify-content: space-between; gap: 16px; padding: 3px 0; font-size: 12px; }
44
+ .meta-info-pop .mi-path { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: 11px; color: var(--ink); word-break: break-all; }
45
+ .meta-info-pop .mi-when { color: var(--gray); white-space: nowrap; }
46
+ .meta-info-pop .mi-empty { font-size: 12px; color: var(--muted); }
47
+ .tabnav { border-bottom: 1px solid var(--line); background: var(--paper); }
48
+ .tabnav .inner { max-width: 1180px; margin: 0 auto; padding: 0 28px; display: flex; gap: 2px; }
49
+ .tab { border: 0; background: transparent; padding: 14px 18px; font-family: Georgia, serif; font-size: 15px; color: var(--muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; }
50
+ .tab:hover { color: var(--ink); }
51
+ .tab.on { color: var(--ink); border-bottom-color: var(--emerald); }
52
+ .view { display: none; }
53
+ .view.on { display: block; }
54
+ main { max-width: 1180px; margin: 0 auto; padding: 28px; }
55
+ .tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 14px; }
56
+ .tile { background: var(--paper); border: 1px solid var(--line); border-radius: 10px; padding: 16px 18px; }
57
+ .tile .label { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
58
+ .tile .value { font-family: ui-monospace, Menlo, monospace; font-size: 26px; margin-top: 6px; display: flex; flex-wrap: wrap; align-items: baseline; column-gap: 8px; row-gap: 2px; }
59
+ .tile .value .delta { font-family: ui-sans-serif, system-ui, sans-serif; font-size: 12px; font-weight: 600; white-space: nowrap; }
60
+ .delta.good { color: var(--emerald); }
61
+ .delta.bad { color: var(--red); }
62
+ .delta.flat { color: var(--muted); }
63
+ .tile .sub { font-size: 12px; color: var(--muted); margin-top: 2px; }
64
+ .kpi-caption { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; color: var(--muted); font-size: 12px; margin: 0 0 12px; }
65
+ .win-cap { white-space: nowrap; }
66
+ .tile.clickable { cursor: pointer; transition: border-color .12s, box-shadow .12s; }
67
+ .tile.clickable:hover { border-color: var(--emerald); }
68
+ .tile.clickable .label::after { content: " ›"; color: var(--muted); }
69
+ .tile.on { border-color: var(--emerald); box-shadow: inset 0 -3px 0 var(--emerald); }
70
+ .metric-head { display: flex; align-items: center; gap: 14px; margin: 22px 0 6px; }
71
+ .metric-head h2 { margin: 0; font-size: 20px; }
72
+ .metric-big { margin-left: auto; font-family: ui-monospace, Menlo, monospace; font-size: 30px; }
73
+ .metric-sub { font-family: ui-sans-serif, system-ui, sans-serif; font-size: 12px; color: var(--muted); }
74
+ .sr-controls { margin-bottom: 8px; }
75
+ .sr-ctrl-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; margin-bottom: 12px; }
76
+ .sr-lbl { font-size: 12px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
77
+ .sr-checks { display: flex; flex-wrap: wrap; gap: 14px; }
78
+ .sr-check { display: inline-flex; align-items: center; gap: 5px; font-size: 13px; cursor: pointer; }
79
+ .sr-check input { accent-color: var(--emerald); }
80
+ .sr-cnt { color: var(--muted); font-family: ui-monospace, Menlo, monospace; font-size: 11px; }
81
+ .sr-by { border: 1px solid var(--line); border-radius: 8px; padding: 5px 10px; font-size: 13px; background: var(--paper); color: var(--ink); }
82
+ .sr-by-ctrl { display: inline-flex; align-items: center; gap: 8px; }
83
+ /* Metric filter clauses: a fixed field label + live value <select> + ✕, grouped
84
+ as one pill, inline between Bucket and Break-down. */
85
+ .mfl-clause { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 5px; background: var(--track); border: 1px solid var(--line); border-radius: 8px; padding: 3px 6px 3px 10px; }
86
+ .mfl-clause .sr-by { padding: 3px 6px; }
87
+ .mfl-k { font-size: 12px; color: var(--muted); }
88
+ /* selected value chip (OR within a field) */
89
+ .mfl-v { display: inline-flex; align-items: center; gap: 3px; background: var(--paper); border: 1px solid var(--line); border-radius: 6px; padding: 1px 2px 1px 8px; font-size: 12px; }
90
+ .mfl-vx { border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 13px; line-height: 1; padding: 0 3px; border-radius: 999px; }
91
+ .mfl-vx:hover { color: var(--red); }
92
+ /* compact "+ value" adder inside a clause */
93
+ .mfl-addv { padding: 2px 4px; font-size: 12px; }
94
+ .sr-legend { margin-top: 10px; }
95
+ .sr-legend .leg { display: inline-flex; align-items: center; vertical-align: middle; gap: 6px; margin: 4px 14px 4px 0; font-size: 12px; }
96
+ .sr-legend .leg[data-key] { cursor: pointer; user-select: none; }
97
+ /* overall aggregate shown in the legend when there's no breakdown */
98
+ .leg-overall { font-size: 12px; font-weight: 600; color: var(--ink); vertical-align: middle; }
99
+ .sr-legend .leg.off { opacity: 0.4; text-decoration: line-through; }
100
+ .sr-legend .swatch { width: 11px; height: 11px; border-radius: 2px; display: inline-block; }
101
+ .sr-legend .show-all-link { display: inline-flex; align-items: center; vertical-align: middle; font-size: 12px; color: var(--emerald); cursor: pointer; text-decoration: underline; margin-left: 8px; }
102
+ .sr-legend .leg-toggle-all { display: inline-flex; align-items: center; vertical-align: middle; font-size: 12px; color: var(--muted); cursor: pointer; text-decoration: underline; margin-left: 8px; }
103
+ .chart-title { font-size: 13px; font-weight: 600; color: var(--ink); margin: 2px 0 10px; }
104
+ .ca-controls { margin: 12px 0 4px; }
105
+ .panel-head h2 .metric-sub { margin-left: 8px; }
106
+ .panel { background: var(--paper); border: 1px solid var(--line); border-radius: 10px; padding: 18px 20px; margin-top: 22px; }
107
+ .panel-head { display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px; }
108
+ .panel-head h2 { margin: 0; font-size: 18px; }
109
+ /* Ops error-rate head: Title → Filter → Break-down, left-aligned and wrapping, so
110
+ the break-down group drops to the next line as a whole once filters accumulate. */
111
+ .panel-head.ops-erhead { justify-content: flex-start; flex-wrap: wrap; gap: 10px 14px; }
112
+ .ops-flt { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; }
113
+ .seg { display: inline-flex; border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
114
+ .seg button { border: 0; background: var(--paper); padding: 5px 12px; cursor: pointer; font-size: 13px; color: var(--muted); }
115
+ .seg button.on { background: var(--ink); color: #f3efe6; }
116
+ /* Primary segmented control (the section-scoping Artifact toggle): emerald active
117
+ fill + slightly larger, so it reads as more important than the neutral Bucket. */
118
+ .seg.seg-primary button { padding: 8px 18px; font-size: 14px; }
119
+ .seg.seg-primary button.on { background: var(--emerald); color: #f3efe6; }
120
+ .dist-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: 16px; margin-top: 22px; }
121
+ .card { background: var(--paper); border: 1px solid var(--line); border-radius: 10px; padding: 16px 18px; }
122
+ .card h3 { margin: 0 0 12px; font-size: 14px; }
123
+ .bar-row { display: grid; grid-template-columns: 130px 1fr 42px; align-items: center; gap: 10px; margin: 7px 0; font-size: 13px; }
124
+ .bar-row .name { color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
125
+ .bar-track { background: var(--track); border-radius: 4px; height: 10px; overflow: hidden; }
126
+ .bar-fill { display: block; background: var(--emerald); height: 100%; }
127
+ .bar-row .n { text-align: right; color: var(--muted); font-family: ui-monospace, Menlo, monospace; font-size: 12px; }
128
+ /* Errors-by-category rows carry "count + share", so widen the value column and keep
129
+ it on one line: count is the hero (ink), the percentage a muted secondary. */
130
+ .errcat .bar-row { grid-template-columns: 130px 1fr 72px; }
131
+ .errcat .n { white-space: nowrap; }
132
+ .errcat .n .cnt { color: var(--ink); }
133
+ .errcat .n .pct { margin-left: 6px; }
134
+ /* A category row expands an inline list of its actual failed tool calls. */
135
+ .errcat .bar-row.errcat-row { cursor: pointer; }
136
+ .errcat .bar-row.errcat-row:hover .name { color: var(--emerald); }
137
+ .errcat .bar-row.errcat-row:hover .bar-fill { opacity: .85; }
138
+ .errcat .bar-row.errcat-row.open .name { color: var(--emerald); font-weight: 600; }
139
+ .errcat-occ { margin: 0 0 12px; padding-left: 8px; border-left: 2px solid var(--line); }
140
+ .occ-loading, .occ-empty { color: var(--muted); font-size: 12px; font-style: italic; padding: 6px 4px; }
141
+ .occ-more { color: var(--muted); font-size: 12px; padding: 6px 6px 2px; }
142
+ .occ-head { font-size: 12px; color: var(--muted); margin: 4px 0 6px; }
143
+ .occ-head .occ-sessions { color: var(--emerald); cursor: pointer; }
144
+ /* The drill-down fetches up to 50 occurrences; bound the list so a big category
145
+ scrolls WITHIN the panel instead of pushing the rest of the page down. */
146
+ .occ-list { max-height: 300px; overflow-y: auto; }
147
+ .occ-row {
148
+ display: grid; grid-template-columns: 92px minmax(0,1.1fr) minmax(0,1.4fr) 150px 78px;
149
+ gap: 10px; align-items: baseline; padding: 5px 6px; font-size: 12px;
150
+ border-radius: 6px; cursor: pointer;
151
+ }
152
+ .occ-row:hover { background: var(--track); }
153
+ .occ-row > span { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
154
+ .occ-tool { font-family: ui-monospace, Menlo, monospace; color: var(--ink); }
155
+ .occ-cmd { font-family: ui-monospace, Menlo, monospace; color: var(--muted); }
156
+ .occ-msg { color: var(--red); }
157
+ .occ-sess { color: var(--ink); }
158
+ .occ-date { color: var(--muted); font-family: ui-monospace, Menlo, monospace; text-align: right; }
159
+ /* Floating cross-session error-walk pager (steps through occurrences of a category). */
160
+ #errwalk {
161
+ position: fixed; left: 50%; bottom: 22px; transform: translateX(-50%); z-index: 1000;
162
+ display: flex; align-items: center; gap: 10px; background: var(--ink); color: #f3efe6;
163
+ border-radius: 10px; padding: 8px 12px; box-shadow: 0 6px 24px rgba(0,0,0,.28); font-size: 13px;
164
+ }
165
+ #errwalk .ew-cat { font-weight: 600; }
166
+ #errwalk .ew-pos { font-family: ui-monospace, Menlo, monospace; min-width: 56px; text-align: center; }
167
+ #errwalk .ew-cur { color: #b8b2a4; max-width: 200px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
168
+ #errwalk .ew-btn { border: 0; background: rgba(255,255,255,.12); color: #f3efe6; cursor: pointer; border-radius: 6px; padding: 2px 9px; font-size: 15px; line-height: 1; }
169
+ #errwalk .ew-btn:hover { background: rgba(255,255,255,.24); }
170
+ #errwalk .ew-x { margin-left: 4px; font-size: 12px; }
171
+ .empty { color: var(--muted); font-size: 13px; font-style: italic; }
172
+ .btn { border: 1px solid var(--line); background: var(--paper); color: var(--ink); border-radius: 7px; padding: 4px 10px; font-size: 12px; cursor: pointer; }
173
+ .btn:hover { border-color: var(--emerald); color: var(--emerald); }
174
+ .btn.danger:hover { border-color: var(--red); color: var(--red); }
175
+ /* Feature manager: a fixed-height scroll window with aligned columns. Every row
176
+ shares the same grid so Sessions/Cost/actions line up regardless of depth —
177
+ only the title cell is indented (inline padding-left) to show the hierarchy. */
178
+ .feat-list { max-height: 460px; overflow-y: auto; border: 1px solid var(--line); border-radius: 10px; }
179
+ /* Fixed (not auto) last column so the header and row grids — separate grid
180
+ containers — resolve identical column edges and the labels sit over the data. */
181
+ .feat-head, .feat-row { display: grid; grid-template-columns: minmax(0,1fr) 120px 104px 72px 84px 240px; align-items: center; gap: 12px; padding: 8px 12px; }
182
+ .feat-head { position: sticky; top: 0; z-index: 2; background: var(--paper); border-bottom: 1px solid var(--line); }
183
+ .feat-head span { color: var(--muted); font-weight: 500; font-size: 11px; text-transform: uppercase; letter-spacing: .05em; }
184
+ .feat-row { border-bottom: 1px solid var(--line); font-size: 13.5px; }
185
+ .feat-row:last-child { border-bottom: none; }
186
+ .feat-name { display: flex; align-items: center; gap: 6px; min-width: 0; flex-wrap: nowrap; overflow: hidden; }
187
+ .feat-name .nm { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
188
+ .feat-twig { color: var(--muted); }
189
+ .feat-repos, .feat-last { font-size: 12px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
190
+ .feat-last { font-family: ui-monospace, Menlo, monospace; }
191
+ /* Local feature name filter — sits above the list. */
192
+ .feat-search { width: 100%; box-sizing: border-box; border: 1px solid var(--line); border-radius: 8px; padding: 7px 10px; font-size: 13px; background: var(--paper); color: var(--ink); margin-bottom: 10px; }
193
+ .feat-search:focus { outline: none; border-color: var(--emerald); }
194
+ .fh-num, .feat-num { text-align: right; }
195
+ /* Sortable PR table headers. */
196
+ .pr-th { cursor: pointer; user-select: none; white-space: nowrap; }
197
+ .pr-th:hover { color: var(--ink); }
198
+ .feat-num { font-family: ui-monospace, Menlo, monospace; font-size: 12px; color: var(--muted); white-space: nowrap; }
199
+ .feat-actions { display: flex; align-items: center; justify-content: flex-end; gap: 6px; }
200
+ .ship-btn { border-color: var(--emerald); color: var(--emerald); background: transparent; white-space: nowrap; }
201
+ .ship-btn:hover { background: var(--emerald); color: #fff; }
202
+ .ship-btn.shipped { border-color: var(--line); color: var(--muted); }
203
+ .ship-btn.shipped:hover { border-color: var(--muted); background: transparent; color: var(--ink); }
204
+ /* Secondary actions live behind a per-row hamburger. The menu is position:fixed
205
+ (positioned in JS) so the scroll container's overflow doesn't clip it. */
206
+ .feat-menu-wrap { position: relative; display: inline-flex; }
207
+ .feat-menu-btn { border: 1px solid var(--line); background: var(--paper); color: var(--muted); border-radius: 7px; padding: 4px 9px; font-size: 14px; line-height: 1; cursor: pointer; }
208
+ .feat-menu-btn:hover { border-color: var(--emerald); color: var(--emerald); }
209
+ .feat-menu { position: fixed; display: none; width: 190px; background: var(--paper); border: 1px solid var(--line); border-radius: 9px; box-shadow: 0 8px 20px rgba(20,18,15,.14); padding: 5px; z-index: 50; }
210
+ .feat-menu.on { display: block; }
211
+ .feat-menu .menu-item { display: block; width: 100%; text-align: left; border: 0; background: none; color: var(--ink); border-radius: 6px; padding: 7px 9px; font-size: 13px; cursor: pointer; }
212
+ .feat-menu .menu-item:hover { background: #fbf8f1; color: var(--emerald); }
213
+ .feat-menu .menu-item.danger { color: var(--red); }
214
+ .feat-menu .menu-item.danger:hover { background: #f4ddd6; color: var(--red); }
215
+ .feat-menu .menu-nest { padding: 4px 9px 6px; }
216
+ .feat-menu .menu-nest label { display: block; font-size: 10px; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); margin-bottom: 4px; }
217
+ .feat-menu .menu-nest select { width: 100%; border: 1px solid var(--line); border-radius: 6px; padding: 4px 6px; font-size: 12px; background: var(--paper); color: var(--ink); }
218
+ .feat-menu .menu-sep { height: 1px; background: var(--line); margin: 5px 4px; }
219
+ /* New-feature form: collapsed behind an "Add feature" button at the bottom. */
220
+ .feat-add { margin-top: 14px; }
221
+ .feat-new { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
222
+ .feat-new[hidden] { display: none; }
223
+ .feat-new input { flex: 1; min-width: 220px; border: 1px solid var(--line); border-radius: 8px; padding: 6px 10px; font-size: 13px; background: var(--paper); color: var(--ink); }
224
+ .feat-new select { border: 1px solid var(--line); border-radius: 8px; padding: 6px 10px; font-size: 13px; background: var(--paper); color: var(--ink); }
225
+ /* Sessions filter toolbar: a compact, wrapping control bar. Reuses the seg, btn,
226
+ and tag tokens. Primary filters inline; the rest collapse behind More filters. */
227
+ .filters { margin-bottom: 14px; }
228
+ .filters select, .filters input:not([type=checkbox]) {
229
+ border: 1px solid var(--line); border-radius: 8px; padding: 5px 9px; font-size: 13px; background: var(--paper); color: var(--ink);
230
+ }
231
+ .filters select:hover, .filters input:not([type=checkbox]):hover { border-color: #d4cdbd; }
232
+ .flt-row { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
233
+ .flt-row + .flt-row { margin-top: 8px; }
234
+ .flt-row-facets { gap: 8px; }
235
+ .flt-more { gap: 8px; }
236
+ .flt-more[hidden] { display: none; }
237
+ .flt-grp { display: inline-flex; align-items: center; gap: 8px; }
238
+ .flt-lbl { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); }
239
+ .flt-search { flex: 1 1 220px; min-width: 180px; }
240
+
241
+ /* Time segmented control (reuses .seg) + custom range. */
242
+ .flt-seg button { font-size: 12px; padding: 5px 11px; }
243
+ .flt-dates { display: inline-flex; align-items: center; gap: 6px; }
244
+ .flt-dates[hidden] { display: none; }
245
+ .flt-dash { color: var(--muted); }
246
+
247
+ /* Outcome multi-select popover. */
248
+ .flt-pop { position: relative; display: inline-flex; }
249
+ .flt-pop-btn { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--line); background: var(--paper); color: var(--ink); border-radius: 8px; padding: 6px 10px; font-size: 13px; cursor: pointer; }
250
+ .flt-pop-btn:hover { border-color: #d4cdbd; }
251
+ .flt-pop-btn.on { border-color: var(--emerald); color: var(--emerald); }
252
+ .flt-pop-car { color: var(--muted); font-size: 10px; }
253
+ .flt-pop-cnt:empty { display: none; }
254
+ .flt-pop-cnt { background: var(--emerald); color: #f3efe6; border-radius: 999px; min-width: 16px; text-align: center; padding: 0 5px; font-size: 11px; font-weight: 600; }
255
+ .flt-menu { position: absolute; top: 100%; left: 0; z-index: 20; margin-top: 4px; min-width: 210px; background: var(--paper); border: 1px solid var(--line); border-radius: 9px; box-shadow: 0 8px 20px rgba(20,18,15,.14); padding: 5px; display: none; max-height: 320px; overflow-y: auto; }
256
+ .flt-menu.on { display: block; }
257
+ .flt-menu-item { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 6px; font-size: 13px; cursor: pointer; }
258
+ .flt-menu-item:hover { background: #fbf8f1; }
259
+ .flt-menu-item input { flex: none; }
260
+ .flt-menu-tx { flex: 1; }
261
+ .flt-menu-n { color: var(--muted); font-family: ui-monospace, Menlo, monospace; font-size: 11px; }
262
+ .flt-menu-empty { padding: 8px; color: var(--muted); font-size: 12px; font-style: italic; }
263
+
264
+ /* Active-filter chips (each ✕ clears that one filter). */
265
+ .flt-active { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 12px; }
266
+ .flt-active:empty { margin-top: 0; }
267
+ .flt-active-lbl { font-size: 11px; text-transform: uppercase; letter-spacing: .06em; color: var(--muted); margin-right: 2px; }
268
+ .flt-chip { display: inline-flex; align-items: center; gap: 5px; background: var(--track); border: 1px solid var(--line); border-radius: 999px; padding: 2px 4px 2px 10px; font-size: 12px; }
269
+ .flt-chip-k { color: var(--muted); }
270
+ .flt-chip-v { color: var(--ink); font-weight: 500; }
271
+ .flt-chip-x { border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 14px; line-height: 1; padding: 0 4px; border-radius: 999px; }
272
+ .flt-chip-x:hover { color: var(--red); }
273
+ .flt-clear-all { border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 12px; text-decoration: underline; margin-left: 4px; }
274
+ .flt-clear-all:hover { color: var(--emerald); }
275
+ .ac { position: relative; flex: 1; min-width: 200px; display: inline-flex; }
276
+ .ac > input { flex: 1; width: 100%; }
277
+ .ac-menu { position: absolute; top: 100%; left: 0; right: 0; z-index: 20; margin-top: 2px; background: var(--paper); border: 1px solid var(--line); border-radius: 8px; max-height: 300px; overflow-y: auto; box-shadow: 0 8px 20px rgba(20,18,15,.12); display: none; }
278
+ .ac-menu.on { display: block; }
279
+ .ac-item { display: flex; align-items: center; gap: 9px; padding: 7px 11px; font-size: 13px; cursor: pointer; border-bottom: 1px solid var(--line); }
280
+ .ac-item:last-child { border-bottom: none; }
281
+ .ac-item.sel, .ac-item:hover { background: #fbf8f1; }
282
+ .ac-kind { flex: none; font-size: 9.5px; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); border: 1px solid var(--line); border-radius: 4px; padding: 1px 5px; }
283
+ .ac-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
284
+ .ac-dir { color: var(--muted); font-size: 11px; }
285
+ .ex-ctrl { display: inline-flex; align-items: center; gap: 8px; }
286
+ .ex-ctrl select { border: 1px solid var(--line); border-radius: 8px; padding: 5px 10px; font-size: 13px; background: var(--paper); color: var(--ink); }
287
+ .ex-ctrl .by { color: var(--muted); font-size: 13px; }
288
+ .card-note { color: var(--muted); font-size: 11px; font-style: italic; margin-top: 10px; }
289
+ table { width: 100%; border-collapse: collapse; font-size: 13.5px; }
290
+ th { text-align: left; color: var(--muted); font-weight: 500; font-size: 12px; text-transform: uppercase; letter-spacing: .05em; padding: 8px 10px; border-bottom: 1px solid var(--line); }
291
+ td { padding: 9px 10px; border-bottom: 1px solid var(--line); vertical-align: top; }
292
+ tr.srow:hover { background: #fbf8f1; cursor: pointer; }
293
+ .pr-title { color: var(--muted); font-size: 12px; margin-top: 2px; }
294
+ .badge { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 11px; font-weight: 600; white-space: nowrap; flex-shrink: 0; }
295
+ .b-success { background: #e2f0e8; color: var(--emerald); }
296
+ .b-partial { background: #f6ecd2; color: var(--amber); }
297
+ .b-failure { background: #f4ddd6; color: var(--red); }
298
+ .b-unknown, .b-null { background: #ece9e1; color: var(--gray); }
299
+ .tag { display: inline-block; background: var(--track); color: var(--muted); border-radius: 4px; padding: 1px 6px; font-size: 11px; margin: 1px 3px 1px 0; }
300
+ .tag.click { cursor: pointer; }
301
+ .tag.click:hover { background: #dfe9e0; color: var(--emerald); }
302
+ .ai-note { color: var(--emerald); font-weight: 600; }
303
+ .pr-ai-tag { display: inline-block; margin-left: 8px; padding: 0 7px; border-radius: 999px; background: #dfe9e0; color: var(--muted); font-size: 10px; font-weight: 600; vertical-align: middle; }
304
+ .num { font-family: ui-monospace, Menlo, monospace; }
305
+ /* Outcome rate vs. cost table (Session Outcome Rate detail, option B). */
306
+ .sr-tbl th.num, .sr-tbl td.num { text-align: right; }
307
+ .sr-tbl td { vertical-align: middle; }
308
+ .sr-tbl .swatch { width: 11px; height: 11px; border-radius: 2px; display: inline-block; margin-right: 7px; vertical-align: middle; }
309
+ .sr-tbl tr.off td { opacity: .42; }
310
+ /* Sessions table: keep every row to a single line. */
311
+ tr.srow td { vertical-align: middle; }
312
+ .nowrap { white-space: nowrap; }
313
+ .s-title { display: inline-block; max-width: 380px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
314
+ .tag-rest { display: none; }
315
+ .tag-rest.on { display: inline; }
316
+ .tag-more { border: 0; background: var(--track); color: var(--muted); border-radius: 4px; padding: 1px 6px; font-size: 11px; cursor: pointer; margin-left: 2px; }
317
+ .tag-more:hover { background: #dfe9e0; color: var(--emerald); }
318
+ svg text { font-family: ui-monospace, Menlo, monospace; font-size: 10px; fill: var(--muted); }
319
+ .overlay { position: fixed; inset: 0; background: rgba(20,18,15,.4); opacity: 0; pointer-events: none; transition: opacity .15s; }
320
+ .overlay.on { opacity: 1; pointer-events: auto; }
321
+ .drawer { position: fixed; top: 0; right: 0; height: 100%; width: min(900px, 96vw); background: var(--bg); border-left: 1px solid var(--line); transform: translateX(100%); transition: transform .18s ease; overflow-y: auto; z-index: 10; }
322
+ .drawer.on { transform: translateX(0); }
323
+ .drawer-inner { padding: 0 24px 60px; }
324
+ /* Sticky header: title + close, tab subnav, and the transcript nav pin together. */
325
+ .drawer-head { position: sticky; top: 0; z-index: 7; background: var(--bg); padding: 16px 0 12px; }
326
+ .drawer-head-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
327
+ .drawer h2 { margin: 0; font-size: 19px; flex: 1; min-width: 0; }
328
+ .x { flex: none; border: 1px solid var(--line); background: var(--paper); border-radius: 8px; padding: 4px 10px; cursor: pointer; color: var(--muted); }
329
+ .x:hover { border-color: var(--emerald); color: var(--emerald); }
330
+ .kv { display: grid; grid-template-columns: 130px 1fr; gap: 4px 12px; font-size: 13px; margin: 14px 0; }
331
+ .kv .k { color: var(--muted); }
332
+ .turn { border: 1px solid var(--line); border-radius: 8px; padding: 10px 13px; margin: 10px 0; scroll-margin-top: calc(var(--head-h, 120px) + 10px); }
333
+ /* User vs assistant get distinct fills + a left accent so the conversation reads at a glance. */
334
+ .turn.user { background: #eaf3ec; border-color: #cde2d3; border-left: 3px solid var(--emerald); }
335
+ .turn.asst { background: var(--paper); border-left: 3px solid var(--track); }
336
+ /* Coalesced run of tool-only assistant turns — a muted action strip, not a message. */
337
+ .turn.toolrun { background: transparent; border-style: dashed; }
338
+ .turn.toolrun .role { color: var(--muted); }
339
+ .turn.toolrun .tools { margin-top: 0; }
340
+ .turn .role { font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; color: var(--muted); margin-bottom: 5px; }
341
+ .turn.user .role { color: var(--emerald); }
342
+ .turn .text { white-space: pre-wrap; font-size: 13px; }
343
+ /* Markdown-rendered assistant text (.text.md). Block HTML is generated, so the
344
+ container drops pre-wrap; <pre> code blocks keep their own whitespace. */
345
+ .text.md { white-space: normal; }
346
+ .text.md p { margin: 0 0 8px; }
347
+ .text.md > p:last-child, .text.md .msg-full > p:last-child, .text.md .msg-prev > p:last-child { margin-bottom: 0; }
348
+ .text.md ul, .text.md ol { margin: 4px 0 8px; padding-left: 20px; }
349
+ .text.md li { margin: 2px 0; }
350
+ .text.md .md-h { font-weight: 700; margin: 10px 0 4px; }
351
+ .text.md .md-h1 { font-size: 15px; }
352
+ .text.md .md-h2 { font-size: 14px; }
353
+ .text.md .md-h3, .text.md .md-h4, .text.md .md-h5, .text.md .md-h6 { font-size: 13px; }
354
+ .text.md blockquote { margin: 6px 0; padding: 2px 0 2px 10px; border-left: 3px solid var(--line); color: var(--muted); }
355
+ .text.md code { font-family: ui-monospace, Menlo, monospace; font-size: 12px; background: var(--track); border-radius: 4px; padding: 1px 4px; word-break: break-word; }
356
+ .text.md pre.md-code { margin: 6px 0; padding: 8px 10px; background: var(--track); border-radius: 6px; overflow-x: auto; }
357
+ .text.md pre.md-code code { background: none; padding: 0; font-size: 11.5px; line-height: 1.45; word-break: normal; }
358
+ .text.md a { color: var(--emerald); text-decoration: underline; }
359
+ .text.md strong { font-weight: 700; }
360
+ .text.md em { font-style: italic; }
361
+ /* Long message text: preview + Show more/less toggle (used in the transcript's
362
+ .text.msg blocks and the Files view's bare .msg prompt headers). */
363
+ .msg .msg-full { display: none; }
364
+ .msg.on .msg-prev { display: none; }
365
+ .msg.on .msg-full { display: inline; }
366
+ .msg-more { display: inline-block; margin-top: 4px; border: 0; background: transparent; color: var(--emerald); font-size: 12px; font-weight: 600; cursor: pointer; padding: 2px 0; }
367
+ .msg-more:hover { text-decoration: underline; }
368
+ .turn .tools { margin-top: 8px; }
369
+ /* Tool block: one compact row per tool call (name · command · output toggle) */
370
+ .tool-block { border: 1px solid var(--line); border-radius: 8px; margin: 4px 0; }
371
+ .tool-block.err { border-color: #e6c3b8; }
372
+ .tool-block.agent .tool-block-row { cursor: pointer; }
373
+ .tool-block.agent .tool-block-row:hover { background: #e7eef6; }
374
+ .tool-block-row { display: flex; align-items: flex-start; gap: 8px; padding: 5px 10px; }
375
+ .tool-block-name { flex: none; min-width: 40px; font-family: ui-monospace, Menlo, monospace; font-size: 11px; font-weight: 600; color: var(--ink); padding-top: 1px; }
376
+ .tool-badge.err { flex: none; font-size: 10px; font-weight: 500; color: var(--red); background: #f4ddd6; border-radius: 4px; padding: 1px 5px; }
377
+ .tool-chip-go { flex: none; opacity: .8; font-size: 11px; color: var(--emerald); white-space: nowrap; }
378
+ /* Command/input — inline, grows to fill the row */
379
+ .tool-block-cmd { flex: 1 1 auto; min-width: 0; }
380
+ .tool-cmd-pre { margin: 0; font-family: ui-monospace, Menlo, monospace; font-size: 11px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; max-height: 300px; overflow-y: auto; }
381
+ .tool-cmd-full { display: none; margin: 0; font-family: ui-monospace, Menlo, monospace; font-size: 11px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; max-height: 300px; overflow-y: auto; }
382
+ .tool-block-cmd.on .tool-cmd-pre { display: none; }
383
+ .tool-block-cmd.on .tool-cmd-full { display: block; }
384
+ .tool-cmd-toggle { border: 0; background: transparent; color: var(--muted); font-size: 10px; cursor: pointer; padding: 2px 0 0; display: block; }
385
+ .tool-cmd-toggle:hover { color: var(--emerald); }
386
+ .tool-cmd-arrow { display: inline-block; font-size: 9px; transition: transform .15s; }
387
+ /* Output toggle — right-aligned on the row; body collapsed by default */
388
+ .tool-out-toggle { flex: none; border: 0; background: transparent; color: var(--muted); font-size: 11px; cursor: pointer; padding: 0; white-space: nowrap; }
389
+ .tool-out-toggle:hover { color: var(--emerald); }
390
+ .tool-out-toggle::before { content: "\25B8"; font-size: 9px; margin-right: 4px; display: inline-block; transition: transform .15s; }
391
+ .tool-out-toggle.on::before { transform: rotate(90deg); }
392
+ .tool-block-body { display: none; border-top: 1px solid var(--line); padding: 6px 10px; }
393
+ .tool-block-body.on { display: block; }
394
+ .tool-output-pre { margin: 0; font-family: ui-monospace, Menlo, monospace; font-size: 11px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; background: var(--track); border-radius: 5px; padding: 6px 8px; max-height: 300px; overflow-y: auto; }
395
+ .tool-block-body .fc-diff { margin: 0; }
396
+ /* Tool overflow (>TOOLCAP) */
397
+ .tool-rest { display: none; }
398
+ .tool-rest.on { display: block; }
399
+ .tool-more { border: 0; background: transparent; color: var(--muted); font-family: ui-monospace, Menlo, monospace; font-size: 11px; cursor: pointer; padding: 4px 6px; }
400
+ .tool-more:hover { color: var(--emerald); }
401
+ /* Inline error detail panel — the stepper's jump target; shows WHAT failed. */
402
+ .tx-error { border: 1px solid #e6c3b8; background: #fbeae4; border-radius: 7px; padding: 8px 10px; margin: 8px 0 2px; scroll-margin-top: calc(var(--head-h, 120px) + 10px); }
403
+ .tx-error-h { font-size: 12px; font-weight: 600; color: var(--red); }
404
+ .tx-error-cmd { margin-top: 5px; font-family: ui-monospace, Menlo, monospace; font-size: 11.5px; line-height: 1.45; white-space: pre-wrap; word-break: break-word; color: #6b3f33; background: rgba(180,69,47,.06); border-radius: 5px; padding: 6px 8px; max-height: 150px; overflow: auto; }
405
+ .tx-error-b { margin-top: 6px; font-family: ui-monospace, Menlo, monospace; font-size: 11.5px; line-height: 1.45; white-space: pre-wrap; color: #6b3f33; max-height: 220px; overflow: auto; }
406
+ .tx-error-b.muted { color: var(--muted); font-style: italic; }
407
+
408
+ /* Subagent linkage: a banner standing in for a spawning call in the main thread,
409
+ clickable to open that subagent's scope (and the back link's flash target). */
410
+ .tx-spawn { display: flex; align-items: center; gap: 9px; width: 100%; text-align: left; cursor: pointer;
411
+ border: 1px solid #cdddeb; background: #eef4fa; border-radius: 8px; padding: 9px 12px; margin: 10px 0;
412
+ font-family: inherit; font-size: 13px; color: #2f5d87; scroll-margin-top: calc(var(--head-h, 120px) + 10px); }
413
+ .tx-spawn:hover { border-color: #3b6ea5; background: #e4eef7; }
414
+ .tx-spawn.flash { animation: flashpulse 1.2s ease; }
415
+ .tx-spawn-ico { flex: none; }
416
+ .tx-spawn-lbl { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-weight: 600; }
417
+ .tx-spawn-go { flex: none; font-size: 12px; opacity: .85; }
418
+ /* Header atop a subagent scope: type + description, with a link back to the call. */
419
+ .tx-sub-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 2px 0 12px; padding: 9px 12px;
420
+ background: #eef4fa; border: 1px solid #cdddeb; border-radius: 8px; font-size: 13px; color: #2f5d87; }
421
+ .tx-sub-head b { color: #234c70; }
422
+ .tx-sub-desc { color: var(--muted); }
423
+ .tx-sub-back { margin-left: auto; border: 1px solid #cdddeb; background: var(--paper); color: #2f5d87; border-radius: 7px; padding: 3px 10px; font-size: 12px; cursor: pointer; }
424
+ .tx-sub-back:hover { border-color: #3b6ea5; }
425
+
426
+ .sect-h { font-family: Georgia, serif; font-size: 14px; margin: 18px 0 6px; }
427
+
428
+ /* Key decisions: one consequential choice per line, rationale folded in. */
429
+ .decisions { margin: 0; padding-left: 18px; }
430
+ .decisions li { margin: 3px 0; line-height: 1.45; }
431
+
432
+ /* Drawer tabs: Summary | Transcript */
433
+ .drawer-tabs { display: flex; gap: 2px; border-bottom: 1px solid var(--line); margin: 12px 0 0; }
434
+ .dtab { border: 0; background: transparent; padding: 8px 16px; font-family: Georgia, serif; font-size: 14px; color: var(--muted); cursor: pointer; border-bottom: 2px solid transparent; margin-bottom: -1px; }
435
+ .dtab:hover { color: var(--ink); }
436
+ .dtab.on { color: var(--ink); border-bottom-color: var(--emerald); }
437
+ .dpane { display: none; }
438
+ .dpane.on { display: block; }
439
+
440
+ /* Files-changed tab: per-file cards; a file's edits are headed by the prompt that drove them */
441
+ .fc-hint { color: var(--muted); font-size: 12px; margin: 4px 0 10px; }
442
+ .fc-jump { flex: none; border: 1px solid var(--line); background: var(--paper); color: var(--emerald); border-radius: 6px; padding: 2px 9px; font-size: 11.5px; cursor: pointer; }
443
+ .fc-jump:hover { background: var(--emerald); color: #fbfaf6; border-color: var(--emerald); }
444
+ /* Agent's local narration above an edit */
445
+ .fc-narr { color: var(--muted); font-size: 12px; font-style: italic; line-height: 1.45; margin: 2px 0 6px; }
446
+ /* A file's edits, headed by the prompt that drove them */
447
+ .fc-pseg { margin: 2px 0; }
448
+ .fc-pseg + .fc-pseg { border-top: 1px solid var(--line); padding-top: 16px; margin-top: 18px; }
449
+ .fc-pseg-h { display: flex; align-items: center; gap: 10px; margin-bottom: 9px; }
450
+ /* The prompt that drove these edits, as a tinted band with an emerald rail. */
451
+ .fc-pseg-msg { flex: 1; min-width: 0; font-size: 12.5px; color: var(--ink); background: var(--track); border-left: 3px solid var(--emerald); border-radius: 0 6px 6px 0; padding: 6px 10px; }
452
+ .fc-pseg-empty { color: var(--muted); font-style: italic; }
453
+ .fc-file { border: 1px solid var(--line); border-radius: 8px; margin: 10px 0; background: var(--paper); overflow: hidden; scroll-margin-top: calc(var(--head-h, 120px) + 10px); }
454
+ .fc-head { display: flex; align-items: center; gap: 8px; width: 100%; text-align: left; border: 0; background: var(--track); padding: 8px 12px; cursor: pointer; font-family: ui-monospace, Menlo, monospace; font-size: 12.5px; }
455
+ .fc-caret { color: var(--muted); }
456
+ .fc-file.collapsed .fc-caret { display: inline-block; transform: rotate(-90deg); }
457
+ .fc-path { flex: 1; min-width: 0; display: flex; align-items: baseline; overflow: hidden; }
458
+ .fc-dir { color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
459
+ .fc-base { flex: none; color: var(--ink); font-weight: 600; white-space: nowrap; }
460
+ .fc-stat { flex: none; color: var(--muted); font-size: 11.5px; }
461
+ .fc-add { color: var(--emerald); }
462
+ .fc-del { color: var(--red); }
463
+ .fc-body { padding: 6px 12px 12px; }
464
+ .fc-file.collapsed .fc-body { display: none; }
465
+ .fc-edit { margin-top: 12px; }
466
+ .fc-edit:first-child { margin-top: 4px; }
467
+ .fc-edit-h { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 5px; }
468
+ .fc-op { font-size: 11px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; }
469
+ .fc-why { flex: none; border: 1px solid var(--line); background: var(--paper); color: var(--emerald); border-radius: 6px; padding: 2px 9px; font-size: 11.5px; cursor: pointer; }
470
+ .fc-why:hover { background: var(--emerald); color: #fbfaf6; border-color: var(--emerald); }
471
+ .fc-diff { font-family: ui-monospace, Menlo, monospace; font-size: 11.5px; line-height: 1.5; border: 1px solid var(--line); border-radius: 6px; overflow-x: auto; }
472
+ .dl { display: flex; white-space: pre; padding: 0 4px; }
473
+ .dl .dg { flex: none; width: 1.4em; text-align: center; color: var(--muted); user-select: none; }
474
+ .dl .dt { flex: 1; }
475
+ .dl.add { background: #e4f1ea; }
476
+ .dl.add .dt { color: #1b5e3f; }
477
+ .dl.del { background: #f6e0d9; }
478
+ .dl.del .dt { color: #8a3b28; }
479
+ .dl.ctx { color: #5c574d; }
480
+ .dl.sep { color: var(--muted); justify-content: center; background: var(--track); }
481
+ .fc-noop { color: var(--muted); font-size: 11.5px; font-style: italic; padding: 2px 0; }
482
+ .dl-rest { display: none; }
483
+ .dl-rest.on { display: block; }
484
+ .fc-rows-more { display: block; width: 100%; border: 0; border-top: 1px solid var(--line); background: var(--track); color: var(--muted); font-size: 11px; cursor: pointer; padding: 4px; }
485
+ .fc-rows-more:hover { color: var(--emerald); }
486
+
487
+ /* Truncated chip lists (files / features): overflow hidden behind a toggle */
488
+ .chip-rest { display: none; }
489
+ .chip-rest.on { display: inline; }
490
+ .chip-more { border: 0; background: transparent; color: var(--muted); font-size: 11px; cursor: pointer; padding: 1px 4px; margin-left: 2px; }
491
+ .chip-more:hover { color: var(--emerald); }
492
+
493
+ /* Summary "See transcript" link — a hard-to-miss handoff into the other tab. */
494
+ .see-tx-wrap { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 24px; padding-top: 16px; border-top: 1px solid var(--line); }
495
+ .see-tx { border: 1px solid var(--emerald); background: var(--paper); color: var(--emerald); border-radius: 8px; padding: 8px 16px; font-family: Georgia, serif; font-size: 14px; cursor: pointer; }
496
+ .see-tx:hover { background: var(--emerald); color: #fbfaf6; }
497
+
498
+ /* Transcript navigator: sticky bar with a Turn stepper (scroll-synced + outline
499
+ dropdown), an Error stepper, and a live "you are here" line. */
500
+ /* Scope bar (Main thread + one tab per subagent) + transcript nav both live in
501
+ the sticky .drawer-head and show only on the Transcript tab. */
502
+ .tx-scopes { display: none; gap: 6px; margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--line); flex-wrap: wrap; align-items: center; }
503
+ .tx-scopes.on { display: flex; }
504
+ /* Collapsed: keep the list to one line by hiding the overflow pills behind the toggle. */
505
+ .tx-scopes.collapsed { flex-wrap: nowrap; }
506
+ .tx-scopes.collapsed .tx-scope-extra { display: none; }
507
+ .tx-scope-btn { max-width: 280px; border: 1px solid var(--line); background: var(--paper); color: var(--muted); border-radius: 999px; padding: 3px 12px; font-size: 12.5px; cursor: pointer; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
508
+ .tx-scope-btn:hover { color: var(--ink); border-color: var(--gray); }
509
+ .tx-scope-btn.on { color: var(--ink); border-color: var(--emerald); background: #eaf3ec; }
510
+ .tx-scope-err { margin-left: 6px; color: var(--red); font-size: 11px; }
511
+ .tx-scope-more { flex: none; border: 1px dashed var(--line); background: transparent; color: var(--muted); border-radius: 999px; padding: 3px 12px; font-size: 12px; cursor: pointer; white-space: nowrap; }
512
+ .tx-scope-more:hover { color: var(--ink); border-color: var(--gray); }
513
+ /* Only the active scope's turns render. */
514
+ .tx-scope-pane { display: none; }
515
+ .tx-scope-pane.on { display: block; }
516
+ .tx-nav { display: none; margin-top: 12px; padding-top: 10px; border-top: 1px solid var(--line); }
517
+ .tx-nav.on { display: block; }
518
+ .tx-nav-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-top: 9px; }
519
+ .tx-grp { display: inline-flex; align-items: center; gap: 7px; font-size: 13px; }
520
+ .tx-grp.none { color: var(--muted); font-style: italic; }
521
+ .tx-grp-lbl { color: var(--muted); text-transform: uppercase; letter-spacing: .05em; font-size: 11px; }
522
+ .tx-grp .btn { padding: 2px 9px; }
523
+ /* Block filter (focus the transcript on one PR / feature / use-case). */
524
+ .tx-filter-wrap { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
525
+ .tx-filter-wrap:empty { display: none; }
526
+ .tx-fdim { font: inherit; font-size: 12px; padding: 2px 6px; border: 1px solid var(--line); border-radius: 6px; background: var(--paper); color: var(--ink); }
527
+ .tx-fdim-lbl { font-weight: 600; font-size: 12px; }
528
+ .tx-fchips { display: inline-flex; flex-wrap: wrap; gap: 4px; }
529
+ .tx-fchip { border: 1px solid var(--line); background: var(--paper); color: var(--muted); border-radius: 999px; padding: 2px 10px; font-size: 12px; cursor: pointer; }
530
+ .tx-fchip:hover { color: var(--ink); border-color: var(--gray); }
531
+ .tx-fchip.on { color: var(--ink); border-color: var(--emerald); background: #eaf3ec; }
532
+ .turn.tx-hidden, .tx-spawn.tx-hidden { display: none; }
533
+ .tx-gap { text-align: center; color: var(--muted); font-size: 12px; padding: 7px 0; letter-spacing: .04em; }
534
+ /* Turn-share count inside each View-by pill (e.g. "research (3/30)"). */
535
+ .tx-fchip-n { color: var(--muted); font-size: 11px; font-variant-numeric: tabular-nums; }
536
+ .tx-fchip.on .tx-fchip-n { color: var(--ink); }
537
+ /* Mini sparkline of where the value's blocks fall across the session. */
538
+ .tx-fbar { vertical-align: middle; margin-left: 6px; border-radius: 2px; }
539
+ .tx-fbar rect.lit { fill: var(--emerald); }
540
+ .tx-fbar rect.trk { fill: var(--track); }
541
+ .tx-pos { font-family: ui-monospace, Menlo, monospace; font-size: 12px; color: var(--muted); }
542
+ .tx-pos b { color: var(--ink); font-weight: 600; }
543
+ .tx-errs .tx-pos b { color: var(--red); }
544
+ .tx-now { margin-top: 9px; font-size: 12.5px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
545
+ .tx-ol-wrap { position: relative; }
546
+ .tx-ol-btn { border: 1px solid var(--line); background: var(--paper); color: var(--ink); border-radius: 7px; padding: 2px 9px; font-size: 13px; cursor: pointer; }
547
+ .tx-ol-btn:hover, .tx-ol-btn.on { border-color: var(--emerald); color: var(--emerald); }
548
+ .tx-outline { position: absolute; top: 100%; left: 0; z-index: 20; margin-top: 4px; width: min(460px, 84vw); max-height: 46vh; overflow-y: auto; background: var(--paper); border: 1px solid var(--line); border-radius: 8px; box-shadow: 0 8px 20px rgba(20,18,15,.14); display: none; }
549
+ .tx-outline.on { display: block; }
550
+ /* Filter box pinned to the top of a long outline; the list scrolls beneath it. */
551
+ .tx-ol-search { position: sticky; top: 0; z-index: 1; padding: 8px; background: var(--paper); border-bottom: 1px solid var(--line); }
552
+ .tx-ol-search-input { width: 100%; box-sizing: border-box; border: 1px solid var(--line); border-radius: 6px; padding: 5px 9px; font-size: 12.5px; color: var(--ink); background: var(--paper); }
553
+ .tx-ol-search-input:focus { outline: none; border-color: var(--emerald); }
554
+ .tx-ol-list .tx-ol-hide { display: none; }
555
+ .tx-ol-item { display: flex; align-items: baseline; gap: 9px; width: 100%; text-align: left; border: 0; border-bottom: 1px solid var(--line); background: transparent; padding: 7px 11px; font-size: 12.5px; color: var(--ink); cursor: pointer; }
556
+ .tx-ol-item:last-child { border-bottom: 0; }
557
+ .tx-ol-item:hover { background: #fbf8f1; }
558
+ .tx-ol-item.cur { background: #eaf3ec; }
559
+ .tx-ol-item.cur .tx-ol-n { color: var(--emerald); }
560
+ .tx-ol-n { flex: none; min-width: 18px; color: var(--muted); font-family: ui-monospace, Menlo, monospace; font-size: 11px; }
561
+ .tx-ol-tx { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
562
+ .turn .tnum { margin-left: 6px; color: var(--emerald); font-family: ui-monospace, Menlo, monospace; }
563
+ /* Jump highlight: an outline pulse that doesn't fight the turn/error backgrounds. */
564
+ @keyframes flashpulse { 0% { box-shadow: 0 0 0 2px var(--emerald); } 100% { box-shadow: 0 0 0 2px transparent; } }
565
+ /* Error reveal: a glowing box that HOLDS, then fades */
566
+ @keyframes flashpulseR {
567
+ 0%, 55% { box-shadow: 0 0 0 3px var(--red), 0 0 16px 3px rgba(180, 69, 47, .45); }
568
+ 100% { box-shadow: 0 0 0 3px transparent, 0 0 16px 3px transparent; }
569
+ }
570
+ .turn.flash { animation: flashpulse 1.2s ease; }
571
+ .tx-error.flash { animation: flashpulseR 1.6s ease-out; }
572
+ /* Transcript search — central, grows to fill the row between Turn (left) and Errors (right). */
573
+ .tx-search { flex: 1 1 auto; min-width: 180px; }
574
+ .tx-search-input { flex: 1 1 auto; min-width: 0; padding: 3px 8px; border: 1px solid var(--line); border-radius: 7px; font-size: 12px; background: var(--paper); color: var(--ink); }
575
+ .tx-search-input:focus { border-color: var(--emerald); outline: none; }
576
+ .tx-search-input::placeholder { color: var(--muted); }
577
+ /* Result stepper appears only once a term is entered. */
578
+ .tx-search-results { display: none; align-items: center; gap: 7px; flex: none; }
579
+ .tx-search.on .tx-search-results { display: inline-flex; }
580
+ .tx-hl { background: #fde68a !important; border-radius: 2px; padding: 0 1px; scroll-margin-top: calc(var(--head-h, 120px) + 10px); }
581
+ .tx-hl.active { background: #f97316 !important; color: #fff !important; outline: 2px solid #f97316; }
582
+ /* ---- Session link-add UI ---- */
583
+ .link-add-btn { border: 1px solid var(--line); background: var(--paper); color: var(--emerald); border-radius: 4px; width: 20px; height: 20px; font-size: 14px; line-height: 1; cursor: pointer; vertical-align: middle; margin-left: 6px; padding: 0; }
584
+ .link-add-btn:hover { background: #dfe9e0; }
585
+ .link-add-area { display: none; margin: 6px 0; }
586
+ .link-add-area.on { display: block; }
587
+ .link-ac { position: relative; }
588
+ .link-ac-input { width: 100%; padding: 5px 8px; border: 1px solid var(--line); border-radius: 6px; font-size: 12px; background: var(--paper); color: var(--ink); }
589
+ .link-ac-input:focus { border-color: var(--emerald); outline: none; }
590
+ .link-ac-input::placeholder { color: var(--muted); }
591
+ .link-ac-menu { position: absolute; top: 100%; left: 0; right: 0; z-index: 100; background: var(--paper); border: 1px solid var(--line); border-radius: 6px; margin-top: 2px; max-height: 180px; overflow-y: auto; box-shadow: 0 4px 12px rgba(0,0,0,.08); }
592
+ .link-ac-menu:empty { display: none; }
593
+ .link-ac-item { padding: 5px 10px; font-size: 12px; cursor: pointer; }
594
+ .link-ac-item:hover { background: #dfe9e0; color: var(--emerald); }
595
+ .link-ac-create { font-style: italic; color: var(--emerald); }
596
+ .link-remove-btn { border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 13px; line-height: 1; padding: 0 0 0 4px; vertical-align: middle; }
597
+ .link-remove-btn:hover { color: var(--red); }
598
+ .link-ac-error { color: var(--red); font-size: 11px; margin-top: 4px; }
599
+ .link-ac-spinner { color: var(--muted); font-size: 11px; margin-top: 4px; font-style: italic; }
600
+
601
+ /* Interactive feature-cost treemap (featTreemap.ts): drill-down + breadcrumb +
602
+ threshold slider + cursor tooltip. DOM divs (not SVG) so the polish is cheap. */
603
+ .tm { display: flex; flex-direction: column; gap: 10px; }
604
+ .tm-bar { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; min-height: 20px; }
605
+ .tm-crumb { font-size: 13px; color: var(--muted); }
606
+ .tm-crumb a { color: var(--emerald); cursor: pointer; }
607
+ .tm-crumb a:hover { text-decoration: underline; }
608
+ .tm-crumb .sep { margin: 0 6px; opacity: .5; }
609
+ .tm-thr { margin-left: auto; display: inline-flex; align-items: center; gap: 8px; color: var(--muted); font-size: 12px; white-space: nowrap; }
610
+ .tm-thr input[type=range] { width: 120px; accent-color: var(--emerald); }
611
+ .tm-thrval { width: 52px; display: inline-block; }
612
+ .tm-chart { position: relative; width: 100%; height: 480px; border: 1px solid var(--line);
613
+ border-radius: 8px; overflow: hidden; background: var(--paper); }
614
+ .tm-cell { position: absolute; overflow: hidden; cursor: default; border: 1px solid rgba(255,255,255,.55); }
615
+ .tm-cell.haskids { cursor: pointer; }
616
+ .tm-cell:focus-visible { outline: 2px solid var(--ink); outline-offset: -2px; }
617
+ .tm-cell .l { position: absolute; top: 4px; left: 6px; right: 6px;
618
+ font: 600 12px/1.15 ui-monospace, "SF Mono", Menlo, monospace; color: rgba(255,255,255,.97);
619
+ text-shadow: 0 1px 2px rgba(0,0,0,.32); white-space: nowrap; text-overflow: ellipsis; overflow: hidden; pointer-events: none; }
620
+ .tm-cell .v { position: absolute; top: 19px; left: 6px; font: 700 12px/1.1 ui-monospace, Menlo, monospace;
621
+ color: rgba(255,255,255,.95); text-shadow: 0 1px 2px rgba(0,0,0,.3); pointer-events: none; }
622
+ .tm-cell.direct { background-image: repeating-linear-gradient(45deg, rgba(255,255,255,.16) 0 6px, transparent 6px 12px); }
623
+ .tm-cell.haskids::after { content: ""; position: absolute; right: 5px; bottom: 4px; width: 0; height: 0;
624
+ border-left: 5px solid transparent; border-right: 5px solid transparent; border-bottom: 7px solid rgba(255,255,255,.8); }
625
+ .tm-cell.tiny .l, .tm-cell.tiny .v { display: none; }
626
+ .tm-tip { position: fixed; z-index: 50; pointer-events: none; display: none; max-width: 280px;
627
+ background: var(--ink); color: #fff; padding: 8px 10px; border-radius: 6px; font-size: 12px;
628
+ line-height: 1.35; box-shadow: 0 4px 14px rgba(0,0,0,.25); }
629
+ .tm-tip b { font-weight: 600; }
630
+ .tm-tip .pct { color: #9fe3c4; }
631
+ /* Highlights digest — the Dashboard's default view: computed insights about your
632
+ recent AI work, set as editorial sentences with the real numbers as emerald
633
+ accents, each drilling into the surface behind it. */
634
+ .hl { max-width: 720px; margin: 4px 0 0; }
635
+ .hl-head { font-size: 11px; text-transform: uppercase; letter-spacing: .12em; color: var(--muted); margin: 0; padding-bottom: 9px; border-bottom: 1px solid var(--ink); }
636
+ /* The row is a plain container (text is selectable); only "See the data" clicks. */
637
+ .hrow {
638
+ border-bottom: 1px solid var(--line); padding: 16px 0;
639
+ display: flex; align-items: baseline; gap: 22px; color: var(--ink);
640
+ }
641
+ .hrow-q { flex: 1; font-family: Georgia, "Times New Roman", serif; font-size: 17px; line-height: 1.5; }
642
+ .hrow-q b { font-weight: 600; font-style: normal; color: var(--ink); }
643
+ .hrow-to {
644
+ flex: none; border: 0; background: none; padding: 0; font-family: inherit; cursor: pointer;
645
+ font-size: 10.5px; text-transform: uppercase; letter-spacing: .08em; color: var(--gray); white-space: nowrap;
646
+ }
647
+ .hrow-to i { font-style: normal; display: inline-block; transition: transform .12s; }
648
+ .hrow-to:hover { color: var(--emerald); }
649
+ .hrow-to:hover i { transform: translateX(3px); }
650
+ /* Facet/artifact mention inside a highlight sentence — a small muted uppercase
651
+ label ("PR", "FILE", "REPO") carries the tagging; the value is left as plain
652
+ text (no fill/underline, which sat heavy or read link-like on long wrapping
653
+ titles). The per-type tooltip (title=) carries the meaning. */
654
+ .hl-tag-k {
655
+ margin-right: 5px; vertical-align: .5px; color: var(--muted);
656
+ font-size: 10.5px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em;
657
+ }
658
+ .home-ask { max-width: 720px; margin-top: 18px; padding: 14px 16px; background: var(--track); border-radius: 10px; font-size: 13px; color: var(--ink); }
659
+ .home-ask code { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: 12px; background: var(--paper); padding: 1px 6px; border-radius: 5px; border: 1px solid var(--line); }
660
+ .home-ask .muted { color: var(--muted); }
661
+ /* On the Dashboard tab the deep-dive prompt spans the content width; on Highlights
662
+ it stays inside the 720px reading column (same pattern as .notice above). */
663
+ #dash-ask .home-ask { max-width: none; }
664
+ .home-back { display: inline-block; margin-top: 10px; cursor: pointer; }
665
+
666
+ /* Store-state nudge (fresh / un-enriched store) — see notice.ts. Emerald-accented
667
+ like the grounding banner, but always-on rather than toggled. */
668
+ .notice { max-width: 720px; margin: 0 0 16px; padding: 12px 16px; background: var(--paper); border: 1px solid var(--line); border-left: 3px solid var(--emerald); border-radius: 8px; }
669
+ /* On the full-width tabs (Dashboard / Sessions / Artifacts) the notice spans the
670
+ content width; on Highlights it stays a 720px reading column. */
671
+ #dash-notice .notice, #sessions-notice .notice, #art-notice .notice { max-width: none; }
672
+ .notice .notice-h { font-size: 13px; font-weight: 600; color: var(--ink); margin-bottom: 3px; }
673
+ .notice .notice-b { font-size: 13px; color: var(--muted); line-height: 1.55; }
674
+ .notice code { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: 12px; background: var(--track); color: var(--ink); padding: 1px 6px; border-radius: 5px; border: 1px solid var(--line); }
675
+
676
+ /* Grounding banner shown above a destination view when arriving from a question */
677
+ /* Per-view slot the grounding message renders into (above the chart/table). Empty
678
+ = no space; when active it carries the .ask-banner below. scroll-margin keeps the
679
+ slot clear of the top when scrolled into view. */
680
+ .ask-slot { scroll-margin-top: 14px; }
681
+ .ask-slot.on { margin: 14px 0 18px; }
682
+ .ask-banner { display: none; }
683
+ .ask-banner.on { display: block; margin: 0; border: 1px solid var(--line); border-left: 3px solid var(--emerald); border-radius: 8px; background: var(--paper); overflow: hidden; }
684
+ .ask-bc { display: flex; align-items: center; gap: 12px; padding: 9px 14px; background: var(--track); font-size: 13px; }
685
+ .ask-q { flex: 1; color: var(--ink); }
686
+ .ask-q b { font-weight: 600; }
687
+ .ask-back { flex: none; cursor: pointer; color: var(--emerald); font-size: 12px; }
688
+ .ask-orient { display: flex; align-items: flex-start; gap: 8px; padding: 11px 14px; font-size: 13px; line-height: 1.5; }
689
+ .ask-ans { font-weight: 600; color: var(--ink); }
690
+ .ask-about { color: var(--muted); flex: 1; }
691
+ .ask-x { flex: none; border: 0; background: none; color: var(--muted); cursor: pointer; font-size: 13px; line-height: 1; padding: 2px 4px; }
692
+ .ask-x:hover { color: var(--ink); }
693
+
694
+ /* Site footer — Tuneloop awareness funnel (attribution + GitHub + feedback). */
695
+ .site-footer { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 10px; padding: 30px 28px 38px; margin-top: 36px; border-top: 1px solid var(--line); color: var(--muted); font-size: 13px; }
696
+ .site-footer a { color: var(--emerald); text-decoration: none; }
697
+ .site-footer a:hover { text-decoration: underline; }
698
+ .site-footer .dot { color: var(--line); }