@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.
- package/CHANGELOG.md +45 -1
- package/CONTRIBUTING.md +5 -1
- package/NOTICE +20 -1
- package/README.md +8 -7
- package/TRADEMARKS.md +65 -0
- package/docs/INTERNALS.md +2 -2
- package/docs/REFERENCE.md +6 -5
- package/docs/madre-banner.png +0 -0
- package/package.json +4 -3
- package/public/app.js +529 -91
- package/public/es.js +1330 -1070
- package/public/macroverso.js +22 -2
- package/public/salas-mac.css +518 -24
- package/public/salas-mac.html +25 -21
- package/public/salas-mac.js +1454 -125
- package/public/styles.css +167 -3
- package/public/tour-chapters.js +162 -52
- package/public/tour.js +48 -12
- package/public/troubleshooting.js +2 -2
- package/src/auth-probe.mjs +29 -6
- package/src/credentials.mjs +80 -0
- package/src/directives.mjs +6 -6
- package/src/extensions.mjs +31 -10
- package/src/heartbeat.mjs +55 -0
- package/src/local-ai.mjs +48 -0
- package/src/looks.mjs +38 -5
- package/src/models.mjs +38 -0
- package/src/modules/ollama.mjs +14 -2
- package/src/outbound.mjs +17 -0
- package/src/room/escalation.mjs +1 -0
- package/src/room.mjs +60 -19
- package/src/server.mjs +350 -27
- package/src/tour.mjs +24 -9
- package/src/whats-new.mjs +10 -10
- package/docs/madre-banner.svg +0 -25
package/public/salas-mac.css
CHANGED
|
@@ -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-
|
|
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: .
|
|
262
|
-
.sm-map .
|
|
263
|
-
.sm-map .wire {
|
|
264
|
-
.sm-map .
|
|
265
|
-
.sm-map .node { fill:
|
|
266
|
-
.sm-map .node.asleep { fill:
|
|
267
|
-
.sm-map .node.linked {
|
|
268
|
-
.sm-map .node.
|
|
269
|
-
|
|
270
|
-
.sm-map .
|
|
271
|
-
.sm-map .
|
|
272
|
-
.sm-map
|
|
273
|
-
.sm-map
|
|
274
|
-
.sm-map-
|
|
275
|
-
.sm-map-
|
|
276
|
-
.sm-map-
|
|
277
|
-
.sm-
|
|
278
|
-
.sm-
|
|
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:
|
|
334
|
-
.sm-link { display: grid; grid-template-columns: 1fr auto; gap:
|
|
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
|
|
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:
|
|
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;
|
|
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; }
|