eminiar 0.11.0 → 0.13.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.
@@ -345,6 +345,8 @@ header.top select.project {
345
345
  }
346
346
  .dot.empty {
347
347
  background: var(--bad);
348
+ /* the generic .empty placeholder rule must not turn the status dot into a disc */
349
+ padding: 0;
348
350
  }
349
351
  main.work {
350
352
  flex: 1;
@@ -1776,3 +1778,1833 @@ svg.glyph {
1776
1778
  .reasons li {
1777
1779
  margin: 1px 0;
1778
1780
  }
1781
+
1782
+ /* --- swarms tab (sw-*) ---------------------------------------------------------------
1783
+ A swarm monitor drawn in the dashboard's own tokens. Every state is glyph + word;
1784
+ motion means data (a pulse while a worker runs, a flash per tool call coloured by its
1785
+ io class: read = accent, write = warn, exec = purple). */
1786
+ .sw-page {
1787
+ max-width: 1640px;
1788
+ }
1789
+ .sw-layout {
1790
+ display: grid;
1791
+ grid-template-columns: minmax(260px, 330px) minmax(0, 1fr);
1792
+ gap: 14px;
1793
+ align-items: start;
1794
+ }
1795
+ @media (max-width: 900px) {
1796
+ .sw-layout {
1797
+ grid-template-columns: minmax(0, 1fr);
1798
+ }
1799
+ }
1800
+ .sw-rail,
1801
+ .sw-run {
1802
+ display: flex;
1803
+ flex-direction: column;
1804
+ gap: 12px;
1805
+ min-width: 0;
1806
+ }
1807
+ .sw-main {
1808
+ min-width: 0;
1809
+ }
1810
+ .sw-pad {
1811
+ padding: 12px 14px 4px;
1812
+ }
1813
+ .sw-p {
1814
+ margin: 6px 0 10px;
1815
+ }
1816
+ /* "Title ───────── meta" */
1817
+ .sw-head {
1818
+ display: flex;
1819
+ align-items: baseline;
1820
+ gap: 8px;
1821
+ font: 12px var(--mono);
1822
+ margin-bottom: 10px;
1823
+ min-width: 0;
1824
+ }
1825
+ .sw-head .t {
1826
+ font-weight: 600;
1827
+ color: var(--fg);
1828
+ white-space: nowrap;
1829
+ }
1830
+ .sw-head .rule {
1831
+ flex: 1;
1832
+ min-width: 16px;
1833
+ overflow: hidden;
1834
+ white-space: nowrap;
1835
+ color: var(--muted);
1836
+ opacity: 0.45;
1837
+ }
1838
+ .sw-head .rule::before {
1839
+ content: "────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────";
1840
+ }
1841
+ .sw-head .m {
1842
+ color: var(--muted);
1843
+ white-space: nowrap;
1844
+ overflow: hidden;
1845
+ text-overflow: ellipsis;
1846
+ max-width: 70%;
1847
+ }
1848
+ /* states: glyph + word, colour third */
1849
+ .sw-state {
1850
+ display: inline-flex;
1851
+ align-items: baseline;
1852
+ gap: 4px;
1853
+ font: 12px var(--mono);
1854
+ white-space: nowrap;
1855
+ }
1856
+ .sw-state .g {
1857
+ font-size: 12px;
1858
+ }
1859
+ .sw-s-pending,
1860
+ .sw-s-idle,
1861
+ .sw-s-cancelled {
1862
+ color: var(--muted);
1863
+ }
1864
+ .sw-s-running,
1865
+ .sw-s-active {
1866
+ color: var(--accent);
1867
+ }
1868
+ .sw-s-blocked {
1869
+ color: var(--warn);
1870
+ }
1871
+ .sw-s-done {
1872
+ color: var(--ok);
1873
+ }
1874
+ .sw-s-failed {
1875
+ color: var(--bad);
1876
+ }
1877
+ .sw-s-stale {
1878
+ color: var(--muted);
1879
+ font-style: italic;
1880
+ }
1881
+ .sw-s-coordinator {
1882
+ color: var(--fg);
1883
+ }
1884
+ /* role chips: --rc is a theme token picked per role */
1885
+ .sw-chip {
1886
+ --rc: var(--muted);
1887
+ display: inline-flex;
1888
+ align-items: center;
1889
+ gap: 4px;
1890
+ font: 11px / 18px var(--mono);
1891
+ padding: 0 7px;
1892
+ border-radius: 999px;
1893
+ color: var(--rc);
1894
+ border: 1px solid color-mix(in srgb, var(--rc) 45%, transparent);
1895
+ background: color-mix(in srgb, var(--rc) 10%, transparent);
1896
+ white-space: nowrap;
1897
+ max-width: 100%;
1898
+ overflow: hidden;
1899
+ text-overflow: ellipsis;
1900
+ }
1901
+ .sw-chip .n {
1902
+ color: var(--muted);
1903
+ }
1904
+ .sw-chip .fs {
1905
+ font-size: 10px;
1906
+ }
1907
+ .sw-badge {
1908
+ display: inline-block;
1909
+ font: 10.5px / 16px var(--mono);
1910
+ padding: 0 6px;
1911
+ border-radius: 4px;
1912
+ border: 1px solid var(--line);
1913
+ color: var(--muted);
1914
+ margin-left: 4px;
1915
+ white-space: nowrap;
1916
+ }
1917
+ .sw-badge.warn {
1918
+ color: var(--warn);
1919
+ border-color: var(--warn);
1920
+ }
1921
+ .sw-note-box {
1922
+ border: 1px dashed var(--line);
1923
+ border-radius: 8px;
1924
+ padding: 8px 10px;
1925
+ margin-bottom: 10px;
1926
+ font-size: 12.5px;
1927
+ }
1928
+ .sw-note-box.bad {
1929
+ border-color: var(--bad);
1930
+ }
1931
+ .sw-note-box.warn {
1932
+ border-color: var(--warn);
1933
+ border-style: solid;
1934
+ margin: 10px 0 0;
1935
+ }
1936
+ /* a summary row that toggles its details: a real button, drawn as plain content */
1937
+ .sw-btn {
1938
+ display: block;
1939
+ width: 100%;
1940
+ margin: 0;
1941
+ padding: 0;
1942
+ border: 0;
1943
+ border-radius: 4px;
1944
+ background: none;
1945
+ color: inherit;
1946
+ font: inherit;
1947
+ text-align: left;
1948
+ white-space: normal;
1949
+ cursor: pointer;
1950
+ }
1951
+ .sw-page :is(a, button, [tabindex]):focus-visible {
1952
+ outline: 2px solid var(--accent);
1953
+ outline-offset: 2px;
1954
+ }
1955
+ /* SVG nodes: a ring of their own instead of the box outline */
1956
+ .sw-page svg [tabindex]:focus-visible {
1957
+ outline: none;
1958
+ }
1959
+ /* rail: configured swarms */
1960
+ .sw-swarm {
1961
+ border-top: 1px solid var(--line);
1962
+ padding: 10px 0;
1963
+ }
1964
+ .sw-swarm:first-of-type {
1965
+ border-top: none;
1966
+ padding-top: 2px;
1967
+ }
1968
+ .sw-swarm .h {
1969
+ display: flex;
1970
+ align-items: baseline;
1971
+ gap: 8px;
1972
+ cursor: pointer;
1973
+ user-select: none;
1974
+ }
1975
+ .sw-swarm .h:hover b {
1976
+ color: var(--accent);
1977
+ }
1978
+ .sw-swarm .h b {
1979
+ font: 600 13px var(--mono);
1980
+ }
1981
+ .sw-swarm .topo {
1982
+ font: 15px var(--mono);
1983
+ color: var(--accent);
1984
+ width: 16px;
1985
+ text-align: center;
1986
+ }
1987
+ .sw-swarm .caret {
1988
+ margin-left: auto;
1989
+ color: var(--muted);
1990
+ }
1991
+ .sw-swarm .d {
1992
+ margin: 2px 0 6px 24px;
1993
+ }
1994
+ .sw-swarm .chips {
1995
+ display: flex;
1996
+ flex-wrap: wrap;
1997
+ gap: 4px;
1998
+ margin-left: 24px;
1999
+ }
2000
+ .sw-swarm .files,
2001
+ .sw-swarm > .mono {
2002
+ display: flex;
2003
+ flex-wrap: wrap;
2004
+ gap: 4px 10px;
2005
+ margin: 6px 0 0 24px;
2006
+ font-family: var(--mono);
2007
+ font-size: 11px;
2008
+ }
2009
+ .sw-swarm .more {
2010
+ margin: 10px 0 0 24px;
2011
+ }
2012
+ table.sw-roles td,
2013
+ table.sw-roles th {
2014
+ padding: 4px 6px;
2015
+ font-size: 12px;
2016
+ }
2017
+ .sw-orphans {
2018
+ margin: 6px 0 10px;
2019
+ font-family: var(--mono);
2020
+ }
2021
+ .sw-sync {
2022
+ margin-top: 8px;
2023
+ }
2024
+ .sw-issues {
2025
+ list-style: none;
2026
+ margin: 8px 0;
2027
+ padding: 0;
2028
+ font-size: 12.5px;
2029
+ }
2030
+ .sw-issues li {
2031
+ display: flex;
2032
+ gap: 6px;
2033
+ align-items: baseline;
2034
+ flex-wrap: wrap;
2035
+ padding: 3px 0;
2036
+ border-bottom: 1px dashed var(--line);
2037
+ }
2038
+ .sw-issues .ln {
2039
+ color: var(--muted);
2040
+ min-width: 56px;
2041
+ }
2042
+ /* rail: runs */
2043
+ .sw-runs {
2044
+ max-height: 60vh;
2045
+ }
2046
+ .sw-runs a.item {
2047
+ display: block;
2048
+ color: inherit;
2049
+ text-decoration: none;
2050
+ }
2051
+ .sw-runs a.item:focus-visible {
2052
+ outline-offset: -2px;
2053
+ }
2054
+ .sw-runs .sw-goal {
2055
+ font-weight: 500;
2056
+ display: -webkit-box;
2057
+ -webkit-line-clamp: 2;
2058
+ -webkit-box-orient: vertical;
2059
+ overflow: hidden;
2060
+ word-break: normal;
2061
+ overflow-wrap: anywhere;
2062
+ margin: 2px 0;
2063
+ }
2064
+ .sw-progress {
2065
+ display: flex;
2066
+ height: 4px;
2067
+ border-radius: 2px;
2068
+ overflow: hidden;
2069
+ background: var(--line);
2070
+ margin-top: 5px;
2071
+ }
2072
+ .sw-progress span {
2073
+ display: block;
2074
+ height: 100%;
2075
+ }
2076
+ .sw-progress .done {
2077
+ background: var(--ok);
2078
+ }
2079
+ .sw-progress .active {
2080
+ background: var(--accent);
2081
+ }
2082
+ .sw-progress .bad {
2083
+ background: var(--bad);
2084
+ }
2085
+ /* main: empty states */
2086
+ .sw-optin p {
2087
+ margin: 0 0 10px;
2088
+ max-width: 820px;
2089
+ }
2090
+ .sw-cmds {
2091
+ display: flex;
2092
+ flex-wrap: wrap;
2093
+ gap: 12px;
2094
+ margin: 12px 0 18px;
2095
+ }
2096
+ .sw-cmds > div {
2097
+ display: flex;
2098
+ flex-direction: column;
2099
+ gap: 3px;
2100
+ }
2101
+ .sw-cmds code {
2102
+ display: block;
2103
+ padding: 6px 10px;
2104
+ border: 1px solid var(--line);
2105
+ }
2106
+ .sw-yaml {
2107
+ font: 12px / 1.55 var(--mono);
2108
+ background: var(--code);
2109
+ border: 1px solid var(--line);
2110
+ border-radius: 8px;
2111
+ padding: 10px 0;
2112
+ max-height: 560px;
2113
+ overflow: auto;
2114
+ white-space: pre;
2115
+ }
2116
+ .sw-yaml .l {
2117
+ display: block;
2118
+ padding-right: 12px;
2119
+ }
2120
+ .sw-yaml .l.mark {
2121
+ background: color-mix(in srgb, var(--bad) 14%, transparent);
2122
+ }
2123
+ .sw-yaml .ln {
2124
+ display: inline-block;
2125
+ width: 3.5em;
2126
+ padding-right: 12px;
2127
+ text-align: right;
2128
+ color: var(--muted);
2129
+ opacity: 0.7;
2130
+ user-select: none;
2131
+ }
2132
+ .sw-yaml .tok-kw {
2133
+ color: var(--tok-kw);
2134
+ }
2135
+ .sw-yaml .tok-str {
2136
+ color: var(--tok-str);
2137
+ }
2138
+ .sw-yaml .tok-num {
2139
+ color: var(--tok-num);
2140
+ }
2141
+ .sw-yaml .tok-ty {
2142
+ color: var(--tok-ty);
2143
+ }
2144
+ .sw-yaml .tok-pn {
2145
+ color: var(--tok-pn);
2146
+ }
2147
+ .sw-yaml .tok-cm {
2148
+ color: var(--tok-cm);
2149
+ font-style: italic;
2150
+ }
2151
+ .sw-pre {
2152
+ font: 12px / 1.5 var(--mono);
2153
+ white-space: pre-wrap;
2154
+ word-break: break-word;
2155
+ background: var(--code);
2156
+ border: 1px solid var(--line);
2157
+ border-radius: 6px;
2158
+ padding: 8px 10px;
2159
+ margin: 6px 0;
2160
+ max-height: 320px;
2161
+ overflow: auto;
2162
+ cursor: text;
2163
+ }
2164
+ /* main: run header + stat tiles */
2165
+ .sw-runhead .goal {
2166
+ font-size: 16px;
2167
+ font-weight: 600;
2168
+ min-width: 0;
2169
+ overflow-wrap: anywhere;
2170
+ }
2171
+ .sw-runhead .meta {
2172
+ display: flex;
2173
+ flex-wrap: wrap;
2174
+ gap: 4px 14px;
2175
+ margin-top: 6px;
2176
+ }
2177
+ .sw-summary-text {
2178
+ margin-top: 8px;
2179
+ padding: 6px 10px;
2180
+ border-left: 3px solid var(--bar);
2181
+ white-space: pre-wrap;
2182
+ font-size: 13px;
2183
+ }
2184
+ .sw-finish {
2185
+ flex-basis: 100%;
2186
+ display: flex;
2187
+ flex-direction: column;
2188
+ gap: 8px;
2189
+ margin-top: 8px;
2190
+ padding: 10px;
2191
+ border: 1px solid var(--line);
2192
+ border-radius: 8px;
2193
+ background: var(--bg);
2194
+ }
2195
+ .sw-radio {
2196
+ display: inline-flex;
2197
+ align-items: center;
2198
+ gap: 4px;
2199
+ padding: 2px 8px;
2200
+ border: 1px solid var(--line);
2201
+ border-radius: 999px;
2202
+ cursor: pointer;
2203
+ }
2204
+ .sw-radio.on {
2205
+ border-color: var(--accent);
2206
+ background: var(--accent-soft);
2207
+ }
2208
+ .sw-radio input {
2209
+ margin: 0;
2210
+ }
2211
+ textarea.sw-summary {
2212
+ min-height: 64px;
2213
+ }
2214
+ .sw-stats {
2215
+ display: grid;
2216
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
2217
+ gap: 12px;
2218
+ }
2219
+ .sw-stat .big {
2220
+ font-family: var(--mono);
2221
+ font-variant-numeric: tabular-nums;
2222
+ }
2223
+ /* topology canvas */
2224
+ .sw-topo-wrap {
2225
+ overflow-x: auto;
2226
+ }
2227
+ svg.sw-topo {
2228
+ display: block;
2229
+ width: 100%;
2230
+ height: auto;
2231
+ margin: 0 auto;
2232
+ overflow: visible;
2233
+ }
2234
+ .sw-edge {
2235
+ fill: none;
2236
+ stroke: var(--line);
2237
+ stroke-width: 1.5;
2238
+ }
2239
+ .sw-edge.ghost {
2240
+ stroke-dasharray: 3 4;
2241
+ }
2242
+ .sw-edge.peer {
2243
+ stroke-dasharray: 2 5;
2244
+ opacity: 0.8;
2245
+ }
2246
+ .sw-edge.hot {
2247
+ stroke: var(--accent);
2248
+ stroke-width: 2.5;
2249
+ stroke-dasharray: 6 8;
2250
+ opacity: 1;
2251
+ animation: sw-dash 0.9s linear infinite;
2252
+ }
2253
+ .sw-lane rect {
2254
+ fill: var(--bg);
2255
+ stroke: var(--line);
2256
+ }
2257
+ .sw-lane text {
2258
+ font: 11px var(--mono);
2259
+ fill: var(--muted);
2260
+ text-anchor: middle;
2261
+ }
2262
+ .sw-lane text.arrow {
2263
+ text-anchor: middle;
2264
+ }
2265
+ .sw-node .sw-core {
2266
+ fill: var(--card);
2267
+ stroke: var(--muted);
2268
+ stroke-width: 2;
2269
+ }
2270
+ .sw-node.hub .sw-core {
2271
+ stroke: var(--fg);
2272
+ }
2273
+ .sw-node.hub .sw-glyph {
2274
+ fill: var(--fg);
2275
+ font-size: 18px;
2276
+ }
2277
+ .sw-node.hub .sw-halo {
2278
+ stroke: var(--accent);
2279
+ }
2280
+ .sw-glyph {
2281
+ font: 15px var(--mono);
2282
+ text-anchor: middle;
2283
+ fill: var(--fg);
2284
+ }
2285
+ .sw-l1,
2286
+ .sw-l2 {
2287
+ font: 11px var(--mono);
2288
+ text-anchor: middle;
2289
+ fill: var(--fg);
2290
+ }
2291
+ .sw-l1 .id {
2292
+ fill: var(--muted);
2293
+ }
2294
+ text.sw-l2 {
2295
+ font-size: 10.5px;
2296
+ color: var(--muted);
2297
+ fill: currentColor;
2298
+ }
2299
+ .sw-node.worker {
2300
+ cursor: pointer;
2301
+ }
2302
+ .sw-node.worker:hover .sw-core {
2303
+ stroke-width: 3;
2304
+ }
2305
+ .sw-focus {
2306
+ fill: none;
2307
+ stroke: none;
2308
+ }
2309
+ .sw-node:focus-visible .sw-focus {
2310
+ stroke: var(--accent);
2311
+ stroke-width: 2;
2312
+ stroke-dasharray: 4 3;
2313
+ }
2314
+ .sw-glyph.sw-plus {
2315
+ font-size: 12px;
2316
+ font-weight: 600;
2317
+ }
2318
+ .sw-node.picked .sw-core {
2319
+ stroke-width: 3.5;
2320
+ fill: var(--accent-soft);
2321
+ }
2322
+ .sw-node.st-stale .sw-core {
2323
+ stroke-dasharray: 3 3;
2324
+ }
2325
+ .sw-node.st-done .sw-core,
2326
+ .sw-node.group .sw-core {
2327
+ fill: var(--bg);
2328
+ }
2329
+ .sw-node.st-done,
2330
+ .sw-node.group {
2331
+ opacity: 0.75;
2332
+ }
2333
+ .sw-node.idle .sw-core {
2334
+ stroke-dasharray: 2 4;
2335
+ fill: none;
2336
+ }
2337
+ .sw-node.idle {
2338
+ opacity: 0.65;
2339
+ }
2340
+ .sw-halo {
2341
+ fill: none;
2342
+ stroke-width: 2;
2343
+ opacity: 0.5;
2344
+ transform-box: fill-box;
2345
+ transform-origin: center;
2346
+ animation: sw-pulse 2s ease-in-out infinite;
2347
+ }
2348
+ .sw-flash {
2349
+ fill: none;
2350
+ stroke-width: 3;
2351
+ stroke: var(--muted);
2352
+ transform-box: fill-box;
2353
+ transform-origin: center;
2354
+ animation: sw-flash 1.3s ease-out forwards;
2355
+ }
2356
+ .sw-flash.io-read {
2357
+ stroke: var(--accent);
2358
+ }
2359
+ .sw-flash.io-write {
2360
+ stroke: var(--warn);
2361
+ }
2362
+ .sw-flash.io-exec {
2363
+ stroke: var(--tok-kw);
2364
+ }
2365
+ .sw-flash.io-swarm {
2366
+ stroke: var(--tok-ty);
2367
+ }
2368
+ @keyframes sw-pulse {
2369
+ 0%,
2370
+ 100% {
2371
+ transform: scale(1);
2372
+ opacity: 0.55;
2373
+ }
2374
+ 50% {
2375
+ transform: scale(1.22);
2376
+ opacity: 0.08;
2377
+ }
2378
+ }
2379
+ @keyframes sw-flash {
2380
+ 0% {
2381
+ transform: scale(0.9);
2382
+ opacity: 1;
2383
+ }
2384
+ 100% {
2385
+ transform: scale(1.8);
2386
+ opacity: 0;
2387
+ }
2388
+ }
2389
+ @keyframes sw-dash {
2390
+ to {
2391
+ stroke-dashoffset: -28;
2392
+ }
2393
+ }
2394
+ @keyframes sw-breathe {
2395
+ 50% {
2396
+ opacity: 0.55;
2397
+ }
2398
+ }
2399
+ .sw-legend {
2400
+ display: flex;
2401
+ flex-wrap: wrap;
2402
+ gap: 4px 14px;
2403
+ justify-content: center;
2404
+ margin-top: 6px;
2405
+ font-family: var(--mono);
2406
+ font-size: 11px;
2407
+ }
2408
+ .sw-legend .sep {
2409
+ opacity: 0.5;
2410
+ }
2411
+ .sw-sw {
2412
+ display: inline-block;
2413
+ width: 9px;
2414
+ height: 9px;
2415
+ border-radius: 50%;
2416
+ vertical-align: 0;
2417
+ background: var(--muted);
2418
+ }
2419
+ .sw-sw.io-read,
2420
+ .sw-tl .seg.io-read {
2421
+ background: var(--accent);
2422
+ }
2423
+ .sw-sw.io-write,
2424
+ .sw-tl .seg.io-write {
2425
+ background: var(--warn);
2426
+ }
2427
+ .sw-sw.io-exec,
2428
+ .sw-tl .seg.io-exec {
2429
+ background: var(--tok-kw);
2430
+ }
2431
+ .sw-sw.io-swarm,
2432
+ .sw-tl .seg.io-swarm {
2433
+ background: var(--tok-ty);
2434
+ }
2435
+ /* task board */
2436
+ .sw-board {
2437
+ display: grid;
2438
+ grid-template-columns: repeat(4, minmax(0, 1fr));
2439
+ gap: 10px;
2440
+ }
2441
+ @media (max-width: 1200px) {
2442
+ .sw-board {
2443
+ grid-template-columns: repeat(2, minmax(0, 1fr));
2444
+ }
2445
+ }
2446
+ @media (max-width: 600px) {
2447
+ .sw-board {
2448
+ grid-template-columns: minmax(0, 1fr);
2449
+ }
2450
+ }
2451
+ .sw-col {
2452
+ background: var(--bg);
2453
+ border: 1px solid var(--line);
2454
+ border-radius: 8px;
2455
+ padding: 6px;
2456
+ min-height: 70px;
2457
+ min-width: 0;
2458
+ /* a long column scrolls on its own so the timeline and feed stay near */
2459
+ max-height: 760px;
2460
+ overflow-y: auto;
2461
+ }
2462
+ .sw-col .ch {
2463
+ position: sticky;
2464
+ top: -6px;
2465
+ background: var(--bg);
2466
+ z-index: 1;
2467
+ }
2468
+ .sw-col .ch {
2469
+ display: flex;
2470
+ justify-content: space-between;
2471
+ font: 11px var(--mono);
2472
+ text-transform: uppercase;
2473
+ letter-spacing: 0.04em;
2474
+ color: var(--muted);
2475
+ padding: 2px 4px 6px;
2476
+ }
2477
+ .sw-task {
2478
+ background: var(--card);
2479
+ border: 1px solid var(--line);
2480
+ border-left: 3px solid var(--line);
2481
+ border-radius: 6px;
2482
+ padding: 6px 8px;
2483
+ margin-bottom: 6px;
2484
+ min-width: 0;
2485
+ }
2486
+ .sw-task:hover {
2487
+ background: var(--hover);
2488
+ }
2489
+ .sw-task-sum:focus-visible {
2490
+ outline-offset: 4px;
2491
+ }
2492
+ .sw-col-more {
2493
+ display: block;
2494
+ width: 100%;
2495
+ margin-top: 2px;
2496
+ }
2497
+ .sw-task.st-active {
2498
+ border-left-color: var(--accent);
2499
+ }
2500
+ .sw-task.st-done {
2501
+ border-left-color: var(--ok);
2502
+ }
2503
+ .sw-task.st-failed {
2504
+ border-left-color: var(--bad);
2505
+ }
2506
+ .sw-task.st-blocked {
2507
+ border-left-color: var(--warn);
2508
+ }
2509
+ .sw-task .h {
2510
+ display: flex;
2511
+ gap: 6px;
2512
+ align-items: baseline;
2513
+ }
2514
+ .sw-task .id {
2515
+ font: 11px var(--mono);
2516
+ color: var(--muted);
2517
+ }
2518
+ .sw-task .title {
2519
+ font-size: 13px;
2520
+ font-weight: 500;
2521
+ overflow-wrap: anywhere;
2522
+ }
2523
+ .sw-task .m {
2524
+ display: flex;
2525
+ flex-wrap: wrap;
2526
+ gap: 4px 8px;
2527
+ align-items: center;
2528
+ margin-top: 4px;
2529
+ font: 11px var(--mono);
2530
+ color: var(--muted);
2531
+ }
2532
+ .sw-task .m .age {
2533
+ margin-left: auto;
2534
+ }
2535
+ .sw-task .deps.waiting {
2536
+ color: var(--warn);
2537
+ }
2538
+ .sw-task .x {
2539
+ margin-top: 6px;
2540
+ cursor: default;
2541
+ }
2542
+ .sw-task .x .lbl {
2543
+ font: 11px var(--mono);
2544
+ color: var(--muted);
2545
+ margin-top: 4px;
2546
+ }
2547
+ .sw-task .flist {
2548
+ display: flex;
2549
+ flex-wrap: wrap;
2550
+ gap: 4px;
2551
+ margin-top: 4px;
2552
+ }
2553
+ /* timeline */
2554
+ .sw-tl {
2555
+ display: flex;
2556
+ flex-direction: column;
2557
+ gap: 5px;
2558
+ }
2559
+ .sw-tl-row {
2560
+ display: grid;
2561
+ grid-template-columns: minmax(120px, 200px) minmax(0, 1fr);
2562
+ gap: 10px;
2563
+ align-items: center;
2564
+ }
2565
+ .sw-tl-row .who {
2566
+ display: flex;
2567
+ gap: 6px;
2568
+ align-items: center;
2569
+ min-width: 0;
2570
+ font: 11px var(--mono);
2571
+ }
2572
+ .sw-tl-row .who .id {
2573
+ color: var(--muted);
2574
+ }
2575
+ button.sw-release {
2576
+ margin-left: auto;
2577
+ padding: 0 6px;
2578
+ font: 11px / 18px var(--mono);
2579
+ }
2580
+ .sw-tl .track {
2581
+ position: relative;
2582
+ height: 16px;
2583
+ background: var(--bg);
2584
+ border: 1px solid var(--line);
2585
+ border-radius: 4px;
2586
+ }
2587
+ .sw-tl .life {
2588
+ position: absolute;
2589
+ top: 6px;
2590
+ height: 2px;
2591
+ background: var(--line);
2592
+ }
2593
+ .sw-tl .seg {
2594
+ position: absolute;
2595
+ top: 2px;
2596
+ height: 10px;
2597
+ min-width: 3px;
2598
+ border-radius: 3px;
2599
+ background: var(--muted);
2600
+ }
2601
+ .sw-tl .seg.err {
2602
+ box-shadow: inset 0 -3px 0 var(--bad);
2603
+ }
2604
+ /* before the oldest event drawn: activity there is not shown */
2605
+ .sw-tl .cut {
2606
+ position: absolute;
2607
+ top: 0;
2608
+ bottom: 0;
2609
+ background: repeating-linear-gradient(
2610
+ -45deg,
2611
+ transparent 0 4px,
2612
+ color-mix(in srgb, var(--muted) 22%, transparent) 4px 6px
2613
+ );
2614
+ }
2615
+ .sw-tl .seg.open {
2616
+ animation: sw-breathe 1.6s ease-in-out infinite;
2617
+ }
2618
+ .sw-tl-row.axis .track {
2619
+ background: none;
2620
+ border: none;
2621
+ height: 16px;
2622
+ }
2623
+ .sw-tl .tick {
2624
+ position: absolute;
2625
+ top: 0;
2626
+ font: 10px var(--mono);
2627
+ color: var(--muted);
2628
+ transform: translateX(-50%);
2629
+ white-space: nowrap;
2630
+ }
2631
+ .sw-tl .tick:first-child {
2632
+ transform: none;
2633
+ }
2634
+ .sw-tl .tick:last-child {
2635
+ transform: translateX(-100%);
2636
+ }
2637
+ /* feed + blackboard */
2638
+ .sw-two {
2639
+ display: grid;
2640
+ grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
2641
+ gap: 12px;
2642
+ align-items: start;
2643
+ }
2644
+ @media (max-width: 1200px) {
2645
+ .sw-two {
2646
+ grid-template-columns: minmax(0, 1fr);
2647
+ }
2648
+ }
2649
+ .sw-filters {
2650
+ margin-bottom: 8px;
2651
+ }
2652
+ .sw-filters select {
2653
+ padding: 3px 8px;
2654
+ font-size: 12px;
2655
+ }
2656
+ .sw-feed {
2657
+ max-height: 460px;
2658
+ overflow: auto;
2659
+ font: 12px / 1.45 var(--mono);
2660
+ }
2661
+ .sw-ev {
2662
+ display: grid;
2663
+ grid-template-columns: 34px minmax(0, max-content) 14px minmax(0, 1fr);
2664
+ gap: 8px;
2665
+ align-items: baseline;
2666
+ padding: 2px 4px;
2667
+ border-bottom: 1px solid color-mix(in srgb, var(--line) 60%, transparent);
2668
+ }
2669
+ .sw-ev:hover {
2670
+ background: var(--hover);
2671
+ }
2672
+ .sw-ev .t {
2673
+ color: var(--muted);
2674
+ text-align: right;
2675
+ }
2676
+ .sw-ev .g {
2677
+ text-align: center;
2678
+ color: var(--muted);
2679
+ }
2680
+ .sw-ev .x {
2681
+ overflow-wrap: anywhere;
2682
+ }
2683
+ .sw-ev .x b {
2684
+ color: var(--muted);
2685
+ font-weight: 500;
2686
+ }
2687
+ .sw-ev.k-tool.io-read .g {
2688
+ color: var(--accent);
2689
+ }
2690
+ .sw-ev.k-tool.io-write .g {
2691
+ color: var(--warn);
2692
+ }
2693
+ .sw-ev.k-tool.io-exec .g {
2694
+ color: var(--tok-kw);
2695
+ }
2696
+ .sw-ev.k-claim .g,
2697
+ .sw-ev.k-update .g,
2698
+ .sw-ev.k-plan .g {
2699
+ color: var(--accent);
2700
+ }
2701
+ .sw-ev.k-post .g {
2702
+ color: var(--tok-ty);
2703
+ }
2704
+ .sw-ev.k-auto_close .g,
2705
+ .sw-ev.k-auto_close .x {
2706
+ color: var(--warn);
2707
+ }
2708
+ .sw-ev.k-tool_error .g,
2709
+ .sw-ev.k-tool_error .x,
2710
+ .sw-ev.k-deny .g,
2711
+ .sw-ev.k-deny .x {
2712
+ color: var(--bad);
2713
+ }
2714
+ .sw-ev.k-run_start .x,
2715
+ .sw-ev.k-run_finish .x {
2716
+ font-weight: 600;
2717
+ }
2718
+ .sw-more {
2719
+ padding: 6px;
2720
+ text-align: center;
2721
+ }
2722
+ /* the feed is behind a burst: shown on top until it has caught up */
2723
+ .sw-ev.sw-gap {
2724
+ grid-template-columns: 34px minmax(0, 1fr);
2725
+ color: var(--warn);
2726
+ border-bottom: 1px dashed var(--warn);
2727
+ }
2728
+ .sw-ev.sw-gap .t {
2729
+ color: var(--warn);
2730
+ }
2731
+ .sw-retry {
2732
+ text-align: center;
2733
+ padding-bottom: 10px;
2734
+ }
2735
+ .sw-notes .sw-note-row {
2736
+ padding: 6px 4px;
2737
+ border-bottom: 1px solid var(--line);
2738
+ }
2739
+ .sw-notes .sw-note-row:hover {
2740
+ background: var(--hover);
2741
+ }
2742
+ .sw-note-row .h {
2743
+ display: flex;
2744
+ gap: 8px;
2745
+ align-items: center;
2746
+ min-width: 0;
2747
+ }
2748
+ .sw-note-row .k {
2749
+ color: var(--accent);
2750
+ overflow: hidden;
2751
+ text-overflow: ellipsis;
2752
+ }
2753
+ .sw-note-row .v,
2754
+ .sw-note-row .age {
2755
+ font: 11px var(--mono);
2756
+ color: var(--muted);
2757
+ }
2758
+ .sw-note-row .age {
2759
+ margin-left: auto;
2760
+ }
2761
+ .sw-note-row .p {
2762
+ color: var(--muted);
2763
+ font-size: 12px;
2764
+ overflow: hidden;
2765
+ text-overflow: ellipsis;
2766
+ white-space: nowrap;
2767
+ margin-top: 2px;
2768
+ }
2769
+ @media (prefers-reduced-motion: reduce) {
2770
+ .sw-halo,
2771
+ .sw-flash,
2772
+ .sw-edge.hot,
2773
+ .sw-tl .seg.open {
2774
+ animation: none;
2775
+ }
2776
+ .sw-halo {
2777
+ opacity: 0.35;
2778
+ }
2779
+ /* no motion: the flash is a static ring for as long as the activity is recent */
2780
+ .sw-flash {
2781
+ opacity: 0.9;
2782
+ }
2783
+ .sw-edge.hot {
2784
+ stroke-dasharray: none;
2785
+ }
2786
+ }
2787
+ .sw-file {
2788
+ margin: -4px 0 8px;
2789
+ overflow: hidden;
2790
+ text-overflow: ellipsis;
2791
+ white-space: nowrap;
2792
+ }
2793
+
2794
+ /* --- adjudicator tab (adj-*) ------------------------------------------------------------
2795
+ Source hues (heuristic blue, blend violet, cache teal, fallback amber) are fixed in both
2796
+ themes like the kind colours; everything else uses the theme tokens. Every coloured mark
2797
+ sits next to a word, so colour is never the only signal. */
2798
+ .adj-page .adj-t-ok {
2799
+ color: var(--ok);
2800
+ }
2801
+ .adj-page .adj-t-warn {
2802
+ color: var(--warn);
2803
+ }
2804
+ .adj-page .adj-t-bad {
2805
+ color: var(--bad);
2806
+ }
2807
+ .adj-page .adj-t-muted {
2808
+ color: var(--muted);
2809
+ }
2810
+ .adj-page .adj-t-accent {
2811
+ color: var(--accent);
2812
+ }
2813
+ .adj-page .tag.adj-t-ok,
2814
+ .adj-page .tag.adj-t-warn,
2815
+ .adj-page .tag.adj-t-bad,
2816
+ .adj-page .tag.adj-t-accent {
2817
+ border-color: currentColor;
2818
+ }
2819
+ .adj-page :is(a, button, [tabindex], select, textarea, input):focus-visible {
2820
+ outline: 2px solid var(--accent);
2821
+ outline-offset: 2px;
2822
+ }
2823
+ .adj-page .kv dd {
2824
+ word-break: break-word;
2825
+ }
2826
+ .adj-cmd {
2827
+ font: 12px var(--mono);
2828
+ background: var(--code);
2829
+ border: 1px solid var(--line);
2830
+ border-radius: 4px;
2831
+ padding: 1px 6px;
2832
+ white-space: nowrap;
2833
+ }
2834
+ .adj-link {
2835
+ border: 0;
2836
+ background: none;
2837
+ padding: 0;
2838
+ color: var(--accent);
2839
+ font: inherit;
2840
+ cursor: pointer;
2841
+ text-decoration: underline dotted;
2842
+ }
2843
+ .adj-intro p {
2844
+ margin: 0 0 8px;
2845
+ max-width: 80ch;
2846
+ line-height: 1.5;
2847
+ }
2848
+ .adj-intro .reasons {
2849
+ font-size: 12.5px;
2850
+ max-width: 80ch;
2851
+ }
2852
+ .adj-intro {
2853
+ margin-bottom: 14px;
2854
+ }
2855
+ .adj-assume {
2856
+ margin: -4px 0 14px;
2857
+ }
2858
+ .adj-kpis .card {
2859
+ min-width: 0;
2860
+ }
2861
+ .adj-kpis .sub {
2862
+ overflow-wrap: anywhere;
2863
+ }
2864
+ /* a wide table or chart scrolls inside its own box, so phone widths never scroll the page */
2865
+ .adj-scroll,
2866
+ .scroll-x {
2867
+ overflow-x: auto;
2868
+ max-width: 100%;
2869
+ }
2870
+ /* cells keep one line: a squeezed table scrolls instead of stacking a cell's labels */
2871
+ .scroll-x > table th,
2872
+ .scroll-x > table td {
2873
+ white-space: nowrap;
2874
+ }
2875
+ .adj-filters {
2876
+ margin-bottom: 8px;
2877
+ }
2878
+ .adj-filter {
2879
+ display: inline-flex;
2880
+ align-items: center;
2881
+ gap: 4px;
2882
+ }
2883
+ .adj-pager {
2884
+ justify-content: center;
2885
+ margin-top: 8px;
2886
+ }
2887
+ .adj-log {
2888
+ margin-bottom: 14px;
2889
+ }
2890
+ table.adj-calls {
2891
+ font-size: 12.5px;
2892
+ }
2893
+ table.adj-calls td {
2894
+ vertical-align: middle;
2895
+ }
2896
+ .adj-headcell {
2897
+ max-width: 280px;
2898
+ min-width: 140px;
2899
+ overflow: hidden;
2900
+ text-overflow: ellipsis;
2901
+ white-space: nowrap;
2902
+ }
2903
+ .adj-cx {
2904
+ display: inline-block;
2905
+ width: 26px;
2906
+ height: 5px;
2907
+ border-radius: 3px;
2908
+ background: var(--line);
2909
+ margin-right: 5px;
2910
+ vertical-align: middle;
2911
+ overflow: hidden;
2912
+ }
2913
+ .adj-cx i {
2914
+ display: block;
2915
+ height: 100%;
2916
+ background: var(--accent);
2917
+ }
2918
+ /* complexity histogram */
2919
+ .adj-hist {
2920
+ display: grid;
2921
+ grid-template-columns: repeat(5, minmax(0, 1fr));
2922
+ gap: 8px;
2923
+ align-items: end;
2924
+ }
2925
+ .adj-hist-col {
2926
+ display: flex;
2927
+ flex-direction: column;
2928
+ align-items: center;
2929
+ gap: 2px;
2930
+ min-width: 0;
2931
+ font-size: 11px;
2932
+ }
2933
+ .adj-hist-col .n {
2934
+ font-variant-numeric: tabular-nums;
2935
+ }
2936
+ .adj-hist-col .k {
2937
+ font-weight: 600;
2938
+ }
2939
+ .adj-hist-col .lbl {
2940
+ font-size: 10.5px;
2941
+ text-align: center;
2942
+ overflow-wrap: anywhere;
2943
+ }
2944
+ .adj-hist-track {
2945
+ height: 110px;
2946
+ width: 100%;
2947
+ max-width: 54px;
2948
+ display: flex;
2949
+ align-items: flex-end;
2950
+ border-bottom: 1px solid var(--line);
2951
+ }
2952
+ .adj-hist-bar {
2953
+ width: 100%;
2954
+ min-height: 1px;
2955
+ background: var(--accent);
2956
+ border-radius: 3px 3px 0 0;
2957
+ }
2958
+ /* tier matrix */
2959
+ table.adj-matrix {
2960
+ width: auto;
2961
+ min-width: 60%;
2962
+ font-size: 12.5px;
2963
+ }
2964
+ table.adj-matrix th.corner {
2965
+ font-weight: 400;
2966
+ font-size: 11px;
2967
+ }
2968
+ table.adj-matrix td.cell {
2969
+ min-width: 56px;
2970
+ text-align: center;
2971
+ border: 1px solid var(--line);
2972
+ font-variant-numeric: tabular-nums;
2973
+ }
2974
+ table.adj-matrix td.diag {
2975
+ box-shadow: inset 0 0 0 2px var(--ok);
2976
+ }
2977
+ table.adj-matrix td.strong {
2978
+ color: var(--card);
2979
+ font-weight: 600;
2980
+ }
2981
+ /* health */
2982
+ .adj-health {
2983
+ border-top: 1px solid var(--line);
2984
+ margin-top: 10px;
2985
+ padding-top: 8px;
2986
+ }
2987
+ .adj-health-grid {
2988
+ display: grid;
2989
+ grid-template-columns: auto minmax(0, 1fr);
2990
+ gap: 3px 12px;
2991
+ font-size: 12.5px;
2992
+ margin-top: 4px;
2993
+ }
2994
+ .adj-more summary {
2995
+ cursor: pointer;
2996
+ margin-top: 8px;
2997
+ }
2998
+ /* savings */
2999
+ .adj-figs {
3000
+ display: grid;
3001
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
3002
+ gap: 10px;
3003
+ margin-bottom: 10px;
3004
+ }
3005
+ .adj-figs .big {
3006
+ font-size: 20px;
3007
+ }
3008
+ table.adj-tiers td {
3009
+ vertical-align: middle;
3010
+ font-size: 12.5px;
3011
+ }
3012
+ table.adj-tiers .bar {
3013
+ max-width: 100%;
3014
+ }
3015
+ table.adj-eval {
3016
+ font-size: 12px;
3017
+ }
3018
+ /* try-it */
3019
+ .adj-try textarea {
3020
+ width: 100%;
3021
+ resize: vertical;
3022
+ min-height: 70px;
3023
+ }
3024
+ .adj-try-out {
3025
+ margin-top: 10px;
3026
+ border-top: 1px solid var(--line);
3027
+ padding-top: 10px;
3028
+ }
3029
+ /* drawer */
3030
+ .adj-backdrop {
3031
+ position: fixed;
3032
+ inset: 0;
3033
+ background: rgba(0, 0, 0, 0.35);
3034
+ z-index: 40;
3035
+ }
3036
+ .adj-drawer {
3037
+ position: fixed;
3038
+ top: 0;
3039
+ right: 0;
3040
+ bottom: 0;
3041
+ width: min(680px, 100vw);
3042
+ background: var(--bg);
3043
+ border-left: 1px solid var(--line);
3044
+ box-shadow: var(--shadow);
3045
+ z-index: 41;
3046
+ display: flex;
3047
+ flex-direction: column;
3048
+ outline: none;
3049
+ }
3050
+ .adj-drawer-head {
3051
+ display: flex;
3052
+ align-items: center;
3053
+ gap: 8px;
3054
+ flex-wrap: wrap;
3055
+ padding: 10px 16px;
3056
+ background: var(--card);
3057
+ border-bottom: 1px solid var(--line);
3058
+ flex: none;
3059
+ }
3060
+ .adj-drawer-body {
3061
+ flex: 1;
3062
+ min-height: 0;
3063
+ overflow-y: auto;
3064
+ overflow-x: hidden;
3065
+ padding: 12px 16px 24px;
3066
+ }
3067
+ .adj-drawer-body section {
3068
+ background: var(--card);
3069
+ border: 1px solid var(--line);
3070
+ border-radius: 10px;
3071
+ padding: 12px;
3072
+ margin-bottom: 10px;
3073
+ min-width: 0;
3074
+ }
3075
+ .adj-h {
3076
+ font-size: 11.5px;
3077
+ color: var(--muted);
3078
+ text-transform: uppercase;
3079
+ letter-spacing: 0.04em;
3080
+ font-weight: 600;
3081
+ display: flex;
3082
+ align-items: center;
3083
+ gap: 8px;
3084
+ margin: 0 0 6px;
3085
+ }
3086
+ .adj-h .right {
3087
+ margin-left: auto;
3088
+ text-transform: none;
3089
+ letter-spacing: 0;
3090
+ font-weight: 400;
3091
+ }
3092
+ .adj-head {
3093
+ margin: 0 0 4px;
3094
+ padding: 8px 10px;
3095
+ border-left: 3px solid var(--accent);
3096
+ background: var(--code);
3097
+ border-radius: 0 6px 6px 0;
3098
+ font: 12.5px / 1.5 var(--mono);
3099
+ white-space: pre-wrap;
3100
+ overflow-wrap: anywhere;
3101
+ }
3102
+ .adj-summary {
3103
+ display: grid;
3104
+ grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
3105
+ gap: 8px;
3106
+ }
3107
+ .adj-summary > div,
3108
+ .adj-savings-row > div {
3109
+ display: flex;
3110
+ flex-direction: column;
3111
+ min-width: 0;
3112
+ }
3113
+ .adj-summary .k,
3114
+ .adj-savings-row .k {
3115
+ font-size: 11px;
3116
+ color: var(--muted);
3117
+ }
3118
+ .adj-summary b,
3119
+ .adj-savings-row b {
3120
+ font-size: 17px;
3121
+ overflow-wrap: anywhere;
3122
+ }
3123
+ .adj-summary .s {
3124
+ font-size: 11px;
3125
+ color: var(--muted);
3126
+ }
3127
+ .adj-summary.small4 b {
3128
+ font-size: 15px;
3129
+ }
3130
+ .adj-savings-row {
3131
+ display: flex;
3132
+ align-items: center;
3133
+ gap: 10px;
3134
+ flex-wrap: wrap;
3135
+ margin-bottom: 4px;
3136
+ }
3137
+ .adj-savings-row .op {
3138
+ color: var(--muted);
3139
+ font-size: 18px;
3140
+ }
3141
+ .adj-alpha {
3142
+ display: inline-flex;
3143
+ align-items: center;
3144
+ gap: 4px;
3145
+ font-size: 12px;
3146
+ margin-right: 8px;
3147
+ }
3148
+ .adj-alpha .scorebar {
3149
+ width: 48px;
3150
+ display: inline-block;
3151
+ margin: 0;
3152
+ }
3153
+ .adj-intents {
3154
+ display: flex;
3155
+ flex-wrap: wrap;
3156
+ gap: 4px 4px;
3157
+ }
3158
+ .adj-legend {
3159
+ margin-bottom: 6px;
3160
+ }
3161
+ /* score tables */
3162
+ .adj-table {
3163
+ margin-top: 12px;
3164
+ }
3165
+ .adj-table:first-of-type {
3166
+ margin-top: 6px;
3167
+ }
3168
+ .adj-verdict-line {
3169
+ margin-bottom: 6px;
3170
+ font-size: 13px;
3171
+ }
3172
+ .adj-choice {
3173
+ font-size: 16px;
3174
+ }
3175
+ .adj-entries {
3176
+ display: flex;
3177
+ flex-direction: column;
3178
+ gap: 2px;
3179
+ }
3180
+ .adj-entry {
3181
+ border-radius: 6px;
3182
+ }
3183
+ .adj-entry.chosen {
3184
+ background: var(--accent-soft);
3185
+ }
3186
+ .adj-entry-row {
3187
+ display: grid;
3188
+ grid-template-columns: minmax(70px, 150px) minmax(0, 1fr) 40px;
3189
+ align-items: center;
3190
+ gap: 8px;
3191
+ width: 100%;
3192
+ margin: 0;
3193
+ padding: 3px 6px;
3194
+ border: 0;
3195
+ background: none;
3196
+ color: inherit;
3197
+ font: inherit;
3198
+ font-size: 12.5px;
3199
+ text-align: left;
3200
+ cursor: pointer;
3201
+ border-radius: 6px;
3202
+ }
3203
+ .adj-entry-row:hover {
3204
+ background: var(--hover);
3205
+ }
3206
+ .adj-entry.chosen .adj-entry-row:hover {
3207
+ background: transparent;
3208
+ }
3209
+ .adj-entry-row .opt {
3210
+ overflow: hidden;
3211
+ text-overflow: ellipsis;
3212
+ white-space: nowrap;
3213
+ }
3214
+ .adj-entry.chosen .opt {
3215
+ font-weight: 600;
3216
+ }
3217
+ .adj-entry-row .mark {
3218
+ display: inline-block;
3219
+ width: 16px;
3220
+ text-align: center;
3221
+ font-size: 11px;
3222
+ color: var(--ok);
3223
+ font-weight: 700;
3224
+ }
3225
+ .adj-entry-row .mark.ru {
3226
+ color: var(--muted);
3227
+ border: 1px solid var(--line);
3228
+ border-radius: 50%;
3229
+ width: 15px;
3230
+ height: 15px;
3231
+ line-height: 13px;
3232
+ font-size: 9.5px;
3233
+ margin-right: 1px;
3234
+ }
3235
+ .adj-entry-row .pc {
3236
+ text-align: right;
3237
+ font-size: 12px;
3238
+ }
3239
+ .adj-sbar {
3240
+ display: flex;
3241
+ height: 9px;
3242
+ background: var(--line);
3243
+ border-radius: 3px;
3244
+ overflow: hidden;
3245
+ }
3246
+ .adj-sbar i {
3247
+ display: block;
3248
+ height: 100%;
3249
+ }
3250
+ .adj-sbar i + i {
3251
+ box-shadow: inset 1px 0 0 var(--card);
3252
+ }
3253
+ .adj-reasons {
3254
+ list-style: none;
3255
+ margin: 2px 0 6px;
3256
+ padding: 0 6px 0 30px;
3257
+ font-size: 12px;
3258
+ }
3259
+ .adj-reasons li {
3260
+ display: grid;
3261
+ grid-template-columns: minmax(70px, 140px) 80px 44px minmax(0, 1fr);
3262
+ align-items: center;
3263
+ gap: 6px;
3264
+ padding: 1px 0;
3265
+ }
3266
+ .adj-reasons .f {
3267
+ overflow: hidden;
3268
+ text-overflow: ellipsis;
3269
+ white-space: nowrap;
3270
+ }
3271
+ .adj-reasons .w {
3272
+ text-align: right;
3273
+ font-size: 11.5px;
3274
+ }
3275
+ .adj-reasons .note {
3276
+ color: var(--muted);
3277
+ overflow-wrap: anywhere;
3278
+ }
3279
+ .adj-div {
3280
+ position: relative;
3281
+ height: 7px;
3282
+ background: linear-gradient(var(--line), var(--line)) center / 1px 100% no-repeat;
3283
+ }
3284
+ .adj-div i {
3285
+ position: absolute;
3286
+ top: 0;
3287
+ bottom: 0;
3288
+ border-radius: 2px;
3289
+ }
3290
+ .adj-div i.pos {
3291
+ background: var(--accent);
3292
+ }
3293
+ .adj-div i.neg {
3294
+ background: var(--bad);
3295
+ }
3296
+ .adj-div i.prov {
3297
+ background: #7c3aed;
3298
+ }
3299
+ .adj-div i.learn {
3300
+ background: #d97706;
3301
+ }
3302
+ /* complexity scale */
3303
+ .adj-scale {
3304
+ position: relative;
3305
+ display: grid;
3306
+ grid-template-columns: repeat(5, minmax(0, 1fr));
3307
+ gap: 2px;
3308
+ margin: 4px 0 8px;
3309
+ padding-top: 10px;
3310
+ }
3311
+ .adj-scale span {
3312
+ font-size: 10.5px;
3313
+ text-align: center;
3314
+ padding: 3px 2px;
3315
+ background: var(--line);
3316
+ color: var(--muted);
3317
+ overflow: hidden;
3318
+ text-overflow: ellipsis;
3319
+ white-space: nowrap;
3320
+ }
3321
+ .adj-scale span:first-child {
3322
+ border-radius: 4px 0 0 4px;
3323
+ }
3324
+ .adj-scale span:nth-child(5) {
3325
+ border-radius: 0 4px 4px 0;
3326
+ }
3327
+ .adj-scale span.on {
3328
+ background: var(--accent-soft);
3329
+ color: var(--fg);
3330
+ font-weight: 600;
3331
+ }
3332
+ .adj-scale .mk {
3333
+ position: absolute;
3334
+ top: 0;
3335
+ width: 0;
3336
+ height: 0;
3337
+ margin-left: -6px;
3338
+ border: 6px solid transparent;
3339
+ border-top: 9px solid var(--fg);
3340
+ }
3341
+ .adj-scale .mk.heur {
3342
+ border-top-color: var(--muted);
3343
+ opacity: 0.7;
3344
+ }
3345
+ @media (max-width: 600px) {
3346
+ .adj-reasons {
3347
+ padding-left: 6px;
3348
+ }
3349
+ .adj-reasons li {
3350
+ grid-template-columns: minmax(0, 1fr) 60px 44px;
3351
+ }
3352
+ .adj-reasons .note {
3353
+ grid-column: 1 / -1;
3354
+ padding-left: 8px;
3355
+ }
3356
+ .adj-entry-row {
3357
+ grid-template-columns: minmax(60px, 110px) minmax(0, 1fr) 36px;
3358
+ }
3359
+ .adj-scale span {
3360
+ font-size: 9.5px;
3361
+ }
3362
+ }
3363
+ .adj-more-opts {
3364
+ align-self: flex-start;
3365
+ margin: 2px 0 0 28px;
3366
+ }
3367
+ /* phone width: the tab strip gets its own row and scrolls inside it, so thirteen tabs never
3368
+ widen the page */
3369
+ @media (max-width: 900px) {
3370
+ nav.tabs {
3371
+ order: 10;
3372
+ flex: 1 0 100%;
3373
+ min-width: 0;
3374
+ overflow-x: auto;
3375
+ }
3376
+ nav.tabs button {
3377
+ flex: none;
3378
+ }
3379
+ }
3380
+
3381
+ /* --- Jev impact panel (inside the adjudicator tab) -------------------------------------
3382
+ Reuses the adj-* tokens, tags and tables; only the verdict line, the notes and the
3383
+ evidence list are new. Colours come from the theme tokens, so light and dark both work. */
3384
+ .jev-impact {
3385
+ margin-bottom: 14px;
3386
+ }
3387
+ .jev-impact > .grid {
3388
+ margin-top: 12px;
3389
+ }
3390
+ .jev-impact .grid .card {
3391
+ min-width: 0;
3392
+ }
3393
+ .jev-verdict {
3394
+ display: flex;
3395
+ flex-wrap: wrap;
3396
+ align-items: center;
3397
+ gap: 6px 10px;
3398
+ margin: 4px 0 6px;
3399
+ }
3400
+ .jev-why-line {
3401
+ min-width: 0;
3402
+ overflow-wrap: anywhere;
3403
+ }
3404
+ .jev-rule {
3405
+ margin: 4px 0 8px;
3406
+ max-width: 80ch;
3407
+ }
3408
+ .jev-rule p {
3409
+ margin: 0 0 6px;
3410
+ }
3411
+ .jev-warn {
3412
+ margin: 4px 0 0;
3413
+ padding-left: 18px;
3414
+ }
3415
+ .jev-banner {
3416
+ margin: 4px 0 8px;
3417
+ padding: 6px 10px;
3418
+ border: 1px solid var(--warn);
3419
+ border-radius: 6px;
3420
+ overflow-wrap: anywhere;
3421
+ }
3422
+ .jev-notes,
3423
+ .jev-foot {
3424
+ margin-top: 8px;
3425
+ overflow-wrap: anywhere;
3426
+ }
3427
+ .jev-foot {
3428
+ margin-top: 12px;
3429
+ }
3430
+ .jev-lines {
3431
+ list-style: none;
3432
+ margin: 8px 0 0;
3433
+ padding: 0;
3434
+ font-size: 12.5px;
3435
+ display: grid;
3436
+ gap: 3px;
3437
+ }
3438
+ .jev-lines b {
3439
+ display: inline-block;
3440
+ min-width: 68px;
3441
+ }
3442
+ .jev-evidence {
3443
+ list-style: none;
3444
+ margin: 6px 0 0;
3445
+ padding: 0;
3446
+ display: grid;
3447
+ gap: 5px;
3448
+ font-size: 12.5px;
3449
+ }
3450
+ .jev-evidence li {
3451
+ display: flex;
3452
+ flex-wrap: wrap;
3453
+ align-items: baseline;
3454
+ gap: 2px 8px;
3455
+ min-width: 0;
3456
+ }
3457
+ .jev-move {
3458
+ font-variant-numeric: tabular-nums;
3459
+ }
3460
+ .jev-why {
3461
+ flex-basis: 100%;
3462
+ overflow-wrap: anywhere;
3463
+ }
3464
+ @media (min-width: 601px) {
3465
+ .jev-why {
3466
+ flex-basis: auto;
3467
+ }
3468
+ }
3469
+
3470
+ /* --- Jev request log (inside the Jev impact panel) ---------------------------------------
3471
+ Table, timing bar and body viewer of the stored Jev requests. Theme tokens only, so light
3472
+ and dark both work; every coloured mark has a word beside it (legend, label or title). */
3473
+ .jev-xchg {
3474
+ margin-bottom: 14px;
3475
+ }
3476
+ .jev-xchg .jev-banner {
3477
+ margin-top: 6px;
3478
+ line-height: 1.45;
3479
+ }
3480
+ .xchg-row {
3481
+ cursor: pointer;
3482
+ }
3483
+ .xchg-row:hover td {
3484
+ background: var(--accent-soft);
3485
+ }
3486
+ .xchg-table td,
3487
+ .xchg-table th {
3488
+ white-space: nowrap;
3489
+ }
3490
+ .xchg-dur {
3491
+ display: inline-flex;
3492
+ align-items: center;
3493
+ gap: 8px;
3494
+ }
3495
+ .xchg-meter {
3496
+ display: inline-block;
3497
+ width: 56px;
3498
+ height: 5px;
3499
+ border-radius: 3px;
3500
+ background: var(--line);
3501
+ overflow: hidden;
3502
+ }
3503
+ .xchg-meter-fill {
3504
+ display: block;
3505
+ height: 100%;
3506
+ background: var(--accent);
3507
+ }
3508
+ .xchg-meter-fill.over {
3509
+ background: var(--bad);
3510
+ }
3511
+ .xchg-ids {
3512
+ display: inline-flex;
3513
+ flex-wrap: wrap;
3514
+ gap: 2px 8px;
3515
+ }
3516
+ /* timing bar: absolutely placed segments on a track, a marker for the deadline */
3517
+ .xchg-bar {
3518
+ position: relative;
3519
+ height: 16px;
3520
+ border-radius: 4px;
3521
+ background: var(--code);
3522
+ border: 1px solid var(--line);
3523
+ overflow: hidden;
3524
+ margin: 4px 0 6px;
3525
+ }
3526
+ .xchg-seg {
3527
+ position: absolute;
3528
+ top: 0;
3529
+ bottom: 0;
3530
+ min-width: 2px;
3531
+ }
3532
+ .xchg-seg-job {
3533
+ background: var(--muted);
3534
+ }
3535
+ .xchg-seg-wait {
3536
+ background: var(--warn);
3537
+ }
3538
+ .xchg-seg-retry {
3539
+ background: var(--bad);
3540
+ }
3541
+ .xchg-seg-ttfb {
3542
+ background: var(--accent);
3543
+ }
3544
+ .xchg-seg-rest {
3545
+ background: color-mix(in srgb, var(--accent) 45%, transparent);
3546
+ }
3547
+ .xchg-deadline {
3548
+ position: absolute;
3549
+ top: -1px;
3550
+ bottom: -1px;
3551
+ width: 0;
3552
+ border-left: 2px dashed var(--fg);
3553
+ }
3554
+ .xchg-legend {
3555
+ list-style: none;
3556
+ margin: 0 0 10px;
3557
+ padding: 0;
3558
+ display: flex;
3559
+ flex-wrap: wrap;
3560
+ gap: 2px 14px;
3561
+ }
3562
+ .xchg-legend li {
3563
+ display: inline-flex;
3564
+ align-items: center;
3565
+ gap: 5px;
3566
+ }
3567
+ .xchg-dot {
3568
+ display: inline-block;
3569
+ width: 9px;
3570
+ height: 9px;
3571
+ border-radius: 2px;
3572
+ min-width: 0;
3573
+ }
3574
+ .xchg-dot-deadline {
3575
+ background: none;
3576
+ border-left: 2px dashed var(--fg);
3577
+ border-radius: 0;
3578
+ width: 0;
3579
+ }
3580
+ .xchg-facts dd {
3581
+ word-break: normal;
3582
+ overflow-wrap: anywhere;
3583
+ }
3584
+ .xchg-body-head {
3585
+ display: flex;
3586
+ align-items: center;
3587
+ justify-content: space-between;
3588
+ gap: 8px;
3589
+ margin-bottom: 4px;
3590
+ }
3591
+ .xchg-trunc {
3592
+ margin-bottom: 4px;
3593
+ overflow-wrap: anywhere;
3594
+ }
3595
+ .xchg-json {
3596
+ margin: 0;
3597
+ padding: 8px 10px;
3598
+ max-height: 60vh;
3599
+ overflow: auto;
3600
+ white-space: pre;
3601
+ background: var(--code);
3602
+ border: 1px solid var(--line);
3603
+ border-radius: 6px;
3604
+ font: 12px / 1.5 var(--mono);
3605
+ tab-size: 2;
3606
+ }
3607
+ .adj-drawer-body .adj-h .right {
3608
+ overflow-wrap: anywhere;
3609
+ text-align: right;
3610
+ }