@jossuealcala/madre 0.3.2 → 0.4.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/CHANGELOG.md +425 -0
- package/CONTRIBUTING.md +6 -1
- package/README.md +67 -183
- package/SECURITY.md +2 -1
- package/bin/madre.mjs +56 -13
- package/docs/INTERNALS.md +16 -0
- package/docs/REFERENCE.md +249 -0
- package/docs/SDK.md +121 -0
- package/docs/room.png +0 -0
- package/docs/sdk/hello-module.mjs +51 -0
- package/package.json +9 -1
- package/public/app.js +3880 -849
- package/public/es.js +2050 -0
- package/public/i18n.js +66 -0
- package/public/index.html +95 -14
- package/public/inquiry.js +220 -0
- package/public/resay.js +77 -0
- package/public/styles.css +626 -68
- package/public/troubleshooting.js +173 -51
- package/src/adapters/claude.mjs +13 -6
- package/src/adapters/codex.mjs +17 -13
- package/src/adapters/gemini.mjs +27 -16
- package/src/adapters/opencode.mjs +16 -12
- package/src/adapters/process.mjs +17 -5
- package/src/asking.mjs +128 -0
- package/src/auth-probe.mjs +58 -1
- package/src/capabilities.mjs +4 -3
- package/src/chats.mjs +193 -0
- package/src/checkpoint.mjs +1 -1
- package/src/cold.mjs +56 -0
- package/src/commands.mjs +31 -3
- package/src/conversation-context.mjs +35 -3
- package/src/credentials.mjs +145 -0
- package/src/dataset.mjs +56 -4
- package/src/distiller.mjs +12 -5
- package/src/event-store.mjs +14 -8
- package/src/exam.mjs +240 -0
- package/src/extensions.mjs +3 -2
- package/src/eyecat-watch.mjs +100 -0
- package/src/eyecat.mjs +169 -0
- package/src/i18n.mjs +47 -0
- package/src/image-studio.mjs +2 -0
- package/src/launch.mjs +61 -0
- package/src/lease.mjs +5 -3
- package/src/maturity.mjs +94 -0
- package/src/mcp/image-server.mjs +12 -1
- package/src/mcp/memory-server.mjs +1 -1
- package/src/memory.mjs +325 -17
- package/src/modules/ahp.mjs +9 -7
- package/src/modules/ash.mjs +36 -0
- package/src/modules/git-pulse.mjs +6 -4
- package/src/modules/helpers.mjs +31 -0
- package/src/modules/image-studio.mjs +9 -4
- package/src/modules/index.mjs +143 -5
- package/src/modules/ollama.mjs +66 -10
- package/src/modules/playwright.mjs +90 -0
- package/src/modules/ripley.mjs +5 -3
- package/src/modules/sdk.mjs +104 -2
- package/src/modules/updates.mjs +81 -0
- package/src/ollama.mjs +5 -2
- package/src/outbound.mjs +292 -0
- package/src/privacy.mjs +54 -7
- package/src/room/context.mjs +4 -4
- package/src/room/control.mjs +4 -4
- package/src/room/economy.mjs +161 -0
- package/src/room/prompt.mjs +118 -43
- package/src/room.mjs +465 -58
- package/src/runtime-detection.mjs +27 -8
- package/src/server.mjs +724 -68
- package/src/setup.mjs +1 -1
- package/src/updates.mjs +17 -2
- package/src/usage-sentinel.mjs +13 -8
- package/src/verdict.mjs +74 -0
- package/src/ashcode.mjs +0 -64
- package/src/modules/ashcode.mjs +0 -28
package/public/styles.css
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
--text-3: #626a5f;
|
|
18
18
|
|
|
19
19
|
--phosphor: #9bff66; /* MOTHER */
|
|
20
|
-
--brew: #28fe14; /*
|
|
20
|
+
--brew: #28fe14; /* Terminal.app 'Homebrew' green */
|
|
21
21
|
--brew-ink: #041004;
|
|
22
22
|
--phosphor-ink: #0a1405;
|
|
23
23
|
--accent: var(--phosphor);
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
--mode-1: var(--phosphor); --mode-1-ink: var(--phosphor-ink); /* EXCHANGE · phosphor */
|
|
40
40
|
--mode-2: #ffb000; --mode-2-ink: #1a1000; /* CREATE · amber phosphor */
|
|
41
41
|
--mode-3: var(--terror); --mode-3-ink: #fff3f1; /* CONTROL · the red screen */
|
|
42
|
+
--mode-4: #8fd3ff; --mode-4-ink: #04131c; /* AIRLOCK · the cold outside */
|
|
42
43
|
}
|
|
43
44
|
@media (prefers-color-scheme: light) {
|
|
44
45
|
:root:not([data-theme="dark"]) {
|
|
@@ -65,6 +66,7 @@
|
|
|
65
66
|
--mode-0: #6f786e; --mode-0-ink: #ffffff;
|
|
66
67
|
--mode-2: #a06e00; --mode-2-ink: #ffffff;
|
|
67
68
|
--mode-3: #d81b12; --mode-3-ink: #ffffff;
|
|
69
|
+
--mode-4: #0b6fa8; --mode-4-ink: #ffffff;
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
72
|
:root[data-theme="light"] {
|
|
@@ -115,7 +117,7 @@ body {
|
|
|
115
117
|
/* The bar is the ship's console: wider than the thread so the project root, the crew and the alerts share one line. */
|
|
116
118
|
.shell > .bar { width: min(1280px, 100% - 40px); }
|
|
117
119
|
.shell > .bar { grid-row: 1; } .shell > .onboarding { grid-row: 2; } .shell > .thread { grid-row: 3; } .shell > .composer { grid-row: 4; } .shell > .safety { grid-row: 5; }
|
|
118
|
-
.shell > .bar, .shell > .onboarding, .shell > .thread, .shell > .composer, .shell > .safety, .shell > .tree { grid-column: 1; }
|
|
120
|
+
.shell > .bar, .shell > .onboarding, .shell > .thread, .shell > .composer, .shell > .safety, .shell > .tree, .shell > .chats-button { grid-column: 1; }
|
|
119
121
|
.visually-hidden { position: absolute !important; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
|
|
120
122
|
|
|
121
123
|
/* ================= bar ================= */
|
|
@@ -127,6 +129,7 @@ body {
|
|
|
127
129
|
color: var(--text-2);
|
|
128
130
|
}
|
|
129
131
|
.bar-left { display: flex; align-items: center; gap: 14px; min-width: 0; flex: 1 1 auto; }
|
|
132
|
+
.bar-left .project + .project { margin-left: -6px; }
|
|
130
133
|
.brand { display: flex; align-items: center; gap: 10px; color: var(--text); font-weight: 700; letter-spacing: .22em; font-size: 11px; text-decoration: none; cursor: pointer; }
|
|
131
134
|
.brand:hover .brand-mark { filter: drop-shadow(0 0 10px var(--phosphor)); } .brand:hover .brand-word { color: var(--phosphor); }
|
|
132
135
|
.brand-mark { width: 64px; height: 18px; color: var(--phosphor); overflow: visible; filter: drop-shadow(0 0 6px color-mix(in srgb, var(--phosphor) 55%, transparent)); }
|
|
@@ -142,7 +145,7 @@ body {
|
|
|
142
145
|
.brand-mark .beat-dot { animation: none; opacity: 1; }
|
|
143
146
|
.brand-word { animation: none; opacity: 1; transform: none; }
|
|
144
147
|
}
|
|
145
|
-
.project { flex:
|
|
148
|
+
.project { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); }
|
|
146
149
|
.update-command { display: flex; align-items: center; gap: 10px; margin: 8px 0; padding: 8px 10px; border: 1px solid var(--line); border-radius: 10px; background: color-mix(in srgb, var(--text) 4%, transparent); }
|
|
147
150
|
.update-command code { flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap; font-family: var(--mono); font-size: 11.5px; color: var(--text); }
|
|
148
151
|
.update-command button { font: inherit; font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; text-transform: uppercase; border: 1px solid var(--line); background: transparent; color: var(--text-2); border-radius: 8px; padding: 4px 10px; cursor: pointer; }
|
|
@@ -213,7 +216,9 @@ code { font-family: var(--mono); font-size: .9em; color: var(--phosphor); backgr
|
|
|
213
216
|
.row.compact .avatar { visibility: hidden; }
|
|
214
217
|
.row.user { grid-template-columns: 1fr; align-self: flex-end; justify-items: end; }
|
|
215
218
|
.row .col { display: grid; gap: 6px; min-width: 0; }
|
|
216
|
-
.who { font-family: var(--mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--agent, var(--text-2)); margin: 0 0 2px 12px; display: flex; gap: 10px; align-items: baseline; }
|
|
219
|
+
.who { font-family: var(--mono); font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--agent, var(--text-2)); margin: 0 0 2px 12px; display: flex; gap: 10px; align-items: baseline; min-width: 0; }
|
|
220
|
+
/* The quoted line gives way first: the cost and who spoke are short and must not be pushed out. */
|
|
221
|
+
.who .reply { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
217
222
|
.user .who { color: var(--text-3); margin: 0 12px 2px 0; justify-content: flex-end; }
|
|
218
223
|
.user .who b { color: var(--phosphor); font-weight: 600; }
|
|
219
224
|
.user.expendable .who b { color: var(--crit); }
|
|
@@ -267,6 +272,10 @@ code { font-family: var(--mono); font-size: .9em; color: var(--phosphor); backgr
|
|
|
267
272
|
@keyframes status-in { from { opacity: 0; transform: translateY(3px); } to { opacity: 1; transform: none; } }
|
|
268
273
|
@keyframes cursor-blink { 50% { opacity: 0; } }
|
|
269
274
|
.row.thinking .elapsed { font-family: var(--mono); font-size: 10px; letter-spacing: .08em; color: var(--text-3); margin-left: 8px; }
|
|
275
|
+
/* What a turn is reading, while it reads it, and what it was charged once it is done. */
|
|
276
|
+
.row.thinking .tokens { font-family: var(--mono); font-size: 10px; letter-spacing: .08em; color: var(--text-3); margin-left: 8px; opacity: .75; }
|
|
277
|
+
/* What a reply cost, on the same line as everything else above the bubble: no pill, no wrap. */
|
|
278
|
+
.who .spent { flex: none; margin-left: auto; padding: 0; border: 0; background: none; font-family: var(--mono); font-size: 10px; letter-spacing: .04em; color: var(--text-3); white-space: nowrap; }
|
|
270
279
|
.row.thinking .elapsed.late { color: var(--warn); }
|
|
271
280
|
.row.thinking i { width: 7px; height: 7px; border-radius: 50%; background: var(--agent, var(--text-2)); animation: bounce 1.2s infinite; opacity: .5; }
|
|
272
281
|
.row.thinking i:nth-child(2) { animation-delay: .18s; } .row.thinking i:nth-child(3) { animation-delay: .36s; }
|
|
@@ -287,18 +296,20 @@ code { font-family: var(--mono); font-size: .9em; color: var(--phosphor); backgr
|
|
|
287
296
|
.system.memory .brief { text-transform: none; letter-spacing: 0; color: var(--text-2); }
|
|
288
297
|
|
|
289
298
|
/* NOSTROMO: the archive as a small solar system. One colour per kind of memory. */
|
|
290
|
-
:root { --mem-decision: #
|
|
299
|
+
:root { --mem-decision: #ffdc3c; --mem-fact: #dfeeff; --mem-preference: #5cf07a; --mem-question: #3dc6ff; --mem-aberration: #b14cff; --nostromo-sun: #ff2a1f; }
|
|
291
300
|
.nostromo-button { color: var(--terror); border-color: color-mix(in srgb, var(--terror) 55%, transparent); }
|
|
292
301
|
.nostromo-button:hover { background: color-mix(in srgb, var(--terror) 14%, transparent); }
|
|
293
302
|
dialog.nostromo { color: #eef1ea; }
|
|
294
303
|
dialog.nostromo::backdrop { background: #000; }
|
|
295
304
|
.nostromo-frame { --ph: #ffb4ad; --ph-dim: rgba(255, 42, 31, .55); --ph-faint: rgba(255, 42, 31, .16); position: relative; height: 100%; background: #030203; font-family: var(--mono); overflow: hidden; display: grid; grid-template-rows: auto 1fr; }
|
|
296
|
-
.nostromo-head { display: grid; grid-template-columns: auto 1fr auto auto
|
|
305
|
+
.nostromo-head { display: grid; grid-template-columns: auto 1fr; grid-auto-flow: column; grid-auto-columns: max-content; gap: 18px; align-items: center; padding: 18px 26px 14px; border-bottom: 1px solid var(--ph-faint); color: var(--ph); position: relative; z-index: 2; }
|
|
297
306
|
.nostromo-head .mother-title { color: var(--nostromo-sun); text-shadow: 0 0 18px color-mix(in srgb, var(--nostromo-sun) 60%, transparent); }
|
|
298
|
-
.nostromo-head .mother-sub { color: var(--ph-dim); }
|
|
299
|
-
.nostromo-legend { display: flex; gap:
|
|
300
|
-
.nostromo-legend .k {
|
|
301
|
-
.nostromo-legend .k
|
|
307
|
+
.nostromo-head .mother-sub { color: var(--ph-dim); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
308
|
+
.nostromo-legend { display: flex; gap: 16px; align-items: center; }
|
|
309
|
+
.nostromo-legend .k { display: inline-flex; align-items: center; gap: 6px; font-size: 9px; letter-spacing: .16em; }
|
|
310
|
+
.nostromo-legend .k canvas { display: block; }
|
|
311
|
+
.nostromo-legend .k i { font-style: normal; }
|
|
312
|
+
.nostromo-legend .k.decision { color: var(--mem-decision); } .nostromo-legend .k.fact { color: var(--mem-fact); } .nostromo-legend .k.preference { color: var(--mem-preference); } .nostromo-legend .k.question { color: var(--mem-question); } .nostromo-legend .k.aberration { color: var(--mem-aberration); }
|
|
302
313
|
.nostromo-frame .mother-close { color: var(--ph); border-color: var(--ph-dim); }
|
|
303
314
|
.nostromo-frame .mother-close:hover { background: var(--ph-faint); }
|
|
304
315
|
.nostromo-canvas { display: block; width: 100%; height: 100%; cursor: crosshair; }
|
|
@@ -323,16 +334,192 @@ dialog.nostromo::backdrop { background: #000; }
|
|
|
323
334
|
.nostromo-card .text { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", Inter, sans-serif; font-size: 14px; line-height: 1.5; color: #eef1ea; }
|
|
324
335
|
.nostromo-card .meta { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 4px 14px; font-size: 10px; letter-spacing: .1em; }
|
|
325
336
|
.nostromo-card .meta dt { color: var(--ph-dim); } .nostromo-card .meta dd { margin: 0; color: #c9c2bf; }
|
|
337
|
+
/* What this memory is wired to, and what has actually passed between it and the room. The list
|
|
338
|
+
is the same set of wires the map draws: hovering a row lights its filament out there. */
|
|
339
|
+
.nostromo-card .wire { display: grid; gap: 7px; border-top: 1px solid rgba(255, 255, 255, .08); padding-top: 11px; }
|
|
340
|
+
.nostromo-card .wire h6 { margin: 0; font-size: 9px; font-weight: 400; letter-spacing: .22em; color: var(--ph-dim); display: flex; align-items: center; gap: 8px; }
|
|
341
|
+
.nostromo-card .wire h6 .n { color: #c9c2bf; }
|
|
342
|
+
.nostromo-card .wire h6 .live { color: var(--kind, var(--ph)); font-size: 7px; animation: blink 2.4s steps(1) infinite; margin-left: auto; }
|
|
343
|
+
.nostromo-card .exchange { margin: 0; white-space: pre-line; font-size: 10.5px; line-height: 1.6; letter-spacing: .06em; color: #c9c2bf; }
|
|
344
|
+
.nostromo-card .wires { margin: 0; padding: 0; list-style: none; display: grid; gap: 4px; max-height: 148px; overflow-y: auto; }
|
|
345
|
+
.nostromo-card .wires .none { font-size: 10px; letter-spacing: .08em; color: var(--ph-dim); padding: 2px 0; }
|
|
346
|
+
.nostromo-card .wire-row { display: grid; grid-template-columns: 8px minmax(0, 1fr) auto; gap: 8px; align-items: center; padding: 4px 6px 4px 2px; cursor: pointer; border: 1px solid transparent; }
|
|
347
|
+
.nostromo-card .wire-row:hover { border-color: rgba(255, 255, 255, .16); background: rgba(255, 255, 255, .04); }
|
|
348
|
+
.nostromo-card .wire-row i { width: 7px; height: 7px; border-radius: 50%; background: var(--kind, var(--ph)); box-shadow: 0 0 8px var(--kind, var(--ph)); }
|
|
349
|
+
.nostromo-card .wire-row .what { font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", Inter, sans-serif; font-size: 11.5px; line-height: 1.4; color: #d7d2cf; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
350
|
+
.nostromo-card .wire-row b { font-family: var(--mono); font-size: 9px; font-weight: 600; letter-spacing: .08em; color: var(--ph-dim); }
|
|
351
|
+
.nostromo-card .wire-row.refuted b { color: var(--nostromo-sun); }
|
|
352
|
+
/* Company strong enough that recalling one now brings the other: the association is live. */
|
|
353
|
+
/* What to ask next: a panel on the other side of the map from the memory card, so the two can
|
|
354
|
+
be open one after the other and never fight for the same corner. */
|
|
355
|
+
.nostromo-card.asks { right: auto; left: 26px; width: min(420px, calc(100vw - 52px)); border-color: rgba(255, 255, 255, .14); }
|
|
356
|
+
.nostromo-card.asks .kind { color: #d7d2cf; text-shadow: none; }
|
|
357
|
+
.nostromo-card.asks .foot { margin: 0; }
|
|
358
|
+
.asks-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 10px; max-height: min(58vh, 520px); overflow-y: auto; }
|
|
359
|
+
.asks-list .none { font-size: 11px; letter-spacing: .06em; color: var(--ph-dim); }
|
|
360
|
+
.asks-list .ask { display: grid; gap: 6px; padding: 11px 12px; border: 1px solid rgba(255, 255, 255, .1); border-left: 2px solid var(--well, rgba(255, 255, 255, .3)); background: rgba(255, 255, 255, .03); }
|
|
361
|
+
.asks-list .ask-open { --well: #3dc6ff; }
|
|
362
|
+
.asks-list .ask-cold { --well: #96b0c6; }
|
|
363
|
+
.asks-list .ask-thin { --well: #ffdc3c; }
|
|
364
|
+
.asks-list .ask .q { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", Inter, sans-serif; font-size: 13px; line-height: 1.5; color: #eef1ea; }
|
|
365
|
+
.asks-list .ask .why { margin: 0; font-family: var(--mono); font-size: 8.5px; letter-spacing: .12em; line-height: 1.5; color: var(--ph-dim); }
|
|
366
|
+
.asks-list .ask .actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 2px; }
|
|
367
|
+
.asks-list .ask button { border: 1px solid rgba(255, 255, 255, .22); background: transparent; color: #d7d2cf; font: inherit; font-size: 9px; letter-spacing: .16em; padding: 6px 10px; cursor: pointer; }
|
|
368
|
+
.asks-list .ask button.primary { border-color: var(--well); color: var(--well); }
|
|
369
|
+
.asks-list .ask button:hover { background: rgba(255, 255, 255, .06); }
|
|
370
|
+
.asks-list .ask button:disabled { opacity: .45; cursor: default; }
|
|
371
|
+
.nostromo-head .mother-close.ask { color: #d7d2cf; border-color: rgba(255, 255, 255, .28); }
|
|
372
|
+
.nostromo-head .mother-close.ask[aria-pressed="true"] { background: rgba(255, 255, 255, .12); color: #fff; }
|
|
373
|
+
|
|
374
|
+
/* ================= the core =================
|
|
375
|
+
Inside the star, not looking at it: the field burns from the edges inward and breathes, and
|
|
376
|
+
the console sits on top of it in the panel's own phosphor. Nothing here is a new language —
|
|
377
|
+
the frame, the folds, the bars and the type are the ones MADRE already speaks. */
|
|
378
|
+
/* The core opens from inside NOSTROMO, on top of the star itself: the field behind this frame is
|
|
379
|
+
the real one, still turning and still breathing. A second sun drawn here would be two. */
|
|
380
|
+
.core::backdrop { background: radial-gradient(circle at 50% 50%, rgba(30, 2, 0, .58), rgba(0, 0, 0, .86) 72%); }
|
|
381
|
+
.core .mother-frame { position: relative; z-index: 1; border-color: color-mix(in srgb, var(--nostromo-sun) 45%, var(--ph-dim)); box-shadow: 0 0 60px rgba(226, 40, 22, .22), 0 0 0 1px rgba(0, 0, 0, .6); }
|
|
382
|
+
.core .mother-title { color: var(--nostromo-sun); text-shadow: 0 0 20px color-mix(in srgb, var(--nostromo-sun) 55%, transparent); }
|
|
383
|
+
.core .mother-foot a { color: var(--ph-dim); text-decoration: none; }
|
|
384
|
+
.core .mother-foot a:hover { color: var(--ph); }
|
|
385
|
+
.core .mother-frame { display: grid; grid-template-rows: auto auto 1fr; overflow: hidden; padding-bottom: 18px; }
|
|
386
|
+
.core .mother-boot { margin: 12px 0 6px; min-height: 2.4em; font-size: 11px; }
|
|
387
|
+
.core-body { display: grid; grid-template-rows: auto auto minmax(0, 1fr) auto; gap: 10px; min-height: 0; }
|
|
388
|
+
|
|
389
|
+
/* The strip: who it goes to, at what mode, and around what. One line each, never a paragraph. */
|
|
390
|
+
.core-strip { display: grid; gap: 6px; border-bottom: 1px solid var(--ph-faint); padding-bottom: 10px; }
|
|
391
|
+
.core-pick { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 10px; }
|
|
392
|
+
.core-pick .k, .core-asking .k { font-size: 8.5px; letter-spacing: .22em; color: var(--ph-dim); }
|
|
393
|
+
.core-agents { display: flex; flex-wrap: wrap; gap: 4px; }
|
|
394
|
+
.core-agent { border: 1px solid var(--ph-faint); background: transparent; color: var(--ph-dim); font: inherit; font-size: 10px; letter-spacing: .12em; padding: 3px 8px; cursor: pointer; }
|
|
395
|
+
.core-agent:hover { border-color: var(--ph-dim); color: var(--ph); }
|
|
396
|
+
.core-agent.on { border-color: var(--ph); color: var(--ph); background: var(--ph-faint); }
|
|
397
|
+
.core-agent.cold { opacity: .55; }
|
|
398
|
+
.core-pick select { border: 1px solid var(--ph-faint); background: #000; color: var(--ph); font: inherit; font-size: 10px; letter-spacing: .12em; padding: 3px 6px; }
|
|
399
|
+
.core-ceiling { font-family: var(--mono); font-size: 8.5px; letter-spacing: .14em; color: var(--warn); }
|
|
400
|
+
.core-asking { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 10px; }
|
|
401
|
+
.core-asking textarea { width: 100%; resize: none; border: 0; border-bottom: 1px solid var(--ph-faint); background: transparent; color: var(--ph); font: inherit; font-family: var(--mono); font-size: 11.5px; line-height: 1.6; padding: 3px 0; }
|
|
402
|
+
.core-asking textarea::placeholder { color: var(--ph-dim); opacity: .7; }
|
|
403
|
+
.core-asking textarea:focus { outline: 0; border-bottom-color: var(--ph); }
|
|
404
|
+
.core-asking .note { font-size: 8px; letter-spacing: .14em; color: var(--ph-dim); white-space: nowrap; }
|
|
405
|
+
|
|
406
|
+
/* Four panes, one at a time, each tab carrying what is behind it. */
|
|
407
|
+
.core-tabs { display: flex; flex-wrap: wrap; gap: 2px; }
|
|
408
|
+
.core-tab { display: grid; gap: 1px; text-align: left; border: 1px solid transparent; border-bottom: 1px solid var(--ph-faint); background: transparent; color: var(--ph-dim); font: inherit; padding: 6px 12px; cursor: pointer; }
|
|
409
|
+
.core-tab b { font-size: 10px; font-weight: 600; letter-spacing: .18em; }
|
|
410
|
+
.core-tab .meta { font-size: 8.5px; letter-spacing: .1em; opacity: .8; }
|
|
411
|
+
.core-tab:hover { color: var(--ph); }
|
|
412
|
+
.core-tab.on { color: var(--ph); border-color: var(--ph-faint); border-bottom-color: transparent; background: rgba(0, 0, 0, .45); }
|
|
413
|
+
.core-panes { overflow: auto; min-height: 0; padding: 4px 2px 8px; transition: opacity .18s ease; }
|
|
414
|
+
.core-panes.reading { opacity: .45; }
|
|
415
|
+
.core-pane { display: grid; gap: 10px; align-content: start; min-width: 0; }
|
|
416
|
+
.core-pane > *, .core-blocks, .core-block { min-width: 0; }
|
|
417
|
+
|
|
418
|
+
/* `==> TITLE meta`, and facts in two columns: how the terminal this frame is dressed as prints. */
|
|
419
|
+
.brew-head { margin: 6px 0 0; display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px; font-family: var(--mono); font-size: 9px; letter-spacing: .14em; text-transform: uppercase; }
|
|
420
|
+
.brew-head b { color: var(--nostromo-sun); text-shadow: none; letter-spacing: 0; }
|
|
421
|
+
.brew-head .title { color: var(--ph); font-size: 10px; letter-spacing: .2em; }
|
|
422
|
+
.brew-head .meta { color: var(--ph-dim); }
|
|
423
|
+
.brew-rows { display: grid; gap: 4px; }
|
|
424
|
+
.brew-row { display: grid; grid-template-columns: 190px minmax(0, 1fr); gap: 14px; align-items: baseline; }
|
|
425
|
+
.brew-row .k { font-family: var(--mono); font-size: 9px; letter-spacing: .14em; color: var(--ph-dim); text-transform: uppercase; }
|
|
426
|
+
.brew-row .v { font-family: var(--mono); font-size: 10.5px; line-height: 1.6; color: rgba(210, 255, 190, .88); text-shadow: none; }
|
|
427
|
+
.brew-row .v .where { color: var(--ph-dim); }
|
|
428
|
+
|
|
429
|
+
.core-doc, .core-launch, .core-outbound { display: grid; gap: 10px; }
|
|
430
|
+
.core-blocks { display: grid; gap: 1px; }
|
|
431
|
+
.core-block { border: 1px solid transparent; }
|
|
432
|
+
.core-block > summary { display: grid; grid-template-columns: 14px 148px 72px minmax(140px, 1.1fr) minmax(0, 1.4fr); gap: 14px; align-items: center; padding: 5px 6px; cursor: pointer; list-style: none; }
|
|
433
|
+
.core-block > summary::-webkit-details-marker { display: none; }
|
|
434
|
+
.core-block:hover { border-color: var(--ph-faint); }
|
|
435
|
+
.core-block[open] { border-color: var(--ph-faint); background: rgba(0, 0, 0, .35); }
|
|
436
|
+
.core-block > summary .sign { font-style: normal; font-size: 11px; color: var(--nostromo-sun); text-shadow: none; }
|
|
437
|
+
.core-block > summary b { font-size: 9.5px; font-weight: 600; letter-spacing: .16em; color: var(--ph); text-shadow: none; }
|
|
438
|
+
.core-block > summary .n { font-family: var(--mono); font-size: 9px; letter-spacing: .1em; color: var(--ph-dim); text-align: right; }
|
|
439
|
+
.core-block > summary .weigh { height: 6px; background: var(--ph-faint); position: relative; }
|
|
440
|
+
.core-block > summary .weigh::after { content: ''; position: absolute; inset: 0 auto 0 0; width: var(--fill, 0%); background: color-mix(in srgb, var(--nostromo-sun) 55%, var(--ph)); }
|
|
441
|
+
.core-block > summary .when { font-size: 8.5px; letter-spacing: .1em; color: var(--ph-dim); text-transform: uppercase; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
442
|
+
.core-text { position: relative; padding: 4px 8px 12px; }
|
|
443
|
+
.core-from { margin: 0 0 8px; font-family: var(--mono); font-size: 9px; letter-spacing: .12em; line-height: 1.7; color: var(--ph-dim); text-transform: uppercase; }
|
|
444
|
+
.core-from b { color: var(--ph); letter-spacing: .2em; margin-right: 8px; }
|
|
445
|
+
.core-from .where { color: rgba(210, 255, 190, .72); }
|
|
446
|
+
.core-text pre { margin: 0; max-height: 40vh; overflow: auto; padding: 12px 14px; border: 1px solid var(--ph-faint); background: #000; font-family: var(--mono); font-size: 11.5px; line-height: 1.65; white-space: pre-wrap; overflow-wrap: anywhere; color: rgba(210, 255, 190, .92); text-shadow: none; }
|
|
447
|
+
.core-copy-one { position: absolute; top: 12px; right: 18px; border: 1px solid var(--ph-faint); background: #000; color: var(--ph-dim); font: inherit; font-size: 8.5px; letter-spacing: .16em; padding: 4px 8px; cursor: pointer; }
|
|
448
|
+
.core-copy-one:hover { color: var(--ph); border-color: var(--ph-dim); }
|
|
449
|
+
.core-fixed { margin: 0; font-family: var(--mono); font-size: 9px; letter-spacing: .12em; line-height: 1.7; color: var(--ph-dim); border-left: 2px solid color-mix(in srgb, var(--nostromo-sun) 60%, transparent); padding-left: 12px; }
|
|
450
|
+
.core-pane .note { margin: 0; font-size: 8.5px; letter-spacing: .12em; line-height: 1.7; color: var(--ph-dim); }
|
|
451
|
+
|
|
452
|
+
/* THE LAUNCH: the command under the document, printed as it would be run. */
|
|
453
|
+
.core-launch .mother-cmd { margin: 0; }
|
|
454
|
+
.core-launch .mother-cmd pre { max-height: 32vh; overflow: auto; font-size: 11px; color: rgba(210, 255, 190, .92); text-shadow: none; }
|
|
455
|
+
.core-server .tools { display: inline-flex; flex-wrap: wrap; gap: 4px; margin-left: 6px; vertical-align: middle; }
|
|
456
|
+
.core-server .tools i { font-style: normal; font-size: 8.5px; letter-spacing: .1em; color: var(--ph-dim); border: 1px solid var(--ph-faint); padding: 1px 5px; }
|
|
457
|
+
|
|
458
|
+
/* WHAT LEFT THIS MACHINE: the declaration, and the log that checks it. */
|
|
459
|
+
.core-egress { display: grid; gap: 2px; }
|
|
460
|
+
.egress { display: grid; grid-template-columns: 52px minmax(120px, 1fr) auto; gap: 4px 12px; align-items: baseline; padding: 8px; border: 1px solid transparent; }
|
|
461
|
+
.egress:hover { border-color: var(--ph-faint); background: rgba(0, 0, 0, .3); }
|
|
462
|
+
.egress .state { font-family: var(--mono); font-size: 8.5px; letter-spacing: .16em; color: var(--nostromo-sun); text-shadow: none; }
|
|
463
|
+
.egress.off .state { color: var(--ph-dim); }
|
|
464
|
+
.egress.local .state { color: #96b0c6; }
|
|
465
|
+
.egress > b { font-size: 10px; letter-spacing: .1em; color: var(--ph); text-shadow: none; }
|
|
466
|
+
.egress .n { font-family: var(--mono); font-size: 8.5px; letter-spacing: .12em; color: var(--ph-dim); text-align: right; white-space: nowrap; }
|
|
467
|
+
.egress .what, .egress .when { grid-column: 2 / -1; margin: 0; font-family: var(--mono); font-size: 10.5px; line-height: 1.6; color: rgba(210, 255, 190, .86); text-shadow: none; }
|
|
468
|
+
.egress .when { font-size: 9px; letter-spacing: .1em; color: var(--ph-dim); text-transform: uppercase; }
|
|
469
|
+
.egress .when i { font-style: normal; }
|
|
470
|
+
.egress .when .where { color: rgba(210, 255, 190, .72); }
|
|
471
|
+
.egress.off { opacity: .55; }
|
|
472
|
+
.egress.off:hover { opacity: 1; }
|
|
473
|
+
pre.core-egress-log { margin: 0; max-height: 34vh; overflow: auto; padding: 10px 12px; border: 1px solid var(--ph-faint); background: #000; font-family: var(--mono); font-size: 10.5px; line-height: 1.6; white-space: pre; color: rgba(210, 255, 190, .92); text-shadow: none; }
|
|
474
|
+
|
|
475
|
+
/* The prompt: always at the bottom, the way through all four panes. */
|
|
476
|
+
.console-log { margin: 0; font-family: var(--mono); font-size: 11.5px; line-height: 1.6; white-space: pre-wrap; overflow-wrap: anywhere; color: rgba(210, 255, 190, .92); text-shadow: none; }
|
|
477
|
+
.console-log .said { color: var(--ph-dim); }
|
|
478
|
+
.console-log .refused { color: var(--warn); }
|
|
479
|
+
.console-line { display: flex; align-items: center; gap: 8px; border-top: 1px solid var(--ph-dim); padding-top: 10px; }
|
|
480
|
+
.console-line .prompt { font-family: var(--mono); font-size: 13px; color: var(--nostromo-sun); text-shadow: none; }
|
|
481
|
+
.console-line input { flex: 1; min-width: 0; border: 0; background: transparent; color: var(--ph); font: inherit; font-family: var(--mono); font-size: 12px; letter-spacing: .06em; text-transform: uppercase; padding: 2px 0; }
|
|
482
|
+
.console-line input:focus { outline: 0; }
|
|
483
|
+
.console-line input::placeholder { color: var(--ph-dim); opacity: .7; letter-spacing: .14em; }
|
|
484
|
+
.console-line input:disabled { opacity: .4; }
|
|
485
|
+
.console-strikes { display: inline-flex; gap: 3px; }
|
|
486
|
+
.console-strikes i { font-style: normal; font-size: 9px; color: var(--ph-faint); }
|
|
487
|
+
.console-strikes i.on { color: var(--warn); }
|
|
488
|
+
.console-help { border: 1px solid var(--ph-faint); background: transparent; color: var(--ph-dim); font: inherit; font-size: 8.5px; letter-spacing: .16em; padding: 3px 8px; cursor: pointer; }
|
|
489
|
+
.console-help:hover { color: var(--ph); border-color: var(--ph-dim); }
|
|
490
|
+
|
|
491
|
+
@media (max-width: 720px) {
|
|
492
|
+
.core-block > summary { grid-template-columns: 14px 1fr auto; }
|
|
493
|
+
.core-block > summary .weigh, .core-block > summary .when { display: none; }
|
|
494
|
+
.brew-row { grid-template-columns: 1fr; gap: 2px; }
|
|
495
|
+
.egress { grid-template-columns: 52px 1fr; }
|
|
496
|
+
.egress .n { grid-column: 1 / -1; text-align: left; }
|
|
497
|
+
.core-asking { grid-template-columns: 1fr; }
|
|
498
|
+
.core-asking .note { display: none; }
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/* The cold zone: a colour that is not a memory kind and not the sun, so it never reads as life. */
|
|
502
|
+
.nostromo-head .mother-close.cold { color: #96b0c6; border-color: color-mix(in srgb, #96b0c6 45%, transparent); }
|
|
503
|
+
.nostromo-head .mother-close.cold[aria-pressed="true"] { background: color-mix(in srgb, #96b0c6 16%, transparent); color: #cfe0ec; }
|
|
504
|
+
.nostromo-card .wire-row.carries b { color: var(--kind, var(--ph)); }
|
|
505
|
+
.nostromo-card .wire-row.carries b::after { content: ' ⇢'; }
|
|
326
506
|
.nostromo-card .forget { border: 1px solid var(--nostromo-sun); background: transparent; color: var(--nostromo-sun); font: inherit; font-size: 10px; letter-spacing: .18em; padding: 9px 12px; cursor: pointer; transition: background .2s; }
|
|
327
507
|
.nostromo-card .forget:hover { background: color-mix(in srgb, var(--nostromo-sun) 14%, transparent); }
|
|
328
508
|
.nostromo-card .forget.confirm { background: var(--nostromo-sun); color: #fff3f1; animation: blink 1s steps(1) infinite; }
|
|
329
509
|
.nostromo-card .forget:disabled { opacity: .5; cursor: default; animation: none; }
|
|
330
510
|
.nostromo-card .foot { margin: 0; font-size: 9px; letter-spacing: .1em; color: var(--ph-dim); line-height: 1.5; }
|
|
331
511
|
.nostromo-empty { position: absolute; inset: 50% 0 auto 0; margin: 0; text-align: center; font-size: 11px; letter-spacing: .22em; color: var(--ph-dim); }
|
|
332
|
-
@media (max-width: 720px) { .nostromo-head { grid-template-columns: auto 1fr
|
|
512
|
+
@media (max-width: 720px) { .nostromo-head { grid-template-columns: auto 1fr; gap: 10px; } .nostromo-legend { display: none; } .nostromo-card { right: 16px; left: 16px; width: auto; } }
|
|
333
513
|
.system.memory.forgotten { color: var(--terror); }
|
|
334
514
|
.system.memory.privacy { color: var(--warn); }
|
|
335
|
-
|
|
515
|
+
/* The list of terms is the subject of this form, so it gets the whole width instead of a cell
|
|
516
|
+
beside the marker, where it was three lines wide and unreadable. */
|
|
517
|
+
.privacy-form { grid-template-columns: 1fr minmax(160px, 260px); }
|
|
518
|
+
.privacy-form > label:first-child { grid-column: 1 / -1; }
|
|
519
|
+
.privacy-form textarea { min-height: 76px; resize: vertical; line-height: 1.5; }
|
|
520
|
+
.privacy-form .toggle { align-items: flex-start; line-height: 1.5; text-transform: none; letter-spacing: .1em; }
|
|
521
|
+
.privacy-form .toggle input { margin: 2px 0 0; flex: none; }
|
|
522
|
+
@media (max-width: 720px) { .privacy-form { grid-template-columns: 1fr; } }
|
|
336
523
|
.system.mother-alert { display: grid; gap: 6px; justify-items: center; max-width: min(720px, 92%); padding: 12px 16px; border: 1px solid color-mix(in srgb, var(--terror) 60%, transparent); border-radius: 12px; background: color-mix(in srgb, var(--terror) 7%, transparent); color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 45%, transparent); }
|
|
337
524
|
.system.mother-alert .head b { color: var(--terror); font-weight: 700; }
|
|
338
525
|
.system.mother-alert .clear { color: var(--text); text-shadow: none; text-transform: none; letter-spacing: 0; font-size: 12px; }
|
|
@@ -344,6 +531,13 @@ dialog.nostromo::backdrop { background: #000; }
|
|
|
344
531
|
.memory-hint .pill b { font-family: var(--mono); font-size: 9px; letter-spacing: .16em; text-transform: uppercase; color: var(--kind); }
|
|
345
532
|
.memory-hint .pill:hover { background: color-mix(in srgb, var(--kind) 18%, transparent); color: var(--text); }
|
|
346
533
|
.memory-hint .more { font-family: var(--mono); font-size: 9.5px; color: var(--text-3); }
|
|
534
|
+
/* Memory used is not memory saved: saving is an event, using happens on most turns. Same shape so
|
|
535
|
+
there is one thing to learn, quieter so it never competes with the answer it helped write. */
|
|
536
|
+
.memory-hint.used { margin-top: 4px; opacity: .78; animation: none; }
|
|
537
|
+
.memory-hint.used:hover { opacity: 1; }
|
|
538
|
+
.memory-hint.used .lead { color: var(--text-3); }
|
|
539
|
+
.memory-hint.used .pill { animation: none; box-shadow: none; font-size: 10.5px; padding: 2px 9px; }
|
|
540
|
+
.memory-hint.used .pill.carried b::after { content: ' ⇢'; }
|
|
347
541
|
@keyframes hint-in { from { opacity: 0; transform: translateY(4px); } to { opacity: 1; transform: none; } }
|
|
348
542
|
@keyframes hint-glow { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--kind) 55%, transparent); } 40% { box-shadow: 0 0 0 6px color-mix(in srgb, var(--kind) 0%, transparent), 0 0 18px color-mix(in srgb, var(--kind) 45%, transparent); } 100% { box-shadow: 0 0 0 0 transparent; } }
|
|
349
543
|
@media (prefers-reduced-motion: reduce) { .memory-hint, .memory-hint .pill { animation: none; } }
|
|
@@ -367,11 +561,6 @@ dialog.nostromo::backdrop { background: #000; }
|
|
|
367
561
|
.onboarding-eyebrow { margin: 0 0 10px; font-family: var(--mono); font-size: 10px; letter-spacing: .18em; color: var(--phosphor); }
|
|
368
562
|
.onboarding h2 { margin: 0 0 6px; font-size: 18px; letter-spacing: -.01em; font-weight: 600; }
|
|
369
563
|
.onboarding p { margin: 0 0 14px; color: var(--text-2); font-size: 13px; line-height: 1.5; }
|
|
370
|
-
.onboarding-list { list-style: none; margin: 0 0 12px; padding: 0; display: grid; gap: 6px; }
|
|
371
|
-
.onboarding-list li { display: grid; grid-template-columns: 28px 100px 1fr; gap: 12px; align-items: center; padding: 8px 10px; border: 1px solid var(--line); border-radius: 12px; font-size: 13px; }
|
|
372
|
-
.onboarding-list .name { font-weight: 600; color: var(--text); }
|
|
373
|
-
.onboarding-list .state { color: var(--text-2); font-size: 12.5px; }
|
|
374
|
-
.onboarding-list .state b { color: var(--text); font-weight: 600; }
|
|
375
564
|
.onboarding .hint { margin: 0; font-size: 12px; color: var(--text-3); }
|
|
376
565
|
|
|
377
566
|
/* ================= composer ================= */
|
|
@@ -395,6 +584,7 @@ textarea::placeholder { color: var(--text-3); }
|
|
|
395
584
|
.composer.m0 { --mode: var(--mode-0); --mode-ink: var(--mode-0-ink); }
|
|
396
585
|
.composer.m2 { --mode: var(--mode-2); --mode-ink: var(--mode-2-ink); }
|
|
397
586
|
.composer.m3 { --mode: var(--mode-3); --mode-ink: var(--mode-3-ink); }
|
|
587
|
+
.composer.m4 { --mode: var(--mode-4); --mode-ink: var(--mode-4-ink); }
|
|
398
588
|
.field button[type="submit"] { width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; background: var(--mode, var(--phosphor)); color: var(--mode-ink, var(--phosphor-ink)); cursor: pointer; display: grid; place-items: center; box-shadow: 0 0 18px color-mix(in srgb, var(--mode, var(--phosphor)) 45%, transparent); transition: background .25s, box-shadow .25s; }
|
|
399
589
|
.field button[type="submit"] svg { width: 18px; height: 18px; }
|
|
400
590
|
.field button[type="submit"]:hover { filter: brightness(1.06); }
|
|
@@ -413,8 +603,6 @@ textarea::placeholder { color: var(--text-3); }
|
|
|
413
603
|
.row { max-width: 92%; }
|
|
414
604
|
.who .reply { max-width: 150px; }
|
|
415
605
|
.system .gauge { width: 160px; }
|
|
416
|
-
.onboarding-list li { grid-template-columns: 28px 1fr; }
|
|
417
|
-
.onboarding-list .state { grid-column: 2; }
|
|
418
606
|
}
|
|
419
607
|
|
|
420
608
|
/* ================= MU/TH/UR: troubleshooting ================= */
|
|
@@ -425,13 +613,32 @@ textarea::placeholder { color: var(--text-3); }
|
|
|
425
613
|
font-family: var(--mono); font-size: 10px; letter-spacing: .18em; cursor: pointer;
|
|
426
614
|
}
|
|
427
615
|
.mother-button:hover { color: var(--phosphor); border-color: var(--phosphor); box-shadow: 0 0 14px color-mix(in srgb, var(--phosphor) 30%, transparent); }
|
|
616
|
+
/* Light mode: a halo that reads as light on a dark ground reads as a smudge on a pale one. The
|
|
617
|
+
border and the colour already say the button is live, so the light around it stays slight. */
|
|
618
|
+
@media (prefers-color-scheme: light) {
|
|
619
|
+
:root:not([data-theme="dark"]) .mother-button:hover,
|
|
620
|
+
:root:not([data-theme="dark"]) .tree-button:hover,
|
|
621
|
+
:root:not([data-theme="dark"]) .tree-button[aria-pressed="true"],
|
|
622
|
+
:root:not([data-theme="dark"]) .stop-all:hover,
|
|
623
|
+
:root:not([data-theme="dark"]) .chats-button:hover,
|
|
624
|
+
:root:not([data-theme="dark"]) .chats-button[aria-pressed="true"] { box-shadow: 0 0 5px color-mix(in srgb, var(--phosphor) 12%, transparent); }
|
|
625
|
+
}
|
|
626
|
+
:root[data-theme="light"] .mother-button:hover,
|
|
627
|
+
:root[data-theme="light"] .tree-button:hover,
|
|
628
|
+
:root[data-theme="light"] .tree-button[aria-pressed="true"],
|
|
629
|
+
:root[data-theme="light"] .stop-all:hover,
|
|
630
|
+
:root[data-theme="light"] .chats-button:hover,
|
|
631
|
+
:root[data-theme="light"] .chats-button[aria-pressed="true"] { box-shadow: 0 0 5px color-mix(in srgb, var(--phosphor) 12%, transparent); }
|
|
632
|
+
|
|
633
|
+
.lang-button { font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: .16em; padding: 0 9px; }
|
|
428
634
|
.mother-glyph { width: 8px; height: 8px; border: 1px solid currentColor; }
|
|
429
635
|
.mother-count { min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; display: inline-grid; place-items: center; background: var(--danger); color: #fff; font-size: 9px; letter-spacing: 0; }
|
|
430
636
|
|
|
431
|
-
dialog.mother { border: 0; padding: 0; margin: 0; width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; background: transparent; color:
|
|
637
|
+
dialog.mother { border: 0; padding: 0; margin: 0; width: 100vw; max-width: 100vw; height: 100dvh; max-height: 100dvh; background: transparent; color: var(--brew); }
|
|
432
638
|
dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(6px); }
|
|
433
639
|
.mother-frame {
|
|
434
|
-
|
|
640
|
+
/* Terminal.app's Homebrew profile, which is what a room like this should read as. */
|
|
641
|
+
--ph: #28fe14; --ph-dim: rgba(40, 254, 20, .52); --ph-faint: rgba(40, 254, 20, .13);
|
|
435
642
|
position: relative; height: 100%; overflow-y: auto;
|
|
436
643
|
padding: 26px clamp(16px, 5vw, 64px) 40px;
|
|
437
644
|
background:
|
|
@@ -464,6 +671,39 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
464
671
|
.mother-section h3.toggle:not(:first-child) { margin-top: 40px; }
|
|
465
672
|
.settings .room-form, .settings .conn-grid, .settings .mother-grid { margin-bottom: 8px; }
|
|
466
673
|
.mother-section h3::before { content: "▌ "; color: var(--ph); }
|
|
674
|
+
|
|
675
|
+
/* A section that folds. The summary carries the same header it always had, plus a mark on the
|
|
676
|
+
right when there is something behind it worth opening. */
|
|
677
|
+
.mother-section .fold { margin: 0; }
|
|
678
|
+
.mother-section .fold + .fold { margin-top: 26px; }
|
|
679
|
+
.mother-section .fold > summary { display: flex; align-items: baseline; gap: 10px; cursor: pointer; list-style: none; }
|
|
680
|
+
.mother-section .fold > summary::-webkit-details-marker { display: none; }
|
|
681
|
+
/* The button is a word, not a glyph: the panel already said EXPAND and COLLAPSE elsewhere. */
|
|
682
|
+
.mother-section .fold > summary .caret { margin-left: auto; font-family: var(--mono); font-size: 9px; letter-spacing: .18em; color: var(--ph); white-space: nowrap; }
|
|
683
|
+
.mother-section .fold > summary:hover h3 { color: var(--ph); }
|
|
684
|
+
.mother-section .fold > summary h3 { margin: 0 0 12px; }
|
|
685
|
+
.mother-section .fold > summary h3:not(:first-child) { margin-top: 0; padding-top: 0; border-top: 0; }
|
|
686
|
+
.fold-badge { font-family: var(--mono); font-size: 9px; letter-spacing: .12em; padding: 2px 7px; border-radius: 999px; border: 1px solid var(--ph-dim); color: var(--ph-dim); white-space: nowrap; }
|
|
687
|
+
/* Red, and only red, when there is something new: that is the whole message. */
|
|
688
|
+
.fold-badge.urgent { border-color: var(--danger); background: var(--danger); color: #fff; }
|
|
689
|
+
.fold-body { padding-top: 2px; }
|
|
690
|
+
.mother-section .note.lead { color: rgba(210, 255, 190, .9); letter-spacing: .12em; line-height: 1.7; }
|
|
691
|
+
|
|
692
|
+
/* Inside MU/TH/UR everything is phosphor. A command in the panel was drawn in the page's own
|
|
693
|
+
text colour, which on this ground is all but invisible. */
|
|
694
|
+
.mother-section .update-command { border-color: var(--ph-dim); border-radius: 0; background: var(--ph-faint); }
|
|
695
|
+
.mother-section .update-command code { color: var(--ph); }
|
|
696
|
+
.mother-section .update-command button { border-color: var(--ph-dim); color: var(--ph-dim); }
|
|
697
|
+
.mother-section .update-command button:hover { color: var(--ph); border-color: var(--ph); }
|
|
698
|
+
|
|
699
|
+
/* The steps were numbered by the browser, at the panel's own size, which made them shout. They
|
|
700
|
+
are a quiet index in the margin now, like everything else here. */
|
|
701
|
+
.mother-section .train-steps { list-style: none; padding-left: 26px; counter-reset: step; }
|
|
702
|
+
.mother-section .train-steps > li { counter-increment: step; position: relative; margin: 14px 0; }
|
|
703
|
+
.mother-section .train-steps > li::before { content: counter(step); position: absolute; left: -26px; top: 1px; width: 18px; text-align: right; font-family: var(--mono); font-size: 9px; letter-spacing: .1em; color: var(--ph-dim); opacity: .8; }
|
|
704
|
+
.mother-section .train-steps > li.note { counter-increment: none; margin-left: 0; }
|
|
705
|
+
.mother-section .train-steps > li.note::before { content: none; }
|
|
706
|
+
.mother-section .train-step-label { color: var(--ph-dim); }
|
|
467
707
|
.mother-grid { display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(min(100%, 380px), 1fr)); }
|
|
468
708
|
.mother-card { border: 1px solid var(--ph-dim); padding: 14px 16px; background: rgba(2, 6, 2, .6); display: grid; gap: 8px; align-content: start; }
|
|
469
709
|
.mother-card.hit { border-color: var(--ph); box-shadow: inset 0 0 0 1px var(--ph-faint), 0 0 22px rgba(155, 255, 102, .12); }
|
|
@@ -524,15 +764,32 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
524
764
|
/* ================= MODULES ================= */
|
|
525
765
|
.modules-glyph { border-radius: 50%; }
|
|
526
766
|
.modules-count { min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; display: inline-grid; place-items: center; background: var(--phosphor); color: var(--phosphor-ink); font-size: 9px; letter-spacing: 0; }
|
|
527
|
-
|
|
767
|
+
/* A module card is floors, not a stack of paragraphs: who it is, what it does, what it touches,
|
|
768
|
+
what it lets you set, and the switch. Each floor owns its own padding and is separated by a
|
|
769
|
+
hairline, so nothing can crowd anything else. The floors stack from the top and the switch is
|
|
770
|
+
pushed to the bottom — as a stretched grid the card used to spread the spare height of the
|
|
771
|
+
tallest card in the row between its own rows, which is why the text drifted apart on some
|
|
772
|
+
cards and not on others. */
|
|
773
|
+
.module-card { border: 1px solid var(--ph-dim); background: rgba(2, 6, 2, .6); display: flex; flex-direction: column; padding: 0; max-width: 760px; min-width: 0; overflow-wrap: anywhere; }
|
|
774
|
+
/* The switch sits on the floor of the card, not wherever the text happens to end: cards in a row
|
|
775
|
+
are the same height, so their buttons line up along the bottom edge. */
|
|
776
|
+
.module-card > .actions { margin-top: auto; }
|
|
777
|
+
.module-card:not(.dev-card) > * { padding: 16px 20px; }
|
|
778
|
+
.module-card:not(.dev-card) > * + * { border-top: 1px solid var(--ph-faint); }
|
|
528
779
|
.mother-grid > * { min-width: 0; }
|
|
529
|
-
.module-card .head { display: grid;
|
|
780
|
+
.module-card .head { display: grid; gap: 7px; }
|
|
781
|
+
.module-card .head .top { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 12px; align-items: baseline; }
|
|
530
782
|
.module-card h4 { margin: 0; font-size: 16px; letter-spacing: .1em; text-transform: uppercase; }
|
|
531
|
-
|
|
532
|
-
.module-card .state { font-size:
|
|
533
|
-
.module-card .
|
|
534
|
-
.module-card .state.
|
|
535
|
-
.module-card .state.
|
|
783
|
+
/* The state is a state, not a button: a word and a dot, never a box you want to press. */
|
|
784
|
+
.module-card .state { font-family: var(--mono); font-size: 9.5px; letter-spacing: .18em; color: var(--ph-dim); white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; }
|
|
785
|
+
.module-card .state::before { content: ''; width: 6px; height: 6px; border-radius: 50%; background: currentColor; opacity: .5; }
|
|
786
|
+
.module-card .state.on { color: var(--ph); }
|
|
787
|
+
.module-card .state.on::before { opacity: 1; box-shadow: 0 0 8px var(--ph); }
|
|
788
|
+
.module-card .state.running { color: #ffd166; animation: blink 1s infinite; }
|
|
789
|
+
/* Switched off, the whole card steps back — except the switch that turns it on again. */
|
|
790
|
+
.module-card.off { border-color: var(--ph-faint); }
|
|
791
|
+
.module-card.off > *:not(.actions) { opacity: .52; }
|
|
792
|
+
.module-card .detail { font-size: 10px; letter-spacing: .12em; color: var(--ph-dim); line-height: 1.5; }
|
|
536
793
|
.module-card p { margin: 0; font-size: 12.5px; line-height: 1.6; color: rgba(210, 255, 190, .85); text-shadow: none; }
|
|
537
794
|
.module-card ul { margin: 0; padding-left: 18px; font-size: 12px; line-height: 1.7; color: rgba(210, 255, 190, .8); text-shadow: none; }
|
|
538
795
|
.module-card .actions { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
|
|
@@ -566,11 +823,15 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
566
823
|
.stop-all.armed { opacity: 1; cursor: pointer; border-color: var(--terror); background: color-mix(in srgb, var(--terror) 12%, transparent); color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 60%, transparent); animation: blink 1.4s infinite; }
|
|
567
824
|
.stop-all.armed:hover { background: var(--terror); color: #fff; text-shadow: none; animation: none; }
|
|
568
825
|
.stop-all-glyph { width: 8px; height: 8px; background: currentColor; }
|
|
569
|
-
|
|
570
|
-
.update-pill
|
|
571
|
-
.update-pill
|
|
572
|
-
|
|
573
|
-
|
|
826
|
+
/* The version alert: an amber hairline, a soft fill, no glow. It should read as information, not alarm. */
|
|
827
|
+
.update-pill { opacity: 1; cursor: pointer; border-color: color-mix(in srgb, var(--warn) 45%, transparent); background: color-mix(in srgb, var(--warn) 9%, transparent); color: var(--warn); text-shadow: none; transition: background-color .22s ease, border-color .22s ease, color .22s ease, transform .16s ease; }
|
|
828
|
+
.update-pill:hover { background: color-mix(in srgb, var(--warn) 16%, transparent); border-color: color-mix(in srgb, var(--warn) 70%, transparent); }
|
|
829
|
+
.update-pill:active { transform: scale(.98); }
|
|
830
|
+
.update-pill:focus-visible { outline: 2px solid color-mix(in srgb, var(--warn) 60%, transparent); outline-offset: 2px; }
|
|
831
|
+
.update-pill .update-glyph { border-radius: 50%; opacity: .9; }
|
|
832
|
+
.update-restart { display: inline-flex; align-items: center; height: 30px; padding: 0 14px; margin: 4px 0 10px; border: 1px solid var(--ph); background: color-mix(in srgb, var(--ph) 12%, transparent); color: var(--ph); font: inherit; font-size: 10px; letter-spacing: .18em; cursor: pointer; transition: background-color .22s ease, color .22s ease, opacity .22s ease; }
|
|
833
|
+
.update-restart:hover { background: color-mix(in srgb, var(--ph) 22%, transparent); }
|
|
834
|
+
.update-restart:disabled { opacity: .55; cursor: default; }
|
|
574
835
|
.system.alert { color: var(--terror); text-shadow: 0 0 10px color-mix(in srgb, var(--terror) 70%, transparent); letter-spacing: .14em; animation: terror-in 1.4s steps(3, end) 1; }
|
|
575
836
|
.system.alert b { color: var(--terror); }
|
|
576
837
|
.system.alert .cmd { display: inline-block; margin-left: 8px; padding: 1px 8px; border: 1px solid var(--terror); letter-spacing: .2em; }
|
|
@@ -602,14 +863,17 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
602
863
|
.conn-card button.primary, .settings .room-form button.primary { background: var(--ph); color: #041004; text-shadow: none; border-color: var(--ph); }
|
|
603
864
|
.conn-card button:disabled, .settings .room-form button:disabled { opacity: .4; cursor: default; }
|
|
604
865
|
.conn-card label, .settings .room-form label { display: grid; gap: 4px; font-size: 9.5px; letter-spacing: .16em; color: var(--ph-dim); }
|
|
605
|
-
|
|
606
|
-
|
|
866
|
+
/* A textarea is a field like any other here. It was left out of this rule, so what you typed
|
|
867
|
+
into it was drawn in the page's own colour: invisible on this ground. */
|
|
868
|
+
.conn-card input, .conn-card select, .settings .room-form input, .settings .room-form select, .settings .room-form textarea { border: 1px solid var(--ph-dim); background: #000; color: var(--ph); font: inherit; font-size: 12px; padding: 6px 8px; letter-spacing: .04em; min-width: 0; }
|
|
869
|
+
.settings .room-form textarea::placeholder { color: var(--ph-dim); }
|
|
870
|
+
.conn-card input:focus, .settings .room-form input:focus, .settings .room-form textarea:focus { outline: 1px solid var(--ph); }
|
|
607
871
|
.conn-card .login-log { max-height: 140px; overflow-y: auto; border: 1px solid var(--ph-faint); background: #000; padding: 8px 10px; font-size: 11px; line-height: 1.5; white-space: pre-wrap; overflow-wrap: anywhere; }
|
|
608
872
|
.conn-card .login-log a { color: var(--ph); }
|
|
609
873
|
.settings .room-form { border: 1px solid var(--ph-dim); padding: 14px 16px; display: grid; gap: 12px; grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); align-items: end; }
|
|
610
874
|
.settings .room-form .full { grid-column: 1 / -1; display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
|
|
611
875
|
.settings .room-form .toggle { display: flex; align-items: center; gap: 8px; font-size: 10px; letter-spacing: .16em; color: var(--ph); cursor: pointer; }
|
|
612
|
-
.settings .room-form .toggle input { width: auto; accent-color:
|
|
876
|
+
.settings .room-form .toggle input { width: auto; accent-color: var(--brew); }
|
|
613
877
|
.settings .note { font-size: 10px; letter-spacing: .1em; color: var(--ph-dim); }
|
|
614
878
|
.system.login { color: var(--phosphor); }
|
|
615
879
|
.system.login.failed { color: var(--danger); }
|
|
@@ -643,6 +907,7 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
643
907
|
.picker .mode-chip.m1 { --mode: var(--mode-1); }
|
|
644
908
|
.picker .mode-chip.m2 { --mode: var(--mode-2); }
|
|
645
909
|
.picker .mode-chip.m3 { --mode: var(--mode-3); }
|
|
910
|
+
.picker .mode-chip.m4 { --mode: var(--mode-4); }
|
|
646
911
|
.mode-menu { width: min(380px, calc(100vw - 24px)); padding: 12px; }
|
|
647
912
|
.mode-menu .model-menu-title { margin: 4px 10px 10px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
|
648
913
|
.mode-menu .mode-ladder { display: grid; gap: 2px; }
|
|
@@ -653,6 +918,7 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
653
918
|
.mode-menu .mode-option.o1.current { --mode: var(--mode-1); }
|
|
654
919
|
.mode-menu .mode-option.o2.current { --mode: var(--mode-2); }
|
|
655
920
|
.mode-menu .mode-option.o3 { --mode: var(--mode-3); }
|
|
921
|
+
.mode-menu .mode-option.o4 { --mode: var(--mode-4); }
|
|
656
922
|
.mode-menu .mode-option.locked { opacity: .45; }
|
|
657
923
|
.mode-menu .mode-option.locked:hover { opacity: 1; }
|
|
658
924
|
.mode-menu .mode-option:disabled { opacity: .3; cursor: default; }
|
|
@@ -661,11 +927,11 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
661
927
|
.mode-menu .mode-option .body { display: grid; gap: 3px; min-width: 0; }
|
|
662
928
|
.mode-menu .mode-option .name { font-size: 11px; font-weight: 700; letter-spacing: .14em; color: var(--mode); }
|
|
663
929
|
.mode-menu .mode-option.current .name, .mode-menu .mode-option:hover .name { color: var(--mode); }
|
|
664
|
-
.mode-menu .mode-option:not(.current):not(.o3) .name { color: var(--text); }
|
|
930
|
+
.mode-menu .mode-option:not(.current):not(.o3):not(.o4) .name { color: var(--text); }
|
|
665
931
|
.mode-menu .mode-option .body { gap: 5px; }
|
|
666
932
|
.mode-menu .mode-option .hint { display: block; font-size: 10.5px; line-height: 1.5; letter-spacing: 0; color: var(--text-2); text-transform: none; font-family: var(--sans, inherit); }
|
|
667
933
|
.mode-menu .mode-option .tag { display: inline-flex; align-items: center; gap: 7px; font-size: 8.5px; font-weight: 700; letter-spacing: .16em; color: var(--mode); white-space: nowrap; align-self: center; margin-left: 4px; }
|
|
668
|
-
.mode-menu .mode-option .tag.raise { border: 1px solid var(--mode
|
|
934
|
+
.mode-menu .mode-option .tag.raise { border: 1px solid var(--mode); border-radius: 999px; padding: 3px 9px; }
|
|
669
935
|
.mode-menu .mode-option .tag .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--mode); box-shadow: 0 0 8px var(--mode); animation: mode-dot 1.4s ease-in-out infinite; }
|
|
670
936
|
@keyframes mode-dot { 0%, 100% { opacity: 1; } 50% { opacity: .15; } }
|
|
671
937
|
@media (prefers-reduced-motion: reduce) { .mode-menu .mode-option .tag .dot { animation: none; } }
|
|
@@ -677,10 +943,13 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
677
943
|
.composer.control { width: min(1180px, 100% - 40px); }
|
|
678
944
|
.composer.control .field { border-color: var(--terror); box-shadow: 0 0 0 3px color-mix(in srgb, var(--terror) 18%, transparent), 0 0 30px color-mix(in srgb, var(--terror) 20%, transparent); }
|
|
679
945
|
.composer.control .crew-label { color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 60%, transparent); }
|
|
946
|
+
/* AIRLOCK: the same width as CONTROL, a cold ring instead of the red one. */
|
|
947
|
+
.composer.airlock .field { border-color: var(--mode-4); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mode-4) 18%, transparent), 0 0 30px color-mix(in srgb, var(--mode-4) 16%, transparent); }
|
|
948
|
+
.composer.airlock .crew-label { color: var(--mode-4); text-shadow: 0 0 8px color-mix(in srgb, var(--mode-4) 55%, transparent); }
|
|
680
949
|
.composer.intruder .crew-label { color: var(--terror); text-shadow: 0 0 8px color-mix(in srgb, var(--terror) 60%, transparent); animation: blink 1.6s steps(1) infinite; }
|
|
681
950
|
/* Mode badges on bubbles and plan steps */
|
|
682
951
|
.who .badge.mode { font-weight: 700; letter-spacing: .1em; }
|
|
683
|
-
.who .badge.mode.m0 { color: var(--mode-0); border-color: color-mix(in srgb, var(--mode-0) 50%, transparent); } .who .badge.mode.m1 { color: var(--mode-1); border-color: color-mix(in srgb, var(--mode-1) 45%, transparent); } .who .badge.mode.m2 { color: var(--mode-2); border-color: color-mix(in srgb, var(--mode-2) 50%, transparent); } .who .badge.mode.m3 { color: var(--mode-3); border-color: var(--mode-3); }
|
|
952
|
+
.who .badge.mode.m0 { color: var(--mode-0); border-color: color-mix(in srgb, var(--mode-0) 50%, transparent); } .who .badge.mode.m1 { color: var(--mode-1); border-color: color-mix(in srgb, var(--mode-1) 45%, transparent); } .who .badge.mode.m2 { color: var(--mode-2); border-color: color-mix(in srgb, var(--mode-2) 50%, transparent); } .who .badge.mode.m3 { color: var(--mode-3); border-color: var(--mode-3); } .who .badge.mode.m4 { color: var(--mode-4); border-color: var(--mode-4); }
|
|
684
953
|
.row.ghost .bubble { border: 1px dashed var(--line-2); background: transparent; opacity: .85; }
|
|
685
954
|
.row.ghost.user .bubble { background: transparent; color: var(--text); border-color: var(--text-3); }
|
|
686
955
|
.row.ghost .stamp::after { content: ' · not recorded'; color: var(--text-3); }
|
|
@@ -696,6 +965,9 @@ dialog.override[open] { display: grid; place-items: center; }
|
|
|
696
965
|
.override-reply { min-height: 22px; letter-spacing: .14em; }
|
|
697
966
|
.override-reply.denied { color: #ff7b72; text-shadow: 0 0 10px rgba(255, 123, 114, .6); animation: terror-in .8s steps(3, end) 1; }
|
|
698
967
|
.override-reply.granted { color: var(--ph); text-shadow: 0 0 10px rgba(155, 255, 102, .6); }
|
|
968
|
+
/* MOTHER answering a name that is not this project's: her lines, and the count. */
|
|
969
|
+
.override-reply .line { display: block; line-height: 1.6; }
|
|
970
|
+
.override-reply .strike { display: block; margin-top: 6px; font-size: 9px; letter-spacing: .18em; color: var(--warn); text-shadow: none; }
|
|
699
971
|
.override-frame.shake { animation: override-shake .35s ease; }
|
|
700
972
|
@keyframes override-shake { 0%, 100% { transform: none; } 25% { transform: translateX(-6px); } 50% { transform: translateX(6px); } 75% { transform: translateX(-3px); } }
|
|
701
973
|
.model-menu { position: fixed; z-index: 40; width: min(320px, calc(100vw - 24px)); padding: 10px; border: 1px solid var(--line-2); border-radius: 14px; background: var(--panel); box-shadow: var(--shadow); font-family: var(--mono); font-size: 11px; letter-spacing: .04em; color: var(--text); }
|
|
@@ -801,35 +1073,45 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
801
1073
|
.system.lease.missing button:hover { background: color-mix(in srgb, var(--warn) 20%, transparent); }
|
|
802
1074
|
.system.lease.missing button:disabled { opacity: .6; cursor: default; }
|
|
803
1075
|
.conn-card .scope.sub { margin-left: 22px; font-size: 9px; margin-top: -2px; }
|
|
804
|
-
|
|
1076
|
+
/* One column for the label, the same width on every row and in every card, so MAX MODE and
|
|
1077
|
+
DEFAULT MODE start at the same place instead of each beginning where its own words end. */
|
|
1078
|
+
.conn-card .ceiling { display: grid; grid-template-columns: 104px 1fr; gap: 8px 12px; align-items: center; margin-top: 6px; padding-top: 12px; border-top: 1px solid var(--ph-faint); }
|
|
1079
|
+
.conn-card .ceiling .seg { justify-self: start; }
|
|
805
1080
|
.conn-card .ceiling .k { font-size: 9.5px; letter-spacing: .16em; color: var(--ph-dim); }
|
|
806
1081
|
.conn-card .ceiling .why { grid-column: 1 / -1; font-size: 9px; letter-spacing: .08em; color: var(--ph-dim); text-transform: none; line-height: 1.5; }
|
|
807
1082
|
.conn-card .seg { display: inline-flex; border: 1px solid var(--ph-dim); }
|
|
808
1083
|
.conn-card .seg-option { border: 0; border-right: 1px solid var(--ph-faint); background: transparent; color: var(--ph-dim); font: inherit; font-size: 10px; letter-spacing: .1em; padding: 4px 9px; cursor: pointer; }
|
|
809
1084
|
.conn-card .seg-option:last-child { border-right: 0; }
|
|
810
1085
|
.conn-card .seg-option:hover { background: var(--ph-faint); color: var(--ph); }
|
|
811
|
-
|
|
812
|
-
|
|
1086
|
+
/* A chosen mode wears its own colour, the same one the composer uses for it. It used to be
|
|
1087
|
+
phosphor for every mode but #3, which made one card look like a warning and the rest like
|
|
1088
|
+
settings, when all five are the same kind of choice. */
|
|
1089
|
+
.conn-card .seg-option.current { background: var(--mode, var(--ph)); color: var(--mode-ink, #041004); font-weight: 700; }
|
|
1090
|
+
.conn-card .seg-option.o0 { --mode: var(--mode-0); --mode-ink: var(--mode-0-ink); }
|
|
1091
|
+
.conn-card .seg-option.o1 { --mode: var(--mode-1); --mode-ink: var(--mode-1-ink); }
|
|
1092
|
+
.conn-card .seg-option.o2 { --mode: var(--mode-2); --mode-ink: var(--mode-2-ink); }
|
|
1093
|
+
.conn-card .seg-option.o3 { --mode: var(--mode-3); --mode-ink: var(--mode-3-ink); }
|
|
1094
|
+
.conn-card .seg-option.o4 { --mode: var(--mode-4); --mode-ink: var(--mode-4-ink); }
|
|
813
1095
|
.conn-card .seg-option:disabled { opacity: .35; cursor: default; }
|
|
814
1096
|
.create-toggle[aria-pressed="true"] .lock.closed { display: none; }
|
|
815
1097
|
.create-toggle[aria-pressed="true"] .lock.open { display: block; }
|
|
816
|
-
/*
|
|
1098
|
+
/* Ash: a bash prompt on a black terminal, Homebrew green. */
|
|
817
1099
|
/* Off: a dormant prompt, grey like the other idle controls. On: the terminal lights up. */
|
|
818
|
-
.
|
|
819
|
-
.
|
|
820
|
-
.
|
|
821
|
-
.
|
|
822
|
-
.
|
|
823
|
-
.
|
|
824
|
-
.
|
|
825
|
-
.
|
|
826
|
-
:root[data-theme="light"] .
|
|
827
|
-
|
|
828
|
-
/* With
|
|
829
|
-
.composer.
|
|
830
|
-
.composer.
|
|
831
|
-
.composer.
|
|
832
|
-
.composer.
|
|
1100
|
+
.ash-toggle { height: 30px; padding: 0 10px 0 9px; border-radius: 7px; border: 1px dashed var(--line-2); background: transparent; color: var(--text-3); font-family: var(--mono); font-size: 10px; font-weight: 500; letter-spacing: .06em; text-transform: none; cursor: pointer; align-self: center; display: inline-flex; align-items: center; gap: 6px; opacity: .8; transition: color .2s, border-color .2s, box-shadow .2s, background .2s, opacity .2s; }
|
|
1101
|
+
.ash-toggle::before { content: '$'; color: var(--text-3); font-weight: 700; }
|
|
1102
|
+
.ash-toggle::after { content: ''; width: 7px; height: 12px; background: currentColor; opacity: .25; margin-left: 1px; }
|
|
1103
|
+
.ash-toggle:hover { opacity: 1; color: var(--text-2); border-color: var(--text-3); }
|
|
1104
|
+
.ash-toggle[aria-pressed="true"] { opacity: 1; border-style: solid; background: #070907; color: var(--brew); border-color: var(--brew); font-weight: 700; box-shadow: 0 0 0 1px color-mix(in srgb, var(--brew) 25%, transparent), 0 0 18px color-mix(in srgb, var(--brew) 40%, transparent), inset 0 0 12px color-mix(in srgb, var(--brew) 14%, transparent); text-shadow: 0 0 8px color-mix(in srgb, var(--brew) 70%, transparent); }
|
|
1105
|
+
.ash-toggle[aria-pressed="true"]::before { color: color-mix(in srgb, var(--brew) 75%, transparent); }
|
|
1106
|
+
.ash-toggle[aria-pressed="true"]::after { animation: cursor-blink 1s steps(1) infinite; opacity: 1; }
|
|
1107
|
+
.ash-toggle[aria-pressed="true"]:hover { color: var(--brew); border-color: var(--brew); }
|
|
1108
|
+
:root[data-theme="light"] .ash-toggle, .ash-toggle { /* stays a black terminal in every theme */ }
|
|
1109
|
+
|
|
1110
|
+
/* With Ash lit, the field widens like CREATE and glows Homebrew green. */
|
|
1111
|
+
.composer.ash-on { width: min(1180px, 100% - 40px); }
|
|
1112
|
+
.composer.ash-on .field { position: relative; border-color: color-mix(in srgb, var(--brew) 70%, transparent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--brew) 14%, transparent); }
|
|
1113
|
+
.composer.ash-on .crew-label { color: var(--brew); text-shadow: 0 0 8px color-mix(in srgb, var(--brew) 55%, transparent); }
|
|
1114
|
+
.composer.ash-on .editor textarea::placeholder { color: color-mix(in srgb, var(--brew) 60%, transparent); }
|
|
833
1115
|
.composer.creating.ordering .field { border-color: var(--mode-2); box-shadow: 0 0 0 3px color-mix(in srgb, var(--mode-2) 18%, transparent), inset 0 0 0 1px color-mix(in srgb, var(--brew) 45%, transparent); }
|
|
834
1116
|
|
|
835
1117
|
/* The wink to MOTHER when the order is given: a CRT sweep and scanlines that fade. */
|
|
@@ -870,10 +1152,9 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
870
1152
|
|
|
871
1153
|
.who .badge.ash { color: var(--phosphor); border-color: color-mix(in srgb, var(--phosphor) 50%, transparent); }
|
|
872
1154
|
.who .badge.ash.skipped { color: var(--text-3); border-color: var(--line-2); }
|
|
873
|
-
.ash-
|
|
874
|
-
.ash-
|
|
875
|
-
.ash-
|
|
876
|
-
.ash-beta { color: var(--warn); font-size: 12px; }
|
|
1155
|
+
.ash-was { margin-top: 10px; border-top: 1px dashed var(--line-2); padding-top: 8px; }
|
|
1156
|
+
.ash-was summary { color: var(--text-3); font-family: var(--mono); font-size: 10px; cursor: pointer; }
|
|
1157
|
+
.ash-was pre { white-space: pre-wrap; overflow-wrap: anywhere; margin: 8px 0 0; font: inherit; color: var(--text-2); }
|
|
877
1158
|
.create-scopes { display: inline-flex; gap: 4px; margin-left: 4px; }
|
|
878
1159
|
.create-scopes .cap { font-size: 8.5px; padding: 1px 5px; }
|
|
879
1160
|
.create-scopes .cap.on { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 55%, transparent); }
|
|
@@ -944,7 +1225,7 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
944
1225
|
.conn-card .scope .assist { margin-left: 6px; border: 1px solid var(--ph-dim); background: transparent; color: var(--ph); font: inherit; font-size: 8.5px; letter-spacing: .14em; padding: 1px 6px; cursor: pointer; text-transform: uppercase; }
|
|
945
1226
|
.conn-card .scope .assist:hover { background: var(--ph-faint); }
|
|
946
1227
|
.conn-card .scope { display: flex; align-items: center; gap: 8px; font-size: 10px; letter-spacing: .12em; color: var(--ph); cursor: pointer; }
|
|
947
|
-
.conn-card .scope input { accent-color:
|
|
1228
|
+
.conn-card .scope input { accent-color: var(--brew); width: auto; }
|
|
948
1229
|
.conn-card .scope.unavailable { color: var(--ph-dim); cursor: not-allowed; }
|
|
949
1230
|
.conn-card .scope .why { margin-left: auto; font-size: 9px; letter-spacing: .08em; color: var(--ph-dim); text-transform: none; }
|
|
950
1231
|
|
|
@@ -968,6 +1249,25 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
968
1249
|
.editor .highlight .chip.cmd { --agent: var(--phosphor); font-family: var(--mono); font-size: 13px; letter-spacing: .04em; }
|
|
969
1250
|
.editor .highlight .chip.file { --agent: var(--text-2); font-family: var(--mono); font-size: 13px; letter-spacing: 0; font-weight: 500; }
|
|
970
1251
|
.editor .highlight .chip.unknown { --agent: var(--text-3); text-decoration: underline dotted; font-weight: 500; }
|
|
1252
|
+
/* A mention is a word in the sentence you are writing, so it is only ever coloured. A pill drawn
|
|
1253
|
+
round it turns the line into a form to fill in and breaks the rhythm of reading it back. */
|
|
1254
|
+
.editor .highlight .chip.agent { background: transparent; box-shadow: none; }
|
|
1255
|
+
/* What you are answering, inside the field and above the line you write on. It takes a row of
|
|
1256
|
+
its own, so the box grows by exactly its height and the writing space is never eaten. Two
|
|
1257
|
+
points smaller than what you type, in a badge faint enough not to compete with it. */
|
|
1258
|
+
.reply-quote {
|
|
1259
|
+
grid-column: 1 / -1;
|
|
1260
|
+
display: flex; align-items: baseline; gap: 7px;
|
|
1261
|
+
margin: 2px 0 0 -6px; padding: 6px 8px 6px 12px; border-radius: 12px;
|
|
1262
|
+
background: color-mix(in srgb, var(--text-3) 9%, transparent);
|
|
1263
|
+
font-size: 13px; line-height: 1.4; color: var(--text-3);
|
|
1264
|
+
}
|
|
1265
|
+
/* With something quoted the field gives you room to answer in rather than one cramped line. */
|
|
1266
|
+
.field.quoting textarea, .field.quoting .highlight { min-height: 42px; }
|
|
1267
|
+
.reply-quote b { flex: none; color: var(--text-2); font-weight: 600; }
|
|
1268
|
+
.reply-quote .said { min-width: 0; overflow: hidden; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
|
|
1269
|
+
.reply-quote .drop { flex: none; margin-left: auto; width: 18px; height: 18px; display: grid; place-items: center; border: 0; border-radius: 50%; background: transparent; color: var(--text-3); font-size: 14px; line-height: 1; cursor: pointer; }
|
|
1270
|
+
.reply-quote .drop:hover { background: color-mix(in srgb, var(--text-3) 14%, transparent); color: var(--text); }
|
|
971
1271
|
.slash-menu { position: absolute; left: -12px; bottom: calc(100% + 14px); z-index: 30; min-width: 280px; max-width: min(460px, 90vw); border: 1px solid var(--line-2); background: var(--panel); border-radius: 14px; box-shadow: 0 14px 40px rgba(0, 0, 0, .35); padding: 6px; display: grid; gap: 2px; }
|
|
972
1272
|
.slash-menu .item { display: grid; grid-template-columns: auto 1fr; gap: 10px; align-items: baseline; padding: 7px 10px; border-radius: 9px; cursor: pointer; border: 0; background: transparent; color: var(--text); text-align: left; font: inherit; }
|
|
973
1273
|
.slash-menu .item .key { font-family: var(--mono); font-size: 12.5px; color: var(--agent, var(--phosphor)); font-weight: 600; white-space: nowrap; }
|
|
@@ -981,6 +1281,33 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
981
1281
|
.theme-button svg { display: none; }
|
|
982
1282
|
.theme-button[data-theme="auto"] .t-auto, .theme-button[data-theme="light"] .t-light, .theme-button[data-theme="dark"] .t-dark { display: block; }
|
|
983
1283
|
.tree-button:hover, .tree-button[aria-pressed="true"] { color: var(--phosphor); border-color: var(--phosphor); box-shadow: 0 0 14px color-mix(in srgb, var(--phosphor) 30%, transparent); }
|
|
1284
|
+
/* The conversations of this project, on the other side of the canvas from the files: the same
|
|
1285
|
+
panel, so there is one shape to learn, and never both edges at once on a narrow screen. */
|
|
1286
|
+
.tree.chats { justify-self: start; margin: 18px 0 10px 20px; grid-template-rows: auto minmax(0, 1fr) auto auto; }
|
|
1287
|
+
.chats-new { padding: 10px 12px; border-top: 1px solid var(--line); }
|
|
1288
|
+
.chats-new-button { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; border: 1px dashed var(--line-2); border-radius: 10px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 10px; letter-spacing: .16em; padding: 9px 10px; cursor: pointer; }
|
|
1289
|
+
.chats-new-button svg { width: 14px; height: 14px; }
|
|
1290
|
+
.chats-new-button:hover { color: var(--phosphor); border-color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 8%, transparent); }
|
|
1291
|
+
.chats-body { padding: 10px 8px; display: grid; gap: 6px; align-content: start; }
|
|
1292
|
+
.chats-body .chat { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: baseline; width: 100%; border: 0; background: transparent; color: var(--text-2); font: inherit; text-align: left; padding: 11px 12px; border-radius: 10px; cursor: pointer; }
|
|
1293
|
+
.chats-body .chat:hover { background: color-mix(in srgb, var(--phosphor) 10%, transparent); color: var(--text); }
|
|
1294
|
+
.chats-body .chat.on { background: color-mix(in srgb, var(--phosphor) 14%, transparent); color: var(--text); }
|
|
1295
|
+
.chats-body .chat .name { font-family: var(--sans, inherit); font-size: 12.5px; line-height: 1.4; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
1296
|
+
.chats-body .chat .when { font-family: var(--mono); font-size: 9px; letter-spacing: .08em; color: var(--text-3); white-space: nowrap; }
|
|
1297
|
+
.chats-body .chat-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 4px; }
|
|
1298
|
+
.chats-body .chat-drop { border: 0; background: transparent; color: var(--text-3); font: inherit; font-size: 13px; line-height: 1; padding: 4px 7px; border-radius: 7px; cursor: pointer; opacity: 0; }
|
|
1299
|
+
.chats-body .chat-row:hover .chat-drop, .chats-body .chat-drop:focus-visible { opacity: 1; }
|
|
1300
|
+
.chats-body .chat-drop:hover { color: var(--danger); background: color-mix(in srgb, var(--danger) 12%, transparent); }
|
|
1301
|
+
.chats-body .chat-drop.sure { opacity: 1; color: #fff; background: var(--danger); }
|
|
1302
|
+
.project.chat-here { flex: 0 1 auto; max-width: 340px; color: var(--text-2); }
|
|
1303
|
+
.chats-foot { padding: 10px 14px; border-top: 1px solid var(--line); font-family: var(--mono); font-size: 8.5px; letter-spacing: .12em; color: var(--text-3); }
|
|
1304
|
+
/* Its handle sits in the canvas, under the bar, where the conversation it opens begins. */
|
|
1305
|
+
.chats-button { grid-row: 3; justify-self: start; align-self: start; z-index: 6; margin: 18px 0 0 20px; display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 36px; border-radius: 11px; border: 1px solid var(--line-2); background: var(--panel); color: var(--text-2); cursor: pointer; padding: 0; }
|
|
1306
|
+
.chats-button svg { width: 21px; height: 21px; }
|
|
1307
|
+
.chats-button:hover, .chats-button[aria-pressed="true"] { color: var(--phosphor); border-color: var(--phosphor); box-shadow: 0 0 14px color-mix(in srgb, var(--phosphor) 30%, transparent); }
|
|
1308
|
+
.chats-button:active { transform: translateY(1px); }
|
|
1309
|
+
@media (max-width: 1100px) { .chats-button { display: none; } }
|
|
1310
|
+
|
|
984
1311
|
.tree { grid-row: 3; justify-self: end; align-self: stretch; z-index: 5; width: clamp(240px, calc((100% - var(--column)) / 2 - 36px), 420px); margin: 18px 20px 10px 0; min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr); border: 1px solid var(--line-2); border-radius: 18px; background: var(--panel); box-shadow: 0 10px 30px rgba(0, 0, 0, .06); overflow: hidden; animation: tree-in .22s ease; }
|
|
985
1312
|
@keyframes tree-in { from { opacity: 0; transform: translateX(8px); } to { opacity: 1; transform: none; } }
|
|
986
1313
|
.tree-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 12px 12px 10px 16px; border-bottom: 1px solid var(--line); font-family: var(--mono); font-size: 10px; letter-spacing: .18em; color: var(--text-2); }
|
|
@@ -1007,6 +1334,23 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1007
1334
|
|
|
1008
1335
|
.command-card { margin: 10px 0 6px; max-width: min(860px, 100%); border: 1px solid var(--line-2); border-radius: 12px; background: color-mix(in srgb, var(--panel) 80%, transparent); overflow: hidden; }
|
|
1009
1336
|
.command-card.failed { border-color: color-mix(in srgb, var(--crit) 60%, transparent); }
|
|
1337
|
+
|
|
1338
|
+
/* EYECAT: a question the room is asking the human, so it reads as one thing until it is answered. */
|
|
1339
|
+
.command-card.eyecat { border-color: color-mix(in srgb, var(--mem-aberration) 55%, transparent); }
|
|
1340
|
+
.command-card.eyecat .head b { color: var(--mem-aberration); }
|
|
1341
|
+
.command-card.eyecat > div:not(.head):not(.eyecat-actions):not(.eyecat-settled) { padding: 10px 12px; border-bottom: 1px solid var(--line-2); }
|
|
1342
|
+
.command-card.eyecat b { display: block; font-family: var(--mono); font-size: 9px; letter-spacing: .18em; color: var(--text-2); margin-bottom: 4px; }
|
|
1343
|
+
.command-card.eyecat p { margin: 0; font-size: 13.5px; line-height: 1.5; }
|
|
1344
|
+
.command-card.eyecat .eyecat-claim p { color: var(--mem-aberration); }
|
|
1345
|
+
.command-card.eyecat .eyecat-correction p { color: var(--ok, #9bff66); }
|
|
1346
|
+
.eyecat-actions { display: flex; gap: 8px; padding: 10px 12px; }
|
|
1347
|
+
.eyecat-actions button { font-family: var(--mono); font-size: 10px; letter-spacing: .16em; padding: 6px 12px; border-radius: 999px; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); cursor: pointer; }
|
|
1348
|
+
.eyecat-actions button.primary { border-color: color-mix(in srgb, var(--mem-aberration) 70%, transparent); color: var(--mem-aberration); }
|
|
1349
|
+
.eyecat-actions button:hover:not(:disabled) { background: var(--ph-faint); }
|
|
1350
|
+
.eyecat-actions button:disabled { opacity: .45; cursor: default; }
|
|
1351
|
+
.eyecat-settled { padding: 9px 12px; font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; color: var(--text-2); }
|
|
1352
|
+
.command-card.eyecat.filed { border-color: color-mix(in srgb, var(--mem-aberration) 75%, transparent); }
|
|
1353
|
+
.command-card.eyecat.stands { border-color: var(--line-2); opacity: .7; }
|
|
1010
1354
|
.command-card .head { display: flex; gap: 10px; align-items: baseline; padding: 8px 12px; font-family: var(--mono); font-size: 10.5px; letter-spacing: .14em; color: var(--text-2); border-bottom: 1px solid var(--line-2); }
|
|
1011
1355
|
.command-card .head b { color: var(--phosphor); font-weight: 600; }
|
|
1012
1356
|
.command-card .head .args { color: var(--text-3); letter-spacing: .04em; }
|
|
@@ -1040,8 +1384,9 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1040
1384
|
:root[data-scheme="light"] .field button[type="submit"] { box-shadow: 0 2px 8px rgba(0, 0, 0, .14); }
|
|
1041
1385
|
:root[data-scheme="light"] .user .bubble { box-shadow: 0 3px 12px rgba(0, 0, 0, .08); }
|
|
1042
1386
|
:root[data-scheme="light"] .composer.control .field { box-shadow: 0 0 0 2px color-mix(in srgb, var(--terror) 30%, transparent); }
|
|
1387
|
+
:root[data-scheme="light"] .composer.airlock .field { box-shadow: 0 0 0 2px color-mix(in srgb, var(--mode-4) 35%, transparent); }
|
|
1043
1388
|
:root[data-scheme="light"] .composer.creating .field, :root[data-scheme="light"] .composer.creating.ordering .field { box-shadow: 0 0 0 2px color-mix(in srgb, var(--mode-2) 30%, transparent); }
|
|
1044
|
-
:root[data-scheme="light"] .composer.
|
|
1389
|
+
:root[data-scheme="light"] .composer.ash-on .field { box-shadow: 0 0 0 2px color-mix(in srgb, var(--brew) 22%, transparent); }
|
|
1045
1390
|
:root[data-scheme="light"] .composer.dropping .field { box-shadow: 0 0 0 2px color-mix(in srgb, var(--phosphor) 35%, transparent); }
|
|
1046
1391
|
:root[data-scheme="light"] .memory-hint .pill { animation: none; box-shadow: none; }
|
|
1047
1392
|
:root[data-scheme="light"] .mode-menu .mode-option .tag .dot { box-shadow: none; }
|
|
@@ -1054,17 +1399,230 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1054
1399
|
/* MU/TH/UR: the sentinel section. */
|
|
1055
1400
|
.mother-section.sentinel .sentinel-controls, .mother-section.update .sentinel-controls { display: flex; flex-wrap: wrap; align-items: center; gap: 14px; margin: 6px 0 12px; }
|
|
1056
1401
|
.mother-section.sentinel .toggle, .mother-section.update .toggle { display: flex; align-items: center; gap: 8px; font-size: 10px; letter-spacing: .16em; color: var(--ph-dim); cursor: pointer; }
|
|
1057
|
-
.mother-section.sentinel .toggle input, .mother-section.update .toggle input { accent-color:
|
|
1402
|
+
.mother-section.sentinel .toggle input, .mother-section.update .toggle input { accent-color: var(--brew); margin: 0; flex: none; }
|
|
1403
|
+
/* The row starts where the text above it starts, so the column reads straight down. */
|
|
1404
|
+
.mother-section.sentinel .sentinel-controls, .mother-section.update .sentinel-controls { margin-left: 0; padding-left: 0; }
|
|
1058
1405
|
.mother-section.sentinel .toggle input:disabled + * , .mother-section.sentinel .toggle:has(input:disabled) { opacity: .6; cursor: default; }
|
|
1059
1406
|
.mother-section.sentinel button, .mother-section.update button { border: 1px solid var(--ph-dim); background: transparent; color: var(--ph); font: inherit; font-size: 9.5px; letter-spacing: .16em; padding: 6px 10px; cursor: pointer; }
|
|
1060
1407
|
.mother-section.sentinel button:hover, .mother-section.update button:hover { background: var(--ph-faint); }
|
|
1061
1408
|
.mother-section.sentinel .sentinel-report.sent { opacity: .65; }
|
|
1062
1409
|
.settings .memory-form .toggle { display: inline-flex; align-items: center; gap: 6px; margin-right: 14px; font-size: 9.5px; letter-spacing: .14em; color: var(--ph-dim); cursor: pointer; text-transform: uppercase; }
|
|
1063
|
-
.settings .memory-form .toggle input { accent-color:
|
|
1410
|
+
.settings .memory-form .toggle input { accent-color: var(--brew); width: auto; }
|
|
1064
1411
|
.settings .memory-form .full .note { margin-right: 12px; }
|
|
1065
1412
|
.settings .memory-form .dataset-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; padding-top: 8px; border-top: 1px solid var(--ph-faint); }
|
|
1066
|
-
.module-card .ollama-status { margin: 0
|
|
1413
|
+
.module-card .ollama-status { margin: 0; display: grid; grid-template-columns: auto 1fr; gap: 3px 12px; font-size: 10px; letter-spacing: .1em; }
|
|
1067
1414
|
.module-card .ollama-status dt { color: var(--ph-dim); } .module-card .ollama-status dd { margin: 0; color: rgba(210, 255, 190, .85); overflow-wrap: anywhere; }
|
|
1068
1415
|
.module-card .actions .toggle { display: inline-flex; align-items: center; gap: 6px; font-size: 9.5px; letter-spacing: .14em; color: var(--ph-dim); cursor: pointer; }
|
|
1069
|
-
.module-card .actions .toggle input { accent-color:
|
|
1416
|
+
.module-card .actions .toggle input { accent-color: var(--brew); }
|
|
1070
1417
|
.mother-section.sentinel .note, .mother-section.update .note { margin: 0 0 10px; font-size: 10px; letter-spacing: .12em; line-height: 1.7; color: var(--ph-dim); }
|
|
1418
|
+
|
|
1419
|
+
/* Motion of controls: every colour change eases over 220 ms. Nothing snaps. */
|
|
1420
|
+
.mother-button, .tree-button, .chats-button, .stop-all, .mother-close, .mother-section button, .seg-option, .mode-chip, .model-chip, .bubble-actions .act, .update-command button, .codeblock .copy { transition: background-color .22s ease, color .22s ease, border-color .22s ease, box-shadow .22s ease, opacity .22s ease, transform .16s ease; }
|
|
1421
|
+
.mother-button:active, .tree-button:active, .mother-close:active, .mother-section button:active, .update-command button:active { transform: scale(.98); }
|
|
1422
|
+
@media (prefers-reduced-motion: reduce) { .mother-button, .tree-button, .chats-button, .stop-all, .mother-close, .mother-section button, .seg-option, .mode-chip, .model-chip, .bubble-actions .act, .update-command button, .update-pill, .update-restart { transition: none; } }
|
|
1423
|
+
|
|
1424
|
+
/* Developer card in MODULES and the four-step tour */
|
|
1425
|
+
.dev-card { display: grid; grid-template-columns: 64px 1fr; gap: 18px; align-items: start; padding: 18px 20px; }
|
|
1426
|
+
.dev-glyph { font-family: var(--mono); font-size: 26px; font-weight: 700; letter-spacing: .08em; color: var(--ph); text-shadow: 0 0 10px rgba(155, 255, 102, .45); line-height: 1; padding-top: 4px; }
|
|
1427
|
+
.dev-body h4 { margin: 0 0 8px; font-size: 13px; letter-spacing: .18em; color: var(--ph); }
|
|
1428
|
+
.dev-body p { margin: 0 0 10px; font-size: 11.5px; line-height: 1.65; letter-spacing: .04em; color: var(--ph-dim); text-transform: none; }
|
|
1429
|
+
.dev-where { margin: 0 0 12px; font-size: 10.5px; letter-spacing: .04em; color: var(--ph-dim); }
|
|
1430
|
+
.dev-where code { color: var(--ph); background: var(--ph-faint); padding: 2px 6px; }
|
|
1431
|
+
.dev-row { display: flex; flex-wrap: wrap; gap: 10px; margin-bottom: 8px; }
|
|
1432
|
+
.dev-row a.mother-close { text-decoration: none; display: inline-flex; align-items: center; }
|
|
1433
|
+
.dev-fail { color: var(--warn); } .dev-fail code { color: var(--warn); background: color-mix(in srgb, var(--warn) 12%, transparent); padding: 1px 5px; }
|
|
1434
|
+
.tour-button { min-width: 30px; padding: 6px 0; text-align: center; font-weight: 700; }
|
|
1435
|
+
.tour-frame { width: min(620px, 92vw); padding: 26px 30px 22px; }
|
|
1436
|
+
.tour-body { min-height: 190px; padding: 12px 0 6px; }
|
|
1437
|
+
.tour-step h3 { margin: 6px 0 14px; font-size: 11px; letter-spacing: .28em; color: var(--ph); font-weight: 700; }
|
|
1438
|
+
.tour-step p { margin: 0 0 10px; font-size: 12.5px; line-height: 1.7; letter-spacing: .03em; color: var(--ph); text-transform: none; }
|
|
1439
|
+
.tour-foot { display: flex; align-items: center; justify-content: space-between; gap: 14px; padding-top: 14px; border-top: 1px solid var(--ph-dim); }
|
|
1440
|
+
.tour-dots { display: inline-flex; gap: 8px; }
|
|
1441
|
+
.tour-dots .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--ph-faint); border: 1px solid var(--ph-dim); transition: background-color .22s ease; }
|
|
1442
|
+
.tour-dots .dot.on { background: var(--ph); box-shadow: 0 0 8px rgba(155, 255, 102, .5); }
|
|
1443
|
+
.tour-nav { display: inline-flex; gap: 8px; }
|
|
1444
|
+
.tour .mother-close.primary { background: var(--ph-faint); }
|
|
1445
|
+
|
|
1446
|
+
/* DEV modules and proposals */
|
|
1447
|
+
.module-card .dev-tag { font-family: var(--mono); font-size: 8.5px; letter-spacing: .18em; color: var(--warn); border: 1px solid color-mix(in srgb, var(--warn) 55%, transparent); padding: 2px 7px; margin-left: 8px; align-self: center; }
|
|
1448
|
+
.module-card .note { font-size: 9.5px; letter-spacing: .1em; color: var(--ph-dim); text-transform: none; }
|
|
1449
|
+
.dev-yours { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 6px; }
|
|
1450
|
+
.dev-chip { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--ph-dim); padding: 4px 8px; font-size: 10px; letter-spacing: .08em; color: var(--ph); text-transform: none; }
|
|
1451
|
+
.dev-chip .act-link, .module-proposed .act-link { border: 0; background: transparent; color: var(--phosphor); font: inherit; font-size: inherit; letter-spacing: .12em; text-transform: uppercase; cursor: pointer; padding: 0; text-decoration: underline; text-underline-offset: 3px; }
|
|
1452
|
+
.dev-chip .act-link { color: var(--warn); }
|
|
1453
|
+
.system.module-proposed { color: var(--text-3); } .system.module-proposed .who { color: var(--agent, var(--text-2)); }
|
|
1454
|
+
|
|
1455
|
+
/* The local model saying whether it has been measured against this project, and the one button
|
|
1456
|
+
that measures it. Same system line as the rest, with room for an answer and an action. */
|
|
1457
|
+
.system.local-model { color: var(--text-3); display: grid; gap: 8px; justify-items: center; }
|
|
1458
|
+
.system.local-model .who { color: var(--agent, var(--text-2)); }
|
|
1459
|
+
.system.local-model .says { margin: 0; max-width: 52ch; font-size: 11px; letter-spacing: .04em; text-transform: none; line-height: 1.65; color: var(--text-2); }
|
|
1460
|
+
.system.local-model .acts { display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 8px; }
|
|
1461
|
+
.system.local-model button { border: 1px solid var(--line-2); border-radius: 999px; background: transparent; color: var(--text-2); font: inherit; font-size: 9.5px; letter-spacing: .16em; text-transform: uppercase; padding: 5px 12px; cursor: pointer; }
|
|
1462
|
+
.system.local-model button:hover:not(:disabled) { border-color: var(--phosphor); color: var(--phosphor); }
|
|
1463
|
+
.system.local-model button:disabled { opacity: .5; cursor: default; }
|
|
1464
|
+
.system.local-model button.primary { border-color: var(--phosphor); color: var(--phosphor); }
|
|
1465
|
+
.system.local-model .note { font-size: 8.5px; letter-spacing: .14em; color: var(--text-3); }
|
|
1466
|
+
|
|
1467
|
+
/* THE BRIDGE: first contact, one card per agent with the one action it needs now. */
|
|
1468
|
+
.bridge { max-width: 640px; }
|
|
1469
|
+
.bridge h2 { margin: 0 0 8px; }
|
|
1470
|
+
.bridge-crew { display: grid; gap: 10px; width: 100%; margin: 18px 0 6px; text-align: left; }
|
|
1471
|
+
.bridge-card { border: 1px solid var(--line-2); border-radius: 14px; padding: 14px 16px; background: var(--panel); display: grid; gap: 10px; }
|
|
1472
|
+
.bridge-card .head { display: flex; align-items: center; gap: 10px; }
|
|
1473
|
+
.bridge-card .title { display: grid; gap: 2px; min-width: 0; flex: 1; }
|
|
1474
|
+
.bridge-card .title b { font-size: 13px; letter-spacing: .02em; color: var(--text); }
|
|
1475
|
+
.bridge-card .vendor { font-family: var(--mono); font-size: 9px; letter-spacing: .16em; text-transform: uppercase; color: var(--text-3); }
|
|
1476
|
+
.bridge-card .state { font-family: var(--mono); font-size: 9px; letter-spacing: .16em; text-transform: uppercase; color: var(--text-3); border: 1px solid var(--line-2); border-radius: 999px; padding: 3px 9px; white-space: nowrap; }
|
|
1477
|
+
.bridge-card .state.ready { color: var(--phosphor); border-color: color-mix(in srgb, var(--phosphor) 55%, transparent); }
|
|
1478
|
+
.bridge-card .state.signed-out { color: var(--warn); border-color: color-mix(in srgb, var(--warn) 50%, transparent); }
|
|
1479
|
+
.bridge-card .detail { font-size: 11.5px; line-height: 1.5; color: var(--text-2); }
|
|
1480
|
+
.bridge-card .actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
|
|
1481
|
+
.bridge-card .actions button { font-family: var(--mono); font-size: 10px; letter-spacing: .14em; text-transform: uppercase; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); border-radius: 8px; padding: 7px 12px; cursor: pointer; transition: background-color .22s ease, color .22s ease, border-color .22s ease; }
|
|
1482
|
+
.bridge-card .actions button:hover { color: var(--text); border-color: var(--text-3); }
|
|
1483
|
+
.bridge-card .actions button.primary { border-color: var(--phosphor); color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); }
|
|
1484
|
+
.bridge-card .actions button.primary:hover { background: color-mix(in srgb, var(--phosphor) 20%, transparent); }
|
|
1485
|
+
.bridge-card .actions button:disabled { opacity: .5; cursor: default; }
|
|
1486
|
+
.bridge-card .actions .note { font-family: var(--mono); font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); }
|
|
1487
|
+
.bridge-log { margin: 0; max-height: 140px; overflow-y: auto; font-family: var(--mono); font-size: 10.5px; line-height: 1.55; color: var(--text-2); background: var(--bg); border: 1px solid var(--line); border-radius: 10px; padding: 8px 10px; white-space: pre-wrap; }
|
|
1488
|
+
.bridge-log a { color: var(--phosphor); }
|
|
1489
|
+
|
|
1490
|
+
.bridge-card .account { font-size: 11px; line-height: 1.5; color: var(--text-3); }
|
|
1491
|
+
.bridge-card .account .free { font-family: var(--mono); font-size: 8.5px; letter-spacing: .16em; color: var(--phosphor); border: 1px solid color-mix(in srgb, var(--phosphor) 45%, transparent); border-radius: 999px; padding: 2px 7px; margin-right: 8px; }
|
|
1492
|
+
.conn-card .meta .account { margin-top: 4px; color: var(--ph-dim); }
|
|
1493
|
+
#bridge-close { margin-top: 4px; }
|
|
1494
|
+
.empty-starts { display: grid; gap: 6px; width: 100%; margin-top: 4px; }
|
|
1495
|
+
.empty-start { font: inherit; font-size: 12.5px; line-height: 1.45; text-align: left; color: var(--text-2); background: transparent; border: 1px solid var(--line-2); border-radius: 12px; padding: 9px 12px; cursor: pointer; transition: background-color .22s ease, color .22s ease, border-color .22s ease; }
|
|
1496
|
+
.empty-start:hover { color: var(--text); border-color: var(--text-3); background: color-mix(in srgb, var(--text) 4%, transparent); }
|
|
1497
|
+
.bridge-close { font-family: var(--mono); font-size: 10px; letter-spacing: .16em; text-transform: uppercase; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); border-radius: 8px; padding: 7px 12px; cursor: pointer; }
|
|
1498
|
+
.bridge-close:hover { color: var(--text); border-color: var(--text-3); }
|
|
1499
|
+
|
|
1500
|
+
/* Pasting a provider key: a plain form, the value never comes back. */
|
|
1501
|
+
.key-slot { display: grid; gap: 8px; }
|
|
1502
|
+
.key-form { display: grid; gap: 8px; }
|
|
1503
|
+
.key-form label { display: grid; gap: 4px; }
|
|
1504
|
+
.key-form .k { font-family: var(--mono); font-size: 9px; letter-spacing: .16em; text-transform: uppercase; color: var(--text-3); }
|
|
1505
|
+
.key-form input, .key-form select { font: inherit; font-size: 12.5px; color: var(--text); background: var(--bg); border: 1px solid var(--line-2); border-radius: 10px; padding: 8px 10px; width: 100%; }
|
|
1506
|
+
.key-form input:focus, .key-form select:focus { outline: none; border-color: var(--phosphor); }
|
|
1507
|
+
.key-row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
|
|
1508
|
+
.key-row button { font-family: var(--mono); font-size: 10px; letter-spacing: .14em; text-transform: uppercase; border: 1px solid var(--phosphor); color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); border-radius: 8px; padding: 7px 12px; cursor: pointer; }
|
|
1509
|
+
.key-row button:disabled { opacity: .5; cursor: default; }
|
|
1510
|
+
.key-link { font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; color: var(--text-3); text-decoration: none; }
|
|
1511
|
+
.key-link:hover { color: var(--phosphor); }
|
|
1512
|
+
.key-note { margin: 0; font-size: 10.5px; line-height: 1.5; color: var(--text-3); }
|
|
1513
|
+
.key-said { margin: 0; min-height: 1em; font-family: var(--mono); font-size: 10px; letter-spacing: .1em; color: var(--text-3); }
|
|
1514
|
+
.key-said.bad { color: var(--danger); text-transform: none; letter-spacing: 0; font-family: inherit; font-size: 11.5px; line-height: 1.5; }
|
|
1515
|
+
/* The key form is shared: it is the bridge's own, on the page's light ground, and it is also
|
|
1516
|
+
inside a connection card, where the ground is black and everything is phosphor. It carried the
|
|
1517
|
+
page's palette into both, so a key field sat there white and rounded among terminal fields.
|
|
1518
|
+
Inside the panel it wears the panel's clothes. */
|
|
1519
|
+
.conn-card .key-form { margin-bottom: 10px; }
|
|
1520
|
+
.conn-card .key-form .k, .conn-card .key-link, .conn-card .key-note, .conn-card .key-said { color: var(--ph-dim); }
|
|
1521
|
+
.conn-card .key-form input, .conn-card .key-form select { color: var(--ph); background: #000; border: 1px solid var(--ph-dim); border-radius: 0; font-size: 12px; padding: 6px 8px; }
|
|
1522
|
+
.conn-card .key-form input::placeholder { color: var(--ph-dim); opacity: .7; }
|
|
1523
|
+
.conn-card .key-form input:focus, .conn-card .key-form select:focus { outline: 1px solid var(--ph); border-color: var(--ph); }
|
|
1524
|
+
.conn-card .key-row button { border: 1px solid var(--ph); color: #041004; background: var(--ph); border-radius: 0; }
|
|
1525
|
+
.conn-card .key-row button:hover:not(:disabled) { background: var(--ph-dim); color: #041004; }
|
|
1526
|
+
.conn-card .key-link:hover { color: var(--ph); }
|
|
1527
|
+
.conn-card .key-said.bad { color: var(--terror); }
|
|
1528
|
+
.bridge-card.bridge-warn { border-color: color-mix(in srgb, var(--warn) 45%, transparent); background: color-mix(in srgb, var(--warn) 6%, transparent); }
|
|
1529
|
+
.bridge-card.bridge-warn b { color: var(--warn); }
|
|
1530
|
+
|
|
1531
|
+
/* A module card, floor by floor: what it is, what it does, what it touches, how it is doing, and
|
|
1532
|
+
then the switch. Everything inside a card wears the panel's phosphor, never the page's palette,
|
|
1533
|
+
and every number is given room so it can never land on its own label. */
|
|
1534
|
+
/* The version line: who made it, what version is running, the button that goes and looks for a
|
|
1535
|
+
newer one, and what the last look found. */
|
|
1536
|
+
.module-card .vendor { font-size: 9.5px; letter-spacing: .2em; color: var(--ph-dim); line-height: 1.4; }
|
|
1537
|
+
/* The version, the button that goes and looks, and what the last look found. */
|
|
1538
|
+
.module-card .version { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
|
|
1539
|
+
.module-card .version b { font-family: var(--mono); font-size: 12px; font-weight: 600; letter-spacing: .04em; color: var(--ph); text-shadow: none; }
|
|
1540
|
+
.module-card .version .check { border: 1px solid var(--ph-faint); background: transparent; color: var(--ph-dim); font: inherit; font-size: 11px; line-height: 1; letter-spacing: 0; padding: 3px 7px; cursor: pointer; }
|
|
1541
|
+
.module-card .version .check:hover { border-color: var(--ph); color: var(--ph); }
|
|
1542
|
+
.module-card .version .check:disabled { opacity: .4; cursor: default; }
|
|
1543
|
+
.mother-head .mother-close.add { color: var(--ph); border-color: var(--ph-dim); }
|
|
1544
|
+
.mother-head .mother-close.add:hover { background: color-mix(in srgb, var(--ph) 14%, transparent); }
|
|
1545
|
+
.module-card .version .get { border: 1px solid var(--warn); background: color-mix(in srgb, var(--warn) 12%, transparent); color: var(--warn); font: inherit; font-size: 8.5px; letter-spacing: .16em; padding: 3px 8px; cursor: pointer; }
|
|
1546
|
+
.module-card .version .get:hover { background: color-mix(in srgb, var(--warn) 22%, transparent); }
|
|
1547
|
+
.module-card .version .get:disabled { opacity: .45; cursor: default; }
|
|
1548
|
+
.module-card .version .update { font-family: var(--mono); font-size: 8.5px; letter-spacing: .14em; color: var(--ph-dim); text-shadow: none; }
|
|
1549
|
+
.module-card .version .update:empty { display: none; }
|
|
1550
|
+
.module-card .version .update.new { color: var(--warn); }
|
|
1551
|
+
.module-card .card-panel { display: grid; gap: 14px; }
|
|
1552
|
+
.module-card .card-panel:empty, .module-card .actions:empty { display: none; }
|
|
1553
|
+
.module-card .card-block { display: grid; gap: 8px; }
|
|
1554
|
+
.module-card .card-block h5 { margin: 0; font-size: 9px; font-weight: 400; letter-spacing: .22em; color: var(--ph-dim); border: 0; padding: 0; }
|
|
1555
|
+
.module-card .card-toggles { display: flex; flex-wrap: wrap; gap: 10px 18px; align-items: center; }
|
|
1556
|
+
.module-card .card-toggles .control { display: inline-flex; align-items: center; gap: 8px; font-size: 9.5px; letter-spacing: .14em; color: var(--ph-dim); }
|
|
1557
|
+
.module-card .card-toggles .control input[type="text"] { border: 1px solid var(--ph-dim); background: #000; color: var(--ph); font: inherit; font-size: 10.5px; letter-spacing: .04em; padding: 5px 8px; }
|
|
1558
|
+
.module-card .card-toggles .toggle { display: inline-flex; align-items: center; gap: 6px; font-size: 9.5px; letter-spacing: .14em; color: var(--ph-dim); cursor: pointer; }
|
|
1559
|
+
.module-card .card-toggles .toggle input { accent-color: var(--brew); }
|
|
1560
|
+
|
|
1561
|
+
/* A fold inside a card: the section name, how many lines are behind it, and its own button. */
|
|
1562
|
+
.card-fold > summary { display: flex; align-items: center; gap: 10px; cursor: pointer; list-style: none; }
|
|
1563
|
+
.card-fold > summary::-webkit-details-marker { display: none; }
|
|
1564
|
+
.card-fold > summary b { font-size: 9px; font-weight: 400; letter-spacing: .22em; color: var(--ph-dim); }
|
|
1565
|
+
.card-fold > summary:hover b { color: var(--ph); }
|
|
1566
|
+
.card-fold > summary .caret { margin-left: auto; font-family: var(--mono); font-size: 8.5px; letter-spacing: .16em; color: var(--ph); white-space: nowrap; }
|
|
1567
|
+
.card-fold > summary .count { font-family: var(--mono); font-size: 9px; letter-spacing: .1em; color: var(--ph-dim); }
|
|
1568
|
+
.card-fold-body { padding-top: 10px; }
|
|
1569
|
+
.module-card .card-fold ul { margin: 0; padding: 0; list-style: none; display: grid; gap: 6px; }
|
|
1570
|
+
.module-card .card-fold li { display: grid; grid-template-columns: 52px minmax(0, 1fr); gap: 10px; align-items: baseline; font-size: 11.5px; line-height: 1.55; color: rgba(210, 255, 190, .82); text-shadow: none; }
|
|
1571
|
+
.module-card .card-fold li i { font-style: normal; font-family: var(--mono); font-size: 8.5px; letter-spacing: .16em; color: var(--ph-dim); }
|
|
1572
|
+
.module-card .card-fold ul.card-commands { gap: 4px; }
|
|
1573
|
+
.module-card .card-fold ul.card-commands li { grid-template-columns: 1fr; font-family: var(--mono); font-size: 11px; letter-spacing: .04em; color: var(--ph); }
|
|
1574
|
+
|
|
1575
|
+
/* Numbers read at a glance: the figure, then its name under it, each in its own cell. */
|
|
1576
|
+
.module-card .metrics { display: grid; grid-template-columns: repeat(auto-fit, minmax(92px, 1fr)); gap: 12px 14px; }
|
|
1577
|
+
.module-card .metric { display: grid; gap: 3px; align-content: start; min-width: 0; }
|
|
1578
|
+
.module-card .metric b { font-family: var(--mono); font-size: 15px; font-weight: 600; line-height: 1.15; letter-spacing: .01em; color: var(--ph); text-shadow: none; overflow-wrap: anywhere; }
|
|
1579
|
+
.module-card .metric span { font-family: var(--mono); font-size: 8.5px; line-height: 1.4; letter-spacing: .14em; color: var(--ph-dim); text-shadow: none; }
|
|
1580
|
+
|
|
1581
|
+
/* ASH · what each block of the briefing weighs against the heaviest one. */
|
|
1582
|
+
.ash-blocks { display: grid; gap: 5px; }
|
|
1583
|
+
.ash-block { display: grid; grid-template-columns: 96px minmax(50px, 1fr) auto; gap: 10px; align-items: center; }
|
|
1584
|
+
.ash-block b { font-family: var(--mono); font-size: 8.5px; letter-spacing: .14em; color: var(--ph-dim); font-weight: 600; text-shadow: none; overflow: hidden; text-overflow: ellipsis; }
|
|
1585
|
+
.ash-block i { height: 5px; background: var(--ph-faint); position: relative; }
|
|
1586
|
+
.ash-block i::after { content: ''; position: absolute; inset: 0 auto 0 0; width: var(--fill, 0%); background: color-mix(in srgb, var(--ph) 65%, transparent); }
|
|
1587
|
+
.ash-block span { font-family: var(--mono); font-size: 8.5px; letter-spacing: .1em; color: var(--ph-dim); white-space: nowrap; text-shadow: none; }
|
|
1588
|
+
@media (max-width: 720px) { .ash-block { grid-template-columns: 1fr; } .ash-block i { display: none; } }
|
|
1589
|
+
|
|
1590
|
+
/* How grown the archive is. Six readings, the weakest marked, and what would raise it. */
|
|
1591
|
+
/* The three tests. A verdict that can say NOT YET is worth more than a bar that only fills. */
|
|
1592
|
+
.exams { display: grid; gap: 10px; margin: 18px 0 4px; }
|
|
1593
|
+
.exams h4 { margin: 0; font-size: 10px; font-weight: 400; letter-spacing: .22em; color: var(--ph); }
|
|
1594
|
+
.exams .exam { display: grid; gap: 6px; padding: 12px 14px; border: 1px solid var(--ph-faint); border-left: 2px solid var(--ph-dim); }
|
|
1595
|
+
.exams .exam.passed { border-left-color: var(--ph); }
|
|
1596
|
+
.exams .exam.failed { border-left-color: var(--warn); }
|
|
1597
|
+
.exams .exam-head { display: flex; align-items: baseline; gap: 12px; }
|
|
1598
|
+
.exams .exam-head b { font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: .14em; color: rgba(210, 255, 190, .9); }
|
|
1599
|
+
.exams .verdict { margin-left: auto; font-family: var(--mono); font-size: 9px; letter-spacing: .18em; color: var(--ph-dim); white-space: nowrap; }
|
|
1600
|
+
.exams .exam.passed .verdict { color: var(--ph); }
|
|
1601
|
+
.exams .exam.failed .verdict { color: var(--warn); }
|
|
1602
|
+
.exams .about { text-transform: none; letter-spacing: .02em; line-height: 1.6; }
|
|
1603
|
+
.exams .said { margin: 0; font-size: 12px; line-height: 1.55; color: #eaffdf; text-shadow: none; }
|
|
1604
|
+
.exams .actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-top: 2px; }
|
|
1605
|
+
.exams button { border: 1px solid var(--ph); background: transparent; color: var(--ph); font: inherit; font-size: 10px; letter-spacing: .18em; padding: 7px 12px; cursor: pointer; }
|
|
1606
|
+
.exams button.primary { background: var(--ph); color: #041004; text-shadow: none; }
|
|
1607
|
+
.exams button:disabled { opacity: .4; cursor: default; }
|
|
1608
|
+
|
|
1609
|
+
.maturity { display: grid; gap: 10px; margin: 12px 0 4px; }
|
|
1610
|
+
.maturity > .card-fold { border-top: 1px solid var(--ph-faint); padding-top: 10px; }
|
|
1611
|
+
.maturity .maturity-next { margin: 0; font-family: var(--mono); font-size: 10.5px; line-height: 1.8; letter-spacing: .1em; text-transform: uppercase; color: #eaffdf; text-shadow: 0 0 6px rgba(155, 255, 102, .18); padding: 11px 13px; border: 1px solid var(--ph); border-left-width: 4px; background: var(--ph-faint); }
|
|
1612
|
+
.maturity .maturity-next b { font-size: 9px; letter-spacing: .22em; color: var(--ph); margin-right: 10px; }
|
|
1613
|
+
.maturity .maturity-next .where { font-size: 9px; letter-spacing: .16em; color: var(--ph); white-space: nowrap; }
|
|
1614
|
+
.maturity-head { display: flex; align-items: baseline; gap: 12px; flex-wrap: wrap; }
|
|
1615
|
+
.maturity-head b { font-family: var(--mono); font-size: 11px; letter-spacing: .24em; }
|
|
1616
|
+
.maturity-head span { font-family: var(--mono); font-size: 9.5px; letter-spacing: .12em; line-height: 1.7; text-transform: uppercase; color: var(--ph-dim); }
|
|
1617
|
+
.maturity-head b.stage.empty, .maturity-head b.stage.sparse { color: var(--ph-dim); }
|
|
1618
|
+
.maturity-head b.stage.forming { color: var(--ph-dim); }
|
|
1619
|
+
.maturity-head b.stage.working, .maturity-head b.stage.mature { color: var(--ph); }
|
|
1620
|
+
.maturity-row { display: grid; grid-template-columns: 210px 90px 1fr; gap: 12px; align-items: center; }
|
|
1621
|
+
.maturity-row b { font-family: var(--mono); font-size: 9px; letter-spacing: .14em; color: var(--ph-dim); font-weight: 400; }
|
|
1622
|
+
.maturity-row i { height: 5px; background: var(--ph-faint); position: relative; }
|
|
1623
|
+
.maturity-row i::after { content: ''; position: absolute; inset: 0 auto 0 0; width: var(--fill, 0%); background: var(--ph-dim); }
|
|
1624
|
+
.maturity-row.weakest i::after { background: var(--ph); }
|
|
1625
|
+
.maturity-row.weakest b { color: var(--ph); }
|
|
1626
|
+
.maturity-row span { font-family: var(--mono); font-size: 9px; letter-spacing: .08em; color: var(--ph-dim); opacity: .8; }
|
|
1627
|
+
.maturity-next { color: var(--ph); }
|
|
1628
|
+
@media (max-width: 860px) { .maturity-row { grid-template-columns: 1fr; gap: 2px; } .maturity-row i { display: none; } }
|