@jossuealcala/madre 0.7.2 → 1.0.1

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 (172) hide show
  1. package/CHANGELOG.md +817 -1
  2. package/CONTRIBUTING.md +5 -1
  3. package/NOTICE +20 -1
  4. package/README.md +99 -34
  5. package/TRADEMARKS.md +65 -0
  6. package/bin/madre.mjs +30 -10
  7. package/docs/INTERNALS.md +2 -2
  8. package/docs/REFERENCE.md +159 -82
  9. package/docs/SDK.md +23 -19
  10. package/docs/madre-banner.png +0 -0
  11. package/package.json +4 -3
  12. package/public/app.js +11668 -4219
  13. package/public/assets/brand/Geist-latin-ext.woff2 +0 -0
  14. package/public/assets/brand/Geist-latin.woff2 +0 -0
  15. package/public/assets/brand/GeistMono-latin-ext.woff2 +0 -0
  16. package/public/assets/brand/GeistMono-latin.woff2 +0 -0
  17. package/public/assets/brand/JetBrainsMono-latin-ext.woff2 +0 -0
  18. package/public/assets/brand/JetBrainsMono-latin.woff2 +0 -0
  19. package/public/assets/brand/OFL-Geist.txt +93 -0
  20. package/public/assets/brand/OFL-GeistMono.txt +93 -0
  21. package/public/assets/brand/OFL-JetBrainsMono.txt +93 -0
  22. package/public/assets/brand/OFL-Sora.txt +93 -0
  23. package/public/assets/brand/Sora-latin-ext.woff2 +0 -0
  24. package/public/assets/brand/Sora-latin.woff2 +0 -0
  25. package/public/assets/brand/madre-app-180.png +0 -0
  26. package/public/assets/brand/madre-app-192.png +0 -0
  27. package/public/assets/brand/madre-app-512.png +0 -0
  28. package/public/assets/brand/madre-app.svg +1 -0
  29. package/public/assets/brand/madre-favicon.svg +1 -0
  30. package/public/assets/news/1.0/alerts.webp +0 -0
  31. package/public/assets/news/1.0/bar.webp +0 -0
  32. package/public/assets/news/1.0/finder.webp +0 -0
  33. package/public/assets/news/1.0/github.webp +0 -0
  34. package/public/assets/news/1.0/intents.webp +0 -0
  35. package/public/assets/news/1.0/looks.webp +0 -0
  36. package/public/assets/news/1.0/modules.webp +0 -0
  37. package/public/assets/news/1.0/mother.webp +0 -0
  38. package/public/assets/news/1.0/nostromo.webp +0 -0
  39. package/public/assets/news/1.0/permissions.webp +0 -0
  40. package/public/assets/news/1.0/room.webp +0 -0
  41. package/public/assets/news/1.0/settings.webp +0 -0
  42. package/public/assets/wallpapers/biznaga.webp +0 -0
  43. package/public/assets/wallpapers/canela.webp +0 -0
  44. package/public/assets/wallpapers/jarrito.webp +0 -0
  45. package/public/assets/wallpapers/magna.webp +0 -0
  46. package/public/assets/wallpapers/oceano.webp +0 -0
  47. package/public/assets/wallpapers/paraiso.webp +0 -0
  48. package/public/assets/wallpapers/quila.webp +0 -0
  49. package/public/assets/wallpapers/tradicion.webp +0 -0
  50. package/public/assets/wallpapers/tropical.webp +0 -0
  51. package/public/assets/wallpapers/urbania.webp +0 -0
  52. package/public/assets/wallpapers/ventura.webp +0 -0
  53. package/public/assets/wallpapers/xico.webp +0 -0
  54. package/public/brands.js +28 -2
  55. package/public/editor.js +744 -0
  56. package/public/es.js +3443 -1425
  57. package/public/i18n.js +1 -1
  58. package/public/index.html +201 -175
  59. package/public/inquiry.js +11 -11
  60. package/public/loader.js +79 -0
  61. package/public/macroverso.js +1517 -0
  62. package/public/manifest.webmanifest +14 -0
  63. package/public/nostromo-engine.js +2222 -0
  64. package/public/resay.js +24 -0
  65. package/public/review-ask.js +85 -0
  66. package/public/salas-mac.css +1281 -0
  67. package/public/salas-mac.html +158 -0
  68. package/public/salas-mac.js +4593 -0
  69. package/public/salas.css +85 -0
  70. package/public/salas.html +47 -0
  71. package/public/salas.js +200 -0
  72. package/public/styles.css +6372 -426
  73. package/public/touch.js +83 -0
  74. package/public/tour-chapters.js +452 -0
  75. package/public/tour.js +546 -0
  76. package/public/troubleshooting.js +160 -141
  77. package/src/adapters/codex.mjs +46 -6
  78. package/src/adapters/gemini.mjs +30 -10
  79. package/src/adapters/madre.mjs +110 -18
  80. package/src/adapters/process.mjs +42 -2
  81. package/src/auth-probe.mjs +31 -8
  82. package/src/bridge/devices.mjs +202 -0
  83. package/src/bridge/handoff.mjs +45 -0
  84. package/src/bridge/host.mjs +82 -0
  85. package/src/bridge/network.mjs +133 -0
  86. package/src/bridge/policy.mjs +89 -0
  87. package/src/bridge/qr.mjs +287 -0
  88. package/src/bridge/server.mjs +269 -0
  89. package/src/capabilities.mjs +5 -9
  90. package/src/chats.mjs +59 -22
  91. package/src/checkpoint.mjs +137 -35
  92. package/src/choices.mjs +18 -3
  93. package/src/cli-args.mjs +12 -1
  94. package/src/commands.mjs +15 -15
  95. package/src/config.mjs +73 -9
  96. package/src/conversation-context.mjs +5 -2
  97. package/src/credentials.mjs +80 -0
  98. package/src/dataset.mjs +3 -1
  99. package/src/directives.mjs +6 -11
  100. package/src/enlaces.mjs +451 -0
  101. package/src/event-store.mjs +55 -10
  102. package/src/exam.mjs +5 -5
  103. package/src/extensions.mjs +31 -12
  104. package/src/file-ops.mjs +23 -0
  105. package/src/files.mjs +52 -2
  106. package/src/github.mjs +407 -0
  107. package/src/heartbeat.mjs +55 -0
  108. package/src/json-file.mjs +63 -0
  109. package/src/lease.mjs +2 -2
  110. package/src/lobby-work.mjs +103 -0
  111. package/src/local-ai.mjs +48 -0
  112. package/src/looks.mjs +88 -0
  113. package/src/maturity.mjs +3 -3
  114. package/src/mcp/github-server.mjs +164 -0
  115. package/src/mcp/image-server.mjs +1 -1
  116. package/src/mcp/memory-server.mjs +11 -3
  117. package/src/memory.mjs +38 -12
  118. package/src/models.mjs +127 -5
  119. package/src/modules/ahp.mjs +4 -4
  120. package/src/modules/ash.mjs +1 -1
  121. package/src/modules/bishop-plan.mjs +207 -0
  122. package/src/modules/bishop.mjs +645 -0
  123. package/src/modules/choices.mjs +2 -2
  124. package/src/modules/correo.mjs +1 -1
  125. package/src/modules/enlaces.mjs +255 -0
  126. package/src/modules/git-pulse.mjs +2 -2
  127. package/src/modules/github.mjs +322 -0
  128. package/src/modules/image-studio.mjs +3 -3
  129. package/src/modules/index.mjs +18 -4
  130. package/src/modules/intents-calibration.mjs +338 -0
  131. package/src/modules/intents-desk.mjs +481 -0
  132. package/src/modules/intents-observe.mjs +266 -0
  133. package/src/modules/intents-policy.mjs +414 -0
  134. package/src/modules/intents-try.mjs +91 -0
  135. package/src/modules/intents.mjs +145 -0
  136. package/src/modules/ollama.mjs +18 -6
  137. package/src/modules/playwright.mjs +121 -11
  138. package/src/modules/ripley.mjs +1 -1
  139. package/src/modules/runs.mjs +2 -2
  140. package/src/modules/sdk.mjs +10 -4
  141. package/src/ollama.mjs +6 -1
  142. package/src/outbound.mjs +36 -17
  143. package/src/override.mjs +100 -0
  144. package/src/ports.mjs +23 -1
  145. package/src/prices.mjs +72 -0
  146. package/src/privacy.mjs +30 -11
  147. package/src/quota-sources.mjs +0 -8
  148. package/src/request-guard.mjs +1 -1
  149. package/src/review-ask.mjs +111 -0
  150. package/src/room/archivist.mjs +55 -37
  151. package/src/room/budget.mjs +17 -5
  152. package/src/room/control.mjs +70 -7
  153. package/src/room/economy.mjs +35 -7
  154. package/src/room/escalation.mjs +3 -0
  155. package/src/room/guard.mjs +26 -2
  156. package/src/room/prompt.mjs +22 -15
  157. package/src/room/runs.mjs +84 -21
  158. package/src/room/vectors.mjs +19 -4
  159. package/src/room.mjs +411 -84
  160. package/src/router.mjs +3 -1
  161. package/src/runs.mjs +23 -5
  162. package/src/salas.mjs +313 -0
  163. package/src/sentinel-errors.mjs +1 -1
  164. package/src/server-sentinel.mjs +124 -0
  165. package/src/server.mjs +1864 -178
  166. package/src/setup.mjs +1 -0
  167. package/src/tour.mjs +174 -0
  168. package/src/updates.mjs +48 -8
  169. package/src/usage-sentinel.mjs +1 -1
  170. package/src/verdict.mjs +7 -7
  171. package/src/whats-new.mjs +160 -0
  172. package/docs/madre-banner.svg +0 -25
@@ -0,0 +1,1281 @@
1
+ /* SALAS on the Mac (salas-mac.html). The tokens are the room's (styles.css, loaded first): the same
2
+ ground, panels, bevel and accent, so leaving a room for SALAS is not leaving MADRE. The sky is
3
+ painted once, in CSS: three glows and two layers of fixed stars, nothing that moves. */
4
+ body.salas-mac {
5
+ --s-acc: var(--phosphor);
6
+ --s-acc-ink: var(--phosphor-ink);
7
+ margin: 0; min-height: 100vh; background: var(--bg); color: var(--text);
8
+ font-family: var(--read); font-size: 15px; line-height: 1.45;
9
+ }
10
+ :root[data-accent] body.salas-mac { --s-acc: var(--acc); --s-acc-ink: var(--acc-ink); }
11
+ /* Buttons and links speak in the page's letter unless a key says otherwise (no weight of its own). */
12
+ :where(.salas-mac) :where(button, a, input) { font: inherit; }
13
+ .sm-sky {
14
+ position: fixed; inset: 0; z-index: 0; pointer-events: none;
15
+ background:
16
+ radial-gradient(1100px 620px at 12% -12%, color-mix(in srgb, var(--s-acc) 16%, transparent), transparent 62%),
17
+ radial-gradient(900px 560px at 108% 8%, color-mix(in srgb, #3dc6ff 11%, transparent), transparent 62%),
18
+ radial-gradient(1200px 700px at 50% 122%, color-mix(in srgb, #ff2a1f 9%, transparent), transparent 64%);
19
+ }
20
+ /* A wallpaper, when one is chosen: the room's own (styles.css, --wp-*), with its veil, its «mesh»
21
+ and its blur, in place of the sky; the stars go with the sky. */
22
+ :root[data-wallpaper="jarrito"] .sm-sky { background: var(--wp-jarrito); }
23
+ :root[data-wallpaper="canela"] .sm-sky { background: var(--wp-canela); }
24
+ :root[data-wallpaper="paradise"] .sm-sky { background: var(--wp-paradise); }
25
+ :root[data-wallpaper="ventura"] .sm-sky { background: var(--wp-ventura); }
26
+ :root[data-wallpaper="magna"] .sm-sky { background: var(--wp-magna); }
27
+ :root[data-wallpaper="biznaga"] .sm-sky { background: var(--wp-biznaga); }
28
+ :root[data-wallpaper="oceano"] .sm-sky { background: var(--wp-oceano); }
29
+ :root[data-wallpaper="quila"] .sm-sky { background: var(--wp-quila); }
30
+ :root[data-wallpaper="xico"] .sm-sky { background: var(--wp-xico); }
31
+ :root[data-wallpaper="tropical"] .sm-sky { background: var(--wp-tropical); }
32
+ :root[data-wallpaper="tradicion"] .sm-sky { background: var(--wp-tradicion); }
33
+ :root[data-wallpaper="urbania"] .sm-sky { background: var(--wp-urbania); }
34
+ :root[data-wallpaper] .sm-sky { inset: calc(-2 * var(--wp-blur-on, 0px)); filter: blur(var(--wp-blur-on, 0px)); }
35
+ :root[data-wallpaper] .sm-sky::after { display: none; }
36
+ :root:not([data-scheme="light"]) .sm-sky::after {
37
+ content: ''; position: absolute; inset: 0; opacity: .5;
38
+ background-image:
39
+ radial-gradient(1px 1px at 20px 30px, rgba(255, 255, 255, .55), transparent 60%),
40
+ radial-gradient(1px 1px at 140px 90px, rgba(255, 255, 255, .35), transparent 60%),
41
+ radial-gradient(1.4px 1.4px at 90px 160px, rgba(190, 220, 255, .45), transparent 60%),
42
+ radial-gradient(1px 1px at 210px 210px, rgba(255, 240, 220, .3), transparent 60%);
43
+ background-size: 240px 240px, 240px 240px, 240px 240px, 240px 240px;
44
+ }
45
+
46
+ /* THE BAR, as a room's (styles.css, .shell > .bar and .bar-home): the surface as glass, the sheen,
47
+ the bevel and the layered shadow, mono at 11 px; a group of its own on the right for reload and
48
+ settings. It stays at the top while the lobby scrolls under it. */
49
+ .sm-top { position: sticky; top: 0; z-index: 12; display: flex; align-items: stretch; gap: 10px; max-width: 1440px; margin: 0 auto; padding: 10px 20px 0; }
50
+ .sm-topbar { position: relative; display: flex; align-items: center; gap: 14px; min-width: 0; height: 48px; padding: 9px 12px 9px 16px; border-radius: 20px; background-color: color-mix(in srgb, var(--bg) 93%, transparent); background-image: var(--sheen); -webkit-backdrop-filter: blur(22px) saturate(1.7); backdrop-filter: blur(22px) saturate(1.7); box-shadow: var(--bevel), 0 1px 2px rgba(0, 0, 0, .45), 0 10px 24px -10px rgba(0, 0, 0, .6), 16px 24px 50px -24px rgba(0, 0, 0, .55); font-family: var(--mono); font-size: 11px; letter-spacing: .04em; color: var(--text-2); }
51
+ :root[data-scheme="light"] .sm-topbar { background-color: color-mix(in srgb, #ffffff 94%, transparent); box-shadow: var(--bevel), 0 1px 2px rgba(20, 40, 60, .12), 0 10px 24px -12px rgba(20, 40, 60, .24), 16px 24px 50px -26px rgba(20, 40, 60, .28); }
52
+ .sm-topbar:first-child { flex: 1; }
53
+ .sm-tb-home { flex: none; gap: 6px; padding: 9px 10px; }
54
+ .sm-brand { display: inline-flex; align-items: center; flex: none; color: var(--text); border-radius: 8px; padding: 4px 2px; }
55
+ .sm-brand .brand-logo { height: 15px; }
56
+ .sm-back-room { display: inline-flex; align-items: center; gap: 3px; flex: none; height: 26px; padding: 0 9px 0 5px; border-radius: 6px; background: var(--surface, var(--panel)); box-shadow: var(--key-rest); color: var(--text-2); font-weight: 600; text-decoration: none; }
57
+ .sm-back-room svg { width: 14px; height: 14px; }
58
+ .sm-back-room:hover { color: var(--text); box-shadow: var(--key-over, var(--key-rest)); }
59
+ .sm-crumb { flex: none; font-weight: 600; color: var(--text); }
60
+ .sm-crumb::before { content: '/ '; color: var(--text-3); font-weight: 400; }
61
+ .sm-live { display: inline-flex; align-items: center; gap: 6px; flex: none; color: var(--text-2); }
62
+ .sm-live i { width: 7px; height: 7px; border-radius: 50%; background: var(--session-ok); }
63
+ .sm-live.is-off i { background: var(--session-bad); }
64
+ .sm-live.is-off { color: var(--session-bad); }
65
+ /* The projects open: a key each, its state as a lamp — calm, working (it beats), waiting (ringed), older. */
66
+ .sm-tb-open { display: flex; align-items: center; gap: 6px; min-width: 0; overflow: hidden; padding: 3px; margin: -3px; }
67
+ .sm-tb-room { display: inline-flex; align-items: center; gap: 6px; flex: none; max-width: 170px; height: 26px; padding: 0 10px; border: 0; border-radius: 6px; background: var(--surface, var(--panel)); box-shadow: var(--key-rest); color: var(--text); font-family: var(--mono); font-size: 11px; font-weight: 600; letter-spacing: .02em; text-decoration: none; white-space: nowrap; cursor: pointer; transition: box-shadow calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
68
+ .sm-tb-room span { overflow: hidden; text-overflow: ellipsis; }
69
+ .sm-tb-room i { flex: none; width: 7px; height: 7px; border-radius: 50%; background: var(--session-ok); }
70
+ .sm-tb-room.is-working i { background: var(--s-acc); animation: sm-beat 1.4s ease-in-out infinite; }
71
+ .sm-tb-room.is-waiting i { background: var(--s-acc); box-shadow: 0 0 0 3px color-mix(in srgb, var(--s-acc) 28%, transparent); }
72
+ .sm-tb-room:is(.is-outdated, .is-quiet) i { background: var(--session-wait); }
73
+ .sm-tb-room.is-more { color: var(--text-2); font-weight: 500; }
74
+ /* Six rooms or more: each a square key with its two letters, the lamp on its corner. */
75
+ .sm-tb-mono { display: none; }
76
+ .sm-tb-open.is-square > .sm-tb-room:not(.is-more) { position: relative; justify-content: center; width: 26px; padding: 0; }
77
+ .sm-tb-open.is-square > .sm-tb-room:not(.is-more) > span { display: none; }
78
+ .sm-tb-open.is-square > .sm-tb-room:not(.is-more) > .sm-tb-mono { display: block; font-family: var(--read); font-size: 11px; font-weight: 700; letter-spacing: 0; }
79
+ .sm-tb-open.is-square > .sm-tb-room:not(.is-more) > i { position: absolute; top: -2px; right: -2px; width: 8px; height: 8px; box-shadow: 0 0 0 2px var(--bg); }
80
+ .sm-tb-open.is-square > .sm-tb-room.is-waiting > i { box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px color-mix(in srgb, var(--s-acc) 35%, transparent); }
81
+ .sm-tb-open.is-square > .sm-tb-room.is-asleep > i { background: var(--surface, var(--panel)); box-shadow: 0 0 0 2px var(--bg), inset 0 0 0 1.5px var(--text-3); }
82
+ .sm-tb-room:hover { box-shadow: var(--key-over, var(--key-rest)); }
83
+ .sm-tb-room:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
84
+ /* The agents, with their sessions, as the room shows its crew. */
85
+ .sm-tb-agents { display: flex; align-items: center; gap: 8px; flex: none; }
86
+ .sm-agent-key { position: relative; flex: none; padding: 0; border: 0; border-radius: 50%; background: none; cursor: pointer; }
87
+ .sm-agent-key::after { content: ''; position: absolute; right: -2px; bottom: -2px; width: 8px; height: 8px; border-radius: 50%; background: var(--session-ok); box-shadow: 0 0 0 2px var(--surface, var(--panel)); }
88
+ .sm-agent-key.wait::after { background: var(--session-wait); }
89
+ .sm-agent-key.bad::after { background: var(--session-bad); }
90
+ .sm-agent-key:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
91
+ /* What asks for the person: who waits, a newer MADRE. */
92
+ .sm-pill { display: inline-flex; align-items: center; gap: 6px; flex: none; height: 26px; padding: 0 11px; border-radius: 999px; font-family: var(--mono); font-size: 11px; font-weight: 600; letter-spacing: .02em; text-decoration: none; white-space: nowrap; }
93
+ .sm-pill.is-wait { background: color-mix(in srgb, var(--s-acc) 16%, transparent); color: color-mix(in srgb, var(--s-acc) 70%, var(--text)); }
94
+ .sm-pill.is-wait i { width: 7px; height: 7px; border-radius: 50%; background: var(--s-acc); animation: sm-beat 1.4s ease-in-out infinite; }
95
+ .sm-pill.is-update { background: color-mix(in srgb, var(--session-wait) 18%, transparent); color: var(--text); }
96
+ .sm-badge { display: inline-grid; place-items: center; min-width: 16px; height: 16px; margin-left: 2px; padding: 0 4px; border-radius: 999px; background: var(--s-acc); color: var(--s-acc-ink); font-family: var(--mono); font-size: 9.5px; font-weight: 600; letter-spacing: 0; }
97
+ @media (max-width: 1180px) { .sm-tb-agents { display: none; } }
98
+ @media (max-width: 980px) { .sm-tb-open, .sm-live span, .sm-pill.is-update { display: none; } }
99
+ @media (max-width: 720px) { .sm-crumb, .sm-barkey span { display: none; } .sm-top { padding: 8px 10px 0; } }
100
+ .sm-brand:focus-visible { outline: 2px solid var(--s-acc); outline-offset: 3px; }
101
+ .sm-spacer { flex: 1; }
102
+ /* The bar's keys are the room's bar keys (styles.css, .mother-button, .tree-button, .stop-all). */
103
+ .sm-barkey, .sm-stop { display: inline-flex; align-items: center; gap: 7px; height: 26px; padding: 0 10px; border: 0; border-radius: 6px; font-family: var(--mono); font-size: 10px; font-weight: 400; letter-spacing: .18em; text-transform: uppercase; white-space: nowrap; cursor: pointer; }
104
+ .sm-barkey svg, .sm-stop svg { width: 14px; height: 14px; }
105
+ .sm-stop { box-shadow: inset 0 0 0 1px var(--terror); background: color-mix(in srgb, var(--terror) 12%, transparent); color: var(--terror); }
106
+ .sm-stop:hover, .sm-stop.armed { background: var(--terror); color: #fff; }
107
+ /* Whatever the page hides stays hidden, whatever its class lays out. */
108
+ .salas-mac [hidden] { display: none !important; }
109
+
110
+ /* An icon key: the room's, the surface it stands on raised by the one light. In the top bar it is
111
+ the bar's (28 × 26, 6 px corners); beside a text key it is that key's height and corners. */
112
+ .sm-icon-key { flex: none; display: inline-grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 0; border-radius: 9px; background: var(--surface, var(--panel)); color: var(--text-2); box-shadow: var(--key-rest); text-decoration: none; cursor: pointer; transition: box-shadow calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out), color calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
113
+ .sm-icon-key.bar { width: 28px; height: 26px; border-radius: 6px; }
114
+ .sm-icon-key:hover { color: var(--text); box-shadow: var(--key-over, var(--key-rest)); }
115
+ .sm-icon-key:active { box-shadow: var(--key-down); }
116
+ .sm-icon-key:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
117
+ .sm-icon-key svg { width: 16px; height: 16px; }
118
+ /* A link that cannot be followed yet (BISHOP waking) looks and acts like a disabled key. */
119
+ .sm-btn[aria-disabled="true"], .sm-icon-key[aria-disabled="true"] { opacity: .45; box-shadow: none; pointer-events: none; }
120
+
121
+ .sm-main { position: relative; z-index: 1; max-width: 1280px; margin: 0 auto; padding: 14px 40px 56px; }
122
+ .sm-hero { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 16px 24px; margin: 26px 0 26px; }
123
+ .sm-hero h1 { margin: 0; font-size: clamp(40px, 5vw, 60px); font-weight: 700; letter-spacing: -.025em; line-height: 1.02; }
124
+ /* The hero's tools stand on a raised bar, as the room's keys stand on its bar: the search and the
125
+ rail sink into it (the room's .settings-search and .sx-seg), the key that adds stands up. */
126
+ .sm-tools { display: flex; flex-wrap: nowrap; align-items: center; gap: 8px; padding: 6px; border-radius: 14px; background: var(--surface, var(--panel)); }
127
+ .sm-tools .sm-search { flex: 0 1 260px; min-width: 180px; }
128
+ .sm-tools .sm-search input::-webkit-search-cancel-button { cursor: pointer; }
129
+
130
+ /* THE BENTO: twelve columns, rows of 118 px that grow when a tile needs more. A tile stands on the
131
+ lobby as the room's conversation stands on its wallpaper (styles.css, THE CANVAS IN PLANES): a
132
+ solid surface, one contact edge under it and one short lift, from the same formula and the same
133
+ depths. No light around it, no rim, no glow; the one that waits for you is the only one with a
134
+ ring (--ring), and a project under the hand comes one plane nearer. */
135
+ .sm-bento { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); grid-auto-rows: minmax(118px, auto); gap: 16px; }
136
+ .sm-bento + .sm-bento, .sm-none + .sm-bento, .sm-bento + .sm-none { margin-top: 16px; }
137
+ .sm-projects, .sm-low { grid-auto-rows: auto; }
138
+ .sm-tile { position: relative; display: flex; flex-direction: column; gap: 10px; min-width: 0; padding: 18px 20px; border-radius: 22px; background: var(--surface, var(--panel)); }
139
+ :is(.sm-tile, .sm-tools) {
140
+ --plane: var(--depth-system, 40);
141
+ box-shadow:
142
+ var(--ring, 0 0 #0000),
143
+ 0 1px 1px rgb(var(--plane-ink) / min(.4, calc(var(--plane) * .0017 * var(--plane-k)))),
144
+ 0 calc(var(--plane) * .16px) calc(var(--plane) * .38px) calc(var(--plane) * -.2px) rgb(var(--plane-ink) / min(.55, calc(var(--plane) * .0042 * var(--plane-k))));
145
+ }
146
+ .c-3 { grid-column: span 3; } .c-4 { grid-column: span 4; } .c-5 { grid-column: span 5; } .c-8 { grid-column: span 8; }
147
+ .r-1 { grid-row: span 1; } .r-2 { grid-row: span 2; } .r-3 { grid-row: span 3; }
148
+ .sm-projects > .sm-tile { grid-column: span 3; }
149
+ .sm-tile-head { display: flex; align-items: center; justify-content: space-between; gap: 10px; min-width: 0; }
150
+ .sm-tile-head h2 { margin: 0; font-family: var(--read); font-size: 15px; font-weight: 650; letter-spacing: -.005em; color: var(--text); }
151
+ .sm-tile-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: auto; }
152
+ .sm-hint { margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--text-2); }
153
+ .sm-big { font-size: 30px; font-weight: 700; letter-spacing: -.02em; line-height: 1; font-variant-numeric: tabular-nums; color: var(--session-ok); }
154
+
155
+ /* A project: its name, where it lives, how it is, what it said last and what it holds. */
156
+ .sm-card { gap: 9px; transition: transform 180ms var(--ease-out, ease-out), box-shadow 180ms var(--ease-out, ease-out); }
157
+ .sm-card:hover { transform: translateY(-2px); --plane: var(--depth-user, 60); }
158
+ .sm-card.is-waiting { --ring: inset 0 0 0 1.5px color-mix(in srgb, var(--s-acc) 70%, transparent); }
159
+ .sm-card.is-asleep { background: color-mix(in srgb, var(--surface, var(--panel)) 64%, transparent); }
160
+ .sm-card.is-asleep h3 { color: var(--text-2); }
161
+ .sm-card-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
162
+ .sm-card-head h3 { flex: 1; min-width: 0; margin: 0; font-size: 18px; font-weight: 650; letter-spacing: -.01em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
163
+ /* Chips in a flat tone (the room's, 6 Oct): seven-pixel corners, no rim, no shadow. */
164
+ .sm-chip { flex: none; padding: 3px 8px; border-radius: 7px; font-family: var(--mono); font-size: 11px; letter-spacing: .02em; }
165
+ .sm-chip.port { color: var(--text-2); background: color-mix(in srgb, var(--text) 7%, transparent); }
166
+ .sm-chip.here { color: color-mix(in srgb, var(--s-acc) 72%, var(--text)); background: color-mix(in srgb, var(--s-acc) 16%, transparent); font-family: var(--read); font-weight: 650; }
167
+ .sm-path { margin: -5px 0 0; font-family: var(--mono); font-size: 11.5px; color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
168
+
169
+ .sm-state { display: flex; align-items: center; gap: 8px; margin: 0; font-size: 13px; color: var(--text-2); }
170
+ .sm-state .dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--session-ok); }
171
+ .is-working .sm-state .dot { background: var(--s-acc); animation: sm-beat 1.4s ease-in-out infinite; }
172
+ .is-waiting .sm-state { color: color-mix(in srgb, var(--s-acc) 62%, var(--text)); font-weight: 600; }
173
+ .is-waiting .sm-state .dot { background: var(--s-acc); }
174
+ .is-asleep .sm-state .dot { background: transparent; box-shadow: inset 0 0 0 1.5px var(--text-3); }
175
+ .is-outdated .sm-state .dot, .is-quiet .sm-state .dot { background: var(--session-wait); }
176
+ @keyframes sm-beat { 50% { opacity: .35; transform: scale(.8); } }
177
+
178
+ .sm-wait { padding: 9px 11px; border-radius: 12px; background: color-mix(in srgb, var(--s-acc) 14%, transparent); font-size: 13px; }
179
+ .sm-wait span { display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
180
+ .sm-chat { display: grid; gap: 2px; min-width: 0; }
181
+ .sm-chat b { font-size: 13.5px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
182
+ .sm-chat span { font-size: 12.5px; color: var(--text-2); display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; }
183
+
184
+ /* What the archive holds, by kind, in NOSTROMO's colours: one line, as long as the archive is full. */
185
+ .sm-strip { display: flex; gap: 2px; height: 6px; margin-top: 2px; border-radius: 3px; overflow: hidden; }
186
+ .sm-strip.none { background: var(--line-2); }
187
+ .sm-strip i { min-width: 3px; }
188
+ .sm-strip .k-decision { background: var(--mem-decision); }
189
+ .sm-strip .k-fact { background: var(--mem-fact); }
190
+ .sm-strip .k-preference { background: var(--mem-preference); }
191
+ .sm-strip .k-question { background: var(--mem-question); }
192
+ .sm-strip .k-aberration { background: var(--mem-aberration); }
193
+ :root[data-scheme="light"] .sm-strip .k-fact { background: #b9c6d6; }
194
+ .sm-counts { margin: 0; font-size: 12px; color: var(--text-2); }
195
+
196
+ .sm-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: auto; padding-top: 4px; }
197
+ .sm-btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; height: 30px; padding: 0 13px; border: 0; border-radius: 9px; background: var(--surface, var(--panel)); color: var(--text); box-shadow: var(--key-rest); font-family: var(--read); font-size: 12.5px; font-weight: 550; letter-spacing: 0; text-decoration: none; white-space: nowrap; cursor: pointer; transition: box-shadow calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out), color calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
198
+ .sm-btn:hover { box-shadow: var(--key-over, var(--key-rest)); }
199
+ .sm-btn:active { box-shadow: var(--key-down); }
200
+ .sm-btn:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
201
+ .sm-btn.primary { background: var(--s-acc); color: var(--s-acc-ink); }
202
+ .sm-btn.danger { color: var(--danger, var(--terror)); }
203
+ .sm-ask { flex-basis: 100%; font-size: 12.5px; color: var(--text-2); }
204
+ @keyframes sm-turn { to { transform: rotate(360deg); } }
205
+ .sm-error { margin: 0; font-size: 13px; color: var(--terror); }
206
+ /* «Ask BISHOP about this one»: BISHOP's own mark, a key of its own at the end of the row. */
207
+
208
+ .sm-none { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin: 0; padding: 22px; border-radius: 22px; font-size: 14px; color: var(--text-2); background: var(--plane-meta, color-mix(in srgb, var(--text) 4%, transparent)); }
209
+ .sm-foot-row { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px 16px; margin: 24px 0 0; }
210
+ .sm-foot { margin: 0; font-size: 12.5px; color: var(--text-2); }
211
+ .sm-foot-row .sm-colophon { flex: none; width: auto; margin: 0; }
212
+ body.sm-gone .sm-hero h1 { color: var(--text-3); }
213
+
214
+ /* BISHOP, the heart of the lobby: its mark, its state, the two ways in (here, or a new tab), its
215
+ last conversation, what it waits for, and a box that takes a question to its room. */
216
+ .sm-bishop { gap: 12px; padding: 20px 22px; }
217
+ .sm-bishop.is-waiting { --ring: inset 0 0 0 1.5px color-mix(in srgb, var(--s-acc) 70%, transparent); }
218
+ .sm-bishop-head { display: flex; align-items: center; gap: 14px; min-width: 0; }
219
+ .sm-bishop-words { display: grid; gap: 3px; flex: 1; min-width: 0; }
220
+ .sm-bishop-words h2 { margin: 0; font-family: var(--read); font-size: 20px; font-weight: 700; letter-spacing: -.01em; color: var(--text); }
221
+ .sm-bishop-keys { display: flex; align-items: center; gap: 8px; }
222
+ .sm-bishop-about { margin: 0; font-size: 13.5px; line-height: 1.45; color: var(--text-2); max-width: 680px; }
223
+ .sm-bishop-asks { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
224
+ /* THE LAST WORK, under BISHOP: MADRE's summary, a line per thing done, each led by its project. */
225
+ /* The lines share two columns (subgrid): every project tag in one, every sentence starting at the
226
+ same place in the other, whatever the project is called. The note closes the box at its foot. */
227
+ .sm-work { display: flex; flex-direction: column; gap: 12px; margin-top: 4px; padding: 14px 16px 14px; border-radius: 16px; background: color-mix(in srgb, var(--text) 4%, transparent); flex: 1; }
228
+ .sm-work-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
229
+ .sm-work-head h3 { margin: 0; font-size: 14.5px; font-weight: 650; color: var(--text); }
230
+ .sm-work-by { flex: 1; min-width: 0; font-family: var(--mono); font-size: 11px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
231
+ .sm-work-list { display: grid; grid-template-columns: max-content minmax(0, 1fr); column-gap: 12px; row-gap: 10px; margin: 0; padding: 0; list-style: none; }
232
+ .sm-work-list:has(> li.raw) { grid-template-columns: max-content minmax(0, 1fr) max-content; }
233
+ .sm-work-list li { grid-column: 1 / -1; display: grid; grid-template-columns: subgrid; align-items: baseline; font-size: 13.5px; line-height: 1.5; color: var(--text); animation: sm-line-in calc(320ms * var(--motion-scale, 1)) var(--ease-out, ease-out) both; }
234
+ .sm-work-list .sm-tag-room { justify-self: start; max-width: 168px; overflow: hidden; text-overflow: ellipsis; }
235
+ .sm-work-list li:nth-child(2) { animation-delay: 60ms; } .sm-work-list li:nth-child(3) { animation-delay: 120ms; } .sm-work-list li:nth-child(4) { animation-delay: 180ms; } .sm-work-list li:nth-child(5) { animation-delay: 240ms; }
236
+ .sm-work-list li.raw span { color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
237
+ .sm-work-list li.raw b { color: var(--text); font-weight: 600; }
238
+ .sm-work-list time { font-family: var(--mono); font-size: 11px; color: var(--text-2); }
239
+ .sm-work > .sm-hint { margin-top: auto; padding-top: 2px; }
240
+ .sm-work.is-working .sm-work-by::before, .sm-work.is-working > .sm-hint::before { content: ''; display: inline-block; width: 10px; height: 10px; margin-right: 7px; vertical-align: -1px; border-radius: 50%; border: 2px solid color-mix(in srgb, var(--s-acc) 30%, transparent); border-top-color: var(--s-acc); animation: sm-turn .8s linear infinite; }
241
+ @keyframes sm-line-in { from { opacity: 0; transform: translateY(4px); } }
242
+ /* A project's name as a tag: flat tone, a way into it when it is open. */
243
+ .sm-tag-room { font-family: var(--read); font-size: 11.5px; font-weight: 600; letter-spacing: 0; color: var(--text); text-decoration: none; white-space: nowrap; }
244
+ a.sm-tag-room:hover { background: color-mix(in srgb, var(--s-acc) 16%, transparent); }
245
+ .sm-chip.ask { max-width: 100%; padding: 5px 10px; border: 0; font-family: var(--read); font-size: 12.5px; font-weight: 600; letter-spacing: 0; color: color-mix(in srgb, var(--s-acc) 72%, var(--text)); background: color-mix(in srgb, var(--s-acc) 15%, transparent); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; cursor: pointer; }
246
+
247
+ /* Waiting for you: one number, green when nobody waits, the accent when someone does. */
248
+ .sm-waiting.has .sm-big { color: var(--s-acc); }
249
+ .sm-waiting.has { --ring: inset 0 0 0 1.5px color-mix(in srgb, var(--s-acc) 60%, transparent); }
250
+ .sm-waiting-body { display: grid; gap: 6px; }
251
+ .sm-waiting-row { display: grid; gap: 1px; padding: 7px 10px; border-radius: 12px; color: var(--text); text-decoration: none; background: color-mix(in srgb, var(--s-acc) 12%, transparent); }
252
+ .sm-waiting-row b { font-size: 13px; font-weight: 650; }
253
+ .sm-waiting-row span { font-size: 12.5px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
254
+ .sm-waiting-row:hover { background: color-mix(in srgb, var(--s-acc) 18%, transparent); }
255
+
256
+ /* The map of the links (2026-10-11): hairline spokes from the Coordinator, a wire in the accent per
257
+ contract with the notes running along it, the projects it touches drawn whole and named in
258
+ full, the rest quiet round the edge. */
259
+ .sm-links-tile { gap: 14px; padding: 22px 24px; }
260
+ .sm-map { position: relative; flex: 1; min-height: 210px; color: var(--s-acc); }
261
+ .sm-map svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
262
+ .sm-map .spoke { stroke: var(--text-3); stroke-opacity: .16; stroke-width: 1; stroke-dasharray: 1 4; stroke-linecap: round; }
263
+ .sm-map .wire { fill: none; stroke-width: 1.6; stroke-linecap: round; stroke-opacity: .78; transition: stroke-opacity 160ms var(--ease-out, ease-out), stroke-width 160ms var(--ease-out, ease-out); }
264
+ .sm-map .wire:hover { stroke-opacity: 1; stroke-width: 2.4; }
265
+ .sm-map .node .body { fill: var(--pc, var(--s-acc)); stroke: var(--surface, var(--panel)); stroke-width: 2.5; paint-order: stroke; }
266
+ .sm-map .node:not(.linked) .body { fill: color-mix(in srgb, var(--text) 18%, transparent); stroke-width: 0; }
267
+ .sm-map .node.asleep.linked .body { fill: color-mix(in srgb, var(--pc, var(--s-acc)) 38%, var(--surface, var(--panel))); stroke: var(--pc, var(--s-acc)); stroke-width: 1.6; stroke-dasharray: 2.4 2.2; paint-order: normal; }
268
+ .sm-map .node.asleep.linked .label { fill: var(--text-2); }
269
+ .sm-map .node .wait { fill: none; stroke: var(--pc, var(--s-acc)); stroke-width: 1.4; stroke-opacity: .55; animation: sm-map-wait 1.8s var(--ease-out, ease-out) infinite; transform-box: fill-box; transform-origin: center; }
270
+ @keyframes sm-map-wait { from { transform: scale(.75); opacity: 1; } to { transform: scale(1.35); opacity: 0; } }
271
+ @media (prefers-reduced-motion: reduce) { .sm-map .node .wait { animation: none; } }
272
+ .sm-map .label { font-family: var(--read); font-size: 12px; font-weight: 600; letter-spacing: -.005em; fill: var(--text); paint-order: stroke; stroke: var(--surface, var(--panel)); stroke-width: 3px; stroke-linejoin: round; }
273
+ .sm-map .node:not(.linked) .label { font-size: 11px; font-weight: 500; fill: var(--text-3); }
274
+ .sm-map .bishop .halo { fill: none; stroke: color-mix(in srgb, var(--text) 14%, transparent); stroke-width: 1; }
275
+ .sm-map-quiet { position: absolute; right: 0; bottom: -2px; font-size: 11.5px; color: var(--text-3); }
276
+ .sm-map-wide { flex: none; height: clamp(300px, 46vh, 440px); margin: 6px 0 18px; border-radius: 16px; background: color-mix(in srgb, var(--text) 3%, transparent); }
277
+ .sm-map-wide .label { font-size: 13px; }
278
+ .sm-tinted { white-space: nowrap; color: var(--text) !important; }
279
+ .sm-tinted::before { content: ''; display: inline-block; width: .55em; height: .55em; margin: 0 .35em .08em 0; border-radius: 50%; background: var(--pc, var(--s-acc)); vertical-align: middle; }
280
+ .sm-tinted.hub::before { background: var(--text-3); }
281
+ .sm-map > .sm-hint { position: absolute; inset: 0; display: grid; place-items: center; text-align: center; padding: 0 12px; }
282
+
283
+ /* The low row: what was decided, what needs you, and the memory. */
284
+ .sm-decisions { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }
285
+ .sm-decision { display: grid; gap: 4px; padding: 10px 0; border-top: 1px solid var(--line); }
286
+ .sm-decision:first-child { border-top: 0; padding-top: 2px; }
287
+ .sm-decision-head { display: flex; align-items: center; gap: 8px; }
288
+ .sm-decision-head time { font-family: var(--mono); font-size: 11px; color: var(--text-2); }
289
+ .sm-decision p { margin: 0; font-size: 13.5px; line-height: 1.5; color: var(--text); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
290
+ .sm-attention { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
291
+ .sm-attention-item { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 12px; background: color-mix(in srgb, var(--text) 4%, transparent); }
292
+ .sm-attention-item .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--session-wait); }
293
+ .sm-attention-item.is-bad .dot { background: var(--session-bad); }
294
+ .sm-attention-item.is-ok .dot, .sm-attention-item.is-calm .dot { background: var(--session-ok); }
295
+ .sm-attention-words { display: grid; gap: 1px; min-width: 0; }
296
+ .sm-attention-words b { font-size: 13px; font-weight: 600; color: var(--text); }
297
+ .sm-attention-words span { font-size: 12px; line-height: 1.4; color: var(--text-2); }
298
+ .sm-memory-body { display: grid; gap: 9px; }
299
+ .sm-memory-body .sm-strip { height: 8px; }
300
+ .sm-legend { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: 12px; color: var(--text-2); }
301
+ .sm-legend span { display: inline-flex; align-items: center; gap: 6px; }
302
+ .sm-legend span::before { content: ''; width: 8px; height: 8px; border-radius: 50%; }
303
+ .sm-legend .k-decision::before { background: var(--mem-decision); }
304
+ .sm-legend .k-fact::before { background: var(--mem-fact); }
305
+ .sm-legend .k-preference::before { background: var(--mem-preference); }
306
+ .sm-legend .k-question::before { background: var(--mem-question); }
307
+ .sm-legend .k-aberration::before { background: var(--mem-aberration); }
308
+ :root[data-scheme="light"] .sm-legend .k-fact::before { background: #b9c6d6; }
309
+ .salas-mac .paper:hover { border-color: color-mix(in srgb, var(--s-acc) 40%, var(--line-2)); }
310
+ .salas-mac .paper[aria-checked="true"] { border-color: var(--s-acc); box-shadow: 0 0 0 1px var(--s-acc); }
311
+
312
+ @media (max-width: 1180px) { .sm-projects > .sm-tile { grid-column: span 4; } }
313
+ @media (max-width: 920px) {
314
+ .sm-bento > .c-8, .sm-bento > .c-4 { grid-column: 1 / -1; }
315
+ .sm-bento > .r-2, .sm-bento > .r-3 { grid-row: auto; }
316
+ .sm-projects > .sm-tile { grid-column: span 6; }
317
+ .sm-low > .sm-tile { grid-column: 1 / -1; }
318
+ }
319
+ @media (max-width: 720px) {
320
+ .sm-main { padding: 12px 18px 40px; }
321
+ .sm-projects > .sm-tile { grid-column: 1 / -1; }
322
+ .sm-tools { flex-wrap: wrap; width: 100%; }
323
+ .sm-tools .sm-search { flex: 1 1 100%; }
324
+ .sm-bishop-head { flex-wrap: wrap; }
325
+ }
326
+ @media (prefers-reduced-motion: reduce) {
327
+ .sm-card, .sm-btn { transition: none; }
328
+ .is-working .sm-state .dot { animation: none; }
329
+ }
330
+
331
+ /* The room of SALAS (phase 3d): the door to the others, said on its card. */
332
+ .sm-chip.salas { background: color-mix(in srgb, var(--s-acc) 18%, transparent); color: color-mix(in srgb, var(--s-acc) 75%, var(--text)); }
333
+
334
+ /* LINKS (docs/MACROVERSO.md, phase 3c): the contracts between rooms, and the sheet that signs one. */
335
+ .sm-link-list { display: grid; gap: 14px; }
336
+ .sm-link { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 9px 22px; align-items: center; padding: 20px 22px; border-radius: 16px; background: var(--panel); box-shadow: inset 0 0 0 1px var(--line); }
337
+ .sm-link-kind { grid-column: 1; font-family: var(--mono); font-size: 10px; letter-spacing: .1em; color: var(--s-acc); text-transform: uppercase; }
338
+ .sm-link .who { margin: 0; font-family: var(--read); font-size: 15px; font-weight: 650; letter-spacing: -.01em; text-transform: none; }
339
+ .sm-link .who b { color: var(--s-acc); }
340
+ .sm-link .what, .sm-link .traffic { margin: 0; font-family: var(--read); font-size: 12.5px; letter-spacing: 0; text-transform: none; color: var(--text-2); }
341
+ .sm-link .what { grid-column: 1; }
342
+ .sm-link .traffic { grid-column: 1; }
343
+ .sm-link .sm-actions { grid-column: 2; grid-row: 1 / span 5; display: flex; align-items: center; gap: 8px; }
344
+ .sm-link .sm-recall { grid-column: 1; display: flex; align-items: center; gap: 8px; margin: 2px 0 0; font-family: var(--read); font-size: 12.5px; letter-spacing: 0; text-transform: none; color: var(--text-2); cursor: pointer; }
345
+ .sm-link .sm-recall input { accent-color: var(--s-acc); }
346
+ .sm-link.revoking { box-shadow: inset 0 0 0 1px color-mix(in srgb, #ff4d3d 55%, var(--line)); }
347
+ .sm-link .sm-ask { font-size: 12.5px; color: var(--text-2); }
348
+ @media (max-width: 600px) { .sm-link { grid-template-columns: 1fr; padding: 18px; } .sm-link .sm-actions { grid-column: 1; grid-row: auto; justify-content: flex-start; } }
349
+ /* Every sheet of the lobby wears the room's window material (styles.css, dialog.settings-window):
350
+ the second ground at 94 %, a light falling from its top, the space behind it blurred. What is
351
+ inside stands on it as the room's cards do. */
352
+ /* A SHEET (2026-10-10): the scroll is outside the window. The dialog is the whole screen, clear,
353
+ and it is what scrolls, so its bar runs down the screen's edge and the window stays whole,
354
+ corners and all; nothing inside a window scrolls on its own. Short, the window sits in the
355
+ middle; long, it starts near the top and the screen carries it. The window is the room's
356
+ settings window (styles.css, dialog.settings-window): its ground at 94 %, the light above, the
357
+ blur behind. */
358
+ dialog.sm-sheet { --sm-sheet-w: 520px; position: fixed; inset: 0; width: 100%; height: 100%; max-width: none; max-height: none; margin: 0; padding: 0; border: 0; background: transparent; box-shadow: none; color: var(--text); overflow: hidden auto; overscroll-behavior: contain; }
359
+ dialog.sm-sheet[open] { --sm-sheet-pad: 28px; display: flex; flex-direction: column; align-items: center; padding: var(--sm-sheet-pad) 16px; }
360
+ dialog.sm-sheet > .sm-sheet-body { flex: none; width: min(var(--sm-sheet-w), 100%); margin-block: auto; overflow: clip; border-radius: 18px; background-color: color-mix(in srgb, var(--bg-2) 94%, transparent); background-image: linear-gradient(180deg, color-mix(in srgb, var(--text) 5%, transparent), transparent 120px); -webkit-backdrop-filter: blur(22px) saturate(1.2); backdrop-filter: blur(22px) saturate(1.2); box-shadow: 0 34px 90px -30px rgba(0, 0, 0, .55), 0 8px 24px -8px rgba(0, 0, 0, .25); }
361
+ :root[data-scheme="light"] dialog.sm-sheet > .sm-sheet-body { background-image: linear-gradient(180deg, rgba(255, 255, 255, .55), transparent 120px); }
362
+ .sm-sheet::backdrop { background: rgba(0, 0, 0, .45); -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); }
363
+ .sm-sheet:where(:not(.sm-settings)) form { display: grid; gap: 16px; padding: 24px 24px 20px; }
364
+ .sm-sheet:where(:not(.sm-settings)) h3 { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -.015em; }
365
+ .sm-sheet:where(:not(.sm-settings)) .pair { display: grid; grid-template-columns: 1fr auto 1fr; gap: 10px; align-items: end; }
366
+ .sm-sheet:where(:not(.sm-settings)) .pair .arrow { padding-bottom: 9px; font-size: 18px; color: var(--text-3); text-align: center; }
367
+ .sm-sheet:where(:not(.sm-settings)) label { display: grid; gap: 5px; font-size: 11px; font-weight: 650; letter-spacing: .08em; text-transform: uppercase; color: var(--text-3); }
368
+ .sm-sheet:where(:not(.sm-settings)) select, .sm-sheet:where(:not(.sm-settings)) input[type="text"] { height: 36px; padding: 0 10px; border: 0; border-radius: 10px; background: transparent; color: var(--text); font: inherit; font-size: 14px; box-shadow: var(--key-track); outline: 0; }
369
+ .sm-sheet:where(:not(.sm-settings)) select:focus, .sm-sheet:where(:not(.sm-settings)) input[type="text"]:focus { box-shadow: var(--key-down); }
370
+ .sm-sheet:where(:not(.sm-settings)) .row { display: flex; flex-wrap: wrap; gap: 8px 14px; align-items: center; font-size: 13.5px; text-transform: none; letter-spacing: 0; font-weight: 500; color: var(--text); }
371
+ .sm-sheet:where(:not(.sm-settings)) .row input { accent-color: var(--s-acc); }
372
+ .sm-sheet:where(:not(.sm-settings)) .hint { margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--text-2); }
373
+ .sm-sheet:where(:not(.sm-settings)) .orders { padding: 12px 14px; border-radius: 12px; background: var(--panel-2); display: grid; gap: 10px; }
374
+ .sm-sheet:where(:not(.sm-settings)) .orders[hidden] { display: none; }
375
+ .sm-sheet:where(:not(.sm-settings)) .error { margin: 0; font-size: 13px; color: #ff4d3d; }
376
+ .sm-sheet:where(:not(.sm-settings)) .error:empty { display: none; }
377
+ .sm-sheet:where(:not(.sm-settings)) .actions { display: flex; justify-content: flex-end; gap: 8px; }
378
+
379
+ /* THE MACROVERSE (macroverso.js): a layer over SALAS, the whole window, always night — it is space,
380
+ in either theme. The words over it keep the room's type and the accent. */
381
+ /* A key on the bar, as MÓDULOS and MU/TH/UR are in the room. */
382
+ .sm-barkey { background: var(--surface, var(--panel)); color: var(--text-2); box-shadow: var(--key-rest); transition: box-shadow calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out), color calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
383
+ .sm-barkey:hover { color: var(--text); box-shadow: var(--key-over, var(--key-rest)); }
384
+ .sm-barkey:active { box-shadow: var(--key-down); }
385
+ .sm-barkey:focus-visible, .sm-stop:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
386
+ body.sm-in-macro { overflow: hidden; }
387
+
388
+ .mv { position: fixed; inset: 0; z-index: 20; background: #030305; color: #f2f1ee; animation: mv-in 420ms var(--ease-out, ease-out); }
389
+ /* The macroverse's space is night in either theme and what is drawn on it is light; its keys
390
+ are the room's in the theme you chose (2026-10-10), with the accent as the night wears it where
391
+ something is chosen (salas-mac.js, darkAccent and its ink). */
392
+ .mv { --s-acc: var(--mv-acc, #9bff66); --s-acc-ink: var(--mv-acc-ink, #0a1405); }
393
+ .mv.leaving { animation: mv-out 260ms ease-in forwards; }
394
+ @keyframes mv-in { from { opacity: 0; transform: scale(1.04); } }
395
+ @keyframes mv-out { to { opacity: 0; transform: scale(1.03); } }
396
+ .mv-canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; outline: none; }
397
+ /* Its head is the Memory map's (styles.css, .nostromo-head and its #nostromo rules, which name
398
+ .mv too): a bar across the top with the name in small mono, the line of what it holds, the
399
+ kinds of memory under them and the keys at the end. */
400
+ .mv-head { position: absolute; left: 0; right: 0; top: 0; z-index: 2; margin: 0; }
401
+ .mv-head .mother-title { margin: 0; text-transform: uppercase; }
402
+ .mv-back { display: inline-flex; align-items: center; gap: 6px; }
403
+ .mv-back svg { width: 13px; height: 13px; flex: none; }
404
+ .mv-hint { position: absolute; left: 20px; bottom: 14px; margin: 0; font-size: 11.5px; color: rgba(242, 241, 238, .42); pointer-events: none; }
405
+
406
+ .mv-card { position: absolute; right: 40px; top: 50%; translate: 0 -50%; width: min(360px, 34vw); display: grid; gap: 10px; padding: 22px 22px 18px; border-radius: 22px; background: rgba(18, 18, 22, .78); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .07), 0 30px 60px -30px rgba(0, 0, 0, .9); -webkit-backdrop-filter: blur(16px); backdrop-filter: blur(16px); animation: mv-card-in 420ms var(--ease-out, ease-out); }
407
+ .mv-card[hidden] { display: none; }
408
+ @keyframes mv-card-in { from { opacity: 0; translate: 16px -50%; } }
409
+ .mv-card h3 { margin: 0; font-size: 26px; font-weight: 700; letter-spacing: -.015em; }
410
+ .mv-state { margin: 0; font-size: 14px; color: rgba(242, 241, 238, .78); }
411
+ .mv-path { margin: -4px 0 0; font-family: var(--mono); font-size: 12px; color: rgba(242, 241, 238, .45); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
412
+ .mv-wait { margin: 0; padding: 10px 12px; border-radius: 12px; background: color-mix(in srgb, var(--s-acc) 18%, transparent); font-size: 13.5px; }
413
+ .mv-kinds { list-style: none; margin: 4px 0 0; padding: 0; display: grid; gap: 7px; }
414
+ .mv-kinds li { display: grid; gap: 4px; font-size: 12.5px; color: rgba(242, 241, 238, .72); }
415
+ .mv-kinds i { display: block; height: 4px; border-radius: 2px; background: var(--k); box-shadow: 0 0 10px color-mix(in srgb, var(--k) 45%, transparent); }
416
+ .mv-counts { margin: 2px 0 0; font-size: 12.5px; color: rgba(242, 241, 238, .5); }
417
+ .mv-links { list-style: none; margin: 0; padding: 0; display: grid; gap: 5px; font-size: 12.5px; color: rgba(242, 241, 238, .78); }
418
+ .mv-links li { padding-left: 14px; position: relative; }
419
+ .mv-links li::before { content: ''; position: absolute; left: 0; top: .55em; width: 8px; height: 2px; border-radius: 1px; background: var(--s-acc); }
420
+ .mv-links li.none { padding-left: 0; color: rgba(242, 241, 238, .45); }
421
+ .mv-links li.none::before { display: none; }
422
+ .mv-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 6px; }
423
+ .mv-about { margin: 0; font-size: 13px; line-height: 1.45; color: rgba(242, 241, 238, .72); }
424
+ .mv-unlinked { margin-top: 0; gap: 6px; }
425
+ /* RECENTER is a bar key, as the room's: mono capitals, 26 px, 6 px corners, the surface raised. */
426
+ /* The memories picked inside the chosen universe, each in a window of its own (2026-10-09), as
427
+ NOSTROMO's cards are: dark glass, the kind as a dot and a word, the words under it, where it came
428
+ from in small mono. Moved by the header; the one in front carries a rim in its kind's colour. */
429
+ .mv-windows { position: absolute; inset: 0; pointer-events: none; }
430
+ .mv-mem { position: absolute; width: min(340px, 30vw); max-height: min(60vh, 520px); overflow: auto; overscroll-behavior: contain; scrollbar-width: none; display: grid; gap: 10px; padding: 14px 16px 14px; border-radius: 16px; background: rgba(22, 22, 25, .95); -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .06), 0 18px 40px -18px rgba(0, 0, 0, .8); color: #f2f1ee; pointer-events: auto; animation: mv-mem-in 220ms var(--ease-out, ease-out); }
431
+ .mv-mem::-webkit-scrollbar { display: none; }
432
+ .mv-mem.front { box-shadow: inset 0 1px 0 rgba(255, 255, 255, .08), 0 0 0 1px color-mix(in srgb, var(--k, #f2f1ee) 40%, transparent), 0 22px 48px -18px rgba(0, 0, 0, .85); }
433
+ @keyframes mv-mem-in { from { opacity: 0; translate: 0 8px; } }
434
+ .mv-mem header { display: flex; align-items: center; justify-content: space-between; gap: 10px; cursor: grab; user-select: none; touch-action: none; }
435
+ .mv-mem.moving header { cursor: grabbing; }
436
+ .mv-mem header b { display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600; color: #f2f1ee; }
437
+ .mv-mem header b::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: var(--k, #f2f1ee); }
438
+ .mv-mem-text { margin: 0; font-size: 14.5px; line-height: 1.5; color: #f2f1ee; }
439
+ .mv-mem-meta { margin: 0; font-family: var(--mono); font-size: 11px; color: rgba(242, 241, 238, .5); }
440
+ @media (prefers-reduced-motion: reduce) { .mv-mem { animation: none; } }
441
+ @media (prefers-reduced-motion: reduce) { .mv, .mv.leaving, .mv-card { animation: none; } }
442
+
443
+ /* ==========================================================================================
444
+ THE LOBBY (2026-10-10): the first screen of MADRE. The title with the one action it offers
445
+ (add a project); BISHOP above the projects, wide and in its own colour; the sheet that adds
446
+ folders and the first-run wizard, both in the sheets' material. The room's tokens throughout.
447
+ ========================================================================================== */
448
+ .sm-add { height: 32px; padding: 0 14px; font-size: 13px; }
449
+ .sm-btn[disabled] { opacity: .45; box-shadow: none; cursor: default; }
450
+ .sm-btn.small { height: 28px; padding: 0 11px; border-radius: 8px; font-size: 12px; }
451
+
452
+ /* An agent's mark: its own colour and glyph (brands.js). */
453
+ .sm-mark { flex: none; display: inline-grid; place-items: center; border-radius: 50%; background: var(--b); color: var(--b-ink); box-shadow: 0 1px 2px rgba(15, 20, 30, .14), 0 4px 10px -5px rgba(15, 20, 30, .28); }
454
+ .sm-mark svg { width: 62%; height: 62%; }
455
+
456
+ /* Sheets that are wider than the link sheet, and their head. */
457
+ .sm-sheet.sm-wide { --sm-sheet-w: 780px; }
458
+ #sm-links-sheet .sm-sheet-body { padding: 24px 26px; gap: 18px; }
459
+ .sm-sheet-body { display: grid; gap: 14px; padding: 20px 24px 20px; }
460
+ .sm-sheet-body > h3 { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -.015em; }
461
+ .sm-sheet-body .hint, .sm-picker .hint { margin: 0; font-size: 13.5px; line-height: 1.5; color: var(--text-2); }
462
+ .sm-sheet-body .actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 4px; }
463
+ .sm-sheet-body .error { margin: 0; font-size: 13px; color: var(--terror); }
464
+ .sm-sheet-body .error:empty { display: none; }
465
+ .sm-sheet-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
466
+ .sm-sheet-head > h3 { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -.015em; }
467
+
468
+ /* The wizard's steps on the room's rail (.sx-seg): a sunk track, the current step raised and
469
+ heavier, the ones behind marked done. */
470
+ .sm-steps { display: inline-flex; gap: 4px; margin: 0; padding: 4px; list-style: none; border-radius: 12px; box-shadow: var(--key-track); }
471
+ .sm-steps li { display: inline-flex; align-items: center; gap: 6px; min-height: 28px; padding: 0 12px; border-radius: 8px; font-size: 12.5px; font-weight: 450; color: var(--text-2); transition: color calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out), box-shadow calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
472
+ .sm-steps li.done::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: var(--session-ok); }
473
+ .sm-steps li.on { color: var(--text); font-weight: 700; background: var(--surface, var(--panel)); box-shadow: var(--key-rest); }
474
+
475
+ /* The wizard's scenes: what each step is about, moving, over it. */
476
+ .sm-scene { position: relative; height: 168px; overflow: hidden; border-radius: 18px; box-shadow: var(--key-track); background: radial-gradient(420px 180px at 50% 120%, color-mix(in srgb, var(--s-acc) 16%, transparent), transparent 70%), radial-gradient(360px 160px at 50% -40%, color-mix(in srgb, #4fc3f7 10%, transparent), transparent 70%); animation: sm-scene-in calc(420ms * var(--motion-scale, 1)) var(--ease-out, ease-out) both; }
477
+ @keyframes sm-scene-in { from { opacity: 0; transform: scale(.985); } }
478
+ .sm-step { display: grid; gap: 14px; animation: sm-step-in calc(380ms * var(--motion-scale, 1)) var(--ease-out, ease-out) both; }
479
+ .sm-step.back { animation-name: sm-step-back; }
480
+ @keyframes sm-step-in { from { opacity: 0; transform: translateX(18px); } }
481
+ @keyframes sm-step-back { from { opacity: 0; transform: translateX(-18px); } }
482
+ .sm-scene-node { position: absolute; transform: translate(-50%, -50%); display: grid; place-items: center; }
483
+ /* 1 · The agents come to MADRE; each lights up, and its wire carries the beat, once connected. */
484
+ .scene-agents .sm-wires { position: absolute; inset: 0; width: 100%; height: 100%; }
485
+ .sm-wire { stroke: var(--text-3); stroke-opacity: .45; stroke-width: 1.4; stroke-dasharray: 3 5; animation: sm-flow 1.6s linear infinite; }
486
+ .sm-wire.on { stroke: var(--s-acc); stroke-opacity: .9; stroke-width: 2; stroke-dasharray: 6 8; animation-duration: .9s; }
487
+ @keyframes sm-flow { to { stroke-dashoffset: -16; } }
488
+ .scene-agents .agent { animation: sm-arrive calc(620ms * var(--motion-scale, 1)) var(--ease-out, ease-out) var(--d) both, sm-float 4.2s ease-in-out calc(var(--d) + 700ms) infinite alternate; }
489
+ .scene-agents .agent .sm-mark { opacity: .55; filter: saturate(.4); transition: opacity 300ms, filter 300ms; }
490
+ .scene-agents .agent.on .sm-mark { opacity: 1; filter: none; }
491
+ .scene-agents .agent::after { content: ''; position: absolute; right: -1px; bottom: -1px; width: 11px; height: 11px; border-radius: 50%; background: var(--session-ok); box-shadow: 0 0 0 2px var(--surface, var(--panel)); transform: scale(0); transition: transform 260ms var(--ease-out, ease-out); }
492
+ .scene-agents .agent.on::after { transform: scale(1); }
493
+ @keyframes sm-arrive { from { opacity: 0; transform: translate(-50%, -50%) scale(.4); } }
494
+ @keyframes sm-float { to { transform: translate(-50%, calc(-50% - 5px)); } }
495
+ .scene-agents .core::before { content: ''; position: absolute; inset: -6px; border-radius: 50%; box-shadow: 0 0 0 2px color-mix(in srgb, var(--s-acc) 50%, transparent); animation: sm-ring 2.4s ease-out infinite; }
496
+ @keyframes sm-ring { from { transform: scale(.9); opacity: .9; } to { transform: scale(1.7); opacity: 0; } }
497
+ /* 2 · The folders drop into the lobby, one after another, and its tiles light up. */
498
+ .sm-tray { position: absolute; left: 50%; bottom: 18px; transform: translateX(-50%); display: grid; grid-template-columns: repeat(5, 46px); gap: 10px; padding: 8px; border-radius: 14px; background: var(--surface, var(--panel)); box-shadow: var(--raise, var(--key-rest)); }
499
+ .sm-slot { position: relative; height: 30px; border-radius: 8px; box-shadow: var(--key-track); animation: sm-slot 5s ease-out calc(var(--i) * 420ms) infinite; }
500
+ @keyframes sm-slot { 0%, 17%, 82%, 100% { background: transparent; } 20%, 74% { background: color-mix(in srgb, var(--s-acc) 22%, transparent); } }
501
+ .sm-fly { position: absolute; left: 50%; top: 50%; width: 24px; height: 20px; margin: -10px 0 0 -12px; color: color-mix(in srgb, var(--s-acc) 72%, var(--text-2)); opacity: 0; animation: sm-drop 5s cubic-bezier(.32, .7, .4, 1) calc(var(--i) * 420ms) infinite; }
502
+ .sm-fly svg { width: 100%; height: 100%; display: block; }
503
+ @keyframes sm-drop { 0% { opacity: 0; transform: translateY(-130px) rotate(-10deg); } 5% { opacity: 1; } 17% { opacity: 1; transform: translateY(0) rotate(0); } 19% { transform: translateY(0) scale(1.08, .9); } 22% { transform: translateY(0) scale(1); } 74% { opacity: 1; transform: translateY(0); } 82%, 100% { opacity: 0; transform: translateY(0) scale(.85); } }
504
+ /* 3 · The rooms light up one after another as the beat runs through them. */
505
+ .sm-wins { position: absolute; inset: 0; z-index: 1; display: flex; align-items: center; justify-content: center; gap: 26px; }
506
+ .sm-win { display: grid; gap: 7px; align-content: start; width: 104px; height: 74px; padding: 9px 10px; border-radius: 12px; background: var(--surface, var(--panel)); box-shadow: var(--raise, var(--key-rest)); animation: sm-win 3s ease-out calc(var(--i) * 500ms + 300ms) infinite; }
507
+ .sm-win-bar { display: block; width: 26px; height: 6px; border-radius: 3px; background: var(--text-3); opacity: .5; }
508
+ .sm-win-line { display: block; height: 6px; border-radius: 3px; background: color-mix(in srgb, var(--text) 10%, transparent); }
509
+ .sm-win-line.short { width: 60%; }
510
+ @keyframes sm-win { 0%, 100% { box-shadow: var(--raise, var(--key-rest)); } 14%, 46% { box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--s-acc) 70%, transparent), var(--raise, var(--key-rest)); } }
511
+ .sm-win .sm-win-line { animation: sm-win-line 3s ease-out calc(var(--i) * 500ms + 300ms) infinite; }
512
+ @keyframes sm-win-line { 0%, 100% { background: color-mix(in srgb, var(--text) 10%, transparent); } 14%, 46% { background: color-mix(in srgb, var(--s-acc) 45%, transparent); } }
513
+ .sm-beat { position: absolute; z-index: 0; left: 0; right: 0; top: 50%; width: 100%; height: 44px; transform: translateY(-50%); pointer-events: none; }
514
+ .sm-beat path { fill: none; stroke: var(--s-acc); stroke-width: 2.2; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 18 82; animation: sm-beat-run 3s linear infinite; opacity: .85; }
515
+ @keyframes sm-beat-run { from { stroke-dashoffset: 18; } to { stroke-dashoffset: -82; } }
516
+ @media (prefers-reduced-motion: reduce) {
517
+ .sm-scene, .sm-step, .sm-wire, .scene-agents .agent, .scene-agents .core::before, .sm-slot, .sm-win, .sm-win .sm-win-line, .sm-beat path, .sm-work-list li { animation: none !important; }
518
+ .sm-fly { animation: none; opacity: 1; transform: none; }
519
+ }
520
+
521
+ /* Choosing folders (salas-mac.js, projectPicker; 2026-10-10): which list (found, or your folders)
522
+ on a rail with a search beside it; a line that says what is shown, or where the walk is; the
523
+ folders as tiles, a page at a time, as many rows as the screen holds; and what was chosen, with
524
+ the key that adds it. The rail is the room's Appearance rail (styles.css, .sx-look .custom-seg). */
525
+ .sm-picker { display: grid; gap: 12px; }
526
+ .sm-picker-head { display: flex; align-items: center; gap: 10px; min-width: 0; }
527
+ .sm-picker-head .custom-seg { flex: none; display: inline-grid; grid-template-columns: none; grid-auto-flow: column; grid-auto-columns: auto; gap: 2px; padding: 2px; border: 0; border-radius: 10px; background: color-mix(in srgb, var(--text) 7%, transparent); }
528
+ .sm-picker-head .seg-option { min-height: 28px; padding: 0 12px; border-radius: 8px; font-size: 12.5px; }
529
+ .sm-picker-head .seg-option[aria-checked="true"] { background: var(--surface, var(--panel)); box-shadow: 0 1px 2px rgba(0, 0, 0, .22), inset 0 1px 0 rgba(255, 255, 255, .06); }
530
+ /* The room's search (styles.css, .settings-search), not the sheet's uppercase field label. */
531
+ .sm-picker-head > .sm-picker-search { flex: 1 1 auto; max-width: none; display: flex; align-items: center; gap: 8px; height: 32px; padding: 0 10px; font-size: 13.5px; font-weight: 400; letter-spacing: 0; text-transform: none; color: var(--text-2); }
532
+ .sm-picker-search input::-webkit-search-cancel-button { cursor: pointer; }
533
+ .sm-picker-line { display: flex; align-items: center; gap: 10px; min-width: 0; height: 28px; font-size: 13px; color: var(--text-2); }
534
+ .sm-picker-note { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
535
+ .sm-where { min-width: 0; font-family: var(--mono); font-size: 12px; color: var(--text-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
536
+ .sm-up { flex: none; gap: 4px; padding: 0 10px 0 6px; }
537
+ .sm-up svg { width: 14px; height: 14px; }
538
+ .sm-fold-grid { display: grid; grid-template-columns: repeat(var(--cols, 3), minmax(0, 1fr)); grid-template-rows: repeat(var(--rows, 4), 54px); gap: 8px; }
539
+ .sm-fold-grid > .sm-fold { position: relative; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 11px; min-width: 0; padding: 0 8px 0 12px; border-radius: 12px; background: var(--surface, var(--panel)); box-shadow: var(--key-rest); font-size: inherit; font-weight: inherit; letter-spacing: 0; text-transform: none; color: var(--text); cursor: pointer; transition: box-shadow calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out), background-color calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
540
+ .sm-fold-grid > .sm-fold:hover { box-shadow: var(--key-over, var(--key-rest)); }
541
+ .sm-fold-grid > .sm-fold.is-on { background: color-mix(in srgb, var(--s-acc) 12%, var(--surface, var(--panel))); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--s-acc) 65%, transparent), var(--key-rest); }
542
+ .sm-fold-grid > .sm-fold.known { cursor: default; background: color-mix(in srgb, var(--text) 4%, transparent); box-shadow: none; }
543
+ .sm-fold-grid > .sm-fold.known :is(.sm-fold-glyph, b) { opacity: .6; }
544
+ .sm-fold-grid > .sm-fold:has(input:focus-visible) { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
545
+ .sm-fold input { position: absolute; width: 1px; height: 1px; margin: 0; opacity: 0; pointer-events: none; }
546
+ .sm-fold-glyph { position: relative; display: grid; place-items: center; width: 24px; height: 20px; color: var(--text-3); }
547
+ .sm-fold.is-project .sm-fold-glyph { color: color-mix(in srgb, var(--s-acc) 72%, var(--text-2)); }
548
+ .sm-fold-glyph svg { display: block; width: 100%; height: 100%; }
549
+ .sm-fold-tick { position: absolute; right: -6px; bottom: -5px; display: grid; place-items: center; width: 15px; height: 15px; border-radius: 50%; background: var(--s-acc); color: var(--s-acc-ink); box-shadow: 0 0 0 2px var(--surface, var(--panel)); transform: scale(0); transition: transform calc(180ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
550
+ .sm-fold-tick svg { width: 10px; height: 10px; }
551
+ .sm-fold.is-on .sm-fold-tick { transform: scale(1); }
552
+ .sm-fold.known .sm-fold-tick { background: var(--text-3); }
553
+ .sm-fold-words { display: grid; gap: 1px; min-width: 0; }
554
+ .sm-fold-words b { font-size: 13.5px; font-weight: 600; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
555
+ .sm-fold-words small { font-family: var(--mono); font-size: 11px; color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
556
+ .sm-into { display: grid; place-items: center; width: 28px; height: 28px; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--text-2); cursor: pointer; }
557
+ .sm-into svg { width: 14px; height: 14px; }
558
+ .sm-into:hover, .sm-into:focus-visible { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); outline: 0; }
559
+ .sm-fold-none { grid-column: 1 / -1; grid-row: 1 / -1; align-self: center; justify-self: center; max-width: 46ch; margin: 0; text-align: center; font-size: 13.5px; line-height: 1.5; color: var(--text-2); }
560
+ .sm-picker-foot { display: flex; align-items: center; justify-content: flex-end; gap: 12px; min-height: 30px; }
561
+ .sm-pager { display: inline-flex; align-items: center; gap: 8px; margin-right: auto; }
562
+ .sm-page { width: 28px; height: 28px; }
563
+ .sm-page:disabled { opacity: .4; box-shadow: none; cursor: default; }
564
+ .sm-page-where { min-width: 52px; font-family: var(--mono); font-size: 11.5px; text-align: center; color: var(--text-2); }
565
+ .sm-picked { font-size: 13px; color: var(--text-2); }
566
+ /* «Add a project»: the welcome's scene, a little lower, over the picker. On a short screen every
567
+ scene gives up height first, so the folders keep a row more. */
568
+ .sm-add .sm-scene { height: 132px; }
569
+ @media (max-height: 820px) { .sm-scene { height: 124px; } .sm-add .sm-scene { height: 108px; } }
570
+ @media (max-width: 640px) { .sm-picker-head { flex-wrap: wrap; } .sm-picker-search { flex-basis: 100%; } }
571
+
572
+ /* Agents, in the wizard's first step: the mark, its name and its state, and the one action it needs. */
573
+ .sm-agents { display: grid; gap: 0; padding: 2px 14px; border-radius: 14px; background: var(--surface, var(--panel-2)); box-shadow: var(--key-rest, inset 0 0 0 1px var(--line)); }
574
+ .sm-agent { display: grid; border-top: 1px solid var(--line); }
575
+ .sm-agent:first-child { border-top: 0; }
576
+ /* One card per agent (2026-10-13), as the project's AJUSTES › Agents draws them: folded to a line
577
+ with its mark, its maker, a chip with its state and a chevron; open, what it needs. */
578
+ .sm-agents.cards { gap: 10px; padding: 0; border-radius: 0; background: none; box-shadow: none; }
579
+ .sm-agents.cards > .sm-agent { border-top: 0; border-radius: 14px; background: var(--surface, var(--panel)); box-shadow: var(--raise, var(--key-rest)); }
580
+ .sm-agent-head { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; align-items: center; gap: 12px; width: 100%; padding: 12px 14px; border: 0; border-radius: inherit; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; }
581
+ .sm-agents:not(.cards) .sm-agent-head { padding: 11px 0; }
582
+ .sm-agent-head:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 60%, transparent); outline-offset: -2px; }
583
+ .sm-agent-chip { display: inline-flex; align-items: center; gap: 6px; height: 24px; padding: 0 10px; border-radius: 999px; background: color-mix(in srgb, var(--text) 6%, transparent); font-size: 12px; font-weight: 550; color: var(--text); white-space: nowrap; }
584
+ .sm-chevron { width: 8px; height: 8px; margin: 0 4px 0 2px; border-right: 1.6px solid var(--text-3); border-bottom: 1.6px solid var(--text-3); transform: rotate(45deg) translate(-2px, -2px); transition: transform calc(180ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
585
+ .sm-agent.open .sm-chevron { transform: rotate(-135deg) translate(-2px, -2px); }
586
+ .sm-agent:not(.open) > .sm-agent-body { display: none; }
587
+ .sm-agent-body { display: grid; gap: 10px; padding: 0 14px 14px 60px; }
588
+ .sm-agents:not(.cards) .sm-agent-body { padding: 0 0 12px 46px; }
589
+ .sm-agent-facts { display: grid; gap: 3px; }
590
+ .sm-agent-facts code { padding: 0; background: none; box-shadow: none; font-family: var(--mono); font-size: 11px; color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
591
+ .sm-oc { display: grid; gap: 8px; padding: 12px 14px; border-radius: 12px; box-shadow: var(--key-track); }
592
+ .sm-oc-title { font-size: 13px; font-weight: 600; color: var(--text); }
593
+ .sm-oc-row { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 6px 0; border-top: 1px solid var(--line); }
594
+ .sm-oc-title + .sm-oc-row { border-top: 0; }
595
+ .sm-oc-controls { display: inline-flex; align-items: center; gap: 10px; flex: none; }
596
+ .sm-oc-shown { font-size: 12px; color: var(--text-2); }
597
+ .sm-oc-add select { flex: 0 1 150px; }
598
+ .sm-agent-words { display: grid; gap: 2px; min-width: 0; }
599
+ .sm-agent-words b { font-size: 14.5px; font-weight: 600; }
600
+ .sm-agent-words small { font-size: 12.5px; }
601
+ .sm-agent-line { font-family: var(--mono); font-size: 11.5px !important; color: var(--text-3); overflow-wrap: anywhere; }
602
+ .sm-agent-line a { color: var(--s-acc); }
603
+ /* Which account it asks for, said where the decision is made. */
604
+ .sm-agent-note { font-size: 12px !important; color: var(--text-3); }
605
+ .sm-agent-acts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
606
+ /* Everything a connection needs that does not fit on the row: the page a sign-in opened, the
607
+ code it is waiting for, the key form. Home used to send you to a project for all of it. */
608
+ .sm-agent-ask { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
609
+ .sm-agent-code { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; flex: 1 1 240px; }
610
+ .sm-agent-code input, .sm-agent-key-form input, .sm-agent-key-form select { height: 32px; min-width: 0; padding: 0 10px; border: 0; border-radius: 9px; background: transparent; color: var(--text); font: inherit; font-size: 13px; box-shadow: var(--key-track); outline: 0; }
611
+ .sm-agent-code input { flex: 1 1 160px; }
612
+ .sm-agent-code input:focus, .sm-agent-key-form input:focus, .sm-agent-key-form select:focus { box-shadow: var(--key-down); }
613
+ .sm-agent-key-form { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
614
+ .sm-agent-key-form input { flex: 1 1 200px; }
615
+ .sm-agent-key-form .sm-agent-line, .sm-agent-key-form .sm-agent-note { flex: 1 0 100%; }
616
+ .sm-agent-key-link { font-size: 12.5px; color: var(--s-acc); text-decoration: none; }
617
+ .sm-agent-key-link:hover { text-decoration: underline; }
618
+ .sm-agent-command { grid-column: 1 / -1; font-family: var(--mono); font-size: 12px; color: var(--text-2); overflow-wrap: anywhere; }
619
+
620
+ /* LINKING TWO ROOMS, step by step (salas-mac.js, openLinkSheet), in the room's settings language:
621
+ the step and its question, what it decides; the choices on a card, a row each, the safe one
622
+ marked; and the link as it stands, in a sunk panel under every step. */
623
+ .sm-sheet.sm-link-wizard { --sm-sheet-w: 640px; }
624
+ .sm-sheet .settings-switch { display: inline-flex; gap: 0; }
625
+ .salas-mac .settings-switch input:checked + i { background: var(--s-acc); }
626
+ .lw-step { gap: 16px; }
627
+ .lw-intro { display: grid; gap: 6px; }
628
+ .lw-eyebrow { font-family: var(--mono); font-size: 10.5px; letter-spacing: .18em; text-transform: uppercase; color: var(--text-2); }
629
+ .lw-intro h3 { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -.015em; }
630
+ .lw-lead { margin: 0; max-width: 58ch; font-size: 14px; line-height: 1.55; color: var(--text-2); }
631
+ .lw-card { display: grid; margin: 0; padding: 2px 16px; list-style: none; border-radius: 14px; background: var(--surface, var(--panel)); box-shadow: var(--key-rest); }
632
+ .lw-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 13px 0; border-top: 1px solid var(--line); }
633
+ .lw-card > :first-child { border-top: 0; }
634
+ .lw-row.lw-stack { display: grid; gap: 8px; justify-content: normal; }
635
+ .lw-words { display: grid; gap: 3px; min-width: 0; }
636
+ .lw-title { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
637
+ .lw-title b { font-size: 14px; font-weight: 600; color: var(--text); }
638
+ .lw-note { max-width: 46ch; font-size: 12.5px; line-height: 1.45; color: var(--text-2); }
639
+ .lw-tag { padding: 2px 7px; border-radius: 7px; font-size: 11px; font-weight: 600; color: color-mix(in srgb, var(--s-acc) 72%, var(--text)); background: color-mix(in srgb, var(--s-acc) 14%, transparent); }
640
+ .lw-dot { flex: none; width: 9px; height: 9px; border-radius: 50%; }
641
+ .lw-dot.k-decision { background: var(--mem-decision); } .lw-dot.k-fact { background: var(--mem-fact); } .lw-dot.k-preference { background: var(--mem-preference); } .lw-dot.k-question { background: var(--mem-question); }
642
+ :root[data-scheme="light"] .lw-dot.k-fact { background: #b9c6d6; }
643
+ .lw-select { flex: none; width: 200px; }
644
+ .lw-input { width: 100%; }
645
+ .lw-control { flex: none; }
646
+ .lw-caution { display: flex; align-items: flex-start; gap: 10px; padding: 11px 0; border-top: 1px solid var(--line); font-size: 13px; line-height: 1.45; color: var(--text); }
647
+ .lw-caution i { flex: none; width: 8px; height: 8px; margin-top: 6px; border-radius: 50%; background: var(--session-wait); }
648
+ .lw-foot { margin: 0; font-size: 12.5px; line-height: 1.5; color: var(--text-2); }
649
+ /* What a connection allows, line by line (2026-10-11): a tick in the accent for what it lets
650
+ happen, a quiet cross for what it never does. */
651
+ .lw-allows { display: grid; gap: 9px; padding: 12px 0 14px; border-top: 1px solid var(--line); }
652
+ .lw-allows-head { font-size: 12px; font-weight: 600; color: var(--text-2); }
653
+ .lw-allows ul { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
654
+ .lw-allows li { display: flex; align-items: flex-start; gap: 10px; font-size: 13px; line-height: 1.45; color: var(--text); }
655
+ .lw-allows li.no { color: var(--text-2); }
656
+ .lw-allows li i { flex: none; display: grid; place-items: center; width: 18px; height: 18px; margin-top: 0; border-radius: 50%; }
657
+ .lw-allows li i svg { width: 12px; height: 12px; }
658
+ .lw-allows li.yes i { color: color-mix(in srgb, var(--s-acc) 78%, var(--text)); background: color-mix(in srgb, var(--s-acc) 16%, transparent); }
659
+ .lw-allows li.no i { color: var(--text-2); background: color-mix(in srgb, var(--text) 7%, transparent); }
660
+ /* Two projects already connected: how, and where to change it, in place of a new connection. */
661
+ .lw-already { justify-items: start; }
662
+ .lw-already p { margin: 0; }
663
+ .lw-already-says { font-size: 13.5px; line-height: 1.45; color: var(--text); }
664
+ .lw-already .sm-btn { margin-top: 2px; }
665
+ /* The scene over every step, in the welcome's style: the two rooms arriving and floating, BISHOP
666
+ with its ring, the wire running the way the notes travel and the notes crossing it in their
667
+ kinds' colours; under it, the link's terms as chips, with no rule between (2026-10-10). */
668
+ .scene-link { display: grid; height: auto; }
669
+ .lw-field { position: relative; height: 124px; }
670
+ .lw-wires { position: absolute; inset: 0; z-index: 0; width: 100%; height: 100%; pointer-events: none; }
671
+ .lw-wires path { fill: none; }
672
+ .lw-crossing { stroke: var(--surface, var(--panel)); stroke-width: 1.5; }
673
+ .lw-crossing.k-decision { fill: var(--mem-decision); } .lw-crossing.k-fact { fill: var(--mem-fact); } .lw-crossing.k-preference { fill: var(--mem-preference); } .lw-crossing.k-question { fill: var(--mem-question); }
674
+ :root[data-scheme="light"] .lw-crossing.k-fact { fill: #9fb0c6; }
675
+ .lw-end { z-index: 1; display: grid; justify-items: center; gap: 2px; transform: translate(-50%, -23px); animation: lw-arrive calc(620ms * var(--motion-scale, 1)) var(--ease-out, ease-out) var(--d) both, lw-float 4.2s ease-in-out calc(var(--d) + 700ms) infinite alternate; }
676
+ @keyframes lw-arrive { from { opacity: 0; transform: translate(-50%, -23px) scale(.45); } }
677
+ @keyframes lw-float { to { transform: translate(-50%, -28px); } }
678
+ .lw-end b { max-width: 130px; margin-top: 5px; font-size: 13px; font-weight: 650; color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
679
+ .lw-end small { font-size: 11px; color: var(--text-2); }
680
+ .lw-room-mark { display: grid; place-items: center; width: 46px; height: 46px; border-radius: 50%; background: var(--surface, var(--panel)); box-shadow: var(--raise, var(--key-rest)); color: color-mix(in srgb, var(--s-acc) 72%, var(--text-2)); }
681
+ .lw-room-mark svg { width: 22px; height: 19px; }
682
+ .lw-end.is-bishop::before { content: ''; position: absolute; top: -6px; left: 50%; width: 58px; height: 58px; margin-left: -29px; border-radius: 50%; box-shadow: 0 0 0 2px color-mix(in srgb, var(--s-acc) 45%, transparent); animation: sm-ring 2.4s ease-out infinite; pointer-events: none; }
683
+ .scene-link .lw-terms { position: relative; z-index: 1; display: flex; flex-wrap: wrap; justify-content: center; gap: 6px; margin: 0; padding: 2px 14px 12px; }
684
+ .scene-link .lw-terms span { padding: 2px 9px; border-radius: 7px; font-size: 11.5px; line-height: 1.55; color: var(--text-2); background: color-mix(in srgb, var(--text) 6%, transparent); white-space: nowrap; }
685
+ .scene-link .lw-terms span:first-child { color: var(--text); font-weight: 600; }
686
+ /* One view, no scrolling: the assistant is compact. */
687
+ .sm-link-wizard .sm-sheet-body { gap: 12px; padding: 18px 22px; }
688
+ .sm-link-wizard .lw-step { gap: 12px; }
689
+ .sm-link-wizard .lw-intro h3 { font-size: 20px; }
690
+ .sm-link-wizard .lw-lead { font-size: 13.5px; line-height: 1.5; }
691
+ .sm-link-wizard .lw-row { padding: 10px 0; }
692
+ .lw-card.lw-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); column-gap: 22px; }
693
+ .lw-card.lw-grid > .lw-row { border-top: 1px solid var(--line); }
694
+ .lw-card.lw-grid > .lw-row:nth-child(-n+2) { border-top: 0; }
695
+ .lw-pick { display: flex; align-items: center; gap: 8px; }
696
+ /* Both ways: the two projects side by side, the sign that says each reads the other between them. */
697
+ .lw-pair { display: flex; align-items: center; gap: 10px; min-width: 0; }
698
+ .lw-pair .lw-select { flex: 1 1 0; width: auto; min-width: 0; }
699
+ .lw-both { display: grid; place-items: center; flex: none; width: 22px; color: var(--text-2); }
700
+ .lw-both svg { width: 18px; height: 18px; }
701
+ .lw-pick .lw-select { width: 170px; }
702
+ .lw-review li { position: relative; padding: 12px 0 12px 20px; border-top: 1px solid var(--line); font-size: 14px; line-height: 1.5; color: var(--text); }
703
+ .lw-review li:first-child { border-top: 0; }
704
+ .lw-review li::before { content: ''; position: absolute; left: 2px; top: 19px; width: 8px; height: 8px; border-radius: 50%; background: var(--s-acc); }
705
+ @media (max-width: 640px) {
706
+ .lw-row { flex-wrap: wrap; }
707
+ .lw-select { width: 100%; }
708
+ .lw-card.lw-grid { grid-template-columns: minmax(0, 1fr); }
709
+ .lw-card.lw-grid > .lw-row:nth-child(2) { border-top: 1px solid var(--line); }
710
+ .lw-pick { flex-wrap: wrap; }
711
+ }
712
+ @media (prefers-reduced-motion: reduce) { .lw-end, .lw-end.is-bishop::before { animation: none; } .lw-wires .sm-wire { animation: none; } }
713
+
714
+ /* AJUSTES, the room's window (styles.css: #settings, .settings-*, .sx-*), as wide as the room's.
715
+ Its head stays at the top of the screen while the screen carries the window. The board, the
716
+ scrim and the sheet over it share one place, so the window is as tall as the taller of the two
717
+ and nothing inside it scrolls. */
718
+ .sm-sheet.sm-settings { --sm-sheet-w: 980px; }
719
+ .sm-sheet-body.sm-settings-window { display: flex; flex-direction: column; gap: 0; padding: 0; min-height: min(640px, calc(100dvh - 56px)); }
720
+ /* Sticky against the screen's edge, not the layer's padding: the head meets the top of the screen. */
721
+ .sm-settings-window > .settings-head { position: sticky; top: calc(-1 * var(--sm-sheet-pad, 0px)); z-index: 4; cursor: default; touch-action: auto; background: color-mix(in srgb, var(--bg-2) 96%, transparent); -webkit-backdrop-filter: blur(22px) saturate(1.2); backdrop-filter: blur(22px) saturate(1.2); }
722
+ .sm-settings-body { position: relative; flex: 1; display: grid; container: settings / inline-size; }
723
+ .sm-settings-body > * { grid-area: 1 / 1; min-width: 0; }
724
+ .sm-settings-body > .settings-board { align-self: start; overflow: visible; }
725
+ .sm-settings-body > .settings-results { align-self: start; overflow: visible; }
726
+ .sm-settings-body > .settings-scrim { position: absolute; inset: 0; }
727
+ .sm-settings-body > .settings-sheet { position: relative; inset: auto; justify-self: end; width: min(580px, 64%); display: block; overflow: visible; }
728
+ .sm-settings-body .settings-scroll { overflow: visible; }
729
+ @container settings (max-width: 700px) { .sm-settings-body > .settings-sheet { width: 100%; } }
730
+ /* Appearance over the whole window, in two columns when there is room; the wallpapers small enough
731
+ that the thirteen fit in two rows. */
732
+ .sm-settings-body > .settings-sheet.full { justify-self: stretch; width: auto; max-width: none; min-width: 0; }
733
+ .sm-settings-body > .settings-sheet.full .settings-scroll { padding: 16px 22px 24px; }
734
+ .sm-look-top { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 30px; }
735
+ .sm-look-top .sx-intro { margin: 0 2px; }
736
+ .sm-look { grid-template-columns: minmax(0, 1fr); align-items: start; }
737
+ .sm-look-side { display: grid; grid-auto-rows: max-content; gap: 14px; min-width: 0; }
738
+ @container settings (min-width: 760px) { .sm-look { grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); } }
739
+ .sm-look .custom-papers { grid-template-columns: repeat(auto-fill, minmax(64px, 1fr)); gap: 6px; }
740
+ .sm-look .paper { gap: 4px; padding: 3px 3px 5px; border-radius: 10px; }
741
+ .sm-look .paper-swatch { height: 38px; border-radius: 7px; }
742
+ .sm-look .paper-name { font-size: 11px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
743
+ .sm-look .custom-swatches { gap: 10px; }
744
+ .sm-look .sx-row.stack .custom-seg { display: flex; }
745
+ .sm-look .sx-row.stack .custom-seg .seg-option { flex: 1 1 auto; padding-inline: 8px; white-space: nowrap; }
746
+ .sm-look .sx-preview .look-preview { max-height: 204px; }
747
+ dialog.sm-sheet.sm-settings[open] { --sm-sheet-pad: 20px; }
748
+ /* The agents of this Mac, inside their block: the block is the card. */
749
+ .sx-block .sm-agents { padding: 0 16px 6px; border-radius: 0; background: none; box-shadow: none; }
750
+
751
+ /* THE BAR'S ROOMS, arranged as the room's bar is (styles.css, .bar-editing, .bar-badge, .bar-card):
752
+ the rooms tremble, each wears a «−», and a card under the bar offers the projects not on it. */
753
+ .sm-tb-open { position: relative; }
754
+ .sm-tb-open.is-editing { padding: 6px; margin: -6px; }
755
+ .sm-tb-open.is-editing > .sm-tb-room[data-bar-item] { animation: bar-jiggle calc(260ms * var(--motion-scale, 1)) ease-in-out infinite; animation-delay: var(--jiggle-delay, 0ms); touch-action: none; cursor: grab; }
756
+ .sm-tb-open.is-editing > .sm-tb-room[data-bar-item]:nth-child(even) { animation-direction: reverse; }
757
+ .sm-tb-open.is-editing > .bar-lifted { position: relative; z-index: 1; cursor: grabbing; animation-play-state: paused; }
758
+ .sm-tb-room:is(.is-spilled, .is-moving) { display: none; }
759
+ .sm-tb-room.is-asleep { color: var(--text-2); }
760
+ .sm-tb-room.is-asleep i { background: transparent; box-shadow: inset 0 0 0 1.5px var(--text-3); }
761
+ /* A project carried to the bar: where it would land, in its own name, drawn as a key that is not
762
+ there yet. */
763
+ .sm-tb-room.sm-tb-slot { background: transparent; box-shadow: none; outline: 1.5px dashed color-mix(in srgb, var(--s-acc) 75%, transparent); outline-offset: -1.5px; color: var(--text-2); pointer-events: none; }
764
+ .sm-tb-slot i { background: var(--s-acc); }
765
+ .sm-pins-card .bar-grid, .bar-more-card .bar-grid { max-height: none; overflow: visible; }
766
+ .sm-pin-glyph { position: relative; }
767
+ .sm-pin-glyph svg { width: 20px; height: 17px; }
768
+ .sm-pin-glyph i { position: absolute; right: -2px; bottom: -2px; width: 9px; height: 9px; border-radius: 50%; background: var(--session-ok); box-shadow: 0 0 0 2px var(--surface, var(--panel)); }
769
+ .sm-pin-glyph.is-asleep i { background: var(--surface, var(--panel)); box-shadow: 0 0 0 2px var(--surface, var(--panel)), inset 0 0 0 1.5px var(--text-3); }
770
+ .sm-pin-glyph:is(.is-waiting, .is-working) i { background: var(--s-acc); }
771
+ .sm-pin-glyph:is(.is-outdated, .is-quiet) i { background: var(--session-wait); }
772
+ /* A project's right-click: the bar card's material, a row per thing it can do. */
773
+ .bar-card.sm-menu { width: auto; min-width: 214px; padding: 6px; display: grid; gap: 2px; }
774
+ .sm-menu-item { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 34px; padding: 0 10px; border: 0; border-radius: 9px; background: transparent; color: var(--text); font-family: var(--read); font-size: 13px; text-align: left; cursor: pointer; }
775
+ .sm-menu-item svg { flex: none; width: 16px; height: 16px; color: var(--phosphor); }
776
+ .sm-menu-item:hover, .sm-menu-item:focus-visible { background: color-mix(in srgb, var(--text) 7%, transparent); outline: none; }
777
+ .sm-menu-item.danger, .sm-menu-item.danger svg { color: var(--danger, var(--terror)); }
778
+ .sm-menu-sep { display: block; height: 1px; margin: 4px 8px; background: var(--line); }
779
+ /* The card's own key for that menu, for whoever does not right-click: quiet until the card is
780
+ under the pointer. */
781
+ .sm-card-more { flex: none; display: grid; place-items: center; width: 26px; height: 26px; margin: -4px -6px -4px 0; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--text-2); opacity: .7; cursor: pointer; transition: opacity calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out), background-color calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
782
+ .sm-card-more svg { width: 16px; height: 16px; }
783
+ .sm-card:hover .sm-card-more, .sm-card-more:focus-visible { opacity: 1; }
784
+ .sm-card-more:hover { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
785
+ .sm-card-more:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
786
+ /* Home's notices (salas-mac.js, toast): the room's, at the foot of the screen, over any sheet. */
787
+ .toast.sm-toast { position: fixed; inset: auto auto 28px 50%; z-index: 80; margin: 0; transform: translateX(-50%); overflow: visible; }
788
+ @media (prefers-reduced-motion: reduce) { .sm-tb-open.is-editing > .sm-tb-room[data-bar-item] { animation: none; } }
789
+
790
+ /* HOME'S OWN APPEARANCE (salas-mac.js, HOME_LOOKS; 2026-10-11). The preview is Home itself, small,
791
+ on the room's preview ground (styles.css, .look-preview), with its bar, the Coordinator and two
792
+ projects; and Home's choices on the page: cards with or without their last conversation, the
793
+ text a little larger or smaller, and the order of the projects (draw()). */
794
+ .sm-home-preview { display: grid; align-content: start; gap: 8px; min-height: 0; padding: 10px !important; font-family: var(--read); }
795
+ .sm-home-preview > * { position: relative; z-index: 1; }
796
+ .hp-bar { display: flex; align-items: center; gap: 6px; min-width: 0; height: 26px; padding: 0 9px; border-radius: 9px; background: color-mix(in srgb, var(--bg) 84%, transparent); box-shadow: 0 1px 2px rgba(0, 0, 0, .16), 0 6px 14px -10px rgba(0, 0, 0, .4); font-size: 9.5px; color: var(--text-2); overflow: hidden; }
797
+ .hp-logo { flex: none; width: 22px; height: 6px; border-radius: 3px; background: var(--acc, var(--phosphor)); }
798
+ .hp-bar b { flex: none; color: var(--text); font-weight: 650; }
799
+ .hp-pin { display: inline-flex; align-items: center; gap: 4px; min-width: 0; height: 16px; padding: 0 6px; border-radius: 5px; background: var(--panel); color: var(--text); font-family: var(--mono); font-size: 8.5px; white-space: nowrap; overflow: hidden; }
800
+ .hp-pin i { flex: none; width: 5px; height: 5px; border-radius: 50%; background: var(--session-ok); }
801
+ .hp-grid { display: grid; grid-template-columns: 1.25fr 1fr 1fr; gap: 8px; align-items: start; }
802
+ .hp-tile { display: grid; align-content: start; gap: 6px; min-width: 0; padding: 10px; border-radius: 12px; background: color-mix(in srgb, var(--panel) 90%, transparent); box-shadow: 0 1px 2px rgba(0, 0, 0, .16), 0 10px 20px -14px rgba(0, 0, 0, .5); font-size: 10px; color: var(--text); }
803
+ .hp-tile b { min-width: 0; font-size: 11.5px; font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
804
+ .hp-tile small { font-size: 9px; color: var(--text-2); }
805
+ .hp-head { display: flex; align-items: center; gap: 6px; min-width: 0; }
806
+ .hp-mark { flex: none; width: 18px; height: 18px; border-radius: 50%; background: #5c255e; box-shadow: inset 0 0 0 4.5px #5c255e, inset 0 0 0 6px #ffffff; }
807
+ .hp-state { display: flex; align-items: center; gap: 4px; }
808
+ .hp-state i { width: 5px; height: 5px; border-radius: 50%; background: var(--session-ok); }
809
+ .hp-card:nth-child(3) .hp-state i { background: transparent; box-shadow: inset 0 0 0 1.2px var(--text-3); }
810
+ .hp-chat { height: 16px; border-radius: 4px; background: color-mix(in srgb, var(--text) 9%, transparent); }
811
+ .hp-strip { height: 4px; border-radius: 2px; background: linear-gradient(90deg, var(--mem-decision, #ffdc3c) 0 28%, var(--mem-fact, #dfeeff) 28% 70%, var(--mem-preference, #5cf07a) 70% 84%, var(--mem-question, #3dc6ff) 84%); }
812
+ .hp-key { justify-self: start; margin-top: 2px; padding: 3px 8px; border-radius: 6px; background: var(--panel-2); font-size: 9px; font-weight: 600; white-space: nowrap; }
813
+ .hp-key.on, .hp-coord .hp-key { background: var(--acc, var(--phosphor)); color: var(--acc-ink, var(--phosphor-ink)); }
814
+ /* The Coordinator's key is the longest: inside its card it breaks into two lines rather than
815
+ running past the edge (2026-10-11). */
816
+ .hp-key { max-width: 100%; box-sizing: border-box; }
817
+ .hp-coord .hp-key { white-space: normal; line-height: 1.3; overflow-wrap: anywhere; }
818
+ .sm-home-preview[data-home-cards="compact"] :is(.hp-chat, .hp-strip) { display: none; }
819
+ .sm-home-preview[data-home-text="larger"] .hp-grid { zoom: 1.08; }
820
+ .sm-home-preview[data-home-text="smaller"] .hp-grid { zoom: .92; }
821
+ :root[data-home-cards="compact"] .sm-card :is(.sm-chat, .sm-strip, .sm-counts) { display: none; }
822
+ :root[data-home-text="larger"] .sm-main { zoom: 1.08; }
823
+ :root[data-home-text="smaller"] .sm-main { zoom: .93; }
824
+ /* A newer MADRE in the bar: a key now, that opens Home's Version. */
825
+ button.sm-pill { border: 0; cursor: pointer; }
826
+ .sm-pill.is-update svg { width: 14px; height: 14px; flex: none; }
827
+ .sm-pill.is-update:hover { background: color-mix(in srgb, var(--session-wait) 28%, transparent); }
828
+ .sm-pill.is-update:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
829
+ /* A project's name inside the wizard's sentences stands out (salas-mac.js, sayBold). */
830
+ :is(.lw-lead, .lw-note, .lw-review li, .lw-caution, .lw-allows li, .lw-already-says) b { font-weight: 650; color: var(--text); }
831
+
832
+ #sm-map svg { cursor: zoom-in; }
833
+
834
+ /* HOME, ARRANGED BY ITS PERSON (salas-mac.js, applyLayout · 2026-10-13): any tile at 4, 6, 8 or 12
835
+ columns, above or below the projects, or off Home; widgets beside them, fed by real readings. */
836
+ .c-6 { grid-column: span 6; } .c-12 { grid-column: 1 / -1; }
837
+ .sm-tile.sm-off { display: none !important; }
838
+ .sm-bento.sm-empty { display: none; }
839
+ @media (max-width: 920px) { .sm-bento > .c-6, .sm-bento > .c-12 { grid-column: 1 / -1; } }
840
+ .custom-seg.four { grid-template-columns: repeat(4, minmax(0, 1fr)); }
841
+ .sm-menu-head { display: block; padding: 8px 12px 4px; font-size: 11px; font-weight: 650; letter-spacing: .06em; text-transform: uppercase; color: var(--text-3); }
842
+ .sm-menu-item.checked { color: var(--s-acc); }
843
+ .sm-menu-item.checked::after { content: '✓'; margin-left: auto; padding-left: 12px; font-weight: 700; }
844
+ .sm-menu-item:disabled { opacity: .4; cursor: default; }
845
+
846
+ dialog.sm-sheet.sm-add-sheet { --sm-sheet-w: 560px; }
847
+ .sm-add-sheet .sm-sheet-body { display: grid; gap: 12px; }
848
+ .sm-add-list { display: grid; gap: 8px; }
849
+ .sm-add-row { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 14px; border-radius: 12px; background: var(--surface, var(--panel)); box-shadow: var(--key-rest); }
850
+ .sm-add-words { display: grid; gap: 2px; min-width: 0; }
851
+ .sm-add-words b { font-size: 14px; font-weight: 600; }
852
+ .sm-add-words small { font-size: 12.5px; color: var(--text-2); }
853
+ .sm-add-words .sm-add-need { color: var(--text-3); }
854
+ .sm-add-words .sm-add-need:empty { display: none; }
855
+
856
+ .sm-widget { gap: 12px; }
857
+ .sm-w-body { display: grid; gap: 12px; align-content: start; min-width: 0; }
858
+ .sm-w-metric { display: grid; gap: 4px; }
859
+ .sm-w-label { font-size: 11px; font-weight: 650; letter-spacing: .08em; text-transform: uppercase; color: var(--text-3); }
860
+ .sm-w-big { font-size: 22px; font-weight: 650; letter-spacing: -.01em; color: var(--text); font-variant-numeric: tabular-nums; }
861
+ .sm-w-body small { font-size: 12px; color: var(--text-2); }
862
+ .sm-meter { display: block; height: 6px; border-radius: 999px; background: color-mix(in srgb, var(--text) 9%, transparent); overflow: hidden; }
863
+ .sm-meter i { display: block; height: 100%; border-radius: inherit; background: var(--s-acc); transition: width calc(400ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
864
+ .sm-meter.warm i { background: #e3a326; }
865
+ .sm-meter.hot i { background: #e5533d; }
866
+ .sm-w-row { display: grid; grid-template-columns: auto auto minmax(0, 1fr) auto; align-items: center; gap: 8px; font-size: 13px; }
867
+ .sm-w-row b { font-family: var(--mono); font-size: 12.5px; }
868
+ .sm-w-row span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-2); }
869
+ .sm-w-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--session-ok, #3f9b3a); }
870
+ .sm-w-row.bad .sm-w-dot { background: var(--session-bad, #d9493a); }
871
+ .sm-w-project { display: grid; gap: 5px; }
872
+ .sm-w-line { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
873
+ .sm-w-line b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; font-weight: 600; }
874
+ .sm-w-line small { margin-left: auto; font-variant-numeric: tabular-nums; }
875
+ .sm-w-stage { font-size: 10.5px; font-weight: 650; letter-spacing: .06em; color: var(--text-3); white-space: nowrap; }
876
+ .sm-w-says { margin: 0; font-size: 12.5px; color: var(--text-2); }
877
+ .sm-w-foot { color: var(--text-3) !important; }
878
+ .sm-w-foot.mono { font-family: var(--mono); font-size: 11px !important; overflow-wrap: anywhere; }
879
+ /* What a tile is, in the accent: on its row of «Add to Home» and at the head of its menu. */
880
+ .sm-tile-icon { flex: none; display: inline-grid; place-items: center; width: 36px; height: 36px; border-radius: 10px; background: color-mix(in srgb, var(--s-acc) 14%, transparent); color: color-mix(in srgb, var(--s-acc) 82%, var(--text)); }
881
+ .sm-tile-icon svg { width: 20px; height: 20px; }
882
+ .sm-add-row { justify-content: flex-start; }
883
+ .sm-add-row .sm-add-words { flex: 1; }
884
+ .sm-add-sheet .sm-sheet-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; }
885
+ .sm-menu-head { display: flex; align-items: center; gap: 8px; }
886
+ .sm-menu-head .sm-tile-icon { width: 22px; height: 22px; border-radius: 6px; }
887
+ .sm-menu-head .sm-tile-icon svg { width: 14px; height: 14px; }
888
+ .salas-mac .sm-menu-item svg { color: var(--s-acc); }
889
+
890
+ /* THE MAP, INTERACTIVE (2026-10-13): a project under the pointer, or chosen, lights its own lines
891
+ and the projects at their ends; the rest steps back. The window is the same drawing, wide, with
892
+ what was chosen beside it. */
893
+ .sm-map svg :is(.node, .bishop, .wire, .spoke) { transition: opacity calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
894
+ .sm-map svg.focusing :is(.node, .bishop, .wire):not(.lit), .sm-map svg.focusing .spoke { opacity: .16; }
895
+ /* A note in transit is moved and faded by its own animation: one that steps back is hidden, never
896
+ dimmed — an opacity set here would show it resting at the corner before it sets off. */
897
+ .sm-map svg.focusing .note:not(.lit) { visibility: hidden; }
898
+ .sm-map svg.focusing .wire.lit { stroke-opacity: 1; stroke-width: 2.2; }
899
+ .sm-map .pickable { cursor: pointer; }
900
+ .sm-map .wire.pickable { pointer-events: stroke; }
901
+ dialog.sm-sheet.sm-graph { --sm-sheet-w: min(1120px, 94vw); }
902
+ .sm-graph .sm-sheet-body { display: grid; gap: 14px; }
903
+ .sm-graph .sm-sheet-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
904
+ .sm-graph-title { display: grid; gap: 2px; }
905
+ .sm-graph-title h3 { margin: 0; }
906
+ .sm-graph-title small { font-size: 12.5px; color: var(--text-3); }
907
+ .sm-graph-stage { display: grid; grid-template-columns: minmax(0, 1fr) 260px; gap: 16px; min-height: min(620px, 72vh); }
908
+ .sm-graph-canvas { height: auto !important; min-height: min(620px, 72vh); margin: 0 !important; }
909
+ .sm-graph-side { display: flex; flex-direction: column; align-items: flex-start; gap: 6px; padding: 18px; border-radius: 16px; background: var(--surface, var(--panel)); box-shadow: var(--key-track); overflow: auto; }
910
+ .sm-graph-big { font-size: 30px; font-weight: 650; letter-spacing: -.02em; line-height: 1.05; color: var(--text); font-variant-numeric: tabular-nums; }
911
+ .sm-graph-sub { margin-bottom: 10px; font-size: 12.5px; color: var(--text-2); }
912
+ .sm-graph-name { font-size: 18px; font-weight: 650; }
913
+ .sm-graph-list { display: flex; flex-direction: column; gap: 4px; margin-bottom: 10px; }
914
+ .sm-graph-label { font-size: 10.5px; font-weight: 650; letter-spacing: .08em; text-transform: uppercase; color: var(--text-3); }
915
+ .sm-graph-who { margin: 0 0 8px; font-size: 14.5px; line-height: 1.45; }
916
+ .sm-graph-fact { display: grid; gap: 1px; margin-bottom: 8px; font-size: 13px; color: var(--text); }
917
+ .sm-graph-side .sm-btn { margin-top: 6px; }
918
+ .sm-graph-side .sm-hint { margin: 6px 0 4px; font-size: 12.5px; line-height: 1.45; }
919
+ @media (max-width: 760px) { .sm-graph-stage { grid-template-columns: 1fr; } .sm-graph-canvas { min-height: 380px; } }
920
+ .sm-map .hit { fill: none; stroke: transparent; stroke-width: 14; cursor: pointer; pointer-events: stroke; }
921
+ .sm-map .wire.hover { stroke-opacity: 1; stroke-width: 2.4; }
922
+ /* Carried: the tile or card leaves a quiet outline where it would land. */
923
+ .sm-carried { opacity: .35; outline: 1.5px dashed color-mix(in srgb, var(--s-acc) 60%, transparent); outline-offset: -6px; }
924
+ [data-tile] :is(.sm-tile-head, .sm-bishop-head) { cursor: grab; }
925
+ [data-tile] :is(.sm-tile-head, .sm-bishop-head) :is(a, button) { cursor: pointer; }
926
+ .sm-graph-quiet { font-size: 12.5px; line-height: 1.5; color: var(--text-3); }
927
+ /* The order of the projects, beside the filter that chooses which of them show. */
928
+ .sm-order { flex: none; gap: 6px; height: 36px; padding: 0 12px; }
929
+ .sm-order svg { width: 16px; height: 16px; color: var(--s-acc); }
930
+ .sm-menu-head + .sm-menu-item { margin-top: 2px; }
931
+ .sm-menu .sm-menu-head:last-child { max-width: 240px; padding-bottom: 8px; font-size: 11.5px; font-weight: 450; letter-spacing: 0; text-transform: none; line-height: 1.4; }
932
+
933
+ /* ==========================================================================================
934
+ ONE BOARD · 13 OCT
935
+ Home is one board of tiles in the person's order, the projects' drawer among them. Each tile is
936
+ as tall as what it holds: the board's rows are 4 px and salas-mac.js (tileFits) sets how many a
937
+ tile spans, so a tile made wider or narrower never stretches to a height chosen for another.
938
+ ========================================================================================== */
939
+ .sm-hero { margin: 0; }
940
+ #sm-top.sm-bento { grid-auto-rows: 4px; row-gap: 0; column-gap: 16px; align-items: start; margin-top: 18px; }
941
+ #sm-top > .sm-tile { align-self: start; }
942
+ #sm-top > .sm-bishop .sm-work { flex: none; }
943
+
944
+ /* The drawer of projects: its tools in its head, three rows of cards, and a key for the rest. */
945
+ .sm-drawer { gap: 14px; padding: 18px 20px 20px; }
946
+ .sm-drawer-head { flex-wrap: wrap; justify-content: flex-start; gap: 10px 12px; }
947
+ .sm-drawer-head h2 { margin: 0; }
948
+ .sm-drawer-head .sm-tools { margin-left: auto; padding: 0; background: transparent !important; box-shadow: none !important; flex-wrap: wrap; justify-content: flex-end; }
949
+ .sm-drawer .sm-projects { margin: 0; }
950
+ .sm-drawer .sm-projects > .sm-card { box-shadow: var(--key-rest); }
951
+ .sm-drawer .sm-projects > .sm-card[hidden] { display: none; }
952
+ .sm-drawer-more { align-self: center; display: inline-flex; align-items: center; gap: 8px; height: 30px; padding: 0 14px; border: 0; border-radius: 999px; background: var(--surface, var(--panel)); box-shadow: var(--key-rest); color: var(--text-2); font: inherit; font-size: 12.5px; cursor: pointer; }
953
+ .sm-drawer-more b { font-family: var(--mono); font-size: 12px; font-weight: 650; color: var(--text); }
954
+ .sm-drawer-more:hover { box-shadow: var(--key-over, var(--key-rest)); color: var(--text); }
955
+ .sm-drawer-more[hidden] { display: none; }
956
+ @media (max-width: 920px) { .sm-drawer-head .sm-tools { margin-left: 0; width: 100%; justify-content: flex-start; } }
957
+
958
+ /* ==========================================================================================
959
+ THE WIDGET CONTRACT · 13 OCT
960
+ A widget is <section class="sm-tile sm-widget"> with a .sm-tile-head and a .sm-w-body. Inside,
961
+ these pieces arrange themselves by the width the tile was given (container queries on the
962
+ tile), never by the window, so any widget works at Small, Medium, Large or Full width:
963
+ .sm-w-grid repeated items (projects, servers, metrics) in as many columns as fit
964
+ .sm-w-metric a label, a big number, a meter and a line
965
+ .sm-w-project a name with a figure and a meter under it
966
+ .sm-meter a bar; .warm and .hot when it runs high
967
+ The tokens below are the only sizes a widget should use.
968
+ ========================================================================================== */
969
+ .sm-tile { container: tile / inline-size; }
970
+ .sm-tile, .sm-widget {
971
+ --w-gap: 12px;
972
+ --w-col: 200px;
973
+ --w-big: 22px;
974
+ --w-text: 13px;
975
+ }
976
+ .sm-w-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, var(--w-col)), 1fr)); gap: var(--w-gap) calc(var(--w-gap) * 1.8); }
977
+ .sm-w-big { font-size: var(--w-big); }
978
+ .sm-w-body { gap: var(--w-gap); font-size: var(--w-text); }
979
+ @container tile (max-width: 300px) {
980
+ .sm-widget { --w-big: 19px; --w-gap: 10px; }
981
+ .sm-w-row { grid-template-columns: auto auto minmax(0, 1fr); }
982
+ .sm-w-row small { grid-column: 3; }
983
+ }
984
+ @container tile (min-width: 640px) {
985
+ .sm-widget { --w-big: 26px; --w-col: 240px; }
986
+ }
987
+ /* The Coordinator's summary reads as two columns when the tile is wide enough for them. */
988
+ @container tile (min-width: 980px) {
989
+ .sm-bishop .sm-work-list { grid-template-columns: max-content minmax(0, 1fr) max-content minmax(0, 1fr); }
990
+ .sm-bishop .sm-work-list li { grid-column: span 2; }
991
+ }
992
+
993
+ /* The connections, as cards in two columns: a long list is scanned across, not scrolled down. */
994
+ .sm-sheet.sm-wide:has(#sm-links) { --sm-sheet-w: 980px; }
995
+ .sm-link-list { grid-template-columns: repeat(auto-fill, minmax(min(100%, 400px), 1fr)); gap: 12px; align-items: stretch; }
996
+ .sm-link-list .sm-link { grid-template-columns: minmax(0, 1fr); gap: 7px; padding: 16px 18px; }
997
+ .sm-link-list .sm-link .sm-actions { grid-column: 1; grid-row: auto; justify-content: flex-end; margin-top: 4px; }
998
+ .sm-link-list .sm-link .who { font-size: 14.5px; }
999
+ .sm-link-list .sm-link { grid-template-columns: minmax(0, 1fr) auto; }
1000
+ .sm-link-list .sm-link > :is(.sm-link-kind, .who, .what, .traffic) { grid-column: 1 / -1; }
1001
+ .sm-link-list .sm-link > .sm-recall { grid-column: 1; margin: 0; }
1002
+ .sm-link-list .sm-link > .sm-actions { grid-column: 2; grid-row: auto; margin: 0; align-self: center; }
1003
+
1004
+ /* ==========================================================================================
1005
+ THE MAP AS A SKY · 13 OCT
1006
+ Each project a star in its tone (salas-mac.js, paintMap): a halo that breathes, a core and a
1007
+ white heart; the Coordinator the brightest, in its own colour, its mark at the heart. In the
1008
+ dark the stars glow on the sky; in the light they are quieter, so the names keep their contrast.
1009
+ ========================================================================================== */
1010
+ .sm-map { --star-halo: .5; --star-heart: .7; --star-blend: normal; }
1011
+ :root[data-scheme="dark"] .sm-map, .mv .sm-map { --star-halo: .85; --star-heart: .95; --star-blend: screen; }
1012
+ .sm-map .node .star { animation: sm-twinkle var(--tw, 3.2s) ease-in-out var(--tw-delay, 0s) infinite; }
1013
+ .sm-map .node .star .halo { opacity: var(--star-halo); mix-blend-mode: var(--star-blend); transform-box: fill-box; transform-origin: center; animation: sm-breathe var(--tw, 3.2s) ease-in-out var(--tw-delay, 0s) infinite; }
1014
+ .sm-map .node .star .body { fill: var(--pc, var(--s-acc)); stroke: none; stroke-dasharray: none; }
1015
+ .sm-map .node .star .heart { fill: #ffffff; opacity: var(--star-heart); }
1016
+ .sm-map .node:not(.linked) .star .body { fill: color-mix(in srgb, var(--pc, var(--s-acc)) 45%, var(--text-3)); }
1017
+ .sm-map .node:not(.linked) .star .halo { opacity: calc(var(--star-halo) * .4); }
1018
+ .sm-map .node:not(.linked) .star .heart { opacity: calc(var(--star-heart) * .5); }
1019
+ /* Asleep, a star still shines, lower and without twinkling. */
1020
+ .sm-map .node.asleep .star { animation: none; opacity: .72; }
1021
+ .sm-map .node.asleep .star .halo { animation: none; opacity: calc(var(--star-halo) * .55); }
1022
+ .sm-map .bishop .corona { opacity: var(--star-halo); mix-blend-mode: var(--star-blend); transform-box: fill-box; transform-origin: center; animation: sm-breathe 4.6s ease-in-out infinite; }
1023
+ .sm-map .bishop .halo { fill: none; stroke: color-mix(in srgb, #ffffff 30%, transparent); stroke-width: 1; }
1024
+ :root[data-scheme="light"] .sm-map .bishop .halo { stroke: color-mix(in srgb, var(--text) 12%, transparent); }
1025
+ .sm-map .wire { stroke-opacity: .6; }
1026
+ :root[data-scheme="dark"] .sm-map .wire { stroke-opacity: .55; stroke-width: 1.3; }
1027
+ .sm-map .note { mix-blend-mode: var(--star-blend); }
1028
+ @keyframes sm-twinkle { 0%, 100% { opacity: 1; } 50% { opacity: .78; } }
1029
+ @keyframes sm-breathe { 0%, 100% { transform: scale(.88); } 50% { transform: scale(1.1); } }
1030
+ @media (prefers-reduced-motion: reduce) { .sm-map :is(.node .star, .node .star .halo, .bishop .corona) { animation: none; } }
1031
+
1032
+ /* Connections: the two halves of the link are apart at rest and close on each other under the
1033
+ pointer, the bar between them drawn as they meet. */
1034
+ #sm-tb-links svg :is(.ic-a, .ic-b) { transition: transform calc(220ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
1035
+ #sm-tb-links svg .ic-a { transform: translate(1.2px, -1.2px); }
1036
+ #sm-tb-links svg .ic-b { transform: translate(-1.2px, 1.2px); }
1037
+ #sm-tb-links svg .ic-mid { stroke-dasharray: 6; stroke-dashoffset: 6; transition: stroke-dashoffset calc(260ms * var(--motion-scale, 1)) var(--ease-out, ease-out) 60ms; }
1038
+ #sm-tb-links:is(:hover, :focus-visible) svg :is(.ic-a, .ic-b) { transform: none; }
1039
+ #sm-tb-links:is(:hover, :focus-visible) svg .ic-mid { stroke-dashoffset: 0; }
1040
+ @media (prefers-reduced-motion: reduce) { #sm-tb-links svg :is(.ic-a, .ic-b) { transform: none; } #sm-tb-links svg .ic-mid { stroke-dashoffset: 0; transition: none; } }
1041
+
1042
+ /* ==========================================================================================
1043
+ EACH PROJECT ON ITS PIECE OF THE WALLPAPER · 13 OCT
1044
+ The wallpaper is one for all of MADRE (src/looks.mjs), so each card in the drawer shows a
1045
+ different part of it (salas-mac.js, card: --wx, --wy), blurred under a veil of the card's own
1046
+ surface: the image is felt, the words keep their contrast in either theme. No wallpaper, no image.
1047
+ ========================================================================================== */
1048
+ :root[data-wallpaper="biznaga"] { --wp-now: var(--wp-biznaga); }
1049
+ :root[data-wallpaper="canela"] { --wp-now: var(--wp-canela); }
1050
+ :root[data-wallpaper="jarrito"] { --wp-now: var(--wp-jarrito); }
1051
+ :root[data-wallpaper="magna"] { --wp-now: var(--wp-magna); }
1052
+ :root[data-wallpaper="oceano"] { --wp-now: var(--wp-oceano); }
1053
+ :root[data-wallpaper="paradise"] { --wp-now: var(--wp-paradise); }
1054
+ :root[data-wallpaper="quila"] { --wp-now: var(--wp-quila); }
1055
+ :root[data-wallpaper="tradicion"] { --wp-now: var(--wp-tradicion); }
1056
+ :root[data-wallpaper="tropical"] { --wp-now: var(--wp-tropical); }
1057
+ :root[data-wallpaper="urbania"] { --wp-now: var(--wp-urbania); }
1058
+ :root[data-wallpaper="ventura"] { --wp-now: var(--wp-ventura); }
1059
+ :root[data-wallpaper="xico"] { --wp-now: var(--wp-xico); }
1060
+ .sm-drawer .sm-projects > .sm-card { isolation: isolate; overflow: hidden; }
1061
+ .sm-drawer .sm-projects > .sm-card:is([data-wp], :root[data-wallpaper] .sm-card)::before {
1062
+ content: ''; position: absolute; inset: -24px; z-index: -2; pointer-events: none;
1063
+ background: var(--wp-card, var(--wp-now, none)); background-size: var(--wp-size, 260% auto); background-position: var(--wx, 50%) var(--wy, 50%);
1064
+ filter: blur(14px) saturate(1.25);
1065
+ }
1066
+ .sm-drawer .sm-projects > .sm-card:is([data-wp], :root[data-wallpaper] .sm-card)::after {
1067
+ content: ''; position: absolute; inset: 0; z-index: -1; pointer-events: none;
1068
+ background: linear-gradient(180deg, color-mix(in srgb, var(--surface, var(--panel)) 46%, transparent), color-mix(in srgb, var(--surface, var(--panel)) 84%, transparent) 62%);
1069
+ }
1070
+ :root[data-scheme="dark"] .sm-drawer .sm-projects > .sm-card:is([data-wp], :root[data-wallpaper] .sm-card)::after {
1071
+ background: linear-gradient(180deg, color-mix(in srgb, var(--surface, var(--panel)) 54%, transparent), color-mix(in srgb, var(--surface, var(--panel)) 82%, transparent) 58%);
1072
+ }
1073
+ .sm-drawer .sm-projects > .sm-card.is-asleep:is([data-wp], :root[data-wallpaper] .sm-card)::after { background: color-mix(in srgb, var(--surface, var(--panel)) 86%, transparent); }
1074
+ /* A star has no outline, asleep or not: the dashed ring was the older map's. */
1075
+ .sm-map .node .star .body, .sm-map .node.asleep.linked .star .body { stroke: none !important; stroke-dasharray: none !important; }
1076
+ .sm-map .node.asleep.linked .star .body { fill: color-mix(in srgb, var(--pc, var(--s-acc)) 70%, var(--surface, var(--panel))); }
1077
+ :root[data-scheme="light"] .sm-map { --star-heart: .45; --star-halo: .45; }
1078
+
1079
+ /* ELECTRIC FLOW · 13 OCT. A connection is a still, faint line with current running along it: short
1080
+ bright pulses, from the project read to the one that reads (both ways when they read each
1081
+ other), each line at its own phase so the board never pulses as one. */
1082
+ .sm-map .wire { stroke-opacity: .28; stroke-width: 1.2; }
1083
+ :root[data-scheme="dark"] .sm-map .wire { stroke-opacity: .32; stroke-width: 1.1; }
1084
+ .sm-map .flow { fill: none; stroke-width: 1.8; stroke-linecap: round; stroke-dasharray: 3 14; pointer-events: none; mix-blend-mode: var(--star-blend); animation: sm-current 1.1s linear var(--flow-delay, 0s) infinite, sm-flicker 2.3s steps(1, end) var(--flow-delay, 0s) infinite; }
1085
+ .sm-map .flow.back { animation-direction: reverse, normal; stroke-dasharray: 2 17; }
1086
+ .sm-map .flow.still { animation: none; stroke-dasharray: none; stroke-opacity: .6; }
1087
+ @keyframes sm-current { from { stroke-dashoffset: 17; } to { stroke-dashoffset: 0; } }
1088
+ @keyframes sm-flicker { 0%, 100% { opacity: 1; } 37% { opacity: .55; } 41% { opacity: 1; } 73% { opacity: .75; } 76% { opacity: 1; } }
1089
+ .sm-map svg.focusing .flow:not(.lit) { opacity: .1; animation-play-state: paused; }
1090
+ .sm-map svg.focusing .flow.lit { stroke-width: 2.2; }
1091
+ @media (prefers-reduced-motion: reduce) { .sm-map .flow { animation: none; stroke-dasharray: none; stroke-opacity: .6; } }
1092
+
1093
+ /* THE BAR'S KEYS BEHAVE AS THE PROJECT'S DO (styles.css, «.bar > :is(.tree-button, .mother-button)»):
1094
+ under the pointer the whole key — its drawing and its word — takes the accent (in the light, the
1095
+ accent darkened 30% so it reads), the key lifts to --key-over, the drawing's stroke thickens to
1096
+ --icon-stroke-hover and each drawing moves in its own way. No glow, nothing else moves. */
1097
+ .salas-mac :is(.sm-barkey, .sm-icon-key) { --icon-w: var(--icon-stroke, 1.6); transition: color calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out), box-shadow calc(160ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
1098
+ .salas-mac :is(.sm-barkey, .sm-icon-key) svg :is(path, circle, rect, ellipse)[stroke], .salas-mac :is(.sm-barkey, .sm-icon-key) svg[stroke] :is(path, circle, rect, ellipse) { stroke-width: var(--icon-w); transition: stroke-width calc(200ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
1099
+ .salas-mac :is(.sm-barkey, .sm-icon-key):is(:hover, :focus-visible) { --icon-w: var(--icon-stroke-hover, 1.8); color: var(--s-acc); box-shadow: var(--key-over, var(--key-rest)); }
1100
+ :root[data-scheme="light"] .salas-mac :is(.sm-barkey, .sm-icon-key):is(:hover, :focus-visible) { color: color-mix(in srgb, var(--s-acc) 70%, #000000); }
1101
+ .salas-mac :is(.sm-barkey, .sm-icon-key):is(:hover, :focus-visible) :is(svg, span) { color: inherit; }
1102
+ .salas-mac :is(.sm-barkey, .sm-icon-key):active { box-shadow: var(--key-down); transform: scale(.96); }
1103
+ /* Reload turns once, as the project's; the gear gives a sixth of a turn. */
1104
+ #sm-reload:hover svg { animation: icon-reload 420ms var(--ease-out, ease-out); }
1105
+ #sm-gear svg { transition: transform calc(320ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
1106
+ #sm-gear:hover svg { transform: rotate(60deg); }
1107
+ @media (prefers-reduced-motion: reduce) { #sm-reload:hover svg { animation: none; } #sm-gear:hover svg { transform: none; } }
1108
+
1109
+ /* A project's own wallpaper on its card, seen whole rather than in a piece. */
1110
+ .sm-card[data-wp="biznaga"] { --wp-card: var(--wp-biznaga); --wp-size: cover; }
1111
+ .sm-card[data-wp="canela"] { --wp-card: var(--wp-canela); --wp-size: cover; }
1112
+ .sm-card[data-wp="jarrito"] { --wp-card: var(--wp-jarrito); --wp-size: cover; }
1113
+ .sm-card[data-wp="magna"] { --wp-card: var(--wp-magna); --wp-size: cover; }
1114
+ .sm-card[data-wp="oceano"] { --wp-card: var(--wp-oceano); --wp-size: cover; }
1115
+ .sm-card[data-wp="paradise"] { --wp-card: var(--wp-paradise); --wp-size: cover; }
1116
+ .sm-card[data-wp="quila"] { --wp-card: var(--wp-quila); --wp-size: cover; }
1117
+ .sm-card[data-wp="tradicion"] { --wp-card: var(--wp-tradicion); --wp-size: cover; }
1118
+ .sm-card[data-wp="tropical"] { --wp-card: var(--wp-tropical); --wp-size: cover; }
1119
+ .sm-card[data-wp="urbania"] { --wp-card: var(--wp-urbania); --wp-size: cover; }
1120
+ .sm-card[data-wp="ventura"] { --wp-card: var(--wp-ventura); --wp-size: cover; }
1121
+ .sm-card[data-wp="xico"] { --wp-card: var(--wp-xico); --wp-size: cover; }
1122
+ /* A project whose room has no wallpaper shows none on its card, whatever Home wears. */
1123
+ .sm-drawer .sm-projects > .sm-card[data-wp="none"]::before, .sm-drawer .sm-projects > .sm-card[data-wp="none"]::after { content: none; }
1124
+
1125
+ /* NEEDS YOU, WITH AIR (2026-10-13): each notice a block of its own — the dot on the first line of
1126
+ its title, the title and its hint with room to breathe, the action on a line of its own under
1127
+ them; beside them only when the tile is wide enough to hold all three in a row. */
1128
+ .sm-attention { gap: 10px; }
1129
+ .sm-attention-item { grid-template-columns: auto minmax(0, 1fr); align-items: start; column-gap: 12px; row-gap: 10px; padding: 14px 16px; border-radius: 14px; }
1130
+ .sm-attention-item .dot { margin-top: 6px; }
1131
+ .sm-attention-words { gap: 4px; }
1132
+ .sm-attention-words b { font-size: 14px; font-weight: 600; line-height: 1.45; text-wrap: pretty; }
1133
+ .sm-attention-words span { font-size: 13px; line-height: 1.5; text-wrap: pretty; }
1134
+ .sm-attention-item > :is(.sm-btn, a.sm-btn) { grid-column: 2; justify-self: start; }
1135
+ @container tile (min-width: 560px) {
1136
+ .sm-attention-item { grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; }
1137
+ .sm-attention-item .dot { margin-top: 0; }
1138
+ .sm-attention-item > :is(.sm-btn, a.sm-btn) { grid-column: 3; justify-self: end; }
1139
+ }
1140
+ .sm-attention > .sm-hint { padding: 2px 4px; }
1141
+
1142
+ /* The bar's projects (2026-10-13): the row is clipped across, where too many would spill, never
1143
+ upward, where a project's state dot and its halo stand above its key. */
1144
+ .sm-tb-open { overflow-x: clip; overflow-y: visible; padding: 8px 7px; margin: -8px -7px; }
1145
+ .sm-tb-open.is-editing { padding: 8px 7px; margin: -8px -7px; }
1146
+
1147
+ /* ==========================================================================================
1148
+ THE GRID · 13 OCT
1149
+ 12 columns, rows of 96 px, 16 px apart (salas-mac.js, ROW_UNIT · ROW_GAP): every tile takes whole
1150
+ columns and whole rows, so every edge meets another on the same line. A tile with a chosen
1151
+ height fills it exactly; what does not fit scrolls inside it, under its head. On a narrower
1152
+ screen the widths step up — a third becomes a half, two thirds the whole — and the grid fills
1153
+ any hole a step leaves; on a phone-wide one, every tile takes the whole row.
1154
+ ========================================================================================== */
1155
+ #sm-top.sm-bento { grid-auto-rows: 96px; row-gap: 16px; column-gap: 16px; align-items: stretch; }
1156
+ #sm-top > .sm-tile { align-self: stretch; min-height: 0; }
1157
+ #sm-top > .sm-tile.sm-fixed { overflow: hidden; }
1158
+ #sm-top > .sm-tile.sm-fixed > :not(.sm-tile-head):not(.sm-bishop-head):not(.sm-tile-foot):not(header):not(footer) { min-height: 0; }
1159
+ #sm-top > .sm-tile.sm-fixed > :is(.sm-w-body, .sm-decisions, .sm-attention, .sm-memory-body) { flex: 1; overflow: auto; overscroll-behavior: contain; scrollbar-width: thin; }
1160
+ #sm-top > .sm-bishop.sm-fixed .sm-work { flex: 1; min-height: 0; overflow: hidden; }
1161
+ #sm-top > .sm-bishop.sm-fixed .sm-work-list { overflow: auto; overscroll-behavior: contain; scrollbar-width: thin; min-height: 0; }
1162
+ #sm-top > .sm-links-tile.sm-fixed .sm-map { flex: 1; min-height: 150px; }
1163
+ #sm-top > .sm-tile.sm-fixed .sm-tile-head, #sm-top > .sm-tile.sm-fixed .sm-tile-foot { flex: none; }
1164
+ @media (max-width: 1180px) {
1165
+ #sm-top.sm-bento { grid-auto-flow: row dense; }
1166
+ #sm-top > .c-4 { grid-column: span 6; }
1167
+ #sm-top > .c-8 { grid-column: span 12; }
1168
+ }
1169
+ @media (max-width: 760px) {
1170
+ #sm-top > [class*="c-"] { grid-column: 1 / -1; }
1171
+ }
1172
+ /* In a tile taller than what it holds, the content sits at the top, as written; it never stretches. */
1173
+ #sm-top > .sm-tile.sm-fixed > :is(.sm-w-body, .sm-decisions, .sm-attention, .sm-memory-body) { align-content: start; }
1174
+ /* A widget's body is one column the full width of its tile; its own grids divide that width. */
1175
+ .sm-w-body { grid-template-columns: minmax(0, 1fr); }
1176
+ #sm-top > .sm-tile.sm-fixed .sm-memory-body { gap: 9px; }
1177
+
1178
+ /* ==========================================================================================
1179
+ THE DRAWER'S HEAD, THE COORDINATOR AND THE KEYS OF EVERY TILE, AT EVERY WIDTH · 13 OCT
1180
+ ========================================================================================== */
1181
+ /* The drawer: its name the largest word in it, its count beside it, its tools on one line with
1182
+ it, all on one centre line; narrower, the search takes a line of its own; narrowest, «Add a
1183
+ project» is its «+». A hairline parts the head from the cards. */
1184
+ .sm-drawer-head { align-items: center; gap: 12px 16px; padding-bottom: 14px; border-bottom: 1px solid color-mix(in srgb, var(--text) 8%, transparent); }
1185
+ .sm-drawer-head h2 { font-size: 20px; font-weight: 700; letter-spacing: -.012em; line-height: 1.2; }
1186
+ .sm-drawer-head #sm-drawer-count { align-self: center; }
1187
+ .sm-drawer-head .sm-tools { flex: 1 1 auto; flex-wrap: nowrap; justify-content: flex-end; align-items: center; gap: 8px; min-width: 0; }
1188
+ .sm-drawer-head .sm-tools > * { flex: none; }
1189
+ .sm-drawer-head .sm-tools .sm-search { flex: 1 1 200px; min-width: 150px; max-width: 320px; height: 36px; }
1190
+ .sm-drawer-head .sm-tools :is(.sx-seg, .sm-order, .sm-add) { height: 36px; }
1191
+ .sm-drawer-head .sm-add { padding: 0 16px; white-space: nowrap; }
1192
+ @container tile (max-width: 1040px) {
1193
+ .sm-drawer-head .sm-tools { flex-basis: 100%; flex-wrap: wrap; justify-content: flex-start; margin-left: 0; }
1194
+ .sm-drawer-head .sm-tools .sm-search { flex: 1 1 100%; max-width: none; }
1195
+ .sm-drawer-head .sm-tools .sm-add { margin-left: auto; }
1196
+ }
1197
+ @container tile (max-width: 520px) {
1198
+ .sm-drawer-head .sm-tools .sx-seg { flex: 1 1 auto; }
1199
+ .sm-drawer-head .sm-tools .sm-add { width: 36px; padding: 0; font-size: 0; }
1200
+ .sm-drawer-head .sm-tools .sm-add::before { content: '+'; font-size: 20px; font-weight: 500; line-height: 1; }
1201
+ .sm-drawer-head .sm-tools .sm-order span { display: none; }
1202
+ }
1203
+
1204
+ /* The Coordinator: its keys go under its name when the tile is narrow, «Talk to the Coordinator»
1205
+ then as wide as the tile; narrower still, the summary is one column, each project over its line. */
1206
+ @container tile (max-width: 620px) {
1207
+ .sm-bishop-head { flex-wrap: wrap; row-gap: 12px; }
1208
+ .sm-bishop-keys { flex: 1 1 100%; }
1209
+ .sm-bishop-keys #sm-bishop-go { flex: 1; justify-content: center; }
1210
+ }
1211
+ @container tile (max-width: 460px) {
1212
+ .sm-bishop .sm-work-list, .sm-bishop .sm-work-list:has(> li.raw) { grid-template-columns: minmax(0, 1fr); row-gap: 14px; }
1213
+ .sm-bishop .sm-work-list li { grid-template-columns: minmax(0, 1fr); row-gap: 4px; }
1214
+ .sm-bishop-words h2 { font-size: 18px; }
1215
+ .sm-work-by { display: none; }
1216
+ }
1217
+
1218
+ /* Every tile's head and foot keep their keys whole: narrow, they go under the title, not over it. */
1219
+ @container tile (max-width: 340px) {
1220
+ .sm-tile-head, .sm-tile-foot { flex-wrap: wrap; row-gap: 8px; }
1221
+ .sm-tile-foot > .sm-btn { margin-left: auto; }
1222
+ }
1223
+
1224
+ /* Connections: how many more projects there are, in a quiet badge of its own, legible. */
1225
+ .sm-map-quiet { right: 0; bottom: 0; padding: 3px 10px; border-radius: 999px; background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text-2); font-size: 11.5px; font-weight: 500; line-height: 1.4; white-space: nowrap; }
1226
+ :root[data-scheme="dark"] .sm-map-quiet { background: color-mix(in srgb, #ffffff 9%, transparent); color: color-mix(in srgb, var(--text) 80%, transparent); }
1227
+
1228
+ /* A TILE BY ITS HEIGHT (2026-10-13): fitTile writes data-rows. The Coordinator at two rows is its
1229
+ name, its state and its keys, centred — the description and the summary need more room than two
1230
+ rows give, and half of them showed cut. At three rows on a narrow tile the description gives
1231
+ its place to the summary. */
1232
+ #sm-top > .sm-bishop[data-rows="2"] { justify-content: center; gap: 14px; }
1233
+ #sm-top > .sm-bishop[data-rows="2"] :is(.sm-bishop-about, .sm-work, .sm-bishop-asks, .sm-error) { display: none !important; }
1234
+ #sm-top > .sm-bishop[data-rows="2"] .sm-bishop-head { row-gap: 14px; }
1235
+ @container tile (max-width: 620px) {
1236
+ #sm-top > .sm-bishop[data-rows="3"] .sm-bishop-about { display: none; }
1237
+ }
1238
+
1239
+ /* LOCAL AI in the models widget (2026-10-13): the key to Settings › Local AI on Ollama's line,
1240
+ and a project that does not use it, dimmed and said in a quiet tag. */
1241
+ .sm-w-row .sm-w-link {
1242
+ justify-self: end; padding: 3px 9px; border-radius: 999px; border: 1px solid var(--line, rgba(255, 255, 255, .12));
1243
+ background: transparent; color: var(--text-2); font: inherit; font-size: 11.5px; cursor: pointer; white-space: nowrap;
1244
+ }
1245
+ .sm-w-row .sm-w-link:hover, .sm-w-row .sm-w-link:focus-visible { color: var(--s-acc, var(--phosphor)); border-color: color-mix(in oklab, var(--s-acc, var(--phosphor)) 45%, transparent); }
1246
+ @container tile (max-width: 300px) { .sm-w-row .sm-w-link { grid-column: 1 / -1; justify-self: start; } }
1247
+ .sm-w-tag { flex: none; padding: 1px 7px; border-radius: 999px; font-size: 10.5px; color: var(--text-2); background: color-mix(in oklab, var(--text-2) 14%, transparent); }
1248
+ .sm-w-off .sm-w-line b, .sm-w-off .sm-meter { opacity: .55; }
1249
+
1250
+ /* Settings › Local AI: the projects in pages, two to a row where they fit (2026-10-13). Each one
1251
+ is a small card in the sheet's own hand: the name, how it stands, its switch. */
1252
+ .sm-local-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 230px), 1fr)); grid-auto-rows: 1fr; gap: 8px; padding: 12px 16px 14px; border-top: 1px solid color-mix(in srgb, var(--text) 7%, transparent); }
1253
+ .sm-local-item {
1254
+ display: flex; align-items: center; gap: 12px; min-width: 0; padding: 10px 12px; border-radius: 12px;
1255
+ border: 1px solid color-mix(in srgb, var(--text) 8%, transparent); background: color-mix(in srgb, var(--text) 3%, transparent); cursor: pointer;
1256
+ }
1257
+ .sm-local-item:hover { border-color: color-mix(in srgb, var(--text) 16%, transparent); }
1258
+ .sm-local-words { display: grid; gap: 2px; min-width: 0; margin-right: auto; }
1259
+ .sm-local-words b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; font-weight: 600; }
1260
+ .sm-local-words small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--text-2); }
1261
+ .sm-local-item.off .sm-local-words b { color: var(--text-2); }
1262
+ .sm-local-foot { display: flex; align-items: center; gap: 12px; padding: 0 16px 14px; flex-wrap: wrap; }
1263
+ .sm-local-foot small { white-space: nowrap; font-size: 12px; color: var(--text-2); }
1264
+ .sm-local-gap { visibility: hidden; }
1265
+
1266
+ /* MADRE usage (the author's widget, 2026-10-13): four figures, the last 30 days as bars — each bar
1267
+ the copies on that day, its lit top the share seen for the first time — and three lines. */
1268
+ .sm-usage-figures { --w-col: 120px; }
1269
+ .sm-usage-days { display: grid; grid-template-columns: repeat(30, minmax(0, 1fr)); align-items: end; gap: 3px; height: 56px; }
1270
+ .sm-usage-days i {
1271
+ height: calc(4px + var(--h) * 52px); border-radius: 3px;
1272
+ background: linear-gradient(to bottom, var(--s-acc, var(--phosphor)) calc(var(--new) * 100%), color-mix(in srgb, var(--s-acc, var(--phosphor)) 38%, transparent) 0);
1273
+ }
1274
+ .sm-usage-lines { display: grid; gap: 6px; }
1275
+ .sm-usage-lines .sm-w-line b { flex: none; min-width: 84px; font-size: 12.5px; font-weight: 600; }
1276
+ .sm-usage-lines .sm-w-line small { margin-left: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-2); }
1277
+
1278
+ /* A sheet of Home is a dialog the size of the screen with its card inside; focused itself (as a
1279
+ modal is when it opens), the browser drew its ring around the whole page. Focus moves to what is
1280
+ inside it; the dialog itself draws no ring. */
1281
+ dialog.sm-sheet:focus, dialog.sm-sheet:focus-visible { outline: none; }