@jossuealcala/madre 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.en.md +69 -1
- package/CHANGELOG.md +69 -1
- package/README.en.md +11 -15
- package/README.md +3 -3
- package/bin/madre.cjs +40 -0
- package/bin/madre.mjs +5 -0
- package/docs/REFERENCE.md +29 -3
- package/docs/SDK.md +4 -2
- package/docs/en/REFERENCE.md +29 -3
- package/docs/en/SDK.md +4 -2
- package/docs/training/README.md +28 -1
- package/docs/training/train.sh +5 -1
- package/package.json +3 -3
- package/public/app.js +1626 -151
- package/public/attribution.js +44 -1
- package/public/brands.js +20 -5
- package/public/code-tools.js +143 -0
- package/public/editor.js +20 -4
- package/public/es.js +393 -25
- package/public/hardware.js +50 -0
- package/public/index.html +5 -1
- package/public/macroverso.js +187 -96
- package/public/market-art.js +161 -0
- package/public/market-view.js +529 -0
- package/public/market.js +189 -0
- package/public/neural.js +110 -0
- package/public/nostromo-engine.js +412 -47
- package/public/power.js +100 -0
- package/public/resay.js +5 -0
- package/public/salas-mac.css +98 -14
- package/public/salas-mac.html +9 -1
- package/public/salas-mac.js +307 -30
- package/public/styles.css +838 -61
- package/public/tour.js +48 -6
- package/public/troubleshooting.js +6 -1
- package/public/wallpaper.js +275 -0
- package/src/adapters/cursor.mjs +96 -0
- package/src/adapters/gemini.mjs +10 -3
- package/src/adapters/madre.mjs +2 -1
- package/src/auth-probe.mjs +143 -12
- package/src/bridge/policy.mjs +1 -1
- package/src/capabilities.mjs +9 -0
- package/src/checkpoint.mjs +16 -1
- package/src/credentials.mjs +3 -0
- package/src/dataset.mjs +76 -4
- package/src/enlaces.mjs +208 -2
- package/src/extensions.mjs +11 -3
- package/src/i18n.mjs +16 -0
- package/src/looks.mjs +125 -2
- package/src/market-key.mjs +8 -0
- package/src/market-remote.mjs +239 -0
- package/src/models.mjs +4 -0
- package/src/module-scope.mjs +68 -0
- package/src/modules/ahp.mjs +102 -7
- package/src/modules/bishop-exam.mjs +122 -0
- package/src/modules/bishop.mjs +71 -12
- package/src/modules/enlaces.mjs +87 -6
- package/src/modules/image-studio.mjs +10 -1
- package/src/modules/intents.mjs +3 -1
- package/src/modules/local-models.mjs +124 -0
- package/src/modules/ollama.mjs +12 -3
- package/src/modules/playwright.mjs +73 -15
- package/src/modules/sdk.mjs +61 -9
- package/src/npm-launch.mjs +18 -0
- package/src/ollama.mjs +6 -5
- package/src/outbound.mjs +9 -1
- package/src/ports.mjs +4 -2
- package/src/room/control.mjs +1 -1
- package/src/room/prompt.mjs +13 -2
- package/src/room.mjs +14 -4
- package/src/router.mjs +1 -1
- package/src/runs.mjs +4 -1
- package/src/runtime-detection.mjs +9 -0
- package/src/salas.mjs +26 -0
- package/src/server.mjs +617 -48
- package/src/setup.mjs +1 -1
package/public/styles.css
CHANGED
|
@@ -95,6 +95,14 @@
|
|
|
95
95
|
--icon-stroke: 1.6;
|
|
96
96
|
--icon-stroke-hover: 1.8;
|
|
97
97
|
--icon-stroke-on: 2.05;
|
|
98
|
+
/* The icons' sizes (1.0.3): four, and which one a drawing takes is said by what holds it, never
|
|
99
|
+
by the drawing. A mark inside a pill, a tab or a badge (×, ⌄, ✓); a key of 22 to 30 px, or a
|
|
100
|
+
drawing beside a word; a square key of 34 px (the narrow bar, the house's keys, the box); a
|
|
101
|
+
round key that floats (40 to 44 px). */
|
|
102
|
+
--ico-xs: 12px;
|
|
103
|
+
--ico-sm: 15px;
|
|
104
|
+
--ico-md: 18px;
|
|
105
|
+
--ico-lg: 22px;
|
|
98
106
|
}
|
|
99
107
|
/* Reading code, in whichever ground the room is standing on. These were picked for phosphor on
|
|
100
108
|
black; on white the same green and yellow disappear, so each one has a light value of its own. */
|
|
@@ -842,7 +850,7 @@ textarea::placeholder { color: var(--text-3); }
|
|
|
842
850
|
.composer.m3.copilot { --mode: var(--madre-green); --mode-ink: var(--madre-green-ink); }
|
|
843
851
|
.composer.copilot .picker .mode-chip.m3 { --mode: var(--madre-green); }
|
|
844
852
|
.field button[type="submit"] { width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; background: var(--mode, var(--phosphor)); color: var(--mode-ink, var(--phosphor-ink)); cursor: pointer; display: grid; place-items: center; box-shadow: var(--lift-1); transition: background calc(250ms * var(--motion-scale)), box-shadow calc(250ms * var(--motion-scale)); }
|
|
845
|
-
.field button[type="submit"] svg { width:
|
|
853
|
+
.field button[type="submit"] svg { width: var(--ico-md); height: var(--ico-md); }
|
|
846
854
|
.field button[type="submit"]:hover { filter: brightness(1.06); }
|
|
847
855
|
.field button[type="submit"]:disabled { opacity: .4; cursor: default; box-shadow: none; }
|
|
848
856
|
.pick-label .pick-note { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-family: var(--mono); font-size: 9px; letter-spacing: .14em; text-transform: uppercase; color: var(--text-3); white-space: nowrap; }
|
|
@@ -898,6 +906,11 @@ textarea::placeholder { color: var(--text-3); }
|
|
|
898
906
|
.who .reply { max-width: 150px; }
|
|
899
907
|
.system .gauge { width: 160px; }
|
|
900
908
|
}
|
|
909
|
+
/* A conversation 680 px wide beside a docked panel reads as one in a 680 px window (app.js, roomWidth);
|
|
910
|
+
the bar has its own container and folds by itself. */
|
|
911
|
+
:where(:root.room-680) .row { max-width: 96%; }
|
|
912
|
+
:where(:root.room-680) .who .reply { max-width: 150px; }
|
|
913
|
+
:where(:root.room-680) .system .gauge { width: 160px; }
|
|
901
914
|
|
|
902
915
|
/* ================= MU/TH/UR: troubleshooting ================= */
|
|
903
916
|
.mother-button {
|
|
@@ -1021,6 +1034,10 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
1021
1034
|
.mother-cmd .copy:hover { color: var(--ph); border-color: var(--ph-dim); }
|
|
1022
1035
|
.mother-cmd .copy.done { color: var(--ph); border-color: var(--ph); }
|
|
1023
1036
|
.mother-cmd .copy:hover { color: var(--ph); border-color: var(--ph); }
|
|
1037
|
+
/* The copy key holds only its drawing: a button rule of a sheet or a card (13px each side) used to
|
|
1038
|
+
reach it and leave the drawing no room, an empty square beside the command (2026-10-18). */
|
|
1039
|
+
.mother-cmd > .copy { padding: 0 !important; min-width: 26px; }
|
|
1040
|
+
.mother-cmd > .copy svg { flex: none; width: 13px; height: 13px; }
|
|
1024
1041
|
.mother-record { display: grid; grid-template-columns: 64px 92px 1fr auto 20px; gap: 14px; align-items: baseline; padding: 10px 0; border-bottom: 1px solid var(--ph-faint); font-size: 12px; }
|
|
1025
1042
|
.mother-record .t { color: var(--ph-dim); }
|
|
1026
1043
|
.mother-record .a { color: var(--agent, var(--ph)); text-transform: uppercase; letter-spacing: .1em; }
|
|
@@ -1093,8 +1110,11 @@ dialog.mother::backdrop { background: rgba(0, 0, 0, .82); backdrop-filter: blur(
|
|
|
1093
1110
|
.module-card .actions .note { font-size: 10px; letter-spacing: .12em; color: var(--ph-dim); }
|
|
1094
1111
|
.module-card .confirm { border: 1px dashed var(--ph); padding: 12px 14px; display: grid; gap: 10px; }
|
|
1095
1112
|
.module-card .confirm .warn { color: #ffd166; font-size: 11px; letter-spacing: .12em; }
|
|
1096
|
-
|
|
1097
|
-
|
|
1113
|
+
/* What an install printed, in the same box as the commands beside it (2026-10-18): the page's own
|
|
1114
|
+
ground and ink, in the code face. It was a black terminal painted with the theme's phosphor,
|
|
1115
|
+
which on the light theme is a dark green: dark grey on black, unreadable. */
|
|
1116
|
+
.module-log { max-height: 260px; overflow-y: auto; margin: 0; padding: 10px 12px; border: 0; border-radius: 10px; background: color-mix(in srgb, var(--text) 5%, transparent); box-shadow: inset 0 1px 2px rgba(0, 0, 0, .14); font-family: var(--mono); font-size: 11.5px; line-height: 1.6; letter-spacing: 0; text-transform: none; white-space: pre-wrap; overflow-wrap: anywhere; color: var(--text-2); }
|
|
1117
|
+
.module-log .err { color: var(--crit, #d93a3a); }
|
|
1098
1118
|
.system.module { color: var(--phosphor); }
|
|
1099
1119
|
.system.module .cmd { text-transform: none; letter-spacing: 0; color: var(--text-2); display: block; margin-top: 4px; }
|
|
1100
1120
|
.system.module.failed { color: var(--danger); }
|
|
@@ -1343,7 +1363,7 @@ dialog.override[open] { display: grid; place-items: center; }
|
|
|
1343
1363
|
.field { grid-template-columns: auto minmax(0, 1fr) auto auto auto auto; }
|
|
1344
1364
|
.attach { width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--text-3); cursor: pointer; display: grid; place-items: center; }
|
|
1345
1365
|
.attach:hover { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); }
|
|
1346
|
-
.attach svg { width:
|
|
1366
|
+
.attach svg { width: var(--ico-md); height: var(--ico-md); }
|
|
1347
1367
|
.composer.dropping .field { border-color: var(--phosphor); box-shadow: 0 0 0 3px color-mix(in srgb, var(--phosphor) 16%, transparent); }
|
|
1348
1368
|
.attachments { display: flex; gap: 8px; flex-wrap: wrap; padding: 0 6px; }
|
|
1349
1369
|
.attachment-chip { display: inline-flex; align-items: center; gap: 8px; padding: 4px 6px 4px 4px; border: 1px solid var(--line-2); border-radius: 10px; background: var(--panel); font-family: var(--mono); font-size: 10.5px; color: var(--text-2); max-width: 260px; }
|
|
@@ -1398,7 +1418,7 @@ dialog.viewer { border: 0; padding: 0; width: min(1100px, 96vw); max-width: 96vw
|
|
|
1398
1418
|
The crew is the exception that needs markup: five spheres cannot be compacted by CSS into one
|
|
1399
1419
|
button, so there are two elements and the container query picks which one is on screen. */
|
|
1400
1420
|
.bar-icon { display: inline-flex; align-items: center; justify-content: center; gap: 5px; width: auto; padding: 0 8px 0 6px; height: 28px; padding: 0; border-radius: 8px; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); cursor: pointer; }
|
|
1401
|
-
.bar-icon svg { width:
|
|
1421
|
+
.bar-icon svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
1402
1422
|
.bar-icon:hover { color: var(--phosphor); border-color: var(--phosphor); }
|
|
1403
1423
|
.bar-count { min-width: 16px; height: 16px; padding: 0 4px; border-radius: 8px; display: inline-grid; place-items: center; background: var(--phosphor); color: var(--phosphor-ink); font-family: var(--mono); font-size: 9px; letter-spacing: 0; }
|
|
1404
1424
|
.bar-glyph { display: none; }
|
|
@@ -1428,7 +1448,7 @@ dialog.viewer { border: 0; padding: 0; width: min(1100px, 96vw); max-width: 96vw
|
|
|
1428
1448
|
that was on screen. A count belongs inside the thing it counts. */
|
|
1429
1449
|
.mother-button { width: auto; height: 28px; padding: 0 9px 0 7px; gap: 5px; font-size: 0; justify-content: center; }
|
|
1430
1450
|
.mother-button .mother-glyph { display: none; }
|
|
1431
|
-
.mother-button .bar-glyph { display: block; width:
|
|
1451
|
+
.mother-button .bar-glyph { display: block; width: var(--ico-md); height: var(--ico-md); }
|
|
1432
1452
|
.mother-button .modules-count, .mother-button .mother-count { font-size: 9px; }
|
|
1433
1453
|
.stop-all { width: 30px; height: 28px; padding: 0; gap: 0; font-size: 0; justify-content: center; }
|
|
1434
1454
|
/* Squircles with their count on the corner, the way a phone shows it. The count used to be
|
|
@@ -1437,7 +1457,7 @@ dialog.viewer { border: 0; padding: 0; width: min(1100px, 96vw); max-width: 96vw
|
|
|
1437
1457
|
and touches nothing else. A ring in the background colour cuts it out of the outline. */
|
|
1438
1458
|
.bar { gap: 14px; }
|
|
1439
1459
|
.bar-icon, .mother-button, .stop-all { position: relative; width: 34px; height: 34px; padding: 0; gap: 0; border-radius: 11px; justify-content: center; }
|
|
1440
|
-
.bar-icon svg, .mother-button .bar-glyph { width:
|
|
1460
|
+
.bar-icon svg, .mother-button .bar-glyph { width: var(--ico-md); height: var(--ico-md); }
|
|
1441
1461
|
.bar-icon .bar-count, .mother-button .modules-count, .mother-button .mother-count {
|
|
1442
1462
|
position: absolute; top: -6px; right: -7px; min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px;
|
|
1443
1463
|
font-family: var(--mono); font-size: 9.5px; font-weight: 700; line-height: 18px; box-shadow: 0 0 0 2px var(--bg);
|
|
@@ -1538,7 +1558,7 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1538
1558
|
.viewer-nav .nav { width: 26px; height: 26px; display: grid; place-items: center; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); border-radius: 7px; cursor: pointer; font: inherit; font-size: 14px; line-height: 1; }
|
|
1539
1559
|
.viewer-nav .nav:hover { color: var(--text); border-color: var(--text-3); }
|
|
1540
1560
|
/* The browser's reload is the bar's reload mark (2026-10-14), the same drawing, still. */
|
|
1541
|
-
.viewer-nav .nav.reload svg { width:
|
|
1561
|
+
.viewer-nav .nav.reload svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
1542
1562
|
.viewer-nav .nav:disabled { opacity: .35; cursor: default; }
|
|
1543
1563
|
.viewer-errors { display: grid; gap: 6px; padding: 8px 16px; border-bottom: 1px solid color-mix(in srgb, var(--danger) 40%, transparent); background: color-mix(in srgb, var(--danger) 7%, transparent); font-family: var(--mono); font-size: 11px; }
|
|
1544
1564
|
.viewer-errors:not([hidden]) + .viewer-body { height: auto; max-height: calc(100% - 46px); }
|
|
@@ -1596,7 +1616,7 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1596
1616
|
|
|
1597
1617
|
/* ================= creation lease ================= */
|
|
1598
1618
|
.create-toggle { height: 30px; padding: 0 10px 0 8px; border-radius: 999px; border: 1px solid var(--line-2); background: transparent; color: var(--text-3); display: inline-flex; align-items: center; gap: 6px; cursor: pointer; font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; align-self: center; transition: color calc(200ms * var(--motion-scale)), border-color calc(200ms * var(--motion-scale)), background calc(200ms * var(--motion-scale)); }
|
|
1599
|
-
.create-toggle svg { width:
|
|
1619
|
+
.create-toggle svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
1600
1620
|
.create-toggle:hover { color: var(--text); border-color: var(--text-3); }
|
|
1601
1621
|
.create-toggle[aria-pressed="true"] { color: var(--warn); border-color: var(--warn); background: color-mix(in srgb, var(--warn) 12%, transparent); text-shadow: none; }
|
|
1602
1622
|
.create-toggle .lock.open { display: none; }
|
|
@@ -1713,8 +1733,10 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1713
1733
|
.system.control.changed.quiet { border-style: dashed; color: var(--text-2); background: transparent; }
|
|
1714
1734
|
/* The status and the path in two columns: the status never breaks inside a word (MODIFICADO used
|
|
1715
1735
|
to split as MODIFICAD / O), and a long path breaks inside itself, left-aligned, not centred. */
|
|
1716
|
-
|
|
1717
|
-
|
|
1736
|
+
/* Centred like the head and the tally around them: the list is one block in the middle of the card,
|
|
1737
|
+
its kinds and its files still each in their own column. */
|
|
1738
|
+
.system.control .files { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: max-content minmax(0, max-content); justify-content: center; gap: 6px 10px; align-items: baseline; justify-self: stretch; text-align: left; }
|
|
1739
|
+
.system.control .files li { display: contents; }
|
|
1718
1740
|
.system.control .files .st { font-family: var(--mono); font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); min-width: 64px; white-space: nowrap; }
|
|
1719
1741
|
.system.control .files .st.A { color: var(--phosphor); } .system.control .files .st.M { color: var(--warn); } .system.control .files .st.D { color: var(--danger); }
|
|
1720
1742
|
.system.control .files .file-ref { font-family: var(--mono); font-size: 12px; color: var(--text); background: transparent; border: 0; border-bottom: 1px dashed var(--line-2); padding: 0; cursor: pointer; text-align: left; overflow-wrap: anywhere; justify-self: start; }
|
|
@@ -1780,6 +1802,8 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1780
1802
|
.bubble .artifacts { margin: 10px 0 0; padding-top: 8px; border-top: 1px dashed var(--line-2); }
|
|
1781
1803
|
.bubble .artifacts .label { display: block; font-family: var(--mono); font-size: 9.5px; letter-spacing: .16em; text-transform: uppercase; color: var(--warn); margin-bottom: 6px; }
|
|
1782
1804
|
@media (max-width: 680px) { .create-toggle .create-word { display: none; } .create-toggle { padding: 0 8px; } }
|
|
1805
|
+
/* The same at 680 px of conversation beside a docked panel, where the window's width says nothing (app.js, roomWidth). */
|
|
1806
|
+
:where(:root.room-680) .create-toggle .create-word { display: none; } :where(:root.room-680) .create-toggle { padding: 0 8px; }
|
|
1783
1807
|
|
|
1784
1808
|
/* no horizontal overflow inside bubbles: wrap everything */
|
|
1785
1809
|
.bubble, .bubble * { min-width: 0; }
|
|
@@ -2073,6 +2097,7 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
2073
2097
|
.free-offer .free-go { flex: none; border: 1px solid var(--brew); background: transparent; color: var(--brew); font-family: var(--mono); font-size: 10px; font-weight: 600; letter-spacing: .12em; padding: 6px 12px; border-radius: 7px; cursor: pointer; }
|
|
2074
2098
|
.free-offer .free-go:hover { background: color-mix(in srgb, var(--brew) 16%, transparent); }
|
|
2075
2099
|
@media (max-width: 720px) { .free-offer { flex-wrap: wrap; } }
|
|
2100
|
+
:where(:root.room-720) .free-offer { flex-wrap: wrap; }
|
|
2076
2101
|
/* Intenciones: the same shelf as the @madre offer, in the room's accent when a cheaper rung was
|
|
2077
2102
|
measured to be enough or is worth measuring, and in the warning ink when the rung chosen looks
|
|
2078
2103
|
too light. The shelf itself is drawn with the box, below. */
|
|
@@ -2113,14 +2138,14 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2113
2138
|
.slash-menu .hint { padding: 4px 10px 6px; font-family: var(--mono); font-size: 10px; letter-spacing: .12em; color: var(--text-3); }
|
|
2114
2139
|
/* ---------- project files panel: lives in the free space right of the thread ---------- */
|
|
2115
2140
|
.tree-button { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 26px; border-radius: 6px; border: 1px solid var(--line-2); background: transparent; color: var(--text-2); cursor: pointer; padding: 0; }
|
|
2116
|
-
.tree-button svg { width:
|
|
2141
|
+
.tree-button svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
2117
2142
|
.tree-button:hover { color: var(--phosphor); border-color: var(--phosphor); box-shadow: var(--ring-soft); }
|
|
2118
2143
|
/* The conversations of this project, on the other side of the canvas from the files: the same
|
|
2119
2144
|
panel, so there is one shape to learn, and never both edges at once on a narrow screen. */
|
|
2120
2145
|
.tree.chats { justify-self: start; margin: 18px 0 10px 20px; grid-template-rows: auto minmax(0, 1fr) auto auto; }
|
|
2121
2146
|
.chats-new { padding: 10px 12px; border-top: 1px solid var(--line); }
|
|
2122
2147
|
.chats-new-button { display: flex; align-items: center; justify-content: center; gap: 8px; width: 100%; border: 1px dashed var(--line-2); border-radius: 10px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 10px; letter-spacing: .16em; padding: 9px 10px; cursor: pointer; }
|
|
2123
|
-
.chats-new-button svg { width:
|
|
2148
|
+
.chats-new-button svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
2124
2149
|
.chats-new-button:hover { color: var(--phosphor); border-color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 8%, transparent); }
|
|
2125
2150
|
.chats-body { padding: 10px 8px; display: grid; gap: 6px; align-content: start; }
|
|
2126
2151
|
.chats-body .chat { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: baseline; width: 100%; border: 0; background: transparent; color: var(--text-2); font: inherit; text-align: left; padding: 11px 12px; border-radius: 10px; cursor: pointer; }
|
|
@@ -2146,7 +2171,7 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2146
2171
|
.chats-foot { padding: 10px 14px; border-top: 1px solid var(--line); font-family: var(--mono); font-size: 8.5px; letter-spacing: .12em; color: var(--text-3); }
|
|
2147
2172
|
/* Its handle sits in the canvas, under the bar, where the conversation it opens begins. */
|
|
2148
2173
|
.chats-button { grid-row: 3; justify-self: start; align-self: start; z-index: 6; margin: 18px 0 0 20px; display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 36px; border-radius: 11px; border: 1px solid var(--line-2); background: var(--panel); color: var(--text-2); cursor: pointer; padding: 0; }
|
|
2149
|
-
.chats-button svg { width:
|
|
2174
|
+
.chats-button svg { width: var(--ico-lg); height: var(--ico-lg); }
|
|
2150
2175
|
.chats-button:hover { color: var(--phosphor); border-color: var(--phosphor); box-shadow: var(--ring-soft); }
|
|
2151
2176
|
.chats-button:active { transform: translateY(1px); }
|
|
2152
2177
|
|
|
@@ -2297,7 +2322,7 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2297
2322
|
.bubble:hover .bubble-actions, .bubble:focus-within .bubble-actions { opacity: 1; }
|
|
2298
2323
|
@media (hover: none) { .bubble-actions { opacity: .55; } }
|
|
2299
2324
|
.bubble-actions .act { width: 26px; height: 26px; display: grid; place-items: center; border: 0; border-radius: 8px; background: transparent; color: var(--text-3); cursor: pointer; padding: 0; transition: color calc(150ms * var(--motion-scale)), background calc(150ms * var(--motion-scale)); }
|
|
2300
|
-
.bubble-actions .act svg { width:
|
|
2325
|
+
.bubble-actions .act svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
2301
2326
|
.bubble-actions .act:hover { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
|
|
2302
2327
|
.bubble-actions .act.good.on { color: var(--phosphor); }
|
|
2303
2328
|
.bubble-actions .act.bad.on { color: var(--terror); }
|
|
@@ -2354,12 +2379,12 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2354
2379
|
Every control in the bar carries a drawing in the same idiom — 20×20, round ends, one stroke —
|
|
2355
2380
|
and its word, where it has one, beside it. What is open is drawn heavier and its word is set
|
|
2356
2381
|
bolder; the pointer gets half of that on the way. Colour, weight and ground carry the state. */
|
|
2357
|
-
.bar .bar-glyph { display: block; flex: none; width:
|
|
2382
|
+
.bar .bar-glyph { display: block; flex: none; width: var(--ico-sm); height: var(--ico-sm); }
|
|
2358
2383
|
.bar > .mother-button .mother-glyph { display: none; }
|
|
2359
2384
|
.bar > .mother-button, .bar > .stop-all { gap: 7px; }
|
|
2360
2385
|
.update-glyph { display: inline-flex; }
|
|
2361
2386
|
@container bar (max-width: 980px) {
|
|
2362
|
-
.bar > :is(.mother-button, .stop-all) .bar-glyph { width:
|
|
2387
|
+
.bar > :is(.mother-button, .stop-all) .bar-glyph { width: var(--ico-md); height: var(--ico-md); }
|
|
2363
2388
|
.bar > .mother-button, .bar > .stop-all { gap: 0; }
|
|
2364
2389
|
}
|
|
2365
2390
|
/* The live line: the dot keeps saying the state, the waves around it say what the dot is. */
|
|
@@ -2423,15 +2448,15 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2423
2448
|
replayed the moment .entering was taken off — the panel arrived twice. */
|
|
2424
2449
|
.tree.chats { transform-origin: left top; }
|
|
2425
2450
|
.chats .tree-close { display: inline-grid; place-items: center; padding: 4px; transition: color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out); }
|
|
2426
|
-
.chats .tree-close svg { display: block; width:
|
|
2451
|
+
.chats .tree-close svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
|
|
2427
2452
|
.chats .tree-close:hover svg { transform: rotate(90deg); }
|
|
2428
2453
|
.chats-new-button { transition: color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out), border-color var(--motion) var(--ease-out); }
|
|
2429
2454
|
.chats-new-button:hover { border-style: solid; }
|
|
2430
|
-
.chats-new-button svg { width:
|
|
2455
|
+
.chats-new-button svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
2431
2456
|
.chats-body .chat { grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; transition: background-color var(--motion) var(--ease-out), color var(--motion) var(--ease-out), transform var(--motion-fast) var(--ease-out); }
|
|
2432
2457
|
.chats-body .chat:active { transform: scale(.985); }
|
|
2433
2458
|
.chats-body .chat-glyph { display: grid; place-items: center; width: 16px; height: 16px; color: var(--text-3); transition: color var(--motion) var(--ease-out), transform var(--motion) var(--ease-out); }
|
|
2434
|
-
.chats-body .chat-glyph svg { display: block; width:
|
|
2459
|
+
.chats-body .chat-glyph svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
|
|
2435
2460
|
.chats-body .chat-glyph :is(.chat-spin, .chat-dot) { margin: 0; vertical-align: 0; }
|
|
2436
2461
|
.chats-body .chat:hover .chat-glyph { color: var(--text-2); transform: translateX(1px); }
|
|
2437
2462
|
.chats-body .chat.on .chat-glyph { color: var(--phosphor); transform: none; }
|
|
@@ -2488,6 +2513,14 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2488
2513
|
.bridge-card .actions .note { font-family: var(--mono); font-size: 9.5px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); }
|
|
2489
2514
|
.bridge-log { margin: 0; max-height: 140px; overflow-y: auto; font-family: var(--mono); font-size: 10.5px; line-height: 1.55; color: var(--text-2); background: var(--bg); border: 1px solid var(--line); border-radius: 10px; padding: 8px 10px; white-space: pre-wrap; }
|
|
2490
2515
|
.bridge-log a { color: var(--phosphor); }
|
|
2516
|
+
/* The other way in, folded under the buttons: the same install or sign-in typed in a terminal.
|
|
2517
|
+
A quiet line until someone asks for it; the room's own buttons stay the way forward. */
|
|
2518
|
+
.terminal-way > summary { width: max-content; font-size: 11.5px; color: var(--text-3); cursor: pointer; list-style: none; }
|
|
2519
|
+
.terminal-way > summary::-webkit-details-marker { display: none; }
|
|
2520
|
+
.terminal-way > summary::after { content: ' ›'; }
|
|
2521
|
+
.terminal-way[open] > summary::after { content: ' ⌄'; }
|
|
2522
|
+
.terminal-way > summary:hover { color: var(--text-2); }
|
|
2523
|
+
.terminal-way .mother-cmd { margin: 8px 0 0; }
|
|
2491
2524
|
|
|
2492
2525
|
.bridge-card .account { font-size: 11px; line-height: 1.5; color: var(--text-3); }
|
|
2493
2526
|
.bridge-card .account .free { font-family: var(--mono); font-size: 8.5px; letter-spacing: .16em; color: var(--phosphor); border: 1px solid color-mix(in srgb, var(--phosphor) 45%, transparent); border-radius: 999px; padding: 2px 7px; margin-right: 8px; }
|
|
@@ -2533,6 +2566,8 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2533
2566
|
to be nowhere, so the only thing on screen was a heartbeat and the sign-in died of its clock. */
|
|
2534
2567
|
.login-ask { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
|
|
2535
2568
|
.login-ask[hidden] { display: none; }
|
|
2569
|
+
.login-device { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
|
|
2570
|
+
.login-device code { font-family: var(--mono); font-size: 15px; letter-spacing: .12em; color: var(--text); user-select: all; }
|
|
2536
2571
|
.login-code { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; flex: 1 1 260px; }
|
|
2537
2572
|
.login-code input { flex: 1 1 180px; min-width: 150px; font: inherit; font-size: 12.5px; color: var(--text); background: var(--bg); border: 1px solid var(--line-2); border-radius: 10px; padding: 8px 10px; }
|
|
2538
2573
|
.login-code input:focus { outline: none; border-color: var(--phosphor); }
|
|
@@ -2987,7 +3022,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
|
|
|
2987
3022
|
.split-dock.working .split-spin { display: inline-block; }
|
|
2988
3023
|
@media (prefers-reduced-motion: reduce) { .split-spin { animation: none; border-color: var(--phosphor); } }
|
|
2989
3024
|
.split-action { flex: none; display: inline-grid; place-items: center; width: 26px; height: 26px; padding: 0; border: 1px solid transparent; border-radius: 7px; background: transparent; color: var(--text-3); font: inherit; font-size: 16px; line-height: 1; cursor: pointer; }
|
|
2990
|
-
.split-action svg { width:
|
|
3025
|
+
.split-action svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
2991
3026
|
.split-action:hover, .split-action:focus-visible { color: var(--text); border-color: var(--line-2); }
|
|
2992
3027
|
.split-frame { display: block; width: 100%; height: 100%; min-height: 0; border: 0; background: transparent; }
|
|
2993
3028
|
.shell.dragging-split .split-frame, .shell.dragging-split .browser-dock iframe { pointer-events: none; }
|
|
@@ -2998,7 +3033,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
|
|
|
2998
3033
|
window, or a window of its own. One lit is how it is shown now; the other moves it. */
|
|
2999
3034
|
.chats-body .chat-beside { display: inline-flex; align-items: center; gap: 2px; }
|
|
3000
3035
|
.chats-body :is(.chat-split, .chat-window) { display: inline-grid; place-items: center; border: 1px solid transparent; background: transparent; color: var(--text-3); padding: 3px 5px; border-radius: 7px; cursor: pointer; opacity: 0; }
|
|
3001
|
-
.chats-body :is(.chat-split, .chat-window) svg { width:
|
|
3036
|
+
.chats-body :is(.chat-split, .chat-window) svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3002
3037
|
.chats-body :is(.chat-split, .chat-window) { transition: opacity var(--motion) var(--ease-out), color var(--motion) var(--ease-out), border-color var(--motion) var(--ease-out); }
|
|
3003
3038
|
.chats-body .chat-row:hover :is(.chat-split, .chat-window), .chats-body :is(.chat-split, .chat-window):focus-visible, .chats-body :is(.chat-split, .chat-window).on, .chats-body .chat-beside:has(.on) :is(.chat-split, .chat-window) { opacity: 1; }
|
|
3004
3039
|
.chats-body :is(.chat-split, .chat-window):hover { color: var(--text); border-color: var(--line-2); }
|
|
@@ -3306,7 +3341,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
|
|
|
3306
3341
|
.ports-refresh { display: inline-grid; place-items: center; flex: none; width: 28px; height: 28px; padding: 0; border: 0; border-radius: 7px; color: var(--text-2); background: var(--surface, var(--panel)); box-shadow: var(--key-rest); cursor: pointer; }
|
|
3307
3342
|
.ports-refresh:hover { color: var(--text); box-shadow: var(--key-over, var(--key-rest)); }
|
|
3308
3343
|
.ports-refresh:focus-visible { outline: 2px solid var(--phosphor); outline-offset: 2px; }
|
|
3309
|
-
.ports-refresh svg { width:
|
|
3344
|
+
.ports-refresh svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3310
3345
|
.ports-refresh.checking svg { animation: ports-turn .8s linear infinite; }
|
|
3311
3346
|
@keyframes ports-turn { to { transform: rotate(360deg); } }
|
|
3312
3347
|
@media (prefers-reduced-motion: reduce) { .ports-refresh.checking svg { animation: none; } }
|
|
@@ -3349,7 +3384,7 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
|
|
|
3349
3384
|
.surface-modes { display: inline-flex; align-items: center; flex: none; gap: 0; padding: 2px; border: 1px solid var(--line-2); border-radius: 9px; background: color-mix(in srgb, var(--text) 3%, transparent); }
|
|
3350
3385
|
.surface-mode { display: inline-grid; place-items: center; width: 26px; height: 22px; padding: 0; border: 0; border-radius: 6px; background: transparent; color: var(--text-3); cursor: pointer; transition: color var(--motion) var(--ease-out), background-color var(--motion) var(--ease-out); }
|
|
3351
3386
|
.surface-mode + .surface-mode { margin-left: 1px; }
|
|
3352
|
-
.surface-mode svg { width:
|
|
3387
|
+
.surface-mode svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3353
3388
|
.surface-mode:hover, .surface-mode:focus-visible { color: var(--text); background: color-mix(in srgb, var(--text) 7%, transparent); outline: 0; }
|
|
3354
3389
|
.surface-mode[aria-pressed="true"] { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
|
|
3355
3390
|
.surface-mode[aria-pressed="true"] :is(.ic-h, .ic-f) { fill: currentColor; fill-opacity: .35; }
|
|
@@ -3478,7 +3513,7 @@ dialog.surface.no-intro .mother-frame { animation: none; }
|
|
|
3478
3513
|
.slash-menu .group:first-child { padding-top: 6px; }
|
|
3479
3514
|
.slash-menu .item.cmd { grid-template-columns: 30px minmax(0, 1fr); gap: 12px; align-items: center; padding: 8px 10px; border-radius: 11px; transition: background-color var(--motion-fast) var(--ease-out); }
|
|
3480
3515
|
.slash-menu .item.cmd .glyph { display: grid; place-items: center; width: 30px; height: 30px; border-radius: 9px; border: 1px solid var(--line-2); background: color-mix(in srgb, var(--text) 3%, transparent); color: var(--text-2); transition: color var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out); }
|
|
3481
|
-
.slash-menu .item.cmd .glyph svg { width:
|
|
3516
|
+
.slash-menu .item.cmd .glyph svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3482
3517
|
.slash-menu .item.cmd .glyph.agent { border: 0; background: transparent; }
|
|
3483
3518
|
.slash-menu .item.cmd .glyph.mode { font-family: var(--mono); font-size: 11px; font-weight: 700; color: var(--mode); border-color: color-mix(in srgb, var(--mode) 40%, transparent); }
|
|
3484
3519
|
.slash-menu .item.cmd .glyph.m0 { --mode: var(--mode-0); } .slash-menu .item.cmd .glyph.m1 { --mode: var(--mode-1); } .slash-menu .item.cmd .glyph.m2 { --mode: var(--mode-2); } .slash-menu .item.cmd .glyph.m3 { --mode: var(--mode-3); } .slash-menu .item.cmd .glyph.m4 { --mode: var(--mode-4); }
|
|
@@ -3626,6 +3661,8 @@ dialog.viewer .viewer-status { flex: none; display: flex; align-items: center; g
|
|
|
3626
3661
|
dialog.viewer .viewer-status:not(:has(> :not([hidden]))) { display: none; }
|
|
3627
3662
|
dialog.viewer.editing .viewer-status { display: none; }
|
|
3628
3663
|
dialog.viewer .viewer-status .viewer-lang { border: 0; padding: 0; letter-spacing: .04em; font-size: 10px; text-transform: none; }
|
|
3664
|
+
/* A narrow viewer ends the hint with «…» instead of cutting it at the edge; the whole of it is its title. */
|
|
3665
|
+
dialog.viewer .viewer-status .viewer-lang { flex: 0 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
3629
3666
|
dialog.viewer .viewer-status .viewer-selection { color: var(--phosphor); letter-spacing: .06em; }
|
|
3630
3667
|
dialog.viewer .viewer-status .viewer-review { margin-left: auto; height: 24px; padding: 0 10px; border-radius: 7px; font-size: 9.5px; }
|
|
3631
3668
|
dialog.viewer .viewer-menu { z-index: 70; }
|
|
@@ -3640,24 +3677,30 @@ dialog.viewer pre.code .ln { cursor: pointer; user-select: none; }
|
|
|
3640
3677
|
.ed-btn { height: 26px; padding: 0 9px; gap: 6px; font-size: 9.5px; letter-spacing: .1em; border-radius: 7px; }
|
|
3641
3678
|
.ed-tools .ed-btn { color: var(--text-2); }
|
|
3642
3679
|
.ed-btn .ed-ico { display: inline-grid; place-items: center; width: 15px; height: 15px; color: var(--text-3); transition: color var(--motion) var(--ease-out); }
|
|
3643
|
-
.ed-btn .ed-ico svg { width:
|
|
3680
|
+
.ed-btn .ed-ico svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3644
3681
|
.ed-btn:hover .ed-ico, .ed-btn[aria-pressed="true"] .ed-ico { color: currentColor; }
|
|
3645
3682
|
.ed-save { padding: 0 12px; }
|
|
3646
3683
|
.code-editor.dirty .ed-save { color: var(--text); background: color-mix(in srgb, var(--warn) 10%, transparent); }
|
|
3647
3684
|
.ed-sep { display: none; }
|
|
3648
3685
|
.ed-status .ed-keys { color: var(--text-2); }
|
|
3649
3686
|
|
|
3650
|
-
/* What is selected gets its tools right above it
|
|
3651
|
-
|
|
3687
|
+
/* What is selected gets its tools right above it: the light sheet of the cards under the bar (solid,
|
|
3688
|
+
no glow, no halo; over code a glass would let the letters through), as a capsule. Its words are
|
|
3689
|
+
the room's, in a sentence; its drawings the size of a drawing beside a word; asking an agent, the
|
|
3690
|
+
first of them, wears the accent's flat tone and opens its menu under the chevron. */
|
|
3691
|
+
.ed-float { position: absolute; left: 12px; top: 0; z-index: 4; display: inline-flex; align-items: center; gap: 2px; padding: 3px; border: 0; border-radius: 999px; background: var(--surface, var(--panel)); box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 10%, transparent), 0 1px 2px rgba(0, 0, 0, .18), 0 10px 26px -14px rgba(0, 0, 0, .5); will-change: transform; animation: float-in calc(160ms * var(--motion-scale)) var(--ease-glide); }
|
|
3692
|
+
:root[data-scheme="light"] .ed-float { box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 9%, transparent), 0 1px 2px rgba(20, 30, 25, .08), 0 10px 26px -16px rgba(20, 30, 25, .32); }
|
|
3652
3693
|
.ed-float[hidden] { display: none; }
|
|
3653
3694
|
@keyframes float-in { from { opacity: 0; } to { opacity: 1; } }
|
|
3654
|
-
.ed-chip { display: inline-flex; align-items: center; gap: 6px; height:
|
|
3655
|
-
.ed-chip .ed-ico { display: inline-grid; width:
|
|
3656
|
-
.ed-chip:hover { color: var(--text); background: color-mix(in srgb, var(--text)
|
|
3657
|
-
.ed-chip.ask { color: var(--phosphor); }
|
|
3658
|
-
.ed-chip.ask:hover { background: color-mix(in srgb, var(--phosphor)
|
|
3659
|
-
.ed-chip.
|
|
3695
|
+
.ed-chip { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 12px 0 10px; border: 0; border-radius: 999px; background: transparent; color: var(--text-2); font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; white-space: nowrap; cursor: pointer; transition: color var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out); }
|
|
3696
|
+
.ed-chip .ed-ico { display: inline-grid; place-items: center; width: var(--ico-sm); height: var(--ico-sm); } .ed-chip .ed-ico svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3697
|
+
.ed-chip:is(:hover, :focus-visible) { color: var(--text); background: color-mix(in srgb, var(--text) 7%, transparent); outline: 0; }
|
|
3698
|
+
.ed-chip.ask { padding-right: 9px; color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
|
|
3699
|
+
.ed-chip.ask:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--phosphor) 22%, transparent); }
|
|
3700
|
+
.ed-chip .ed-chev { display: inline-grid; place-items: center; margin-left: -1px; opacity: .8; }
|
|
3701
|
+
.ed-chip .ed-chev svg { width: var(--ico-xs); height: var(--ico-xs); }
|
|
3660
3702
|
.ed-chip.done { color: var(--phosphor); }
|
|
3703
|
+
:root[data-scheme="light"] .ed-chip:is(.ask, .done) { color: color-mix(in srgb, var(--phosphor) 72%, #000000); }
|
|
3661
3704
|
@media (prefers-reduced-motion: reduce) { .ed-float { animation: none; } }
|
|
3662
3705
|
|
|
3663
3706
|
/* ================= the core: the board =================
|
|
@@ -3777,6 +3820,16 @@ dialog.surface.window.mother .mother-head :is(.mother-title, .mother-sub) { curs
|
|
|
3777
3820
|
.agent-pop .crew-pct.hot { color: var(--crit); }
|
|
3778
3821
|
.agent-pop .crew-go { width: 100%; padding: 8px 10px; border: 1px solid var(--line-2); border-radius: 9px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; cursor: pointer; transition: color var(--motion-fast) var(--ease-out), border-color var(--motion-fast) var(--ease-out); }
|
|
3779
3822
|
.agent-pop .crew-go:hover { color: var(--phosphor); border-color: var(--phosphor); }
|
|
3823
|
+
/* 1.0.3 · The way to the agents' settings: Settings' own gear, at its size, and the room's letter. */
|
|
3824
|
+
.agent-pop .crew-go { display: flex; align-items: center; justify-content: center; gap: 8px; height: 34px; padding: 0 12px; border: 0; border-radius: 10px; background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text); font-family: var(--read); font-size: 12.5px; font-weight: 500; letter-spacing: 0; text-transform: none; }
|
|
3825
|
+
.agent-pop .crew-go:is(:hover, :focus-visible) { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 12%, transparent); border-color: transparent; outline: 0; }
|
|
3826
|
+
.agent-pop .crew-go-icon { display: inline-grid; color: var(--text-2); transition: color var(--motion-fast) var(--ease-out); }
|
|
3827
|
+
.agent-pop .crew-go-icon svg { display: block; width: var(--ico-sm); height: var(--ico-sm); transition: transform calc(520ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
|
|
3828
|
+
.agent-pop .crew-go:is(:hover, :focus-visible) .crew-go-icon { color: currentColor; }
|
|
3829
|
+
.agent-pop .crew-go:is(:hover, :focus-visible) .crew-go-icon svg { transform: rotate(90deg); }
|
|
3830
|
+
.ports-row b.ports-gear { display: inline-grid; align-self: center; }
|
|
3831
|
+
.ports-row b.ports-gear svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
|
|
3832
|
+
@media (prefers-reduced-motion: reduce) { .agent-pop .crew-go-icon svg { transition: none; } .agent-pop .crew-go:hover .crew-go-icon svg { transform: none; } }
|
|
3780
3833
|
.agent-pop .crew-back { display: inline-grid; place-items: center; width: 22px; height: 22px; margin-right: -2px; border: 0; border-radius: 7px; background: transparent; color: var(--text-3); font-size: 16px; line-height: 1; cursor: pointer; }
|
|
3781
3834
|
.agent-pop .crew-back:hover { color: var(--text); background: var(--line); }
|
|
3782
3835
|
/* The live dot and the crew beside it read as one pair: what the room is connected to. */
|
|
@@ -3901,13 +3954,13 @@ dialog.room-ask.console .room-ask-choice.danger:hover { background: color-mix(in
|
|
|
3901
3954
|
that pulses where it was pressed or an area drawn with a dashed edge, and beside the mark a card
|
|
3902
3955
|
with who should look and what to ask. */
|
|
3903
3956
|
.browser-head .nav.point { display: inline-flex; align-items: center; gap: 6px; width: auto; padding: 0 10px 0 8px; font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; }
|
|
3904
|
-
.browser-head .nav.point svg { width:
|
|
3957
|
+
.browser-head .nav.point svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3905
3958
|
.browser-head .nav.point[aria-pressed="true"] { color: var(--phosphor); border-color: color-mix(in srgb, var(--phosphor) 45%, transparent); background: color-mix(in srgb, var(--phosphor) 12%, transparent); }
|
|
3906
3959
|
@container dock (max-width: 620px) { .browser-head .nav.point > span { display: none; } .browser-head .nav.point { padding: 0 7px; } }
|
|
3907
3960
|
.point-layer { position: absolute; z-index: 3; cursor: crosshair; background: color-mix(in srgb, var(--phosphor) 3%, transparent); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--phosphor) 45%, transparent); }
|
|
3908
3961
|
.point-tools { position: absolute; top: 12px; left: 50%; transform: translateX(-50%); z-index: 2; display: inline-flex; align-items: center; gap: 2px; padding: 3px; border: 1px solid var(--line-2); border-radius: 12px; background: var(--panel); box-shadow: 0 14px 34px -14px rgba(0, 0, 0, .5); cursor: default; animation: point-in calc(220ms * var(--motion-scale)) var(--ease-glide); }
|
|
3909
3962
|
.point-tool { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 11px 0 9px; border: 0; border-radius: 9px; background: transparent; color: var(--text-2); font-family: var(--mono); font-size: 9.5px; letter-spacing: .14em; cursor: pointer; transition: color var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out); }
|
|
3910
|
-
.point-tool svg { width:
|
|
3963
|
+
.point-tool svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3911
3964
|
.point-tool:hover { color: var(--text); background: color-mix(in srgb, var(--text) 6%, transparent); }
|
|
3912
3965
|
.point-tool[aria-pressed="true"] { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
|
|
3913
3966
|
.point-sep { width: 1px; height: 16px; margin: 0 3px; background: var(--line-2); }
|
|
@@ -3942,7 +3995,7 @@ dialog.room-ask.console .room-ask-choice.danger:hover { background: color-mix(in
|
|
|
3942
3995
|
.ask-item:hover, .ask-item:focus-visible { background: color-mix(in srgb, var(--phosphor) 10%, transparent); outline: 0; }
|
|
3943
3996
|
.ask-remembered:empty { display: none; }
|
|
3944
3997
|
.ask-own { display: flex; align-items: center; justify-content: center; gap: 8px; margin-top: 4px; border-radius: 10px; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; text-transform: uppercase; cursor: pointer; }
|
|
3945
|
-
.ask-own svg { width:
|
|
3998
|
+
.ask-own svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
3946
3999
|
@media (prefers-reduced-motion: reduce) { .ask-card { animation: none; } }
|
|
3947
4000
|
|
|
3948
4001
|
/* Taking the picture: only the page, without the toolbox, the layer's tint or the area's frame —
|
|
@@ -3964,7 +4017,7 @@ dialog.room-ask.console .room-ask-choice.danger:hover { background: color-mix(in
|
|
|
3964
4017
|
.system.fail .partial { display: grid; gap: 8px; justify-items: center; margin-top: 10px; padding: 10px 14px; border: 1px dashed color-mix(in srgb, var(--danger) 45%, transparent); border-radius: 12px; color: var(--text-2); }
|
|
3965
4018
|
.system.fail .partial > .label { color: var(--text-2); opacity: 1; }
|
|
3966
4019
|
.system.fail .partial .artifacts { justify-items: center; }
|
|
3967
|
-
.system.fail .partial .files { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; font-family: var(--mono); font-size: 11px; text-align:
|
|
4020
|
+
.system.fail .partial .files { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; font-family: var(--mono); font-size: 11px; text-align: center; }
|
|
3968
4021
|
.system.fail .partial .note { font-family: var(--mono); font-size: 10.5px; color: var(--warn); }
|
|
3969
4022
|
.system.fail .partial .undo { border: 1px solid var(--terror); background: color-mix(in srgb, var(--terror) 12%, transparent); color: var(--terror); font: inherit; font-family: var(--mono); font-size: 10px; letter-spacing: .16em; padding: 7px 12px; border-radius: 8px; cursor: pointer; }
|
|
3970
4023
|
.system.fail .partial .undo:hover { background: color-mix(in srgb, var(--terror) 22%, transparent); }
|
|
@@ -4690,7 +4743,7 @@ dialog.custom-window::backdrop { display: none; }
|
|
|
4690
4743
|
/* ---------- An open question's mark ----------
|
|
4691
4744
|
The «?» is one of the room's own drawings now, in the accent. */
|
|
4692
4745
|
.openq-ask::before { content: none; }
|
|
4693
|
-
.openq-ask .q-mark { position: absolute; left: 9px; top: 50%; transform: translateY(-50%); width:
|
|
4746
|
+
.openq-ask .q-mark { position: absolute; left: 9px; top: 50%; transform: translateY(-50%); width: var(--ico-sm); height: var(--ico-sm); display: block; color: var(--phosphor); }
|
|
4694
4747
|
.openq-ask .q-mark svg { width: 100%; height: 100%; display: block; }
|
|
4695
4748
|
:root[data-scheme="light"] .openq-ask .q-mark { color: color-mix(in srgb, var(--phosphor) 62%, #000000); }
|
|
4696
4749
|
|
|
@@ -5038,10 +5091,10 @@ dialog.custom-window::backdrop { display: none; }
|
|
|
5038
5091
|
steps now: 26px tall with a 15px drawing on a wide bar, the same 34px squircle and 18px drawing
|
|
5039
5092
|
on a narrow one. */
|
|
5040
5093
|
.bar > .tree-button { width: 28px; height: 26px; }
|
|
5041
|
-
.bar > .tree-button svg { width:
|
|
5094
|
+
.bar > .tree-button svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
5042
5095
|
@container bar (max-width: 980px) {
|
|
5043
5096
|
.bar > .tree-button { width: 34px; height: 34px; border-radius: 11px; display: inline-grid; place-items: center; padding: 0; }
|
|
5044
|
-
.bar > .tree-button svg { width:
|
|
5097
|
+
.bar > .tree-button svg { width: var(--ico-md); height: var(--ico-md); }
|
|
5045
5098
|
}
|
|
5046
5099
|
|
|
5047
5100
|
/* ==========================================================================================
|
|
@@ -5121,7 +5174,7 @@ dialog.custom-window::backdrop { display: none; }
|
|
|
5121
5174
|
inset 1px 0 0 rgba(255, 92, 170, .08), inset -1px 0 0 rgba(90, 210, 255, .08),
|
|
5122
5175
|
0 1px 1px rgba(0, 0, 0, .3), 0 6px 14px -6px rgba(0, 0, 0, .55), 0 18px 34px -16px rgba(0, 0, 0, .6);
|
|
5123
5176
|
}
|
|
5124
|
-
:root .shell > .chats-button svg { width:
|
|
5177
|
+
:root .shell > .chats-button svg { width: var(--ico-lg); height: var(--ico-lg); filter: drop-shadow(0 1px 0 rgba(0, 0, 0, .35)); }
|
|
5125
5178
|
:root[data-scheme="light"] .shell > .chats-button {
|
|
5126
5179
|
background-image: linear-gradient(180deg, rgba(255, 255, 255, .9), rgba(255, 255, 255, .35) 60%), var(--sheen);
|
|
5127
5180
|
box-shadow:
|
|
@@ -5274,7 +5327,7 @@ dialog.custom-window::backdrop { display: none; }
|
|
|
5274
5327
|
when it is on, with the time it has left. Its menu says what it does, its switch and how long. */
|
|
5275
5328
|
.picker .pick-label > .copilot-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; height: 26px; padding: 0 9px; border: 0; border-radius: 999px; background: transparent; color: var(--text-2); font: inherit; letter-spacing: .06em; cursor: pointer; transition: background .18s ease, color .18s ease; }
|
|
5276
5329
|
.picker .pick-label > .copilot-chip:is(:hover, :focus-visible) { background: color-mix(in srgb, currentColor 12%, transparent); outline: none; }
|
|
5277
|
-
.copilot-icon { display: inline-flex; width:
|
|
5330
|
+
.copilot-icon { display: inline-flex; width: var(--ico-sm); height: var(--ico-sm); }
|
|
5278
5331
|
.copilot-icon svg { width: 100%; height: 100%; }
|
|
5279
5332
|
.picker .pick-label > .copilot-chip.on { color: var(--madre-green); background: color-mix(in srgb, var(--madre-green) 14%, transparent); }
|
|
5280
5333
|
.picker .pick-label > .copilot-chip .left { font-size: 10px; }
|
|
@@ -5359,7 +5412,11 @@ dialog.custom-window::backdrop { display: none; }
|
|
|
5359
5412
|
/* SIGUE ABIERTO AQUÍ can be put away: a small × beside its heading, quiet until the pointer finds it. */
|
|
5360
5413
|
.openq-head { display: inline-flex; align-items: center; gap: 6px; }
|
|
5361
5414
|
.openq-close { display: inline-grid; place-items: center; width: 20px; height: 20px; padding: 0; border: 0; border-radius: 50%; background: transparent; color: var(--text-3); cursor: pointer; opacity: .75; transition: opacity var(--motion-fast) var(--ease-out), background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out); }
|
|
5362
|
-
.openq-close svg { width:
|
|
5415
|
+
.openq-close svg { width: var(--ico-xs); height: var(--ico-xs); }
|
|
5416
|
+
/* Centred is the label, not the label and its ×: the × hangs at the label's right, out of the
|
|
5417
|
+
count, so «sigue abierto aquí» stands on the same axis as the questions under it and the card above. */
|
|
5418
|
+
.openq-head { position: relative; }
|
|
5419
|
+
.openq-head > .openq-close { position: absolute; top: 50%; left: calc(100% + 6px); translate: 0 -50%; }
|
|
5363
5420
|
.openq-close:hover, .openq-close:focus-visible { opacity: 1; color: var(--text); background: color-mix(in srgb, var(--text) 10%, transparent); }
|
|
5364
5421
|
:root[data-wallpaper] .openq-close { color: var(--text-2); background: color-mix(in srgb, var(--bg) 62%, transparent); }
|
|
5365
5422
|
|
|
@@ -5759,7 +5816,7 @@ dialog.mother { --mono: "JetBrains Mono", ui-monospace, Menlo, Consolas, monospa
|
|
|
5759
5816
|
}
|
|
5760
5817
|
|
|
5761
5818
|
/* A new conversation is a plus, a little larger than the icons beside it. */
|
|
5762
|
-
.chats-new-button svg { width:
|
|
5819
|
+
.chats-new-button svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
5763
5820
|
|
|
5764
5821
|
/* ==========================================================================================
|
|
5765
5822
|
SURFACES THAT STAND OUT FROM THE GROUND, AND BUTTONS LIKE PEBBLES
|
|
@@ -5858,7 +5915,7 @@ dialog.settings-window.entering { animation: window-in calc(440ms * var(--motion
|
|
|
5858
5915
|
dialog.settings-window::backdrop { display: none; }
|
|
5859
5916
|
.settings-head { display: flex; align-items: center; gap: 14px; }
|
|
5860
5917
|
.settings-search { flex: 1; min-width: 0; max-width: 420px; display: flex; align-items: center; gap: 8px; height: 32px; padding: 0 10px; border-radius: 10px; background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text-2); cursor: text; }
|
|
5861
|
-
.settings-search svg { width:
|
|
5918
|
+
.settings-search svg { width: var(--ico-sm); height: var(--ico-sm); flex: none; }
|
|
5862
5919
|
.settings-search input { flex: 1; min-width: 0; border: 0; outline: 0; background: transparent; color: var(--text); font: inherit; font-family: var(--read); font-size: 13.5px; }
|
|
5863
5920
|
.settings-search:focus-within { box-shadow: 0 0 0 2px color-mix(in srgb, var(--phosphor) 45%, transparent); }
|
|
5864
5921
|
.settings-body { position: relative; flex: 1; min-height: 0; display: flex; overflow: hidden; }
|
|
@@ -5877,7 +5934,7 @@ dialog.settings-window::backdrop { display: none; }
|
|
|
5877
5934
|
.settings-card-head b { font-size: 14px; font-weight: 600; }
|
|
5878
5935
|
.settings-card-head .settings-go { margin-left: auto; width: 14px; height: 14px; color: var(--text-2); transform: rotate(-90deg); }
|
|
5879
5936
|
.settings-icon { display: grid; place-items: center; width: 28px; height: 28px; flex: none; border-radius: 8px; background: color-mix(in srgb, var(--cat) 16%, transparent); color: var(--cat); }
|
|
5880
|
-
.settings-icon svg { width:
|
|
5937
|
+
.settings-icon svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
5881
5938
|
.settings-line { margin: 0; font-size: 12.5px; line-height: 1.45; color: var(--text-2); }
|
|
5882
5939
|
.settings-warn { justify-self: start; margin: 2px 0 0; padding: 3px 8px; border-radius: 7px; font-size: 12px; background: color-mix(in srgb, #f2c94c 18%, transparent); color: #f2c94c; }
|
|
5883
5940
|
:root[data-scheme="light"] .settings-warn { color: #7a5c00; }
|
|
@@ -6280,7 +6337,7 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
|
|
|
6280
6337
|
|
|
6281
6338
|
/* The gear in the Finder's and the servers' heads: their settings, one click away. */
|
|
6282
6339
|
.surface-gear { display: inline-grid; place-items: center; width: 28px; height: 28px; flex: none; padding: 0; border: 0; border-radius: 8px; background: transparent; color: var(--text-2); cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out); }
|
|
6283
|
-
.surface-gear svg { width:
|
|
6340
|
+
.surface-gear svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
6284
6341
|
.surface-gear:hover { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
|
|
6285
6342
|
.surface-gear:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 1px; }
|
|
6286
6343
|
|
|
@@ -6345,6 +6402,7 @@ select.sx-input { width: auto; max-width: 100%; padding-right: 8px; cursor: poin
|
|
|
6345
6402
|
.mods-detail .module-card :is(p, ul, li, .summary) { font-family: var(--read); font-size: 13px; font-weight: var(--read-weight, 300); line-height: 1.55; letter-spacing: 0; text-transform: none; color: var(--text); }
|
|
6346
6403
|
.mods-detail .module-card :is(.state, .vendor, .detail, .note, .update, .card-block h5, .ollama-status, .actions .toggle, .confirm .warn, i) { font-family: var(--read); font-size: 12px; letter-spacing: 0; text-transform: lowercase; color: var(--text-2); font-style: normal; }
|
|
6347
6404
|
.mods-detail .module-card :is(.state, .vendor, .detail, .note, .update, .card-block h5, .confirm .warn)::first-letter { text-transform: uppercase; }
|
|
6405
|
+
.mods-detail .module-card .confirm :is(.warn, .note).as-written { text-transform: none; }
|
|
6348
6406
|
.mods-detail .module-card .state.on { color: var(--phosphor); }
|
|
6349
6407
|
.mods-detail .module-card .card-block h5 { display: inline-block; font-size: 12.5px; font-weight: 600; color: var(--text); }
|
|
6350
6408
|
.mods-detail .module-card .version b { font-family: var(--mono); font-size: 12px; color: var(--text); }
|
|
@@ -6824,6 +6882,10 @@ dialog.mods-window { width: 1040px; height: 720px; container: modswin / inline-s
|
|
|
6824
6882
|
.toast .toast-dot { flex: none; width: 8px; height: 8px; border-radius: 50%; background: var(--text-3); }
|
|
6825
6883
|
.toast[data-tone="done"] .toast-dot { background: #34c759; box-shadow: 0 0 0 3px rgba(52, 199, 89, .16); }
|
|
6826
6884
|
.toast[data-tone="look"] .toast-dot { background: #e0a23c; box-shadow: 0 0 0 3px rgba(224, 162, 60, .18); }
|
|
6885
|
+
.toast[data-tone="news"] .toast-dot { background: var(--madre-green); box-shadow: 0 0 0 3px color-mix(in srgb, var(--madre-green) 22%, transparent); }
|
|
6886
|
+
/* The one key a notice may carry (the Market's news): small, the room's green, at its end. */
|
|
6887
|
+
.toast .toast-act { flex: none; margin-left: 4px; padding: 4px 11px; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--madre-green) 16%, transparent); color: var(--madre-green); font: inherit; font-size: 12.5px; font-weight: 650; cursor: pointer; }
|
|
6888
|
+
.toast .toast-act:hover { background: color-mix(in srgb, var(--madre-green) 26%, transparent); }
|
|
6827
6889
|
.toast[data-tone="wrong"] .toast-dot { background: var(--danger); box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 18%, transparent); }
|
|
6828
6890
|
|
|
6829
6891
|
/* The model's mark in the conversation is flat: one solid tint of the agent's colour, no light and
|
|
@@ -6983,7 +7045,7 @@ dialog.room-ask:not(.console) .room-ask-card { justify-items: center; gap: 10px;
|
|
|
6983
7045
|
:root[data-scheme="light"] dialog.room-ask:not(.console) .room-ask-card { box-shadow: 0 1px 2px rgba(20, 30, 25, .08), 0 22px 48px -22px rgba(20, 30, 25, .35); }
|
|
6984
7046
|
dialog.room-ask:not(.console) .room-ask-icon { --tone: var(--phosphor); display: grid; place-items: center; width: 44px; height: 44px; margin-bottom: 2px; border-radius: 13px; background: color-mix(in srgb, var(--tone) 16%, transparent); color: var(--tone); }
|
|
6985
7047
|
dialog.room-ask:not(.console) .room-ask-icon[hidden] { display: none; }
|
|
6986
|
-
dialog.room-ask:not(.console) .room-ask-icon svg { width:
|
|
7048
|
+
dialog.room-ask:not(.console) .room-ask-icon svg { width: var(--ico-lg); height: var(--ico-lg); }
|
|
6987
7049
|
dialog.room-ask[data-kind="danger"] .room-ask-icon { --tone: var(--danger); }
|
|
6988
7050
|
dialog.room-ask[data-kind="key"] .room-ask-icon, dialog.key-ask .room-ask-icon { --tone: var(--mode-3); }
|
|
6989
7051
|
dialog.key-ask.m4 .room-ask-icon { --tone: var(--mode-4); }
|
|
@@ -7198,7 +7260,7 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
|
|
|
7198
7260
|
:root[data-scheme="light"] .job-sheet { box-shadow: 0 1px 2px rgba(20, 30, 25, .08), 0 14px 34px -18px rgba(20, 30, 25, .32); }
|
|
7199
7261
|
.job-sheet[hidden] { display: none; }
|
|
7200
7262
|
.job-icon { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 10px; background: color-mix(in srgb, var(--phosphor) 16%, transparent); color: var(--phosphor); }
|
|
7201
|
-
.job-icon svg { width:
|
|
7263
|
+
.job-icon svg { width: var(--ico-md); height: var(--ico-md); }
|
|
7202
7264
|
.job-sheet.failed .job-icon { background: color-mix(in srgb, var(--danger) 14%, transparent); color: var(--danger); }
|
|
7203
7265
|
.job-words { display: grid; gap: 2px; min-width: 0; }
|
|
7204
7266
|
.job-title { font-size: 13.5px; font-weight: 650; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
@@ -7369,7 +7431,7 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
|
|
|
7369
7431
|
animation-delay: 0ms, var(--jiggle-delay, 0ms);
|
|
7370
7432
|
}
|
|
7371
7433
|
.bar-badge[hidden] { display: none; }
|
|
7372
|
-
.bar-badge svg { display: block; width:
|
|
7434
|
+
.bar-badge svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
|
|
7373
7435
|
.bar-badge:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 2px; }
|
|
7374
7436
|
:root[data-scheme="light"] .bar-badge { --bar-ring: #ffffff; box-shadow: 0 0 0 1.5px var(--bar-ring), 0 1px 2px rgba(20, 30, 20, .18); }
|
|
7375
7437
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -7390,10 +7452,27 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
|
|
|
7390
7452
|
.bar-tile:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 70%, transparent); outline-offset: 0; }
|
|
7391
7453
|
.bar-tile:active { transform: scale(.97); }
|
|
7392
7454
|
.bar-tile-glyph { display: grid; place-items: center; width: 34px; height: 34px; border-radius: 11px; color: var(--phosphor); background: color-mix(in srgb, var(--text) 6%, transparent); box-shadow: var(--key-rest, none); }
|
|
7393
|
-
.bar-tile-glyph svg { display: block; width:
|
|
7455
|
+
.bar-tile-glyph svg { display: block; width: var(--ico-md); height: var(--ico-md); }
|
|
7394
7456
|
.bar-tile-name { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
7395
7457
|
.bar-card-empty { margin: 4px 2px 6px; font-size: 12.5px; color: var(--text-2); }
|
|
7396
7458
|
.bar-card-hint { margin: 10px 2px 0; font-size: 11.5px; color: var(--text-3); }
|
|
7459
|
+
/* «Add to the bar» (2026-10-17): a title and, under it, how the bar is arranged; Done at their right.
|
|
7460
|
+
Below, each key that can still go on is drawn as it will stand on the bar (its face, its drawing in
|
|
7461
|
+
the bar's ink, the bar's 18 px) with a «+» on the corner where the bar's keys wear their «−», and
|
|
7462
|
+
its whole name under it, on two lines if it needs them, never cut. */
|
|
7463
|
+
.bar-card.bar-add { width: min(380px, calc(100vw - 32px)); padding: 16px 16px 14px; }
|
|
7464
|
+
.bar-add .bar-card-head { align-items: flex-start; margin-bottom: 14px; }
|
|
7465
|
+
.bar-card-titles { display: grid; gap: 3px; min-width: 0; }
|
|
7466
|
+
.bar-card-titles h3 { font-size: 14px; }
|
|
7467
|
+
.bar-card-sub { margin: 0; font-size: 12px; line-height: 1.4; color: var(--text-2); }
|
|
7468
|
+
.bar-add .bar-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; padding: 4px 2px 2px; }
|
|
7469
|
+
.bar-add .bar-tile { gap: 8px; padding: 12px 6px 10px; color: var(--text-2); font-size: 12px; line-height: 1.3; }
|
|
7470
|
+
.bar-add .bar-tile-glyph { position: relative; width: 40px; height: 40px; border-radius: 12px; color: var(--text); background: var(--surface, var(--panel)); box-shadow: var(--key-rest, none); transition: color var(--motion-fast) var(--ease-out); }
|
|
7471
|
+
.bar-add .bar-tile:is(:hover, :focus-visible) .bar-tile-glyph { color: var(--phosphor); }
|
|
7472
|
+
.bar-add .bar-tile-name { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; line-clamp: 2; overflow: hidden; white-space: normal; text-align: center; overflow-wrap: anywhere; }
|
|
7473
|
+
.bar-tile-plus { position: absolute; top: -5px; right: -5px; display: grid; place-items: center; width: 16px; height: 16px; border-radius: 50%; background: var(--phosphor); color: var(--phosphor-ink); }
|
|
7474
|
+
.bar-tile-plus svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
|
|
7475
|
+
:root[data-scheme="light"] .bar-add .bar-tile:is(:hover, :focus-visible) .bar-tile-glyph { color: color-mix(in srgb, var(--phosphor) 72%, #000000); }
|
|
7397
7476
|
@media (prefers-reduced-motion: reduce) { .bar-card { animation: none; } .bar-tile:active { transform: none; } }
|
|
7398
7477
|
|
|
7399
7478
|
/* On a narrow screen: keys that do not fit wait behind «more», the brand keeps its place, and
|
|
@@ -7404,9 +7483,12 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
|
|
|
7404
7483
|
.bar-more-card[hidden] { display: none; }
|
|
7405
7484
|
@media (max-width: 720px) {
|
|
7406
7485
|
.bar > .bar-left { min-width: 58px; flex-shrink: 1; }
|
|
7407
|
-
.bar.bar-editing { overflow-x: auto; scrollbar-width: none; }
|
|
7408
|
-
.bar.bar-editing::-webkit-scrollbar { display: none; }
|
|
7409
7486
|
}
|
|
7487
|
+
/* Being arranged, at any width (2026-10-17): every key shows, so a bar with more keys than room
|
|
7488
|
+
scrolls sideways inside its own box instead of spilling under the house's keys, and the key
|
|
7489
|
+
being carried is held between the first and the last (app.js, barDragMove). */
|
|
7490
|
+
.bar.bar-editing { overflow-x: auto; overflow-y: hidden; overscroll-behavior-x: contain; scrollbar-width: none; }
|
|
7491
|
+
.bar.bar-editing::-webkit-scrollbar { display: none; }
|
|
7410
7492
|
|
|
7411
7493
|
/* Badges are a plain disc of the accent: no ring around them, anywhere. */
|
|
7412
7494
|
:is(.bar-count, .modules-count, .mother-count, .remedy-badge, .bar-badge, .chats-count, .badge-count) { box-shadow: none !important; outline: none !important; border: 0 !important; }
|
|
@@ -7450,7 +7532,7 @@ dialog.room-ask:not(.console) .room-ask-code { width: 100%; margin: 2px 0 0; pad
|
|
|
7450
7532
|
.steps-list li { display: grid; grid-template-columns: 22px minmax(0, 1fr) auto; gap: 10px; align-items: start; padding: 8px 6px; border-radius: 12px; }
|
|
7451
7533
|
.steps-list li:not(.done):hover { background: color-mix(in srgb, var(--text) 5%, transparent); }
|
|
7452
7534
|
.steps-tick { display: grid; place-items: center; width: 20px; height: 20px; margin-top: 1px; border-radius: 50%; box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--text) 26%, transparent); color: transparent; transition: background-color var(--motion) var(--ease-out), color var(--motion) var(--ease-out); }
|
|
7453
|
-
.steps-tick svg { display: block; width:
|
|
7535
|
+
.steps-tick svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
|
|
7454
7536
|
.steps-list li.done .steps-tick { background: var(--acc, var(--phosphor)); color: var(--acc-ink, var(--phosphor-ink)); box-shadow: none; }
|
|
7455
7537
|
.steps-words { display: grid; gap: 2px; min-width: 0; }
|
|
7456
7538
|
.steps-words b { font-size: 13.5px; font-weight: 600; line-height: 1.4; }
|
|
@@ -7709,6 +7791,15 @@ html.via-phone[data-wallpaper]:not([data-wallpaper="default"]) { --phone-ground:
|
|
|
7709
7791
|
background: var(--agent-gradient, var(--agent-solid, var(--agent))) !important;
|
|
7710
7792
|
color: #ffffff !important;
|
|
7711
7793
|
}
|
|
7794
|
+
/* Switched off: an agent in the bar that cannot answer (not installed, no adapter, or no session)
|
|
7795
|
+
is a quiet grey disc with its mark, no colour and no ring, until it can (2026-10-17). */
|
|
7796
|
+
#agents.agents .avatar.off {
|
|
7797
|
+
background: color-mix(in srgb, var(--text) 9%, transparent) !important;
|
|
7798
|
+
color: color-mix(in srgb, var(--text) 38%, transparent) !important;
|
|
7799
|
+
border: 0 !important; box-shadow: none !important; filter: grayscale(1);
|
|
7800
|
+
}
|
|
7801
|
+
#agents.agents .avatar.off::before { display: none; }
|
|
7802
|
+
#agents.agents .avatar.off.open { box-shadow: 0 0 0 2px var(--lay-4), 0 0 0 3.5px color-mix(in srgb, var(--text) 30%, transparent) !important; }
|
|
7712
7803
|
/* What was said by a ring keeps its ring: the open agent in the bar, the chosen one in the picker. */
|
|
7713
7804
|
.agents .avatar.open:not(.offline):not(.detected),
|
|
7714
7805
|
.picker .avatar.pick[aria-checked="true"]:not(.offline):not(.detected) { box-shadow: 0 0 0 2px var(--lay-4), 0 0 0 3.5px var(--agent-solid, var(--agent)) !important; }
|
|
@@ -7728,6 +7819,17 @@ html.via-phone[data-wallpaper]:not([data-wallpaper="default"]) { --phone-ground:
|
|
|
7728
7819
|
container-type: normal;
|
|
7729
7820
|
}
|
|
7730
7821
|
.shell > .bar.bar-home[hidden], .via-phone .shell > .bar.bar-home { display: none !important; }
|
|
7822
|
+
/* When the room's bar folds its keys into 34 px squares, the house's fold with them (app.js,
|
|
7823
|
+
roomWidth): one row, one size of key, one size of drawing. */
|
|
7824
|
+
.shell > .bar.bar-home.keys-square { padding-block: 9px; }
|
|
7825
|
+
.shell > .bar.bar-home.keys-square > .tree-button { display: inline-grid; place-items: center; width: 34px; height: 34px; padding: 0; border-radius: 11px; }
|
|
7826
|
+
.shell > .bar.bar-home.keys-square > .tree-button svg { width: var(--ico-md); height: var(--ico-md); }
|
|
7827
|
+
/* The notes to accept, short (app.js, barFit): when nothing else can leave a narrow bar, the tray
|
|
7828
|
+
and its number, and the words in the key's name. */
|
|
7829
|
+
#inbox-pill .inbox-count { display: none; font-variant-numeric: tabular-nums; }
|
|
7830
|
+
.bar.bar-tight > #inbox-pill .handoff-words { display: none; }
|
|
7831
|
+
.bar.bar-tight > #inbox-pill .inbox-count { display: inline; }
|
|
7832
|
+
.bar.bar-tight > #inbox-pill { padding-inline: 10px 12px; }
|
|
7731
7833
|
:root:not(.via-phone) .shell > .bar.with-home {
|
|
7732
7834
|
width: auto; justify-self: stretch;
|
|
7733
7835
|
margin-left: max(20px, calc((100% - 1440px) / 2));
|
|
@@ -7781,7 +7883,7 @@ dialog.room-switch::backdrop {
|
|
|
7781
7883
|
.switch-face { display: grid; place-items: center; width: 100%; height: 100%; }
|
|
7782
7884
|
.switch-icon.is-coordinator svg { width: 58%; height: 58%; display: block; }
|
|
7783
7885
|
.switch-badge { position: absolute; top: -6px; right: -6px; display: none; place-items: center; min-width: 22px; height: 22px; padding: 0 6px; border-radius: 999px; font-family: var(--mono); font-size: 11.5px; font-style: normal; font-weight: 700; line-height: 1; box-shadow: 0 0 0 2.5px var(--bg-2); }
|
|
7784
|
-
.switch-badge svg { width:
|
|
7886
|
+
.switch-badge svg { width: var(--ico-xs); height: var(--ico-xs); }
|
|
7785
7887
|
.switch-tile.is-waiting .switch-badge { display: grid; background: var(--acc, var(--phosphor)); color: var(--acc-ink, var(--phosphor-ink)); }
|
|
7786
7888
|
.switch-tile.is-done .switch-badge { display: grid; padding: 0; background: var(--session-ok); color: var(--phosphor-ink); }
|
|
7787
7889
|
.switch-tile.is-working .switch-badge { display: grid; min-width: 0; width: 22px; padding: 0; background: var(--bg-2); }
|
|
@@ -8296,7 +8398,7 @@ dialog#core .mother-cmd .copy { position: absolute; top: 8px; right: 8px; displa
|
|
|
8296
8398
|
the colour of a stop; it fills a little under the pointer. */
|
|
8297
8399
|
#messages .system.plan > b:first-child { display: flex; align-items: center; justify-content: center; gap: 6px; }
|
|
8298
8400
|
#messages .system.plan .act.stop { width: 22px; height: 22px; display: inline-grid; place-items: center; padding: 0; margin: -3px 0; border: 0; border-radius: 50%; background: color-mix(in srgb, var(--crit) 12%, transparent); color: var(--crit); letter-spacing: 0; cursor: pointer; transition: background-color calc(150ms * var(--motion-scale, 1)) var(--ease-out); }
|
|
8299
|
-
#messages .system.plan .act.stop svg { width:
|
|
8401
|
+
#messages .system.plan .act.stop svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
8300
8402
|
#messages .system.plan .act.stop:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--crit) 24%, transparent); outline: 0; }
|
|
8301
8403
|
#messages .system.plan .act.stop:disabled { opacity: .45; cursor: default; }
|
|
8302
8404
|
|
|
@@ -8478,7 +8580,7 @@ dialog.tour-bonjour::backdrop { background: transparent; }
|
|
|
8478
8580
|
.tour-head-words { display: grid; gap: 4px; }
|
|
8479
8581
|
.tour-head h2 { margin: 0; font-size: 22px; font-weight: 650; letter-spacing: -.015em; }
|
|
8480
8582
|
.tour-close { display: grid; place-items: center; width: 30px; height: 30px; padding: 0; border: 0; border-radius: 50%; color: var(--text-2); background: color-mix(in srgb, var(--text) 7%, transparent); cursor: pointer; }
|
|
8481
|
-
.tour-close svg { width:
|
|
8583
|
+
.tour-close svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
8482
8584
|
.tour-close:hover { color: var(--text); background: color-mix(in srgb, var(--text) 12%, transparent); }
|
|
8483
8585
|
.tour-body { display: grid; grid-template-columns: 210px minmax(0, 1fr); flex: 1 1 auto; min-height: 0; border-top: 1px solid color-mix(in srgb, var(--text) 9%, transparent); }
|
|
8484
8586
|
.tour-window .tour-nav { display: grid; align-content: start; gap: 2px; margin: 0; padding: 10px 8px; list-style: none; overflow-y: auto; border-right: 1px solid color-mix(in srgb, var(--text) 9%, transparent); }
|
|
@@ -8598,7 +8700,7 @@ dialog.tour-bonjour::backdrop { background: transparent; }
|
|
|
8598
8700
|
.tour-pill { display: inline-flex; align-items: center; gap: 2px; height: 28px; padding: 0 3px 0 0; border-radius: 999px; background: color-mix(in srgb, var(--tour-acc) 16%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--tour-acc) 40%, transparent); }
|
|
8599
8701
|
.tour-pill-go { height: 28px; padding: 0 6px 0 12px; border: 0; background: transparent; font: inherit; font-family: var(--read); font-size: 12.5px; font-weight: 600; white-space: nowrap; color: color-mix(in srgb, var(--tour-acc) 70%, var(--text)); cursor: pointer; }
|
|
8600
8702
|
.tour-pill-x { display: grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: 50%; color: var(--text-2); background: transparent; cursor: pointer; }
|
|
8601
|
-
.tour-pill-x svg { width:
|
|
8703
|
+
.tour-pill-x svg { width: var(--ico-xs); height: var(--ico-xs); }
|
|
8602
8704
|
/* A phone's room bar (2026-10-14): only what keeps it whole — the pulse, the live light, DETENER
|
|
8603
8705
|
TODO and «more» on the left; Inicio, the projects and Ajustes on the right. Reload is the page's
|
|
8604
8706
|
own pull, and the tour goes on from Ajustes › Versión. */
|
|
@@ -8639,7 +8741,32 @@ dialog.tour-bonjour::backdrop { background: transparent; }
|
|
|
8639
8741
|
.tour-hint b { font-size: 14px; font-weight: 650; }
|
|
8640
8742
|
.tour-hint p { margin: 0; font-size: 13px; line-height: 1.45; color: var(--text-2); }
|
|
8641
8743
|
.tour-hint .tour-btn { justify-self: end; margin-top: 4px; }
|
|
8642
|
-
|
|
8744
|
+
/* Inside a window (a modal sheet, where a floating card could not be pressed): the same card as the
|
|
8745
|
+
floating hint, set into the window with its margins — not a tinted band glued to its edges
|
|
8746
|
+
(2026-10-17). Eyebrow, title and line on the left; its one key on the right, the hint's small key. */
|
|
8747
|
+
.tour-hint.inline {
|
|
8748
|
+
position: relative; inset: auto; z-index: auto; max-height: none; overflow: visible;
|
|
8749
|
+
margin: 12px 12px 4px; padding: 12px 14px 12px 16px; border-radius: 16px; text-align: left;
|
|
8750
|
+
grid-template-columns: minmax(0, 1fr) auto; column-gap: 16px; row-gap: 3px; align-items: center;
|
|
8751
|
+
background: color-mix(in srgb, var(--bg-2, var(--bg)) 94%, transparent);
|
|
8752
|
+
box-shadow: 0 0 0 1px color-mix(in srgb, var(--tour-acc) 32%, transparent), 0 8px 22px -14px rgba(0, 0, 0, .4);
|
|
8753
|
+
-webkit-backdrop-filter: none; backdrop-filter: none; animation: none;
|
|
8754
|
+
}
|
|
8755
|
+
.tour-hint.inline > :not(.tour-btn) { grid-column: 1; }
|
|
8756
|
+
.tour-hint.inline > .tour-btn { grid-column: 2; grid-row: 1 / span 3; align-self: center; justify-self: end; margin: 0; }
|
|
8757
|
+
:root[data-scheme="light"] .tour-hint.inline { background: #ffffff; box-shadow: 0 0 0 1px color-mix(in srgb, var(--tour-acc) 30%, transparent), 0 8px 22px -16px rgba(20, 30, 20, .3); }
|
|
8758
|
+
@media (max-width: 560px) { .tour-hint.inline { grid-template-columns: minmax(0, 1fr); } .tour-hint.inline > .tour-btn { grid-column: 1; grid-row: auto; margin-top: 6px; } }
|
|
8759
|
+
/* The way to a first-time hint whose place is out of view: a pill at the edge the place went past,
|
|
8760
|
+
with the hint's own title and which way to go. A click takes the page there (tour.js). */
|
|
8761
|
+
.tour-hint-away { --tour-acc: var(--s-acc, var(--acc, var(--phosphor))); position: fixed; inset: auto; left: 50%; translate: -50% 0; margin: 0; z-index: 2147483000; display: inline-flex; align-items: center; gap: 8px; max-width: min(420px, calc(100vw - 32px)); padding: 8px 14px 8px 10px; border: 0; border-radius: 999px; font: inherit; font-family: var(--read); color: var(--text); background: color-mix(in srgb, var(--bg-2, var(--bg)) 94%, transparent); -webkit-backdrop-filter: blur(22px) saturate(1.3); backdrop-filter: blur(22px) saturate(1.3); box-shadow: 0 0 0 1.5px color-mix(in srgb, var(--tour-acc) 70%, transparent), 0 14px 32px -14px rgba(0, 0, 0, .45); cursor: pointer; animation: tour-rise calc(360ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1) both; }
|
|
8762
|
+
.tour-hint-away[data-side="up"] { top: calc(env(safe-area-inset-top, 0px) + 84px); bottom: auto; }
|
|
8763
|
+
.tour-hint-away[data-side="down"] { bottom: calc(env(safe-area-inset-bottom, 0px) + 24px); top: auto; }
|
|
8764
|
+
.tour-hint-away svg { flex: none; width: var(--ico-sm, 15px); height: var(--ico-sm, 15px); color: var(--tour-acc); }
|
|
8765
|
+
.tour-hint-away[data-side="down"] svg { rotate: 180deg; }
|
|
8766
|
+
.tour-hint-away b { font-size: 13px; font-weight: 650; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
|
|
8767
|
+
.tour-hint-away span { font-size: 12.5px; color: var(--text-2); white-space: nowrap; }
|
|
8768
|
+
.tour-hint-away:is(:hover, :focus-visible) { box-shadow: 0 0 0 2px var(--tour-acc), 0 14px 32px -14px rgba(0, 0, 0, .45); outline: none; }
|
|
8769
|
+
.tour-hint-away[hidden], .tour-hint[hidden] { display: none !important; }
|
|
8643
8770
|
|
|
8644
8771
|
@media (max-width: 720px) {
|
|
8645
8772
|
.tour-body { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto minmax(0, 1fr); }
|
|
@@ -8648,7 +8775,7 @@ dialog.tour-bonjour::backdrop { background: transparent; }
|
|
|
8648
8775
|
.tour-nav-name { overflow: visible; }
|
|
8649
8776
|
}
|
|
8650
8777
|
@media (prefers-reduced-motion: reduce) {
|
|
8651
|
-
dialog.tour-bonjour[open], .tour-bonjour-stage > *, .tour-bonjour-done > *, .tour-chapter, .ts-moved-row, .tour-hint, .tour-notice { animation: none; }
|
|
8778
|
+
dialog.tour-bonjour[open], .tour-bonjour-stage > *, .tour-bonjour-done > *, .tour-chapter, .ts-moved-row, .tour-hint, .tour-hint-away, .tour-notice { animation: none; }
|
|
8652
8779
|
.tour-scene *, .tour-scene *::after { animation: none !important; }
|
|
8653
8780
|
.ts-type b:first-child, .ts-arrive { opacity: 1; }
|
|
8654
8781
|
.ts-search em { width: 54%; }
|
|
@@ -9441,3 +9568,653 @@ dialog.tour-bonjour:focus, dialog.tour-bonjour:focus-visible, dialog.whats-new:f
|
|
|
9441
9568
|
contain-intrinsic-size: auto 140px;
|
|
9442
9569
|
overflow-clip-margin: 28px;
|
|
9443
9570
|
}
|
|
9571
|
+
/* ---------- Correcciones de UX de 1.0.2 (2026-10-16) ----------
|
|
9572
|
+
1 · Un /run con punto de restauración se viste como los demás avisos del lienzo: esquinas de
|
|
9573
|
+
14 px y su DESHACER debajo, a la izquierda. Era una cápsula de 999 px que se inflaba en círculo
|
|
9574
|
+
al meter el botón en un segundo renglón. */
|
|
9575
|
+
:root[data-term="pill"] #messages#messages .command-card.terminal.has-undo:not(.open) { border-radius: 14px; }
|
|
9576
|
+
#messages#messages .command-card.terminal.has-undo > :is(.undo, .outcome) { display: block; margin: 0 12px 10px 10px; }
|
|
9577
|
+
#messages#messages .command-card.terminal.has-undo.open > :is(.undo, .outcome) { margin-top: 10px; }
|
|
9578
|
+
/* 3 · La píldora cerrada respeta el carril del agente: su máximo era el 100 % de la columna y,
|
|
9579
|
+
corrida 42 px a la derecha, la columna (overflow-x: hidden) le cortaba el final. */
|
|
9580
|
+
:root[data-term="pill"] #messages#messages .command-card.terminal:not(.open) { max-width: min(760px, calc(100% - var(--agent-lane, 0px))); }
|
|
9581
|
+
/* 4 · El aviso del botón de conversaciones va montado en su esquina, por fuera del squircle, con
|
|
9582
|
+
un anillo del color del fondo que lo separa del vidrio. */
|
|
9583
|
+
.chats-button.working::after, .chats-button.unread::after { top: -3px; right: -3px; width: 10px; height: 10px; box-shadow: 0 0 0 2px var(--bg), 0 0 8px color-mix(in srgb, var(--phosphor) 55%, transparent); }
|
|
9584
|
+
/* 8 · Una línea larga se lee entera antes de presionarla, sin volver la tarjeta una pared: pasada
|
|
9585
|
+
cierta altura, la línea se recorre dentro de su botón. */
|
|
9586
|
+
#messages .run-request .run-line .choice-text { max-height: 15.5em; overflow-y: auto; overscroll-behavior: contain; }
|
|
9587
|
+
/* 2 · Pensando: el anillo que respira alrededor del avatar sale unos píxeles de su caja y la
|
|
9588
|
+
columna lo cortaba en seco por la izquierda (overflow-x: hidden pegado al avatar) y la fila, por
|
|
9589
|
+
su contención de pintado (content-visibility). La columna recorta con margen y la fila viva no se
|
|
9590
|
+
contiene: siempre está en pantalla. */
|
|
9591
|
+
/* Chrome keeps overflow-clip-margin only when both axes clip; with overflow-x alone the ring was
|
|
9592
|
+
still cut flush with the avatar (2026-10-17). Clipping the height too costs nothing: the column
|
|
9593
|
+
pads 36px above and the dock's height below, and nothing in it hangs past that. */
|
|
9594
|
+
#messages .thread-inner { overflow: clip; overflow-clip-margin: 24px; }
|
|
9595
|
+
#messages .thread-inner > .row.thinking { content-visibility: visible; }
|
|
9596
|
+
/* 9 · Desplazarse es del humano. El hilo ya no anima cada asignación de su posición: con el scroll
|
|
9597
|
+
suave, el «volver al final» instantáneo y el animado peleaban en el mismo cuadro y la vista
|
|
9598
|
+
temblaba. Los desplazamientos que sí deben deslizarse lo piden ellos mismos. */
|
|
9599
|
+
#messages.thread { scroll-behavior: auto; }
|
|
9600
|
+
/* Nada dentro del hilo muestrea lo que hay detrás (la regla de arriba sobre backdrop-filter): la
|
|
9601
|
+
fila de avisos plegados se había quedado fuera y, al desplazarse rápido, dejaba su vidrio atrás
|
|
9602
|
+
como una ventana fantasma. Lleva una tinta plana un poco más espesa en su lugar. */
|
|
9603
|
+
#messages .sys-dots { -webkit-backdrop-filter: none; backdrop-filter: none; background: color-mix(in srgb, var(--bg) 80%, transparent); }
|
|
9604
|
+
#messages .sys-dots:hover, #messages .sys-dots:focus-visible { background: color-mix(in srgb, var(--bg) 90%, transparent); }
|
|
9605
|
+
/* 10 · Abajo terminó algo: un botón redondo y ligero sobre la caja, con un punto del color de quien
|
|
9606
|
+
contestó. Lleva al final y se va solo al llegar. */
|
|
9607
|
+
.to-end {
|
|
9608
|
+
position: fixed; z-index: 39; left: var(--composer-center, 50%); bottom: calc(100vh - var(--composer-top, 70vh) + 14px); translate: -50% 0;
|
|
9609
|
+
display: grid; place-items: center; width: 34px; height: 34px; padding: 0; border: 0; border-radius: 50%; cursor: pointer;
|
|
9610
|
+
color: var(--text); background: color-mix(in srgb, var(--surface, var(--panel)) 86%, transparent);
|
|
9611
|
+
-webkit-backdrop-filter: blur(16px) saturate(1.5); backdrop-filter: blur(16px) saturate(1.5);
|
|
9612
|
+
box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 16%, transparent), 0 2px 4px rgba(0, 0, 0, .18), 0 10px 24px -8px rgba(0, 0, 0, .42);
|
|
9613
|
+
transition: bottom calc(220ms * var(--motion-scale)) var(--ease-out, ease), color calc(160ms * var(--motion-scale)) ease;
|
|
9614
|
+
animation: to-end-in calc(260ms * var(--motion-scale)) var(--ease-out, ease) both;
|
|
9615
|
+
}
|
|
9616
|
+
.to-end[hidden] { display: none; }
|
|
9617
|
+
.to-end svg { width: var(--ico-md); height: var(--ico-md); }
|
|
9618
|
+
.to-end:hover { color: var(--phosphor); }
|
|
9619
|
+
.to-end:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 60%, transparent); outline-offset: 2px; }
|
|
9620
|
+
.to-end .to-end-dot { position: absolute; top: 0; right: 0; width: 9px; height: 9px; border-radius: 50%; background: var(--agent, var(--phosphor)); box-shadow: 0 0 0 2px var(--bg); }
|
|
9621
|
+
.to-end.leaving { animation: to-end-out calc(200ms * var(--motion-scale)) ease both; }
|
|
9622
|
+
:root[data-scheme="light"] .to-end { background: color-mix(in srgb, #ffffff 88%, transparent); box-shadow: 0 0 0 .5px rgba(20, 30, 20, .12), 0 2px 4px rgba(20, 30, 20, .08), 0 10px 24px -8px rgba(20, 30, 20, .22); }
|
|
9623
|
+
:root.toasting .to-end { bottom: calc(100vh - var(--composer-top, 70vh) + 32px + var(--toast-h, 38px)); }
|
|
9624
|
+
@keyframes to-end-in { from { opacity: 0; transform: translateY(8px) scale(.85); } }
|
|
9625
|
+
@keyframes to-end-out { to { opacity: 0; transform: translateY(6px) scale(.9); } }
|
|
9626
|
+
/* 7 · Un aviso del sistema nace como el punto de su color y se abre en su píldora; al irse vuelve
|
|
9627
|
+
a cerrarse en el punto. La forma no cambia, solo cómo llega y cómo se va. Lleva una sombra más,
|
|
9628
|
+
amplia y muy suave, que lo despega del lienzo; y mientras está, la conversación que estaba en su
|
|
9629
|
+
final sube lo que mide para que el aviso no tape la última línea. */
|
|
9630
|
+
.toast { --toast-tone: var(--text-3); }
|
|
9631
|
+
.toast[data-tone="done"] { --toast-tone: #34c759; }
|
|
9632
|
+
.toast[data-tone="look"] { --toast-tone: #e0a23c; }
|
|
9633
|
+
.toast[data-tone="wrong"] { --toast-tone: var(--danger); }
|
|
9634
|
+
.toast:not([hidden]) { animation: toast-bloom calc(480ms * var(--motion-scale)) cubic-bezier(.3, .7, .2, 1) both; }
|
|
9635
|
+
.toast:not([hidden])::before { content: ''; position: absolute; inset: 0; border-radius: inherit; background: var(--toast-tone); pointer-events: none; animation: toast-bloom-tint calc(480ms * var(--motion-scale)) ease-out both; }
|
|
9636
|
+
.toast:not([hidden]) > * { animation: toast-words calc(240ms * var(--motion-scale)) ease calc(230ms * var(--motion-scale)) both; }
|
|
9637
|
+
.toast.leaving:not([hidden]) { animation: toast-fold calc(300ms * var(--motion-scale)) cubic-bezier(.5, 0, .6, 1) both; }
|
|
9638
|
+
.toast.leaving:not([hidden])::before { animation: toast-fold-tint calc(300ms * var(--motion-scale)) ease-in both; }
|
|
9639
|
+
.toast.leaving:not([hidden]) > * { animation: toast-words-out calc(120ms * var(--motion-scale)) ease both; }
|
|
9640
|
+
@keyframes toast-bloom {
|
|
9641
|
+
from { clip-path: inset(calc(50% - 5px) calc(50% - 5px) round 999px); transform: translateX(-50%) scale(.92); }
|
|
9642
|
+
32% { clip-path: inset(0 calc(50% - var(--toast-h, 38px) / 2) round 999px); }
|
|
9643
|
+
78%, to { clip-path: inset(0 round 20px); transform: translateX(-50%); }
|
|
9644
|
+
}
|
|
9645
|
+
@keyframes toast-bloom-tint { from, 30% { opacity: 1; } 70%, to { opacity: 0; } }
|
|
9646
|
+
@keyframes toast-words { from { opacity: 0; } }
|
|
9647
|
+
@keyframes toast-fold {
|
|
9648
|
+
from { clip-path: inset(0 round 20px); transform: translateX(-50%); }
|
|
9649
|
+
55% { clip-path: inset(0 calc(50% - var(--toast-h, 38px) / 2) round 999px); opacity: 1; }
|
|
9650
|
+
85% { clip-path: inset(calc(50% - 5px) calc(50% - 5px) round 999px); opacity: 1; }
|
|
9651
|
+
to { clip-path: inset(calc(50% - 5px) calc(50% - 5px) round 999px); transform: translateX(-50%) scale(.92); opacity: 0; }
|
|
9652
|
+
}
|
|
9653
|
+
@keyframes toast-fold-tint { from, 25% { opacity: 0; } 60%, to { opacity: 1; } }
|
|
9654
|
+
@keyframes toast-words-out { to { opacity: 0; } }
|
|
9655
|
+
.toast:not([hidden]) {
|
|
9656
|
+
box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 14%, transparent), inset 0 1px 0 rgb(255 255 255 / .06), 0 2px 4px rgba(0, 0, 0, .24), 0 12px 28px -6px rgba(0, 0, 0, .5), 0 28px 60px -18px rgba(0, 0, 0, .45), 0 0 0 10px color-mix(in srgb, var(--bg) 16%, transparent), 0 24px 70px 6px rgba(0, 0, 0, .16);
|
|
9657
|
+
}
|
|
9658
|
+
:root[data-scheme="light"] .toast:not([hidden]) { box-shadow: 0 0 0 .5px rgba(20, 30, 20, .08), 0 2px 4px rgba(20, 30, 20, .1), 0 12px 28px -6px rgba(20, 30, 20, .22), 0 28px 60px -18px rgba(20, 30, 20, .2), 0 0 0 10px rgb(255 255 255 / .22), 0 24px 70px 6px rgba(20, 30, 20, .08); }
|
|
9659
|
+
#messages .thread-inner { transition: padding-bottom calc(280ms * var(--motion-scale)) var(--ease-out, ease); }
|
|
9660
|
+
:root.toast-room #messages .thread-inner { padding-bottom: calc(var(--dock-h, 0px) + 28px + var(--toast-h, 38px) + 18px); }
|
|
9661
|
+
@media (prefers-reduced-motion: reduce) {
|
|
9662
|
+
.toast:not([hidden]), .toast:not([hidden])::before, .toast:not([hidden]) > *, .toast.leaving:not([hidden]), .toast.leaving:not([hidden])::before { animation-duration: 1ms; }
|
|
9663
|
+
.to-end, .to-end.leaving { animation: none; }
|
|
9664
|
+
}
|
|
9665
|
+
/* 6 · La caja de escribir no se aplasta: el texto conserva un ancho para escribir y la dirección
|
|
9666
|
+
(HUMANO › COPILOTO › AHORRO DE TOKENS ›) se corta con «…» antes que el destinatario, que siempre
|
|
9667
|
+
se ve. La ficha del ahorro de tokens no se parte en renglones. */
|
|
9668
|
+
.field { grid-template-columns: auto minmax(0, max-content) minmax(min(220px, 42%), 1fr) auto auto auto auto; }
|
|
9669
|
+
.field > .crew-label { display: flex; min-width: 0; overflow: hidden; }
|
|
9670
|
+
.crew-label > .crew-path { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9671
|
+
.crew-label > .crew-to { flex: none; white-space: pre; }
|
|
9672
|
+
.ash-toggle { white-space: nowrap; flex: none; }
|
|
9673
|
+
@container composer (max-width: 560px) {
|
|
9674
|
+
.field { grid-template-columns: auto auto minmax(0, 1fr) auto auto auto auto; }
|
|
9675
|
+
}
|
|
9676
|
+
/* 5 · La receta para entrenar tu IA (Mac y Linux) cabe en su hoja: cada paso es una columna que
|
|
9677
|
+
puede angostarse y cada comando se lee completo, partido en renglones, con Copiar siempre a la
|
|
9678
|
+
vista arriba a la derecha. Antes la línea más larga ensanchaba el paso y la hoja la cortaba. */
|
|
9679
|
+
.sx-steps, .sx-steps > li { grid-template-columns: minmax(0, 1fr); min-width: 0; }
|
|
9680
|
+
.sx-steps .sx-command { min-width: 0; align-items: flex-start; }
|
|
9681
|
+
.sx-steps .sx-command code { white-space: pre-wrap; overflow-wrap: anywhere; overflow-x: visible; padding: 5px 0; line-height: 1.55; }
|
|
9682
|
+
.sx-steps .sx-command > :not(code) { flex: none; }
|
|
9683
|
+
/* La caja con muchos renglones se recorre por dentro: la primera línea visible se desvanece bajo
|
|
9684
|
+
su borde en lugar de verse partida a la mitad. */
|
|
9685
|
+
.editor.scrolled { -webkit-mask-image: linear-gradient(to bottom, transparent 0, #000 12px); mask-image: linear-gradient(to bottom, transparent 0, #000 12px); }
|
|
9686
|
+
.sx-steps .sx-command code { background: none; border: 0; border-radius: 0; }
|
|
9687
|
+
/* Un paso de medición al abrir una conversación (app.js, measureRows): cada fila se dibuja una vez
|
|
9688
|
+
para que el navegador recuerde su alto real y el historial no salte al llegar a lo nunca visto. */
|
|
9689
|
+
#messages .thread-inner > .cv-measure { content-visibility: visible; }
|
|
9690
|
+
|
|
9691
|
+
/* 1.0.3 · Your computer: every model size, to run and to train, against this machine. */
|
|
9692
|
+
.sx-more > .sx-table { overflow-x: auto; }
|
|
9693
|
+
.sx-models { width: 100%; border-collapse: collapse; font-size: 12.5px; font-variant-numeric: tabular-nums; }
|
|
9694
|
+
.sx-models th { text-align: left; font-weight: 550; color: var(--text-2); padding: 6px 10px 6px 0; border-bottom: 1px solid color-mix(in srgb, var(--text) 9%, transparent); white-space: nowrap; }
|
|
9695
|
+
.sx-models td { padding: 7px 10px 7px 0; color: var(--text); border-bottom: 1px solid color-mix(in srgb, var(--text) 5%, transparent); white-space: nowrap; }
|
|
9696
|
+
.sx-models tr:last-child td { border-bottom: 0; }
|
|
9697
|
+
.sx-models td.no { color: var(--text-2); }
|
|
9698
|
+
.sx-models tr.pick td:first-child { color: var(--phosphor); font-weight: 600; }
|
|
9699
|
+
|
|
9700
|
+
/* 1.0.3 · Turning MADRE off: the key takes the accent under the pointer, like every key of its bar,
|
|
9701
|
+
and what stays on screen once it is off says so plainly (public/power.js). */
|
|
9702
|
+
.madre-off { position: fixed; inset: 0; z-index: 2147483000; display: grid; place-content: center; justify-items: center; gap: 10px; padding: 24px; text-align: center; background: var(--bg, #050605); color: var(--text); }
|
|
9703
|
+
.madre-off h1 { margin: 6px 0 0; font-size: 22px; font-weight: 600; }
|
|
9704
|
+
.madre-off p { margin: 0; max-width: 420px; color: var(--text-2); font-size: 14px; line-height: 1.5; }
|
|
9705
|
+
.madre-off .madre-off-stuck { color: var(--danger); }
|
|
9706
|
+
.madre-off-mark { width: 44px; height: 44px; display: grid; place-items: center; border-radius: 14px; color: var(--text-2); background: color-mix(in srgb, var(--text) 7%, transparent); }
|
|
9707
|
+
.madre-off-mark svg { width: 24px; height: 24px; }
|
|
9708
|
+
html.madre-is-off body > :not(.madre-off) { visibility: hidden; }
|
|
9709
|
+
|
|
9710
|
+
/* 1.0.3 · Modules and Diagnostics lift less under the pointer: the key's own shadow and a slight
|
|
9711
|
+
one beneath, not the heavier one of the keys that are pressed (2026-10-17). */
|
|
9712
|
+
:root { --key-lift: rgba(0, 0, 0, .34); }
|
|
9713
|
+
:root[data-scheme="light"] { --key-lift: rgba(22, 30, 22, .16); }
|
|
9714
|
+
:root .shell .bar > :is(#modules-button, #mother-button, #code-button):is(:hover, :focus-visible) { box-shadow: var(--key-rest), 0 3px 8px -5px var(--key-lift) !important; }
|
|
9715
|
+
/* CODE under the pointer: its brackets take the accent, as every key's drawing does, and a slash
|
|
9716
|
+
draws itself between them. Open, the whole drawing stays in the accent, slash and all. */
|
|
9717
|
+
#code-button .code-slash { stroke-dasharray: 10; stroke-dashoffset: 10; opacity: 0; transition: stroke-dashoffset calc(240ms * var(--motion-scale, 1)) var(--ease-out), opacity calc(120ms * var(--motion-scale, 1)) var(--ease-out); }
|
|
9718
|
+
#code-button:is(:hover, :focus-visible, [aria-pressed="true"]) .code-slash { stroke-dashoffset: 0; opacity: 1; }
|
|
9719
|
+
:root[data-scheme] .shell .bar > #code-button:is(:hover, :focus-visible, [aria-pressed="true"]) svg { color: var(--phosphor); }
|
|
9720
|
+
:root[data-scheme="light"] .shell .bar > #code-button:is(:hover, :focus-visible, [aria-pressed="true"]) svg { color: color-mix(in srgb, var(--phosphor) 70%, #000000); }
|
|
9721
|
+
@media (prefers-reduced-motion: reduce) { #code-button .code-slash { transition: none; } }
|
|
9722
|
+
|
|
9723
|
+
/* 1.0.3 · The code workspace: the viewer docked beside the conversation (public/app.js, «the code
|
|
9724
|
+
workspace»). Over the room nothing of this shows; docked, the files sit at its side, the open files
|
|
9725
|
+
are tabs, a quiet path says where the caret is, an agent's changes wear the agent's colour, and a
|
|
9726
|
+
page or a document can show what it makes beside its text. The room's own pieces throughout. */
|
|
9727
|
+
dialog.viewer > .code-shell { flex: 1 1 auto; display: flex; min-height: 0; min-width: 0; }
|
|
9728
|
+
dialog.viewer > .code-shell > .viewer-body { flex: 1 1 auto; height: auto; min-height: 0; min-width: 0; }
|
|
9729
|
+
.code-files { flex: none; width: 216px; display: flex; flex-direction: column; min-height: 0; border-right: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2%, transparent); }
|
|
9730
|
+
.code-files[hidden] { display: none; }
|
|
9731
|
+
.code-files-head { display: flex; align-items: center; gap: 6px; padding: 10px 10px 6px 14px; font-family: var(--read); font-size: 12px; font-weight: 600; color: var(--text-2); }
|
|
9732
|
+
.code-files-fold { margin-left: auto; width: 24px; height: 24px; display: grid; place-items: center; border: 0; border-radius: 7px; background: transparent; color: var(--text-3); cursor: pointer; }
|
|
9733
|
+
.code-files-fold:hover { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); }
|
|
9734
|
+
.code-files-fold svg { width: var(--ico-sm); height: var(--ico-sm); }
|
|
9735
|
+
.code-files-search { margin: 0 10px 8px; height: 30px; padding: 0 10px; border: 0; border-radius: 9px; background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text); font: inherit; font-family: var(--read); font-size: 12.5px; outline: none; }
|
|
9736
|
+
.code-files-search:focus { box-shadow: 0 0 0 2px color-mix(in srgb, var(--phosphor) 35%, transparent); }
|
|
9737
|
+
.code-files > .code-files-list { flex: 1 1 auto; min-height: 0; overflow: auto; overscroll-behavior: contain; padding: 0 6px 12px; }
|
|
9738
|
+
.code-files-list { list-style: none; margin: 0; padding: 0; }
|
|
9739
|
+
.code-file { width: 100%; display: flex; align-items: center; gap: 6px; min-height: 26px; padding: 3px 8px 3px calc(8px + var(--depth, 0) * 12px); border: 0; border-radius: 7px; background: transparent; color: var(--text); font-family: var(--mono); font-size: 12px; text-align: left; cursor: pointer; }
|
|
9740
|
+
.code-file:hover { background: color-mix(in srgb, var(--text) 6%, transparent); }
|
|
9741
|
+
.code-file.on { background: color-mix(in srgb, var(--phosphor) 13%, transparent); color: var(--phosphor); }
|
|
9742
|
+
.code-file-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
9743
|
+
.code-file-dir { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); font-size: 10.5px; direction: rtl; text-align: left; }
|
|
9744
|
+
.code-folder { color: var(--text-2); }
|
|
9745
|
+
.code-folder-caret { flex: none; display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); color: var(--text-3); }
|
|
9746
|
+
.code-folder-caret svg { display: block; width: var(--ico-xs); height: var(--ico-xs); rotate: -90deg; transition: rotate var(--motion-fast) var(--ease-out); }
|
|
9747
|
+
.code-folder[aria-expanded="true"] .code-folder-caret svg { rotate: 0deg; }
|
|
9748
|
+
@media (prefers-reduced-motion: reduce) { .code-folder-caret svg { transition: none; } }
|
|
9749
|
+
.code-file-agent { flex: none; width: 7px; height: 7px; margin-left: auto; border-radius: 50%; background: var(--agent, var(--text-3)); }
|
|
9750
|
+
.code-files-empty { padding: 8px 12px; color: var(--text-3); font-family: var(--read); font-size: 12px; }
|
|
9751
|
+
|
|
9752
|
+
.code-tabs { flex: none; display: flex; align-items: flex-end; gap: 2px; padding: 6px 10px 0; overflow-x: auto; scrollbar-width: none; border-bottom: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2.5%, transparent); }
|
|
9753
|
+
.code-tabs::-webkit-scrollbar { display: none; }
|
|
9754
|
+
.code-tabs[hidden] { display: none; }
|
|
9755
|
+
.code-tab { flex: none; display: inline-flex; align-items: center; gap: 6px; height: 32px; padding: 0 6px 0 4px; border-radius: 9px 9px 0 0; color: var(--text-2); }
|
|
9756
|
+
.code-tab.on { background: var(--panel); color: var(--text); box-shadow: 0 -1px 0 var(--line), 1px 0 0 var(--line), -1px 0 0 var(--line); }
|
|
9757
|
+
.code-tab-name { height: 28px; padding: 0 6px; border: 0; background: transparent; color: inherit; font-family: var(--mono); font-size: 11.5px; cursor: pointer; }
|
|
9758
|
+
.code-tab.on .code-tab-name { font-weight: 600; cursor: default; }
|
|
9759
|
+
.code-tab-dirty { width: 7px; height: 7px; border-radius: 50%; background: var(--text-2); }
|
|
9760
|
+
.code-tab-agent { width: 7px; height: 7px; border-radius: 50%; background: var(--agent); }
|
|
9761
|
+
.code-tab-close { width: 20px; height: 20px; display: grid; place-items: center; border: 0; border-radius: 6px; background: transparent; color: var(--text-3); cursor: pointer; opacity: 0; transition: opacity var(--motion-fast) var(--ease-out); }
|
|
9762
|
+
.code-tab:hover .code-tab-close, .code-tab.on .code-tab-close, .code-tab-close:focus-visible { opacity: 1; }
|
|
9763
|
+
.code-tab-close:hover { color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
|
|
9764
|
+
.code-tab-close svg { width: var(--ico-xs); height: var(--ico-xs); }
|
|
9765
|
+
|
|
9766
|
+
.code-crumbs { flex: none; display: flex; align-items: center; gap: 12px; min-height: 30px; padding: 4px 16px; border-bottom: 1px solid var(--line); font-family: var(--mono); font-size: 11px; color: var(--text-3); }
|
|
9767
|
+
.code-crumbs[hidden] { display: none; }
|
|
9768
|
+
.code-crumbs-path { display: flex; align-items: center; gap: 6px; min-width: 0; overflow: hidden; white-space: nowrap; }
|
|
9769
|
+
.code-crumbs-path i { font-style: normal; opacity: .6; }
|
|
9770
|
+
.code-crumbs-path b { color: var(--text-2); font-weight: 600; }
|
|
9771
|
+
.code-crumbs-path .code-crumbs-symbol { color: var(--text); }
|
|
9772
|
+
.code-crumbs-changes { margin-left: auto; flex: none; display: inline-flex; align-items: center; gap: 6px; color: var(--agent); }
|
|
9773
|
+
.code-crumbs-changes .code-file-agent { margin: 0; }
|
|
9774
|
+
.code-crumbs-step { display: inline-grid; place-items: center; width: 22px; height: 22px; padding: 0; border: 0; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--text) 6%, transparent); color: var(--text-2); cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out), color var(--motion-fast) var(--ease-out); }
|
|
9775
|
+
.code-crumbs-step:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--text) 11%, transparent); color: var(--text); outline: 0; }
|
|
9776
|
+
.code-crumbs-step svg { display: block; width: var(--ico-xs); height: var(--ico-xs); }
|
|
9777
|
+
.code-crumbs-step.back svg { rotate: 90deg; }
|
|
9778
|
+
.code-crumbs-step.on svg { rotate: -90deg; }
|
|
9779
|
+
|
|
9780
|
+
/* An agent's change, in its colour: a band at the line numbers, a light ground on the lines, and a
|
|
9781
|
+
card under them with what was there before and the three answers. */
|
|
9782
|
+
.viewer-body pre.code .ln.ag { color: var(--ag); box-shadow: inset 3px 0 0 var(--ag); }
|
|
9783
|
+
.viewer-body pre.code .tx.ag { background: color-mix(in srgb, var(--ag) 9%, transparent); }
|
|
9784
|
+
/* An agent's change, under its lines: a card of the windows' own material (Settings' cards), who
|
|
9785
|
+
changed them as the agent's tag (no edge in its colour: on a round card it read as an eyebrow), what
|
|
9786
|
+
was there before as lines with their «−» (never crossed out: it has to be read), and three tags of a
|
|
9787
|
+
flat tone, each with its drawing at the size of a drawing beside a word. */
|
|
9788
|
+
.code-change { grid-column: 1 / -1; display: grid; gap: 8px; margin: 6px 16px 12px 52px; padding: 10px 12px; border-radius: 12px; background: var(--surface, var(--panel)); box-shadow: var(--bevel, none), var(--float-sm, 0 6px 16px -10px rgba(0, 0, 0, .4)); white-space: normal; font-family: var(--read); }
|
|
9789
|
+
.code-change-head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; font-size: 12.5px; line-height: 1.4; color: var(--text-2); }
|
|
9790
|
+
.code-change-who { padding: 1px 7px; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--agent) 14%, transparent); color: var(--agent); font-family: var(--mono); font-size: 11px; font-weight: 600; letter-spacing: .02em; }
|
|
9791
|
+
.code-change-was { display: grid; margin: 0; padding: 6px 0; max-height: 12em; overflow: auto; border-radius: 8px; background: color-mix(in srgb, var(--danger) 6%, transparent); color: var(--text-2); font-family: var(--mono); font-size: 12px; line-height: 1.6; white-space: pre; }
|
|
9792
|
+
.code-change-was > span { padding: 0 10px 0 26px; position: relative; }
|
|
9793
|
+
.code-change-was > span::before { content: '−'; position: absolute; left: 10px; color: color-mix(in srgb, var(--danger) 80%, var(--text-2)); }
|
|
9794
|
+
.code-change-acts { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
9795
|
+
.code-change-act { --tone: var(--text); display: inline-flex; align-items: center; gap: 6px; height: 28px; padding: 0 11px 0 9px; border: 0; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--tone) 12%, transparent); color: var(--tone); font-family: var(--read); font-size: 12.5px; font-weight: 550; white-space: nowrap; cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out); }
|
|
9796
|
+
.code-change-act:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--tone) 20%, transparent); outline: 0; }
|
|
9797
|
+
.code-change-act:disabled { opacity: .5; cursor: default; }
|
|
9798
|
+
.code-change-act.keep { --tone: var(--phosphor); }
|
|
9799
|
+
.code-change-act.undo { --tone: var(--text); background: color-mix(in srgb, var(--text) 7%, transparent); }
|
|
9800
|
+
.code-change-act.undo:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--text) 12%, transparent); }
|
|
9801
|
+
.code-change-act.why { --tone: var(--agent); }
|
|
9802
|
+
.code-change-ico { display: inline-grid; place-items: center; flex: none; }
|
|
9803
|
+
.code-change-ico svg { display: block; width: var(--ico-sm); height: var(--ico-sm); }
|
|
9804
|
+
:root[data-scheme="light"] .code-change-act.keep { color: color-mix(in srgb, var(--phosphor) 72%, #000000); }
|
|
9805
|
+
.code-editor .ed-gutter-inner > .mk { color: var(--mk); box-shadow: inset 3px 0 0 var(--mk); background: color-mix(in srgb, var(--mk) 10%, transparent); }
|
|
9806
|
+
|
|
9807
|
+
/* Side by side: the text and what it makes. */
|
|
9808
|
+
.viewer-body.with-beside { display: grid !important; grid-template-columns: minmax(0, 1fr) minmax(280px, 46%); padding: 0; overflow: hidden; }
|
|
9809
|
+
.viewer-body.with-beside > :first-child { min-height: 0; height: 100%; overflow: auto; }
|
|
9810
|
+
.code-beside { display: flex; flex-direction: column; min-height: 0; border-left: 1px solid var(--line); background: color-mix(in srgb, var(--text) 2%, transparent); }
|
|
9811
|
+
.code-beside-head { flex: none; display: flex; align-items: center; gap: 8px; padding: 8px 14px; border-bottom: 1px solid var(--line); font-family: var(--read); font-size: 12px; color: var(--text-2); }
|
|
9812
|
+
.code-beside-head b { color: var(--text); font-weight: 600; }
|
|
9813
|
+
.code-beside-live { margin-left: auto; font-family: var(--mono); font-size: 10px; color: var(--phosphor); }
|
|
9814
|
+
.code-beside > iframe.ripley { flex: 1 1 auto; width: 100%; height: auto; min-height: 0; border-radius: 0; box-shadow: none; }
|
|
9815
|
+
.code-beside > .viewer-markdown { flex: 1 1 auto; min-height: 0; overflow: auto; width: auto; padding: 14px 18px 24px; font-size: 14.5px; }
|
|
9816
|
+
.code-beside-off { display: grid; gap: 12px; justify-items: start; padding: 18px; font-family: var(--read); font-size: 13px; line-height: 1.5; color: var(--text-2); }
|
|
9817
|
+
.code-beside-off p { margin: 0; }
|
|
9818
|
+
dialog.viewer .viewer-beside[aria-pressed="true"] { color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 14%, transparent); }
|
|
9819
|
+
|
|
9820
|
+
/* Nothing open yet. */
|
|
9821
|
+
.code-home { width: min(460px, 100%); display: grid; gap: 10px; justify-items: start; margin: 8vh auto 0; font-family: var(--read); }
|
|
9822
|
+
.code-home h3 { margin: 0; font-size: 18px; font-weight: 600; color: var(--text); }
|
|
9823
|
+
.code-home h4 { margin: 14px 0 0; font-size: 12px; font-weight: 600; color: var(--text-2); }
|
|
9824
|
+
.code-home p { margin: 0; font-size: 13.5px; line-height: 1.55; color: var(--text-2); }
|
|
9825
|
+
.code-home-list { list-style: none; margin: 0; padding: 0; width: 100%; display: grid; gap: 2px; }
|
|
9826
|
+
.code-home-list .code-file { gap: 8px; }
|
|
9827
|
+
.code-home-list .code-file small { margin-left: auto; flex: none; color: var(--text-3); font-size: 10.5px; }
|
|
9828
|
+
.code-home-list .code-file .code-file-agent { margin: 0; }
|
|
9829
|
+
|
|
9830
|
+
/* ⌘P */
|
|
9831
|
+
.quick-open { position: fixed; z-index: 90; inset: 14vh auto auto 50%; transform: translateX(-50%); width: min(560px, calc(100vw - 32px)); margin: 0; padding: 0; border: 1px solid var(--line-2); border-radius: 14px; background: var(--panel); color: var(--text); box-shadow: 0 24px 60px -24px rgba(0, 0, 0, .55); overflow: hidden; }
|
|
9832
|
+
.quick-open[hidden] { display: none; }
|
|
9833
|
+
.quick-open-input { width: 100%; height: 48px; padding: 0 16px; border: 0; border-bottom: 1px solid var(--line); background: transparent; color: var(--text); font: inherit; font-family: var(--read); font-size: 15px; outline: none; }
|
|
9834
|
+
.quick-open-list { list-style: none; margin: 0; padding: 6px; max-height: min(52vh, 420px); overflow: auto; }
|
|
9835
|
+
.quick-open-item { display: flex; align-items: baseline; gap: 10px; padding: 8px 10px; border-radius: 9px; cursor: pointer; }
|
|
9836
|
+
.quick-open-item b { font-family: var(--mono); font-size: 12.5px; font-weight: 600; }
|
|
9837
|
+
.quick-open-item span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--text-3); font-family: var(--mono); font-size: 11px; }
|
|
9838
|
+
.quick-open-item .code-file-agent { align-self: center; }
|
|
9839
|
+
.quick-open-item.on, .quick-open-item:hover { background: color-mix(in srgb, var(--phosphor) 12%, transparent); }
|
|
9840
|
+
.quick-open-empty { padding: 12px; color: var(--text-3); font-family: var(--read); font-size: 13px; }
|
|
9841
|
+
|
|
9842
|
+
/* The verbs of the ask card: a row of flat-tone chips above the suggestions. */
|
|
9843
|
+
.ask-actions { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 2px; }
|
|
9844
|
+
.ask-action { height: 28px; padding: 0 11px; border: 0; border-radius: var(--chip-r, 7px); background: color-mix(in srgb, var(--phosphor) 14%, var(--chip-ground, transparent)); color: var(--phosphor); font-family: var(--read); font-size: 12.5px; font-weight: 600; cursor: pointer; }
|
|
9845
|
+
.ask-action:hover, .ask-action:focus-visible { background: color-mix(in srgb, var(--phosphor) 24%, var(--chip-ground, transparent)); outline: 0; }
|
|
9846
|
+
@media (prefers-reduced-motion: reduce) { .code-tab-close { transition: none; } }
|
|
9847
|
+
.viewer-body.with-beside > :not(.code-beside) { grid-column: 1; grid-row: 1; }
|
|
9848
|
+
.viewer-body.with-beside > .code-beside { grid-column: 2; grid-row: 1; }
|
|
9849
|
+
.code-crumbs .code-files-show { margin: 0 -4px 0 -8px; }
|
|
9850
|
+
.viewer-body.with-beside { grid-template-rows: minmax(0, 1fr); }
|
|
9851
|
+
.viewer-body.with-beside > pre.code { align-content: start; }
|
|
9852
|
+
.viewer-body.with-beside { place-items: stretch; }
|
|
9853
|
+
/* Narrow, what the code makes goes under it. */
|
|
9854
|
+
.viewer-body.with-beside.stacked { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); }
|
|
9855
|
+
.viewer-body.with-beside.stacked > .code-beside { grid-column: 1; grid-row: 2; border-left: 0; border-top: 1px solid var(--line); }
|
|
9856
|
+
/* The header of the code workspace: the tabs and the path under it already name the file, so the
|
|
9857
|
+
header keeps only its tools; too narrow for their words, they keep their drawings, and past that
|
|
9858
|
+
it takes two lines instead of going out of the window: the window's keys always on the top one,
|
|
9859
|
+
the tools under them (wrap-reverse sends what does not fit, the last keys, upwards; narrower
|
|
9860
|
+
still, the spacer fills the top line beside the window's keys so every tool goes below). */
|
|
9861
|
+
dialog.viewer.code:has(> .code-crumbs:not([hidden])) > .viewer-head > :is(#viewer-path, #viewer-lang) { display: none; }
|
|
9862
|
+
dialog.viewer.code > .viewer-head { flex-wrap: wrap-reverse; row-gap: 6px; justify-content: flex-end; }
|
|
9863
|
+
@container viewerhead (max-width: 420px) {
|
|
9864
|
+
dialog.viewer.code > .viewer-head > .viewer-spacer { order: 1; flex: 1 1 calc(100% - 140px); }
|
|
9865
|
+
dialog.viewer.code > .viewer-head > .surface-modes { order: 2; }
|
|
9866
|
+
}
|
|
9867
|
+
.viewer-beside { display: inline-flex; align-items: center; justify-content: center; }
|
|
9868
|
+
.viewer-beside > svg { display: none; width: var(--ico-sm); height: var(--ico-sm); }
|
|
9869
|
+
@container viewerhead (max-width: 620px) {
|
|
9870
|
+
.viewer-head > .viewer-beside { padding: 4px 7px; }
|
|
9871
|
+
.viewer-head > .viewer-beside > svg { display: block; }
|
|
9872
|
+
.viewer-head > .viewer-beside > span { display: none; }
|
|
9873
|
+
dialog.viewer .viewer-head .viewer-seg .viewer-open { font-size: 0; padding: 0 9px; letter-spacing: 0; }
|
|
9874
|
+
dialog.viewer .viewer-head .viewer-seg .viewer-open .tail-mark { margin-left: 0; }
|
|
9875
|
+
dialog.viewer .viewer-head .viewer-seg-btn { padding: 0 9px; }
|
|
9876
|
+
.viewer-head > .viewer-mode { padding: 5px 8px; letter-spacing: .08em; }
|
|
9877
|
+
.viewer-head > .surface-modes { margin-left: 0; }
|
|
9878
|
+
}
|
|
9879
|
+
|
|
9880
|
+
/* ==========================================================================================
|
|
9881
|
+
1.0.3 · SIGNS DRAWN, THE AGENT ASKED, THE CORE'S SCROLL (2026-10-17)
|
|
9882
|
+
------------------------------------------------------------------------------------------
|
|
9883
|
+
↗ and ▾ at the end of a key's words and ◉ at the start of a label are drawn (app.js, tailMark
|
|
9884
|
+
and leadWords), at the size of a mark; the folders' and the folds' carets are the chooser's
|
|
9885
|
+
chevron, turned by their state. Asking about code, the agent chosen is lit and the rest are
|
|
9886
|
+
quietly off. And the core scrolls at its window's edge, never over its cards.
|
|
9887
|
+
========================================================================================== */
|
|
9888
|
+
.tail-mark { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); margin-left: 3px; vertical-align: -2px; flex: none; }
|
|
9889
|
+
.tail-mark svg { display: block; width: 100%; height: 100%; }
|
|
9890
|
+
.lead-mark { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); margin-right: 6px; vertical-align: -2px; flex: none; }
|
|
9891
|
+
.lead-mark svg { display: block; width: 100%; height: 100%; }
|
|
9892
|
+
.tree-body .node .caret { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); font-size: 0; }
|
|
9893
|
+
.tree-body .node .caret svg { display: block; width: var(--ico-xs); height: var(--ico-xs); rotate: -90deg; transition: rotate var(--motion-fast) var(--ease-out); }
|
|
9894
|
+
.tree-body li[aria-expanded="true"] > .node .caret svg { rotate: 0deg; }
|
|
9895
|
+
.card-fold > summary .caret { display: inline-flex; align-items: center; gap: 4px; }
|
|
9896
|
+
.card-fold > summary .caret-mark { display: inline-grid; place-items: center; width: var(--ico-xs); height: var(--ico-xs); }
|
|
9897
|
+
.card-fold > summary .caret-mark svg { display: block; width: 100%; height: 100%; rotate: -90deg; transition: rotate var(--motion-fast) var(--ease-out); }
|
|
9898
|
+
.card-fold[open] > summary .caret-mark svg { rotate: 0deg; }
|
|
9899
|
+
@media (prefers-reduced-motion: reduce) { .tree-body .node .caret svg, .card-fold > summary .caret-mark svg { transition: none; } }
|
|
9900
|
+
|
|
9901
|
+
.ask-card .ask-crew .ask-agent { transition: opacity var(--motion-fast) var(--ease-out), filter var(--motion-fast) var(--ease-out), box-shadow var(--motion-fast) var(--ease-out), transform var(--motion-fast) var(--ease-out); }
|
|
9902
|
+
.ask-card .ask-crew .ask-agent[aria-checked="false"] { opacity: .4; filter: grayscale(.9); box-shadow: none !important; }
|
|
9903
|
+
.ask-card .ask-crew .ask-agent[aria-checked="false"]:is(:hover, :focus-visible) { opacity: .75; filter: grayscale(.35); }
|
|
9904
|
+
.ask-card .ask-crew .ask-agent[aria-checked="true"] { opacity: 1; filter: none; box-shadow: 0 0 0 2px var(--surface, var(--panel)), 0 0 0 3.5px var(--agent), 0 0 14px -2px color-mix(in srgb, var(--agent) 55%, transparent) !important; }
|
|
9905
|
+
@media (prefers-reduced-motion: reduce) { .ask-card .ask-crew .ask-agent { transition: none; } }
|
|
9906
|
+
|
|
9907
|
+
dialog#core { --core-pad: 22px; }
|
|
9908
|
+
dialog#core .core-body { padding-inline: var(--core-pad); }
|
|
9909
|
+
dialog#core .core-panes { margin-inline: calc(-1 * var(--core-pad)); padding-inline: calc(var(--core-pad) + 2px); scrollbar-gutter: stable; }
|
|
9910
|
+
@media (max-width: 720px) { dialog#core { --core-pad: 14px; } }
|
|
9911
|
+
|
|
9912
|
+
/* ==========================================================================================
|
|
9913
|
+
YOUR OWN PICTURE (1.0.3) · --wp-custom
|
|
9914
|
+
------------------------------------------------------------------------------------------
|
|
9915
|
+
The same layers as the wallpapers that ship — a veil, or a mesh of the picture's own colours,
|
|
9916
|
+
its tint for the room's material, its blur — with the colours the page took from the picture
|
|
9917
|
+
(public/wallpaper.js, paintCustomWall: --wpc-* on the root, as "r g b") and the point of it that
|
|
9918
|
+
stays in view (--wpc-pos). Until they arrive, a plain ground of the theme.
|
|
9919
|
+
========================================================================================== */
|
|
9920
|
+
:root, .look-preview[data-scheme="dark"] {
|
|
9921
|
+
--wp-custom: linear-gradient(rgb(var(--wpc-veil-d, 12 12 12) / min(.96, calc(.68 * var(--veil-k, 1)))), rgb(var(--wpc-veil-d, 12 12 12) / min(.97, calc(.78 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-d, 12 12 12));
|
|
9922
|
+
}
|
|
9923
|
+
:root[data-scheme="light"], .look-preview[data-scheme="light"] {
|
|
9924
|
+
--wp-custom: linear-gradient(rgb(var(--wpc-veil-l, 246 246 246) / min(.96, calc(.52 * var(--veil-k, 1)))), rgb(var(--wpc-veil-l, 246 246 246) / min(.97, calc(.64 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-l, 241 241 241));
|
|
9925
|
+
}
|
|
9926
|
+
:is(:root:not([data-scheme="light"]), .look-preview[data-scheme="dark"])[data-wp-style="mesh"] {
|
|
9927
|
+
--wp-custom: radial-gradient(75% 65% at 12% 8%, rgb(var(--wpc-m1-d, 32 32 32) / min(.95, calc(.9 * var(--veil-k, 1)))), transparent 72%), radial-gradient(65% 75% at 92% 28%, rgb(var(--wpc-m2-d, 44 44 44) / min(.95, calc(.9 * var(--veil-k, 1)))), transparent 72%), radial-gradient(85% 65% at 42% 102%, rgb(var(--wpc-m3-d, 18 18 18) / min(.95, calc(.9 * var(--veil-k, 1)))), transparent 74%), linear-gradient(rgb(var(--wpc-veil-d, 12 12 12) / min(.9, calc(.56 * var(--veil-k, 1)))), rgb(var(--wpc-veil-d, 12 12 12) / min(.9, calc(.56 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-d, 12 12 12));
|
|
9928
|
+
}
|
|
9929
|
+
:is(:root[data-scheme="light"], .look-preview[data-scheme="light"])[data-wp-style="mesh"] {
|
|
9930
|
+
--wp-custom: radial-gradient(75% 65% at 12% 8%, rgb(var(--wpc-m1-l, 240 240 240) / min(.95, calc(.78 * var(--veil-k, 1)))), transparent 72%), radial-gradient(65% 75% at 92% 28%, rgb(var(--wpc-m2-l, 246 246 246) / min(.95, calc(.78 * var(--veil-k, 1)))), transparent 72%), radial-gradient(85% 65% at 42% 102%, rgb(var(--wpc-m3-l, 236 236 236) / min(.95, calc(.78 * var(--veil-k, 1)))), transparent 74%), linear-gradient(rgb(var(--wpc-veil-l, 246 246 246) / min(.9, calc(.42 * var(--veil-k, 1)))), rgb(var(--wpc-veil-l, 246 246 246) / min(.9, calc(.42 * var(--veil-k, 1))))), var(--wpc-url, none) var(--wpc-pos, 50% 50%) / cover no-repeat, rgb(var(--wpc-veil-l, 241 241 241));
|
|
9931
|
+
}
|
|
9932
|
+
:root[data-wallpaper="custom"] .shell::before { background: var(--wp-custom); }
|
|
9933
|
+
.look-preview[data-wallpaper="custom"], .paper[data-wp="custom"]:not(.paper-add) .paper-swatch { background: var(--wp-custom); }
|
|
9934
|
+
.look-preview[data-wallpaper="custom"]::before { background: var(--wp-custom); }
|
|
9935
|
+
:is(:root, .look-preview)[data-wallpaper="custom"] { --tint: rgb(var(--wpc-tint-d, 27 27 27)); }
|
|
9936
|
+
:is(:root, .look-preview)[data-scheme="light"][data-wallpaper="custom"] { --tint: rgb(var(--wpc-tint-l, 245 245 245)); }
|
|
9937
|
+
:is(:root[data-wallpaper="custom"], .look-preview[data-wallpaper="custom"]) { --wp-blur-on: var(--wp-blur, 0px); }
|
|
9938
|
+
:root[data-wallpaper="custom"] .shell::before { inset: calc(-2 * var(--wp-blur-on, 0px)); filter: blur(var(--wp-blur-on, 0px)); }
|
|
9939
|
+
.look-preview[data-wallpaper="custom"] { background: none !important; position: relative; isolation: isolate; overflow: hidden; }
|
|
9940
|
+
.look-preview[data-wallpaper="custom"]::before { content: ""; position: absolute; inset: calc(-2 * var(--wp-blur-on, 0px)); z-index: -1; filter: blur(var(--wp-blur-on, 0px)); pointer-events: none; }
|
|
9941
|
+
|
|
9942
|
+
/* Its tile: the picture once it is here; before, a «+» on the ground, the way to add it. Busy while
|
|
9943
|
+
the page prepares and keeps it. */
|
|
9944
|
+
.paper.paper-add .paper-swatch { display: grid; place-items: center; background: color-mix(in srgb, var(--text) 5%, transparent); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--text) 16%, transparent); color: var(--text-2); }
|
|
9945
|
+
.paper.paper-add .paper-swatch svg { width: var(--ico-md); height: var(--ico-md); }
|
|
9946
|
+
.paper.paper-add:is(:hover, :focus-visible) .paper-swatch { color: var(--phosphor); box-shadow: inset 0 0 0 1.5px color-mix(in srgb, var(--phosphor) 50%, transparent); }
|
|
9947
|
+
.paper.busy { pointer-events: none; }
|
|
9948
|
+
.paper.busy .paper-swatch { animation: paper-busy 1.1s ease-in-out infinite; }
|
|
9949
|
+
@keyframes paper-busy { 50% { opacity: .45; } }
|
|
9950
|
+
@media (prefers-reduced-motion: reduce) { .paper.busy .paper-swatch { animation: none; opacity: .6; } }
|
|
9951
|
+
|
|
9952
|
+
/* Framing it: the whole picture, and over it the part the screen shows, carried by hand. What the
|
|
9953
|
+
screen does not show is dimmed; the frame keeps a white line and the window's own corner. */
|
|
9954
|
+
.wall-tools { display: grid; gap: 10px; margin-top: 4px; padding-top: 12px; border-top: 1px solid var(--line); }
|
|
9955
|
+
.wall-tools-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
|
|
9956
|
+
.wall-tools-words { display: grid; gap: 2px; min-width: 0; }
|
|
9957
|
+
.wall-tools-words b { font-family: var(--read); font-size: 12.5px; font-weight: 600; color: var(--text); }
|
|
9958
|
+
.wall-tools-hint { font-family: var(--read); font-size: 12px; line-height: 1.4; color: var(--text-2); }
|
|
9959
|
+
.wall-frame { display: grid; place-items: center; padding: 10px; border-radius: 12px; background: color-mix(in srgb, var(--text) 5%, transparent); }
|
|
9960
|
+
.wall-frame-fit { position: relative; display: block; line-height: 0; border-radius: 8px; overflow: hidden; touch-action: none; user-select: none; -webkit-user-select: none; }
|
|
9961
|
+
.wall-frame-pic { display: block; max-width: 100%; max-height: 150px; width: auto; height: auto; }
|
|
9962
|
+
.wall-frame-view { position: absolute; border-radius: 6px; box-shadow: 0 0 0 2px #ffffff, 0 0 0 4000px rgb(0 0 0 / .42); outline: 0; }
|
|
9963
|
+
.wall-frame:not([data-free="none"]) .wall-frame-fit { cursor: grab; }
|
|
9964
|
+
.wall-frame.moving .wall-frame-fit { cursor: grabbing; }
|
|
9965
|
+
.wall-frame-view:focus-visible { box-shadow: 0 0 0 2px #ffffff, 0 0 0 4px color-mix(in srgb, var(--phosphor) 70%, transparent), 0 0 0 4000px rgb(0 0 0 / .42); }
|
|
9966
|
+
.wall-tools-acts { display: flex; flex-wrap: wrap; gap: 8px; }
|
|
9967
|
+
|
|
9968
|
+
/* ==========================================================================================
|
|
9969
|
+
NEURAL MODE (1.0.3) · its key in the maps' heads, and its invitation
|
|
9970
|
+
------------------------------------------------------------------------------------------
|
|
9971
|
+
The Memory map and the Projects map can be drawn as the neurons of a brain (public/neural.js,
|
|
9972
|
+
nostromo-engine.js drawNeural). The key sits with the maps' other keys and takes their shape;
|
|
9973
|
+
on, its neuron fills and takes the cold light of the mode. When the machine does not give the
|
|
9974
|
+
map its frames, the key breathes and a card under it offers the mode: what it is, try it or not.
|
|
9975
|
+
========================================================================================== */
|
|
9976
|
+
:root { --neural: #56c8ff; --neural-ink: #021018; }
|
|
9977
|
+
.nostromo-head .neural-key { display: inline-flex; align-items: center; gap: 6px; }
|
|
9978
|
+
.nostromo-head .neural-key svg { flex: none; width: var(--ico-sm); height: var(--ico-sm); }
|
|
9979
|
+
/* Its word is written as it reads (the head lowercases its keys and lifts the first letter, which here is the drawing). */
|
|
9980
|
+
:is(#nostromo, .mv) .nostromo-actions .neural-key { text-transform: none; }
|
|
9981
|
+
:is(#nostromo, .mv) .nostromo-actions .neural-key[aria-pressed="true"] { color: var(--neural-ink); background: var(--neural); }
|
|
9982
|
+
:is(#nostromo, .mv) .nostromo-actions .neural-key[aria-pressed="true"]:hover { background: color-mix(in srgb, var(--neural) 86%, #ffffff); }
|
|
9983
|
+
.nostromo-head .neural-key[aria-pressed="true"] .ic-f { fill: currentColor; }
|
|
9984
|
+
.nostromo-head .neural-key.invite { animation: neural-breathe calc(2400ms * var(--motion-scale, 1)) ease-in-out infinite; }
|
|
9985
|
+
@keyframes neural-breathe { 0%, 100% { box-shadow: 0 0 0 0 rgb(86 200 255 / 0); } 50% { box-shadow: 0 0 0 4px rgb(86 200 255 / .35), 0 0 22px rgb(86 200 255 / .3); } }
|
|
9986
|
+
.via-phone #nostromo-neural { display: none; }
|
|
9987
|
+
.neural-invite {
|
|
9988
|
+
position: absolute; z-index: 6; width: min(340px, calc(100% - 24px));
|
|
9989
|
+
display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 12px 12px; padding: 14px 14px 12px;
|
|
9990
|
+
border-radius: 14px; color: #eef3ff; font-family: var(--read); text-transform: none; letter-spacing: 0;
|
|
9991
|
+
background: rgb(8 14 26 / .92); -webkit-backdrop-filter: blur(16px) saturate(1.4); backdrop-filter: blur(16px) saturate(1.4);
|
|
9992
|
+
box-shadow: 0 0 0 .5px rgb(86 200 255 / .28), 0 18px 44px -18px rgb(0 0 0 / .7), 0 0 40px -12px rgb(86 200 255 / .28);
|
|
9993
|
+
animation: neural-invite-in calc(240ms * var(--motion-scale, 1)) var(--ease-glide, ease-out);
|
|
9994
|
+
}
|
|
9995
|
+
@keyframes neural-invite-in { from { opacity: 0; translate: 0 -6px; } to { opacity: 1; translate: 0 0; } }
|
|
9996
|
+
.neural-invite-mark { display: grid; place-items: center; width: 36px; height: 36px; border-radius: 11px; color: var(--neural); background: radial-gradient(circle at 50% 45%, rgb(86 200 255 / .3), rgb(86 200 255 / .06) 70%); box-shadow: inset 0 0 0 .5px rgb(86 200 255 / .4); }
|
|
9997
|
+
.neural-invite-mark svg { width: var(--ico-md); height: var(--ico-md); }
|
|
9998
|
+
.neural-invite-words { display: grid; gap: 3px; align-content: center; min-width: 0; }
|
|
9999
|
+
.neural-invite-words b { font-size: 13.5px; font-weight: 600; color: #ffffff; }
|
|
10000
|
+
.neural-invite-words span { font-size: 12.5px; line-height: 1.45; color: rgb(220 232 255 / .72); }
|
|
10001
|
+
.neural-invite-acts { grid-column: 1 / -1; display: flex; justify-content: flex-end; gap: 8px; }
|
|
10002
|
+
/* Its two keys are its own: the map is dark in either theme, so they never take the page's. */
|
|
10003
|
+
.neural-invite :is(.neural-invite-go, .neural-invite-later) { height: 30px; padding: 0 14px; border: 0; border-radius: 9px; font-family: var(--read); font-size: 12.5px; font-weight: 600; letter-spacing: 0; cursor: pointer; transition: background-color var(--motion-fast) var(--ease-out); }
|
|
10004
|
+
.neural-invite .neural-invite-later { color: #eef3ff; background: rgb(255 255 255 / .08); }
|
|
10005
|
+
.neural-invite .neural-invite-later:is(:hover, :focus-visible) { background: rgb(255 255 255 / .15); outline: 0; }
|
|
10006
|
+
.neural-invite .neural-invite-go { color: var(--neural-ink); background: var(--neural); }
|
|
10007
|
+
.neural-invite .neural-invite-go:is(:hover, :focus-visible) { background: color-mix(in srgb, var(--neural) 84%, #ffffff); outline: 0; }
|
|
10008
|
+
@media (prefers-reduced-motion: reduce) { .nostromo-head .neural-key.invite, .neural-invite { animation: none; } }
|
|
10009
|
+
|
|
10010
|
+
/* The maps' close (1.0.3): the same sunk track and turning cross as every window, in the dark the
|
|
10011
|
+
maps always stand on, whatever the room's theme. */
|
|
10012
|
+
:is(#nostromo, .mv) .nostromo-actions .surface-modes {
|
|
10013
|
+
--neu-hi: rgba(255, 255, 255, .07); --neu-lo: rgba(0, 0, 0, .72); --surface: #1b1e1b;
|
|
10014
|
+
--key-track: inset 1.5px 1.5px 4px var(--neu-lo), inset -1.5px -1.5px 4px var(--neu-hi);
|
|
10015
|
+
--key-rest: -2px -2px 5px var(--neu-hi), 3px 3px 7px var(--neu-lo);
|
|
10016
|
+
box-shadow: var(--key-track); background: rgb(255 255 255 / .04) !important;
|
|
10017
|
+
}
|
|
10018
|
+
:is(#nostromo, .mv) .nostromo-actions .surface-modes .surface-mode.close { color: rgb(242 241 238 / .78); }
|
|
10019
|
+
:is(#nostromo, .mv) .nostromo-actions .surface-modes .surface-mode.close:is(:hover, :focus-visible) { color: #ffffff; background: var(--surface); box-shadow: var(--key-rest); }
|
|
10020
|
+
|
|
10021
|
+
|
|
10022
|
+
/* The Market's offer in the conversation (2026-10-18, app.js offerModule): one card under the
|
|
10023
|
+
message that asked for what a module does — its drawing, what would help, and its keys. */
|
|
10024
|
+
#messages .system.market-offer { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: center; gap: 6px 12px; max-width: min(640px, 100%); margin: 4px auto 6px; padding: 12px 14px; border: 0; border-radius: 14px; text-align: left; background: var(--plane-solid, var(--panel)); box-shadow: 0 0 0 1px color-mix(in srgb, var(--acc, var(--phosphor)) 30%, transparent), 0 6px 18px -12px rgba(0, 0, 0, .4); font-family: var(--read); letter-spacing: 0; text-transform: none; }
|
|
10025
|
+
#messages .market-offer-words { display: grid; gap: 2px; min-width: 0; }
|
|
10026
|
+
#messages .market-offer-words b { font-size: 14px; font-weight: 650; color: var(--text); }
|
|
10027
|
+
#messages .market-offer-words span { font-size: 13px; line-height: 1.45; color: var(--text-2); }
|
|
10028
|
+
#messages .market-offer-acts { grid-column: 2; display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
|
|
10029
|
+
#messages .market-offer-acts button { padding: 6px 12px; border: 0; border-radius: 9px; font: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer; color: var(--text); background: color-mix(in srgb, var(--text) 8%, transparent); }
|
|
10030
|
+
#messages .market-offer-acts button.primary { color: var(--acc-ink, var(--phosphor-ink, #0b0b0b)); background: var(--acc, var(--phosphor)); }
|
|
10031
|
+
#messages .market-offer-acts button.quiet { background: transparent; color: var(--text-3); }
|
|
10032
|
+
#messages .market-offer-acts button:disabled { opacity: .6; cursor: default; }
|
|
10033
|
+
/* Beside «Add a module», at the right: the push goes to whichever stands first. */
|
|
10034
|
+
.mods-head .mods-market { flex: none; height: 30px; padding: 0 12px; margin-left: auto; }
|
|
10035
|
+
.mods-head .mods-market + .mods-add { margin-left: 0; }
|
|
10036
|
+
|
|
10037
|
+
/* THE MARKET, full screen (market-view.js, 2026-10-18): the same store in Home and in a project.
|
|
10038
|
+
It takes the whole window, as a store does, over whatever was open; its own colors are the
|
|
10039
|
+
room's tokens, so it follows light and dark, and each module wears its own two colors. */
|
|
10040
|
+
html.mk-open, html.mk-open body { overflow: hidden; }
|
|
10041
|
+
/* The page's own first-time hints wait under the store and come back when it closes. */
|
|
10042
|
+
html.mk-open :is(.tour-hint, .tour-hint-away, .hint-spot) { visibility: hidden !important; }
|
|
10043
|
+
.mk { position: fixed; inset: 0; z-index: 2147482990; display: flex; flex-direction: column; background: var(--bg); color: var(--text); font-family: var(--read); outline: 0; opacity: 0; transform: scale(.985); transition: opacity calc(200ms * var(--motion-scale, 1)) ease, transform calc(240ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1); }
|
|
10044
|
+
.mk.in { opacity: 1; transform: none; }
|
|
10045
|
+
.mk button { font-family: inherit; }
|
|
10046
|
+
.mk-bar { position: relative; z-index: 2; display: grid; grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr); align-items: center; gap: 12px; padding: calc(10px + env(safe-area-inset-top, 0px)) 20px 10px; border-bottom: 1px solid var(--line); background: color-mix(in srgb, var(--bg) 84%, transparent); -webkit-backdrop-filter: saturate(1.4) blur(18px); backdrop-filter: saturate(1.4) blur(18px); }
|
|
10047
|
+
.mk-leave { justify-self: start; width: 34px; height: 34px; display: grid; place-items: center; border: 0; border-radius: 50%; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); cursor: pointer; }
|
|
10048
|
+
.mk-leave:hover { background: color-mix(in srgb, var(--text) 12%, transparent); }
|
|
10049
|
+
.mk-leave svg { width: 16px; height: 16px; }
|
|
10050
|
+
.mk-tabs { display: inline-flex; gap: 2px; padding: 3px; border-radius: 12px; background: color-mix(in srgb, var(--text) 7%, transparent); }
|
|
10051
|
+
.mk-tab { min-width: 104px; padding: 6px 18px; border: 0; border-radius: 9px; background: transparent; color: var(--text-2); font-size: 13.5px; font-weight: 600; cursor: pointer; }
|
|
10052
|
+
.mk-tab[aria-selected="true"] { background: var(--panel); color: var(--text); box-shadow: 0 1px 3px rgba(0, 0, 0, .18); }
|
|
10053
|
+
.mk-here { display: flex; align-items: baseline; gap: 8px; font-size: 14.5px; white-space: nowrap; }
|
|
10054
|
+
.mk-here span { color: var(--text-2); font-size: 13.5px; }
|
|
10055
|
+
.mk-search { justify-self: end; width: min(280px, 100%); }
|
|
10056
|
+
.mk-search[hidden] { display: flex !important; visibility: hidden; }
|
|
10057
|
+
.mk-main { flex: 1; overflow-y: auto; overscroll-behavior: contain; }
|
|
10058
|
+
.mk-page { width: min(1120px, 100%); margin: 0 auto; padding: 30px 32px calc(72px + env(safe-area-inset-bottom, 0px)); display: grid; grid-template-columns: minmax(0, 1fr); gap: 36px; box-sizing: border-box; }
|
|
10059
|
+
.mk-page > * { min-width: 0; }
|
|
10060
|
+
.mk-head h1 { margin: 0; font-size: clamp(30px, 4vw, 40px); font-weight: 760; letter-spacing: -.02em; line-height: 1.05; }
|
|
10061
|
+
.mk-head p { margin: 8px 0 0; max-width: 72ch; color: var(--text-2); font-size: 15px; line-height: 1.5; }
|
|
10062
|
+
.mk-empty { margin: 0; color: var(--text-2); font-size: 14.5px; }
|
|
10063
|
+
|
|
10064
|
+
/* A module's app icon: its drawing in white on its own colors, rounded like the icons on a phone. */
|
|
10065
|
+
.mk-icon { --mk-size: 56px; flex: none; display: grid; place-items: center; width: var(--mk-size); height: var(--mk-size); border-radius: calc(var(--mk-size) * .235); color: #fff; background: linear-gradient(160deg, var(--mk-a, #94a3b8), var(--mk-b, #334155)); box-shadow: inset 0 1px 0 rgba(255, 255, 255, .3), inset 0 -1px 0 rgba(0, 0, 0, .14), 0 1px 2px rgba(0, 0, 0, .14), 0 8px 18px -10px var(--mk-b, #334155); }
|
|
10066
|
+
.mk-icon svg { width: 58%; height: 58%; filter: drop-shadow(0 1px 1px rgba(0, 0, 0, .18)); }
|
|
10067
|
+
|
|
10068
|
+
/* The carousel: one featured module at a time, its picture beside what it does. */
|
|
10069
|
+
.mk-carousel { position: relative; }
|
|
10070
|
+
.mk-track { display: flex; overflow-x: auto; scroll-snap-type: x mandatory; scrollbar-width: none; border-radius: 26px; box-shadow: 0 24px 48px -32px rgba(0, 0, 0, .55); }
|
|
10071
|
+
.mk-track::-webkit-scrollbar { display: none; }
|
|
10072
|
+
.mk-slide { --mk-a: #60a5fa; --mk-b: #1d4ed8; position: relative; flex: 0 0 100%; display: grid; grid-template-columns: minmax(0, .9fr) minmax(0, 1.1fr); align-items: center; min-height: 380px; overflow: hidden; scroll-snap-align: start; color: #fff; cursor: pointer; background: radial-gradient(90% 120% at 88% 12%, color-mix(in srgb, var(--mk-a) 70%, #fff) 0%, transparent 60%), linear-gradient(135deg, var(--mk-a), var(--mk-b)); }
|
|
10073
|
+
.mk-slide::before { content: ''; position: absolute; inset: 0; pointer-events: none; background: radial-gradient(60% 80% at 0% 100%, rgba(0, 0, 0, .28), transparent 70%); }
|
|
10074
|
+
.mk-slide-words { position: relative; display: grid; align-content: center; gap: 10px; min-width: 0; padding: 40px 0 40px 46px; }
|
|
10075
|
+
.mk-slide-words small { font-size: 12px; font-weight: 700; letter-spacing: .14em; text-transform: uppercase; opacity: .86; }
|
|
10076
|
+
.mk-slide-words h2 { margin: 0; font-size: clamp(28px, 3.6vw, 42px); font-weight: 780; letter-spacing: -.025em; line-height: 1.04; text-wrap: balance; }
|
|
10077
|
+
.mk-slide-words p { margin: 0; max-width: 34ch; font-size: 16.5px; line-height: 1.45; opacity: .94; text-wrap: pretty; }
|
|
10078
|
+
.mk-slide-get { display: flex; align-items: center; gap: 12px; width: max-content; max-width: 100%; margin-top: 16px; padding: 10px 12px 10px 10px; border-radius: 18px; background: rgba(255, 255, 255, .16); -webkit-backdrop-filter: blur(12px); backdrop-filter: blur(12px); box-shadow: inset 0 0 0 1px rgba(255, 255, 255, .18); box-sizing: border-box; }
|
|
10079
|
+
.mk-slide-get .mk-icon { box-shadow: 0 0 0 1px rgba(255, 255, 255, .4), 0 4px 10px -4px rgba(0, 0, 0, .4); }
|
|
10080
|
+
.mk-slide-who { display: grid; gap: 1px; min-width: 0; padding-right: 6px; }
|
|
10081
|
+
.mk-slide-who b { font-size: 14.5px; }
|
|
10082
|
+
.mk-slide-who span { font-size: 12.5px; opacity: .85; }
|
|
10083
|
+
.mk-slide-art { position: relative; align-self: stretch; display: grid; place-items: center; padding: 22px 26px 22px 0; }
|
|
10084
|
+
.mk-slide-art svg { width: 100%; height: auto; max-height: 340px; }
|
|
10085
|
+
.mk-arrow { position: absolute; bottom: 44px; display: grid; place-items: center; width: 40px; height: 40px; border: 0; border-radius: 50%; background: rgba(0, 0, 0, .3); color: #fff; -webkit-backdrop-filter: blur(8px); backdrop-filter: blur(8px); cursor: pointer; opacity: 0; transition: opacity calc(160ms * var(--motion-scale, 1)) ease; }
|
|
10086
|
+
.mk-carousel:hover .mk-arrow, .mk-arrow:focus-visible { opacity: 1; }
|
|
10087
|
+
/* Both in the corner, out of the words' way. */
|
|
10088
|
+
.mk-arrow.prev { right: 64px; }
|
|
10089
|
+
.mk-arrow.next { right: 16px; }
|
|
10090
|
+
.mk-arrow svg { width: 18px; height: 18px; }
|
|
10091
|
+
.mk-dots { display: flex; justify-content: center; gap: 8px; margin-top: 14px; }
|
|
10092
|
+
.mk-dot { width: 8px; height: 8px; padding: 0; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--text) 22%, transparent); cursor: pointer; transition: width calc(220ms * var(--motion-scale, 1)) ease, background-color calc(220ms * var(--motion-scale, 1)) ease; }
|
|
10093
|
+
.mk-dot[aria-current="true"] { width: 24px; background: var(--text); }
|
|
10094
|
+
|
|
10095
|
+
/* The key: tonal while it is a question, solid on a module's page, quiet once it is on. */
|
|
10096
|
+
.mk-get { flex: none; height: 30px; padding: 0 16px; border: 0; border-radius: 999px; background: color-mix(in srgb, var(--madre-green) 15%, transparent); color: var(--madre-green); font-size: 13px; font-weight: 700; letter-spacing: .01em; white-space: nowrap; cursor: pointer; }
|
|
10097
|
+
.mk-get:hover { background: color-mix(in srgb, var(--madre-green) 24%, transparent); }
|
|
10098
|
+
.mk-get.on { background: color-mix(in srgb, var(--text) 8%, transparent); color: var(--text-2); }
|
|
10099
|
+
.mk-get.light { background: #fff; color: #111; }
|
|
10100
|
+
.mk-get.light:hover { background: rgba(255, 255, 255, .88); }
|
|
10101
|
+
.mk-get.big { height: 40px; padding: 0 22px; background: var(--madre-green); color: var(--madre-green-ink); font-size: 14.5px; }
|
|
10102
|
+
.mk-get.big:hover { filter: brightness(1.06); }
|
|
10103
|
+
.mk-get.big:is(.quiet, .on) { background: color-mix(in srgb, var(--text) 9%, transparent); color: var(--text); }
|
|
10104
|
+
.mk-get:disabled { opacity: .55; cursor: progress; }
|
|
10105
|
+
.mk-link { padding: 0; border: 0; background: none; color: var(--madre-green); font-size: 13.5px; font-weight: 600; cursor: pointer; }
|
|
10106
|
+
.mk-link:hover { text-decoration: underline; }
|
|
10107
|
+
|
|
10108
|
+
/* The shelves: rows of modules, three across where they fit, like a store's lists. */
|
|
10109
|
+
.mk-shelf { display: grid; gap: 6px; }
|
|
10110
|
+
.mk-shelf > header { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; padding-bottom: 10px; border-bottom: 1px solid var(--line); }
|
|
10111
|
+
.mk-shelf h2, .mk-section > h2 { margin: 0; font-size: 22px; font-weight: 720; letter-spacing: -.01em; }
|
|
10112
|
+
.mk-shelf > header p { margin: 0; color: var(--text-2); font-size: 14px; }
|
|
10113
|
+
.mk-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(320px, 100%), 1fr)); column-gap: 30px; }
|
|
10114
|
+
.mk-row { display: flex; align-items: center; gap: 12px; min-width: 0; padding: 12px 0; border-bottom: 1px solid var(--line); }
|
|
10115
|
+
.mk-row-open { flex: 1; display: flex; align-items: center; gap: 14px; min-width: 0; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
|
|
10116
|
+
.mk-row-words { display: grid; gap: 3px; min-width: 0; }
|
|
10117
|
+
.mk-row-words b { font-size: 15px; font-weight: 650; }
|
|
10118
|
+
.mk-row-words span { display: -webkit-box; overflow: hidden; color: var(--text-2); font-size: 13px; line-height: 1.35; -webkit-line-clamp: 2; -webkit-box-orient: vertical; }
|
|
10119
|
+
.mk-row-side { display: grid; justify-items: center; gap: 3px; }
|
|
10120
|
+
.mk-row-side small { color: var(--text-3); font-size: 10.5px; }
|
|
10121
|
+
.mk-row-side small:empty { display: none; }
|
|
10122
|
+
|
|
10123
|
+
/* A module's page. */
|
|
10124
|
+
.mk-product { gap: 30px; }
|
|
10125
|
+
.mk-back { justify-self: start; display: inline-flex; align-items: center; gap: 2px; padding: 4px 8px 4px 0; border: 0; background: none; color: var(--madre-green); font-size: 15px; font-weight: 600; cursor: pointer; }
|
|
10126
|
+
.mk-back svg { width: 17px; height: 17px; }
|
|
10127
|
+
.mk-product-top { display: flex; align-items: center; gap: 28px; }
|
|
10128
|
+
.mk-product-words { display: grid; gap: 8px; min-width: 0; }
|
|
10129
|
+
.mk-product-words h1 { margin: 0; font-size: clamp(26px, 3.4vw, 36px); font-weight: 760; letter-spacing: -.02em; line-height: 1.08; }
|
|
10130
|
+
.mk-product-words > p:not(.mk-said) { margin: 0; color: var(--text-2); font-size: 16px; }
|
|
10131
|
+
.mk-keys { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 14px; margin-top: 8px; }
|
|
10132
|
+
.mk-state { color: var(--text-2); font-size: 13.5px; }
|
|
10133
|
+
.mk-only { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; color: var(--text-2); font-size: 13.5px; }
|
|
10134
|
+
.mk-select { height: 32px; max-width: 240px; padding: 0 10px; border: 0; border-radius: 9px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text); font: inherit; font-size: 13.5px; }
|
|
10135
|
+
.mk-keys > .mk-select { height: 40px; }
|
|
10136
|
+
.mk-said { margin: 0; color: var(--text-2); font-size: 13.5px; line-height: 1.45; }
|
|
10137
|
+
.mk-said:empty { display: none; }
|
|
10138
|
+
.mk-said[data-tone="bad"] { color: var(--crit, #d93025); }
|
|
10139
|
+
.mk-said[data-tone="good"] { color: var(--madre-green); }
|
|
10140
|
+
.mk-facts { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); margin: 0; border-block: 1px solid var(--line); }
|
|
10141
|
+
.mk-facts > div { display: grid; justify-items: center; gap: 4px; padding: 14px 16px; text-align: center; }
|
|
10142
|
+
.mk-facts > div + div { border-left: 1px solid var(--line); }
|
|
10143
|
+
.mk-facts dt { color: var(--text-3); font-size: 11px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
|
|
10144
|
+
.mk-facts dd { margin: 0; font-size: 14.5px; font-weight: 600; }
|
|
10145
|
+
.mk-section { display: grid; gap: 14px; }
|
|
10146
|
+
.mk-shot { display: grid; place-items: center; width: min(760px, 100%); aspect-ratio: 16 / 9; padding: 3%; overflow: hidden; border-radius: 22px; background: radial-gradient(90% 120% at 85% 10%, color-mix(in srgb, var(--mk-a) 70%, #fff) 0%, transparent 60%), linear-gradient(135deg, var(--mk-a, #94a3b8), var(--mk-b, #334155)); box-sizing: border-box; }
|
|
10147
|
+
.mk-shot svg { width: min(100%, 720px); height: 100%; }
|
|
10148
|
+
.mk-about { margin: 0; max-width: 72ch; font-size: 15.5px; line-height: 1.6; }
|
|
10149
|
+
.mk-touches { overflow: hidden; border: 1px solid var(--line); border-radius: 16px; }
|
|
10150
|
+
.mk-touch { display: grid; grid-template-columns: 110px minmax(0, 1fr); gap: 14px; padding: 12px 16px; font-size: 14px; line-height: 1.45; }
|
|
10151
|
+
.mk-touch + .mk-touch { border-top: 1px solid var(--line); }
|
|
10152
|
+
.mk-touch span:first-child { color: var(--text-3); }
|
|
10153
|
+
|
|
10154
|
+
/* MODULES in Home: one card per module, a switch for every project and a chip for each one. */
|
|
10155
|
+
.mk-card { display: grid; gap: 12px; padding: 16px 18px; border-radius: 18px; background: var(--panel); box-shadow: 0 0 0 1px var(--line); }
|
|
10156
|
+
.mk-card.focused { box-shadow: 0 0 0 2px var(--madre-green); }
|
|
10157
|
+
.mk-card-head { display: flex; flex-wrap: wrap; align-items: center; gap: 12px 16px; }
|
|
10158
|
+
.mk-card-open { flex: 1; display: flex; align-items: center; gap: 14px; min-width: 220px; padding: 0; border: 0; background: none; color: inherit; font: inherit; text-align: left; cursor: pointer; }
|
|
10159
|
+
.mk-card-words { display: grid; gap: 2px; min-width: 0; }
|
|
10160
|
+
.mk-card-words b { font-size: 15px; font-weight: 650; }
|
|
10161
|
+
.mk-card-words span { color: var(--text-2); font-size: 13px; }
|
|
10162
|
+
.mk-all { display: flex; align-items: center; gap: 10px; color: var(--text-2); font-size: 13.5px; }
|
|
10163
|
+
.mk-switch { display: flex; flex: none; width: 44px; height: 26px; padding: 3px; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--text) 18%, transparent); cursor: pointer; transition: background-color calc(160ms * var(--motion-scale, 1)) ease; }
|
|
10164
|
+
.mk-knob { width: 20px; height: 20px; border-radius: 50%; background: #fff; box-shadow: 0 1px 3px rgba(0, 0, 0, .3); transition: transform calc(180ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1); }
|
|
10165
|
+
.mk-switch.on { background: var(--madre-green); }
|
|
10166
|
+
.mk-switch.on .mk-knob { transform: translateX(18px); }
|
|
10167
|
+
.mk-switch:disabled, .mk-chip:disabled { opacity: .55; cursor: progress; }
|
|
10168
|
+
.mk-chips { display: flex; flex-wrap: wrap; gap: 8px; padding-left: 58px; }
|
|
10169
|
+
.mk-chip { padding: 6px 12px; border: 0; border-radius: 99px; background: color-mix(in srgb, var(--text) 7%, transparent); color: var(--text-2); font-size: 13px; cursor: pointer; }
|
|
10170
|
+
span.mk-chip { cursor: default; }
|
|
10171
|
+
.mk-chip.on { background: color-mix(in srgb, var(--madre-green) 16%, transparent); color: var(--madre-green); font-weight: 600; }
|
|
10172
|
+
/* The page's own notice, over the Market while it is open, where a store says things: at the bottom. */
|
|
10173
|
+
html.mk-open .toast { z-index: 2147482995 !important; left: 50% !important; right: auto !important; top: auto !important; bottom: calc(28px + env(safe-area-inset-bottom, 0px)) !important; }
|
|
10174
|
+
|
|
10175
|
+
@media (max-width: 760px) {
|
|
10176
|
+
.mk-bar { grid-template-columns: auto minmax(0, 1fr); padding-inline: 14px; }
|
|
10177
|
+
.mk-bar-mid { justify-self: end; }
|
|
10178
|
+
.mk-search { grid-column: 1 / -1; justify-self: stretch; width: 100%; }
|
|
10179
|
+
.mk-search[hidden] { display: none !important; }
|
|
10180
|
+
.mk-tab { min-width: 0; padding-inline: 14px; }
|
|
10181
|
+
.mk-page { gap: 28px; padding: 20px 16px calc(52px + env(safe-area-inset-bottom, 0px)); }
|
|
10182
|
+
.mk-slide { grid-template-columns: minmax(0, 1fr); min-height: 0; }
|
|
10183
|
+
.mk-slide-get { width: 100%; }
|
|
10184
|
+
.mk-slide-who { flex: 1; }
|
|
10185
|
+
.mk-slide-words { padding: 26px 22px 6px; }
|
|
10186
|
+
.mk-slide-words p { max-width: none; }
|
|
10187
|
+
.mk-slide-art { padding: 4px 14px 18px; }
|
|
10188
|
+
.mk-slide-art svg { max-height: 230px; }
|
|
10189
|
+
.mk-arrow { display: none; }
|
|
10190
|
+
.mk-product-top { flex-direction: column; align-items: flex-start; gap: 16px; }
|
|
10191
|
+
.mk-product-top > .mk-icon { --mk-size: 96px !important; }
|
|
10192
|
+
.mk-facts { grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
10193
|
+
.mk-facts > div:nth-child(3) { border-left: 0; }
|
|
10194
|
+
.mk-facts > div:nth-child(n + 3) { border-top: 1px solid var(--line); }
|
|
10195
|
+
.mk-touch { grid-template-columns: 1fr; gap: 2px; }
|
|
10196
|
+
.mk-chips { padding-left: 0; }
|
|
10197
|
+
}
|
|
10198
|
+
@media (prefers-reduced-motion: reduce) { .mk, .mk-dot, .mk-knob { transition: none; } }
|
|
10199
|
+
|
|
10200
|
+
/* KEYS BESIDE THE VERSION (attribution.js, drawColophonKeys, 2026-10-18): what a module puts in the
|
|
10201
|
+
corner, drawn by MADRE. A mark in the same pill as the version; hovered or focused, a card above
|
|
10202
|
+
it with the module's words and the key that opens its address. */
|
|
10203
|
+
.colophon-keys { display: inline-flex; align-items: center; gap: 2px; margin-left: 8px; padding-left: 8px; border-left: 1px solid color-mix(in srgb, var(--text) 18%, transparent); }
|
|
10204
|
+
.colophon-key { position: relative; display: inline-flex; }
|
|
10205
|
+
.colophon-key-mark { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%; color: var(--text-2); text-decoration: none; transition: color calc(160ms * var(--motion-scale, 1)) ease, transform calc(200ms * var(--motion-scale, 1)) cubic-bezier(.2, .8, .2, 1); }
|
|
10206
|
+
.colophon-key-mark svg { width: 14px; height: 14px; }
|
|
10207
|
+
.colophon-key.heart .colophon-key-mark { color: #e5484d; }
|
|
10208
|
+
.colophon-key:is(:hover, :focus-within) .colophon-key-mark { transform: scale(1.18); }
|
|
10209
|
+
.colophon-key.heart:is(:hover, :focus-within) .colophon-key-mark svg { animation: colophon-beat calc(900ms * var(--motion-scale, 1)) ease-in-out infinite; }
|
|
10210
|
+
@keyframes colophon-beat { 0%, 100% { transform: scale(1); } 20% { transform: scale(1.18); } 40% { transform: scale(.96); } 60% { transform: scale(1.1); } }
|
|
10211
|
+
.colophon-key-mark:focus-visible { outline: 2px solid var(--madre-green); outline-offset: 2px; }
|
|
10212
|
+
.colophon-card { position: absolute; right: -10px; bottom: calc(100% + 12px); z-index: 20; display: grid; gap: 6px; width: max-content; max-width: 260px; padding: 12px 14px; border-radius: 14px; background: var(--surface, var(--panel)); color: var(--text); font-family: var(--read); font-size: 12.5px; font-weight: 450; letter-spacing: 0; line-height: 1.45; text-align: left; text-transform: none; white-space: normal; user-select: text; box-shadow: 0 0 0 .5px color-mix(in srgb, var(--text) 14%, transparent), 0 12px 28px -8px rgba(0, 0, 0, .45); opacity: 0; visibility: hidden; transform: translateY(4px); transition: opacity calc(160ms * var(--motion-scale, 1)) ease, transform calc(200ms * var(--motion-scale, 1)) ease, visibility 0s linear calc(200ms * var(--motion-scale, 1)); }
|
|
10213
|
+
/* A bridge over the gap, so the pointer can travel from the mark to the card without losing it. */
|
|
10214
|
+
.colophon-card::after { content: ''; position: absolute; left: 0; right: 0; top: 100%; height: 14px; }
|
|
10215
|
+
.colophon-key:is(:hover, :focus-within) .colophon-card { opacity: 1; visibility: visible; transform: none; transition-delay: 0s; }
|
|
10216
|
+
.colophon-card b { font-size: 13px; font-weight: 650; }
|
|
10217
|
+
.colophon-card span { color: var(--text-2); }
|
|
10218
|
+
.colophon-card-go { justify-self: start; margin-top: 2px; padding: 6px 12px; border-radius: 99px; background: var(--madre-green); color: var(--madre-green-ink); font-weight: 650; text-decoration: none; }
|
|
10219
|
+
.colophon-card-go:hover { filter: brightness(1.06); }
|
|
10220
|
+
@media (prefers-reduced-motion: reduce) { .colophon-key.heart:is(:hover, :focus-within) .colophon-key-mark svg { animation: none; } }
|