@jossuealcala/madre 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +45 -1
- package/CONTRIBUTING.md +5 -1
- package/NOTICE +20 -1
- package/README.md +8 -7
- package/TRADEMARKS.md +65 -0
- package/docs/INTERNALS.md +2 -2
- package/docs/REFERENCE.md +6 -5
- package/docs/madre-banner.png +0 -0
- package/package.json +4 -3
- package/public/app.js +529 -91
- package/public/es.js +1330 -1070
- package/public/macroverso.js +22 -2
- package/public/salas-mac.css +518 -24
- package/public/salas-mac.html +25 -21
- package/public/salas-mac.js +1454 -125
- package/public/styles.css +167 -3
- package/public/tour-chapters.js +162 -52
- package/public/tour.js +48 -12
- package/public/troubleshooting.js +2 -2
- package/src/auth-probe.mjs +29 -6
- package/src/credentials.mjs +80 -0
- package/src/directives.mjs +6 -6
- package/src/extensions.mjs +31 -10
- package/src/heartbeat.mjs +55 -0
- package/src/local-ai.mjs +48 -0
- package/src/looks.mjs +38 -5
- package/src/models.mjs +38 -0
- package/src/modules/ollama.mjs +14 -2
- package/src/outbound.mjs +17 -0
- package/src/room/escalation.mjs +1 -0
- package/src/room.mjs +60 -19
- package/src/server.mjs +350 -27
- package/src/tour.mjs +24 -9
- package/src/whats-new.mjs +10 -10
- package/docs/madre-banner.svg +0 -25
package/public/styles.css
CHANGED
|
@@ -1964,8 +1964,13 @@ dialog.viewer::backdrop { background: rgba(0,0,0,.7); backdrop-filter: blur(4px)
|
|
|
1964
1964
|
.run-request .run-line.running { cursor: progress; border-color: var(--agent, var(--phosphor)); }
|
|
1965
1965
|
.run-request .run-line.running .choice-tag { animation: klaxon 1.2s ease-in-out infinite; }
|
|
1966
1966
|
@media (prefers-reduced-motion: reduce) { .run-request .run-line.running .choice-tag { animation: none; } }
|
|
1967
|
-
.run-request .run-line.ran .choice-tag {
|
|
1967
|
+
.run-request .run-line.ran .choice-tag { border-color: var(--ok, var(--phosphor)); color: var(--ok, var(--phosphor)); }
|
|
1968
1968
|
.run-request .run-line.failed .choice-tag { border-color: var(--crit); color: var(--crit); }
|
|
1969
|
+
.run-request .run-summary { margin: 10px 2px 0; font-family: var(--mono); font-size: 10.5px; color: var(--text-2); }
|
|
1970
|
+
.run-request .run-progress-track { position: relative; flex: 1 1 100%; height: 3px; overflow: hidden; border-radius: 3px; background: color-mix(in srgb, var(--agent, var(--phosphor)) 18%, transparent); }
|
|
1971
|
+
.run-request .run-progress-track::after { content: ''; position: absolute; inset: 0 auto 0 0; width: 32%; border-radius: inherit; background: var(--agent, var(--phosphor)); animation: run-travel 1.6s ease-in-out infinite alternate; }
|
|
1972
|
+
@keyframes run-travel { from { transform: translateX(0); } to { transform: translateX(220%); } }
|
|
1973
|
+
@media (prefers-reduced-motion: reduce) { .run-request .run-progress-track::after { animation: none; width: 100%; } }
|
|
1969
1974
|
.run-request .run-line.refused { cursor: not-allowed; opacity: .6; }
|
|
1970
1975
|
.run-request .run-line.refused .choice-tag { border-color: var(--text-3); color: var(--text-3); }
|
|
1971
1976
|
/* A command still alive: where it serves, and the two things to do with it. The tag holds still
|
|
@@ -2463,6 +2468,23 @@ dialog.intents-window { width: 760px; height: 640px; }
|
|
|
2463
2468
|
.conn-card .key-link:hover { color: var(--ph); }
|
|
2464
2469
|
.conn-card .key-said.bad { color: var(--terror); }
|
|
2465
2470
|
|
|
2471
|
+
/* The second half of a browser sign-in. The CLI opens a page and then waits to be told the code
|
|
2472
|
+
that page gives back; this is where the address stays put and where the code is typed. It used
|
|
2473
|
+
to be nowhere, so the only thing on screen was a heartbeat and the sign-in died of its clock. */
|
|
2474
|
+
.login-ask { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
|
|
2475
|
+
.login-ask[hidden] { display: none; }
|
|
2476
|
+
.login-code { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; flex: 1 1 260px; }
|
|
2477
|
+
.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; }
|
|
2478
|
+
.login-code input:focus { outline: none; border-color: var(--phosphor); }
|
|
2479
|
+
.login-code button { font-family: var(--mono); font-size: 10px; letter-spacing: .14em; text-transform: uppercase; border: 1px solid var(--phosphor); color: var(--phosphor); background: color-mix(in srgb, var(--phosphor) 10%, transparent); border-radius: 8px; padding: 7px 12px; cursor: pointer; }
|
|
2480
|
+
.login-code button:disabled { opacity: .5; cursor: default; }
|
|
2481
|
+
.login-code .key-said { flex: 1 0 100%; }
|
|
2482
|
+
/* Inside a connection card the ground is black and everything is phosphor, as the key form is. */
|
|
2483
|
+
.conn-card .login-code input { color: var(--ph); background: #000; border: 1px solid var(--ph-dim); border-radius: 0; font-size: 12px; padding: 6px 8px; }
|
|
2484
|
+
.conn-card .login-code input::placeholder { color: var(--ph-dim); opacity: .7; }
|
|
2485
|
+
.conn-card .login-code input:focus { outline: 1px solid var(--ph); border-color: var(--ph); }
|
|
2486
|
+
.conn-card .login-code button { border: 1px solid var(--ph); color: #041004; background: var(--ph); border-radius: 0; }
|
|
2487
|
+
|
|
2466
2488
|
/* A module card, floor by floor: what it is, what it does, what it touches, how it is doing, and
|
|
2467
2489
|
then the switch. Everything inside a card wears the panel's phosphor, never the page's palette,
|
|
2468
2490
|
and every number is given room so it can never land on its own label. */
|
|
@@ -3219,6 +3241,14 @@ dialog.whats-new::backdrop { background: rgba(0, 0, 0, .45); backdrop-filter: bl
|
|
|
3219
3241
|
The list says whose servers these are, each one with a lamp that is lit while it answers. When
|
|
3220
3242
|
the one on screen stops, the page stays, dimmed, and says so; it comes back on its own. */
|
|
3221
3243
|
.ports-head { padding: 8px 10px 6px; font-family: var(--mono); font-size: 9px; font-weight: 600; letter-spacing: .18em; color: var(--text-3); }
|
|
3244
|
+
.ports-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; min-height: 34px; }
|
|
3245
|
+
.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; }
|
|
3246
|
+
.ports-refresh:hover { color: var(--text); box-shadow: var(--key-over, var(--key-rest)); }
|
|
3247
|
+
.ports-refresh:focus-visible { outline: 2px solid var(--phosphor); outline-offset: 2px; }
|
|
3248
|
+
.ports-refresh svg { width: 17px; height: 17px; }
|
|
3249
|
+
.ports-refresh.checking svg { animation: ports-turn .8s linear infinite; }
|
|
3250
|
+
@keyframes ports-turn { to { transform: rotate(360deg); } }
|
|
3251
|
+
@media (prefers-reduced-motion: reduce) { .ports-refresh.checking svg { animation: none; } }
|
|
3222
3252
|
.ports-empty { padding: 6px 10px 10px; font-size: 12px; line-height: 1.5; color: var(--text-2); }
|
|
3223
3253
|
.ports-lamp { align-self: center; width: 7px; height: 7px; border-radius: 50%; background: var(--phosphor); box-shadow: 0 0 0 3px color-mix(in srgb, var(--phosphor) 16%, transparent); }
|
|
3224
3254
|
.ports-row.wider .ports-lamp, .ports-lamp.off { background: var(--text-3); box-shadow: none; }
|
|
@@ -8216,7 +8246,7 @@ dialog.tour-bonjour::backdrop { background: transparent; }
|
|
|
8216
8246
|
.tour-points li::before { content: ''; position: absolute; left: 2px; top: .62em; width: 6px; height: 6px; border-radius: 50%; background: var(--tour-acc); }
|
|
8217
8247
|
.tour-keys { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, max-content); gap: 6px 14px; margin: 6px 0 0; padding: 10px 12px; border-radius: 12px; background: color-mix(in srgb, var(--text) 4%, transparent); }
|
|
8218
8248
|
.tour-keys dt { font-size: 12.5px; color: var(--text-2); }
|
|
8219
|
-
.tour-keys dd { margin: 0; max-width:
|
|
8249
|
+
.tour-keys dd { margin: 0; max-width: 34ch; text-wrap: balance; justify-self: end; font-family: var(--mono); font-size: 11.5px; line-height: 1.4; text-align: right; color: var(--text); }
|
|
8220
8250
|
.tour-acts { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-top: 8px; }
|
|
8221
8251
|
.tour-gap { flex: 1; }
|
|
8222
8252
|
.tour-where { font-size: 12.5px; color: var(--text-3); }
|
|
@@ -8228,7 +8258,7 @@ dialog.tour-bonjour::backdrop { background: transparent; }
|
|
|
8228
8258
|
|
|
8229
8259
|
/* The scenes: a few shapes, drawn small, moving slowly. */
|
|
8230
8260
|
.tour-scene { position: relative; height: 168px; overflow: hidden; border-radius: 14px; background: radial-gradient(120% 90% at 50% 0%, color-mix(in srgb, var(--tour-acc) 14%, transparent), transparent 70%), color-mix(in srgb, var(--text) 4%, transparent); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text) 8%, transparent); }
|
|
8231
|
-
.tour-scene.s-moved { height: auto; padding: 12px 14px; }
|
|
8261
|
+
.tour-scene.s-moved, .tour-scene.s-table { height: auto; padding: 12px 14px; }
|
|
8232
8262
|
.ts-moved { display: grid; gap: 6px; }
|
|
8233
8263
|
.ts-moved-row { display: grid; grid-template-columns: minmax(0, 1fr) 18px minmax(0, 1.4fr); align-items: center; gap: 8px; font-size: 12.5px; animation: tour-rise calc(420ms * var(--motion-scale, 1)) ease both; }
|
|
8234
8264
|
.ts-moved-row:nth-child(2) { animation-delay: 60ms; } .ts-moved-row:nth-child(3) { animation-delay: 120ms; } .ts-moved-row:nth-child(4) { animation-delay: 180ms; } .ts-moved-row:nth-child(5) { animation-delay: 240ms; } .ts-moved-row:nth-child(6) { animation-delay: 300ms; } .ts-moved-row:nth-child(7) { animation-delay: 360ms; } .ts-moved-row:nth-child(8) { animation-delay: 420ms; }
|
|
@@ -8338,3 +8368,137 @@ dialog.tour-bonjour::backdrop { background: transparent; }
|
|
|
8338
8368
|
.ts-search em { width: 54%; }
|
|
8339
8369
|
}
|
|
8340
8370
|
.tour-pill-slot:not([hidden]) { display: inline-flex; align-items: center; }
|
|
8371
|
+
|
|
8372
|
+
/* ==========================================================================================
|
|
8373
|
+
KEYS WITH A CLEAN EDGE · 13 OCT
|
|
8374
|
+
------------------------------------------------------------------------------------------
|
|
8375
|
+
The two soft shadows of the shared light (above) read as a smudge on a white card: the light
|
|
8376
|
+
one vanishes and the dark one spreads. A key now stands on three thin layers instead — a
|
|
8377
|
+
hairline that draws its edge, a tight contact shadow and a short soft one below — with a
|
|
8378
|
+
faint lit top in the dark. Over it, it lifts a little; pressed, the shade goes inside. The
|
|
8379
|
+
same four tokens dress every key, in Home and in every project.
|
|
8380
|
+
========================================================================================== */
|
|
8381
|
+
:root {
|
|
8382
|
+
--key-rest: inset 0 1px 0 rgba(255, 255, 255, .055), 0 0 0 .5px rgba(0, 0, 0, .6), 0 1px 1.5px rgba(0, 0, 0, .42), 0 3px 8px -3px rgba(0, 0, 0, .5);
|
|
8383
|
+
--key-over: inset 0 1px 0 rgba(255, 255, 255, .075), 0 0 0 .5px rgba(0, 0, 0, .6), 0 2px 3px rgba(0, 0, 0, .38), 0 8px 18px -7px rgba(0, 0, 0, .58);
|
|
8384
|
+
--key-down: inset 0 1px 2px rgba(0, 0, 0, .55), inset 0 0 0 .5px rgba(0, 0, 0, .5);
|
|
8385
|
+
--key-track: inset 0 0 0 .5px rgba(255, 255, 255, .07), inset 0 1px 2px rgba(0, 0, 0, .38);
|
|
8386
|
+
}
|
|
8387
|
+
:root[data-scheme="light"] {
|
|
8388
|
+
--key-rest: 0 0 0 .5px rgba(22, 30, 22, .11), 0 1px 1.5px rgba(22, 30, 22, .08), 0 2px 6px -2px rgba(22, 30, 22, .12);
|
|
8389
|
+
--key-over: 0 0 0 .5px rgba(22, 30, 22, .13), 0 2px 3px rgba(22, 30, 22, .08), 0 8px 18px -8px rgba(22, 30, 22, .2);
|
|
8390
|
+
--key-down: inset 0 1px 2px rgba(22, 30, 22, .14), inset 0 0 0 .5px rgba(22, 30, 22, .14);
|
|
8391
|
+
--key-track: inset 0 0 0 .5px rgba(22, 30, 22, .12), inset 0 1px 2px rgba(22, 30, 22, .06);
|
|
8392
|
+
}
|
|
8393
|
+
|
|
8394
|
+
/* ==========================================================================================
|
|
8395
|
+
OPENCODE BY PROVIDER · 13 OCT
|
|
8396
|
+
The composer's chooser groups OpenCode's models under the provider they come from, and
|
|
8397
|
+
AJUSTES › Project › OpenCode lists the providers with their key and their switch.
|
|
8398
|
+
========================================================================================== */
|
|
8399
|
+
.model-list { max-height: 320px; }
|
|
8400
|
+
.model-group { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin: 10px 10px 3px; font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--text-3); }
|
|
8401
|
+
.model-group:first-of-type { margin-top: 6px; }
|
|
8402
|
+
.model-group b { font-weight: 650; color: var(--text-2); }
|
|
8403
|
+
.model-group span { letter-spacing: .04em; text-transform: none; font-size: 10.5px; }
|
|
8404
|
+
.model-group + .model-option { margin-top: 1px; }
|
|
8405
|
+
.model-manage { display: block; width: 100%; margin-top: 8px; padding: 8px 10px; border: 0; border-radius: 8px; background: transparent; color: var(--agent, var(--phosphor)); font: inherit; font-size: 12px; font-weight: 600; text-align: left; cursor: pointer; }
|
|
8406
|
+
.model-manage:hover { background: color-mix(in srgb, var(--agent, var(--phosphor)) 10%, transparent); }
|
|
8407
|
+
|
|
8408
|
+
.oc-block { display: grid; gap: 12px; margin: 0 16px 16px; padding: 16px 16px 12px; border-radius: 12px; box-shadow: var(--key-track); }
|
|
8409
|
+
.oc-title { display: grid; gap: 3px; }
|
|
8410
|
+
.oc-title b, .oc-add-label { font-size: 13.5px; font-weight: 600; color: var(--text); }
|
|
8411
|
+
.oc-providers { display: grid; gap: 0; }
|
|
8412
|
+
.oc-provider { display: flex; align-items: center; justify-content: space-between; gap: 14px; min-width: 0; padding: 10px 0; border-top: 1px solid color-mix(in srgb, var(--text) 7%, transparent); }
|
|
8413
|
+
.oc-provider:first-child { border-top: 0; padding-top: 2px; }
|
|
8414
|
+
.oc-provider .sx-words { display: grid; gap: 1px; min-width: 0; }
|
|
8415
|
+
.oc-provider .sx-words b { font-size: 13.5px; font-weight: 600; color: var(--text); }
|
|
8416
|
+
.oc-controls { display: inline-flex; align-items: center; gap: 12px; flex: none; }
|
|
8417
|
+
.oc-shown { display: inline-flex; align-items: center; gap: 8px; font-size: 12px; color: var(--text-2); }
|
|
8418
|
+
.oc-add { display: grid; grid-template-columns: auto minmax(110px, 160px) minmax(0, 1fr) auto auto; align-items: center; gap: 8px 10px; padding-top: 12px; border-top: 1px solid color-mix(in srgb, var(--text) 7%, transparent); }
|
|
8419
|
+
.oc-add .sx-input { height: 32px; min-width: 0; }
|
|
8420
|
+
.oc-where { font-size: 12px; font-weight: 550; color: var(--phosphor); text-decoration: none; white-space: nowrap; }
|
|
8421
|
+
.oc-where:hover { text-decoration: underline; }
|
|
8422
|
+
.oc-default-row { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.2fr); align-items: center; gap: 14px; padding-top: 12px; border-top: 1px solid color-mix(in srgb, var(--text) 7%, transparent); }
|
|
8423
|
+
.oc-default-row .sx-words { display: grid; gap: 2px; }
|
|
8424
|
+
.oc-default-row .sx-words b { font-size: 13.5px; font-weight: 600; color: var(--text); }
|
|
8425
|
+
.oc-picks { display: grid; gap: 8px; min-width: 0; }
|
|
8426
|
+
.oc-picks .sx-input { height: 32px; min-width: 0; width: 100%; }
|
|
8427
|
+
.oc-block > .sx-foot { margin: 0; font-size: 11.5px; }
|
|
8428
|
+
@container (max-width: 560px) {
|
|
8429
|
+
.oc-add { grid-template-columns: minmax(0, 1fr) auto; }
|
|
8430
|
+
.oc-add-label { grid-column: 1 / -1; }
|
|
8431
|
+
.oc-add .sx-input { grid-column: 1 / -1; }
|
|
8432
|
+
.oc-default-row { grid-template-columns: 1fr; }
|
|
8433
|
+
}
|
|
8434
|
+
|
|
8435
|
+
/* ==========================================================================================
|
|
8436
|
+
AGENTS, FOLDED · 13 OCT
|
|
8437
|
+
Each agent is one line until it is opened: who it is, whether it has a session and a chevron.
|
|
8438
|
+
Open, its settings come in pairs and its sign-in shows the last lines, the heartbeat once.
|
|
8439
|
+
========================================================================================== */
|
|
8440
|
+
#settings .sx-agent { container-type: inline-size; }
|
|
8441
|
+
.sx-agent > .sx-head { padding: 0; }
|
|
8442
|
+
.sx-agent-toggle { display: flex; align-items: center; gap: 12px; width: 100%; min-width: 0; padding: 14px 16px; border: 0; background: transparent; color: inherit; font: inherit; text-align: left; cursor: pointer; border-radius: inherit; }
|
|
8443
|
+
.sx-agent-toggle .sx-words { flex: 1; min-width: 0; }
|
|
8444
|
+
.sx-agent-toggle .sx-words p { margin: 0; }
|
|
8445
|
+
.sx-agent-toggle:focus-visible { outline: 2px solid color-mix(in srgb, var(--phosphor) 55%, transparent); outline-offset: -2px; }
|
|
8446
|
+
.sx-chevron { flex: none; width: 8px; height: 8px; margin: 0 4px 0 2px; border-right: 1.6px solid var(--text-3); border-bottom: 1.6px solid var(--text-3); transform: rotate(45deg) translate(-2px, -2px); transition: transform calc(180ms * var(--motion-scale, 1)) var(--ease-out, ease-out); }
|
|
8447
|
+
.sx-agent.open .sx-chevron { transform: rotate(-135deg) translate(-2px, -2px); }
|
|
8448
|
+
.sx-agent:not(.open) > .sx-meta, .sx-agent:not(.open) > .sx-agent-body { display: none; }
|
|
8449
|
+
.sx-agent:not(.open) { padding-bottom: 0; }
|
|
8450
|
+
.sx-agent > .sx-meta { padding-top: 0; margin-top: -4px; }
|
|
8451
|
+
.sx-agent-body { display: grid; }
|
|
8452
|
+
.sx-duo { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); }
|
|
8453
|
+
.sx-duo > .sx-row { min-width: 0; gap: 10px; padding-right: 14px; }
|
|
8454
|
+
.sx-duo > .sx-row .sx-control { max-width: none; }
|
|
8455
|
+
.sx-duo > .sx-row + .sx-row { border-left: 1px solid color-mix(in srgb, var(--text) 7%, transparent); }
|
|
8456
|
+
@container (max-width: 380px) {
|
|
8457
|
+
.sx-duo { grid-template-columns: 1fr; }
|
|
8458
|
+
.sx-duo > .sx-row + .sx-row { border-left: 0; }
|
|
8459
|
+
}
|
|
8460
|
+
.sx-agent .login-log { max-height: 132px; overflow-y: auto; padding: 10px 12px; border-radius: 10px; background: color-mix(in srgb, var(--text) 4%, transparent); font-family: var(--mono); font-size: 11.5px; line-height: 1.55; overflow-wrap: anywhere; }
|
|
8461
|
+
.sx-agent .login-log .beat { color: var(--text-3); }
|
|
8462
|
+
.sx-agent .login-log a { color: var(--phosphor); }
|
|
8463
|
+
|
|
8464
|
+
/* ==========================================================================================
|
|
8465
|
+
QUIET GEARS · 13 OCT
|
|
8466
|
+
The settings key of Files and Servers and the new-file key wore the white raised face the
|
|
8467
|
+
window keys wear only when they are ON (split view chosen), so they read as already pressed.
|
|
8468
|
+
At rest they now dress like the controls beside them — a hairline track, the bar's own
|
|
8469
|
+
ground, a grey icon — and take the accent only under the pointer, the way the window keys do.
|
|
8470
|
+
========================================================================================== */
|
|
8471
|
+
:root .surface-gear, :root[data-scheme] .surface-gear {
|
|
8472
|
+
border: 1px solid var(--line-2) !important;
|
|
8473
|
+
background-color: color-mix(in srgb, var(--text) 3%, transparent) !important;
|
|
8474
|
+
box-shadow: none !important;
|
|
8475
|
+
color: var(--text-3);
|
|
8476
|
+
border-radius: 9px;
|
|
8477
|
+
}
|
|
8478
|
+
:root .surface-gear:hover:not(:disabled), :root .surface-gear:focus-visible {
|
|
8479
|
+
color: var(--phosphor);
|
|
8480
|
+
background-color: color-mix(in srgb, var(--phosphor) 10%, transparent) !important;
|
|
8481
|
+
box-shadow: none !important;
|
|
8482
|
+
}
|
|
8483
|
+
:root .surface-gear:active:not(:disabled), :root .surface-gear[aria-pressed="true"], :root .surface-gear[aria-expanded="true"] {
|
|
8484
|
+
color: var(--phosphor);
|
|
8485
|
+
background-color: var(--surface, var(--panel)) !important;
|
|
8486
|
+
box-shadow: var(--key-down) !important;
|
|
8487
|
+
}
|
|
8488
|
+
|
|
8489
|
+
/* The tour's widgets scene (1.1): four cards on a board, each with two meters that fill once. */
|
|
8490
|
+
.ts-grid.ts-widgets { top: 22px; bottom: 22px; grid-template-columns: repeat(2, 1fr); }
|
|
8491
|
+
.ts-widgets .ts-card { display: grid; align-content: center; gap: 9px; padding: 0 14px; }
|
|
8492
|
+
.ts-widgets .ts-card i { display: block; height: 6px; border-radius: 99px; background: linear-gradient(90deg, var(--phosphor) calc(var(--w) * 100%), color-mix(in srgb, var(--text) 10%, transparent) 0); }
|
|
8493
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
8494
|
+
.ts-widgets .ts-card i { animation: ts-fill 1.6s cubic-bezier(.2, .7, .2, 1) both; }
|
|
8495
|
+
.ts-widgets .ts-card:nth-child(2) i { animation-delay: .15s; } .ts-widgets .ts-card:nth-child(3) i { animation-delay: .3s; } .ts-widgets .ts-card:nth-child(4) i { animation-delay: .45s; }
|
|
8496
|
+
}
|
|
8497
|
+
@keyframes ts-fill { from { background-size: 0 100%; background-repeat: no-repeat; } to { background-size: 100% 100%; background-repeat: no-repeat; } }
|
|
8498
|
+
.hint-card.in-modal::before { content: none; }
|
|
8499
|
+
|
|
8500
|
+
/* The tables of what was renamed or moved: a long new name wraps under itself, never past the box. */
|
|
8501
|
+
.ts-moved-row .now { overflow-wrap: anywhere; line-height: 1.35; }
|
|
8502
|
+
|
|
8503
|
+
/* The welcome and its chapters are dialogs too: their own ring is not drawn around them. */
|
|
8504
|
+
dialog.tour-bonjour:focus, dialog.tour-bonjour:focus-visible, dialog.whats-new:focus, dialog.whats-new:focus-visible { outline: none; }
|