@claudecollab/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +109 -0
- package/package.json +36 -0
- package/packages/cli/bin/claude-share.js +1319 -0
- package/packages/cli/package.json +15 -0
- package/packages/cli/src/brain/card.js +157 -0
- package/packages/cli/src/brain/commands.js +122 -0
- package/packages/cli/src/brain/drafts.js +557 -0
- package/packages/cli/src/brain/gate.js +134 -0
- package/packages/cli/src/brain/knocks.js +27 -0
- package/packages/cli/src/brain/log.js +123 -0
- package/packages/cli/src/brain/queue.js +81 -0
- package/packages/cli/src/brain/state.js +245 -0
- package/packages/cli/src/hooks.js +243 -0
- package/packages/cli/src/invite.js +43 -0
- package/packages/cli/src/known-relays.js +66 -0
- package/packages/cli/src/pty.js +175 -0
- package/packages/cli/src/relay-client.js +271 -0
- package/packages/cli/src/renderer.js +230 -0
- package/packages/cli/src/screen-snapshot.js +139 -0
- package/packages/cli/src/term-chatter.js +89 -0
- package/packages/relay/auth.js +18 -0
- package/packages/relay/bin/serve.js +73 -0
- package/packages/relay/names.js +27 -0
- package/packages/relay/package.json +13 -0
- package/packages/relay/public/client.js +1553 -0
- package/packages/relay/public/index.html +110 -0
- package/packages/relay/public/style.css +952 -0
- package/packages/relay/rooms.js +149 -0
- package/packages/relay/server.js +652 -0
- package/packages/relay/web.js +334 -0
- package/packages/relay/wordlists.js +38 -0
- package/packages/shared/package.json +8 -0
- package/packages/shared/protocol.js +189 -0
|
@@ -0,0 +1,952 @@
|
|
|
1
|
+
/* claude-share browser client — Mesh Glass Noir.
|
|
2
|
+
One slim header strip owns all administration (no sidebar); the terminal keeps
|
|
3
|
+
its full width like the real Claude CLI. Palette discipline: controls are quiet
|
|
4
|
+
monochrome glass chips (1px rings, no fills). Color only where it carries
|
|
5
|
+
meaning — per-user identity dots, amber = needs attention, red ring = destructive.
|
|
6
|
+
Per-user colors come from the brain and are applied inline via --c. */
|
|
7
|
+
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #06070b;
|
|
10
|
+
--glass: rgba(10, 12, 18, 0.55);
|
|
11
|
+
--glass-2: rgba(13, 15, 23, 0.55);
|
|
12
|
+
--inset: rgba(0, 0, 0, 0.4);
|
|
13
|
+
--ring: rgba(255, 255, 255, 0.11);
|
|
14
|
+
--ring-soft: rgba(255, 255, 255, 0.07);
|
|
15
|
+
--text: #e8ecf4;
|
|
16
|
+
--text-dim: #aab0c4;
|
|
17
|
+
--text-faint: #7d829a;
|
|
18
|
+
--amber: #e8a33d;
|
|
19
|
+
--amber-hi: #ffd9a0;
|
|
20
|
+
--blue: #7fb2e0;
|
|
21
|
+
--green: #7fe0b2;
|
|
22
|
+
--red: #f0a8a8;
|
|
23
|
+
--red-ring: rgba(240, 140, 140, 0.28);
|
|
24
|
+
--mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace;
|
|
25
|
+
--sans: system-ui, -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
26
|
+
--spring: cubic-bezier(0.2, 0.9, 0.25, 1.1);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
* {
|
|
30
|
+
box-sizing: border-box;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* The hidden attribute must always win, even over an element we give an explicit
|
|
34
|
+
display (flex/grid) below — otherwise a `hidden` panel would still render. */
|
|
35
|
+
[hidden] {
|
|
36
|
+
display: none !important;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
html,
|
|
40
|
+
body {
|
|
41
|
+
height: 100%;
|
|
42
|
+
margin: 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
body {
|
|
46
|
+
/* the mesh: three soft radial washes over near-black */
|
|
47
|
+
background:
|
|
48
|
+
radial-gradient(700px 420px at 80% -20%, rgba(64, 110, 255, 0.26), transparent 55%),
|
|
49
|
+
radial-gradient(600px 500px at -10% 40%, rgba(150, 70, 255, 0.16), transparent 55%),
|
|
50
|
+
radial-gradient(700px 500px at 60% 130%, rgba(232, 163, 61, 0.13), transparent 55%),
|
|
51
|
+
var(--bg);
|
|
52
|
+
background-attachment: fixed;
|
|
53
|
+
color: var(--text);
|
|
54
|
+
font-family: var(--sans);
|
|
55
|
+
font-size: 14px;
|
|
56
|
+
line-height: 1.5;
|
|
57
|
+
-webkit-font-smoothing: antialiased;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.screen {
|
|
61
|
+
min-height: 100vh;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.brand-text {
|
|
65
|
+
font-family: var(--mono);
|
|
66
|
+
font-weight: 700;
|
|
67
|
+
background: linear-gradient(90deg, #e8a33d, #7fb2e0);
|
|
68
|
+
-webkit-background-clip: text;
|
|
69
|
+
background-clip: text;
|
|
70
|
+
color: transparent;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* ── glass chips: THE control. quiet, monochrome, 1px ring ─────────────────── */
|
|
74
|
+
.ctrl {
|
|
75
|
+
display: inline-flex;
|
|
76
|
+
align-items: center;
|
|
77
|
+
gap: 6px;
|
|
78
|
+
font: inherit;
|
|
79
|
+
font-family: var(--mono);
|
|
80
|
+
font-size: 11.5px;
|
|
81
|
+
font-weight: 600;
|
|
82
|
+
color: #c9cede;
|
|
83
|
+
background: rgba(255, 255, 255, 0.045);
|
|
84
|
+
border: none;
|
|
85
|
+
border-radius: 999px;
|
|
86
|
+
padding: 4px 12px;
|
|
87
|
+
box-shadow: 0 0 0 1px var(--ring);
|
|
88
|
+
cursor: pointer;
|
|
89
|
+
transition: background 0.18s ease, box-shadow 0.18s ease, transform 0.15s var(--spring);
|
|
90
|
+
}
|
|
91
|
+
.ctrl:hover {
|
|
92
|
+
background: rgba(255, 255, 255, 0.09);
|
|
93
|
+
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.2);
|
|
94
|
+
}
|
|
95
|
+
.ctrl:active {
|
|
96
|
+
transform: scale(0.96);
|
|
97
|
+
}
|
|
98
|
+
.ctrl:disabled {
|
|
99
|
+
opacity: 0.4;
|
|
100
|
+
cursor: not-allowed;
|
|
101
|
+
}
|
|
102
|
+
.ctrl .ico {
|
|
103
|
+
opacity: 0.75;
|
|
104
|
+
font-size: 12px;
|
|
105
|
+
}
|
|
106
|
+
.ctrl.end {
|
|
107
|
+
color: var(--red);
|
|
108
|
+
box-shadow: 0 0 0 1px var(--red-ring);
|
|
109
|
+
}
|
|
110
|
+
.ctrl.end:hover {
|
|
111
|
+
background: rgba(240, 140, 140, 0.08);
|
|
112
|
+
box-shadow: 0 0 0 1px rgba(240, 140, 140, 0.5);
|
|
113
|
+
}
|
|
114
|
+
.ctrl.tiny {
|
|
115
|
+
font-size: 11px;
|
|
116
|
+
padding: 3px 11px;
|
|
117
|
+
}
|
|
118
|
+
.ctrl.active {
|
|
119
|
+
color: var(--amber-hi);
|
|
120
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.45);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/* generic buttons (join screen, banners) share the chip language */
|
|
124
|
+
.btn {
|
|
125
|
+
font: inherit;
|
|
126
|
+
font-weight: 600;
|
|
127
|
+
color: #c9cede;
|
|
128
|
+
background: rgba(255, 255, 255, 0.045);
|
|
129
|
+
border: none;
|
|
130
|
+
border-radius: 10px;
|
|
131
|
+
padding: 0.55rem 0.9rem;
|
|
132
|
+
box-shadow: 0 0 0 1px var(--ring);
|
|
133
|
+
cursor: pointer;
|
|
134
|
+
transition: background 0.18s ease, box-shadow 0.18s ease, transform 0.15s var(--spring);
|
|
135
|
+
}
|
|
136
|
+
.btn:hover {
|
|
137
|
+
background: rgba(255, 255, 255, 0.09);
|
|
138
|
+
}
|
|
139
|
+
.btn:active {
|
|
140
|
+
transform: scale(0.97);
|
|
141
|
+
}
|
|
142
|
+
.btn:disabled {
|
|
143
|
+
opacity: 0.45;
|
|
144
|
+
cursor: not-allowed;
|
|
145
|
+
}
|
|
146
|
+
.btn.primary {
|
|
147
|
+
color: var(--amber-hi);
|
|
148
|
+
background: rgba(232, 163, 61, 0.16);
|
|
149
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.55);
|
|
150
|
+
}
|
|
151
|
+
.btn.primary:hover {
|
|
152
|
+
background: rgba(232, 163, 61, 0.26);
|
|
153
|
+
}
|
|
154
|
+
.btn.block {
|
|
155
|
+
display: block;
|
|
156
|
+
width: 100%;
|
|
157
|
+
}
|
|
158
|
+
.btn.tiny {
|
|
159
|
+
padding: 0.28rem 0.55rem;
|
|
160
|
+
font-size: 0.8rem;
|
|
161
|
+
border-radius: 8px;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/* ── join screen ─────────────────────────────────────────────────────────── */
|
|
165
|
+
#join {
|
|
166
|
+
display: grid;
|
|
167
|
+
place-items: center;
|
|
168
|
+
padding: 2rem;
|
|
169
|
+
}
|
|
170
|
+
.join-card {
|
|
171
|
+
width: min(420px, 100%);
|
|
172
|
+
background: var(--glass-2);
|
|
173
|
+
backdrop-filter: blur(16px);
|
|
174
|
+
-webkit-backdrop-filter: blur(16px);
|
|
175
|
+
border-radius: 14px;
|
|
176
|
+
padding: 2rem 1.75rem;
|
|
177
|
+
box-shadow: 0 0 0 1px var(--ring-soft), 0 24px 60px rgba(0, 0, 0, 0.55),
|
|
178
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.05);
|
|
179
|
+
}
|
|
180
|
+
.join-card .brand {
|
|
181
|
+
font-size: 1.25rem;
|
|
182
|
+
}
|
|
183
|
+
.tagline {
|
|
184
|
+
color: var(--text-dim);
|
|
185
|
+
margin: 0.35rem 0 1.75rem;
|
|
186
|
+
}
|
|
187
|
+
.field {
|
|
188
|
+
display: block;
|
|
189
|
+
margin-bottom: 1rem;
|
|
190
|
+
}
|
|
191
|
+
.field-label {
|
|
192
|
+
display: block;
|
|
193
|
+
font-size: 0.78rem;
|
|
194
|
+
text-transform: uppercase;
|
|
195
|
+
letter-spacing: 0.06em;
|
|
196
|
+
color: var(--text-faint);
|
|
197
|
+
margin-bottom: 0.4rem;
|
|
198
|
+
}
|
|
199
|
+
.room-code {
|
|
200
|
+
font-family: var(--mono);
|
|
201
|
+
font-size: 1.1rem;
|
|
202
|
+
color: var(--amber-hi);
|
|
203
|
+
background: var(--inset);
|
|
204
|
+
border-radius: 10px;
|
|
205
|
+
padding: 0.6rem 0.8rem;
|
|
206
|
+
box-shadow: inset 0 0 0 1px rgba(232, 163, 61, 0.3);
|
|
207
|
+
}
|
|
208
|
+
.text-input {
|
|
209
|
+
width: 100%;
|
|
210
|
+
font: inherit;
|
|
211
|
+
color: var(--text);
|
|
212
|
+
background: var(--inset);
|
|
213
|
+
border: none;
|
|
214
|
+
border-radius: 10px;
|
|
215
|
+
padding: 0.6rem 0.8rem;
|
|
216
|
+
box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
|
|
217
|
+
}
|
|
218
|
+
.text-input:focus {
|
|
219
|
+
outline: none;
|
|
220
|
+
box-shadow: inset 0 0 0 1px rgba(232, 163, 61, 0.55), 0 0 16px rgba(232, 163, 61, 0.12);
|
|
221
|
+
}
|
|
222
|
+
#knock-btn {
|
|
223
|
+
margin-top: 0.5rem;
|
|
224
|
+
}
|
|
225
|
+
.join-status {
|
|
226
|
+
min-height: 1.2rem;
|
|
227
|
+
margin: 0.75rem 0 0;
|
|
228
|
+
font-size: 0.85rem;
|
|
229
|
+
color: var(--text-dim);
|
|
230
|
+
}
|
|
231
|
+
.join-status.error {
|
|
232
|
+
color: #ff9a9d;
|
|
233
|
+
}
|
|
234
|
+
.waiting {
|
|
235
|
+
text-align: center;
|
|
236
|
+
padding: 1rem 0 0.25rem;
|
|
237
|
+
color: var(--text-dim);
|
|
238
|
+
}
|
|
239
|
+
.spinner {
|
|
240
|
+
width: 34px;
|
|
241
|
+
height: 34px;
|
|
242
|
+
margin: 0.5rem auto 1rem;
|
|
243
|
+
border-radius: 50%;
|
|
244
|
+
border: 3px solid rgba(255, 255, 255, 0.12);
|
|
245
|
+
border-top-color: var(--amber);
|
|
246
|
+
animation: spin 0.8s linear infinite;
|
|
247
|
+
}
|
|
248
|
+
@keyframes spin {
|
|
249
|
+
to {
|
|
250
|
+
transform: rotate(360deg);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/* ── live layout ─────────────────────────────────────────────────────────── */
|
|
255
|
+
.live {
|
|
256
|
+
display: flex;
|
|
257
|
+
flex-direction: column;
|
|
258
|
+
height: 100vh;
|
|
259
|
+
min-height: 0;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/* ── the header strip: everything administrative lives here ────────────────── */
|
|
263
|
+
.topbar {
|
|
264
|
+
display: flex;
|
|
265
|
+
align-items: center;
|
|
266
|
+
gap: 10px;
|
|
267
|
+
padding: 8px 16px;
|
|
268
|
+
font-family: var(--mono);
|
|
269
|
+
font-size: 12px;
|
|
270
|
+
color: var(--text-dim);
|
|
271
|
+
background: var(--glass);
|
|
272
|
+
backdrop-filter: blur(18px);
|
|
273
|
+
-webkit-backdrop-filter: blur(18px);
|
|
274
|
+
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.06);
|
|
275
|
+
position: relative;
|
|
276
|
+
z-index: 20;
|
|
277
|
+
flex: 0 0 auto;
|
|
278
|
+
}
|
|
279
|
+
.topbar .brand-text {
|
|
280
|
+
font-size: 13px;
|
|
281
|
+
}
|
|
282
|
+
.sep {
|
|
283
|
+
width: 1px;
|
|
284
|
+
height: 16px;
|
|
285
|
+
background: rgba(255, 255, 255, 0.1);
|
|
286
|
+
}
|
|
287
|
+
.room b {
|
|
288
|
+
color: var(--text);
|
|
289
|
+
font-weight: 600;
|
|
290
|
+
}
|
|
291
|
+
.top-spacer {
|
|
292
|
+
flex: 1;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/* the roster: an avatar cluster — colored identity dots with initials */
|
|
296
|
+
.avatars {
|
|
297
|
+
display: flex;
|
|
298
|
+
align-items: center;
|
|
299
|
+
margin-left: 2px;
|
|
300
|
+
}
|
|
301
|
+
.av {
|
|
302
|
+
width: 20px;
|
|
303
|
+
height: 20px;
|
|
304
|
+
border-radius: 50%;
|
|
305
|
+
display: grid;
|
|
306
|
+
place-items: center;
|
|
307
|
+
font-size: 9.5px;
|
|
308
|
+
font-weight: 800;
|
|
309
|
+
color: #0a0d16;
|
|
310
|
+
margin-left: -5px;
|
|
311
|
+
border: none;
|
|
312
|
+
padding: 0;
|
|
313
|
+
font-family: var(--mono);
|
|
314
|
+
background: var(--c, #9aa4b2);
|
|
315
|
+
box-shadow: 0 0 0 2px #0b0d13, 0 0 10px -2px var(--c, transparent);
|
|
316
|
+
cursor: pointer;
|
|
317
|
+
transition: transform 0.15s var(--spring);
|
|
318
|
+
}
|
|
319
|
+
.av:hover {
|
|
320
|
+
transform: translateY(-1px) scale(1.12);
|
|
321
|
+
z-index: 2;
|
|
322
|
+
}
|
|
323
|
+
.av:active {
|
|
324
|
+
transform: scale(0.95);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/* a live knock: the ONE loud thing on screen — amber ring, inline admit/deny */
|
|
328
|
+
.knocks {
|
|
329
|
+
display: flex;
|
|
330
|
+
align-items: center;
|
|
331
|
+
gap: 8px;
|
|
332
|
+
}
|
|
333
|
+
.knock-chip {
|
|
334
|
+
display: inline-flex;
|
|
335
|
+
align-items: center;
|
|
336
|
+
gap: 8px;
|
|
337
|
+
padding: 4px 6px 4px 12px;
|
|
338
|
+
border-radius: 999px;
|
|
339
|
+
font-size: 11.5px;
|
|
340
|
+
font-weight: 600;
|
|
341
|
+
color: var(--amber-hi);
|
|
342
|
+
background: rgba(232, 163, 61, 0.08);
|
|
343
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.45), 0 0 16px rgba(232, 163, 61, 0.18);
|
|
344
|
+
animation: knock-in 0.35s var(--spring);
|
|
345
|
+
white-space: nowrap;
|
|
346
|
+
}
|
|
347
|
+
@keyframes knock-in {
|
|
348
|
+
from {
|
|
349
|
+
opacity: 0;
|
|
350
|
+
transform: translateY(-6px) scale(0.95);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
.knock-chip .kname {
|
|
354
|
+
font-weight: 700;
|
|
355
|
+
}
|
|
356
|
+
.knock-chip .kmeta {
|
|
357
|
+
font-weight: 400;
|
|
358
|
+
color: rgba(255, 217, 160, 0.6);
|
|
359
|
+
font-size: 10.5px;
|
|
360
|
+
}
|
|
361
|
+
.kbtn {
|
|
362
|
+
font: inherit;
|
|
363
|
+
font-family: var(--mono);
|
|
364
|
+
padding: 3px 10px;
|
|
365
|
+
border: none;
|
|
366
|
+
border-radius: 999px;
|
|
367
|
+
font-size: 11px;
|
|
368
|
+
font-weight: 700;
|
|
369
|
+
cursor: pointer;
|
|
370
|
+
transition: background 0.18s ease, transform 0.15s var(--spring);
|
|
371
|
+
}
|
|
372
|
+
.kbtn:active {
|
|
373
|
+
transform: scale(0.94);
|
|
374
|
+
}
|
|
375
|
+
.kbtn.yes {
|
|
376
|
+
background: rgba(232, 163, 61, 0.16);
|
|
377
|
+
color: var(--amber-hi);
|
|
378
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.55);
|
|
379
|
+
}
|
|
380
|
+
.kbtn.yes:hover {
|
|
381
|
+
background: rgba(232, 163, 61, 0.28);
|
|
382
|
+
}
|
|
383
|
+
.kbtn.no {
|
|
384
|
+
background: rgba(255, 255, 255, 0.05);
|
|
385
|
+
color: var(--text-dim);
|
|
386
|
+
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.12);
|
|
387
|
+
}
|
|
388
|
+
.kbtn.no:hover {
|
|
389
|
+
background: rgba(255, 255, 255, 0.1);
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
.host-controls {
|
|
393
|
+
display: flex;
|
|
394
|
+
align-items: center;
|
|
395
|
+
gap: 8px;
|
|
396
|
+
}
|
|
397
|
+
.end-confirm {
|
|
398
|
+
display: inline-flex;
|
|
399
|
+
align-items: center;
|
|
400
|
+
gap: 8px;
|
|
401
|
+
font-size: 11.5px;
|
|
402
|
+
color: var(--red);
|
|
403
|
+
white-space: nowrap;
|
|
404
|
+
animation: knock-in 0.25s var(--spring);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
/* avatar click → popover (role/kick for the host, identity for everyone) */
|
|
408
|
+
.popover {
|
|
409
|
+
position: fixed;
|
|
410
|
+
z-index: 40;
|
|
411
|
+
min-width: 180px;
|
|
412
|
+
padding: 10px 12px;
|
|
413
|
+
border-radius: 12px;
|
|
414
|
+
font-family: var(--mono);
|
|
415
|
+
font-size: 12px;
|
|
416
|
+
background: rgba(16, 18, 27, 0.92);
|
|
417
|
+
backdrop-filter: blur(20px);
|
|
418
|
+
-webkit-backdrop-filter: blur(20px);
|
|
419
|
+
box-shadow: 0 0 0 1px var(--ring), 0 18px 44px rgba(0, 0, 0, 0.6);
|
|
420
|
+
animation: knock-in 0.2s var(--spring);
|
|
421
|
+
}
|
|
422
|
+
.pop-name {
|
|
423
|
+
font-weight: 700;
|
|
424
|
+
color: var(--c, var(--text));
|
|
425
|
+
}
|
|
426
|
+
.pop-role {
|
|
427
|
+
color: var(--text-faint);
|
|
428
|
+
margin-left: 6px;
|
|
429
|
+
}
|
|
430
|
+
.pop-row {
|
|
431
|
+
display: flex;
|
|
432
|
+
gap: 6px;
|
|
433
|
+
margin-top: 9px;
|
|
434
|
+
}
|
|
435
|
+
.pop-kick {
|
|
436
|
+
margin-top: 9px;
|
|
437
|
+
width: 100%;
|
|
438
|
+
justify-content: center;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/* addressed notice, in the header strip — amber "needs your attention" language,
|
|
442
|
+
deliberately never overlapping the terminal or the drafts */
|
|
443
|
+
.notice-chip {
|
|
444
|
+
display: inline-flex;
|
|
445
|
+
align-items: center;
|
|
446
|
+
max-width: 420px;
|
|
447
|
+
overflow: hidden;
|
|
448
|
+
text-overflow: ellipsis;
|
|
449
|
+
white-space: nowrap;
|
|
450
|
+
font: inherit;
|
|
451
|
+
font-family: var(--mono);
|
|
452
|
+
font-size: 11.5px;
|
|
453
|
+
font-weight: 600;
|
|
454
|
+
color: var(--amber-hi);
|
|
455
|
+
background: rgba(232, 163, 61, 0.08);
|
|
456
|
+
border: none;
|
|
457
|
+
border-radius: 999px;
|
|
458
|
+
padding: 4px 12px;
|
|
459
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.45), 0 0 16px rgba(232, 163, 61, 0.18);
|
|
460
|
+
cursor: pointer;
|
|
461
|
+
animation: knock-in 0.3s var(--spring);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
.dc-banner {
|
|
465
|
+
display: flex;
|
|
466
|
+
align-items: center;
|
|
467
|
+
gap: 1rem;
|
|
468
|
+
padding: 0.5rem 1rem;
|
|
469
|
+
background: rgba(90, 30, 34, 0.5);
|
|
470
|
+
backdrop-filter: blur(12px);
|
|
471
|
+
box-shadow: 0 1px 0 var(--red-ring);
|
|
472
|
+
color: #ffd9da;
|
|
473
|
+
font-size: 0.85rem;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/* ── the terminal: full width, glass frame, gradient border ────────────────── */
|
|
477
|
+
.workspace {
|
|
478
|
+
flex: 1;
|
|
479
|
+
min-height: 0;
|
|
480
|
+
display: flex;
|
|
481
|
+
flex-direction: column;
|
|
482
|
+
padding: 14px 16px 16px;
|
|
483
|
+
gap: 12px;
|
|
484
|
+
}
|
|
485
|
+
#stage {
|
|
486
|
+
position: relative;
|
|
487
|
+
flex: 1;
|
|
488
|
+
min-height: 0;
|
|
489
|
+
border-radius: 14px;
|
|
490
|
+
padding: 10px 12px;
|
|
491
|
+
background: rgba(7, 9, 14, 0.72);
|
|
492
|
+
backdrop-filter: blur(12px);
|
|
493
|
+
-webkit-backdrop-filter: blur(12px);
|
|
494
|
+
box-shadow: 0 0 0 1px rgba(127, 178, 224, 0.14), 0 24px 60px rgba(0, 0, 0, 0.55),
|
|
495
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.05);
|
|
496
|
+
overflow: hidden;
|
|
497
|
+
}
|
|
498
|
+
#stage::before {
|
|
499
|
+
content: "";
|
|
500
|
+
position: absolute;
|
|
501
|
+
inset: -1px;
|
|
502
|
+
border-radius: 15px;
|
|
503
|
+
padding: 1px;
|
|
504
|
+
pointer-events: none;
|
|
505
|
+
z-index: 7;
|
|
506
|
+
background: linear-gradient(140deg, rgba(232, 163, 61, 0.4), rgba(127, 178, 224, 0.28) 45%, transparent 75%);
|
|
507
|
+
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
|
|
508
|
+
-webkit-mask-composite: xor;
|
|
509
|
+
mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
|
|
510
|
+
mask-composite: exclude;
|
|
511
|
+
}
|
|
512
|
+
#term {
|
|
513
|
+
/* sized to the xterm's own content by script; scaled (per-axis, ≤8% stretch) to
|
|
514
|
+
fill the glass, bottom-anchored so Claude's input line hugs the page bottom.
|
|
515
|
+
The transform keeps its rect equal to the visual box for pointer/cursor math. */
|
|
516
|
+
position: absolute;
|
|
517
|
+
top: 10px;
|
|
518
|
+
left: 12px;
|
|
519
|
+
transform-origin: 0 0;
|
|
520
|
+
}
|
|
521
|
+
#stage.paused #term {
|
|
522
|
+
filter: blur(6px) brightness(0.6);
|
|
523
|
+
}
|
|
524
|
+
/* direct-input mode: the frame glows amber — your keys are going INTO Claude */
|
|
525
|
+
#stage.direct {
|
|
526
|
+
cursor: text;
|
|
527
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.4), 0 0 22px rgba(232, 163, 61, 0.14),
|
|
528
|
+
0 24px 60px rgba(0, 0, 0, 0.55), inset 0 1px 0 rgba(255, 255, 255, 0.05);
|
|
529
|
+
}
|
|
530
|
+
#cursors {
|
|
531
|
+
position: absolute;
|
|
532
|
+
inset: 10px 12px;
|
|
533
|
+
pointer-events: none;
|
|
534
|
+
overflow: hidden;
|
|
535
|
+
z-index: 10; /* named cursors float above the drafts too — one surface */
|
|
536
|
+
}
|
|
537
|
+
.cursor {
|
|
538
|
+
position: absolute;
|
|
539
|
+
top: 0;
|
|
540
|
+
left: 0;
|
|
541
|
+
transition: transform 0.08s linear; /* CSS interpolation ≈ 80ms — the Figma feel */
|
|
542
|
+
will-change: transform;
|
|
543
|
+
}
|
|
544
|
+
.cursor svg {
|
|
545
|
+
display: block;
|
|
546
|
+
filter: drop-shadow(0 1px 2px rgba(0, 0, 0, 0.6));
|
|
547
|
+
}
|
|
548
|
+
.cursor-pill {
|
|
549
|
+
position: absolute;
|
|
550
|
+
left: 12px;
|
|
551
|
+
top: 12px;
|
|
552
|
+
padding: 2px 9px;
|
|
553
|
+
border-radius: 999px;
|
|
554
|
+
font-family: var(--mono);
|
|
555
|
+
font-size: 10.5px;
|
|
556
|
+
font-weight: 700;
|
|
557
|
+
color: #0a0d18;
|
|
558
|
+
white-space: nowrap;
|
|
559
|
+
box-shadow: 0 0 14px -2px var(--c, rgba(0, 0, 0, 0.7));
|
|
560
|
+
}
|
|
561
|
+
.paused-card {
|
|
562
|
+
position: absolute;
|
|
563
|
+
inset: 0;
|
|
564
|
+
display: grid;
|
|
565
|
+
place-items: center;
|
|
566
|
+
background: rgba(6, 7, 11, 0.55);
|
|
567
|
+
backdrop-filter: blur(2px);
|
|
568
|
+
z-index: 6;
|
|
569
|
+
}
|
|
570
|
+
.paused-inner {
|
|
571
|
+
text-align: center;
|
|
572
|
+
color: var(--text);
|
|
573
|
+
}
|
|
574
|
+
.paused-icon {
|
|
575
|
+
font-size: 2rem;
|
|
576
|
+
margin-bottom: 0.35rem;
|
|
577
|
+
}
|
|
578
|
+
.paused-inner small {
|
|
579
|
+
display: block;
|
|
580
|
+
margin-top: 0.3rem;
|
|
581
|
+
color: var(--text-dim);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
/* ── floating drafts: small glass windows INSIDE the terminal surface ──────── */
|
|
585
|
+
.overlays {
|
|
586
|
+
position: absolute;
|
|
587
|
+
inset: 0;
|
|
588
|
+
pointer-events: none; /* the terminal stays clickable between drafts */
|
|
589
|
+
z-index: 8;
|
|
590
|
+
transition: opacity 200ms ease-out;
|
|
591
|
+
}
|
|
592
|
+
/* /pause hides EVERYTHING the mirror promised to hide — drafts and cursors go
|
|
593
|
+
with it (they float above the pause scrim otherwise, still editable). */
|
|
594
|
+
#stage.paused .overlays,
|
|
595
|
+
#stage.paused #cursors {
|
|
596
|
+
opacity: 0;
|
|
597
|
+
pointer-events: none !important;
|
|
598
|
+
}
|
|
599
|
+
.fdraft {
|
|
600
|
+
position: absolute;
|
|
601
|
+
pointer-events: auto;
|
|
602
|
+
min-width: 220px;
|
|
603
|
+
max-width: 85%;
|
|
604
|
+
border-radius: 12px;
|
|
605
|
+
padding: 8px 14px 9px;
|
|
606
|
+
background: rgba(13, 15, 23, 0.86);
|
|
607
|
+
backdrop-filter: blur(16px);
|
|
608
|
+
-webkit-backdrop-filter: blur(16px);
|
|
609
|
+
box-shadow: 0 0 0 1px var(--ring), 0 18px 44px rgba(0, 0, 0, 0.6);
|
|
610
|
+
}
|
|
611
|
+
/* Entrance runs ONLY on a box that just appeared (.anim-in from the renderer) —
|
|
612
|
+
drafts fully re-render per keystroke, and replaying it would strobe. */
|
|
613
|
+
.fdraft.anim-in {
|
|
614
|
+
animation: draft-in 180ms ease-out;
|
|
615
|
+
}
|
|
616
|
+
@keyframes draft-in {
|
|
617
|
+
from {
|
|
618
|
+
opacity: 0;
|
|
619
|
+
transform: scale(0.97);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
/* home-position drafts translate; give them their own entrance so the transform
|
|
623
|
+
in the keyframe never fights the translateX(-50%) placement */
|
|
624
|
+
.fdraft.home.anim-in {
|
|
625
|
+
animation: draft-in-home 180ms ease-out;
|
|
626
|
+
}
|
|
627
|
+
@keyframes draft-in-home {
|
|
628
|
+
from {
|
|
629
|
+
opacity: 0;
|
|
630
|
+
transform: translateX(-50%) scale(0.97);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
/* border-beam (github.com/Jakubantalik/border-beam, CSS-native rendition): a
|
|
634
|
+
bright stroke travelling the border ring. Runs only on the box being edited —
|
|
635
|
+
amber for your own focus, the editor's identity color for someone else's. */
|
|
636
|
+
@property --beam {
|
|
637
|
+
syntax: "<angle>";
|
|
638
|
+
inherits: false;
|
|
639
|
+
initial-value: 0deg;
|
|
640
|
+
}
|
|
641
|
+
.fdraft::before {
|
|
642
|
+
content: "";
|
|
643
|
+
position: absolute;
|
|
644
|
+
inset: -1px;
|
|
645
|
+
border-radius: 13px;
|
|
646
|
+
padding: 1.5px;
|
|
647
|
+
pointer-events: none;
|
|
648
|
+
background: conic-gradient(
|
|
649
|
+
from var(--beam),
|
|
650
|
+
transparent 0deg,
|
|
651
|
+
var(--beam-c, rgba(232, 163, 61, 0.95)) 42deg,
|
|
652
|
+
transparent 90deg
|
|
653
|
+
);
|
|
654
|
+
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
|
|
655
|
+
-webkit-mask-composite: xor;
|
|
656
|
+
mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
|
|
657
|
+
mask-composite: exclude;
|
|
658
|
+
opacity: 0;
|
|
659
|
+
transition: opacity 200ms ease-out;
|
|
660
|
+
/* the negative delay phases the beam by wall-clock (set per render), so the
|
|
661
|
+
per-keystroke rebuild never resets it to angle zero */
|
|
662
|
+
animation: beam-spin 1.96s linear infinite;
|
|
663
|
+
animation-delay: var(--beam-delay, 0ms);
|
|
664
|
+
}
|
|
665
|
+
@keyframes beam-spin {
|
|
666
|
+
to {
|
|
667
|
+
--beam: 360deg;
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
.fdraft.focused::before,
|
|
671
|
+
.fdraft.edited::before {
|
|
672
|
+
opacity: 1;
|
|
673
|
+
}
|
|
674
|
+
.fdraft.edited::before {
|
|
675
|
+
--beam-c: var(--ec, rgba(232, 163, 61, 0.95));
|
|
676
|
+
}
|
|
677
|
+
.fdraft.focused {
|
|
678
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.35), 0 0 22px rgba(232, 163, 61, 0.12),
|
|
679
|
+
0 18px 44px rgba(0, 0, 0, 0.6);
|
|
680
|
+
}
|
|
681
|
+
/* someone else's caret is in it → ring in THEIR color */
|
|
682
|
+
.fdraft.edited {
|
|
683
|
+
box-shadow: 0 0 0 1px var(--ec, var(--ring)), 0 0 18px -6px var(--ec, transparent),
|
|
684
|
+
0 18px 44px rgba(0, 0, 0, 0.6);
|
|
685
|
+
}
|
|
686
|
+
/* home position: pinned above Claude's input line, stacking upward */
|
|
687
|
+
.fdraft.home {
|
|
688
|
+
left: 50%;
|
|
689
|
+
transform: translateX(-50%);
|
|
690
|
+
bottom: calc(88px + var(--stack, 0) * 56px);
|
|
691
|
+
width: 62%;
|
|
692
|
+
}
|
|
693
|
+
.fbar {
|
|
694
|
+
display: flex;
|
|
695
|
+
align-items: center;
|
|
696
|
+
gap: 7px;
|
|
697
|
+
margin-bottom: 5px;
|
|
698
|
+
font-family: var(--mono);
|
|
699
|
+
font-size: 10px;
|
|
700
|
+
color: var(--text-faint);
|
|
701
|
+
cursor: grab;
|
|
702
|
+
user-select: none;
|
|
703
|
+
-webkit-user-select: none;
|
|
704
|
+
}
|
|
705
|
+
.fbar:active {
|
|
706
|
+
cursor: grabbing;
|
|
707
|
+
}
|
|
708
|
+
.fbar .grip {
|
|
709
|
+
letter-spacing: 1px;
|
|
710
|
+
opacity: 0.6;
|
|
711
|
+
}
|
|
712
|
+
.fbar .author-pill {
|
|
713
|
+
font-weight: 700;
|
|
714
|
+
color: var(--c, var(--text));
|
|
715
|
+
}
|
|
716
|
+
.fbar .draft-x {
|
|
717
|
+
font-family: var(--mono);
|
|
718
|
+
font-size: 10px;
|
|
719
|
+
color: var(--text-faint);
|
|
720
|
+
background: rgba(255, 255, 255, 0.05);
|
|
721
|
+
padding: 0 8px;
|
|
722
|
+
border-radius: 999px;
|
|
723
|
+
box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08);
|
|
724
|
+
white-space: nowrap;
|
|
725
|
+
}
|
|
726
|
+
.fbar .draft-x {
|
|
727
|
+
margin-left: auto;
|
|
728
|
+
border: none;
|
|
729
|
+
cursor: pointer;
|
|
730
|
+
transition: box-shadow 0.15s ease, color 0.15s ease;
|
|
731
|
+
}
|
|
732
|
+
.fbar .draft-x:hover {
|
|
733
|
+
color: var(--red);
|
|
734
|
+
box-shadow: 0 0 0 1px var(--red-ring);
|
|
735
|
+
}
|
|
736
|
+
.draft-body {
|
|
737
|
+
font-family: var(--mono);
|
|
738
|
+
font-size: 0.9rem;
|
|
739
|
+
line-height: 1.55;
|
|
740
|
+
white-space: pre-wrap;
|
|
741
|
+
word-break: break-word;
|
|
742
|
+
min-height: 1.5rem;
|
|
743
|
+
color: var(--text);
|
|
744
|
+
cursor: text;
|
|
745
|
+
}
|
|
746
|
+
.draft-body::selection,
|
|
747
|
+
.draft-body *::selection {
|
|
748
|
+
background: rgba(232, 163, 61, 0.35);
|
|
749
|
+
}
|
|
750
|
+
.fdraft .rsz {
|
|
751
|
+
position: absolute;
|
|
752
|
+
right: 4px;
|
|
753
|
+
bottom: 2px;
|
|
754
|
+
color: var(--text-faint);
|
|
755
|
+
font-size: 10px;
|
|
756
|
+
opacity: 0.5;
|
|
757
|
+
cursor: nwse-resize;
|
|
758
|
+
user-select: none;
|
|
759
|
+
-webkit-user-select: none;
|
|
760
|
+
}
|
|
761
|
+
.caret {
|
|
762
|
+
display: inline-block;
|
|
763
|
+
width: 2.5px;
|
|
764
|
+
height: 1.05em;
|
|
765
|
+
margin: 0 -1px;
|
|
766
|
+
vertical-align: text-bottom;
|
|
767
|
+
background: var(--c, var(--amber));
|
|
768
|
+
box-shadow: 0 0 8px var(--c, var(--amber));
|
|
769
|
+
border-radius: 1px;
|
|
770
|
+
animation: caret-blink 1.1s steps(1) infinite;
|
|
771
|
+
}
|
|
772
|
+
.caret.self {
|
|
773
|
+
width: 3px;
|
|
774
|
+
}
|
|
775
|
+
@keyframes caret-blink {
|
|
776
|
+
50% {
|
|
777
|
+
opacity: 0.25;
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/* ── header chips: claude state, my role, the queue ─────────────────────────── */
|
|
782
|
+
.chip.claude {
|
|
783
|
+
display: inline-flex;
|
|
784
|
+
align-items: center;
|
|
785
|
+
gap: 7px;
|
|
786
|
+
font-size: 11px;
|
|
787
|
+
}
|
|
788
|
+
.chip.claude::before {
|
|
789
|
+
content: "";
|
|
790
|
+
width: 7px;
|
|
791
|
+
height: 7px;
|
|
792
|
+
border-radius: 50%;
|
|
793
|
+
background: currentColor;
|
|
794
|
+
box-shadow: 0 0 8px currentColor;
|
|
795
|
+
}
|
|
796
|
+
.chip.claude.idle {
|
|
797
|
+
color: var(--green);
|
|
798
|
+
}
|
|
799
|
+
.chip.claude.busy {
|
|
800
|
+
color: var(--amber-hi);
|
|
801
|
+
}
|
|
802
|
+
.chip.claude.ask {
|
|
803
|
+
color: var(--red);
|
|
804
|
+
}
|
|
805
|
+
.my-role {
|
|
806
|
+
color: var(--text-faint);
|
|
807
|
+
font-size: 11px;
|
|
808
|
+
}
|
|
809
|
+
.my-role b {
|
|
810
|
+
color: var(--c, var(--text-dim));
|
|
811
|
+
font-weight: 700;
|
|
812
|
+
}
|
|
813
|
+
.ctrl.qchip {
|
|
814
|
+
color: var(--amber-hi);
|
|
815
|
+
box-shadow: 0 0 0 1px rgba(232, 163, 61, 0.45);
|
|
816
|
+
}
|
|
817
|
+
.queue-pop {
|
|
818
|
+
min-width: 340px;
|
|
819
|
+
max-width: 480px;
|
|
820
|
+
}
|
|
821
|
+
.queue-label {
|
|
822
|
+
font-family: var(--mono);
|
|
823
|
+
font-size: 0.68rem;
|
|
824
|
+
text-transform: uppercase;
|
|
825
|
+
letter-spacing: 0.06em;
|
|
826
|
+
color: var(--text-faint);
|
|
827
|
+
margin-bottom: 6px;
|
|
828
|
+
}
|
|
829
|
+
.queue-chip {
|
|
830
|
+
display: flex;
|
|
831
|
+
align-items: baseline;
|
|
832
|
+
gap: 8px;
|
|
833
|
+
padding: 4px 8px;
|
|
834
|
+
border-radius: 8px;
|
|
835
|
+
background: rgba(255, 255, 255, 0.025);
|
|
836
|
+
box-shadow: 0 0 0 1px var(--ring-soft);
|
|
837
|
+
margin-bottom: 5px;
|
|
838
|
+
font-size: 0.85rem;
|
|
839
|
+
}
|
|
840
|
+
.queue-n {
|
|
841
|
+
font-family: var(--mono);
|
|
842
|
+
color: var(--text-faint);
|
|
843
|
+
font-size: 0.75rem;
|
|
844
|
+
}
|
|
845
|
+
.queue-who {
|
|
846
|
+
font-weight: 700;
|
|
847
|
+
color: var(--c, var(--text));
|
|
848
|
+
}
|
|
849
|
+
.queue-text {
|
|
850
|
+
color: var(--text-dim);
|
|
851
|
+
overflow: hidden;
|
|
852
|
+
text-overflow: ellipsis;
|
|
853
|
+
white-space: nowrap;
|
|
854
|
+
flex: 1;
|
|
855
|
+
}
|
|
856
|
+
.queue-act {
|
|
857
|
+
display: flex;
|
|
858
|
+
gap: 5px;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
/* the key catcher (unchanged: invisible, focused by script) */
|
|
862
|
+
.composer {
|
|
863
|
+
position: absolute;
|
|
864
|
+
width: 1px;
|
|
865
|
+
height: 1px;
|
|
866
|
+
padding: 0;
|
|
867
|
+
border: 0;
|
|
868
|
+
opacity: 0;
|
|
869
|
+
overflow: hidden;
|
|
870
|
+
resize: none;
|
|
871
|
+
pointer-events: none;
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
/* respect users who asked for calm */
|
|
875
|
+
@media (prefers-reduced-motion: reduce) {
|
|
876
|
+
*,
|
|
877
|
+
*::before,
|
|
878
|
+
*::after {
|
|
879
|
+
animation-duration: 0.01ms !important;
|
|
880
|
+
animation-iteration-count: 1 !important;
|
|
881
|
+
transition-duration: 0.01ms !important;
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
/* ── narrow screens: the strip wraps; the mirror stays full width ──────────── */
|
|
886
|
+
@media (max-width: 720px) {
|
|
887
|
+
.topbar {
|
|
888
|
+
flex-wrap: wrap;
|
|
889
|
+
row-gap: 6px;
|
|
890
|
+
}
|
|
891
|
+
.workspace {
|
|
892
|
+
padding: 10px;
|
|
893
|
+
}
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
/* Claude's real cursor in the mirror is the "you type HERE" indicator — but the
|
|
897
|
+
mirror never holds browser focus, so xterm draws it as a hollow outline. Force
|
|
898
|
+
it filled and blinking, like the terminal it mirrors. */
|
|
899
|
+
#term .xterm-cursor.xterm-cursor-block,
|
|
900
|
+
#term .xterm-cursor.xterm-cursor-outline {
|
|
901
|
+
background-color: rgba(232, 163, 61, 0.9) !important;
|
|
902
|
+
outline: none !important;
|
|
903
|
+
animation: caret-blink 1.1s steps(1) infinite;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
/* ── removed panel: the host kicked you — the mirror is gone, full stop ────── */
|
|
907
|
+
#removed {
|
|
908
|
+
display: grid;
|
|
909
|
+
place-items: center;
|
|
910
|
+
padding: 2rem;
|
|
911
|
+
}
|
|
912
|
+
.removed-card {
|
|
913
|
+
width: min(420px, 100%);
|
|
914
|
+
text-align: center;
|
|
915
|
+
background: var(--glass-2);
|
|
916
|
+
backdrop-filter: blur(16px);
|
|
917
|
+
-webkit-backdrop-filter: blur(16px);
|
|
918
|
+
border-radius: 14px;
|
|
919
|
+
padding: 2.5rem 2rem;
|
|
920
|
+
box-shadow: 0 0 0 1px var(--red-ring), 0 24px 60px rgba(0, 0, 0, 0.55),
|
|
921
|
+
inset 0 1px 0 rgba(255, 255, 255, 0.05);
|
|
922
|
+
animation: removed-in 220ms ease-out;
|
|
923
|
+
}
|
|
924
|
+
@keyframes removed-in {
|
|
925
|
+
from {
|
|
926
|
+
opacity: 0;
|
|
927
|
+
transform: scale(0.97);
|
|
928
|
+
}
|
|
929
|
+
}
|
|
930
|
+
.removed-icon {
|
|
931
|
+
font-size: 2rem;
|
|
932
|
+
color: var(--red);
|
|
933
|
+
margin-bottom: 0.5rem;
|
|
934
|
+
}
|
|
935
|
+
.removed-card h1 {
|
|
936
|
+
font-size: 1.1rem;
|
|
937
|
+
margin: 0 0 0.4rem;
|
|
938
|
+
letter-spacing: -0.01em;
|
|
939
|
+
}
|
|
940
|
+
.removed-card p {
|
|
941
|
+
margin: 0;
|
|
942
|
+
color: var(--text-dim);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
/* header-anchored popovers grow from where they came (spatial consistency) */
|
|
946
|
+
.popover,
|
|
947
|
+
.queue-pop {
|
|
948
|
+
transform-origin: top;
|
|
949
|
+
}
|
|
950
|
+
#cursors {
|
|
951
|
+
transition: opacity 200ms ease-out;
|
|
952
|
+
}
|