create-pmos 0.4.0 → 0.6.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.
- package/README.md +149 -4
- package/bin/create-pmos.js +97 -8
- package/package.json +7 -3
- package/payload/AGENTS-HUMAN.md +6 -0
- package/payload/AGENTS.md +62 -3
- package/payload/KIT-VERSION +2 -2
- package/payload/README.md +16 -2
- package/payload/SECURITY.md +59 -0
- package/payload/okf/core/concepts/design-loop.md +6 -3
- package/payload/okf/core/concepts/frontmatter-format.md +75 -0
- package/payload/okf/core/concepts/index.md +3 -0
- package/payload/okf/core/concepts/log.md +13 -0
- package/payload/okf/core/templates/design-brief-template.md +1 -1
- package/payload/okf/core/templates/eval-rubric-template.md +12 -10
- package/payload/okf/core/templates/prd-template.md +6 -0
- package/payload/okf/core/templates/prototype-brief-template.md +45 -21
- package/payload/planning/evals/agent-run-eval-rubric.md +10 -7
- package/payload/scripts/frontier.sh +60 -0
- package/payload/scripts/metrics.py +163 -102
- package/payload/scripts/pmos-log.sh +16 -6
- package/payload/skills/SKILL-FORMAT.md +72 -9
- package/payload/skills/discovery.skill +4 -0
- package/payload/skills/eval-rubric.skill +1 -1
- package/payload/skills/evaluator.skill +65 -20
- package/payload/skills/explain-run.skill +9 -6
- package/payload/skills/explain-surface.skill +156 -0
- package/payload/skills/ingest-repo.skill +4 -3
- package/payload/skills/pmos-router.skill +25 -3
- package/payload/skills/prd.skill +8 -0
- package/payload/skills/prototype.skill +106 -41
- package/payload/skills-native/copywriting/SKILL.md +57 -0
- package/payload/skills-native/discovery/SKILL.md +75 -0
- package/payload/skills-native/eval-rubric/SKILL.md +159 -0
- package/payload/skills-native/evaluator/SKILL.md +182 -0
- package/payload/skills-native/explain-run/SKILL.md +121 -0
- package/payload/skills-native/explain-surface/SKILL.md +158 -0
- package/payload/skills-native/ingest-repo/SKILL.md +120 -0
- package/payload/skills-native/okr/SKILL.md +70 -0
- package/payload/skills-native/pmos-router/SKILL.md +81 -0
- package/payload/skills-native/prd/SKILL.md +117 -0
- package/payload/skills-native/prototype/SKILL.md +147 -0
- package/payload/state/tickets/.gitkeep +0 -0
- package/payload/templates/agent-run-eval-rubric.md +10 -7
- package/payload/templates/ticket-template.md +20 -0
- package/workspace/README.md +112 -0
- package/workspace/REMOTE.md +131 -0
- package/workspace/bin/pmos.js +206 -0
- package/workspace/doctor.js +99 -0
- package/workspace/lib/console-state.js +117 -0
- package/workspace/lib/file-mode-parse.js +58 -0
- package/workspace/lib/harness-parse.js +222 -0
- package/workspace/lib/preview-kind.js +98 -0
- package/workspace/lib/rate-limit.js +26 -0
- package/workspace/lib/remote-access.js +235 -0
- package/workspace/lib/review-gate.js +39 -0
- package/workspace/lib/schedule-logic.js +132 -0
- package/workspace/lib/skill-store.js +143 -0
- package/workspace/lib/surface-contract.js +79 -0
- package/workspace/lib/transcript-read.js +247 -0
- package/workspace/package-lock.json +94 -0
- package/workspace/package.json +23 -0
- package/workspace/public/app.js +1710 -0
- package/workspace/public/index.html +175 -0
- package/workspace/public/styles.css +766 -0
- package/workspace/server.js +1753 -0
- package/workspace/skills/backlog-triage.skill +13 -0
- package/workspace/skills/weekly-report.skill +19 -0
|
@@ -0,0 +1,766 @@
|
|
|
1
|
+
/* PMOS Terminal Workspace — GUI client. D38 token layer (dark default + light switch);
|
|
2
|
+
caption-size semantic text tokens carry the floor-verified contrast fix. */
|
|
3
|
+
:root{
|
|
4
|
+
--bg:#0a0c10; --panel:#0f1217; --panel-head:#0c1015; --card:#10151c; --card-hover:#11161d;
|
|
5
|
+
--chip:#10141a; --pill:#161c24; --border:#1d242d; --border-3:#181e26; --border-strong:#2a3340;
|
|
6
|
+
--text:#eef1f5; --text-2:#cdd6e2; --text-3:#aab3c0; --text-muted:#8b95a5;
|
|
7
|
+
--text-faint:#8d97a7; --text-dim:#7d8798;
|
|
8
|
+
--accent:#4f93f7; --accent-text:#9cc2fb;
|
|
9
|
+
--ok:#48d597; --warn:#f1c052; --bad:#f2655f; --teal:#6fd6c4; --purple:#b39cf7;
|
|
10
|
+
--warn-text:#f1c052; --ok-text:#48d597; --teal-text:#6fd6c4;
|
|
11
|
+
--warn-wash:rgba(241,192,82,.08); --teal-wash:rgba(111,214,196,.06);
|
|
12
|
+
--accent-wash:rgba(79,147,247,.08);
|
|
13
|
+
--glass:rgba(11,14,18,.72); --glow:rgba(79,147,247,.3);
|
|
14
|
+
--shadow:rgba(0,0,0,.7);
|
|
15
|
+
--term-bg:#07090c;
|
|
16
|
+
/* xterm palette tokens — the single source for the JS terminal theme (xtheme()).
|
|
17
|
+
Dark in BOTH themes by design; the terminal is a terminal, not a themed surface. */
|
|
18
|
+
--xt-bg:#07090c; --xt-fg:#b9c2ce; --xt-cursor:#48d597; --xt-sel:rgba(79,147,247,.3);
|
|
19
|
+
--xt-black:#0a0c10; --xt-red:#f2655f; --xt-green:#48d597; --xt-yellow:#f1c052;
|
|
20
|
+
--xt-blue:#4f93f7; --xt-magenta:#b39cf7; --xt-cyan:#6fd6c4; --xt-white:#cdd6e2;
|
|
21
|
+
--xt-brblack:#5d6675; --xt-brgreen:#7fd9a8; --xt-accent-text:#9cc2fb; --xt-brwhite:#eef1f5;
|
|
22
|
+
--mono:"IBM Plex Mono",ui-monospace,SFMono-Regular,Menlo,monospace;
|
|
23
|
+
--sans:"IBM Plex Sans",system-ui,-apple-system,sans-serif;
|
|
24
|
+
/* layout knobs the JS adjusts (rail width, library/document split) */
|
|
25
|
+
--rail-w:400px; --libsplit:44%;
|
|
26
|
+
}
|
|
27
|
+
:root[data-theme="light"]{
|
|
28
|
+
--bg:#eef1f4; --panel:#ffffff; --panel-head:#f4f6f9; --card:#f7f9fb; --card-hover:#eef1f5;
|
|
29
|
+
--chip:#f2f4f7; --pill:#eaeef3; --border:#dde2e9; --border-3:#edf0f4; --border-strong:#cdd4dd;
|
|
30
|
+
--text:#161c26; --text-2:#2d3744; --text-3:#48525f; --text-muted:#626d7b;
|
|
31
|
+
--text-faint:#5c6774; --text-dim:#66707e;
|
|
32
|
+
--accent:#2563eb; --accent-text:#2563c9;
|
|
33
|
+
--ok:#159a5c; --warn:#a9790c; --bad:#d23a31; --teal:#118a7b; --purple:#6f44cf;
|
|
34
|
+
--warn-text:#8a6309; --ok-text:#0e7a48; --teal-text:#0e6f63;
|
|
35
|
+
--warn-wash:rgba(241,192,82,.12); --teal-wash:rgba(111,214,196,.1);
|
|
36
|
+
--accent-wash:rgba(37,99,235,.07);
|
|
37
|
+
--glass:rgba(255,255,255,.78); --glow:rgba(37,99,235,.18);
|
|
38
|
+
--shadow:rgba(15,23,42,.22);
|
|
39
|
+
--term-bg:#0c0f13;
|
|
40
|
+
}
|
|
41
|
+
*{box-sizing:border-box;margin:0;padding:0}
|
|
42
|
+
html,body{height:100%}
|
|
43
|
+
body{background:var(--bg); color:var(--text); font-family:var(--sans); font-size:13px;
|
|
44
|
+
-webkit-font-smoothing:antialiased; overflow:hidden}
|
|
45
|
+
button{font:inherit;color:inherit;background:none;border:0;cursor:pointer}
|
|
46
|
+
:focus-visible{outline:2px solid var(--accent); outline-offset:2px; border-radius:4px}
|
|
47
|
+
.mono{font-family:var(--mono)}
|
|
48
|
+
|
|
49
|
+
/* The rows are fixed and the middle row is minmax(0,1fr): without the 0 minimum a tall column
|
|
50
|
+
(a long needs strip, a long document) grows the row past the viewport and body{overflow:hidden}
|
|
51
|
+
silently clips the BOTTOM OF THE TERMINAL. Every nested column repeats the min-height:0. */
|
|
52
|
+
.app{display:grid; grid-template-rows:44px minmax(0,1fr) 28px; height:100vh; height:100dvh}
|
|
53
|
+
|
|
54
|
+
/* ── top bar ── */
|
|
55
|
+
.bar{display:flex; align-items:center; gap:10px; padding:0 12px; min-width:0;
|
|
56
|
+
border-bottom:1px solid var(--border-3); background:var(--glass); backdrop-filter:blur(8px)}
|
|
57
|
+
.mark{width:23px;height:23px;display:grid;place-items:center;border:1px solid var(--border-strong);
|
|
58
|
+
border-radius:7px;background:var(--pill);font-family:var(--mono);font-size:11px;font-weight:700}
|
|
59
|
+
.bar b{font-size:14px;letter-spacing:.02em}
|
|
60
|
+
.bar .sub{font-family:var(--mono);font-size:8.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--text-dim)}
|
|
61
|
+
.bar .conn{font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;display:inline-flex;gap:6px;align-items:center}
|
|
62
|
+
.bar .conn::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--text-dim)}
|
|
63
|
+
.bar .conn.live{color:var(--ok-text)} .bar .conn.live::before{background:var(--ok);animation:pulse 2.2s infinite}
|
|
64
|
+
.bar .conn.off{color:var(--warn-text)} .bar .conn.off::before{background:var(--warn)}
|
|
65
|
+
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.35}}
|
|
66
|
+
.bar .right{margin-left:auto;display:flex;gap:6px}
|
|
67
|
+
.ibtn{min-height:32px;min-width:36px;padding:0 10px;display:grid;place-items:center;
|
|
68
|
+
border:1px solid var(--border);background:var(--chip);border-radius:8px;color:var(--text-3);
|
|
69
|
+
font-family:var(--mono);font-size:10px}
|
|
70
|
+
.ibtn:hover{border-color:var(--border-strong);color:var(--text-2)}
|
|
71
|
+
.ibtn[aria-pressed="true"]{border-color:var(--accent);color:var(--accent-text)}
|
|
72
|
+
|
|
73
|
+
/* ── three columns: workspace · terminal · library rail ── */
|
|
74
|
+
.body{display:grid; position:relative;
|
|
75
|
+
grid-template-columns:262px minmax(0,1fr) minmax(0,var(--rail-w));
|
|
76
|
+
grid-template-rows:minmax(0,1fr); min-height:0}
|
|
77
|
+
.body.rail-off{grid-template-columns:262px minmax(0,1fr)}
|
|
78
|
+
.body.rail-off .rail{display:none}
|
|
79
|
+
|
|
80
|
+
/* ── left column: the workspace — repos on top, running agents below, equal halves ── */
|
|
81
|
+
.side{border-right:1px solid var(--border-3);background:var(--panel);min-height:0;
|
|
82
|
+
display:grid;grid-template-rows:1fr 1fr}
|
|
83
|
+
.side>.pane+.pane{border-top:1px solid var(--border-3)}
|
|
84
|
+
.pane{display:flex;flex-direction:column;min-height:0;min-width:0}
|
|
85
|
+
.pane-body{overflow-y:auto;overscroll-behavior:contain;flex:1;min-height:0;padding-bottom:10px}
|
|
86
|
+
.pane[data-fold="off"]>.pane-body{display:none}
|
|
87
|
+
.pane[data-fold="off"]{flex:0 0 auto}
|
|
88
|
+
|
|
89
|
+
.cap{font-family:var(--mono);font-size:8.5px;letter-spacing:.15em;text-transform:uppercase;
|
|
90
|
+
color:var(--text-dim);padding:11px 12px 6px 14px;display:flex;gap:6px;align-items:center;
|
|
91
|
+
min-height:34px;flex:none;background:var(--panel);border-bottom:1px solid var(--border-3)}
|
|
92
|
+
.cap .ct{color:var(--warn-text);font-size:10.5px;font-weight:600;letter-spacing:.06em}
|
|
93
|
+
.cap .mini{margin-left:auto;width:26px;height:26px;display:grid;place-items:center;border-radius:7px;
|
|
94
|
+
border:1px solid var(--border);background:var(--chip);color:var(--accent-text);font-size:12px;letter-spacing:0}
|
|
95
|
+
.cap .mini:hover{border-color:var(--accent)}
|
|
96
|
+
/* a pane header that folds its body away */
|
|
97
|
+
.cap .fold{display:inline-flex;align-items:center;gap:5px;font:inherit;letter-spacing:.15em;
|
|
98
|
+
text-transform:uppercase;color:var(--text-dim)}
|
|
99
|
+
.cap .fold:hover{color:var(--text-2)}
|
|
100
|
+
.cap .fold .chev{font-size:9px;transition:transform .12s}
|
|
101
|
+
.pane[data-fold="off"] .cap .fold .chev{transform:rotate(-90deg)}
|
|
102
|
+
@media (prefers-reduced-motion:reduce){.cap .fold .chev{transition:none}}
|
|
103
|
+
|
|
104
|
+
/* workspaces — one server, many repos; the row carries the switch + a forget affordance */
|
|
105
|
+
.wsrow{display:flex;align-items:stretch}
|
|
106
|
+
.ws{display:flex;align-items:center;gap:8px;flex:1;min-width:0;text-align:left;min-height:40px;padding:0 8px 0 14px;
|
|
107
|
+
font-family:var(--mono);font-size:11px;color:var(--text-2);border-left:3px solid transparent}
|
|
108
|
+
.ws:hover{background:var(--card-hover)}
|
|
109
|
+
.ws[aria-current="true"]{border-left-color:var(--accent);background:var(--pill)}
|
|
110
|
+
.ws .cue{color:var(--text-dim);font-size:9px;flex:none}
|
|
111
|
+
.ws .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
112
|
+
.ws .tag{font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--text-dim);
|
|
113
|
+
border:1px solid var(--border);border-radius:5px;padding:1px 4px;flex:none}
|
|
114
|
+
.ws small{margin-left:auto;font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ok-text);flex:none}
|
|
115
|
+
.wsrow .forget{width:30px;display:grid;place-items:center;color:var(--text-dim);font-size:11px;opacity:0}
|
|
116
|
+
.wsrow:hover .forget,.wsrow .forget:focus-visible{opacity:1}
|
|
117
|
+
.wsrow .forget:hover{color:var(--bad)}
|
|
118
|
+
|
|
119
|
+
.newsess{display:flex;gap:8px;align-items:center;margin:10px 12px 4px;min-height:40px;padding:0 12px;
|
|
120
|
+
border:1px dashed var(--border-strong);border-radius:10px;font-family:var(--mono);font-size:10.5px;
|
|
121
|
+
color:var(--text-muted);width:calc(100% - 24px)}
|
|
122
|
+
.newsess:hover{color:var(--text-2);border-color:var(--accent)}
|
|
123
|
+
.newsess i{font-style:normal;color:var(--accent-text)}
|
|
124
|
+
|
|
125
|
+
/* inline forms: name a session before it starts · add a repo by picking a folder */
|
|
126
|
+
.miniform{margin:8px 12px 6px;display:flex;flex-direction:column;gap:6px}
|
|
127
|
+
.miniform[hidden]{display:none}
|
|
128
|
+
.miniform .lbl{font-family:var(--mono);font-size:8.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--text-dim)}
|
|
129
|
+
.miniform input{min-height:38px;padding:0 10px;border:1px solid var(--border-strong);border-radius:8px;
|
|
130
|
+
background:var(--chip);color:var(--text);font-family:var(--mono);font-size:11px;outline:none;width:100%}
|
|
131
|
+
.miniform input:focus{border-color:var(--accent)}
|
|
132
|
+
.miniform .row{display:flex;gap:6px}
|
|
133
|
+
.miniform button{min-height:38px;padding:0 12px;border:1px solid var(--accent);border-radius:8px;
|
|
134
|
+
background:var(--chip);font-family:var(--mono);font-size:10.5px;color:var(--accent-text)}
|
|
135
|
+
.miniform button.quiet{border-color:var(--border);color:var(--text-muted)}
|
|
136
|
+
.miniform button.quiet:hover{border-color:var(--border-strong);color:var(--text-2)}
|
|
137
|
+
/* the primary way to add a repo: the machine's own folder chooser, not a typed path */
|
|
138
|
+
.miniform .pick{min-height:42px;background:var(--accent-wash);border-color:var(--accent);
|
|
139
|
+
color:var(--accent-text);font-size:11px;display:flex;align-items:center;justify-content:center;gap:7px}
|
|
140
|
+
.miniform .pick:hover{background:var(--pill)}
|
|
141
|
+
.miniform .hint{font-size:10px;color:var(--text-muted);line-height:1.4}
|
|
142
|
+
.miniform .hint code{font-family:var(--mono);color:var(--text-3)}
|
|
143
|
+
.seg{display:flex;gap:0;border:1px solid var(--border);border-radius:8px;overflow:hidden}
|
|
144
|
+
.seg button{flex:1;min-height:36px;border:0;border-radius:0;background:var(--chip);color:var(--text-muted);
|
|
145
|
+
font-family:var(--mono);font-size:10.5px;padding:0}
|
|
146
|
+
.seg button+button{border-left:1px solid var(--border)}
|
|
147
|
+
.seg button[aria-checked="true"]{background:var(--pill);color:var(--accent-text)}
|
|
148
|
+
|
|
149
|
+
/* ── running agents ── */
|
|
150
|
+
.sessrow{display:flex;align-items:stretch;position:relative}
|
|
151
|
+
.sess{display:block;flex:1;min-width:0;text-align:left;padding:7px 4px 7px 11px;
|
|
152
|
+
border-left:3px solid transparent;min-height:44px}
|
|
153
|
+
.sess:hover,.sessrow:hover .sess{background:var(--card-hover)}
|
|
154
|
+
.sess[aria-current="true"]{background:var(--pill);border-left-color:var(--accent)}
|
|
155
|
+
.sessrow:has(.sess[aria-current="true"]){background:var(--pill)}
|
|
156
|
+
.sess .r1{display:flex;align-items:center;gap:7px}
|
|
157
|
+
.sess .st{width:11px;text-align:center;font-size:10px;flex:none}
|
|
158
|
+
.sess[data-state="working"] .st{color:var(--ok);animation:pulse 2.2s infinite}
|
|
159
|
+
.sess[data-state="blocked"] .st{color:var(--warn)}
|
|
160
|
+
.sess[data-state="done"] .st{color:var(--teal)}
|
|
161
|
+
.sess[data-state="idle"] .st,.sess[data-state="exited"] .st{color:var(--text-dim)}
|
|
162
|
+
@media (prefers-reduced-motion:reduce){.sess .st,.bar .conn.live::before{animation:none!important}}
|
|
163
|
+
.sess .nm{font-family:var(--mono);font-size:11px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
164
|
+
.sess .sub{font-size:10.5px;color:var(--text-muted);margin:2px 0 0 18px;display:block;
|
|
165
|
+
overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
166
|
+
.sess[data-state="blocked"] .sub{color:var(--warn-text)}
|
|
167
|
+
/* ── harness tower (workspace-harness-tower): the state chip, the agent's own last words,
|
|
168
|
+
and the per-session harness drill-in. State is carried by SHAPE (the glyph), HUE, and the
|
|
169
|
+
WORD in the chip — three channels, so nothing depends on colour alone. ── */
|
|
170
|
+
.sess[data-state="quiet"] .st{color:var(--warn-text)}
|
|
171
|
+
.sess .chip{margin-left:auto;flex:none;font-family:var(--mono);font-size:9px;letter-spacing:.06em;
|
|
172
|
+
color:var(--text-muted);white-space:nowrap}
|
|
173
|
+
.sess[data-state="working"] .chip{color:var(--ok-text)}
|
|
174
|
+
.sess[data-state="quiet"] .chip{color:var(--warn-text)}
|
|
175
|
+
.sess[data-state="exited"] .chip{color:var(--text-dim)}
|
|
176
|
+
/* the last words WRAP — bounded to two lines here, in full in the terminal. The shipped .sub
|
|
177
|
+
stays nowrap; this is a separate line, so nothing existing changes shape. */
|
|
178
|
+
.sess .says{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
|
|
179
|
+
margin:3px 0 0 18px;font-size:11px;line-height:1.45;color:var(--text-3)}
|
|
180
|
+
.sess .says.na{color:var(--text-dim);font-style:italic}
|
|
181
|
+
.sess[aria-current="true"] .says{color:var(--text-2)}
|
|
182
|
+
|
|
183
|
+
details.hz{margin:0 8px 4px 14px}
|
|
184
|
+
details.hz>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:6px;
|
|
185
|
+
min-height:44px;font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;
|
|
186
|
+
color:var(--text-dim)}
|
|
187
|
+
details.hz>summary::-webkit-details-marker{display:none}
|
|
188
|
+
details.hz>summary::before{content:"▸";font-size:9px}
|
|
189
|
+
details.hz[open]>summary::before{content:"▾"}
|
|
190
|
+
details.hz>summary:hover{color:var(--text-3)}
|
|
191
|
+
details.hz .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}
|
|
192
|
+
details.hz .kv{display:grid;grid-template-columns:64px minmax(0,1fr);gap:4px 9px;padding:0 0 10px 15px}
|
|
193
|
+
details.hz .kv dt{font-family:var(--mono);font-size:8.5px;letter-spacing:.08em;text-transform:uppercase;
|
|
194
|
+
color:var(--text-dim);padding-top:2px}
|
|
195
|
+
details.hz .kv dd{font-size:11px;line-height:1.45;color:var(--text-3);min-width:0;overflow-wrap:anywhere}
|
|
196
|
+
details.hz .kv dd b{color:var(--text-2);font-weight:500}
|
|
197
|
+
/* an unavailable fact is DRAWN as unavailable — never as a plausible constant */
|
|
198
|
+
details.hz .kv dd.na{color:var(--text-dim);font-style:italic}
|
|
199
|
+
details.hz .kv dd.na::before{content:"— ";font-style:normal}
|
|
200
|
+
details.hz .kv .src{font-family:var(--mono);font-size:8.5px;color:var(--text-dim)}
|
|
201
|
+
|
|
202
|
+
/* rename affordance — the name is a guess at creation; it must stay editable (R11) */
|
|
203
|
+
.sessrow .ren{width:30px;flex:none;display:grid;place-items:center;color:var(--text-dim);font-size:11px;opacity:0}
|
|
204
|
+
.sessrow:hover .ren,.sessrow .ren:focus-visible{opacity:1}
|
|
205
|
+
.sessrow .ren:hover{color:var(--accent-text)}
|
|
206
|
+
.renbox{width:100%;min-height:44px;padding:0 10px;border:1px solid var(--accent);border-radius:8px;
|
|
207
|
+
background:var(--chip);color:var(--text);font-family:var(--mono);font-size:11px;outline:none}
|
|
208
|
+
.sessrow .renbox{margin:0 8px}
|
|
209
|
+
|
|
210
|
+
/* ── terminal column ── */
|
|
211
|
+
.term-col{display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--term-bg)}
|
|
212
|
+
.stabs{display:flex;gap:2px;padding:6px 8px 0;background:var(--panel-head);flex:none;
|
|
213
|
+
border-bottom:1px solid var(--border-3);overflow-x:auto;min-height:44px;align-items:flex-end}
|
|
214
|
+
/* tab = wrap of two SIBLING buttons (select + close) — valid interactive structure */
|
|
215
|
+
.stab-wrap{flex:none;display:inline-flex;align-items:center;gap:0;
|
|
216
|
+
border:1px solid transparent;border-bottom:0;border-radius:9px 9px 0 0}
|
|
217
|
+
.stab-wrap[data-active="true"]{background:var(--term-bg);border-color:var(--border-3)}
|
|
218
|
+
.stab{display:inline-flex;align-items:center;gap:7px;min-height:38px;padding:0 6px 0 12px;
|
|
219
|
+
font-family:var(--mono);font-size:10.5px;color:var(--text-muted)}
|
|
220
|
+
.stab-wrap[data-active="true"] .stab{color:var(--text)}
|
|
221
|
+
.stab .g{font-size:10px}
|
|
222
|
+
.stab-wrap[data-state="blocked"] .g{color:var(--warn-text)} .stab-wrap[data-state="working"] .g{color:var(--ok-text)}
|
|
223
|
+
.stab-wrap[data-state="done"] .g{color:var(--teal-text)}
|
|
224
|
+
.stab-wrap[data-state="quiet"] .g{color:var(--warn-text)}
|
|
225
|
+
.stab-wrap[data-state="idle"] .g,.stab-wrap[data-state="exited"] .g{color:var(--text-dim)}
|
|
226
|
+
.stab-wrap .x{width:26px;min-height:38px;display:grid;place-items:center;border-radius:5px;
|
|
227
|
+
color:var(--text-dim);font-size:12px;margin-right:4px}
|
|
228
|
+
.stab-wrap .x:hover{background:var(--pill);color:var(--text-2)}
|
|
229
|
+
.stab-wrap .renbox{min-height:32px;width:150px;margin:0 6px 3px}
|
|
230
|
+
|
|
231
|
+
.termhost{flex:1;position:relative;min-height:0;overflow:hidden}
|
|
232
|
+
.termpane{position:absolute;inset:0;padding:8px 8px 6px 10px;display:none}
|
|
233
|
+
.termpane.on{display:block}
|
|
234
|
+
.termpane .xterm{height:100%}
|
|
235
|
+
/* scoped to termhost (its positioned ancestor) — sidebar/tabs/needs stay clickable */
|
|
236
|
+
.exited-overlay{position:absolute;inset:0;z-index:5;display:none;place-items:center;background:var(--glass)}
|
|
237
|
+
.exited-overlay.on{display:grid}
|
|
238
|
+
.exited-overlay .card{border:1px solid var(--border-strong);border-radius:12px;background:var(--panel);
|
|
239
|
+
padding:16px 18px;text-align:center;max-width:340px}
|
|
240
|
+
.exited-overlay .card p{font-size:12px;color:var(--text-2);margin-bottom:10px}
|
|
241
|
+
.exited-overlay .card .reason{display:block;margin-top:6px;font-family:var(--mono);font-size:10.5px;
|
|
242
|
+
color:var(--warn-text);line-height:1.45;max-width:300px}
|
|
243
|
+
.exited-overlay .card .row{display:flex;gap:8px;justify-content:center;flex-wrap:wrap}
|
|
244
|
+
.exited-overlay .card button{min-height:44px;padding:0 16px;border:1px solid var(--accent);border-radius:9px;
|
|
245
|
+
background:var(--chip);font-family:var(--mono);font-size:11px;color:var(--accent-text)}
|
|
246
|
+
.exited-overlay .card button.quiet{border-color:var(--border-strong);color:var(--text-3)}
|
|
247
|
+
.exited-overlay .card button.quiet:hover{border-color:var(--bad);color:var(--text)}
|
|
248
|
+
/* a workspace with no sessions says so — it never shows another workspace's terminal */
|
|
249
|
+
.empty-overlay{position:absolute;inset:0;z-index:4;display:none;place-items:center;padding:20px}
|
|
250
|
+
.empty-overlay.on{display:grid}
|
|
251
|
+
.empty-overlay .card{border:1px dashed var(--border-strong);border-radius:12px;background:var(--panel);
|
|
252
|
+
padding:16px 18px;text-align:center;max-width:360px}
|
|
253
|
+
.empty-overlay .card p{font-size:12px;color:var(--text-2)}
|
|
254
|
+
.empty-overlay .card .reason{margin-top:6px;font-family:var(--mono);font-size:10.5px;color:var(--text-muted);line-height:1.45}
|
|
255
|
+
|
|
256
|
+
/* needs-you strips */
|
|
257
|
+
.needs{border-top:1px solid var(--warn);background:var(--warn-wash);padding:10px 14px 12px;flex:none;
|
|
258
|
+
max-height:38vh;overflow-y:auto}
|
|
259
|
+
.needs.accept{border-top-color:var(--teal);background:var(--teal-wash)}
|
|
260
|
+
.needs .k{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--warn-text)}
|
|
261
|
+
.needs.accept .k{color:var(--teal-text)}
|
|
262
|
+
.needs .q{font-size:12.5px;color:var(--text-2);line-height:1.5;margin:4px 0 9px;max-width:90ch}
|
|
263
|
+
.needs .row{display:flex;flex-wrap:wrap;align-items:center;gap:8px;font-family:var(--mono);font-size:10.5px;color:var(--text-faint)}
|
|
264
|
+
.dlink{display:inline-flex;align-items:center;min-height:44px;padding:0 6px;color:var(--accent-text);text-decoration:underline}
|
|
265
|
+
.gbtn{display:inline-flex;align-items:center;gap:6px;min-height:44px;padding:0 16px;border:1px solid var(--border-strong);
|
|
266
|
+
border-radius:10px;background:var(--chip);font-family:var(--mono);font-size:10.5px;color:var(--text-3)}
|
|
267
|
+
.gbtn:hover{border-color:var(--warn);color:var(--text)}
|
|
268
|
+
.needs.accept .gbtn:hover{border-color:var(--teal)}
|
|
269
|
+
.gbtn.primary{border-color:var(--warn)} .needs.accept .gbtn.primary{border-color:var(--teal)}
|
|
270
|
+
.wpath{width:100%;font-family:var(--mono);font-size:9.5px;color:var(--text-faint);margin-top:2px}
|
|
271
|
+
|
|
272
|
+
/* ── right rail: the library over the document reader ── */
|
|
273
|
+
.rail{border-left:1px solid var(--border-strong);background:var(--panel);position:relative;
|
|
274
|
+
display:flex;flex-direction:column;min-height:0;min-width:0}
|
|
275
|
+
/* drag the rail's own edge — a document read at 340px is a column of ten words */
|
|
276
|
+
.railgrip{position:absolute;left:-4px;top:0;bottom:0;width:8px;z-index:5;cursor:col-resize}
|
|
277
|
+
.railgrip::after{content:"";position:absolute;inset:0 3px;border-radius:2px;background:transparent}
|
|
278
|
+
.railgrip:hover::after,.railgrip:focus-visible::after{background:var(--accent)}
|
|
279
|
+
.rail .lib-pane{flex:1 1 var(--libsplit);min-height:34px}
|
|
280
|
+
.rail .doc-pane{flex:1 1 calc(100% - var(--libsplit));min-height:34px}
|
|
281
|
+
.rail .doc-pane[hidden]{display:none}
|
|
282
|
+
.rail .pane[data-fold="off"]{flex:0 0 auto}
|
|
283
|
+
.railsplit{flex:none;height:7px;cursor:row-resize;background:var(--panel-head);
|
|
284
|
+
border-block:1px solid var(--border-3);position:relative}
|
|
285
|
+
.railsplit[hidden]{display:none}
|
|
286
|
+
.railsplit::after{content:"";position:absolute;inset:2px 42% 2px 42%;border-radius:2px;background:var(--border-strong)}
|
|
287
|
+
.railsplit:hover::after,.railsplit:focus-visible::after{background:var(--accent)}
|
|
288
|
+
|
|
289
|
+
/* library — two lenses over one file set: initiatives (how the PM thinks) / folders (how the
|
|
290
|
+
repo is laid out). The initiative lens joins a unit of work's scattered artifacts. */
|
|
291
|
+
.lens{margin-left:auto;display:inline-flex;border:1px solid var(--border);border-radius:7px;overflow:hidden;letter-spacing:0}
|
|
292
|
+
.lens button{min-height:24px;padding:0 8px;font-family:var(--mono);font-size:9px;letter-spacing:.04em;
|
|
293
|
+
color:var(--text-dim);background:var(--chip)}
|
|
294
|
+
.lens button+button{border-left:1px solid var(--border)}
|
|
295
|
+
.lens button[aria-selected="true"]{background:var(--pill);color:var(--accent-text)}
|
|
296
|
+
.libfind{margin:8px 12px 4px;min-height:34px;padding:0 10px;width:calc(100% - 24px);
|
|
297
|
+
border:1px solid var(--border);border-radius:8px;background:var(--chip);color:var(--text);
|
|
298
|
+
font-family:var(--mono);font-size:10.5px;outline:none}
|
|
299
|
+
.libfind:focus{border-color:var(--accent)}
|
|
300
|
+
.grp{font-family:var(--mono);font-size:8.5px;letter-spacing:.15em;text-transform:uppercase;
|
|
301
|
+
color:var(--text-dim);padding:8px 14px 4px}
|
|
302
|
+
details.init{margin:0}
|
|
303
|
+
details.init>summary{list-style:none;cursor:pointer;min-height:38px;display:flex;align-items:center;gap:7px;
|
|
304
|
+
padding:0 14px;font-family:var(--mono);font-size:11px;color:var(--text-2)}
|
|
305
|
+
details.init>summary::-webkit-details-marker{display:none}
|
|
306
|
+
details.init>summary::before{content:"▸";font-size:9px;color:var(--text-dim);transition:transform .12s;flex:none}
|
|
307
|
+
details.init[open]>summary::before{transform:rotate(90deg)}
|
|
308
|
+
@media (prefers-reduced-motion:reduce){details.init>summary::before{transition:none}}
|
|
309
|
+
details.init>summary:hover{background:var(--card-hover)}
|
|
310
|
+
details.init .iid{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
311
|
+
details.init .n{font-size:9px;color:var(--text-dim);border:1px solid var(--border);border-radius:5px;padding:0 4px;flex:none}
|
|
312
|
+
details.init .ititle{display:none}
|
|
313
|
+
.doc.art{display:flex;align-items:center;gap:8px;padding-left:28px}
|
|
314
|
+
.doc.art .role{flex:none;width:66px;font-size:8.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim)}
|
|
315
|
+
.doc.art .role[data-role="PRD"]{color:var(--accent-text)}
|
|
316
|
+
.doc.art .role[data-role="rubric"],.doc.art .role[data-role="eval"]{color:var(--teal-text)}
|
|
317
|
+
.doc.art .role[data-role="design brief"],.doc.art .role[data-role="design"]{color:var(--warn-text)}
|
|
318
|
+
.doc.art .dn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
319
|
+
details.tree{margin:0}
|
|
320
|
+
details.tree>summary{list-style:none;cursor:pointer;min-height:38px;display:flex;align-items:center;gap:7px;
|
|
321
|
+
padding:0 14px;font-family:var(--mono);font-size:11px;color:var(--text-3)}
|
|
322
|
+
details.tree>summary::-webkit-details-marker{display:none}
|
|
323
|
+
details.tree>summary::before{content:"▸";font-size:9px;color:var(--text-dim);transition:transform .12s;flex:none}
|
|
324
|
+
details.tree[open]>summary::before{transform:rotate(90deg)}
|
|
325
|
+
@media (prefers-reduced-motion:reduce){details.tree>summary::before{transition:none}}
|
|
326
|
+
details.tree>summary:hover{color:var(--text-2)}
|
|
327
|
+
.tree .tree>summary{padding-left:28px}
|
|
328
|
+
.tree .tree .tree>summary{padding-left:42px}
|
|
329
|
+
.doc{display:block;width:100%;text-align:left;color:var(--text-muted);font-size:11px;
|
|
330
|
+
padding:5px 14px 5px 30px;min-height:36px;line-height:1.3;border-left:3px solid transparent;font-family:var(--mono)}
|
|
331
|
+
.tree .tree .doc{padding-left:44px}
|
|
332
|
+
.tree .tree .tree .doc{padding-left:58px}
|
|
333
|
+
.doc:hover{color:var(--text-2);background:var(--card-hover)}
|
|
334
|
+
.doc.on{color:var(--accent-text);border-left-color:var(--accent);font-weight:600}
|
|
335
|
+
/* a non-markdown file: shown so the folder map is complete, but inert (the reader is .md-only) */
|
|
336
|
+
.file{display:block;width:100%;text-align:left;color:var(--text-dim);font-size:11px;
|
|
337
|
+
padding:5px 14px 5px 30px;min-height:36px;line-height:1.3;border-left:3px solid transparent;
|
|
338
|
+
font-family:var(--mono);opacity:.62;cursor:default}
|
|
339
|
+
.tree .tree .file{padding-left:44px}
|
|
340
|
+
.tree .tree .tree .file{padding-left:58px}
|
|
341
|
+
/* the library refresh (↻): hugs the lens toggle, spins briefly on click */
|
|
342
|
+
.cap .librefresh{margin-left:6px;width:26px;height:26px}
|
|
343
|
+
.librefresh.spin{animation:libspin .5s linear}
|
|
344
|
+
@keyframes libspin{from{transform:rotate(0)}to{transform:rotate(360deg)}}
|
|
345
|
+
@media (prefers-reduced-motion:reduce){.librefresh.spin{animation:none}}
|
|
346
|
+
.empty{padding:10px 16px;font-size:11px;color:var(--text-muted);line-height:1.5}
|
|
347
|
+
.empty b{color:var(--text-2)}
|
|
348
|
+
|
|
349
|
+
/* ── the document reader (bottom of the rail) ── */
|
|
350
|
+
.doc-pane .cap{padding-right:6px}
|
|
351
|
+
.doc-pane .crumb{margin-left:auto;font-family:var(--mono);font-size:9px;letter-spacing:0;
|
|
352
|
+
text-transform:none;color:var(--text-faint);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
|
|
353
|
+
direction:rtl;text-align:right;max-width:60%}
|
|
354
|
+
.doc-pane .x{flex:none;width:28px;height:28px;display:grid;place-items:center;border-radius:7px;
|
|
355
|
+
border:1px solid var(--border);background:var(--chip);color:var(--text-muted);font-size:12px;letter-spacing:0}
|
|
356
|
+
.doc-pane .x:hover{border-color:var(--bad);color:var(--text-2)}
|
|
357
|
+
.doc-body{overflow-y:auto;overscroll-behavior:contain;flex:1;min-height:0;
|
|
358
|
+
padding:18px 22px 64px;line-height:1.65;font-size:14px;color:var(--text-2)}
|
|
359
|
+
.doc-body>*{max-width:72ch}
|
|
360
|
+
.doc-body h1{font-size:21px;font-weight:600;line-height:1.3;margin:4px 0 12px;color:var(--text);text-wrap:balance}
|
|
361
|
+
.doc-body h2{font-size:16px;font-weight:600;line-height:1.35;margin:26px 0 8px;color:var(--text);
|
|
362
|
+
padding-bottom:5px;border-bottom:1px solid var(--border-3)}
|
|
363
|
+
.doc-body h3{font-size:14px;font-weight:600;margin:20px 0 6px;color:var(--text)}
|
|
364
|
+
.doc-body h4,.doc-body h5,.doc-body h6{font-size:12.5px;font-weight:600;margin:16px 0 5px;color:var(--text-3);
|
|
365
|
+
letter-spacing:.04em;text-transform:uppercase}
|
|
366
|
+
.doc-body p{margin:0 0 12px}
|
|
367
|
+
.doc-body ul,.doc-body ol{margin:0 0 12px;padding-left:22px}
|
|
368
|
+
.doc-body li{margin:0 0 5px;padding-left:2px}
|
|
369
|
+
.doc-body li>ul,.doc-body li>ol{margin:5px 0 0}
|
|
370
|
+
.doc-body li::marker{color:var(--text-dim)}
|
|
371
|
+
.doc-body ul.task{list-style:none;padding-left:6px}
|
|
372
|
+
.doc-body ul.task li{display:flex;gap:8px;align-items:baseline}
|
|
373
|
+
.doc-body ul.task .box{flex:none;font-family:var(--mono);font-size:11px;color:var(--text-dim)}
|
|
374
|
+
.doc-body ul.task .box.done{color:var(--ok-text)}
|
|
375
|
+
.doc-body code{font-family:var(--mono);font-size:12px;color:var(--accent-text);background:var(--chip);
|
|
376
|
+
padding:1.5px 5px;border-radius:5px;word-break:break-word}
|
|
377
|
+
.doc-body pre{background:var(--chip);border:1px solid var(--border-3);border-radius:9px;
|
|
378
|
+
padding:12px 14px;overflow-x:auto;margin:0 0 14px;max-width:100%}
|
|
379
|
+
.doc-body pre code{background:none;padding:0;color:var(--text-3);font-size:12px;line-height:1.6;word-break:normal}
|
|
380
|
+
.doc-body pre .lang{display:block;font-family:var(--mono);font-size:8.5px;letter-spacing:.14em;
|
|
381
|
+
text-transform:uppercase;color:var(--text-dim);margin-bottom:7px}
|
|
382
|
+
.doc-body blockquote{border-left:3px solid var(--border-strong);background:var(--card);
|
|
383
|
+
padding:9px 14px;margin:0 0 14px;border-radius:0 8px 8px 0;color:var(--text-3)}
|
|
384
|
+
.doc-body blockquote p:last-child{margin-bottom:0}
|
|
385
|
+
.doc-body hr{border:0;border-top:1px solid var(--border);margin:22px 0}
|
|
386
|
+
.doc-body a{color:var(--accent-text);text-decoration:underline;text-underline-offset:2px}
|
|
387
|
+
.doc-body a:hover{color:var(--accent)}
|
|
388
|
+
.doc-body strong{color:var(--text);font-weight:600}
|
|
389
|
+
.doc-body del{color:var(--text-dim)}
|
|
390
|
+
/* tables (rubrics ARE tables) — scroll inside their own box, never the page */
|
|
391
|
+
.doc-body .tablewrap{overflow-x:auto;margin:0 0 14px;border:1px solid var(--border-3);border-radius:9px;max-width:100%}
|
|
392
|
+
.doc-body table{border-collapse:collapse;width:100%;font-size:12.5px}
|
|
393
|
+
.doc-body th,.doc-body td{text-align:left;padding:8px 11px;border-bottom:1px solid var(--border-3);vertical-align:top}
|
|
394
|
+
.doc-body th{background:var(--panel-head);color:var(--text);font-weight:600;font-size:11.5px;
|
|
395
|
+
letter-spacing:.03em;white-space:nowrap}
|
|
396
|
+
.doc-body tbody tr:nth-child(even){background:var(--card)}
|
|
397
|
+
.doc-body tbody tr:last-child td{border-bottom:0}
|
|
398
|
+
/* the identity block every PMOS artifact opens with, as a card instead of raw YAML */
|
|
399
|
+
.doc-body .fm{border:1px solid var(--border-3);background:var(--card);border-radius:10px;
|
|
400
|
+
padding:10px 12px;margin:0 0 18px;display:grid;grid-template-columns:auto 1fr;gap:4px 12px;
|
|
401
|
+
font-size:12px;max-width:72ch}
|
|
402
|
+
.doc-body .fm dt{font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;
|
|
403
|
+
color:var(--text-dim);padding-top:2px}
|
|
404
|
+
.doc-body .fm dd{color:var(--text-2);min-width:0;overflow-wrap:anywhere}
|
|
405
|
+
.doc-empty{padding:16px;color:var(--text-muted);font-size:12px}
|
|
406
|
+
|
|
407
|
+
/* ── ⌘K jump palette + the in-app folder browser ── */
|
|
408
|
+
.palette{position:fixed;inset:0;z-index:90;background:var(--glass);backdrop-filter:blur(3px);
|
|
409
|
+
display:grid;place-items:start center;padding-top:12vh}
|
|
410
|
+
.palette-box{width:min(560px,92vw);background:var(--panel);border:1px solid var(--border-strong);
|
|
411
|
+
border-radius:14px;overflow:hidden;box-shadow:0 24px 80px -24px var(--shadow)}
|
|
412
|
+
.palette-box input{width:100%;min-height:48px;padding:0 16px;background:var(--panel-head);border:0;
|
|
413
|
+
border-bottom:1px solid var(--border-3);color:var(--text);font-family:var(--mono);font-size:13px;outline:none}
|
|
414
|
+
.palette-list{max-height:52vh;overflow-y:auto;padding:6px}
|
|
415
|
+
.pitem{display:flex;align-items:center;gap:9px;width:100%;text-align:left;min-height:40px;padding:0 12px;
|
|
416
|
+
border-radius:9px;font-family:var(--mono);font-size:11.5px;color:var(--text-3)}
|
|
417
|
+
.pitem .kind{font-size:8.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--text-dim);margin-left:auto}
|
|
418
|
+
.pitem.sel,.pitem:hover{background:var(--pill);color:var(--text)}
|
|
419
|
+
.pitem .g{font-size:10px;color:var(--text-dim)}
|
|
420
|
+
.pitem .badge{font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ok-text);
|
|
421
|
+
border:1px solid var(--border);border-radius:5px;padding:0 4px;margin-left:auto}
|
|
422
|
+
.fs-head{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--panel-head);
|
|
423
|
+
border-bottom:1px solid var(--border-3)}
|
|
424
|
+
.fs-up{width:34px;min-height:34px;display:grid;place-items:center;border:1px solid var(--border);
|
|
425
|
+
border-radius:8px;background:var(--chip);color:var(--text-3)}
|
|
426
|
+
.fs-up:hover{border-color:var(--accent);color:var(--accent-text)}
|
|
427
|
+
.fs-crumb{flex:1;min-width:0;font-family:var(--mono);font-size:11px;color:var(--text-2);
|
|
428
|
+
overflow:hidden;text-overflow:ellipsis;white-space:nowrap;direction:rtl;text-align:left}
|
|
429
|
+
.fs-use{min-height:34px;padding:0 12px;border:1px solid var(--accent);border-radius:8px;
|
|
430
|
+
background:var(--accent-wash);color:var(--accent-text);font-family:var(--mono);font-size:10.5px}
|
|
431
|
+
.fs-head .x{width:34px;min-height:34px;display:grid;place-items:center;border:1px solid var(--border);
|
|
432
|
+
border-radius:8px;background:var(--chip);color:var(--text-muted);font-size:12px}
|
|
433
|
+
|
|
434
|
+
/* ── status strip ── */
|
|
435
|
+
.strip{display:flex;align-items:center;gap:14px;padding:0 12px;border-top:1px solid var(--border-3);
|
|
436
|
+
background:var(--panel-head);font-family:var(--mono);font-size:9.5px;color:var(--text-faint);min-width:0}
|
|
437
|
+
.strip span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
438
|
+
.strip .right{margin-left:auto;color:var(--text-dim);flex:none}
|
|
439
|
+
|
|
440
|
+
/* ── on-demand surfaces (Plan · Deliver · Measure · Report), rendered in the reader ── */
|
|
441
|
+
/* phase accents — status is NEVER hue-alone: every surface pairs colour with a glyph + label */
|
|
442
|
+
.sf-wrap{--plan:var(--accent);--deliver:var(--ok);--measure:var(--teal);--report:var(--warn)}
|
|
443
|
+
.sf-head{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;flex-wrap:wrap;
|
|
444
|
+
padding:12px 22px;background:var(--panel-head);border-bottom:1px solid var(--border-3);margin:0 0 4px}
|
|
445
|
+
.sf-views{display:inline-flex;gap:6px;flex-wrap:wrap}
|
|
446
|
+
.sf-views button{font-family:var(--mono);font-size:10px;color:var(--text-3);border:1px solid var(--border);
|
|
447
|
+
border-radius:7px;padding:4px 10px;background:var(--chip)}
|
|
448
|
+
.sf-views button:hover{border-color:var(--border-strong);color:var(--text-2)}
|
|
449
|
+
.sf-views button.on{border-color:var(--accent);color:var(--accent-text);background:var(--accent-wash)}
|
|
450
|
+
.sf-chip{margin-left:auto;display:inline-flex;gap:6px;align-items:center;font-family:var(--mono);font-size:9px;
|
|
451
|
+
letter-spacing:.05em;color:var(--ok-text);border:1px solid var(--border);border-radius:99px;padding:3px 10px}
|
|
452
|
+
.sf-chip::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--ok)}
|
|
453
|
+
.sf-body{padding:14px 22px 40px;display:flex;flex-direction:column;gap:16px}
|
|
454
|
+
.sf-body .untr{color:var(--text-dim);font-style:italic;opacity:.75;font-family:var(--mono);font-size:10.5px}
|
|
455
|
+
.sf-note{font-family:var(--mono);font-size:10px;color:var(--text-dim);line-height:1.6;border-top:1px solid var(--border-3);padding-top:11px}
|
|
456
|
+
|
|
457
|
+
/* focal band: what needs you (leads) */
|
|
458
|
+
.sf-needs{border:1px solid var(--warn);border-radius:14px;overflow:hidden;
|
|
459
|
+
background:radial-gradient(120% 140% at 0 0,var(--warn-wash),transparent 60%),var(--card)}
|
|
460
|
+
.sf-needs .nh{display:flex;align-items:center;gap:9px;padding:12px 15px 9px}
|
|
461
|
+
.sf-needs .nh .dot{width:8px;height:8px;border-radius:50%;background:var(--warn);flex:none;box-shadow:0 0 0 4px var(--warn-wash)}
|
|
462
|
+
.sf-needs .nh b{font-size:13px;color:var(--text)}
|
|
463
|
+
.sf-needs .nh .sub{font-family:var(--mono);font-size:10px;color:var(--warn-text);margin-left:auto}
|
|
464
|
+
.sf-needs .need{display:flex;align-items:center;gap:11px;padding:10px 15px;border-top:1px solid var(--border-3)}
|
|
465
|
+
.sf-needs .need .ph{width:3px;align-self:stretch;border-radius:3px;background:var(--warn);flex:none}
|
|
466
|
+
.sf-needs .need .txt{flex:1;min-width:0}
|
|
467
|
+
.sf-needs .need .t{font-size:12.5px;color:var(--text);line-height:1.45}
|
|
468
|
+
.sf-needs .need .m{font-family:var(--mono);font-size:10px;color:var(--text-dim);margin-top:3px}
|
|
469
|
+
.sf-needs .need .go{flex:none;min-height:36px;padding:0 13px;border:1px solid var(--warn);border-radius:9px;
|
|
470
|
+
background:var(--chip);font-family:var(--mono);font-size:10px;color:var(--warn-text)}
|
|
471
|
+
.sf-needs .need .go:hover{background:var(--warn-wash);color:var(--text)}
|
|
472
|
+
.sf-needs.calm{border-color:var(--teal)}
|
|
473
|
+
.sf-needs.calm .nh .dot{background:var(--teal);box-shadow:0 0 0 4px var(--teal-wash)}
|
|
474
|
+
.sf-needs.calm .nh .sub{color:var(--teal-text)}
|
|
475
|
+
.sf-needs.calm .calm-body{padding:2px 15px 13px;font-size:12.5px;color:var(--text-3);line-height:1.5}
|
|
476
|
+
|
|
477
|
+
/* one restrained instrument (not a chart wall) */
|
|
478
|
+
.sf-pulse{display:flex;align-items:center;gap:13px;flex-wrap:wrap}
|
|
479
|
+
.sf-pulse .n{font-family:var(--mono);font-size:11px;color:var(--text-3)}
|
|
480
|
+
.sf-pulse .n b{color:var(--text);font-size:15px;font-weight:600}
|
|
481
|
+
.sf-dist{flex:1;min-width:150px;height:8px;border-radius:99px;overflow:hidden;display:flex;background:var(--pill)}
|
|
482
|
+
.sf-dist i{height:100%}
|
|
483
|
+
.sf-dist i[data-phase="plan"]{background:var(--plan)} .sf-dist i[data-phase="deliver"]{background:var(--deliver)}
|
|
484
|
+
.sf-dist i[data-phase="measure"]{background:var(--measure)} .sf-dist i[data-phase="report"]{background:var(--report)}
|
|
485
|
+
.sf-legend{display:flex;gap:12px;flex-wrap:wrap;font-family:var(--mono);font-size:9px;color:var(--text-dim)}
|
|
486
|
+
|
|
487
|
+
/* the list: rows with a phase spine, not a wall of identical cards */
|
|
488
|
+
.sf-grp{font-family:var(--mono);font-size:8.5px;letter-spacing:.15em;text-transform:uppercase;color:var(--text-dim);padding:4px 2px 2px}
|
|
489
|
+
.sf-list{display:flex;flex-direction:column}
|
|
490
|
+
.sf-row{border-top:1px solid var(--border-3)}
|
|
491
|
+
.sf-row:first-child{border-top:0}
|
|
492
|
+
.sf-row>summary{list-style:none;cursor:pointer;display:grid;grid-template-columns:3px auto 1fr auto auto;gap:11px;
|
|
493
|
+
align-items:center;padding:11px 4px;min-height:54px}
|
|
494
|
+
.sf-row>summary::-webkit-details-marker{display:none}
|
|
495
|
+
.sf-row>summary:hover{background:var(--card-hover)}
|
|
496
|
+
.sf-spine{width:3px;align-self:stretch;border-radius:3px;background:var(--border-strong)}
|
|
497
|
+
.sf-row[data-phase="plan"] .sf-spine,.sf-rcrow[data-phase="plan"] .sf-spine{background:var(--plan)}
|
|
498
|
+
.sf-row[data-phase="deliver"] .sf-spine,.sf-rcrow[data-phase="deliver"] .sf-spine{background:var(--deliver)}
|
|
499
|
+
.sf-row[data-phase="measure"] .sf-spine,.sf-rcrow[data-phase="measure"] .sf-spine{background:var(--measure)}
|
|
500
|
+
.sf-row[data-phase="report"] .sf-spine,.sf-rcrow[data-phase="report"] .sf-spine{background:var(--report)}
|
|
501
|
+
.sf-stat .g{font-family:var(--mono);font-size:11px;color:var(--text-3);white-space:nowrap}
|
|
502
|
+
.sf-id{font-family:var(--mono);font-size:12px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
|
|
503
|
+
.sf-id .ti{display:block;font-family:var(--sans);font-size:11px;color:var(--text-muted);margin-top:2px;
|
|
504
|
+
overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
505
|
+
.sf-metrics{display:flex;align-items:center;gap:13px;flex:none;font-family:var(--mono);font-size:10px;color:var(--text-dim)}
|
|
506
|
+
.sf-metrics .m{display:flex;flex-direction:column;gap:2px}
|
|
507
|
+
.sf-metrics .k{font-size:8px;letter-spacing:.1em;text-transform:uppercase;color:var(--text-faint)}
|
|
508
|
+
.sf-metrics b{color:var(--accent-text);font-size:13px}
|
|
509
|
+
.sf-prog{width:52px;height:5px;border-radius:99px;background:var(--pill);overflow:hidden;display:block}
|
|
510
|
+
.sf-prog i{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--teal))}
|
|
511
|
+
.sf-chev{color:var(--text-dim);font-size:10px;transition:transform .14s}
|
|
512
|
+
.sf-row[open] .sf-chev{transform:rotate(90deg)}
|
|
513
|
+
@media (prefers-reduced-motion:reduce){.sf-chev{transition:none}}
|
|
514
|
+
.sf-detail{padding:2px 12px 15px 18px;display:grid;gap:11px;background:var(--panel-head)}
|
|
515
|
+
.sf-detail h4{font-family:var(--mono);font-size:8.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--text-dim);margin-bottom:4px}
|
|
516
|
+
.sf-detail p{font-size:12.5px;color:var(--text-2);line-height:1.5}
|
|
517
|
+
.sf-arts{display:flex;flex-wrap:wrap;gap:6px}
|
|
518
|
+
.sf-art{display:inline-flex;align-items:center;gap:7px;font-family:var(--mono);font-size:10px;color:var(--text-3);
|
|
519
|
+
border:1px solid var(--border);border-radius:7px;padding:4px 9px;background:var(--chip)}
|
|
520
|
+
.sf-art:hover{border-color:var(--accent);color:var(--accent-text)}
|
|
521
|
+
.sf-art .role{font-size:8px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-dim)}
|
|
522
|
+
|
|
523
|
+
/* roadmap (list-calendar) · okr · report */
|
|
524
|
+
.sf-rc h4{font-family:var(--mono);font-size:9px;letter-spacing:.12em;text-transform:uppercase;color:var(--accent-text);
|
|
525
|
+
margin-bottom:6px;padding-bottom:5px;border-bottom:1px solid var(--border-3)}
|
|
526
|
+
.sf-rcrow{display:grid;grid-template-columns:3px 1fr auto;gap:10px;align-items:center;padding:7px 2px}
|
|
527
|
+
.sf-rcrow .nm{font-family:var(--mono);font-size:11px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
528
|
+
.sf-rcrow .st{font-family:var(--mono);font-size:10px;color:var(--text-dim)}
|
|
529
|
+
.sf-kr{border:1px solid var(--border-3);border-radius:10px;background:var(--card);padding:13px;margin-bottom:2px}
|
|
530
|
+
.sf-kr .obj{font-size:13px;color:var(--text);font-weight:600;margin-bottom:9px}
|
|
531
|
+
.sf-kr .krrow{padding:8px 0;border-top:1px solid var(--border-3)}
|
|
532
|
+
.sf-kr .krh{display:flex;gap:9px;align-items:baseline}
|
|
533
|
+
.sf-kr .krh .lab{font-family:var(--mono);font-size:10px;color:var(--teal-text);flex:none}
|
|
534
|
+
.sf-kr .krh span:last-child{font-size:12.5px;color:var(--text-2)}
|
|
535
|
+
.sf-kr .lev{margin-top:5px}
|
|
536
|
+
.sf-rep .lead{font-family:var(--mono);font-size:10px;color:var(--text-dim);margin-bottom:6px}
|
|
537
|
+
.sf-rep h3{font-size:13.5px;color:var(--text);font-weight:600;margin:16px 0 6px;padding-bottom:5px;border-bottom:1px solid var(--border-3)}
|
|
538
|
+
.sf-rep ul{margin:0;padding-left:20px}
|
|
539
|
+
.sf-rep li{margin-bottom:5px;font-size:12.5px;color:var(--text-2);line-height:1.5}
|
|
540
|
+
|
|
541
|
+
/* honest can't-produce + loading */
|
|
542
|
+
.sf-fail{border:1px dashed var(--border-strong);border-radius:14px;background:var(--card);padding:24px;text-align:center}
|
|
543
|
+
.sf-fail .mk{width:34px;height:34px;margin:0 auto 12px;display:grid;place-items:center;border-radius:10px;border:1px solid var(--border-strong);color:var(--text-muted);font-size:16px}
|
|
544
|
+
.sf-fail h3{font-size:14px;color:var(--text);margin-bottom:6px}
|
|
545
|
+
.sf-fail p{font-size:12.5px;color:var(--text-3);line-height:1.6;max-width:48ch;margin:0 auto 5px}
|
|
546
|
+
.sf-fail .miss{font-family:var(--mono);font-size:10px;color:var(--warn-text)}
|
|
547
|
+
.sf-fail code{font-family:var(--mono);color:var(--accent-text);background:var(--chip);padding:1px 6px;border-radius:5px}
|
|
548
|
+
.sf-skel{display:flex;flex-direction:column;gap:11px}
|
|
549
|
+
.sf-skel i{height:50px;border-radius:12px;background:linear-gradient(90deg,var(--card),var(--card-hover),var(--card));background-size:200% 100%;animation:sfsh 1.3s infinite}
|
|
550
|
+
@keyframes sfsh{0%{background-position:200% 0}100%{background-position:-200% 0}}
|
|
551
|
+
@media (prefers-reduced-motion:reduce){.sf-skel i{animation:none;opacity:.7}}
|
|
552
|
+
|
|
553
|
+
/* ── the scheduled lens (a persistent third library lens, in the library pane) ── */
|
|
554
|
+
.sc-load{padding:14px;color:var(--text-dim);font-size:10.5px}
|
|
555
|
+
.sc-wrap{--plan:var(--accent);padding:8px 10px 12px}
|
|
556
|
+
.sc-sum{display:flex;align-items:center;gap:9px;padding:9px 11px;border-radius:10px;background:var(--card);border:1px solid var(--border-3);margin-bottom:10px}
|
|
557
|
+
.sc-sum .dot{width:7px;height:7px;border-radius:50%;background:var(--ok);flex:none;box-shadow:0 0 0 4px var(--teal-wash)}
|
|
558
|
+
.sc-sum.warn .dot{background:var(--warn);box-shadow:0 0 0 4px var(--warn-wash)}
|
|
559
|
+
.sc-sum .t{font-size:12px;color:var(--text-2);min-width:0}.sc-sum .t b{color:var(--text)}
|
|
560
|
+
.sc-new{margin-left:auto;min-height:30px;padding:0 11px;border:1px solid var(--accent);border-radius:8px;background:var(--accent-wash);color:var(--accent-text);font-family:var(--mono);font-size:10px;flex:none}
|
|
561
|
+
.sc-list{display:flex;flex-direction:column;gap:7px}
|
|
562
|
+
.sc-row{border:1px solid var(--border-3);border-radius:11px;background:var(--card);overflow:hidden}
|
|
563
|
+
.sc-main{display:grid;grid-template-columns:3px auto 1fr auto;gap:10px;align-items:center;padding:10px 11px}
|
|
564
|
+
.sc-rail{width:3px;align-self:stretch;border-radius:3px;background:var(--border-strong)}
|
|
565
|
+
.sc-row[data-health="armed"] .sc-rail{background:var(--accent)}
|
|
566
|
+
.sc-row[data-health="running"] .sc-rail{background:var(--ok);animation:pulse 1.6s infinite}
|
|
567
|
+
.sc-row[data-health="failed"] .sc-rail{background:var(--bad)}
|
|
568
|
+
@media (prefers-reduced-motion:reduce){.sc-row[data-health="running"] .sc-rail{animation:none}}
|
|
569
|
+
.sc-tog{position:relative;width:34px;height:20px;border-radius:99px;background:var(--pill);border:1px solid var(--border-strong);flex:none;cursor:pointer;transition:background .15s}
|
|
570
|
+
.sc-tog[aria-checked="true"]{background:var(--accent-wash);border-color:var(--accent)}
|
|
571
|
+
.sc-tog .knob{position:absolute;top:2px;left:2px;width:14px;height:14px;border-radius:50%;background:var(--text-muted);transition:transform .15s,background .15s}
|
|
572
|
+
.sc-tog[aria-checked="true"] .knob{transform:translateX(14px);background:var(--accent-text)}
|
|
573
|
+
@media (prefers-reduced-motion:reduce){.sc-tog,.sc-tog .knob{transition:none}}
|
|
574
|
+
.sc-id{min-width:0}
|
|
575
|
+
.sc-id .nm{font-family:var(--mono);font-size:11.5px;color:var(--text);display:flex;align-items:center;gap:6px;overflow:hidden}
|
|
576
|
+
.sc-id .nm .g{color:var(--text-dim);font-size:9px;flex:none}
|
|
577
|
+
.sc-id .nm .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
578
|
+
.sc-id .nm .skill{font-size:7.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--purple);border:1px solid var(--border);border-radius:5px;padding:1px 5px;flex:none}
|
|
579
|
+
.sc-id .cad{font-family:var(--mono);font-size:9.5px;color:var(--text-dim);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
580
|
+
.sc-run{text-align:right;flex:none;font-family:var(--mono);font-size:10px}
|
|
581
|
+
.sc-run .next{color:var(--accent-text)}.sc-run .fail{color:var(--bad)}.sc-run .off{color:var(--text-dim)}
|
|
582
|
+
.sc-more{display:flex;gap:6px;padding:0 11px 10px 24px}
|
|
583
|
+
.sc-more button{min-height:30px;padding:0 9px;border:1px solid var(--border);border-radius:7px;background:var(--chip);font-family:var(--mono);font-size:9.5px;color:var(--text-3)}
|
|
584
|
+
.sc-more .rn{border-color:var(--accent);color:var(--accent-text)}
|
|
585
|
+
.sc-more button:hover{border-color:var(--border-strong);color:var(--text-2)}
|
|
586
|
+
.sc-more .rn:hover{background:var(--accent-wash)}
|
|
587
|
+
.sc-empty{text-align:center;padding:22px 14px}
|
|
588
|
+
.sc-empty .mk{width:30px;height:30px;margin:0 auto 10px;display:grid;place-items:center;border-radius:9px;border:1px dashed var(--border-strong);color:var(--text-muted);font-size:14px}
|
|
589
|
+
.sc-empty p{font-size:11.5px;color:var(--text-3);line-height:1.55;max-width:32ch;margin:0 auto 11px}
|
|
590
|
+
.sc-note{font-family:var(--mono);font-size:9px;color:var(--text-dim);line-height:1.6;border-top:1px solid var(--border-3);margin-top:11px;padding-top:10px}
|
|
591
|
+
.sc-note b{color:var(--purple)}
|
|
592
|
+
/* create form */
|
|
593
|
+
.sc-form{border:1px solid var(--accent);border-radius:11px;background:var(--panel-head);padding:12px;display:grid;gap:9px;margin:0 0 10px}
|
|
594
|
+
.sc-form label{font-family:var(--mono);font-size:8px;letter-spacing:.12em;text-transform:uppercase;color:var(--text-dim);display:block;margin-bottom:4px}
|
|
595
|
+
.sc-form input,.sc-form select{width:100%;min-height:34px;padding:0 9px;border:1px solid var(--border-strong);border-radius:8px;background:var(--chip);color:var(--text);font-family:var(--mono);font-size:10.5px;outline:none}
|
|
596
|
+
.sc-form input:focus,.sc-form select:focus{border-color:var(--accent)}
|
|
597
|
+
.sc-f2{display:grid;grid-template-columns:1fr 1fr;gap:8px}
|
|
598
|
+
.sc-seg{display:flex;border:1px solid var(--border);border-radius:8px;overflow:hidden}
|
|
599
|
+
.sc-seg button{flex:1;min-height:32px;background:var(--chip);color:var(--text-muted);font-family:var(--mono);font-size:8.5px}
|
|
600
|
+
.sc-seg button+button{border-left:1px solid var(--border)}
|
|
601
|
+
.sc-seg button[aria-pressed="true"]{background:var(--pill);color:var(--accent-text)}
|
|
602
|
+
.sc-hint{font-family:var(--mono);font-size:9px;color:var(--text-dim);line-height:1.5}.sc-hint b{color:var(--ok-text)}
|
|
603
|
+
.sc-frow{display:flex;gap:8px}
|
|
604
|
+
.sc-form .save{min-height:36px;padding:0 13px;border:1px solid var(--accent);border-radius:9px;background:var(--accent-wash);color:var(--accent-text);font-family:var(--mono);font-size:10px}
|
|
605
|
+
.sc-form .cancel{min-height:36px;padding:0 11px;border:1px solid var(--border);border-radius:9px;background:var(--chip);color:var(--text-muted);font-family:var(--mono);font-size:10px}
|
|
606
|
+
/* New Skill flow — the GUI that replaces editing server code (workspace-skill-authoring) */
|
|
607
|
+
.sc-acts{margin-left:auto;display:flex;gap:6px;flex:none}
|
|
608
|
+
.sc-new.ghost{border-color:var(--border-strong);background:var(--chip);color:var(--text-3)}
|
|
609
|
+
.sc-new.ghost:hover{border-color:var(--purple);color:var(--purple)}
|
|
610
|
+
.sc-form textarea{width:100%;min-height:34px;padding:7px 9px;border:1px solid var(--border-strong);border-radius:8px;background:var(--chip);color:var(--text);font-family:var(--mono);font-size:10.5px;outline:none;resize:vertical;line-height:1.5}
|
|
611
|
+
.sc-form textarea:focus{border-color:var(--accent)}
|
|
612
|
+
.sk-form{border-color:var(--purple)}
|
|
613
|
+
.sk-head{font-family:var(--mono);font-size:11px;color:var(--text);display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
|
|
614
|
+
.sk-head .sk-sub{font-size:8.5px;letter-spacing:.04em;color:var(--text-dim);text-transform:none}
|
|
615
|
+
.sc-ai{min-height:36px;padding:0 11px;border:1px solid var(--purple);border-radius:9px;background:var(--pill);color:var(--purple);font-family:var(--mono);font-size:10px}
|
|
616
|
+
.sc-ai:hover{background:var(--accent-wash)}
|
|
617
|
+
.needs.report{border-top-color:var(--teal);background:var(--teal-wash)}
|
|
618
|
+
.needs.report .k{color:var(--teal-text)}
|
|
619
|
+
/* a session that fired from a schedule carries a small badge */
|
|
620
|
+
.sess .schtag{margin-left:6px;font-size:7.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--purple);
|
|
621
|
+
border:1px solid var(--border);border-radius:4px;padding:0 4px;vertical-align:middle}
|
|
622
|
+
|
|
623
|
+
/* Narrow: the rail floats over the terminal instead of squeezing it below a usable width. */
|
|
624
|
+
@media (max-width:1100px){
|
|
625
|
+
.body{grid-template-columns:222px minmax(0,1fr)}
|
|
626
|
+
.rail{position:absolute;top:0;right:0;bottom:0;width:min(420px,86vw);z-index:30;
|
|
627
|
+
box-shadow:-18px 0 50px -30px var(--shadow)}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/* history lens — episodic recall over this workspace's own session scrollback */
|
|
631
|
+
.hi-hint{padding:14px;color:var(--text-dim);font-size:11px;line-height:1.6}
|
|
632
|
+
.hi-list{display:flex;flex-direction:column;gap:7px;padding:8px 10px 12px}
|
|
633
|
+
.hi-row{border:1px solid var(--border-3);border-radius:11px;background:var(--card);padding:9px 11px}
|
|
634
|
+
.hi-head{display:flex;align-items:baseline;gap:8px;margin-bottom:5px}
|
|
635
|
+
.hi-head b{font-size:11.5px;color:var(--text-2)}
|
|
636
|
+
.hi-meta{font-family:var(--mono);font-size:9.5px;color:var(--text-muted)}
|
|
637
|
+
.hi-ctx{font-family:var(--mono);font-size:10px;color:var(--text-muted);white-space:pre-wrap;word-break:break-word}
|
|
638
|
+
.hi-hit{font-family:var(--mono);font-size:10.5px;color:var(--text);white-space:pre-wrap;word-break:break-word;padding:2px 0}
|
|
639
|
+
|
|
640
|
+
/* ── reader: multi-format preview + local images (workspace-reader-preview) ── */
|
|
641
|
+
.doc-src{margin:0;padding:12px 14px;font-family:var(--mono);font-size:11.5px;line-height:1.6;
|
|
642
|
+
color:var(--text-2);white-space:pre-wrap;word-break:break-word;background:var(--card);
|
|
643
|
+
border:1px solid var(--border-3);border-radius:8px;overflow-x:auto}
|
|
644
|
+
.doc-body img.doc-img{max-width:100%;height:auto;border:1px solid var(--border-3);border-radius:8px;
|
|
645
|
+
background:var(--card);display:block;margin:10px 0}
|
|
646
|
+
.img-view{padding:6px 2px}
|
|
647
|
+
.img-view img.doc-img{margin:0}
|
|
648
|
+
.html-view{display:flex;flex-direction:column;gap:8px}
|
|
649
|
+
.html-bar{display:flex;gap:6px;align-items:center}
|
|
650
|
+
.html-tab{font-family:var(--mono);font-size:10px;letter-spacing:.02em;padding:3px 9px;
|
|
651
|
+
border:1px solid var(--border);background:var(--chip);color:var(--text-muted);border-radius:7px;cursor:pointer}
|
|
652
|
+
.html-tab:hover{border-color:var(--border-strong);color:var(--text-2)}
|
|
653
|
+
.html-tab.on{border-color:var(--accent);color:var(--accent-text);background:var(--pill)}
|
|
654
|
+
.html-tab .sbx{font-size:8.5px;opacity:.7;text-transform:uppercase;letter-spacing:.05em}
|
|
655
|
+
.html-pane{min-height:0}
|
|
656
|
+
.html-frame{width:100%;min-height:60vh;border:1px solid var(--border-3);border-radius:8px;
|
|
657
|
+
background:white} /* a standalone HTML doc assumes a light page; keyword, not hex (token-hygiene) */
|
|
658
|
+
/* ── mobile (≤760px): one column at a time + a bottom switcher; the terminal is the priority pane.
|
|
659
|
+
The 3-column desktop layout above is untouched at wide widths — everything here is inside the
|
|
660
|
+
≤760 query (or the .mobmenu, which is display:none until then). Touch targets ≥44px; the control
|
|
661
|
+
bar sends the keys a phone keyboard lacks straight to the PTY. ── */
|
|
662
|
+
.mobmenu{display:none}
|
|
663
|
+
@media (max-width:760px){
|
|
664
|
+
/* an extra row above the status strip carries the control bar + switcher */
|
|
665
|
+
.app{grid-template-rows:44px minmax(0,1fr) auto 28px}
|
|
666
|
+
/* collapse to a single column; the switcher decides which pane is shown */
|
|
667
|
+
.body{grid-template-columns:1fr;position:relative}
|
|
668
|
+
.body>.side,.body>.term-col,.body>.rail{display:none}
|
|
669
|
+
.body[data-mview="sessions"]>.side{display:grid}
|
|
670
|
+
.body[data-mview="terminal"]>.term-col{display:flex}
|
|
671
|
+
.body[data-mview="library"]>.rail,
|
|
672
|
+
.body.rail-off[data-mview="library"]>.rail{display:flex}
|
|
673
|
+
/* the rail is a full-width pane here, not the floating overlay the ≤1100 rule makes it */
|
|
674
|
+
.rail{position:static;width:auto;box-shadow:none;z-index:auto;border-left:0}
|
|
675
|
+
.railgrip,.railsplit{display:none} /* edge-drag is a pointer affordance; the switcher owns layout on touch */
|
|
676
|
+
.side{grid-template-rows:1fr 1fr}
|
|
677
|
+
|
|
678
|
+
/* the mobile menu: a terminal control bar (terminal view only) over the pane switcher */
|
|
679
|
+
/* min-width:0 lets this grid item shrink below its content min-size, so the control bar's
|
|
680
|
+
fixed-width buttons scroll inside it instead of widening the whole page */
|
|
681
|
+
.mobmenu{display:block;min-width:0;background:var(--panel-head);border-top:1px solid var(--border);
|
|
682
|
+
padding-bottom:env(safe-area-inset-bottom)}
|
|
683
|
+
.ctrlbar{display:none;min-width:0;gap:5px;padding:6px 8px;overflow-x:auto;-webkit-overflow-scrolling:touch;
|
|
684
|
+
border-bottom:1px solid var(--border-3)}
|
|
685
|
+
.mobmenu[data-view="terminal"] .ctrlbar{display:flex}
|
|
686
|
+
.ctrlbar button{flex:1 0 auto;min-width:44px;min-height:44px;display:grid;place-items:center;
|
|
687
|
+
border:1px solid var(--border);border-radius:9px;background:var(--chip);color:var(--text-2);
|
|
688
|
+
font-family:var(--mono);font-size:14px}
|
|
689
|
+
.ctrlbar button:active{background:var(--pill)}
|
|
690
|
+
.ctrlbar button[aria-pressed="true"]{border-color:var(--accent);color:var(--accent-text);background:var(--accent-wash)}
|
|
691
|
+
.ctrlbar .lbl{font-size:11px;letter-spacing:.04em}
|
|
692
|
+
.mobtabs{display:flex}
|
|
693
|
+
.mobtabs button{flex:1;min-height:52px;display:flex;flex-direction:column;align-items:center;justify-content:center;
|
|
694
|
+
gap:2px;font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;color:var(--text-muted);
|
|
695
|
+
border-top:2px solid transparent;background:var(--panel-head)}
|
|
696
|
+
.mobtabs button+button{border-left:1px solid var(--border-3)}
|
|
697
|
+
.mobtabs button[aria-selected="true"]{color:var(--accent-text);border-top-color:var(--accent);background:var(--pill)}
|
|
698
|
+
@media (prefers-reduced-motion:reduce){.mobtabs button,.ctrlbar button{transition:none}}
|
|
699
|
+
|
|
700
|
+
/* the header must fit a phone: drop the desktop "workspace" tag and let the status text ellipsize */
|
|
701
|
+
.bar{gap:7px;padding:0 10px}
|
|
702
|
+
.bar .sub{display:none}
|
|
703
|
+
.bar .conn{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/* ── console surfaces (D64 Track B): needs-you · radar · metrics over file-mode state ────────── */
|
|
707
|
+
/* Honesty by construction: error is unmistakably RED (--bad), empty is CALM (--teal), the loading
|
|
708
|
+
skeleton (.sf-skel, reused) is neither. A broken read can only ever draw .cs-error. */
|
|
709
|
+
.cs-error{border:1px solid var(--bad);border-radius:14px;padding:16px 18px;
|
|
710
|
+
background:radial-gradient(120% 140% at 0 0,rgba(242,101,95,.14),transparent 60%),var(--card)}
|
|
711
|
+
.cs-err-head{display:flex;align-items:center;gap:9px}
|
|
712
|
+
.cs-err-head .mk{width:22px;height:22px;display:grid;place-items:center;border-radius:7px;
|
|
713
|
+
background:var(--bad);color:white;font-size:12px;flex:none}
|
|
714
|
+
.cs-err-head b{font-size:13px;color:var(--bad)}
|
|
715
|
+
.cs-err-why{margin-top:8px;font-size:12.5px;color:var(--text-2);line-height:1.5}
|
|
716
|
+
.cs-err-note{margin-top:7px;font-family:var(--mono);font-size:10px;color:var(--bad);opacity:.9;line-height:1.5}
|
|
717
|
+
.cs-empty{border:1px solid var(--teal);border-radius:14px;padding:16px 18px;
|
|
718
|
+
background:radial-gradient(120% 140% at 0 0,var(--teal-wash),transparent 60%),var(--card)}
|
|
719
|
+
.cs-empty>.dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--teal);
|
|
720
|
+
box-shadow:0 0 0 4px var(--teal-wash);margin-right:8px;vertical-align:middle}
|
|
721
|
+
.cs-empty b{font-size:13px;color:var(--text)}
|
|
722
|
+
.cs-empty p{margin-top:6px;font-size:12.5px;color:var(--text-3);line-height:1.5}
|
|
723
|
+
.cs-empty-note{font-family:var(--mono);font-size:10px;color:var(--teal-text);opacity:.85}
|
|
724
|
+
.cs-src{font-family:var(--mono);font-size:9.5px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}
|
|
725
|
+
.sf-chip.src::before{background:var(--teal)}
|
|
726
|
+
/* needs-you */
|
|
727
|
+
.cs-needs{border:1px solid var(--warn);border-radius:14px;overflow:hidden;
|
|
728
|
+
background:radial-gradient(120% 140% at 0 0,var(--warn-wash),transparent 60%),var(--card)}
|
|
729
|
+
.cs-needs .cs-h,.cs-wm .cs-h,.cs-per .cs-h{display:flex;align-items:center;gap:9px;padding:12px 15px 9px}
|
|
730
|
+
.cs-needs .cs-h .dot{width:8px;height:8px;border-radius:50%;background:var(--warn);flex:none;box-shadow:0 0 0 4px var(--warn-wash)}
|
|
731
|
+
.cs-h b{font-size:13px;color:var(--text)}
|
|
732
|
+
.cs-h .src{font-family:var(--mono);font-size:9.5px;color:var(--text-dim);margin-left:auto}
|
|
733
|
+
.cs-need{display:flex;align-items:center;gap:11px;padding:10px 15px;border-top:1px solid var(--border-3)}
|
|
734
|
+
.cs-need .ph{width:3px;align-self:stretch;border-radius:3px;background:var(--warn);flex:none}
|
|
735
|
+
.cs-need[data-kind="accept"] .ph{background:var(--accent)}
|
|
736
|
+
.cs-need .txt{flex:1;min-width:0}
|
|
737
|
+
.cs-need .t{font-size:12.5px;color:var(--text);line-height:1.45}
|
|
738
|
+
.cs-need .m{font-family:var(--mono);font-size:10px;color:var(--text-dim);margin-top:3px}
|
|
739
|
+
/* radar + metrics cards */
|
|
740
|
+
.cs-cards{display:flex;gap:12px;flex-wrap:wrap;margin:10px 0 4px}
|
|
741
|
+
.cs-card{flex:1;min-width:150px;border:1px solid var(--border);border-radius:12px;background:var(--card);padding:13px 15px}
|
|
742
|
+
.cs-card.warnedge{border-color:var(--warn)}
|
|
743
|
+
.cs-card h4{font-size:10px;text-transform:uppercase;letter-spacing:.06em;color:var(--text-muted);margin-bottom:7px}
|
|
744
|
+
.cs-big{font-size:26px;font-weight:600;color:var(--text);line-height:1;display:flex;align-items:baseline;gap:6px}
|
|
745
|
+
.cs-big .u{font-size:11px;font-weight:400;color:var(--text-dim);font-family:var(--mono)}
|
|
746
|
+
.cs-sub{margin-top:7px;font-size:11px;color:var(--text-3);line-height:1.5}
|
|
747
|
+
.cs-caveat{margin-top:8px;font-size:10.5px;color:var(--warn-text);line-height:1.5;border-top:1px solid var(--border-3);padding-top:7px}
|
|
748
|
+
.cs-wm{margin-top:12px;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:var(--card)}
|
|
749
|
+
.cs-wm .cs-h .dot{width:8px;height:8px;border-radius:50%;flex:none}
|
|
750
|
+
.cs-wm .cs-h .dot.ok{background:var(--ok);box-shadow:0 0 0 4px var(--teal-wash)}
|
|
751
|
+
.cs-wm .cs-h .dot.warn{background:var(--warn);box-shadow:0 0 0 4px var(--warn-wash)}
|
|
752
|
+
.cs-wmrow{display:flex;align-items:center;gap:10px;padding:8px 15px;border-top:1px solid var(--border-3)}
|
|
753
|
+
.cs-wmrow .rag{width:9px;height:9px;border-radius:50%;flex:none;background:var(--text-dim)}
|
|
754
|
+
.cs-wmrow .rag.rag-green{background:var(--ok)}
|
|
755
|
+
.cs-wmrow .rag.rag-amber{background:var(--warn)}
|
|
756
|
+
.cs-wmrow .rag.rag-red{background:var(--bad)}
|
|
757
|
+
.cs-wmrow .nm{flex:1;min-width:0;font-size:12px;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
758
|
+
.cs-wmrow .nm .ti{color:var(--text-dim);margin-left:7px;font-size:11px}
|
|
759
|
+
.cs-wmrow .st{font-family:var(--mono);font-size:10px;color:var(--text-dim);flex:none}
|
|
760
|
+
.cs-none,.cs-per .cs-none{padding:10px 15px;font-size:11px;color:var(--text-dim)}
|
|
761
|
+
.cs-per{margin-top:12px;border:1px solid var(--border);border-radius:12px;overflow:hidden;background:var(--card)}
|
|
762
|
+
.cs-perrow{display:flex;align-items:center;gap:10px;padding:6px 15px;border-top:1px solid var(--border-3)}
|
|
763
|
+
.cs-perrow .nm{width:40%;min-width:0;font-size:11.5px;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
|
|
764
|
+
.cs-perrow .bar{flex:1;height:6px;border-radius:4px;background:var(--chip);overflow:hidden}
|
|
765
|
+
.cs-perrow .bar i{display:block;height:100%;background:var(--accent);border-radius:4px}
|
|
766
|
+
.cs-perrow .v{font-family:var(--mono);font-size:10px;color:var(--text-dim);flex:none;width:28px;text-align:right}
|