@jossuealcala/madre 1.0.0 → 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.
@@ -256,26 +256,28 @@ a.sm-tag-room:hover { background: color-mix(in srgb, var(--s-acc) 16%, transpare
256
256
  /* The map of the links (2026-10-11): hairline spokes from the Coordinator, a wire in the accent per
257
257
  contract with the notes running along it, the projects it touches drawn whole and named in
258
258
  full, the rest quiet round the edge. */
259
- .sm-map { position: relative; flex: 1; min-height: 150px; color: var(--s-acc); }
259
+ .sm-links-tile { gap: 14px; padding: 22px 24px; }
260
+ .sm-map { position: relative; flex: 1; min-height: 210px; color: var(--s-acc); }
260
261
  .sm-map svg { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
261
- .sm-map .spoke { stroke: var(--text-3); stroke-opacity: .22; stroke-width: 1; }
262
- .sm-map .spoke.linked { stroke-opacity: 0; }
263
- .sm-map .wire { fill: none; stroke: var(--s-acc); stroke-width: 2; stroke-linecap: round; }
264
- .sm-map .note { fill: var(--s-acc); }
265
- .sm-map .node { fill: var(--surface, var(--panel)); stroke: color-mix(in srgb, var(--text) 22%, transparent); stroke-width: 1.2; opacity: .7; }
266
- .sm-map .node.asleep { fill: transparent; stroke: var(--text-3); stroke-dasharray: 2.5 2.5; }
267
- .sm-map .node.linked { opacity: 1; fill: var(--surface, var(--panel)); stroke: var(--s-acc); stroke-width: 2; stroke-dasharray: none; }
268
- .sm-map .node.waiting { stroke: var(--s-acc); stroke-width: 2; opacity: 1; }
269
- .sm-map .label { font-family: var(--read); font-size: 11px; font-weight: 500; fill: var(--text-3); }
270
- .sm-map .label.linked { font-size: 12px; font-weight: 650; fill: var(--text); }
271
- .sm-map .bishop .halo { fill: none; stroke: var(--s-acc); stroke-opacity: .35; stroke-width: 1.5; }
272
- .sm-map-legend { display: grid; gap: 4px; margin: 2px 0 0; padding: 0; list-style: none; }
273
- .sm-map-legend li { display: flex; align-items: center; gap: 7px; min-width: 0; font-size: 12.5px; line-height: 1.35; color: var(--text-2); }
274
- .sm-map-legend li i { flex: none; width: 14px; height: 2px; border-radius: 1px; background: var(--s-acc); }
275
- .sm-map-legend li b { font-weight: 650; color: var(--text); }
276
- .sm-map-legend .says { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
277
- .sm-map-legend li.more { padding-left: 21px; }
278
- .sm-map-orders { flex: none; padding: 1px 6px; border-radius: 6px; 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); }
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); }
279
281
  .sm-map > .sm-hint { position: absolute; inset: 0; display: grid; place-items: center; text-align: center; padding: 0 12px; }
280
282
 
281
283
  /* The low row: what was decided, what needs you, and the memory. */
@@ -330,18 +332,20 @@ a.sm-tag-room:hover { background: color-mix(in srgb, var(--s-acc) 16%, transpare
330
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)); }
331
333
 
332
334
  /* LINKS (docs/MACROVERSO.md, phase 3c): the contracts between rooms, and the sheet that signs one. */
333
- .sm-link-list { display: grid; gap: 10px; }
334
- .sm-link { display: grid; grid-template-columns: 1fr auto; gap: 6px 14px; align-items: center; padding: 14px 16px; border-radius: 16px; background: var(--panel); box-shadow: inset 0 0 0 1px var(--line); }
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; }
335
338
  .sm-link .who { margin: 0; font-family: var(--read); font-size: 15px; font-weight: 650; letter-spacing: -.01em; text-transform: none; }
336
339
  .sm-link .who b { color: var(--s-acc); }
337
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); }
338
341
  .sm-link .what { grid-column: 1; }
339
342
  .sm-link .traffic { grid-column: 1; }
340
- .sm-link .sm-actions { grid-column: 2; grid-row: 1 / span 4; display: flex; align-items: center; gap: 8px; }
343
+ .sm-link .sm-actions { grid-column: 2; grid-row: 1 / span 5; display: flex; align-items: center; gap: 8px; }
341
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; }
342
345
  .sm-link .sm-recall input { accent-color: var(--s-acc); }
343
346
  .sm-link.revoking { box-shadow: inset 0 0 0 1px color-mix(in srgb, #ff4d3d 55%, var(--line)); }
344
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; } }
345
349
  /* Every sheet of the lobby wears the room's window material (styles.css, dialog.settings-window):
346
350
  the second ground at 94 %, a light falling from its top, the space behind it blurred. What is
347
351
  inside stands on it as the room's cards do. */
@@ -450,7 +454,8 @@ body.sm-in-macro { overflow: hidden; }
450
454
  .sm-mark svg { width: 62%; height: 62%; }
451
455
 
452
456
  /* Sheets that are wider than the link sheet, and their head. */
453
- .sm-sheet.sm-wide { --sm-sheet-w: 720px; }
457
+ .sm-sheet.sm-wide { --sm-sheet-w: 780px; }
458
+ #sm-links-sheet .sm-sheet-body { padding: 24px 26px; gap: 18px; }
454
459
  .sm-sheet-body { display: grid; gap: 14px; padding: 20px 24px 20px; }
455
460
  .sm-sheet-body > h3 { margin: 0; font-size: 22px; font-weight: 700; letter-spacing: -.015em; }
456
461
  .sm-sheet-body .hint, .sm-picker .hint { margin: 0; font-size: 13.5px; line-height: 1.5; color: var(--text-2); }
@@ -566,13 +571,51 @@ body.sm-in-macro { overflow: hidden; }
566
571
 
567
572
  /* Agents, in the wizard's first step: the mark, its name and its state, and the one action it needs. */
568
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)); }
569
- .sm-agent { display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 12px; padding: 11px 0; border-top: 1px solid var(--line); }
574
+ .sm-agent { display: grid; border-top: 1px solid var(--line); }
570
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; }
571
598
  .sm-agent-words { display: grid; gap: 2px; min-width: 0; }
572
599
  .sm-agent-words b { font-size: 14.5px; font-weight: 600; }
573
600
  .sm-agent-words small { font-size: 12.5px; }
574
601
  .sm-agent-line { font-family: var(--mono); font-size: 11.5px !important; color: var(--text-3); overflow-wrap: anywhere; }
575
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; }
576
619
 
577
620
  /* LINKING TWO ROOMS, step by step (salas-mac.js, openLinkSheet), in the room's settings language:
578
621
  the step and its question, what it decides; the choices on a card, a row each, the safe one
@@ -785,3 +828,454 @@ button.sm-pill { border: 0; cursor: pointer; }
785
828
  .sm-pill.is-update:focus-visible { outline: 2px solid color-mix(in srgb, var(--s-acc) 70%, transparent); outline-offset: 2px; }
786
829
  /* A project's name inside the wizard's sentences stands out (salas-mac.js, sayBold). */
787
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; }