+
+ With the AI
+ {m.withAI}
+ being qualified, rated, checked or chased — no one waiting
+
+
+ Waiting on a person
+ {m.withPerson}
+ {m.withPerson ? 'a decision or an upload is owed' : 'nothing owed by anyone'}
+
+
+ With the customer
+ {m.withCustomer}
+ a quote or a payment is theirs to answer
+
+
+ Renewals at risk
+ {m.exposure.lapsed.length + m.exposure.week.length}
+ {m.exposure.lapsed.length} lapsed · {m.exposure.week.length} within 7 days
+
+
+
Open leads
diff --git a/src/screens/screens.css b/src/screens/screens.css
index ba432e9..a1c6327 100644
--- a/src/screens/screens.css
+++ b/src/screens/screens.css
@@ -589,11 +589,14 @@
/* ---- lead: the file beside the story ---- */
.lead {
display: grid;
- /* Wider than it was. At 384px the trail was a column of two-line entries
- beside a full-width file, which read as a margin note rather than as the
- other half of the page — and it is the half that says what happened. */
- grid-template-columns: minmax(0, 1fr) 440px;
- gap: 20px;
+ /* THE STORY GETS THE WIDE COLUMN. The trail used to sit in a 384px gutter
+ with its own scrollbar while a panel of reference fields had the whole
+ width — exactly backwards for a product whose point is the record of
+ work nobody watched. Now the narrative has the measure prose needs and
+ the reference rail is narrow, because short key/value pairs are the one
+ thing a narrow column is good for. */
+ grid-template-columns: minmax(0, 1fr) 340px;
+ gap: var(--sp-6);
align-items: start;
}
@@ -604,10 +607,19 @@
/* The trail stays in view while the file is read against it. */
.lead__side {
position: sticky;
- top: 90px;
+ top: 92px;
min-width: 0;
+ max-height: calc(100vh - 108px);
+ overflow-y: auto;
+ overscroll-behavior: contain;
}
+/* Rail panels are tighter than main panels — a 340px measure cannot afford
+ 32px of padding on each side. */
+.lead__side .panel { padding: var(--sp-5) 0 0; margin-bottom: var(--sp-4); }
+.lead__side .panel > .panel__head { padding: 0 var(--sp-6); margin-bottom: var(--sp-4); }
+.lead__side .panel--crew { padding: var(--sp-5) var(--sp-6); }
+
.panel--rail {
padding: 0;
margin-bottom: 0;
@@ -619,25 +631,19 @@
margin-bottom: 14px;
}
-.lead__feed {
- max-height: calc(100vh - 240px);
- overflow-y: auto;
- overscroll-behavior: contain;
- padding: 0 22px 20px;
-}
+/* .lead__feed is gone: the trail is page content and scrolls with the page.
+ An inner scroll region is a widget; the story is not a widget. */
-/* One column below the width where a 384px rail stops paying for itself. */
-@media (max-width: 1180px) {
+/* One column below the width where a rail stops paying for itself. */
+@media (max-width: 1100px) {
.lead {
grid-template-columns: minmax(0, 1fr);
}
.lead__side {
position: static;
- }
-
- .lead__feed {
- max-height: 560px;
+ max-height: none;
+ overflow: visible;
}
}
@@ -857,6 +863,72 @@
font-variant-numeric: tabular-nums;
}
+/* ── Right now ─────────────────────────────────────────────────────────────
+ The overview's first row. Four large numbers on a navy ground so the page
+ opens on a statement rather than a grid: this is who holds the work. Each
+ cell carries its own hue at the top edge — blue for the machine, amber for
+ a person, teal for the customer, red for risk — so the row can be read as
+ colour before it is read as text. */
+.now {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+ gap: var(--sp-3);
+ margin-bottom: var(--sp-5);
+}
+
+.now__cell {
+ position: relative;
+ padding: var(--sp-6) var(--sp-6) var(--sp-5);
+ border-radius: var(--r-lg);
+ background: var(--zk-navy);
+ color: var(--zk-white);
+ overflow: hidden;
+ box-shadow: var(--sh-md);
+}
+
+.now__cell::before {
+ content: '';
+ position: absolute;
+ inset: 0 0 auto 0;
+ height: 4px;
+ background: var(--zk-blue-light);
+}
+.now__cell--person::before { background: var(--zk-amber-line); }
+.now__cell--cust::before { background: var(--zk-cyan); }
+.now__cell--risk::before { background: var(--zk-danger-line); }
+
+/* A live person-queue or a lapsed renewal is the one thing on this page that
+ is actually owed. It warms up; the rest stay navy. */
+.now__cell--person.is-live { background: var(--zk-amber-ink); }
+.now__cell--risk.is-live { background: var(--zk-danger-ink); }
+
+.now__l {
+ display: block;
+ margin-bottom: var(--sp-3);
+ font-size: var(--fs-3xs);
+ font-weight: var(--fw-semi);
+ letter-spacing: .09em;
+ text-transform: uppercase;
+ opacity: .78;
+}
+
+.now__v {
+ display: block;
+ margin-bottom: var(--sp-2);
+ font-size: var(--fs-3xl);
+ font-weight: var(--fw-semi);
+ line-height: 1;
+ letter-spacing: -.03em;
+ font-variant-numeric: tabular-nums;
+}
+
+.now__s {
+ display: block;
+ font-size: var(--fs-2xs);
+ line-height: var(--lh-snug);
+ opacity: .82;
+}
+
/* KPI strip. Whitespace rather than rules — see .lmetrics for why the cage
went. Tabular figures so the row does not jitter as it refreshes. */
.kpis {
@@ -1273,18 +1345,21 @@
/* ---- who worked this lead ----
Five agents carry a lead and their names appeared only inside individual
entries. The team is a fact about the lead, so it sits above the trail. */
+.panel--crew { padding: var(--sp-5) var(--sp-6); }
+
.crew {
display: flex;
flex-wrap: wrap;
align-items: center;
- gap: 10px;
- padding: 10px 18px 12px;
- border-bottom: 1px solid var(--zk-line-soft);
+ gap: var(--sp-2) var(--sp-4);
+ margin-top: var(--sp-3);
}
+
.crew__l {
+ display: block;
font-size: var(--fs-3xs);
- font-weight: 500;
- letter-spacing: 0.1em;
+ font-weight: var(--fw-semi);
+ letter-spacing: 0.09em;
text-transform: uppercase;
color: var(--zk-grey);
}
@@ -1541,10 +1616,9 @@
row of its own the way the thirteen-group version did. */
.glance {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
- gap: 14px;
- padding: 4px 22px 18px;
- align-items: start;
+ grid-template-columns: 1fr;
+ gap: var(--sp-3);
+ padding: 0 var(--sp-6) var(--sp-4);
}
.glance .props { display: block; padding: 0; }