@jossuealcala/madre 1.0.1 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/ADDITIONAL-TERMS.md +93 -0
  2. package/CHANGELOG.en.md +2013 -0
  3. package/CHANGELOG.md +102 -1
  4. package/CONTRIBUTING.md +1 -1
  5. package/LICENSE +661 -202
  6. package/NOTICE +26 -14
  7. package/README.en.md +241 -0
  8. package/README.md +21 -12
  9. package/TRADEMARKS.en.md +50 -0
  10. package/TRADEMARKS.md +33 -16
  11. package/bin/madre.cjs +40 -0
  12. package/bin/madre.mjs +7 -0
  13. package/docs/INTERNALS.md +6 -0
  14. package/docs/REFERENCE.md +40 -5
  15. package/docs/SDK.md +4 -2
  16. package/docs/en/INTERNALS.md +103 -0
  17. package/docs/en/REFERENCE.md +365 -0
  18. package/docs/en/SDK.md +308 -0
  19. package/docs/en/training/README.md +59 -0
  20. package/docs/training/README.md +48 -9
  21. package/docs/training/train.sh +7 -2
  22. package/package.json +13 -5
  23. package/public/abduction.js +2 -0
  24. package/public/app.js +3154 -539
  25. package/public/attribution.js +114 -0
  26. package/public/brands.js +23 -6
  27. package/public/code-tools.js +143 -0
  28. package/public/editor.js +22 -4
  29. package/public/es.js +1004 -416
  30. package/public/hardware.js +50 -0
  31. package/public/i18n.js +25 -1
  32. package/public/index.html +18 -11
  33. package/public/inquiry.js +2 -0
  34. package/public/loader.js +2 -0
  35. package/public/macroverso.js +189 -96
  36. package/public/market-art.js +161 -0
  37. package/public/market-view.js +529 -0
  38. package/public/market.js +189 -0
  39. package/public/neural.js +110 -0
  40. package/public/nostromo-engine.js +414 -47
  41. package/public/power.js +100 -0
  42. package/public/resay.js +11 -0
  43. package/public/review-ask.js +2 -0
  44. package/public/routing.js +23 -1
  45. package/public/salas-mac.css +119 -18
  46. package/public/salas-mac.html +14 -2
  47. package/public/salas-mac.js +358 -56
  48. package/public/salas.css +2 -0
  49. package/public/salas.html +1 -0
  50. package/public/salas.js +4 -2
  51. package/public/styles.css +1793 -77
  52. package/public/syntax.js +2 -0
  53. package/public/touch.js +2 -0
  54. package/public/tour-chapters.js +2 -0
  55. package/public/tour.js +84 -5
  56. package/public/troubleshooting.js +24 -17
  57. package/public/wallpaper.js +275 -0
  58. package/src/adapters/claude.mjs +2 -0
  59. package/src/adapters/codex.mjs +2 -0
  60. package/src/adapters/cursor.mjs +96 -0
  61. package/src/adapters/gemini.mjs +13 -4
  62. package/src/adapters/madre.mjs +5 -2
  63. package/src/adapters/opencode.mjs +7 -3
  64. package/src/adapters/process.mjs +2 -0
  65. package/src/asking.mjs +2 -0
  66. package/src/auth-probe.mjs +145 -12
  67. package/src/bridge/devices.mjs +2 -0
  68. package/src/bridge/handoff.mjs +2 -0
  69. package/src/bridge/host.mjs +2 -0
  70. package/src/bridge/network.mjs +2 -0
  71. package/src/bridge/policy.mjs +3 -1
  72. package/src/bridge/qr.mjs +2 -0
  73. package/src/bridge/server.mjs +2 -0
  74. package/src/capabilities.mjs +11 -0
  75. package/src/chats.mjs +2 -0
  76. package/src/checkpoint.mjs +18 -1
  77. package/src/choices.mjs +2 -0
  78. package/src/cli-args.mjs +2 -0
  79. package/src/cold.mjs +2 -0
  80. package/src/commands.mjs +2 -0
  81. package/src/config.mjs +2 -0
  82. package/src/conversation-context.mjs +15 -1
  83. package/src/credentials.mjs +35 -3
  84. package/src/dataset.mjs +78 -4
  85. package/src/directives.mjs +2 -0
  86. package/src/distiller.mjs +2 -0
  87. package/src/embeddings.mjs +2 -0
  88. package/src/enlaces.mjs +214 -6
  89. package/src/event-store.mjs +2 -0
  90. package/src/exam.mjs +6 -4
  91. package/src/extensions.mjs +13 -3
  92. package/src/eyecat-watch.mjs +2 -0
  93. package/src/eyecat.mjs +2 -0
  94. package/src/file-ops.mjs +2 -0
  95. package/src/files.mjs +32 -0
  96. package/src/github.mjs +2 -0
  97. package/src/heartbeat.mjs +2 -0
  98. package/src/i18n.mjs +31 -1
  99. package/src/image-studio.mjs +2 -0
  100. package/src/json-file.mjs +2 -0
  101. package/src/launch.mjs +2 -0
  102. package/src/lease.mjs +5 -1
  103. package/src/lobby-work.mjs +2 -0
  104. package/src/local-ai.mjs +2 -0
  105. package/src/looks.mjs +127 -2
  106. package/src/market-key.mjs +8 -0
  107. package/src/market-remote.mjs +239 -0
  108. package/src/maturity.mjs +3 -1
  109. package/src/mcp/connect.mjs +345 -0
  110. package/src/mcp/github-server.mjs +2 -0
  111. package/src/mcp/image-server.mjs +2 -0
  112. package/src/mcp/memory-server.mjs +2 -0
  113. package/src/mcp/proxy.mjs +153 -0
  114. package/src/mcp/smtp-server.mjs +2 -0
  115. package/src/memory-dashboard.mjs +2 -0
  116. package/src/memory-tools.mjs +2 -0
  117. package/src/memory.mjs +2 -0
  118. package/src/models.mjs +49 -3
  119. package/src/module-scope.mjs +68 -0
  120. package/src/modules/ahp.mjs +104 -7
  121. package/src/modules/ash-policy.mjs +2 -0
  122. package/src/modules/ash.mjs +3 -1
  123. package/src/modules/bishop-exam.mjs +122 -0
  124. package/src/modules/bishop-plan.mjs +5 -3
  125. package/src/modules/bishop.mjs +84 -23
  126. package/src/modules/choices.mjs +2 -0
  127. package/src/modules/correo.mjs +2 -0
  128. package/src/modules/enlaces.mjs +89 -6
  129. package/src/modules/git-pulse.mjs +2 -0
  130. package/src/modules/github.mjs +2 -0
  131. package/src/modules/helpers.mjs +2 -0
  132. package/src/modules/image-studio.mjs +13 -2
  133. package/src/modules/index.mjs +4 -1
  134. package/src/modules/intents-calibration.mjs +2 -0
  135. package/src/modules/intents-desk.mjs +4 -2
  136. package/src/modules/intents-observe.mjs +2 -0
  137. package/src/modules/intents-policy.mjs +4 -1
  138. package/src/modules/intents-try.mjs +2 -0
  139. package/src/modules/intents.mjs +11 -7
  140. package/src/modules/local-models.mjs +124 -0
  141. package/src/modules/mcp-connect.mjs +293 -0
  142. package/src/modules/ollama.mjs +15 -4
  143. package/src/modules/playwright.mjs +88 -15
  144. package/src/modules/ripley.mjs +2 -0
  145. package/src/modules/runs.mjs +5 -3
  146. package/src/modules/sdk.mjs +63 -9
  147. package/src/modules/updates.mjs +2 -0
  148. package/src/mother.mjs +2 -0
  149. package/src/npm-launch.mjs +18 -0
  150. package/src/ollama.mjs +8 -5
  151. package/src/outbound.mjs +16 -6
  152. package/src/override.mjs +2 -0
  153. package/src/ports.mjs +6 -2
  154. package/src/prices.mjs +2 -0
  155. package/src/privacy.mjs +2 -0
  156. package/src/quota-monitor.mjs +2 -0
  157. package/src/quota-sources.mjs +2 -0
  158. package/src/request-guard.mjs +2 -0
  159. package/src/review-ask.mjs +2 -0
  160. package/src/room/archivist.mjs +2 -0
  161. package/src/room/attachments.mjs +2 -0
  162. package/src/room/budget.mjs +2 -0
  163. package/src/room/context.mjs +2 -0
  164. package/src/room/control.mjs +7 -1
  165. package/src/room/copilot.mjs +76 -0
  166. package/src/room/economy.mjs +2 -0
  167. package/src/room/escalation.mjs +2 -0
  168. package/src/room/ghost.mjs +2 -0
  169. package/src/room/guard.mjs +2 -0
  170. package/src/room/prompt.mjs +25 -5
  171. package/src/room/returns.mjs +82 -0
  172. package/src/room/runs.mjs +4 -0
  173. package/src/room/vectors.mjs +2 -0
  174. package/src/room.mjs +223 -35
  175. package/src/router.mjs +3 -1
  176. package/src/runs.mjs +6 -1
  177. package/src/runtime-detection.mjs +11 -0
  178. package/src/salas.mjs +28 -0
  179. package/src/sentinel-errors.mjs +2 -0
  180. package/src/server-sentinel.mjs +2 -0
  181. package/src/server.mjs +757 -81
  182. package/src/setup.mjs +3 -1
  183. package/src/smtp.mjs +2 -0
  184. package/src/tour.mjs +2 -0
  185. package/src/updates.mjs +2 -0
  186. package/src/usage-sentinel.mjs +2 -0
  187. package/src/vault.mjs +2 -0
  188. package/src/verdict.mjs +3 -1
  189. package/src/whats-new.mjs +2 -0
package/public/styles.css CHANGED
@@ -1,3 +1,5 @@
1
+ /* SPDX-License-Identifier: AGPL-3.0-only
2
+ MADRE · © 2026 Jossue Alcalá · GNU AGPL v3 with additional terms (Section 7): ADDITIONAL-TERMS.md */
1
3
  /* MADRE — a conversation, not a log.
2
4
  iMessage for the dialogue, a terminal for the metadata, MOTHER for the mood. */
3
5
 
@@ -41,6 +43,9 @@
41
43
  --text-3: #626a5f;
42
44
 
43
45
  --phosphor: #9bff66; /* MOTHER */
46
+ /* MADRE's own green, which an accent never repaints: the copilot wears it (2026-10-14). */
47
+ --madre-green: #9bff66;
48
+ --madre-green-ink: #0a1405;
44
49
  --brew: #28fe14; /* Terminal.app 'Homebrew' green */
45
50
  --brew-ink: #041004;
46
51
  --phosphor-ink: #0a1405;
@@ -90,6 +95,14 @@
90
95
  --icon-stroke: 1.6;
91
96
  --icon-stroke-hover: 1.8;
92
97
  --icon-stroke-on: 2.05;
98
+ /* The icons' sizes (1.0.3): four, and which one a drawing takes is said by what holds it, never
99
+ by the drawing. A mark inside a pill, a tab or a badge (×, ⌄, ✓); a key of 22 to 30 px, or a
100
+ drawing beside a word; a square key of 34 px (the narrow bar, the house's keys, the box); a
101
+ round key that floats (40 to 44 px). */
102
+ --ico-xs: 12px;
103
+ --ico-sm: 15px;
104
+ --ico-md: 18px;
105
+ --ico-lg: 22px;
93
106
  }
94
107
  /* Reading code, in whichever ground the room is standing on. These were picked for phosphor on
95
108
  black; on white the same green and yellow disappear, so each one has a light value of its own. */
@@ -121,6 +134,8 @@
121
134
  --text-2: #5a615a;
122
135
  --text-3: #767d75;
123
136
  --phosphor: #2f8a1c;
137
+ --madre-green: #2f8a1c;
138
+ --madre-green-ink: #ffffff;
124
139
  --brew: #178f0c;
125
140
  --brew-ink: #ffffff;
126
141
  --phosphor-ink: #ffffff;
@@ -157,6 +172,8 @@
157
172
  --text-2: #5a615a;
158
173
  --text-3: #767d75;
159
174
  --phosphor: #2f8a1c;
175
+ --madre-green: #2f8a1c;
176
+ --madre-green-ink: #ffffff;
160
177
  --brew: #178f0c;
161
178
  --brew-ink: #ffffff;
162
179
  --phosphor-ink: #ffffff;
@@ -829,8 +846,11 @@ textarea::placeholder { color: var(--text-3); }
829
846
  .composer.m2 { --mode: var(--mode-2); --mode-ink: var(--mode-2-ink); }
830
847
  .composer.m3 { --mode: var(--mode-3); --mode-ink: var(--mode-3-ink); }
831
848
  .composer.m4 { --mode: var(--mode-4); --mode-ink: var(--mode-4-ink); }
849
+ /* Under the copilot #3 is MADRE's green, not EDIT's red: the chip, the send and the ring follow. */
850
+ .composer.m3.copilot { --mode: var(--madre-green); --mode-ink: var(--madre-green-ink); }
851
+ .composer.copilot .picker .mode-chip.m3 { --mode: var(--madre-green); }
832
852
  .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: var(--lift-1); transition: background calc(250ms * var(--motion-scale)), box-shadow calc(250ms * var(--motion-scale)); }
833
- .field button[type="submit"] svg { width: 18px; height: 18px; }
853
+ .field button[type="submit"] svg { width: var(--ico-md); height: var(--ico-md); }
834
854
  .field button[type="submit"]:hover { filter: brightness(1.06); }
835
855
  .field button[type="submit"]:disabled { opacity: .4; cursor: default; box-shadow: none; }
836
856
  .pick-label .pick-note { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-family: var(--mono); font-size: 9px; letter-spacing: .14em; text-transform: uppercase; color: var(--text-3); white-space: nowrap; }
@@ -886,6 +906,11 @@ textarea::placeholder { color: var(--text-3); }
886
906
  .who .reply { max-width: 150px; }
887
907
  .system .gauge { width: 160px; }
888
908
  }
909
+ /* A conversation 680 px wide beside a docked panel reads as one in a 680 px window (app.js, roomWidth);
910
+ the bar has its own container and folds by itself. */
911
+ :where(:root.room-680) .row { max-width: 96%; }
912
+ :where(:root.room-680) .who .reply { max-width: 150px; }
913
+ :where(:root.room-680) .system .gauge { width: 160px; }
889
914
 
890
915
  /* ================= MU/TH/UR: troubleshooting ================= */
891
916
  .mother-button {
@@ -1009,6 +1034,10 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
1009
1034
  .mother-cmd .copy:hover { color: var(--ph); border-color: var(--ph-dim); }
1010
1035
  .mother-cmd .copy.done { color: var(--ph); border-color: var(--ph); }
1011
1036
  .mother-cmd .copy:hover { color: var(--ph); border-color: var(--ph); }
1037
+ /* The copy key holds only its drawing: a button rule of a sheet or a card (13px each side) used to
1038
+ reach it and leave the drawing no room, an empty square beside the command (2026-10-18). */
1039
+ .mother-cmd > .copy { padding: 0 !important; min-width: 26px; }
1040
+ .mother-cmd > .copy svg { flex: none; width: 13px; height: 13px; }
1012
1041
  .mother-record { display: grid; grid-template-columns: 64px 92px 1fr auto 20px; gap: 14px; align-items: baseline; padding: 10px 0; border-bottom: 1px solid var(--ph-faint); font-size: 12px; }
1013
1042
  .mother-record .t { color: var(--ph-dim); }
1014
1043
  .mother-record .a { color: var(--agent, var(--ph)); text-transform: uppercase; letter-spacing: .1em; }
@@ -1081,8 +1110,11 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
1081
1110
  .module-card .actions .note { font-size: 10px; letter-spacing: .12em; color: var(--ph-dim); }
1082
1111
  .module-card .confirm { border: 1px dashed var(--ph); padding: 12px 14px; display: grid; gap: 10px; }
1083
1112
  .module-card .confirm .warn { color: #ffd166; font-size: 11px; letter-spacing: .12em; }
1084
- .module-log { max-height: 260px; overflow-y: auto; border: 1px solid var(--ph-faint); background: #000; padding: 10px 12px; font-size: 11.5px; line-height: 1.55; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--ph); }
1085
- .module-log .err { color: #ff7b72; }
1113
+ /* What an install printed, in the same box as the commands beside it (2026-10-18): the page's own
1114
+ ground and ink, in the code face. It was a black terminal painted with the theme's phosphor,
1115
+ which on the light theme is a dark green: dark grey on black, unreadable. */
1116
+ .module-log { max-height: 260px; overflow-y: auto; margin: 0; padding: 10px 12px; border: 0; border-radius: 10px; background: color-mix(in srgb, var(--text) 5%, transparent); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .14); font-family: var(--mono); font-size: 11.5px; line-height: 1.6; letter-spacing: 0; text-transform: none; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text-2); }
1117
+ .module-log .err { color: var(--crit, #d93a3a); }
1086
1118
  .system.module { color: var(--phosphor); }
1087
1119
  .system.module .cmd { text-transform: none; letter-spacing: 0; color: var(--text-2); display: block; margin-top: 4px; }
1088
1120
  .system.module.failed { color: var(--danger); }
@@ -1184,7 +1216,11 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
1184
1216
 
1185
1217
  .model-menu.effort-menu { --tone: var(--agent, var(--phosphor)); width: min(400px, calc(100vw - 24px)); padding: 12px 14px 10px; }
1186
1218
  .effort-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; margin: 2px 2px 12px; }
1187
- .effort-head .model-menu-title { margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
1219
+ /* The title on the left and AUTO in the right corner, on the same line (2026-10-14): the title
1220
+ keeps its room and is cut before it is covered; a long AUTO reading is cut instead of the title. */
1221
+ .effort-head .model-menu-title { flex: 1 1 auto; min-width: 0; margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; line-height: 1.4; }
1222
+ .effort-head .effort-auto { margin-left: auto; max-width: 52%; }
1223
+ .effort-head .effort-auto .hint { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1188
1224
  /* Letting the CLI decide: a small switch beside the title, lit while it is the choice. */
1189
1225
  .effort-auto { display: inline-flex; align-items: center; gap: 7px; flex: none; height: 26px; padding: 0 10px 0 9px; border: 1px solid var(--line-2); border-radius: 999px; background: transparent; color: var(--text-2); font: inherit; cursor: pointer; transition: color var(--motion) var(--ease-out), border-color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out); }
1190
1226
  .effort-auto .auto-dot { width: 7px; height: 7px; border-radius: 50%; border: 1.5px solid currentColor; transition: background-color var(--motion) var(--ease-out); }
@@ -1327,7 +1363,7 @@ dialog.override[open] { display: grid; place-items: center; }
1327
1363
  .field { grid-template-columns: auto minmax(0, 1fr) auto auto auto auto; }
1328
1364
  .attach { width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--text-3); cursor: pointer; display: grid; place-items: center; }
1329
1365
  .attach:hover { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); }
1330
- .attach svg { width: 18px; height: 18px; }
1366
+ .attach svg { width: var(--ico-md); height: var(--ico-md); }
1331
1367
  .composer.dropping .field { border-color: var(--phosphor); box-shadow: 0 0 0 3px color-mix(in srgb, var(--phosphor) 16%, transparent); }
1332
1368
  .attachments { display: flex; gap: 8px; flex-wrap: wrap; padding: 0 6px; }
1333
1369
  .attachment-chip { display: inline-flex; align-items: center; gap: 8px; padding: 4px 6px 4px 4px; border: 1px solid var(--line-2); border-radius: 10px; background: var(--panel); font-family: var(--mono); font-size: 10.5px; color: var(--text-2); max-width: 260px; }
@@ -1382,7 +1418,7 @@ dialog.viewer { border: 0; padding: 0; width: min(1100px, 96vw); max-width: 96vw
1382
1418
  The crew is the exception that needs markup: five spheres cannot be compacted by CSS into one
1383
1419
  button, so there are two elements and the container query picks which one is on screen. */
1384
1420
  .bar-icon { display: inline-flex; align-items: center; justify-content: center; gap: 5px; width: auto; padding: 0 8px 0 6px; height: 28px; padding: 0; border-radius: 8px; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); cursor: pointer; }
1385
- .bar-icon svg { width: 17px; height: 17px; }
1421
+ .bar-icon svg { width: var(--ico-sm); height: var(--ico-sm); }
1386
1422
  .bar-icon:hover { color: var(--phosphor); border-color: var(--phosphor); }
1387
1423
  .bar-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-family: var(--mono); font-size: 9px; letter-spacing: 0; }
1388
1424
  .bar-glyph { display: none; }
@@ -1412,7 +1448,7 @@ dialog.viewer { border: 0; padding: 0; width: min(1100px, 96vw); max-width: 96vw
1412
1448
  that was on screen. A count belongs inside the thing it counts. */
1413
1449
  .mother-button { width: auto; height: 28px; padding: 0 9px 0 7px; gap: 5px; font-size: 0; justify-content: center; }
1414
1450
  .mother-button .mother-glyph { display: none; }
1415
- .mother-button .bar-glyph { display: block; width: 17px; height: 17px; }
1451
+ .mother-button .bar-glyph { display: block; width: var(--ico-md); height: var(--ico-md); }
1416
1452
  .mother-button .modules-count, .mother-button .mother-count { font-size: 9px; }
1417
1453
  .stop-all { width: 30px; height: 28px; padding: 0; gap: 0; font-size: 0; justify-content: center; }
1418
1454
  /* Squircles with their count on the corner, the way a phone shows it. The count used to be
@@ -1421,7 +1457,7 @@ dialog.viewer { border: 0; padding: 0; width: min(1100px, 96vw); max-width: 96vw
1421
1457
  and touches nothing else. A ring in the background colour cuts it out of the outline. */
1422
1458
  .bar { gap: 14px; }
1423
1459
  .bar-icon, .mother-button, .stop-all { position: relative; width: 34px; height: 34px; padding: 0; gap: 0; border-radius: 11px; justify-content: center; }
1424
- .bar-icon svg, .mother-button .bar-glyph { width: 18px; height: 18px; }
1460
+ .bar-icon svg, .mother-button .bar-glyph { width: var(--ico-md); height: var(--ico-md); }
1425
1461
  .bar-icon .bar-count, .mother-button .modules-count, .mother-button .mother-count {
1426
1462
  position: absolute; top: -6px; right: -7px; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px;
1427
1463
  font-family: var(--mono); font-size: 9.5px; font-weight: 700; line-height: 18px; box-shadow: 0 0 0 2px var(--bg);
@@ -1521,6 +1557,8 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1521
1557
  .viewer-nav { display: inline-flex; gap: 4px; }
1522
1558
  .viewer-nav .nav { width: 26px; height: 26px; display: grid; place-items: center; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); border-radius: 7px; cursor: pointer; font: inherit; font-size: 14px; line-height: 1; }
1523
1559
  .viewer-nav .nav:hover { color: var(--text); border-color: var(--text-3); }
1560
+ /* The browser's reload is the bar's reload mark (2026-10-14), the same drawing, still. */
1561
+ .viewer-nav .nav.reload svg { width: var(--ico-sm); height: var(--ico-sm); }
1524
1562
  .viewer-nav .nav:disabled { opacity: .35; cursor: default; }
1525
1563
  .viewer-errors { display: grid; gap: 6px; padding: 8px 16px; border-bottom: 1px solid color-mix(in srgb, var(--danger) 40%, transparent); background: color-mix(in srgb, var(--danger) 7%, transparent); font-family: var(--mono); font-size: 11px; }
1526
1564
  .viewer-errors:not([hidden]) + .viewer-body { height: auto; max-height: calc(100% - 46px); }
@@ -1578,7 +1616,7 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1578
1616
 
1579
1617
  /* ================= creation lease ================= */
1580
1618
  .create-toggle { height: 30px; padding: 0 10px 0 8px; border-radius: 999px; border: 1px solid var(--line-2); background: transparent; color: var(--text-3); display: inline-flex; align-items: center; gap: 6px; cursor: pointer; font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; align-self: center; transition: color calc(200ms * var(--motion-scale)), border-color calc(200ms * var(--motion-scale)), background calc(200ms * var(--motion-scale)); }
1581
- .create-toggle svg { width: 15px; height: 15px; }
1619
+ .create-toggle svg { width: var(--ico-sm); height: var(--ico-sm); }
1582
1620
  .create-toggle:hover { color: var(--text); border-color: var(--text-3); }
1583
1621
  .create-toggle[aria-pressed="true"] { color: var(--warn); border-color: var(--warn); background: color-mix(in srgb, var(--warn) 12%, transparent); text-shadow: none; }
1584
1622
  .create-toggle .lock.open { display: none; }
@@ -1695,8 +1733,10 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1695
1733
  .system.control.changed.quiet { border-style: dashed; color: var(--text-2); background: transparent; }
1696
1734
  /* The status and the path in two columns: the status never breaks inside a word (MODIFICADO used
1697
1735
  to split as MODIFICAD / O), and a long path breaks inside itself, left-aligned, not centred. */
1698
- .system.control .files { list-style: none; margin: 0; padding: 0; display: grid; gap: 6px; justify-self: stretch; text-align: left; }
1699
- .system.control .files li { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 10px; align-items: baseline; }
1736
+ /* Centred like the head and the tally around them: the list is one block in the middle of the card,
1737
+ its kinds and its files still each in their own column. */
1738
+ .system.control .files { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: max-content minmax(0, max-content); justify-content: center; gap: 6px 10px; align-items: baseline; justify-self: stretch; text-align: left; }
1739
+ .system.control .files li { display: contents; }
1700
1740
  .system.control .files .st { font-family: var(--mono); font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); min-width: 64px; white-space: nowrap; }
1701
1741
  .system.control .files .st.A { color: var(--phosphor); } .system.control .files .st.M { color: var(--warn); } .system.control .files .st.D { color: var(--danger); }
1702
1742
  .system.control .files .file-ref { font-family: var(--mono); font-size: 12px; color: var(--text); background: transparent; border: 0; border-bottom: 1px dashed var(--line-2); padding: 0; cursor: pointer; text-align: left; overflow-wrap: anywhere; justify-self: start; }
@@ -1762,6 +1802,8 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1762
1802
  .bubble .artifacts { margin: 10px 0 0; padding-top: 8px; border-top: 1px dashed var(--line-2); }
1763
1803
  .bubble .artifacts .label { display: block; font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; text-transform: uppercase; color: var(--warn); margin-bottom: 6px; }
1764
1804
  @media (max-width: 680px) { .create-toggle .create-word { display: none; } .create-toggle { padding: 0 8px; } }
1805
+ /* The same at 680 px of conversation beside a docked panel, where the window's width says nothing (app.js, roomWidth). */
1806
+ :where(:root.room-680) .create-toggle .create-word { display: none; } :where(:root.room-680) .create-toggle { padding: 0 8px; }
1765
1807
 
1766
1808
  /* no horizontal overflow inside bubbles: wrap everything */
1767
1809
  .bubble, .bubble * { min-width: 0; }
@@ -1910,6 +1952,13 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1910
1952
  .mode-what { min-width: 0; font-size: 13px; line-height: 1.45; color: var(--text); }
1911
1953
  .mode-what .who { display: inline; margin: 0; padding: 0; font: inherit; font-weight: 700; letter-spacing: 0; text-transform: none; color: var(--agent, var(--text)); }
1912
1954
  .mode-why { font-size: 11.5px; line-height: 1.45; color: var(--text-2); }
1955
+ .mode-what .mode-time { font-family: var(--mono); font-size: 11px; letter-spacing: .04em; color: var(--text-2); }
1956
+ /* How long the permission holds: the time the agent asked for, preselected; the human may change it. */
1957
+ .mode-windows { display: inline-flex; flex-wrap: wrap; gap: 4px; padding: 3px; border-radius: 999px; background: color-mix(in srgb, var(--text) 5%, transparent); justify-self: start; }
1958
+ .mode-window { border: 0; border-radius: 999px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 10px; letter-spacing: .08em; padding: 5px 10px; cursor: pointer; transition: background .18s ease, color .18s ease; }
1959
+ .mode-window:hover { color: var(--text); }
1960
+ .mode-window[aria-checked="true"] { background: var(--panel, #fff); color: var(--text); box-shadow: 0 1px 2px rgb(0 0 0 / .12); }
1961
+ .mode-window:focus-visible { outline: 2px solid color-mix(in srgb, var(--warn, #e2a022) 60%, transparent); outline-offset: 1px; }
1913
1962
  .mode-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 4px; }
1914
1963
  .mode-alt { border: 1px solid var(--line-2); border-radius: 7px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 10px; letter-spacing: .1em; padding: 6px 11px; cursor: pointer; }
1915
1964
  .mode-alt:hover { color: var(--text); border-color: var(--text-3); }
@@ -1967,6 +2016,16 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
1967
2016
  .run-request .run-line.ran .choice-tag { border-color: var(--ok, var(--phosphor)); color: var(--ok, var(--phosphor)); }
1968
2017
  .run-request .run-line.failed .choice-tag { border-color: var(--crit); color: var(--crit); }
1969
2018
  .run-request .run-summary { margin: 10px 2px 0; font-family: var(--mono); font-size: 10.5px; color: var(--text-2); }
2019
+ /* RUN ALL and the hand-back: quiet buttons in the agent's colour, under the summary. */
2020
+ .run-request .run-actions { display: flex; flex-wrap: wrap; gap: 6px; margin: 10px 2px 0; }
2021
+ .run-request .run-actions:empty { display: none; }
2022
+ .run-request :is(.run-all, .run-back) { border: 1px solid color-mix(in srgb, var(--agent, var(--phosphor)) 55%, transparent); border-radius: 999px; background: transparent; color: var(--agent, var(--text)); font-family: var(--mono); font-size: 10px; letter-spacing: .1em; padding: 6px 12px; cursor: pointer; transition: background .18s ease; }
2023
+ .run-request :is(.run-all, .run-back):hover:not(:disabled) { background: color-mix(in srgb, var(--agent, var(--phosphor)) 10%, transparent); }
2024
+ .run-request :is(.run-all, .run-back):disabled { opacity: .5; cursor: progress; }
2025
+ .run-request.returned .run-summary { color: var(--ok, var(--phosphor)); }
2026
+ .run-request.returned .run-all { display: none; }
2027
+ /* A message MADRE wrote for the human: the results of commands going back. Same bubble, quieter. */
2028
+ #messages .row.user.auto .bubble { opacity: .82; }
1970
2029
  .run-request .run-progress-track { position: relative; flex: 1 1 100%; height: 3px; overflow: hidden; border-radius: 3px; background: color-mix(in srgb, var(--agent, var(--phosphor)) 18%, transparent); }
1971
2030
  .run-request .run-progress-track::after { content: ''; position: absolute; inset: 0 auto 0 0; width: 32%; border-radius: inherit; background: var(--agent, var(--phosphor)); animation: run-travel 1.6s ease-in-out infinite alternate; }
1972
2031
  @keyframes run-travel { from { transform: translateX(0); } to { transform: translateX(220%); } }
@@ -2038,6 +2097,7 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
2038
2097
  .free-offer .free-go { flex: none; border: 1px solid var(--brew); background: transparent; color: var(--brew); font-family: var(--mono); font-size: 10px; font-weight: 600; letter-spacing: .12em; padding: 6px 12px; border-radius: 7px; cursor: pointer; }
2039
2098
  .free-offer .free-go:hover { background: color-mix(in srgb, var(--brew) 16%, transparent); }
2040
2099
  @media (max-width: 720px) { .free-offer { flex-wrap: wrap; } }
2100
+ :where(:root.room-720) .free-offer { flex-wrap: wrap; }
2041
2101
  /* Intenciones: the same shelf as the @madre offer, in the room's accent when a cheaper rung was
2042
2102
  measured to be enough or is worth measuring, and in the warning ink when the rung chosen looks
2043
2103
  too light. The shelf itself is drawn with the box, below. */
@@ -2078,14 +2138,14 @@ dialog.intents-window { width: 760px; height: 640px; }
2078
2138
  .slash-menu .hint { padding: 4px 10px 6px; font-family: var(--mono); font-size: 10px; letter-spacing: .12em; color: var(--text-3); }
2079
2139
  /* ---------- project files panel: lives in the free space right of the thread ---------- */
2080
2140
  .tree-button { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 26px; border-radius: 6px; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); cursor: pointer; padding: 0; }
2081
- .tree-button svg { width: 16px; height: 16px; }
2141
+ .tree-button svg { width: var(--ico-sm); height: var(--ico-sm); }
2082
2142
  .tree-button:hover { color: var(--phosphor); border-color: var(--phosphor); box-shadow: var(--ring-soft); }
2083
2143
  /* The conversations of this project, on the other side of the canvas from the files: the same
2084
2144
  panel, so there is one shape to learn, and never both edges at once on a narrow screen. */
2085
2145
  .tree.chats { justify-self: start; margin: 18px 0 10px 20px; grid-template-rows: auto minmax(0, 1fr) auto auto; }
2086
2146
  .chats-new { padding: 10px 12px; border-top: 1px solid var(--line); }
2087
2147
  .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; }
2088
- .chats-new-button svg { width: 14px; height: 14px; }
2148
+ .chats-new-button svg { width: var(--ico-sm); height: var(--ico-sm); }
2089
2149
  .chats-new-button:hover { color: var(--phosphor); border-color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 8%, transparent); }
2090
2150
  .chats-body { padding: 10px 8px; display: grid; gap: 6px; align-content: start; }
2091
2151
  .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; }
@@ -2111,7 +2171,7 @@ dialog.intents-window { width: 760px; height: 640px; }
2111
2171
  .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); }
2112
2172
  /* Its handle sits in the canvas, under the bar, where the conversation it opens begins. */
2113
2173
  .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; }
2114
- .chats-button svg { width: 21px; height: 21px; }
2174
+ .chats-button svg { width: var(--ico-lg); height: var(--ico-lg); }
2115
2175
  .chats-button:hover { color: var(--phosphor); border-color: var(--phosphor); box-shadow: var(--ring-soft); }
2116
2176
  .chats-button:active { transform: translateY(1px); }
2117
2177
 
@@ -2228,6 +2288,31 @@ dialog.intents-window { width: 760px; height: 640px; }
2228
2288
  .command-card .undo { margin: 0 12px 10px; border: 1px solid var(--terror); background: color-mix(in srgb, var(--terror) 12%, transparent); color: var(--terror); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; padding: 7px 12px; border-radius: 8px; cursor: pointer; }
2229
2289
  .command-card .undo:hover { background: color-mix(in srgb, var(--terror) 22%, transparent); }
2230
2290
  .command-card .undo:disabled { opacity: .5; cursor: default; }
2291
+ /* What a terminal said, folded (2026-10-14): one line — the command, how it ended, how long, who
2292
+ asked — and its last line beneath; the output opens on a click, without a jump. */
2293
+ .command-card.terminal .term-head { all: unset; box-sizing: border-box; display: flex; align-items: center; gap: 10px; width: 100%; padding: 9px 12px; cursor: pointer; font-family: var(--mono); font-size: 11.5px; color: var(--text-2); }
2294
+ .command-card.terminal .term-head:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 55%, transparent); outline-offset: -2px; border-radius: 12px; }
2295
+ .command-card.terminal .term-tag { flex: none; font-size: 9.5px; letter-spacing: .14em; font-weight: 600; color: var(--text-3); }
2296
+ .command-card.terminal code.term-line { padding: 0; border: 0; background: none; }
2297
+ .command-card.terminal .term-line { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: var(--mono); font-size: 12px; color: var(--text); }
2298
+ .command-card.terminal .term-status { flex: none; padding: 2px 9px; border-radius: 999px; font-size: 10px; letter-spacing: .03em; white-space: nowrap; color: var(--text-2); background: color-mix(in srgb, var(--text) 6%, transparent); }
2299
+ .command-card.terminal .term-status.ok { color: var(--ok, #2f9e44); background: color-mix(in srgb, var(--ok, #2f9e44) 12%, transparent); }
2300
+ .command-card.terminal .term-status.failed { color: var(--crit); background: color-mix(in srgb, var(--crit) 12%, transparent); }
2301
+ .command-card.terminal .term-who { flex: none; font-size: 10.5px; color: var(--agent, var(--text-3)); }
2302
+ .command-card.terminal .term-count { flex: none; font-size: 10px; color: var(--text-3); white-space: nowrap; }
2303
+ .command-card.terminal .term-head .chev-icon { flex: none; display: inline-flex; color: var(--text-3); transition: transform .22s ease; }
2304
+ .command-card.terminal.open .term-head .chev-icon { transform: rotate(180deg); }
2305
+ .command-card.terminal .term-peek { margin-top: -4px; padding: 0 12px 9px; font-family: var(--mono); font-size: 11px; color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
2306
+ .command-card.terminal.open .term-peek { display: none; }
2307
+ .command-card.terminal .term-out { display: grid; grid-template-rows: 0fr; transition: grid-template-rows .24s ease; }
2308
+ .command-card.terminal.open .term-out { grid-template-rows: 1fr; }
2309
+ .command-card.terminal .term-clip { min-height: 0; overflow: hidden; }
2310
+ .command-card.terminal pre { max-height: 420px; border-top: 1px solid var(--line-2); background: color-mix(in srgb, var(--text) 3%, transparent); }
2311
+ .command-card.terminal pre .l-bad { color: var(--crit); }
2312
+ .command-card.terminal pre .l-good { color: var(--ok, #2f9e44); }
2313
+ .command-card.terminal .undo { margin-top: 10px; }
2314
+ @media (max-width: 560px) { .command-card.terminal .term-count, .command-card.terminal .term-tag { display: none; } }
2315
+ @media (prefers-reduced-motion: reduce) { .command-card.terminal .term-out, .command-card.terminal .term-head .chev-icon { transition: none; } }
2231
2316
  .command-card .outcome { display: inline-block; margin: 0 12px 10px; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; color: var(--phosphor); }
2232
2317
 
2233
2318
  .module-card select { border: 1px solid var(--ph-dim); background: #000; color: var(--ph); font: inherit; font-size: 10.5px; letter-spacing: .06em; padding: 6px 8px; }
@@ -2237,7 +2322,7 @@ dialog.intents-window { width: 760px; height: 640px; }
2237
2322
  .bubble:hover .bubble-actions, .bubble:focus-within .bubble-actions { opacity: 1; }
2238
2323
  @media (hover: none) { .bubble-actions { opacity: .55; } }
2239
2324
  .bubble-actions .act { width: 26px; height: 26px; display: grid; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--text-3); cursor: pointer; padding: 0; transition: color calc(150ms * var(--motion-scale)), background calc(150ms * var(--motion-scale)); }
2240
- .bubble-actions .act svg { width: 15px; height: 15px; }
2325
+ .bubble-actions .act svg { width: var(--ico-sm); height: var(--ico-sm); }
2241
2326
  .bubble-actions .act:hover { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
2242
2327
  .bubble-actions .act.good.on { color: var(--phosphor); }
2243
2328
  .bubble-actions .act.bad.on { color: var(--terror); }
@@ -2294,12 +2379,12 @@ dialog.intents-window { width: 760px; height: 640px; }
2294
2379
  Every control in the bar carries a drawing in the same idiom — 20×20, round ends, one stroke —
2295
2380
  and its word, where it has one, beside it. What is open is drawn heavier and its word is set
2296
2381
  bolder; the pointer gets half of that on the way. Colour, weight and ground carry the state. */
2297
- .bar .bar-glyph { display: block; flex: none; width: 15px; height: 15px; }
2382
+ .bar .bar-glyph { display: block; flex: none; width: var(--ico-sm); height: var(--ico-sm); }
2298
2383
  .bar > .mother-button .mother-glyph { display: none; }
2299
2384
  .bar > .mother-button, .bar > .stop-all { gap: 7px; }
2300
2385
  .update-glyph { display: inline-flex; }
2301
2386
  @container bar (max-width: 980px) {
2302
- .bar > :is(.mother-button, .stop-all) .bar-glyph { width: 18px; height: 18px; }
2387
+ .bar > :is(.mother-button, .stop-all) .bar-glyph { width: var(--ico-md); height: var(--ico-md); }
2303
2388
  .bar > .mother-button, .bar > .stop-all { gap: 0; }
2304
2389
  }
2305
2390
  /* The live line: the dot keeps saying the state, the waves around it say what the dot is. */
@@ -2363,15 +2448,15 @@ dialog.intents-window { width: 760px; height: 640px; }
2363
2448
  replayed the moment .entering was taken off — the panel arrived twice. */
2364
2449
  .tree.chats { transform-origin: left top; }
2365
2450
  .chats .tree-close { display: inline-grid; place-items: center; padding: 4px; transition: color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out); }
2366
- .chats .tree-close svg { display: block; width: 14px; height: 14px; }
2451
+ .chats .tree-close svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
2367
2452
  .chats .tree-close:hover svg { transform: rotate(90deg); }
2368
2453
  .chats-new-button { transition: color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out), border-color var(--motion) var(--ease-out); }
2369
2454
  .chats-new-button:hover { border-style: solid; }
2370
- .chats-new-button svg { width: 15px; height: 15px; }
2455
+ .chats-new-button svg { width: var(--ico-sm); height: var(--ico-sm); }
2371
2456
  .chats-body .chat { grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; transition: background-color var(--motion) var(--ease-out), color var(--motion) var(--ease-out), transform var(--motion-fast) var(--ease-out); }
2372
2457
  .chats-body .chat:active { transform: scale(.985); }
2373
2458
  .chats-body .chat-glyph { display: grid; place-items: center; width: 16px; height: 16px; color: var(--text-3); transition: color var(--motion) var(--ease-out), transform var(--motion) var(--ease-out); }
2374
- .chats-body .chat-glyph svg { display: block; width: 15px; height: 15px; }
2459
+ .chats-body .chat-glyph svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
2375
2460
  .chats-body .chat-glyph :is(.chat-spin, .chat-dot) { margin: 0; vertical-align: 0; }
2376
2461
  .chats-body .chat:hover .chat-glyph { color: var(--text-2); transform: translateX(1px); }
2377
2462
  .chats-body .chat.on .chat-glyph { color: var(--phosphor); transform: none; }
@@ -2428,6 +2513,14 @@ dialog.intents-window { width: 760px; height: 640px; }
2428
2513
  .bridge-card .actions .note { font-family: var(--mono); font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); }
2429
2514
  .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; }
2430
2515
  .bridge-log a { color: var(--phosphor); }
2516
+ /* The other way in, folded under the buttons: the same install or sign-in typed in a terminal.
2517
+ A quiet line until someone asks for it; the room's own buttons stay the way forward. */
2518
+ .terminal-way > summary { width: max-content; font-size: 11.5px; color: var(--text-3); cursor: pointer; list-style: none; }
2519
+ .terminal-way > summary::-webkit-details-marker { display: none; }
2520
+ .terminal-way > summary::after { content: ' ›'; }
2521
+ .terminal-way[open] > summary::after { content: ' ⌄'; }
2522
+ .terminal-way > summary:hover { color: var(--text-2); }
2523
+ .terminal-way .mother-cmd { margin: 8px 0 0; }
2431
2524
 
2432
2525
  .bridge-card .account { font-size: 11px; line-height: 1.5; color: var(--text-3); }
2433
2526
  .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; }
@@ -2473,6 +2566,8 @@ dialog.intents-window { width: 760px; height: 640px; }
2473
2566
  to be nowhere, so the only thing on screen was a heartbeat and the sign-in died of its clock. */
2474
2567
  .login-ask { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
2475
2568
  .login-ask[hidden] { display: none; }
2569
+ .login-device { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
2570
+ .login-device code { font-family: var(--mono); font-size: 15px; letter-spacing: .12em; color: var(--text); user-select: all; }
2476
2571
  .login-code { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; flex: 1 1 260px; }
2477
2572
  .login-code input { flex: 1 1 180px; min-width: 150px; font: inherit; font-size: 12.5px; color: var(--text); background: var(--bg); border: 1px solid var(--line-2); border-radius: 10px; padding: 8px 10px; }
2478
2573
  .login-code input:focus { outline: none; border-color: var(--phosphor); }
@@ -2594,6 +2689,12 @@ dialog.intents-window { width: 760px; height: 640px; }
2594
2689
 
2595
2690
  /* A file an agent wrote in this room, in that agent's own colour. */
2596
2691
  .tree .node .touched { width: 6px; height: 6px; border-radius: 50%; background: var(--agent, var(--ph)); box-shadow: none; flex: 0 0 auto; margin-left: 2px; }
2692
+ /* The way down to what changed: a folder carries the dot of the last touch beneath it, hollow, so
2693
+ the filled one is always the file itself. */
2694
+ .tree .node .touched.trail { background: transparent; box-shadow: inset 0 0 0 1.5px var(--agent, var(--ph)); }
2695
+ .tree-head .tree-refresh.spin svg { animation: tree-spin .6s ease; }
2696
+ @keyframes tree-spin { to { transform: rotate(360deg); } }
2697
+ @media (prefers-reduced-motion: reduce) { .tree-head .tree-refresh.spin svg { animation: none; } }
2597
2698
 
2598
2699
  /* Read by what the file is. Six roles, the room's own phosphor: enough to find a string or a
2599
2700
  comment at a glance, and never so many colours that the code stops being the thing you see. */
@@ -2855,11 +2956,6 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
2855
2956
  border-radius: 16px; background: var(--panel); color: var(--text); border: 1px solid var(--line-2);
2856
2957
  box-shadow: 0 18px 50px rgba(0, 0, 0, .4); animation: wn-in calc(300ms * var(--motion-scale)) cubic-bezier(.2, .8, .2, 1);
2857
2958
  }
2858
- .hint-card.beside::before { content: none; }
2859
- .hint-card::before {
2860
- content: ''; position: absolute; top: -7px; left: calc(var(--arrow, 24px) - 6px); width: 12px; height: 12px;
2861
- background: var(--panel); border-left: 1px solid var(--line-2); border-top: 1px solid var(--line-2); transform: rotate(45deg);
2862
- }
2863
2959
  @media (prefers-reduced-motion: reduce) { .hint-card { animation: none; } }
2864
2960
  .hint-card h3 { margin: 0 0 6px; font-size: 15px; font-weight: 700; }
2865
2961
  .hint-card p { margin: 0; font-size: 13.5px; line-height: 1.5; color: var(--text-2); }
@@ -2926,7 +3022,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
2926
3022
  .split-dock.working .split-spin { display: inline-block; }
2927
3023
  @media (prefers-reduced-motion: reduce) { .split-spin { animation: none; border-color: var(--phosphor); } }
2928
3024
  .split-action { flex: none; display: inline-grid; place-items: center; width: 26px; height: 26px; padding: 0; border: 1px solid transparent; border-radius: 7px; background: transparent; color: var(--text-3); font: inherit; font-size: 16px; line-height: 1; cursor: pointer; }
2929
- .split-action svg { width: 15px; height: 15px; }
3025
+ .split-action svg { width: var(--ico-sm); height: var(--ico-sm); }
2930
3026
  .split-action:hover, .split-action:focus-visible { color: var(--text); border-color: var(--line-2); }
2931
3027
  .split-frame { display: block; width: 100%; height: 100%; min-height: 0; border: 0; background: transparent; }
2932
3028
  .shell.dragging-split .split-frame, .shell.dragging-split .browser-dock iframe { pointer-events: none; }
@@ -2937,7 +3033,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
2937
3033
  window, or a window of its own. One lit is how it is shown now; the other moves it. */
2938
3034
  .chats-body .chat-beside { display: inline-flex; align-items: center; gap: 2px; }
2939
3035
  .chats-body :is(.chat-split, .chat-window) { display: inline-grid; place-items: center; border: 1px solid transparent; background: transparent; color: var(--text-3); padding: 3px 5px; border-radius: 7px; cursor: pointer; opacity: 0; }
2940
- .chats-body :is(.chat-split, .chat-window) svg { width: 14px; height: 14px; }
3036
+ .chats-body :is(.chat-split, .chat-window) svg { width: var(--ico-sm); height: var(--ico-sm); }
2941
3037
  .chats-body :is(.chat-split, .chat-window) { transition: opacity var(--motion) var(--ease-out), color var(--motion) var(--ease-out), border-color var(--motion) var(--ease-out); }
2942
3038
  .chats-body .chat-row:hover :is(.chat-split, .chat-window), .chats-body :is(.chat-split, .chat-window):focus-visible, .chats-body :is(.chat-split, .chat-window).on, .chats-body .chat-beside:has(.on) :is(.chat-split, .chat-window) { opacity: 1; }
2943
3039
  .chats-body :is(.chat-split, .chat-window):hover { color: var(--text); border-color: var(--line-2); }
@@ -3245,7 +3341,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
3245
3341
  .ports-refresh { display: inline-grid; place-items: center; flex: none; width: 28px; height: 28px; padding: 0; border: 0; border-radius: 7px; color: var(--text-2); background: var(--surface, var(--panel)); box-shadow: var(--key-rest); cursor: pointer; }
3246
3342
  .ports-refresh:hover { color: var(--text); box-shadow: var(--key-over, var(--key-rest)); }
3247
3343
  .ports-refresh:focus-visible { outline: 2px solid var(--phosphor); outline-offset: 2px; }
3248
- .ports-refresh svg { width: 17px; height: 17px; }
3344
+ .ports-refresh svg { width: var(--ico-sm); height: var(--ico-sm); }
3249
3345
  .ports-refresh.checking svg { animation: ports-turn .8s linear infinite; }
3250
3346
  @keyframes ports-turn { to { transform: rotate(360deg); } }
3251
3347
  @media (prefers-reduced-motion: reduce) { .ports-refresh.checking svg { animation: none; } }
@@ -3288,7 +3384,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
3288
3384
  .surface-modes { display: inline-flex; align-items: center; flex: none; gap: 0; padding: 2px; border: 1px solid var(--line-2); border-radius: 9px; background: color-mix(in srgb, var(--text) 3%, transparent); }
3289
3385
  .surface-mode { display: inline-grid; place-items: center; width: 26px; height: 22px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: var(--text-3); cursor: pointer; transition: color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out); }
3290
3386
  .surface-mode + .surface-mode { margin-left: 1px; }
3291
- .surface-mode svg { width: 15px; height: 15px; }
3387
+ .surface-mode svg { width: var(--ico-sm); height: var(--ico-sm); }
3292
3388
  .surface-mode:hover, .surface-mode:focus-visible { color: var(--text); background: color-mix(in srgb, var(--text) 7%, transparent); outline: 0; }
3293
3389
  .surface-mode[aria-pressed="true"] { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
3294
3390
  .surface-mode[aria-pressed="true"] :is(.ic-h, .ic-f) { fill: currentColor; fill-opacity: .35; }
@@ -3417,7 +3513,7 @@ dialog.surface.no-intro .mother-frame { animation: none; }
3417
3513
  .slash-menu .group:first-child { padding-top: 6px; }
3418
3514
  .slash-menu .item.cmd { grid-template-columns: 30px minmax(0, 1fr); gap: 12px; align-items: center; padding: 8px 10px; border-radius: 11px; transition: background-color var(--motion-fast) var(--ease-out); }
3419
3515
  .slash-menu .item.cmd .glyph { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; border: 1px solid var(--line-2); background: color-mix(in srgb, var(--text) 3%, transparent); color: var(--text-2); transition: color var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out); }
3420
- .slash-menu .item.cmd .glyph svg { width: 16px; height: 16px; }
3516
+ .slash-menu .item.cmd .glyph svg { width: var(--ico-sm); height: var(--ico-sm); }
3421
3517
  .slash-menu .item.cmd .glyph.agent { border: 0; background: transparent; }
3422
3518
  .slash-menu .item.cmd .glyph.mode { font-family: var(--mono); font-size: 11px; font-weight: 700; color: var(--mode); border-color: color-mix(in srgb, var(--mode) 40%, transparent); }
3423
3519
  .slash-menu .item.cmd .glyph.m0 { --mode: var(--mode-0); } .slash-menu .item.cmd .glyph.m1 { --mode: var(--mode-1); } .slash-menu .item.cmd .glyph.m2 { --mode: var(--mode-2); } .slash-menu .item.cmd .glyph.m3 { --mode: var(--mode-3); } .slash-menu .item.cmd .glyph.m4 { --mode: var(--mode-4); }
@@ -3565,6 +3661,8 @@ dialog.viewer .viewer-status { flex: none; display: flex; align-items: center; g
3565
3661
  dialog.viewer .viewer-status:not(:has(> :not([hidden]))) { display: none; }
3566
3662
  dialog.viewer.editing .viewer-status { display: none; }
3567
3663
  dialog.viewer .viewer-status .viewer-lang { border: 0; padding: 0; letter-spacing: .04em; font-size: 10px; text-transform: none; }
3664
+ /* A narrow viewer ends the hint with «…» instead of cutting it at the edge; the whole of it is its title. */
3665
+ dialog.viewer .viewer-status .viewer-lang { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
3568
3666
  dialog.viewer .viewer-status .viewer-selection { color: var(--phosphor); letter-spacing: .06em; }
3569
3667
  dialog.viewer .viewer-status .viewer-review { margin-left: auto; height: 24px; padding: 0 10px; border-radius: 7px; font-size: 9.5px; }
3570
3668
  dialog.viewer .viewer-menu { z-index: 70; }
@@ -3579,24 +3677,30 @@ dialog.viewer pre.code .ln { cursor: pointer; user-select: none; }
3579
3677
  .ed-btn { height: 26px; padding: 0 9px; gap: 6px; font-size: 9.5px; letter-spacing: .1em; border-radius: 7px; }
3580
3678
  .ed-tools .ed-btn { color: var(--text-2); }
3581
3679
  .ed-btn .ed-ico { display: inline-grid; place-items: center; width: 15px; height: 15px; color: var(--text-3); transition: color var(--motion) var(--ease-out); }
3582
- .ed-btn .ed-ico svg { width: 15px; height: 15px; }
3680
+ .ed-btn .ed-ico svg { width: var(--ico-sm); height: var(--ico-sm); }
3583
3681
  .ed-btn:hover .ed-ico, .ed-btn[aria-pressed="true"] .ed-ico { color: currentColor; }
3584
3682
  .ed-save { padding: 0 12px; }
3585
3683
  .code-editor.dirty .ed-save { color: var(--text); background: color-mix(in srgb, var(--warn) 10%, transparent); }
3586
3684
  .ed-sep { display: none; }
3587
3685
  .ed-status .ed-keys { color: var(--text-2); }
3588
3686
 
3589
- /* What is selected gets its tools right above it. */
3590
- .ed-float { position: absolute; left: 12px; top: 0; z-index: 4; display: inline-flex; gap: 2px; padding: 3px; border: 1px solid var(--line-2); border-radius: 10px; background: var(--panel); box-shadow: 0 10px 28px -12px rgba(0, 0, 0, .5); will-change: transform; animation: float-in calc(160ms * var(--motion-scale)) var(--ease-glide); }
3687
+ /* What is selected gets its tools right above it: the light sheet of the cards under the bar (solid,
3688
+ no glow, no halo; over code a glass would let the letters through), as a capsule. Its words are
3689
+ the room's, in a sentence; its drawings the size of a drawing beside a word; asking an agent, the
3690
+ first of them, wears the accent's flat tone and opens its menu under the chevron. */
3691
+ .ed-float { position: absolute; left: 12px; top: 0; z-index: 4; display: inline-flex; align-items: center; gap: 2px; padding: 3px; border: 0; border-radius: 999px; background: var(--surface, var(--panel)); box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 10%, transparent), 0 1px 2px rgba(0, 0, 0, .18), 0 10px 26px -14px rgba(0, 0, 0, .5); will-change: transform; animation: float-in calc(160ms * var(--motion-scale)) var(--ease-glide); }
3692
+ :root[data-scheme="light"] .ed-float { box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 9%, transparent), 0 1px 2px rgba(20, 30, 25, .08), 0 10px 26px -16px rgba(20, 30, 25, .32); }
3591
3693
  .ed-float[hidden] { display: none; }
3592
3694
  @keyframes float-in { from { opacity: 0; } to { opacity: 1; } }
3593
- .ed-chip { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 9px; border: 0; border-radius: 7px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 9.5px; letter-spacing: .08em; cursor: pointer; transition: color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out); }
3594
- .ed-chip .ed-ico { display: inline-grid; width: 14px; height: 14px; } .ed-chip .ed-ico svg { width: 14px; height: 14px; }
3595
- .ed-chip:hover { color: var(--text); background: color-mix(in srgb, var(--text) 6%, transparent); }
3596
- .ed-chip.ask { color: var(--phosphor); }
3597
- .ed-chip.ask:hover { background: color-mix(in srgb, var(--phosphor) 12%, transparent); }
3598
- .ed-chip.ask b { font-weight: 400; font-size: 8.5px; }
3695
+ .ed-chip { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 12px 0 10px; border: 0; border-radius: 999px; background: transparent; color: var(--text-2); font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; white-space: nowrap; cursor: pointer; transition: color var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out); }
3696
+ .ed-chip .ed-ico { display: inline-grid; place-items: center; width: var(--ico-sm); height: var(--ico-sm); } .ed-chip .ed-ico svg { width: var(--ico-sm); height: var(--ico-sm); }
3697
+ .ed-chip:is(:hover, :focus-visible) { color: var(--text); background: color-mix(in srgb, var(--text) 7%, transparent); outline: 0; }
3698
+ .ed-chip.ask { padding-right: 9px; color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
3699
+ .ed-chip.ask:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--phosphor) 22%, transparent); }
3700
+ .ed-chip .ed-chev { display: inline-grid; place-items: center; margin-left: -1px; opacity: .8; }
3701
+ .ed-chip .ed-chev svg { width: var(--ico-xs); height: var(--ico-xs); }
3599
3702
  .ed-chip.done { color: var(--phosphor); }
3703
+ :root[data-scheme="light"] .ed-chip:is(.ask, .done) { color: color-mix(in srgb, var(--phosphor) 72%, #000000); }
3600
3704
  @media (prefers-reduced-motion: reduce) { .ed-float { animation: none; } }
3601
3705
 
3602
3706
  /* ================= the core: the board =================
@@ -3716,6 +3820,16 @@ dialog.surface.window.mother .mother-head :is(.mother-title, .mother-sub) { curs
3716
3820
  .agent-pop .crew-pct.hot { color: var(--crit); }
3717
3821
  .agent-pop .crew-go { width: 100%; padding: 8px 10px; border: 1px solid var(--line-2); border-radius: 9px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; cursor: pointer; transition: color var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out); }
3718
3822
  .agent-pop .crew-go:hover { color: var(--phosphor); border-color: var(--phosphor); }
3823
+ /* 1.0.3 · The way to the agents' settings: Settings' own gear, at its size, and the room's letter. */
3824
+ .agent-pop .crew-go { display: flex; align-items: center; justify-content: center; gap: 8px; height: 34px; padding: 0 12px; border: 0; border-radius: 10px; background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text); font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; text-transform: none; }
3825
+ .agent-pop .crew-go:is(:hover, :focus-visible) { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 12%, transparent); border-color: transparent; outline: 0; }
3826
+ .agent-pop .crew-go-icon { display: inline-grid; color: var(--text-2); transition: color var(--motion-fast) var(--ease-out); }
3827
+ .agent-pop .crew-go-icon svg { display: block; width: var(--ico-sm); height: var(--ico-sm); transition: transform calc(520ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
3828
+ .agent-pop .crew-go:is(:hover, :focus-visible) .crew-go-icon { color: currentColor; }
3829
+ .agent-pop .crew-go:is(:hover, :focus-visible) .crew-go-icon svg { transform: rotate(90deg); }
3830
+ .ports-row b.ports-gear { display: inline-grid; align-self: center; }
3831
+ .ports-row b.ports-gear svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
3832
+ @media (prefers-reduced-motion: reduce) { .agent-pop .crew-go-icon svg { transition: none; } .agent-pop .crew-go:hover .crew-go-icon svg { transform: none; } }
3719
3833
  .agent-pop .crew-back { display: inline-grid; place-items: center; width: 22px; height: 22px; margin-right: -2px; border: 0; border-radius: 7px; background: transparent; color: var(--text-3); font-size: 16px; line-height: 1; cursor: pointer; }
3720
3834
  .agent-pop .crew-back:hover { color: var(--text); background: var(--line); }
3721
3835
  /* The live dot and the crew beside it read as one pair: what the room is connected to. */
@@ -3840,13 +3954,13 @@ dialog.room-ask.console .room-ask-choice.danger:hover { background: color-mix(in
3840
3954
  that pulses where it was pressed or an area drawn with a dashed edge, and beside the mark a card
3841
3955
  with who should look and what to ask. */
3842
3956
  .browser-head .nav.point { display: inline-flex; align-items: center; gap: 6px; width: auto; padding: 0 10px 0 8px; font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; }
3843
- .browser-head .nav.point svg { width: 15px; height: 15px; }
3957
+ .browser-head .nav.point svg { width: var(--ico-sm); height: var(--ico-sm); }
3844
3958
  .browser-head .nav.point[aria-pressed="true"] { color: var(--phosphor); border-color: color-mix(in srgb, var(--phosphor) 45%, transparent); background: color-mix(in srgb, var(--phosphor) 12%, transparent); }
3845
3959
  @container dock (max-width: 620px) { .browser-head .nav.point > span { display: none; } .browser-head .nav.point { padding: 0 7px; } }
3846
3960
  .point-layer { position: absolute; z-index: 3; cursor: crosshair; background: color-mix(in srgb, var(--phosphor) 3%, transparent); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--phosphor) 45%, transparent); }
3847
3961
  .point-tools { position: absolute; top: 12px; left: 50%; transform: translateX(-50%); z-index: 2; display: inline-flex; align-items: center; gap: 2px; padding: 3px; border: 1px solid var(--line-2); border-radius: 12px; background: var(--panel); box-shadow: 0 14px 34px -14px rgba(0, 0, 0, .5); cursor: default; animation: point-in calc(220ms * var(--motion-scale)) var(--ease-glide); }
3848
3962
  .point-tool { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 11px 0 9px; border: 0; border-radius: 9px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; cursor: pointer; transition: color var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out); }
3849
- .point-tool svg { width: 15px; height: 15px; }
3963
+ .point-tool svg { width: var(--ico-sm); height: var(--ico-sm); }
3850
3964
  .point-tool:hover { color: var(--text); background: color-mix(in srgb, var(--text) 6%, transparent); }
3851
3965
  .point-tool[aria-pressed="true"] { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
3852
3966
  .point-sep { width: 1px; height: 16px; margin: 0 3px; background: var(--line-2); }
@@ -3881,7 +3995,7 @@ dialog.room-ask.console .room-ask-choice.danger:hover { background: color-mix(in
3881
3995
  .ask-item:hover, .ask-item:focus-visible { background: color-mix(in srgb, var(--phosphor) 10%, transparent); outline: 0; }
3882
3996
  .ask-remembered:empty { display: none; }
3883
3997
  .ask-own { display: flex; align-items: center; justify-content: center; gap: 8px; margin-top: 4px; border-radius: 10px; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; text-transform: uppercase; cursor: pointer; }
3884
- .ask-own svg { width: 15px; height: 15px; }
3998
+ .ask-own svg { width: var(--ico-sm); height: var(--ico-sm); }
3885
3999
  @media (prefers-reduced-motion: reduce) { .ask-card { animation: none; } }
3886
4000
 
3887
4001
  /* Taking the picture: only the page, without the toolbox, the layer's tint or the area's frame —
@@ -3903,7 +4017,7 @@ dialog.room-ask.console .room-ask-choice.danger:hover { background: color-mix(in
3903
4017
  .system.fail .partial { display: grid; gap: 8px; justify-items: center; margin-top: 10px; padding: 10px 14px; border: 1px dashed color-mix(in srgb, var(--danger) 45%, transparent); border-radius: 12px; color: var(--text-2); }
3904
4018
  .system.fail .partial > .label { color: var(--text-2); opacity: 1; }
3905
4019
  .system.fail .partial .artifacts { justify-items: center; }
3906
- .system.fail .partial .files { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; font-family: var(--mono); font-size: 11px; text-align: left; }
4020
+ .system.fail .partial .files { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; font-family: var(--mono); font-size: 11px; text-align: center; }
3907
4021
  .system.fail .partial .note { font-family: var(--mono); font-size: 10.5px; color: var(--warn); }
3908
4022
  .system.fail .partial .undo { border: 1px solid var(--terror); background: color-mix(in srgb, var(--terror) 12%, transparent); color: var(--terror); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; padding: 7px 12px; border-radius: 8px; cursor: pointer; }
3909
4023
  .system.fail .partial .undo:hover { background: color-mix(in srgb, var(--terror) 22%, transparent); }
@@ -4629,7 +4743,7 @@ dialog.custom-window::backdrop { display: none; }
4629
4743
  /* ---------- An open question's mark ----------
4630
4744
  The «?» is one of the room's own drawings now, in the accent. */
4631
4745
  .openq-ask::before { content: none; }
4632
- .openq-ask .q-mark { position: absolute; left: 9px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; display: block; color: var(--phosphor); }
4746
+ .openq-ask .q-mark { position: absolute; left: 9px; top: 50%; transform: translateY(-50%); width: var(--ico-sm); height: var(--ico-sm); display: block; color: var(--phosphor); }
4633
4747
  .openq-ask .q-mark svg { width: 100%; height: 100%; display: block; }
4634
4748
  :root[data-scheme="light"] .openq-ask .q-mark { color: color-mix(in srgb, var(--phosphor) 62%, #000000); }
4635
4749
 
@@ -4977,10 +5091,10 @@ dialog.custom-window::backdrop { display: none; }
4977
5091
  steps now: 26px tall with a 15px drawing on a wide bar, the same 34px squircle and 18px drawing
4978
5092
  on a narrow one. */
4979
5093
  .bar > .tree-button { width: 28px; height: 26px; }
4980
- .bar > .tree-button svg { width: 15px; height: 15px; }
5094
+ .bar > .tree-button svg { width: var(--ico-sm); height: var(--ico-sm); }
4981
5095
  @container bar (max-width: 980px) {
4982
5096
  .bar > .tree-button { width: 34px; height: 34px; border-radius: 11px; display: inline-grid; place-items: center; padding: 0; }
4983
- .bar > .tree-button svg { width: 18px; height: 18px; }
5097
+ .bar > .tree-button svg { width: var(--ico-md); height: var(--ico-md); }
4984
5098
  }
4985
5099
 
4986
5100
  /* ==========================================================================================
@@ -5060,7 +5174,7 @@ dialog.custom-window::backdrop { display: none; }
5060
5174
  inset 1px 0 0 rgba(255, 92, 170, .08), inset -1px 0 0 rgba(90, 210, 255, .08),
5061
5175
  0 1px 1px rgba(0, 0, 0, .3), 0 6px 14px -6px rgba(0, 0, 0, .55), 0 18px 34px -16px rgba(0, 0, 0, .6);
5062
5176
  }
5063
- :root .shell > .chats-button svg { width: 22px; height: 22px; filter: drop-shadow(0 1px 0 rgba(0, 0, 0, .35)); }
5177
+ :root .shell > .chats-button svg { width: var(--ico-lg); height: var(--ico-lg); filter: drop-shadow(0 1px 0 rgba(0, 0, 0, .35)); }
5064
5178
  :root[data-scheme="light"] .shell > .chats-button {
5065
5179
  background-image: linear-gradient(180deg, rgba(255, 255, 255, .9), rgba(255, 255, 255, .35) 60%), var(--sheen);
5066
5180
  box-shadow:
@@ -5209,6 +5323,37 @@ dialog.custom-window::backdrop { display: none; }
5209
5323
  height: 26px; padding: 0 10px 0 12px; border: 0; border-radius: 999px; background: transparent; box-shadow: none;
5210
5324
  }
5211
5325
  :root[data-scheme] .composer > .pick-options :is(.mode-chip, .model-chip, .effort-chip):is(:hover, :focus-visible, [aria-expanded="true"]) { background: color-mix(in srgb, currentColor 12%, transparent); }
5326
+ /* THE COPILOT (2026-10-14): a robot beside mode · model · effort, in the same glass; MADRE's green
5327
+ when it is on, with the time it has left. Its menu says what it does, its switch and how long. */
5328
+ .picker .pick-label > .copilot-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 9px; border: 0; border-radius: 999px; background: transparent; color: var(--text-2); font: inherit; letter-spacing: .06em; cursor: pointer; transition: background .18s ease, color .18s ease; }
5329
+ .picker .pick-label > .copilot-chip:is(:hover, :focus-visible) { background: color-mix(in srgb, currentColor 12%, transparent); outline: none; }
5330
+ .copilot-icon { display: inline-flex; width: var(--ico-sm); height: var(--ico-sm); }
5331
+ .copilot-icon svg { width: 100%; height: 100%; }
5332
+ .picker .pick-label > .copilot-chip.on { color: var(--madre-green); background: color-mix(in srgb, var(--madre-green) 14%, transparent); }
5333
+ .picker .pick-label > .copilot-chip .left { font-size: 10px; }
5334
+ .copilot-menu { display: grid; gap: 8px; }
5335
+ .copilot-menu .copilot-title { display: flex; align-items: center; gap: 8px; margin: 2px 2px 0; color: var(--text); }
5336
+ .copilot-menu .copilot-title b { flex: 1; color: var(--text); font-size: 11px; }
5337
+ .copilot-menu .copilot-title .copilot-icon { color: var(--madre-green); }
5338
+ .copilot-menu .copilot-body { display: grid; gap: 8px; padding: 0 2px 2px; font-family: var(--read, inherit); letter-spacing: 0; }
5339
+ /* Three weights (2026-10-14): what it does reads first; what it never does is the small print. */
5340
+ .copilot-menu .copilot-body p { margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--text-2); }
5341
+ .copilot-menu .copilot-body .copilot-lead { font-size: 14px; line-height: 1.45; color: var(--text); font-weight: 400; }
5342
+ .copilot-menu .copilot-body .copilot-never { padding-top: 8px; border-top: 1px solid var(--line); font-size: 11.5px; line-height: 1.5; color: color-mix(in srgb, var(--text) 46%, transparent); }
5343
+ .copilot-menu .copilot-body .copilot-state { color: var(--madre-green); font-weight: 600; }
5344
+ .copilot-menu .copilot-body .copilot-foot { font-size: 11px; color: var(--text-3); }
5345
+ .copilot-menu .copilot-how { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; font-size: 12px; color: var(--text-2); }
5346
+ /* A message under the copilot: the box wears green, not EDIT's red. */
5347
+ .composer.copilot .field { border-color: var(--madre-green); --ring: 0 0 0 3px color-mix(in srgb, var(--madre-green) 16%, transparent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--madre-green) 16%, transparent); }
5348
+ .composer.copilot .crew-label { color: var(--madre-green); }
5349
+ /* The reply written as the copilot: a green round robot on the agent's own circle, shown on every
5350
+ reply of a run of them, so a glance down the thread says which ones the copilot wrote. */
5351
+ #messages .row.copilot > .avatar { position: relative; overflow: visible; }
5352
+ #messages .row.copilot.compact > .avatar { visibility: visible; }
5353
+ #messages .row.copilot.compact > .avatar > :not(.copilot-badge) { visibility: hidden; }
5354
+ #messages .row.copilot > .avatar .copilot-badge { position: absolute; right: -6px; bottom: -6px; z-index: 1; visibility: visible; display: inline-flex; align-items: center; justify-content: center; width: 20px; height: 20px; padding: 3px; border-radius: 50%; background: var(--madre-green); color: var(--madre-green-ink); box-shadow: 0 0 0 2px var(--bg), 0 2px 6px rgb(0 0 0 / .18); }
5355
+ #messages .row.copilot > .avatar .copilot-badge svg { width: 100%; height: 100%; }
5356
+ #messages .who .badge.copilot { color: var(--madre-green); background: color-mix(in srgb, var(--madre-green) 14%, transparent); }
5212
5357
  /* The lines of the room that carry a chip: the box's radius follows the chip it holds. */
5213
5358
  :is(:root[data-wallpaper] #messages, .look-preview[data-wallpaper]:not([data-wallpaper="default"])) .system:not(.mother-alert) { border-radius: 18px; padding: 8px 16px 9px; }
5214
5359
 
@@ -5267,7 +5412,11 @@ dialog.custom-window::backdrop { display: none; }
5267
5412
  /* SIGUE ABIERTO AQUÍ can be put away: a small × beside its heading, quiet until the pointer finds it. */
5268
5413
  .openq-head { display: inline-flex; align-items: center; gap: 6px; }
5269
5414
  .openq-close { display: inline-grid; place-items: center; width: 20px; height: 20px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--text-3); cursor: pointer; opacity: .75; transition: opacity var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out); }
5270
- .openq-close svg { width: 12px; height: 12px; }
5415
+ .openq-close svg { width: var(--ico-xs); height: var(--ico-xs); }
5416
+ /* Centred is the label, not the label and its ×: the × hangs at the label's right, out of the
5417
+ count, so «sigue abierto aquí» stands on the same axis as the questions under it and the card above. */
5418
+ .openq-head { position: relative; }
5419
+ .openq-head > .openq-close { position: absolute; top: 50%; left: calc(100% + 6px); translate: 0 -50%; }
5271
5420
  .openq-close:hover, .openq-close:focus-visible { opacity: 1; color: var(--text); background: color-mix(in srgb, var(--text) 10%, transparent); }
5272
5421
  :root[data-wallpaper] .openq-close { color: var(--text-2); background: color-mix(in srgb, var(--bg) 62%, transparent); }
5273
5422
 
@@ -5600,7 +5749,9 @@ dialog.mother { --mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, monospa
5600
5749
  /* Dark theme: the box is its own black, a neutral graphite rather than the room's green-black,
5601
5750
  and the row of mode, model and effort under it steps back so it never competes with it. */
5602
5751
  :root:not([data-scheme="light"]) .shell .composer .field { background-color: color-mix(in srgb, #1a1b1d 96%, transparent); }
5603
- :root:not([data-scheme="light"]) .composer > .pick-options .pick-label { background: color-mix(in srgb, var(--bg) 45%, transparent); box-shadow: none; }
5752
+ /* Dark glass reads on a dark ground (2026-10-14): the ground at 45% over the ground was invisible,
5753
+ so it takes a breath of the text colour, a half-pixel rim and the same blur as in light. */
5754
+ :root:not([data-scheme="light"]) .composer > .pick-options .pick-label { background: color-mix(in srgb, var(--text) 13%, color-mix(in srgb, var(--bg) 52%, transparent)); box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 20%, transparent), inset 0 1px 0 rgb(255 255 255 / .09), 0 6px 18px rgb(0 0 0 / .28); -webkit-backdrop-filter: blur(20px) saturate(1.7); backdrop-filter: blur(20px) saturate(1.7); }
5604
5755
  :root:not([data-scheme="light"]) .composer > .pick-options :is(.mode-chip, .model-chip, .effort-chip) { opacity: .78; }
5605
5756
  :root:not([data-scheme="light"]) .composer > .pick-options :is(.mode-chip, .model-chip, .effort-chip):is(:hover, :focus-visible, [aria-expanded="true"]) { opacity: 1; }
5606
5757
 
@@ -5665,7 +5816,7 @@ dialog.mother { --mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, monospa
5665
5816
  }
5666
5817
 
5667
5818
  /* A new conversation is a plus, a little larger than the icons beside it. */
5668
- .chats-new-button svg { width: 17px; height: 17px; }
5819
+ .chats-new-button svg { width: var(--ico-sm); height: var(--ico-sm); }
5669
5820
 
5670
5821
  /* ==========================================================================================
5671
5822
  SURFACES THAT STAND OUT FROM THE GROUND, AND BUTTONS LIKE PEBBLES
@@ -5764,7 +5915,7 @@ dialog.settings-window.entering { animation: window-in calc(440ms * var(--motion
5764
5915
  dialog.settings-window::backdrop { display: none; }
5765
5916
  .settings-head { display: flex; align-items: center; gap: 14px; }
5766
5917
  .settings-search { flex: 1; min-width: 0; max-width: 420px; display: flex; align-items: center; gap: 8px; height: 32px; padding: 0 10px; border-radius: 10px; background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text-2); cursor: text; }
5767
- .settings-search svg { width: 15px; height: 15px; flex: none; }
5918
+ .settings-search svg { width: var(--ico-sm); height: var(--ico-sm); flex: none; }
5768
5919
  .settings-search input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; color: var(--text); font: inherit; font-family: var(--read); font-size: 13.5px; }
5769
5920
  .settings-search:focus-within { box-shadow: 0 0 0 2px color-mix(in srgb, var(--phosphor) 45%, transparent); }
5770
5921
  .settings-body { position: relative; flex: 1; min-height: 0; display: flex; overflow: hidden; }
@@ -5783,7 +5934,7 @@ dialog.settings-window::backdrop { display: none; }
5783
5934
  .settings-card-head b { font-size: 14px; font-weight: 600; }
5784
5935
  .settings-card-head .settings-go { margin-left: auto; width: 14px; height: 14px; color: var(--text-2); transform: rotate(-90deg); }
5785
5936
  .settings-icon { display: grid; place-items: center; width: 28px; height: 28px; flex: none; border-radius: 8px; background: color-mix(in srgb, var(--cat) 16%, transparent); color: var(--cat); }
5786
- .settings-icon svg { width: 17px; height: 17px; }
5937
+ .settings-icon svg { width: var(--ico-sm); height: var(--ico-sm); }
5787
5938
  .settings-line { margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--text-2); }
5788
5939
  .settings-warn { justify-self: start; margin: 2px 0 0; padding: 3px 8px; border-radius: 7px; font-size: 12px; background: color-mix(in srgb, #f2c94c 18%, transparent); color: #f2c94c; }
5789
5940
  :root[data-scheme="light"] .settings-warn { color: #7a5c00; }
@@ -5938,6 +6089,28 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
5938
6089
  .sx-chips { display: flex; flex-wrap: wrap; gap: 6px; }
5939
6090
  .sx-field { display: flex; gap: 8px; }
5940
6091
  .sx-field .sx-input { flex: 1; }
6092
+ /* Settings › Connect MCP (2026-10-14): a row per server — what it is and where, how it stands,
6093
+ the one thing to do, and from which mode its tools that act travel. */
6094
+ .mcp-row { gap: 10px; }
6095
+ .mcp-row .mcp-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; width: 100%; }
6096
+ .mcp-row .mcp-top .sx-words { min-width: 0; display: grid; gap: 4px; }
6097
+ .mcp-row .mcp-where { display: block; font-family: var(--mono); font-size: 11.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 52ch; }
6098
+ .mcp-row.off .mcp-top .sx-words > b { color: var(--text-2); }
6099
+ .mcp-problem { margin: 0; font-size: 12px; line-height: 1.45; color: var(--danger); overflow-wrap: anywhere; }
6100
+ .mcp-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
6101
+ .mcp-block > .mcp-actions { padding: 4px 16px 14px; }
6102
+ .mcp-from { display: flex; flex-wrap: wrap; align-items: center; gap: 10px; }
6103
+ .mcp-tools { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
6104
+ .mcp-tools li { display: inline-flex; align-items: center; gap: 6px; padding: 3px 8px; border-radius: 7px; background: color-mix(in srgb, var(--text) 6%, transparent); font-size: 11.5px; }
6105
+ .mcp-tools li code { font-family: var(--mono); font-size: 11.5px; }
6106
+ .mcp-tools .mcp-tool-kind { font-size: 10px; letter-spacing: .04em; color: var(--text-3); }
6107
+ .mcp-tools li.acts .mcp-tool-kind { color: #d9a90f; }
6108
+ .mcp-vars { display: grid; gap: 6px; width: 100%; }
6109
+ .mcp-vars .sx-field { align-items: center; }
6110
+ .mcp-secret { display: inline-flex; align-items: center; gap: 5px; font-size: 12px; color: var(--text-2); white-space: nowrap; }
6111
+ .mcp-pick { display: inline-flex; align-items: center; }
6112
+ .mcp-block .sx-row .sx-hint { overflow-wrap: anywhere; }
6113
+ .mcp-pick input, .mcp-secret input { width: 16px; height: 16px; accent-color: var(--phosphor); }
5941
6114
  .sx-command { display: flex; align-items: center; gap: 8px; padding: 4px 4px 4px 10px; border-radius: 9px; background: color-mix(in srgb, var(--text) 5%, transparent); }
5942
6115
  .sx-command code { flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap; font-family: var(--mono); font-size: 11.5px; color: var(--text); scrollbar-width: none; }
5943
6116
  .sx-more { border-top: 1px solid color-mix(in srgb, var(--text) 7%, transparent); }
@@ -5948,7 +6121,15 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
5948
6121
  .sx-more > :not(summary) { margin: 0 16px 14px; }
5949
6122
  .sx-steps { display: grid; gap: 12px; margin: 10px 16px 16px; padding-left: 18px; }
5950
6123
  .sx-steps li { display: grid; gap: 6px; font-size: 12.5px; }
5951
- .sx-steps li b { font-weight: 500; }
6124
+ .sx-steps li b { font-weight: 600; color: var(--text); }
6125
+ /* The training recipe, numbered and explained (2026-10-14). */
6126
+ .sx-steps { counter-reset: step; list-style: none; padding-left: 0; gap: 14px; }
6127
+ .sx-steps li { position: relative; padding-left: 34px; counter-increment: step; }
6128
+ .sx-steps li::before { content: counter(step); position: absolute; left: 0; top: -1px; display: grid; place-items: center; width: 22px; height: 22px; border-radius: 50%; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); font: 600 11.5px/1 var(--read); }
6129
+ .sx-steps li .sx-hint { font-size: 12px; line-height: 1.45; color: var(--text-2); }
6130
+ .sx-train-what { margin: 0 16px 10px; font-size: 12.5px; line-height: 1.5; color: var(--text-2); }
6131
+ .sx-train-platform { margin: 10px 16px 6px; }
6132
+ .sx-more > .sx-hint { margin: 0 16px; }
5952
6133
 
5953
6134
  /* An agent's card: its colour on the avatar and the name, where it lives in small print. */
5954
6135
  .sx-agent .sx-head { align-items: center; }
@@ -6040,6 +6221,8 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
6040
6221
  .settings-detail .sx-analysis :is(.mem-strip-head b, .mem-strip-head span, .mem-axis span, summary b, summary .caret, th, td, .mem-signal .top b, .mem-bar .name, .exams > .note, .exam-head b, .exam-head .verdict, .exam-bullet span, .exam > .note:not(.about), .exam .actions button, .exam .actions .note)::first-letter { text-transform: uppercase; }
6041
6222
  .settings-detail .sx-analysis .mem-strip-head b, .settings-detail .sx-analysis .mem-bar .name { color: var(--text); }
6042
6223
  .settings-detail .sx-analysis .mem-signal .top b, .settings-detail .sx-analysis .exam-head b { font-size: 12.5px; font-weight: 500; }
6224
+ /* The review's questions are written in sentence case; lowering them would turn «IA» into «ia». */
6225
+ .settings-detail .sx-analysis .exam-head b { text-transform: none; }
6043
6226
  .settings-detail .sx-analysis .exams .said { font-family: var(--read); font-size: 12.5px; line-height: 1.5; }
6044
6227
  .settings-detail .sx-analysis .mem-cols i:not(.zero) { background: color-mix(in srgb, #3fb6d9 70%, transparent); }
6045
6228
  .settings-detail .sx-analysis .mem-cols i.now { background: #3fb6d9; }
@@ -6154,7 +6337,7 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
6154
6337
 
6155
6338
  /* The gear in the Finder's and the servers' heads: their settings, one click away. */
6156
6339
  .surface-gear { display: inline-grid; place-items: center; width: 28px; height: 28px; flex: none; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--text-2); cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out); }
6157
- .surface-gear svg { width: 16px; height: 16px; }
6340
+ .surface-gear svg { width: var(--ico-sm); height: var(--ico-sm); }
6158
6341
  .surface-gear:hover { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
6159
6342
  .surface-gear:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 1px; }
6160
6343
 
@@ -6219,6 +6402,7 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
6219
6402
  .mods-detail .module-card :is(p, ul, li, .summary) { font-family: var(--read); font-size: 13px; font-weight: var(--read-weight, 300); line-height: 1.55; letter-spacing: 0; text-transform: none; color: var(--text); }
6220
6403
  .mods-detail .module-card :is(.state, .vendor, .detail, .note, .update, .card-block h5, .ollama-status, .actions .toggle, .confirm .warn, i) { font-family: var(--read); font-size: 12px; letter-spacing: 0; text-transform: lowercase; color: var(--text-2); font-style: normal; }
6221
6404
  .mods-detail .module-card :is(.state, .vendor, .detail, .note, .update, .card-block h5, .confirm .warn)::first-letter { text-transform: uppercase; }
6405
+ .mods-detail .module-card .confirm :is(.warn, .note).as-written { text-transform: none; }
6222
6406
  .mods-detail .module-card .state.on { color: var(--phosphor); }
6223
6407
  .mods-detail .module-card .card-block h5 { display: inline-block; font-size: 12.5px; font-weight: 600; color: var(--text); }
6224
6408
  .mods-detail .module-card .version b { font-family: var(--mono); font-size: 12px; color: var(--text); }
@@ -6337,9 +6521,13 @@ dialog.surface.window:is(.settings-window, .module-window).lifted { background-c
6337
6521
  .bar-left .connection { position: relative; align-self: flex-start; margin: 9px 0 0 -2px; padding: 4px; text-transform: none; cursor: default; }
6338
6522
  .bar-left .connection :is(.connection-icon .bar-glyph, .connection-label) { display: none; }
6339
6523
  .bar-left .connection .connection-dot { width: 7px; height: 7px; background: var(--text-3); box-shadow: none; }
6340
- .bar-left .connection[data-state="live"] .connection-dot { background: #34d058; animation: live-glow 3.2s ease-in-out infinite; }
6341
- .bar-left .connection[data-state="reconnecting"] .connection-dot { background: var(--warn); animation: live-glow 1.2s ease-in-out infinite; }
6342
- @keyframes live-glow { 0%, 100% { opacity: .55; box-shadow: 0 0 0 0 rgba(52, 208, 88, 0); } 50% { opacity: 1; box-shadow: 0 0 6px 2px rgba(52, 208, 88, .55); } }
6524
+ .bar-left .connection[data-state="live"] .connection-dot { background: #34d058; animation: state-pulse 2.6s ease-in-out infinite; }
6525
+ .bar-left .connection[data-state="reconnecting"] .connection-dot { background: var(--warn); animation: state-pulse 1.1s ease-in-out infinite; }
6526
+ .bar-left .connection:is([data-state="offline"], [data-state="closed"], [data-state="disconnected"]) .connection-dot { background: var(--danger, #e5484d); animation: none; }
6527
+ /* The project's state is a dot that breathes, nothing more (2026-10-14): from its size to a little
6528
+ larger and back, in the colour of the state. No glow around it. */
6529
+ @keyframes state-pulse { 0%, 100% { transform: scale(.85); } 50% { transform: scale(1.15); } }
6530
+ :root.just-arrived .bar-left .connection[data-state="live"] .connection-dot { animation: state-pulse 2.6s ease-in-out infinite; }
6343
6531
  .bar-left .connection::after { content: attr(data-said); position: absolute; top: calc(100% + 8px); left: 50%; translate: -50% 0; padding: 4px 9px; border-radius: 8px; font-family: var(--read); font-size: 12px; font-weight: 500; white-space: nowrap; color: var(--text); background: var(--surface, var(--panel)); box-shadow: var(--key-rest); opacity: 0; pointer-events: none; transition: opacity var(--motion-fast) var(--ease-out); z-index: 60; }
6344
6532
  .bar-left .connection:hover::after { opacity: 1; }
6345
6533
  .bar-left .connection::first-letter { text-transform: none; }
@@ -6683,7 +6871,9 @@ dialog.mods-window { width: 1040px; height: 720px; container: modswin / inline-s
6683
6871
  display: inline-flex; align-items: center; gap: 9px;
6684
6872
  padding: 9px 16px 9px 13px; border: 0; border-radius: 20px;
6685
6873
  background: var(--surface, var(--panel)); color: var(--text);
6686
- box-shadow: 0 1px 2px rgba(0, 0, 0, .18), 0 6px 16px -8px rgba(0, 0, 0, .4);
6874
+ /* It floats over the canvas (2026-10-14): a rim, a near shadow and a far one, so it reads lifted
6875
+ off any wallpaper or thread under it. */
6876
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 14%, transparent), inset 0 1px 0 rgb(255 255 255 / .06), 0 2px 4px rgba(0, 0, 0, .24), 0 12px 28px -6px rgba(0, 0, 0, .5), 0 28px 60px -18px rgba(0, 0, 0, .45);
6687
6877
  font-family: var(--read); font-size: 13px; font-weight: 450; line-height: 1.4; text-align: left;
6688
6878
  max-width: min(560px, calc(100% - 32px)); width: max-content;
6689
6879
  }
@@ -6692,6 +6882,10 @@ dialog.mods-window { width: 1040px; height: 720px; container: modswin / inline-s
6692
6882
  .toast .toast-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--text-3); }
6693
6883
  .toast[data-tone="done"] .toast-dot { background: #34c759; box-shadow: 0 0 0 3px rgba(52, 199, 89, .16); }
6694
6884
  .toast[data-tone="look"] .toast-dot { background: #e0a23c; box-shadow: 0 0 0 3px rgba(224, 162, 60, .18); }
6885
+ .toast[data-tone="news"] .toast-dot { background: var(--madre-green); box-shadow: 0 0 0 3px color-mix(in srgb, var(--madre-green) 22%, transparent); }
6886
+ /* The one key a notice may carry (the Market's news): small, the room's green, at its end. */
6887
+ .toast .toast-act { flex: none; margin-left: 4px; padding: 4px 11px; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--madre-green) 16%, transparent); color: var(--madre-green); font: inherit; font-size: 12.5px; font-weight: 650; cursor: pointer; }
6888
+ .toast .toast-act:hover { background: color-mix(in srgb, var(--madre-green) 26%, transparent); }
6695
6889
  .toast[data-tone="wrong"] .toast-dot { background: var(--danger); box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 18%, transparent); }
6696
6890
 
6697
6891
  /* The model's mark in the conversation is flat: one solid tint of the agent's colour, no light and
@@ -6708,7 +6902,7 @@ dialog.mods-window { width: 1040px; height: 720px; container: modswin / inline-s
6708
6902
  #messages .row > .avatar.gradient { box-shadow: none !important; }
6709
6903
  #messages .row > .avatar svg { width: 64%; height: 64%; opacity: 1; }
6710
6904
 
6711
- :root[data-scheme="light"] .toast:not([hidden]) { box-shadow: 0 1px 2px rgba(20, 30, 20, .1), 0 6px 16px -8px rgba(20, 30, 20, .28); }
6905
+ :root[data-scheme="light"] .toast:not([hidden]) { box-shadow: 0 0 0 .5px rgba(20, 30, 20, .08), 0 2px 4px rgba(20, 30, 20, .1), 0 12px 28px -6px rgba(20, 30, 20, .22), 0 28px 60px -18px rgba(20, 30, 20, .2); }
6712
6906
 
6713
6907
  /* ==========================================================================================
6714
6908
  MU/TH/UR · the remedies, as a window of the room
@@ -6851,7 +7045,7 @@ dialog.room-ask:not(.console) .room-ask-card { justify-items: center; gap: 10px;
6851
7045
  :root[data-scheme="light"] dialog.room-ask:not(.console) .room-ask-card { box-shadow: 0 1px 2px rgba(20, 30, 25, .08), 0 22px 48px -22px rgba(20, 30, 25, .35); }
6852
7046
  dialog.room-ask:not(.console) .room-ask-icon { --tone: var(--phosphor); display: grid; place-items: center; width: 44px; height: 44px; margin-bottom: 2px; border-radius: 13px; background: color-mix(in srgb, var(--tone) 16%, transparent); color: var(--tone); }
6853
7047
  dialog.room-ask:not(.console) .room-ask-icon[hidden] { display: none; }
6854
- dialog.room-ask:not(.console) .room-ask-icon svg { width: 22px; height: 22px; }
7048
+ dialog.room-ask:not(.console) .room-ask-icon svg { width: var(--ico-lg); height: var(--ico-lg); }
6855
7049
  dialog.room-ask[data-kind="danger"] .room-ask-icon { --tone: var(--danger); }
6856
7050
  dialog.room-ask[data-kind="key"] .room-ask-icon, dialog.key-ask .room-ask-icon { --tone: var(--mode-3); }
6857
7051
  dialog.key-ask.m4 .room-ask-icon { --tone: var(--mode-4); }
@@ -6878,6 +7072,9 @@ dialog.room-ask:not(.console) .room-ask-choice.danger:hover { background: var(--
6878
7072
  /* The key, quieter: one sentence of what it allows, a smaller one of what keeps it safe, the
6879
7073
  ceiling note when there is one, and a field whose label says what to type. */
6880
7074
  dialog.key-ask .room-ask-body { color: var(--text); font-size: 14px; }
7075
+ /* «Don't ask again…» under the memory gate: a quiet link to Settings › Permissions › Memory access. */
7076
+ .key-skip { display: block; margin: 4px auto 0; padding: 4px 8px; border: 0; border-radius: 8px; background: none; font: 500 12px/1.3 var(--sans); color: var(--text-2); cursor: pointer; text-decoration: underline; text-decoration-color: color-mix(in srgb, var(--text-2) 40%, transparent); text-underline-offset: 3px; }
7077
+ .key-skip:hover, .key-skip:focus-visible { color: var(--text); background: color-mix(in srgb, var(--text) 6%, transparent); outline: 0; }
6881
7078
  .key-safe { margin: -4px 0 0; font-family: var(--read); font-size: 12.5px; line-height: 1.45; color: color-mix(in srgb, var(--text) 58%, transparent); }
6882
7079
  .key-raise { margin: 0; padding: 4px 10px; border-radius: 999px; background: color-mix(in srgb, var(--mode-3) 14%, transparent); color: color-mix(in srgb, var(--mode-3) 70%, var(--text)); font-family: var(--read); font-size: 12px; font-weight: 550; }
6883
7080
  dialog.key-ask.m4 .key-raise { background: color-mix(in srgb, var(--mode-4) 14%, transparent); color: color-mix(in srgb, var(--mode-4) 70%, var(--text)); }
@@ -7063,7 +7260,7 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
7063
7260
  :root[data-scheme="light"] .job-sheet { box-shadow: 0 1px 2px rgba(20, 30, 25, .08), 0 14px 34px -18px rgba(20, 30, 25, .32); }
7064
7261
  .job-sheet[hidden] { display: none; }
7065
7262
  .job-icon { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); }
7066
- .job-icon svg { width: 18px; height: 18px; }
7263
+ .job-icon svg { width: var(--ico-md); height: var(--ico-md); }
7067
7264
  .job-sheet.failed .job-icon { background: color-mix(in srgb, var(--danger) 14%, transparent); color: var(--danger); }
7068
7265
  .job-words { display: grid; gap: 2px; min-width: 0; }
7069
7266
  .job-title { font-size: 13.5px; font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@@ -7234,7 +7431,7 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
7234
7431
  animation-delay: 0ms, var(--jiggle-delay, 0ms);
7235
7432
  }
7236
7433
  .bar-badge[hidden] { display: none; }
7237
- .bar-badge svg { display: block; width: 12px; height: 12px; }
7434
+ .bar-badge svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
7238
7435
  .bar-badge:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 2px; }
7239
7436
  :root[data-scheme="light"] .bar-badge { --bar-ring: #ffffff; box-shadow: 0 0 0 1.5px var(--bar-ring), 0 1px 2px rgba(20, 30, 20, .18); }
7240
7437
  @media (prefers-reduced-motion: reduce) {
@@ -7255,10 +7452,27 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
7255
7452
  .bar-tile:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 0; }
7256
7453
  .bar-tile:active { transform: scale(.97); }
7257
7454
  .bar-tile-glyph { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 11px; color: var(--phosphor); background: color-mix(in srgb, var(--text) 6%, transparent); box-shadow: var(--key-rest, none); }
7258
- .bar-tile-glyph svg { display: block; width: 18px; height: 18px; }
7455
+ .bar-tile-glyph svg { display: block; width: var(--ico-md); height: var(--ico-md); }
7259
7456
  .bar-tile-name { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7260
7457
  .bar-card-empty { margin: 4px 2px 6px; font-size: 12.5px; color: var(--text-2); }
7261
7458
  .bar-card-hint { margin: 10px 2px 0; font-size: 11.5px; color: var(--text-3); }
7459
+ /* «Add to the bar» (2026-10-17): a title and, under it, how the bar is arranged; Done at their right.
7460
+ Below, each key that can still go on is drawn as it will stand on the bar (its face, its drawing in
7461
+ the bar's ink, the bar's 18 px) with a «+» on the corner where the bar's keys wear their «−», and
7462
+ its whole name under it, on two lines if it needs them, never cut. */
7463
+ .bar-card.bar-add { width: min(380px, calc(100vw - 32px)); padding: 16px 16px 14px; }
7464
+ .bar-add .bar-card-head { align-items: flex-start; margin-bottom: 14px; }
7465
+ .bar-card-titles { display: grid; gap: 3px; min-width: 0; }
7466
+ .bar-card-titles h3 { font-size: 14px; }
7467
+ .bar-card-sub { margin: 0; font-size: 12px; line-height: 1.4; color: var(--text-2); }
7468
+ .bar-add .bar-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; padding: 4px 2px 2px; }
7469
+ .bar-add .bar-tile { gap: 8px; padding: 12px 6px 10px; color: var(--text-2); font-size: 12px; line-height: 1.3; }
7470
+ .bar-add .bar-tile-glyph { position: relative; width: 40px; height: 40px; border-radius: 12px; color: var(--text); background: var(--surface, var(--panel)); box-shadow: var(--key-rest, none); transition: color var(--motion-fast) var(--ease-out); }
7471
+ .bar-add .bar-tile:is(:hover, :focus-visible) .bar-tile-glyph { color: var(--phosphor); }
7472
+ .bar-add .bar-tile-name { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden; white-space: normal; text-align: center; overflow-wrap: anywhere; }
7473
+ .bar-tile-plus { position: absolute; top: -5px; right: -5px; display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; background: var(--phosphor); color: var(--phosphor-ink); }
7474
+ .bar-tile-plus svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
7475
+ :root[data-scheme="light"] .bar-add .bar-tile:is(:hover, :focus-visible) .bar-tile-glyph { color: color-mix(in srgb, var(--phosphor) 72%, #000000); }
7262
7476
  @media (prefers-reduced-motion: reduce) { .bar-card { animation: none; } .bar-tile:active { transform: none; } }
7263
7477
 
7264
7478
  /* On a narrow screen: keys that do not fit wait behind «more», the brand keeps its place, and
@@ -7269,9 +7483,12 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
7269
7483
  .bar-more-card[hidden] { display: none; }
7270
7484
  @media (max-width: 720px) {
7271
7485
  .bar > .bar-left { min-width: 58px; flex-shrink: 1; }
7272
- .bar.bar-editing { overflow-x: auto; scrollbar-width: none; }
7273
- .bar.bar-editing::-webkit-scrollbar { display: none; }
7274
7486
  }
7487
+ /* Being arranged, at any width (2026-10-17): every key shows, so a bar with more keys than room
7488
+ scrolls sideways inside its own box instead of spilling under the house's keys, and the key
7489
+ being carried is held between the first and the last (app.js, barDragMove). */
7490
+ .bar.bar-editing { overflow-x: auto; overflow-y: hidden; overscroll-behavior-x: contain; scrollbar-width: none; }
7491
+ .bar.bar-editing::-webkit-scrollbar { display: none; }
7275
7492
 
7276
7493
  /* Badges are a plain disc of the accent: no ring around them, anywhere. */
7277
7494
  :is(.bar-count, .modules-count, .mother-count, .remedy-badge, .bar-badge, .chats-count, .badge-count) { box-shadow: none !important; outline: none !important; border: 0 !important; }
@@ -7315,7 +7532,7 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
7315
7532
  .steps-list li { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; gap: 10px; align-items: start; padding: 8px 6px; border-radius: 12px; }
7316
7533
  .steps-list li:not(.done):hover { background: color-mix(in srgb, var(--text) 5%, transparent); }
7317
7534
  .steps-tick { display: grid; place-items: center; width: 20px; height: 20px; margin-top: 1px; border-radius: 50%; box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--text) 26%, transparent); color: transparent; transition: background-color var(--motion) var(--ease-out), color var(--motion) var(--ease-out); }
7318
- .steps-tick svg { display: block; width: 14px; height: 14px; }
7535
+ .steps-tick svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
7319
7536
  .steps-list li.done .steps-tick { background: var(--acc, var(--phosphor)); color: var(--acc-ink, var(--phosphor-ink)); box-shadow: none; }
7320
7537
  .steps-words { display: grid; gap: 2px; min-width: 0; }
7321
7538
  .steps-words b { font-size: 13.5px; font-weight: 600; line-height: 1.4; }
@@ -7574,6 +7791,15 @@ html.via-phone[data-wallpaper]:not([data-wallpaper="default"]) { --phone-ground:
7574
7791
  background: var(--agent-gradient, var(--agent-solid, var(--agent))) !important;
7575
7792
  color: #ffffff !important;
7576
7793
  }
7794
+ /* Switched off: an agent in the bar that cannot answer (not installed, no adapter, or no session)
7795
+ is a quiet grey disc with its mark, no colour and no ring, until it can (2026-10-17). */
7796
+ #agents.agents .avatar.off {
7797
+ background: color-mix(in srgb, var(--text) 9%, transparent) !important;
7798
+ color: color-mix(in srgb, var(--text) 38%, transparent) !important;
7799
+ border: 0 !important; box-shadow: none !important; filter: grayscale(1);
7800
+ }
7801
+ #agents.agents .avatar.off::before { display: none; }
7802
+ #agents.agents .avatar.off.open { box-shadow: 0 0 0 2px var(--lay-4), 0 0 0 3.5px color-mix(in srgb, var(--text) 30%, transparent) !important; }
7577
7803
  /* What was said by a ring keeps its ring: the open agent in the bar, the chosen one in the picker. */
7578
7804
  .agents .avatar.open:not(.offline):not(.detected),
7579
7805
  .picker .avatar.pick[aria-checked="true"]:not(.offline):not(.detected) { box-shadow: 0 0 0 2px var(--lay-4), 0 0 0 3.5px var(--agent-solid, var(--agent)) !important; }
@@ -7593,10 +7819,21 @@ html.via-phone[data-wallpaper]:not([data-wallpaper="default"]) { --phone-ground:
7593
7819
  container-type: normal;
7594
7820
  }
7595
7821
  .shell > .bar.bar-home[hidden], .via-phone .shell > .bar.bar-home { display: none !important; }
7822
+ /* When the room's bar folds its keys into 34 px squares, the house's fold with them (app.js,
7823
+ roomWidth): one row, one size of key, one size of drawing. */
7824
+ .shell > .bar.bar-home.keys-square { padding-block: 9px; }
7825
+ .shell > .bar.bar-home.keys-square > .tree-button { display: inline-grid; place-items: center; width: 34px; height: 34px; padding: 0; border-radius: 11px; }
7826
+ .shell > .bar.bar-home.keys-square > .tree-button svg { width: var(--ico-md); height: var(--ico-md); }
7827
+ /* The notes to accept, short (app.js, barFit): when nothing else can leave a narrow bar, the tray
7828
+ and its number, and the words in the key's name. */
7829
+ #inbox-pill .inbox-count { display: none; font-variant-numeric: tabular-nums; }
7830
+ .bar.bar-tight > #inbox-pill .handoff-words { display: none; }
7831
+ .bar.bar-tight > #inbox-pill .inbox-count { display: inline; }
7832
+ .bar.bar-tight > #inbox-pill { padding-inline: 10px 12px; }
7596
7833
  :root:not(.via-phone) .shell > .bar.with-home {
7597
7834
  width: auto; justify-self: stretch;
7598
7835
  margin-left: max(20px, calc((100% - 1440px) / 2));
7599
- margin-right: calc(max(20px, calc((100% - 1440px) / 2)) + var(--home-w, 150px) + 10px);
7836
+ margin-right: calc(max(20px, calc((100% - 1440px) / 2)) + var(--home-w, 150px) + 16px);
7600
7837
  }
7601
7838
  /* With the second bar beside it the room's bar is ~120px narrower, so the pulse alone takes the
7602
7839
  wordmark's place a little earlier: before the brand is cut instead of folded. */
@@ -7646,7 +7883,7 @@ dialog.room-switch::backdrop {
7646
7883
  .switch-face { display: grid; place-items: center; width: 100%; height: 100%; }
7647
7884
  .switch-icon.is-coordinator svg { width: 58%; height: 58%; display: block; }
7648
7885
  .switch-badge { position: absolute; top: -6px; right: -6px; display: none; place-items: center; min-width: 22px; height: 22px; padding: 0 6px; border-radius: 999px; font-family: var(--mono); font-size: 11.5px; font-style: normal; font-weight: 700; line-height: 1; box-shadow: 0 0 0 2.5px var(--bg-2); }
7649
- .switch-badge svg { width: 13px; height: 13px; }
7886
+ .switch-badge svg { width: var(--ico-xs); height: var(--ico-xs); }
7650
7887
  .switch-tile.is-waiting .switch-badge { display: grid; background: var(--acc, var(--phosphor)); color: var(--acc-ink, var(--phosphor-ink)); }
7651
7888
  .switch-tile.is-done .switch-badge { display: grid; padding: 0; background: var(--session-ok); color: var(--phosphor-ink); }
7652
7889
  .switch-tile.is-working .switch-badge { display: grid; min-width: 0; width: 22px; padding: 0; background: var(--bg-2); }
@@ -7731,6 +7968,32 @@ dialog.viewer .viewer-seg .viewer-seg-btn:not([hidden]) + .viewer-open { margin-
7731
7968
  .agent-pop .pop-group dd { font-family: var(--read, var(--sans)); font-size: 12.5px; line-height: 1.35; color: var(--text); font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
7732
7969
  .agent-pop .caps { margin-top: 12px !important; padding-top: 12px; border-top: 1px solid var(--line); }
7733
7970
  .agent-pop .foot { margin-top: 10px; font-size: 9px; line-height: 1.5; }
7971
+ /* The agent's card, ordered (2026-10-14): name and session, one figure, four numbers, the plan, a
7972
+ line for the connection, what it can do and the way to its settings. */
7973
+ .agent-pop .head { gap: 10px; }
7974
+ .agent-pop .pop-who { display: grid; gap: 1px; min-width: 0; }
7975
+ .agent-pop .pop-who .vendor { margin: 0; font-family: var(--read, var(--sans)); font-size: 11.5px; letter-spacing: 0; color: var(--text-3); }
7976
+ .agent-pop .pop-session { display: inline-flex; align-items: center; gap: 6px; margin-left: auto; height: 22px; padding: 0 9px; border-radius: 999px; background: color-mix(in srgb, var(--text) 6%, transparent); font-family: var(--read, var(--sans)); font-size: 11.5px; color: var(--text-2); white-space: nowrap; }
7977
+ .agent-pop .pop-session::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--text-3); }
7978
+ .agent-pop .pop-session.ok::before { background: #34c759; }
7979
+ .agent-pop .pop-session.wait::before { background: var(--warn); }
7980
+ .agent-pop .pop-session.bad::before { background: var(--danger); }
7981
+ .agent-pop .pop-stats { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; padding: 12px 0; border-bottom: 1px solid var(--line); }
7982
+ .agent-pop .pop-stat { display: grid; gap: 3px; padding: 9px 11px; border-radius: 11px; background: color-mix(in srgb, var(--text) 4.5%, transparent); min-width: 0; }
7983
+ .agent-pop .pop-stat span { font-family: var(--read, var(--sans)); font-size: 11px; color: var(--text-3); }
7984
+ .agent-pop .pop-stat b { font-family: var(--read, var(--sans)); font-size: 14px; font-weight: 600; color: var(--text); font-variant-numeric: tabular-nums; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
7985
+ .agent-pop .pop-provider { display: grid; gap: 5px; padding: 11px 0; border-bottom: 1px solid var(--line); }
7986
+ .agent-pop .pop-provider h4 { margin: 0 0 2px; font-family: var(--read, var(--sans)); font-size: 12px; font-weight: 600; color: var(--text); letter-spacing: 0; text-transform: none; }
7987
+ .agent-pop .pop-limit { display: flex; justify-content: space-between; gap: 12px; font-family: var(--read, var(--sans)); font-size: 12px; color: var(--text-2); }
7988
+ .agent-pop .pop-limit b { font-weight: 500; color: var(--text); font-variant-numeric: tabular-nums; }
7989
+ .agent-pop .pop-limit.hot b { color: var(--crit); }
7990
+ .agent-pop .pop-note { margin: 0; font-family: var(--read, var(--sans)); font-size: 12px; line-height: 1.45; color: var(--text-2); }
7991
+ .agent-pop .pop-meta { margin: 10px 0 0; font-family: var(--read, var(--sans)); font-size: 11.5px; line-height: 1.45; color: var(--text-3); }
7992
+ .agent-pop .caps { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 10px !important; padding-top: 0; border-top: 0; }
7993
+ .agent-pop .caps .cap { padding: 3px 8px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--text) 5%, transparent); font-family: var(--read, var(--sans)); font-size: 11px; letter-spacing: 0; text-transform: none; color: var(--text-3); }
7994
+ .agent-pop .caps .cap.on { background: color-mix(in srgb, var(--agent, var(--phosphor)) 13%, transparent); color: color-mix(in srgb, var(--agent, var(--phosphor)) 75%, var(--text)); }
7995
+ .agent-pop .pop-go { width: 100%; margin-top: 12px; height: 32px; border: 0; border-radius: 10px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); font-family: var(--read, var(--sans)); font-size: 12.5px; font-weight: 500; cursor: pointer; }
7996
+ .agent-pop .pop-go:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--text) 12%, transparent); outline: 0; }
7734
7997
 
7735
7998
  /* The agent picker: the chosen agent at full colour; the others dimmed, until the pointer finds one. */
7736
7999
  .picker .avatar.pick:not([aria-checked="true"]) { filter: saturate(.55) brightness(.94); opacity: .55; transition: opacity calc(160ms * var(--motion-scale, 1)) var(--ease-out), filter calc(160ms * var(--motion-scale, 1)) var(--ease-out); }
@@ -7822,6 +8085,37 @@ dialog#core .mother-close { height: 30px; padding: 0 13px; border: 0; border-rad
7822
8085
  dialog#core .mother-close:hover { box-shadow: var(--key-over, var(--key-rest)); color: var(--phosphor); }
7823
8086
  dialog#core .mother-close:active { box-shadow: var(--key-down, var(--key-rest)); }
7824
8087
  dialog#core .mother-boot { display: none; }
8088
+ /* «Lo que se envía» in the room's hand (2026-10-14): the title over its line on the left, the
8089
+ buttons every window has on the right, centred tabs, and the console's capitals gone from what
8090
+ used to be MU/TH/UR's (the verdict, «next», the memory review, the roles and fields). */
8091
+ dialog#core .mother-head { display: grid; grid-template-columns: minmax(0, 1fr) auto; grid-template-areas: "title actions" "sub actions"; align-items: center; gap: 2px 16px; padding: 16px 16px 14px 24px; }
8092
+ dialog#core .mother-title { grid-area: title; line-height: 1.25; }
8093
+ dialog#core .mother-sub { grid-area: sub; flex: none; line-height: 1.35; }
8094
+ dialog#core .mother-actions { grid-area: actions; align-items: center; gap: 10px; }
8095
+ dialog#core .core-copy-all { height: 30px; font-family: var(--read); font-size: 12.5px; font-weight: 550; letter-spacing: 0; text-transform: none; }
8096
+ dialog#core .core-tab { display: grid; justify-items: center; text-align: center; }
8097
+ dialog#core .core-tab .meta { max-width: 100%; }
8098
+ dialog#core .mem-verdict .says, dialog#core .mem-verdict > p:not(.maturity-next) { margin: 0; font-family: var(--read); font-size: 13px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text-2); text-shadow: none; }
8099
+ dialog#core .mem-verdict .says b { margin-right: 6px; font-size: 13px; letter-spacing: 0; color: var(--text); }
8100
+ dialog#core .mem-verdict .maturity-next { padding: 11px 14px; border: 0; border-radius: 12px; background: color-mix(in srgb, var(--text) 5%, transparent); box-shadow: none; font-family: var(--read); font-size: 12.5px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text); }
8101
+ dialog#core .mem-verdict .maturity-next b { margin-right: 8px; font-size: 12.5px; font-weight: 600; letter-spacing: 0; color: var(--phosphor); }
8102
+ dialog#core .mem-verdict .maturity-next .where { font-size: 12px; letter-spacing: 0; color: var(--text-3); }
8103
+ dialog#core :is(.exams, .exam .verdict, .exam-head b, .exams .note, .exam .note, .exam-bullet span, .exam .said, .exam .actions button) { font-family: var(--read); letter-spacing: 0; text-transform: none; text-shadow: none; }
8104
+ dialog#core .exam-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
8105
+ dialog#core .exam-head b { font-size: 13px; font-weight: 600; color: var(--text); }
8106
+ dialog#core .exam .verdict { flex: none; padding: 2px 8px; border: 0; border-radius: 7px; font-size: 11.5px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text-2); }
8107
+ dialog#core .exam.passed .verdict { background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); }
8108
+ dialog#core .exam.failed .verdict { background: color-mix(in srgb, var(--warn) 16%, transparent); color: var(--warn); }
8109
+ dialog#core .exam :is(.note, .said) { font-size: 12.5px; line-height: 1.5; color: var(--text-2); }
8110
+ dialog#core .exam-bullet span { font-size: 11.5px; color: var(--text-3); }
8111
+ dialog#core .exam .actions button { height: 28px; padding: 0 12px; border: 0; border-radius: 8px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text); font-size: 12px; box-shadow: none; cursor: pointer; }
8112
+ dialog#core .exam .actions button.primary { background: var(--phosphor); color: var(--phosphor-ink); }
8113
+ dialog#core .core-role { color: var(--text); }
8114
+ dialog#core .core-role input { width: 15px; height: 15px; accent-color: var(--phosphor); }
8115
+ dialog#core .core-role-words b { font-family: var(--read); font-size: 13px; font-weight: 500; letter-spacing: 0; text-transform: none; color: var(--text); }
8116
+ dialog#core .core-role-words .detail { font-family: var(--read); font-size: 12px; letter-spacing: 0; color: var(--text-3); }
8117
+ dialog#core .core-field { font-family: var(--read); font-size: 12px; letter-spacing: 0; text-transform: none; color: var(--text-3); }
8118
+ dialog#core .core-pick select, dialog#core .core-field select { font-family: var(--read) !important; font-size: 12.5px !important; letter-spacing: 0 !important; text-transform: none !important; }
7825
8119
  dialog#core .mother-foot { padding: 9px 22px 11px; border-top: 1px solid var(--line); font-family: var(--read); font-size: 11.5px; letter-spacing: 0; text-transform: none; color: var(--text-3); text-align: center; }
7826
8120
  /* The body: tabs, the strip that says for whom, the pane, and the question line. */
7827
8121
  dialog#core .core-body { min-height: 0; gap: 12px; padding: 14px 22px 14px; }
@@ -7991,6 +8285,74 @@ dialog#core .mother-cmd .copy { position: absolute; top: 8px; right: 8px; displa
7991
8285
  width: fit-content; max-width: min(92%, 560px); margin-inline: auto; padding: 8px 16px 9px; border: 0; border-radius: 18px;
7992
8286
  }
7993
8287
  #messages#messages .row > .col > .who { width: fit-content; max-width: 100%; padding: 3px 10px; border-radius: 999px; }
8288
+ /* A failure wears the room's own card (2026-10-14): rounded, as wide as its words, in its red
8289
+ tint — it was a square box of another app. Its RETRY and UNDO stay under it. */
8290
+ #messages#messages .thread-inner > .system.fail {
8291
+ width: fit-content; max-width: min(92%, 560px); margin-inline: auto; padding: 10px 18px 11px; border: 0; border-radius: 18px;
8292
+ background: color-mix(in srgb, var(--danger) 9%, var(--plane-solid, var(--panel))) !important;
8293
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--danger) 30%, transparent) !important;
8294
+ }
8295
+ #messages#messages .thread-inner > .system.fail .label { font-family: var(--mono); letter-spacing: .14em; }
8296
+
8297
+ /* ==========================================================================================
8298
+ NOTICES THAT FOLD INTO DOTS (2026-10-14)
8299
+ ------------------------------------------------------------------------------------------
8300
+ A notice says its piece and, ten seconds later, folds into a row of the notices around it.
8301
+ Folded, the row is one small dot in the colour of its first notice and «+N» for the rest, on
8302
+ the same glass as mode · model · effort so it reads on any wallpaper. A click opens the row as
8303
+ one card with every notice in order, each with its dot; another click, or Escape, folds it.
8304
+ Red is a diagnostic, amber a permission or a warning, green something that went well, grey the
8305
+ rest. Sizes carry !important: the wallpaper's rules for the room's lines would otherwise give a
8306
+ folded notice their width and padding (it was a dot 0 px wide, only its ring showing).
8307
+ ========================================================================================== */
8308
+ #messages#messages .thread-inner > .system.folding { animation: notice-fold .22s ease forwards; }
8309
+ @keyframes notice-fold { to { opacity: 0; transform: scale(.94); } }
8310
+ #messages .sys-dots {
8311
+ display: flex; align-items: center; gap: 6px; width: fit-content; max-width: min(92%, 560px); margin: 6px auto; padding: 4px 9px 4px 7px;
8312
+ border-radius: 999px; cursor: pointer; font-family: var(--mono); font-size: 10px; letter-spacing: .06em; color: var(--text-2);
8313
+ background: color-mix(in srgb, var(--bg) 62%, transparent); border: .5px solid color-mix(in srgb, var(--text) 10%, transparent);
8314
+ -webkit-backdrop-filter: blur(18px) saturate(1.6); backdrop-filter: blur(18px) saturate(1.6);
8315
+ transition: background .18s ease;
8316
+ }
8317
+ #messages .sys-dots:hover, #messages .sys-dots:focus-visible { background: color-mix(in srgb, var(--bg) 78%, transparent); outline: none; }
8318
+ #messages .sys-dots > .sys-more { font: inherit; color: inherit; }
8319
+ #messages .sys-dots.single { padding: 6px; gap: 0; justify-content: center; }
8320
+ #messages#messages .sys-dots > .system.folded { --dot: var(--text-3); margin: 0; cursor: inherit; }
8321
+ #messages#messages .sys-dots > .system.folded[data-tone="crit"] { --dot: var(--terror, #d33); }
8322
+ #messages#messages .sys-dots > .system.folded[data-tone="warn"] { --dot: var(--warn, #e2a022); }
8323
+ #messages#messages .sys-dots > .system.folded[data-tone="ok"] { --dot: var(--ok, var(--phosphor, #2f9e44)); }
8324
+ /* Folded: the first notice is the dot; the rest are counted in «+N». */
8325
+ #messages#messages .sys-dots:not(.open) > .system.folded {
8326
+ flex: none; width: 8px !important; height: 8px !important; min-width: 0 !important; max-width: none !important; padding: 0 !important; border: 0 !important; border-radius: 50% !important;
8327
+ overflow: hidden; font-size: 0; line-height: 0; color: transparent; text-shadow: none !important;
8328
+ background: var(--dot) !important; box-shadow: 0 0 0 2px color-mix(in srgb, var(--dot) 22%, transparent) !important;
8329
+ -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
8330
+ animation: dot-in .28s cubic-bezier(.2, .9, .3, 1.25);
8331
+ }
8332
+ #messages#messages .sys-dots:not(.open) > .system.folded:not(:first-child) { display: none !important; }
8333
+ #messages#messages .sys-dots:not(.open) > .system.folded > * { display: none !important; }
8334
+ #messages#messages .sys-dots > .system.folded.quiet { animation: none; }
8335
+ @keyframes dot-in { from { transform: scale(.3); opacity: 0; } to { transform: scale(1); opacity: 1; } }
8336
+ /* Open: one card, every notice in order, each with its dot. No bar on the side. */
8337
+ #messages .sys-dots.open {
8338
+ display: grid; gap: 2px; width: min(92%, 560px); padding: 6px; border-radius: 16px; cursor: default;
8339
+ background: color-mix(in srgb, var(--bg) 88%, transparent); border-color: color-mix(in srgb, var(--text) 12%, transparent);
8340
+ box-shadow: 0 10px 30px -12px rgb(0 0 0 / .35); animation: notice-peek .2s ease;
8341
+ }
8342
+ #messages#messages .sys-dots.open > .system.folded { color: var(--text-2) !important; }
8343
+ #messages#messages .sys-dots.open > .system.folded {
8344
+ position: relative; width: auto !important; max-width: none !important; margin: 0 !important; padding: 7px 12px 8px 26px !important; border: 0 !important; border-radius: 10px !important;
8345
+ text-align: left; background: transparent !important; box-shadow: none !important; -webkit-backdrop-filter: none !important; backdrop-filter: none !important;
8346
+ }
8347
+ #messages#messages .sys-dots.open > .system.folded:hover { background: color-mix(in srgb, var(--text) 4%, transparent) !important; }
8348
+ #messages#messages .sys-dots.open > .system.folded::before { content: ''; position: absolute; left: 11px; top: 12px; width: 7px; height: 7px; border-radius: 50%; background: var(--dot); }
8349
+ #messages#messages .sys-dots.open > .system.folded > b:first-child { display: inline; margin-right: 6px; }
8350
+ #messages .sys-dots.open > .sys-more { justify-self: center; margin-top: 2px; padding: 3px 10px; border-radius: 999px; cursor: pointer; color: var(--text-3); }
8351
+ #messages .sys-dots.open > .sys-more:hover { color: var(--text); }
8352
+ @keyframes notice-peek { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
8353
+ @media (prefers-reduced-motion: reduce) {
8354
+ #messages#messages .sys-dots > .system.folded, #messages .sys-dots.open, #messages#messages .thread-inner > .system.folding { animation: none !important; transition: none !important; }
8355
+ }
7994
8356
 
7995
8357
  /* ==========================================================================================
7996
8358
  SIGUE ABIERTO AQUÍ, THE SAME GLASS AS MODE · MODEL · EFFORT (2026-10-09)
@@ -8002,9 +8364,9 @@ dialog#core .mother-cmd .copy { position: absolute; top: 8px; right: 8px; displa
8002
8364
  (`#composer#composer` only outranks CHIPS IN FLAT TONE, which had flattened them into tags.)
8003
8365
  ========================================================================================== */
8004
8366
  :root {
8005
- --lq-fill: color-mix(in srgb, var(--bg) 45%, transparent);
8006
- --lq-fill-over: color-mix(in srgb, var(--bg) 62%, transparent);
8007
- --lq-rim: none;
8367
+ --lq-fill: color-mix(in srgb, var(--text) 7%, color-mix(in srgb, var(--bg) 45%, transparent));
8368
+ --lq-fill-over: color-mix(in srgb, var(--text) 11%, color-mix(in srgb, var(--bg) 62%, transparent));
8369
+ --lq-rim: 0 0 0 .5px color-mix(in srgb, var(--text) 12%, transparent), inset 0 1px 0 rgb(255 255 255 / .05);
8008
8370
  }
8009
8371
  :root[data-scheme="light"] {
8010
8372
  --lq-fill: color-mix(in srgb, var(--bg) 62%, transparent);
@@ -8036,7 +8398,7 @@ dialog#core .mother-cmd .copy { position: absolute; top: 8px; right: 8px; displa
8036
8398
  the colour of a stop; it fills a little under the pointer. */
8037
8399
  #messages .system.plan > b:first-child { display: flex; align-items: center; justify-content: center; gap: 6px; }
8038
8400
  #messages .system.plan .act.stop { width: 22px; height: 22px; display: inline-grid; place-items: center; padding: 0; margin: -3px 0; border: 0; border-radius: 50%; background: color-mix(in srgb, var(--crit) 12%, transparent); color: var(--crit); letter-spacing: 0; cursor: pointer; transition: background-color calc(150ms * var(--motion-scale, 1)) var(--ease-out); }
8039
- #messages .system.plan .act.stop svg { width: 14px; height: 14px; }
8401
+ #messages .system.plan .act.stop svg { width: var(--ico-sm); height: var(--ico-sm); }
8040
8402
  #messages .system.plan .act.stop:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--crit) 24%, transparent); outline: 0; }
8041
8403
  #messages .system.plan .act.stop:disabled { opacity: .45; cursor: default; }
8042
8404
 
@@ -8218,7 +8580,7 @@ dialog.tour-bonjour::backdrop { background: transparent; }
8218
8580
  .tour-head-words { display: grid; gap: 4px; }
8219
8581
  .tour-head h2 { margin: 0; font-size: 22px; font-weight: 650; letter-spacing: -.015em; }
8220
8582
  .tour-close { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 0; border-radius: 50%; color: var(--text-2); background: color-mix(in srgb, var(--text) 7%, transparent); cursor: pointer; }
8221
- .tour-close svg { width: 14px; height: 14px; }
8583
+ .tour-close svg { width: var(--ico-sm); height: var(--ico-sm); }
8222
8584
  .tour-close:hover { color: var(--text); background: color-mix(in srgb, var(--text) 12%, transparent); }
8223
8585
  .tour-body { display: grid; grid-template-columns: 210px minmax(0, 1fr); flex: 1 1 auto; min-height: 0; border-top: 1px solid color-mix(in srgb, var(--text) 9%, transparent); }
8224
8586
  .tour-window .tour-nav { display: grid; align-content: start; gap: 2px; margin: 0; padding: 10px 8px; list-style: none; overflow-y: auto; border-right: 1px solid color-mix(in srgb, var(--text) 9%, transparent); }
@@ -8338,7 +8700,33 @@ dialog.tour-bonjour::backdrop { background: transparent; }
8338
8700
  .tour-pill { display: inline-flex; align-items: center; gap: 2px; height: 28px; padding: 0 3px 0 0; border-radius: 999px; background: color-mix(in srgb, var(--tour-acc) 16%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--tour-acc) 40%, transparent); }
8339
8701
  .tour-pill-go { height: 28px; padding: 0 6px 0 12px; border: 0; background: transparent; font: inherit; font-family: var(--read); font-size: 12.5px; font-weight: 600; white-space: nowrap; color: color-mix(in srgb, var(--tour-acc) 70%, var(--text)); cursor: pointer; }
8340
8702
  .tour-pill-x { display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 50%; color: var(--text-2); background: transparent; cursor: pointer; }
8341
- .tour-pill-x svg { width: 11px; height: 11px; }
8703
+ .tour-pill-x svg { width: var(--ico-xs); height: var(--ico-xs); }
8704
+ /* A phone's room bar (2026-10-14): only what keeps it whole — the pulse, the live light, DETENER
8705
+ TODO and «more» on the left; Inicio, the projects and Ajustes on the right. Reload is the page's
8706
+ own pull, and the tour goes on from Ajustes › Versión. */
8707
+ @media (max-width: 560px) {
8708
+ .shell > .bar { gap: 8px; }
8709
+ .shell > .bar .brand { width: 40px; overflow: hidden; flex: none; }
8710
+ .shell > .bar .tour-pill-slot, .shell > .bar-home #reload-button { display: none !important; }
8711
+ }
8712
+ /* The room's bar knows its own width (2026-10-14): split beside a second conversation and the
8713
+ browser it is narrow on a wide screen, where the screen's media queries never fire. */
8714
+ /* Both names: «bar» is the one every older fold of the bar asks for; with only «roombar» here
8715
+ (2026-10-14) none of them fired and a narrow bar kept its wide keys. */
8716
+ .shell > .bar:not(.bar-home) { container: bar roombar / inline-size; }
8717
+ @container roombar (max-width: 760px) {
8718
+ .tour-pill-go[data-short] { font-size: 0; }
8719
+ .tour-pill-go[data-short]::after { content: attr(data-short); font-size: 12px; }
8720
+ }
8721
+ @container roombar (max-width: 470px) {
8722
+ .bar-left .brand { width: 40px; overflow: hidden; flex: none; }
8723
+ .tour-pill-slot { display: none !important; }
8724
+ }
8725
+ /* A narrow bar (2026-10-14): the pill says «Recorrido · 3/13»; the full sentence stays its name. */
8726
+ @media (max-width: 1180px) {
8727
+ .tour-pill-go[data-short] { font-size: 0; }
8728
+ .tour-pill-go[data-short]::after { content: attr(data-short); font-size: 12px; }
8729
+ }
8342
8730
  .tour-pill-x:hover { color: var(--text); background: color-mix(in srgb, var(--text) 10%, transparent); }
8343
8731
 
8344
8732
  /* A hint: one line, once, beside the place it speaks of, in the top layer — a bubble, no beak. And
@@ -8353,7 +8741,32 @@ dialog.tour-bonjour::backdrop { background: transparent; }
8353
8741
  .tour-hint b { font-size: 14px; font-weight: 650; }
8354
8742
  .tour-hint p { margin: 0; font-size: 13px; line-height: 1.45; color: var(--text-2); }
8355
8743
  .tour-hint .tour-btn { justify-self: end; margin-top: 4px; }
8356
- .tour-hint.inline { position: relative; inset: auto; z-index: auto; margin: 0 0 12px; text-align: left; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--tour-acc) 40%, transparent); background: color-mix(in srgb, var(--tour-acc) 10%, transparent); -webkit-backdrop-filter: none; backdrop-filter: none; }
8744
+ /* Inside a window (a modal sheet, where a floating card could not be pressed): the same card as the
8745
+ floating hint, set into the window with its margins — not a tinted band glued to its edges
8746
+ (2026-10-17). Eyebrow, title and line on the left; its one key on the right, the hint's small key. */
8747
+ .tour-hint.inline {
8748
+ position: relative; inset: auto; z-index: auto; max-height: none; overflow: visible;
8749
+ margin: 12px 12px 4px; padding: 12px 14px 12px 16px; border-radius: 16px; text-align: left;
8750
+ grid-template-columns: minmax(0, 1fr) auto; column-gap: 16px; row-gap: 3px; align-items: center;
8751
+ background: color-mix(in srgb, var(--bg-2, var(--bg)) 94%, transparent);
8752
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--tour-acc) 32%, transparent), 0 8px 22px -14px rgba(0, 0, 0, .4);
8753
+ -webkit-backdrop-filter: none; backdrop-filter: none; animation: none;
8754
+ }
8755
+ .tour-hint.inline > :not(.tour-btn) { grid-column: 1; }
8756
+ .tour-hint.inline > .tour-btn { grid-column: 2; grid-row: 1 / span 3; align-self: center; justify-self: end; margin: 0; }
8757
+ :root[data-scheme="light"] .tour-hint.inline { background: #ffffff; box-shadow: 0 0 0 1px color-mix(in srgb, var(--tour-acc) 30%, transparent), 0 8px 22px -16px rgba(20, 30, 20, .3); }
8758
+ @media (max-width: 560px) { .tour-hint.inline { grid-template-columns: minmax(0, 1fr); } .tour-hint.inline > .tour-btn { grid-column: 1; grid-row: auto; margin-top: 6px; } }
8759
+ /* The way to a first-time hint whose place is out of view: a pill at the edge the place went past,
8760
+ with the hint's own title and which way to go. A click takes the page there (tour.js). */
8761
+ .tour-hint-away { --tour-acc: var(--s-acc, var(--acc, var(--phosphor))); position: fixed; inset: auto; left: 50%; translate: -50% 0; margin: 0; z-index: 2147483000; display: inline-flex; align-items: center; gap: 8px; max-width: min(420px, calc(100vw - 32px)); padding: 8px 14px 8px 10px; border: 0; border-radius: 999px; font: inherit; font-family: var(--read); color: var(--text); background: color-mix(in srgb, var(--bg-2, var(--bg)) 94%, transparent); -webkit-backdrop-filter: blur(22px) saturate(1.3); backdrop-filter: blur(22px) saturate(1.3); box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--tour-acc) 70%, transparent), 0 14px 32px -14px rgba(0, 0, 0, .45); cursor: pointer; animation: tour-rise calc(360ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1) both; }
8762
+ .tour-hint-away[data-side="up"] { top: calc(env(safe-area-inset-top, 0px) + 84px); bottom: auto; }
8763
+ .tour-hint-away[data-side="down"] { bottom: calc(env(safe-area-inset-bottom, 0px) + 24px); top: auto; }
8764
+ .tour-hint-away svg { flex: none; width: var(--ico-sm, 15px); height: var(--ico-sm, 15px); color: var(--tour-acc); }
8765
+ .tour-hint-away[data-side="down"] svg { rotate: 180deg; }
8766
+ .tour-hint-away b { font-size: 13px; font-weight: 650; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
8767
+ .tour-hint-away span { font-size: 12.5px; color: var(--text-2); white-space: nowrap; }
8768
+ .tour-hint-away:is(:hover, :focus-visible) { box-shadow: 0 0 0 2px var(--tour-acc), 0 14px 32px -14px rgba(0, 0, 0, .45); outline: none; }
8769
+ .tour-hint-away[hidden], .tour-hint[hidden] { display: none !important; }
8357
8770
 
8358
8771
  @media (max-width: 720px) {
8359
8772
  .tour-body { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); }
@@ -8362,7 +8775,7 @@ dialog.tour-bonjour::backdrop { background: transparent; }
8362
8775
  .tour-nav-name { overflow: visible; }
8363
8776
  }
8364
8777
  @media (prefers-reduced-motion: reduce) {
8365
- dialog.tour-bonjour[open], .tour-bonjour-stage > *, .tour-bonjour-done > *, .tour-chapter, .ts-moved-row, .tour-hint, .tour-notice { animation: none; }
8778
+ dialog.tour-bonjour[open], .tour-bonjour-stage > *, .tour-bonjour-done > *, .tour-chapter, .ts-moved-row, .tour-hint, .tour-hint-away, .tour-notice { animation: none; }
8366
8779
  .tour-scene *, .tour-scene *::after { animation: none !important; }
8367
8780
  .ts-type b:first-child, .ts-arrive { opacity: 1; }
8368
8781
  .ts-search em { width: 54%; }
@@ -8495,10 +8908,1313 @@ dialog.tour-bonjour::backdrop { background: transparent; }
8495
8908
  .ts-widgets .ts-card:nth-child(2) i { animation-delay: .15s; } .ts-widgets .ts-card:nth-child(3) i { animation-delay: .3s; } .ts-widgets .ts-card:nth-child(4) i { animation-delay: .45s; }
8496
8909
  }
8497
8910
  @keyframes ts-fill { from { background-size: 0 100%; background-repeat: no-repeat; } to { background-size: 100% 100%; background-repeat: no-repeat; } }
8498
- .hint-card.in-modal::before { content: none; }
8499
8911
 
8500
8912
  /* The tables of what was renamed or moved: a long new name wraps under itself, never past the box. */
8501
8913
  .ts-moved-row .now { overflow-wrap: anywhere; line-height: 1.35; }
8502
8914
 
8503
8915
  /* The welcome and its chapters are dialogs too: their own ring is not drawn around them. */
8504
8916
  dialog.tour-bonjour:focus, dialog.tour-bonjour:focus-visible, dialog.whats-new:focus, dialog.whats-new:focus-visible { outline: none; }
8917
+
8918
+ /* ==========================================================================================
8919
+ RESPUESTAS SIN BURBUJA (2026-10-15). La forma de siempre es C · piezas con carril difuso (app.js
8920
+ pone data-reply="pieces" y data-reply-legible="lane"); las demás quedan para comparar, por atributos en
8921
+ <html> que pone el selector de prueba (app.js, ?reply=): data-reply = doc (A · regla bajo la
8922
+ cabecera), doc-inline (A · el avatar entra a la cabecera), pieces (C · plan en tarjeta),
8923
+ pieces-edge (C · tarjeta con el filo de cada agente). data-reply-legible = lane (vidrio difuso
8924
+ detrás de cada respuesta), column (una columna de lectura detrás de toda la conversación), halo
8925
+ (sin plano: un halo en las letras), stripe (franja que se desvanece a la derecha). El carril solo
8926
+ existe sobre un fondo de pantalla.
8927
+ ========================================================================================== */
8928
+ :root[data-reply] #messages#messages .row.assistant { max-width: min(760px, 88%); }
8929
+ :root[data-reply] #messages#messages .row.assistant .bubble { background: transparent !important; box-shadow: none !important; border: 0 !important; border-radius: 0 !important; padding: 2px 0 0 !important; }
8930
+ :root[data-reply] #messages#messages .row.assistant .who { margin-left: 0; }
8931
+ :root[data-reply] #messages#messages .row.assistant .bubble-foot { margin-top: 6px; }
8932
+ :root[data-reply] #messages#messages .row.assistant .stamp > span { font-family: var(--mono); }
8933
+ /* A · regla bajo la cabecera */
8934
+ :root[data-reply="doc"] #messages#messages .row.assistant .who { padding-bottom: 7px; margin-bottom: 6px; border-bottom: 1px solid var(--line); }
8935
+ /* A · avatar en la cabecera: la fila es una sola columna y el agente se dice con un punto de su color. */
8936
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant { grid-template-columns: minmax(0, 1fr); }
8937
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant > .avatar { display: none; }
8938
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant .who { align-items: center; margin-bottom: 4px; }
8939
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant .who::before { content: ''; flex: none; width: 18px; height: 18px; border-radius: 50%; background: var(--agent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--agent) 18%, transparent); }
8940
+ :root[data-reply="doc-inline"] #messages#messages .row.assistant .who > span:first-child { font-size: 11.5px; font-weight: 600; }
8941
+ /* C · lo accionable en tarjeta */
8942
+ :root[data-reply^="pieces"] #messages#messages .row.assistant .plan-card { border: 0; border-radius: 14px; padding: 10px 14px; background: var(--panel); box-shadow: var(--lift-1); }
8943
+ :root[data-reply="pieces-edge"] #messages#messages .row.assistant .plan-card li { list-style: none; margin: 6px 0 6px -18px; padding: 5px 0 5px 10px; border-left: 3px solid var(--agent); border-radius: 2px; }
8944
+ :root[data-reply="pieces-edge"] #messages#messages .row.assistant .plan-card { border-left: 3px solid var(--agent); }
8945
+ /* Los carriles, solo sobre un fondo de pantalla */
8946
+ :root[data-reply][data-reply-legible][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col { position: relative; isolation: isolate; }
8947
+ :root[data-reply][data-reply-legible="lane"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col::before,
8948
+ :root[data-reply][data-reply-legible="stripe"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col::before {
8949
+ content: ''; position: absolute; inset: -10px -18px -8px -14px; z-index: -1; border-radius: 22px;
8950
+ background: color-mix(in srgb, var(--bg) 62%, transparent);
8951
+ -webkit-backdrop-filter: blur(18px) saturate(1.15); backdrop-filter: blur(18px) saturate(1.15);
8952
+ -webkit-mask-image: radial-gradient(120% 140% at 40% 50%, #000 62%, transparent 100%); mask-image: radial-gradient(120% 140% at 40% 50%, #000 62%, transparent 100%);
8953
+ }
8954
+ :root[data-reply][data-reply-legible="stripe"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .col::before {
8955
+ inset: -10px -60px -8px -14px; border-radius: 18px 0 0 18px; background: color-mix(in srgb, var(--bg) 70%, transparent);
8956
+ -webkit-mask-image: linear-gradient(90deg, #000 0, #000 68%, transparent 100%); mask-image: linear-gradient(90deg, #000 0, #000 68%, transparent 100%);
8957
+ }
8958
+ :root[data-reply][data-reply-legible="column"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .thread-inner {
8959
+ border-radius: 26px; background: color-mix(in srgb, var(--bg) 52%, transparent);
8960
+ -webkit-backdrop-filter: blur(20px) saturate(1.15); backdrop-filter: blur(20px) saturate(1.15);
8961
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 8%, transparent);
8962
+ padding-left: 18px; padding-right: 18px;
8963
+ }
8964
+ :root[data-reply][data-reply-legible="halo"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant :is(.bubble, .who) {
8965
+ text-shadow: 0 0 1px var(--bg), 0 0 6px var(--bg), 0 0 14px color-mix(in srgb, var(--bg) 85%, transparent), 0 0 24px color-mix(in srgb, var(--bg) 60%, transparent);
8966
+ }
8967
+ :root[data-reply][data-reply-legible="halo"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.assistant .bubble { font-weight: 400; }
8968
+ /* El selector de la prueba: solo existe con ?reply= (app.js, PRUEBA · respuestas sin burbuja). */
8969
+ .reply-lab { position: fixed; left: 50%; top: 66px; z-index: 90; transform: translateX(-50%); display: grid; gap: 4px; padding: 6px; border-radius: 14px; background: color-mix(in srgb, var(--panel) 90%, transparent); -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); box-shadow: 0 0 0 .5px var(--line-2), 0 10px 28px -8px rgba(0, 0, 0, .45); font-family: var(--read); }
8970
+ .reply-lab .lab-row { display: flex; align-items: center; gap: 3px; }
8971
+ .reply-lab b { width: 58px; padding: 0 6px; font: 600 10px var(--mono); letter-spacing: .14em; text-transform: uppercase; color: var(--text-3); }
8972
+ .reply-lab button { white-space: nowrap; height: 27px; padding: 0 10px; border: 0; border-radius: 9px; background: transparent; color: var(--text-2); font: 500 12px var(--read); cursor: pointer; }
8973
+ .reply-lab button:hover { background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); }
8974
+ .reply-lab button.on { background: var(--phosphor); color: var(--phosphor-ink); }
8975
+ .reply-lab button:disabled { opacity: .4; cursor: default; }
8976
+ .reply-lab .lab-sample { margin-left: auto; box-shadow: inset 0 0 0 1px var(--line-2); }
8977
+
8978
+ /* ==========================================================================================
8979
+ PIEZAS QUE SE USAN (2026-10-15): la petición de comandos y la tarjeta de @madre local, con la
8980
+ letra de lectura y botones que se sienten botones. Solo forma: lo que hacen no cambia.
8981
+ ========================================================================================== */
8982
+ /* «@agente te pide correr» */
8983
+ #messages#messages .choice.run-request .choice-q { margin: 2px 2px 14px; font-family: var(--read); font-size: 16px; font-weight: 600; line-height: 1.4; }
8984
+ #messages#messages .choice.run-request .run-line { grid-template-columns: 22px minmax(0, 1fr) auto; align-items: center; gap: 12px; padding: 10px 10px 10px 12px; border: 0 !important; border-radius: 12px; background: color-mix(in srgb, var(--text) 4%, transparent) !important; box-shadow: inset 0 0 0 1px var(--line) !important; }
8985
+ #messages#messages .choice.run-request .run-line + .run-line, #messages#messages .choice.run-request .run-why + .run-line { margin-top: 6px; }
8986
+ #messages#messages .choice.run-request .run-line:hover:not(:disabled) { background: color-mix(in srgb, var(--text) 7%, transparent) !important; box-shadow: inset 0 0 0 1px var(--line-2) !important; }
8987
+ #messages#messages .choice.run-request .run-line .choice-key { width: 22px; height: 22px; margin: 0; border: 0 !important; border-radius: 6px; background: color-mix(in srgb, var(--text) 7%, transparent) !important; box-shadow: none !important; color: var(--text-3); font-size: 11.5px; }
8988
+ #messages#messages .choice.run-request .run-line .choice-text { padding: 0 !important; border: 0 !important; background: transparent !important; box-shadow: none !important; color: var(--text) !important; font-family: var(--mono); font-size: 13px; line-height: 1.45; }
8989
+ #messages#messages .choice.run-request .run-line .choice-tag { display: inline-flex; align-items: center; gap: 5px; height: 26px; padding: 0 11px; border: 0 !important; border-radius: 999px; background: color-mix(in srgb, var(--text) 9%, transparent) !important; box-shadow: none !important; color: var(--text) !important; font-family: var(--read); font-size: 12px; font-weight: 500; letter-spacing: 0; text-transform: lowercase; white-space: nowrap; }
8990
+ #messages#messages .choice.run-request .run-line .choice-tag::first-letter { text-transform: uppercase; }
8991
+ #messages#messages .choice.run-request .run-line:not(.ran):not(.failed):not(.refused):not(.running):not(.serving) .choice-tag { background: var(--agent, var(--phosphor)) !important; color: var(--agent-on, var(--phosphor-ink)) !important; }
8992
+ #messages#messages .choice.run-request .run-line.ran .choice-tag { background: color-mix(in srgb, var(--ok, var(--phosphor)) 15%, transparent) !important; color: var(--ok, var(--phosphor)) !important; }
8993
+ #messages#messages .choice.run-request .run-line.ran .choice-tag { position: relative; padding-left: 26px; }
8994
+ #messages#messages .choice.run-request .run-line.ran .choice-tag::before { content: '✓'; position: absolute; left: 11px; text-transform: none; }
8995
+ #messages#messages .choice.run-request .run-line.failed .choice-tag { background: color-mix(in srgb, var(--crit) 15%, transparent) !important; color: var(--crit) !important; }
8996
+ #messages#messages .choice.run-request .run-line.refused { opacity: 1; }
8997
+ #messages#messages .choice.run-request .run-line.refused .choice-text { color: var(--text-3) !important; }
8998
+ #messages#messages .choice.run-request .run-line.refused .choice-tag { background: transparent !important; box-shadow: inset 0 0 0 1px var(--line-2) !important; color: var(--text-3) !important; }
8999
+ #messages#messages .choice.run-request .run-why { margin: 6px 0 0 46px; font-family: var(--read); font-size: 12.5px; line-height: 1.45; letter-spacing: 0; text-transform: none; color: var(--text-3); }
9000
+ #messages#messages .choice.run-request .run-summary { display: inline-flex; align-items: center; margin: 12px 2px 0; padding: 4px 11px; border-radius: 999px; background: color-mix(in srgb, var(--text) 6%, transparent); font-family: var(--read); font-size: 12.5px; letter-spacing: 0; color: var(--text-2); }
9001
+ #messages#messages .choice.run-request.returned .run-summary { background: color-mix(in srgb, var(--ok, var(--phosphor)) 13%, transparent); color: var(--ok, var(--phosphor)); }
9002
+ #messages#messages .choice.run-request :is(.run-all, .run-back) { height: 30px; padding: 0 13px; border: 0 !important; border-radius: 9px; background: color-mix(in srgb, var(--text) 8%, transparent) !important; color: var(--text) !important; font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; text-transform: none; }
9003
+ #messages#messages .choice.run-request .choice-foot { margin: 14px 2px 0; font-family: var(--read); font-size: 12px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text-3); }
9004
+ /* @madre local: una tarjeta que se lee, a la izquierda, y su botón como el de las demás. */
9005
+ #messages#messages .system.local-model { justify-items: start; gap: 6px; padding: 14px 16px; text-align: left; }
9006
+ #messages#messages .system.local-model .head { display: inline-flex; align-items: center; gap: 6px; font-family: var(--mono); font-size: 10.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); }
9007
+ #messages#messages .system.local-model .head .who { padding: 2px 8px; border-radius: 999px; background: color-mix(in srgb, var(--agent, var(--phosphor)) 14%, transparent); color: var(--agent, var(--phosphor)); }
9008
+ #messages#messages .system.local-model .says { max-width: 62ch; font-family: var(--read); font-size: 14px; line-height: 1.5; letter-spacing: 0; text-transform: none; color: var(--text); text-align: left; }
9009
+ #messages#messages .system.local-model .says.small { font-size: 12.5px; color: var(--text-3); }
9010
+ #messages#messages .system.local-model .acts { justify-content: flex-start; margin-top: 4px; }
9011
+ #messages#messages .system.local-model .acts button { height: 30px; padding: 0 14px; border: 0 !important; border-radius: 9px; background: var(--phosphor) !important; box-shadow: none !important; color: var(--phosphor-ink) !important; font-family: var(--read); font-size: 12.5px; font-weight: 600; letter-spacing: 0; text-transform: lowercase; }
9012
+ #messages#messages .system.local-model .acts button::first-letter { text-transform: uppercase; }
9013
+ #messages#messages .system.local-model .acts button + button { background: color-mix(in srgb, var(--text) 8%, transparent) !important; color: var(--text) !important; }
9014
+ .reply-lab .lab-code { margin-left: auto; padding: 4px 10px; border-radius: 8px; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); font: 600 12px var(--mono); letter-spacing: .08em; }
9015
+
9016
+ /* «#3 EDITAR concedido»: un estado pequeño en el color de su modo, no una franja punteada. */
9017
+ #messages#messages .mode-ask.settled { display: inline-flex !important; grid-template-columns: none; justify-self: start; align-self: flex-start; width: fit-content !important; max-width: 100%; margin-left: 0 !important; margin-right: auto !important; padding: 5px 12px 5px 10px; border: 0 !important; border-radius: 999px; background: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 13%, transparent) !important; box-shadow: none !important; }
9018
+ #messages#messages .mode-ask.settled .mode-what { display: inline-flex; align-items: center; gap: 7px; font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; color: var(--mode-c, var(--ok, var(--phosphor))); }
9019
+ #messages#messages .mode-ask.settled .mode-what::before { content: '✓'; font-weight: 700; }
9020
+ #messages#messages .mode-ask.settled[data-mode="1"] { --mode-c: var(--mode-1); }
9021
+ #messages#messages .mode-ask.settled[data-mode="2"] { --mode-c: var(--mode-2); }
9022
+ #messages#messages .mode-ask.settled[data-mode="3"] { --mode-c: var(--mode-3); }
9023
+ #messages#messages .mode-ask.settled[data-mode="4"] { --mode-c: var(--mode-4); }
9024
+
9025
+ /* ==========================================================================================
9026
+ PRUEBA · las tarjetas de /run en cuatro formas (2026-10-15), por data-term en <html>:
9027
+ line (a), window (b), pill (c), step (d). Sin el atributo, la de siempre.
9028
+ ========================================================================================== */
9029
+ /* a · línea: el comando primero, el estado y quién a la derecha, la última línea debajo. */
9030
+ :root[data-term="line"] #messages#messages .command-card.terminal { border-radius: 14px; }
9031
+ :root[data-term="line"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
9032
+ :root[data-term="line"] #messages .command-card.terminal .term-head { gap: 10px; padding: 10px 12px; }
9033
+ :root[data-term="line"] #messages .command-card.terminal .term-head .chev-icon { order: -1; }
9034
+ :root[data-term="line"] #messages .command-card.terminal .term-line { font-size: 13px; }
9035
+ :root[data-term="line"] #messages .command-card.terminal .term-status { font-family: var(--read); font-size: 12px; padding: 3px 10px; }
9036
+ :root[data-term="line"] #messages .command-card.terminal .term-who { font-family: var(--read); font-size: 12px; }
9037
+ :root[data-term="line"] #messages .command-card.terminal .term-peek { padding: 0 12px 10px 38px; font-size: 12px; }
9038
+ :root[data-term="line"] #messages .command-card.terminal .term-peek::before { content: '→ '; color: var(--text-3); }
9039
+ /* b · ventana: una terminal pequeña, oscura en los dos temas, con su salida a la vista. */
9040
+ :root[data-term="window"] #messages#messages .command-card.terminal { overflow: hidden; border-radius: 14px; border: 0 !important; background: #0d100d !important; box-shadow: 0 0 0 .5px rgba(255, 255, 255, .1), var(--lift-1) !important; color: #e9ede6; }
9041
+ :root[data-term="window"] #messages .command-card.terminal .term-head { padding: 9px 12px; background: rgba(255, 255, 255, .05); border-bottom: 1px solid rgba(255, 255, 255, .07); }
9042
+ :root[data-term="window"] #messages .command-card.terminal .term-head::before { content: ''; flex: none; width: 34px; height: 10px; background: radial-gradient(circle at 5px 5px, #ff5f57 4px, transparent 4.5px), radial-gradient(circle at 17px 5px, #febc2e 4px, transparent 4.5px), radial-gradient(circle at 29px 5px, #28c840 4px, transparent 4.5px); opacity: .85; }
9043
+ :root[data-term="window"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
9044
+ :root[data-term="window"] #messages .command-card.terminal .term-line { color: #e9ede6; font-size: 12.5px; }
9045
+ :root[data-term="window"] #messages .command-card.terminal .term-who { color: #9aa197; }
9046
+ :root[data-term="window"] #messages .command-card.terminal .term-peek { margin: 0; padding: 10px 14px 12px; font-size: 12px; color: #b8c2b4; white-space: pre-wrap; }
9047
+ :root[data-term="window"] #messages .command-card.terminal .term-peek::before { content: '› '; color: #28c840; }
9048
+ :root[data-term="window"] #messages .command-card.terminal pre { background: transparent; border-top-color: rgba(255, 255, 255, .07); color: #e9ede6; }
9049
+ /* c · píldora: como las llamadas a herramientas de los chats, una línea del ancho de lo que dice. */
9050
+ :root[data-term="pill"] #messages#messages .command-card.terminal:not(.open) { justify-self: start; width: fit-content; max-width: 100%; border-radius: 999px; }
9051
+ :root[data-term="pill"] #messages .command-card.terminal:not(.open) .term-peek, :root[data-term="pill"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
9052
+ :root[data-term="pill"] #messages .command-card.terminal:not(.open) .term-head { padding: 6px 12px 6px 8px; gap: 8px; }
9053
+ :root[data-term="pill"] #messages .command-card.terminal .term-status { order: -1; font-family: var(--read); font-size: 12px; }
9054
+ :root[data-term="pill"] #messages .command-card.terminal .term-line { font-size: 12.5px; }
9055
+ :root[data-term="pill"] #messages .command-card.terminal .term-who { font-family: var(--read); font-size: 12px; }
9056
+ :root[data-term="pill"] #messages#messages .command-card.terminal.open { border-radius: 14px; }
9057
+ /* d · paso: sin tarjeta; un punto de estado en un hilo, el comando y debajo quién, cuánto y qué dijo. */
9058
+ :root[data-term="step"] #messages#messages .command-card.terminal { position: relative; padding-left: 26px; border: 0 !important; background: transparent !important; box-shadow: none !important; }
9059
+ :root[data-term="step"] #messages#messages .command-card.terminal::before { content: ''; position: absolute; left: 7px; top: 0; bottom: 0; width: 2px; border-radius: 2px; background: color-mix(in srgb, var(--text) 12%, transparent); }
9060
+ :root[data-term="step"] #messages#messages .command-card.terminal::after { content: '✓'; position: absolute; left: 0; top: 9px; display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; background: var(--ok, var(--phosphor)); color: var(--bg); font: 700 10px var(--read); }
9061
+ :root[data-term="step"] #messages#messages .command-card.terminal.failed::after { content: '✕'; background: var(--crit); }
9062
+ :root[data-term="step"] #messages .command-card.terminal :is(.term-tag, .term-count) { display: none; }
9063
+ :root[data-term="step"] #messages .command-card.terminal .term-head { flex-wrap: wrap; padding: 6px 0; row-gap: 2px; }
9064
+ :root[data-term="step"] #messages .command-card.terminal .term-line { flex: 1 1 calc(100% - 40px); font-size: 13px; }
9065
+ :root[data-term="step"] #messages .command-card.terminal .term-head .chev-icon { order: 0; }
9066
+ :root[data-term="step"] #messages .command-card.terminal .term-status { order: 2; padding: 0; background: none !important; font-family: var(--read); font-size: 12px; }
9067
+ :root[data-term="step"] #messages .command-card.terminal .term-who { order: 3; font-family: var(--read); font-size: 12px; }
9068
+ :root[data-term="step"] #messages .command-card.terminal .term-who::before { content: '· '; color: var(--text-3); }
9069
+ :root[data-term="step"] #messages .command-card.terminal .term-peek { padding: 0 0 6px; font-size: 12px; }
9070
+ :root[data-term="step"] #messages .command-card.terminal pre { border: 0; border-radius: 10px; margin-bottom: 6px; }
9071
+ :root[data-term="step"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .command-card.terminal { padding-right: 12px; border-radius: 0 14px 14px 0; background: color-mix(in srgb, var(--bg) 62%, transparent) !important; -webkit-backdrop-filter: blur(18px) saturate(1.15); backdrop-filter: blur(18px) saturate(1.15); }
9072
+ #messages#messages .mode-ask.settled { background: color-mix(in srgb, var(--mode-c, var(--phosphor)) 16%, color-mix(in srgb, var(--bg) 78%, transparent)) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--mode-c, var(--phosphor)) 45%, transparent) !important; -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); }
9073
+ #messages#messages .mode-ask.settled .mode-what { color: color-mix(in srgb, var(--mode-c, var(--phosphor)) 70%, var(--text)); }
9074
+
9075
+ /* ==========================================================================================
9076
+ LABORATORIO DEL CHAT (2026-10-15): el panel de ?lab (app.js) y las cinco formas de cada
9077
+ elemento, por data-labNN en <html>. A es siempre como se ve hoy.
9078
+ ========================================================================================== */
9079
+ .lab-panel { position: fixed; top: 64px; right: 12px; bottom: 12px; z-index: 95; width: 300px; display: flex; flex-direction: column; border-radius: 16px; background: color-mix(in srgb, var(--panel) 92%, transparent); -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px); box-shadow: 0 0 0 .5px var(--line-2), 0 18px 40px -12px rgba(0, 0, 0, .5); font-family: var(--read); }
9080
+ .lab-panel.folded { bottom: auto; width: auto; }
9081
+ .lab-head { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 10px 12px; border-bottom: 1px solid var(--line); }
9082
+ .lab-head b { font: 600 13px var(--read); }
9083
+ .lab-fold { width: 26px; height: 26px; border: 0; border-radius: 8px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); cursor: pointer; }
9084
+ .lab-code { margin-left: auto; padding: 4px 9px; border-radius: 8px; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); font: 600 12px var(--mono); letter-spacing: .06em; }
9085
+ .lab-copy, .lab-again { height: 28px; padding: 0 11px; border: 0; border-radius: 8px; background: var(--phosphor); color: var(--phosphor-ink); font: 600 12px var(--read); cursor: pointer; }
9086
+ .lab-copy { flex: 1 1 100%; }
9087
+ .lab-list { flex: 1; overflow: auto; padding: 6px 8px; display: grid; gap: 2px; align-content: start; }
9088
+ .lab-row { display: grid; gap: 3px; padding: 7px 6px; border-radius: 10px; }
9089
+ .lab-row:hover { background: color-mix(in srgb, var(--text) 4%, transparent); }
9090
+ .lab-top { display: flex; align-items: center; gap: 8px; }
9091
+ .lab-n { font: 600 10.5px var(--mono); color: var(--text-3); }
9092
+ .lab-name { flex: 1; min-width: 0; font-size: 12.5px; font-weight: 600; color: var(--text); }
9093
+ .lab-keys { display: inline-flex; gap: 2px; padding: 2px; border-radius: 8px; background: color-mix(in srgb, var(--text) 6%, transparent); }
9094
+ .lab-keys button { width: 22px; height: 22px; border: 0; border-radius: 6px; background: none; color: var(--text-2); font: 600 11px var(--mono); cursor: pointer; }
9095
+ .lab-keys button.on { background: var(--phosphor); color: var(--phosphor-ink); }
9096
+ .lab-desc { padding-left: 26px; font-size: 11.5px; color: var(--text-3); }
9097
+ .lab-again { margin: 8px 12px 12px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text); }
9098
+ :root[data-lab="on"] .shell { padding-right: 312px; }
9099
+ @media (max-width: 900px) { :root[data-lab="on"] .shell { padding-right: 0; } .lab-panel { width: 260px; } }
9100
+ /* 01 · Mensaje del humano */
9101
+ :root[data-lab01="B"] #messages#messages .row.user .bubble { background: var(--panel-2) !important; color: var(--text) !important; border-radius: 20px !important; box-shadow: none !important; }
9102
+ :root[data-lab01="C"] #messages#messages .row.user .bubble { background: transparent !important; color: var(--text) !important; box-shadow: none !important; padding: 0 !important; text-align: right; }
9103
+ :root[data-lab01="D"] #messages#messages .row.user { justify-self: stretch; max-width: 100%; }
9104
+ :root[data-lab01="D"] #messages#messages .row.user .col { justify-items: stretch; }
9105
+ :root[data-lab01="D"] #messages#messages .row.user .bubble { background: var(--panel) !important; color: var(--text) !important; border-radius: 14px !important; box-shadow: 0 0 0 1px var(--line-2) !important; text-align: left; }
9106
+ :root[data-lab01="D"] #messages#messages .row.user .who { justify-content: flex-start; }
9107
+ :root[data-lab01="E"] #messages#messages .row.user .bubble { background: var(--panel-2) !important; color: var(--text) !important; border-radius: 20px !important; box-shadow: inset 0 0 0 1px var(--line) !important; }
9108
+ :root[data-lab01="E"] #messages#messages .row.user .stamp .to { order: -1; font-size: 12px; color: var(--text); }
9109
+ /* 02 · Adjuntos */
9110
+ :root[data-lab02="B"] #messages .row.user .files { display: flex; flex-wrap: wrap; gap: 6px; }
9111
+ :root[data-lab02="B"] #messages .row.user .file-tile { display: inline-flex; align-items: center; gap: 6px; width: auto; height: 28px; padding: 0 10px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--text) 8%, transparent); }
9112
+ :root[data-lab02="C"] #messages .row.user .file-tile { display: inline-grid; grid-template-columns: 30px auto; align-items: center; gap: 10px; width: auto; height: auto; padding: 8px 12px 8px 8px; border: 0; border-radius: 12px; background: var(--panel); box-shadow: var(--lift-1); color: var(--text); }
9113
+ :root[data-lab02="C"] #messages .row.user .file-tile .kind { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 8px; background: color-mix(in srgb, var(--text) 8%, transparent); }
9114
+ :root[data-lab02="D"] #messages .row.user .files { display: flex; flex-wrap: wrap; gap: 4px 10px; }
9115
+ :root[data-lab02="D"] #messages .row.user .file-tile { width: auto; height: auto; padding: 0; border: 0; background: none; color: inherit; opacity: .75; font-size: 12px; }
9116
+ :root[data-lab02="D"] #messages .row.user .file-tile .kind { display: none; }
9117
+ :root[data-lab02="D"] #messages .row.user .file-tile .name::before { content: '📎 '; }
9118
+ :root[data-lab02="E"] #messages .row.user .bubble { display: flex; flex-direction: column; }
9119
+ :root[data-lab02="E"] #messages .row.user .files { order: -1; margin: 0 0 8px; }
9120
+ /* 03 · Pensando */
9121
+ :root[data-lab03="B"] #messages .row.thinking .bubble > i { display: none; }
9122
+ :root[data-lab03="B"] #messages .row.thinking .bubble { background: transparent !important; box-shadow: none !important; }
9123
+ :root[data-lab03="B"] #messages .row.thinking .bubble::before { content: 'Pensando…'; background: linear-gradient(90deg, var(--text-3) 0%, var(--text) 50%, var(--text-3) 100%); background-size: 200% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; animation: lab-shimmer 2.2s linear infinite; font-weight: 500; }
9124
+ @keyframes lab-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }
9125
+ :root[data-lab03="C"] #messages .row.thinking .bubble { background: transparent !important; box-shadow: none !important; }
9126
+ :root[data-lab03="C"] #messages .row.thinking .bubble > i { display: none; }
9127
+ :root[data-lab03="C"] #messages .row.thinking > .avatar { animation: lab-pulse 1.4s ease-in-out infinite; }
9128
+ @keyframes lab-pulse { 0%, 100% { transform: scale(.92); } 50% { transform: scale(1.08); } }
9129
+ :root[data-lab03="D"] #messages .row.thinking .bubble > i { display: none; }
9130
+ :root[data-lab03="D"] #messages .row.thinking .bubble { width: 140px; height: 4px; padding: 0 !important; border-radius: 4px !important; overflow: hidden; background: color-mix(in srgb, var(--text) 10%, transparent) !important; box-shadow: none !important; }
9131
+ :root[data-lab03="D"] #messages .row.thinking .bubble::before { content: ''; display: block; width: 40%; height: 100%; border-radius: inherit; background: var(--agent, var(--phosphor)); animation: lab-bar 1.4s ease-in-out infinite; }
9132
+ @keyframes lab-bar { 0% { transform: translateX(-100%); } 100% { transform: translateX(260%); } }
9133
+ :root[data-lab03="E"] #messages .row.thinking .bubble > i { display: none; }
9134
+ :root[data-lab03="E"] #messages .row.thinking .bubble { display: inline-flex !important; align-items: center; gap: 6px; padding: 4px 12px !important; border-radius: 999px !important; background: color-mix(in srgb, var(--agent, var(--text)) 12%, transparent) !important; box-shadow: none !important; font-size: 12.5px; }
9135
+ :root[data-lab03="E"] #messages .row.thinking .bubble::before { content: 'pensando'; color: var(--agent, var(--text)); font-weight: 500; }
9136
+ /* 04 · Cabecera del agente */
9137
+ :root[data-lab04="B"] #messages#messages .row.assistant .who > span:first-child { font-family: var(--read); font-size: 14px; font-weight: 600; letter-spacing: 0; text-transform: none; color: var(--text); }
9138
+ :root[data-lab04="B"] #messages#messages .row.assistant .who .badge:not(.mode) { background: none !important; padding: 0; font-family: var(--read); letter-spacing: 0; text-transform: none; color: var(--text-3); }
9139
+ :root[data-lab04="C"] #messages#messages .row.assistant .who > span:first-child { padding: 3px 10px; border-radius: 999px; background: color-mix(in srgb, var(--agent) 15%, transparent); font-weight: 600; }
9140
+ :root[data-lab04="D"] #messages#messages .row.assistant .who > :not(:first-child) { opacity: 0; transition: opacity .2s; }
9141
+ :root[data-lab04="D"] #messages#messages .row.assistant:hover .who > :not(:first-child) { opacity: 1; }
9142
+ :root[data-lab04="E"] #messages#messages .row.assistant { grid-template-columns: minmax(0, 1fr); }
9143
+ :root[data-lab04="E"] #messages#messages .row.assistant > .avatar { display: none; }
9144
+ :root[data-lab04="E"] #messages#messages .row.assistant .who { align-items: center; }
9145
+ :root[data-lab04="E"] #messages#messages .row.assistant .who::before { content: ''; flex: none; width: 18px; height: 18px; border-radius: 50%; background: var(--agent); }
9146
+ /* 05 · Cuerpo de la respuesta (hoy: prosa libre con carril) */
9147
+ :root[data-lab05="B"] #messages#messages .row.assistant .bubble { background: var(--panel) !important; box-shadow: var(--lift-1) !important; border-radius: 20px 20px 20px 6px !important; padding: 12px 16px !important; }
9148
+ :root[data-lab05="C"] #messages#messages .row.assistant .bubble { background: var(--panel) !important; box-shadow: 0 0 0 1px var(--line-2) !important; border-radius: 14px !important; padding: 12px 16px !important; }
9149
+ :root[data-lab05="D"] #messages#messages .row.assistant .bubble { padding: 4px 0 4px 14px !important; border-left: 3px solid var(--agent) !important; }
9150
+ :root[data-lab05="E"] #messages#messages .row.assistant .who { padding-bottom: 7px; margin-bottom: 6px; border-bottom: 1px solid var(--line); }
9151
+ :root[data-lab05]:not([data-lab05="A"]) #messages#messages .row.assistant .col::before { display: none; }
9152
+ :root[data-lab05="D"] #messages#messages .row.assistant .col::before, :root[data-lab05="E"] #messages#messages .row.assistant .col::before { display: block; }
9153
+ /* 06 · Memoria citada */
9154
+ :root[data-lab06="B"] #messages .cite { font-family: var(--mono); font-size: 10px; vertical-align: super; padding: 1px 4px; border-radius: 4px; background: color-mix(in srgb, var(--madre-green) 16%, transparent); color: var(--madre-green); }
9155
+ :root[data-lab06="C"] #messages .cite { display: inline-flex; padding: 1px 8px; border-radius: 999px; background: color-mix(in srgb, var(--madre-green) 14%, transparent); color: var(--madre-green); font: 500 11.5px var(--mono); }
9156
+ :root[data-lab06="D"] #messages .cite { text-decoration: underline dotted var(--madre-green); text-decoration-thickness: 2px; text-underline-offset: 4px; }
9157
+ :root[data-lab06="E"] #messages .cite { font-size: .8em; color: var(--text-3); }
9158
+ /* 07 · Plan */
9159
+ :root[data-lab07="B"] #messages .plan-card ol { list-style: none; padding-left: 0; }
9160
+ :root[data-lab07="B"] #messages .plan-card li { position: relative; padding: 6px 0 6px 26px; }
9161
+ :root[data-lab07="B"] #messages .plan-card li::before { content: ''; position: absolute; left: 0; top: 8px; width: 16px; height: 16px; border-radius: 5px; box-shadow: inset 0 0 0 1.5px var(--line-2); }
9162
+ :root[data-lab07="C"] #messages .plan-card ol { padding-left: 22px; }
9163
+ :root[data-lab07="C"] #messages .plan-card li { padding: 8px 0; border-top: 1px dashed var(--line-2); }
9164
+ :root[data-lab07="C"] #messages .plan-card li:first-child { border-top: 0; }
9165
+ :root[data-lab07="D"] #messages .plan-card ol { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; padding: 0; list-style: none; }
9166
+ :root[data-lab07="D"] #messages .plan-card li { display: grid; gap: 4px; margin: 0; padding: 10px 12px; border-radius: 12px; background: color-mix(in srgb, var(--agent) 10%, transparent); }
9167
+ :root[data-lab07="E"] #messages .plan-card ol { list-style: none; padding-left: 0; }
9168
+ :root[data-lab07="E"] #messages .plan-card li { position: relative; margin: 0; padding: 6px 0 10px 24px; }
9169
+ :root[data-lab07="E"] #messages .plan-card li::before { content: ''; position: absolute; left: 0; top: 9px; width: 12px; height: 12px; border-radius: 50%; background: var(--agent); }
9170
+ :root[data-lab07="E"] #messages .plan-card li:not(:last-child)::after { content: ''; position: absolute; left: 5px; top: 23px; bottom: -2px; width: 2px; background: var(--line-2); }
9171
+ /* 08 · Bloque de código */
9172
+ :root[data-lab08="B"] #messages .codeblock { overflow: hidden; border: 0 !important; border-radius: 12px; background: var(--panel) !important; box-shadow: var(--lift-1); }
9173
+ :root[data-lab08="B"] #messages .codeblock .lang, :root[data-lab08="B"] #messages .codeblock .copy { font-family: var(--read); letter-spacing: 0; text-transform: none; }
9174
+ :root[data-lab08="C"] #messages .codeblock .lang { display: none; }
9175
+ :root[data-lab08="C"] #messages .codeblock .copy { opacity: 0; transition: opacity .2s; }
9176
+ :root[data-lab08="C"] #messages .codeblock:hover .copy { opacity: 1; }
9177
+ :root[data-lab08="C"] #messages .codeblock { border: 0 !important; background: color-mix(in srgb, var(--text) 5%, transparent) !important; }
9178
+ :root[data-lab08="D"] #messages .codeblock { border: 0 !important; background: #0d100d !important; color: #e9ede6; }
9179
+ :root[data-lab08="D"] #messages .codeblock :is(pre, code, .lang, .copy) { color: #e9ede6 !important; background: transparent !important; }
9180
+ :root[data-lab08="E"] #messages .codeblock pre { max-height: 7.5em; overflow: hidden; -webkit-mask-image: linear-gradient(#000 55%, transparent); mask-image: linear-gradient(#000 55%, transparent); }
9181
+ /* 09 · Pie de la respuesta */
9182
+ :root[data-lab09="B"] #messages .row.assistant .bubble-foot .stamp { display: none; }
9183
+ :root[data-lab09="B"] #messages .row.assistant .bubble-foot { opacity: 0; transition: opacity .2s; }
9184
+ :root[data-lab09="B"] #messages .row.assistant:hover .bubble-foot { opacity: 1; }
9185
+ :root[data-lab09="C"] #messages .row.assistant .bubble-foot .stamp { padding: 3px 10px; border-radius: 999px; background: color-mix(in srgb, var(--text) 7%, transparent); }
9186
+ :root[data-lab09="D"] #messages .row.assistant .bubble-actions .act { border-radius: 8px; background: color-mix(in srgb, var(--text) 7%, transparent); }
9187
+ :root[data-lab09="E"] #messages .row.assistant .bubble-foot .stamp { opacity: .45; transition: opacity .2s; }
9188
+ :root[data-lab09="E"] #messages .row.assistant:hover .bubble-foot .stamp { opacity: 1; }
9189
+ /* 10 · Elección */
9190
+ :root[data-lab10="B"] #messages .choice:not(.run-request) .choice-list { display: flex; flex-wrap: wrap; gap: 6px; }
9191
+ :root[data-lab10="B"] #messages .choice:not(.run-request) .choice-option { width: auto; display: inline-flex; padding: 7px 14px; border-radius: 999px; }
9192
+ :root[data-lab10="B"] #messages .choice:not(.run-request) .choice-key { display: none; }
9193
+ :root[data-lab10="C"] #messages .choice:not(.run-request) .choice-option { border: 0; border-top: 1px solid var(--line); border-radius: 0; background: none; }
9194
+ :root[data-lab10="D"] #messages .choice:not(.run-request) .choice-list { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
9195
+ :root[data-lab10="D"] #messages .choice:not(.run-request) .choice-option { grid-template-columns: 1fr; align-content: start; min-height: 74px; }
9196
+ :root[data-lab10="E"] #messages .choice:not(.run-request) { background: transparent !important; box-shadow: none !important; border: 0 !important; padding: 0 !important; }
9197
+ :root[data-lab10="E"] #messages .choice:not(.run-request) .choice-list { display: flex; flex-wrap: wrap; gap: 6px; }
9198
+ :root[data-lab10="E"] #messages .choice:not(.run-request) .choice-option { width: auto; padding: 7px 14px; border-radius: 9px; }
9199
+ :root[data-lab10="E"] #messages .choice:not(.run-request) .choice-option.recommended { background: var(--agent, var(--phosphor)); color: var(--agent-on, var(--phosphor-ink)); }
9200
+ :root[data-lab10="E"] #messages .choice:not(.run-request) :is(.choice-key, .choice-kicker, .choice-foot) { display: none; }
9201
+ /* 11 · Petición de permiso */
9202
+ :root[data-lab11="B"] #messages .mode-ask:not(.settled) { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; }
9203
+ :root[data-lab11="B"] #messages .mode-ask:not(.settled) .mode-why { display: none; }
9204
+ :root[data-lab11="C"] #messages .mode-ask:not(.settled) { border: 0 !important; border-left: 4px solid var(--mode-2) !important; border-radius: 6px 14px 14px 6px !important; background: var(--panel) !important; }
9205
+ :root[data-lab11="D"] #messages .mode-ask:not(.settled) { position: sticky; bottom: 8px; z-index: 5; box-shadow: 0 10px 28px -8px rgba(0, 0, 0, .45) !important; }
9206
+ :root[data-lab11="E"] #messages .mode-ask:not(.settled) { background: transparent !important; border: 1px solid var(--line-2) !important; box-shadow: none !important; }
9207
+ /* 12 · Permiso concedido */
9208
+ :root[data-lab12="B"] #messages#messages .mode-ask.settled { align-self: stretch; width: auto !important; background: none !important; box-shadow: none !important; gap: 10px; }
9209
+ :root[data-lab12="B"] #messages#messages .mode-ask.settled::before, :root[data-lab12="B"] #messages#messages .mode-ask.settled::after { content: ''; flex: 1; align-self: center; height: 1px; background: var(--line-2); }
9210
+ :root[data-lab12="C"] #messages#messages .mode-ask.settled { align-self: center; background: none !important; box-shadow: none !important; }
9211
+ :root[data-lab12="C"] #messages#messages .mode-ask.settled .mode-what { color: var(--text-3); font-weight: 400; }
9212
+ :root[data-lab12="C"] #messages#messages .mode-ask.settled .mode-what::before { content: none; }
9213
+ :root[data-lab12="D"] #messages#messages .mode-ask.settled .mode-what::before { content: '🔓'; }
9214
+ :root[data-lab12="E"] #messages#messages .mode-ask.settled { background: none !important; box-shadow: none !important; }
9215
+ :root[data-lab12="E"] #messages#messages .mode-ask.settled .mode-what { color: var(--text-2); font-weight: 400; }
9216
+ :root[data-lab12="E"] #messages#messages .mode-ask.settled .mode-what::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--mode-c, var(--phosphor)); }
9217
+ /* 13 · Petición de comandos */
9218
+ :root[data-lab13="B"] #messages#messages .choice.run-request .run-line { background: transparent !important; box-shadow: none !important; border-radius: 0; border-top: 1px solid var(--line) !important; }
9219
+ :root[data-lab13="C"] #messages#messages .choice.run-request .run-line { background: #0d100d !important; }
9220
+ :root[data-lab13="C"] #messages#messages .choice.run-request .run-line .choice-text { color: #e9ede6 !important; }
9221
+ :root[data-lab13="D"] #messages#messages .choice.run-request .choice-list { counter-reset: lab-run; }
9222
+ :root[data-lab13="D"] #messages#messages .choice.run-request .run-line { counter-increment: lab-run; }
9223
+ :root[data-lab13="D"] #messages#messages .choice.run-request .run-line .choice-key { font-size: 0 !important; }
9224
+ :root[data-lab13="D"] #messages#messages .choice.run-request .run-line .choice-key::after { content: counter(lab-run); font: 600 11.5px var(--mono); color: var(--text-2); }
9225
+ :root[data-lab13="E"] #messages#messages .choice.run-request .run-line:not(.refused):not(:hover) .choice-tag { opacity: 0; }
9226
+ /* 15 · Avisos del sistema (abiertos en B–E) */
9227
+ :root[data-lab15]:not([data-lab15="A"]) #messages#messages .sys-dots.open { background: none !important; box-shadow: none !important; -webkit-backdrop-filter: none; backdrop-filter: none; }
9228
+ :root[data-lab15]:not([data-lab15="A"]) #messages#messages .sys-dots.open > .sys-more { display: none; }
9229
+ :root[data-lab15="B"] #messages#messages .sys-dots.open > .system.folded { text-align: center; padding-left: 12px !important; background: none !important; }
9230
+ :root[data-lab15="B"] #messages#messages .sys-dots.open > .system.folded::before { display: none; }
9231
+ :root[data-lab15="C"] #messages#messages .sys-dots.open > .system.folded { text-align: center; padding: 8px 12px !important; border-top: 1px solid var(--line-2); border-radius: 0 !important; background: none !important; }
9232
+ :root[data-lab15="C"] #messages#messages .sys-dots.open > .system.folded::before { display: none; }
9233
+ :root[data-lab15="D"] #messages#messages .sys-dots.open { justify-items: start; }
9234
+ :root[data-lab15="D"] #messages#messages .sys-dots.open > .system.folded { justify-self: start; border-radius: 999px !important; background: color-mix(in srgb, var(--panel) 88%, transparent) !important; box-shadow: var(--lift-1); }
9235
+ :root[data-lab15="E"] #messages#messages .sys-dots.open { gap: 8px; }
9236
+ :root[data-lab15="E"] #messages#messages .sys-dots.open > .system.folded { border-radius: 14px !important; background: var(--panel) !important; box-shadow: var(--lift-1); }
9237
+ /* 16 · Error y diagnóstico */
9238
+ :root[data-lab16="B"] #messages#messages .thread-inner > .system.fail { justify-self: start; margin-left: 40px; text-align: left; }
9239
+ :root[data-lab16="B"] #messages#messages .thread-inner > .system.fail::before { content: '⚠ '; }
9240
+ :root[data-lab16="C"] #messages#messages .thread-inner > .system.fail { width: 100%; max-width: 100%; border-radius: 10px; text-align: left; }
9241
+ :root[data-lab16="D"] #messages#messages .thread-inner > .system.fail { background: none !important; box-shadow: none !important; padding: 0; font-size: 12.5px; }
9242
+ :root[data-lab16="E"] #messages#messages .thread-inner > .system.fail { background: var(--panel) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--danger) 45%, transparent), var(--lift-1) !important; color: var(--text); }
9243
+ /* 17 · Espacio entre turnos */
9244
+ :root[data-lab17="B"] #messages .thread-inner > * + * { margin-top: 4px !important; }
9245
+ :root[data-lab17="C"] #messages .thread-inner > * + * { margin-top: 28px !important; }
9246
+ :root[data-lab17="D"] #messages .thread-inner > .row + .row { padding-top: 14px; border-top: 1px solid var(--line); }
9247
+ :root[data-lab17="E"] #messages .thread-inner > .row.assistant + .row.assistant { margin-top: 2px !important; }
9248
+ :root[data-lab17="E"] #messages .thread-inner > :is(.row.assistant[data-agent="claude"] + .row.assistant[data-agent="claude"], .row.assistant[data-agent="codex"] + .row.assistant[data-agent="codex"], .row.assistant[data-agent="gemini"] + .row.assistant[data-agent="gemini"], .row.assistant[data-agent="opencode"] + .row.assistant[data-agent="opencode"], .row.assistant[data-agent="madre"] + .row.assistant[data-agent="madre"]) .who { display: none; }
9249
+ :root[data-lab17="E"] #messages .thread-inner > :is(.row.assistant[data-agent="claude"] + .row.assistant[data-agent="claude"], .row.assistant[data-agent="codex"] + .row.assistant[data-agent="codex"], .row.assistant[data-agent="gemini"] + .row.assistant[data-agent="gemini"], .row.assistant[data-agent="opencode"] + .row.assistant[data-agent="opencode"], .row.assistant[data-agent="madre"] + .row.assistant[data-agent="madre"]) > .avatar { visibility: hidden; }
9250
+ :root[data-lab15="B"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .sys-dots.open > .system.folded,
9251
+ :root[data-lab15="C"][data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .sys-dots.open > .system.folded { background: color-mix(in srgb, var(--bg) 62%, transparent) !important; -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); border-radius: 12px !important; }
9252
+
9253
+ /* ==========================================================================================
9254
+ CHAT · ACCC-BABA-ECBB-DCAA-C (2026-10-15). Lo que se eligió en el laboratorio (?lab), hecho
9255
+ forma de la sala: adjuntos en tarjeta, avatar que late al pensar, el agente en una píldora, la
9256
+ respuesta en burbuja, el plan como lista de tareas, la hora sola al pie, elecciones en lista con
9257
+ número, el permiso en una línea, el concedido como divisoria, comandos en pasos, cada /run en
9258
+ píldora (data-term="pill", app.js) y aire entre turnos. Cada regla se aparta cuando el
9259
+ laboratorio compara otra forma de su elemento (data-labNN en <html>). Sin backdrop-filter en el
9260
+ hilo, como dicen los planos: sobre un fondo de pantalla, cada pieza lleva su propio material.
9261
+ ========================================================================================== */
9262
+
9263
+ /* 02 · Adjuntos: una tarjeta por archivo, con su tipo, su nombre y su tamaño. */
9264
+ :root:not([data-lab02]) #messages#messages .bubble .files { gap: 8px; margin-top: 10px; }
9265
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile:not(.image) {
9266
+ display: inline-grid; grid-template-columns: 34px minmax(0, auto); align-items: center; column-gap: 10px;
9267
+ max-width: min(100%, 280px); padding: 7px 14px 7px 7px; border: 0; border-radius: 12px;
9268
+ background: var(--plane-solid); color: var(--text); text-align: left;
9269
+ box-shadow: 0 0 0 .5px rgb(var(--plane-ink) / .14), 0 1px 2px rgb(var(--plane-ink) / .1);
9270
+ transition: transform calc(160ms * var(--motion-scale)) ease, box-shadow calc(160ms * var(--motion-scale)) ease;
9271
+ }
9272
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile:not(.image):hover { transform: translateY(-1px); box-shadow: 0 0 0 .5px rgb(var(--plane-ink) / .18), 0 4px 10px -4px rgb(var(--plane-ink) / .28); }
9273
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 2px; }
9274
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .kind { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 9px; background: color-mix(in srgb, var(--phosphor) 12%, transparent); color: var(--phosphor); font: 600 9.5px var(--mono); letter-spacing: .06em; }
9275
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .file-text { display: grid; gap: 1px; min-width: 0; }
9276
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font: 500 13px/1.3 var(--read); letter-spacing: 0; }
9277
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile .meta { font: 400 11.5px/1.3 var(--read); font-variant-numeric: tabular-nums; color: var(--text-3); }
9278
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile.image { overflow: hidden; border-radius: 12px; box-shadow: 0 0 0 .5px rgb(var(--plane-ink) / .14); }
9279
+ :root:not([data-lab02]) #messages#messages .bubble .file-tile.image img { border-radius: 0; }
9280
+
9281
+ /* 03 · Pensando: sin globo. El avatar respira y deja un anillo en su color; al lado, lo que hace y
9282
+ cuánto lleva. Sobre un fondo de pantalla, la línea va en el material de las etiquetas. */
9283
+ :root:not([data-lab03]) #messages#messages .row.thinking .bubble { gap: 0; padding: 4px 6px 4px 2px; border-radius: 999px; background: transparent !important; box-shadow: none !important; }
9284
+ :root:not([data-lab03]) #messages#messages .row.thinking .bubble > i { display: none; }
9285
+ :root:not([data-lab03]) #messages#messages .row.thinking .status { margin-left: 0; font-size: 14px; font-style: normal; color: var(--text-2); }
9286
+ :root:not([data-lab03]) #messages#messages .row.thinking .status::after { display: none; }
9287
+ :root:not([data-lab03]) #messages#messages .row.thinking :is(.elapsed, .tokens) { margin-left: 10px; font-size: 11px; letter-spacing: 0; font-variant-numeric: tabular-nums; }
9288
+ :root:not([data-lab03]) #messages#messages .row.thinking .stop-turn { margin-left: 6px; }
9289
+ :root:not([data-lab03]) #messages#messages .row.thinking > .avatar { position: relative; animation: think-breathe calc(2.4s * var(--motion-scale) / .7) ease-in-out infinite; }
9290
+ :root:not([data-lab03]) #messages#messages .row.thinking > .avatar::after { content: ''; position: absolute; inset: 0; border-radius: 50%; pointer-events: none; animation: think-ring calc(2.4s * var(--motion-scale) / .7) ease-out infinite; }
9291
+ :root:not([data-lab03])[data-wallpaper]:not([data-wallpaper="default"]) #messages#messages .row.thinking .bubble { padding: 4px 8px 4px 14px; background: var(--plane-meta) !important; }
9292
+ @keyframes think-breathe { 0%, 100% { transform: scale(1); } 50% { transform: scale(.9); } }
9293
+ @keyframes think-ring {
9294
+ 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--agent, var(--phosphor)) 50%, transparent); }
9295
+ 70%, 100% { box-shadow: 0 0 0 9px color-mix(in srgb, var(--agent, var(--phosphor)) 0%, transparent); }
9296
+ }
9297
+
9298
+ /* 04 · Cabecera: el nombre del agente en su píldora, en letra de lectura; modelo y esfuerzo detrás,
9299
+ en píldoras neutras (AJUSTES EN LA SALA REAL, al final); el modo conserva su color. */
9300
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who { align-items: center; gap: 8px; padding: 3px 10px 3px 3px; }
9301
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child { padding: 2px 10px; border-radius: 999px; background: color-mix(in srgb, var(--agent) 15%, transparent); color: color-mix(in srgb, var(--agent) 82%, var(--text)); font: 600 12.5px/1.4 var(--read); letter-spacing: 0; text-transform: none; }
9302
+
9303
+ /* 05 · Cuerpo: la burbuja, con la esquina corta hacia el avatar, que va abajo. */
9304
+ :root:not([data-reply]) #messages#messages .row.assistant:not(.delegated) .bubble { border-radius: 20px 20px 20px 6px; padding: 13px 17px 10px; }
9305
+
9306
+ /* 07 · Plan: una lista de tareas; cada casilla en el color de quien la hará. */
9307
+ :root:not([data-lab07]) #messages#messages .plan-card { margin: 10px 0 8px; padding: 10px 14px 8px; border: 0; border-radius: 14px; background: color-mix(in srgb, var(--text) 4%, transparent); }
9308
+ :root:not([data-lab07]) #messages#messages .plan-card .plan-label { display: block; margin-bottom: 4px; }
9309
+ :root:not([data-lab07]) #messages#messages .plan-card ol { margin: 0; padding: 0; list-style: none; }
9310
+ :root:not([data-lab07]) #messages#messages .plan-card li { position: relative; margin: 0; padding: 6px 0 6px 28px; font-size: 14px; line-height: 1.45; }
9311
+ :root:not([data-lab07]) #messages#messages .plan-card li::before { content: ''; position: absolute; left: 0; top: calc(6px + (1.45em - 17px) / 2); width: 17px; height: 17px; box-sizing: border-box; border-radius: 5px; background: color-mix(in srgb, var(--agent) 8%, var(--plane-solid)); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--agent) 55%, var(--line-2)); }
9312
+ :root:not([data-lab07]) #messages#messages .plan-card li + li { border-top: 1px solid color-mix(in srgb, var(--text) 6%, transparent); }
9313
+
9314
+ /* 09 · Pie: la hora sola; lo que costó aparece al pasar o al enfocar la respuesta. */
9315
+ :root:not([data-lab09]) #messages#messages .row.assistant .bubble-foot .stamp > span:not(:first-child) { opacity: 0; transition: opacity calc(180ms * var(--motion-scale)) ease; }
9316
+ :root:not([data-lab09]) #messages#messages .row.assistant:is(:hover, :focus-within) .bubble-foot .stamp > span { opacity: 1; }
9317
+ :root:not([data-lab09]) #messages#messages .row.assistant .bubble-foot .stamp > span:first-child { font-variant-numeric: tabular-nums; }
9318
+ @media (hover: none) { :root:not([data-lab09]) #messages#messages .row.assistant .bubble-foot .stamp > span { opacity: 1; } }
9319
+
9320
+ /* 10 · Elección: una lista con número, como las de los chats; cada fila es una frase que se presiona. */
9321
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-list { gap: 0; overflow: hidden; border-radius: 14px; box-shadow: inset 0 0 0 1px var(--line-2); }
9322
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option { grid-template-columns: 24px minmax(0, 1fr) auto; align-items: center; gap: 12px; padding: 11px 14px; border: 0; border-radius: 0; background: transparent; font-size: 14.5px; line-height: 1.45; }
9323
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option + .choice-option { box-shadow: inset 0 1px 0 var(--line); }
9324
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option:hover { background: color-mix(in srgb, var(--agent, var(--text)) 6%, transparent); }
9325
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option:focus-visible { outline-offset: -2px; }
9326
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-key { display: grid; place-items: center; width: 24px; height: 24px; border: 0; border-radius: 50%; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text-2); font: 600 11.5px var(--mono); }
9327
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.recommended { background: color-mix(in srgb, var(--agent, var(--phosphor)) 5%, transparent); }
9328
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.recommended .choice-key,
9329
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.picked .choice-key { background: var(--agent, var(--phosphor)); color: var(--agent-on, var(--bg)); }
9330
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-option.picked { background: color-mix(in srgb, var(--agent, var(--phosphor)) 10%, transparent); }
9331
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-tag { padding: 3px 9px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--agent, var(--phosphor)) 13%, transparent); color: color-mix(in srgb, var(--agent, var(--phosphor)) 85%, var(--text)); font: 500 11.5px var(--read); letter-spacing: 0; text-transform: lowercase; }
9332
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-tag::first-letter { text-transform: uppercase; }
9333
+ :root:not([data-lab10]) #messages#messages .choice:not(.run-request) .choice-foot { margin-top: 12px; font: 400 12px/1.5 var(--read); letter-spacing: 0; text-transform: none; color: var(--text-3); }
9334
+
9335
+ /* 11 · Permiso: en una línea, como Claude Code: qué pide y por cuánto, los botones a la derecha, y
9336
+ debajo, en letra secundaria, cómo se confirma. */
9337
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px; margin: 10px 0 2px; padding: 10px 12px 10px 14px; border: 0; border-radius: 14px; background: color-mix(in srgb, var(--warn, #e2a022) 7%, var(--plane-solid)) !important; box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--warn, #e2a022) 38%, transparent), 0 1px 2px rgb(var(--plane-ink) / .08) !important; -webkit-backdrop-filter: none; backdrop-filter: none; }
9338
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-what { flex: 1 1 260px; font: 400 14px/1.45 var(--read); }
9339
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-what .who { padding: 0; border-radius: 0; background: none !important; font-weight: 600; }
9340
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-time { font: 400 13px var(--read); letter-spacing: 0; color: var(--text-2); }
9341
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-why { order: 9; flex: 1 1 100%; font: 400 12.5px/1.45 var(--read); color: var(--text-3); }
9342
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-windows { flex-wrap: nowrap; max-width: 100%; overflow-x: auto; scrollbar-width: none; }
9343
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-window { flex: none; font: 500 12px var(--read); letter-spacing: 0; padding: 4px 9px; white-space: nowrap; }
9344
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-actions { margin: 0; gap: 6px; }
9345
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) :is(.mode-go, .mode-alt) { height: 30px; padding: 0 13px; border-radius: 9px; font: 500 12.5px var(--read); letter-spacing: 0; text-transform: lowercase; white-space: nowrap; transition: background calc(150ms * var(--motion-scale)), color calc(150ms * var(--motion-scale)); }
9346
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) :is(.mode-go, .mode-alt)::first-letter { text-transform: uppercase; }
9347
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-go { font-weight: 600; box-shadow: none; }
9348
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-alt { border: 0; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); }
9349
+ :root:not([data-lab11]) #messages#messages .mode-ask:not(.settled) .mode-alt:hover { background: color-mix(in srgb, var(--text) 12%, transparent); }
9350
+
9351
+ /* 12 · Concedido: una divisoria a lo ancho de la respuesta, con el permiso al centro en su color. */
9352
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled { display: flex !important; align-items: center; gap: 12px; justify-self: stretch; align-self: stretch; width: auto !important; margin: 12px 0 2px !important; padding: 0; background: none !important; box-shadow: none !important; }
9353
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::before,
9354
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::after { content: ''; flex: 1; height: 1px; background: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 40%, var(--line-2)); animation: settle-line calc(420ms * var(--motion-scale) / .7) cubic-bezier(.2, .7, .2, 1) both; }
9355
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::before { transform-origin: right; }
9356
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled::after { transform-origin: left; }
9357
+ :root:not([data-lab12]) #messages#messages .mode-ask.settled .mode-what { flex: none; padding: 4px 12px; border-radius: 999px; background: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 14%, var(--plane-solid)); color: color-mix(in srgb, var(--mode-c, var(--ok, var(--phosphor))) 80%, var(--text)); }
9358
+ @keyframes settle-line { from { transform: scaleX(0); opacity: 0; } }
9359
+
9360
+ /* 13 · Petición de comandos: pasos numerados; el paso que corrió dice ✓ y el que falló ✕. */
9361
+ :root:not([data-lab13]) #messages#messages .choice.run-request .choice-list { counter-reset: run-step; }
9362
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line { counter-increment: run-step; }
9363
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line .choice-key { font-size: 0 !important; border-radius: 50%; }
9364
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line .choice-key::after { content: counter(run-step); font: 600 11.5px var(--mono); color: var(--text-2); }
9365
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.ran .choice-key { background: color-mix(in srgb, var(--ok, var(--phosphor)) 16%, transparent) !important; }
9366
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.ran .choice-key::after { content: '✓'; color: var(--ok, var(--phosphor)); font-family: var(--read); }
9367
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.failed .choice-key { background: color-mix(in srgb, var(--crit) 15%, transparent) !important; }
9368
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.failed .choice-key::after { content: '✕'; color: var(--crit); font-family: var(--read); }
9369
+ :root:not([data-lab13]) #messages#messages .choice.run-request .run-line.refused .choice-key::after { color: var(--text-3); }
9370
+ :root:not([data-lab13]) #messages#messages .choice.run-request :is(.run-all, .run-back) { text-transform: lowercase; }
9371
+ :root:not([data-lab13]) #messages#messages .choice.run-request :is(.run-all, .run-back)::first-letter { text-transform: uppercase; }
9372
+
9373
+ /* 17 · Aire entre turnos, como en los chats de hoy; lo que es del mismo turno queda junto. */
9374
+ :root:not([data-lab17]) #messages#messages .thread-inner > * + * { margin-top: 28px; }
9375
+ :root:not([data-lab17]) #messages#messages .thread-inner > :is(.command-card, .sys-dots) + :is(.command-card, .sys-dots),
9376
+ :root:not([data-lab17]) #messages#messages .thread-inner > .row.assistant + :is(.choice, .command-card) { margin-top: 0; }
9377
+
9378
+ @media (prefers-reduced-motion: reduce) {
9379
+ #messages#messages .row.thinking > .avatar, #messages#messages .row.thinking > .avatar::after, #messages#messages .mode-ask.settled::before, #messages#messages .mode-ask.settled::after { animation: none !important; }
9380
+ #messages#messages .row.thinking > .avatar::after { box-shadow: 0 0 0 3px color-mix(in srgb, var(--agent, var(--phosphor)) 30%, transparent); }
9381
+ #messages#messages .bubble .file-tile:hover { transform: none; }
9382
+ }
9383
+
9384
+ /* ==========================================================================================
9385
+ AJUSTES EN LA SALA REAL (2026-10-15, tras ACCC-BABA-ECBB-DCAA-C)
9386
+ ========================================================================================== */
9387
+
9388
+ /* El conjunto de un agente en un solo carril: la cabecera, la burbuja, lo que pide (elección,
9389
+ comandos) y sus /run empiezan donde empieza la burbuja, a la derecha del avatar. */
9390
+ :root:not([data-reply]) #messages#messages .row.assistant { column-gap: 14px; }
9391
+ :root:not([data-reply]) #messages#messages .row.assistant .col > .who { margin-left: 0; }
9392
+ :root:not([data-reply]) #messages#messages .thread-inner > :is(.choice, .command-card) { --agent-lane: 42px; margin-left: var(--agent-lane) !important; margin-right: 0; max-width: min(760px, calc(100% - var(--agent-lane))); }
9393
+ :root:not([data-reply])[data-term="pill"] #messages#messages .thread-inner > .command-card.terminal.open { width: auto; }
9394
+
9395
+ /* La cabecera: un plano con píldoras dentro, que se leen como una pieza. El plano deja 3 px
9396
+ alrededor de todo (radio 14 = 11 de la píldora + 3), las píldoras van a 4 px entre sí, todas de
9397
+ 22 px, letra de lectura de 12 px y el mismo material: sólido, con un filo de medio píxel; el
9398
+ color solo tiñe. El texto suelto (la pregunta citada, lo cobrado) lleva el mismo aire que una
9399
+ píldora. En angosto se acomoda en renglones en vez de desbordarse. */
9400
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who { flex-wrap: wrap; align-items: center; gap: 4px; row-gap: 4px; max-width: 100%; padding: 3px; box-sizing: border-box; border-radius: 14px; box-shadow: inset 0 0 0 .5px rgb(var(--plane-ink) / .1) !important; }
9401
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child,
9402
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.badge, .to-agent) {
9403
+ --chip: var(--text); --chip-mix: 5%;
9404
+ display: inline-block; flex: none; height: 22px; max-width: 100%; padding: 0 10px; box-sizing: border-box; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
9405
+ border: 0; border-radius: 11px; background: color-mix(in srgb, var(--chip) var(--chip-mix), var(--plane-solid)) !important;
9406
+ box-shadow: inset 0 0 0 .5px color-mix(in srgb, var(--chip) 18%, transparent);
9407
+ color: color-mix(in srgb, var(--chip) 80%, var(--text)); font: 500 12px/22px var(--read); letter-spacing: 0; text-transform: none;
9408
+ }
9409
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.badge, .to-agent) { --chip: var(--text-2); }
9410
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child { --chip: var(--agent); --chip-mix: 15%; font-weight: 600; }
9411
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .to-agent { --chip: var(--agent); --chip-mix: 13%; }
9412
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.ash { --chip: var(--phosphor); --chip-mix: 13%; text-transform: lowercase; }
9413
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge:not(.model, .mode)::first-letter,
9414
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.model.effort::first-letter { text-transform: uppercase; }
9415
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.mode { font-family: var(--mono); font-size: 10.5px; font-weight: 600; letter-spacing: .06em; }
9416
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.reply, .spent) { padding: 0 7px; line-height: 22px; letter-spacing: 0; text-transform: none; }
9417
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .reply { flex: 1 1 140px; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11.5px; }
9418
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .spent { flex: none; padding-left: 4px; font: 400 11px/22px var(--mono); font-variant-numeric: tabular-nums; color: var(--text-3); }
9419
+
9420
+ /* Modo · modelo · esfuerzo en claro: el mismo vidrio blanco que ya tiene en oscuro. */
9421
+ :root[data-scheme="light"] .composer > .pick-options .pick-label {
9422
+ background: rgb(255 255 255 / .6);
9423
+ box-shadow: 0 0 0 .5px rgb(20 30 20 / .1), inset 0 1px 0 #ffffff, 0 6px 18px rgb(20 30 20 / .1);
9424
+ -webkit-backdrop-filter: blur(20px) saturate(1.6); backdrop-filter: blur(20px) saturate(1.6);
9425
+ }
9426
+
9427
+ /* Cambiar de proyecto: al pasar, el cuadro de atrás se despega un poco; al presionar, o con la
9428
+ ventana abierta, se ilumina el de enfrente. */
9429
+ .switch-button svg > path { transition: transform calc(220ms * var(--motion-scale) / .7) cubic-bezier(.2, .8, .2, 1); }
9430
+ .switch-button:is(:hover, :focus-visible) svg > path { transform: translate(1.3px, -1.3px); }
9431
+ .switch-button svg > .ic-f { transition: fill calc(160ms * var(--motion-scale)) ease, filter calc(160ms * var(--motion-scale)) ease; }
9432
+ .switch-button:active svg > .ic-f, body:has(dialog.room-switch[open]) .switch-button svg > .ic-f { fill: currentColor; fill-opacity: .9; filter: drop-shadow(0 0 3px color-mix(in srgb, currentColor 45%, transparent)); }
9433
+ @media (prefers-reduced-motion: reduce) { .switch-button svg > path { transition: none; } .switch-button:is(:hover, :focus-visible) svg > path { transform: none; } }
9434
+
9435
+ /* El foco de un aviso de primera vez (spotlight, tour.js): lo que el aviso nombra se ve claro, con
9436
+ un aro suave del acento, y el resto de la página baja un poco. Sin pico en la tarjeta. */
9437
+ .hint-spot {
9438
+ position: fixed; z-index: 2147482999; pointer-events: none; box-sizing: border-box;
9439
+ box-shadow: 0 0 0 200vmax rgb(14 20 16 / .16), 0 0 0 2px color-mix(in srgb, var(--accent, var(--phosphor)) 55%, transparent), 0 0 24px 2px color-mix(in srgb, var(--accent, var(--phosphor)) 32%, transparent);
9440
+ background: rgb(255 255 255 / .06);
9441
+ animation: hint-spot-in calc(360ms * var(--motion-scale, .7) / .7) cubic-bezier(.2, .8, .2, 1) both;
9442
+ transition: left .2s ease, top .2s ease, width .2s ease, height .2s ease;
9443
+ }
9444
+ .hint-spot[hidden] { display: none; }
9445
+ :root:not([data-scheme="light"]) .hint-spot { box-shadow: 0 0 0 200vmax rgb(0 0 0 / .3), 0 0 0 2px color-mix(in srgb, var(--accent, var(--phosphor)) 60%, transparent), 0 0 26px 3px color-mix(in srgb, var(--accent, var(--phosphor)) 30%, transparent); }
9446
+ @keyframes hint-spot-in { from { opacity: 0; transform: scale(1.06); } }
9447
+ @media (prefers-reduced-motion: reduce) { .hint-spot { animation: none; transition: none; } }
9448
+
9449
+ /* La fila de avisos dice con una flecha que se despliega: hacia abajo junto a «+N» cerrada, hacia
9450
+ arriba en «Plegar» abierta. La flecha es la misma, girada, y va centrada con el texto. */
9451
+ #messages .sys-dots { --chev: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3E%3Cpath d='M4 10 8 6l4 4' fill='none' stroke='black' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); }
9452
+ #messages .sys-dots > .sys-more::after {
9453
+ content: ''; display: inline-block; flex: none; width: 10px; height: 10px; background: currentColor;
9454
+ -webkit-mask: var(--chev) center / contain no-repeat; mask: var(--chev) center / contain no-repeat;
9455
+ transition: transform calc(180ms * var(--motion-scale)) ease;
9456
+ }
9457
+ #messages#messages .sys-dots:not(.open) > .sys-more:not([hidden]) { display: inline-flex; align-items: center; gap: 4px; line-height: 1; }
9458
+ #messages#messages .sys-dots:not(.open) > .sys-more::after { transform: rotate(180deg); opacity: .8; }
9459
+ #messages#messages .sys-dots:not(.open):hover > .sys-more::after { transform: rotate(180deg) translateY(-1px); opacity: 1; }
9460
+ /* «Plegar»: una tecla de 26 px, la palabra y su flecha en la misma línea media. */
9461
+ #messages#messages .sys-dots.open > .sys-more {
9462
+ display: inline-block; height: 26px; margin-top: 4px; padding: 0 11px 0 13px; box-sizing: border-box; border-radius: 999px;
9463
+ font: 500 12.5px/26px var(--read); letter-spacing: 0; text-transform: lowercase; white-space: nowrap; color: var(--text-2);
9464
+ transition: background calc(150ms * var(--motion-scale)) ease, color calc(150ms * var(--motion-scale)) ease;
9465
+ }
9466
+ #messages#messages .sys-dots.open > .sys-more::first-letter { text-transform: uppercase; }
9467
+ #messages#messages .sys-dots.open > .sys-more::after { width: 11px; height: 11px; margin-left: 6px; vertical-align: middle; position: relative; top: -1px; }
9468
+ #messages#messages .sys-dots.open > .sys-more:hover { background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); }
9469
+ #messages#messages .sys-dots.open > .sys-more:hover::after { transform: translateY(-1px); }
9470
+ @media (prefers-reduced-motion: reduce) { #messages .sys-dots > .sys-more::after { transition: none; } }
9471
+
9472
+ /* Los avisos abiertos como una lista que se lee (2026-10-15): cada uno con su punto, la etiqueta
9473
+ pequeña arriba y lo que dice debajo en letra de lectura; una línea fina entre uno y otro; la
9474
+ memoria, las barras de límite y los comandos alineados a la izquierda como lo demás; lo repetido
9475
+ seguido, una sola vez con «×N» (groupRepeats, app.js). */
9476
+ #messages#messages .sys-dots.open { gap: 0; width: min(92%, 600px); padding: 6px 6px 8px; border-radius: 18px; }
9477
+ #messages#messages .sys-dots.open > .system.folded {
9478
+ display: block; padding: 11px 14px 12px 34px !important; border-radius: 12px !important;
9479
+ font: 400 13.5px/1.5 var(--read) !important; letter-spacing: 0 !important; text-transform: none !important; text-align: left !important;
9480
+ color: var(--text-2) !important;
9481
+ }
9482
+ #messages#messages .sys-dots.open > .system.folded + .system.folded:not(.repeat)::after { content: ''; position: absolute; left: 34px; right: 14px; top: 0; height: 1px; background: color-mix(in srgb, var(--text) 7%, transparent); }
9483
+ #messages#messages .sys-dots.open > .system.folded:hover::after, #messages#messages .sys-dots.open > .system.folded:hover + .system.folded::after { opacity: 0; }
9484
+ #messages#messages .sys-dots.open > .system.folded::before { left: 14px; top: 16px; width: 8px; height: 8px; box-shadow: 0 0 0 3px color-mix(in srgb, var(--dot) 18%, transparent); }
9485
+ #messages#messages .sys-dots.open > .system.folded.repeat { display: none !important; }
9486
+ /* La etiqueta: su propia línea, pequeña, en el tono del aviso. */
9487
+ #messages#messages .sys-dots.open > .system.folded > b:first-child {
9488
+ display: block; width: fit-content; margin: 0 0 3px; font: 600 10px/1.4 var(--mono); letter-spacing: .14em; text-transform: uppercase;
9489
+ color: color-mix(in srgb, var(--dot) 70%, var(--text-2));
9490
+ }
9491
+ #messages#messages .sys-dots.open > .system.folded:is([data-tone="info"], :not([data-tone])) > b:first-child { color: var(--text-3); }
9492
+ #messages#messages .sys-dots.open > .system.folded[data-times] > b:first-child::after { content: var(--times); margin-left: 8px; padding: 1px 6px; border-radius: 999px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text-2); font-weight: 600; letter-spacing: .04em; }
9493
+ #messages#messages .sys-dots.open > .system.folded > b:not(:first-child) { font-weight: 600; color: var(--text); }
9494
+ /* La barra de un límite: bajo el texto, a la izquierda, fina. */
9495
+ #messages#messages .sys-dots.open > .system.folded .gauge { display: block; width: min(100%, 280px); height: 4px; margin: 9px 0 1px; border-radius: 4px; background: color-mix(in srgb, var(--text) 10%, transparent); overflow: hidden; }
9496
+ #messages#messages .sys-dots.open > .system.folded .gauge .now { display: block; height: 100%; border-radius: inherit; background: var(--dot); }
9497
+ /* El comando de un módulo: un trozo de código, no una caja con borde. */
9498
+ #messages#messages .sys-dots.open > .system.folded .cmd { display: block; width: fit-content; max-width: 100%; box-sizing: border-box; margin: 7px 0 0; padding: 3px 9px; border: 0 !important; box-shadow: none !important; outline: 0; border-radius: 7px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); font: 400 12px/1.5 var(--mono); letter-spacing: 0; text-transform: none; overflow-wrap: anywhere; }
9499
+ /* La memoria: como los demás, a la izquierda; quién, en su píldora; la cuenta en voz baja. */
9500
+ #messages#messages .sys-dots.open > .system.folded.claim { display: block; width: auto; }
9501
+ #messages#messages .sys-dots.open > .system.folded.claim > .claim-head { font-size: 10px; }
9502
+ #messages#messages .sys-dots.open > .system.folded.claim > .claim-head .who { display: inline-block; margin-left: 4px; padding: 0 7px; border-radius: 999px; background: color-mix(in srgb, var(--agent, var(--text)) 14%, transparent); color: color-mix(in srgb, var(--agent, var(--text)) 80%, var(--text)); letter-spacing: .06em; }
9503
+ #messages#messages .sys-dots.open > .system.folded.claim .claim-body { display: block; font-size: 13.5px; color: var(--text-2); }
9504
+ #messages#messages .sys-dots.open > .system.folded.claim .claim-note { display: block; margin-top: 2px; font: 400 12px/1.5 var(--read); letter-spacing: 0; text-transform: none; color: var(--text-3); }
9505
+ #messages#messages .sys-dots.open > .system.folded.claim .claim-acts { justify-content: flex-start; }
9506
+ #messages#messages .sys-dots.open > .sys-more { justify-self: center; margin-top: 8px; }
9507
+ #messages#messages .sys-dots.open > .system.folded.claim > * { margin-left: 0 !important; margin-right: 0 !important; max-width: none !important; text-align: left !important; justify-self: start !important; }
9508
+ /* La cabecera en una sola línea (2026-10-15): lo primero que cede es la pregunta citada (se corta
9509
+ con «…»), luego modelo, esfuerzo y las demás insignias; el nombre y lo cobrado no se cortan. */
9510
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who { flex-wrap: nowrap; border-radius: 14px; }
9511
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who > span:first-child,
9512
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .spent { flex: none; }
9513
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who :is(.badge, .to-agent) { flex: none; }
9514
+ /* Solo lo que es una frase (de dónde viene una orden, «orden 1 de 1 · …») puede cortarse. */
9515
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge:not(.model, .mode, .ash) { flex: 0 1 auto; min-width: 60px; }
9516
+ /* Con el chat angosto se callan primero los que se pueden leer en otro lado: el esfuerzo (lo dice
9517
+ el sello de tu mensaje) y, más angosto, el ahorro de tokens (lo dice la caja de escribir). */
9518
+ #messages .thread-inner { container: thread / inline-size; }
9519
+ @container thread (max-width: 540px) { :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.effort { display: none; } }
9520
+ @container thread (max-width: 430px) { :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .badge.ash { display: none; } }
9521
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .reply { flex: 1 1 0; min-width: 0; max-width: max-content; }
9522
+ :root:not([data-lab04]) #messages#messages .row.assistant .col > .who .reply:empty { display: none; }
9523
+ /* El punto de un aviso solo (2026-10-15): más chico y casi transparente, para no ensuciar el
9524
+ lienzo; vuelve a verse entero al pasar o al enfocarlo. La fila con «+N» se atenúa menos. */
9525
+ #messages#messages .sys-dots.single { padding: 3px; margin-block: 2px; border-color: transparent; background: color-mix(in srgb, var(--bg) 30%, transparent); -webkit-backdrop-filter: none; backdrop-filter: none; opacity: .5; transition: opacity calc(180ms * var(--motion-scale)) ease, background calc(180ms * var(--motion-scale)) ease; }
9526
+ #messages#messages .sys-dots.single > .system.folded { width: 6px !important; height: 6px !important; box-shadow: none !important; }
9527
+ #messages#messages .sys-dots:not(.open):not(.single) { opacity: .8; transition: opacity calc(180ms * var(--motion-scale)) ease; }
9528
+ #messages#messages .sys-dots:not(.open):is(:hover, :focus-visible) { opacity: 1; background: color-mix(in srgb, var(--bg) 78%, transparent); }
9529
+ /* El contexto compartido no lleva etiqueta: empieza con palabras y sus @agentes van en la frase. */
9530
+ #messages#messages .sys-dots.open > .system.folded.handoff > b:first-child { display: inline; margin: 0; font: 600 13.5px/1.5 var(--read); letter-spacing: 0; text-transform: none; color: var(--text); }
9531
+
9532
+ /* Lo que queda detrás de la caja de escribir (2026-10-15): la conversación se desvanece en los últimos
9533
+ ~10 px antes del borde de la caja de escribir (--type-gap; más largo se veía como un resplandor) (--dock-h la mide app.js, measureDock) en vez de asomarse bajo modo · modelo y detrás
9534
+ de la versión. El final de la conversación sigue subiendo por encima: el hilo ya deja ese aire. */
9535
+ :root:not(.via-phone) #messages.thread {
9536
+ -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - var(--type-gap, var(--dock-h, 0px)) - 10px), transparent calc(100% - var(--type-gap, var(--dock-h, 0px)) + 2px));
9537
+ mask-image: linear-gradient(to bottom, #000 calc(100% - var(--type-gap, var(--dock-h, 0px)) - 10px), transparent calc(100% - var(--type-gap, var(--dock-h, 0px)) + 2px));
9538
+ }
9539
+ /* La barra del proyecto junto a dos paneles (2026-10-15): angosta en una pantalla ancha. Por
9540
+ debajo de 760 px «Primeros pasos» queda en su anillo y su cuenta (la frase sigue en su nombre y
9541
+ su título) y las teclas se juntan, para que todo quepa sin pisar Inicio · Proyectos · Ajustes y
9542
+ el nombre del proyecto no sea lo primero en irse. */
9543
+ @container roombar (max-width: 760px) {
9544
+ .shell > .bar:not(.bar-home) { gap: 10px; }
9545
+ #steps-pill .steps-label { display: none; }
9546
+ #steps-pill { gap: 6px; padding-inline: 9px 11px; }
9547
+ /* El nombre del proyecto se queda; el título de la conversación es el que se corta con «…». */
9548
+ .shell > .bar:not(.bar-home) .project:not(.chat-here) { font-size: 11px; }
9549
+ .shell > .bar:not(.bar-home) .project:not(.chat-here)::after { content: none; }
9550
+ }
9551
+ /* Cerrada, la salida de un /run no da su ancho a la píldora (2026-10-15): sus líneas largas (un
9552
+ `cloc`, una tabla) la estiraban de lado a lado aunque no se vieran. Ocupa el ancho de la píldora
9553
+ sin pedirlo; abierta, vuelve a medir lo suyo. */
9554
+ :root[data-term="pill"] #messages#messages .command-card.terminal:not(.open) .term-out { width: 0; min-width: 100%; }
9555
+ /* La esquina de quién hizo MADRE (public/attribution.js): un enlace a su autor, con aire bajo
9556
+ modo · modelo · esfuerzo para no pegarse a su vidrio cuando el centro es angosto. */
9557
+ .shell > .colophon { margin-top: 8px; }
9558
+ .colophon-link { color: inherit; text-decoration: none; border-radius: inherit; }
9559
+ .colophon-link:hover { text-decoration: underline; text-underline-offset: 3px; text-decoration-thickness: 1px; }
9560
+ .colophon-link:focus-visible { outline: 2px solid var(--accent, var(--phosphor)); outline-offset: 3px; }
9561
+ /* Lo que está fuera de la pantalla no se dibuja (2026-10-15): cada pieza de la conversación lleva
9562
+ content-visibility:auto, así que el navegador no la mide ni la pinta hasta que se acerca, y
9563
+ recuerda su alto una vez vista (contain-intrinsic-size: auto). Buscar con ⌘F, seleccionar y
9564
+ saltar a una cita siguen funcionando. El margen de recorte deja ver las sombras y los anillos
9565
+ que salen un poco de su caja. */
9566
+ #messages .thread-inner > :is(.row, .choice, .command-card, .system, .sys-dots) {
9567
+ content-visibility: auto;
9568
+ contain-intrinsic-size: auto 140px;
9569
+ overflow-clip-margin: 28px;
9570
+ }
9571
+ /* ---------- Correcciones de UX de 1.0.2 (2026-10-16) ----------
9572
+ 1 · Un /run con punto de restauración se viste como los demás avisos del lienzo: esquinas de
9573
+ 14 px y su DESHACER debajo, a la izquierda. Era una cápsula de 999 px que se inflaba en círculo
9574
+ al meter el botón en un segundo renglón. */
9575
+ :root[data-term="pill"] #messages#messages .command-card.terminal.has-undo:not(.open) { border-radius: 14px; }
9576
+ #messages#messages .command-card.terminal.has-undo > :is(.undo, .outcome) { display: block; margin: 0 12px 10px 10px; }
9577
+ #messages#messages .command-card.terminal.has-undo.open > :is(.undo, .outcome) { margin-top: 10px; }
9578
+ /* 3 · La píldora cerrada respeta el carril del agente: su máximo era el 100 % de la columna y,
9579
+ corrida 42 px a la derecha, la columna (overflow-x: hidden) le cortaba el final. */
9580
+ :root[data-term="pill"] #messages#messages .command-card.terminal:not(.open) { max-width: min(760px, calc(100% - var(--agent-lane, 0px))); }
9581
+ /* 4 · El aviso del botón de conversaciones va montado en su esquina, por fuera del squircle, con
9582
+ un anillo del color del fondo que lo separa del vidrio. */
9583
+ .chats-button.working::after, .chats-button.unread::after { top: -3px; right: -3px; width: 10px; height: 10px; box-shadow: 0 0 0 2px var(--bg), 0 0 8px color-mix(in srgb, var(--phosphor) 55%, transparent); }
9584
+ /* 8 · Una línea larga se lee entera antes de presionarla, sin volver la tarjeta una pared: pasada
9585
+ cierta altura, la línea se recorre dentro de su botón. */
9586
+ #messages .run-request .run-line .choice-text { max-height: 15.5em; overflow-y: auto; overscroll-behavior: contain; }
9587
+ /* 2 · Pensando: el anillo que respira alrededor del avatar sale unos píxeles de su caja y la
9588
+ columna lo cortaba en seco por la izquierda (overflow-x: hidden pegado al avatar) y la fila, por
9589
+ su contención de pintado (content-visibility). La columna recorta con margen y la fila viva no se
9590
+ contiene: siempre está en pantalla. */
9591
+ /* Chrome keeps overflow-clip-margin only when both axes clip; with overflow-x alone the ring was
9592
+ still cut flush with the avatar (2026-10-17). Clipping the height too costs nothing: the column
9593
+ pads 36px above and the dock's height below, and nothing in it hangs past that. */
9594
+ #messages .thread-inner { overflow: clip; overflow-clip-margin: 24px; }
9595
+ #messages .thread-inner > .row.thinking { content-visibility: visible; }
9596
+ /* 9 · Desplazarse es del humano. El hilo ya no anima cada asignación de su posición: con el scroll
9597
+ suave, el «volver al final» instantáneo y el animado peleaban en el mismo cuadro y la vista
9598
+ temblaba. Los desplazamientos que sí deben deslizarse lo piden ellos mismos. */
9599
+ #messages.thread { scroll-behavior: auto; }
9600
+ /* Nada dentro del hilo muestrea lo que hay detrás (la regla de arriba sobre backdrop-filter): la
9601
+ fila de avisos plegados se había quedado fuera y, al desplazarse rápido, dejaba su vidrio atrás
9602
+ como una ventana fantasma. Lleva una tinta plana un poco más espesa en su lugar. */
9603
+ #messages .sys-dots { -webkit-backdrop-filter: none; backdrop-filter: none; background: color-mix(in srgb, var(--bg) 80%, transparent); }
9604
+ #messages .sys-dots:hover, #messages .sys-dots:focus-visible { background: color-mix(in srgb, var(--bg) 90%, transparent); }
9605
+ /* 10 · Abajo terminó algo: un botón redondo y ligero sobre la caja, con un punto del color de quien
9606
+ contestó. Lleva al final y se va solo al llegar. */
9607
+ .to-end {
9608
+ position: fixed; z-index: 39; left: var(--composer-center, 50%); bottom: calc(100vh - var(--composer-top, 70vh) + 14px); translate: -50% 0;
9609
+ display: grid; place-items: center; width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; cursor: pointer;
9610
+ color: var(--text); background: color-mix(in srgb, var(--surface, var(--panel)) 86%, transparent);
9611
+ -webkit-backdrop-filter: blur(16px) saturate(1.5); backdrop-filter: blur(16px) saturate(1.5);
9612
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 16%, transparent), 0 2px 4px rgba(0, 0, 0, .18), 0 10px 24px -8px rgba(0, 0, 0, .42);
9613
+ transition: bottom calc(220ms * var(--motion-scale)) var(--ease-out, ease), color calc(160ms * var(--motion-scale)) ease;
9614
+ animation: to-end-in calc(260ms * var(--motion-scale)) var(--ease-out, ease) both;
9615
+ }
9616
+ .to-end[hidden] { display: none; }
9617
+ .to-end svg { width: var(--ico-md); height: var(--ico-md); }
9618
+ .to-end:hover { color: var(--phosphor); }
9619
+ .to-end:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 60%, transparent); outline-offset: 2px; }
9620
+ .to-end .to-end-dot { position: absolute; top: 0; right: 0; width: 9px; height: 9px; border-radius: 50%; background: var(--agent, var(--phosphor)); box-shadow: 0 0 0 2px var(--bg); }
9621
+ .to-end.leaving { animation: to-end-out calc(200ms * var(--motion-scale)) ease both; }
9622
+ :root[data-scheme="light"] .to-end { background: color-mix(in srgb, #ffffff 88%, transparent); box-shadow: 0 0 0 .5px rgba(20, 30, 20, .12), 0 2px 4px rgba(20, 30, 20, .08), 0 10px 24px -8px rgba(20, 30, 20, .22); }
9623
+ :root.toasting .to-end { bottom: calc(100vh - var(--composer-top, 70vh) + 32px + var(--toast-h, 38px)); }
9624
+ @keyframes to-end-in { from { opacity: 0; transform: translateY(8px) scale(.85); } }
9625
+ @keyframes to-end-out { to { opacity: 0; transform: translateY(6px) scale(.9); } }
9626
+ /* 7 · Un aviso del sistema nace como el punto de su color y se abre en su píldora; al irse vuelve
9627
+ a cerrarse en el punto. La forma no cambia, solo cómo llega y cómo se va. Lleva una sombra más,
9628
+ amplia y muy suave, que lo despega del lienzo; y mientras está, la conversación que estaba en su
9629
+ final sube lo que mide para que el aviso no tape la última línea. */
9630
+ .toast { --toast-tone: var(--text-3); }
9631
+ .toast[data-tone="done"] { --toast-tone: #34c759; }
9632
+ .toast[data-tone="look"] { --toast-tone: #e0a23c; }
9633
+ .toast[data-tone="wrong"] { --toast-tone: var(--danger); }
9634
+ .toast:not([hidden]) { animation: toast-bloom calc(480ms * var(--motion-scale)) cubic-bezier(.3, .7, .2, 1) both; }
9635
+ .toast:not([hidden])::before { content: ''; position: absolute; inset: 0; border-radius: inherit; background: var(--toast-tone); pointer-events: none; animation: toast-bloom-tint calc(480ms * var(--motion-scale)) ease-out both; }
9636
+ .toast:not([hidden]) > * { animation: toast-words calc(240ms * var(--motion-scale)) ease calc(230ms * var(--motion-scale)) both; }
9637
+ .toast.leaving:not([hidden]) { animation: toast-fold calc(300ms * var(--motion-scale)) cubic-bezier(.5, 0, .6, 1) both; }
9638
+ .toast.leaving:not([hidden])::before { animation: toast-fold-tint calc(300ms * var(--motion-scale)) ease-in both; }
9639
+ .toast.leaving:not([hidden]) > * { animation: toast-words-out calc(120ms * var(--motion-scale)) ease both; }
9640
+ @keyframes toast-bloom {
9641
+ from { clip-path: inset(calc(50% - 5px) calc(50% - 5px) round 999px); transform: translateX(-50%) scale(.92); }
9642
+ 32% { clip-path: inset(0 calc(50% - var(--toast-h, 38px) / 2) round 999px); }
9643
+ 78%, to { clip-path: inset(0 round 20px); transform: translateX(-50%); }
9644
+ }
9645
+ @keyframes toast-bloom-tint { from, 30% { opacity: 1; } 70%, to { opacity: 0; } }
9646
+ @keyframes toast-words { from { opacity: 0; } }
9647
+ @keyframes toast-fold {
9648
+ from { clip-path: inset(0 round 20px); transform: translateX(-50%); }
9649
+ 55% { clip-path: inset(0 calc(50% - var(--toast-h, 38px) / 2) round 999px); opacity: 1; }
9650
+ 85% { clip-path: inset(calc(50% - 5px) calc(50% - 5px) round 999px); opacity: 1; }
9651
+ to { clip-path: inset(calc(50% - 5px) calc(50% - 5px) round 999px); transform: translateX(-50%) scale(.92); opacity: 0; }
9652
+ }
9653
+ @keyframes toast-fold-tint { from, 25% { opacity: 0; } 60%, to { opacity: 1; } }
9654
+ @keyframes toast-words-out { to { opacity: 0; } }
9655
+ .toast:not([hidden]) {
9656
+ box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 14%, transparent), inset 0 1px 0 rgb(255 255 255 / .06), 0 2px 4px rgba(0, 0, 0, .24), 0 12px 28px -6px rgba(0, 0, 0, .5), 0 28px 60px -18px rgba(0, 0, 0, .45), 0 0 0 10px color-mix(in srgb, var(--bg) 16%, transparent), 0 24px 70px 6px rgba(0, 0, 0, .16);
9657
+ }
9658
+ :root[data-scheme="light"] .toast:not([hidden]) { box-shadow: 0 0 0 .5px rgba(20, 30, 20, .08), 0 2px 4px rgba(20, 30, 20, .1), 0 12px 28px -6px rgba(20, 30, 20, .22), 0 28px 60px -18px rgba(20, 30, 20, .2), 0 0 0 10px rgb(255 255 255 / .22), 0 24px 70px 6px rgba(20, 30, 20, .08); }
9659
+ #messages .thread-inner { transition: padding-bottom calc(280ms * var(--motion-scale)) var(--ease-out, ease); }
9660
+ :root.toast-room #messages .thread-inner { padding-bottom: calc(var(--dock-h, 0px) + 28px + var(--toast-h, 38px) + 18px); }
9661
+ @media (prefers-reduced-motion: reduce) {
9662
+ .toast:not([hidden]), .toast:not([hidden])::before, .toast:not([hidden]) > *, .toast.leaving:not([hidden]), .toast.leaving:not([hidden])::before { animation-duration: 1ms; }
9663
+ .to-end, .to-end.leaving { animation: none; }
9664
+ }
9665
+ /* 6 · La caja de escribir no se aplasta: el texto conserva un ancho para escribir y la dirección
9666
+ (HUMANO › COPILOTO › AHORRO DE TOKENS ›) se corta con «…» antes que el destinatario, que siempre
9667
+ se ve. La ficha del ahorro de tokens no se parte en renglones. */
9668
+ .field { grid-template-columns: auto minmax(0, max-content) minmax(min(220px, 42%), 1fr) auto auto auto auto; }
9669
+ .field > .crew-label { display: flex; min-width: 0; overflow: hidden; }
9670
+ .crew-label > .crew-path { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
9671
+ .crew-label > .crew-to { flex: none; white-space: pre; }
9672
+ .ash-toggle { white-space: nowrap; flex: none; }
9673
+ @container composer (max-width: 560px) {
9674
+ .field { grid-template-columns: auto auto minmax(0, 1fr) auto auto auto auto; }
9675
+ }
9676
+ /* 5 · La receta para entrenar tu IA (Mac y Linux) cabe en su hoja: cada paso es una columna que
9677
+ puede angostarse y cada comando se lee completo, partido en renglones, con Copiar siempre a la
9678
+ vista arriba a la derecha. Antes la línea más larga ensanchaba el paso y la hoja la cortaba. */
9679
+ .sx-steps, .sx-steps > li { grid-template-columns: minmax(0, 1fr); min-width: 0; }
9680
+ .sx-steps .sx-command { min-width: 0; align-items: flex-start; }
9681
+ .sx-steps .sx-command code { white-space: pre-wrap; overflow-wrap: anywhere; overflow-x: visible; padding: 5px 0; line-height: 1.55; }
9682
+ .sx-steps .sx-command > :not(code) { flex: none; }
9683
+ /* La caja con muchos renglones se recorre por dentro: la primera línea visible se desvanece bajo
9684
+ su borde en lugar de verse partida a la mitad. */
9685
+ .editor.scrolled { -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 12px); mask-image: linear-gradient(to bottom, transparent 0, #000 12px); }
9686
+ .sx-steps .sx-command code { background: none; border: 0; border-radius: 0; }
9687
+ /* Un paso de medición al abrir una conversación (app.js, measureRows): cada fila se dibuja una vez
9688
+ para que el navegador recuerde su alto real y el historial no salte al llegar a lo nunca visto. */
9689
+ #messages .thread-inner > .cv-measure { content-visibility: visible; }
9690
+
9691
+ /* 1.0.3 · Your computer: every model size, to run and to train, against this machine. */
9692
+ .sx-more > .sx-table { overflow-x: auto; }
9693
+ .sx-models { width: 100%; border-collapse: collapse; font-size: 12.5px; font-variant-numeric: tabular-nums; }
9694
+ .sx-models th { text-align: left; font-weight: 550; color: var(--text-2); padding: 6px 10px 6px 0; border-bottom: 1px solid color-mix(in srgb, var(--text) 9%, transparent); white-space: nowrap; }
9695
+ .sx-models td { padding: 7px 10px 7px 0; color: var(--text); border-bottom: 1px solid color-mix(in srgb, var(--text) 5%, transparent); white-space: nowrap; }
9696
+ .sx-models tr:last-child td { border-bottom: 0; }
9697
+ .sx-models td.no { color: var(--text-2); }
9698
+ .sx-models tr.pick td:first-child { color: var(--phosphor); font-weight: 600; }
9699
+
9700
+ /* 1.0.3 · Turning MADRE off: the key takes the accent under the pointer, like every key of its bar,
9701
+ and what stays on screen once it is off says so plainly (public/power.js). */
9702
+ .madre-off { position: fixed; inset: 0; z-index: 2147483000; display: grid; place-content: center; justify-items: center; gap: 10px; padding: 24px; text-align: center; background: var(--bg, #050605); color: var(--text); }
9703
+ .madre-off h1 { margin: 6px 0 0; font-size: 22px; font-weight: 600; }
9704
+ .madre-off p { margin: 0; max-width: 420px; color: var(--text-2); font-size: 14px; line-height: 1.5; }
9705
+ .madre-off .madre-off-stuck { color: var(--danger); }
9706
+ .madre-off-mark { width: 44px; height: 44px; display: grid; place-items: center; border-radius: 14px; color: var(--text-2); background: color-mix(in srgb, var(--text) 7%, transparent); }
9707
+ .madre-off-mark svg { width: 24px; height: 24px; }
9708
+ html.madre-is-off body > :not(.madre-off) { visibility: hidden; }
9709
+
9710
+ /* 1.0.3 · Modules and Diagnostics lift less under the pointer: the key's own shadow and a slight
9711
+ one beneath, not the heavier one of the keys that are pressed (2026-10-17). */
9712
+ :root { --key-lift: rgba(0, 0, 0, .34); }
9713
+ :root[data-scheme="light"] { --key-lift: rgba(22, 30, 22, .16); }
9714
+ :root .shell .bar > :is(#modules-button, #mother-button, #code-button):is(:hover, :focus-visible) { box-shadow: var(--key-rest), 0 3px 8px -5px var(--key-lift) !important; }
9715
+ /* CODE under the pointer: its brackets take the accent, as every key's drawing does, and a slash
9716
+ draws itself between them. Open, the whole drawing stays in the accent, slash and all. */
9717
+ #code-button .code-slash { stroke-dasharray: 10; stroke-dashoffset: 10; opacity: 0; transition: stroke-dashoffset calc(240ms * var(--motion-scale, 1)) var(--ease-out), opacity calc(120ms * var(--motion-scale, 1)) var(--ease-out); }
9718
+ #code-button:is(:hover, :focus-visible, [aria-pressed="true"]) .code-slash { stroke-dashoffset: 0; opacity: 1; }
9719
+ :root[data-scheme] .shell .bar > #code-button:is(:hover, :focus-visible, [aria-pressed="true"]) svg { color: var(--phosphor); }
9720
+ :root[data-scheme="light"] .shell .bar > #code-button:is(:hover, :focus-visible, [aria-pressed="true"]) svg { color: color-mix(in srgb, var(--phosphor) 70%, #000000); }
9721
+ @media (prefers-reduced-motion: reduce) { #code-button .code-slash { transition: none; } }
9722
+
9723
+ /* 1.0.3 · The code workspace: the viewer docked beside the conversation (public/app.js, «the code
9724
+ workspace»). Over the room nothing of this shows; docked, the files sit at its side, the open files
9725
+ are tabs, a quiet path says where the caret is, an agent's changes wear the agent's colour, and a
9726
+ page or a document can show what it makes beside its text. The room's own pieces throughout. */
9727
+ dialog.viewer > .code-shell { flex: 1 1 auto; display: flex; min-height: 0; min-width: 0; }
9728
+ dialog.viewer > .code-shell > .viewer-body { flex: 1 1 auto; height: auto; min-height: 0; min-width: 0; }
9729
+ .code-files { flex: none; width: 216px; display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2%, transparent); }
9730
+ .code-files[hidden] { display: none; }
9731
+ .code-files-head { display: flex; align-items: center; gap: 6px; padding: 10px 10px 6px 14px; font-family: var(--read); font-size: 12px; font-weight: 600; color: var(--text-2); }
9732
+ .code-files-fold { margin-left: auto; width: 24px; height: 24px; display: grid; place-items: center; border: 0; border-radius: 7px; background: transparent; color: var(--text-3); cursor: pointer; }
9733
+ .code-files-fold:hover { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); }
9734
+ .code-files-fold svg { width: var(--ico-sm); height: var(--ico-sm); }
9735
+ .code-files-search { margin: 0 10px 8px; height: 30px; padding: 0 10px; border: 0; border-radius: 9px; background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text); font: inherit; font-family: var(--read); font-size: 12.5px; outline: none; }
9736
+ .code-files-search:focus { box-shadow: 0 0 0 2px color-mix(in srgb, var(--phosphor) 35%, transparent); }
9737
+ .code-files > .code-files-list { flex: 1 1 auto; min-height: 0; overflow: auto; overscroll-behavior: contain; padding: 0 6px 12px; }
9738
+ .code-files-list { list-style: none; margin: 0; padding: 0; }
9739
+ .code-file { width: 100%; display: flex; align-items: center; gap: 6px; min-height: 26px; padding: 3px 8px 3px calc(8px + var(--depth, 0) * 12px); border: 0; border-radius: 7px; background: transparent; color: var(--text); font-family: var(--mono); font-size: 12px; text-align: left; cursor: pointer; }
9740
+ .code-file:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
9741
+ .code-file.on { background: color-mix(in srgb, var(--phosphor) 13%, transparent); color: var(--phosphor); }
9742
+ .code-file-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
9743
+ .code-file-dir { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); font-size: 10.5px; direction: rtl; text-align: left; }
9744
+ .code-folder { color: var(--text-2); }
9745
+ .code-folder-caret { flex: none; display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); color: var(--text-3); }
9746
+ .code-folder-caret svg { display: block; width: var(--ico-xs); height: var(--ico-xs); rotate: -90deg; transition: rotate var(--motion-fast) var(--ease-out); }
9747
+ .code-folder[aria-expanded="true"] .code-folder-caret svg { rotate: 0deg; }
9748
+ @media (prefers-reduced-motion: reduce) { .code-folder-caret svg { transition: none; } }
9749
+ .code-file-agent { flex: none; width: 7px; height: 7px; margin-left: auto; border-radius: 50%; background: var(--agent, var(--text-3)); }
9750
+ .code-files-empty { padding: 8px 12px; color: var(--text-3); font-family: var(--read); font-size: 12px; }
9751
+
9752
+ .code-tabs { flex: none; display: flex; align-items: flex-end; gap: 2px; padding: 6px 10px 0; overflow-x: auto; scrollbar-width: none; border-bottom: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2.5%, transparent); }
9753
+ .code-tabs::-webkit-scrollbar { display: none; }
9754
+ .code-tabs[hidden] { display: none; }
9755
+ .code-tab { flex: none; display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 6px 0 4px; border-radius: 9px 9px 0 0; color: var(--text-2); }
9756
+ .code-tab.on { background: var(--panel); color: var(--text); box-shadow: 0 -1px 0 var(--line), 1px 0 0 var(--line), -1px 0 0 var(--line); }
9757
+ .code-tab-name { height: 28px; padding: 0 6px; border: 0; background: transparent; color: inherit; font-family: var(--mono); font-size: 11.5px; cursor: pointer; }
9758
+ .code-tab.on .code-tab-name { font-weight: 600; cursor: default; }
9759
+ .code-tab-dirty { width: 7px; height: 7px; border-radius: 50%; background: var(--text-2); }
9760
+ .code-tab-agent { width: 7px; height: 7px; border-radius: 50%; background: var(--agent); }
9761
+ .code-tab-close { width: 20px; height: 20px; display: grid; place-items: center; border: 0; border-radius: 6px; background: transparent; color: var(--text-3); cursor: pointer; opacity: 0; transition: opacity var(--motion-fast) var(--ease-out); }
9762
+ .code-tab:hover .code-tab-close, .code-tab.on .code-tab-close, .code-tab-close:focus-visible { opacity: 1; }
9763
+ .code-tab-close:hover { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
9764
+ .code-tab-close svg { width: var(--ico-xs); height: var(--ico-xs); }
9765
+
9766
+ .code-crumbs { flex: none; display: flex; align-items: center; gap: 12px; min-height: 30px; padding: 4px 16px; border-bottom: 1px solid var(--line); font-family: var(--mono); font-size: 11px; color: var(--text-3); }
9767
+ .code-crumbs[hidden] { display: none; }
9768
+ .code-crumbs-path { display: flex; align-items: center; gap: 6px; min-width: 0; overflow: hidden; white-space: nowrap; }
9769
+ .code-crumbs-path i { font-style: normal; opacity: .6; }
9770
+ .code-crumbs-path b { color: var(--text-2); font-weight: 600; }
9771
+ .code-crumbs-path .code-crumbs-symbol { color: var(--text); }
9772
+ .code-crumbs-changes { margin-left: auto; flex: none; display: inline-flex; align-items: center; gap: 6px; color: var(--agent); }
9773
+ .code-crumbs-changes .code-file-agent { margin: 0; }
9774
+ .code-crumbs-step { display: inline-grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text-2); cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out); }
9775
+ .code-crumbs-step:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--text) 11%, transparent); color: var(--text); outline: 0; }
9776
+ .code-crumbs-step svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
9777
+ .code-crumbs-step.back svg { rotate: 90deg; }
9778
+ .code-crumbs-step.on svg { rotate: -90deg; }
9779
+
9780
+ /* An agent's change, in its colour: a band at the line numbers, a light ground on the lines, and a
9781
+ card under them with what was there before and the three answers. */
9782
+ .viewer-body pre.code .ln.ag { color: var(--ag); box-shadow: inset 3px 0 0 var(--ag); }
9783
+ .viewer-body pre.code .tx.ag { background: color-mix(in srgb, var(--ag) 9%, transparent); }
9784
+ /* An agent's change, under its lines: a card of the windows' own material (Settings' cards), who
9785
+ changed them as the agent's tag (no edge in its colour: on a round card it read as an eyebrow), what
9786
+ was there before as lines with their «−» (never crossed out: it has to be read), and three tags of a
9787
+ flat tone, each with its drawing at the size of a drawing beside a word. */
9788
+ .code-change { grid-column: 1 / -1; display: grid; gap: 8px; margin: 6px 16px 12px 52px; padding: 10px 12px; border-radius: 12px; background: var(--surface, var(--panel)); box-shadow: var(--bevel, none), var(--float-sm, 0 6px 16px -10px rgba(0, 0, 0, .4)); white-space: normal; font-family: var(--read); }
9789
+ .code-change-head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; font-size: 12.5px; line-height: 1.4; color: var(--text-2); }
9790
+ .code-change-who { padding: 1px 7px; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--agent) 14%, transparent); color: var(--agent); font-family: var(--mono); font-size: 11px; font-weight: 600; letter-spacing: .02em; }
9791
+ .code-change-was { display: grid; margin: 0; padding: 6px 0; max-height: 12em; overflow: auto; border-radius: 8px; background: color-mix(in srgb, var(--danger) 6%, transparent); color: var(--text-2); font-family: var(--mono); font-size: 12px; line-height: 1.6; white-space: pre; }
9792
+ .code-change-was > span { padding: 0 10px 0 26px; position: relative; }
9793
+ .code-change-was > span::before { content: '−'; position: absolute; left: 10px; color: color-mix(in srgb, var(--danger) 80%, var(--text-2)); }
9794
+ .code-change-acts { display: flex; flex-wrap: wrap; gap: 6px; }
9795
+ .code-change-act { --tone: var(--text); display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 11px 0 9px; border: 0; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--tone) 12%, transparent); color: var(--tone); font-family: var(--read); font-size: 12.5px; font-weight: 550; white-space: nowrap; cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out); }
9796
+ .code-change-act:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--tone) 20%, transparent); outline: 0; }
9797
+ .code-change-act:disabled { opacity: .5; cursor: default; }
9798
+ .code-change-act.keep { --tone: var(--phosphor); }
9799
+ .code-change-act.undo { --tone: var(--text); background: color-mix(in srgb, var(--text) 7%, transparent); }
9800
+ .code-change-act.undo:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--text) 12%, transparent); }
9801
+ .code-change-act.why { --tone: var(--agent); }
9802
+ .code-change-ico { display: inline-grid; place-items: center; flex: none; }
9803
+ .code-change-ico svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
9804
+ :root[data-scheme="light"] .code-change-act.keep { color: color-mix(in srgb, var(--phosphor) 72%, #000000); }
9805
+ .code-editor .ed-gutter-inner > .mk { color: var(--mk); box-shadow: inset 3px 0 0 var(--mk); background: color-mix(in srgb, var(--mk) 10%, transparent); }
9806
+
9807
+ /* Side by side: the text and what it makes. */
9808
+ .viewer-body.with-beside { display: grid !important; grid-template-columns: minmax(0, 1fr) minmax(280px, 46%); padding: 0; overflow: hidden; }
9809
+ .viewer-body.with-beside > :first-child { min-height: 0; height: 100%; overflow: auto; }
9810
+ .code-beside { display: flex; flex-direction: column; min-height: 0; border-left: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2%, transparent); }
9811
+ .code-beside-head { flex: none; display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-bottom: 1px solid var(--line); font-family: var(--read); font-size: 12px; color: var(--text-2); }
9812
+ .code-beside-head b { color: var(--text); font-weight: 600; }
9813
+ .code-beside-live { margin-left: auto; font-family: var(--mono); font-size: 10px; color: var(--phosphor); }
9814
+ .code-beside > iframe.ripley { flex: 1 1 auto; width: 100%; height: auto; min-height: 0; border-radius: 0; box-shadow: none; }
9815
+ .code-beside > .viewer-markdown { flex: 1 1 auto; min-height: 0; overflow: auto; width: auto; padding: 14px 18px 24px; font-size: 14.5px; }
9816
+ .code-beside-off { display: grid; gap: 12px; justify-items: start; padding: 18px; font-family: var(--read); font-size: 13px; line-height: 1.5; color: var(--text-2); }
9817
+ .code-beside-off p { margin: 0; }
9818
+ dialog.viewer .viewer-beside[aria-pressed="true"] { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
9819
+
9820
+ /* Nothing open yet. */
9821
+ .code-home { width: min(460px, 100%); display: grid; gap: 10px; justify-items: start; margin: 8vh auto 0; font-family: var(--read); }
9822
+ .code-home h3 { margin: 0; font-size: 18px; font-weight: 600; color: var(--text); }
9823
+ .code-home h4 { margin: 14px 0 0; font-size: 12px; font-weight: 600; color: var(--text-2); }
9824
+ .code-home p { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--text-2); }
9825
+ .code-home-list { list-style: none; margin: 0; padding: 0; width: 100%; display: grid; gap: 2px; }
9826
+ .code-home-list .code-file { gap: 8px; }
9827
+ .code-home-list .code-file small { margin-left: auto; flex: none; color: var(--text-3); font-size: 10.5px; }
9828
+ .code-home-list .code-file .code-file-agent { margin: 0; }
9829
+
9830
+ /* ⌘P */
9831
+ .quick-open { position: fixed; z-index: 90; inset: 14vh auto auto 50%; transform: translateX(-50%); width: min(560px, calc(100vw - 32px)); margin: 0; padding: 0; border: 1px solid var(--line-2); border-radius: 14px; background: var(--panel); color: var(--text); box-shadow: 0 24px 60px -24px rgba(0, 0, 0, .55); overflow: hidden; }
9832
+ .quick-open[hidden] { display: none; }
9833
+ .quick-open-input { width: 100%; height: 48px; padding: 0 16px; border: 0; border-bottom: 1px solid var(--line); background: transparent; color: var(--text); font: inherit; font-family: var(--read); font-size: 15px; outline: none; }
9834
+ .quick-open-list { list-style: none; margin: 0; padding: 6px; max-height: min(52vh, 420px); overflow: auto; }
9835
+ .quick-open-item { display: flex; align-items: baseline; gap: 10px; padding: 8px 10px; border-radius: 9px; cursor: pointer; }
9836
+ .quick-open-item b { font-family: var(--mono); font-size: 12.5px; font-weight: 600; }
9837
+ .quick-open-item span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); font-family: var(--mono); font-size: 11px; }
9838
+ .quick-open-item .code-file-agent { align-self: center; }
9839
+ .quick-open-item.on, .quick-open-item:hover { background: color-mix(in srgb, var(--phosphor) 12%, transparent); }
9840
+ .quick-open-empty { padding: 12px; color: var(--text-3); font-family: var(--read); font-size: 13px; }
9841
+
9842
+ /* The verbs of the ask card: a row of flat-tone chips above the suggestions. */
9843
+ .ask-actions { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 2px; }
9844
+ .ask-action { height: 28px; padding: 0 11px; border: 0; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--phosphor) 14%, var(--chip-ground, transparent)); color: var(--phosphor); font-family: var(--read); font-size: 12.5px; font-weight: 600; cursor: pointer; }
9845
+ .ask-action:hover, .ask-action:focus-visible { background: color-mix(in srgb, var(--phosphor) 24%, var(--chip-ground, transparent)); outline: 0; }
9846
+ @media (prefers-reduced-motion: reduce) { .code-tab-close { transition: none; } }
9847
+ .viewer-body.with-beside > :not(.code-beside) { grid-column: 1; grid-row: 1; }
9848
+ .viewer-body.with-beside > .code-beside { grid-column: 2; grid-row: 1; }
9849
+ .code-crumbs .code-files-show { margin: 0 -4px 0 -8px; }
9850
+ .viewer-body.with-beside { grid-template-rows: minmax(0, 1fr); }
9851
+ .viewer-body.with-beside > pre.code { align-content: start; }
9852
+ .viewer-body.with-beside { place-items: stretch; }
9853
+ /* Narrow, what the code makes goes under it. */
9854
+ .viewer-body.with-beside.stacked { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); }
9855
+ .viewer-body.with-beside.stacked > .code-beside { grid-column: 1; grid-row: 2; border-left: 0; border-top: 1px solid var(--line); }
9856
+ /* The header of the code workspace: the tabs and the path under it already name the file, so the
9857
+ header keeps only its tools; too narrow for their words, they keep their drawings, and past that
9858
+ it takes two lines instead of going out of the window: the window's keys always on the top one,
9859
+ the tools under them (wrap-reverse sends what does not fit, the last keys, upwards; narrower
9860
+ still, the spacer fills the top line beside the window's keys so every tool goes below). */
9861
+ dialog.viewer.code:has(> .code-crumbs:not([hidden])) > .viewer-head > :is(#viewer-path, #viewer-lang) { display: none; }
9862
+ dialog.viewer.code > .viewer-head { flex-wrap: wrap-reverse; row-gap: 6px; justify-content: flex-end; }
9863
+ @container viewerhead (max-width: 420px) {
9864
+ dialog.viewer.code > .viewer-head > .viewer-spacer { order: 1; flex: 1 1 calc(100% - 140px); }
9865
+ dialog.viewer.code > .viewer-head > .surface-modes { order: 2; }
9866
+ }
9867
+ .viewer-beside { display: inline-flex; align-items: center; justify-content: center; }
9868
+ .viewer-beside > svg { display: none; width: var(--ico-sm); height: var(--ico-sm); }
9869
+ @container viewerhead (max-width: 620px) {
9870
+ .viewer-head > .viewer-beside { padding: 4px 7px; }
9871
+ .viewer-head > .viewer-beside > svg { display: block; }
9872
+ .viewer-head > .viewer-beside > span { display: none; }
9873
+ dialog.viewer .viewer-head .viewer-seg .viewer-open { font-size: 0; padding: 0 9px; letter-spacing: 0; }
9874
+ dialog.viewer .viewer-head .viewer-seg .viewer-open .tail-mark { margin-left: 0; }
9875
+ dialog.viewer .viewer-head .viewer-seg-btn { padding: 0 9px; }
9876
+ .viewer-head > .viewer-mode { padding: 5px 8px; letter-spacing: .08em; }
9877
+ .viewer-head > .surface-modes { margin-left: 0; }
9878
+ }
9879
+
9880
+ /* ==========================================================================================
9881
+ 1.0.3 · SIGNS DRAWN, THE AGENT ASKED, THE CORE'S SCROLL (2026-10-17)
9882
+ ------------------------------------------------------------------------------------------
9883
+ ↗ and ▾ at the end of a key's words and ◉ at the start of a label are drawn (app.js, tailMark
9884
+ and leadWords), at the size of a mark; the folders' and the folds' carets are the chooser's
9885
+ chevron, turned by their state. Asking about code, the agent chosen is lit and the rest are
9886
+ quietly off. And the core scrolls at its window's edge, never over its cards.
9887
+ ========================================================================================== */
9888
+ .tail-mark { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); margin-left: 3px; vertical-align: -2px; flex: none; }
9889
+ .tail-mark svg { display: block; width: 100%; height: 100%; }
9890
+ .lead-mark { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); margin-right: 6px; vertical-align: -2px; flex: none; }
9891
+ .lead-mark svg { display: block; width: 100%; height: 100%; }
9892
+ .tree-body .node .caret { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); font-size: 0; }
9893
+ .tree-body .node .caret svg { display: block; width: var(--ico-xs); height: var(--ico-xs); rotate: -90deg; transition: rotate var(--motion-fast) var(--ease-out); }
9894
+ .tree-body li[aria-expanded="true"] > .node .caret svg { rotate: 0deg; }
9895
+ .card-fold > summary .caret { display: inline-flex; align-items: center; gap: 4px; }
9896
+ .card-fold > summary .caret-mark { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); }
9897
+ .card-fold > summary .caret-mark svg { display: block; width: 100%; height: 100%; rotate: -90deg; transition: rotate var(--motion-fast) var(--ease-out); }
9898
+ .card-fold[open] > summary .caret-mark svg { rotate: 0deg; }
9899
+ @media (prefers-reduced-motion: reduce) { .tree-body .node .caret svg, .card-fold > summary .caret-mark svg { transition: none; } }
9900
+
9901
+ .ask-card .ask-crew .ask-agent { transition: opacity var(--motion-fast) var(--ease-out), filter var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out); }
9902
+ .ask-card .ask-crew .ask-agent[aria-checked="false"] { opacity: .4; filter: grayscale(.9); box-shadow: none !important; }
9903
+ .ask-card .ask-crew .ask-agent[aria-checked="false"]:is(:hover, :focus-visible) { opacity: .75; filter: grayscale(.35); }
9904
+ .ask-card .ask-crew .ask-agent[aria-checked="true"] { opacity: 1; filter: none; box-shadow: 0 0 0 2px var(--surface, var(--panel)), 0 0 0 3.5px var(--agent), 0 0 14px -2px color-mix(in srgb, var(--agent) 55%, transparent) !important; }
9905
+ @media (prefers-reduced-motion: reduce) { .ask-card .ask-crew .ask-agent { transition: none; } }
9906
+
9907
+ dialog#core { --core-pad: 22px; }
9908
+ dialog#core .core-body { padding-inline: var(--core-pad); }
9909
+ dialog#core .core-panes { margin-inline: calc(-1 * var(--core-pad)); padding-inline: calc(var(--core-pad) + 2px); scrollbar-gutter: stable; }
9910
+ @media (max-width: 720px) { dialog#core { --core-pad: 14px; } }
9911
+
9912
+ /* ==========================================================================================
9913
+ YOUR OWN PICTURE (1.0.3) · --wp-custom
9914
+ ------------------------------------------------------------------------------------------
9915
+ The same layers as the wallpapers that ship — a veil, or a mesh of the picture's own colours,
9916
+ its tint for the room's material, its blur — with the colours the page took from the picture
9917
+ (public/wallpaper.js, paintCustomWall: --wpc-* on the root, as "r g b") and the point of it that
9918
+ stays in view (--wpc-pos). Until they arrive, a plain ground of the theme.
9919
+ ========================================================================================== */
9920
+ :root, .look-preview[data-scheme="dark"] {
9921
+ --wp-custom: linear-gradient(rgb(var(--wpc-veil-d, 12 12 12) / min(.96, calc(.68 * var(--veil-k, 1)))), rgb(var(--wpc-veil-d, 12 12 12) / min(.97, calc(.78 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-d, 12 12 12));
9922
+ }
9923
+ :root[data-scheme="light"], .look-preview[data-scheme="light"] {
9924
+ --wp-custom: linear-gradient(rgb(var(--wpc-veil-l, 246 246 246) / min(.96, calc(.52 * var(--veil-k, 1)))), rgb(var(--wpc-veil-l, 246 246 246) / min(.97, calc(.64 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-l, 241 241 241));
9925
+ }
9926
+ :is(:root:not([data-scheme="light"]), .look-preview[data-scheme="dark"])[data-wp-style="mesh"] {
9927
+ --wp-custom: radial-gradient(75% 65% at 12% 8%, rgb(var(--wpc-m1-d, 32 32 32) / min(.95, calc(.9 * var(--veil-k, 1)))), transparent 72%), radial-gradient(65% 75% at 92% 28%, rgb(var(--wpc-m2-d, 44 44 44) / min(.95, calc(.9 * var(--veil-k, 1)))), transparent 72%), radial-gradient(85% 65% at 42% 102%, rgb(var(--wpc-m3-d, 18 18 18) / min(.95, calc(.9 * var(--veil-k, 1)))), transparent 74%), linear-gradient(rgb(var(--wpc-veil-d, 12 12 12) / min(.9, calc(.56 * var(--veil-k, 1)))), rgb(var(--wpc-veil-d, 12 12 12) / min(.9, calc(.56 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-d, 12 12 12));
9928
+ }
9929
+ :is(:root[data-scheme="light"], .look-preview[data-scheme="light"])[data-wp-style="mesh"] {
9930
+ --wp-custom: radial-gradient(75% 65% at 12% 8%, rgb(var(--wpc-m1-l, 240 240 240) / min(.95, calc(.78 * var(--veil-k, 1)))), transparent 72%), radial-gradient(65% 75% at 92% 28%, rgb(var(--wpc-m2-l, 246 246 246) / min(.95, calc(.78 * var(--veil-k, 1)))), transparent 72%), radial-gradient(85% 65% at 42% 102%, rgb(var(--wpc-m3-l, 236 236 236) / min(.95, calc(.78 * var(--veil-k, 1)))), transparent 74%), linear-gradient(rgb(var(--wpc-veil-l, 246 246 246) / min(.9, calc(.42 * var(--veil-k, 1)))), rgb(var(--wpc-veil-l, 246 246 246) / min(.9, calc(.42 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-l, 241 241 241));
9931
+ }
9932
+ :root[data-wallpaper="custom"] .shell::before { background: var(--wp-custom); }
9933
+ .look-preview[data-wallpaper="custom"], .paper[data-wp="custom"]:not(.paper-add) .paper-swatch { background: var(--wp-custom); }
9934
+ .look-preview[data-wallpaper="custom"]::before { background: var(--wp-custom); }
9935
+ :is(:root, .look-preview)[data-wallpaper="custom"] { --tint: rgb(var(--wpc-tint-d, 27 27 27)); }
9936
+ :is(:root, .look-preview)[data-scheme="light"][data-wallpaper="custom"] { --tint: rgb(var(--wpc-tint-l, 245 245 245)); }
9937
+ :is(:root[data-wallpaper="custom"], .look-preview[data-wallpaper="custom"]) { --wp-blur-on: var(--wp-blur, 0px); }
9938
+ :root[data-wallpaper="custom"] .shell::before { inset: calc(-2 * var(--wp-blur-on, 0px)); filter: blur(var(--wp-blur-on, 0px)); }
9939
+ .look-preview[data-wallpaper="custom"] { background: none !important; position: relative; isolation: isolate; overflow: hidden; }
9940
+ .look-preview[data-wallpaper="custom"]::before { content: ""; position: absolute; inset: calc(-2 * var(--wp-blur-on, 0px)); z-index: -1; filter: blur(var(--wp-blur-on, 0px)); pointer-events: none; }
9941
+
9942
+ /* Its tile: the picture once it is here; before, a «+» on the ground, the way to add it. Busy while
9943
+ the page prepares and keeps it. */
9944
+ .paper.paper-add .paper-swatch { display: grid; place-items: center; background: color-mix(in srgb, var(--text) 5%, transparent); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--text) 16%, transparent); color: var(--text-2); }
9945
+ .paper.paper-add .paper-swatch svg { width: var(--ico-md); height: var(--ico-md); }
9946
+ .paper.paper-add:is(:hover, :focus-visible) .paper-swatch { color: var(--phosphor); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--phosphor) 50%, transparent); }
9947
+ .paper.busy { pointer-events: none; }
9948
+ .paper.busy .paper-swatch { animation: paper-busy 1.1s ease-in-out infinite; }
9949
+ @keyframes paper-busy { 50% { opacity: .45; } }
9950
+ @media (prefers-reduced-motion: reduce) { .paper.busy .paper-swatch { animation: none; opacity: .6; } }
9951
+
9952
+ /* Framing it: the whole picture, and over it the part the screen shows, carried by hand. What the
9953
+ screen does not show is dimmed; the frame keeps a white line and the window's own corner. */
9954
+ .wall-tools { display: grid; gap: 10px; margin-top: 4px; padding-top: 12px; border-top: 1px solid var(--line); }
9955
+ .wall-tools-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
9956
+ .wall-tools-words { display: grid; gap: 2px; min-width: 0; }
9957
+ .wall-tools-words b { font-family: var(--read); font-size: 12.5px; font-weight: 600; color: var(--text); }
9958
+ .wall-tools-hint { font-family: var(--read); font-size: 12px; line-height: 1.4; color: var(--text-2); }
9959
+ .wall-frame { display: grid; place-items: center; padding: 10px; border-radius: 12px; background: color-mix(in srgb, var(--text) 5%, transparent); }
9960
+ .wall-frame-fit { position: relative; display: block; line-height: 0; border-radius: 8px; overflow: hidden; touch-action: none; user-select: none; -webkit-user-select: none; }
9961
+ .wall-frame-pic { display: block; max-width: 100%; max-height: 150px; width: auto; height: auto; }
9962
+ .wall-frame-view { position: absolute; border-radius: 6px; box-shadow: 0 0 0 2px #ffffff, 0 0 0 4000px rgb(0 0 0 / .42); outline: 0; }
9963
+ .wall-frame:not([data-free="none"]) .wall-frame-fit { cursor: grab; }
9964
+ .wall-frame.moving .wall-frame-fit { cursor: grabbing; }
9965
+ .wall-frame-view:focus-visible { box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px color-mix(in srgb, var(--phosphor) 70%, transparent), 0 0 0 4000px rgb(0 0 0 / .42); }
9966
+ .wall-tools-acts { display: flex; flex-wrap: wrap; gap: 8px; }
9967
+
9968
+ /* ==========================================================================================
9969
+ NEURAL MODE (1.0.3) · its key in the maps' heads, and its invitation
9970
+ ------------------------------------------------------------------------------------------
9971
+ The Memory map and the Projects map can be drawn as the neurons of a brain (public/neural.js,
9972
+ nostromo-engine.js drawNeural). The key sits with the maps' other keys and takes their shape;
9973
+ on, its neuron fills and takes the cold light of the mode. When the machine does not give the
9974
+ map its frames, the key breathes and a card under it offers the mode: what it is, try it or not.
9975
+ ========================================================================================== */
9976
+ :root { --neural: #56c8ff; --neural-ink: #021018; }
9977
+ .nostromo-head .neural-key { display: inline-flex; align-items: center; gap: 6px; }
9978
+ .nostromo-head .neural-key svg { flex: none; width: var(--ico-sm); height: var(--ico-sm); }
9979
+ /* Its word is written as it reads (the head lowercases its keys and lifts the first letter, which here is the drawing). */
9980
+ :is(#nostromo, .mv) .nostromo-actions .neural-key { text-transform: none; }
9981
+ :is(#nostromo, .mv) .nostromo-actions .neural-key[aria-pressed="true"] { color: var(--neural-ink); background: var(--neural); }
9982
+ :is(#nostromo, .mv) .nostromo-actions .neural-key[aria-pressed="true"]:hover { background: color-mix(in srgb, var(--neural) 86%, #ffffff); }
9983
+ .nostromo-head .neural-key[aria-pressed="true"] .ic-f { fill: currentColor; }
9984
+ .nostromo-head .neural-key.invite { animation: neural-breathe calc(2400ms * var(--motion-scale, 1)) ease-in-out infinite; }
9985
+ @keyframes neural-breathe { 0%, 100% { box-shadow: 0 0 0 0 rgb(86 200 255 / 0); } 50% { box-shadow: 0 0 0 4px rgb(86 200 255 / .35), 0 0 22px rgb(86 200 255 / .3); } }
9986
+ .via-phone #nostromo-neural { display: none; }
9987
+ .neural-invite {
9988
+ position: absolute; z-index: 6; width: min(340px, calc(100% - 24px));
9989
+ display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 12px 12px; padding: 14px 14px 12px;
9990
+ border-radius: 14px; color: #eef3ff; font-family: var(--read); text-transform: none; letter-spacing: 0;
9991
+ background: rgb(8 14 26 / .92); -webkit-backdrop-filter: blur(16px) saturate(1.4); backdrop-filter: blur(16px) saturate(1.4);
9992
+ box-shadow: 0 0 0 .5px rgb(86 200 255 / .28), 0 18px 44px -18px rgb(0 0 0 / .7), 0 0 40px -12px rgb(86 200 255 / .28);
9993
+ animation: neural-invite-in calc(240ms * var(--motion-scale, 1)) var(--ease-glide, ease-out);
9994
+ }
9995
+ @keyframes neural-invite-in { from { opacity: 0; translate: 0 -6px; } to { opacity: 1; translate: 0 0; } }
9996
+ .neural-invite-mark { display: grid; place-items: center; width: 36px; height: 36px; border-radius: 11px; color: var(--neural); background: radial-gradient(circle at 50% 45%, rgb(86 200 255 / .3), rgb(86 200 255 / .06) 70%); box-shadow: inset 0 0 0 .5px rgb(86 200 255 / .4); }
9997
+ .neural-invite-mark svg { width: var(--ico-md); height: var(--ico-md); }
9998
+ .neural-invite-words { display: grid; gap: 3px; align-content: center; min-width: 0; }
9999
+ .neural-invite-words b { font-size: 13.5px; font-weight: 600; color: #ffffff; }
10000
+ .neural-invite-words span { font-size: 12.5px; line-height: 1.45; color: rgb(220 232 255 / .72); }
10001
+ .neural-invite-acts { grid-column: 1 / -1; display: flex; justify-content: flex-end; gap: 8px; }
10002
+ /* Its two keys are its own: the map is dark in either theme, so they never take the page's. */
10003
+ .neural-invite :is(.neural-invite-go, .neural-invite-later) { height: 30px; padding: 0 14px; border: 0; border-radius: 9px; font-family: var(--read); font-size: 12.5px; font-weight: 600; letter-spacing: 0; cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out); }
10004
+ .neural-invite .neural-invite-later { color: #eef3ff; background: rgb(255 255 255 / .08); }
10005
+ .neural-invite .neural-invite-later:is(:hover, :focus-visible) { background: rgb(255 255 255 / .15); outline: 0; }
10006
+ .neural-invite .neural-invite-go { color: var(--neural-ink); background: var(--neural); }
10007
+ .neural-invite .neural-invite-go:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--neural) 84%, #ffffff); outline: 0; }
10008
+ @media (prefers-reduced-motion: reduce) { .nostromo-head .neural-key.invite, .neural-invite { animation: none; } }
10009
+
10010
+ /* The maps' close (1.0.3): the same sunk track and turning cross as every window, in the dark the
10011
+ maps always stand on, whatever the room's theme. */
10012
+ :is(#nostromo, .mv) .nostromo-actions .surface-modes {
10013
+ --neu-hi: rgba(255, 255, 255, .07); --neu-lo: rgba(0, 0, 0, .72); --surface: #1b1e1b;
10014
+ --key-track: inset 1.5px 1.5px 4px var(--neu-lo), inset -1.5px -1.5px 4px var(--neu-hi);
10015
+ --key-rest: -2px -2px 5px var(--neu-hi), 3px 3px 7px var(--neu-lo);
10016
+ box-shadow: var(--key-track); background: rgb(255 255 255 / .04) !important;
10017
+ }
10018
+ :is(#nostromo, .mv) .nostromo-actions .surface-modes .surface-mode.close { color: rgb(242 241 238 / .78); }
10019
+ :is(#nostromo, .mv) .nostromo-actions .surface-modes .surface-mode.close:is(:hover, :focus-visible) { color: #ffffff; background: var(--surface); box-shadow: var(--key-rest); }
10020
+
10021
+
10022
+ /* The Market's offer in the conversation (2026-10-18, app.js offerModule): one card under the
10023
+ message that asked for what a module does — its drawing, what would help, and its keys. */
10024
+ #messages .system.market-offer { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 6px 12px; max-width: min(640px, 100%); margin: 4px auto 6px; padding: 12px 14px; border: 0; border-radius: 14px; text-align: left; background: var(--plane-solid, var(--panel)); box-shadow: 0 0 0 1px color-mix(in srgb, var(--acc, var(--phosphor)) 30%, transparent), 0 6px 18px -12px rgba(0, 0, 0, .4); font-family: var(--read); letter-spacing: 0; text-transform: none; }
10025
+ #messages .market-offer-words { display: grid; gap: 2px; min-width: 0; }
10026
+ #messages .market-offer-words b { font-size: 14px; font-weight: 650; color: var(--text); }
10027
+ #messages .market-offer-words span { font-size: 13px; line-height: 1.45; color: var(--text-2); }
10028
+ #messages .market-offer-acts { grid-column: 2; display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
10029
+ #messages .market-offer-acts button { padding: 6px 12px; border: 0; border-radius: 9px; font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer; color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
10030
+ #messages .market-offer-acts button.primary { color: var(--acc-ink, var(--phosphor-ink, #0b0b0b)); background: var(--acc, var(--phosphor)); }
10031
+ #messages .market-offer-acts button.quiet { background: transparent; color: var(--text-3); }
10032
+ #messages .market-offer-acts button:disabled { opacity: .6; cursor: default; }
10033
+ /* Beside «Add a module», at the right: the push goes to whichever stands first. */
10034
+ .mods-head .mods-market { flex: none; height: 30px; padding: 0 12px; margin-left: auto; }
10035
+ .mods-head .mods-market + .mods-add { margin-left: 0; }
10036
+
10037
+ /* THE MARKET, full screen (market-view.js, 2026-10-18): the same store in Home and in a project.
10038
+ It takes the whole window, as a store does, over whatever was open; its own colors are the
10039
+ room's tokens, so it follows light and dark, and each module wears its own two colors. */
10040
+ html.mk-open, html.mk-open body { overflow: hidden; }
10041
+ /* The page's own first-time hints wait under the store and come back when it closes. */
10042
+ html.mk-open :is(.tour-hint, .tour-hint-away, .hint-spot) { visibility: hidden !important; }
10043
+ .mk { position: fixed; inset: 0; z-index: 2147482990; display: flex; flex-direction: column; background: var(--bg); color: var(--text); font-family: var(--read); outline: 0; opacity: 0; transform: scale(.985); transition: opacity calc(200ms * var(--motion-scale, 1)) ease, transform calc(240ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1); }
10044
+ .mk.in { opacity: 1; transform: none; }
10045
+ .mk button { font-family: inherit; }
10046
+ .mk-bar { position: relative; z-index: 2; display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: 12px; padding: calc(10px + env(safe-area-inset-top, 0px)) 20px 10px; border-bottom: 1px solid var(--line); background: color-mix(in srgb, var(--bg) 84%, transparent); -webkit-backdrop-filter: saturate(1.4) blur(18px); backdrop-filter: saturate(1.4) blur(18px); }
10047
+ .mk-leave { justify-self: start; width: 34px; height: 34px; display: grid; place-items: center; border: 0; border-radius: 50%; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); cursor: pointer; }
10048
+ .mk-leave:hover { background: color-mix(in srgb, var(--text) 12%, transparent); }
10049
+ .mk-leave svg { width: 16px; height: 16px; }
10050
+ .mk-tabs { display: inline-flex; gap: 2px; padding: 3px; border-radius: 12px; background: color-mix(in srgb, var(--text) 7%, transparent); }
10051
+ .mk-tab { min-width: 104px; padding: 6px 18px; border: 0; border-radius: 9px; background: transparent; color: var(--text-2); font-size: 13.5px; font-weight: 600; cursor: pointer; }
10052
+ .mk-tab[aria-selected="true"] { background: var(--panel); color: var(--text); box-shadow: 0 1px 3px rgba(0, 0, 0, .18); }
10053
+ .mk-here { display: flex; align-items: baseline; gap: 8px; font-size: 14.5px; white-space: nowrap; }
10054
+ .mk-here span { color: var(--text-2); font-size: 13.5px; }
10055
+ .mk-search { justify-self: end; width: min(280px, 100%); }
10056
+ .mk-search[hidden] { display: flex !important; visibility: hidden; }
10057
+ .mk-main { flex: 1; overflow-y: auto; overscroll-behavior: contain; }
10058
+ .mk-page { width: min(1120px, 100%); margin: 0 auto; padding: 30px 32px calc(72px + env(safe-area-inset-bottom, 0px)); display: grid; grid-template-columns: minmax(0, 1fr); gap: 36px; box-sizing: border-box; }
10059
+ .mk-page > * { min-width: 0; }
10060
+ .mk-head h1 { margin: 0; font-size: clamp(30px, 4vw, 40px); font-weight: 760; letter-spacing: -.02em; line-height: 1.05; }
10061
+ .mk-head p { margin: 8px 0 0; max-width: 72ch; color: var(--text-2); font-size: 15px; line-height: 1.5; }
10062
+ .mk-empty { margin: 0; color: var(--text-2); font-size: 14.5px; }
10063
+
10064
+ /* A module's app icon: its drawing in white on its own colors, rounded like the icons on a phone. */
10065
+ .mk-icon { --mk-size: 56px; flex: none; display: grid; place-items: center; width: var(--mk-size); height: var(--mk-size); border-radius: calc(var(--mk-size) * .235); color: #fff; background: linear-gradient(160deg, var(--mk-a, #94a3b8), var(--mk-b, #334155)); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .3), inset 0 -1px 0 rgba(0, 0, 0, .14), 0 1px 2px rgba(0, 0, 0, .14), 0 8px 18px -10px var(--mk-b, #334155); }
10066
+ .mk-icon svg { width: 58%; height: 58%; filter: drop-shadow(0 1px 1px rgba(0, 0, 0, .18)); }
10067
+
10068
+ /* The carousel: one featured module at a time, its picture beside what it does. */
10069
+ .mk-carousel { position: relative; }
10070
+ .mk-track { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; border-radius: 26px; box-shadow: 0 24px 48px -32px rgba(0, 0, 0, .55); }
10071
+ .mk-track::-webkit-scrollbar { display: none; }
10072
+ .mk-slide { --mk-a: #60a5fa; --mk-b: #1d4ed8; position: relative; flex: 0 0 100%; display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); align-items: center; min-height: 380px; overflow: hidden; scroll-snap-align: start; color: #fff; cursor: pointer; background: radial-gradient(90% 120% at 88% 12%, color-mix(in srgb, var(--mk-a) 70%, #fff) 0%, transparent 60%), linear-gradient(135deg, var(--mk-a), var(--mk-b)); }
10073
+ .mk-slide::before { content: ''; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(60% 80% at 0% 100%, rgba(0, 0, 0, .28), transparent 70%); }
10074
+ .mk-slide-words { position: relative; display: grid; align-content: center; gap: 10px; min-width: 0; padding: 40px 0 40px 46px; }
10075
+ .mk-slide-words small { font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; opacity: .86; }
10076
+ .mk-slide-words h2 { margin: 0; font-size: clamp(28px, 3.6vw, 42px); font-weight: 780; letter-spacing: -.025em; line-height: 1.04; text-wrap: balance; }
10077
+ .mk-slide-words p { margin: 0; max-width: 34ch; font-size: 16.5px; line-height: 1.45; opacity: .94; text-wrap: pretty; }
10078
+ .mk-slide-get { display: flex; align-items: center; gap: 12px; width: max-content; max-width: 100%; margin-top: 16px; padding: 10px 12px 10px 10px; border-radius: 18px; background: rgba(255, 255, 255, .16); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .18); box-sizing: border-box; }
10079
+ .mk-slide-get .mk-icon { box-shadow: 0 0 0 1px rgba(255, 255, 255, .4), 0 4px 10px -4px rgba(0, 0, 0, .4); }
10080
+ .mk-slide-who { display: grid; gap: 1px; min-width: 0; padding-right: 6px; }
10081
+ .mk-slide-who b { font-size: 14.5px; }
10082
+ .mk-slide-who span { font-size: 12.5px; opacity: .85; }
10083
+ .mk-slide-art { position: relative; align-self: stretch; display: grid; place-items: center; padding: 22px 26px 22px 0; }
10084
+ .mk-slide-art svg { width: 100%; height: auto; max-height: 340px; }
10085
+ .mk-arrow { position: absolute; bottom: 44px; display: grid; place-items: center; width: 40px; height: 40px; border: 0; border-radius: 50%; background: rgba(0, 0, 0, .3); color: #fff; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); cursor: pointer; opacity: 0; transition: opacity calc(160ms * var(--motion-scale, 1)) ease; }
10086
+ .mk-carousel:hover .mk-arrow, .mk-arrow:focus-visible { opacity: 1; }
10087
+ /* Both in the corner, out of the words' way. */
10088
+ .mk-arrow.prev { right: 64px; }
10089
+ .mk-arrow.next { right: 16px; }
10090
+ .mk-arrow svg { width: 18px; height: 18px; }
10091
+ .mk-dots { display: flex; justify-content: center; gap: 8px; margin-top: 14px; }
10092
+ .mk-dot { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--text) 22%, transparent); cursor: pointer; transition: width calc(220ms * var(--motion-scale, 1)) ease, background-color calc(220ms * var(--motion-scale, 1)) ease; }
10093
+ .mk-dot[aria-current="true"] { width: 24px; background: var(--text); }
10094
+
10095
+ /* The key: tonal while it is a question, solid on a module's page, quiet once it is on. */
10096
+ .mk-get { flex: none; height: 30px; padding: 0 16px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--madre-green) 15%, transparent); color: var(--madre-green); font-size: 13px; font-weight: 700; letter-spacing: .01em; white-space: nowrap; cursor: pointer; }
10097
+ .mk-get:hover { background: color-mix(in srgb, var(--madre-green) 24%, transparent); }
10098
+ .mk-get.on { background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text-2); }
10099
+ .mk-get.light { background: #fff; color: #111; }
10100
+ .mk-get.light:hover { background: rgba(255, 255, 255, .88); }
10101
+ .mk-get.big { height: 40px; padding: 0 22px; background: var(--madre-green); color: var(--madre-green-ink); font-size: 14.5px; }
10102
+ .mk-get.big:hover { filter: brightness(1.06); }
10103
+ .mk-get.big:is(.quiet, .on) { background: color-mix(in srgb, var(--text) 9%, transparent); color: var(--text); }
10104
+ .mk-get:disabled { opacity: .55; cursor: progress; }
10105
+ .mk-link { padding: 0; border: 0; background: none; color: var(--madre-green); font-size: 13.5px; font-weight: 600; cursor: pointer; }
10106
+ .mk-link:hover { text-decoration: underline; }
10107
+
10108
+ /* The shelves: rows of modules, three across where they fit, like a store's lists. */
10109
+ .mk-shelf { display: grid; gap: 6px; }
10110
+ .mk-shelf > header { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; padding-bottom: 10px; border-bottom: 1px solid var(--line); }
10111
+ .mk-shelf h2, .mk-section > h2 { margin: 0; font-size: 22px; font-weight: 720; letter-spacing: -.01em; }
10112
+ .mk-shelf > header p { margin: 0; color: var(--text-2); font-size: 14px; }
10113
+ .mk-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr)); column-gap: 30px; }
10114
+ .mk-row { display: flex; align-items: center; gap: 12px; min-width: 0; padding: 12px 0; border-bottom: 1px solid var(--line); }
10115
+ .mk-row-open { flex: 1; display: flex; align-items: center; gap: 14px; min-width: 0; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
10116
+ .mk-row-words { display: grid; gap: 3px; min-width: 0; }
10117
+ .mk-row-words b { font-size: 15px; font-weight: 650; }
10118
+ .mk-row-words span { display: -webkit-box; overflow: hidden; color: var(--text-2); font-size: 13px; line-height: 1.35; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
10119
+ .mk-row-side { display: grid; justify-items: center; gap: 3px; }
10120
+ .mk-row-side small { color: var(--text-3); font-size: 10.5px; }
10121
+ .mk-row-side small:empty { display: none; }
10122
+
10123
+ /* A module's page. */
10124
+ .mk-product { gap: 30px; }
10125
+ .mk-back { justify-self: start; display: inline-flex; align-items: center; gap: 2px; padding: 4px 8px 4px 0; border: 0; background: none; color: var(--madre-green); font-size: 15px; font-weight: 600; cursor: pointer; }
10126
+ .mk-back svg { width: 17px; height: 17px; }
10127
+ .mk-product-top { display: flex; align-items: center; gap: 28px; }
10128
+ .mk-product-words { display: grid; gap: 8px; min-width: 0; }
10129
+ .mk-product-words h1 { margin: 0; font-size: clamp(26px, 3.4vw, 36px); font-weight: 760; letter-spacing: -.02em; line-height: 1.08; }
10130
+ .mk-product-words > p:not(.mk-said) { margin: 0; color: var(--text-2); font-size: 16px; }
10131
+ .mk-keys { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 14px; margin-top: 8px; }
10132
+ .mk-state { color: var(--text-2); font-size: 13.5px; }
10133
+ .mk-only { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; color: var(--text-2); font-size: 13.5px; }
10134
+ .mk-select { height: 32px; max-width: 240px; padding: 0 10px; border: 0; border-radius: 9px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); font: inherit; font-size: 13.5px; }
10135
+ .mk-keys > .mk-select { height: 40px; }
10136
+ .mk-said { margin: 0; color: var(--text-2); font-size: 13.5px; line-height: 1.45; }
10137
+ .mk-said:empty { display: none; }
10138
+ .mk-said[data-tone="bad"] { color: var(--crit, #d93025); }
10139
+ .mk-said[data-tone="good"] { color: var(--madre-green); }
10140
+ .mk-facts { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 0; border-block: 1px solid var(--line); }
10141
+ .mk-facts > div { display: grid; justify-items: center; gap: 4px; padding: 14px 16px; text-align: center; }
10142
+ .mk-facts > div + div { border-left: 1px solid var(--line); }
10143
+ .mk-facts dt { color: var(--text-3); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
10144
+ .mk-facts dd { margin: 0; font-size: 14.5px; font-weight: 600; }
10145
+ .mk-section { display: grid; gap: 14px; }
10146
+ .mk-shot { display: grid; place-items: center; width: min(760px, 100%); aspect-ratio: 16 / 9; padding: 3%; overflow: hidden; border-radius: 22px; background: radial-gradient(90% 120% at 85% 10%, color-mix(in srgb, var(--mk-a) 70%, #fff) 0%, transparent 60%), linear-gradient(135deg, var(--mk-a, #94a3b8), var(--mk-b, #334155)); box-sizing: border-box; }
10147
+ .mk-shot svg { width: min(100%, 720px); height: 100%; }
10148
+ .mk-about { margin: 0; max-width: 72ch; font-size: 15.5px; line-height: 1.6; }
10149
+ .mk-touches { overflow: hidden; border: 1px solid var(--line); border-radius: 16px; }
10150
+ .mk-touch { display: grid; grid-template-columns: 110px minmax(0, 1fr); gap: 14px; padding: 12px 16px; font-size: 14px; line-height: 1.45; }
10151
+ .mk-touch + .mk-touch { border-top: 1px solid var(--line); }
10152
+ .mk-touch span:first-child { color: var(--text-3); }
10153
+
10154
+ /* MODULES in Home: one card per module, a switch for every project and a chip for each one. */
10155
+ .mk-card { display: grid; gap: 12px; padding: 16px 18px; border-radius: 18px; background: var(--panel); box-shadow: 0 0 0 1px var(--line); }
10156
+ .mk-card.focused { box-shadow: 0 0 0 2px var(--madre-green); }
10157
+ .mk-card-head { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 16px; }
10158
+ .mk-card-open { flex: 1; display: flex; align-items: center; gap: 14px; min-width: 220px; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
10159
+ .mk-card-words { display: grid; gap: 2px; min-width: 0; }
10160
+ .mk-card-words b { font-size: 15px; font-weight: 650; }
10161
+ .mk-card-words span { color: var(--text-2); font-size: 13px; }
10162
+ .mk-all { display: flex; align-items: center; gap: 10px; color: var(--text-2); font-size: 13.5px; }
10163
+ .mk-switch { display: flex; flex: none; width: 44px; height: 26px; padding: 3px; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--text) 18%, transparent); cursor: pointer; transition: background-color calc(160ms * var(--motion-scale, 1)) ease; }
10164
+ .mk-knob { width: 20px; height: 20px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, .3); transition: transform calc(180ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1); }
10165
+ .mk-switch.on { background: var(--madre-green); }
10166
+ .mk-switch.on .mk-knob { transform: translateX(18px); }
10167
+ .mk-switch:disabled, .mk-chip:disabled { opacity: .55; cursor: progress; }
10168
+ .mk-chips { display: flex; flex-wrap: wrap; gap: 8px; padding-left: 58px; }
10169
+ .mk-chip { padding: 6px 12px; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text-2); font-size: 13px; cursor: pointer; }
10170
+ span.mk-chip { cursor: default; }
10171
+ .mk-chip.on { background: color-mix(in srgb, var(--madre-green) 16%, transparent); color: var(--madre-green); font-weight: 600; }
10172
+ /* The page's own notice, over the Market while it is open, where a store says things: at the bottom. */
10173
+ html.mk-open .toast { z-index: 2147482995 !important; left: 50% !important; right: auto !important; top: auto !important; bottom: calc(28px + env(safe-area-inset-bottom, 0px)) !important; }
10174
+
10175
+ @media (max-width: 760px) {
10176
+ .mk-bar { grid-template-columns: auto minmax(0, 1fr); padding-inline: 14px; }
10177
+ .mk-bar-mid { justify-self: end; }
10178
+ .mk-search { grid-column: 1 / -1; justify-self: stretch; width: 100%; }
10179
+ .mk-search[hidden] { display: none !important; }
10180
+ .mk-tab { min-width: 0; padding-inline: 14px; }
10181
+ .mk-page { gap: 28px; padding: 20px 16px calc(52px + env(safe-area-inset-bottom, 0px)); }
10182
+ .mk-slide { grid-template-columns: minmax(0, 1fr); min-height: 0; }
10183
+ .mk-slide-get { width: 100%; }
10184
+ .mk-slide-who { flex: 1; }
10185
+ .mk-slide-words { padding: 26px 22px 6px; }
10186
+ .mk-slide-words p { max-width: none; }
10187
+ .mk-slide-art { padding: 4px 14px 18px; }
10188
+ .mk-slide-art svg { max-height: 230px; }
10189
+ .mk-arrow { display: none; }
10190
+ .mk-product-top { flex-direction: column; align-items: flex-start; gap: 16px; }
10191
+ .mk-product-top > .mk-icon { --mk-size: 96px !important; }
10192
+ .mk-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
10193
+ .mk-facts > div:nth-child(3) { border-left: 0; }
10194
+ .mk-facts > div:nth-child(n + 3) { border-top: 1px solid var(--line); }
10195
+ .mk-touch { grid-template-columns: 1fr; gap: 2px; }
10196
+ .mk-chips { padding-left: 0; }
10197
+ }
10198
+ @media (prefers-reduced-motion: reduce) { .mk, .mk-dot, .mk-knob { transition: none; } }
10199
+
10200
+ /* KEYS BESIDE THE VERSION (attribution.js, drawColophonKeys, 2026-10-18): what a module puts in the
10201
+ corner, drawn by MADRE. A mark in the same pill as the version; hovered or focused, a card above
10202
+ it with the module's words and the key that opens its address. */
10203
+ .colophon-keys { display: inline-flex; align-items: center; gap: 2px; margin-left: 8px; padding-left: 8px; border-left: 1px solid color-mix(in srgb, var(--text) 18%, transparent); }
10204
+ .colophon-key { position: relative; display: inline-flex; }
10205
+ .colophon-key-mark { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; color: var(--text-2); text-decoration: none; transition: color calc(160ms * var(--motion-scale, 1)) ease, transform calc(200ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1); }
10206
+ .colophon-key-mark svg { width: 14px; height: 14px; }
10207
+ .colophon-key.heart .colophon-key-mark { color: #e5484d; }
10208
+ .colophon-key:is(:hover, :focus-within) .colophon-key-mark { transform: scale(1.18); }
10209
+ .colophon-key.heart:is(:hover, :focus-within) .colophon-key-mark svg { animation: colophon-beat calc(900ms * var(--motion-scale, 1)) ease-in-out infinite; }
10210
+ @keyframes colophon-beat { 0%, 100% { transform: scale(1); } 20% { transform: scale(1.18); } 40% { transform: scale(.96); } 60% { transform: scale(1.1); } }
10211
+ .colophon-key-mark:focus-visible { outline: 2px solid var(--madre-green); outline-offset: 2px; }
10212
+ .colophon-card { position: absolute; right: -10px; bottom: calc(100% + 12px); z-index: 20; display: grid; gap: 6px; width: max-content; max-width: 260px; padding: 12px 14px; border-radius: 14px; background: var(--surface, var(--panel)); color: var(--text); font-family: var(--read); font-size: 12.5px; font-weight: 450; letter-spacing: 0; line-height: 1.45; text-align: left; text-transform: none; white-space: normal; user-select: text; box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 14%, transparent), 0 12px 28px -8px rgba(0, 0, 0, .45); opacity: 0; visibility: hidden; transform: translateY(4px); transition: opacity calc(160ms * var(--motion-scale, 1)) ease, transform calc(200ms * var(--motion-scale, 1)) ease, visibility 0s linear calc(200ms * var(--motion-scale, 1)); }
10213
+ /* A bridge over the gap, so the pointer can travel from the mark to the card without losing it. */
10214
+ .colophon-card::after { content: ''; position: absolute; left: 0; right: 0; top: 100%; height: 14px; }
10215
+ .colophon-key:is(:hover, :focus-within) .colophon-card { opacity: 1; visibility: visible; transform: none; transition-delay: 0s; }
10216
+ .colophon-card b { font-size: 13px; font-weight: 650; }
10217
+ .colophon-card span { color: var(--text-2); }
10218
+ .colophon-card-go { justify-self: start; margin-top: 2px; padding: 6px 12px; border-radius: 99px; background: var(--madre-green); color: var(--madre-green-ink); font-weight: 650; text-decoration: none; }
10219
+ .colophon-card-go:hover { filter: brightness(1.06); }
10220
+ @media (prefers-reduced-motion: reduce) { .colophon-key.heart:is(:hover, :focus-within) .colophon-key-mark svg { animation: none; } }