privateboard 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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -0
  3. package/dist/cli.js +10502 -0
  4. package/dist/cli.js.map +1 -0
  5. package/package.json +63 -0
  6. package/public/adjourn-overlay.css +253 -0
  7. package/public/agent-overlay.css +444 -0
  8. package/public/agent-overlay.js +604 -0
  9. package/public/agent-profile.css +3230 -0
  10. package/public/agent-profile.js +3329 -0
  11. package/public/app.js +6629 -0
  12. package/public/auto-hide-scroll.js +90 -0
  13. package/public/avatar-skill.js +793 -0
  14. package/public/avatars/chair.svg +98 -0
  15. package/public/avatars/first-principles.svg +122 -0
  16. package/public/avatars/long-horizon.svg +147 -0
  17. package/public/avatars/open_ai.png +0 -0
  18. package/public/avatars/phenomenologist.svg +130 -0
  19. package/public/avatars/socrates.svg +187 -0
  20. package/public/avatars/user-empathy.svg +117 -0
  21. package/public/avatars/value-investor.svg +117 -0
  22. package/public/favicon.svg +10 -0
  23. package/public/fonts/agent-Italic.woff2 +0 -0
  24. package/public/fonts/human-sans.woff2 +0 -0
  25. package/public/icons.css +103 -0
  26. package/public/models-cache.js +57 -0
  27. package/public/new-agent.css +1359 -0
  28. package/public/new-agent.js +675 -0
  29. package/public/onboarding.css +628 -0
  30. package/public/onboarding.js +782 -0
  31. package/public/prototype-dashboard.html +7596 -0
  32. package/public/report/spines/a16z-thesis.css +1055 -0
  33. package/public/report/spines/anthropic-essay.css +556 -0
  34. package/public/report/spines/boardroom-dark.css +1082 -0
  35. package/public/report/spines/gartner-note.css +538 -0
  36. package/public/report/spines/mckinsey-deck.css +523 -0
  37. package/public/report/spines/openai-paper.css +516 -0
  38. package/public/report.html +1417 -0
  39. package/public/room-settings.css +895 -0
  40. package/public/room-settings.js +1039 -0
  41. package/public/themes.css +338 -0
  42. package/public/user-settings.css +1236 -0
  43. package/public/user-settings.js +1291 -0
@@ -0,0 +1,895 @@
1
+ /* ═══════════════════════════════════════════
2
+ ROOM SETTINGS OVERLAY
3
+ Shows the current room's topic, members, configuration,
4
+ and statistics. Members can be added/removed inline.
5
+ ═══════════════════════════════════════════ */
6
+
7
+ .room-settings-overlay {
8
+ position: fixed;
9
+ inset: 0;
10
+ background: rgba(0, 0, 0, 0.78);
11
+ -webkit-backdrop-filter: blur(4px);
12
+ backdrop-filter: blur(4px);
13
+ z-index: 950;
14
+ display: none;
15
+ align-items: center;
16
+ justify-content: center;
17
+ padding: 24px;
18
+ overflow: hidden;
19
+ font-family: var(--mono, "Inter", system-ui, sans-serif);
20
+ }
21
+ .room-settings-overlay.open {
22
+ display: flex;
23
+ animation: rs-fade 0.14s ease-out;
24
+ }
25
+ @keyframes rs-fade { from { opacity: 0; } to { opacity: 1; } }
26
+
27
+ .room-settings-modal {
28
+ position: relative;
29
+ width: 100%;
30
+ /* Trimmed from 760 to 700 so the panel doesn't dominate at the
31
+ viewport's edges; the 4-col member grid still fits comfortably
32
+ and section content reads tighter. */
33
+ max-width: 700px;
34
+ max-height: calc(100vh - 48px);
35
+ background: var(--panel, #131312);
36
+ border: 0.5px solid var(--line-strong, #3A3A35);
37
+ color: var(--text, #C8C5BE);
38
+ animation: rs-rise 0.18s ease-out;
39
+ display: flex;
40
+ flex-direction: column;
41
+ min-height: 0;
42
+ }
43
+ .room-settings-modal > .rs-classification,
44
+ .room-settings-modal > .rs-head,
45
+ .room-settings-modal > .rs-foot {
46
+ flex: 0 0 auto;
47
+ }
48
+ .room-settings-modal > .rs-body {
49
+ flex: 1 1 auto;
50
+ min-height: 0;
51
+ overflow-y: auto;
52
+ }
53
+ @keyframes rs-rise {
54
+ from { transform: translateY(10px); opacity: 0; }
55
+ to { transform: translateY(0); opacity: 1; }
56
+ }
57
+ .room-settings-modal::before, .room-settings-modal::after {
58
+ content: "";
59
+ position: absolute;
60
+ width: 10px;
61
+ height: 10px;
62
+ border: 1.5px solid var(--lime, #6FB572);
63
+ pointer-events: none;
64
+ }
65
+ .room-settings-modal::before { top: -1px; left: -1px; border-right: none; border-bottom: none; }
66
+ .room-settings-modal::after { bottom: -1px; right: -1px; border-left: none; border-top: none; }
67
+
68
+ .rs-classification {
69
+ background: var(--panel-2, #1A1A18);
70
+ border-bottom: 0.5px solid var(--line-bright, #2A2A26);
71
+ padding: 5px 14px;
72
+ font-size: 8.5px;
73
+ letter-spacing: 0.22em;
74
+ text-transform: uppercase;
75
+ color: var(--lime, #6FB572);
76
+ font-weight: 700;
77
+ display: flex;
78
+ justify-content: space-between;
79
+ align-items: center;
80
+ }
81
+ .rs-classification .right {
82
+ color: var(--text-faint, #3A382F);
83
+ letter-spacing: 0.12em;
84
+ }
85
+
86
+ .rs-head {
87
+ display: grid;
88
+ grid-template-columns: 1fr auto;
89
+ gap: 12px;
90
+ align-items: start;
91
+ padding: 14px 16px 12px;
92
+ border-bottom: 0.5px dashed var(--line-bright, #2A2A26);
93
+ }
94
+ .rs-head .meta {
95
+ font-family: var(--mono);
96
+ font-size: 9px;
97
+ color: var(--text-dim, #5C5A52);
98
+ text-transform: uppercase;
99
+ letter-spacing: 0.18em;
100
+ margin-bottom: 4px;
101
+ font-weight: 700;
102
+ }
103
+ .rs-head .meta .live {
104
+ color: var(--lime, #6FB572);
105
+ font-weight: 700;
106
+ }
107
+ .rs-head .meta .live::before {
108
+ content: "● ";
109
+ animation: rs-pulse 1.6s ease-in-out infinite;
110
+ }
111
+ @keyframes rs-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.45; } }
112
+ .rs-head .title {
113
+ font-size: 14px;
114
+ font-weight: 700;
115
+ color: var(--text, #C8C5BE);
116
+ letter-spacing: -0.01em;
117
+ line-height: 1.3;
118
+ }
119
+ .rs-head .title::before {
120
+ content: "▸ ";
121
+ color: var(--lime, #6FB572);
122
+ }
123
+ .rs-head .close-btn {
124
+ width: 24px; height: 24px;
125
+ background: transparent;
126
+ border: 0.5px solid var(--line-bright, #2A2A26);
127
+ color: var(--text-dim, #5C5A52);
128
+ font-size: 12px;
129
+ cursor: pointer;
130
+ font-family: var(--mono);
131
+ border-radius: 3px;
132
+ transition: all 0.12s;
133
+ }
134
+ .rs-head .close-btn:hover {
135
+ border-color: var(--lime, #6FB572);
136
+ color: var(--lime, #6FB572);
137
+ }
138
+
139
+ .rs-body { padding: 14px 16px 4px; }
140
+
141
+ /* Legacy section block (kept for any leftover .rs-block consumers). */
142
+ .rs-block { padding-bottom: 14px; margin-bottom: 14px; border-bottom: 0.5px solid var(--line, #1F1E1A); }
143
+ .rs-block:last-child { padding-bottom: 0; margin-bottom: 0; border-bottom: none; }
144
+
145
+ /* ─── Configuration · 3-row compact spec sheet ──────────────────────
146
+ Each row is a single line: a short label + hint on the left, an
147
+ inline control on the right. No nested boxed items, no slider, no
148
+ verbose multi-line callouts. Hairline divider between rows so the
149
+ list reads as a tidy table. */
150
+ .rs-config-list {
151
+ display: flex;
152
+ flex-direction: column;
153
+ }
154
+ .rs-config-row {
155
+ display: grid;
156
+ grid-template-columns: 140px 1fr;
157
+ gap: 14px;
158
+ align-items: center;
159
+ padding: 12px 0;
160
+ border-bottom: 0.5px solid var(--line, #1F1E1A);
161
+ }
162
+ .rs-config-row:last-child { border-bottom: none; }
163
+ .rs-config-row-label {
164
+ display: flex;
165
+ flex-direction: column;
166
+ gap: 2px;
167
+ min-width: 0;
168
+ }
169
+ .rs-config-row-name {
170
+ font-family: var(--font-human);
171
+ font-size: 13px;
172
+ font-weight: 600;
173
+ color: var(--text, #C8C5BE);
174
+ letter-spacing: -0.005em;
175
+ }
176
+ .rs-config-row-hint {
177
+ font-family: var(--mono);
178
+ font-size: 9px;
179
+ letter-spacing: 0.06em;
180
+ color: var(--text-dim, #5C5A52);
181
+ }
182
+ @media (max-width: 600px) {
183
+ .rs-config-row { grid-template-columns: 1fr; gap: 6px; }
184
+ }
185
+
186
+ /* Tone + intensity chip rows · explicit grid columns (4 / 3) so the
187
+ chips always sit in a single row at content width. flex-wrap was
188
+ the prior approach but allowed chips to fold onto a second line on
189
+ tight viewports — the user wants them locked to one row. */
190
+ .rs-mode-grid {
191
+ display: grid;
192
+ grid-template-columns: repeat(4, max-content);
193
+ gap: 3px;
194
+ }
195
+ .rs-intensity-chips {
196
+ display: grid;
197
+ grid-template-columns: repeat(3, max-content);
198
+ gap: 3px;
199
+ }
200
+
201
+ /* Tighter chip variant · single-line label paired with a small `i`
202
+ info icon. Sharp corners (no border-radius), compact padding,
203
+ chips size to content. The `.rs-chip-info` opens a hover popover
204
+ carrying the description text — separated out from the label so
205
+ clicking the label still stages the chip's value. */
206
+ .rs-chip-mini {
207
+ display: inline-flex;
208
+ align-items: center;
209
+ gap: 5px;
210
+ padding: 3px 6px;
211
+ background: var(--bg, #0A0A0A);
212
+ border: 0.5px solid var(--line-strong, #3A3A35);
213
+ font-family: var(--mono);
214
+ font-size: 9px;
215
+ font-weight: 700;
216
+ color: var(--text-soft, #8E8B83);
217
+ cursor: pointer;
218
+ text-align: left;
219
+ text-transform: uppercase;
220
+ letter-spacing: 0.06em;
221
+ border-radius: 0;
222
+ transition: border-color 0.12s, color 0.12s, background 0.12s;
223
+ white-space: nowrap;
224
+ }
225
+ .rs-chip-mini:hover {
226
+ border-color: var(--lime-dim, #2D5532);
227
+ color: var(--lime, #6FB572);
228
+ }
229
+ .rs-chip-mini.active {
230
+ background: var(--lime, #6FB572);
231
+ color: var(--bg, #0A0A0A);
232
+ border-color: var(--lime, #6FB572);
233
+ }
234
+ .rs-chip-label { line-height: 1; }
235
+ .rs-chip-info {
236
+ width: 12px;
237
+ height: 12px;
238
+ display: inline-flex;
239
+ align-items: center;
240
+ justify-content: center;
241
+ font-family: var(--font-human);
242
+ font-style: italic;
243
+ font-size: 9px;
244
+ font-weight: 700;
245
+ line-height: 1;
246
+ color: var(--text-faint, #3A382F);
247
+ border: 0.5px solid var(--line-bright, #2A2A26);
248
+ cursor: help;
249
+ user-select: none;
250
+ transition: color 0.12s, border-color 0.12s;
251
+ }
252
+ .rs-chip-mini:hover .rs-chip-info {
253
+ color: var(--lime, #6FB572);
254
+ border-color: var(--lime, #6FB572);
255
+ }
256
+ .rs-chip-mini.active .rs-chip-info {
257
+ color: var(--bg, #0A0A0A);
258
+ border-color: var(--bg, #0A0A0A);
259
+ background: rgba(0, 0, 0, 0.18);
260
+ }
261
+
262
+ /* Info popover · hover-driven floating panel carrying the chip's
263
+ description. Title + body, anchored above/below the icon. Higher
264
+ z-index than the modal so it floats on top. */
265
+ .rs-info-popover {
266
+ position: fixed;
267
+ z-index: 9100;
268
+ max-width: 320px;
269
+ background: var(--panel, #131312);
270
+ border: 0.5px solid var(--line-strong, #3A3A35);
271
+ padding: 10px 12px;
272
+ font-family: var(--font-human);
273
+ font-size: 11.5px;
274
+ line-height: 1.55;
275
+ color: var(--text-soft, #8E8B83);
276
+ letter-spacing: -0.005em;
277
+ border-radius: 4px;
278
+ }
279
+ .rs-info-popover-head {
280
+ font-family: var(--mono);
281
+ font-size: 9px;
282
+ letter-spacing: 0.18em;
283
+ text-transform: uppercase;
284
+ color: var(--text-faint, #3A382F);
285
+ font-weight: 700;
286
+ margin-bottom: 4px;
287
+ }
288
+ .rs-info-popover-body { color: var(--text-soft, #8E8B83); }
289
+
290
+ /* Directors trigger button · stacks the first 5 active director
291
+ avatars with a +N overflow chip + count label, matching the
292
+ new-room composer's .cmp-cast-btn vocabulary. Click opens the
293
+ picker popover. */
294
+ .rs-cast-btn {
295
+ display: inline-flex;
296
+ align-items: center;
297
+ gap: 10px;
298
+ background: var(--bg, #0A0A0A);
299
+ border: 0.5px solid var(--line-bright, #2A2A26);
300
+ color: var(--text-soft, #8E8B83);
301
+ font-family: var(--mono);
302
+ font-size: 10px;
303
+ font-weight: 700;
304
+ letter-spacing: 0.08em;
305
+ text-transform: uppercase;
306
+ padding: 4px 9px 4px 6px;
307
+ cursor: pointer;
308
+ border-radius: 0;
309
+ transition: border-color 0.12s, background 0.12s, color 0.12s;
310
+ }
311
+ .rs-cast-btn:hover,
312
+ .rs-cast-btn.on {
313
+ border-color: var(--lime, #6FB572);
314
+ color: var(--lime, #6FB572);
315
+ }
316
+ .rs-cast-stack {
317
+ display: inline-flex;
318
+ align-items: center;
319
+ }
320
+ .rs-cast-av {
321
+ width: 18px;
322
+ height: 18px;
323
+ border: 0.5px solid var(--line-bright, #2A2A26);
324
+ background: var(--bg, #0A0A0A);
325
+ margin-left: -4px;
326
+ image-rendering: pixelated;
327
+ image-rendering: crisp-edges;
328
+ border-radius: 0;
329
+ }
330
+ .rs-cast-av:first-child { margin-left: 0; }
331
+ .rs-cast-more {
332
+ margin-left: -4px;
333
+ width: 18px; height: 18px;
334
+ display: inline-flex;
335
+ align-items: center;
336
+ justify-content: center;
337
+ font-family: var(--mono);
338
+ font-size: 8.5px;
339
+ font-weight: 700;
340
+ letter-spacing: 0;
341
+ background: var(--panel-2, #1A1A18);
342
+ border: 0.5px solid var(--line-bright, #2A2A26);
343
+ color: var(--text-faint, #3A382F);
344
+ border-radius: 0;
345
+ }
346
+ .rs-cast-count { white-space: nowrap; }
347
+ .rs-cast-chevron {
348
+ font-size: 9px;
349
+ color: var(--text-faint, #3A382F);
350
+ margin-left: 2px;
351
+ }
352
+ .rs-cast-btn:hover .rs-cast-chevron,
353
+ .rs-cast-btn.on .rs-cast-chevron { color: var(--lime, #6FB572); }
354
+
355
+ /* Picker popover · same composition as the room composer's
356
+ .composer-pick-pop · 360px wide, scrollable list of director rows. */
357
+ .rs-cast-pop {
358
+ position: fixed;
359
+ z-index: 9001;
360
+ width: 360px;
361
+ max-width: calc(100vw - 32px);
362
+ max-height: 56vh;
363
+ overflow-y: auto;
364
+ background: var(--panel, #131312);
365
+ border: 0.5px solid var(--line-strong, #3A3A35);
366
+ border-radius: 4px;
367
+ }
368
+ .rs-cast-head {
369
+ display: flex;
370
+ justify-content: space-between;
371
+ align-items: baseline;
372
+ padding: 8px 12px;
373
+ border-bottom: 0.5px solid var(--line, #1F1E1A);
374
+ position: sticky;
375
+ top: 0;
376
+ background: var(--panel, #131312);
377
+ z-index: 1;
378
+ }
379
+ .rs-cast-title {
380
+ font-family: var(--mono);
381
+ font-size: 9.5px;
382
+ font-weight: 700;
383
+ letter-spacing: 0.16em;
384
+ text-transform: uppercase;
385
+ color: var(--text);
386
+ }
387
+ .rs-cast-hint {
388
+ font-family: var(--mono);
389
+ font-size: 8.5px;
390
+ letter-spacing: 0.06em;
391
+ text-transform: uppercase;
392
+ color: var(--text-faint);
393
+ }
394
+ .rs-cast-list { padding: 2px 0; }
395
+ .rs-cast-empty {
396
+ padding: 16px 12px;
397
+ text-align: center;
398
+ font-family: var(--mono);
399
+ font-size: 10px;
400
+ color: var(--text-faint);
401
+ }
402
+
403
+ /* Inline memory toggle · checkbox + single-line label. Drops the
404
+ verbose 2-line description box used previously; the row's hint
405
+ above carries the explanation. */
406
+ .rs-toggle-row {
407
+ display: inline-flex;
408
+ align-items: center;
409
+ gap: 9px;
410
+ padding: 5px 10px;
411
+ background: var(--bg, #0A0A0A);
412
+ border: 0.5px solid var(--line-bright, #2A2A26);
413
+ cursor: pointer;
414
+ border-radius: 0;
415
+ transition: border-color 0.12s, background 0.12s;
416
+ }
417
+ .rs-toggle-row:hover { border-color: var(--text-faint, #3A382F); }
418
+ .rs-toggle-row .rs-incognito-check {
419
+ margin: 0;
420
+ accent-color: var(--lime, #6FB572);
421
+ cursor: pointer;
422
+ width: 13px;
423
+ height: 13px;
424
+ }
425
+ .rs-toggle-label {
426
+ font-family: var(--font-human);
427
+ font-size: 12px;
428
+ color: var(--text-soft, #8E8B83);
429
+ letter-spacing: -0.005em;
430
+ }
431
+ .rs-toggle-row:has(.rs-incognito-check:checked) {
432
+ border-color: var(--lime, #6FB572);
433
+ background: var(--panel-2, #1A1A18);
434
+ }
435
+ .rs-toggle-row:has(.rs-incognito-check:checked) .rs-toggle-label {
436
+ color: var(--lime, #6FB572);
437
+ }
438
+
439
+ /* Section label · matches the new composer's mono micro-type kicker.
440
+ No leading lime bullet — the inline count chip carries enough
441
+ visual weight, and dropping the bullet lets the labels sit flush
442
+ left like the rest of the prototype's section heads. */
443
+ .rs-label {
444
+ font-size: 9px;
445
+ font-weight: 700;
446
+ text-transform: uppercase;
447
+ letter-spacing: 0.2em;
448
+ color: var(--text-faint, #3A382F);
449
+ margin-bottom: 7px;
450
+ display: flex;
451
+ align-items: center;
452
+ gap: 8px;
453
+ }
454
+ .rs-label .count {
455
+ margin-left: auto;
456
+ font-size: 8.5px;
457
+ color: var(--text-faint, #3A382F);
458
+ letter-spacing: 0.1em;
459
+ font-weight: 600;
460
+ border: 0.5px solid var(--line-bright, #2A2A26);
461
+ padding: 1px 6px;
462
+ text-transform: lowercase;
463
+ border-radius: 2px;
464
+ }
465
+
466
+ /* Topic display (read-only) */
467
+ .rs-topic {
468
+ font-family: var(--mono);
469
+ font-size: 12px;
470
+ line-height: 1.5;
471
+ color: var(--text-soft, #8E8B83);
472
+ background: var(--bg, #0A0A0A);
473
+ border: 0.5px solid var(--line-bright, #2A2A26);
474
+ padding: 8px 11px;
475
+ letter-spacing: -0.003em;
476
+ border-radius: 3px;
477
+ }
478
+ .rs-topic::before {
479
+ content: "> ";
480
+ color: var(--lime, #6FB572);
481
+ font-weight: 700;
482
+ }
483
+
484
+ /* Members section · flat list of horizontal rows mirroring the
485
+ new-room composer's `.composer-pick-row` (checkbox · avatar · name
486
+ + role · model badge · info button). Compact, hairline-separated,
487
+ one screen-line per director. The whole list scrolls inside a
488
+ bordered shell so a long catalog stays inside the section. */
489
+ .rs-members {
490
+ display: flex;
491
+ flex-direction: column;
492
+ max-height: 380px;
493
+ overflow-y: auto;
494
+ border: 0.5px solid var(--line-bright, #2A2A26);
495
+ background: var(--bg, #0A0A0A);
496
+ border-radius: 3px;
497
+ padding: 2px 0;
498
+ }
499
+ .rs-members::-webkit-scrollbar { width: 6px; }
500
+ .rs-members::-webkit-scrollbar-thumb { background: var(--line-strong); }
501
+
502
+ .rs-member-section-label {
503
+ font-size: 8.5px;
504
+ letter-spacing: 0.18em;
505
+ text-transform: uppercase;
506
+ color: var(--text-faint, #3A382F);
507
+ margin: 6px 0 3px;
508
+ font-weight: 700;
509
+ }
510
+
511
+ /* Row · 5-col grid: checkbox · avatar · main · model · info. Whole
512
+ row is clickable (toggles staged membership); the avatar + info
513
+ columns route to the agent profile via separate handlers. */
514
+ .rs-member {
515
+ display: grid;
516
+ grid-template-columns: 12px 22px 1fr auto auto;
517
+ gap: 8px;
518
+ align-items: center;
519
+ padding: 5px 10px;
520
+ cursor: pointer;
521
+ background: transparent;
522
+ border: none;
523
+ text-align: left;
524
+ transition: background 0.1s;
525
+ }
526
+ .rs-member:hover { background: var(--panel-2, #1A1A18); }
527
+ .rs-member.on { background: var(--panel-3, #21211E); }
528
+ .rs-member.on .rs-member-name { color: var(--lime, #6FB572); }
529
+
530
+ .rs-member-check {
531
+ margin: 0;
532
+ width: 12px; height: 12px;
533
+ accent-color: var(--lime, #6FB572);
534
+ cursor: pointer;
535
+ }
536
+
537
+ .rs-member-img {
538
+ width: 22px; height: 22px;
539
+ display: flex;
540
+ align-items: center;
541
+ justify-content: center;
542
+ background: var(--bg, #0A0A0A);
543
+ border: 0.5px solid var(--line-bright, #2A2A26);
544
+ cursor: pointer;
545
+ transition: border-color 0.12s;
546
+ }
547
+ .rs-member-img:hover { border-color: var(--lime, #6FB572); }
548
+ .rs-member-av {
549
+ width: 100%;
550
+ height: 100%;
551
+ image-rendering: pixelated;
552
+ image-rendering: crisp-edges;
553
+ }
554
+
555
+ .rs-member-main {
556
+ display: flex;
557
+ align-items: baseline;
558
+ gap: 8px;
559
+ min-width: 0;
560
+ }
561
+ .rs-member-name {
562
+ font-family: var(--font-human);
563
+ font-size: 12.5px;
564
+ color: var(--text, #C8C5BE);
565
+ letter-spacing: -0.005em;
566
+ white-space: nowrap;
567
+ overflow: hidden;
568
+ text-overflow: ellipsis;
569
+ }
570
+ .rs-member-tag {
571
+ font-family: var(--mono);
572
+ font-size: 8.5px;
573
+ letter-spacing: 0.08em;
574
+ text-transform: uppercase;
575
+ /* Was text-faint · same readability problem as
576
+ `.composer-pick-tag` — bumped to text-dim so the role label
577
+ (skeptic / physicist / …) is actually legible. */
578
+ color: var(--text-dim, #5C5A52);
579
+ white-space: nowrap;
580
+ overflow: hidden;
581
+ text-overflow: ellipsis;
582
+ }
583
+
584
+ .rs-member-model {
585
+ font-family: var(--mono);
586
+ font-size: 8.5px;
587
+ letter-spacing: 0.04em;
588
+ color: var(--text-soft, #8E8B83);
589
+ padding: 1px 5px;
590
+ border: 0.5px solid var(--line, #1F1E1A);
591
+ background: var(--panel-2, #1A1A18);
592
+ white-space: nowrap;
593
+ border-radius: 2px;
594
+ }
595
+
596
+ .rs-member-info {
597
+ width: 16px; height: 16px;
598
+ border: 0.5px solid var(--line-bright, #2A2A26);
599
+ background: transparent;
600
+ color: var(--text-faint, #3A382F);
601
+ font-family: var(--font-human);
602
+ font-style: italic;
603
+ font-size: 9px;
604
+ font-weight: 700;
605
+ line-height: 1;
606
+ cursor: pointer;
607
+ display: inline-flex;
608
+ align-items: center;
609
+ justify-content: center;
610
+ transition: border-color 0.12s, color 0.12s;
611
+ border-radius: 2px;
612
+ }
613
+ .rs-member-info:hover {
614
+ border-color: var(--lime, #6FB572);
615
+ color: var(--lime, #6FB572);
616
+ }
617
+
618
+ .rs-empty {
619
+ color: var(--text-faint, #3A382F);
620
+ font-size: 11px;
621
+ padding: 8px 10px;
622
+ border: 0.5px dashed var(--line-bright, #2A2A26);
623
+ font-family: var(--mono);
624
+ letter-spacing: 0.06em;
625
+ }
626
+
627
+ /* History list — chronological log of room mutations */
628
+ .rs-history-list {
629
+ list-style: none;
630
+ margin: 0;
631
+ padding: 0;
632
+ border: 0.5px solid var(--line-bright, #2A2A26);
633
+ background: var(--bg, #0A0A0A);
634
+ max-height: 160px;
635
+ overflow-y: auto;
636
+ border-radius: 3px;
637
+ }
638
+ .rs-history-row {
639
+ display: grid;
640
+ grid-template-columns: 100px 14px 1fr auto;
641
+ gap: 8px;
642
+ align-items: center;
643
+ padding: 4px 9px;
644
+ font-family: var(--mono);
645
+ font-size: 10px;
646
+ color: var(--text-soft, #8E8B83);
647
+ letter-spacing: -0.003em;
648
+ }
649
+ .rs-history-row + .rs-history-row {
650
+ border-top: 0.5px dotted rgba(255, 255, 255, 0.04);
651
+ }
652
+ .rs-history-row .h-time {
653
+ font-size: 9px;
654
+ color: var(--text-faint, #3A382F);
655
+ letter-spacing: 0.04em;
656
+ white-space: nowrap;
657
+ }
658
+ .rs-history-row .h-icon {
659
+ font-weight: 700;
660
+ text-align: center;
661
+ font-size: 10.5px;
662
+ }
663
+ .rs-history-row .h-label {
664
+ color: var(--text, #C8C5BE);
665
+ font-family: var(--sans);
666
+ font-size: 11.5px;
667
+ }
668
+ .rs-history-row .h-who {
669
+ font-size: 8.5px;
670
+ color: var(--text-faint, #3A382F);
671
+ text-transform: uppercase;
672
+ letter-spacing: 0.12em;
673
+ font-weight: 600;
674
+ }
675
+ .rs-history-row.h-add .h-icon { color: var(--lime, #6FB572); }
676
+ .rs-history-row.h-remove .h-icon { color: var(--red, #B5706A); }
677
+ .rs-history-row.h-config .h-icon { color: var(--amber, #B59560); }
678
+ .rs-history-row.h-system .h-icon { color: var(--text-dim, #5C5A52); }
679
+
680
+ /* Configuration block */
681
+ .rs-config-grid {
682
+ display: grid;
683
+ grid-template-columns: 1fr 1fr;
684
+ gap: 8px;
685
+ }
686
+ @media (max-width: 600px) { .rs-config-grid { grid-template-columns: 1fr; } }
687
+
688
+ .rs-config-item {
689
+ background: var(--bg, #0A0A0A);
690
+ border: 0.5px solid var(--line-bright, #2A2A26);
691
+ padding: 7px 9px;
692
+ border-radius: 3px;
693
+ }
694
+ .rs-config-item.full { grid-column: 1 / -1; }
695
+
696
+ /* Incognito · per-room opt-out for long-term memory extraction.
697
+ Renders as a labeled checkbox row with a short rationale. */
698
+ .rs-incognito-row {
699
+ display: grid;
700
+ grid-template-columns: 16px 1fr;
701
+ align-items: start;
702
+ gap: 10px;
703
+ padding: 8px 11px;
704
+ background: var(--bg);
705
+ border: 0.5px dashed var(--line-strong);
706
+ cursor: pointer;
707
+ border-radius: 3px;
708
+ transition: border-color 0.12s, background 0.12s;
709
+ }
710
+ .rs-incognito-row:hover { border-color: var(--text-faint); }
711
+ .rs-incognito-check {
712
+ margin: 2px 0 0;
713
+ accent-color: var(--lime);
714
+ cursor: pointer;
715
+ }
716
+ .rs-incognito-text {
717
+ display: flex;
718
+ flex-direction: column;
719
+ gap: 2px;
720
+ }
721
+ .rs-incognito-title {
722
+ font-family: var(--font-human);
723
+ font-size: 12px;
724
+ font-weight: 700;
725
+ color: var(--text);
726
+ letter-spacing: -0.005em;
727
+ }
728
+ .rs-incognito-desc {
729
+ font-size: 10.5px;
730
+ color: var(--text-faint);
731
+ line-height: 1.4;
732
+ }
733
+ .rs-incognito-row:has(.rs-incognito-check:checked) {
734
+ border-style: solid;
735
+ border-color: var(--lime);
736
+ background: var(--panel-2);
737
+ }
738
+ .rs-incognito-row:has(.rs-incognito-check:checked) .rs-incognito-title {
739
+ color: var(--lime);
740
+ }
741
+ .rs-config-item-label {
742
+ font-size: 8.5px;
743
+ font-weight: 700;
744
+ letter-spacing: 0.18em;
745
+ text-transform: uppercase;
746
+ color: var(--lime, #6FB572);
747
+ margin-bottom: 5px;
748
+ display: flex;
749
+ justify-content: space-between;
750
+ align-items: center;
751
+ }
752
+ .rs-config-item-label::before { content: "[ "; color: var(--text-dim); }
753
+ .rs-config-item-label::after { content: " ]"; color: var(--text-dim); }
754
+ .rs-config-item-label .hint {
755
+ font-weight: 400;
756
+ color: var(--text-dim);
757
+ text-transform: lowercase;
758
+ letter-spacing: 0;
759
+ }
760
+ .rs-config-item-label .hint::before, .rs-config-item-label .hint::after { content: ""; }
761
+
762
+ /* Legacy v1 rules removed · `.rs-mode-grid`, `.rs-chip`, `.rs-temp-*`,
763
+ `.rs-style-*` were overriding the v2 rules above (same specificity,
764
+ later in source order). The current overlay uses `.rs-mode-grid`
765
+ (flex) + `.rs-chip-mini` defined earlier in this file. */
766
+
767
+ /* Stats */
768
+ .rs-stats {
769
+ display: grid;
770
+ grid-template-columns: repeat(4, 1fr);
771
+ gap: 1px;
772
+ background: var(--line-bright, #2A2A26);
773
+ border: 0.5px solid var(--line-bright, #2A2A26);
774
+ border-radius: 3px;
775
+ overflow: hidden;
776
+ }
777
+ .rs-stat {
778
+ background: var(--panel, #131312);
779
+ padding: 7px 8px;
780
+ text-align: center;
781
+ }
782
+ .rs-stat .v {
783
+ font-family: var(--mono);
784
+ font-size: 14.5px;
785
+ color: var(--lime, #6FB572);
786
+ font-weight: 700;
787
+ letter-spacing: -0.01em;
788
+ line-height: 1;
789
+ }
790
+ .rs-stat .l {
791
+ font-size: 8px;
792
+ text-transform: uppercase;
793
+ letter-spacing: 0.18em;
794
+ color: var(--text-faint, #3A382F);
795
+ margin-top: 3px;
796
+ font-weight: 700;
797
+ }
798
+ @media (max-width: 600px) { .rs-stats { grid-template-columns: repeat(2, 1fr); } }
799
+
800
+ /* Footer actions */
801
+ .rs-foot {
802
+ border-top: 0.5px solid var(--line-bright, #2A2A26);
803
+ padding: 9px 16px;
804
+ background: var(--panel-2, #1A1A18);
805
+ display: flex;
806
+ justify-content: space-between;
807
+ align-items: center;
808
+ gap: 8px;
809
+ }
810
+ .rs-foot .saved {
811
+ font-family: var(--mono);
812
+ font-size: 9px;
813
+ color: var(--text-faint, #5C5A52);
814
+ text-transform: uppercase;
815
+ letter-spacing: 0.18em;
816
+ font-weight: 700;
817
+ }
818
+ .rs-foot .saved::before {
819
+ content: "○ ";
820
+ }
821
+ .rs-foot .saved.pending {
822
+ color: var(--amber, #B59560);
823
+ animation: rs-pending-pulse 1.4s ease-in-out infinite;
824
+ }
825
+ .rs-foot .saved.pending::before { content: "● "; }
826
+ .rs-foot .saved.error { color: var(--red, #B5706A); animation: none; }
827
+ .rs-foot .saved.error::before { content: "✕ "; }
828
+ @keyframes rs-pending-pulse {
829
+ 0%, 100% { opacity: 0.7; }
830
+ 50% { opacity: 1; }
831
+ }
832
+
833
+ .rs-action {
834
+ text-decoration: none;
835
+ font-family: var(--mono);
836
+ font-size: 9.5px;
837
+ font-weight: 700;
838
+ text-transform: uppercase;
839
+ letter-spacing: 0.14em;
840
+ padding: 6px 11px;
841
+ border: 0.5px solid var(--line-strong, #3A3A35);
842
+ background: transparent;
843
+ color: var(--text-soft, #8E8B83);
844
+ cursor: pointer;
845
+ border-radius: 3px;
846
+ transition: all 0.12s;
847
+ }
848
+ .rs-action:hover { border-color: var(--lime, #6FB572); color: var(--lime, #6FB572); }
849
+ /* Confirm button picks up a primary-action treatment when there are
850
+ staged changes, so the user knows the action is live. */
851
+ .rs-action.dirty {
852
+ background: var(--lime, #6FB572);
853
+ color: var(--bg, #0A0A0A);
854
+ border-color: var(--lime, #6FB572);
855
+ }
856
+ .rs-action.dirty:hover {
857
+ background: transparent;
858
+ color: var(--lime, #6FB572);
859
+ }
860
+ .rs-action[disabled] { opacity: 0.55; cursor: progress; pointer-events: none; }
861
+ .rs-action.danger { color: var(--red, #B5706A); border-color: rgba(181, 112, 106, 0.4); }
862
+ .rs-action.danger:hover { background: var(--red, #B5706A); color: var(--bg, #0A0A0A); border-color: var(--red, #B5706A); }
863
+
864
+ /* Icon-only buttons in the room-head action bar */
865
+ .head-icon-btn,
866
+ .room-settings-trigger {
867
+ width: 28px;
868
+ height: 26px;
869
+ display: inline-flex;
870
+ align-items: center;
871
+ justify-content: center;
872
+ padding: 0;
873
+ background: transparent;
874
+ border: 0.5px solid var(--line-strong, #3A3A35);
875
+ color: var(--text-soft, #8E8B83);
876
+ font-family: var(--mono);
877
+ font-size: 13px;
878
+ line-height: 1;
879
+ cursor: pointer;
880
+ text-decoration: none;
881
+ transition: all 0.12s;
882
+ }
883
+ .head-icon-btn:hover,
884
+ .room-settings-trigger:hover {
885
+ border-color: var(--lime, #6FB572);
886
+ color: var(--lime, #6FB572);
887
+ }
888
+
889
+ @media (max-width: 600px) {
890
+ .room-settings-overlay { padding: 12px; }
891
+ .rs-head { padding: 12px 14px; }
892
+ .rs-body { padding: 12px 14px 4px; }
893
+ .rs-foot { padding: 10px 14px; flex-direction: column-reverse; align-items: stretch; }
894
+ .rs-foot > * { text-align: center; }
895
+ }