agents-city 0.3.0-beta.21 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/README.es.md +310 -70
  3. package/README.md +297 -69
  4. package/bin/agents-city.js +3 -0
  5. package/bin/doctor +3 -0
  6. package/bin/hall.html +164 -24
  7. package/bin/navegador.mjs +415 -0
  8. package/bin/serve.py +383 -127
  9. package/bin/shortcut +3 -0
  10. package/bin/test +5 -2
  11. package/bin/test-actualiza.py +130 -0
  12. package/bin/test-atajos.py +301 -0
  13. package/bin/test-busca.py +216 -0
  14. package/bin/test-cage.py +170 -2
  15. package/bin/test-card.py +2 -2
  16. package/bin/test-cities.py +45 -0
  17. package/bin/test-contracts.py +12 -5
  18. package/bin/test-doctor.py +33 -0
  19. package/bin/test-navegador.py +164 -0
  20. package/bin/test-seat.py +245 -25
  21. package/bin/test-serve.py +214 -9
  22. package/bin/test-workspace.py +63 -0
  23. package/bin/testlib.py +23 -0
  24. package/bin/update +3 -0
  25. package/city/web/dist/city.js +47 -47
  26. package/city/web/dist/index.html +1 -1
  27. package/city/web/dist-hall/hall.js +2193 -174
  28. package/city/web/src/bienvenida.ts +686 -0
  29. package/city/web/src/es.ts +180 -0
  30. package/city/web/src/hall.ts +520 -168
  31. package/city/web/src/idioma.ts +86 -0
  32. package/city/web/src/main.ts +27 -0
  33. package/city/web/src/motores.ts +54 -0
  34. package/docs/agents-first.md +8 -1
  35. package/docs/security.md +46 -12
  36. package/docs/testing.md +1 -1
  37. package/package.json +1 -1
  38. package/plugin/.claude-plugin/plugin.json +1 -1
  39. package/plugin/channel/bus.js +1 -1
  40. package/plugin/channel/bus.ts +1 -1
  41. package/plugin/channel/runtime/codex.ts +1 -1
  42. package/plugin/channel/runtime-gateway.js +1 -1
  43. package/plugin/scripts/actualiza.py +198 -0
  44. package/plugin/scripts/atajos.py +506 -0
  45. package/plugin/scripts/busca.py +436 -0
  46. package/plugin/scripts/cage.py +266 -26
  47. package/plugin/scripts/capabilities.py +17 -10
  48. package/plugin/scripts/card.py +10 -0
  49. package/plugin/scripts/cities.py +34 -0
  50. package/plugin/scripts/city-session.sh +33 -7
  51. package/plugin/scripts/doctor.py +122 -0
  52. package/plugin/scripts/find-repos.sh +12 -105
  53. package/plugin/scripts/read-card.py +6 -2
  54. package/plugin/scripts/report.py +5 -6
  55. package/plugin/scripts/reset.py +50 -14
  56. package/plugin/scripts/seat.py +445 -103
  57. package/plugin/scripts/workspace.py +197 -0
package/bin/hall.html CHANGED
@@ -11,13 +11,60 @@
11
11
  <style>
12
12
  /* The map's palette and its three typefaces. The hall manages the city the map
13
13
  draws; they must not look like two products. Single visual world on purpose. */
14
+ /* Two skins, one set of names. DAY is the default — the palette of
15
+ agentscity.net, so the local tool and the public site are visibly one
16
+ product. Night is the map's own light, chosen with the switch and
17
+ remembered. Nothing below this block names a colour directly. */
14
18
  :root{
15
- --suelo:#131a24; --suelo2:#1b2431; --suelo3:#222d3c; --linea:#26313f; --linea2:#38495f;
16
- --tinta:#e8e2d4; --tinta2:#9aa7b8; --tinta3:#6b7889;
17
- --lampara:#f5c451; --carta:#e2604f; --verde:#4ec98a;
19
+ /* Day is the default: the palette of agentscity.net, so the tool on your
20
+ machine and the public site are one product from the first second. Night
21
+ is one click away and remembered — it is the map's own light, not the
22
+ app's. */
23
+ --suelo:#f3f0e8; --suelo2:#fbfaf6; --suelo3:#ffffff;
24
+ --linea:#e2ddd0; --linea2:#cdc6b6;
25
+ --tinta:#1d2229; --tinta2:#515861; --tinta3:#7b8187;
26
+ --lampara:#7048e8; --carta:#dd5d3e; --verde:#5f8f2b;
27
+ --panel:#fbfaf6; --burbuja:#ffffff; --burbuja-mia:#f4efff;
28
+ --borde-acento:#c9b8ff; --sobre-lampara:#ffffff; --lampara-viva:#5331bd;
29
+ --chip-luz:52% 86%; --chip-tinta:#1d2229;
30
+ --tono-palabra:#6b46f0; --tono-evidencia:#2b7ab8; --tono-verificacion:#1c8d78;
18
31
  --hud:"Chakra Petch",system-ui,sans-serif; --texto:"Newsreader",Georgia,serif;
19
32
  --mono:"IBM Plex Mono",ui-monospace,monospace;
33
+ --sombra:0 18px 40px -30px #1d222945;
34
+
35
+ /* Night, declared once: the city's own light, an isometric map at 3am. The
36
+ two rules below only MAP these; a palette written twice drifts twice. */
37
+ --noche-suelo:#131a24; --noche-suelo2:#1b2431; --noche-suelo3:#222d3c;
38
+ --noche-linea:#26313f; --noche-linea2:#38495f;
39
+ --noche-tinta:#e8e2d4; --noche-tinta2:#9aa7b8; --noche-tinta3:#6b7889;
40
+ --noche-lampara:#f5c451; --noche-carta:#e2604f; --noche-verde:#4ec98a;
41
+ --noche-panel:#101720; --noche-burbuja:#171f2a; --noche-burbuja-mia:#27291f;
42
+ --noche-borde-acento:#65552d; --noche-sobre-lampara:#1a1408;
43
+ --noche-lampara-viva:#ffd469;
44
+ --noche-chip-luz:36% 30%; --noche-chip-tinta:#f3eee4;
45
+ --noche-tono-palabra:#aa93ff; --noche-tono-evidencia:#61ace9;
46
+ --noche-tono-verificacion:#50ccb1;
47
+ --noche-sombra:none;
48
+ }
49
+ /* Night, mapped from the tokens declared once above. */
50
+ :root[data-tema="oscuro"]{
51
+ --suelo:var(--noche-suelo); --suelo2:var(--noche-suelo2); --suelo3:var(--noche-suelo3);
52
+ --linea:var(--noche-linea); --linea2:var(--noche-linea2);
53
+ --tinta:var(--noche-tinta); --tinta2:var(--noche-tinta2); --tinta3:var(--noche-tinta3);
54
+ --lampara:var(--noche-lampara); --carta:var(--noche-carta); --verde:var(--noche-verde);
55
+ --panel:var(--noche-panel); --burbuja:var(--noche-burbuja);
56
+ --burbuja-mia:var(--noche-burbuja-mia);
57
+ --borde-acento:var(--noche-borde-acento); --sobre-lampara:var(--noche-sobre-lampara);
58
+ --lampara-viva:var(--noche-lampara-viva);
59
+ --chip-luz:var(--noche-chip-luz); --chip-tinta:var(--noche-chip-tinta);
60
+ --tono-palabra:var(--noche-tono-palabra); --tono-evidencia:var(--noche-tono-evidencia);
61
+ --tono-verificacion:var(--noche-tono-verificacion);
62
+ --sombra:var(--noche-sombra);
20
63
  }
64
+ /* No `prefers-color-scheme` rule on purpose: daylight is THE default, not a
65
+ default that a machine set to dark quietly overrides. Night is a choice made
66
+ here, with the switch, and remembered — which is why an owner whose whole
67
+ desktop is dark still opens a paper-coloured hall. */
21
68
  *{box-sizing:border-box}
22
69
  html,body{height:100%}
23
70
  body{margin:0;background:var(--suelo);color:var(--tinta);font-family:var(--texto);
@@ -41,10 +88,17 @@ nav{background:var(--suelo2);border-right:1px solid var(--linea);padding:20px 0
41
88
  .marca{padding:0 18px}
42
89
  .badge{display:inline-flex;align-items:center;gap:7px;font-family:var(--hud);font-size:10px;
43
90
  letter-spacing:.14em;text-transform:uppercase;color:var(--lampara);
44
- border:1px solid #4a4127;background:#241f14;padding:4px 9px;border-radius:2px}
91
+ border:1px solid var(--borde-acento);background:var(--burbuja-mia);padding:4px 9px;border-radius:2px}
45
92
  .badge::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--lampara)}
46
93
  .marca h2{font-size:19px;margin:9px 0 0}
47
94
  .marca p{margin:4px 0 0;font-size:12px;color:var(--tinta3);line-height:1.45}
95
+ .railCiudad{margin:0 18px;padding:10px 12px;border-radius:7px;background:var(--suelo3);
96
+ border:1px solid var(--linea);display:flex;flex-direction:column;gap:2px}
97
+ .railCiudad .railEtiqueta{font:600 9px var(--hud);letter-spacing:.16em;text-transform:uppercase;
98
+ color:var(--tinta3)}
99
+ .railCiudad b{font:600 15px var(--hud);color:var(--tinta)}
100
+ .railCiudad .railDe{font:10.5px var(--mono);color:var(--tinta3)}
101
+ .railOtras{margin-top:6px;padding-top:6px;border-top:1px solid var(--linea)}
48
102
  nav ol{list-style:none;margin:0;padding:0 10px;display:flex;flex-direction:column;gap:2px}
49
103
  nav li{display:flex;gap:10px;align-items:baseline;padding:9px 10px;border-radius:3px;
50
104
  font-family:var(--hud);font-size:13.5px;color:var(--tinta2);cursor:pointer;white-space:nowrap}
@@ -54,6 +108,21 @@ nav li .n{font-family:var(--mono);font-size:10px;color:var(--tinta3);margin-left
54
108
  nav .pie{margin-top:auto;padding:14px 18px 0;border-top:1px solid var(--linea);
55
109
  display:flex;flex-direction:column;gap:8px}
56
110
  nav .pie a{font-family:var(--hud);font-size:12px;color:var(--tinta3);text-decoration:none}
111
+ .peligro{border:1px solid var(--carta);border-radius:8px;padding:16px 18px;
112
+ background:color-mix(in srgb,var(--carta) 7%,var(--suelo2));display:flex;
113
+ flex-direction:column;gap:10px;align-items:flex-start}
114
+ .peligro h3{font:600 13px var(--hud);color:var(--carta)}
115
+ .bt.malo{border-color:var(--carta);color:var(--carta)}
116
+ .bt.malo:hover{background:var(--carta);color:var(--suelo2)}
117
+ .avisoVersion{margin:0;font:11px/1.45 var(--mono);color:var(--lampara);
118
+ border:1px solid var(--borde-acento);background:var(--burbuja-mia);
119
+ padding:7px 9px;border-radius:4px}
120
+ .avisoVersion[hidden]{display:none}
121
+ .ajustes{display:flex;gap:8px;margin-top:12px;flex-wrap:wrap}
122
+ .temaBoton{border:1px solid var(--linea2);background:var(--suelo3);
123
+ color:var(--tinta2);font:11px var(--mono);padding:5px 11px;border-radius:999px;
124
+ cursor:pointer;box-shadow:var(--sombra)}
125
+ .temaBoton:hover{color:var(--lampara);border-color:var(--lampara)}
57
126
  nav .pie a:hover{color:var(--lampara)}
58
127
  #ciudades select{width:100%;background:var(--suelo);border:1px solid var(--linea2);
59
128
  border-radius:3px;padding:6px 8px;font-family:var(--hud);font-size:12px;color:var(--tinta)}
@@ -104,8 +173,8 @@ h1{font-size:26px;line-height:1.12}
104
173
  background:var(--suelo3);color:var(--tinta2)}
105
174
  .bt:hover:not(:disabled){color:var(--tinta);border-color:var(--tinta3)}
106
175
  .bt:focus-visible{outline:1px solid var(--lampara);outline-offset:2px}
107
- .bt.ppal{background:var(--lampara);border-color:var(--lampara);color:#1a1408}
108
- .bt.ppal:hover:not(:disabled){background:#ffd469;border-color:#ffd469}
176
+ .bt.ppal{background:var(--lampara);border-color:var(--lampara);color:var(--sobre-lampara)}
177
+ .bt.ppal:hover:not(:disabled){background:var(--lampara-viva);border-color:var(--lampara-viva)}
109
178
  .bt:disabled{opacity:.4;cursor:not-allowed}
110
179
  .bt.mini{padding:4px 10px;font-size:11px}
111
180
  input[type=text],select{background:var(--suelo);border:1px solid var(--linea2);
@@ -198,13 +267,13 @@ input[type=text]:focus,select:focus{outline:none;border-color:var(--lampara)}
198
267
  .fichasRPG{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
199
268
  .fichaRPG{background:var(--suelo2);border:1px solid var(--linea);border-radius:8px;
200
269
  padding:14px 15px;display:flex;flex-direction:column;gap:9px}
201
- .fichaRPG.rpgSeat{border-color:#65552d}
270
+ .fichaRPG.rpgSeat{border-color:var(--borde-acento)}
202
271
  .rpgCab{display:flex;align-items:center;gap:10px}
203
272
  .rpgCara{width:40px;height:40px;border-radius:9px;flex:none}
204
273
  .rpgCab h3{margin:0;font-size:15px}
205
274
  .rpgTags{display:flex;flex-wrap:wrap;gap:6px;margin-top:3px;align-items:center}
206
275
  .kindChip{font:600 9px var(--hud);letter-spacing:.08em;text-transform:uppercase;
207
- padding:2px 7px;border-radius:8px;color:#0f172a}
276
+ padding:2px 7px;border-radius:8px;color:#0f172a;font-weight:600}
208
277
  .kindChip.code{background:#3b82f6}.kindChip.knowledge{background:#8b5cf6;color:#f4efe5}
209
278
  .kindChip.coordinator{background:#f59e0b}
210
279
  .rpgRol,.rpgRun,.rpgHogar{font:10.5px var(--mono);color:var(--tinta3)}
@@ -235,8 +304,70 @@ input[type=text]:focus,select:focus{outline:none;border-color:var(--lampara)}
235
304
  .rpgBotones{display:flex;gap:6px;margin-left:auto}
236
305
  .rpgMini{border:1px solid var(--linea2);background:var(--suelo);color:var(--tinta3);
237
306
  font:10px var(--mono);padding:3px 7px;border-radius:4px;cursor:pointer}
238
- .rpgMini:hover{color:var(--lampara);border-color:#65552d}
307
+ .rpgMini:hover{color:var(--lampara);border-color:var(--borde-acento)}
239
308
  .rpgSubir input{display:none}
309
+ /* Adding an agent is the city growing, so it reads as an action, not a chip. */
310
+ .rpgAlta{margin-top:14px;border:1px solid var(--borde-acento);background:var(--suelo2);
311
+ color:var(--lampara);font:12px var(--mono);padding:7px 14px;border-radius:5px;
312
+ cursor:pointer}
313
+ .rpgAlta:hover{background:var(--suelo);border-color:var(--lampara)}
314
+
315
+ /* ── the guided first run ────────────────────────────────────────────────── */
316
+ .bv{display:flex;flex-direction:column;gap:26px;max-width:min(760px,100%)}
317
+ .bv .prosa{max-width:100%}
318
+ .bv code.mono{word-break:break-all}
319
+ /* The live rail has nothing to show before a city exists, and it costs half
320
+ the screen exactly when the guide needs it. */
321
+ body.enGuia #livePanel,body.enGuia #liveResize{display:none}
322
+ body.enGuia #app{grid-template-columns:250px minmax(0,1fr)}
323
+ .bvPasos{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
324
+ .bvPunto{display:flex;align-items:center;gap:6px;font:10px var(--hud);letter-spacing:.1em;
325
+ text-transform:uppercase;color:var(--tinta3)}
326
+ .bvPunto i{width:8px;height:8px;border-radius:50%;background:var(--linea2);display:block}
327
+ .bvPunto+.bvPunto{margin-left:10px}
328
+ .bvPunto.aqui{color:var(--lampara)}.bvPunto.aqui i{background:var(--lampara)}
329
+ .bvPunto.hecho i{background:var(--verde)}
330
+ .bvHola{display:grid;grid-template-columns:auto 1fr;gap:26px;align-items:start}
331
+ @media(max-width:820px){.bvHola{grid-template-columns:1fr}}
332
+ .bvArte{display:flex;flex-direction:column;gap:2px;padding-top:6px}
333
+ .bvCasa{width:92px;height:83px;margin-bottom:-26px;filter:drop-shadow(var(--sombra))}
334
+ .bvPaso{display:flex;flex-direction:column;gap:14px}
335
+ .bvPaso h1{font-size:26px;line-height:1.15}
336
+ .bvEtiqueta{font:600 10px var(--hud);letter-spacing:.14em;text-transform:uppercase;
337
+ color:var(--tinta3)}
338
+ .bvRejilla{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px}
339
+ .bvRejilla.bvTres{grid-template-columns:repeat(auto-fit,minmax(210px,1fr))}
340
+ .bvOpcion{text-align:left;display:flex;flex-direction:column;gap:4px;padding:12px 13px;
341
+ border:1px solid var(--linea2);border-radius:7px;background:var(--suelo2);cursor:pointer}
342
+ .bvOpcion b{font-family:var(--hud);font-size:13px;color:var(--tinta)}
343
+ .bvOpcion span{font-size:12px;line-height:1.45;color:var(--tinta3)}
344
+ .bvOpcion:hover{border-color:var(--lampara)}
345
+ .bvOpcion.elegida{border-color:var(--lampara);background:var(--burbuja-mia);
346
+ box-shadow:inset 3px 0 0 var(--lampara)}
347
+ .bvChips{display:flex;flex-wrap:wrap;gap:6px}
348
+ .bvChip{border:1px solid var(--linea2);background:var(--suelo2);color:var(--tinta2);
349
+ font:11px var(--mono);padding:5px 10px;border-radius:999px;cursor:pointer}
350
+ .bvChip:hover{border-color:var(--lampara)}
351
+ .bvChip.elegida{border-color:var(--lampara);background:var(--burbuja-mia);color:var(--tinta)}
352
+ .bvClase{font:600 9px var(--mono);letter-spacing:.08em;text-transform:uppercase;
353
+ opacity:.55;font-style:normal;margin-right:6px}
354
+ .bvChip.cl-docs .bvClase{color:var(--verde);opacity:.85}
355
+ .bvChip.cl-worktree .bvClase{color:var(--lampara);opacity:.85}
356
+ .bvBuscador{display:flex;gap:8px;align-items:center;margin:4px 0 10px}
357
+ .bvBuscador input{flex:1;background:var(--suelo);border:1px solid var(--linea2);
358
+ border-radius:4px;padding:8px 10px;font-family:var(--hud);font-size:13px;color:var(--tinta)}
359
+ .bvBuscador input:focus{outline:none;border-color:var(--lampara)}
360
+ .bt.bvMini{padding:7px 12px;font-size:11px;white-space:nowrap}
361
+ .bvMotor{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:6px}
362
+ .bvMotor .campo{margin:0}
363
+ @media (max-width:640px){.bvMotor{grid-template-columns:1fr}}
364
+ .bvFichas{display:flex;flex-direction:column;gap:6px}
365
+ .bvFicha{display:flex;gap:10px;align-items:baseline;padding:9px 12px;border-radius:6px;
366
+ border:1px solid var(--linea);background:var(--suelo2)}
367
+ .bvFicha b{font-family:var(--hud);font-size:13px}
368
+ .bvFicha span{font:11px var(--mono);color:var(--tinta3)}
369
+ .bvBotones{display:flex;gap:9px;flex-wrap:wrap;margin-top:4px}
370
+ .bvSiguientes{display:flex;gap:9px;flex-wrap:wrap}
240
371
  /* The instruction editor: one file, one reader, saved where the agent lives. */
241
372
  #editorIns{position:fixed;inset:0;background:rgba(6,10,15,.72);z-index:60;
242
373
  display:flex;align-items:center;justify-content:center}
@@ -278,7 +409,7 @@ input[type=text]:focus,select:focus{outline:none;border-color:var(--lampara)}
278
409
  @media(prefers-reduced-motion:reduce){.cargando::after{animation:none}#toast{transition:none}}
279
410
 
280
411
  /* ── live city feed ────────────────────────────────────────────────────── */
281
- #livePanel{background:#101720;border-left:1px solid var(--linea);min-width:0;min-height:0;
412
+ #livePanel{background:var(--panel);border-left:1px solid var(--linea);min-width:0;min-height:0;
282
413
  display:flex;flex-direction:column;overflow:hidden;position:relative}
283
414
  /* The divider you can grab: the rail's left edge. Wide enough for a mouse,
284
415
  invisible until hovered so it does not read as chrome. */
@@ -301,26 +432,26 @@ input[type=text]:focus,select:focus{outline:none;border-color:var(--lampara)}
301
432
  framed row, not two grey buttons — the person who missed the show has to be
302
433
  able to FIND the way back without being told where it is. */
303
434
  #demoControles{display:flex;align-items:center;gap:7px;margin-top:10px;
304
- padding:7px 9px;border:1px solid #65552d;border-radius:5px;
435
+ padding:7px 9px;border:1px solid var(--borde-acento);border-radius:5px;
305
436
  background:rgba(245,196,81,.06)}
306
437
  #demoControles span{font-family:var(--mono);font-size:9.5px;letter-spacing:.08em;
307
438
  text-transform:uppercase;color:var(--lampara);margin-right:auto}
308
439
  #demoControles button{border:1px solid var(--linea2);background:var(--suelo);
309
440
  color:var(--tinta2);font-family:var(--hud);font-size:12px;padding:6px 11px;
310
441
  border-radius:4px;cursor:pointer}
311
- #demoControles #demoReplay{background:var(--lampara);color:#131a24;
442
+ #demoControles #demoReplay{background:var(--lampara);color:var(--sobre-lampara);
312
443
  border-color:var(--lampara);font-weight:600}
313
444
  #demoControles button:hover{filter:brightness(1.12)}
314
445
  #liveFilter{width:100%;font-family:var(--hud);font-size:11px;padding:6px 8px;background:var(--suelo)}
315
446
  #liveWorkToggle{border:1px solid var(--linea2);background:var(--suelo);color:var(--tinta3);
316
447
  border-radius:3px;padding:0 9px;font:600 9.5px var(--hud);text-transform:uppercase;
317
448
  letter-spacing:.06em;cursor:pointer;white-space:nowrap}
318
- #liveWorkToggle:hover,#liveWorkToggle.on{color:var(--lampara);border-color:#65552d}
449
+ #liveWorkToggle:hover,#liveWorkToggle.on{color:var(--lampara);border-color:var(--borde-acento)}
319
450
  #liveContext{display:flex;align-items:center;gap:9px;margin-top:10px;padding-top:10px;
320
451
  border-top:1px solid var(--linea)}
321
452
  .livePeople{display:flex;padding-left:5px}.livePerson{width:25px;height:25px;margin-left:-5px;
322
453
  border-radius:50%;display:grid;place-items:center;border:2px solid var(--suelo2);
323
- background:hsl(var(--actor-hue) 36% 30%);color:#f3eee4;font:600 8.5px var(--hud)}
454
+ background:hsl(var(--actor-hue) var(--chip-luz));color:var(--chip-tinta);font:600 8.5px var(--hud)}
324
455
  .livePerson svg{width:13px;height:13px;fill:none;stroke:currentColor;stroke-width:1.8;
325
456
  stroke-linecap:round;stroke-linejoin:round}
326
457
  .liveContextText{min-width:0;color:var(--tinta3);font:10px/1.35 var(--hud)}
@@ -332,15 +463,15 @@ input[type=text]:focus,select:focus{outline:none;border-color:var(--lampara)}
332
463
  align-items:start;gap:8px;max-width:94%}
333
464
  .liveTurn.chair{grid-template-columns:minmax(0,1fr) 31px;align-self:flex-end}
334
465
  .liveTurn.chair .liveAvatar{grid-column:2}.liveTurn.chair .liveBubble{grid-column:1;grid-row:1;
335
- border-radius:9px 3px 9px 9px;background:#27291f;border-color:#49452d}
466
+ border-radius:9px 3px 9px 9px;background:var(--burbuja-mia);border-color:var(--borde-acento)}
336
467
  .liveTurn.member{align-self:flex-start}.liveTurn.system{align-self:center;max-width:100%}
337
- .liveTurn.system .liveAvatar{display:none}.liveTurn.system .liveBubble{grid-column:1/-1;background:#171f2a}
338
- .liveTurn.question{--tono:var(--lampara)}.liveTurn.floor{--tono:#aa93ff}
339
- .liveTurn.evidence{--tono:#61ace9}.liveTurn.decision{--tono:var(--verde)}
340
- .liveTurn.verification{--tono:#50ccb1}.liveTurn.error{--tono:var(--carta)}
468
+ .liveTurn.system .liveAvatar{display:none}.liveTurn.system .liveBubble{grid-column:1/-1;background:var(--burbuja)}
469
+ .liveTurn.question{--tono:var(--lampara)}.liveTurn.floor{--tono:var(--tono-palabra)}
470
+ .liveTurn.evidence{--tono:var(--tono-evidencia)}.liveTurn.decision{--tono:var(--verde)}
471
+ .liveTurn.verification{--tono:var(--tono-verificacion)}.liveTurn.error{--tono:var(--carta)}
341
472
  .liveAvatar{width:31px;height:31px;border-radius:50%;display:grid;place-items:center;
342
- background:hsl(var(--actor-hue) 36% 29%);color:#f4efe5;border:1px solid hsl(var(--actor-hue) 38% 39%);
343
- font:600 9.5px var(--hud);box-shadow:0 0 0 2px #101720}
473
+ background:hsl(var(--actor-hue) var(--chip-luz));color:var(--chip-tinta);border:1px solid hsl(var(--actor-hue) 38% 55%);
474
+ font:600 9.5px var(--hud);box-shadow:0 0 0 2px var(--panel)}
344
475
  .liveAvatar svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.7;
345
476
  stroke-linecap:round;stroke-linejoin:round}
346
477
  /* Identicon faces: the SVG brings its own ground and kind-tinted ring, so the
@@ -371,14 +502,23 @@ input[type=text]:focus,select:focus{outline:none;border-color:var(--lampara)}
371
502
  <div id="app">
372
503
  <nav>
373
504
  <div class="marca">
374
- <span class="badge">town hall</span>
505
+ <span class="badge" data-i18n>town hall</span>
375
506
  <h2>Agents City</h2>
376
- <p>Manage one autonomous city: its seat, repo agents, roads and map. Everything here is a plain file you can also inspect by hand.</p>
507
+ <p data-i18n>Manage one autonomous city: its seat, repo agents, roads and map. Everything here is a plain file you can also inspect by hand.</p>
508
+ <div class="ajustes">
509
+ <button type="button" id="temaBoton" class="temaBoton"
510
+ title="Daylight is the default; night is the map's own light">☾ Night</button>
511
+ <button type="button" id="idiomaBoton" class="temaBoton"
512
+ title="Español / English">EN</button>
513
+ </div>
377
514
  </div>
515
+ <div id="railCiudad" class="railCiudad"></div>
378
516
  <ol id="rail"></ol>
517
+ <ol id="railOtras" class="railOtras"></ol>
379
518
  <div id="ciudades" style="padding:0 18px"></div>
380
519
  <div class="pie">
381
- <a href="#" id="alWizard">Create another city →</a>
520
+ <p id="avisoVersion" class="avisoVersion" hidden></p>
521
+ <a href="#" id="alWizard" data-i18n>Create another city →</a>
382
522
  <span class="dato" id="dondeDatos"></span>
383
523
  </div>
384
524
  </nav>