Session picker: one phase-colored dot, state via fill + motion

Redesign per review feedback: the colored phase strips were too busy —
removed. One small dot now carries two channels:

- COLOR = phase (sky/violet/emerald, same system as chip + dividers)
- FILL + MOTION = what's owed:
  - pulsing  = teacher is working (the only state that deserves motion)
  - solid    = a question awaits the learner's answer — the dominant
               resting state of real sessions, so deliberately calm
  - hollow   = idle, nothing owed

The amber attention channel is gone entirely (it would read as a
phantom fourth phase). The meta line now leads with the useful fact:
"Waiting for your answer · 5m ago" / "Teacher is working…" — the
message count only shows when idle. Ordering stays pure recency.
This commit is contained in:
Amos
2026-09-01 19:49:47 +03:00
parent 475726a976
commit 4a5bc40243
3 changed files with 138 additions and 97 deletions
+6 -27
View File
@@ -164,48 +164,29 @@ body {
* ============================================================ */
/* Phase colors: blue = probing, violet = planning, green = teaching.
Tuned per theme (light needs darker, dark lighter). The attention color
(an answer the learner owes) is deliberately outside the phase system —
dots and strips are separate channels and must not read as one. */
Tuned per theme (light needs darker, dark lighter). These color the
session dots, header chip and transcript dividers — one language. */
:root {
--phase-probe: oklch(0.55 0.17 253);
--phase-plan: oklch(0.54 0.19 300);
--phase-teach: oklch(0.55 0.14 160);
--attention: oklch(0.62 0.15 65);
}
.dark {
--phase-probe: oklch(0.72 0.13 250);
--phase-plan: oklch(0.72 0.14 300);
--phase-teach: oklch(0.74 0.12 160);
--attention: oklch(0.8 0.15 75);
}
@theme inline {
--color-phase-probe: var(--phase-probe);
--color-phase-plan: var(--phase-plan);
--color-phase-teach: var(--phase-teach);
--color-attention: var(--attention);
}
/* Status dots (session picker). Attention — a slow expanding ring, drawing
the eye to "your move". Working — a quiet breathing dot, opacity only,
never loud enough to compete with the attention ring. */
@keyframes lh-dot-attention {
0% {
box-shadow: 0 0 0 0 color-mix(in oklab, var(--attention) 60%, transparent);
}
70%,
100% {
box-shadow: 0 0 0 5px transparent;
}
}
.lh-dot-attention {
animation: lh-dot-attention 1.6s ease-out infinite;
}
/* Session dot motion (picker): the ONLY animated state is "teacher is
working" — a quiet phase-colored breathing. Pending questions are the
dominant resting state and stay perfectly still (solid dot). */
@keyframes lh-dot-breathe {
0%,
100% {
@@ -224,9 +205,7 @@ body {
}
@media (prefers-reduced-motion: reduce) {
.lh-dot-attention,
.lh-dot-breathe {
.lh-dot-breathe {
animation: none;
}
}