zurich_kotak/src/layout/Shell.css
Yashas de8b158ca9 console: the nav navigates, and the screens act
"New lead" sat in the sidebar. A sidebar is for moving between places;
filing a lead is an action, and an action in a list of destinations is
the one item that does not behave like its neighbours — everything above
and below it changes what you are looking at, and it did something.

It now sits on the overview and on every queue, beside the lists it adds
to, which is also where somebody is standing when they realise they have
a lead to file. Same role gate as before: shown only to a user who holds
an entry door.

The sidebar's own button CSS went with it rather than being left for
someone to wonder about.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-08 18:31:07 +05:30

374 lines
8.9 KiB
CSS

.shell {
min-height: 100vh;
display: flex;
flex-direction: column;
background: var(--zk-tint);
}
/* ── Top bar ───────────────────────────────────────────────── */
.shell__top {
position: sticky;
top: 0;
z-index: 30;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
height: 66px;
padding: 0 28px;
background: rgba(255, 255, 255, 0.86);
backdrop-filter: saturate(180%) blur(14px);
-webkit-backdrop-filter: saturate(180%) blur(14px);
border-bottom: 1px solid var(--zk-line);
box-shadow: var(--sh-xs);
}
.shell__brand {
display: flex;
align-items: center;
gap: 16px;
min-width: 0;
}
.shell__brand img {
height: 30px;
width: auto;
display: block;
}
.shell__brandtext {
display: flex;
flex-direction: column;
gap: 1px;
line-height: 1.2;
padding-left: 16px;
border-left: 1px solid var(--zk-line);
}
.shell__brandtext strong {
font-size: 0.95rem;
font-weight: 500;
letter-spacing: -0.005em;
color: var(--zk-ink);
}
.shell__brandtext span {
font-size: 0.7rem;
font-weight: 400;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--zk-grey);
}
/* ── Body ──────────────────────────────────────────────────── */
.shell__body {
display: flex;
flex: 1;
min-height: 0;
align-items: stretch;
}
.shell__nav {
position: sticky;
top: 66px;
align-self: flex-start;
width: 264px;
flex: none;
min-height: calc(100vh - 66px);
max-height: calc(100vh - 66px);
overflow-y: auto;
overscroll-behavior: contain;
background: var(--zk-white);
border-right: 1px solid var(--zk-line);
padding: 20px 14px 32px;
display: flex;
flex-direction: column;
}
.shell__navlabel {
margin: 0 0 10px;
padding: 0 10px;
font-size: 0.64rem;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--zk-grey);
}
.shell__group + .shell__group {
margin-top: 22px;
}
/* The stage list is drawn as a rail with a node per state: the sidebar should
look like the pipeline it represents, not like a list of links. */
.shell__stages {
position: relative;
display: flex;
flex-direction: column;
gap: 2px;
}
.shell__stages::before {
content: '';
position: absolute;
left: 17px;
top: 18px;
bottom: 18px;
width: 2px;
border-radius: var(--r-pill);
background: linear-gradient(180deg, var(--zk-line) 0%, var(--zk-line-soft) 100%);
}
.shell__stage {
position: relative;
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
padding: 9px 12px 9px 38px;
border-radius: var(--r-md);
text-decoration: none;
color: var(--zk-muted);
font-size: 0.845rem;
transition: background var(--t-fast), color var(--t-fast), transform var(--t-fast);
}
.shell__stage::before {
content: '';
position: absolute;
left: 12px;
top: 50%;
width: 12px;
height: 12px;
margin-top: -6px;
border-radius: 50%;
background: var(--zk-white);
border: 2px solid var(--zk-line);
transition: border-color var(--t-fast), background var(--t-fast), box-shadow var(--t-fast);
}
.shell__stage:hover {
background: var(--zk-tint);
color: var(--zk-ink);
}
.shell__stage:hover::before {
border-color: var(--zk-blue-light);
}
.shell__stage.is-active {
background: var(--zk-tint-blue);
color: var(--zk-blue-dark);
font-weight: 500;
}
.shell__stage.is-active::before {
background: var(--zk-blue);
border-color: var(--zk-blue);
box-shadow: 0 0 0 4px rgba(33, 103, 174, 0.14);
}
/* Queues where the machine stops and a person decides. */
.shell__stage.is-needed .shell__stagename {
font-weight: 500;
color: var(--zk-ink);
}
.shell__stage.is-needed.is-active .shell__stagename {
color: var(--zk-blue-dark);
}
/* Stage names wrap rather than truncate: "Referred to Underwriting" is the one
queue a person has to find, and it is also the longest label. */
.shell__stagename {
min-width: 0;
line-height: 1.35;
}
.shell__main {
flex: 1;
min-width: 0;
width: 100%;
max-width: 1460px;
margin: 0 auto;
padding: 30px 34px 76px;
animation: zk-rise 0.28s var(--ease) both;
}
/* ── Narrow viewports: the rail lies down and scrolls ──────── */
@media (max-width: 900px) {
.shell__body {
flex-direction: column;
}
.shell__nav {
position: static;
width: 100%;
min-height: 0;
max-height: none;
border-right: 0;
border-bottom: 1px solid var(--zk-line);
padding: 14px 16px 16px;
}
.shell__stages {
flex-direction: row;
overflow-x: auto;
padding-bottom: 4px;
}
/* Laid out horizontally the stages are a scrolling strip of pills, and a rail
behind them would just be a line struck through the row. */
.shell__stages::before {
display: none;
}
.shell__stage {
padding: 8px 14px;
white-space: nowrap;
background: var(--zk-white);
border: 1px solid var(--zk-line);
}
.shell__stage::before {
display: none;
}
.shell__main {
padding: 22px 18px 56px;
}
}
/* The way back to the overview. It sits above "Add a lead" because reading
the book is the commoner act — most sessions start by looking, not filing. */
.shell__today {
display: block;
margin: 0 0 8px;
padding: 9px 12px;
border-radius: var(--r-sm);
font-size: 14px;
font-weight: 500;
color: var(--zk-ink);
text-decoration: none;
transition: background .12s, color .12s;
}
.shell__today:hover { background: var(--zk-tint); }
.shell__today.is-active { background: var(--zk-tint-blue); color: var(--zk-blue-dark); }
/* ── Queue tallies ─────────────────────────────────────────────────────────
Three numbers, deliberately unequal in weight, because they are unequal in
importance: what needs YOU, what an agent holds, and whether anything in
there is about to lapse. */
.shell__tally {
display: flex;
align-items: center;
gap: 6px;
flex: none;
}
/* What is waiting on a person. The only figure with full contrast. */
.shell__n {
min-width: 20px;
padding: 1px 6px;
border-radius: var(--r-pill);
text-align: center;
font-size: 0.74rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
color: var(--zk-blue-dark);
background: var(--zk-tint-blue);
}
/* Zero is shown, not hidden. "Nothing here" is an answer, and a queue that
disappears when it empties makes the sidebar move under the cursor. */
.shell__n.is-zero {
color: var(--zk-grey);
background: transparent;
font-weight: 400;
}
/* What an agent is carrying. Present, quiet, and never added to the badge —
it is in the queue, it is not your work. */
.shell__auto {
font-style: normal;
font-size: 0.7rem;
font-variant-numeric: tabular-nums;
color: var(--zk-blue-mid);
}
.shell__auto::after {
content: '·';
margin-left: 5px;
color: var(--zk-line);
}
/* A renewal inside a week sitting in this queue. */
.shell__urgent {
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--zk-amber);
flex: none;
}
.shell__stage.is-empty { color: var(--zk-grey); }
.shell__stage.is-empty::before { border-color: var(--zk-line-soft); }
.shell__stage.is-empty.is-needed .shell__stagename { color: var(--zk-muted); font-weight: 400; }
/* The one number worth carrying on a group heading: everything this role has
to clear, across its queues. */
.shell__navlabel {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
}
.shell__grouptally {
font-size: 0.68rem;
font-weight: 600;
letter-spacing: 0;
font-variant-numeric: tabular-nums;
color: var(--zk-white);
background: var(--zk-blue);
border-radius: var(--r-pill);
padding: 1px 7px;
}
/* ── Closed, folded ───────────────────────────────────────────────────────
Three of the twelve queues, opened about once a week. */
.shell__closed { margin-top: 22px; }
.shell__closed > summary {
display: flex;
align-items: center;
justify-content: space-between;
gap: 8px;
cursor: pointer;
list-style: none;
padding: 0 10px 10px;
font-size: 0.64rem;
font-weight: 500;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--zk-grey);
}
.shell__closed > summary::-webkit-details-marker { display: none; }
.shell__closed > summary:hover { color: var(--zk-muted); }
.shell__closed > summary b {
font-size: 0.72rem;
font-weight: 500;
letter-spacing: 0;
font-variant-numeric: tabular-nums;
color: var(--zk-grey);
}
.shell__closed > summary::after {
content: '';
order: -1;
width: 5px; height: 5px;
border-right: 1.5px solid currentColor;
border-bottom: 1.5px solid currentColor;
transform: rotate(-45deg);
transition: transform var(--t-fast);
}
.shell__closed[open] > summary::after { transform: rotate(45deg); }