/* ===========================================================================
   Carheel Workforce Platform — the shared workspace component library.

   This is the `.ps-*` set the Workspace Inheritance Contract
   (docs/architecture-decisions/0011-workspace-inheritance-contract.md, model 1)
   requires every workspace to inherit rather than reimplement. It was built
   inside Participant Success Management, which is why the class prefix is
   `ps-` and why it was served from /assets/participant-success.css until the
   Applicant Tracking System conformance pass. Nothing about it changed in the
   move except the path: the contract says a shared component is "extracted
   from Participant Success and used from both places — never copied and
   edited," and a file named for one workspace while two workspaces load it
   invites exactly the copy this rule exists to prevent.

   Loaded by participant-success.html and swlahec-candidates.html. Rules that
   belong to only one of them still live here and are marked; separating them
   is recorded conformance work, not a reason to fork the file.

   ADR-0010 and ADR-0011 name this file at its former path. An accepted ADR is
   not edited, so the reference there stays as written; this is the same file.
   =========================================================================== */

/* The approved Carheel Workforce Platform palette, the same values
   /assets/administration.css and /assets/portal.css already serve on Platform
   Home and Platform Management. This workspace previously carried a palette of
   its own — a dark green sidebar over a warm cream page — which read as a
   second product. Nothing here is a new colour: --ink, --charcoal, --orange and
   --line are copied from administration.css, and --green is kept only for the
   "on track / complete / verified" semantics the interface already relies on.
   --cream is the page surface (administration.css calls the same value --paper)
   and --paper is the raised card surface. */
:root{--orange:#e8420a;--orange-dark:#c73508;--ink:#17202a;--charcoal:#222c38;--charcoal-soft:#2b3745;--green:#197a59;--cream:#f1efe9;--paper:#ffffff;--muted:#717985;--line:#d8d6d0;--warning:#c38a1b;--danger:#b84335;--shadow:0 18px 45px rgba(23,32,42,.10)}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--cream);color:var(--ink);font-family:"Barlow",sans-serif;min-width:320px}
button,input,select{font:inherit}
button,a,select,input{outline-offset:3px}
button:focus-visible,a:focus-visible,select:focus-visible,input:focus-visible{outline:3px solid rgba(232,66,10,.35)}
.ps-auth-pending{visibility:hidden}
/* The hidden attribute has to win. This workspace hides and reveals containers
   that carry a layout display of their own (.ps-loading, .ps-filterbar), and an
   author display declaration outranks the user-agent [hidden]{display:none}
   rule — so setting element.hidden left the loading skeleton on screen over
   correctly rendered workspace data. Same guard portal.css carries. */
[hidden]{display:none!important}
/* Dark ink bar with a 3px orange underline — the identical treatment
   .admin-topbar carries on Platform Home and Platform Management. It was a pale
   cream bar here, which is why the logo looked broken: /assets/carheel-logo.png
   is a white wordmark drawn for dark surfaces, so on cream it was white on
   near-white. The asset and the wordmark are unchanged; only the surface behind
   them is corrected. */
.ps-topbar{position:sticky;top:0;z-index:40;min-height:76px;display:flex;align-items:center;justify-content:space-between;gap:24px;padding:0 28px;background:var(--ink);border-bottom:3px solid var(--orange);color:#fff}
.ps-brand{display:flex;align-items:center;gap:15px;color:#fff;text-decoration:none;font:800 22px/1 "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.3px}
.ps-brand img{height:40px;width:auto;object-fit:contain}.ps-brand small{display:block;margin-bottom:4px;color:var(--orange);font:700 10px/1 "Barlow",sans-serif;letter-spacing:1.5px}
.ps-top-actions{display:flex;align-items:center;gap:16px;font-size:13px}.ps-top-actions>span{color:#c6ccd3}.ps-top-actions>a{color:#fff;font-weight:700;text-decoration:none}.ps-top-actions>button{border:1px solid rgba(255,255,255,.45);background:transparent;color:#fff;padding:9px 13px;font-weight:700;cursor:pointer}.ps-top-actions>button:hover{background:rgba(255,255,255,.12)}.ps-menu-button{display:none}
.ps-layout{display:grid;grid-template-columns:264px minmax(0,1fr);min-height:calc(100vh - 76px)}
.ps-sidebar{position:sticky;top:76px;align-self:start;height:calc(100vh - 76px);overflow:auto;background:var(--charcoal);color:#fff;padding:28px 18px}
.ps-program-block{padding:0 8px 23px;border-bottom:1px solid rgba(255,255,255,.13)}.ps-program-block label{display:block;margin-bottom:9px;font-size:10px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;color:#b9c0c8}.ps-program-block select{width:100%;border:1px solid rgba(255,255,255,.24);background:var(--charcoal-soft);color:#fff;padding:11px 10px;border-radius:4px}
.ps-sidebar nav{display:grid;gap:3px;margin-top:20px}.ps-sidebar nav a{display:flex;align-items:center;min-height:44px;padding:10px 12px;color:#d8dde2;text-decoration:none;border-left:3px solid transparent;font-size:14px;font-weight:600;transition:background .18s ease,transform .18s ease}.ps-sidebar nav a:hover,.ps-sidebar nav a.active{background:rgba(255,255,255,.09);border-left-color:var(--orange);color:#fff;transform:translateX(2px)}
.ps-nav-group{margin:18px 0 4px;padding:0 12px;font-size:10px;font-weight:800;letter-spacing:1.4px;text-transform:uppercase;color:#9aa3ae}.ps-nav-group:first-child{margin-top:0}
.ps-access-note{display:grid;gap:5px;margin:26px 8px 0;padding:17px 0;border-top:1px solid rgba(255,255,255,.13)}.ps-access-note strong{font-size:11px;text-transform:uppercase;letter-spacing:1px}.ps-access-note span{color:#b9c0c8;font-size:12px;line-height:1.5}
.ps-main{min-width:0;padding:42px clamp(20px,4vw,64px) 70px}.ps-main h1,.ps-main h2,.ps-main h3{font-family:"Barlow Condensed",sans-serif;text-transform:uppercase;margin:0;line-height:.96}.eyebrow{margin:0 0 10px;color:var(--orange);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:1.7px}

.ps-view{padding-top:44px}.ps-section-heading{display:flex;align-items:end;justify-content:space-between;gap:20px;margin-bottom:22px}.ps-section-heading h2{font-size:clamp(40px,5vw,62px)}.ps-collapse,.ps-back{border:0;background:transparent;color:var(--charcoal);font-weight:800;text-transform:uppercase;letter-spacing:.8px;font-size:11px;cursor:pointer;padding:9px 0}
.ps-metrics{display:grid;grid-template-columns:repeat(12,1fr);gap:12px}.ps-metric{grid-column:span 3;min-height:150px;display:flex;flex-direction:column;justify-content:space-between;padding:22px;background:var(--paper);border:1px solid var(--line);border-top:3px solid var(--charcoal)}.ps-metric:nth-child(1),.ps-metric:nth-child(6){grid-column:span 6;background:var(--charcoal);color:#fff;border-color:var(--charcoal)}.ps-metric.alert{border-top-color:var(--danger)}.ps-metric.monitor{border-top-color:var(--warning)}.ps-metric strong{font:900 48px "Barlow Condensed",sans-serif}.ps-metric span{max-width:170px;color:var(--muted);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:1px;line-height:1.35}.ps-metric:nth-child(1) span,.ps-metric:nth-child(6) span{color:#b9c0c8}
.ps-overview-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:16px;margin-top:16px}.ps-panel{min-height:230px;padding:28px;background:var(--paper);border:1px solid var(--line)}.ps-panel-dark{background:var(--ink);color:#fff;border-color:var(--ink)}.ps-panel h3{font-size:32px;margin-bottom:18px}.ps-panel p:not(.eyebrow){color:var(--muted);line-height:1.6}.ps-panel-dark p:not(.eyebrow){color:#c6ccd3}.ps-priority-item{display:flex;justify-content:space-between;gap:20px;padding:12px 0;border-top:1px solid rgba(255,255,255,.13)}.ps-priority-item strong{font:800 24px "Barlow Condensed",sans-serif}.ps-badge{display:inline-flex;align-items:center;width:max-content;padding:6px 9px;border-radius:999px;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}.ps-badge.green{background:#d8ece3;color:#14624a}.ps-badge.yellow{background:#f5e8c5;color:#79520e}.ps-badge.red{background:#f0d5d1;color:#892d24}.ps-badge.neutral{background:#e7e8ea;color:#4a5260}
.ps-filterbar{display:grid;grid-template-columns:minmax(220px,2fr) repeat(3,minmax(135px,1fr));gap:12px;padding:16px;background:var(--paper);border:1px solid var(--line);margin-bottom:15px}.ps-filterbar label{display:grid;gap:7px}.ps-filterbar label>span{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:1px;color:var(--muted)}.ps-filterbar input,.ps-filterbar select{width:100%;min-height:44px;border:1px solid var(--line);background:#fff;padding:10px 12px;color:var(--ink)}.ps-count{font:800 22px "Barlow Condensed",sans-serif;color:var(--green);text-transform:uppercase}
.ps-roster{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.ps-participant-card{display:grid;grid-template-columns:62px minmax(0,1fr);gap:16px;padding:21px;background:var(--paper);border:1px solid var(--line);border-left:4px solid var(--green);cursor:pointer;transition:transform .18s ease,box-shadow .18s ease}.ps-participant-card:hover{transform:translateY(-2px);box-shadow:var(--shadow)}.ps-participant-card.risk-yellow{border-left-color:var(--warning)}.ps-participant-card.risk-red{border-left-color:var(--danger)}.ps-avatar{display:grid;place-items:center;width:62px;height:62px;background:var(--charcoal);color:#fff;border-radius:50%;font:800 22px "Barlow Condensed",sans-serif}.ps-card-head{display:flex;align-items:start;justify-content:space-between;gap:12px}.ps-card-head h3{font-size:25px;text-transform:none}.ps-card-subtitle{margin:5px 0 13px;color:var(--muted);font-size:13px}.ps-card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;border-top:1px solid var(--line);padding-top:13px}.ps-card-grid span{display:block;color:var(--muted);font-size:9px;text-transform:uppercase;letter-spacing:.8px}.ps-card-grid strong{display:block;margin-top:3px;font-size:12px;overflow-wrap:anywhere}.ps-card-footer{display:flex;flex-wrap:wrap;gap:7px;margin-top:14px}
.ps-empty{grid-column:1/-1;padding:56px 24px;text-align:center;background:var(--paper);border:1px dashed #b4b2ac}.ps-empty h3{font-size:34px}.ps-empty p{color:var(--muted)}
.ps-profile-hero{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:28px;align-items:start;padding:32px;background:var(--charcoal);color:#fff;border-top:5px solid var(--orange)}.ps-profile-identity{display:flex;gap:20px;align-items:center}.ps-profile-identity .ps-avatar{width:82px;height:82px;background:var(--orange);font-size:30px}.ps-profile-hero h1{font-size:clamp(44px,6vw,72px);text-transform:none}.ps-profile-hero p{margin:8px 0 0;color:#b9c0c8}.ps-profile-nav{display:flex;gap:9px}.ps-profile-nav button{border:1px solid rgba(255,255,255,.34);background:transparent;color:#fff;padding:10px 13px;cursor:pointer}.ps-profile-sections{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px;margin-top:14px}.ps-profile-section{background:var(--paper);border:1px solid var(--line)}.ps-profile-section h2{font-size:27px}.ps-profile-content{padding:0 21px 22px}.ps-detail-list{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:15px}.ps-detail-list div{border-top:1px solid var(--line);padding-top:11px}.ps-detail-list span{display:block;color:var(--muted);font-size:9px;text-transform:uppercase;letter-spacing:.8px}.ps-detail-list strong{display:block;margin-top:4px;font-size:13px;overflow-wrap:anywhere}.ps-decision-notice{grid-column:1/-1;padding:20px 22px;background:#fff4e8;border-left:4px solid var(--orange)}
.ps-placeholder{padding:clamp(30px,6vw,70px);background:var(--paper);border-top:5px solid var(--orange)}.ps-placeholder h2{max-width:800px;font-size:clamp(50px,8vw,94px)}.ps-placeholder>p:not(.eyebrow){max-width:720px;color:var(--muted);font-size:17px;line-height:1.65}.ps-phase-line{display:grid;grid-template-columns:repeat(4,1fr);margin-top:42px;border-top:1px solid var(--line)}.ps-phase-line span{padding:15px 12px;border-right:1px solid var(--line);font-size:11px;font-weight:800;text-transform:uppercase}.ps-phase-line span:last-child{border:0}
.ps-error{max-width:760px;margin:10vh auto;padding:42px;background:var(--paper);border-top:5px solid var(--danger);box-shadow:var(--shadow)}.ps-error h1{font-size:55px}.ps-error p:not(.eyebrow){color:var(--muted);line-height:1.6}.ps-error a{display:inline-block;margin-top:12px;background:var(--charcoal);color:#fff;padding:12px 16px;text-decoration:none;font-weight:800}
.ps-loading{display:grid;gap:16px}.skeleton{min-height:150px;background:linear-gradient(90deg,#e4e1da 25%,#f6f4ef 50%,#e4e1da 75%);background-size:200% 100%;animation:shimmer 1.25s infinite}.hero-skeleton{min-height:330px}.skeleton-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}@keyframes shimmer{to{background-position:-200% 0}}
@media(max-width:1100px){.ps-layout{grid-template-columns:224px minmax(0,1fr)}.ps-sidebar{padding-left:12px;padding-right:12px}.ps-metric{grid-column:span 4}.ps-metric:nth-child(1),.ps-metric:nth-child(6){grid-column:span 6}.ps-roster{grid-template-columns:1fr}.ps-filterbar{grid-template-columns:repeat(2,1fr)}.ps-search{grid-column:1/-1}}
@media(max-width:780px){.ps-topbar{min-height:68px;padding:0 15px}.ps-brand{font-size:18px}.ps-brand img{height:32px}.ps-top-actions>span,.ps-top-actions>a{display:none}.ps-menu-button{display:block!important}.ps-layout{display:block}.ps-sidebar{position:fixed;inset:68px auto 0 0;z-index:35;width:min(86vw,310px);height:auto;transform:translateX(-102%);transition:transform .22s ease;box-shadow:20px 0 50px rgba(0,0,0,.2)}.ps-sidebar.open{transform:translateX(0)}.ps-main{padding:24px 16px 55px}.ps-metrics{grid-template-columns:repeat(2,1fr)}.ps-metric,.ps-metric:nth-child(1),.ps-metric:nth-child(6){grid-column:span 1}.ps-overview-grid,.ps-profile-sections{grid-template-columns:1fr}.ps-profile-hero{grid-template-columns:1fr}.ps-profile-nav{justify-content:flex-start}.ps-phase-line{grid-template-columns:1fr 1fr}.ps-phase-line span:nth-child(2){border-right:0}.ps-profile-identity{align-items:flex-start}.ps-profile-identity .ps-avatar{width:64px;height:64px;flex:0 0 64px}}
@media(max-width:500px){.ps-brand{min-width:0}.ps-brand span{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ps-top-actions{gap:7px}.ps-top-actions>button{padding:8px 9px}.ps-brand small{display:none}.ps-main{padding-left:12px;padding-right:12px}.ps-section-heading{align-items:flex-start;flex-direction:column}.ps-metrics{grid-template-columns:1fr}.ps-filterbar{grid-template-columns:1fr}.ps-search{grid-column:auto}.ps-participant-card{grid-template-columns:48px minmax(0,1fr);padding:17px;gap:12px}.ps-avatar{width:48px;height:48px;font-size:18px}.ps-card-head{display:block}.ps-card-head .ps-badge{margin-top:8px}.ps-card-grid{grid-template-columns:1fr 1fr}.ps-card-grid>div:last-child{grid-column:1/-1}.ps-profile-identity{display:grid}.ps-detail-list{grid-template-columns:1fr}.ps-phase-line{grid-template-columns:1fr}.ps-phase-line span{border-right:0}.ps-error{margin:4vh auto;padding:28px 22px}.ps-error h1{font-size:43px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important;animation:none!important;transition:none!important}}
.ps-dashboard-roster{margin-top:34px;padding-top:32px;border-top:1px solid var(--line);scroll-margin-top:92px}.ps-heading-actions{display:flex;align-items:center;gap:14px;flex-wrap:wrap;justify-content:flex-end}.ps-filterbar{grid-template-columns:minmax(220px,2fr) repeat(5,minmax(130px,1fr))}.ps-migration-counts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;margin:18px 0;background:var(--line);border:1px solid var(--line)}.ps-migration-counts div{background:#fff;padding:11px}.ps-migration-counts span{display:block;color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}.ps-migration-counts strong{display:block;margin-top:4px;font:800 18px "Barlow Condensed",sans-serif}.ps-card-grid{grid-template-columns:repeat(4,1fr)}.ps-profile-link{margin-left:auto;color:var(--charcoal);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.5px}.ps-module-view{padding:clamp(30px,6vw,70px);background:var(--paper);border-top:5px solid var(--orange)}.ps-module-view h2{max-width:800px;font-size:clamp(50px,8vw,94px)}.ps-module-view>p:not(.eyebrow){max-width:760px;color:var(--muted);font-size:17px;line-height:1.65}.ps-module-filter{max-width:760px;margin-top:24px;padding:16px 18px;background:#fff;border:1px solid var(--line);border-left:4px solid var(--orange)}.ps-module-filter p{margin:0;color:var(--muted);font-size:13px;line-height:1.6}.ps-module-filter strong{color:var(--charcoal)}.ps-module-status{max-width:760px;margin-top:28px;padding:24px;background:#fff;border:1px solid var(--line)}.ps-module-status p{margin:14px 0 0;color:var(--muted);line-height:1.6}.ps-module-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}.ps-module-actions a{padding:12px 16px;background:var(--charcoal);color:#fff;text-decoration:none;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
@media(max-width:1350px){.ps-filterbar{grid-template-columns:repeat(3,minmax(0,1fr))}.ps-search{grid-column:span 3}}
@media(max-width:780px){.ps-heading-actions{justify-content:flex-start}.ps-filterbar{grid-template-columns:repeat(2,minmax(0,1fr))}.ps-search{grid-column:1/-1}.ps-card-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:500px){.ps-filterbar{grid-template-columns:1fr}.ps-search{grid-column:auto}.ps-migration-counts{grid-template-columns:1fr}.ps-card-grid{grid-template-columns:1fr 1fr}.ps-profile-link{width:100%;margin-left:0}}

/* Epic 2 core workspace */
textarea{font:inherit}textarea:focus-visible{outline:3px solid rgba(232,66,10,.35);outline-offset:3px}
.ps-metric.blue{border-top-color:#356da8}.ps-metric.muted{border-top-color:#7b8290}
.ps-operations-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;margin-top:24px}.ps-operations-grid .ps-panel{min-height:320px}.ps-panel-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:18px;margin-bottom:18px}.ps-panel-heading h3,.ps-quick-panel h3{font-size:30px}.ps-panel-count{display:grid;place-items:center;min-width:42px;height:42px;padding:0 10px;border:1px solid currentColor;font:800 20px "Barlow Condensed",sans-serif}.ps-activity-list{display:grid;gap:1px;background:rgba(23,32,42,.12)}.ps-panel-dark .ps-activity-list{background:rgba(255,255,255,.12)}.ps-activity-row{width:100%;display:grid;grid-template-columns:10px minmax(0,1fr) auto;align-items:center;gap:12px;min-height:67px;padding:12px;border:0;background:var(--paper);color:var(--ink);text-align:left;cursor:pointer}.ps-panel-dark .ps-activity-row{background:var(--charcoal-soft);color:#fff}.ps-activity-row:hover{filter:brightness(.97)}.ps-activity-row>span:nth-child(2){display:grid;gap:3px}.ps-activity-row strong{font-size:13px}.ps-activity-row small{color:var(--muted);font-size:11px}.ps-panel-dark .ps-activity-row small{color:#b9c0c8}.ps-activity-row time{max-width:120px;color:var(--muted);font-size:10px;font-weight:700;text-align:right}.ps-panel-dark .ps-activity-row time{color:#c6ccd3}.ps-activity-mark{width:8px;height:30px;background:var(--charcoal)}.ps-activity-mark.warning{background:var(--warning)}.ps-activity-mark.success{background:var(--green)}.ps-list-empty{min-height:180px;display:grid;place-content:center;justify-items:center;gap:8px;padding:20px;text-align:center;background:rgba(255,255,255,.05)}.ps-list-empty span{color:var(--orange);font:800 36px "Barlow Condensed",sans-serif}.ps-list-empty p{max-width:320px;margin:0;color:var(--muted);line-height:1.5}.ps-panel-dark .ps-list-empty p{color:#c6ccd3}.ps-quick-panel{background:linear-gradient(145deg,#ffffff,#f4e6dc)}.ps-quick-actions{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;margin-top:24px}.ps-quick-actions a,.ps-quick-actions button{display:flex;align-items:center;justify-content:center;min-height:58px;padding:12px;border:1px solid var(--charcoal);background:transparent;color:var(--charcoal);font-size:11px;font-weight:800;text-align:center;text-decoration:none;text-transform:uppercase;letter-spacing:.6px;cursor:pointer}.ps-quick-actions a:first-child,.ps-quick-actions button:hover,.ps-quick-actions a:hover{background:var(--charcoal);color:#fff}
.ps-filterbar{grid-template-columns:minmax(230px,2fr) repeat(4,minmax(140px,1fr))}.ps-filter-actions{display:flex;align-items:end}.ps-filter-actions button{width:100%;min-height:43px;border:1px solid var(--charcoal);background:transparent;color:var(--charcoal);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}.ps-roster-loading{margin:10px 0;padding:12px 15px;border-left:3px solid var(--orange);background:#fff4e8;color:var(--ink);font-size:12px;font-weight:700}.ps-card-body{min-width:0}.ps-card-badges,.ps-profile-badges{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:6px}.ps-badge.blue{background:#e5eff9;color:#285d91}.ps-card-grid{grid-template-columns:repeat(4,minmax(0,1fr))}.ps-card-grid>div{min-width:0}.ps-card-grid strong{overflow-wrap:anywhere}.ps-pagination{display:flex;align-items:center;justify-content:center;gap:18px;margin-top:24px}.ps-pagination button{min-height:42px;padding:8px 16px;border:1px solid var(--charcoal);background:var(--charcoal);color:#fff;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;cursor:pointer}.ps-pagination button:disabled{opacity:.35;cursor:not-allowed}.ps-pagination span{color:var(--muted);font-size:12px}
.ps-profile-loading{display:grid;gap:14px}.ps-profile-loading .skeleton{min-height:220px}.ps-profile-actions{position:sticky;top:92px;z-index:20;display:flex;flex-wrap:wrap;gap:8px;margin:15px 0 18px;padding:12px;background:rgba(241,239,233,.94);border:1px solid var(--line);backdrop-filter:blur(12px)}.ps-profile-actions button,.ps-profile-actions a{display:inline-flex;align-items:center;justify-content:center;min-height:40px;padding:8px 14px;border:1px solid var(--charcoal);background:var(--paper);color:var(--charcoal);font-size:10px;font-weight:800;text-decoration:none;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}.ps-profile-actions button:nth-child(2){background:var(--orange);border-color:var(--orange);color:#fff}.ps-profile-actions button:disabled,.ps-profile-actions [aria-disabled=true]{opacity:.45;pointer-events:none}.ps-profile-stack{display:grid;gap:15px}.ps-profile-section{scroll-margin-top:155px}.ps-profile-content{padding:0 22px 24px}.ps-notes-toolbar{display:flex;justify-content:space-between;gap:12px;padding-bottom:15px;border-bottom:1px solid var(--line)}.ps-notes-toolbar span{font-weight:800}.ps-notes-toolbar small{color:var(--muted)}.ps-note-list{display:grid;gap:12px;margin-top:15px}.ps-note-card{position:relative;display:grid;grid-template-columns:5px minmax(0,1fr);overflow:hidden;background:#fff;border:1px solid var(--line);border-radius:7px}.ps-note-accent{background:var(--orange)}.ps-note-main{padding:18px}.ps-note-head{display:flex;align-items:flex-start;justify-content:space-between;gap:15px}.ps-note-head>div{display:flex;align-items:center;flex-wrap:wrap;gap:9px}.ps-note-head>span{color:var(--muted);font-size:11px}.ps-note-main>p{margin:18px 0;color:#2f3a46;line-height:1.65;overflow-wrap:anywhere}.ps-note-meta{display:flex;flex-wrap:wrap;gap:8px}.ps-note-meta span{padding:6px 8px;background:var(--cream);color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.5px}.ps-note-form label{display:grid;gap:7px}.ps-note-form label>span{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}.ps-form-grid{display:grid;grid-template-columns:minmax(200px,.5fr) minmax(0,1.5fr);gap:16px}.ps-note-form select,.ps-note-form input,.ps-note-form textarea{width:100%;border:1px solid var(--line);background:#fff;padding:12px;color:var(--ink)}.ps-note-text{grid-row:span 3}.ps-check{display:flex!important;grid-template-columns:auto 1fr!important;align-items:center;align-self:start}.ps-check input{width:18px;height:18px}.ps-form-actions{display:flex;align-items:center;justify-content:space-between;gap:15px;margin-top:16px}.ps-form-actions p{margin:0;color:var(--muted);font-size:12px}.ps-primary{min-height:44px;padding:9px 20px;border:0;background:var(--orange);color:#fff;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}.ps-inline-notice{padding:20px;border-left:4px solid var(--warning);background:#fff8e8}.ps-inline-notice p{margin:7px 0 0;color:var(--muted);line-height:1.55}.ps-snapshot-list{display:grid;gap:12px}.ps-snapshot-card{padding:18px;background:#fff;border:1px solid var(--line)}.ps-snapshot-head{display:flex;align-items:flex-start;justify-content:space-between;gap:15px;margin-bottom:18px}.ps-snapshot-head h3{font-size:28px}.ps-task-board{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.ps-task-column{padding:14px;background:var(--cream);border-top:3px solid var(--charcoal)}.ps-task-column.overdue{border-top-color:var(--danger)}.ps-task-column.completed{border-top-color:var(--green)}.ps-task-heading{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}.ps-task-heading h3{font-size:22px}.ps-task-heading span{display:grid;place-items:center;width:28px;height:28px;background:#fff;font-weight:800}.ps-task-column article{display:grid;gap:5px;padding:12px;background:#fff;border-bottom:1px solid var(--line)}.ps-task-column article span,.ps-task-column article small,.ps-task-column>p{color:var(--muted);font-size:11px}.ps-task-column>p{margin:0;padding:12px;background:#fff}.ps-empty{grid-column:1/-1}
/* Participant Profile record tables, section notices, and the in-place profile
   failure state. A profile that cannot load reports the reason where the
   profile would have been instead of blanking the workspace. */
.ps-record-table{width:100%;margin-top:4px;border-collapse:collapse;background:#fff;border:1px solid var(--line);font-size:12px}.ps-record-table th{padding:10px 12px;background:var(--cream);color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;text-align:left;white-space:nowrap}.ps-record-table td{padding:11px 12px;border-top:1px solid var(--line);color:#2f3a46;line-height:1.5;overflow-wrap:anywhere}.ps-record-table tbody tr:nth-child(even) td{background:rgba(23,32,42,.02)}.ps-subhead{margin:22px 0 10px;font:800 20px "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.6px}.ps-profile-content>.ps-inline-notice{margin-top:16px}.ps-inline-warning{border-left-color:var(--danger);background:#fdefec}.ps-profile-stack>.ps-inline-warning{margin:0}.ps-profile-failure{padding:clamp(28px,5vw,56px);background:var(--paper);border-top:5px solid var(--danger)}.ps-profile-failure h1{max-width:760px;font-size:clamp(38px,6vw,64px)}.ps-profile-failure>p:not(.eyebrow){max-width:720px;color:var(--muted);font-size:16px;line-height:1.6}.ps-profile-failure .ps-module-actions button{padding:12px 16px;border:1px solid var(--charcoal);background:var(--charcoal);color:#fff;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}.ps-profile-failure .ps-module-actions button+button{background:transparent;color:var(--charcoal)}
@media(max-width:1200px){.ps-card-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.ps-profile-hero{grid-template-columns:1fr auto}.ps-profile-summary{grid-column:1/-1;grid-template-columns:repeat(5,minmax(0,1fr))}}
@media(max-width:980px){.ps-operations-grid{grid-template-columns:1fr}.ps-filterbar{grid-template-columns:repeat(3,minmax(0,1fr))}.ps-search{grid-column:span 3}.ps-card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.ps-profile-summary{grid-template-columns:repeat(3,minmax(0,1fr))}.ps-task-board{grid-template-columns:1fr}.ps-form-grid{grid-template-columns:1fr}.ps-note-text{grid-row:auto}}
@media(max-width:780px){.ps-operations-grid .ps-panel{min-height:auto}.ps-profile-actions{top:78px;overflow-x:auto;flex-wrap:nowrap}.ps-profile-actions button,.ps-profile-actions a{flex:0 0 auto}.ps-note-head{display:grid}.ps-note-head>span{text-align:left}.ps-task-board{grid-template-columns:1fr}}
@media(max-width:500px){.ps-quick-actions{grid-template-columns:1fr}.ps-activity-row{grid-template-columns:8px minmax(0,1fr)}.ps-activity-row time{grid-column:2;text-align:left}.ps-card-badges,.ps-profile-badges{justify-content:flex-start}.ps-card-grid{grid-template-columns:1fr}.ps-profile-actions{margin-left:-4px;margin-right:-4px}.ps-note-main{padding:15px}.ps-note-meta{display:grid}.ps-form-actions{align-items:stretch;flex-direction:column}.ps-primary{width:100%}.ps-snapshot-head{display:grid}.ps-pagination{justify-content:space-between;gap:8px}.ps-pagination button{padding:8px 10px}.ps-pagination span{font-size:10px}}

/* Administration modules — organizations, programs, cohorts, participant import */
.ps-admin{display:grid;gap:20px}
.ps-admin-head{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;flex-wrap:wrap;padding-bottom:16px;border-bottom:3px solid var(--ink)}
.ps-admin-head h2{margin:4px 0 8px;font:800 clamp(38px,6vw,64px)/.95 "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:-.5px}
.ps-admin-head>div:first-child>p:not(.eyebrow){max-width:720px;margin:0;color:var(--muted);font-size:15px;line-height:1.6}
.ps-admin-head-actions{display:flex;gap:10px;flex-wrap:wrap}
.ps-admin-hint{max-width:820px;margin:0;color:var(--muted);font-size:13px;line-height:1.6}
.ps-admin-form{padding:22px;background:var(--paper);border:1px solid var(--line);box-shadow:var(--shadow)}
.ps-admin-form h3,.ps-admin-form h4{margin:0 0 6px;font:800 22px "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.5px}
.ps-admin-form summary{cursor:pointer;list-style:none}
.ps-admin-form summary h3{display:inline-block}
.ps-admin-danger{margin-top:22px;padding:18px;border-top:1px solid var(--line);border-left:4px solid var(--danger);background:#fdefec}
.ps-admin-danger p{margin:6px 0 0;color:var(--muted);font-size:13px;line-height:1.6}
.ps-danger-button{min-height:40px;margin-top:14px;padding:9px 18px;border:1px solid var(--danger);background:transparent;color:var(--danger);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-danger-button:hover{background:var(--danger);color:#fff}
.ps-danger-button:disabled{opacity:.45;pointer-events:none}
.ps-admin-confirm{margin-top:14px;padding:14px;background:#fff;border:1px solid var(--danger)}
/* The replacement ladder. A production commit is not styled like an import button. */
.ps-replacement-step{margin-top:16px}
.ps-replacement-step.ps-destructive{border-left:4px solid var(--danger);background:#fffaf9}
.ps-replacement-step.ps-destructive h3{color:var(--danger)}
.ps-admin-confirm p{margin:0;color:var(--ink)}
.ps-admin-confirm span{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-top:10px}
.ps-admin-grid,.ps-source-options{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px;margin-top:14px}
.ps-admin-field{display:grid;gap:5px}
.ps-admin-field.ps-admin-wide{grid-column:1/-1}
.ps-admin-field>span{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-admin-field input,.ps-admin-field select,.ps-admin-field textarea{width:100%;min-height:42px;padding:10px 11px;border:1px solid var(--line);background:#fff;color:var(--ink);font-family:inherit;font-size:13px}
.ps-admin-field textarea{min-height:80px;resize:vertical}
.ps-link-button{min-height:38px;padding:8px 14px;border:1px solid var(--line);background:#fff;color:var(--ink);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;cursor:pointer}
.ps-link-button:hover{border-color:var(--ink)}
.ps-tabs{display:flex;gap:6px;flex-wrap:wrap;padding-bottom:4px;border-bottom:1px solid var(--line)}
.ps-tab{min-height:40px;padding:9px 15px;border:1px solid transparent;border-bottom:0;background:transparent;color:var(--muted);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;cursor:pointer}
.ps-tab.active{background:var(--paper);border-color:var(--line);color:var(--ink);box-shadow:inset 0 3px 0 var(--orange)}
.ps-summary-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px;margin:16px 0}
.ps-summary-tile{padding:14px;background:var(--paper);border:1px solid var(--line);border-left:4px solid var(--line)}
.ps-summary-tile span{display:block;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-summary-tile strong{display:block;margin-top:6px;font:800 32px "Barlow Condensed",sans-serif}
.ps-summary-tile small{display:block;margin-top:5px;color:var(--muted);font-size:11px;line-height:1.45}
.ps-summary-tile.good{border-left-color:var(--green)}
.ps-summary-tile.warn{border-left-color:var(--warning)}
.ps-summary-tile.bad{border-left-color:var(--danger)}
.ps-checkbox-group>small{margin:2px 0 0}
.ps-checkbox-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:7px;margin-top:8px}
.ps-checkbox{display:flex;align-items:center;gap:9px;min-height:40px;padding:8px 11px;border:1px solid var(--line);background:#fff;cursor:pointer}
.ps-checkbox:hover{border-color:var(--charcoal)}
.ps-checkbox input{width:16px;min-height:0;height:16px;margin:0;flex:none;accent-color:var(--charcoal)}
.ps-checkbox span{color:var(--ink);font-size:12px;font-weight:600;line-height:1.35}
.ps-domain-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px;margin:16px 0}
.ps-domain{display:grid;gap:6px;align-content:start;padding:13px;background:var(--paper);border:1px solid var(--line);border-left:4px solid var(--line)}
.ps-domain.active{border-left-color:var(--green)}
.ps-domain strong{font:800 19px "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.5px}
.ps-domain small{color:var(--muted);font-size:11px;line-height:1.45}
.ps-record-table code{font-size:11px;overflow-wrap:anywhere}
.ps-record-table tbody tr.ps-row-review td{background:#fff8e8}
.ps-preview-banner{padding:15px 18px;background:#eaf3ef;border-left:4px solid var(--green);color:#1f3346;font-size:13px;line-height:1.55}
.ps-preview-list{display:grid;gap:10px}
.ps-preview-row{padding:15px 17px;background:var(--paper);border:1px solid var(--line);border-left:4px solid var(--line)}
.ps-preview-row.create{border-left-color:var(--green)}
.ps-preview-row.update{border-left-color:#3a6ea8}
.ps-preview-row.hold{border-left-color:var(--warning)}
.ps-preview-row.fail{border-left-color:var(--danger)}
.ps-preview-row.skip{border-left-color:var(--line)}
.ps-preview-row header{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap}
.ps-preview-row header small{display:block;margin-top:3px;color:var(--muted);font-size:11px}
.ps-preview-row header>div:last-child{display:flex;gap:6px;flex-wrap:wrap}
.ps-preview-match,.ps-preview-reason{margin:9px 0 0;color:var(--muted);font-size:12px;line-height:1.55}
.ps-change-list,.ps-issue-list{margin:9px 0 0;padding-left:18px;font-size:12px;line-height:1.7}
.ps-issue-list li.error{color:var(--danger)}
.ps-issue-list li.warning{color:#8a6210}
.ps-row-decision{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:11px;padding-top:11px;border-top:1px dashed var(--line)}
.ps-row-decision span{color:var(--muted);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.6px}
.ps-row-decision select{min-height:38px;padding:8px 10px;border:1px solid var(--line);background:#fff;font-family:inherit;font-size:12px}
.ps-commit-bar{padding:18px;background:var(--paper);border:1px solid var(--line);border-top:4px solid var(--orange)}
.ps-record-table select{width:100%;min-height:38px;padding:7px 9px;border:1px solid var(--line);background:#fff;font-family:inherit;font-size:12px}
@media(max-width:820px){.ps-admin-head{display:grid}.ps-admin-head-actions .ps-primary{width:100%}.ps-tabs{overflow-x:auto;flex-wrap:nowrap}.ps-preview-row header{display:grid}}

/* ---------------------------------------------------------------------------
   Counselor workflow optimization.

   The workspace used to open with a full-viewport hero and six large metric
   tiles, which pushed the participant roster below the fold on every screen
   size. The rules below replace that opening with a compact workspace header
   and put search first; the executive panels are all still present, moved into
   collapsed summary regions that expand on demand.
   --------------------------------------------------------------------------- */
.ps-workspace-header{display:grid;gap:9px;padding:22px 26px;background:var(--paper);border-top:4px solid var(--orange);box-shadow:var(--shadow)}
.ps-workspace-header h1{font-size:clamp(30px,3.6vw,42px);letter-spacing:-.4px;line-height:1}
.ps-workspace-header h1 span{color:var(--orange)}
.ps-workspace-header>p{max-width:640px;margin:0;color:var(--muted);font-size:14px;line-height:1.5}
.ps-review-notice{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin:2px 0 0;padding-left:12px;border-left:3px solid var(--orange)}
.ps-review-notice strong{font:800 12px/1.3 "Barlow",sans-serif;text-transform:uppercase;letter-spacing:.9px}
.ps-review-notice span{color:var(--muted);font-size:12px;line-height:1.4}

/* Roster first. The filter bar is one compact toolbar row and it scrolls with
   the page — nothing here is pinned, so a card never travels under a fixed
   panel (ADR-0014). Multi-valued filters collapse into a menu and report what
   they hold back as removable chips, which is what keeps the bar one row tall
   without hiding the selection. */
.ps-view{padding-top:26px}
.ps-roster-heading{margin-bottom:14px}
/* The filtered-view statement, directly under the roster heading. It is amber
   rather than quiet grey on purpose: it is the difference between a reader
   believing records are missing and a reader knowing they are filtered. Drawn
   only while something is narrowing the roster. */
.ps-roster-filter-state{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:0 0 14px;padding:10px 14px;background:#fdf6e8;border-left:3px solid var(--orange);color:var(--ink);font-size:12.5px;line-height:1.5}
.ps-roster-filter-state[hidden]{display:none!important}
.ps-roster-filter-text{flex:1 1 320px}
.ps-roster-filter-state .ps-link-action{min-height:0;padding:5px 2px;border:0;background:transparent;color:var(--charcoal);font-size:11px;font-weight:700;text-decoration:underline;cursor:pointer}
.ps-roster-filter-state .ps-link-action:hover{color:var(--danger)}
.ps-searchbar{padding:14px 16px;background:var(--paper);border:1px solid var(--line);border-top:3px solid var(--orange)}
.ps-toolbar-row{display:grid;grid-template-columns:minmax(230px,2.4fr) repeat(4,minmax(140px,1fr));gap:10px;align-items:end}
.ps-searchbar label,.ps-round-field>span{display:block;margin-bottom:5px;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:1px}
.ps-searchbar input,.ps-searchbar select{width:100%;min-height:40px;padding:9px 11px;border:1px solid var(--line);background:#fff;font-family:inherit;font-size:13px;color:var(--ink)}
.ps-searchbar input:focus-visible,.ps-searchbar select:focus-visible{outline:3px solid var(--orange);outline-offset:1px}

/* The scholarship round control. A disclosure button over a checkbox group:
   one round or many, keyboard reachable, and never a tall native multi-select
   sitting open in the toolbar. The two presets live inside it because they set
   rounds — they are not page-level actions. */
.ps-round-field{position:relative}
.ps-round-menu{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;min-height:40px;padding:9px 11px;border:1px solid var(--line);background:#fff;font-family:inherit;font-size:13px;font-weight:700;color:var(--ink);text-align:left;cursor:pointer}
.ps-round-menu:focus-visible{outline:3px solid var(--orange);outline-offset:1px}
.ps-round-menu[aria-expanded="true"]{border-color:var(--charcoal)}
.ps-round-menu i{flex:none;width:0;height:0;border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid var(--muted)}
.ps-round-panel{position:absolute;z-index:18;top:calc(100% + 4px);left:0;min-width:100%;max-height:290px;overflow:auto;padding:10px;background:var(--paper);border:1px solid var(--charcoal);box-shadow:var(--shadow)}
.ps-round-panel[hidden]{display:none!important}
.ps-round-presets{display:flex;gap:6px;margin-bottom:8px;padding-bottom:9px;border-bottom:1px solid var(--line)}
.ps-round-presets button{flex:1;min-height:30px;padding:6px 8px;border:1px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;white-space:nowrap;cursor:pointer}
.ps-round-presets button:hover{background:var(--charcoal);color:#fff}
.ps-round-options{display:grid;gap:1px}
.ps-searchbar .ps-round-option{display:flex;align-items:center;gap:9px;margin:0;padding:6px 5px;color:var(--ink);font-size:13px;font-weight:600;text-transform:none;letter-spacing:0;cursor:pointer}
.ps-searchbar .ps-round-option:hover{background:var(--cream)}
.ps-searchbar .ps-round-option input{flex:none;width:16px;height:16px;min-height:16px;padding:0;accent-color:var(--orange)}
.ps-round-empty{margin:0;padding:6px 5px;color:var(--muted);font-size:12px}

/* Active selections, said out loud. The chips are the reason the round list can
   stay closed: what is filtered is legible without opening anything, and each
   chip removes its own round. */
.ps-filter-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:11px}
.ps-chips{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}
.ps-chip{display:inline-flex;align-items:center;gap:4px;padding:4px 4px 4px 10px;background:var(--cream);border:1px solid var(--line);color:var(--ink);font-size:11px;font-weight:800;letter-spacing:.3px}
.ps-chip button{display:flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:0;background:transparent;color:var(--muted);font-family:inherit;font-size:14px;line-height:1;cursor:pointer}
.ps-chip button:hover{color:var(--danger)}
.ps-chip button:focus-visible{outline:2px solid var(--orange);outline-offset:1px}
.ps-chips-note{color:var(--muted);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.6px}
.ps-filter-actions button{min-height:34px;padding:8px 13px;border:1px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;cursor:pointer}
.ps-filter-actions button:hover{background:var(--charcoal);color:#fff}
.ps-searchbar .ps-link-action{margin-left:auto;min-height:0;padding:5px 2px;border:0;background:transparent;color:var(--muted);font-size:11px;text-decoration:underline}
.ps-searchbar .ps-link-action:hover{background:transparent;color:var(--danger)}
.ps-filter-summary{margin:12px 0 0;padding:11px 14px;background:#f7f5f0;border-left:3px solid var(--charcoal);color:var(--muted);font-size:12px;line-height:1.5}
.ps-filter-summary strong{color:var(--ink)}
.ps-filter-summary[hidden]{display:none!important}
@media(max-width:1100px){.ps-toolbar-row{grid-template-columns:repeat(auto-fit,minmax(170px,1fr))}}

/* Executive information, compressed. Nothing was deleted: the metric tiles and
   the four operational panels live inside these collapsible regions. */
.ps-summary{margin-top:26px;background:var(--paper);border:1px solid var(--line)}
.ps-summary-head{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:14px 18px;border-bottom:1px solid var(--line)}
.ps-summary-head h2{font-size:26px;line-height:1}
.ps-summary-body{padding:18px}
.ps-metric-strip{display:flex;gap:0;flex-wrap:wrap;padding:0}
.ps-metric-strip .ps-strip-item{flex:1 1 150px;display:grid;gap:4px;padding:14px 18px;border-right:1px solid var(--line);border-bottom:1px solid var(--line)}
.ps-metric-strip .ps-strip-item:last-child{border-right:0}
.ps-metric-strip strong{font:900 30px/1 "Barlow Condensed",sans-serif}
.ps-metric-strip span{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.9px;line-height:1.3}
.ps-metric-strip .ps-strip-item.alert strong{color:var(--danger)}
.ps-metric-strip .ps-strip-item.monitor strong{color:var(--warning)}
.ps-summary-line{margin:0;padding:14px 18px;border-bottom:1px solid var(--line);color:var(--muted);font-size:13px;line-height:1.6}
.ps-summary-line strong{color:var(--ink)}
.ps-summary .ps-operations-grid{margin-top:0}

/* Back to top. Sits clear of the profile action bar and of form buttons by
   staying in the lower-right gutter, and only appears once the page has been
   scrolled far enough for it to be useful. */
.ps-to-top{position:fixed;right:20px;bottom:20px;z-index:45;display:grid;place-items:center;gap:1px;width:54px;height:54px;padding:0;border:2px solid var(--ink);border-radius:50%;background:var(--ink);color:#fff;font-family:inherit;cursor:pointer;box-shadow:0 10px 26px rgba(23,32,42,.28)}
.ps-to-top span{font-size:19px;line-height:1}
.ps-to-top small{font-size:8px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
.ps-to-top:hover{background:var(--orange);border-color:var(--orange)}
.ps-to-top:focus-visible{outline:3px solid var(--orange);outline-offset:3px}
.ps-to-top[hidden]{display:none!important}

/* Participant profile context header — replaces the second workspace hero. */
.ps-context{display:grid;grid-template-columns:auto minmax(0,1fr);gap:18px;align-items:center;padding:20px 22px;background:var(--paper);border:1px solid var(--line);border-top:4px solid var(--orange)}
.ps-context-main{display:grid;gap:9px;min-width:0}
.ps-context h2{font-size:clamp(28px,3.2vw,38px);line-height:1}
.ps-context-facts{display:flex;gap:8px 22px;flex-wrap:wrap;margin:0;color:var(--muted);font-size:12px;line-height:1.45}
.ps-context-facts div{display:grid;gap:2px}
.ps-context-facts dt{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.9px}
.ps-context-facts dd{margin:0;color:var(--ink);font-size:13px;font-weight:700}
.ps-context .ps-avatar{width:70px;height:70px;flex:0 0 70px;font-size:24px}
.ps-context-position{color:var(--muted);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}

@media(max-width:1100px){.ps-searchbar{grid-template-columns:repeat(2,minmax(0,1fr))}.ps-searchbar>label:first-child{grid-column:1/-1}}
@media(max-width:780px){.ps-workspace-header{padding:18px}.ps-searchbar{grid-template-columns:1fr;padding:15px}.ps-round-field{grid-column:auto}.ps-summary-head{align-items:flex-start;flex-direction:column;gap:8px}.ps-metric-strip .ps-strip-item{flex:1 1 45%}.ps-context{grid-template-columns:1fr}.ps-to-top{right:14px;bottom:14px;width:48px;height:48px}.ps-view{padding-bottom:84px}}
@media(max-width:500px){.ps-metric-strip .ps-strip-item{flex:1 1 100%;border-right:0}.ps-filter-actions button{flex:1 1 100%}.ps-context-facts{display:grid;grid-template-columns:1fr 1fr}}

/* The card's Open Participant Profile control is a real button now rather than
   decorative text, so it needs the button reset and a visible focus ring. */
button.ps-profile-link{padding:9px 13px;border:1px solid var(--charcoal);background:transparent;font-family:inherit;cursor:pointer}
button.ps-profile-link:hover{background:var(--charcoal);color:#fff}
button.ps-profile-link:focus-visible{outline:3px solid var(--orange);outline-offset:2px}

/* The action bar is sticky under the 76px topbar. Previous/Next used to live at
   the end of it; ADR-0014's sibling correction moved record navigation into its
   own bar above the summary, so the rules that styled it here are gone with it
   rather than left behind as a selector that matches nothing. */
.ps-profile-actions{top:76px}
.ps-profile-actions button:disabled,.ps-profile-actions a[aria-disabled=true]{opacity:.45;cursor:not-allowed}
.ps-profile-actions button:focus-visible,.ps-profile-actions a:focus-visible{outline:3px solid var(--orange);outline-offset:2px}

/* Explicit back controls on the administration modules and the Import Center. */
.ps-back{display:inline-flex;align-items:center;min-height:38px;margin-bottom:14px;padding:8px 0;border:0;background:transparent;color:var(--charcoal);font-family:inherit;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;cursor:pointer}
.ps-back:hover{color:var(--orange)}
.ps-back:focus-visible{outline:3px solid var(--orange);outline-offset:2px}

/* ---------------------------------------------------------------------------
   Participant Success workflow optimization.

   The workspace was already roster-first, but a counselor still had to scroll
   back up to change a filter, read four separate chronologies to reconstruct a
   participant's history, and hunt for the section an action lived in. The rules
   below are layout and emphasis only: no palette value is added, no component
   is replaced, and every panel that existed still exists.
   --------------------------------------------------------------------------- */

/* ADR-0014 removed the pinned filter bar that used to live here. Filter
   controls scroll with the page like any other content, so participant cards
   never travel underneath a fixed panel. `.ps-filter-summary` states the active
   filters in words and `.ps-to-top` returns the reader to the controls, which
   is what pinning was buying. */

/* Participant cards, simplified. Four facts read first, four read second, and
   the latest note reads last because it is the longest line on the card. */
.ps-card-secondary{display:flex;gap:5px 16px;flex-wrap:wrap;margin-top:11px;color:var(--muted);font-size:11px;line-height:1.45}
.ps-card-secondary span{display:inline-flex;gap:5px;min-width:0}
.ps-card-secondary em{font-style:normal;font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-card-note{margin-top:12px;padding:11px 13px;background:#f7f5f0;border-left:3px solid var(--charcoal)}
.ps-card-note>span{display:block;color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-card-note>p{margin:6px 0 0;color:#2f3a46;font-size:12px;line-height:1.5;overflow-wrap:anywhere}
.ps-card-note>small{display:block;margin-top:6px;color:var(--muted);font-size:10px}
.ps-card-note.empty{border-left-color:var(--line);background:#fbfaf7}
.ps-card-note.empty>p{color:var(--muted);font-style:italic}

/* Reporting beside the list it describes. */
.ps-report-context{margin-top:12px;padding:13px 15px;background:var(--paper);border:1px solid var(--line);border-left:3px solid var(--orange)}
.ps-report-context>p:first-child{display:flex;gap:6px 12px;flex-wrap:wrap;align-items:baseline;margin:0;color:var(--muted);font-size:12px;line-height:1.5}
.ps-report-context>p:first-child strong{color:var(--ink);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
.ps-report-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:11px}
.ps-report-actions button,.ps-report-actions a{display:inline-flex;align-items:center;min-height:38px;padding:8px 13px;border:1px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:10px;font-weight:800;text-decoration:none;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-report-actions button:hover,.ps-report-actions a:hover{background:var(--charcoal);color:#fff}
.ps-report-actions button:disabled{opacity:.45;cursor:not-allowed}
.ps-report-status{margin:10px 0 0;color:var(--muted);font-size:12px;line-height:1.5}
.ps-report-status[hidden]{display:none!important}

/* Counselor Actions — one panel. The sticky element has to stay a direct child
   of the profile container, so the scrolling row is an inner element and the
   status line sits under it rather than in it. */
.ps-profile-actions{display:block}
.ps-action-row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.ps-actions-label{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.9px}
.ps-action-primary{background:var(--orange)!important;border-color:var(--orange)!important;color:#fff!important}
.ps-action-message{margin:10px 0 0;padding-left:11px;border-left:3px solid var(--orange);color:var(--muted);font-size:12px;line-height:1.5}
.ps-action-message[hidden]{display:none!important}
@media(max-width:780px){.ps-action-row{overflow-x:auto;flex-wrap:nowrap}.ps-action-row>button,.ps-action-row>a{flex:0 0 auto}}

/* Participant Timeline. One chronology in place of four, built from records the
   platform already holds. The kind badge carries the source so a reader can
   tell a note from a status change at a glance. */
.ps-timeline{display:grid;gap:1px;margin:4px 0 0;padding:0;list-style:none;background:var(--line);border:1px solid var(--line)}
.ps-timeline-item{display:grid;grid-template-columns:minmax(150px,190px) minmax(0,1fr);gap:16px;padding:14px 16px;background:#fff;border-left:3px solid var(--charcoal)}
.ps-timeline-item.tone-note{border-left-color:var(--orange)}
.ps-timeline-item.tone-meeting{border-left-color:#356da8}
.ps-timeline-item.tone-communication{border-left-color:var(--charcoal-soft)}
.ps-timeline-item.tone-registration{border-left-color:var(--green)}
.ps-timeline-item.tone-status{border-left-color:var(--warning)}
.ps-timeline-item.tone-assignment{border-left-color:#6a5aa8}
.ps-timeline-item.tone-document{border-left-color:var(--muted)}
.ps-timeline-item.tone-record{border-left-color:var(--line)}
.ps-timeline-when{display:grid;gap:6px;align-content:start}
.ps-timeline-when time{color:var(--muted);font-size:11px;font-weight:700;line-height:1.4}
.ps-timeline-main{min-width:0}
.ps-timeline-main strong{display:block;font-size:13px;line-height:1.4;overflow-wrap:anywhere}
.ps-timeline-main p{margin:7px 0 0;color:#2f3a46;font-size:12px;line-height:1.6;overflow-wrap:anywhere}
.ps-timeline-meta{display:flex;gap:6px;flex-wrap:wrap;margin-top:9px}
.ps-timeline-meta span{padding:5px 7px;background:var(--cream);color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.5px}
@media(max-width:780px){.ps-timeline-item{grid-template-columns:1fr;gap:9px}.ps-timeline-when{grid-auto-flow:column;justify-content:start;align-items:center;gap:10px}}

/* Profile header, about a fifth shorter. Nothing was dropped: the badges moved
   onto the name's own line, which is where the row of vertical space came
   from, and all seven context facts are still rendered. */
.ps-context{padding:15px 20px;gap:16px}
.ps-context-main{gap:7px}
.ps-context h2{font-size:clamp(25px,2.9vw,33px)}
.ps-context .ps-avatar{width:60px;height:60px;flex:0 0 60px;font-size:21px}
.ps-context .eyebrow{margin:0}
.ps-context-title{display:flex;align-items:center;gap:8px 14px;flex-wrap:wrap}
.ps-context-title .ps-profile-badges{justify-content:flex-start}
.ps-context-facts{gap:6px 20px}
@media(max-width:500px){.ps-context-title{display:grid}}

/* Executive information, compressed further. The metric strip and the four
   operational panels are unchanged in content; they simply stop competing with
   the roster for the top of the page. */
.ps-view{padding-top:18px}
.ps-dashboard-roster{margin-top:22px;padding-top:20px}
.ps-roster-heading h2{font-size:clamp(29px,3.3vw,41px)}
.ps-summary{margin-top:20px}
.ps-summary-head{padding:11px 16px}
.ps-summary-head h2{font-size:20px}
.ps-metric-strip .ps-strip-item{padding:11px 14px}
.ps-metric-strip strong{font-size:24px}
.ps-summary-line{padding:11px 16px;font-size:12px}

/* ---------------------------------------------------------------------------
   Executive refinement.

   The dashboard is optional and off by default, and the profile opens as a
   command center: where the participant stands, what happened last, what is
   owed next, and the timeline — above the counselor's own actions.
   --------------------------------------------------------------------------- */

/* The whole Executive Dashboard, both summaries, behind one control. Hidden it
   costs nothing; shown it is the same two compressed strips as before. */
.ps-executive{display:grid;gap:0}
.ps-executive[hidden]{display:none!important}
#ps-dashboard-toggle{padding-left:14px;border-left:1px solid var(--line)}

/* Participant Command Center — four tiles, then the counselor's actions. */
.ps-command-center{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-top:12px}
.ps-command-tile{display:grid;gap:7px;align-content:start;padding:15px 17px;background:var(--paper);border:1px solid var(--line);border-top:3px solid var(--charcoal)}
.ps-command-tile.overdue{border-top-color:var(--danger)}
.ps-command-tile .eyebrow{margin:0}
.ps-command-tile strong{font:800 19px/1.2 "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.4px;overflow-wrap:anywhere}
.ps-command-tile small{color:var(--muted);font-size:11px;line-height:1.5}
.ps-command-tile p{margin:0;color:#2f3a46;font-size:12px;line-height:1.55;overflow-wrap:anywhere}
.ps-command-badges{display:flex;gap:6px;flex-wrap:wrap}
.ps-command-facts{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin:2px 0 0}
.ps-command-facts div{min-width:0}
.ps-command-facts dt{color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
.ps-command-facts dd{margin:3px 0 0;font-size:12px;font-weight:700;overflow-wrap:anywhere}

/* Activity, outreach, and contact — three stacked signals rather than one date.
   They read top to bottom in the order the platform distinguishes them: somebody
   worked the record, somebody tried to reach the participant, the participant was
   reached. Each one carries its own timestamp and its own staff attribution, and
   an unrecorded signal states that instead of borrowing the row above it. */
.ps-engagement-facts{display:grid;gap:9px;margin:2px 0 0}
.ps-engagement-facts div{display:grid;grid-template-columns:minmax(84px,auto) minmax(0,1fr);gap:10px;align-items:baseline;padding-bottom:8px;border-bottom:1px solid var(--line)}
.ps-engagement-facts div:last-child{padding-bottom:0;border-bottom:0}
.ps-engagement-facts dt{color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
.ps-engagement-facts dd{display:grid;gap:2px;margin:0;min-width:0}
.ps-engagement-facts strong{font:800 14px/1.25 "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.3px;overflow-wrap:anywhere}
.ps-engagement-detail{color:#2f3a46;font-size:11px;line-height:1.45;overflow-wrap:anywhere}
.ps-engagement-attempts{margin:0!important;padding:8px 10px;background:var(--cream);color:var(--ink)!important;font-size:11px;font-weight:700}
.ps-engagement-attempts strong{font-size:14px}
.ps-command-link{justify-self:start;min-height:36px;padding:8px 12px;border:1px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-command-link:hover{background:var(--charcoal);color:#fff}
.ps-command-link:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
@media(max-width:1100px){.ps-command-center{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:780px){.ps-command-center{grid-template-columns:1fr}.ps-command-facts{grid-template-columns:1fr 1fr}}

/* Reserved slot for a future AI Counselor Summary. Styled so the panel has a
   settled place in the layout; it stays hidden until that panel is built. */
.ps-ai-panel{margin-top:12px;padding:15px 17px;background:var(--paper);border:1px dashed var(--line);border-left:3px solid var(--muted)}
.ps-ai-panel .eyebrow{margin:0 0 6px;color:var(--muted)}
.ps-ai-panel p:not(.eyebrow){margin:0;max-width:900px;color:var(--muted);font-size:12px;line-height:1.6}
.ps-ai-panel[hidden]{display:none!important}

/* Compact workspace headers, applied to the whole module rather than only the
   roster. The module and administration views still carried the original
   display headings — up to 94px — which pushed their own work lists down the
   same way the old hero pushed down the roster. Same type family, same case,
   same colour; one size step that matches the workspace header. */
.ps-module-view h2,.ps-placeholder h2{font-size:clamp(30px,3.6vw,44px)}
.ps-module-view,.ps-placeholder{padding:clamp(22px,3.4vw,38px)}
.ps-module-view>p:not(.eyebrow),.ps-placeholder>p:not(.eyebrow){font-size:15px}
.ps-admin-head{padding-bottom:12px}
.ps-admin-head h2{margin:3px 0 6px;font-size:clamp(28px,3.4vw,40px)}
.ps-admin-head>div:first-child>p:not(.eyebrow){font-size:14px}
.ps-admin-form h3,.ps-admin-form h4{font-size:20px}




/* ---------------------------------------------------------------------------
   Participant Success usability refinement — 2026-08-11
   ---------------------------------------------------------------------------
   Presentation only. No palette value is added, no component is replaced, and
   every fact a card or a record section carried before it is still there. What
   changes is which parts lead the eye and where one region stops and the next
   begins.
   --------------------------------------------------------------------------- */

/* The roster card. It was an even block of outlined text: the name, the badges,
   eight facts and a note all at roughly one weight, with a hairline border and
   nothing to separate the tiers. Now the risk rail is wide enough to read as a
   status, the name leads, the routing facts sit on their own tinted band, and
   the card lifts on hover instead of only moving. */
.ps-participant-card{gap:15px;padding:19px;border-left-width:5px;border-radius:8px;box-shadow:0 1px 2px rgba(23,32,42,.05)}
.ps-participant-card:hover{transform:translateY(-2px);box-shadow:0 14px 30px rgba(23,32,42,.13)}
.ps-participant-card:focus-within{outline:3px solid var(--orange);outline-offset:2px}
.ps-participant-card.risk-green{border-left-color:var(--green)}
.ps-card-head h3{margin:0;font-size:23px;line-height:1.12;letter-spacing:.2px}
.ps-card-subtitle{margin:5px 0 12px;font-size:12px;font-weight:600;letter-spacing:.2px}
.ps-card-grid{gap:9px 12px;padding:12px 13px;border-top:0;border-radius:6px;background:#f7f5f0}
.ps-card-grid span{font-size:8px;font-weight:800;letter-spacing:.9px}
.ps-card-grid strong{margin-top:4px;font-size:12.5px;line-height:1.3}
.ps-card-secondary{margin-top:10px;padding-top:9px;border-top:1px solid var(--line)}
.ps-card-note{margin-top:10px;border-radius:0 5px 5px 0}
.ps-card-footer{align-items:center;margin-top:13px;padding-top:12px;border-top:1px solid var(--line)}

/* Risk and status stop being two identically shaped pills. Risk carries a dot
   the same colour as the card's rail, so the rail and the badge read as one
   statement rather than as two facts that happen to agree; status stays a plain
   pill, and the follow-up badge is neither. */
.ps-card-badges .ps-badge{padding:5px 9px;font-size:9px;letter-spacing:.8px}
.ps-badge.risk::before{content:"";width:6px;height:6px;margin-right:6px;border-radius:50%;background:currentColor}
.ps-badge.status{border:1px solid currentColor;background:transparent}

/* ---------------------------------------------------------------------------
   Participant record — navigation, de-duplicated summary, collapsible sections.

   The record now opens on a navigation bar rather than on the summary, because
   the first thing a counselor does with a record is decide whether it is the
   one they wanted. The Overview section that used to restate the summary is
   gone; what remains of it is a short Participant Record section, and the lower
   record is nine named sections that each say what they hold while closed.
   --------------------------------------------------------------------------- */

/* Back, position, and the two steps through the filtered roster. Not sticky:
   it is record navigation, not a toolbar, and the same reasoning that unpinned
   the roster filters (ADR-0014) applies to it. Back to top returns to it. */
.ps-record-nav{display:flex;align-items:center;gap:10px 14px;flex-wrap:wrap;margin-bottom:14px;padding:9px 12px;background:var(--cream);border:1px solid var(--line);border-left:4px solid var(--orange)}
.ps-record-nav button{min-height:36px;padding:7px 12px;border:1px solid var(--charcoal);background:var(--paper);color:var(--charcoal);font-family:inherit;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-record-nav button:hover:not(:disabled){background:var(--charcoal);color:#fff}
.ps-record-nav button:disabled{opacity:.4;cursor:not-allowed}
.ps-record-nav button:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.ps-record-position{min-width:0;color:var(--muted);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.6px}
.ps-record-steps{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}
@media(max-width:780px){.ps-record-steps{margin-left:0;width:100%}.ps-record-steps button{flex:1}}

/* A closed section states its own contents. The summary sits between the title
   and the +/- marker, so the title stays left-aligned and the marker stays where
   a reader's eye already expects it. The header itself is styled with the rest
   of the design language further down, where the toggle became one of two
   controls on a header bar rather than the section's only button. */
.ps-section-summary{color:var(--muted);font-size:11px;font-style:normal;font-weight:700;text-transform:uppercase;letter-spacing:.6px;text-align:right}
.ps-profile-content{padding:18px 20px 22px}
.ps-profile-content>.ps-subhead:first-child,.ps-profile-content>div:first-child>.ps-subhead:first-child{margin-top:0}
@media(max-width:500px){.ps-section-summary{flex-basis:100%;text-align:left}.ps-profile-content{padding:15px 15px 18px}}

/* ===========================================================================
   Participant record editing, and the participant card's graphic design.
   Recorded in docs/architecture-decisions/0015-executive-snapshot-and-record-editing.md.

   The record used to be read-only boxes with one collapsed twelve-input form
   underneath, which is a viewer with an admin screen bolted to it rather than a
   workspace. Every block a counselor maintains now carries its own Edit control
   and its own confirmation, so editing happens where the value is displayed and
   nothing turns the profile into a single giant form.

   Nothing below introduces a colour. Every value is a platform token or a tint
   of one, and status colour is spent only where it carries meaning: risk on the
   card's left edge, danger on an overdue tile, orange on the thing a reader is
   being asked to act on. The rest is navy type on warm paper, which is what
   makes this read as the secure side of the Carheel website rather than a
   different product.
   =========================================================================== */

/* The participant card. Same information, given a hierarchy: the name and the
   risk edge first, the identity line under it, then a tinted panel of program
   facts, then the two grade point averages, then the latest note. The tint is
   what does the work — a panel a reader's eye can skip or land on, rather than
   nine rows of equal-weight text. */
.ps-participant-card{position:relative;padding:22px 21px;border-radius:10px;background:linear-gradient(180deg,#fff 0,#fdfcfa 100%);box-shadow:0 1px 2px rgba(23,32,42,.05),0 8px 18px rgba(23,32,42,.035)}
.ps-participant-card:hover{box-shadow:0 2px 4px rgba(23,32,42,.07),0 18px 34px rgba(23,32,42,.12)}
.ps-card-head h3{font-weight:800;color:var(--ink)}
.ps-card-subtitle{color:var(--charcoal-soft);opacity:.78}
.ps-card-grid{background:#f6f4ef;border:1px solid rgba(23,32,42,.06)}
.ps-card-grid span{color:#7d848d}
.ps-card-grid strong{color:var(--ink);font-weight:700}

/* Semester and cumulative grade point averages, side by side and labelled.
   They are two facts about a participant and neither is derived from the other,
   so the card gives each its own value rather than printing one number a reader
   has to guess the meaning of. */
.ps-card-gpa{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;margin-top:10px;background:rgba(23,32,42,.08);border:1px solid rgba(23,32,42,.08);border-radius:6px;overflow:hidden}
.ps-card-gpa>div{display:grid;gap:3px;padding:9px 12px;background:#f4f6f8}
.ps-card-gpa span{color:#6c757f;font-size:8.5px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;overflow-wrap:anywhere}
.ps-card-gpa strong{font:800 17px/1 "Barlow Condensed",sans-serif;color:var(--charcoal);letter-spacing:.3px}

/* A participant photograph, where one is on file. The image is fetched through
   the authenticated record route and swapped in over the initials, so the
   initials are what shows while it loads, if the reader is not permitted to see
   it, or if it fails — never an empty circle. */
.ps-avatar{position:relative;overflow:hidden;background:linear-gradient(160deg,var(--charcoal) 0,var(--charcoal-soft) 100%);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12)}
.ps-avatar img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.ps-avatar-loaded .ps-avatar-initials{opacity:0}
.ps-avatar-initials{transition:opacity .18s ease}
.ps-context .ps-avatar{box-shadow:inset 0 0 0 1px rgba(255,255,255,.14),0 6px 16px rgba(23,32,42,.16)}

/* A record block: display state, editing state, confirmation state — one at a
   time, in place, with the block's own heading and its own Edit control. */
.ps-editable{margin-top:18px;padding:16px 17px 15px;background:var(--cream);border:1px solid var(--line);border-left:3px solid var(--charcoal);border-radius:0 7px 7px 0}
.ps-profile-content>.ps-editable:first-child{margin-top:0}
.ps-block-head{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:13px}
.ps-block-head .ps-subhead{margin:0}
.ps-edit-action{min-height:34px;padding:7px 15px;border:1px solid var(--charcoal);background:var(--paper);color:var(--charcoal);font-family:inherit;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;cursor:pointer}
.ps-edit-action:hover{background:var(--charcoal);color:#fff}
.ps-edit-action:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.ps-read-only{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-editable-view .ps-detail-list div{border-top-color:rgba(23,32,42,.1)}
.ps-editable-form{margin-top:4px;padding:16px;background:var(--paper);border:1px solid var(--line)}
.ps-editable .ps-form-note{margin:12px 0 0;padding:0;color:var(--muted);font-size:11.5px;line-height:1.55}

/* A controlled selection and the exception to it. The text field only exists
   while Other is chosen, so it appears under its select rather than beside it:
   it belongs to that field, not to the next one. */
/* A note belonging to one field rather than to the form: the graduation pair
   states what it is missing, and what a preserved historical value is, directly
   under the two controls that produced it. It spans the grid so it reads as one
   sentence rather than a column. */
.ps-field-note{grid-column:1/-1;margin:0;color:var(--muted);font-size:11.5px;line-height:1.55}
.ps-field-note:empty{display:none}

.ps-other-field{display:grid;gap:7px}
.ps-other-field[hidden]{display:none}
.ps-editable-form .ps-other-field>span,.ps-check-set legend{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-editable-form .ps-other-field input{width:100%;border:1px solid var(--line);background:#fff;padding:12px;color:var(--ink)}

/* Several answers at once — support services, issued equipment. The set spans
   the form so the boxes read as one question with many answers rather than as a
   column of unrelated ones. */
.ps-check-set{grid-column:1/-1;display:grid;gap:11px;margin:0;padding:14px;border:1px solid var(--line);background:#fff}
.ps-check-set legend{padding:0 6px}
.ps-check-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:9px}
.ps-check-grid .ps-check span{font-size:12.5px;line-height:1.4}
.ps-check-grid .ps-check input{margin-right:9px;flex:0 0 auto}
.ps-form-buttons{display:flex;gap:8px;flex-wrap:wrap}
.ps-secondary{min-height:44px;padding:9px 18px;border:1px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-secondary:hover{background:var(--charcoal);color:#fff}

/* Current value → new value. The last thing between a counselor and the
   participant record, so it is orange: this is the moment the interface is
   asking for a decision. */
.ps-confirm{margin-top:4px;padding:16px;background:var(--paper);border:1px solid var(--line);border-top:3px solid var(--orange)}
.ps-confirm .eyebrow{margin:0 0 12px}
.ps-confirm-table{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line);font-size:12px}
.ps-confirm-table thead th{padding:9px 12px;background:var(--cream);color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;text-align:left}
.ps-confirm-table tbody th{padding:11px 12px;border-top:1px solid var(--line);color:var(--ink);font-size:11px;font-weight:800;text-align:left;text-transform:uppercase;letter-spacing:.5px;white-space:normal}
.ps-confirm-table td{padding:11px 12px;border-top:1px solid var(--line);line-height:1.5;overflow-wrap:anywhere}
.ps-confirm-from{color:var(--muted);text-decoration:line-through}
.ps-confirm-to{color:var(--ink);font-weight:700;background:rgba(232,66,10,.05)}

/* Participant photograph management, and the restricted-notes banner. The
   restricted banner is the one place a reader has to be certain about who can
   read what, so it is given the same weight as a warning. */
.ps-photo-block{display:flex;align-items:center;gap:18px;flex-wrap:wrap}
.ps-photo-block .ps-avatar{width:96px;height:96px;flex:0 0 96px;font-size:32px}
.ps-photo-block .ps-detail-list{flex:1 1 260px;grid-template-columns:1fr}
.ps-photo-form,.ps-gpa-form,.ps-registration-form{margin-top:16px;padding:16px;background:var(--paper);border:1px solid var(--line);border-top:3px solid var(--charcoal)}
.ps-inline-restricted{border-left-color:var(--charcoal);background:#eef1f4}
.ps-inline-restricted p{color:#41505f}
@media(max-width:500px){.ps-block-head{align-items:flex-start;flex-direction:column}.ps-edit-action{width:100%}.ps-confirm-table thead{display:none}.ps-confirm-table tbody th,.ps-confirm-table td{display:block;border-top:0}.ps-confirm-table tbody tr{display:block;border-top:1px solid var(--line)}.ps-confirm-from::before{content:"Current: ";text-decoration:none}.ps-confirm-to::before{content:"New: "}}

/* ---------------------------------------------------------------------------
   The Carheel design language, applied.

   The workspace was already built from the platform's colours but was using
   them at one weight: white panels, thin grey rules, orange kept for buttons.
   The public site does something more deliberate — deep navy where a thing is
   named, white or off-white where it is read, a hard orange rule at the seam
   between them, and colour elsewhere only when it means something. This layer
   applies that to the two surfaces a counselor spends the day on: the roster
   card and the profile section.

   Nothing here is decorative. The navy bands mark identity; the orange rules
   mark the boundary between naming and reading; the left rail stays the
   participant's risk and is never green for the sake of being green; status
   colour stays on status pills. The palette is deliberately narrow — navy,
   white and off-white, Carheel orange, and the semantic status colours — so
   this reads as an executive workforce application rather than a dashboard.
   --------------------------------------------------------------------------- */

/* The roster card: a navy identity band over a light body of facts.

   It is two surfaces rather than one, and deliberately not one solid dark
   rectangle — a roster of those is as flat as a roster of white ones, and the
   facts underneath the name are what a counselor is scanning for. The band
   answers "who is this and where do they stand"; the body answers everything
   below it. The risk rail runs the full height of both. */
.ps-participant-card{display:block;padding:0;overflow:hidden;background:var(--paper)}
.ps-card-identity{display:grid;grid-template-columns:auto minmax(0,1fr);gap:16px;align-items:center;padding:17px 20px;background:linear-gradient(160deg,var(--charcoal) 0,var(--charcoal-soft) 100%);border-bottom:3px solid var(--orange)}
.ps-card-identity .ps-card-head h3{color:#fff}
.ps-card-identity .ps-card-subtitle{margin:5px 0 0;color:#c2c9d1;font-size:12px;font-weight:600;letter-spacing:.3px}
.ps-card-identity .ps-avatar{box-shadow:inset 0 0 0 1px rgba(255,255,255,.16),0 0 0 2px rgba(232,66,10,.55)}
.ps-card-body{padding:16px 20px 18px}
.ps-card-body>.ps-card-grid{border-top:0;padding-top:0}
.ps-card-footer{align-items:center;justify-content:space-between;margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}

/* The profile section header: the same band, at section scale.

   The bar carries two controls side by side, so the toggle is no longer the
   section's only button and can no longer be addressed as one. The action sits
   on the right in the site's own outlined-orange nav language: visible without
   opening the section, which is the point — a closed record now shows a
   counselor what they can do to it. */
.ps-section-bar{display:flex;align-items:stretch;background:linear-gradient(160deg,var(--charcoal) 0,var(--charcoal-soft) 100%);border-bottom:3px solid var(--orange)}
.ps-section-toggle{flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:8px 14px;flex-wrap:wrap;padding:14px 18px;border:0;background:transparent;color:#fff;font-family:inherit;text-align:left;cursor:pointer}
.ps-section-toggle>h2{margin:0;margin-right:auto;color:#fff;font-size:23px}
.ps-section-toggle .ps-section-summary{color:#c2c9d1}
.ps-section-toggle>span{display:grid;place-items:center;flex:none;width:26px;height:26px;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.3);color:#fff;font-size:15px;font-weight:800;line-height:1}
.ps-section-toggle:hover{background:rgba(255,255,255,.06)}
.ps-section-toggle:focus-visible{outline:3px solid var(--orange);outline-offset:-3px}
.ps-section-action{flex:none;align-self:center;margin-right:16px;min-height:34px;padding:7px 15px;border:1.5px solid var(--orange);background:transparent;color:var(--orange);font-family:inherit;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;white-space:nowrap;cursor:pointer}
.ps-section-action:hover{background:var(--orange);color:#fff}
.ps-section-action:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.ps-profile-content{padding:18px 22px 22px}

/* Editing the participant, from the summary that made a counselor notice it
   needed editing. Orange, because it is the summary's call to action. */
.ps-context-edit{min-height:34px;padding:7px 15px;border:1.5px solid var(--orange);background:var(--orange);color:#fff;font-family:inherit;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;cursor:pointer}
.ps-context-edit:hover{background:var(--orange-dark);border-color:var(--orange-dark)}
.ps-context-edit:focus-visible{outline:3px solid var(--charcoal);outline-offset:2px}

/* The photograph and the way to change it, kept together. The control sits
   under the avatar in the summary column, sized to the avatar so the summary's
   proportions are unchanged when it is absent for a read-only reader. */
.ps-context-portrait{display:grid;justify-items:center;gap:8px}
.ps-context-photo{width:100%;min-height:28px;padding:5px 8px;border:1.5px solid var(--charcoal);background:var(--paper);color:var(--charcoal);font-family:inherit;font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;white-space:nowrap;cursor:pointer}
.ps-context-photo:hover{background:var(--charcoal);color:#fff}
.ps-context-photo:focus-visible{outline:3px solid var(--orange);outline-offset:2px}

/* The chosen image before it is saved, shown in the same circular frame the
   summary and the roster card use, so the preview is the result rather than an
   approximation of it. */
.ps-photo-preview{grid-column:1/-1;margin-top:4px;padding:14px;background:var(--cream);border:1px solid var(--line)}
.ps-photo-preview .eyebrow{margin:0 0 10px}
.ps-photo-preview-body{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
.ps-photo-preview-frame{width:96px;height:96px;flex:0 0 96px;border-radius:50%}
.ps-photo-preview-body p{flex:1 1 220px;margin:0;color:var(--muted);font-size:11.5px;line-height:1.55}

/* The permanent record's two disclosures, and its empty state.

   Both controls sit on one row under the most recent entry: adding the next
   entry, and reading the whole history. Neither is open until it is asked for,
   which is what makes pressing Add Note visibly do something. */
.ps-record-lead{margin-bottom:16px}
.ps-record-actions{display:flex;flex-wrap:wrap;gap:10px;padding:14px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line)}
.ps-record-actions button{min-height:40px;padding:9px 18px;border:1.5px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;cursor:pointer}
.ps-record-actions button:hover{background:var(--charcoal);color:#fff}
.ps-record-actions .ps-action-primary:hover{background:var(--orange-dark)!important;border-color:var(--orange-dark)!important}
.ps-record-actions .ps-section-action{align-self:auto;margin-right:0}
#ps-note-entry-block,#ps-note-history{margin-top:4px}

/* Which record a note is being written to, said three times: on the control that
   opens the form, on the question the generic control asks, and on the form
   itself as the visibility field is changed.

   The two Add Note controls used to be the same three words for two different
   records, and the note type a counselor picked next — "General counseling note"
   — read like the answer to a question it does not answer. Nothing below changes
   how a note is stored; it changes what the screen says about where it lands. */
.ps-notes-section>.ps-section-bar>.ps-section-action,.ps-counselor-notes-section>.ps-section-bar>.ps-section-action{white-space:normal;text-align:center;max-width:280px}
.ps-note-choice{padding:18px;background:var(--cream);border:1px solid var(--line);border-left:4px solid var(--orange)}
.ps-note-choice .ps-subhead{margin-top:0}
.ps-note-choice-options{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.ps-note-choice-option{display:grid;gap:7px;padding:16px;text-align:left;background:#fff;border:1.5px solid var(--charcoal);color:var(--charcoal);font-family:inherit;cursor:pointer}
.ps-note-choice-option strong{font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-note-choice-option small{color:var(--muted);font-size:11.5px;line-height:1.5}
.ps-note-choice-option:hover{border-color:var(--orange);box-shadow:0 2px 0 var(--orange)}
.ps-note-choice-option:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.ps-note-choice-option[data-ps-note-destination=permanent]{border-left:5px solid var(--orange)}
.ps-note-choice-option[data-ps-note-destination=restricted]{border-left:5px solid var(--charcoal);background:var(--cream)}
/* One sentence under a subhead, saying what the block below it is for. Used
   where the block is a mounted module whose own heading is its record list and
   not an explanation of the task. */
.ps-section-guide{margin:-4px 0 14px;color:var(--muted);font-size:12px;line-height:1.6}
.ps-section-guide strong{color:var(--ink)}

.ps-note-form-guide{margin:0 0 16px;padding:14px 16px;background:var(--cream);border-left:3px solid var(--charcoal);color:var(--muted);font-size:12px;line-height:1.6}
.ps-note-form-guide strong{color:var(--ink)}
.ps-note-destination{margin:16px 0 0;padding:12px 16px;background:var(--cream);border-left:3px solid var(--orange);color:var(--ink);font-size:12px;font-weight:700;line-height:1.55}
.ps-note-destination.restricted{border-left-color:var(--charcoal);color:var(--charcoal)}
#ps-note-entry-form-block.restricted #ps-note-entry-heading{color:var(--charcoal)}
@media(max-width:700px){.ps-note-choice-options{grid-template-columns:1fr}}

/* What happened with the participant, on the note card and in the outreach log.

   A note that records a conversation and a note that records an unanswered call
   are both counselor work, and the platform now says which is which. The contact
   badge is the platform's colour for something achieved; the attempt badge is
   deliberately neutral — an attempt is not a failure, and it is not a contact
   either. */
.ps-note-contact{background:var(--green)!important;color:#fff!important}
.ps-note-attempt{border:1px solid var(--charcoal);color:var(--charcoal)!important}

/* Correcting and deleting one note, on the card it belongs to.
   ------------------------------------------------------------
   The two controls sit under the note's meta row, quiet by default: correction is
   ordinary maintenance and deletion is rare, so neither is drawn as a call to
   action competing with "+ Add to Permanent Student Record". Delete carries the
   platform's danger colour only on its outline, and turns solid on hover, which is
   the same treatment structural deletion already gets.

   The Edited indicator is deliberately small. A corrected entry is not an alarm —
   what matters is that the record never presents a rewritten note as its original
   text — so it reads as a label beside the entry date, carrying the correction's
   author and time in its tooltip.

   The panel beneath the controls holds either the correction form or the deletion
   confirmation. It is a sibling of the note rather than a dialog over it, because
   both are read against the entry they change. */
.ps-note-edited{padding:3px 7px;border:1px solid var(--muted);color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.5px;cursor:help}
.ps-note-controls{display:flex;flex-wrap:wrap;align-items:center;gap:9px;margin-top:15px;padding-top:14px;border-top:1px solid var(--line)}
.ps-note-control{min-height:34px;padding:7px 13px;border:1px solid var(--line);background:var(--cream);color:var(--muted);font-family:inherit;font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.6px;cursor:pointer}
.ps-note-control:hover{border-color:var(--charcoal);background:var(--charcoal);color:#fff}
.ps-note-control:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.ps-note-control-danger{border-color:var(--danger);color:var(--danger)}
.ps-note-control-danger:hover{border-color:var(--danger);background:var(--danger);color:#fff}
.ps-note-restriction{flex:1 1 220px;color:var(--muted);font-size:11px;line-height:1.5}
.ps-note-panel{margin-top:15px}
.ps-note-edit-form,.ps-note-delete-form{padding:18px;background:var(--cream);border:1px solid var(--line);border-left:4px solid var(--orange)}
.ps-note-delete-form{border-left-color:var(--danger)}
.ps-note-edit-form h4,.ps-note-delete-form h4{margin:0 0 14px;font-size:13px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
.ps-note-edit-form label,.ps-note-delete-form label{display:grid;gap:7px}
.ps-note-edit-form label>span,.ps-note-delete-form label>span{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-note-edit-form select,.ps-note-edit-form input,.ps-note-edit-form textarea,.ps-note-delete-form select,.ps-note-delete-form input,.ps-note-delete-form textarea{width:100%;border:1px solid var(--line);background:#fff;padding:12px;color:var(--ink);font-family:inherit}
.ps-note-delete-form .ps-form-grid{grid-template-columns:minmax(220px,.6fr) minmax(0,1.4fr)}
.ps-note-delete-form .ps-note-text{grid-row:auto}
.ps-note-delete-form .ps-check{margin-top:14px}
.ps-note-delete-form .ps-check input{width:auto}
.ps-note-delete-form .ps-inline-notice{margin-bottom:16px}
@media(max-width:700px){.ps-note-edit-form .ps-form-grid,.ps-note-delete-form .ps-form-grid{grid-template-columns:1fr}.ps-note-edit-form .ps-note-text{grid-row:auto}}
.ps-outreach-form{padding:18px;background:var(--cream);border:1px solid var(--line);border-left:4px solid var(--charcoal)}
.ps-outreach-form label{display:grid;gap:7px}
.ps-outreach-form label>span{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-outreach-form select,.ps-outreach-form input,.ps-outreach-form textarea{width:100%;border:1px solid var(--line);background:#fff;padding:12px;color:var(--ink);font-family:inherit}
.ps-outreach-form .ps-form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
.ps-outreach-form .ps-note-text{grid-column:1/-1;grid-row:auto}
@media(max-width:700px){.ps-outreach-form .ps-form-grid{grid-template-columns:1fr}}
.ps-secondary{min-height:44px;padding:9px 20px;border:1.5px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-secondary:hover{background:var(--charcoal);color:#fff}
.ps-form-buttons{display:flex;gap:10px}

/* Empty states, at the size of the fact they carry.

   "There is nothing here yet" was being given a 180-pixel panel, which pushed
   the rest of the record off the screen to say very little. Inside the profile
   it is a single compact line, and where an empty state has an action, the
   action is what carries the weight. */
.ps-record-empty{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;padding:12px 16px;background:var(--cream);border-left:3px solid var(--orange)}
.ps-record-empty strong{font-size:12px;text-transform:uppercase;letter-spacing:.7px}
.ps-record-empty p{margin:0;color:var(--muted);font-size:12px;line-height:1.5}
.ps-profile-content .ps-list-empty{min-height:0;display:flex;align-items:baseline;justify-items:start;gap:10px;padding:12px 16px;text-align:left;background:var(--cream)}
.ps-profile-content .ps-list-empty span{font-size:18px}
.ps-profile-content .ps-list-empty p{max-width:none;font-size:12px}

@media(max-width:500px){
  .ps-card-identity{grid-template-columns:auto minmax(0,1fr);padding:15px}
  .ps-card-body{padding:14px 15px 16px}
  .ps-section-toggle{padding:13px 15px}
  .ps-section-action{margin:0 15px 13px;align-self:flex-start}
  .ps-section-bar{flex-wrap:wrap}
  .ps-record-actions button{width:100%}
}


/* ============================================================================
   Participant Success Management — UI/UX and information architecture refactor
   (ADR-0019). Presentation only: no control, value, or rule below is new, and
   nothing was removed to make room.

   The rules this layer enforces, in one place so the next reader does not have
   to infer them from forty selectors:

   - Navy is a structural anchor, not a background. It carries the workspace
     topbar, the roster card's identity band, and a profile category header —
     the places where a thing is being named. Everything a counselor reads sits
     on white or warm light gray with thin dividers.
   - One control system. Search inputs, selects, disclosure buttons, chips,
     toolbar buttons, and filter labels share a height, a border, a radius, a
     type scale, and a label treatment, so a row of them reads as one row.
   - Desktop is horizontal. Metrics, filters, card facts, and the counselor
     briefing all use the width of the screen; a full-width vertical row on a
     desktop is a bug, not a layout.
   - Orange is a primary action and an accent at a seam. Green is a positive
     result, amber is monitoring or pending, red is genuine risk or something
     actually overdue. Missing information is neutral gray, never red.
   ========================================================================= */

/* ---------- 1. the landing header ---------- */

/* Two columns on a desktop: the workspace names itself on the left, and the
   human-review safeguard is stated on the right at the size of a standing rule
   rather than a banner. It stacks below the tablet breakpoint. */
.ps-workspace-header{grid-template-columns:minmax(0,1fr) minmax(0,auto);align-items:center;gap:16px 28px;padding:16px 24px}
.ps-workspace-header .ps-workspace-identity{display:grid;gap:5px;min-width:0}
.ps-workspace-header h1{font-size:clamp(26px,2.6vw,34px)}
.ps-workspace-header>p,.ps-workspace-header .ps-workspace-identity>p{max-width:60ch}
.ps-workspace-header .ps-review-notice{margin:0;justify-self:end;max-width:34ch;padding:7px 0 7px 12px;border-left-width:3px}

/* ---------- 2. the executive metrics ---------- */

/* Eight values, so four across on a desktop and two on a phone: the row divides
   evenly at every width it is shown at. Six across left Total Participants and
   Portal Activated alone on a second row beside four empty cells. Column counts
   that divide eight are the whole rule — three across would move the ragged row
   rather than close it. They were a wrapping flex row before this, which meant a
   narrow viewport turned every metric into a full-width band and the snapshot
   into a page. */
.ps-metric-strip{display:grid;grid-template-columns:repeat(4,minmax(0,1fr))}
.ps-metric-strip .ps-strip-item{min-width:0;padding:12px 16px}
/* The divider belongs between columns, not at the edge of the grid, so it is
   suppressed on whichever tile currently ends a row. */
.ps-metric-strip .ps-strip-item:nth-child(4n){border-right:0}
.ps-metric-strip strong{font-size:26px}

/* ---------- 3. the operational summary ---------- */

.ps-summary-head{padding:11px 16px}
.ps-summary-line{padding:11px 16px}
.ps-executive{gap:10px}

/* ---------- 4. one filter control system ---------- */

/* Row one is the participant search, at the full width of the toolbar, because
   finding a participant by name is what a counselor does first and most.
   Row two is the five filters they route on. Everything secondary stays in the
   expanded panel below, which stays collapsed. */
.ps-searchbar{display:grid;gap:10px;padding:13px 15px}
.ps-searchbar>.ps-toolbar-row:first-of-type{grid-template-columns:minmax(0,1fr)}
.ps-toolbar-filters{grid-template-columns:repeat(5,minmax(0,1fr));align-items:end}
.ps-searchbar .ps-toolbar-row>label,.ps-searchbar .ps-round-field{min-width:0}
.ps-searchbar label>span,.ps-round-field>span,.ps-filterbar label>span{font-size:9.5px;letter-spacing:.9px;line-height:1.3}
.ps-searchbar input,.ps-searchbar select,.ps-round-menu,.ps-filterbar input,.ps-filterbar select{min-height:38px;padding:8px 11px;border-radius:3px;font-size:13px}
.ps-filterbar{gap:10px 12px;padding:14px 15px;border-radius:3px}

/* The filters in force, as chips that come off. Both chip groups sit in the
   same row and read as one set: rounds first, then everything else. */
.ps-filter-actions{gap:6px 10px;margin-top:9px;padding-top:9px;border-top:1px solid var(--line)}
.ps-filter-actions .ps-chips{flex:0 1 auto}
.ps-filter-actions .ps-chips:empty{display:none}
.ps-chip{padding:3px 3px 3px 9px;border-radius:3px;font-size:10.5px}
.ps-chip button{width:17px;height:17px}
.ps-filter-summary{margin:9px 0 0;font-size:11.5px;line-height:1.5}

/* ---------- 5. the reporting toolbar ---------- */

/* The count, the export, the copied criteria, and the way into Reports and
   Analytics on one line. The criteria sentence follows underneath at reading
   weight instead of pushing the controls down. */
.ps-report-context{margin-top:10px;padding:10px 14px;border-radius:3px}
.ps-report-bar{display:flex;align-items:center;gap:10px 16px;flex-wrap:wrap}
.ps-report-count{display:flex;align-items:baseline;gap:7px;margin:0;min-width:0}
.ps-report-count strong{font:900 22px/1 "Barlow Condensed",sans-serif}
.ps-report-count span{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.9px}
.ps-report-context .ps-report-actions{margin:0 0 0 auto}
.ps-report-actions button,.ps-report-actions a{min-height:34px;padding:7px 12px;border-radius:3px}
.ps-report-criteria{margin:8px 0 0;color:var(--muted);font-size:11.5px;line-height:1.5;overflow-wrap:anywhere}

/* ---------- 6. the roster card ---------- */

/* Maximum useful information, minimum height. The identity band is tighter, the
   six routing facts are a three-column grid rather than a column, the two grade
   point averages are a compact pair rather than a tinted panel, what is owed is
   its own line, and the latest note is clamped to two lines with the whole of it
   on hover. No history and no long note body belong on a roster card. */
.ps-card-identity{gap:13px;padding:13px 17px}
.ps-card-identity .ps-card-head{display:flex;align-items:center;gap:10px 16px;flex-wrap:wrap;justify-content:space-between;min-width:0}
.ps-card-identity .ps-card-head h3{font-size:clamp(17px,1.5vw,21px);line-height:1.1}
.ps-card-identity .ps-card-subtitle{margin:3px 0 0;font-size:11.5px}
.ps-card-identity .ps-card-badges{margin:0;flex-wrap:wrap;justify-content:flex-end}
.ps-card-body{padding:13px 17px 14px}
.ps-card-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:9px 14px}
.ps-card-grid strong{font-size:12.5px;line-height:1.35}
.ps-card-gpa{display:flex;gap:6px 20px;flex-wrap:wrap;margin-top:10px;padding:8px 12px;background:var(--cream);border:1px solid rgba(23,32,42,.09);border-radius:3px}
.ps-card-gpa>div{display:flex;align-items:baseline;gap:7px;padding:0;background:none;min-width:0}
.ps-card-gpa strong{font-size:15px}
.ps-card-secondary{margin-top:8px;padding-top:0;border-top:0}
.ps-card-secondary:empty{display:none}

/* What is owed, on one line. An overdue commitment is marked in red because it
   is genuinely late; nothing else on the card changes colour for it, and the
   risk rail is untouched — risk is assessed by a counselor, not by a date. */
.ps-card-next{display:flex;align-items:baseline;gap:6px 11px;flex-wrap:wrap;margin:10px 0 0;padding:8px 11px;background:var(--cream);border-left:3px solid var(--orange);border-radius:0 3px 3px 0}
.ps-card-next>span{color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
.ps-card-next>strong{font-size:12.5px;font-weight:700;overflow-wrap:anywhere}
.ps-card-next.overdue{background:rgba(184,67,53,.07);border-left-color:var(--danger)}
.ps-card-next.overdue>span,.ps-card-next.overdue>strong{color:var(--danger)}

.ps-card-note{margin-top:9px;padding:9px 12px}
.ps-card-note>p{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-clamp:2;overflow:hidden;margin-top:4px;font-size:11.5px;line-height:1.45}
.ps-card-note.empty>p{-webkit-line-clamp:1;line-clamp:1}
.ps-card-footer{margin-top:10px;padding-top:9px}

/* ---------- 7. the profile header ---------- */

.ps-context{gap:14px 20px;padding:14px 20px}
.ps-context h2{font-size:clamp(23px,2.5vw,30px)}
.ps-context-facts{gap:5px 22px}
.ps-context-facts dt{font-size:9px}
.ps-context-facts dd{font-size:12.5px}

/* Counselor Actions carries the primary actions once, immediately under the
   briefing. The three a counselor came to perform lead it. */
.ps-action-row .ps-action-primary{border-color:var(--orange);color:var(--orange-dark)}
.ps-action-row a.ps-action-primary{text-decoration:none}
.ps-action-row .ps-action-primary:hover{background:var(--orange);border-color:var(--orange);color:#fff}

/* ---------- 8. the counselor briefing ---------- */

/* The eight values a counselor needs before speaking to a participant, in one
   grid that spans the band, with the engagement signals and what is owed
   beneath it. Values carry the weight; labels are quiet. */
.ps-command-center{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
.ps-glance-tile{grid-column:1/-1;border-top-color:var(--orange)}
.ps-glance{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:11px 18px;margin:0}
.ps-glance>div{display:grid;gap:3px;align-content:start;min-width:0;padding-left:11px;border-left:1px solid var(--line)}
.ps-glance dt{color:var(--muted);font-size:9px;font-weight:800;text-transform:uppercase;letter-spacing:.8px;line-height:1.3}
.ps-glance dd{margin:0;font:800 17px/1.15 "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.3px;color:var(--ink);overflow-wrap:anywhere}
.ps-glance dd .ps-badge{font-size:9.5px}
.ps-glance-absent dd{color:var(--muted);font-family:"Barlow",sans-serif;font-weight:600;font-size:12.5px;text-transform:none;letter-spacing:0}
.ps-glance-note{margin:10px 0 0;padding-top:9px;border-top:1px solid var(--line);color:var(--muted);font-size:11px;line-height:1.5}

.ps-engagement-tile,.ps-next-tile{min-width:0}
.ps-engagement-facts div{padding-bottom:7px}
.ps-next-flag{justify-self:start;padding:3px 8px;background:rgba(184,67,53,.07);color:var(--danger);font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}

/* ---------- 9. the five principal categories ---------- */

/* The structural level above the eleven sections. The category header is the
   navy anchor; the sections inside it are light, thin-bordered, and quieter, so
   the profile reads as five things rather than eleven and the page is not a
   column of dark blocks. */
.ps-profile-category{background:var(--paper);border:1px solid var(--line);box-shadow:var(--shadow)}
.ps-category-bar{background:linear-gradient(160deg,var(--charcoal) 0,var(--charcoal-soft) 100%);border-bottom:3px solid var(--orange)}
.ps-category-toggle{display:flex;align-items:center;gap:12px;width:100%;padding:11px 18px;border:0;background:transparent;color:#fff;text-align:left;cursor:pointer}
.ps-category-toggle:focus-visible{outline:3px solid var(--orange);outline-offset:-3px}
.ps-category-letter{display:flex;align-items:center;justify-content:center;flex:none;width:22px;height:22px;background:rgba(255,255,255,.12);color:var(--orange);font:900 12px/1 "Barlow Condensed",sans-serif}
.ps-category-toggle>h2{flex:1 1 auto;min-width:0;color:#fff;font:800 17px/1.15 "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.7px}
.ps-category-mark{flex:none;color:var(--orange);font:800 17px/1 "Barlow Condensed",sans-serif}
.ps-category-content{display:grid;gap:1px;background:var(--line)}
.ps-profile-category.collapsed .ps-category-bar{border-bottom-color:rgba(232,66,10,.45)}

/* A section inside a category: no shadow, no navy, no second border — it is a
   row in the category, and the category is the panel. */
.ps-profile-category .ps-profile-section{border:0;box-shadow:none}
.ps-profile-category .ps-section-bar{background:var(--cream);border-bottom:1px solid var(--line)}
.ps-profile-category .ps-section-toggle{padding:11px 18px 11px 22px}
.ps-profile-category .ps-section-toggle>h2{color:var(--ink);font-size:14px;letter-spacing:.6px}
.ps-profile-category .ps-section-toggle>span{color:var(--orange)}
.ps-profile-category .ps-section-summary{color:var(--muted);font-size:11px}
.ps-profile-category .ps-profile-section:last-child .ps-section-bar{border-bottom:0}
.ps-profile-category .ps-profile-content{background:var(--paper);border-top:1px solid var(--line)}

/* ---------- 10. empty states ---------- */

/* One line, with the action that fills it. An empty section is a sentence, not
   a panel. */
.ps-record-empty{padding:9px 14px;font-size:12px}
.ps-record-empty strong{font-size:11.5px}
.ps-profile-content .ps-list-empty{padding:9px 14px}
.ps-record-actions{gap:8px}

/* ---------- 11. desktop, tablet, phone ---------- */

@media(min-width:1500px){
  .ps-card-grid{grid-template-columns:repeat(3,minmax(0,1fr))}
  .ps-glance{grid-template-columns:repeat(8,minmax(0,1fr))}
}
@media(max-width:1250px){
  .ps-glance{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media(max-width:1100px){
  /* Four across still fits here at 260px a tile, and it keeps both rows full. */
  .ps-metric-strip{grid-template-columns:repeat(4,minmax(0,1fr))}
  .ps-toolbar-filters{grid-template-columns:repeat(3,minmax(0,1fr))}
  .ps-command-center{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:980px){
  .ps-workspace-header{grid-template-columns:minmax(0,1fr)}
  .ps-workspace-header .ps-review-notice{justify-self:start;max-width:none}
  .ps-card-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ps-glance{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media(max-width:780px){
  .ps-metric-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ps-metric-strip .ps-strip-item:nth-child(4n){border-right:1px solid var(--line)}
  .ps-metric-strip .ps-strip-item:nth-child(2n){border-right:0}
  .ps-toolbar-filters{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ps-glance{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ps-command-center{grid-template-columns:minmax(0,1fr)}
  .ps-report-context .ps-report-actions{margin-left:0}
  .ps-card-identity .ps-card-head{display:grid}
  .ps-card-identity .ps-card-badges{justify-content:flex-start}
}
/* The phone filter section. Every control was overflowing its row: the searchbar
   was a grid of fixed minimums inside a viewport narrower than their sum, so a
   select ran past the edge of the screen. One column, nothing with a minimum
   wider than the viewport, and every label, chip, and button inside it. */
@media(max-width:560px){
  .ps-searchbar,.ps-filterbar,.ps-toolbar-row,.ps-toolbar-filters,.ps-searchbar>.ps-toolbar-row:first-of-type{grid-template-columns:minmax(0,1fr)}
  .ps-searchbar,.ps-filterbar{padding:13px}
  .ps-searchbar input,.ps-searchbar select,.ps-round-menu,.ps-filterbar input,.ps-filterbar select{max-width:100%;min-height:42px}
  .ps-round-panel{left:0;right:0;width:auto;max-width:100%}
  .ps-filter-actions{align-items:stretch;flex-direction:column}
  .ps-filter-actions .ps-chips{flex:1 1 auto}
  .ps-searchbar .ps-link-action{margin-left:0;text-align:left}
  .ps-report-bar{align-items:flex-start;flex-direction:column}
  .ps-report-actions{width:100%}
  .ps-report-actions button,.ps-report-actions a{flex:1 1 auto;justify-content:center}
  .ps-glance{grid-template-columns:minmax(0,1fr)}
  .ps-glance>div{padding-left:0;border-left:0;border-top:1px solid var(--line);padding-top:8px}
  .ps-category-toggle{padding:11px 14px;gap:9px}
  .ps-profile-category .ps-section-toggle{padding:11px 14px}
  .ps-card-next{align-items:flex-start;flex-direction:column;gap:3px}
}
@media(max-width:430px){
  .ps-metric-strip{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ps-card-grid{grid-template-columns:minmax(0,1fr)}
  .ps-card-gpa{gap:6px 12px}
}

/* ── Phase 1: search typeahead, metric scope, alerts, meetings ────────────────
   Four additions, all to the shared component library rather than to a
   workspace's own stylesheet, because both workspaces load this file and a
   second copy of any of them would be a second lineage of the same component.

   The typeahead. A combobox over the roster search field: the list is absolutely
   positioned so it overlays the toolbar rather than pushing the roster down as a
   counselor types, and it sits above the round panel's stacking context so the
   two cannot fight over the same pixels. */
.ps-search-field{position:relative}
.ps-search-field .ps-search-hint{margin:5px 0 0;color:var(--muted);font-size:11px;line-height:1.45}
.ps-suggestions{position:absolute;z-index:24;top:100%;left:0;right:0;max-height:330px;overflow:auto;margin:4px 0 0;padding:0;list-style:none;background:var(--paper);border:1px solid var(--charcoal);box-shadow:var(--shadow)}
.ps-suggestions[hidden]{display:none!important}
.ps-suggestion{display:grid;gap:2px;padding:10px 13px;border-bottom:1px solid var(--line);cursor:pointer}
.ps-suggestion:last-child{border-bottom:0}
.ps-suggestion strong{font-size:13.5px;font-weight:800;letter-spacing:.2px}
.ps-suggestion small{color:var(--muted);font-size:11.5px;line-height:1.4}
.ps-suggestion:hover,.ps-suggestion[aria-selected=true]{background:var(--charcoal)}
.ps-suggestion:hover strong,.ps-suggestion[aria-selected=true] strong{color:#fff}
.ps-suggestion:hover small,.ps-suggestion[aria-selected=true] small{color:rgba(255,255,255,.78)}
.ps-suggestions-empty{padding:11px 13px;color:var(--muted);font-size:12px}

/* What the metric strip is counting. The executive figures are every
   participant in every round; a filtered roster reports its own subset on a
   second line, labelled, and never in place of the first. */
.ps-metric-scope{margin:0;padding:11px 18px;border-bottom:1px solid var(--line);color:var(--muted);font-size:12px;line-height:1.55}
.ps-metric-scope[hidden]{display:none!important}
.ps-metric-scope strong{color:var(--ink);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
.ps-metric-scope-filtered{display:block;margin-top:6px;padding-left:11px;border-left:3px solid var(--orange)}
/* Two separate statements of the filtered figure sat side by side as adjacent
   inline elements, so they read as one run of text: "…shown on the roster0
   with no recent contact recorded". The separator is the same interpunct the counts inside each
   statement already use. */
.ps-metric-scope-sep{padding:0 6px;color:var(--muted)}

/* A blocked action, or two records that disagree. Neither is a status line: a
   heading, a warning mark, a contrasting panel, and a next step that is a
   control rather than a suggestion. Nothing here is faint grey text. */
.ps-alert{display:grid;grid-template-columns:auto minmax(0,1fr);gap:14px;padding:18px 20px;background:#fff8e8;border:1px solid var(--warning);border-left:6px solid var(--warning)}
.ps-alert-icon{display:grid;place-items:center;width:30px;height:30px;border-radius:50%;background:var(--warning);color:#fff;font:900 18px/1 "Barlow Condensed",sans-serif}
.ps-alert-body{min-width:0}
.ps-alert-heading{margin:0;font:800 21px "Barlow Condensed",sans-serif;text-transform:uppercase;letter-spacing:.8px;color:var(--ink)}
.ps-alert-context{margin:5px 0 0;color:var(--ink);font-size:12px;font-weight:800;text-transform:uppercase;letter-spacing:.6px}
.ps-alert-body p{margin:9px 0 0;color:var(--ink);font-size:13px;line-height:1.6}
.ps-alert-actions{display:flex;flex-wrap:wrap;gap:9px;margin-top:15px}
.ps-alert-action{min-height:40px;padding:9px 15px;border:1.5px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-alert-action:hover{background:var(--charcoal);color:#fff}
.ps-alert-action.primary{border-color:var(--orange);background:var(--orange);color:#fff}
.ps-alert-action.primary:hover{background:var(--charcoal);border-color:var(--charcoal)}
.ps-alert-action:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.ps-alert-slot[hidden]{display:none!important}
.ps-profile-actions>.ps-alert-slot{flex:1 1 100%}
.ps-alert-review{margin:0 0 15px;background:var(--cream);border-color:var(--charcoal);border-left-color:var(--charcoal)}
.ps-alert-review .ps-alert-icon{background:var(--charcoal)}
.ps-alert-list{display:grid;gap:11px;margin:13px 0 0;padding:0;list-style:none}
.ps-alert-list li{display:grid;gap:3px;padding:12px 14px;background:#fff;border:1px solid var(--line)}
.ps-alert-list strong{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-alert-values{color:var(--ink);font-size:12px;line-height:1.5}
.ps-alert-values b{font-weight:800}
.ps-alert-detail{color:var(--muted);font-size:12px;line-height:1.55}

/* The meeting form, on the participant profile. Same grid, same buttons, same
   confirmation language as every other record editor on this page. */
.ps-meeting-entry{margin-top:18px;padding:18px;background:var(--cream);border:1px solid var(--line);border-left:4px solid var(--orange)}
.ps-meeting-entry .ps-subhead{margin-top:0}
.ps-meeting-entry[hidden]{display:none!important}
.ps-meeting-form label{display:grid;gap:7px}
.ps-meeting-form label>span{color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.7px}
.ps-meeting-form select,.ps-meeting-form input,.ps-meeting-form textarea{width:100%;min-height:42px;padding:11px;border:1px solid var(--line);background:#fff;font-family:inherit;font-size:13px;color:var(--ink)}
.ps-meeting-form textarea{min-height:0}
.ps-meeting-form select:focus-visible,.ps-meeting-form input:focus-visible,.ps-meeting-form textarea:focus-visible{outline:3px solid var(--orange);outline-offset:1px}
.ps-meeting-form .ps-form-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
.ps-meeting-form .ps-note-text{grid-column:1/-1;grid-row:auto}

/* The way back out of a module view, at the top where a return control is
   looked for. It names a destination rather than calling history.back(). */
.ps-module-return{display:inline-flex;align-items:center;min-height:38px;margin-bottom:18px;padding:8px 14px;border:1.5px solid var(--charcoal);background:transparent;color:var(--charcoal);font-family:inherit;font-size:10.5px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-module-return:hover{background:var(--charcoal);color:#fff}
.ps-module-return:focus-visible{outline:3px solid var(--orange);outline-offset:2px}
.ps-module-actions button{padding:12px 16px;border:0;background:var(--charcoal);color:#fff;font-family:inherit;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.7px;cursor:pointer}
.ps-module-actions button:hover{background:var(--orange)}

/* The record switcher above the open note form, and which record is in force. */
.ps-note-choice-guide{margin:0 0 13px;color:var(--muted);font-size:12px;line-height:1.55}
.ps-note-choice-option.selected{border-color:var(--orange);background:#fff8e8;box-shadow:inset 0 0 0 1px var(--orange)}
.ps-note-choice-option.selected::after{content:"Selected";color:var(--orange);font-size:9.5px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}

@media(max-width:700px){
  .ps-meeting-form .ps-form-grid{grid-template-columns:1fr}
  .ps-alert{grid-template-columns:1fr}
  .ps-alert-action{flex:1 1 100%;justify-content:center}
}

/* The search field owns its toolbar row. It was a label and an input; it is now
   a combobox with a hint and a suggestion list, and the row it sits in is a
   grid built for the five filter controls below it. Spanning the row keeps the
   field the width it was and gives the suggestion list the same width to open
   into. */
.ps-toolbar-row .ps-search{grid-column:1/-1}

/* Employer, Position and Pay — the employment block inside a participant
   profile. The panel at the top states the job the participant holds now; the
   history beneath it holds every dated record, including that one. The two need
   to look like two answers rather than one list, so the current job sits on
   paper with an orange rule and the history keeps its own heading. */
.wo-participant-actions{margin:0 0 15px}
.wo-current-employment{margin:0 0 18px;padding:18px;background:#fff;border:1px solid var(--line);border-left:4px solid var(--orange)}
.wo-current-employment .ps-notes-toolbar{padding-bottom:12px}
.wo-current-employment .ps-detail-list{margin-top:4px}
.wo-current-employment .ps-admin-head-actions{margin-top:15px}
.wo-history-head{margin:0 0 4px;color:var(--muted);font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.8px}
